From 629d8b84775068ec8eaa8f332b15fe497aff61d5 Mon Sep 17 00:00:00 2001 From: 02090095 Date: Sun, 17 Sep 2023 22:13:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=BE=D1=81.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/artifacts/VisualSapfor_jar.xml | 16 + .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/dictionaries/misha.xml | 54 + .idea/inspectionProfiles/Project_Default.xml | 6 + .../libraries/autocomplete_3_1_1_SNAPSHOT.xml | 9 + .idea/libraries/commons_io_2_5.xml | 9 + .idea/libraries/gson_2_8_1.xml | 9 + .idea/libraries/jsch_0_1_55.xml | 9 + .idea/libraries/mail.xml | 9 + .idea/libraries/mxgraphx_all_4_2_0.xml | 9 + .../rsyntaxtextarea_3_0_5_SNAPSHOT.xml | 9 + .idea/libraries/sqlite_jdbc_3_7_2.xml | 11 + .idea/misc.xml | 6 + .idea/modules.xml | 8 + .idea/uiDesigner.xml | 151 ++ .idea/vcs.xml | 6 + .idea/visual_dvm_2020.iml | 9 + .idea/workspace.xml | 209 +++ PerformanceAnalyzer/1049392283/stat.json | 1 + PerformanceAnalyzer/139606632/stat.json | 1 + PerformanceAnalyzer/1664247100/stat.json | 1 + PerformanceAnalyzer/535943622/stat.json | 1 + PerformanceAnalyzer/622828792/stat.json | 1 + Planner/Array.h | 42 + Planner/CompilationSupervisor.h | 20 + Planner/CompilationTask.h | 47 + Planner/File.h | 64 + Planner/Global.h | 13 + Planner/Planner.cpp | 28 + Planner/RunSupervisor.h | 31 + Planner/RunTask.h | 94 + Planner/String.h | 220 +++ Planner/Supervisor.h | 129 ++ Planner/Task.h | 163 ++ Planner/Text.h | 25 + Planner/Utils.h | 49 + README.md | 8 +- Thumbs.db | Bin 0 -> 8704 bytes Visual_DVM_2020.iml | 20 + Visualizer_2.exe | Bin 0 -> 361984 bytes properties | 29 + src/Common/Current.java | 495 ++++++ src/Common/Database/ColumnType.java | 31 + src/Common/Database/DBObject.java | 64 + src/Common/Database/DBTable.java | 34 + src/Common/Database/DBTableColumn.java | 50 + src/Common/Database/DataSet.java | 253 +++ src/Common/Database/DataSetAnchestor.java | 11 + src/Common/Database/Database.java | 274 +++ src/Common/Database/FKBehaviour.java | 9 + .../Database/FKCurrentObjectBehaviuor.java | 5 + src/Common/Database/FKDataBehaviour.java | 7 + .../Database/SQLITE/SQLiteDatabase.java | 261 +++ src/Common/Database/TableFilter.java | 43 + src/Common/Database/iDBObject.java | 30 + src/Common/Database/iDBTable.java | 6 + src/Common/Database/nDBObject.java | 35 + src/Common/Database/rDBObject.java | 32 + src/Common/Global.java | 403 +++++ src/Common/GlobalProperties.java | 87 + src/Common/PackageModeSupervisor.java | 3 + src/Common/Properties.java | 50 + .../UI/ComboBox/StyledTextComboBox.java | 9 + src/Common/UI/ControlForm.java | 53 + src/Common/UI/ControlWithCurrentForm.java | 19 + src/Common/UI/DataControl.java | 7 + src/Common/UI/DataControl_OLD.java | 13 + src/Common/UI/DataSetControlForm.java | 329 ++++ src/Common/UI/DebugPrintLevel.java | 17 + src/Common/UI/DragDrop/ExampleDrop.java | 33 + src/Common/UI/DragDrop/FileDrop.java | 792 +++++++++ src/Common/UI/Editor/BaseEditor.java | 154 ++ src/Common/UI/Editor/CaretInfo.java | 30 + src/Common/UI/Editor/Viewer.java | 8 + src/Common/UI/EmptyDialogFields.form | 11 + src/Common/UI/EmptyDialogFields.java | 12 + src/Common/UI/Label/ShortLabel.java | 15 + src/Common/UI/List/HyperlinksStyledList.java | 10 + src/Common/UI/List/StyledList.java | 17 + src/Common/UI/Menus/AttachementsMenu.java | 30 + src/Common/UI/Menus/FileStyleMenu.java | 24 + src/Common/UI/Menus/GraphMenu.java | 35 + src/Common/UI/Menus/MainEditorMenu.java | 342 ++++ src/Common/UI/Menus/PassesSubMenu.java | 18 + src/Common/UI/Menus/ProjectFilesMenu.java | 135 ++ src/Common/UI/Menus/PropertiesSubmenu.java | 18 + src/Common/UI/Menus/SelectionTreeMenu.java | 86 + src/Common/UI/Menus/StyledPopupMenu.java | 38 + src/Common/UI/Menus/TableMenu.java | 29 + .../UI/Menus/TestsCompilationFilterMenu.java | 28 + src/Common/UI/Menus/TextComboBoxMenu.java | 42 + src/Common/UI/Menus/TextEditorMenu.java | 86 + src/Common/UI/Menus/VersionsMenu.java | 53 + src/Common/UI/Menus/VisualiserMenuItem.java | 21 + .../BugReportsMenuBar/BugReportsMenuBar.java | 17 + .../CompilersMenuBar/CompilersMenuBar.java | 13 + .../ComponentsMenuBar/ComponentsMenuBar.java | 27 + .../ConfigurationsMenuBar.java | 33 + .../DVMParametersMenuBar.java | 11 + src/Common/UI/Menus_2023/DataMenuBar.java | 54 + .../EnvironmentValuesMenuBar.java | 12 + .../FastAccessMenuBar/FastAccessMenuBar.java | 49 + .../Menus_2023/FileMenuBar/FileMenuBar.java | 84 + .../FileMenuBar/FileSettingsMenu.java | 63 + .../GroupsMenuBar/GroupsMenuBar.java | 42 + .../UI/Menus_2023/LanguagesSubmenu.java | 34 + .../MachinesMenuBar/MachinesMenuBar.java | 11 + .../Menus_2023/MainMenuBar/AnalysesMenu.java | 14 + .../MainMenuBar/GlobalCleaningMenu.java | 20 + .../MainMenuBar/LastOpenedProjectsMenu.java | 48 + .../Menus_2023/MainMenuBar/MainMenuBar.java | 87 + .../UI/Menus_2023/MainMenuBar/MainWindow.java | 19 + .../MainMenuBar/TransformationsMenu.java | 36 + .../MainMenuBar/VisualiserSettingsMenu.java | 47 + .../MakefilesMenuBar/MakefilesMenuBar.java | 14 + src/Common/UI/Menus_2023/MenuBarButton.java | 32 + .../ModulesMenuBar/ModulesMenuBar.java | 8 + src/Common/UI/Menus_2023/PassButton.java | 25 + src/Common/UI/Menus_2023/PassControl.java | 7 + src/Common/UI/Menus_2023/PassMenuItem.java | 17 + .../ProjectMenuBar/FilesOperationsMenu.java | 7 + .../ProjectMenuBar/ProjectMenuBar.java | 33 + .../ProjectMenuBar/ProjectSettingsMenu.java | 73 + .../ProjectMenuBar/ProjectViewMenu.java | 34 + .../RemoteSapforsMenuBar.java | 11 + .../RunConfigurationsMenuBar.java | 13 + .../SapforConfigurationCommandsMenuBar.java | 12 + .../SapforConfigurationsMenuBar.java | 12 + .../SapforTasksMenuBar.java | 8 + .../SapforTasksPackagesBar.java | 8 + src/Common/UI/Menus_2023/SettingsSubmenu.java | 19 + src/Common/UI/Menus_2023/StableMenuItem.java | 41 + .../UI/Menus_2023/StablePassMenuItem.java | 16 + src/Common/UI/Menus_2023/StylesSubmenu.java | 25 + .../SubscribersMenuBar.java | 13 + .../TasksPackagesMenuBar.java | 51 + .../TestRunTasksMenuBar.java | 22 + .../Menus_2023/TestsMenuBar/TestsMenuBar.java | 12 + src/Common/UI/Menus_2023/TypesSubmenu.java | 26 + .../Menus_2023/UsersMenuBar/UsersMenuBar.java | 11 + .../VariantsMenuBar/VariantsMenuBar.java | 28 + .../VersionsMenuBar/VersionsMenuBar.java | 8 + src/Common/UI/Menus_2023/VisualiserMenu.java | 21 + .../UI/Menus_2023/VisualiserMenuBar.java | 31 + .../UI/ProgressBar/StyledProgressBar.java | 16 + src/Common/UI/Selectable.java | 38 + src/Common/UI/StatusEnum.java | 13 + src/Common/UI/Tables/ColumnFilter.java | 78 + src/Common/UI/Tables/ColumnInfo.java | 94 + src/Common/UI/Tables/DBObjectEditor.java | 88 + src/Common/UI/Tables/DBObjectRenderer.java | 11 + .../UI/Tables/DBObjectSelectionRenderer.java | 14 + src/Common/UI/Tables/DBObjectSelector.java | 13 + src/Common/UI/Tables/DataTable.java | 64 + src/Common/UI/Tables/DateRenderer_.java | 18 + .../UI/Tables/EditableHeaderRenderer.java | 82 + src/Common/UI/Tables/EditorCell.java | 7 + src/Common/UI/Tables/Grid/GridAnchestor.java | 28 + src/Common/UI/Tables/HiddenListRenderer.java | 17 + src/Common/UI/Tables/HyperlinksRenderer.java | 15 + .../UI/Tables/MaskedIntegerValueRenderer.java | 18 + src/Common/UI/Tables/MultilineRenderer.java | 16 + src/Common/UI/Tables/ProgressBarRenderer.java | 15 + src/Common/UI/Tables/RendererCell.java | 16 + src/Common/UI/Tables/StatusEnumRenderer.java | 17 + src/Common/UI/Tables/StyledCellLabel.java | 21 + src/Common/UI/Tables/StyledTable.java | 101 ++ src/Common/UI/Tables/TableEditors.java | 8 + src/Common/UI/Tables/TableRenderers.java | 19 + src/Common/UI/Tables/TopLeftRenderer.java | 13 + src/Common/UI/Tables/VectorEditor.java | 89 + src/Common/UI/Tables/WrapTextRenderer.java | 25 + src/Common/UI/TextArea/StyledTextArea.java | 9 + .../UI/TextField/StyledPasswordField.java | 11 + src/Common/UI/TextField/StyledTextField.java | 11 + src/Common/UI/Themes/DarkVisualiserTheme.java | 64 + .../UI/Themes/FortranSPFTokenMaker.java | 408 +++++ .../UI/Themes/FreeFortranSPFTokenMaker.java | 297 ++++ .../UI/Themes/LightVisualiserTheme.java | 64 + src/Common/UI/Themes/ProvidedTokenMaker.java | 47 + src/Common/UI/Themes/ThemeElement.java | 8 + src/Common/UI/Themes/TokenProvider.java | 134 ++ src/Common/UI/Themes/VisualiserColor.java | 5 + src/Common/UI/Themes/VisualiserFonts.java | 21 + src/Common/UI/Themes/VisualiserTheme.java | 183 ++ src/Common/UI/Themes/VisualiserThemeName.java | 5 + src/Common/UI/Themes/dark_editor.xml | 90 + src/Common/UI/Themes/light_editor.xml | 88 + src/Common/UI/Trees/DataTree.java | 39 + .../UI/Trees/GraphTreeCellRenderer.java | 27 + src/Common/UI/Trees/SelectableTree.java | 18 + .../UI/Trees/SelectionTreeCellRenderer.java | 26 + src/Common/UI/Trees/StyledTree.java | 167 ++ .../UI/Trees/StyledTreeCellRenderer.java | 15 + src/Common/UI/Trees/TreeForm.java | 30 + src/Common/UI/Trees/TreeRenderers.java | 13 + src/Common/UI/UI.java | 451 +++++ src/Common/UI/VisualiserStringList.java | 38 + .../UI/Windows/Dialog/DBObjectDialog.java | 24 + src/Common/UI/Windows/Dialog/Dialog.java | 160 ++ .../UI/Windows/Dialog/DialogFields.java | 5 + .../UI/Windows/Dialog/DialogSlider.java | 9 + .../UI/Windows/Dialog/DialogSpinner.java | 9 + .../UI/Windows/Dialog/DialogTextComboBox.java | 16 + .../UI/Windows/Dialog/DialogTextField.java | 10 + .../UI/Windows/Dialog/DialogWrapText.java | 42 + .../UI/Windows/Dialog/NumberDialog.java | 11 + .../UI/Windows/Dialog/PercentsForm.java | 22 + .../Windows/Dialog/SessionMaxtimeDialog.java | 10 + .../UI/Windows/Dialog/SliderNumberForm.java | 53 + .../UI/Windows/Dialog/SpinnerNumberForm.java | 22 + .../Windows/Dialog/Text/ComboTextDialog.java | 35 + .../UI/Windows/Dialog/Text/FileNameForm.java | 10 + .../Dialog/Text/MultilineTextForm.java | 25 + .../Text/ReadOnlyMultilineTextForm.java | 12 + .../UI/Windows/Dialog/Text/TextDialog.java | 15 + .../Windows/Dialog/Text/TextFieldDialog.java | 35 + src/Common/UI/Windows/Form.java | 98 + src/Common/UI/Windows/FormType.java | 10 + src/Common/UI/Windows/Sapfor.png | Bin 0 -> 12773 bytes src/Common/UI/Windows/SearchReplaceForm.form | 213 +++ src/Common/UI/Windows/SearchReplaceForm.java | 253 +++ src/Common/Utils/Files/ProjectsChooser.java | 25 + src/Common/Utils/Files/VDirectoryChooser.java | 21 + src/Common/Utils/Files/VFileChooser.java | 44 + src/Common/Utils/Files/VFileChooser_.java | 50 + src/Common/Utils/Index.java | 24 + src/Common/Utils/InterruptThread.java | 27 + src/Common/Utils/Stopwatch.java | 16 + src/Common/Utils/StringTemplate.java | 63 + src/Common/Utils/TextLog.java | 22 + src/Common/Utils/Utils.java | 1432 +++++++++++++++ .../Utils/Validators/DVMHelpParser.java | 241 +++ .../Utils/Validators/EnvironmentState.java | 8 + .../Utils/Validators/HelpParserState.java | 10 + src/Common/Utils/Validators/OptionState.java | 11 + .../Utils/Validators/PathValidator.java | 68 + .../Utils/Validators/PathValidatorState.java | 8 + src/Common/Utils/Validators/ShellParser.java | 229 +++ .../Utils/Validators/ShellParserState.java | 12 + .../Utils/Validators/StatementsChecker.java | 14 + src/Common/Utils/Validators/Validator.java | 36 + src/GlobalData/Account/Account.java | 63 + src/GlobalData/Account/AccountRole.java | 22 + .../Account/AccountSubscribeState.java | 19 + src/GlobalData/Account/AccountsDBTable.java | 11 + src/GlobalData/Compiler/Compiler.java | 193 ++ src/GlobalData/Compiler/CompilerType.java | 9 + src/GlobalData/Compiler/CompilersDBTable.java | 153 ++ .../Compiler/UI/CompilerFields.form | 134 ++ .../Compiler/UI/CompilerFields.java | 93 + .../CompilerEnvironment.java | 76 + .../CompilerEnvironmentsSet.java | 45 + .../EnvironmentValueType.java | 7 + .../UI/CompilerEnvironmentValueEditor.java | 36 + .../UI/CompilerEnvironmentValueRenderer.java | 15 + .../UI/CompilerEnvironmentsFields.form | 11 + .../UI/CompilerEnvironmentsFields.java | 12 + .../CompilerOption/CompilerOption.java | 48 + .../CompilerOption/CompilerOptionsSet.java | 47 + .../CompilerOptionParameterNameRenderer.java | 20 + .../CompilerOptionParameterValueEditor.java | 34 + .../CompilerOptionParameterValueRenderer.java | 20 + .../UI/CompilerOptionsFields.form | 11 + .../UI/CompilerOptionsFields.java | 12 + src/GlobalData/Credentials/Credentials.java | 18 + .../Credentials/CredentialsDBTable.java | 7 + .../DBLastProject/DBLastProject.java | 24 + .../DBLastProject/LastProjectsDBTable.java | 22 + src/GlobalData/DVMParameter/DVMParameter.java | 8 + .../DVMParameter/DVMParameterDBTable.java | 98 + .../DVMParameter/UI/DVMParameterFields.form | 58 + .../DVMParameter/UI/DVMParameterFields.java | 21 + .../EnvironmentValue/EnvironmentValue.java | 18 + .../EnvironmentValuesDBTable.java | 98 + .../UI/EnvironmentValueFields.form | 55 + .../UI/EnvironmentValueFields.java | 22 + src/GlobalData/FormsParams/DBForm.java | 34 + .../FormsParams/DBMainFormParams.java | 53 + src/GlobalData/FormsParams/FormsDBTable.java | 12 + .../FormsParams/MainFormParamsDBTable.java | 11 + src/GlobalData/GlobalDatabase.java | 324 ++++ src/GlobalData/Grid/Grid.java | 27 + src/GlobalData/Grid/GridsDBTable.java | 8 + src/GlobalData/Machine/Machine.java | 66 + src/GlobalData/Machine/MachineType.java | 20 + src/GlobalData/Machine/MachinesDBTable.java | 123 ++ src/GlobalData/Machine/UI/MachineFields.form | 84 + src/GlobalData/Machine/UI/MachineFields.java | 43 + src/GlobalData/Makefile/Makefile.java | 202 +++ src/GlobalData/Makefile/MakefilesDBTable.java | 70 + .../Makefile/UI/MakefilePreviewForm.java | 22 + src/GlobalData/Module/Module.java | 37 + src/GlobalData/Module/ModuleAnchestor.java | 36 + src/GlobalData/Module/ModulesDBTable.java | 65 + .../Module/UI/ModuleAnchestorFields.form | 111 ++ .../Module/UI/ModuleAnchestorFields.java | 74 + .../Module/UI/ModuleAnchestorForm.java | 107 ++ src/GlobalData/RemoteFile/RemoteFile.java | 37 + .../RemoteFile/UI/RemoteFileChooser.java | 96 + .../UI/RemoteFileChooserFields.form | 109 ++ .../UI/RemoteFileChooserFields.java | 40 + .../RemoteFile/UI/RemoteFileRenderer.java | 26 + .../RemoteFile/UI/RemoteFilesTree.java | 28 + src/GlobalData/RemoteSapfor/RemoteSapfor.java | 47 + .../RemoteSapfor/RemoteSapforsDBTable.java | 126 ++ .../RemoteSapfor/UI/RemoteSapforFields.form | 113 ++ .../RemoteSapfor/UI/RemoteSapforFields.java | 65 + .../RunConfiguration/RunConfiguration.java | 270 +++ .../RunConfigurationsDBTable.java | 166 ++ .../RunConfiguration/UI/MatrixBar.java | 36 + .../UI/MatrixDimensionSpinner.java | 14 + .../UI/RunConfigurationFields.form | 212 +++ .../UI/RunConfigurationFields.java | 38 + src/GlobalData/SVN/SVN.java | 8 + .../SapforProfile/SapforProfile.java | 9 + .../SapforProfile/SapforProfilesDBTable.java | 64 + .../SapforProfile/UI/SapforProfileFields.form | 35 + .../SapforProfile/UI/SapforProfileFields.java | 18 + .../SapforProfileSetting.java | 18 + .../SapforProfileSettingsDBTable.java | 40 + src/GlobalData/Settings/DBSetting.java | 95 + src/GlobalData/Settings/SettingName.java | 163 ++ src/GlobalData/Settings/SettingType.java | 8 + src/GlobalData/Settings/SettingsDBTable.java | 96 + src/GlobalData/Splitter/Splitter.java | 22 + src/GlobalData/Splitter/SplittersDBTable.java | 50 + .../CompilationTask/CompilationTask.java | 110 ++ .../CompilationTasksDBTable.java | 120 ++ .../Tasks/Passes/TaskLocalPass.java | 31 + src/GlobalData/Tasks/QueueSystem/MVS.java | 16 + .../Tasks/QueueSystem/QueueCommand.java | 10 + .../Tasks/QueueSystem/QueueSystem.java | 36 + src/GlobalData/Tasks/RunTask/RunTask.java | 160 ++ .../Tasks/RunTask/RunTasksDBTable.java | 88 + .../LinuxLocalCompilationSupervisor.java | 42 + .../Local/Linux/LinuxLocalRunSupervisor.java | 32 + .../Local/Linux/LinuxLocalTaskSupervisor.java | 82 + .../Supervisor/Local/LocalTaskSupervisor.java | 105 ++ .../WindowsLocalCompilationSupervisor.java | 54 + .../Windows/WindowsLocalRunSupervisor.java | 48 + .../Windows/WindowsLocalTaskSupervisor.java | 51 + .../Supervisor/Remote/MVSRunSupervisor.java | 58 + .../Remote/RemoteCompilationSupervisor.java | 48 + .../Remote/RemoteTaskSupervisor.java | 76 + .../Remote/ServerRunSupervisor.java | 91 + .../Tasks/Supervisor/TaskSupervisor.java | 138 ++ src/GlobalData/Tasks/Task.java | 129 ++ src/GlobalData/Tasks/TaskState.java | 148 ++ src/GlobalData/User/UI/UserFields.form | 117 ++ src/GlobalData/User/UI/UserFields.java | 45 + src/GlobalData/User/User.java | 74 + src/GlobalData/User/UserAuthentication.java | 14 + src/GlobalData/User/UserState.java | 27 + src/GlobalData/User/UsersDBTable.java | 108 ++ src/META-INF/MANIFEST.MF | 3 + src/Program.java | 9 + src/ProjectData/DBArray/ArraysDBTable.java | 49 + src/ProjectData/DBArray/DBArray.java | 28 + src/ProjectData/Files/DBProjectFile.java | 596 +++++++ src/ProjectData/Files/FileState.java | 9 + src/ProjectData/Files/FileType.java | 23 + src/ProjectData/Files/FilesDBTable.java | 11 + src/ProjectData/Files/LanguageStyle.java | 32 + .../SAPFOR/Directives/BaseDirective.java | 35 + .../Directives/CheckPointTypeDirective.java | 16 + .../SAPFOR/Directives/DirectiveName.java | 135 ++ .../SAPFOR/Directives/IntervalDirective.java | 31 + .../SAPFOR/Directives/RedListDirective.java | 14 + .../SAPFOR/Directives/RegionDirective.java | 11 + .../SAPFOR/Directives/Spec1Directive.java | 14 + .../SAPFOR/Directives/Spec2Directive.java | 14 + .../SAPFOR/Directives/Spec3Directive.java | 19 + .../SAPFOR/Directives/Spec4Directive.java | 14 + .../SAPFOR/Directives/SpecDirective.java | 31 + .../SAPFOR/Directives/StartDirective.java | 11 + .../SAPFOR/Directives/TypeDirective.java | 11 + .../SAPFOR/Providers/BaseProvider.java | 28 + .../Providers/CheckPointTypeProvider.java | 11 + .../SAPFOR/Providers/IntervalProvider.java | 11 + .../SAPFOR/Providers/PrefixWordProvider.java | 20 + .../SAPFOR/Providers/ReductionProvider.java | 19 + .../SAPFOR/Providers/Spec1Provider.java | 12 + .../SAPFOR/Providers/Spec2Provider.java | 12 + .../SAPFOR/Providers/Spec3Provider.java | 14 + .../SAPFOR/Providers/Spec4Provider.java | 14 + .../SAPFOR/Providers/StartProvider.java | 10 + .../SAPFOR/Providers/TypeProvider.java | 16 + .../SAPFOR/SapforAutoComplete.java | 123 ++ .../AutoComplete/SAPFOR/SearchState.java | 6 + .../Files/UI/Editor/SPFEditor.java | 205 +++ src/ProjectData/Files/UI/FileGraphTree.java | 39 + .../Files/UI/FilesHyperlinksPanel.java | 51 + src/ProjectData/Files/UI/FilesTree.java | 108 ++ .../Files/UI/FilesTreeCellRenderer.java | 46 + src/ProjectData/Files/UI/FortranFolder.java | 64 + src/ProjectData/GCOV/GCOV_info.java | 28 + src/ProjectData/LanguageName.java | 66 + .../Messages/Errors/ErrorsDBTable.java | 25 + .../Messages/Errors/MessageError.java | 14 + src/ProjectData/Messages/Message.java | 443 +++++ src/ProjectData/Messages/MessagesDBTable.java | 80 + .../Messages/Notes/MessageNote.java | 14 + .../Messages/Notes/NotesDBTable.java | 25 + .../MessageRecommendation.java | 48 + .../Recommendations/RecommendationType.java | 7 + .../RecommendationsDBTable.java | 95 + .../Messages/Warnings/MessageWarning.java | 17 + .../Messages/Warnings/WarningsDBTable.java | 25 + .../PredictorStatisticsDBTable.java | 11 + .../PredictorStatistics_2021.java | 59 + .../Project/ChangeSettingPass.java | 10 + .../Project/ProjectInfoDBTable.java | 11 + .../Project/UI/PackageVersionsTree.java | 49 + .../UI/PackageVersionsTreeCellRenderer.java | 43 + src/ProjectData/Project/UI/VersionsTree.java | 68 + .../Project/UI/VersionsTreeCellRenderer.java | 74 + src/ProjectData/Project/db_project_info.java | 1569 +++++++++++++++++ src/ProjectData/ProjectDatabase.java | 92 + src/ProjectData/ProjectView.java | 35 + .../SapforData/Arrays/ArrayDecl.java | 18 + .../SapforData/Arrays/ArrayLocation.java | 40 + .../SapforData/Arrays/ArrayState.java | 24 + .../SapforData/Arrays/ArraysSet.java | 82 + .../Arrays/Distribution/AlignRule.java | 145 ++ .../Arrays/Distribution/DataDirective.java | 49 + .../Arrays/Distribution/Dimension.java | 37 + .../Arrays/Distribution/Directive.java | 8 + .../SapforData/Arrays/ProjectArray.java | 400 +++++ .../Arrays/Templates/TemplateDimension.java | 34 + .../Templates/TemplateDimensionState.java | 36 + .../Arrays/Templates/TemplateLink.java | 24 + .../Arrays/UI/DimensionRenderer.java | 20 + .../Arrays/UI/DimensionStateChanger.java | 25 + .../Arrays/UI/DimensionsTableForm.java | 55 + .../Arrays/UI/DistributionMenu.java | 20 + .../SapforData/Arrays/UI/FileArraysTree.java | 12 + .../SapforData/Arrays/UI/RulesTree.java | 43 + .../Arrays/UI/RulesTreeCellRenderer.java | 23 + src/ProjectData/SapforData/FileObject.java | 29 + .../SapforData/FileObjectWithMessages.java | 58 + .../SapforData/Functions/FuncCall.java | 37 + .../SapforData/Functions/FuncCallH.java | 45 + .../SapforData/Functions/FuncCallState.java | 4 + .../SapforData/Functions/FuncCoordinates.java | 15 + .../Functions/FuncCoordinatesDBTable.java | 7 + .../SapforData/Functions/FuncInfo.java | 82 + .../SapforData/Functions/FuncParam.java | 60 + .../SapforData/Functions/FunctionType.java | 23 + .../Functions/UI/FileFunctionsTree.java | 12 + .../UI/Graph/FunctionsGraphForm.java | 27 + .../UI/Graph/FunctionsGraphMenu.java | 42 + .../Functions/UI/Graph/FunctionsGraphUI.java | 274 +++ .../UI/Graph/FunctionsGraphUIGreed.java | 80 + .../Functions/UI/Graph/GraphInfo.java | 68 + .../SapforData/Functions/UI/InlineMenu.java | 19 + .../SapforData/Functions/UI/InlineMenu2.java | 27 + .../SapforData/Functions/UI/InlineTree.java | 34 + .../SapforData/Functions/UI/InlineTree2.java | 34 + .../SapforData/Includes/DependencyInfo.java | 14 + .../SapforData/Includes/FileInfo.java | 29 + .../SapforData/Includes/UI/IncludesMenu.java | 19 + .../SapforData/Includes/UI/IncludesTree.java | 22 + src/ProjectData/SapforData/Loops/EGoto.java | 17 + src/ProjectData/SapforData/Loops/IGoto.java | 17 + src/ProjectData/SapforData/Loops/IO.java | 17 + src/ProjectData/SapforData/Loops/Loop.java | 103 ++ .../SapforData/Loops/LoopState.java | 39 + .../SapforData/Loops/NonRectIter.java | 17 + src/ProjectData/SapforData/Loops/Stop.java | 17 + .../SapforData/Loops/UI/FileLoopsTree.java | 12 + .../SapforData/Regions/ParallelRegion.java | 146 ++ .../SapforData/Regions/RegionsSet.java | 64 + .../Regions/UI/ArrayAlignmentBar.java | 81 + .../Regions/UI/DimensionSpinner.java | 14 + .../Regions/UI/ParallelRegionFields.form | 11 + .../Regions/UI/ParallelRegionFields.java | 13 + .../SapforData/Variants/ParallelVariant.java | 107 ++ .../Variants/UI/VariantRankRenderer.java | 8 + .../SapforData/Variants/VariantsSet.java | 74 + src/Repository/BugReport/BugReport.java | 77 + .../BugReport/BugReportInterface.java | 126 ++ src/Repository/BugReport/BugReportState.java | 35 + .../BugReport/BugReportsDBTable.java | 115 ++ src/Repository/BugReportsDatabase.java | 33 + src/Repository/Component/Component.java | 139 ++ src/Repository/Component/ComponentState.java | 50 + src/Repository/Component/ComponentType.java | 35 + src/Repository/Component/ComponentsSet.java | 88 + src/Repository/Component/Instruction.java | 57 + src/Repository/Component/OSDComponent.java | 12 + .../PerformanceAnalyzer.java | 171 ++ .../Component/Sapfor/MessagesServer.java | 59 + src/Repository/Component/Sapfor/Sapfor.java | 489 +++++ src/Repository/Component/Sapfor/Sapfor_F.java | 32 + .../Sapfor/TransformationPermission.java | 6 + .../Component/UI/ComponentsFields.form | 18 + .../Component/UI/ComponentsFields.java | 17 + .../Component/UI/ComponentsForm.java | 44 + .../Component/UI/PickUpComponentFields.form | 11 + .../Component/UI/PickUpComponentFields.java | 12 + .../Component/UI/PublishFields.form | 115 ++ .../Component/UI/PublishFields.java | 34 + src/Repository/Component/UI/PublishForm.java | 16 + src/Repository/Component/Visualiser.java | 87 + src/Repository/Component/Visualizer_2.java | 135 ++ src/Repository/EmailMessage.java | 23 + src/Repository/RepositoryRefuseException.java | 7 + src/Repository/RepositoryServer.java | 332 ++++ src/Repository/Server/ComponentsServer.java | 430 +++++ .../Server/DiagnosticSignalHandler.java | 43 + src/Repository/Server/ServerCode.java | 69 + .../Server/ServerExchangeUnit_2021.java | 41 + .../SubscriberRights/SubscriberRights.java | 12 + .../SubscriberWorkspace.java | 8 + .../SubscriberWorkspaceDBTable.java | 13 + src/Repository/Subscribes/Subscriber.java | 32 + .../Subscribes/SubsribersDBTable.java | 58 + .../Subscribes/UI/SubscriberFields.form | 89 + .../Subscribes/UI/SubscriberFields.java | 27 + .../Subscribes/UI/SubscriberForm.java | 56 + .../Configuration/Configuration.java | 36 + .../Configuration/ConfigurationInterface.java | 69 + .../UI/ConfigurationDBTable.java | 165 ++ .../Configuration/UI/ConfigurationFields.form | 402 +++++ .../Configuration/UI/ConfigurationFields.java | 106 ++ src/TestingSystem/Group/Group.java | 40 + src/TestingSystem/Group/GroupInterface.java | 132 ++ src/TestingSystem/Group/GroupsDBTable.java | 185 ++ src/TestingSystem/Group/UI/GroupFields.form | 80 + src/TestingSystem/Group/UI/GroupFields.java | 32 + .../MachineKernels/MachineKernels.java | 25 + .../MachineMaxKernels/MachineMaxKernels.java | 22 + .../MachineMaxKernelsDBTable.java | 7 + .../SapforConfiguration.java | 11 + .../SapforConfigurationDBTable.java | 122 ++ .../SapforConfigurationInterface.java | 71 + .../UI/SapforConfigurationFields.form | 151 ++ .../UI/SapforConfigurationFields.java | 31 + .../SapforConfigurationCommand.java | 13 + .../SapforConfigurationCommandInterface.java | 7 + .../SapforConfigurationCommandsDBTable.java | 71 + .../UI/SapforConfigurationCommandFields.form | 35 + .../UI/SapforConfigurationCommandFields.java | 32 + .../Sapfor/SapforTask/MatchState.java | 36 + .../Sapfor/SapforTask/SapforTaskResult.java | 16 + .../Sapfor/SapforTask/SapforTask_2023.java | 55 + .../Sapfor/SapforTask/SapforTasksDBTable.java | 56 + .../SapforTasksPackage_2023.java | 79 + .../SapforTasksPackagesDBTable.java | 96 + .../Sapfor/SapforVersion_json.java | 12 + .../Sapfor/ScenarioResults_json.java | 10 + src/TestingSystem/Sapfor/Scenario_json.java | 14 + src/TestingSystem/TSetting/TSetting.java | 35 + .../TSetting/TSettingsDBTable.java | 7 + src/TestingSystem/TaskKey/TaskKey_2022.java | 28 + .../TaskKey/TaskKeysDBTable.java | 7 + .../Tasks/TestCompilationTask.java | 51 + .../Tasks/TestCompilationTasksDBTable.java | 16 + src/TestingSystem/Tasks/TestRunTask.java | 106 ++ .../Tasks/TestRunTaskInterface.java | 85 + .../Tasks/TestRunTasksDBTable.java | 188 ++ src/TestingSystem/Tasks/TestTask.java | 99 ++ src/TestingSystem/TasksDatabase.java | 201 +++ .../TasksPackage/TasksPackage.java | 80 + .../TasksPackage/TasksPackageDBTable.java | 98 + .../TasksPackage/TasksPackageState.java | 80 + .../TasksPackageToKill.java | 5 + .../TasksPackageToKillDBTable.java | 7 + src/TestingSystem/Test/ProjectFiles_json.java | 10 + src/TestingSystem/Test/Test.java | 43 + src/TestingSystem/Test/TestDBTable.java | 92 + src/TestingSystem/Test/TestInterface.java | 41 + src/TestingSystem/Test/TestType.java | 22 + src/TestingSystem/Test/UI/TestFields.form | 55 + src/TestingSystem/Test/UI/TestFields.java | 22 + src/TestingSystem/TestingPlanner.java | 196 ++ src/TestingSystem/TestingServer.java | 449 +++++ src/TestingSystem/TestsDatabase.java | 61 + .../TestsSupervisor_2022.java | 322 ++++ src/TestingSystem/UserConnection.java | 228 +++ src/Visual_DVM_2021/PassStats/PassStats.java | 29 + .../PassStats/PassStatsDBTable.java | 12 + src/Visual_DVM_2021/Passes/AddObjectPass.java | 32 + .../Passes/All/AbortSelectedPackages.java | 45 + .../Passes/All/ActualizePackages.java | 70 + .../Passes/All/AddBugReport.java | 95 + .../Passes/All/AddCompiler.java | 20 + .../Passes/All/AddDVMParameter.java | 20 + .../Passes/All/AddDVMParameterForTesting.java | 37 + .../Passes/All/AddEnvironmentValue.java | 14 + src/Visual_DVM_2021/Passes/All/AddFile.java | 73 + .../Passes/All/AddMachine.java | 59 + .../Passes/All/AddMakefile.java | 30 + .../Passes/All/AddRunConfiguration.java | 20 + src/Visual_DVM_2021/Passes/All/AddSapfor.java | 24 + .../Passes/All/AddSubscriber.java | 38 + src/Visual_DVM_2021/Passes/All/AddUser.java | 34 + .../All/AnalyseSapforPackageResults.java | 38 + .../Passes/All/AppendBugReportComment.java | 19 + .../All/AppendBugReportDescription.java | 14 + .../Passes/All/AppendBugReportField.java | 93 + .../Passes/All/ApplyBugReportSettings.java | 57 + .../Passes/All/ApplyCurrentFunction.java | 47 + .../Passes/All/ApplyProfile.java | 43 + .../Passes/All/ArchivesBackupPass.java | 51 + .../Passes/All/BuildComponent.java | 40 + .../Passes/All/CheckAccount.java | 33 + .../Passes/All/CheckRegistrationOnServer.java | 14 + .../Passes/All/CheckRemoteWorkspace.java | 22 + .../Passes/All/CleanAnalyses.java | 29 + .../Passes/All/CloseBugReport.java | 16 + .../Passes/All/CloseCurrentFile.java | 51 + .../Passes/All/CloseCurrentProject.java | 66 + .../Passes/All/CloseProject.java | 24 + .../Passes/All/CombineFiles.java | 101 ++ .../Passes/All/CompareSapforPackages.java | 14 + src/Visual_DVM_2021/Passes/All/Compile.java | 95 + .../Passes/All/ConvertCorrectnessTests.java | 133 ++ .../Passes/All/CopyConfigurations.java | 7 + .../Passes/All/CopyGroups.java | 7 + .../Passes/All/CopyProject.java | 69 + .../Passes/All/CopyServerObjects.java | 59 + .../Passes/All/CreateComponentBackUp.java | 13 + .../Passes/All/CreateEmptyDirectory.java | 41 + .../Passes/All/CreateEmptyProject.java | 46 + .../Passes/All/CreateParallelVariants.java | 28 + ...teParallelVariantsCoverageForScenario.java | 44 + .../CreateTestsGroupFromSelectedVersions.java | 147 ++ .../Passes/All/DVMConvertProject.java | 154 ++ .../Passes/All/DeleteBugReport.java | 25 + .../Passes/All/DeleteBugReportFromServer.java | 17 + .../Passes/All/DeleteCompiler.java | 14 + .../Passes/All/DeleteDVMParameter.java | 14 + .../Passes/All/DeleteDebugResults.java | 29 + .../Passes/All/DeleteDirectory.java | 59 + .../All/DeleteDownloadedBugReports.java | 47 + .../Passes/All/DeleteEnvironmentValue.java | 14 + .../Passes/All/DeleteFile.java | 36 + .../Passes/All/DeleteLonelyM.java | 25 + .../Passes/All/DeleteMachine.java | 14 + .../Passes/All/DeleteMakefile.java | 14 + .../Passes/All/DeleteProfile.java | 14 + .../Passes/All/DeleteRunConfiguration.java | 14 + .../Passes/All/DeleteSapfor.java | 14 + .../Passes/All/DeleteSapforConfiguration.java | 20 + .../All/DeleteSapforConfigurationCommand.java | 20 + .../Passes/All/DeleteSapforTasksPackage.java | 30 + .../All/DeleteSelectedCompilationTasks.java | 46 + .../All/DeleteSelectedConfigurations.java | 8 + .../Passes/All/DeleteSelectedFiles.java | 53 + .../Passes/All/DeleteSelectedGroups.java | 8 + .../Passes/All/DeleteSelectedRunTasks.java | 41 + .../Passes/All/DeleteSelectedTests.java | 8 + .../All/DeleteSelectedTestsRunTasks.java | 45 + .../Passes/All/DeleteSelectedVersions.java | 54 + .../Passes/All/DeleteSubscriber.java | 20 + .../Passes/All/DeleteSubscriberOnServer.java | 22 + .../Passes/All/DeleteSubversions.java | 19 + .../Passes/All/DeleteUser.java | 14 + .../Passes/All/DeleteVersion.java | 59 + .../All/DownloadAllBugReportsArchives.java | 59 + .../Passes/All/DownloadBugReport.java | 30 + .../Passes/All/DownloadComponent.java | 16 + .../Passes/All/DownloadGroup.java | 67 + .../Passes/All/DownloadProject.java | 60 + .../Passes/All/DownloadRepository.java | 42 + .../Passes/All/DownloadTaskTest.java | 18 + .../Passes/All/DownloadTest.java | 59 + .../Passes/All/DropAnalyses.java | 14 + .../Passes/All/DropFastAccess.java | 21 + .../Passes/All/DropLastProjects.java | 10 + .../Passes/All/DropSavedArrays.java | 17 + .../Passes/All/EditAccount.java | 70 + .../Passes/All/EditCompiler.java | 14 + .../Passes/All/EditConfiguration.java | 29 + .../Passes/All/EditConfigurationOnServer.java | 16 + .../Passes/All/EditDVMParameter.java | 14 + .../Passes/All/EditEnvironmentValue.java | 14 + src/Visual_DVM_2021/Passes/All/EditGroup.java | 33 + .../Passes/All/EditGroupOnServer.java | 16 + .../Passes/All/EditMachine.java | 14 + .../Passes/All/EditMachineKernels.java | 50 + .../Passes/All/EditMakefile.java | 14 + .../Passes/All/EditModule.java | 14 + .../Passes/All/EditProfile.java | 14 + .../All/EditProjectCompilationMaxtime.java | 29 + .../Passes/All/EditProjectRunMaxtime.java | 29 + .../Passes/All/EditRunConfiguration.java | 14 + .../Passes/All/EditSapfor.java | 14 + .../Passes/All/EditSapforConfiguration.java | 29 + .../All/EditSapforConfigurationCommand.java | 38 + ...ditSapforConfigurationCommandOnServer.java | 16 + .../All/EditSapforConfigurationOnServer.java | 16 + .../Passes/All/EditSubscriber.java | 30 + .../Passes/All/EditSubscriberOnServer.java | 28 + src/Visual_DVM_2021/Passes/All/EditTest.java | 34 + .../Passes/All/EditTestOnServer.java | 16 + src/Visual_DVM_2021/Passes/All/EditUser.java | 14 + src/Visual_DVM_2021/Passes/All/Email.java | 31 + .../Passes/All/EraseBadSymbols.java | 27 + .../Passes/All/ExcludeFile.java | 29 + .../Passes/All/ExcludeSelectedFiles.java | 35 + .../Passes/All/ExtractRecipients.java | 43 + .../Passes/All/FinishApplication.java | 7 + src/Visual_DVM_2021/Passes/All/GCOV.java | 145 ++ .../Passes/All/GenerateParallelVariants.java | 53 + .../All/GetComponentsActualVersions.java | 42 + .../All/GetComponentsBackupsFromServer.java | 28 + .../Passes/All/GetTestsQueueSize.java | 30 + .../Passes/All/ImportFiles.java | 26 + .../Passes/All/IncludeFile.java | 29 + .../Passes/All/IncludeSelectedFiles.java | 34 + .../Passes/All/InitialiseUser.java | 65 + .../All/InstallComponentFromFolder.java | 57 + .../Passes/All/InstallRemoteSapfor.java | 93 + .../Passes/All/LinuxLocalCompilation.java | 15 + .../Passes/All/LinuxLocalRun.java | 15 + .../Passes/All/LocalInitaliseUser.java | 54 + .../Passes/All/LocalSingleCommand.java | 15 + src/Visual_DVM_2021/Passes/All/MVSRun.java | 15 + .../Passes/All/MakeScreenShot.java | 37 + .../Passes/All/MassSelectArrays.java | 73 + .../Passes/All/OpenBugReport.java | 16 + .../Passes/All/OpenBugReportTestProject.java | 72 + .../Passes/All/OpenCurrentFile.java | 31 + .../Passes/All/OpenCurrentProject.java | 154 ++ .../Passes/All/OpenProject.java | 30 + .../Passes/All/OpenSapforTest.java | 233 +++ .../Passes/All/PauseTesting.java | 31 + .../Passes/All/PerformSapforTasksPackage.java | 175 ++ .../Passes/All/PerformScenario.java | 229 +++ .../Passes/All/PickCompilerEnvironments.java | 99 ++ .../PickCompilerEnvironmentsForTesting.java | 61 + .../Passes/All/PickCompilerOptions.java | 58 + .../Passes/All/PlayTesting.java | 31 + .../Passes/All/Precompilation.java | 258 +++ .../Passes/All/PredictParallelVariants.java | 17 + .../Passes/All/PrepareForModulesAssembly.java | 74 + .../Passes/All/PublishBugReport.java | 76 + .../Passes/All/PublishComponent.java | 113 ++ .../Passes/All/PublishConfiguration.java | 42 + .../Passes/All/PublishGroup.java | 45 + .../Passes/All/PublishRemoteWorkspace.java | 16 + .../All/PublishSapforConfiguration.java | 42 + .../PublishSapforConfigurationCommand.java | 43 + .../Passes/All/PublishTest.java | 122 ++ .../Passes/All/RefreshDVMTests.java | 27 + .../Passes/All/RemoteCompilation.java | 15 + .../Passes/All/RemoteInitialiseUser.java | 81 + .../Passes/All/RemoteSingleCommand.java | 17 + .../Passes/All/RenameDirectory.java | 90 + .../Passes/All/RenameFile.java | 69 + .../Passes/All/ResetCurrentProject.java | 23 + .../Passes/All/RestoreSavedArrays.java | 29 + .../Passes/All/ResurrectComponent.java | 63 + .../All/ResurrectComponentFromServer.java | 119 ++ src/Visual_DVM_2021/Passes/All/Run.java | 113 ++ .../Passes/All/SPF_ChangeSpfIntervals.java | 21 + .../Passes/All/SPF_ConvertStructures.java | 4 + .../Passes/All/SPF_CorrectCodeStylePass.java | 4 + .../Passes/All/SPF_CreateCheckpoints.java | 4 + .../Passes/All/SPF_CreateIntervalsTree.java | 4 + .../Passes/All/SPF_CreateParallelVariant.java | 83 + .../All/SPF_DuplicateFunctionChains.java | 4 + .../All/SPF_ExpressionSubstitution.java | 3 + .../All/SPF_GetAllDeclaratedArrays.java | 70 + .../Passes/All/SPF_GetArrayDistribution.java | 39 + .../SPF_GetArrayDistributionOnlyAnalysis.java | 70 + .../SPF_GetArrayDistributionOnlyRegions.java | 48 + .../Passes/All/SPF_GetArrayLinks.java | 74 + .../Passes/All/SPF_GetFileLineInfo.java | 55 + .../Passes/All/SPF_GetGCovInfo.java | 95 + .../All/SPF_GetGraphFunctionPositions.java | 285 +++ .../Passes/All/SPF_GetGraphFunctions.java | 149 ++ .../Passes/All/SPF_GetGraphLoops.java | 75 + .../All/SPF_GetIncludeDependencies.java | 111 ++ .../All/SPF_GetMaxMinBlockDistribution.java | 45 + .../Passes/All/SPF_InitDeclsWithZero.java | 4 + .../Passes/All/SPF_InlineProcedure.java | 37 + .../Passes/All/SPF_InlineProcedures.java | 63 + .../Passes/All/SPF_InlineProceduresH.java | 94 + .../Passes/All/SPF_InsertDvmhRegions.java | 4 + .../Passes/All/SPF_InsertIncludesPass.java | 48 + .../All/SPF_LoopEndDoConverterPass.java | 4 + .../Passes/All/SPF_LoopFission.java | 4 + .../Passes/All/SPF_LoopUnion.java | 4 + .../Passes/All/SPF_LoopUnionCurrent.java | 15 + .../Passes/All/SPF_LoopUnrolling.java | 4 + .../All/SPF_ModifyArrayDistribution.java | 107 ++ .../Passes/All/SPF_ParseFilesWithOrder.java | 200 +++ .../All/SPF_PredictParallelVariant.java | 44 + .../Passes/All/SPF_PrivateExpansion.java | 4 + .../Passes/All/SPF_PrivateRemoving.java | 4 + .../Passes/All/SPF_PrivateShrinking.java | 4 + .../Passes/All/SPF_RemoveDvmDirectives.java | 4 + .../SPF_RemoveDvmDirectivesToComments.java | 4 + .../Passes/All/SPF_RemoveDvmIntervals.java | 4 + .../Passes/All/SPF_RemoveUnusedFunctions.java | 4 + .../All/SPF_ResolveCommonBlockConflicts.java | 4 + .../SPF_ResolveParallelRegionConflicts.java | 4 + .../All/SPF_SharedMemoryParallelization.java | 4 + .../Passes/All/SPF_StatisticAnalyzer.java | 43 + src/Visual_DVM_2021/Passes/All/Save.java | 37 + .../Passes/All/SaveBugReportComment.java | 16 + .../Passes/All/SaveBugReportDescription.java | 16 + .../Passes/All/SaveBugReportExecutor.java | 19 + .../Passes/All/SaveBugReportRecipients.java | 16 + .../All/SaveFunctionsGraphCoordinates.java | 45 + src/Visual_DVM_2021/Passes/All/SaveGraph.java | 68 + .../Passes/All/SaveProfile.java | 37 + .../Passes/All/SelectRemoteFile.java | 24 + .../Passes/All/SendBugReport.java | 26 + src/Visual_DVM_2021/Passes/All/ServerRun.java | 15 + .../Passes/All/SetSelectedFilesLanguage.java | 21 + .../Passes/All/SetSelectedFilesStyle.java | 22 + .../Passes/All/SetSelectedFilesType.java | 21 + .../Passes/All/ShowCompilerHelp.java | 65 + .../Passes/All/ShowCompilerVersion.java | 67 + .../Passes/All/ShowComponentChangesLog.java | 57 + .../Passes/All/ShowInstruction.java | 32 + .../Passes/All/ShowMakefilePreview.java | 33 + .../Passes/All/ShowVersionsFiles.java | 8 + .../Passes/All/StartSapforTests.java | 295 ++++ .../Passes/All/StartTests.java | 238 +++ .../Passes/All/SwitchTestingEmail.java | 22 + .../Passes/All/SynchronizeBugReports.java | 53 + .../Passes/All/SynchronizeTests.java | 65 + .../Passes/All/SynchronizeTestsTasks.java | 70 + src/Visual_DVM_2021/Passes/All/TestPass.java | 4 + .../Passes/All/UnzipFolderPass.java | 77 + .../Passes/All/UpdateBugReportField.java | 133 ++ .../Passes/All/UpdateBugReportProgress.java | 26 + .../Passes/All/UpdateComponent.java | 48 + .../Passes/All/UpdateSelectedComponents.java | 48 + .../Passes/All/UpdateSetting.java | 158 ++ .../Passes/All/WindowsLocalCompilation.java | 15 + .../Passes/All/WindowsLocalRun.java | 15 + .../Passes/All/ZipFolderPass.java | 72 + .../Passes/ChangeFilePass.java | 25 + .../Passes/ComponentsRepositoryPass.java | 8 + .../Passes/CurrentComponentPass.java | 13 + .../Passes/CurrentProjectPass.java | 9 + .../Passes/DeleteObjectPass.java | 55 + .../Passes/DeleteSelectedServerObjects.java | 57 + .../Passes/EditObjectPass.java | 26 + src/Visual_DVM_2021/Passes/FilesMassPass.java | 37 + .../Passes/OLD/AttachFileToProject.java | 38 + .../Passes/OLD/DeleteAttachments.java | 23 + src/Visual_DVM_2021/Passes/ObjectPass.java | 18 + src/Visual_DVM_2021/Passes/PassCode_2021.java | 915 ++++++++++ src/Visual_DVM_2021/Passes/PassException.java | 7 + src/Visual_DVM_2021/Passes/PassState.java | 33 + src/Visual_DVM_2021/Passes/Pass_2021.java | 444 +++++ src/Visual_DVM_2021/Passes/ProcessPass.java | 79 + src/Visual_DVM_2021/Passes/ProjectPass.java | 12 + .../Passes/RepositoryPass.java | 117 ++ .../Passes/SSH/ConnectionPass.java | 395 +++++ .../Passes/SSH/CurrentConnectionPass.java | 19 + .../Passes/SSH/TaskConnectionPass.java | 37 + .../SSH/WorkspaceNotFoundException.java | 6 + .../Passes/SapforAnalysis.java | 168 ++ .../Passes/SapforFilesModification.java | 21 + .../Passes/SapforModification.java | 21 + src/Visual_DVM_2021/Passes/SapforPass.java | 29 + .../Passes/SapforTransformation.java | 99 ++ .../Passes/SilentSapforPass.java | 39 + .../Passes/SortPassesByStats.java | 7 + .../Passes/TestingSystemPass.java | 12 + .../Passes/Transformation.java | 53 + .../Passes/UI/CopyProjectFields.form | 87 + .../Passes/UI/CopyProjectFields.java | 39 + src/Visual_DVM_2021/Passes/UI/PassFields.form | 53 + src/Visual_DVM_2021/Passes/UI/PassFields.java | 15 + src/Visual_DVM_2021/Passes/UI/PassForm.java | 46 + .../Passes/VariantsMassPass.java | 65 + .../UI/Interface/AnalysisWindow.java | 13 + .../UI/Interface/ArraysWindow.java | 5 + .../UI/Interface/CallbackWindow.java | 28 + .../UI/Interface/CommentInterface.java | 6 + .../UI/Interface/DescriptionInterface.java | 6 + .../UI/Interface/FileWindow.java | 60 + .../UI/Interface/FilterWindow.java | 7 + .../UI/Interface/FormWithSplitters.java | 10 + .../UI/Interface/FunctionsWindow.java | 11 + .../UI/Interface/Loggable.java | 48 + .../UI/Interface/ProjectWindow.java | 80 + .../UI/Interface/SPFEditorInterface.java | 16 + .../UI/Interface/ScenariosWindow.java | 7 + .../UI/Interface/StatisticsWindow.java | 4 + .../UI/Interface/TestingWindow.java | 56 + .../UI/Interface/VariantsWindow.java | 17 + .../UI/Interface/VersionsWindow.java | 13 + .../UI/Interface/VisualizerForm.java | 9 + src/Visual_DVM_2021/UI/Main/AnalysisForm.form | 143 ++ src/Visual_DVM_2021/UI/Main/AnalysisForm.java | 65 + src/Visual_DVM_2021/UI/Main/ArraysForm.form | 166 ++ src/Visual_DVM_2021/UI/Main/ArraysForm.java | 134 ++ src/Visual_DVM_2021/UI/Main/CallbackForm.form | 431 +++++ src/Visual_DVM_2021/UI/Main/CallbackForm.java | 581 ++++++ .../UI/Main/CallbackWelcomeForm.form | 21 + .../UI/Main/CallbackWelcomeForm.java | 6 + .../UI/Main/CombineFilesDialog.java | 23 + .../UI/Main/CommentFields.form | 96 + .../UI/Main/CommentFields.java | 37 + src/Visual_DVM_2021/UI/Main/CommentTabs.form | 40 + src/Visual_DVM_2021/UI/Main/CommentTabs.java | 38 + .../UI/Main/ComparisonForm.form | 99 ++ .../UI/Main/ComparisonForm.java | 434 +++++ .../Main/CompilationTasksComparisonForm.java | 31 + .../UI/Main/DescriptionFields.form | 91 + .../UI/Main/DescriptionFields.java | 38 + .../UI/Main/DescriptionTabs.form | 40 + .../UI/Main/DescriptionTabs.java | 37 + src/Visual_DVM_2021/UI/Main/FileForm.form | 311 ++++ src/Visual_DVM_2021/UI/Main/FileForm.java | 358 ++++ .../UI/Main/FunctionsForm.form | 276 +++ .../UI/Main/FunctionsForm.java | 195 ++ src/Visual_DVM_2021/UI/Main/MainForm.form | 28 + src/Visual_DVM_2021/UI/Main/MainForm.java | 194 ++ .../Main/PackageVersionsComparisonForm.java | 11 + .../UI/Main/ProfilesFields.form | 43 + .../UI/Main/ProfilesFields.java | 21 + src/Visual_DVM_2021/UI/Main/ProfilesForm.java | 71 + src/Visual_DVM_2021/UI/Main/ProjectForm.form | 189 ++ src/Visual_DVM_2021/UI/Main/ProjectForm.java | 292 +++ .../UI/Main/RunTasksComparisonForm.java | 36 + .../UI/Main/SapforPackagesComparisonForm.form | 130 ++ .../UI/Main/SapforPackagesComparisonForm.java | 236 +++ .../UI/Main/SapforTasksComparisonForm.java | 24 + src/Visual_DVM_2021/UI/Main/TabToolBar.java | 35 + .../UI/Main/TasksComparisonForm.java | 103 ++ .../UI/Main/TasksComparisonState.java | 25 + .../UI/Main/TestRunTasksComparisonForm.java | 29 + src/Visual_DVM_2021/UI/Main/TestingForm.form | 911 ++++++++++ src/Visual_DVM_2021/UI/Main/TestingForm.java | 481 +++++ src/Visual_DVM_2021/UI/Main/VariantsForm.form | 200 +++ src/Visual_DVM_2021/UI/Main/VariantsForm.java | 119 ++ .../UI/Main/VersionsComparisonForm.java | 109 ++ src/Visual_DVM_2021/UI/Main/VersionsForm.form | 118 ++ src/Visual_DVM_2021/UI/Main/VersionsForm.java | 87 + src/Visual_DVM_2021/UI/Main/WelcomeForm.form | 26 + src/Visual_DVM_2021/UI/Main/WelcomeForm.java | 18 + src/Visual_DVM_2021/UI/Main/buffer.form | 11 + src/Visual_DVM_2021/UI/Main/buffer.java | 5 + src/analyzer/common/MessageJtoJ.java | 18 + src/files/Planner/Array.h | 42 + src/files/Planner/CompilationSupervisor.h | 20 + src/files/Planner/CompilationTask.h | 47 + src/files/Planner/File.h | 67 + src/files/Planner/Global.h | 13 + src/files/Planner/Planner.cpp | 111 ++ src/files/Planner/RunSupervisor.h | 32 + src/files/Planner/RunTask.h | 94 + src/files/Planner/String.h | 220 +++ src/files/Planner/Supervisor.h | 130 ++ src/files/Planner/Task.h | 171 ++ src/files/Planner/Text.h | 25 + src/files/Planner/Utils.h | 49 + src/files/Process_r.h | 66 + src/files/launcher.cpp | 148 ++ src/files/starter.cpp | 75 + src/icons/Alignment.png | Bin 0 -> 1939 bytes src/icons/Analyses.png | Bin 0 -> 1809 bytes src/icons/Append.png | Bin 0 -> 1414 bytes src/icons/AppendSmall.png | Bin 0 -> 825 bytes src/icons/Apply.png | Bin 0 -> 2248 bytes src/icons/Args.PNG | Bin 0 -> 1215 bytes src/icons/Arrays.png | Bin 0 -> 617 bytes src/icons/Arrays/IOPrivate.png | Bin 0 -> 736 bytes src/icons/Arrays/None.png | Bin 0 -> 957 bytes src/icons/Arrays/Selected.png | Bin 0 -> 1292 bytes src/icons/Arrays/SpfPrivate.png | Bin 0 -> 331 bytes src/icons/Arrays/Unknown.png | Bin 0 -> 1566 bytes src/icons/Attach.png | Bin 0 -> 1151 bytes src/icons/Atttachement.png | Bin 0 -> 920 bytes src/icons/Back.png | Bin 0 -> 1684 bytes src/icons/Background.png | Bin 0 -> 15546 bytes src/icons/Ban.PNG | Bin 0 -> 1718 bytes src/icons/Book.png | Bin 0 -> 1493 bytes src/icons/Bug.gif | Bin 0 -> 66394 bytes src/icons/Bug.png | Bin 0 -> 913 bytes src/icons/BugSettings.png | Bin 0 -> 3781 bytes src/icons/Bugs_2022.png | Bin 0 -> 1283 bytes src/icons/Camera.png | Bin 0 -> 2250 bytes src/icons/Chain.png | Bin 0 -> 1792 bytes src/icons/Clean.png | Bin 0 -> 1615 bytes src/icons/CleanTime.png | Bin 0 -> 1675 bytes src/icons/Close.png | Bin 0 -> 1835 bytes src/icons/CloseBugReport.png | Bin 0 -> 1852 bytes src/icons/Close_18.png | Bin 0 -> 1048 bytes src/icons/Command.png | Bin 0 -> 1851 bytes src/icons/Common.png | Bin 0 -> 1791 bytes src/icons/CompareDVMStatistics.png | Bin 0 -> 1525 bytes src/icons/Comparsion.png | Bin 0 -> 1749 bytes src/icons/CompilationErrors.png | Bin 0 -> 1495 bytes src/icons/CompilationOutput.png | Bin 0 -> 1540 bytes src/icons/Components.png | Bin 0 -> 1914 bytes src/icons/ComponentsActual.png | Bin 0 -> 2369 bytes src/icons/ComponentsNeedPublish.png | Bin 0 -> 2105 bytes src/icons/ComponentsNeedPublish_2023.gif | Bin 0 -> 2220 bytes src/icons/ComponentsNeedUpdate.gif | Bin 0 -> 14072 bytes src/icons/Coverage.png | Bin 0 -> 1063 bytes src/icons/Create.png | Bin 0 -> 1285 bytes src/icons/CreateProject.png | Bin 0 -> 1760 bytes src/icons/Credentials.png | Bin 0 -> 1350 bytes src/icons/DVM.png | Bin 0 -> 461 bytes src/icons/Date.png | Bin 0 -> 2503 bytes src/icons/Delete.png | Bin 0 -> 1745 bytes src/icons/Dimensions.png | Bin 0 -> 2011 bytes src/icons/Distribution.png | Bin 0 -> 2167 bytes src/icons/DownloadAll.png | Bin 0 -> 1380 bytes src/icons/DownloadBugReport.png | Bin 0 -> 1933 bytes src/icons/DownloadProject.png | Bin 0 -> 1697 bytes src/icons/Edit.png | Bin 0 -> 1558 bytes src/icons/Editor/Comment.png | Bin 0 -> 1103 bytes src/icons/Editor/Copy.png | Bin 0 -> 1593 bytes src/icons/Editor/Cut.png | Bin 0 -> 2022 bytes src/icons/Editor/Font+.png | Bin 0 -> 1740 bytes src/icons/Editor/Font-.png | Bin 0 -> 1639 bytes src/icons/Editor/NoStrike.png | Bin 0 -> 638 bytes src/icons/Editor/Paste.png | Bin 0 -> 1466 bytes src/icons/Editor/ShowAllSigns.png | Bin 0 -> 549 bytes src/icons/Editor/ShowNoSigns.png | Bin 0 -> 474 bytes src/icons/Editor/Strikethrough.png | Bin 0 -> 1004 bytes src/icons/Editor/Uncomment.png | Bin 0 -> 1132 bytes src/icons/Errors.png | Bin 0 -> 1771 bytes src/icons/Exclude.png | Bin 0 -> 1441 bytes src/icons/Explorer.png | Bin 0 -> 1724 bytes src/icons/File.png | Bin 0 -> 1893 bytes src/icons/Filter.png | Bin 0 -> 1625 bytes src/icons/Folder.png | Bin 0 -> 1024 bytes src/icons/Function.png | Bin 0 -> 2263 bytes src/icons/FunctionsH.png | Bin 0 -> 1321 bytes src/icons/GCOV.PNG | Bin 0 -> 1766 bytes src/icons/Generate.png | Bin 0 -> 1381 bytes src/icons/GlobalStatistic.png | Bin 0 -> 2147 bytes src/icons/GreenHelp.PNG | Bin 0 -> 1936 bytes src/icons/GreenStart.png | Bin 0 -> 861 bytes src/icons/HGreenArrow.png | Bin 0 -> 1604 bytes src/icons/Help.png | Bin 0 -> 2182 bytes src/icons/HidePassword.png | Bin 0 -> 1282 bytes src/icons/Home.png | Bin 0 -> 2087 bytes src/icons/Include.png | Bin 0 -> 1330 bytes src/icons/Info.png | Bin 0 -> 1688 bytes src/icons/InitializeUser.png | Bin 0 -> 1484 bytes src/icons/Language.png | Bin 0 -> 1542 bytes src/icons/Languages/C.png | Bin 0 -> 1563 bytes src/icons/Languages/Cpp.png | Bin 0 -> 1842 bytes src/icons/Languages/Fortran.png | Bin 0 -> 966 bytes src/icons/LastOpened.png | Bin 0 -> 931 bytes src/icons/Left.png | Bin 0 -> 2316 bytes src/icons/Library.PNG | Bin 0 -> 2099 bytes src/icons/Lines.png | Bin 0 -> 836 bytes src/icons/Log.png | Bin 0 -> 1353 bytes src/icons/Loop.png | Bin 0 -> 2400 bytes src/icons/Machine.png | Bin 0 -> 1878 bytes src/icons/MassFiles.png | Bin 0 -> 1320 bytes src/icons/Matrix.png | Bin 0 -> 1199 bytes src/icons/Maxtime.png | Bin 0 -> 2190 bytes src/icons/Menu/AddLines.png | Bin 0 -> 1829 bytes src/icons/Menu/Dvm.png | Bin 0 -> 1096 bytes src/icons/Menu/Functions.png | Bin 0 -> 2139 bytes src/icons/Menu/Intervals.png | Bin 0 -> 2197 bytes src/icons/Menu/Loops.png | Bin 0 -> 2274 bytes src/icons/Menu/Preprocessing.png | Bin 0 -> 1450 bytes src/icons/Menu/Privates.png | Bin 0 -> 658 bytes src/icons/Menu/Regions.png | Bin 0 -> 885 bytes src/icons/Menu/RemoveLines.png | Bin 0 -> 1786 bytes src/icons/Menu/Rename.png | Bin 0 -> 1153 bytes src/icons/Menu/Undo.png | Bin 0 -> 1805 bytes src/icons/Metrics.png | Bin 0 -> 3529 bytes src/icons/MultiFiles.png | Bin 0 -> 1604 bytes src/icons/Next.png | Bin 0 -> 2123 bytes src/icons/NotPick.png | Bin 0 -> 1407 bytes src/icons/Notes.png | Bin 0 -> 1789 bytes src/icons/OpenBugReport.png | Bin 0 -> 1971 bytes src/icons/OpenProject.png | Bin 0 -> 1389 bytes src/icons/ParallelVariants.png | Bin 0 -> 4407 bytes src/icons/Pass.gif | Bin 0 -> 6743 bytes src/icons/Pass2.gif | Bin 0 -> 6356 bytes src/icons/Pause.png | Bin 0 -> 1069 bytes src/icons/Pick.png | Bin 0 -> 1713 bytes src/icons/Predict.png | Bin 0 -> 1281 bytes src/icons/Prev.png | Bin 0 -> 2158 bytes src/icons/Profiles.png | Bin 0 -> 1013 bytes src/icons/Progress.png | Bin 0 -> 1574 bytes src/icons/Publish.png | Bin 0 -> 1802 bytes src/icons/Recomendations.png | Bin 0 -> 1575 bytes src/icons/RedAdd.png | Bin 0 -> 1507 bytes src/icons/Registry.png | Bin 0 -> 2349 bytes src/icons/Resurrect.png | Bin 0 -> 2542 bytes src/icons/Right.png | Bin 0 -> 2294 bytes src/icons/RunErrors.png | Bin 0 -> 1473 bytes src/icons/RunOutput.png | Bin 0 -> 1521 bytes src/icons/Save.png | Bin 0 -> 616 bytes src/icons/SaveSmall.png | Bin 0 -> 557 bytes src/icons/ScreenShot.png | Bin 0 -> 1522 bytes src/icons/SelectAll.png | Bin 0 -> 575 bytes src/icons/Session.png | Bin 0 -> 2322 bytes src/icons/Settings.png | Bin 0 -> 2226 bytes src/icons/ShowPassword.png | Bin 0 -> 1996 bytes src/icons/Start.png | Bin 0 -> 3465 bytes src/icons/Stop.png | Bin 0 -> 3496 bytes src/icons/Sts.png | Bin 0 -> 2148 bytes src/icons/Style.png | Bin 0 -> 1693 bytes src/icons/Subscribe.png | Bin 0 -> 2169 bytes src/icons/TabClose.png | Bin 0 -> 1175 bytes src/icons/Test2.png | Bin 0 -> 2417 bytes src/icons/Testing.png | Bin 0 -> 1575 bytes src/icons/Time.png | Bin 0 -> 2333 bytes src/icons/Transformations.png | Bin 0 -> 1640 bytes src/icons/Transformations/CombineFiles.png | Bin 0 -> 946 bytes src/icons/Transformations/CopyProject.png | Bin 0 -> 2143 bytes .../Transformations/DVMConvertProject.png | Bin 0 -> 2153 bytes src/icons/Transformations/EraseBadSymbols.png | Bin 0 -> 1959 bytes .../PrepareForModulesAssembly.png | Bin 0 -> 1457 bytes .../Transformations/SPF_ConvertStructures.png | Bin 0 -> 1000 bytes .../SPF_CorrectCodeStylePass.png | Bin 0 -> 1596 bytes .../Transformations/SPF_CreateCheckpoints.png | Bin 0 -> 1378 bytes .../SPF_CreateIntervalsTree.png | Bin 0 -> 2154 bytes .../SPF_DuplicateFunctionChains.png | Bin 0 -> 1355 bytes .../SPF_ExpressionSubstitution.png | Bin 0 -> 817 bytes .../Transformations/SPF_InitDeclsWithZero.png | Bin 0 -> 461 bytes .../Transformations/SPF_InlineProcedures.png | Bin 0 -> 817 bytes .../Transformations/SPF_InlineProceduresH.png | Bin 0 -> 817 bytes .../Transformations/SPF_InsertDvmhRegions.png | Bin 0 -> 1724 bytes .../SPF_InsertIncludesPass.png | Bin 0 -> 1496 bytes .../SPF_LoopEndDoConverterPass.png | Bin 0 -> 1808 bytes src/icons/Transformations/SPF_LoopFission.png | Bin 0 -> 1417 bytes src/icons/Transformations/SPF_LoopUnion.png | Bin 0 -> 2388 bytes .../Transformations/SPF_LoopUnrolling.png | Bin 0 -> 1808 bytes .../Transformations/SPF_PrivateExpansion.png | Bin 0 -> 753 bytes .../Transformations/SPF_PrivateRemoving.png | Bin 0 -> 824 bytes .../Transformations/SPF_PrivateShrinking.png | Bin 0 -> 875 bytes .../SPF_RemoveDvmDirectives.png | Bin 0 -> 1501 bytes .../SPF_RemoveDvmDirectivesToComments.png | Bin 0 -> 1438 bytes .../SPF_RemoveDvmIntervals.png | Bin 0 -> 1538 bytes .../SPF_RemoveUnusedFunctions.png | Bin 0 -> 1501 bytes .../SPF_ResolveCommonBlockConflicts.png | Bin 0 -> 923 bytes .../SPF_ResolveParallelRegionConflicts.png | Bin 0 -> 923 bytes .../SPF_SharedMemoryParallelization.png | Bin 0 -> 1003 bytes src/icons/UnselectAll.png | Bin 0 -> 514 bytes src/icons/Update.png | Bin 0 -> 1697 bytes src/icons/User.png | Bin 0 -> 1676 bytes src/icons/VersionsTree.png | Bin 0 -> 1778 bytes src/icons/Warnings.png | Bin 0 -> 1737 bytes src/icons/files/Excludedcppprogram.png | Bin 0 -> 1208 bytes src/icons/files/Excludedcprogram.png | Bin 0 -> 594 bytes src/icons/files/Excludeddata.png | Bin 0 -> 1273 bytes src/icons/files/Excludedfortranprogram.png | Bin 0 -> 828 bytes src/icons/files/Excludedheader.png | Bin 0 -> 1045 bytes src/icons/files/Excludednone.png | Bin 0 -> 1046 bytes src/icons/files/Excludednprogram.png | Bin 0 -> 1181 bytes src/icons/files/HasErrorscppprogram.png | Bin 0 -> 1367 bytes src/icons/files/HasErrorscprogram.png | Bin 0 -> 783 bytes src/icons/files/HasErrorsfortranprogram.png | Bin 0 -> 988 bytes src/icons/files/HasErrorsheader.png | Bin 0 -> 1204 bytes src/icons/files/HasErrorsnone.png | Bin 0 -> 1187 bytes src/icons/files/HasErrorsnprogram.png | Bin 0 -> 1348 bytes src/icons/files/HasNotescppprogram.png | Bin 0 -> 1399 bytes src/icons/files/HasNotescprogram.png | Bin 0 -> 830 bytes src/icons/files/HasNotesfortranprogram.png | Bin 0 -> 1024 bytes src/icons/files/HasNotesheader.png | Bin 0 -> 1232 bytes src/icons/files/HasNotesnone.png | Bin 0 -> 1231 bytes src/icons/files/HasNotesnprogram.png | Bin 0 -> 1380 bytes src/icons/files/HasWarningscppprogram.png | Bin 0 -> 1377 bytes src/icons/files/HasWarningscprogram.png | Bin 0 -> 796 bytes src/icons/files/HasWarningsfortranprogram.png | Bin 0 -> 993 bytes src/icons/files/HasWarningsheader.png | Bin 0 -> 1200 bytes src/icons/files/HasWarningsnone.png | Bin 0 -> 1190 bytes src/icons/files/HasWarningsnprogram.png | Bin 0 -> 1350 bytes src/icons/files/OKcppprogram.png | Bin 0 -> 1236 bytes src/icons/files/OKcprogram.png | Bin 0 -> 650 bytes src/icons/files/OKfortranprogram.png | Bin 0 -> 870 bytes src/icons/files/OKheader.png | Bin 0 -> 1097 bytes src/icons/files/OKnone.png | Bin 0 -> 1072 bytes src/icons/files/OKnprogram.png | Bin 0 -> 1227 bytes src/icons/files/Undefinedcppprogram.png | Bin 0 -> 886 bytes src/icons/files/Undefinedcprogram.png | Bin 0 -> 253 bytes src/icons/files/Undefineddata.png | Bin 0 -> 864 bytes src/icons/files/Undefinedfortranprogram.png | Bin 0 -> 470 bytes src/icons/files/Undefinedheader.png | Bin 0 -> 703 bytes src/icons/files/Undefinednone.png | Bin 0 -> 690 bytes src/icons/files/Undefinednprogram.png | Bin 0 -> 867 bytes src/icons/loops/HasErrorsArrayDecl.png | Bin 0 -> 786 bytes src/icons/loops/HasErrorsBadLoop.png | Bin 0 -> 951 bytes src/icons/loops/HasErrorsEGoto.png | Bin 0 -> 819 bytes src/icons/loops/HasErrorsFuncCall.png | Bin 0 -> 916 bytes src/icons/loops/HasErrorsFuncInfo.png | Bin 0 -> 900 bytes src/icons/loops/HasErrorsGoodLoop.png | Bin 0 -> 939 bytes src/icons/loops/HasErrorsIGoto.png | Bin 0 -> 792 bytes src/icons/loops/HasErrorsIO.png | Bin 0 -> 876 bytes src/icons/loops/HasErrorsLoop.png | Bin 0 -> 967 bytes src/icons/loops/HasErrorsNonRectIter.png | Bin 0 -> 823 bytes src/icons/loops/HasErrorsStop.png | Bin 0 -> 845 bytes src/icons/loops/HasNotesArrayDecl.png | Bin 0 -> 835 bytes src/icons/loops/HasNotesBadLoop.png | Bin 0 -> 993 bytes src/icons/loops/HasNotesEGoto.png | Bin 0 -> 866 bytes src/icons/loops/HasNotesFuncCall.png | Bin 0 -> 966 bytes src/icons/loops/HasNotesFuncInfo.png | Bin 0 -> 945 bytes src/icons/loops/HasNotesGoodLoop.png | Bin 0 -> 982 bytes src/icons/loops/HasNotesIGoto.png | Bin 0 -> 839 bytes src/icons/loops/HasNotesIO.png | Bin 0 -> 926 bytes src/icons/loops/HasNotesLoop.png | Bin 0 -> 1007 bytes src/icons/loops/HasNotesNonRectIter.png | Bin 0 -> 867 bytes src/icons/loops/HasNotesStop.png | Bin 0 -> 888 bytes src/icons/loops/HasWarningsArrayDecl.png | Bin 0 -> 794 bytes src/icons/loops/HasWarningsBadLoop.png | Bin 0 -> 950 bytes src/icons/loops/HasWarningsEGoto.png | Bin 0 -> 828 bytes src/icons/loops/HasWarningsFuncCall.png | Bin 0 -> 925 bytes src/icons/loops/HasWarningsFuncInfo.png | Bin 0 -> 905 bytes src/icons/loops/HasWarningsGoodLoop.png | Bin 0 -> 938 bytes src/icons/loops/HasWarningsIGoto.png | Bin 0 -> 803 bytes src/icons/loops/HasWarningsIO.png | Bin 0 -> 885 bytes src/icons/loops/HasWarningsLoop.png | Bin 0 -> 968 bytes src/icons/loops/HasWarningsNonRectIter.png | Bin 0 -> 829 bytes src/icons/loops/HasWarningsStop.png | Bin 0 -> 852 bytes src/icons/loops/OKArrayDecl.png | Bin 0 -> 251 bytes src/icons/loops/OKBadLoop.png | Bin 0 -> 422 bytes src/icons/loops/OKEGoto.png | Bin 0 -> 300 bytes src/icons/loops/OKFuncCall.png | Bin 0 -> 396 bytes src/icons/loops/OKFuncInfo.png | Bin 0 -> 369 bytes src/icons/loops/OKGoodLoop.png | Bin 0 -> 403 bytes src/icons/loops/OKIGoto.png | Bin 0 -> 273 bytes src/icons/loops/OKIO.png | Bin 0 -> 346 bytes src/icons/loops/OKLoop.png | Bin 0 -> 448 bytes src/icons/loops/OKNonRectIter.png | Bin 0 -> 301 bytes src/icons/loops/OKStop.png | Bin 0 -> 313 bytes src/icons/makefile.png | Bin 0 -> 2379 bytes src/icons/screen.png | Bin 0 -> 1297 bytes src/icons/type.png | Bin 0 -> 943 bytes src/icons/versions/M.png | Bin 0 -> 1157 bytes src/icons/versions/Root.png | Bin 0 -> 1185 bytes src/icons/versions/Version.png | Bin 0 -> 1170 bytes src/icons/versions/currentM.png | Bin 0 -> 269 bytes src/icons/versions/currentRoot.png | Bin 0 -> 513 bytes src/icons/versions/currentVersion.png | Bin 0 -> 367 bytes ...ƒÐºÑ†Ð¸Ñ по раÑпараллеливанию в ÑиÑтеме SAPFOR.pptx | Bin 0 -> 18250409 bytes 1239 files changed, 61161 insertions(+), 1 deletion(-) create mode 100644 .idea/artifacts/VisualSapfor_jar.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/dictionaries/misha.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/libraries/autocomplete_3_1_1_SNAPSHOT.xml create mode 100644 .idea/libraries/commons_io_2_5.xml create mode 100644 .idea/libraries/gson_2_8_1.xml create mode 100644 .idea/libraries/jsch_0_1_55.xml create mode 100644 .idea/libraries/mail.xml create mode 100644 .idea/libraries/mxgraphx_all_4_2_0.xml create mode 100644 .idea/libraries/rsyntaxtextarea_3_0_5_SNAPSHOT.xml create mode 100644 .idea/libraries/sqlite_jdbc_3_7_2.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/uiDesigner.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/visual_dvm_2020.iml create mode 100644 .idea/workspace.xml create mode 100644 PerformanceAnalyzer/1049392283/stat.json create mode 100644 PerformanceAnalyzer/139606632/stat.json create mode 100644 PerformanceAnalyzer/1664247100/stat.json create mode 100644 PerformanceAnalyzer/535943622/stat.json create mode 100644 PerformanceAnalyzer/622828792/stat.json create mode 100644 Planner/Array.h create mode 100644 Planner/CompilationSupervisor.h create mode 100644 Planner/CompilationTask.h create mode 100644 Planner/File.h create mode 100644 Planner/Global.h create mode 100644 Planner/Planner.cpp create mode 100644 Planner/RunSupervisor.h create mode 100644 Planner/RunTask.h create mode 100644 Planner/String.h create mode 100644 Planner/Supervisor.h create mode 100644 Planner/Task.h create mode 100644 Planner/Text.h create mode 100644 Planner/Utils.h create mode 100644 Thumbs.db create mode 100644 Visual_DVM_2020.iml create mode 100644 Visualizer_2.exe create mode 100644 properties create mode 100644 src/Common/Current.java create mode 100644 src/Common/Database/ColumnType.java create mode 100644 src/Common/Database/DBObject.java create mode 100644 src/Common/Database/DBTable.java create mode 100644 src/Common/Database/DBTableColumn.java create mode 100644 src/Common/Database/DataSet.java create mode 100644 src/Common/Database/DataSetAnchestor.java create mode 100644 src/Common/Database/Database.java create mode 100644 src/Common/Database/FKBehaviour.java create mode 100644 src/Common/Database/FKCurrentObjectBehaviuor.java create mode 100644 src/Common/Database/FKDataBehaviour.java create mode 100644 src/Common/Database/SQLITE/SQLiteDatabase.java create mode 100644 src/Common/Database/TableFilter.java create mode 100644 src/Common/Database/iDBObject.java create mode 100644 src/Common/Database/iDBTable.java create mode 100644 src/Common/Database/nDBObject.java create mode 100644 src/Common/Database/rDBObject.java create mode 100644 src/Common/Global.java create mode 100644 src/Common/GlobalProperties.java create mode 100644 src/Common/PackageModeSupervisor.java create mode 100644 src/Common/Properties.java create mode 100644 src/Common/UI/ComboBox/StyledTextComboBox.java create mode 100644 src/Common/UI/ControlForm.java create mode 100644 src/Common/UI/ControlWithCurrentForm.java create mode 100644 src/Common/UI/DataControl.java create mode 100644 src/Common/UI/DataControl_OLD.java create mode 100644 src/Common/UI/DataSetControlForm.java create mode 100644 src/Common/UI/DebugPrintLevel.java create mode 100644 src/Common/UI/DragDrop/ExampleDrop.java create mode 100644 src/Common/UI/DragDrop/FileDrop.java create mode 100644 src/Common/UI/Editor/BaseEditor.java create mode 100644 src/Common/UI/Editor/CaretInfo.java create mode 100644 src/Common/UI/Editor/Viewer.java create mode 100644 src/Common/UI/EmptyDialogFields.form create mode 100644 src/Common/UI/EmptyDialogFields.java create mode 100644 src/Common/UI/Label/ShortLabel.java create mode 100644 src/Common/UI/List/HyperlinksStyledList.java create mode 100644 src/Common/UI/List/StyledList.java create mode 100644 src/Common/UI/Menus/AttachementsMenu.java create mode 100644 src/Common/UI/Menus/FileStyleMenu.java create mode 100644 src/Common/UI/Menus/GraphMenu.java create mode 100644 src/Common/UI/Menus/MainEditorMenu.java create mode 100644 src/Common/UI/Menus/PassesSubMenu.java create mode 100644 src/Common/UI/Menus/ProjectFilesMenu.java create mode 100644 src/Common/UI/Menus/PropertiesSubmenu.java create mode 100644 src/Common/UI/Menus/SelectionTreeMenu.java create mode 100644 src/Common/UI/Menus/StyledPopupMenu.java create mode 100644 src/Common/UI/Menus/TableMenu.java create mode 100644 src/Common/UI/Menus/TestsCompilationFilterMenu.java create mode 100644 src/Common/UI/Menus/TextComboBoxMenu.java create mode 100644 src/Common/UI/Menus/TextEditorMenu.java create mode 100644 src/Common/UI/Menus/VersionsMenu.java create mode 100644 src/Common/UI/Menus/VisualiserMenuItem.java create mode 100644 src/Common/UI/Menus_2023/BugReportsMenuBar/BugReportsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/CompilersMenuBar/CompilersMenuBar.java create mode 100644 src/Common/UI/Menus_2023/ComponentsMenuBar/ComponentsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/ConfigurationsMenuBar/ConfigurationsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/DVMParametersMenuBar/DVMParametersMenuBar.java create mode 100644 src/Common/UI/Menus_2023/DataMenuBar.java create mode 100644 src/Common/UI/Menus_2023/EnvironmentValuesMenuBar/EnvironmentValuesMenuBar.java create mode 100644 src/Common/UI/Menus_2023/FastAccessMenuBar/FastAccessMenuBar.java create mode 100644 src/Common/UI/Menus_2023/FileMenuBar/FileMenuBar.java create mode 100644 src/Common/UI/Menus_2023/FileMenuBar/FileSettingsMenu.java create mode 100644 src/Common/UI/Menus_2023/GroupsMenuBar/GroupsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/LanguagesSubmenu.java create mode 100644 src/Common/UI/Menus_2023/MachinesMenuBar/MachinesMenuBar.java create mode 100644 src/Common/UI/Menus_2023/MainMenuBar/AnalysesMenu.java create mode 100644 src/Common/UI/Menus_2023/MainMenuBar/GlobalCleaningMenu.java create mode 100644 src/Common/UI/Menus_2023/MainMenuBar/LastOpenedProjectsMenu.java create mode 100644 src/Common/UI/Menus_2023/MainMenuBar/MainMenuBar.java create mode 100644 src/Common/UI/Menus_2023/MainMenuBar/MainWindow.java create mode 100644 src/Common/UI/Menus_2023/MainMenuBar/TransformationsMenu.java create mode 100644 src/Common/UI/Menus_2023/MainMenuBar/VisualiserSettingsMenu.java create mode 100644 src/Common/UI/Menus_2023/MakefilesMenuBar/MakefilesMenuBar.java create mode 100644 src/Common/UI/Menus_2023/MenuBarButton.java create mode 100644 src/Common/UI/Menus_2023/ModulesMenuBar/ModulesMenuBar.java create mode 100644 src/Common/UI/Menus_2023/PassButton.java create mode 100644 src/Common/UI/Menus_2023/PassControl.java create mode 100644 src/Common/UI/Menus_2023/PassMenuItem.java create mode 100644 src/Common/UI/Menus_2023/ProjectMenuBar/FilesOperationsMenu.java create mode 100644 src/Common/UI/Menus_2023/ProjectMenuBar/ProjectMenuBar.java create mode 100644 src/Common/UI/Menus_2023/ProjectMenuBar/ProjectSettingsMenu.java create mode 100644 src/Common/UI/Menus_2023/ProjectMenuBar/ProjectViewMenu.java create mode 100644 src/Common/UI/Menus_2023/RemoteSapforsMenuBar/RemoteSapforsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/RunConfigurationsMenuBar/RunConfigurationsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/SapforConfigurationCommandsMenuBar/SapforConfigurationCommandsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/SapforConfigurationsMenuBar/SapforConfigurationsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/SapforTasksMenuBar/SapforTasksMenuBar.java create mode 100644 src/Common/UI/Menus_2023/SapforTasksPackagesBar/SapforTasksPackagesBar.java create mode 100644 src/Common/UI/Menus_2023/SettingsSubmenu.java create mode 100644 src/Common/UI/Menus_2023/StableMenuItem.java create mode 100644 src/Common/UI/Menus_2023/StablePassMenuItem.java create mode 100644 src/Common/UI/Menus_2023/StylesSubmenu.java create mode 100644 src/Common/UI/Menus_2023/SubscribersMenuBar/SubscribersMenuBar.java create mode 100644 src/Common/UI/Menus_2023/TasksPackagesMenuBar/TasksPackagesMenuBar.java create mode 100644 src/Common/UI/Menus_2023/TestRunTasksMenuBar/TestRunTasksMenuBar.java create mode 100644 src/Common/UI/Menus_2023/TestsMenuBar/TestsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/TypesSubmenu.java create mode 100644 src/Common/UI/Menus_2023/UsersMenuBar/UsersMenuBar.java create mode 100644 src/Common/UI/Menus_2023/VariantsMenuBar/VariantsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/VersionsMenuBar/VersionsMenuBar.java create mode 100644 src/Common/UI/Menus_2023/VisualiserMenu.java create mode 100644 src/Common/UI/Menus_2023/VisualiserMenuBar.java create mode 100644 src/Common/UI/ProgressBar/StyledProgressBar.java create mode 100644 src/Common/UI/Selectable.java create mode 100644 src/Common/UI/StatusEnum.java create mode 100644 src/Common/UI/Tables/ColumnFilter.java create mode 100644 src/Common/UI/Tables/ColumnInfo.java create mode 100644 src/Common/UI/Tables/DBObjectEditor.java create mode 100644 src/Common/UI/Tables/DBObjectRenderer.java create mode 100644 src/Common/UI/Tables/DBObjectSelectionRenderer.java create mode 100644 src/Common/UI/Tables/DBObjectSelector.java create mode 100644 src/Common/UI/Tables/DataTable.java create mode 100644 src/Common/UI/Tables/DateRenderer_.java create mode 100644 src/Common/UI/Tables/EditableHeaderRenderer.java create mode 100644 src/Common/UI/Tables/EditorCell.java create mode 100644 src/Common/UI/Tables/Grid/GridAnchestor.java create mode 100644 src/Common/UI/Tables/HiddenListRenderer.java create mode 100644 src/Common/UI/Tables/HyperlinksRenderer.java create mode 100644 src/Common/UI/Tables/MaskedIntegerValueRenderer.java create mode 100644 src/Common/UI/Tables/MultilineRenderer.java create mode 100644 src/Common/UI/Tables/ProgressBarRenderer.java create mode 100644 src/Common/UI/Tables/RendererCell.java create mode 100644 src/Common/UI/Tables/StatusEnumRenderer.java create mode 100644 src/Common/UI/Tables/StyledCellLabel.java create mode 100644 src/Common/UI/Tables/StyledTable.java create mode 100644 src/Common/UI/Tables/TableEditors.java create mode 100644 src/Common/UI/Tables/TableRenderers.java create mode 100644 src/Common/UI/Tables/TopLeftRenderer.java create mode 100644 src/Common/UI/Tables/VectorEditor.java create mode 100644 src/Common/UI/Tables/WrapTextRenderer.java create mode 100644 src/Common/UI/TextArea/StyledTextArea.java create mode 100644 src/Common/UI/TextField/StyledPasswordField.java create mode 100644 src/Common/UI/TextField/StyledTextField.java create mode 100644 src/Common/UI/Themes/DarkVisualiserTheme.java create mode 100644 src/Common/UI/Themes/FortranSPFTokenMaker.java create mode 100644 src/Common/UI/Themes/FreeFortranSPFTokenMaker.java create mode 100644 src/Common/UI/Themes/LightVisualiserTheme.java create mode 100644 src/Common/UI/Themes/ProvidedTokenMaker.java create mode 100644 src/Common/UI/Themes/ThemeElement.java create mode 100644 src/Common/UI/Themes/TokenProvider.java create mode 100644 src/Common/UI/Themes/VisualiserColor.java create mode 100644 src/Common/UI/Themes/VisualiserFonts.java create mode 100644 src/Common/UI/Themes/VisualiserTheme.java create mode 100644 src/Common/UI/Themes/VisualiserThemeName.java create mode 100644 src/Common/UI/Themes/dark_editor.xml create mode 100644 src/Common/UI/Themes/light_editor.xml create mode 100644 src/Common/UI/Trees/DataTree.java create mode 100644 src/Common/UI/Trees/GraphTreeCellRenderer.java create mode 100644 src/Common/UI/Trees/SelectableTree.java create mode 100644 src/Common/UI/Trees/SelectionTreeCellRenderer.java create mode 100644 src/Common/UI/Trees/StyledTree.java create mode 100644 src/Common/UI/Trees/StyledTreeCellRenderer.java create mode 100644 src/Common/UI/Trees/TreeForm.java create mode 100644 src/Common/UI/Trees/TreeRenderers.java create mode 100644 src/Common/UI/UI.java create mode 100644 src/Common/UI/VisualiserStringList.java create mode 100644 src/Common/UI/Windows/Dialog/DBObjectDialog.java create mode 100644 src/Common/UI/Windows/Dialog/Dialog.java create mode 100644 src/Common/UI/Windows/Dialog/DialogFields.java create mode 100644 src/Common/UI/Windows/Dialog/DialogSlider.java create mode 100644 src/Common/UI/Windows/Dialog/DialogSpinner.java create mode 100644 src/Common/UI/Windows/Dialog/DialogTextComboBox.java create mode 100644 src/Common/UI/Windows/Dialog/DialogTextField.java create mode 100644 src/Common/UI/Windows/Dialog/DialogWrapText.java create mode 100644 src/Common/UI/Windows/Dialog/NumberDialog.java create mode 100644 src/Common/UI/Windows/Dialog/PercentsForm.java create mode 100644 src/Common/UI/Windows/Dialog/SessionMaxtimeDialog.java create mode 100644 src/Common/UI/Windows/Dialog/SliderNumberForm.java create mode 100644 src/Common/UI/Windows/Dialog/SpinnerNumberForm.java create mode 100644 src/Common/UI/Windows/Dialog/Text/ComboTextDialog.java create mode 100644 src/Common/UI/Windows/Dialog/Text/FileNameForm.java create mode 100644 src/Common/UI/Windows/Dialog/Text/MultilineTextForm.java create mode 100644 src/Common/UI/Windows/Dialog/Text/ReadOnlyMultilineTextForm.java create mode 100644 src/Common/UI/Windows/Dialog/Text/TextDialog.java create mode 100644 src/Common/UI/Windows/Dialog/Text/TextFieldDialog.java create mode 100644 src/Common/UI/Windows/Form.java create mode 100644 src/Common/UI/Windows/FormType.java create mode 100644 src/Common/UI/Windows/Sapfor.png create mode 100644 src/Common/UI/Windows/SearchReplaceForm.form create mode 100644 src/Common/UI/Windows/SearchReplaceForm.java create mode 100644 src/Common/Utils/Files/ProjectsChooser.java create mode 100644 src/Common/Utils/Files/VDirectoryChooser.java create mode 100644 src/Common/Utils/Files/VFileChooser.java create mode 100644 src/Common/Utils/Files/VFileChooser_.java create mode 100644 src/Common/Utils/Index.java create mode 100644 src/Common/Utils/InterruptThread.java create mode 100644 src/Common/Utils/Stopwatch.java create mode 100644 src/Common/Utils/StringTemplate.java create mode 100644 src/Common/Utils/TextLog.java create mode 100644 src/Common/Utils/Utils.java create mode 100644 src/Common/Utils/Validators/DVMHelpParser.java create mode 100644 src/Common/Utils/Validators/EnvironmentState.java create mode 100644 src/Common/Utils/Validators/HelpParserState.java create mode 100644 src/Common/Utils/Validators/OptionState.java create mode 100644 src/Common/Utils/Validators/PathValidator.java create mode 100644 src/Common/Utils/Validators/PathValidatorState.java create mode 100644 src/Common/Utils/Validators/ShellParser.java create mode 100644 src/Common/Utils/Validators/ShellParserState.java create mode 100644 src/Common/Utils/Validators/StatementsChecker.java create mode 100644 src/Common/Utils/Validators/Validator.java create mode 100644 src/GlobalData/Account/Account.java create mode 100644 src/GlobalData/Account/AccountRole.java create mode 100644 src/GlobalData/Account/AccountSubscribeState.java create mode 100644 src/GlobalData/Account/AccountsDBTable.java create mode 100644 src/GlobalData/Compiler/Compiler.java create mode 100644 src/GlobalData/Compiler/CompilerType.java create mode 100644 src/GlobalData/Compiler/CompilersDBTable.java create mode 100644 src/GlobalData/Compiler/UI/CompilerFields.form create mode 100644 src/GlobalData/Compiler/UI/CompilerFields.java create mode 100644 src/GlobalData/CompilerEnvironment/CompilerEnvironment.java create mode 100644 src/GlobalData/CompilerEnvironment/CompilerEnvironmentsSet.java create mode 100644 src/GlobalData/CompilerEnvironment/EnvironmentValueType.java create mode 100644 src/GlobalData/CompilerEnvironment/UI/CompilerEnvironmentValueEditor.java create mode 100644 src/GlobalData/CompilerEnvironment/UI/CompilerEnvironmentValueRenderer.java create mode 100644 src/GlobalData/CompilerEnvironment/UI/CompilerEnvironmentsFields.form create mode 100644 src/GlobalData/CompilerEnvironment/UI/CompilerEnvironmentsFields.java create mode 100644 src/GlobalData/CompilerOption/CompilerOption.java create mode 100644 src/GlobalData/CompilerOption/CompilerOptionsSet.java create mode 100644 src/GlobalData/CompilerOption/UI/CompilerOptionParameterNameRenderer.java create mode 100644 src/GlobalData/CompilerOption/UI/CompilerOptionParameterValueEditor.java create mode 100644 src/GlobalData/CompilerOption/UI/CompilerOptionParameterValueRenderer.java create mode 100644 src/GlobalData/CompilerOption/UI/CompilerOptionsFields.form create mode 100644 src/GlobalData/CompilerOption/UI/CompilerOptionsFields.java create mode 100644 src/GlobalData/Credentials/Credentials.java create mode 100644 src/GlobalData/Credentials/CredentialsDBTable.java create mode 100644 src/GlobalData/DBLastProject/DBLastProject.java create mode 100644 src/GlobalData/DBLastProject/LastProjectsDBTable.java create mode 100644 src/GlobalData/DVMParameter/DVMParameter.java create mode 100644 src/GlobalData/DVMParameter/DVMParameterDBTable.java create mode 100644 src/GlobalData/DVMParameter/UI/DVMParameterFields.form create mode 100644 src/GlobalData/DVMParameter/UI/DVMParameterFields.java create mode 100644 src/GlobalData/EnvironmentValue/EnvironmentValue.java create mode 100644 src/GlobalData/EnvironmentValue/EnvironmentValuesDBTable.java create mode 100644 src/GlobalData/EnvironmentValue/UI/EnvironmentValueFields.form create mode 100644 src/GlobalData/EnvironmentValue/UI/EnvironmentValueFields.java create mode 100644 src/GlobalData/FormsParams/DBForm.java create mode 100644 src/GlobalData/FormsParams/DBMainFormParams.java create mode 100644 src/GlobalData/FormsParams/FormsDBTable.java create mode 100644 src/GlobalData/FormsParams/MainFormParamsDBTable.java create mode 100644 src/GlobalData/GlobalDatabase.java create mode 100644 src/GlobalData/Grid/Grid.java create mode 100644 src/GlobalData/Grid/GridsDBTable.java create mode 100644 src/GlobalData/Machine/Machine.java create mode 100644 src/GlobalData/Machine/MachineType.java create mode 100644 src/GlobalData/Machine/MachinesDBTable.java create mode 100644 src/GlobalData/Machine/UI/MachineFields.form create mode 100644 src/GlobalData/Machine/UI/MachineFields.java create mode 100644 src/GlobalData/Makefile/Makefile.java create mode 100644 src/GlobalData/Makefile/MakefilesDBTable.java create mode 100644 src/GlobalData/Makefile/UI/MakefilePreviewForm.java create mode 100644 src/GlobalData/Module/Module.java create mode 100644 src/GlobalData/Module/ModuleAnchestor.java create mode 100644 src/GlobalData/Module/ModulesDBTable.java create mode 100644 src/GlobalData/Module/UI/ModuleAnchestorFields.form create mode 100644 src/GlobalData/Module/UI/ModuleAnchestorFields.java create mode 100644 src/GlobalData/Module/UI/ModuleAnchestorForm.java create mode 100644 src/GlobalData/RemoteFile/RemoteFile.java create mode 100644 src/GlobalData/RemoteFile/UI/RemoteFileChooser.java create mode 100644 src/GlobalData/RemoteFile/UI/RemoteFileChooserFields.form create mode 100644 src/GlobalData/RemoteFile/UI/RemoteFileChooserFields.java create mode 100644 src/GlobalData/RemoteFile/UI/RemoteFileRenderer.java create mode 100644 src/GlobalData/RemoteFile/UI/RemoteFilesTree.java create mode 100644 src/GlobalData/RemoteSapfor/RemoteSapfor.java create mode 100644 src/GlobalData/RemoteSapfor/RemoteSapforsDBTable.java create mode 100644 src/GlobalData/RemoteSapfor/UI/RemoteSapforFields.form create mode 100644 src/GlobalData/RemoteSapfor/UI/RemoteSapforFields.java create mode 100644 src/GlobalData/RunConfiguration/RunConfiguration.java create mode 100644 src/GlobalData/RunConfiguration/RunConfigurationsDBTable.java create mode 100644 src/GlobalData/RunConfiguration/UI/MatrixBar.java create mode 100644 src/GlobalData/RunConfiguration/UI/MatrixDimensionSpinner.java create mode 100644 src/GlobalData/RunConfiguration/UI/RunConfigurationFields.form create mode 100644 src/GlobalData/RunConfiguration/UI/RunConfigurationFields.java create mode 100644 src/GlobalData/SVN/SVN.java create mode 100644 src/GlobalData/SapforProfile/SapforProfile.java create mode 100644 src/GlobalData/SapforProfile/SapforProfilesDBTable.java create mode 100644 src/GlobalData/SapforProfile/UI/SapforProfileFields.form create mode 100644 src/GlobalData/SapforProfile/UI/SapforProfileFields.java create mode 100644 src/GlobalData/SapforProfileSetting/SapforProfileSetting.java create mode 100644 src/GlobalData/SapforProfileSetting/SapforProfileSettingsDBTable.java create mode 100644 src/GlobalData/Settings/DBSetting.java create mode 100644 src/GlobalData/Settings/SettingName.java create mode 100644 src/GlobalData/Settings/SettingType.java create mode 100644 src/GlobalData/Settings/SettingsDBTable.java create mode 100644 src/GlobalData/Splitter/Splitter.java create mode 100644 src/GlobalData/Splitter/SplittersDBTable.java create mode 100644 src/GlobalData/Tasks/CompilationTask/CompilationTask.java create mode 100644 src/GlobalData/Tasks/CompilationTask/CompilationTasksDBTable.java create mode 100644 src/GlobalData/Tasks/Passes/TaskLocalPass.java create mode 100644 src/GlobalData/Tasks/QueueSystem/MVS.java create mode 100644 src/GlobalData/Tasks/QueueSystem/QueueCommand.java create mode 100644 src/GlobalData/Tasks/QueueSystem/QueueSystem.java create mode 100644 src/GlobalData/Tasks/RunTask/RunTask.java create mode 100644 src/GlobalData/Tasks/RunTask/RunTasksDBTable.java create mode 100644 src/GlobalData/Tasks/Supervisor/Local/Linux/LinuxLocalCompilationSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Local/Linux/LinuxLocalRunSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Local/Linux/LinuxLocalTaskSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Local/LocalTaskSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Local/Windows/WindowsLocalCompilationSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Local/Windows/WindowsLocalRunSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Local/Windows/WindowsLocalTaskSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Remote/MVSRunSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Remote/RemoteCompilationSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Remote/RemoteTaskSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/Remote/ServerRunSupervisor.java create mode 100644 src/GlobalData/Tasks/Supervisor/TaskSupervisor.java create mode 100644 src/GlobalData/Tasks/Task.java create mode 100644 src/GlobalData/Tasks/TaskState.java create mode 100644 src/GlobalData/User/UI/UserFields.form create mode 100644 src/GlobalData/User/UI/UserFields.java create mode 100644 src/GlobalData/User/User.java create mode 100644 src/GlobalData/User/UserAuthentication.java create mode 100644 src/GlobalData/User/UserState.java create mode 100644 src/GlobalData/User/UsersDBTable.java create mode 100644 src/META-INF/MANIFEST.MF create mode 100644 src/Program.java create mode 100644 src/ProjectData/DBArray/ArraysDBTable.java create mode 100644 src/ProjectData/DBArray/DBArray.java create mode 100644 src/ProjectData/Files/DBProjectFile.java create mode 100644 src/ProjectData/Files/FileState.java create mode 100644 src/ProjectData/Files/FileType.java create mode 100644 src/ProjectData/Files/FilesDBTable.java create mode 100644 src/ProjectData/Files/LanguageStyle.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/BaseDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/CheckPointTypeDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/DirectiveName.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/IntervalDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/RedListDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/RegionDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/Spec1Directive.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/Spec2Directive.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/Spec3Directive.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/Spec4Directive.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/SpecDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/StartDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Directives/TypeDirective.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/BaseProvider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/CheckPointTypeProvider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/IntervalProvider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/PrefixWordProvider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/ReductionProvider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/Spec1Provider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/Spec2Provider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/Spec3Provider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/Spec4Provider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/StartProvider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/Providers/TypeProvider.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/SapforAutoComplete.java create mode 100644 src/ProjectData/Files/UI/Editor/AutoComplete/SAPFOR/SearchState.java create mode 100644 src/ProjectData/Files/UI/Editor/SPFEditor.java create mode 100644 src/ProjectData/Files/UI/FileGraphTree.java create mode 100644 src/ProjectData/Files/UI/FilesHyperlinksPanel.java create mode 100644 src/ProjectData/Files/UI/FilesTree.java create mode 100644 src/ProjectData/Files/UI/FilesTreeCellRenderer.java create mode 100644 src/ProjectData/Files/UI/FortranFolder.java create mode 100644 src/ProjectData/GCOV/GCOV_info.java create mode 100644 src/ProjectData/LanguageName.java create mode 100644 src/ProjectData/Messages/Errors/ErrorsDBTable.java create mode 100644 src/ProjectData/Messages/Errors/MessageError.java create mode 100644 src/ProjectData/Messages/Message.java create mode 100644 src/ProjectData/Messages/MessagesDBTable.java create mode 100644 src/ProjectData/Messages/Notes/MessageNote.java create mode 100644 src/ProjectData/Messages/Notes/NotesDBTable.java create mode 100644 src/ProjectData/Messages/Recommendations/MessageRecommendation.java create mode 100644 src/ProjectData/Messages/Recommendations/RecommendationType.java create mode 100644 src/ProjectData/Messages/Recommendations/RecommendationsDBTable.java create mode 100644 src/ProjectData/Messages/Warnings/MessageWarning.java create mode 100644 src/ProjectData/Messages/Warnings/WarningsDBTable.java create mode 100644 src/ProjectData/PredictorStatistic/PredictorStatisticsDBTable.java create mode 100644 src/ProjectData/PredictorStatistic/PredictorStatistics_2021.java create mode 100644 src/ProjectData/Project/ChangeSettingPass.java create mode 100644 src/ProjectData/Project/ProjectInfoDBTable.java create mode 100644 src/ProjectData/Project/UI/PackageVersionsTree.java create mode 100644 src/ProjectData/Project/UI/PackageVersionsTreeCellRenderer.java create mode 100644 src/ProjectData/Project/UI/VersionsTree.java create mode 100644 src/ProjectData/Project/UI/VersionsTreeCellRenderer.java create mode 100644 src/ProjectData/Project/db_project_info.java create mode 100644 src/ProjectData/ProjectDatabase.java create mode 100644 src/ProjectData/ProjectView.java create mode 100644 src/ProjectData/SapforData/Arrays/ArrayDecl.java create mode 100644 src/ProjectData/SapforData/Arrays/ArrayLocation.java create mode 100644 src/ProjectData/SapforData/Arrays/ArrayState.java create mode 100644 src/ProjectData/SapforData/Arrays/ArraysSet.java create mode 100644 src/ProjectData/SapforData/Arrays/Distribution/AlignRule.java create mode 100644 src/ProjectData/SapforData/Arrays/Distribution/DataDirective.java create mode 100644 src/ProjectData/SapforData/Arrays/Distribution/Dimension.java create mode 100644 src/ProjectData/SapforData/Arrays/Distribution/Directive.java create mode 100644 src/ProjectData/SapforData/Arrays/ProjectArray.java create mode 100644 src/ProjectData/SapforData/Arrays/Templates/TemplateDimension.java create mode 100644 src/ProjectData/SapforData/Arrays/Templates/TemplateDimensionState.java create mode 100644 src/ProjectData/SapforData/Arrays/Templates/TemplateLink.java create mode 100644 src/ProjectData/SapforData/Arrays/UI/DimensionRenderer.java create mode 100644 src/ProjectData/SapforData/Arrays/UI/DimensionStateChanger.java create mode 100644 src/ProjectData/SapforData/Arrays/UI/DimensionsTableForm.java create mode 100644 src/ProjectData/SapforData/Arrays/UI/DistributionMenu.java create mode 100644 src/ProjectData/SapforData/Arrays/UI/FileArraysTree.java create mode 100644 src/ProjectData/SapforData/Arrays/UI/RulesTree.java create mode 100644 src/ProjectData/SapforData/Arrays/UI/RulesTreeCellRenderer.java create mode 100644 src/ProjectData/SapforData/FileObject.java create mode 100644 src/ProjectData/SapforData/FileObjectWithMessages.java create mode 100644 src/ProjectData/SapforData/Functions/FuncCall.java create mode 100644 src/ProjectData/SapforData/Functions/FuncCallH.java create mode 100644 src/ProjectData/SapforData/Functions/FuncCallState.java create mode 100644 src/ProjectData/SapforData/Functions/FuncCoordinates.java create mode 100644 src/ProjectData/SapforData/Functions/FuncCoordinatesDBTable.java create mode 100644 src/ProjectData/SapforData/Functions/FuncInfo.java create mode 100644 src/ProjectData/SapforData/Functions/FuncParam.java create mode 100644 src/ProjectData/SapforData/Functions/FunctionType.java create mode 100644 src/ProjectData/SapforData/Functions/UI/FileFunctionsTree.java create mode 100644 src/ProjectData/SapforData/Functions/UI/Graph/FunctionsGraphForm.java create mode 100644 src/ProjectData/SapforData/Functions/UI/Graph/FunctionsGraphMenu.java create mode 100644 src/ProjectData/SapforData/Functions/UI/Graph/FunctionsGraphUI.java create mode 100644 src/ProjectData/SapforData/Functions/UI/Graph/FunctionsGraphUIGreed.java create mode 100644 src/ProjectData/SapforData/Functions/UI/Graph/GraphInfo.java create mode 100644 src/ProjectData/SapforData/Functions/UI/InlineMenu.java create mode 100644 src/ProjectData/SapforData/Functions/UI/InlineMenu2.java create mode 100644 src/ProjectData/SapforData/Functions/UI/InlineTree.java create mode 100644 src/ProjectData/SapforData/Functions/UI/InlineTree2.java create mode 100644 src/ProjectData/SapforData/Includes/DependencyInfo.java create mode 100644 src/ProjectData/SapforData/Includes/FileInfo.java create mode 100644 src/ProjectData/SapforData/Includes/UI/IncludesMenu.java create mode 100644 src/ProjectData/SapforData/Includes/UI/IncludesTree.java create mode 100644 src/ProjectData/SapforData/Loops/EGoto.java create mode 100644 src/ProjectData/SapforData/Loops/IGoto.java create mode 100644 src/ProjectData/SapforData/Loops/IO.java create mode 100644 src/ProjectData/SapforData/Loops/Loop.java create mode 100644 src/ProjectData/SapforData/Loops/LoopState.java create mode 100644 src/ProjectData/SapforData/Loops/NonRectIter.java create mode 100644 src/ProjectData/SapforData/Loops/Stop.java create mode 100644 src/ProjectData/SapforData/Loops/UI/FileLoopsTree.java create mode 100644 src/ProjectData/SapforData/Regions/ParallelRegion.java create mode 100644 src/ProjectData/SapforData/Regions/RegionsSet.java create mode 100644 src/ProjectData/SapforData/Regions/UI/ArrayAlignmentBar.java create mode 100644 src/ProjectData/SapforData/Regions/UI/DimensionSpinner.java create mode 100644 src/ProjectData/SapforData/Regions/UI/ParallelRegionFields.form create mode 100644 src/ProjectData/SapforData/Regions/UI/ParallelRegionFields.java create mode 100644 src/ProjectData/SapforData/Variants/ParallelVariant.java create mode 100644 src/ProjectData/SapforData/Variants/UI/VariantRankRenderer.java create mode 100644 src/ProjectData/SapforData/Variants/VariantsSet.java create mode 100644 src/Repository/BugReport/BugReport.java create mode 100644 src/Repository/BugReport/BugReportInterface.java create mode 100644 src/Repository/BugReport/BugReportState.java create mode 100644 src/Repository/BugReport/BugReportsDBTable.java create mode 100644 src/Repository/BugReportsDatabase.java create mode 100644 src/Repository/Component/Component.java create mode 100644 src/Repository/Component/ComponentState.java create mode 100644 src/Repository/Component/ComponentType.java create mode 100644 src/Repository/Component/ComponentsSet.java create mode 100644 src/Repository/Component/Instruction.java create mode 100644 src/Repository/Component/OSDComponent.java create mode 100644 src/Repository/Component/PerformanceAnalyzer/PerformanceAnalyzer.java create mode 100644 src/Repository/Component/Sapfor/MessagesServer.java create mode 100644 src/Repository/Component/Sapfor/Sapfor.java create mode 100644 src/Repository/Component/Sapfor/Sapfor_F.java create mode 100644 src/Repository/Component/Sapfor/TransformationPermission.java create mode 100644 src/Repository/Component/UI/ComponentsFields.form create mode 100644 src/Repository/Component/UI/ComponentsFields.java create mode 100644 src/Repository/Component/UI/ComponentsForm.java create mode 100644 src/Repository/Component/UI/PickUpComponentFields.form create mode 100644 src/Repository/Component/UI/PickUpComponentFields.java create mode 100644 src/Repository/Component/UI/PublishFields.form create mode 100644 src/Repository/Component/UI/PublishFields.java create mode 100644 src/Repository/Component/UI/PublishForm.java create mode 100644 src/Repository/Component/Visualiser.java create mode 100644 src/Repository/Component/Visualizer_2.java create mode 100644 src/Repository/EmailMessage.java create mode 100644 src/Repository/RepositoryRefuseException.java create mode 100644 src/Repository/RepositoryServer.java create mode 100644 src/Repository/Server/ComponentsServer.java create mode 100644 src/Repository/Server/DiagnosticSignalHandler.java create mode 100644 src/Repository/Server/ServerCode.java create mode 100644 src/Repository/Server/ServerExchangeUnit_2021.java create mode 100644 src/Repository/SubscriberRights/SubscriberRights.java create mode 100644 src/Repository/SubscriberWorkspace/SubscriberWorkspace.java create mode 100644 src/Repository/SubscriberWorkspace/SubscriberWorkspaceDBTable.java create mode 100644 src/Repository/Subscribes/Subscriber.java create mode 100644 src/Repository/Subscribes/SubsribersDBTable.java create mode 100644 src/Repository/Subscribes/UI/SubscriberFields.form create mode 100644 src/Repository/Subscribes/UI/SubscriberFields.java create mode 100644 src/Repository/Subscribes/UI/SubscriberForm.java create mode 100644 src/TestingSystem/Configuration/Configuration.java create mode 100644 src/TestingSystem/Configuration/ConfigurationInterface.java create mode 100644 src/TestingSystem/Configuration/UI/ConfigurationDBTable.java create mode 100644 src/TestingSystem/Configuration/UI/ConfigurationFields.form create mode 100644 src/TestingSystem/Configuration/UI/ConfigurationFields.java create mode 100644 src/TestingSystem/Group/Group.java create mode 100644 src/TestingSystem/Group/GroupInterface.java create mode 100644 src/TestingSystem/Group/GroupsDBTable.java create mode 100644 src/TestingSystem/Group/UI/GroupFields.form create mode 100644 src/TestingSystem/Group/UI/GroupFields.java create mode 100644 src/TestingSystem/MachineKernels/MachineKernels.java create mode 100644 src/TestingSystem/MachineMaxKernels/MachineMaxKernels.java create mode 100644 src/TestingSystem/MachineMaxKernels/MachineMaxKernelsDBTable.java create mode 100644 src/TestingSystem/Sapfor/SapforConfiguration/SapforConfiguration.java create mode 100644 src/TestingSystem/Sapfor/SapforConfiguration/SapforConfigurationDBTable.java create mode 100644 src/TestingSystem/Sapfor/SapforConfiguration/SapforConfigurationInterface.java create mode 100644 src/TestingSystem/Sapfor/SapforConfiguration/UI/SapforConfigurationFields.form create mode 100644 src/TestingSystem/Sapfor/SapforConfiguration/UI/SapforConfigurationFields.java create mode 100644 src/TestingSystem/Sapfor/SapforConfigurationCommand/SapforConfigurationCommand.java create mode 100644 src/TestingSystem/Sapfor/SapforConfigurationCommand/SapforConfigurationCommandInterface.java create mode 100644 src/TestingSystem/Sapfor/SapforConfigurationCommand/SapforConfigurationCommandsDBTable.java create mode 100644 src/TestingSystem/Sapfor/SapforConfigurationCommand/UI/SapforConfigurationCommandFields.form create mode 100644 src/TestingSystem/Sapfor/SapforConfigurationCommand/UI/SapforConfigurationCommandFields.java create mode 100644 src/TestingSystem/Sapfor/SapforTask/MatchState.java create mode 100644 src/TestingSystem/Sapfor/SapforTask/SapforTaskResult.java create mode 100644 src/TestingSystem/Sapfor/SapforTask/SapforTask_2023.java create mode 100644 src/TestingSystem/Sapfor/SapforTask/SapforTasksDBTable.java create mode 100644 src/TestingSystem/Sapfor/SapforTasksPackage/SapforTasksPackage_2023.java create mode 100644 src/TestingSystem/Sapfor/SapforTasksPackage/SapforTasksPackagesDBTable.java create mode 100644 src/TestingSystem/Sapfor/SapforVersion_json.java create mode 100644 src/TestingSystem/Sapfor/ScenarioResults_json.java create mode 100644 src/TestingSystem/Sapfor/Scenario_json.java create mode 100644 src/TestingSystem/TSetting/TSetting.java create mode 100644 src/TestingSystem/TSetting/TSettingsDBTable.java create mode 100644 src/TestingSystem/TaskKey/TaskKey_2022.java create mode 100644 src/TestingSystem/TaskKey/TaskKeysDBTable.java create mode 100644 src/TestingSystem/Tasks/TestCompilationTask.java create mode 100644 src/TestingSystem/Tasks/TestCompilationTasksDBTable.java create mode 100644 src/TestingSystem/Tasks/TestRunTask.java create mode 100644 src/TestingSystem/Tasks/TestRunTaskInterface.java create mode 100644 src/TestingSystem/Tasks/TestRunTasksDBTable.java create mode 100644 src/TestingSystem/Tasks/TestTask.java create mode 100644 src/TestingSystem/TasksDatabase.java create mode 100644 src/TestingSystem/TasksPackage/TasksPackage.java create mode 100644 src/TestingSystem/TasksPackage/TasksPackageDBTable.java create mode 100644 src/TestingSystem/TasksPackage/TasksPackageState.java create mode 100644 src/TestingSystem/TasksPackageToKill/TasksPackageToKill.java create mode 100644 src/TestingSystem/TasksPackageToKill/TasksPackageToKillDBTable.java create mode 100644 src/TestingSystem/Test/ProjectFiles_json.java create mode 100644 src/TestingSystem/Test/Test.java create mode 100644 src/TestingSystem/Test/TestDBTable.java create mode 100644 src/TestingSystem/Test/TestInterface.java create mode 100644 src/TestingSystem/Test/TestType.java create mode 100644 src/TestingSystem/Test/UI/TestFields.form create mode 100644 src/TestingSystem/Test/UI/TestFields.java create mode 100644 src/TestingSystem/TestingPlanner.java create mode 100644 src/TestingSystem/TestingServer.java create mode 100644 src/TestingSystem/TestsDatabase.java create mode 100644 src/TestingSystem/TestsSupervisor_2022/TestsSupervisor_2022.java create mode 100644 src/TestingSystem/UserConnection.java create mode 100644 src/Visual_DVM_2021/PassStats/PassStats.java create mode 100644 src/Visual_DVM_2021/PassStats/PassStatsDBTable.java create mode 100644 src/Visual_DVM_2021/Passes/AddObjectPass.java create mode 100644 src/Visual_DVM_2021/Passes/All/AbortSelectedPackages.java create mode 100644 src/Visual_DVM_2021/Passes/All/ActualizePackages.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddBugReport.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddCompiler.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddDVMParameter.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddDVMParameterForTesting.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddEnvironmentValue.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddMachine.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddMakefile.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddRunConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddSapfor.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddSubscriber.java create mode 100644 src/Visual_DVM_2021/Passes/All/AddUser.java create mode 100644 src/Visual_DVM_2021/Passes/All/AnalyseSapforPackageResults.java create mode 100644 src/Visual_DVM_2021/Passes/All/AppendBugReportComment.java create mode 100644 src/Visual_DVM_2021/Passes/All/AppendBugReportDescription.java create mode 100644 src/Visual_DVM_2021/Passes/All/AppendBugReportField.java create mode 100644 src/Visual_DVM_2021/Passes/All/ApplyBugReportSettings.java create mode 100644 src/Visual_DVM_2021/Passes/All/ApplyCurrentFunction.java create mode 100644 src/Visual_DVM_2021/Passes/All/ApplyProfile.java create mode 100644 src/Visual_DVM_2021/Passes/All/ArchivesBackupPass.java create mode 100644 src/Visual_DVM_2021/Passes/All/BuildComponent.java create mode 100644 src/Visual_DVM_2021/Passes/All/CheckAccount.java create mode 100644 src/Visual_DVM_2021/Passes/All/CheckRegistrationOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/CheckRemoteWorkspace.java create mode 100644 src/Visual_DVM_2021/Passes/All/CleanAnalyses.java create mode 100644 src/Visual_DVM_2021/Passes/All/CloseBugReport.java create mode 100644 src/Visual_DVM_2021/Passes/All/CloseCurrentFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/CloseCurrentProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/CloseProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/CombineFiles.java create mode 100644 src/Visual_DVM_2021/Passes/All/CompareSapforPackages.java create mode 100644 src/Visual_DVM_2021/Passes/All/Compile.java create mode 100644 src/Visual_DVM_2021/Passes/All/ConvertCorrectnessTests.java create mode 100644 src/Visual_DVM_2021/Passes/All/CopyConfigurations.java create mode 100644 src/Visual_DVM_2021/Passes/All/CopyGroups.java create mode 100644 src/Visual_DVM_2021/Passes/All/CopyProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/CopyServerObjects.java create mode 100644 src/Visual_DVM_2021/Passes/All/CreateComponentBackUp.java create mode 100644 src/Visual_DVM_2021/Passes/All/CreateEmptyDirectory.java create mode 100644 src/Visual_DVM_2021/Passes/All/CreateEmptyProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/CreateParallelVariants.java create mode 100644 src/Visual_DVM_2021/Passes/All/CreateParallelVariantsCoverageForScenario.java create mode 100644 src/Visual_DVM_2021/Passes/All/CreateTestsGroupFromSelectedVersions.java create mode 100644 src/Visual_DVM_2021/Passes/All/DVMConvertProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteBugReport.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteBugReportFromServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteCompiler.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteDVMParameter.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteDebugResults.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteDirectory.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteDownloadedBugReports.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteEnvironmentValue.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteLonelyM.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteMachine.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteMakefile.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteProfile.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteRunConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSapfor.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSapforConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSapforConfigurationCommand.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSapforTasksPackage.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedCompilationTasks.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedConfigurations.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedFiles.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedGroups.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedRunTasks.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedTests.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedTestsRunTasks.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSelectedVersions.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSubscriber.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSubscriberOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteSubversions.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteUser.java create mode 100644 src/Visual_DVM_2021/Passes/All/DeleteVersion.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadAllBugReportsArchives.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadBugReport.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadComponent.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadGroup.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadRepository.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadTaskTest.java create mode 100644 src/Visual_DVM_2021/Passes/All/DownloadTest.java create mode 100644 src/Visual_DVM_2021/Passes/All/DropAnalyses.java create mode 100644 src/Visual_DVM_2021/Passes/All/DropFastAccess.java create mode 100644 src/Visual_DVM_2021/Passes/All/DropLastProjects.java create mode 100644 src/Visual_DVM_2021/Passes/All/DropSavedArrays.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditAccount.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditCompiler.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditConfigurationOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditDVMParameter.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditEnvironmentValue.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditGroup.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditGroupOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditMachine.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditMachineKernels.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditMakefile.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditModule.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditProfile.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditProjectCompilationMaxtime.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditProjectRunMaxtime.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditRunConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditSapfor.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditSapforConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditSapforConfigurationCommand.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditSapforConfigurationCommandOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditSapforConfigurationOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditSubscriber.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditSubscriberOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditTest.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditTestOnServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/EditUser.java create mode 100644 src/Visual_DVM_2021/Passes/All/Email.java create mode 100644 src/Visual_DVM_2021/Passes/All/EraseBadSymbols.java create mode 100644 src/Visual_DVM_2021/Passes/All/ExcludeFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/ExcludeSelectedFiles.java create mode 100644 src/Visual_DVM_2021/Passes/All/ExtractRecipients.java create mode 100644 src/Visual_DVM_2021/Passes/All/FinishApplication.java create mode 100644 src/Visual_DVM_2021/Passes/All/GCOV.java create mode 100644 src/Visual_DVM_2021/Passes/All/GenerateParallelVariants.java create mode 100644 src/Visual_DVM_2021/Passes/All/GetComponentsActualVersions.java create mode 100644 src/Visual_DVM_2021/Passes/All/GetComponentsBackupsFromServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/GetTestsQueueSize.java create mode 100644 src/Visual_DVM_2021/Passes/All/ImportFiles.java create mode 100644 src/Visual_DVM_2021/Passes/All/IncludeFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/IncludeSelectedFiles.java create mode 100644 src/Visual_DVM_2021/Passes/All/InitialiseUser.java create mode 100644 src/Visual_DVM_2021/Passes/All/InstallComponentFromFolder.java create mode 100644 src/Visual_DVM_2021/Passes/All/InstallRemoteSapfor.java create mode 100644 src/Visual_DVM_2021/Passes/All/LinuxLocalCompilation.java create mode 100644 src/Visual_DVM_2021/Passes/All/LinuxLocalRun.java create mode 100644 src/Visual_DVM_2021/Passes/All/LocalInitaliseUser.java create mode 100644 src/Visual_DVM_2021/Passes/All/LocalSingleCommand.java create mode 100644 src/Visual_DVM_2021/Passes/All/MVSRun.java create mode 100644 src/Visual_DVM_2021/Passes/All/MakeScreenShot.java create mode 100644 src/Visual_DVM_2021/Passes/All/MassSelectArrays.java create mode 100644 src/Visual_DVM_2021/Passes/All/OpenBugReport.java create mode 100644 src/Visual_DVM_2021/Passes/All/OpenBugReportTestProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/OpenCurrentFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/OpenCurrentProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/OpenProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/OpenSapforTest.java create mode 100644 src/Visual_DVM_2021/Passes/All/PauseTesting.java create mode 100644 src/Visual_DVM_2021/Passes/All/PerformSapforTasksPackage.java create mode 100644 src/Visual_DVM_2021/Passes/All/PerformScenario.java create mode 100644 src/Visual_DVM_2021/Passes/All/PickCompilerEnvironments.java create mode 100644 src/Visual_DVM_2021/Passes/All/PickCompilerEnvironmentsForTesting.java create mode 100644 src/Visual_DVM_2021/Passes/All/PickCompilerOptions.java create mode 100644 src/Visual_DVM_2021/Passes/All/PlayTesting.java create mode 100644 src/Visual_DVM_2021/Passes/All/Precompilation.java create mode 100644 src/Visual_DVM_2021/Passes/All/PredictParallelVariants.java create mode 100644 src/Visual_DVM_2021/Passes/All/PrepareForModulesAssembly.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishBugReport.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishComponent.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishGroup.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishRemoteWorkspace.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishSapforConfiguration.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishSapforConfigurationCommand.java create mode 100644 src/Visual_DVM_2021/Passes/All/PublishTest.java create mode 100644 src/Visual_DVM_2021/Passes/All/RefreshDVMTests.java create mode 100644 src/Visual_DVM_2021/Passes/All/RemoteCompilation.java create mode 100644 src/Visual_DVM_2021/Passes/All/RemoteInitialiseUser.java create mode 100644 src/Visual_DVM_2021/Passes/All/RemoteSingleCommand.java create mode 100644 src/Visual_DVM_2021/Passes/All/RenameDirectory.java create mode 100644 src/Visual_DVM_2021/Passes/All/RenameFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/ResetCurrentProject.java create mode 100644 src/Visual_DVM_2021/Passes/All/RestoreSavedArrays.java create mode 100644 src/Visual_DVM_2021/Passes/All/ResurrectComponent.java create mode 100644 src/Visual_DVM_2021/Passes/All/ResurrectComponentFromServer.java create mode 100644 src/Visual_DVM_2021/Passes/All/Run.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_ChangeSpfIntervals.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_ConvertStructures.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_CorrectCodeStylePass.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_CreateCheckpoints.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_CreateIntervalsTree.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_CreateParallelVariant.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_DuplicateFunctionChains.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_ExpressionSubstitution.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetAllDeclaratedArrays.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetArrayDistribution.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetArrayDistributionOnlyAnalysis.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetArrayDistributionOnlyRegions.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetArrayLinks.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetFileLineInfo.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetGCovInfo.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetGraphFunctionPositions.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetGraphFunctions.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetGraphLoops.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetIncludeDependencies.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_GetMaxMinBlockDistribution.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_InitDeclsWithZero.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_InlineProcedure.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_InlineProcedures.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_InlineProceduresH.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_InsertDvmhRegions.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_InsertIncludesPass.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_LoopEndDoConverterPass.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_LoopFission.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_LoopUnion.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_LoopUnionCurrent.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_LoopUnrolling.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_ModifyArrayDistribution.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_ParseFilesWithOrder.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_PredictParallelVariant.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_PrivateExpansion.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_PrivateRemoving.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_PrivateShrinking.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_RemoveDvmDirectives.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_RemoveDvmDirectivesToComments.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_RemoveDvmIntervals.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_RemoveUnusedFunctions.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_ResolveCommonBlockConflicts.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_ResolveParallelRegionConflicts.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_SharedMemoryParallelization.java create mode 100644 src/Visual_DVM_2021/Passes/All/SPF_StatisticAnalyzer.java create mode 100644 src/Visual_DVM_2021/Passes/All/Save.java create mode 100644 src/Visual_DVM_2021/Passes/All/SaveBugReportComment.java create mode 100644 src/Visual_DVM_2021/Passes/All/SaveBugReportDescription.java create mode 100644 src/Visual_DVM_2021/Passes/All/SaveBugReportExecutor.java create mode 100644 src/Visual_DVM_2021/Passes/All/SaveBugReportRecipients.java create mode 100644 src/Visual_DVM_2021/Passes/All/SaveFunctionsGraphCoordinates.java create mode 100644 src/Visual_DVM_2021/Passes/All/SaveGraph.java create mode 100644 src/Visual_DVM_2021/Passes/All/SaveProfile.java create mode 100644 src/Visual_DVM_2021/Passes/All/SelectRemoteFile.java create mode 100644 src/Visual_DVM_2021/Passes/All/SendBugReport.java create mode 100644 src/Visual_DVM_2021/Passes/All/ServerRun.java create mode 100644 src/Visual_DVM_2021/Passes/All/SetSelectedFilesLanguage.java create mode 100644 src/Visual_DVM_2021/Passes/All/SetSelectedFilesStyle.java create mode 100644 src/Visual_DVM_2021/Passes/All/SetSelectedFilesType.java create mode 100644 src/Visual_DVM_2021/Passes/All/ShowCompilerHelp.java create mode 100644 src/Visual_DVM_2021/Passes/All/ShowCompilerVersion.java create mode 100644 src/Visual_DVM_2021/Passes/All/ShowComponentChangesLog.java create mode 100644 src/Visual_DVM_2021/Passes/All/ShowInstruction.java create mode 100644 src/Visual_DVM_2021/Passes/All/ShowMakefilePreview.java create mode 100644 src/Visual_DVM_2021/Passes/All/ShowVersionsFiles.java create mode 100644 src/Visual_DVM_2021/Passes/All/StartSapforTests.java create mode 100644 src/Visual_DVM_2021/Passes/All/StartTests.java create mode 100644 src/Visual_DVM_2021/Passes/All/SwitchTestingEmail.java create mode 100644 src/Visual_DVM_2021/Passes/All/SynchronizeBugReports.java create mode 100644 src/Visual_DVM_2021/Passes/All/SynchronizeTests.java create mode 100644 src/Visual_DVM_2021/Passes/All/SynchronizeTestsTasks.java create mode 100644 src/Visual_DVM_2021/Passes/All/TestPass.java create mode 100644 src/Visual_DVM_2021/Passes/All/UnzipFolderPass.java create mode 100644 src/Visual_DVM_2021/Passes/All/UpdateBugReportField.java create mode 100644 src/Visual_DVM_2021/Passes/All/UpdateBugReportProgress.java create mode 100644 src/Visual_DVM_2021/Passes/All/UpdateComponent.java create mode 100644 src/Visual_DVM_2021/Passes/All/UpdateSelectedComponents.java create mode 100644 src/Visual_DVM_2021/Passes/All/UpdateSetting.java create mode 100644 src/Visual_DVM_2021/Passes/All/WindowsLocalCompilation.java create mode 100644 src/Visual_DVM_2021/Passes/All/WindowsLocalRun.java create mode 100644 src/Visual_DVM_2021/Passes/All/ZipFolderPass.java create mode 100644 src/Visual_DVM_2021/Passes/ChangeFilePass.java create mode 100644 src/Visual_DVM_2021/Passes/ComponentsRepositoryPass.java create mode 100644 src/Visual_DVM_2021/Passes/CurrentComponentPass.java create mode 100644 src/Visual_DVM_2021/Passes/CurrentProjectPass.java create mode 100644 src/Visual_DVM_2021/Passes/DeleteObjectPass.java create mode 100644 src/Visual_DVM_2021/Passes/DeleteSelectedServerObjects.java create mode 100644 src/Visual_DVM_2021/Passes/EditObjectPass.java create mode 100644 src/Visual_DVM_2021/Passes/FilesMassPass.java create mode 100644 src/Visual_DVM_2021/Passes/OLD/AttachFileToProject.java create mode 100644 src/Visual_DVM_2021/Passes/OLD/DeleteAttachments.java create mode 100644 src/Visual_DVM_2021/Passes/ObjectPass.java create mode 100644 src/Visual_DVM_2021/Passes/PassCode_2021.java create mode 100644 src/Visual_DVM_2021/Passes/PassException.java create mode 100644 src/Visual_DVM_2021/Passes/PassState.java create mode 100644 src/Visual_DVM_2021/Passes/Pass_2021.java create mode 100644 src/Visual_DVM_2021/Passes/ProcessPass.java create mode 100644 src/Visual_DVM_2021/Passes/ProjectPass.java create mode 100644 src/Visual_DVM_2021/Passes/RepositoryPass.java create mode 100644 src/Visual_DVM_2021/Passes/SSH/ConnectionPass.java create mode 100644 src/Visual_DVM_2021/Passes/SSH/CurrentConnectionPass.java create mode 100644 src/Visual_DVM_2021/Passes/SSH/TaskConnectionPass.java create mode 100644 src/Visual_DVM_2021/Passes/SSH/WorkspaceNotFoundException.java create mode 100644 src/Visual_DVM_2021/Passes/SapforAnalysis.java create mode 100644 src/Visual_DVM_2021/Passes/SapforFilesModification.java create mode 100644 src/Visual_DVM_2021/Passes/SapforModification.java create mode 100644 src/Visual_DVM_2021/Passes/SapforPass.java create mode 100644 src/Visual_DVM_2021/Passes/SapforTransformation.java create mode 100644 src/Visual_DVM_2021/Passes/SilentSapforPass.java create mode 100644 src/Visual_DVM_2021/Passes/SortPassesByStats.java create mode 100644 src/Visual_DVM_2021/Passes/TestingSystemPass.java create mode 100644 src/Visual_DVM_2021/Passes/Transformation.java create mode 100644 src/Visual_DVM_2021/Passes/UI/CopyProjectFields.form create mode 100644 src/Visual_DVM_2021/Passes/UI/CopyProjectFields.java create mode 100644 src/Visual_DVM_2021/Passes/UI/PassFields.form create mode 100644 src/Visual_DVM_2021/Passes/UI/PassFields.java create mode 100644 src/Visual_DVM_2021/Passes/UI/PassForm.java create mode 100644 src/Visual_DVM_2021/Passes/VariantsMassPass.java create mode 100644 src/Visual_DVM_2021/UI/Interface/AnalysisWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/ArraysWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/CallbackWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/CommentInterface.java create mode 100644 src/Visual_DVM_2021/UI/Interface/DescriptionInterface.java create mode 100644 src/Visual_DVM_2021/UI/Interface/FileWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/FilterWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/FormWithSplitters.java create mode 100644 src/Visual_DVM_2021/UI/Interface/FunctionsWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/Loggable.java create mode 100644 src/Visual_DVM_2021/UI/Interface/ProjectWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/SPFEditorInterface.java create mode 100644 src/Visual_DVM_2021/UI/Interface/ScenariosWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/StatisticsWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/TestingWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/VariantsWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/VersionsWindow.java create mode 100644 src/Visual_DVM_2021/UI/Interface/VisualizerForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/AnalysisForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/AnalysisForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/ArraysForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/ArraysForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/CallbackForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/CallbackForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/CallbackWelcomeForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/CallbackWelcomeForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/CombineFilesDialog.java create mode 100644 src/Visual_DVM_2021/UI/Main/CommentFields.form create mode 100644 src/Visual_DVM_2021/UI/Main/CommentFields.java create mode 100644 src/Visual_DVM_2021/UI/Main/CommentTabs.form create mode 100644 src/Visual_DVM_2021/UI/Main/CommentTabs.java create mode 100644 src/Visual_DVM_2021/UI/Main/ComparisonForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/ComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/CompilationTasksComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/DescriptionFields.form create mode 100644 src/Visual_DVM_2021/UI/Main/DescriptionFields.java create mode 100644 src/Visual_DVM_2021/UI/Main/DescriptionTabs.form create mode 100644 src/Visual_DVM_2021/UI/Main/DescriptionTabs.java create mode 100644 src/Visual_DVM_2021/UI/Main/FileForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/FileForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/FunctionsForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/FunctionsForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/MainForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/MainForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/PackageVersionsComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/ProfilesFields.form create mode 100644 src/Visual_DVM_2021/UI/Main/ProfilesFields.java create mode 100644 src/Visual_DVM_2021/UI/Main/ProfilesForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/ProjectForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/ProjectForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/RunTasksComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/SapforPackagesComparisonForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/SapforPackagesComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/SapforTasksComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/TabToolBar.java create mode 100644 src/Visual_DVM_2021/UI/Main/TasksComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/TasksComparisonState.java create mode 100644 src/Visual_DVM_2021/UI/Main/TestRunTasksComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/TestingForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/TestingForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/VariantsForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/VariantsForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/VersionsComparisonForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/VersionsForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/VersionsForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/WelcomeForm.form create mode 100644 src/Visual_DVM_2021/UI/Main/WelcomeForm.java create mode 100644 src/Visual_DVM_2021/UI/Main/buffer.form create mode 100644 src/Visual_DVM_2021/UI/Main/buffer.java create mode 100644 src/analyzer/common/MessageJtoJ.java create mode 100644 src/files/Planner/Array.h create mode 100644 src/files/Planner/CompilationSupervisor.h create mode 100644 src/files/Planner/CompilationTask.h create mode 100644 src/files/Planner/File.h create mode 100644 src/files/Planner/Global.h create mode 100644 src/files/Planner/Planner.cpp create mode 100644 src/files/Planner/RunSupervisor.h create mode 100644 src/files/Planner/RunTask.h create mode 100644 src/files/Planner/String.h create mode 100644 src/files/Planner/Supervisor.h create mode 100644 src/files/Planner/Task.h create mode 100644 src/files/Planner/Text.h create mode 100644 src/files/Planner/Utils.h create mode 100644 src/files/Process_r.h create mode 100644 src/files/launcher.cpp create mode 100644 src/files/starter.cpp create mode 100644 src/icons/Alignment.png create mode 100644 src/icons/Analyses.png create mode 100644 src/icons/Append.png create mode 100644 src/icons/AppendSmall.png create mode 100644 src/icons/Apply.png create mode 100644 src/icons/Args.PNG create mode 100644 src/icons/Arrays.png create mode 100644 src/icons/Arrays/IOPrivate.png create mode 100644 src/icons/Arrays/None.png create mode 100644 src/icons/Arrays/Selected.png create mode 100644 src/icons/Arrays/SpfPrivate.png create mode 100644 src/icons/Arrays/Unknown.png create mode 100644 src/icons/Attach.png create mode 100644 src/icons/Atttachement.png create mode 100644 src/icons/Back.png create mode 100644 src/icons/Background.png create mode 100644 src/icons/Ban.PNG create mode 100644 src/icons/Book.png create mode 100644 src/icons/Bug.gif create mode 100644 src/icons/Bug.png create mode 100644 src/icons/BugSettings.png create mode 100644 src/icons/Bugs_2022.png create mode 100644 src/icons/Camera.png create mode 100644 src/icons/Chain.png create mode 100644 src/icons/Clean.png create mode 100644 src/icons/CleanTime.png create mode 100644 src/icons/Close.png create mode 100644 src/icons/CloseBugReport.png create mode 100644 src/icons/Close_18.png create mode 100644 src/icons/Command.png create mode 100644 src/icons/Common.png create mode 100644 src/icons/CompareDVMStatistics.png create mode 100644 src/icons/Comparsion.png create mode 100644 src/icons/CompilationErrors.png create mode 100644 src/icons/CompilationOutput.png create mode 100644 src/icons/Components.png create mode 100644 src/icons/ComponentsActual.png create mode 100644 src/icons/ComponentsNeedPublish.png create mode 100644 src/icons/ComponentsNeedPublish_2023.gif create mode 100644 src/icons/ComponentsNeedUpdate.gif create mode 100644 src/icons/Coverage.png create mode 100644 src/icons/Create.png create mode 100644 src/icons/CreateProject.png create mode 100644 src/icons/Credentials.png create mode 100644 src/icons/DVM.png create mode 100644 src/icons/Date.png create mode 100644 src/icons/Delete.png create mode 100644 src/icons/Dimensions.png create mode 100644 src/icons/Distribution.png create mode 100644 src/icons/DownloadAll.png create mode 100644 src/icons/DownloadBugReport.png create mode 100644 src/icons/DownloadProject.png create mode 100644 src/icons/Edit.png create mode 100644 src/icons/Editor/Comment.png create mode 100644 src/icons/Editor/Copy.png create mode 100644 src/icons/Editor/Cut.png create mode 100644 src/icons/Editor/Font+.png create mode 100644 src/icons/Editor/Font-.png create mode 100644 src/icons/Editor/NoStrike.png create mode 100644 src/icons/Editor/Paste.png create mode 100644 src/icons/Editor/ShowAllSigns.png create mode 100644 src/icons/Editor/ShowNoSigns.png create mode 100644 src/icons/Editor/Strikethrough.png create mode 100644 src/icons/Editor/Uncomment.png create mode 100644 src/icons/Errors.png create mode 100644 src/icons/Exclude.png create mode 100644 src/icons/Explorer.png create mode 100644 src/icons/File.png create mode 100644 src/icons/Filter.png create mode 100644 src/icons/Folder.png create mode 100644 src/icons/Function.png create mode 100644 src/icons/FunctionsH.png create mode 100644 src/icons/GCOV.PNG create mode 100644 src/icons/Generate.png create mode 100644 src/icons/GlobalStatistic.png create mode 100644 src/icons/GreenHelp.PNG create mode 100644 src/icons/GreenStart.png create mode 100644 src/icons/HGreenArrow.png create mode 100644 src/icons/Help.png create mode 100644 src/icons/HidePassword.png create mode 100644 src/icons/Home.png create mode 100644 src/icons/Include.png create mode 100644 src/icons/Info.png create mode 100644 src/icons/InitializeUser.png create mode 100644 src/icons/Language.png create mode 100644 src/icons/Languages/C.png create mode 100644 src/icons/Languages/Cpp.png create mode 100644 src/icons/Languages/Fortran.png create mode 100644 src/icons/LastOpened.png create mode 100644 src/icons/Left.png create mode 100644 src/icons/Library.PNG create mode 100644 src/icons/Lines.png create mode 100644 src/icons/Log.png create mode 100644 src/icons/Loop.png create mode 100644 src/icons/Machine.png create mode 100644 src/icons/MassFiles.png create mode 100644 src/icons/Matrix.png create mode 100644 src/icons/Maxtime.png create mode 100644 src/icons/Menu/AddLines.png create mode 100644 src/icons/Menu/Dvm.png create mode 100644 src/icons/Menu/Functions.png create mode 100644 src/icons/Menu/Intervals.png create mode 100644 src/icons/Menu/Loops.png create mode 100644 src/icons/Menu/Preprocessing.png create mode 100644 src/icons/Menu/Privates.png create mode 100644 src/icons/Menu/Regions.png create mode 100644 src/icons/Menu/RemoveLines.png create mode 100644 src/icons/Menu/Rename.png create mode 100644 src/icons/Menu/Undo.png create mode 100644 src/icons/Metrics.png create mode 100644 src/icons/MultiFiles.png create mode 100644 src/icons/Next.png create mode 100644 src/icons/NotPick.png create mode 100644 src/icons/Notes.png create mode 100644 src/icons/OpenBugReport.png create mode 100644 src/icons/OpenProject.png create mode 100644 src/icons/ParallelVariants.png create mode 100644 src/icons/Pass.gif create mode 100644 src/icons/Pass2.gif create mode 100644 src/icons/Pause.png create mode 100644 src/icons/Pick.png create mode 100644 src/icons/Predict.png create mode 100644 src/icons/Prev.png create mode 100644 src/icons/Profiles.png create mode 100644 src/icons/Progress.png create mode 100644 src/icons/Publish.png create mode 100644 src/icons/Recomendations.png create mode 100644 src/icons/RedAdd.png create mode 100644 src/icons/Registry.png create mode 100644 src/icons/Resurrect.png create mode 100644 src/icons/Right.png create mode 100644 src/icons/RunErrors.png create mode 100644 src/icons/RunOutput.png create mode 100644 src/icons/Save.png create mode 100644 src/icons/SaveSmall.png create mode 100644 src/icons/ScreenShot.png create mode 100644 src/icons/SelectAll.png create mode 100644 src/icons/Session.png create mode 100644 src/icons/Settings.png create mode 100644 src/icons/ShowPassword.png create mode 100644 src/icons/Start.png create mode 100644 src/icons/Stop.png create mode 100644 src/icons/Sts.png create mode 100644 src/icons/Style.png create mode 100644 src/icons/Subscribe.png create mode 100644 src/icons/TabClose.png create mode 100644 src/icons/Test2.png create mode 100644 src/icons/Testing.png create mode 100644 src/icons/Time.png create mode 100644 src/icons/Transformations.png create mode 100644 src/icons/Transformations/CombineFiles.png create mode 100644 src/icons/Transformations/CopyProject.png create mode 100644 src/icons/Transformations/DVMConvertProject.png create mode 100644 src/icons/Transformations/EraseBadSymbols.png create mode 100644 src/icons/Transformations/PrepareForModulesAssembly.png create mode 100644 src/icons/Transformations/SPF_ConvertStructures.png create mode 100644 src/icons/Transformations/SPF_CorrectCodeStylePass.png create mode 100644 src/icons/Transformations/SPF_CreateCheckpoints.png create mode 100644 src/icons/Transformations/SPF_CreateIntervalsTree.png create mode 100644 src/icons/Transformations/SPF_DuplicateFunctionChains.png create mode 100644 src/icons/Transformations/SPF_ExpressionSubstitution.png create mode 100644 src/icons/Transformations/SPF_InitDeclsWithZero.png create mode 100644 src/icons/Transformations/SPF_InlineProcedures.png create mode 100644 src/icons/Transformations/SPF_InlineProceduresH.png create mode 100644 src/icons/Transformations/SPF_InsertDvmhRegions.png create mode 100644 src/icons/Transformations/SPF_InsertIncludesPass.png create mode 100644 src/icons/Transformations/SPF_LoopEndDoConverterPass.png create mode 100644 src/icons/Transformations/SPF_LoopFission.png create mode 100644 src/icons/Transformations/SPF_LoopUnion.png create mode 100644 src/icons/Transformations/SPF_LoopUnrolling.png create mode 100644 src/icons/Transformations/SPF_PrivateExpansion.png create mode 100644 src/icons/Transformations/SPF_PrivateRemoving.png create mode 100644 src/icons/Transformations/SPF_PrivateShrinking.png create mode 100644 src/icons/Transformations/SPF_RemoveDvmDirectives.png create mode 100644 src/icons/Transformations/SPF_RemoveDvmDirectivesToComments.png create mode 100644 src/icons/Transformations/SPF_RemoveDvmIntervals.png create mode 100644 src/icons/Transformations/SPF_RemoveUnusedFunctions.png create mode 100644 src/icons/Transformations/SPF_ResolveCommonBlockConflicts.png create mode 100644 src/icons/Transformations/SPF_ResolveParallelRegionConflicts.png create mode 100644 src/icons/Transformations/SPF_SharedMemoryParallelization.png create mode 100644 src/icons/UnselectAll.png create mode 100644 src/icons/Update.png create mode 100644 src/icons/User.png create mode 100644 src/icons/VersionsTree.png create mode 100644 src/icons/Warnings.png create mode 100644 src/icons/files/Excludedcppprogram.png create mode 100644 src/icons/files/Excludedcprogram.png create mode 100644 src/icons/files/Excludeddata.png create mode 100644 src/icons/files/Excludedfortranprogram.png create mode 100644 src/icons/files/Excludedheader.png create mode 100644 src/icons/files/Excludednone.png create mode 100644 src/icons/files/Excludednprogram.png create mode 100644 src/icons/files/HasErrorscppprogram.png create mode 100644 src/icons/files/HasErrorscprogram.png create mode 100644 src/icons/files/HasErrorsfortranprogram.png create mode 100644 src/icons/files/HasErrorsheader.png create mode 100644 src/icons/files/HasErrorsnone.png create mode 100644 src/icons/files/HasErrorsnprogram.png create mode 100644 src/icons/files/HasNotescppprogram.png create mode 100644 src/icons/files/HasNotescprogram.png create mode 100644 src/icons/files/HasNotesfortranprogram.png create mode 100644 src/icons/files/HasNotesheader.png create mode 100644 src/icons/files/HasNotesnone.png create mode 100644 src/icons/files/HasNotesnprogram.png create mode 100644 src/icons/files/HasWarningscppprogram.png create mode 100644 src/icons/files/HasWarningscprogram.png create mode 100644 src/icons/files/HasWarningsfortranprogram.png create mode 100644 src/icons/files/HasWarningsheader.png create mode 100644 src/icons/files/HasWarningsnone.png create mode 100644 src/icons/files/HasWarningsnprogram.png create mode 100644 src/icons/files/OKcppprogram.png create mode 100644 src/icons/files/OKcprogram.png create mode 100644 src/icons/files/OKfortranprogram.png create mode 100644 src/icons/files/OKheader.png create mode 100644 src/icons/files/OKnone.png create mode 100644 src/icons/files/OKnprogram.png create mode 100644 src/icons/files/Undefinedcppprogram.png create mode 100644 src/icons/files/Undefinedcprogram.png create mode 100644 src/icons/files/Undefineddata.png create mode 100644 src/icons/files/Undefinedfortranprogram.png create mode 100644 src/icons/files/Undefinedheader.png create mode 100644 src/icons/files/Undefinednone.png create mode 100644 src/icons/files/Undefinednprogram.png create mode 100644 src/icons/loops/HasErrorsArrayDecl.png create mode 100644 src/icons/loops/HasErrorsBadLoop.png create mode 100644 src/icons/loops/HasErrorsEGoto.png create mode 100644 src/icons/loops/HasErrorsFuncCall.png create mode 100644 src/icons/loops/HasErrorsFuncInfo.png create mode 100644 src/icons/loops/HasErrorsGoodLoop.png create mode 100644 src/icons/loops/HasErrorsIGoto.png create mode 100644 src/icons/loops/HasErrorsIO.png create mode 100644 src/icons/loops/HasErrorsLoop.png create mode 100644 src/icons/loops/HasErrorsNonRectIter.png create mode 100644 src/icons/loops/HasErrorsStop.png create mode 100644 src/icons/loops/HasNotesArrayDecl.png create mode 100644 src/icons/loops/HasNotesBadLoop.png create mode 100644 src/icons/loops/HasNotesEGoto.png create mode 100644 src/icons/loops/HasNotesFuncCall.png create mode 100644 src/icons/loops/HasNotesFuncInfo.png create mode 100644 src/icons/loops/HasNotesGoodLoop.png create mode 100644 src/icons/loops/HasNotesIGoto.png create mode 100644 src/icons/loops/HasNotesIO.png create mode 100644 src/icons/loops/HasNotesLoop.png create mode 100644 src/icons/loops/HasNotesNonRectIter.png create mode 100644 src/icons/loops/HasNotesStop.png create mode 100644 src/icons/loops/HasWarningsArrayDecl.png create mode 100644 src/icons/loops/HasWarningsBadLoop.png create mode 100644 src/icons/loops/HasWarningsEGoto.png create mode 100644 src/icons/loops/HasWarningsFuncCall.png create mode 100644 src/icons/loops/HasWarningsFuncInfo.png create mode 100644 src/icons/loops/HasWarningsGoodLoop.png create mode 100644 src/icons/loops/HasWarningsIGoto.png create mode 100644 src/icons/loops/HasWarningsIO.png create mode 100644 src/icons/loops/HasWarningsLoop.png create mode 100644 src/icons/loops/HasWarningsNonRectIter.png create mode 100644 src/icons/loops/HasWarningsStop.png create mode 100644 src/icons/loops/OKArrayDecl.png create mode 100644 src/icons/loops/OKBadLoop.png create mode 100644 src/icons/loops/OKEGoto.png create mode 100644 src/icons/loops/OKFuncCall.png create mode 100644 src/icons/loops/OKFuncInfo.png create mode 100644 src/icons/loops/OKGoodLoop.png create mode 100644 src/icons/loops/OKIGoto.png create mode 100644 src/icons/loops/OKIO.png create mode 100644 src/icons/loops/OKLoop.png create mode 100644 src/icons/loops/OKNonRectIter.png create mode 100644 src/icons/loops/OKStop.png create mode 100644 src/icons/makefile.png create mode 100644 src/icons/screen.png create mode 100644 src/icons/type.png create mode 100644 src/icons/versions/M.png create mode 100644 src/icons/versions/Root.png create mode 100644 src/icons/versions/Version.png create mode 100644 src/icons/versions/currentM.png create mode 100644 src/icons/versions/currentRoot.png create mode 100644 src/icons/versions/currentVersion.png create mode 100644 ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð¿Ð¾ раÑпараллеливанию в ÑиÑтеме SAPFOR.pptx diff --git a/.idea/artifacts/VisualSapfor_jar.xml b/.idea/artifacts/VisualSapfor_jar.xml new file mode 100644 index 00000000..c7a9ffa0 --- /dev/null +++ b/.idea/artifacts/VisualSapfor_jar.xml @@ -0,0 +1,16 @@ + + + $PROJECT_DIR$/Components + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..a55e7a17 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/dictionaries/misha.xml b/.idea/dictionaries/misha.xml new file mode 100644 index 00000000..adcecc0f --- /dev/null +++ b/.idea/dictionaries/misha.xml @@ -0,0 +1,54 @@ + + + + anchestor + borov + decl + declarated + decls + distr + dvmuser + enddo + existense + ffixed + ffree + formtype + freenas + gcda + gcno + gcov + gfortran + gotos + ident + identificators + inexisting + iter + jdbc + maxdeg + maxdim + maxtime + mcancel + mprit + mqtest + mtime + nigga + pppa + preproc + preprocessing + proj + sapfor + sapfors + slen + splited + sqlite + subdir + subdirs + templ + testuser + tripple + uniq + unparse + unselect + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..9caf446d --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/libraries/autocomplete_3_1_1_SNAPSHOT.xml b/.idea/libraries/autocomplete_3_1_1_SNAPSHOT.xml new file mode 100644 index 00000000..66eaaa94 --- /dev/null +++ b/.idea/libraries/autocomplete_3_1_1_SNAPSHOT.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/commons_io_2_5.xml b/.idea/libraries/commons_io_2_5.xml new file mode 100644 index 00000000..9a8678ca --- /dev/null +++ b/.idea/libraries/commons_io_2_5.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/gson_2_8_1.xml b/.idea/libraries/gson_2_8_1.xml new file mode 100644 index 00000000..1f3943b6 --- /dev/null +++ b/.idea/libraries/gson_2_8_1.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/jsch_0_1_55.xml b/.idea/libraries/jsch_0_1_55.xml new file mode 100644 index 00000000..f0ae23ec --- /dev/null +++ b/.idea/libraries/jsch_0_1_55.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/mail.xml b/.idea/libraries/mail.xml new file mode 100644 index 00000000..85082279 --- /dev/null +++ b/.idea/libraries/mail.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/mxgraphx_all_4_2_0.xml b/.idea/libraries/mxgraphx_all_4_2_0.xml new file mode 100644 index 00000000..c16eeefc --- /dev/null +++ b/.idea/libraries/mxgraphx_all_4_2_0.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/rsyntaxtextarea_3_0_5_SNAPSHOT.xml b/.idea/libraries/rsyntaxtextarea_3_0_5_SNAPSHOT.xml new file mode 100644 index 00000000..44e52fe8 --- /dev/null +++ b/.idea/libraries/rsyntaxtextarea_3_0_5_SNAPSHOT.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/sqlite_jdbc_3_7_2.xml b/.idea/libraries/sqlite_jdbc_3_7_2.xml new file mode 100644 index 00000000..c2a6df9c --- /dev/null +++ b/.idea/libraries/sqlite_jdbc_3_7_2.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..05483570 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 00000000..1675bddd --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml new file mode 100644 index 00000000..aabf42e9 --- /dev/null +++ b/.idea/uiDesigner.xml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 00000000..94a25f7f --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/visual_dvm_2020.iml b/.idea/visual_dvm_2020.iml new file mode 100644 index 00000000..d6ebd480 --- /dev/null +++ b/.idea/visual_dvm_2020.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 00000000..418e266f --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PerformanceAnalyzer/1049392283/stat.json b/PerformanceAnalyzer/1049392283/stat.json new file mode 100644 index 00000000..ded4cdb9 --- /dev/null +++ b/PerformanceAnalyzer/1049392283/stat.json @@ -0,0 +1 @@ +{"inter":[{"col_op":[{"comm":0.0,"ncall":8,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":6,"nline_end":64,"pname":"jac3d.f","t":21},"proc_times":[{"comm":0.0,"exec_time":0.3102550506591797,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":0.3100552558898926,"prod_io":0.0001800060272216797,"prod_sys":1.9788742065429688e-05,"real_comm":0.0,"synch":0.0,"sys_time":0.0,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0,"comm_start":0.0,"efficiency":1.0,"exec_time":0.3102550506591797,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"nproc":1,"overlap":0.0,"prod_cpu":0.3100552558898926,"prod_io":0.0001800060272216797,"prod_sys":1.9788742065429688e-05,"real_comm":0.0,"synch":0.0,"sys_time":0.3102550506591797,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":2,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5540609359741211}]} \ No newline at end of file diff --git a/PerformanceAnalyzer/139606632/stat.json b/PerformanceAnalyzer/139606632/stat.json new file mode 100644 index 00000000..519065e8 --- /dev/null +++ b/PerformanceAnalyzer/139606632/stat.json @@ -0,0 +1 @@ +{"inter":[{"col_op":[{"comm":0.0,"ncall":107,"overlap":0.0,"real_comm":0.0,"synch":0.09642767906188965,"time_var":0.10170316696166992},{"comm":0.09526991844177246,"ncall":100,"overlap":0.00025081634521484375,"real_comm":0.0,"synch":2.384185791015625e-05,"time_var":1.5735626220703125e-05},{"comm":0.01116180419921875,"ncall":100,"overlap":7.390975952148438e-05,"real_comm":0.0,"synch":0.0018832683563232422,"time_var":0.0013852119445800781},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":15,"nline_end":71,"pname":"jac2d.for","t":21},"proc_times":[{"comm":0.008355379104614258,"exec_time":4.960660934448242,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.00014519691467285156,"insuf_sys":0.02597987651824951,"insuf_user":0.002836167812347412,"load_imb":0.0,"lost_time":0.03731662034988403,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.9148295521736145,"prod_io":0.0015007257461547852,"prod_sys":0.007159233093261719,"real_comm":0.0,"synch":0.015146493911743164,"sys_time":1.42268456e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.011813640594482422},{"comm":0.020066499710083008,"exec_time":4.960740089416504,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":6.604194641113281e-05,"insuf_sys":0.022036850452423096,"insuf_user":0.0030239224433898926,"load_imb":0.006429493427276611,"lost_time":0.04519331455230713,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.9082671999931335,"prod_io":5.352497100830078e-05,"prod_sys":0.0072920918464660645,"real_comm":0.0,"synch":0.021478652954101563,"sys_time":1632742196.495043,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.024171829223632813},{"comm":0.05277681350708008,"exec_time":4.960806131362915,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.023320376873016357,"insuf_user":0.0034398436546325684,"load_imb":0.040790677070617676,"lost_time":0.079537034034729,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.873495638370514,"prod_io":7.098913192749023e-05,"prod_sys":0.007702469825744629,"real_comm":0.0,"synch":0.03799128532409668,"sys_time":5.51718905656e-313,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.04065394401550293},{"comm":0.025233030319213867,"exec_time":4.960805177688599,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":9.5367431640625e-07,"insuf_sys":0.022124826908111572,"insuf_user":0.0031962990760803223,"load_imb":0.011793673038482666,"lost_time":0.05055510997772217,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":4.902876079082489,"prod_io":5.5909156799316406e-05,"prod_sys":0.007319033145904541,"real_comm":0.0,"synch":0.02371835708618164,"sys_time":1.4228205e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.02646470069885254}],"times":{"comm":0.10643172264099121,"comm_start":0.0,"efficiency":0.989285910732807,"exec_time":4.960806131362915,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.00021219253540039063,"insuf":0.10595816373825073,"insuf_sys":0.09346193075180054,"insuf_user":0.012496232986450195,"load_imb":0.05901384353637695,"lost_time":0.21260207891464233,"nproc":4,"overlap":0.0003247261047363281,"prod_cpu":19.59946846961975,"prod_io":0.0016811490058898926,"prod_sys":0.029472827911376953,"real_comm":0.0,"synch":0.09833478927612305,"sys_time":19.84322452545166,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":4,"time_var":0.1031041145324707}}],"iscomp":false,"nproc":4,"p_heading":"2*2","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5796339511871338},{"node_name":"mic.dvm-system.org","test_time":0.5798628330230713},{"node_name":"mic.dvm-system.org","test_time":0.5795998573303223},{"node_name":"mic.dvm-system.org","test_time":0.5797138214111328}]} \ No newline at end of file diff --git a/PerformanceAnalyzer/1664247100/stat.json b/PerformanceAnalyzer/1664247100/stat.json new file mode 100644 index 00000000..f96aaa5a --- /dev/null +++ b/PerformanceAnalyzer/1664247100/stat.json @@ -0,0 +1 @@ +{"inter":[{"col_op":[{"comm":0.0,"ncall":107,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0012249946594238281,"ncall":100,"overlap":0.00010442733764648438,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":100,"overlap":5.507469177246094e-05,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":15,"nline_end":71,"pname":"jac2d.for","t":21},"proc_times":[{"comm":0.0012249946594238281,"exec_time":12.855837106704712,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0012249946594238281,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":12.844730615615845,"prod_io":0.0035636425018310547,"prod_sys":0.006317853927612305,"real_comm":0.0,"synch":0.0,"sys_time":1.4784531e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0012249946594238281,"comm_start":0.0,"efficiency":0.9999047129604042,"exec_time":12.855837106704712,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0012249946594238281,"nproc":1,"overlap":0.0001595020294189453,"prod_cpu":12.844730615615845,"prod_io":0.0035636425018310547,"prod_sys":0.006317853927612305,"real_comm":0.0,"synch":0.0,"sys_time":12.855837106704712,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":1,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5531537532806396}]} \ No newline at end of file diff --git a/PerformanceAnalyzer/535943622/stat.json b/PerformanceAnalyzer/535943622/stat.json new file mode 100644 index 00000000..cfb1ec1e --- /dev/null +++ b/PerformanceAnalyzer/535943622/stat.json @@ -0,0 +1 @@ +{"inter":[{"col_op":[{"comm":0.0,"ncall":54,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":174,"nline_end":298,"pname":"bt.f","t":21},"proc_times":[{"comm":0.0,"exec_time":37.97893500328064,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":37.97744798660278,"prod_io":0.0006661415100097656,"prod_sys":0.0008208751678466797,"real_comm":0.0,"synch":0.0,"sys_time":4.080717506121202e-33,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0,"comm_start":0.0,"efficiency":1.0,"exec_time":37.97893500328064,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0,"nproc":1,"overlap":0.0,"prod_cpu":37.97744798660278,"prod_io":0.0006661415100097656,"prod_sys":0.0008208751678466797,"real_comm":0.0,"synch":0.0,"sys_time":37.97893500328064,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":12,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1*1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5507678985595703}]} \ No newline at end of file diff --git a/PerformanceAnalyzer/622828792/stat.json b/PerformanceAnalyzer/622828792/stat.json new file mode 100644 index 00000000..d4769aa2 --- /dev/null +++ b/PerformanceAnalyzer/622828792/stat.json @@ -0,0 +1 @@ +{"inter":[{"col_op":[{"comm":0.0,"ncall":107,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0011873245239257813,"ncall":100,"overlap":9.274482727050781e-05,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":100,"overlap":5.435943603515625e-05,"real_comm":0.0,"synch":0.0,"time_var":0.0},{"comm":0.0,"ncall":0,"overlap":0.0,"real_comm":0.0,"synch":0.0,"time_var":0.0}],"id":{"expr":2000000000,"nenter":1.0,"nlev":0,"nline":15,"nline_end":71,"pname":"jac2d.for","t":21},"proc_times":[{"comm":0.0011873245239257813,"exec_time":12.533138990402222,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"gpu_times":null,"idle":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0011873245239257813,"num_gpu":0,"num_threads":0,"overlap":0.0,"prod_cpu":12.522205114364624,"prod_io":0.0035867691040039063,"prod_sys":0.006159782409667969,"real_comm":0.0,"synch":0.0,"sys_time":2.49049955e-316,"th_times":null,"thr_sys_time":0.0,"thr_user_time":0.0,"time_var":0.0}],"times":{"comm":0.0011873245239257813,"comm_start":0.0,"efficiency":0.999905265191359,"exec_time":12.533138990402222,"gpu_time_lost":0.0,"gpu_time_prod":0.0,"idle":0.0,"insuf":0.0,"insuf_sys":0.0,"insuf_user":0.0,"load_imb":0.0,"lost_time":0.0011873245239257813,"nproc":1,"overlap":0.00014710426330566406,"prod_cpu":12.522205114364624,"prod_io":0.0035867691040039063,"prod_sys":0.006159782409667969,"real_comm":0.0,"synch":0.0,"sys_time":12.533138990402222,"thr_sys_time":0.0,"thr_user_time":0.0,"threadsOfAllProcs":1,"time_var":0.0}}],"iscomp":false,"nproc":1,"p_heading":"1*1","proc":[{"node_name":"mic.dvm-system.org","test_time":0.5526328086853027}]} \ No newline at end of file diff --git a/Planner/Array.h b/Planner/Array.h new file mode 100644 index 00000000..f1e59f8a --- /dev/null +++ b/Planner/Array.h @@ -0,0 +1,42 @@ +#include +#include +#include +#pragma once +template +class Array { +protected: + long length; + T** elements; +public: + Array(){ + length=0; + elements=NULL; + } + virtual ~Array(){ + if (elements !=NULL){ + for (long i=0; i { +public: + CompilationSupervisor(){ + this->init("compilationTasks", 4); + } + CompilationTask * getTaskById(long task_id){ + for (long i=0; i< length; ++i){ + CompilationTask * task = get(i); + if (task->getId()==task_id) + return task; + } + return NULL; + } + virtual String getStatePrefix(){ + return String("Compilation"); + } +}; \ No newline at end of file diff --git a/Planner/CompilationTask.h b/Planner/CompilationTask.h new file mode 100644 index 00000000..ba1fb457 --- /dev/null +++ b/Planner/CompilationTask.h @@ -0,0 +1,47 @@ +#include "Task.h" +#pragma once +class CompilationTask: public Task { + String test_id; + String makefile_text; +public: + void setTestId(String * test_id_in){ + test_id = String(test_id_in->getCharArray()); + } + void setMakefileText(String * makefile_text_in){ + makefile_text = String(makefile_text_in->getCharArray(), '|'); + } + virtual void print(){ + printf("id=%ld; maxtime=%d; test_id=%s\n", id, maxtime, + test_id.getCharArray()); + printf("makefile_text=%s\n", makefile_text.getCharArray()); + } + CompilationTask(Text * lines, int offset):Task(lines,offset) { + setTestId(lines->get(offset+2)); + setMakefileText(lines->get(offset+3)); + setState(Waiting); + kernels=1; + } + + virtual void prepareWorkspace(){ + String makeFilePath = String(id)+"/Makefile"; + File makeFileFile = File(makeFilePath, this->makefile_text); + String tests = userWorkspace+"/projects"; + String testPath= tests+"/"+test_id; + String copyCommand = "cp -r " + String::DQuotes(testPath + "/.") + " "+ String::DQuotes(workspace); + system(copyCommand.getCharArray()); + } + virtual String getLaunchScriptText(){ + String modules = userWorkspace+"/modules"; + String starterCall = modules+"/starter"; + String launcherCall = modules+"/launcher"; + return String::DQuotes(starterCall)+" "+ + String::DQuotes(launcherCall)+" "+ + String(maxtime)+" "+ + String::DQuotes("")+" "+ + "make -j -f Makefile"; + } + virtual void analyseResults(){ + String binary = workspace+"/0"; + state = Utils::Exists(binary)? Done:DoneWithErrors; + } +}; \ No newline at end of file diff --git a/Planner/File.h b/Planner/File.h new file mode 100644 index 00000000..06c92ffc --- /dev/null +++ b/Planner/File.h @@ -0,0 +1,64 @@ +#include "Text.h" +#pragma once +class File { + FILE* ptr; +public: + File(String* name) { + ptr = fopen(name->getCharArray(), "r"); + } + File(const char * name) { + ptr = fopen(name, "r"); + } + File(const String& name, const String& text){ + ptr = fopen(name.getCharArray(), "w"); + fprintf(ptr, "%s\n", text.getCharArray()); + } + ~File() { + if (ptr != NULL) { + fclose(ptr); + ptr = NULL; + } + } + Text* readLines(){ + Text* lines = new Text(); + int c; + String * line = NULL; + bool lineStarted = false; + do { + c = fgetc(ptr); + if (lineStarted){ + switch (c) { + case '\r': + break; + case '\n': + case EOF: + lines->add(line); + line = NULL; + lineStarted = false; + break; + default: + line->addChar((char)c); + break; + } + }else { + switch (c){ + case '\r': + break; + case '\n': + line = new String(); + lines->add(line); + line = NULL; + break; + case EOF: + break; + default: + line = new String(); + line->addChar((char)c); + lineStarted = true; + break; + } + } + }while (c!=EOF); + return lines; + } +}; \ No newline at end of file diff --git a/Planner/Global.h b/Planner/Global.h new file mode 100644 index 00000000..965e4836 --- /dev/null +++ b/Planner/Global.h @@ -0,0 +1,13 @@ +#include "String.h" +#pragma once +String userWorkspace; +#pragma once +String packageWorkspace; +#pragma once +int maxKernels; +#pragma once +int busyKernels; +#pragma once +int freeKernels; +#pragma once +String dvm_drv; \ No newline at end of file diff --git a/Planner/Planner.cpp b/Planner/Planner.cpp new file mode 100644 index 00000000..9b0a2d8c --- /dev/null +++ b/Planner/Planner.cpp @@ -0,0 +1,28 @@ +#include "CompilationSupervisor.h" +#include "RunSupervisor.h" +#include "Global.h" +int main(int argc, char ** argv) +{ + userWorkspace = String(argv[1]); + packageWorkspace = String(argv[2]); + maxKernels = atoi(argv[3]); + dvm_drv = String(argv[4]); + //-- + freeKernels = maxKernels; + busyKernels= 0; + //-- + chdir(packageWorkspace.getCharArray()); + userWorkspace.println(); + packageWorkspace.println(); + printf("%d\n", maxKernels); + + CompilationSupervisor * compilationSupervisor = new CompilationSupervisor(); + printf("%ld\n", compilationSupervisor->getLength()); + compilationSupervisor->Do(); + + RunSupervisor * runSupervisor = new RunSupervisor(compilationSupervisor); + printf("%ld\n", runSupervisor->getLength()); + runSupervisor->print(); + runSupervisor->Do(); + return 0; +} diff --git a/Planner/RunSupervisor.h b/Planner/RunSupervisor.h new file mode 100644 index 00000000..e1105615 --- /dev/null +++ b/Planner/RunSupervisor.h @@ -0,0 +1,31 @@ +#include "CompilationSupervisor.h" +#include "RunTask.h" +#pragma once +class RunSupervisor: public Supervisor { +public: + RunSupervisor(CompilationSupervisor * compilationSupervisor){ + this->init("runTasks", 8); + //проверить отмененные задачи. + for (long i=0; i< this->length; ++i){ + RunTask * task = this->get(i); + CompilationTask * parent = compilationSupervisor->getTaskById( task->getTestCompilationTaskId()); + task->setState((parent->getState()==Done)?Waiting:Canceled); + task->setParent(parent); + printf("id=%ld; parent_id = %ld; state=%s\n", + task->getId(), + task->getParent()->getId(), + task->printState().getCharArray()); + } + } + virtual String getStatePrefix(){ + return String("Running"); + } + virtual void Finalize(){ + this->state = Archivation; + saveState(); + printf("Archivation started\n"); + Utils::ZipFolder(String("./"),String("archive.zip")); + printf("Archivation ended\n"); + + } +}; \ No newline at end of file diff --git a/Planner/RunTask.h b/Planner/RunTask.h new file mode 100644 index 00000000..1120c231 --- /dev/null +++ b/Planner/RunTask.h @@ -0,0 +1,94 @@ +#include "CompilationTask.h" +#pragma once +class RunTask : public Task { + long testcompilationtask_id; + String binary_name; + String matrix; + String environments; + String usr_par; + String args; + CompilationTask* parent; +public: + virtual void print(){ + printf("id=%ld; maxtime=%d; testcompilationtask_id=%ld; matrix=%s; environments=%s; usr_par=%s; args=%s kernels=%d\n", + id, + maxtime, + testcompilationtask_id, + matrix.getCharArray(), + environments.getCharArray(), + usr_par.getCharArray(), + args.getCharArray(), + kernels + ); + } + int setKernels(String * kernels_s){ + return kernels = atoi(kernels_s->getCharArray()); + } + long setTestCompilationTaskId(String * id_s){ + return testcompilationtask_id=strtol(id_s->getCharArray(), NULL, 10); + } + long getTestCompilationTaskId(){ + return testcompilationtask_id; + } + void setMatrix(String * matrix_in){ + matrix= String (matrix_in->getCharArray()); + } + void setEnvironments(String * environments_in){ + environments= String(environments_in->getCharArray()); + } + void setUsrPar(String * usr_par_in){ + usr_par= String(usr_par_in->getCharArray(),'|'); + } + void setArgs(String * args_in){ + args= String(args_in->getCharArray()); + } + void setParent(CompilationTask * parent_in){ + parent = parent_in; + binary_name = "spf_"+ String(id)+"_"+matrix.Replace(' ','_'); + } + CompilationTask * getParent(){ + return parent; + } + RunTask(Text * lines, int offset):Task(lines,offset) { + setTestCompilationTaskId(lines->get(offset+2)); + setMatrix(lines->get(offset+3)); + setEnvironments(lines->get(offset+4)); + setUsrPar(lines->get(offset+5)); + setArgs(lines->get(offset+6)); + setKernels(lines->get(offset+7)); + } + + virtual String getLaunchScriptText(){ + String modules = userWorkspace+"/modules"; + String starterCall = modules+"/starter"; + String launcherCall = modules+"/launcher"; + //- + String dvm_start = String::DQuotes(dvm_drv) + " run "; + if (!matrix.isEmpty()) + dvm_start = dvm_start+matrix + " "; + dvm_start = dvm_start+ String::DQuotes("./" + binary_name); + if (!args.isEmpty()) + dvm_start = dvm_start+ " " + args; + return String::DQuotes(starterCall)+" "+ + String::DQuotes(launcherCall)+" "+ + String(maxtime)+" "+ + String::DQuotes("killall -SIGKILL " + binary_name)+" "+ + dvm_start; + } + virtual void prepareWorkspace(){ + String binary_src = parent->getWorkspace()+"/0"; + String binary_dst = workspace+"/"+binary_name; + Utils::Copy(binary_src, binary_dst); + if (!usr_par.isEmpty()){ + String parPath = String(id)+"/usr.par"; + File parFile = File(parPath, usr_par); + } + } + virtual String getStartCommand(){ + String res = workspace+"/run"; + if (!environments.isEmpty()) + res = environments+" "+res; + printf("START %ld: %s\n", id, res.getCharArray()); + return res; + } +}; \ No newline at end of file diff --git a/Planner/String.h b/Planner/String.h new file mode 100644 index 00000000..ed85121d --- /dev/null +++ b/Planner/String.h @@ -0,0 +1,220 @@ +#include +#include +#include +#include +#pragma once +class String { + friend String operator+(const String& a, const String& b); + long length; + char* body; +public: + String() { + length = 0; + body = new char[1]; + body[0] = '\0'; + } + + String(const char* s) { + length = strlen(s); + body = new char[length + 1]; + for (long i = 0; i < length; ++i) + body[i] = s[i]; + body[length]='\0'; + } + String(const char* s, char ps) { + length = strlen(s); + body = new char[length + 1]; + for (long i = 0; i < length; ++i){ + body[i] = (s[i]==ps)? '\n': s[i]; + } + body[length]='\0'; + } + ~String() { + if (body != NULL) { + delete[] body; + } + } + void println() const{ + printf("[%s]\n", body); + } + void addChar(char c) { + char* buf = new char[length + 2]; + for (long i = 0; i < length; ++i) { + buf[i] = body[i]; + } + buf[length] = c; + + length++; + //-- + buf[length] = '\0'; + delete[] body; + body = buf; + buf = NULL; + } + char * getCharArray() const{ + return body; + } + + + String (int s){ + length = 0; + body = new char[1]; + body[0] = '\0'; + if (s>=0){ + int s_ = s; + int size = 1; + while (s_>=10){ + s_ = s_/10; + size++; + } + length = size; + body = new char [size+1]; + sprintf(body, "%d", s); + } + } + String (long s){ + length = 0; + body = new char[1]; + body[0] = '\0'; + if (s>=0){ + long s_ = s; + long size = 1; + while (s_>=10){ + s_ = s_/10; + size++; + } + length = size; + body = new char [size+1]; + sprintf(body, "%ld", s); + } + } + + const String& operator=(const String& s){ + if (body != NULL) + delete[] body; + length = s.length; + body = new char[length+1]; + for (long i=0; ilength) return false; + long k=0; + long start=-1; + for (long i=0; igetCharArray()); + for (long i=0; i +#include + +int main(void) { + FILE * f; + int c; + + if ( ! ( f = fopen("file.txt", "r") ) ) + return -1; + + while ( ( c = fgetc(f) ) != EOF ) + putchar( isupper(c) ? tolower(c) : toupper(c) ); + + return ( fclose(f) ); +} + */ + +}; + +String operator+(const String& a, const String& b){ + String res = String(); + res.length =a.length+b.length; + res.body = new char[res.length+1]; + for (long i=0; i + +#pragma once +enum SupervisorState { + WorkspacesCreation, //0 + Preparation, //1 + Execution, //2 + Archivation, //3 + End //4 +}; +#pragma once +template +class Supervisor : public Array { +protected: + SupervisorState state; +public: + virtual String getStatePrefix(){ + return String(""); + } + String printState(){ + switch(state){ + case WorkspacesCreation: + return String("WorkspacesCreation"); + case Preparation: + return String("Preparation"); + case Execution: + return String("Execution"); + case Archivation: + return String("Archivation"); + case End: + return String("End"); + default: + return "?"; + } + } + //- + void print(){ + for (long i=0; i< this->length; ++i) + this->elements[i]->print(); + } + void init(const char * fileName, int recordSize){ + state = WorkspacesCreation; + File * packedTasks = new File(fileName); + Text * lines = packedTasks->readLines(); + this->length = lines->getLength()/recordSize; + this->elements = new T* [this->length]; + int offset=0; + for (int i=0; i< this->length; ++i){ + this->elements[i]= new T(lines, offset); + offset+=recordSize; + } + delete packedTasks; + delete lines; + } + void Do(){ + saveState(); + long activeCount=0; + //todo обÑзательно убрать отладочную печать. + printf("tasks count = %ld\n", this->length); + while (this->state!= End){ +// printf("state=%d\n", this->state); +// printf("max=%d; busy=%d; free=%d\n", maxKernels, busyKernels, freeKernels); + activeCount=0; + for (long i=0; ilength; ++i){ + T * task = this->elements[i]; + switch (this->state){ + case WorkspacesCreation: + if (task->getState()==Waiting){ + activeCount++; + task->createWorkspace(); + task->setState(WorkspaceCreated); + } + break; + case Preparation: + if (task->getState()==WorkspaceCreated){ + activeCount++; + task->prepareWorkspace(); + task->createLaunchScript(); + task->setState(WorkspaceReady); + } + break; + case Execution: + if (task->getState()==WorkspaceReady){ + activeCount++; + task->Start(); + }else if (task->getState()==Running){ + activeCount++; + task->Check(); + } + break; + default: +// printf("id = %ld; state = %d\n", task->getId(), task->getState()); + break; + } + } +// printf("active count = %d\n", activeCount); + if (activeCount==0){ + switch (this->state){ + case WorkspacesCreation: + this->state = Preparation; + saveState(); + break; + case Preparation: + this->state = Execution; + saveState(); + break; + case Execution: + Finalize(); + this->state = End; + saveState(); + break; + default: + this->state = End; + break; + } + } + Utils::Sleep(2); + } + } + virtual void Finalize(){} + void saveState(){ + Utils::Sleep(1); //чтобы не было одинаковых по дате файлов. + String stateFile = packageWorkspace+"/state/"+getStatePrefix()+printState(); + //printf("stateFile=<%s>\n", stateFile.getCharArray()); + File(stateFile, Utils::getDate()); + } +}; \ No newline at end of file diff --git a/Planner/Task.h b/Planner/Task.h new file mode 100644 index 00000000..19891b5d --- /dev/null +++ b/Planner/Task.h @@ -0,0 +1,163 @@ +#include "File.h" +#include "Utils.h" +#include "Global.h" + +#pragma once +enum TaskState { + Inactive, //0 + Waiting, //1 + WorkspaceCreated, //2 + WorkspaceReady, //3 + Running, //4 + Canceled, //5 + Finished, //6 + FinishedAbortedByTimeout, //7 + FinishedAbortedByUser, //8 + Done, //9 + DoneWithErrors, //10 + AbortedByTimeout, //11 + AbortedByUser, //12 + Crushed, //13 + WrongTestFormat, //14 + InternalError, //15 + Queued, //16 + NoSuchTask, //17 + FailedToQueue, //18 + AbortingByUser //19 +}; +#pragma once +enum TestType{ + Default, //0 + Correctness, //1 + Performance, //2 +}; + +#pragma once +class Task { +protected: + long id; + int maxtime; + int kernels; //получение завиÑит от типа задачи. + String workspace; + TaskState state; +public: + String printState(){ + switch(state){ + case Inactive: + return String("Inactive"); + case Waiting: + return String("Waiting"); + case WorkspaceCreated: + return String("WorkspaceCreated"); + case WorkspaceReady: + return String("WorkspaceReady"); + case Running: + return String("Running"); + case Canceled: + return String("Canceled"); + case Finished: + return String("Finished"); + case FinishedAbortedByTimeout: + return String("FinishedAbortedByTimeout"); + case FinishedAbortedByUser: + return String("FinishedAbortedByUser"); + case Done: + return String("Done"); + case DoneWithErrors: + return String("DoneWithErrors"); + case AbortedByTimeout: + return String("AbortedByTimeout"); + case AbortedByUser: + return String("AbortedByUser"); + case Crushed: + return String("Crushed"); + case WrongTestFormat: + return String("WrongTestFormat"); + case InternalError: + return String("InternalError"); + case Queued: + return String("Queued"); + case NoSuchTask: + return String("NoSuchTask"); + case FailedToQueue: + return String("FailedToQueue"); + case AbortingByUser: + return String("AbortingByUser"); + default: + return "?"; + } + } + //-------------->> + long getId(){return id;} + long setId(String * id_s){ + return id=strtol(id_s->getCharArray(), NULL, 10); + } + int getMaxtime(){return maxtime;} + int setMaxtime(String * maxtime_s){ + return maxtime=atoi(maxtime_s->getCharArray()); + } + const String& getWorkspace(){return workspace;} + TaskState getState(){return state;} + TaskState setState(TaskState state_in){return state=state_in;} + Task(Text * lines, int offset){ + setId(lines->get(offset)); + setMaxtime(lines->get(offset+1)); + workspace = packageWorkspace+"/"+String(id); + } + virtual void print()=0; + //- + virtual void prepareWorkspace(){} + virtual String getLaunchScriptText()=0; + virtual String getStartCommand(){ + return workspace+"/run"; + } + + void createWorkspace(){ + Utils::Mkdir(workspace); + } + void createLaunchScript(){ + String launchScriptPath = workspace+"/run"; + String launchScriptText = + String("cd ")+String::DQuotes(workspace)+"\n"+ + getLaunchScriptText(); + File launchScriptFile = File(launchScriptPath, launchScriptText); + Utils::Chmod(launchScriptPath); + } + virtual void Start(){ + + if (kernels<=freeKernels){ + system(getStartCommand().getCharArray()); + state=Running; + //- + busyKernels= Utils::min(busyKernels+kernels, maxKernels); + freeKernels= Utils::max(0, maxKernels-busyKernels); + //- + } + } + virtual void analyseResults(){ + state=Finished; + } + virtual void Check(){ + if (Utils::Exists(workspace+"/DONE")){ + analyseResults(); + }else { + if (Utils::Exists(workspace+"/TIMEOUT")){ + state=AbortedByTimeout; + //todo определить по интервалу времени на вÑÑкий Ñлучай. + }else if (Utils::Exists(workspace+"/INTERRUPT")){ + state=AbortedByUser; + } + } + if (state!=Running){ + //- + busyKernels= Utils::min(busyKernels-kernels, maxKernels); + freeKernels= Utils::max(0, maxKernels-busyKernels); + //- + saveState(); //не нужно. только Ð´Ð»Ñ Ð¾Ñ‚Ð»Ð°Ð´ÐºÐ¸. анализ будет делатьÑÑ Ð°Ñ€Ñ…Ð¸Ð²Ð¾Ð¼. + } + } + virtual void saveState(){ + String stateFile = workspace+"/TaskState"; + File(stateFile, printState()); + } +}; diff --git a/Planner/Text.h b/Planner/Text.h new file mode 100644 index 00000000..d1a57075 --- /dev/null +++ b/Planner/Text.h @@ -0,0 +1,25 @@ +#include "String.h" +#include "Array.h" +#pragma once +class Text: public Array { + public: + void Print(){ + printf("text length=%ld\n", length); + + for (long i=0; igetCharArray()); + // elements[i]->println(); + } + } + bool hasMatch(const String& s){ + + for (long i=0; igetCharArray()); + return true; + } + } + //printf("no matches for [%s]\n", s.getCharArray()); + return false; + } +}; \ No newline at end of file diff --git a/Planner/Utils.h b/Planner/Utils.h new file mode 100644 index 00000000..eb077069 --- /dev/null +++ b/Planner/Utils.h @@ -0,0 +1,49 @@ +#include +#include +#include +#include +#include +#include "String.h" +#pragma once +class Utils { +public: + static int max(int a, int b){ + return (a > b)? a:b; + } + static int min(int a, int b){ + return (a > b)? b:a; + } + static void Mkdir(const String& path){ + mkdir(path.getCharArray(), 0777); + } + //https://stackoverflow.com/questions/4568681/using-chmod-in-a-c-program + static void Chmod(const String& path){ + String command = "chmod 777 "+String::DQuotes(path); + system(command.getCharArray()); + } + //https://stackoverflow.com/questions/230062/whats-the-best-way-to-check-if-a-file-exists-in-c + static bool Exists(const String& path){ + struct stat buffer; + return (stat (path.getCharArray(), &buffer) == 0); + } + static void Sleep(int s){ + usleep(s* 1000000); + } + static void Copy(const String& src, const String& dst){ + String command = "cp "+String::DQuotes(src)+" "+String::DQuotes(dst); + system(command.getCharArray()); + } + static long getAbsoluteTime(){ + return time (NULL); + } + static String getDate(){ + long int ttime; + ttime = time (NULL); + String res(ctime (&ttime)); + return res; + } + static void ZipFolder(const String& src, const String& dst){ + String command = "zip -r "+String::DQuotes(dst)+" "+String::DQuotes(src); + system(command.getCharArray()); + } +}; \ No newline at end of file diff --git a/README.md b/README.md index a17ac84e..8189f484 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ -# VisualSapfor +# Visual_DVM_2020 +Визуализатор 3.0 + +ИнÑÑ‚Ñ€ÑƒÐºÑ†Ð¸Ñ Ð´Ð»Ñ ÑƒÑтановки и наÑтройки Диалоговой обочки https://cloud.mail.ru/public/NDxu/LJJhQgQUG + +Проект SAPFOR FORTRAN https://bitbucket.org/ALEXks/sapfor_2017/src/master/ ++ \ No newline at end of file diff --git a/Thumbs.db b/Thumbs.db new file mode 100644 index 0000000000000000000000000000000000000000..dab64c4450ef8719905a4918d16413858c331d0b GIT binary patch literal 8704 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 literal 0 HcmV?d00001 diff --git a/Visual_DVM_2020.iml b/Visual_DVM_2020.iml new file mode 100644 index 00000000..58652714 --- /dev/null +++ b/Visual_DVM_2020.iml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Visualizer_2.exe b/Visualizer_2.exe new file mode 100644 index 0000000000000000000000000000000000000000..08f77b20fbb4889ed2ee61ee3c7ee652e3ae0342 GIT binary patch literal 361984 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%0AAspouSHque4Cik-r71YdD~i#?u0`-UH|hDmXx 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 objects = new LinkedHashMap<>(); + public static Mode mode; + public static boolean hasUI() { + return Current.mode.equals(Current.Mode.Normal); + } + public static boolean HasProject() { + return get(Project) != null; + } + public static boolean HasFile() { + return get(File) != null; + } + public static boolean HasSelectedFile() { + return get(SelectedFile) != null; + } + public static boolean HasAccount() { + return get(Account) != null; + } + public static boolean HasMachine() { + return get(Machine) != null; + } + public static boolean HasUser() { + return get(User) != null; + } + public static boolean HasCompiler() { + return get(Compiler) != null; + } + public static boolean HasRemoteFile() { + return get(RemoteFile) != null; + } + public static boolean HasMakefile() { + return get(Makefile) != null; + } + public static boolean HasRunConfiguration() { + return get(RunConfiguration) != null; + } + public static boolean HasCompilationTask() { + return get(CompilationTask) != null; + } + public static boolean HasRunTask() { + return get(RunTask) != null; + } + public static boolean HasPassForm() { + return get(PassForm) != null; + } + public static boolean HasProjectView() { + return get(ProjectView) != null; + } + //Ð´Ð»Ñ Ð±Ñ‹Ñтрого доÑтупа на чтение. Ñлишком много на нем завÑзано. + public static db_project_info getProject() { + return (db_project_info) get(Project); + } + public static DBProjectFile getFile() { + return (DBProjectFile) get(File); + } + public static Repository.Component.Component getComponent() { + return (Repository.Component.Component) get(Component); + } + public static Repository.BugReport.BugReport getBugReport() { + return (BugReport) get(BugReport); + } + public static db_project_info getRoot() { + return (db_project_info) get(Root); + } + public static boolean HasRoot() { + return get(Root) != null; + } + public static db_project_info getVersion() { + return (db_project_info) get(Version); + } + public static Account getAccount() { + return (Account) get(Account); + } + public static boolean HasSubscriber() { + return get(Current.Subscriber) != null; + } + public static Repository.Subscribes.Subscriber getSubscriber() { + return (Subscriber) get(Current.Subscriber); + } + public static Machine getMachine() { + return (Machine) get(Current.Machine); + } + public static User getUser() { + return (User) get(Current.User); + } + public static Compiler getCompiler() { + return (Compiler) get(Current.Compiler); + } + public static CompilationTask getCompilationTask() { + return (CompilationTask) get(Current.CompilationTask); + } + public static RunTask getRunTask() { + return (RunTask) get(Current.RunTask); + } + public static RemoteFile getRemoteFile() { + return (RemoteFile) get(Current.RemoteFile); + } + public static Makefile getMakefile() { + return (Makefile) get(Current.Makefile); + } + public static Module getModule() { + return (Module) get(Current.Module); + } + public static RunConfiguration getRunConfiguration() { + return (RunConfiguration) get(Current.RunConfiguration); + } + public static Repository.Component.Sapfor.Sapfor getSapfor() { + return (Repository.Component.Sapfor.Sapfor) get(Current.Sapfor); + } + public static boolean HasGroup() { + return get(Current.Group) != null; + } + public static TestingSystem.Group.Group getGroup() { + return (TestingSystem.Group.Group) get(Current.Group); + } + //-- + public static boolean HasConfiguration() { + return get(Current.Configuration) != null; + } + public static TestingSystem.Configuration.Configuration getConfiguration() { + return (Configuration) get(Current.Configuration); + } + public static SapforConfiguration getSapforConfiguration() { + return (TestingSystem.Sapfor.SapforConfiguration.SapforConfiguration) get(Current.SapforConfiguration); + } + //-- + public static Test getTest() { + return (TestingSystem.Test.Test) get(Current.Test); + } + public static boolean HasTest() { + return get(Current.Test) != null; + } + public static boolean HasVersion() { + return get(Current.Version) != null; + } + public static TestCompilationTask getTestCompilationTask() { + return (TestingSystem.Tasks.TestCompilationTask) get(Current.TestCompilationTask); + } + public static boolean HasTestCompilationTask() { + return get(Current.TestCompilationTask) != null; + } + public static boolean HasTestRunTask() { + return get(Current.TestRunTask) != null; + } + public static TestRunTask getTestRunTask() { + return (TestingSystem.Tasks.TestRunTask) get(Current.TestRunTask); + } + public static RemoteFile getComponentServerBackup() { + return (RemoteFile) get(Current.ComponentServerBackup); + } + public static boolean HasComponentServerBackup() { + return get(Current.ComponentServerBackup) != null; + } + //- + public static boolean HasSapforTasksPackage() { + return get(Current.SapforTasksPackage) != null; + } + public static SapforTasksPackage_2023 getSapforTasksPackage() { + return (SapforTasksPackage_2023) get(Current.SapforTasksPackage); + } + //- + public static DefaultMutableTreeNode getProjectNode() { + return (DefaultMutableTreeNode) get(Current.ProjectNode); + } + public static DefaultMutableTreeNode getProjectCurrentParentNode() { + DefaultMutableTreeNode node = Current.getProjectNode(); + //еÑли в дереве еще никто не выделÑлÑÑ, берем корень. + if (node == null) + return Current.getProject().filesTreeRoot; + return (node.getUserObject() instanceof DBProjectFile) ? (DefaultMutableTreeNode) node.getParent() : node; + } + public static File getSelectedDirectory() { + return (File) get(Current.SelectedDirectory); + } + public static DBProjectFile getSelectedFile() { + return (DBProjectFile) get(Current.SelectedFile); + } + //- + public static boolean HasBugReport() { + return get(Current.BugReport) != null; + } + public static PassForm getPassForm() { + return (Visual_DVM_2021.Passes.UI.PassForm) get(Current.PassForm); + } + public static VisualiserTheme getTheme() { + return (VisualiserTheme) get(Current.Theme); + } + //-------------------------------------------------------------------------------- + public static ParallelRegion getParallelRegion() { + return (ParallelRegion) get(Current.ParallelRegion); + } + public static boolean HasParallelRegion() { + return get(Current.ParallelRegion) != null; + } + public static boolean HasFunction() { + return get(Current.Function) != null; + } + public static boolean HasSelectedFunction() { + return get(Current.SelectedFunction) != null; + } + public static FuncInfo getFunction() { + return (FuncInfo) get(Current.Function); + } + public static FuncInfo getSelectionFunction() { + return (FuncInfo) get(Current.SelectedFunction); + } + public static boolean HasTasksPackage() { + return get(Current.TasksPackage) != null; + } + public static TasksPackage getTasksPackage() { + return (TasksPackage) get(Current.TasksPackage); + } + public static boolean HasScenario() { + return get(Current.Scenario) != null; + } + public static db_project_info getPackageVersion() { + return (db_project_info) get(Current.PackageVersion); + } + public static boolean HasPackageVersion() { + return get(Current.PackageVersion) != null; + } + public static GlobalData.RemoteSapfor.RemoteSapfor getRemoteSapfor() { + return (RemoteSapfor) get(RemoteSapfor); + } + public static boolean HasRemoteSapfor() { + return get(Current.RemoteSapfor) != null; + } + public static boolean HasSapforConfiguration() { + return get(Current.SapforConfiguration) != null; + } + public static boolean HasSapforTask() { + return get(Current.SapforTask) != null; + } + public static SapforTask_2023 getSapforTask() { + return (SapforTask_2023) get(Current.SapforTask); + } + public static ProjectData.ProjectView getProjectView() { + return (ProjectData.ProjectView) get(ProjectView); + } + public static boolean Check(TextLog Log, Current... names) { + for (Current name : names) + if (get(name) == null) + Log.Writeln_(name.getDescription() + " не выбран(а)"); + return Log.isEmpty(); + } + public static void CreateAll() { + for (Current c : values()) + objects.put(c, null); + } + //----------------------------------------- + public static Object get(Current name) { + return objects.get(name); + } + public static Object set(Current name, Object object) { + objects.replace(name, object); + return object; + } + //применÑть только Ð´Ð»Ñ Ð½Ð°Ñледников iDBObject + public static boolean CheckID(Current name, int id) { + return (get(name) != null) && (((iDBObject) get(name)).id == id); + } + public static TestingSystem.Sapfor.SapforConfigurationCommand.SapforConfigurationCommand getSapforConfigurationCommand() { + return (TestingSystem.Sapfor.SapforConfigurationCommand.SapforConfigurationCommand) get(Current.SapforConfigurationCommand); + } + public static boolean HasSapforProfile() { + return get(Current.SapforProfile)!=null; + } + public static GlobalData.SapforProfile.SapforProfile getSapforProfile(){ + return (GlobalData.SapforProfile.SapforProfile) get(Current.SapforProfile); + } + //-------------------------------------------- + public String getDescription() { + switch (this) { + case SapforProfile: + return "Профиль SAPFOR"; + case SapforProfileSetting: + return "ÐаÑтройка Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ SAPFOR"; + case SapforEtalonTaskResult: + return "Задача SAPFOR(Эталон)"; + case SapforTaskResult: + return "Задача SAPFOR"; + case ComponentServerBackup: + return "ВерÑÐ¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð° Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ñервера"; + case Subscriber: + return "ÐдреÑат"; + case SapforTask: + return "Задача SAPFOR"; + case SelectedFunction: + return "Выбранный узел графа процедур"; + case SapforConfigurationCommand: + return "Команда конфигурации теÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ SAPFOR"; + case SapforConfiguration: + return "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñ‚ÐµÑÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ SAPFOR"; + case RemoteSapfor: + return "SAPFOR"; + case PackageVersion: + return "ВерÑÐ¸Ñ Ð¿Ð°ÐºÐµÑ‚Ð½Ð¾Ð³Ð¾ режима"; + case SapforTasksPackage: + return "Пакет задач SAPFOR"; + case TasksPackage: + return "Пакет задач"; + case Credentials: + return "Учётные данные"; + case Function: + return "ФункциÑ"; + case TestRunTask: + return "Задача на запуÑк теÑта"; + case TestCompilationTask: + return "Задача на компилÑцию теÑта"; + case DVMParameterValue: + return "Параметр DVM ÑиÑтемы"; + case ParallelRegion: + return "ОблаÑть раÑпараллеливаниÑ"; + case Group: + return "Группа теÑтов DVM"; + case Scenario: + return "Сценарий"; + case ScenarioCommand: + return "Команда ÑценариÑ"; + case ProjectNode: + return "текущий узел дерева проектов"; //Ñлужебка + case Test: + return "ТеÑÑ‚"; + case Sapfor: + return "SAPFOR"; + case Theme: + return "Тема"; + case EnvironmentValue: + return "Значение переменной окружениÑ"; + case SelectedDirectory: + return "Папка проекта"; + case SelectedFile: + return "Файл проекта"; + case RunConfiguration: + return "ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð·Ð°Ð¿ÑƒÑка"; + case RunTask: + return "Задача на запуÑк"; + case CompilationTask: + return "Задача на компилÑцию"; + case Makefile: + return "Мейкфайл"; + case Module: + return "Языковой модуль мейкфайла"; + case RemoteFile: + return "Удалённый файл"; + case Component: + return "Компонент"; + case Project: + return "Проект"; + case File: + return "Файл"; + case Root: + return "Корень дерева верÑий"; + case Version: + return "ВерÑиÑ"; + case BugReport: + return "Отчёт об ошибке"; + case Account: + return "Ðккаунт"; + case Machine: + return "Машина"; + case User: + return "Пользователь"; + case Compiler: + return "КомпилÑтор"; + case DialogWindow: + return "Диалоговое окно"; + default: + return ""; + } + } + //--- + public enum Mode { + Undefined, + Normal, + Server, + Testing, + Package + } +} diff --git a/src/Common/Database/ColumnType.java b/src/Common/Database/ColumnType.java new file mode 100644 index 00000000..50551850 --- /dev/null +++ b/src/Common/Database/ColumnType.java @@ -0,0 +1,31 @@ +package Common.Database; +public enum ColumnType { + UNDEFINED, + INT, + LONG, + DOUBLE, + STRING; + public static ColumnType valueOf(Class type) { + ColumnType res = UNDEFINED; + try { + res = valueOf(type.getSimpleName().toUpperCase()); + } catch (Exception ignored) { + } + return res; + } + public String getSQLType() { + String res = ""; + switch (this) { + case INT: + case LONG: + res = "INTEGER"; + break; + case DOUBLE: + res = "REAL"; + break; + case STRING: + res = "VARCHAR"; + } + return res; + } +} diff --git a/src/Common/Database/DBObject.java b/src/Common/Database/DBObject.java new file mode 100644 index 00000000..7506e6ea --- /dev/null +++ b/src/Common/Database/DBObject.java @@ -0,0 +1,64 @@ +package Common.Database; +import Common.UI.Selectable; +import Common.Utils.Index; +import Common.Utils.Utils; +import com.sun.org.glassfish.gmbal.Description; + +import java.io.Serializable; +import java.util.Objects; +public abstract class DBObject implements Selectable, Serializable { + // + @Description("IGNORE") + private boolean selected = false; + @Override + public boolean isSelected() { + return selected; + } + @Override + public void select(boolean flag) { + if (selected != flag) { + selected = flag; + Index counter = getSelectionCounter(); + if (Objects.nonNull(counter)) { + if (selected) counter.Inc(); + else counter.Dec(); + } + } + } + // + public Index getSelectionCounter() { + return null; + } + public boolean isVisible() { + return true; + } + public abstract Object getPK(); + public String getBDialogName() { + return Utils.Brackets(getDialogName()); + } + public String getDialogName() { + return getPK().toString(); + } + //ÑтатуÑ. например завершенноÑть багрепорта или ÑоÑтоÑние задачи на запуÑк. как правило обладает цветным шрифтом. + //как объект будут называть по внешним ключам. + public String getFKName() { + return null; + } + public Object getEmptyFK() { + return null; + } + @Override + public String toString() { + return getBDialogName(); + } + //--- + public void SynchronizeFields(DBObject src){ + selected = src.selected; + } + //------ + public DBObject(){} + public DBObject(DBObject src){ + this.SynchronizeFields(src); + } + //--------- +} diff --git a/src/Common/Database/DBTable.java b/src/Common/Database/DBTable.java new file mode 100644 index 00000000..38b0b575 --- /dev/null +++ b/src/Common/Database/DBTable.java @@ -0,0 +1,34 @@ +package Common.Database; +import java.lang.reflect.Field; +public abstract class DBTable extends DataSet { + //- + public DBTableColumn PK = null; + private Database db = null; //база данных - владелец таблицы. + public DBTable(Class k_in, Class d_in) { + super(k_in, d_in); + for (Field field : d.getFields()) { + DBTableColumn column = new DBTableColumn(field); + if ((!column.Ignore) && !columns.containsKey(column.Name)) { + columns.put(column.Name, column); + if (column.PrimaryKey) PK = column; + } + } + } + public Database getDb() { + return db; + } + public void setDb(Database db_in) { + db = db_in; + } + @Override + public String getPKName() { + return PK.Name; + } + @Override + public String toString() { + StringBuilder res = new StringBuilder(Name + "\n"); + for (DBTableColumn c : columns.values()) + res.append(c).append("\n"); + return res.toString(); + } +} diff --git a/src/Common/Database/DBTableColumn.java b/src/Common/Database/DBTableColumn.java new file mode 100644 index 00000000..70d0bc1a --- /dev/null +++ b/src/Common/Database/DBTableColumn.java @@ -0,0 +1,50 @@ +package Common.Database; +import java.lang.annotation.Annotation; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Vector; +public class DBTableColumn { + public String Name = ""; + public ColumnType type = ColumnType.UNDEFINED; + public Vector attributes = new Vector(); + public boolean Ignore = false; + public boolean PrimaryKey = false; + public boolean AutoIncrement = false; + public Object default_value = null; + public DBTableColumn(Field field) { + ExtractAttributes(field); + PrimaryKey = attributes.contains("PRIMARY KEY"); + AutoIncrement = attributes.contains("AUTOINCREMENT"); + Name = field.getName(); + type = (field.getType().isEnum()) ? ColumnType.STRING : ColumnType.valueOf(field.getType()); + Ignore = ((Modifier.isStatic(field.getModifiers()) || + type.equals(ColumnType.UNDEFINED) || + attributes.contains("IGNORE") + ) + ); + } + public String QName() { + return "\"" + Name + "\""; + } + public void ExtractAttributes(Field field) { + attributes = new Vector(); + Annotation[] annotations = field.getAnnotations(); + for (Annotation a : annotations) { + String[] data = a.toString().split("value="); + if (data.length > 1) { + String[] attributes_ = data[1].split("[,\")]"); + for (String attribute : attributes_) { + if (attribute.length() > 0) + attributes.add(attribute); + } + } + } + } + @Override + public String toString() { + String res = QName() + " " + type.getSQLType(); + if (attributes.size() > 0) + res += " " + String.join(" ", attributes); + return res; + } +} diff --git a/src/Common/Database/DataSet.java b/src/Common/Database/DataSet.java new file mode 100644 index 00000000..3d4fc6d7 --- /dev/null +++ b/src/Common/Database/DataSet.java @@ -0,0 +1,253 @@ +package Common.Database; +import Common.Current; +import Common.UI.DataSetControlForm; +import Common.UI.Menus_2023.DataMenuBar; +import Common.UI.Tables.ColumnFilter; +import Common.UI.UI; +import Common.UI.Windows.Dialog.DBObjectDialog; +import Common.UI.Windows.Dialog.DialogFields; +import Common.Utils.TextLog; +import Visual_DVM_2021.UI.Interface.FilterWindow; + +import javax.swing.*; +import java.awt.*; +import java.util.Comparator; +import java.util.LinkedHashMap; +import java.util.Vector; +import java.util.stream.Collectors; +public class DataSet extends DataSetAnchestor { + //- + public static LinkedHashMap selections = new LinkedHashMap<>(); + //- + public String Name; + public Class k; //клаÑÑ Ð¿ÐµÑ€Ð²Ð¸Ñ‡Ð½Ð¾Ð³Ð¾ ключа. + public Class d; //клаÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð². + public LinkedHashMap Data = new LinkedHashMap<>(); //наполнение + //- + // + public DataSetControlForm ui_; + protected FilterWindow f_ui; + // + //- + public LinkedHashMap columnsFilters = new LinkedHashMap<>(); + public DataSet(Class k_in, Class d_in) { + k = k_in; + d = d_in; + Name = d.getSimpleName(); + } + public void mountUI(JPanel content_in) { + UI.Clear(content_in); + //--> + ui_ = createUI(); + ui_.setContent(content_in); + //--> + if (UI.menuBars.containsKey(getClass())) { + DataMenuBar bar = UI.menuBars.get(getClass()); + content_in.add(bar, BorderLayout.NORTH); + setFilterUI(count -> UI.menuBars.get(getClass()).countLabel.setText(String.valueOf(count))); + if (ui_.hasCheckBox()) + bar.createSelectionButtons(this); + } + content_in.add(ui_.getDataPanel(), BorderLayout.CENTER); + } + public DataSetControlForm getUi() { + return ui_; + } + public void setFilterUI(FilterWindow ui_in) { + f_ui = ui_in; + } + public void ShowUI() { + if (ui_ != null) { + ui_.Show(); + if (f_ui != null) + f_ui.ShowMatchesCount(getRowCountUI()); + } + } + public void ShowUI(Object key) { + if (ui_ != null) { + ui_.Show(key); + if (f_ui != null) + f_ui.ShowMatchesCount(getRowCountUI()); + } + } + public void ClearUI() { + if ((ui_ != null) && ui_.isShown()) { + ui_.ClearSelection(); + ui_.Clear(); + if (f_ui != null) + f_ui.ShowNoMatches(); + } + } + public void RefreshUI() { + if (ui_ != null) ui_.Refresh(); + } + public int getRowCountUI() { + return ui_.getRowCount(); + } + public void SetCurrentObjectUI(Object pk) { + if (ui_ != null) { + //todo возможно проверить, что текущий объект уже ÑоответÑтвует ключу, и еÑли да, то ничего делать. + ui_.ClearSelection(); //ÑÐ±Ñ€Ð¾Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ объекта и вÑего что Ñ Ð½Ð¸Ð¼ ÑвÑзано. + ui_.Select(pk); + } + } + //Ñтолбы/ потом переименовать обратно в getUIColumnNames.ÑÐµÐ¹Ñ‡Ð°Ñ Ñ‚Ð°Ðº Ð´Ð»Ñ ÑкороÑти переноÑа. + public String[] getUIColumnNames() { + return new String[]{}; + } + protected DataSetControlForm createUI() { + return null; + } + public boolean hasUI() { + return ui_ != null; + } + public void CheckAll(boolean flag) { + for (D object : Data.values()) { + if (object.isVisible()) + object.Select(flag); + } + RefreshUI(); + } + public D getFirstRecord() { + return Data.values().stream().findFirst().orElse(null); + } + public Vector getOrderedRecords(Comparator comparator) { + Vector res = new Vector<>(Data.values()); + res.sort(comparator); + return res; + } + @SuppressWarnings("unchecked") + public DBObjectDialog getDialog() { + return null; + } + public boolean ShowAddObjectDialog(DBObject object) { + return getDialog().ShowDialog(getSingleDescription() + ": добавление", object); + } + public boolean ShowEditObjectDialog(DBObject object) { + DBObjectDialog dialog = getDialog(); + dialog.edit = true; + dialog.SetEditLimits(); + return dialog.ShowDialog(getSingleDescription() + ": редактирование", object); + } + public boolean ViewObject(DBObject object) { + DBObjectDialog dialog = getDialog(); + dialog.SetReadonly(); + dialog.ShowDialog(getSingleDescription() + ": проÑмотр", object); + return false; + } + public boolean ShowDeleteObjectDialog(DBObject object) { + return UI.Warning(getSingleDescription() + " " + object.getBDialogName() + " будет удален(а)"); + } + public String QName() { + return "\"" + Name + "\""; + } + public String getPKName() { + return ""; + } //получить Ð¸Ð¼Ñ ÐºÐ»ÑŽÑ‡ÐµÐ²Ð¾Ð³Ð¾ полÑ. нужно Ð´Ð»Ñ Ñ‚Ð°Ð±Ð»Ð¸Ñ†. + public String getPluralDescription() { + return ""; + } + public String getSingleDescription() { + return ""; + } + //времÑнки + public Current CurrentName() { + return Current.Undefined; + } + public boolean CheckCurrent(TextLog log) { + return Current.Check(log, CurrentName()); + } + public boolean hasCurrent() { + return Current.get(CurrentName()) != null; + } + public void dropCurrent() { + Current.set(CurrentName(), null); + } + public D getCurrent() { + return (D) Current.get(CurrentName()); + } + public void setCurrent(D o) { + Current.set(CurrentName(), o); + } + //- + public void put(Object key, D object) { + Data.put((K) key, object); + } + public D get(Object key) { + return Data.get(key); + } + public Object getFieldAt(D object, int columnIndex) { + return null; + } + public void clear() { + Data.clear(); + } + public int size() { + return Data.size(); + } + public boolean containsKey(Object key) { + return Data.containsKey(key); + } + //- + public Vector getVisibleKeys() { + Comparator comparator = getComparator(); + Vector res = new Vector<>(); + if (comparator == null) { + for (K key : Data.keySet()) + if (Data.get(key).isVisible()) + res.add(key); + } else { + Vector raw = new Vector<>(); + for (D object : Data.values()) { + if (object.isVisible()) + raw.add(object); + } + raw.sort(comparator); + for (D object : raw) + res.add((K) object.getPK()); + } + return res; + } + protected Comparator getComparator() { + return null; + } + public int getCheckedCount() { + return (int) Data.values().stream().filter(d -> d.isVisible() && d.isSelected()).count(); + } + public Vector getCheckedItems() { + return Data.values().stream().filter(d -> d.isVisible() && d.isSelected()).collect(Collectors.toCollection(Vector::new)); + } + public Vector getCheckedKeys() { + return Data.values().stream().filter(DBObject::isSelected).map(d -> (K) d.getPK()).collect(Collectors.toCollection(Vector::new)); + } + //-- + public void SaveLastSelections() { + if (hasUI()) { + Object lastPk = null; + if ((CurrentName() != Current.Undefined) && (getCurrent() != null)) + lastPk = getCurrent().getPK(); + if (!selections.containsKey(getClass())) + selections.put(getClass(), lastPk); + else selections.replace(getClass(), lastPk); + } + } + public void RestoreLastSelections() { + if (hasUI()) { + Object lastPk = selections.get(getClass()); + // if (lastPk != null) UI.Info(this.getClass() + ":" + lastPk.toString()); + if ((CurrentName() != Current.Undefined) && (lastPk != null)) { + // UI.Info(lastPk.toString()); + // System.out.println(ui); + // UI.Info("+"); + ui_.Select(lastPk); + } + } + } + //--- + // применить значение фильтра к фильру объекта напирмер Message.filterValue = text; + public void changeColumnFilterValue(int columnIndex, String text) { + } + public Object getColumnFilterValue(int columnIndex) { + return ""; + } +} diff --git a/src/Common/Database/DataSetAnchestor.java b/src/Common/Database/DataSetAnchestor.java new file mode 100644 index 00000000..99730376 --- /dev/null +++ b/src/Common/Database/DataSetAnchestor.java @@ -0,0 +1,11 @@ +package Common.Database; +import java.util.LinkedHashMap; +public abstract class DataSetAnchestor { + //чтобы обмануть Ñтирание типов во вÑех параметризованных полÑÑ…. иÑпользуетÑÑ Ð½Ðµ во вÑех потомках. + //ибо не вÑе наборы данных отноÑÑÑ‚ÑÑ Ðº базам. + public LinkedHashMap columns = new LinkedHashMap<>(); + //то же Ñамое. на Ñамом деле внешние ключи бывают только у таблиц бд + public LinkedHashMap, FKBehaviour> getFKDependencies() { + return new LinkedHashMap<>(); + } +} diff --git a/src/Common/Database/Database.java b/src/Common/Database/Database.java new file mode 100644 index 00000000..405ea182 --- /dev/null +++ b/src/Common/Database/Database.java @@ -0,0 +1,274 @@ +package Common.Database; +import Common.Global; +import Common.Utils.Utils; +import Repository.RepositoryRefuseException; + +import java.io.File; +import java.util.LinkedHashMap; +import java.util.Vector; +//Ñамый общий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð±Ð°Ð·Ñ‹ данных, незавиÑимо от реализации. +public abstract class Database { + //------------------------------ + public LinkedHashMap, DBTable> tables = new LinkedHashMap<>(); //таблицы + protected File file = null; + public Database(File file_in) { + file = file_in; + } + public File getFile() { + return file; + } + public void setFile(File file_in) { + file = file_in; + } + // + public void Connect() throws Exception { + // UI.Print(DebugPrintLevel.Database, "Ñоединение Ñ Ð±Ð°Ð·Ð¾Ð¹ данных " + file.getAbsolutePath()); + connect(); + } + public void prepareTablesStatements() throws Exception { + } + public void Disconnect() throws Exception { + // UI.Print(DebugPrintLevel.Database, "закрытие ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ñ Ð±Ð°Ð·Ð¾Ð¹ данных " + file.getAbsolutePath()); + disconnect(); + } + public void BeginTransaction() throws Exception { + // UI.Print(DebugPrintLevel.Database, "BEGIN TRANSACTION:"); + beginTransaction(); + } + public void Commit() throws Exception { + // UI.Print(DebugPrintLevel.Database, "COMMIT"); + commit(); + } + public void CreateAllTables() throws Exception { + BeginTransaction(); + initAllTables(); // вÑе Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ñ‹Ñ… таблиц - туть. + for (DBTable table : tables.values()) { + CreateTable(table); + table.setDb(this); + } + Commit(); + } + //Ñхема как Ñ Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð°Ð¼Ð¸. в методе initAllTables добавлÑем вÑе таблицы через уникальные конÑтрукторы + public void addTable(DBTable table) { + tables.put(table.d, table); + } + public void Synchronize() throws Exception { + BeginTransaction(); + for (DBTable table : tables.values()) + LoadAll(table); + Init(); //Ð¿ÐµÑ€ÐµÐ³Ñ€ÑƒÐ¶Ð°ÐµÐ¼Ð°Ñ Ñ‡Ð°Ñть Ñинхронизации. + Commit(); + } + public void LoadAllTablesWithoutInit() throws Exception { + BeginTransaction(); + for (DBTable table : tables.values()) + LoadAll(table); + Commit(); + } + public void LoadAll(DBTable table) throws Exception { + table.Data.clear(); + loadAll(table); + } + public DBObject Insert(DBObject o) throws Exception { + DBTable table = tables.get(o.getClass()); + insert(table, o); + table.Data.put(o.getPK(), o); + return o; + } + public DBObject InsertWithCheck(DBObject o) throws Exception { + DBTable table = tables.get(o.getClass()); + if (!table.Data.containsKey(o.getPK())) { + insert(table, o); + table.Data.put(o.getPK(), o); + } else + throw new RepositoryRefuseException("Таблица " + Utils.Brackets(table.Name) + " уже Ñодержит объект Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ " + Utils.Brackets(o.getPK().toString())); + return o; + } + public DBObject InsertWithCheck_(DBObject o) throws Exception { + DBTable table = tables.get(o.getClass()); + if (!table.Data.containsKey(o.getPK())) { + insert(table, o); + table.Data.put(o.getPK(), o); + return o; + } + return null; + } + // не работает Ñ Ð°Ð²Ñ‚Ð¾Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð¾Ð¼. + public DBObject UpdateWithCheck(DBObject to_update) throws Exception { + DBTable table = tables.get(to_update.getClass()); + if (table.Data.containsKey(to_update.getPK())) { + DBObject o = (DBObject) table.Data.get(to_update.getPK()); + o.SynchronizeFields(to_update); + update(table, o); + return o; + } else { + insert(table, to_update); + table.Data.put(to_update.getPK(), to_update); + return to_update; + } + } + public DBObject DeleteWithCheck(DBObject to_delete) throws Exception { + DBTable table = tables.get(to_delete.getClass()); + if (table.Data.containsKey(to_delete.getPK())) { + DBObject o = (DBObject) table.Data.get(to_delete.getPK()); + delete(table, o); + table.Data.remove(o.getPK()); + return o; + } else + throw new RepositoryRefuseException("Таблица " + Utils.Brackets(table.Name) + " не Ñодержит объект Ñ ÐºÐ»ÑŽÑ‡Ð¾Ð¼ " + Utils.Brackets(to_delete.getPK().toString())); + } + // не работает Ñ Ð°Ð²Ñ‚Ð¾Ð¸Ð½ÐºÑ€ÐµÐ¼ÐµÐ½Ñ‚Ð¾Ð¼. + public DBObject getObjectCopyByPK(Class table_class, Object pk) throws Exception { + DBTable table = tables.get(table_class); + Object res_ = table_class.newInstance(); + DBObject res = (DBObject) res_; + if (table.Data.containsKey(pk)) { + DBObject original = (DBObject) table.Data.get(pk); + res.SynchronizeFields(original); + } else { + table_class.getField(table.getPKName()).set(res, pk); //инче проÑто Ñинхроним пк. и вÑтавлÑем + insert(table, res); + } + return res; + } + public boolean checkObjectExistense(Class table_class, Object pk) throws Exception { + DBTable table = tables.get(table_class); + return table.containsKey(pk); + } + public Vector getObjectsCopies(Class table_class, Vector keys) { + Vector res = new Vector<>(); + DBTable table = tables.get(table_class); + for (Object key : keys) + if (table.containsKey(key)) + res.add(table.Data.get(key)); + return res; + } + public void Delete(DBObject o) throws Exception { + DBTable table = tables.get(o.getClass()); + delete(table, o); + table.Data.remove(o.getPK()); + } + public void DeleteAll(Class c) throws Exception { + DBTable table = tables.get(c); + deleteAll(table); + table.Data.clear(); + } + //не вполне обычный Ñлучай. подразумеваетÑÑ Ñ‡Ñ‚Ð¾ поле объекта изменено + //Ñтот же метод закреплÑет изменение в бд + //в дальнейшем возможно Ñделать новое значение Ð¿Ð¾Ð»Ñ 2 параметром метода? + public void Update(DBObject o) throws Exception { + DBTable table = tables.get(o.getClass()); + update(table, o); + } + public void ResetAI(Class c) throws Exception { + resetAI(tables.get(c)); + } + // + // + public Vector getVectorByFK(O owner, Class fk_class) { + Vector res = new Vector<>(); + try { + for (Object o : tables.get(fk_class).Data.values()) { + if (fk_class.getField(owner.getFKName()).get(o).equals(owner.getPK())) res.add((DBObject) o); + } + } catch (Exception e) { + Global.Log.PrintException(e); + } + return res; + } + public void DeleteByFK(DBObject master, Class fk_class) throws Exception { + Vector to_delete = getVectorByFK(master, fk_class); + BeginTransaction(); + for (DBObject object : to_delete) + Delete(object); + Commit(); + } + //----------- + public void DropByFK(DBObject master, Class fk_class) throws Exception { + Vector to_drop = getVectorByFK(master, fk_class); + BeginTransaction(); + for (DBObject object : to_drop) { + fk_class.getField(master.getFKName()).set(object, master.getEmptyFK()); + Update(object); + } + Commit(); + } + public LinkedHashMap getMapByFK(O owner, Class fk_class, Class key_class) { + LinkedHashMap res = new LinkedHashMap<>(); + try { + for (Object o : tables.get(fk_class).Data.values()) { + F f = (F) o; + if (fk_class.getField(owner.getFKName()).get(f).equals(owner.getPK())) res.put((K) f.getPK(), f); + } + } catch (Exception e) { + Global.Log.PrintException(e); + } + return res; + } + public LinkedHashMap getMapByFKi(O owner, Class fk_class) { + return getMapByFK(owner, fk_class, java.lang.Integer.class); + } + //- + public Vector getVectorStringByFK(O owner, Class fk_class) { + Vector res = new Vector<>(); + try { + for (Object o : tables.get(fk_class).Data.values()) { + if (fk_class.getField(owner.getFKName()).get(o).equals(owner.getPK())) res.add(o.toString()); + } + } catch (Exception e) { + Global.Log.PrintException(e); + } + return res; + } + //безопаÑное получение объекта по первичному ключу. + public O getByPK(Class class_in, Object pk, Object undefined_pk) { + return ((!pk.equals(undefined_pk)) && tables.get(class_in).Data.containsKey(pk)) ? + (O) (tables.get(class_in).Data.get(pk)) : null; + } + public O getById(Class class_in, int pk) { + return getByPK(class_in, pk, Utils.Nan); + } + public LinkedHashMap getByFKAndGroupBy(O owner, Class fk_class, String group_field, Class group_class) { + LinkedHashMap res = new LinkedHashMap<>(); + try { + for (Object o : tables.get(fk_class).Data.values()) { + F f = (F) o; + if (fk_class.getField(owner.getFKName()).get(f).equals(owner.getPK())) + res.put((G) (fk_class.getField(group_field).get(f)), f); + } + } catch (Exception e) { + Global.Log.PrintException(e); + } + return res; + } + // + // + //- + protected abstract void connect() throws Exception; + protected abstract void disconnect() throws Exception; + //- + protected abstract void beginTransaction() throws Exception; + protected abstract void commit() throws Exception; + //- + protected abstract boolean TableExists(DBTable table) throws Exception; + protected abstract void CreateTable(DBTable table) throws Exception; + protected abstract void loadAll(DBTable table) throws Exception; + protected abstract void initAllTables() throws Exception; + //Ð¿ÐµÑ€ÐµÐ³Ñ€ÑƒÐ¶Ð°ÐµÐ¼Ð°Ñ Ñ‡Ð°Ñть Ñинхронизации + public void Init() throws Exception { + } + protected abstract void insert(DBTable table, DBObject o) throws Exception; + protected abstract void delete(DBTable table, DBObject o) throws Exception; + protected abstract void deleteAll(DBTable table) throws Exception; + protected abstract void update(DBTable table, DBObject o) throws Exception; + protected abstract void resetAI(DBTable table) throws Exception; + //- + public void SaveLastSelections() { + for (DataSet dataSet : tables.values()) + dataSet.SaveLastSelections(); + } + public void RestoreLastSelections() { + for (DataSet dataSet : tables.values()) + dataSet.RestoreLastSelections(); + } +} diff --git a/src/Common/Database/FKBehaviour.java b/src/Common/Database/FKBehaviour.java new file mode 100644 index 00000000..b0d28f0f --- /dev/null +++ b/src/Common/Database/FKBehaviour.java @@ -0,0 +1,9 @@ +package Common.Database; +public class FKBehaviour { + public FKDataBehaviour data; //поведение данных внешнего ключа при удалении/модификации + public FKCurrentObjectBehaviuor ui; //поведение интерфейÑов таблиц внешнего ключа при показе текущего объекта. + public FKBehaviour(FKDataBehaviour data_in, FKCurrentObjectBehaviuor ui_in) { + data = data_in; + ui = ui_in; + } +} diff --git a/src/Common/Database/FKCurrentObjectBehaviuor.java b/src/Common/Database/FKCurrentObjectBehaviuor.java new file mode 100644 index 00000000..3e457eb5 --- /dev/null +++ b/src/Common/Database/FKCurrentObjectBehaviuor.java @@ -0,0 +1,5 @@ +package Common.Database; +public enum FKCurrentObjectBehaviuor { + PASSIVE, + ACTIVE +} diff --git a/src/Common/Database/FKDataBehaviour.java b/src/Common/Database/FKDataBehaviour.java new file mode 100644 index 00000000..8ba134e8 --- /dev/null +++ b/src/Common/Database/FKDataBehaviour.java @@ -0,0 +1,7 @@ +package Common.Database; +//поведение таблиц имеющих внешние ключи +public enum FKDataBehaviour { + NONE, + DROP, + DELETE +} diff --git a/src/Common/Database/SQLITE/SQLiteDatabase.java b/src/Common/Database/SQLITE/SQLiteDatabase.java new file mode 100644 index 00000000..0449b873 --- /dev/null +++ b/src/Common/Database/SQLITE/SQLiteDatabase.java @@ -0,0 +1,261 @@ +package Common.Database.SQLITE; +import Common.Database.DBObject; +import Common.Database.DBTable; +import Common.Database.DBTableColumn; +import Common.Database.Database; +import Common.UI.UI; +import Common.Utils.Utils; +import Visual_DVM_2021.Passes.PassException; +import javafx.util.Pair; + +import java.io.File; +import java.sql.*; +import java.util.LinkedHashMap; +import java.util.Vector; + +import static Common.Utils.Utils.requireNonNullElse; +public abstract class SQLiteDatabase extends Database { + protected Connection conn = null; + protected Statement statement = null; + protected ResultSet resSet = null; + public LinkedHashMap, PreparedStatement> insertStatements = new LinkedHashMap<>(); + public LinkedHashMap, PreparedStatement> updateStatements = new LinkedHashMap<>(); + public LinkedHashMap, PreparedStatement> deleteStatements = new LinkedHashMap<>(); + //->> + public SQLiteDatabase(File file_in) { + super(file_in); + } + @Override + protected void connect() throws Exception { + Class.forName("org.sqlite.JDBC"); + for (int i = 0; i < 5; ++i) { + try { + conn = DriverManager.getConnection("jdbc:sqlite:" + file.getAbsolutePath()); + break; + } catch (Exception ex) { + ex.printStackTrace(); + conn = null; + System.gc(); + Utils.sleep(2000); + } + } + if (conn == null) + throw new PassException("ВнутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ° sqlite. Ðе удалоÑÑŒ уÑтановить Ñоединение за 5 попыток."); + statement = conn.createStatement(); + } + @Override + protected void disconnect() throws Exception { + if (conn != null) { + conn.close(); + conn = null; + } + if (statement != null) { + statement.close(); + statement = null; + } + if (resSet != null) { + resSet.close(); + resSet = null; + } + for (PreparedStatement preparedStatement : insertStatements.values()) { + if (preparedStatement != null) + preparedStatement.close(); + } + for (PreparedStatement preparedStatement : updateStatements.values()) { + if (preparedStatement != null) + preparedStatement.close(); + } + for (PreparedStatement preparedStatement : deleteStatements.values()) { + if (preparedStatement != null) + preparedStatement.close(); + } + insertStatements.clear(); + updateStatements.clear(); + deleteStatements.clear(); + //-->> + System.gc(); + //->> + } + @Override + protected void beginTransaction() throws Exception { + conn.setAutoCommit(false); + } + @Override + protected void commit() throws Exception { + conn.commit(); + conn.setAutoCommit(true); + } + @Override + protected boolean TableExists(DBTable table) throws Exception { + int count = 0; + resSet = statement.executeQuery("SELECT count(*) FROM 'sqlite_master' WHERE type=\"table\" AND name=" + table.QName()); + if (resSet.next()) + count = resSet.getInt(1); + return count > 0; + } + @Override + public void CreateTable(DBTable table) throws Exception { + if (table.columns.size() > 0) { + if (TableExists(table)) { + Vector existing_columns = new Vector<>(); + Vector columns_to_create = new Vector<>(); + //предполагаем что первичный ключ и атрибуты не изменÑÑ‚ÑÑ. + //и что не будет Ñтолбов Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼Ð¸ именами но разными типами. + resSet = statement.executeQuery("pragma table_info(" + table.QName() + ")"); + while (resSet.next()) + existing_columns.add(resSet.getString(2)); + //- + for (String target_column : table.columns.keySet()) { + if (!existing_columns.contains(target_column)) + columns_to_create.add(target_column); + } + for (String cn : columns_to_create) + statement.execute("ALTER TABLE " + table.QName() + " ADD COLUMN " + table.columns.get(cn)); + } else { + String cmd = "CREATE TABLE if not exists " + table.QName() + " "; + Vector columns_names = new Vector<>(); + for (DBTableColumn column : table.columns.values()) + columns_names.add(column.toString()); + cmd += Utils.RBrackets(String.join(",", columns_names)); + statement.execute(cmd); + } + } + } + @Override + public void prepareTablesStatements() throws Exception { + for (DBTable table : tables.values()) { + //--- + Vector column_names = new Vector<>(); + Vector column_values = new Vector<>(); + for (DBTableColumn column : table.columns.values()) { + if (!column.AutoIncrement) { + column_names.add(column.QName()); + column_values.add("?"); + } + } + insertStatements.put(table.d, conn.prepareStatement( + "INSERT OR REPLACE INTO " + table.QName() + " " + + Utils.RBrackets(String.join(",", column_names)) + " " + "VALUES " + + Utils.RBrackets(String.join(",", column_values)))); + //------------------------------------------------------------------------------->> + Vector new_values = new Vector(); + for (DBTableColumn column : table.columns.values()) { + if (!column.AutoIncrement) { + new_values.add(column.QName() + "=?"); + } + } + updateStatements.put(table.d, conn.prepareStatement( + "UPDATE " + table.QName() + " " + + "SET " + String.join(",", new_values) + " " + + "WHERE (" + table.PK.QName() + "=?)" + )); + //---------------------------------------------------------------------------------->>> + deleteStatements.put(table.d, conn.prepareStatement("DELETE FROM " + table.QName() + " WHERE " + table.PK.QName() + " = ?")); + } + } + @Override + protected void delete(DBTable table, DBObject o) throws Exception { + PreparedStatement ps = deleteStatements.get(table.d); + ps.setObject(1, o.getPK()); + ps.executeUpdate(); + } + protected Pair readRecord(DBTable table) throws Exception { + D o = table.d.newInstance(); + for (DBTableColumn column : table.columns.values()) { + Object field_value = null; + switch (column.type) { + case DOUBLE: + field_value = requireNonNullElse(resSet.getDouble(column.Name), 0); + break; + case UNDEFINED: + break; + case INT: + field_value = requireNonNullElse(resSet.getInt(column.Name), 0); + break; + case LONG: + field_value = requireNonNullElse(resSet.getLong(column.Name), 0); + break; + case STRING: + if (table.d.getField(column.Name).getType().isEnum()) { + Class enum_class = Class.forName(table.d.getField(column.Name).getType().getName()); + String string = resSet.getString(column.Name); + Object[] enum_constants = enum_class.getEnumConstants(); + if (string != null) { + try { + field_value = Enum.valueOf(enum_class, string); + } catch (Exception ignore) { + System.out.println(Utils.Brackets(string) + "not found"); + field_value = enum_constants[0]; + System.out.println(field_value); + } + } else field_value = enum_constants[0]; + } else + field_value = requireNonNullElse(resSet.getString(column.Name), ""); + break; + } + if (field_value != null) { + table.d.getField(column.Name).set(o, field_value); + } else + throw new PassException("Ошибка при загрузке Ð¿Ð¾Ð»Ñ " + Utils.Brackets(column.Name) + " клаÑÑа " + Utils.Brackets(table.d.getSimpleName())); + } + return new Pair<>((K) o.getPK(), o); + } + @Override + protected void loadAll(DBTable table) throws Exception { + resSet = statement.executeQuery("SELECT * FROM " + table.QName()); + while (resSet.next()) { + Pair record = readRecord(table); + table.Data.put(record.getKey(), record.getValue()); + } + } + @Override + protected void insert(DBTable table, DBObject o) throws Exception { + PreparedStatement ps = insertStatements.get(table.d); + if (ps == null) + UI.Info("INSERT NULL"); + int i = 1; + for (DBTableColumn column : table.columns.values()) { + if (!column.AutoIncrement) { + ps.setObject(i, o.getClass().getField(column.Name).get(o)); + ++i; + } + } + ps.execute(); + //--> + for (DBTableColumn column : table.columns.values()) { + if (column.AutoIncrement) { + resSet = statement.executeQuery("SELECT MAX(" + column.QName() + ") AS LAST FROM " + table.QName()); + String maxId = resSet.getString("LAST"); + int intMaxId = Integer.parseInt(maxId); + o.getClass().getField(column.Name).set(o, intMaxId); + break; + } + } + } + @Override + protected void update(DBTable table, DBObject o) throws Exception { + PreparedStatement ps = updateStatements.get(table.d); + if (ps == null) + UI.Info("UPDATE NULL"); + int i = 1; + for (DBTableColumn column : table.columns.values()) { + if (!column.AutoIncrement) { + ps.setObject(i, o.getClass().getField(column.Name).get(o)); + ++i; + } + } + ps.setObject(i, o.getPK()); + ps.executeUpdate(); + } + @Override + protected void deleteAll(DBTable table) throws Exception { + statement.executeUpdate("DELETE FROM " + table.QName()); + } + @Override + protected void resetAI(DBTable table) throws Exception { + statement.executeUpdate("UPDATE SQLITE_SEQUENCE SET SEQ = 0 WHERE NAME =" + table.QName()); + } + //-- + //https://stackoverflow.com/questions/8558099/sqlite-query-with-byte-where-clause + +} \ No newline at end of file diff --git a/src/Common/Database/TableFilter.java b/src/Common/Database/TableFilter.java new file mode 100644 index 00000000..e4e61865 --- /dev/null +++ b/src/Common/Database/TableFilter.java @@ -0,0 +1,43 @@ +package Common.Database; +import Common.UI.Menus_2023.StableMenuItem; +import Common.Utils.Utils; + +import javax.swing.*; +public class TableFilter { + DataSet table; + public JMenuItem menuItem; //пункт меню фильтра. ( возможно потом Ñделать и кнопку) + String description; + boolean active = false; //включен ли фильтр + public int count = 0; + protected boolean validate(D object) { + return true; + } + public boolean Validate(D object) { + boolean valid; + if (valid=validate(object)) + count++; + return !active || valid; + } + static String getNotActiveIconPath() { + return "/icons/NotPick.png"; + } + static String getActiveIconPath() { + return "/icons/Pick.png"; + } + public TableFilter(DataSet table_in, String description_in) { + table = table_in; + menuItem = new StableMenuItem((description = description_in)+" (0)"); + menuItem.addActionListener(e -> { + active = !active; + Mark(); + table.ShowUI(); + }); + Mark(); + } + public void Mark() { + menuItem.setIcon(Utils.getIcon(active ? getActiveIconPath() : getNotActiveIconPath())); + } + public void ShowDescriptionAndCount() { + menuItem.setText(description + " " + Utils.RBrackets(count)); + } +} diff --git a/src/Common/Database/iDBObject.java b/src/Common/Database/iDBObject.java new file mode 100644 index 00000000..beefc57e --- /dev/null +++ b/src/Common/Database/iDBObject.java @@ -0,0 +1,30 @@ +package Common.Database; +import Common.Utils.Utils; +import com.sun.org.glassfish.gmbal.Description; +//автоинкрементальный ключ +public class iDBObject extends DBObject { + @Description("PRIMARY KEY,AUTOINCREMENT") + public int id; + @Override + public Object getPK() { + return id; + } + @Override + public String getFKName() { + return getClass().getSimpleName().toLowerCase() + "_id"; + } + @Override + public Object getEmptyFK() { + return Utils.Nan; + } + //--- + @Override + public void SynchronizeFields(DBObject src) { + super.SynchronizeFields(src); + id = ((iDBObject)src).id; + } + public iDBObject(){} + public iDBObject(iDBObject src){ + this.SynchronizeFields(src); + } +} diff --git a/src/Common/Database/iDBTable.java b/src/Common/Database/iDBTable.java new file mode 100644 index 00000000..5c1ac4c5 --- /dev/null +++ b/src/Common/Database/iDBTable.java @@ -0,0 +1,6 @@ +package Common.Database; +public abstract class iDBTable extends DBTable { + public iDBTable(Class d_in) { + super(Integer.class, d_in); + } +} diff --git a/src/Common/Database/nDBObject.java b/src/Common/Database/nDBObject.java new file mode 100644 index 00000000..99c1880a --- /dev/null +++ b/src/Common/Database/nDBObject.java @@ -0,0 +1,35 @@ +package Common.Database; +import Common.Utils.Utils; +import com.sun.org.glassfish.gmbal.Description; +public abstract class nDBObject extends DBObject { + String getClassNameL() { + return getClass().getSimpleName().toLowerCase(); + } + @Description("PRIMARY KEY, UNIQUE") + public String id = ""; + @Override + public Object getPK() { + return id; + } + @Override + public String getFKName() { + return getClassNameL() + "_id"; + } + @Override + public Object getEmptyFK() { + return ""; + } + public void genName() { + id = Utils.getDateName(getClassNameL()); + } + //- + @Override + public void SynchronizeFields(DBObject src) { + super.SynchronizeFields(src); + id = ((nDBObject)src).id; + } + public nDBObject(nDBObject src){ + this.SynchronizeFields(src); + } + public nDBObject(){} +} diff --git a/src/Common/Database/rDBObject.java b/src/Common/Database/rDBObject.java new file mode 100644 index 00000000..d6eb5cc5 --- /dev/null +++ b/src/Common/Database/rDBObject.java @@ -0,0 +1,32 @@ +package Common.Database; +import java.util.Date; +//объект репозиториÑ. ключ имÑ, и еÑть данные отправителÑ. +public class rDBObject extends nDBObject { + public String sender_name = ""; + public String sender_address = ""; + public String description = ""; + //- + public long date = 0; + public long change_date; + public Date getDate() { + return new Date(date); + } + public Date getChangeDate() { + return new Date(change_date); + } + @Override + public void SynchronizeFields(DBObject src) { + super.SynchronizeFields(src); + rDBObject r = (rDBObject) src; + sender_name = r.sender_name; + sender_address = r.sender_address; + description = r.description; + date = r.date; + change_date = r.change_date; + } + public rDBObject(rDBObject src) { + this.SynchronizeFields(src); + } + public rDBObject() { + } +} diff --git a/src/Common/Global.java b/src/Common/Global.java new file mode 100644 index 00000000..a01fd5d5 --- /dev/null +++ b/src/Common/Global.java @@ -0,0 +1,403 @@ +package Common; +import Common.Database.DataSet; +import Common.UI.Menus_2023.ComponentsMenuBar.ComponentsMenuBar; +import Common.UI.UI; +import Common.Utils.Utils; +import GlobalData.GlobalDatabase; +import GlobalData.Settings.DBSetting; +import GlobalData.Settings.SettingName; +import ProjectData.ProjectView; +import Repository.Component.*; +import Repository.Component.PerformanceAnalyzer.PerformanceAnalyzer; +import Repository.Component.Sapfor.MessagesServer; +import Repository.Component.Sapfor.Sapfor_F; +import Repository.Component.Sapfor.TransformationPermission; +import Repository.Server.ComponentsServer; +import TestingSystem.TestingServer; +import Visual_DVM_2021.Passes.All.PerformSapforTasksPackage; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +import Visual_DVM_2021.UI.Interface.Loggable; +import org.apache.commons.io.FileUtils; +import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory; +import org.fife.ui.rsyntaxtextarea.TokenMakerFactory; + +import java.io.File; +import java.nio.charset.Charset; +import java.nio.file.Paths; +import java.util.Vector; +public class Global { + //кронтаб и перезагрузка + //https://snipp.ru/raznoe/crontab + // /var/spool/cron/crontabs/testuser что менÑть + //https://saribzhanov.ru/tehno/perezagruzka-ubuntu-po-cron/ //раз в Ñутки + //testuser ALL=NOPASSWD:/sbin/reboot + //0 2 2,15 * * reboot &>/var/log/reboot.log + //https://unix.stackexchange.com/questions/117148/how-can-i-run-reboot-as-a-normal-user-without-needing-to-enter-a-password + public static final String ServerAddress = "alex-freenas.ddns.net"; + public static final String MailAddress = "sapfor.tracker@internet.ru"; + // public static final String MailPassword = "3s4w9e5fs3c1a89AA"; оÑновной пароль. + public static final String MailPassword = "knKn2PpfrC348ZxHtMnT"; //пароль Ð´Ð»Ñ Ñапфора как внешнего приложениÑ. + public static final String dateNaN = "NaN"; + //-------------------------------------------------- + //Ñ‚ÐµÐºÑƒÑ‰Ð°Ñ Ð¿Ð°Ð¿ÐºÐ° ÑиÑтемы. в отличие от шарпа никогда не должна менÑтьÑÑ. + public static final String components = "Components"; + public static final String data = "Data"; + public static final String Bugs = "Bugs"; + public static final String BackUps = "BackUps"; + public static final String DataBackUps = "DataBackUps"; + public static final String Temp = "Temp"; + public static final String Projects = "Projects"; + public static final String CompilationTasks = "CompilationTasks"; + public static final String RunTasks = "RunTasks"; + public static final String Sts = "Sts"; + public static final String Repo = "Repo"; + public static final String Tests = "Tests"; + public static final String Packages = "Packages"; + public static final String PerformanceAnalyzer = "PerformanceAnalyzer"; + public static GlobalProperties properties = new GlobalProperties(); + // + //------------------------------------------------------ + public static boolean enable_text_changed = false; + //--- + public static boolean files_multiselection = false; + public static boolean versions_multiselection = false; + //--- + public static TransformationPermission transformationPermission = TransformationPermission.None; + //?? + public static DataSet Components = null; + public static MessagesServer messagesServer = null; + //-------------------------------------------------- + public static GlobalDatabase db = null; + public static String[] admins_mails = new String[]{ + "vmk-post@yandex.ru", + "79854210702@ya.ru" + }; + //- + public static String Home; + public static File ComponentsDirectory; + public static File DataDirectory; + public static File BugReportsDirectory; + public static File BackUpsDirectory; + public static File TempDirectory; + public static File ProjectsDirectory; + public static File CompilationTasksDirectory; + public static File RunTasksDirectory; + public static File StsDirectory; + public static File RepoDirectory; + public static File TestsDirectory; + public static File PerformanceAnalyzerDirectory; + public static File DataBackUpsDirectory; + public static File PackagesDirectory; + public static File SapforPackagesDirectory; + //------------------------------------------------------------------ + public static Visualiser visualiser = null; + public static Visualizer_2 visualizer_2 = null; + public static PerformanceAnalyzer performanceAnalyzer = null; + //------------------------------------------------------------------ + public static ComponentsServer componentsServer = new ComponentsServer(); + public static TestingServer testingServer = new TestingServer(); + //------------------------------------------------------------------ + public static boolean isWindows; + public static int bad_state = 0; + public static int need_update = 0; + public static int need_publish = 0; + //------------------------------------------------------------------------ + public static Loggable Log; + public static void SynschronizeProperties() { + //---- NEW ----- + try { + File new_propertiesFile = Paths.get(Home, "properties").toFile(); + if (new_propertiesFile.exists()) { + String packed = FileUtils.readFileToString(new_propertiesFile, Charset.defaultCharset()); + properties = Utils.gson.fromJson(packed, GlobalProperties.class); + } + //пуÑть вÑегда в него пишет. Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ того, что новые наÑтройки могут поÑвитьÑÑ. + FileUtils.writeStringToFile(new_propertiesFile, Utils.jsonToPrettyFormat(Utils.gson.toJson(properties))); + } catch (Exception ex) { + ex.printStackTrace(); + } + } + public static void CheckVisualiserDirectories() { + Utils.CheckDirectory(ComponentsDirectory = Paths.get(Home, components).toFile()); + Utils.CheckAndCleanDirectory(TempDirectory = Paths.get(Home, Temp).toFile()); + Utils.CheckDirectory(DataDirectory = Paths.get(Home, data).toFile()); + //- + Utils.CheckDirectory(RepoDirectory = Paths.get(Home, Repo).toFile()); + Utils.CheckDirectory(BugReportsDirectory = Paths.get(Home, Bugs).toFile()); + Utils.CheckDirectory(BackUpsDirectory = Paths.get(Home, BackUps).toFile()); + Utils.CheckDirectory(ProjectsDirectory = Paths.get(Home, Projects).toFile()); + Utils.CheckDirectory(CompilationTasksDirectory = Paths.get(Home, CompilationTasks).toFile()); + Utils.CheckDirectory(RunTasksDirectory = Paths.get(Home, RunTasks).toFile()); + Utils.CheckDirectory(StsDirectory = Paths.get(Home, Sts).toFile()); + Utils.CheckDirectory(TestsDirectory = Paths.get(Home, Tests).toFile()); + Utils.CheckDirectory(PerformanceAnalyzerDirectory = Paths.get(Home, PerformanceAnalyzer).toFile()); + Utils.CheckDirectory(SapforPackagesDirectory = Paths.get(Home, "SapforTasksPackages").toFile()); + } + public static void CheckServerDirectories() { + Utils.CheckDirectory(ComponentsDirectory = Paths.get(Home, components).toFile()); + Utils.CheckAndCleanDirectory(TempDirectory = Paths.get(Home, Temp).toFile()); + Utils.CheckDirectory(DataDirectory = Paths.get(Home, data).toFile()); + //- + Utils.CheckDirectory(BugReportsDirectory = Paths.get(Home, Bugs).toFile()); + Utils.CheckDirectory(DataBackUpsDirectory = Paths.get(Home, DataBackUps).toFile()); + } + public static void CheckTestingSystemDirectories() { + Utils.CheckDirectory(ComponentsDirectory = Paths.get(Home, components).toFile()); + Utils.CheckAndCleanDirectory(TempDirectory = Paths.get(Home, Temp).toFile()); + Utils.CheckDirectory(DataDirectory = Paths.get(Home, data).toFile()); + //- + Utils.CheckDirectory(TestsDirectory = Paths.get(Home, Tests).toFile()); + Utils.CheckDirectory(RepoDirectory = Paths.get(Home, Repo).toFile()); + Utils.CheckDirectory(PackagesDirectory = Paths.get(Home, Packages).toFile()); + } + public static void CreateLog() { + Log = new Loggable() { + @Override + public String getLogHomePath() { + return Paths.get(Home, "Components").toString(); + } + @Override + public String getLogName() { + return "VisualDVM"; + } + }; + Log.ClearLog(); + } + //- + public static void FinishApplication() { + try { + if (db != null) db.Disconnect(); + if (componentsServer.db != null) + componentsServer.db.Disconnect(); + if (testingServer.db != null) + testingServer.db.Disconnect(); + if (visualizer_2 != null) + visualizer_2.Shutdown(); + if (messagesServer != null) + messagesServer.Shutdown(); + if (performanceAnalyzer != null) + performanceAnalyzer.Shutdown(); + } catch (Exception ex) { + if (Log != null) { + Log.PrintException(ex); + } else { + ex.printStackTrace(); + } + } + System.exit(0); + } + public static void ActivateDB() throws Exception { + db = new GlobalDatabase(); + db.Connect(); + db.CreateAllTables(); + db.prepareTablesStatements(); + db.Synchronize(); + } + public static void RefreshUpdatesStatus() { + Components.RefreshUI(); + ValidateComponentsStates(); + if (UI.HasNewMainWindow()) + UI.getMainWindow().ShowUpdatesIcon(); + } + public static boolean ValidateComponentsStates() { + bad_state = need_update = need_publish = 0; + for (Component component : Components.Data.values()) { + if (component.isVisible()) { + switch (component.getState()) { + case Not_found: + case Unknown_version: + case Old_version: + if (component.isNecessary()) + bad_state++; + component.Select(true); + break; + case Needs_update: + need_update++; + component.Select(true); + break; + case Needs_publish: + need_publish++; + break; + default: + component.Select(false); + break; + } + } + } + return (bad_state == 0); + } + public static DBSetting getSetting(SettingName settingName) throws Exception { + switch (Current.mode) { + case Normal: + return db.settings.get(settingName); + default: + return null; + } + } + public static void changeSetting(SettingName settingName, Object new_value) throws Exception { + Pass_2021.passes.get(PassCode_2021.UpdateSetting).Do(settingName, new_value); + } + public static String packSapforSettings() { + Vector res_ = new Vector<>(); + Vector forbidden = new Vector<>(); + forbidden.add(SettingName.GCOVLimit); + forbidden.add(SettingName.Precompilation); + forbidden.add(SettingName.DVMConvertationOptions); + forbidden.add(SettingName.SaveModifications); + for (DBSetting setting : db.settings.getSettingsByOwner(ComponentType.SapforOptions)) { + if (!forbidden.contains(setting.Name)) + res_.add(setting.Value); + } + return String.join("|", res_); + } + //-- + public static void NormalMode(int port) throws Exception { + isWindows = System.getProperty("os.name").startsWith("Windows"); + CheckVisualiserDirectories(); + CreateLog(); + //- + visualizer_2 = new Visualizer_2(port); + visualizer_2.Connect(); + visualizer_2.refreshPid(); + //еÑли делать раньше, то не удаÑÑ‚ÑÑ ÑƒÐ±Ð¸Ñ‚ÑŒ Ñервер. + if (Utils.ContainsCyrillic(Global.Home)) { + UI.Info("Ð’ пути к корневой папке " + Utils.DQuotes(Global.Home) + "\n" + + "Ðайдены руÑÑкие буквы.\n" + + "Визуализатор завершает работу."); // + FinishApplication(); + } + messagesServer = new MessagesServer(); + messagesServer.Start(); + //Ñоздание ÑпиÑков Ñлужебных объектов + Current.CreateAll(); + UI.CreateAll(); + Pass_2021.CreateAll(); + Utils.init(); + //единÑтвенное меню до оÑтальных. + UI.menuBars.put(ComponentsSet.class, new ComponentsMenuBar()); + Components = new ComponentsSet(); + Current.set(Current.ProjectView, ProjectView.Files); + Components.put(ComponentType.Visualiser, visualiser = new Visualiser()); + Components.put(ComponentType.Sapfor_F, (Component) Current.set(Current.Sapfor, new Sapfor_F())); + Components.put(ComponentType.Visualizer_2, visualizer_2); + Components.put(ComponentType.PerformanceAnalyzer, performanceAnalyzer = new PerformanceAnalyzer()); + Components.put(ComponentType.Instruction, new Instruction()); + //- + for (Component component : Components.Data.values()) + if (component.isVisible()) component.InitialVersionCheck(); + //- + UI.CreateComponentsForm(); + AbstractTokenMakerFactory atmf = (AbstractTokenMakerFactory) TokenMakerFactory.getDefaultInstance(); + atmf.putMapping("text/FortranSPF", "Common.UI.Themes.FortranSPFTokenMaker"); + atmf.putMapping("text/FreeFortranSPF", "Common.UI.Themes.FreeFortranSPFTokenMaker"); + // FoldParserManager.get().addFoldParserMapping("text/FortranSPF", new FortranFolder()); блоки кода. todo + //-------->> + //-------->> + if (properties.AutoUpdateSearch) + Pass_2021.passes.get(PassCode_2021.GetComponentsActualVersions).Do(); + ValidateComponentsStates(); + if ((need_update > 0) || (bad_state > 0)) { + boolean flag = true; + do { + UI.ShowComponentsWindow(); + if (flag = (!ValidateComponentsStates())) { + if (!UI.Question("Ðайдено " + bad_state + " некорректных необходимых компонент.Работа визуализатора невозможна.\n" + + "ВернутьÑÑ Ðº окну компонент" + )) { + UI.Info("Визуализатор завершает работу."); + FinishApplication(); + } + } + } while (flag); + } + //--- + ActivateDB(); //тут current getAccount; роль по умолчанию вÑегда неизвеÑтна. + ///-------------- + Pass_2021.passes.get(PassCode_2021.CheckAccount).Do(); + //--------------- + componentsServer.ActivateDB(); + testingServer.ActivateDB(); + //-- чиÑто чтобы Ñоздать таблицы. ÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ Ð½Ð° Ñтороне клиента не предвидитÑÑ. + testingServer.SetCurrentAccountDB(Current.getAccount().email); + //--->>> + if (db.settings.get(SettingName.AutoBugReportsLoad).toBoolean()) + Pass_2021.passes.get(PassCode_2021.SynchronizeBugReports).Do(); + //-- + if (db.settings.get(SettingName.AutoTestsLoad).toBoolean()) + Pass_2021.passes.get(PassCode_2021.SynchronizeTests).Do(); + Pass_2021.CheckAllStats(); + Current.getSapfor().refreshPid(); //без Ñапфора Ñюда Ñто вÑе равно не дойдет. + UI.CreateMenus(); + UI.CreateWindows(); + } + public static void ServerMode() throws Exception { + isWindows = false; + CheckServerDirectories(); + CreateLog(); + componentsServer = new ComponentsServer(); + componentsServer.ActivateDB(); + componentsServer.Start(); + System.exit(0); + } + public static void TestingSystemMode() throws Exception { + isWindows = false; + CheckTestingSystemDirectories(); + CreateLog(); + testingServer = new TestingServer(); + testingServer.ActivateDB(); + testingServer.Start(); + System.exit(0); + } + public static void PackageMode() throws Exception { + Log = new Loggable() { + @Override + public String getLogHomePath() { + return Home; + } + @Override + public String getLogName() { + return "PackageMode"; + } + }; + Log.ClearLog(); + //-- + Pass_2021 pass = new PerformSapforTasksPackage(); + pass.Do(Home); + //-- + } + //--- + public static void Init(String... args) { + System.out.println("VisualSapfor.jar started.."); + Home = System.getProperty("user.dir"); //еÑли Linux, дает без Ñлеша в конце !!! + System.out.println("home directory is" + Utils.Brackets(Home)); + //--- + SynschronizeProperties(); + Current.mode = properties.Mode; + System.out.println("mode is " + Current.mode); + try { + switch (Current.mode) { + case Normal: + NormalMode(Integer.parseInt(args[1])); + break; + case Server: + ServerMode(); + break; + case Testing: + TestingSystemMode(); + break; + case Package: + PackageMode(); + break; + case Undefined: + break; + } + } catch (Exception ex) { + System.out.println("VISUALISER FAILED"); + ex.printStackTrace(); + if (Global.Log != null) + Global.Log.PrintException(ex); + FinishApplication(); + } + } +} diff --git a/src/Common/GlobalProperties.java b/src/Common/GlobalProperties.java new file mode 100644 index 00000000..f16ecba0 --- /dev/null +++ b/src/Common/GlobalProperties.java @@ -0,0 +1,87 @@ +package Common; +import com.google.gson.annotations.Expose; + +import java.io.File; +import java.nio.file.Paths; +public class GlobalProperties extends Properties { + @Expose + public Current.Mode Mode = Current.Mode.Normal; + //--- + @Expose + public int SocketTimeout = 5000; + @Expose + public boolean OldServer = false; + //--- + @Expose + public String SMTPHost = "smtp.mail.ru"; + @Expose + public int SMTPPort = 465; + @Expose + public int MailSocketPort = 465; + //--- + @Expose + public String BackupWorkspace = "_sapfor_x64_backups"; + @Expose + public int BackupHour = 5; + @Expose + public int BackupMinute = 0; + @Expose + public boolean EmailAdminsOnStart = false; + //--- + @Expose + public boolean AutoUpdateSearch = true; + // наÑтройки визуализатора. по крайней мере, флаги. + @Expose + public boolean ConfirmPassesStart = true; + @Expose + public boolean ShowPassesDone = true; + @Expose + public boolean FocusPassesResult = true; + //- + @Expose + public String GlobalDBName = "db7.sqlite"; + @Expose + public String ProjectDBName = "new_project_base.sqlite"; + @Expose + public String BugReportsDBName = "bug_reports.sqlite"; + @Expose + public String TestsDBName = "tests.sqlite"; + //- + @Expose + public int ComponentsWindowWidth = 650; + @Expose + public int ComponentsWindowHeight = 250; + //- + @Expose + public String VisualiserPath = ""; + @Expose + public String Sapfor_FPath = ""; + @Expose + public String Visualizer_2Path = ""; + @Expose + public String InstructionPath = ""; + @Expose + public String PerformanceAnalyzerPath = ""; + @Expose + public int ComponentsBackUpsCount=10; + @Expose + public long SapforTaskMaxId = 0; //вероÑтно, временно. когда перейдем на удаленную машину. + //- + @Override + public String getFieldDescription(String fieldName) { + switch (fieldName) { + case "ShowPassesDone": + return "Сообщать об уÑпешном выполнении проходов"; + case "ConfirmPassesStart": + return "Запрашивать Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð¾Ð²"; + case "FocusPassesResult": + return "Переходить на результирующую вкладку проходов по их завершении"; + default: + return "?"; + } + } + @Override + public File getFile() { + return Paths.get(System.getProperty("user.dir"),"properties").toFile(); + } +} diff --git a/src/Common/PackageModeSupervisor.java b/src/Common/PackageModeSupervisor.java new file mode 100644 index 00000000..456e06ca --- /dev/null +++ b/src/Common/PackageModeSupervisor.java @@ -0,0 +1,3 @@ +package Common; +public class PackageModeSupervisor { +} diff --git a/src/Common/Properties.java b/src/Common/Properties.java new file mode 100644 index 00000000..2492fbde --- /dev/null +++ b/src/Common/Properties.java @@ -0,0 +1,50 @@ +package Common; +import Common.UI.Menus_2023.StableMenuItem; +import Common.Utils.Utils; +import org.apache.commons.io.FileUtils; + +import javax.swing.*; +import java.io.File; +public abstract class Properties { + public void addFlagMenuItem(JMenu menu, String fieldName) { + JMenuItem menu_item = new StableMenuItem(getFieldDescription(fieldName), + getFlag(fieldName) ? "/icons/Pick.png" : "/icons/NotPick.png"); + //- + menu_item.addActionListener(e -> { + switchFlag(fieldName); + Update(); + menu_item.setIcon(Utils.getIcon(getFlag(fieldName) ? "/icons/Pick.png" : "/icons/NotPick.png")); + }); + menu.add(menu_item); + } + public boolean getFlag(String fieldName) { + boolean field = false; + try { + field = (boolean) GlobalProperties.class.getField(fieldName).get(this); + // + } catch (Exception ex) { + ex.printStackTrace(); + } + return field; + } + public void switchFlag(String fieldName) { + boolean field = false; + try { + field = (boolean) GlobalProperties.class.getField(fieldName).get(this); + GlobalProperties.class.getField(fieldName).set(this, !field); + // + } catch (Exception ex) { + ex.printStackTrace(); + } + } + public void Update() { + try { + FileUtils.write(getFile(), Utils.jsonToPrettyFormat(Utils.gson.toJson(this))); + } catch (Exception e) { + e.printStackTrace(); + } + } + //-- + public abstract String getFieldDescription(String fieldName); + public abstract File getFile(); +} diff --git a/src/Common/UI/ComboBox/StyledTextComboBox.java b/src/Common/UI/ComboBox/StyledTextComboBox.java new file mode 100644 index 00000000..1e3c428b --- /dev/null +++ b/src/Common/UI/ComboBox/StyledTextComboBox.java @@ -0,0 +1,9 @@ +package Common.UI.ComboBox; +import Common.UI.Menus.TextComboBoxMenu; + +import javax.swing.*; +public class StyledTextComboBox extends JComboBox { + public StyledTextComboBox() { + setComponentPopupMenu(new TextComboBoxMenu(this)); + } +} diff --git a/src/Common/UI/ControlForm.java b/src/Common/UI/ControlForm.java new file mode 100644 index 00000000..8b63ae6f --- /dev/null +++ b/src/Common/UI/ControlForm.java @@ -0,0 +1,53 @@ +package Common.UI; +import Common.Global; + +import javax.swing.*; +import java.awt.*; +//клаÑÑ, предÑтавлÑющий Ñобой прокручиваемую панель, на которой лежит нечто. +public class ControlForm { + public C control = null; + protected Class control_class; + protected JPanel content; //задник. + public JScrollPane scroll = null; + public ControlForm(Class class_in) { + control_class = class_in; + setContent(new JPanel(new BorderLayout())); + } + //нужно будет вывеÑтии Ñделать нормальные формы Ð´Ð»Ñ Ð´ÐµÑ€ÐµÐ²ÑŒÐµÐ² а не ручное Ñоздание. + public JPanel getContent() { + return content; + } + public void setContent(JPanel content_in) { + + content = content_in; + } + //- + public void Show() { + Clear(); + CreateControl(); + //------------------------ + scroll = new JScrollPane(control); + scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); + scroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + } + public void CreateControl() { + try { + control = control_class.newInstance(); + } catch (Exception e) { + Global.Log.PrintException(e); + } + } + public boolean isShown() { + return control != null; + } + public void Clear() { + control = null; //очищено. + } + public void Refresh() { + if (control != null) + refresh(); + } + //- + protected void refresh() { + } //перериÑовать контрол. +} diff --git a/src/Common/UI/ControlWithCurrentForm.java b/src/Common/UI/ControlWithCurrentForm.java new file mode 100644 index 00000000..4bd6e0e9 --- /dev/null +++ b/src/Common/UI/ControlWithCurrentForm.java @@ -0,0 +1,19 @@ +package Common.UI; +import Common.Current; + +import java.awt.*; +public class ControlWithCurrentForm extends ControlForm { + public ControlWithCurrentForm(Class class_in) { + super(class_in); + } + //- + public Current CurrentName() { + return Current.Undefined; + } + public void ShowCurrentObject() throws Exception { + } + public void ShowNoCurrentObject() throws Exception { + } + public void MouseAction2() throws Exception { + } +} diff --git a/src/Common/UI/DataControl.java b/src/Common/UI/DataControl.java new file mode 100644 index 00000000..3377dbef --- /dev/null +++ b/src/Common/UI/DataControl.java @@ -0,0 +1,7 @@ +package Common.UI; +import Common.Database.DBObject; +public interface DataControl { + DBObject getRowObject(int rowIndex); //получить объект, ÑответÑтвующий данной Ñтроке. + void SelectRowByPK(Object pk); + //выделить Ñтроку где лежит объект Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ первичным ключом. +} diff --git a/src/Common/UI/DataControl_OLD.java b/src/Common/UI/DataControl_OLD.java new file mode 100644 index 00000000..ed892f13 --- /dev/null +++ b/src/Common/UI/DataControl_OLD.java @@ -0,0 +1,13 @@ +package Common.UI; +import Common.Current; +public interface DataControl_OLD { + //todo Ñкорее вÑего уÑтареет. + default Current getCurrent() { + return Current.Undefined; + } + //-? + default void ShowCurrentObject() throws Exception { + } + default void ShowNoCurrentObject() throws Exception { + } +} diff --git a/src/Common/UI/DataSetControlForm.java b/src/Common/UI/DataSetControlForm.java new file mode 100644 index 00000000..9ce7165a --- /dev/null +++ b/src/Common/UI/DataSetControlForm.java @@ -0,0 +1,329 @@ +package Common.UI; +import Common.Current; +import Common.Database.DBObject; +import Common.Database.DBTable; +import Common.Database.DataSet; +import Common.Database.FKBehaviour; +import Common.Global; +import Common.UI.Menus.TableMenu; +import Common.UI.Tables.ColumnInfo; +import Common.UI.Tables.DataTable; +import Common.UI.Tables.Grid.GridAnchestor; +import Common.Utils.Utils; +import GlobalData.Grid.Grid; + +import javax.swing.*; +import javax.swing.table.TableColumn; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.Arrays; +import java.util.Vector; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static Common.UI.Tables.TableEditors.EditorSelect; +import static Common.UI.Tables.TableRenderers.RendererSelect; +public class DataSetControlForm extends ControlWithCurrentForm { + protected JPanel dataPanel; + protected DataSet dataSource; + public JPanel getDataPanel() { + return dataPanel; + } + protected int current_row_i; + protected boolean events_on = true; + protected String colNamesAndSizes = ""; + protected Vector columns = new Vector<>(); + public DataSetControlForm(DataSet dataSource_in) { + this(dataSource_in, DataTable.class); + } + public DataSetControlForm(DataSet dataSource_in, Class tableClass) { + super(tableClass); + dataSource = dataSource_in; + //--- + dataPanel = new JPanel(new BorderLayout()); + content.add(dataPanel, BorderLayout.CENTER); + } + @Override + public void Show() { + super.Show(); + dataPanel.add(scroll); + dataPanel.updateUI(); + } + @Override + public void Clear() { + super.Clear(); + UI.Clear(dataPanel); + } + public DataSet getDataSource() { + return dataSource; + } + @Override + public Current CurrentName() { + return getDataSource().CurrentName(); + } + public void SaveColumns() { + if (Global.db != null) { + try { + if ((CurrentName() != Current.Undefined)) { + Vector widths = IntStream.range(0, columns.size()).mapToObj(i -> String.valueOf(control.getColumnModel().getColumn(i).getWidth())).collect(Collectors.toCollection(Vector::new)); + String packed = String.join("|", widths); + Grid grid; + if (Global.db.grids.containsKey(CurrentName())) { + grid = Global.db.grids.get(CurrentName()); + } else { + grid = new Grid(CurrentName()); + Global.db.Insert(grid); + } + grid.sizes = packed; + Global.db.Update(grid); + } + } catch (Exception ex) { + ex.printStackTrace(); + } + } + } + public boolean hasCheckBox() { + return false; + } + private Vector getHeaders() { + return columns.stream().map(ColumnInfo::getName).collect(Collectors.toCollection(Vector::new)); + } + protected void CreateColumnsInfo() { + columns.clear(); + columns.add(new ColumnInfo(getDataSource().getPKName())); + if (hasCheckBox()) { + columns.add(new ColumnInfo("", RendererSelect, EditorSelect)); + columns.get(1).setMinWidth(25); + columns.get(1).setMaxWidth(25); + } + Arrays.stream(getDataSource().getUIColumnNames()).forEach(name -> columns.add(new ColumnInfo(name))); + AdditionalInitColumns(); + } + protected void AdditionalInitColumns() { + //уточнение инфы по Ñтолбцам. + } + @SuppressWarnings("unchecked") + @Override + public void CreateControl() { + CreateColumnsInfo(); + GridAnchestor table_data_model = new GridAnchestor(getHeaders(), dataSource.getVisibleKeys()) { + @SuppressWarnings("unchecked") + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + Object key = data.get(rowIndex); + if (columnIndex == 0) + return key; + DBObject object = getDataSource().get((key)); + if ((columnIndex == 1) && hasCheckBox()) + return object.isSelected(); + return getDataSource().getFieldAt(object, columnIndex); + } + @Override + public boolean isCellEditable(int row, int col) { + return columns.get(col).isEditable(); + } + //------------------------------------------------------------------------------------ + @Override + public void setValueAt(Object value, int row, int col) { + fireTableCellUpdated(row, col); + } + }; + control = new DataTable(table_data_model) { + @Override + public TableMenu CreateMenu() { + return new TableMenu(this); + } + //Ñтрого Ð³Ð¾Ð²Ð¾Ñ€Ñ Ñта штука нужна только Ð´Ð»Ñ Ñ€ÐµÐ½Ð´ÐµÑ€ÐµÑ€Ð¾Ð² и едиторов клеток. + @Override + public DBObject getRowObject(int rowIndex) { + //вот так делать ÐЕЛЬЗЯ. модель только Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ³Ð¾ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ + // Object key = table_data_model.data.get(rowIndex); + //из таблицы можно пользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ getValueAt + //иначе Ñортировка не будет работать. + Object key = getValueAt(rowIndex, 0); + return getDataSource().get(key); + } + //-----------------------------NEW------------------------------------- + @Override + public void CorrectColumnsSizes() { + if ((Global.db != null) && CurrentName() != Current.Undefined && Global.db.grids.containsKey(CurrentName())) { + //Undefined может оказатьÑÑ Ð² таблице, например еÑли енум уÑтарел. ПоÑтому надо проверÑть. + if (!getColumnsProfile().equalsIgnoreCase(colNamesAndSizes)) { + Grid grid = Global.db.grids.get(CurrentName()); + String[] data = grid.sizes.split("\\|"); + for (int i = 0; i < columns.size(); ++i) { + if (i <= (data.length - 1)) { + int width = Integer.parseInt(data[i]); + getColumnModel().getColumn(i).setPreferredWidth(width); + getColumnModel().getColumn(i).setWidth(width); + } + } + } + } else + super.CorrectColumnsSizes(); //обычный авторазмер. + } + public String getColumnsProfile() { + String res = ""; + for (int i = 0; i < getColumnModel().getColumnCount(); i++) { + if (i > 0) res += ","; + TableColumn column = getColumnModel().getColumn(i); + res += column.getHeaderValue(); + res += ":"; + res += column.getWidth(); + } + return res; + } + @Override + public void Init() { + for (int i = 0; i < columns.size(); i++) { + ColumnInfo columnInfo = columns.get(i); + if (columnInfo.isVisible()) { + if (columnInfo.hasRenderer()) + getColumnModel().getColumn(i).setCellRenderer(UI.TableRenderers.get(columnInfo.getRenderer())); + if (columnInfo.hasEditor()) + getColumnModel().getColumn(i).setCellEditor(UI.TableEditors.get(columnInfo.getEditor())); + if (columnInfo.hasMaxWidth()) + getColumnModel().getColumn((i)).setMaxWidth(columnInfo.getMaxWidth()); + if (columnInfo.hasMinWidth()) + getColumnModel().getColumn((i)).setMinWidth(columnInfo.getMinWidth()); + } else { + getColumnModel().getColumn(i).setMinWidth(0); + getColumnModel().getColumn(i).setMaxWidth(0); + } + } + //обновление в БД при ручном изменении размера Ñтолбиков.--------->> + getTableHeader().addMouseListener(new MouseAdapter() { + public void mouseReleased(MouseEvent arg0) { + System.out.println("Header mouse released"); + String new_colNamesAndSizes = getColumnsProfile(); + // check if changed, if yes, persist... + if (!colNamesAndSizes.equals(new_colNamesAndSizes)) { + colNamesAndSizes = new_colNamesAndSizes; + SaveColumns(); + System.out.println("columns updated"); + } + } + }); + //------------------------->> + } + }; + if (CurrentName() != Current.Undefined) { + current_row_i = Utils.Nan; + ListSelectionModel selModel = control.getSelectionModel(); + selModel.addListSelectionListener(e -> { + int row = control.getSelectedRow(); + if ((row >= 0)) { + if (row != current_row_i) { + current_row_i = row; + // System.out.println("current row_i="+current_row_i); + getDataSource().setCurrent(control.getRowObject(row)); + if (events_on) { + try { + ShowCurrentObject(); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + } + } else { + current_row_i = Utils.Nan; + // System.out.println("no current row_i="+current_row_i); + getDataSource().dropCurrent(); + if (events_on) { + try { + ShowNoCurrentObject(); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + } + }); + //двойной клик мыши.------------------------------------------------------ + control.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + if ((e.getClickCount() == 2) && (dataSource.getCurrent() != null)) { + try { + MouseAction2(); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + } + }); + //---------------------------------------------------------------------------- + //при переотображении таблицы Ñкидываем текущий объект!! + getDataSource().dropCurrent(); + try { + ShowNoCurrentObject(); + } catch (Exception e) { + Global.Log.PrintException(e); + } + } + //--- + /* + if (hasCheckBox()) { + TableColumn column = control.getColumnModel().getColumn(1) + column.setHeaderRenderer(new TableCellRenderer() { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + return null; + } + + }); + } + */ + } + @Override + protected void refresh() { + control.CorrectSizes(); + } + public void Show(Object pk) { + Show(); + Select(pk); + } + public void Select(Object pk) { + if (isShown()) + control.SelectRowByPK(pk); + } + public void ClearSelection() { + if (isShown()) + control.clearSelection(); //Ñтрока ÑброÑитÑÑ Ñама. Ð±Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ ÑброÑу ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° + } + public int getRowCount() { + return control.getRowCount(); + } + @Override + public void ShowCurrentObject() throws Exception { + if (dataSource instanceof DBTable) { + DBTable table = (DBTable) dataSource; + for (Class dep : table.getFKDependencies().keySet()) { + FKBehaviour behaviour = table.getFKDependencies().get(dep); + switch (behaviour.ui) { + case ACTIVE: + table.getDb().tables.get(dep).ShowUI(); + break; + case PASSIVE: + break; + } + } + } + } + @Override + public void ShowNoCurrentObject() throws Exception { + if (dataSource instanceof DBTable) { + DBTable table = (DBTable) dataSource; + for (Class dep : table.getFKDependencies().keySet()) { + FKBehaviour behaviour = table.getFKDependencies().get(dep); + switch (behaviour.ui) { + case ACTIVE: + table.getDb().tables.get(dep).ClearUI(); + break; + case PASSIVE: + break; + } + } + } + } +} diff --git a/src/Common/UI/DebugPrintLevel.java b/src/Common/UI/DebugPrintLevel.java new file mode 100644 index 00000000..63500b6f --- /dev/null +++ b/src/Common/UI/DebugPrintLevel.java @@ -0,0 +1,17 @@ +package Common.UI; +public enum DebugPrintLevel { + Undefined, + Passes, + Project; + public String getDescription() { + return toString(); + } + public boolean isEnabled() { + switch (this) { + case Passes: + return true; + default: + return false; + } + } +} \ No newline at end of file diff --git a/src/Common/UI/DragDrop/ExampleDrop.java b/src/Common/UI/DragDrop/ExampleDrop.java new file mode 100644 index 00000000..ea726aa0 --- /dev/null +++ b/src/Common/UI/DragDrop/ExampleDrop.java @@ -0,0 +1,33 @@ +package Common.UI.DragDrop; +import javax.swing.*; +/** + * A simple example showing how to use {@link FileDrop} + * + * @author Robert Harder, rob@iharder.net + */ +public class ExampleDrop { + /* + /** Runs a sample program that shows dropped files */ + public static void kek(String[] args) { + javax.swing.JFrame frame = new javax.swing.JFrame("FileDrop"); + //javax.swing.border.TitledBorder dragBorder = new javax.swing.border.TitledBorder( "Drop 'em" ); + final javax.swing.JTextArea text = new javax.swing.JTextArea(); + frame.getContentPane().add( + new javax.swing.JScrollPane(text), + java.awt.BorderLayout.CENTER); + new FileDrop(System.out, text, /*dragBorder,*/ new FileDrop.Listener() { + public void filesDropped(java.io.File[] files) { + for (int i = 0; i < files.length; i++) { + try { + text.append(files[i].getCanonicalPath() + "\n"); + } // end try + catch (java.io.IOException e) { + } + } // end for: through each dropped file + } // end filesDropped + }); // end FileDrop.Listener + frame.setBounds(100, 100, 300, 400); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setVisible(true); + } // end main +} diff --git a/src/Common/UI/DragDrop/FileDrop.java b/src/Common/UI/DragDrop/FileDrop.java new file mode 100644 index 00000000..4d68ce8d --- /dev/null +++ b/src/Common/UI/DragDrop/FileDrop.java @@ -0,0 +1,792 @@ +package Common.UI.DragDrop; +import Common.Global; + +import java.awt.datatransfer.DataFlavor; +import java.io.*; +/** + * This class makes it easy to drag and drop files from the operating + * system to a Java program. Any java.awt.Component can be + * dropped onto, but only javax.swing.JComponents will indicate + * the drop event with a changed border. + *

+ * To use this class, construct a new FileDrop by passing + * it the target component and a Listener to receive notification + * when file(s) have been dropped. Here is an example: + *

+ *

+ *      JPanel myPanel = new JPanel();
+ *      new FileDrop( myPanel, new FileDrop.Listener()
+ *      {   public void filesDropped( java.io.File[] files )
+ *          {
+ *              // handle file drop
+ *              ...
+ *          }   // end filesDropped
+ *      }); // end FileDrop.Listener
+ * 
+ *

+ * You can specify the border that will appear when files are being dragged by + * calling the constructor with a javax.swing.border.Border. Only + * JComponents will show any indication with a border. + *

+ * You can turn on some debugging features by passing a PrintStream + * object (such as System.out) into the full constructor. A null + * value will result in no extra debugging information being output. + *

+ * + *

I'm releasing this code into the Public Domain. Enjoy. + *

+ *

Original author: Robert Harder, rharder@usa.net

+ *

2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added.

+ * + * @author Robert Harder + * @author rharder@users.sf.net + * @version 1.0.1 + */ +public class FileDrop { + // Default border color + private static final java.awt.Color defaultBorderColor = new java.awt.Color(0f, 0f, 1f, 0.25f); + // BEGIN 2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added. + private static final String ZERO_CHAR_STRING = "" + (char) 0; + /** + * Discover if the running JVM is modern enough to have drag and drop. + */ + private static Boolean supportsDnD; + private transient javax.swing.border.Border normalBorder; + private transient java.awt.dnd.DropTargetListener dropListener; + /** + * Constructs a {@link FileDrop} with a default light-blue border + * and, if c is a {@link java.awt.Container}, recursively + * sets all elements contained within as drop targets, though only + * the top level container will change borders. + * + * @param c Component on which files will be dropped. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final java.awt.Component c, + final Listener listener) { + this(null, // Logging stream + c, // Drop target + javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor), // Drag border + true, // Recursive + listener); + } // end constructor + /** + * Constructor with a default border and the option to recursively set drop targets. + * If your component is a java.awt.Container, then each of its children + * database.Objects.components will also listen for drops, though only the parent will change borders. + * + * @param c Component on which files will be dropped. + * @param recursive Recursively set children as drop targets. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final java.awt.Component c, + final boolean recursive, + final Listener listener) { + this(null, // Logging stream + c, // Drop target + javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor), // Drag border + recursive, // Recursive + listener); + } // end constructor + /** + * Constructor with a default border and debugging optionally turned on. + * With Debugging turned on, more status messages will be displayed to + * out. A common way to use this constructor is with + * System.out or System.err. A null value for + * the parameter out will result in no debugging output. + * + * @param out PrintStream to record debugging info or null for no debugging. + * @param out + * @param c Component on which files will be dropped. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final PrintStream out, + final java.awt.Component c, + final Listener listener) { + this(out, // Logging stream + c, // Drop target + javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor), + false, // Recursive + listener); + } // end constructor + /** + * Constructor with a default border, debugging optionally turned on + * and the option to recursively set drop targets. + * If your component is a java.awt.Container, then each of its children + * database.Objects.components will also listen for drops, though only the parent will change borders. + * With Debugging turned on, more status messages will be displayed to + * out. A common way to use this constructor is with + * System.out or System.err. A null value for + * the parameter out will result in no debugging output. + * + * @param out PrintStream to record debugging info or null for no debugging. + * @param out + * @param c Component on which files will be dropped. + * @param recursive Recursively set children as drop targets. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final PrintStream out, + final java.awt.Component c, + final boolean recursive, + final Listener listener) { + this(out, // Logging stream + c, // Drop target + javax.swing.BorderFactory.createMatteBorder(2, 2, 2, 2, defaultBorderColor), // Drag border + recursive, // Recursive + listener); + } // end constructor + /** + * Constructor with a specified border + * + * @param c Component on which files will be dropped. + * @param dragBorder Border to use on JComponent when dragging occurs. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final java.awt.Component c, + final javax.swing.border.Border dragBorder, + final Listener listener) { + this( + null, // Logging stream + c, // Drop target + dragBorder, // Drag border + false, // Recursive + listener); + } // end constructor + /** + * Constructor with a specified border and the option to recursively set drop targets. + * If your component is a java.awt.Container, then each of its children + * database.Objects.components will also listen for drops, though only the parent will change borders. + * + * @param c Component on which files will be dropped. + * @param dragBorder Border to use on JComponent when dragging occurs. + * @param recursive Recursively set children as drop targets. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final java.awt.Component c, + final javax.swing.border.Border dragBorder, + final boolean recursive, + final Listener listener) { + this( + null, + c, + dragBorder, + recursive, + listener); + } // end constructor + /** + * Constructor with a specified border and debugging optionally turned on. + * With Debugging turned on, more status messages will be displayed to + * out. A common way to use this constructor is with + * System.out or System.err. A null value for + * the parameter out will result in no debugging output. + * + * @param out PrintStream to record debugging info or null for no debugging. + * @param c Component on which files will be dropped. + * @param dragBorder Border to use on JComponent when dragging occurs. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final PrintStream out, + final java.awt.Component c, + final javax.swing.border.Border dragBorder, + final Listener listener) { + this( + out, // Logging stream + c, // Drop target + dragBorder, // Drag border + false, // Recursive + listener); + } // end constructor + /** + * Full constructor with a specified border and debugging optionally turned on. + * With Debugging turned on, more status messages will be displayed to + * out. A common way to use this constructor is with + * System.out or System.err. A null value for + * the parameter out will result in no debugging output. + * + * @param out PrintStream to record debugging info or null for no debugging. + * @param c Component on which files will be dropped. + * @param dragBorder Border to use on JComponent when dragging occurs. + * @param recursive Recursively set children as drop targets. + * @param listener Listens for filesDropped. + * @since 1.0 + */ + public FileDrop( + final PrintStream out, + final java.awt.Component c, + final javax.swing.border.Border dragBorder, + final boolean recursive, + final Listener listener) { + if (supportsDnD()) { // Make a drop listener + dropListener = new java.awt.dnd.DropTargetListener() { + public void dragEnter(java.awt.dnd.DropTargetDragEvent evt) { + log(out, "FileDrop: dragEnter event."); + // Is this an acceptable drag event? + if (isDragOk(out, evt)) { + // If it's a Swing component, set its border + if (c instanceof javax.swing.JComponent) { + javax.swing.JComponent jc = (javax.swing.JComponent) c; + normalBorder = jc.getBorder(); + log(out, "FileDrop: normal border saved."); + jc.setBorder(dragBorder); + log(out, "FileDrop: drag border set."); + } // end if: JComponent + // Acknowledge that it's okay to enter + //evt.acceptDrag( java.awt.dnd.DnDConstants.ACTION_COPY_OR_MOVE ); + evt.acceptDrag(java.awt.dnd.DnDConstants.ACTION_COPY); + log(out, "FileDrop: event accepted."); + } // end if: drag ok + else { // Reject the drag event + evt.rejectDrag(); + log(out, "FileDrop: event rejected."); + } // end else: drag not ok + } // end dragEnter + public void dragOver(java.awt.dnd.DropTargetDragEvent evt) { // This is called continually as long as the mouse is + // over the drag target. + } // end dragOver + public void drop(java.awt.dnd.DropTargetDropEvent evt) { + log(out, "FileDrop: drop event."); + try { // Get whatever was dropped + java.awt.datatransfer.Transferable tr = evt.getTransferable(); + // Is it a file list? + if (tr.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) { + // Say we'll take it. + //evt.acceptDrop ( java.awt.dnd.DnDConstants.ACTION_COPY_OR_MOVE ); + evt.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY); + log(out, "FileDrop: file list accepted."); + // Get a useful list + java.util.List fileList = (java.util.List) + tr.getTransferData(DataFlavor.javaFileListFlavor); + java.util.Iterator iterator = fileList.iterator(); + // Convert list to array + File[] filesTemp = new File[fileList.size()]; + fileList.toArray(filesTemp); + final File[] files = filesTemp; + // Alert listener to drop. + if (listener != null) + listener.filesDropped(files); + // Mark that drop is completed. + evt.getDropTargetContext().dropComplete(true); + log(out, "FileDrop: drop complete."); + } // end if: file list + else // this section will check for a reader flavor. + { + // Thanks, Nathan! + // BEGIN 2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added. + DataFlavor[] flavors = tr.getTransferDataFlavors(); + boolean handled = false; + for (int zz = 0; zz < flavors.length; zz++) { + if (flavors[zz].isRepresentationClassReader()) { + // Say we'll take it. + //evt.acceptDrop ( java.awt.dnd.DnDConstants.ACTION_COPY_OR_MOVE ); + evt.acceptDrop(java.awt.dnd.DnDConstants.ACTION_COPY); + log(out, "FileDrop: reader accepted."); + Reader reader = flavors[zz].getReaderForText(tr); + BufferedReader br = new BufferedReader(reader); + if (listener != null) + listener.filesDropped(createFileArray(br, out)); + // Mark that drop is completed. + evt.getDropTargetContext().dropComplete(true); + log(out, "FileDrop: drop complete."); + handled = true; + break; + } + } + if (!handled) { + log(out, "FileDrop: not a file list or reader - abort."); + evt.rejectDrop(); + } + // END 2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added. + } // end else: not a file list + } // end try + catch (IOException io) { + log(out, "FileDrop: IOException - abort:"); + Global.Log.PrintException(io); + evt.rejectDrop(); + } // end catch IOException + catch (java.awt.datatransfer.UnsupportedFlavorException ufe) { + log(out, "FileDrop: UnsupportedFlavorException - abort:"); + Global.Log.PrintException(ufe); + evt.rejectDrop(); + } // end catch: UnsupportedFlavorException + finally { + // If it's a Swing component, reset its border + if (c instanceof javax.swing.JComponent) { + javax.swing.JComponent jc = (javax.swing.JComponent) c; + jc.setBorder(normalBorder); + log(out, "FileDrop: normal border restored."); + } // end if: JComponent + } // end finally + } // end drop + public void dragExit(java.awt.dnd.DropTargetEvent evt) { + log(out, "FileDrop: dragExit event."); + // If it's a Swing component, reset its border + if (c instanceof javax.swing.JComponent) { + javax.swing.JComponent jc = (javax.swing.JComponent) c; + jc.setBorder(normalBorder); + log(out, "FileDrop: normal border restored."); + } // end if: JComponent + } // end dragExit + public void dropActionChanged(java.awt.dnd.DropTargetDragEvent evt) { + log(out, "FileDrop: dropActionChanged event."); + // Is this an acceptable drag event? + if (isDragOk(out, evt)) { //evt.acceptDrag( java.awt.dnd.DnDConstants.ACTION_COPY_OR_MOVE ); + evt.acceptDrag(java.awt.dnd.DnDConstants.ACTION_COPY); + log(out, "FileDrop: event accepted."); + } // end if: drag ok + else { + evt.rejectDrag(); + log(out, "FileDrop: event rejected."); + } // end else: drag not ok + } // end dropActionChanged + }; // end DropTargetListener + // Make the component (and possibly children) drop targets + makeDropTarget(out, c, recursive); + } // end if: supports dnd + else { + log(out, "FileDrop: Drag and drop is not supported with this JVM"); + } // end else: does not support DnD + } // end constructor + private static boolean supportsDnD() { // Static Boolean + if (supportsDnD == null) { + boolean support = false; + try { + Class arbitraryDndClass = Class.forName("java.awt.dnd.DnDConstants"); + support = true; + } // end try + catch (Exception e) { + support = false; + } // end catch + supportsDnD = new Boolean(support); + } // end if: first time through + return supportsDnD.booleanValue(); + } // end supportsDnD + private static File[] createFileArray(BufferedReader bReader, PrintStream out) { + try { + java.util.List list = new java.util.ArrayList(); + String line = null; + while ((line = bReader.readLine()) != null) { + try { + // kde seems to append a 0 char to the end of the reader + if (ZERO_CHAR_STRING.equals(line)) continue; + File file = new File(new java.net.URI(line)); + list.add(file); + } catch (Exception ex) { + log(out, "Error with " + line + ": " + ex.getMessage()); + } + } + return (File[]) list.toArray(new File[list.size()]); + } catch (IOException ex) { + log(out, "FileDrop: IOException"); + } + return new File[0]; + } + /** + * Outputs message to out if it's not null. + */ + private static void log(PrintStream out, String message) { // Log message if requested + // if (out != null) + // UI.Print(DebugPrintLevel.DragDrop, message); + } // end log + /** + * Removes the drag-and-drop hooks from the component and optionally + * from the all children. You should call this if you add and remove + * database.Objects.components after you've set up the drag-and-drop. + * This will recursively unregister all database.Objects.components contained within + * c if c is a {@link java.awt.Container}. + * + * @param c The component to unregister as a drop target + * @since 1.0 + */ + public static boolean remove(java.awt.Component c) { + return remove(null, c, true); + } // end remove + /** + * Removes the drag-and-drop hooks from the component and optionally + * from the all children. You should call this if you add and remove + * database.Objects.components after you've set up the drag-and-drop. + * + * @param out Optional {@link PrintStream} for logging drag and drop messages + * @param c The component to unregister + * @param recursive Recursively unregister database.Objects.components within a container + * @since 1.0 + */ + public static boolean remove(PrintStream out, java.awt.Component c, boolean recursive) { // Make sure we support dnd. + if (supportsDnD()) { + log(out, "FileDrop: Removing drag-and-drop hooks."); + c.setDropTarget(null); + if (recursive && (c instanceof java.awt.Container)) { + java.awt.Component[] comps = ((java.awt.Container) c).getComponents(); + for (int i = 0; i < comps.length; i++) + remove(out, comps[i], recursive); + return true; + } // end if: recursive + else return false; + } // end if: supports DnD + else return false; + } // end remove + // END 2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added. + private void makeDropTarget(final PrintStream out, final java.awt.Component c, boolean recursive) { + // Make drop target + final java.awt.dnd.DropTarget dt = new java.awt.dnd.DropTarget(); + try { + dt.addDropTargetListener(dropListener); + } // end try + catch (java.util.TooManyListenersException e) { + Global.Log.PrintException(e); + log(out, "FileDrop: Drop will not work due to previous error. Do you have another listener attached?"); + } // end catch + // Listen for hierarchy changes and remove the drop target when the parent gets cleared out. + c.addHierarchyListener(new java.awt.event.HierarchyListener() { + public void hierarchyChanged(java.awt.event.HierarchyEvent evt) { + log(out, "FileDrop: Hierarchy changed."); + java.awt.Component parent = c.getParent(); + if (parent == null) { + c.setDropTarget(null); + log(out, "FileDrop: Drop target cleared from component."); + } // end if: null parent + else { + new java.awt.dnd.DropTarget(c, dropListener); + log(out, "FileDrop: Drop target added to component."); + } // end else: parent not null + } // end hierarchyChanged + }); // end hierarchy listener + if (c.getParent() != null) + new java.awt.dnd.DropTarget(c, dropListener); + if (recursive && (c instanceof java.awt.Container)) { + // Get the container + java.awt.Container cont = (java.awt.Container) c; + // Get it's database.Objects.components + java.awt.Component[] comps = cont.getComponents(); + // Set it's database.Objects.components as listeners also + for (int i = 0; i < comps.length; i++) + makeDropTarget(out, comps[i], recursive); + } // end if: recursively set database.Objects.components as listener + } // end dropListener + /** + * Determine if the dragged data is a file list. + */ + private boolean isDragOk(final PrintStream out, final java.awt.dnd.DropTargetDragEvent evt) { + boolean ok = false; + // Get data flavors being dragged + DataFlavor[] flavors = evt.getCurrentDataFlavors(); + // See if any of the flavors are a file list + int i = 0; + while (!ok && i < flavors.length) { + // BEGIN 2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added. + // Is the flavor a file list? + final DataFlavor curFlavor = flavors[i]; + if (curFlavor.equals(DataFlavor.javaFileListFlavor) || + curFlavor.isRepresentationClassReader()) { + ok = true; + } + // END 2007-09-12 Nathan Blomquist -- Linux (KDE/Gnome) support added. + i++; + } // end while: through flavors + // If logging is enabled, show data flavors + if (out != null) { + if (flavors.length == 0) + log(out, "FileDrop: no data flavors."); + for (i = 0; i < flavors.length; i++) + log(out, flavors[i].toString()); + } // end if: logging enabled + return ok; + } // end isDragOk + + + + + /* ******** I N N E R I N T E R F A C E L I S T E N E R ******** */ + /** + * Implement this inner interface to listen for when files are dropped. For example + * your class declaration may begin like this: + *
+     *      public class MyClass implements FileDrop.Listener
+     *      ...
+     *      public void filesDropped( java.io.File[] files )
+     *      {
+     *          ...
+     *      }   // end filesDropped
+     *      ...
+     * 
+ * + * @since 1.1 + */ + public interface Listener { + /** + * This method is called when files have been successfully dropped. + * + * @param files An array of Files that were dropped. + * @since 1.0 + */ + void filesDropped(File[] files); + } // end inner-interface Listener + + + /* ******** I N N E R C L A S S ******** */ + /** + * This is the event that is passed to the + * {@link FileDropListener#filesDropped filesDropped(...)} method in + * your {@link FileDropListener} when files are dropped onto + * a registered drop target. + * + *

I'm releasing this code into the Public Domain. Enjoy.

+ * + * @author Robert Harder + * @author rob@iharder.net + * @version 1.2 + */ + public static class Event extends java.util.EventObject { + private final File[] files; + /** + * Constructs an {@link Event} with the array + * of files that were dropped and the + * {@link FileDrop} that initiated the event. + * + * @param files The array of files that were dropped + * @source The event source + * @since 1.1 + */ + public Event(File[] files, Object source) { + super(source); + this.files = files; + } // end constructor + /** + * Returns an array of files that were dropped on a + * registered drop target. + * + * @return array of files that were dropped + * @since 1.1 + */ + public File[] getFiles() { + return files; + } // end getFiles + } // end inner class Event + + + + /* ******** I N N E R C L A S S ******** */ + /** + * At last an easy way to encapsulate your custom objects for dragging and dropping + * in your Java programs! + * When you need to create a {@link java.awt.datatransfer.Transferable} object, + * use this class to wrap your object. + * For example: + *

+     *      ...
+     *      MyCoolClass myObj = new MyCoolClass();
+     *      Transferable xfer = new TransferableObject( myObj );
+     *      ...
+     * 
+ * Or if you need to know when the data was actually dropped, like when you're + * moving data out of a list, say, you can use the {@link Fetcher} + * inner class to return your object Just in Time. + * For example: + *

+     *      ...
+     *      final MyCoolClass myObj = new MyCoolClass();
+     *
+     *      TransferableObject.Fetcher fetcher = new TransferableObject.Fetcher()
+     *      {   public Object getObject(){ return myObj; }
+     *      }; // end fetcher
+     *
+     *      Transferable xfer = new TransferableObject( fetcher );
+     *      ...
+     * 
+ *

+ * The {@link DataFlavor} associated with + * {@link TransferableObject} has the representation class + * net.iharder.dnd.TransferableObject.class and MIME type + * application/x-net.iharder.dnd.TransferableObject. + * This data flavor is accessible via the static + * {@link #DATA_FLAVOR} property. + * + * + *

I'm releasing this code into the Public Domain. Enjoy.

+ * + * @author Robert Harder + * @author rob@iharder.net + * @version 1.2 + */ + public static class TransferableObject implements java.awt.datatransfer.Transferable { + /** + * The MIME type for {@link #DATA_FLAVOR} is + * application/x-net.iharder.dnd.TransferableObject. + * + * @since 1.1 + */ + public final static String MIME_TYPE = "application/x-net.iharder.dnd.TransferableObject"; + /** + * The default {@link DataFlavor} for + * {@link TransferableObject} has the representation class + * net.iharder.dnd.TransferableObject.class + * and the MIME type + * application/x-net.iharder.dnd.TransferableObject. + * + * @since 1.1 + */ + public final static DataFlavor DATA_FLAVOR = + new DataFlavor(TransferableObject.class, MIME_TYPE); + private Fetcher fetcher; + private Object data; + private DataFlavor customFlavor; + /** + * Creates a new {@link TransferableObject} that wraps data. + * Along with the {@link #DATA_FLAVOR} associated with this class, + * this creates a custom data flavor with a representation class + * determined from data.getClass() and the MIME type + * application/x-net.iharder.dnd.TransferableObject. + * + * @param data The data to transfer + * @since 1.1 + */ + public TransferableObject(Object data) { + this.data = data; + this.customFlavor = new DataFlavor(data.getClass(), MIME_TYPE); + } // end constructor + /** + * Creates a new {@link TransferableObject} that will return the + * object that is returned by fetcher. + * No custom data flavor is set other than the default + * {@link #DATA_FLAVOR}. + * + * @param fetcher The {@link Fetcher} that will return the data object + * @see Fetcher + * @since 1.1 + */ + public TransferableObject(Fetcher fetcher) { + this.fetcher = fetcher; + } // end constructor + /** + * Creates a new {@link TransferableObject} that will return the + * object that is returned by fetcher. + * Along with the {@link #DATA_FLAVOR} associated with this class, + * this creates a custom data flavor with a representation class dataClass + * and the MIME type + * application/x-net.iharder.dnd.TransferableObject. + * + * @param dataClass The {@link Class} to use in the custom data flavor + * @param fetcher The {@link Fetcher} that will return the data object + * @see Fetcher + * @since 1.1 + */ + public TransferableObject(Class dataClass, Fetcher fetcher) { + this.fetcher = fetcher; + this.customFlavor = new DataFlavor(dataClass, MIME_TYPE); + } // end constructor + /** + * Returns the custom {@link DataFlavor} associated + * with the encapsulated object or null if the {@link Fetcher} + * constructor was used without passing a {@link Class}. + * + * @return The custom data flavor for the encapsulated object + * @since 1.1 + */ + public DataFlavor getCustomDataFlavor() { + return customFlavor; + } // end getCustomDataFlavor + + + /* ******** T R A N S F E R A B L E M E T H O D S ******** */ + /** + * Returns a two- or three-element array containing first + * the custom data flavor, if one was created in the constructors, + * second the default {@link #DATA_FLAVOR} associated with + * {@link TransferableObject}, and third the + * {@link DataFlavor.stringFlavor}. + * + * @return An array of supported data flavors + * @since 1.1 + */ + public DataFlavor[] getTransferDataFlavors() { + if (customFlavor != null) + return new DataFlavor[] + {customFlavor, + DATA_FLAVOR, + DataFlavor.stringFlavor + }; // end flavors array + else + return new DataFlavor[] + {DATA_FLAVOR, + DataFlavor.stringFlavor + }; // end flavors array + } // end getTransferDataFlavors + /** + * Returns the data encapsulated in this {@link TransferableObject}. + * If the {@link Fetcher} constructor was used, then this is when + * the {@link Fetcher#getObject getObject()} method will be called. + * If the requested data flavor is not supported, then the + * {@link Fetcher#getObject getObject()} method will not be called. + * + * @param flavor The data flavor for the data to return + * @return The dropped data + * @since 1.1 + */ + public Object getTransferData(DataFlavor flavor) + throws java.awt.datatransfer.UnsupportedFlavorException, IOException { + // Native object + if (flavor.equals(DATA_FLAVOR)) + return fetcher == null ? data : fetcher.getObject(); + // String + if (flavor.equals(DataFlavor.stringFlavor)) + return fetcher == null ? data.toString() : fetcher.getObject().toString(); + // We can't do anything else + throw new java.awt.datatransfer.UnsupportedFlavorException(flavor); + } // end getTransferData + /** + * Returns true if flavor is one of the supported + * flavors. Flavors are supported using the equals(...) method. + * + * @param flavor The data flavor to check + * @return Whether or not the flavor is supported + * @since 1.1 + */ + public boolean isDataFlavorSupported(DataFlavor flavor) { + // Native object + if (flavor.equals(DATA_FLAVOR)) + return true; + // String + return flavor.equals(DataFlavor.stringFlavor); + // We can't do anything else + } // end isDataFlavorSupported + + + /* ******** I N N E R I N T E R F A C E F E T C H E R ******** */ + /** + * Instead of passing your data directly to the {@link TransferableObject} + * constructor, you may want to know exactly when your data was received + * in case you need to remove it from its source (or do anyting else to it). + * When the {@link #getTransferData getTransferData(...)} method is called + * on the {@link TransferableObject}, the {@link Fetcher}'s + * {@link #getObject getObject()} method will be called. + * + * @author Robert Harder + * @version 1.1 + * @copyright 2001 + * @since 1.1 + */ + public interface Fetcher { + /** + * Return the object being encapsulated in the + * {@link TransferableObject}. + * + * @return The dropped object + * @since 1.1 + */ + Object getObject(); + } // end inner interface Fetcher + } // end class TransferableObject +} // end class FileDrop diff --git a/src/Common/UI/Editor/BaseEditor.java b/src/Common/UI/Editor/BaseEditor.java new file mode 100644 index 00000000..83c03109 --- /dev/null +++ b/src/Common/UI/Editor/BaseEditor.java @@ -0,0 +1,154 @@ +package Common.UI.Editor; +import Common.Current; +import Common.Global; +import Common.UI.Menus.StyledPopupMenu; +import Common.UI.Menus.TextEditorMenu; +import Common.UI.Themes.ThemeElement; +import Common.UI.UI; +import Common.UI.Windows.Dialog.DialogFields; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; + +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import java.awt.*; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.net.URI; +public class BaseEditor extends RSyntaxTextArea implements ThemeElement, DialogFields { + private final StyledPopupMenu menu; + // protected int changesCount = 0; + // protected int insertsCount = 0; + // protected int removesCount = 0; + // protected boolean ctrlZ = false; + protected String startText = ""; + private boolean search_enabled = true; + public BaseEditor() { + setTabSize(6); + setPaintTabLines(true); + setCodeFoldingEnabled(true); + addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.isControlDown()) { + switch (e.getKeyCode()) { + case KeyEvent.VK_ADD: //num lock + + case KeyEvent.VK_EQUALS: //+ + FontUp(); + break; + case KeyEvent.VK_SUBTRACT: //num lock - + case KeyEvent.VK_MINUS: //- + FontDown(); + break; + case KeyEvent.VK_S: + saveText(); + break; + //todo переход в нужную Ñтроку по ctrl+g? + case KeyEvent.VK_Z: + if (getText().equals(startText)) { + UI.Info("ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ Ñ‚ÐµÐºÑта доÑтигнута."); + e.consume(); + } + break; + } + } + } + }); + setPopupMenu(menu = createMenu()); + applyTheme(); + //- + this.setHyperlinksEnabled(true); + HyperlinkListener listener = new HyperlinkListener() { + @Override + public void hyperlinkUpdate(HyperlinkEvent event) { + if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED) { + try { + Desktop.getDesktop().browse(new URI(event.getURL().toString())); + } catch (Exception ioe) { + System.err.println("Error loading url from link: " + ioe); + } + } + } + }; + this.addHyperlinkListener(listener); + } + @Override + public void setText(String t) { + super.setText(t); + startText = t; + } + public void setSearchEnabled(boolean f_in) { + search_enabled = f_in; + } + protected StyledPopupMenu createMenu() { + return new TextEditorMenu(this); + } + private void changeFont(int size) { + if ((size > 1) && (size < 48)) { + setFont(getFont().deriveFont((float) size)); + saveFont(); + } + } + protected void saveFont() { + } + protected void saveText() { + } + public void ClearSelection() { + setSelectionStart(0); + setSelectionEnd(0); + } + public void gotoLine(int LineNum) { + gotoLine_(LineNum - 1); + } + //без вычитаниÑ. + public void gotoLine_(int LineNum) { + //requestFocus(); + try { + //оÑобеннÑть контрола. + //Ð½ÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñтью Ñкинуть текущую позицию. пÑтому еÑли надо + //оÑвежить 0 Ñтроку, передергиваем до поÑледней. + if (LineNum == 0) + setCaretPosition(getLineStartOffset(getLineCount() - 1)); + ClearSelection(); + if (LineNum > 0) { + setCaretPosition(getLineStartOffset(LineNum)); + setSelectionStart(getLineStartOffset(LineNum)); + setSelectionEnd(getLineStartOffset(LineNum)); + } + } catch (Exception ex) { + Global.Log.Print("Ðе удалоÑÑŒ перейти на Ñтроку " + LineNum); + Global.Log.PrintException(ex); + } + } + //------------------------------------------ + public void FontUp() { + changeFont(getFont().getSize() + 1); + } + public void FontDown() { + changeFont(getFont().getSize() - 1); + } + @Override + public void applyTheme() { + float font_size = (float) getFont().getSize(); + Current.getTheme().getEditorTheme().apply(this); + setFont(getFont().deriveFont(font_size)); + menu.applyTheme(); + //меню ÑвÑзано Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð¾Ð¼. поÑтому тема менÑетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ вмеÑте Ñ Ð½Ð¸Ð¼. + } + @Override + public Component getContent() { + return this; + } + public void ShowBegin() { + setCaretPosition(0); + } + public boolean lineIsVisible(int lineNum) { + boolean res = false; + Rectangle rectangle = this.getVisibleRect(); + try { + res = rectangle.contains(rectangle.x, yForLine(lineNum)); + } catch (Exception ex) { + ex.printStackTrace(); + } + return res; + } +} diff --git a/src/Common/UI/Editor/CaretInfo.java b/src/Common/UI/Editor/CaretInfo.java new file mode 100644 index 00000000..4c66e1bf --- /dev/null +++ b/src/Common/UI/Editor/CaretInfo.java @@ -0,0 +1,30 @@ +package Common.UI.Editor; +import Common.Global; +import ProjectData.Files.UI.Editor.SPFEditor; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; +public class CaretInfo { + public String current_line = ""; //полный текÑÑ‚ текущей Ñтроки + public String before = ""; //куÑок Ñтроки перед кареткой + public String after = ""; //куÑок Ñтроки поÑле каретки + public String prefix_word = ""; //Ñлово перед кареткой + public String suffix_word = ""; //Ñлово поÑле каретки + public CaretInfo(RSyntaxTextArea Body) { + try { + int start = Body.getLineStartOffset(Body.getCaretLineNumber()); + int before_length = Body.getCaretOffsetFromLineStart(); + int end = Body.getLineEndOffset(Body.getCaretLineNumber()); + int after_length = end - start - before_length; + before = Body.getText(start, before_length).toUpperCase(); + after = Body.getText(start + before_length, after_length).toUpperCase(); + //нужно чтобы перевод Ñтроки не влезал + after = after.replace("\n", ""); + current_line = (before + after); + prefix_word = SPFEditor.getLastWord(before, ' ', ',', ':', '.', '(', ')'); + suffix_word = SPFEditor.getFirstWord(after, ' ', ',', ':', '.', '(', ')'); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + public CaretInfo() { + } +} diff --git a/src/Common/UI/Editor/Viewer.java b/src/Common/UI/Editor/Viewer.java new file mode 100644 index 00000000..c16ee08b --- /dev/null +++ b/src/Common/UI/Editor/Viewer.java @@ -0,0 +1,8 @@ +package Common.UI.Editor; +public class Viewer extends BaseEditor { + public Viewer() { + setLineWrap(true); + setWrapStyleWord(true); + setEditable(false); + } +} diff --git a/src/Common/UI/EmptyDialogFields.form b/src/Common/UI/EmptyDialogFields.form new file mode 100644 index 00000000..5695f05c --- /dev/null +++ b/src/Common/UI/EmptyDialogFields.form @@ -0,0 +1,11 @@ + +
+ + + + + + + + +
diff --git a/src/Common/UI/EmptyDialogFields.java b/src/Common/UI/EmptyDialogFields.java new file mode 100644 index 00000000..1da1c1b7 --- /dev/null +++ b/src/Common/UI/EmptyDialogFields.java @@ -0,0 +1,12 @@ +package Common.UI; +import Common.UI.Windows.Dialog.DialogFields; + +import javax.swing.*; +import java.awt.*; +public class EmptyDialogFields implements DialogFields { + private JPanel content; + @Override + public Component getContent() { + return content; + } +} diff --git a/src/Common/UI/Label/ShortLabel.java b/src/Common/UI/Label/ShortLabel.java new file mode 100644 index 00000000..f0f8b3f1 --- /dev/null +++ b/src/Common/UI/Label/ShortLabel.java @@ -0,0 +1,15 @@ +package Common.UI.Label; +import javax.swing.*; +public class ShortLabel extends JLabel { + int max = 0; + public ShortLabel(int max_in) { + max = max_in; + } + @Override + public void setText(String text_in) { + if ((max > 0) && (text_in.length() > max)) { + super.setText(text_in.substring(0, max - 1) + "..."); + } else super.setText(text_in); + setToolTipText(text_in); + } +} diff --git a/src/Common/UI/List/HyperlinksStyledList.java b/src/Common/UI/List/HyperlinksStyledList.java new file mode 100644 index 00000000..903f3880 --- /dev/null +++ b/src/Common/UI/List/HyperlinksStyledList.java @@ -0,0 +1,10 @@ +package Common.UI.List; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; +public class HyperlinksStyledList extends StyledList { + @Override + public void applyTheme() { + super.applyTheme(); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Hyperlink)); + } +} diff --git a/src/Common/UI/List/StyledList.java b/src/Common/UI/List/StyledList.java new file mode 100644 index 00000000..c6abc6cb --- /dev/null +++ b/src/Common/UI/List/StyledList.java @@ -0,0 +1,17 @@ +package Common.UI.List; +import Common.Current; +import Common.UI.Themes.ThemeElement; +import Common.UI.Themes.VisualiserFonts; + +import javax.swing.*; +public class StyledList extends JList implements ThemeElement { + public StyledList() { + setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain)); + applyTheme(); + } + @Override + public void applyTheme() { + setBackground(Current.getTheme().table_background); + setForeground(Current.getTheme().foreground); + } +} diff --git a/src/Common/UI/Menus/AttachementsMenu.java b/src/Common/UI/Menus/AttachementsMenu.java new file mode 100644 index 00000000..1957206a --- /dev/null +++ b/src/Common/UI/Menus/AttachementsMenu.java @@ -0,0 +1,30 @@ +package Common.UI.Menus; +import Common.Current; +import Common.Global; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +public class AttachementsMenu extends StyledPopupMenu { + JMenuItem mscreenshot; + JMenuItem mExplorer; + public AttachementsMenu() { + add(mscreenshot = Pass_2021.passes.get(PassCode_2021.MakeScreenShot).createMenuItem()); + addSeparator(); + mExplorer = new VisualiserMenuItem("Открыть Ð²Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² проводнике...", "/icons/Explorer.png"); + mExplorer.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + try { + Desktop.getDesktop().open(Current.getProject().getAttachmentsDirectory()); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + }); + add(mExplorer); + } +} diff --git a/src/Common/UI/Menus/FileStyleMenu.java b/src/Common/UI/Menus/FileStyleMenu.java new file mode 100644 index 00000000..d7b73c08 --- /dev/null +++ b/src/Common/UI/Menus/FileStyleMenu.java @@ -0,0 +1,24 @@ +package Common.UI.Menus; +import Common.Current; +import ProjectData.Files.LanguageStyle; + +import javax.swing.*; +import java.awt.event.ActionEvent; +public class FileStyleMenu extends StyledPopupMenu { + public FileStyleMenu() { + for (LanguageStyle s : LanguageStyle.values()) { + JMenuItem m = new VisualiserMenuItem(s.getDescription()); + m.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + if (Current.getFile().UpdateStyle(s)) { + Current.getSapfor().ResetAllAnalyses(); + Current.getFile().form.ShowStyle(); + } + } + }); + add(m); + } + } +} diff --git a/src/Common/UI/Menus/GraphMenu.java b/src/Common/UI/Menus/GraphMenu.java new file mode 100644 index 00000000..055c12f4 --- /dev/null +++ b/src/Common/UI/Menus/GraphMenu.java @@ -0,0 +1,35 @@ +package Common.UI.Menus; +import Common.UI.Trees.StyledTree; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.MouseEvent; +public class GraphMenu extends StyledPopupMenu { + public T tree; + public GraphMenu(T tree_in, String branches_name) { + tree = tree_in; + JMenuItem m = null; + m = new VisualiserMenuItem("Свернуть вÑе " + branches_name); + m.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + tree.CollapseAll(); + } + }); + add(m); + m = new VisualiserMenuItem("Развернуть вÑе " + branches_name); + m.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + tree.ExpandAll(); + } + }); + add(m); + } + public GraphMenu(T tree) { + this(tree, tree.getBranchesName()); + } + public void Show(MouseEvent mouseEvent) { + show(tree, mouseEvent.getX(), mouseEvent.getY()); + } +} diff --git a/src/Common/UI/Menus/MainEditorMenu.java b/src/Common/UI/Menus/MainEditorMenu.java new file mode 100644 index 00000000..0c61f235 --- /dev/null +++ b/src/Common/UI/Menus/MainEditorMenu.java @@ -0,0 +1,342 @@ +package Common.UI.Menus; +import Common.Current; +import Common.Global; +import Common.UI.Editor.CaretInfo; +import Common.Utils.Utils; +import ProjectData.Files.DBProjectFile; +import ProjectData.Files.UI.Editor.SPFEditor; +import ProjectData.SapforData.Functions.FuncCall; +import ProjectData.SapforData.Functions.FuncInfo; +import ProjectData.SapforData.Functions.FunctionType; +import ProjectData.SapforData.Loops.Loop; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +import org.fife.ui.rsyntaxtextarea.RSyntaxTextArea; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +public class MainEditorMenu extends TextEditorMenu { + FuncCall call = null; + FuncInfo decl = null; + Loop loop = null; + DBProjectFile header = null; + //------------------ + JMenuItem m_comment; + JMenuItem m_uncomment; + JMenuItem m_inline; + JMenuItem m_add_lines_to_region; + JMenuItem m_remove_lines_from_region; + JMenuItem m_loop_union; + JMenuItem m_undo; + JMenuItem m_gotoFunction; + JMenuItem m_gotoHeader; + //----------------- + public MainEditorMenu(RSyntaxTextArea editor_in) { + super(editor_in); + addSeparator(); + m_gotoHeader = new VisualiserMenuItem("Перейти к заголовочному файлу", "/icons/Transformations/SPF_InsertIncludesPass.png"); + m_gotoHeader.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Pass_2021.passes.get(PassCode_2021.OpenCurrentFile).Do(header); + } + }); + add(m_gotoHeader); + addSeparator(); + m_gotoFunction = new VisualiserMenuItem("Перейти к объÑвлению процедуры", "/icons/versions/currentVersion.png"); + m_gotoFunction.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + decl.Show(true); + } + }); + add(m_gotoFunction); + m_inline = new VisualiserMenuItem("ПодÑтавить вызов процедуры", "/icons/Transformations/SPF_InlineProcedures.png"); + m_inline.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Pass_2021.passes.get(PassCode_2021.SPF_InlineProcedure).Do(call); + } + }); + add(m_inline); + addSeparator(); + m_loop_union = new VisualiserMenuItem("Объединить цикл Ñо Ñледующим", "/icons/Transformations/SPF_LoopUnion.png"); + m_loop_union.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Pass_2021.passes.get(PassCode_2021.SPF_LoopUnionCurrent).Do(); + } + }); + add(m_loop_union); + m_add_lines_to_region = new VisualiserMenuItem("Добавить Ñтроки в облаÑть", "/icons/Menu/AddLines.png"); + m_add_lines_to_region.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + try { + Pass_2021.passes.get(PassCode_2021.SPF_ChangeSpfIntervals).Do( + ((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionStart()) + 1, + ((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionEnd()) + 1, + 1 + ); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + }); + add(m_add_lines_to_region); + m_remove_lines_from_region = new VisualiserMenuItem("Удалить Ñтроки из облаÑти", "/icons/Menu/RemoveLines.png"); + m_remove_lines_from_region.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + try { + Pass_2021.passes.get(PassCode_2021.SPF_ChangeSpfIntervals).Do( + ((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionStart()) + 1, + ((RSyntaxTextArea) editor).getLineOfOffset(editor.getSelectionEnd()) + 1, + 0 + ); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + }); + add(m_remove_lines_from_region); + addSeparator(); + m_comment = new VisualiserMenuItem("Закомментировать блок", "/icons/Editor/Comment.png"); + m_comment.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + String new_ = ""; + String[] data = selectedText.split("\n"); + int i = 0; + switch (Current.getFile().languageName) { + case fortran: + for (String line : data) { + if (!line.startsWith("!")) { + new_ += "!" + line; + } else new_ += line; + if (i < data.length - 1) new_ += "\n"; + ++i; + } + break; + case c: + case cpp: + for (String line : data) { + if (!line.startsWith("//")) { + new_ += "//" + line; + } else new_ += line; + if (i < data.length - 1) new_ += "\n"; + ++i; + } + break; + default: + new_ = selectedText; + break; + } + editor.replaceSelection(new_); + } + }); + add(m_comment); + m_uncomment = new VisualiserMenuItem("РаÑкомментировать блок", "/icons/Editor/Uncomment.png"); + m_uncomment.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + String new_ = ""; + String[] data = selectedText.split("\n"); + int i = 0; + switch (Current.getFile().languageName) { + case fortran: + for (String line : data) { + if (line.startsWith("!")) { + new_ += line.substring(1); + } else new_ += line; + if (i < data.length - 1) new_ += "\n"; + ++i; + } + break; + case c: + case cpp: + for (String line : data) { + if (line.startsWith("//")) { + new_ += line.substring(2); + } else new_ += line; + if (i < data.length - 1) new_ += "\n"; + ++i; + } + break; + default: + new_ = selectedText; + break; + } + //todo. возможно, изменить концепцию на выделенные Ñтроки? + editor.replaceSelection(new_); + } + }); + add(m_uncomment); + addSeparator(); + m_undo = new VisualiserMenuItem("Отменить поÑледнюю модификацию", "/icons/Menu/Undo.png"); + m_undo.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + try { + Current.getSapfor().UpdateProjectFiles(false); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + }); + add(m_undo); + } + private void checkFunction() { + call = null; + decl = null; + //-- + m_inline.setEnabled(false); + m_gotoFunction.setEnabled(false); + //-- + m_inline.setToolTipText(""); + m_gotoFunction.setToolTipText(""); + //-- + if (selectedText == null) { + m_inline.setText("Ðевозможно подÑтавить вызов процедуры. Ðе выделено Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹."); + m_gotoFunction.setText("Ðевозможно перейти к объÑвлению процедуры. Ðе выделено Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹"); + return; + } + if (selectedText.contains("\n")) { + m_inline.setText("Ðевозможно подÑтавить вызов процедуры. Выделено неÑколько Ñтрок"); + m_gotoFunction.setText("Ðевозможно перейти к объÑвлению процедуры. Выделено неÑколько Ñтрок."); + return; + } + if (!Utils.isFunctionName(selectedText)) { + String tip = "Ð˜Ð¼Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ñ‹ может Ñодержать только английÑкие буквы, цифры и подчеркиваниÑ, и не может начинатьÑÑ Ñ Ñ†Ð¸Ñ„Ñ€Ñ‹."; + //- + m_inline.setText("Ðевозможно подÑтавить вызов процедуры " + Utils.Brackets(selectedText) + + " . Выделено некорректное имÑ."); + m_gotoFunction.setText("Ðевозможно перейти к объÑвлению процедуры " + Utils.Brackets(selectedText) + + " . Выделено некорректное имÑ."); + //- + m_inline.setToolTipText(tip); + m_gotoFunction.setToolTipText(tip); + return; + } + if (!Pass_2021.passes.get(PassCode_2021.SPF_GetGraphFunctions).isDone()) { + m_inline.setText("Ðевозможно подÑтавить вызов процедуры " + Utils.Brackets(selectedText) + + " . Выполните проход \"Граф процедур \"."); + m_gotoFunction.setText("Ðевозможно перейти к объÑвлению процедуры " + Utils.Brackets(selectedText) + + " . Выполните проход \"Граф процедур \""); + return; + } + if (Current.getSapfor().isIntrinsic(selectedText)) { + m_inline.setText("Ðевозможно подÑтавить вызов процедуры " + Utils.Brackets(selectedText) + + " . Процедура ÑвлÑетÑÑ Ñтандартной."); + m_gotoFunction.setText("Ðевозможно перейти к объÑвлению процедуры " + Utils.Brackets(selectedText) + + " . Процедура ÑвлÑетÑÑ Ñтандартной."); + return; + } + call = Current.getFile().find_func_call(selectedText); + if (call == null) { + m_inline.setText("Ðевозможно подÑтавить вызов процедуры " + Utils.Brackets(selectedText) + + " . Вызов не найден в текущей Ñтроке."); + m_gotoFunction.setText("Ðевозможно перейти к объÑвлению процедуры " + Utils.Brackets(selectedText) + + " . ОбъÑвление процедуры уже находитÑÑ Ð² текущей Ñтроке."); + return; + } + decl = Current.getProject().allFunctions.get(call.funcName); + if (decl.type.equals(FunctionType.NotFound)) { + m_inline.setText("Ðевозможно подÑтавить вызов процедуры " + Utils.Brackets(selectedText) + + " . ОбъÑвление процедуры не найдено в проекте."); + m_gotoFunction.setText("Ðевозможно перейти к объÑвлению процедуры " + Utils.Brackets(selectedText) + + " . ОбъÑвление процедуры не найдено в проекте."); + return; + } + //--- + m_inline.setEnabled(true); + m_gotoFunction.setEnabled(true); + m_inline.setText("ПодÑтавить вызов процедуры " + Utils.Brackets(selectedText)); + m_gotoFunction.setText("Перейти к объÑвлению процедуры " + Utils.Brackets(selectedText)); + //-- + } + private void checkHeader() { + header = null; + m_gotoHeader.setEnabled(false); + //-- + CaretInfo caretInfo = ((SPFEditor) editor).getCaretInfo(); + if (caretInfo != null) { + String header_ = Utils.extractHeaderName(caretInfo.current_line); + if (header_ == null) { + m_gotoHeader.setText("Ðевозможно перейти к заголовочному файлу. Ð’ текущей Ñтроке не найдено включений."); + return; + } + if (!Pass_2021.passes.get(PassCode_2021.SPF_GetIncludeDependencies).isDone()) { + m_gotoHeader.setText("Ðевозможно перейти к заголовочному файлу. Выполните проход \"ПоиÑк завиÑимоÑтей по включению\""); + return; + } + if (!Current.getFile().relativeHeaders.containsKey(header_)) { + m_gotoHeader.setText("Ðевозможно перейти к заголовочному файлу " + Utils.Brackets(header_) + " . Файл не найден Ñреди включений текущего файла."); + return; + } + header = Current.getFile().relativeHeaders.get(header_); + m_gotoHeader.setText("Переход к заголовочному файлу " + Utils.Brackets(header_)); + m_gotoHeader.setEnabled(true); + } + } + private void checkLoop() { + loop = null; + m_loop_union.setEnabled(false); + if (!Pass_2021.passes.get(PassCode_2021.SPF_GetGraphLoops).isDone()) { + m_loop_union.setText("Ðевозможно объединить цикл в текущей Ñтроке Ñо Ñледующим. " + + "Выполните проход \"Граф циклов\""); + return; + } + loop = Current.getFile().find_current_loop(); + if (loop == null) { + m_loop_union.setText("Ðевозможно объединить цикл в текущей Ñтроке Ñо Ñледующим. Ðе найдено циклов в текущей Ñтроке."); + return; + } + m_loop_union.setEnabled(true); + m_loop_union.setText("Объединить цикл в Ñтроке " + Utils.Brackets(loop.line) + " Ñо Ñледующим"); + } + @Override + public void CheckElementsVisibility() { + super.CheckElementsVisibility(); + m_strike.setVisible(false); + m_unstrike.setVisible(false); + checkFunction(); + checkHeader(); + checkLoop(); + if (selectedText == null) { + m_comment.setEnabled(false); + m_uncomment.setEnabled(false); + m_add_lines_to_region.setEnabled(false); + m_remove_lines_from_region.setEnabled(false); + m_comment.setText("Ðевозможно закомментировать блок. Ðе выделено ни одной Ñтроки."); + m_uncomment.setText("Ðевозможно раÑкомментировать блок. Ðе выделено ни одной Ñтроки."); + m_add_lines_to_region.setText("Ðевозможно добавить Ñтроки в облаÑть. Ðе выделено ни одной Ñтроки."); + m_remove_lines_from_region.setText("Ðевозможно удалить Ñтроки из облаÑти. Ðе выделено ни одной Ñтроки."); + } else { + m_comment.setEnabled(true); + m_uncomment.setEnabled(true); + m_add_lines_to_region.setEnabled(true); + m_remove_lines_from_region.setEnabled(true); + m_comment.setText("Закомментировать блок"); + m_uncomment.setText("РаÑкомментировать блок"); + m_add_lines_to_region.setText("Добавить Ñтроки в облаÑть"); + m_remove_lines_from_region.setText("Удалить Ñтроки из облаÑти"); + } + if (Current.getSapfor().OldFiles.isEmpty()) { + m_undo.setEnabled(false); + m_undo.setText("Ðевозможно отменить поÑледнюю модификацию. Модификации отÑутÑтвуют."); + } else { + m_undo.setEnabled(true); + m_undo.setText("Отменить поÑледнюю модификацию."); + } + } +} diff --git a/src/Common/UI/Menus/PassesSubMenu.java b/src/Common/UI/Menus/PassesSubMenu.java new file mode 100644 index 00000000..abd1e915 --- /dev/null +++ b/src/Common/UI/Menus/PassesSubMenu.java @@ -0,0 +1,18 @@ +package Common.UI.Menus; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; +import Common.Utils.Utils; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; + +import javax.swing.*; +public class PassesSubMenu extends JMenu { + public PassesSubMenu(String title, String icon, PassCode_2021... passes) { + super(title); + setIcon(Utils.getIcon(icon)); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + for (PassCode_2021 code : passes) { + add(Pass_2021.passes.get(code).createMenuItem()); + } + } +} diff --git a/src/Common/UI/Menus/ProjectFilesMenu.java b/src/Common/UI/Menus/ProjectFilesMenu.java new file mode 100644 index 00000000..a102e60c --- /dev/null +++ b/src/Common/UI/Menus/ProjectFilesMenu.java @@ -0,0 +1,135 @@ +package Common.UI.Menus; +import Common.Current; +import Common.Global; +import Common.UI.Menus_2023.LanguagesSubmenu; +import Common.UI.Menus_2023.StableMenuItem; +import Common.UI.Menus_2023.StylesSubmenu; +import Common.UI.Menus_2023.TypesSubmenu; +import Common.UI.Trees.StyledTree; +import Common.UI.UI; +import Common.Utils.Utils; +import ProjectData.Files.FileType; +import ProjectData.Files.LanguageStyle; +import ProjectData.LanguageName; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +public class ProjectFilesMenu extends GraphMenu { + VisualiserMenuItem m_select_all; + VisualiserMenuItem m_unselect_all; + VisualiserMenuItem m_multiselection; + JMenu mLanguage; + JMenu mStyle; + JMenu mType; + public ProjectFilesMenu(StyledTree tree) { + super(tree, "подпапки"); + addSeparator(); + JMenuItem m = new VisualiserMenuItem("Открыть в проводнике...", "/icons/Explorer.png"); + m.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + try { + Desktop.getDesktop().open(Current.getProject().Home); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + }); + add(m); + addSeparator(); + add(new PassesSubMenu("Добавить", "/icons/RedAdd.png", + PassCode_2021.AddFile, + PassCode_2021.CreateEmptyDirectory, + PassCode_2021.ImportFiles)); + addSeparator(); + add(new PassesSubMenu("Переименовать", "/icons/Menu/Rename.png", + PassCode_2021.RenameFile, + PassCode_2021.RenameDirectory)); + add(new VisualiserMenuItem("Удалить текущий проект", "/icons/Delete.png") { + { + addActionListener(e -> { + if (Current.HasProject()) { + UI.getVersionsWindow().getVersionsForm().getTree().SelectNode(Current.getProject().node); + Pass_2021.passes.get(PassCode_2021.DeleteVersion).Do(); + } + }); + } + }); + addSeparator(); + m_multiselection = new VisualiserMenuItem("МаÑÑовый режим работы Ñ Ñ„Ð°Ð¹Ð»Ð°Ð¼Ð¸"); + m_multiselection.setIcon(Utils.getIcon(Global.files_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png")); + m_multiselection.addActionListener(e -> { + Global.files_multiselection = !Global.files_multiselection; + m_multiselection.setIcon(Utils.getIcon(Global.files_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png")); + Current.getProject().SelectAllFiles(false); + UI.getMainWindow().getProjectWindow().RefreshProjectFiles(); + + //- + }); + add(m_multiselection); + addSeparator(); + //- + m_select_all = new StableMenuItem("Выбрать вÑÑ‘", "/icons/SelectAll.png"); + m_select_all.addActionListener(e -> { + Current.getProject().SelectAllFiles(true); + tree.updateUI(); + }); + add(m_select_all); + m_unselect_all = new StableMenuItem("Отменить вÑÑ‘", "/icons/UnselectAll.png"); + m_unselect_all.addActionListener(e -> { + Current.getProject().SelectAllFiles(false); + tree.updateUI(); + }); + add(m_unselect_all); + //-------------------------------------------------- + add(mLanguage = new LanguagesSubmenu(PassCode_2021.SetSelectedFilesLanguage.getDescription()) { + @Override + public void action(LanguageName languageName) { + Pass_2021.passes.get(PassCode_2021.SetSelectedFilesLanguage).Do(languageName); + } + }); + add(mStyle = new StylesSubmenu(PassCode_2021.SetSelectedFilesStyle.getDescription()) { + @Override + public void action(LanguageStyle languageStyle) { + Pass_2021.passes.get(PassCode_2021.SetSelectedFilesStyle).Do(languageStyle); + } + }); + add(mType = new TypesSubmenu(PassCode_2021.SetSelectedFilesType.getDescription()) { + @Override + public void action(FileType fileType) { + Pass_2021.passes.get(PassCode_2021.SetSelectedFilesType).Do(fileType); + } + }); + //-------------------------------------------------- + add(Pass_2021.passes.get(PassCode_2021.ExcludeSelectedFiles).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.IncludeSelectedFiles).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.ExcludeFile).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.IncludeFile).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.DeleteFile).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.DeleteDirectory).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.DeleteSelectedFiles).createMenuItem()); + } + @Override + public void CheckElementsVisibility() { + m_select_all.setVisible(Global.files_multiselection); + m_unselect_all.setVisible(Global.files_multiselection); + mLanguage.setVisible(Global.files_multiselection); + mStyle.setVisible(Global.files_multiselection); + mType.setVisible(Global.files_multiselection); + //- + Pass_2021.passes.get(PassCode_2021.ExcludeFile).setControlsVisible(!Global.files_multiselection); + Pass_2021.passes.get(PassCode_2021.IncludeFile).setControlsVisible(!Global.files_multiselection); + //- + Pass_2021.passes.get(PassCode_2021.DeleteFile).setControlsVisible(!Global.files_multiselection); + Pass_2021.passes.get(PassCode_2021.DeleteDirectory).setControlsVisible(!Global.files_multiselection); + //-- + Pass_2021.passes.get(PassCode_2021.ExcludeSelectedFiles).setControlsVisible(Global.files_multiselection); + Pass_2021.passes.get(PassCode_2021.IncludeSelectedFiles).setControlsVisible(Global.files_multiselection); + Pass_2021.passes.get(PassCode_2021.DeleteSelectedFiles).setControlsVisible(Global.files_multiselection); + } +} + diff --git a/src/Common/UI/Menus/PropertiesSubmenu.java b/src/Common/UI/Menus/PropertiesSubmenu.java new file mode 100644 index 00000000..9e5a0e08 --- /dev/null +++ b/src/Common/UI/Menus/PropertiesSubmenu.java @@ -0,0 +1,18 @@ +package Common.UI.Menus; +import Common.Current; +import Common.Global; +import Common.UI.Themes.VisualiserFonts; +import Common.Utils.Utils; + +import javax.swing.*; +public class PropertiesSubmenu extends JMenu { + public PropertiesSubmenu(String title, String icon, String... settings) { + super(title); + if (icon != null) + setIcon(Utils.getIcon(icon)); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + for (String name : settings) { + Global.properties.addFlagMenuItem(this, name); + } + } +} diff --git a/src/Common/UI/Menus/SelectionTreeMenu.java b/src/Common/UI/Menus/SelectionTreeMenu.java new file mode 100644 index 00000000..3726d65e --- /dev/null +++ b/src/Common/UI/Menus/SelectionTreeMenu.java @@ -0,0 +1,86 @@ +package Common.UI.Menus; +import Common.Current; +import Common.UI.Menus_2023.StableMenuItem; +import Common.UI.Selectable; +import Common.UI.Trees.DataTree; +import Common.UI.Trees.SelectableTree; +import Common.Utils.Utils; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +public abstract class SelectionTreeMenu extends GraphMenu { + VisualiserMenuItem m_select_for_current; + VisualiserMenuItem m_unselect_for_current; + VisualiserMenuItem m_select_all; + VisualiserMenuItem m_unselect_all; + public SelectionTreeMenu(SelectableTree tree_in) { + super(tree_in, ""); + addSeparator(); + //- + m_select_all = new StableMenuItem("Выбрать вÑÑ‘", "/icons/SelectAll.png"); + m_select_all.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + SelectAll(true); + tree.updateUI(); + } + }); + add(m_select_all); + m_unselect_all = new StableMenuItem("Отменить вÑÑ‘", "/icons/UnselectAll.png"); + m_unselect_all.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + SelectAll(false); + tree.updateUI(); + } + }); + add(m_unselect_all); + addSeparator(); + m_select_for_current = new VisualiserMenuItem(""); + m_select_for_current.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Object o = Current.get(tree.getCurrent()); + if (o instanceof Selectable) { + ((Selectable) o).SelectAllChildren(true); + } + tree.updateUI(); + } + }); + add(m_select_for_current); + //-------- + m_unselect_for_current = new VisualiserMenuItem(""); + m_unselect_for_current.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Object o = Current.get(tree.getCurrent()); + if (o instanceof Selectable) { + ((Selectable) o).SelectAllChildren(false); + } + tree.updateUI(); + } + }); + //------- + add(m_unselect_for_current); + } + public abstract Class getTargetClass(); //Ð´Ð»Ñ ÐºÐ¾Ð³Ð¾ позволÑетÑÑ Ð²Ñ‹Ð±Ð¸Ñ€Ð°Ñ‚ÑŒ вÑех потомков. + public abstract void SelectAll(boolean select); + @Override + public void CheckElementsVisibility() { + Object current = Current.get(tree.getCurrent()); + if ((current != null) && (current.getClass().equals(getTargetClass()))) { + String name = ((Selectable) current).getSelectionText(); + m_select_for_current.setText("Выбрать вÑÑ‘ Ð´Ð»Ñ " + + Utils.Brackets(name)); + m_unselect_for_current.setText("Отменить выбор вÑех Ð´Ð»Ñ " + + Utils.Brackets(name)); + //- + m_select_for_current.setVisible(true); + m_unselect_for_current.setVisible(true); + } else { + m_select_for_current.setVisible(false); + m_unselect_for_current.setVisible(false); + } + } +} diff --git a/src/Common/UI/Menus/StyledPopupMenu.java b/src/Common/UI/Menus/StyledPopupMenu.java new file mode 100644 index 00000000..e03a6daa --- /dev/null +++ b/src/Common/UI/Menus/StyledPopupMenu.java @@ -0,0 +1,38 @@ +package Common.UI.Menus; +import Common.Current; +import Common.UI.Themes.ThemeElement; + +import javax.swing.*; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +public class StyledPopupMenu extends JPopupMenu implements ThemeElement { + public StyledPopupMenu() { + addPopupMenuListener(new PopupMenuListener() { + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent e) { + CheckElementsVisibility(); + } + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent e) { + } + @Override + public void popupMenuCanceled(PopupMenuEvent e) { + } + }); + } + private void refreshTheme_r(MenuElement element) { + element.getComponent().setBackground(Current.getTheme().background); + element.getComponent().setForeground(Current.getTheme().foreground); + for (MenuElement se : element.getSubElements()) + refreshTheme_r(se); + } + @Override + public void applyTheme() { + setBackground(Current.getTheme().background); + setForeground(Current.getTheme().foreground); + refreshTheme_r(this); + } + public void CheckElementsVisibility() { + applyTheme(); + } +} diff --git a/src/Common/UI/Menus/TableMenu.java b/src/Common/UI/Menus/TableMenu.java new file mode 100644 index 00000000..ab171596 --- /dev/null +++ b/src/Common/UI/Menus/TableMenu.java @@ -0,0 +1,29 @@ +package Common.UI.Menus; +import Common.Utils.Utils; + +import javax.swing.*; +public class TableMenu extends StyledPopupMenu { + int row = Utils.Nan; + int column = Utils.Nan; + Object target = null; + //- + JTable owner = null; + VisualiserMenuItem mcopy; + public TableMenu(JTable owner_in) { + owner = owner_in; + mcopy = new VisualiserMenuItem("Копировать текÑÑ‚ текущей Ñчейки", "/icons/Editor/Copy.png"); + //еÑли удалоÑÑŒ нажать значит вÑе уÑÐ»Ð¾Ð²Ð¸Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ñ‹ + mcopy.addActionListener(e -> Utils.CopyToClipboard(target.toString())); + add(mcopy); + } + @Override + public void CheckElementsVisibility() { + row = owner.getSelectedRow(); + column = owner.getSelectedColumn(); + if ((row >= 0) && (column >= 0)) { + target = owner.getValueAt(row, column); + mcopy.setVisible(true); + } else mcopy.setVisible(false); + super.CheckElementsVisibility(); + } +} diff --git a/src/Common/UI/Menus/TestsCompilationFilterMenu.java b/src/Common/UI/Menus/TestsCompilationFilterMenu.java new file mode 100644 index 00000000..b414a8d8 --- /dev/null +++ b/src/Common/UI/Menus/TestsCompilationFilterMenu.java @@ -0,0 +1,28 @@ +package Common.UI.Menus; +import GlobalData.Tasks.TaskState; + +import javax.swing.*; +import java.awt.event.ActionListener; +public class TestsCompilationFilterMenu extends StyledPopupMenu{ + public void CreateStateItem(TaskState state, ActionListener listener){ + JMenuItem m = new VisualiserMenuItem(state.getDescription()); + m.addActionListener(listener); + add(m); + } + public TestsCompilationFilterMenu(){ + for (TaskState taskState: TaskState.values()){ + switch (taskState){ + case Queued: + case FailedToQueue: + case NoSuchTask: + case AbortingByUser: + break; + case Waiting: + CreateStateItem(taskState, e -> { + + }); + break; + } + } + } +} diff --git a/src/Common/UI/Menus/TextComboBoxMenu.java b/src/Common/UI/Menus/TextComboBoxMenu.java new file mode 100644 index 00000000..ba966f64 --- /dev/null +++ b/src/Common/UI/Menus/TextComboBoxMenu.java @@ -0,0 +1,42 @@ +package Common.UI.Menus; +import Common.UI.UI; +import Common.Utils.Utils; + +import javax.swing.*; +import java.awt.event.ActionEvent; +public class TextComboBoxMenu extends StyledPopupMenu { + protected JComboBox box; + protected String selectedText = null; + //------------------------------------------------- + JMenuItem m_copy; + JMenuItem m_paste; + //------------------------------------------------- + public TextComboBoxMenu(JComboBox box_in) { + box = box_in; + m_copy = new VisualiserMenuItem("Копировать", "/icons/Editor/Copy.png"); + m_copy.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Utils.CopyToClipboard(box.getSelectedItem().toString()); + } + }); + add(m_copy); + m_paste = new VisualiserMenuItem("Ð’Ñтавить", "/icons/Editor/Paste.png"); + m_paste.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + UI.TrySelect(box, Utils.getFromClipboard()); + } + }); + add(m_paste); + } + @Override + public void CheckElementsVisibility() { + boolean visible_ = box.getSelectedIndex() >= 0; + m_paste.setVisible(visible_); + m_copy.setVisible(visible_); + super.CheckElementsVisibility(); + } +} diff --git a/src/Common/UI/Menus/TextEditorMenu.java b/src/Common/UI/Menus/TextEditorMenu.java new file mode 100644 index 00000000..119f7501 --- /dev/null +++ b/src/Common/UI/Menus/TextEditorMenu.java @@ -0,0 +1,86 @@ +package Common.UI.Menus; +import Common.Utils.Utils; + +import javax.swing.*; +import javax.swing.text.JTextComponent; +import java.awt.event.ActionEvent; +import java.util.Vector; +public class TextEditorMenu extends StyledPopupMenu { + protected JTextComponent editor; + protected String selectedText = null; + //------------------------------------------------- + JMenuItem m_cut; + JMenuItem m_copy; + JMenuItem m_paste; + protected JMenuItem m_strike; + protected JMenuItem m_unstrike; + //------------------------------------------------- + public TextEditorMenu(JTextComponent editor_in) { + editor = editor_in; + m_cut = new VisualiserMenuItem("Вырезать", "/icons/Editor/Cut.png"); + m_cut.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + editor.cut(); + } + }); + add(m_cut); + m_copy = new VisualiserMenuItem("Копировать", "/icons/Editor/Copy.png"); + m_copy.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + editor.copy(); + } + }); + add(m_copy); + m_paste = new VisualiserMenuItem("Ð’Ñтавить", "/icons/Editor/Paste.png"); + m_paste.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + editor.paste(); + } + }); + add(m_paste); + //-- + m_strike = new VisualiserMenuItem("Вычеркнуть","/icons/Editor/Strikethrough.png"); + m_strike.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + String[] data = selectedText.split("\n"); + Vector new_data = new Vector<>(); + for (String line: data){ + new_data.add(Utils.strikeThrough(line)); + } + editor.replaceSelection(String.join("\n", new_data)); + } + }); + add(m_strike); + m_unstrike = new VisualiserMenuItem("Отменить вычёркивание","/icons/Editor/NoStrike.png"); + m_unstrike.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + String[] data = selectedText.split("\n"); + Vector new_data = new Vector<>(); + for (String line: data){ + new_data.add(Utils.noStrikeThrough(line)); + } + editor.replaceSelection(String.join("\n", new_data)); + } + }); + add(m_unstrike); + } + @Override + public void CheckElementsVisibility() { + selectedText = editor.getSelectedText(); + m_cut.setVisible(editor.isEditable() && (selectedText != null)); + m_paste.setVisible(editor.isEditable()); + m_copy.setVisible(selectedText != null); + m_strike.setVisible(editor.isEditable() && (selectedText != null)); + m_unstrike.setVisible(editor.isEditable() && (selectedText != null)); + super.CheckElementsVisibility(); + } +} diff --git a/src/Common/UI/Menus/VersionsMenu.java b/src/Common/UI/Menus/VersionsMenu.java new file mode 100644 index 00000000..ee93ecc4 --- /dev/null +++ b/src/Common/UI/Menus/VersionsMenu.java @@ -0,0 +1,53 @@ +package Common.UI.Menus; +import Common.Current; +import Common.Global; +import Common.UI.Menus_2023.StableMenuItem; +import Common.UI.Trees.DataTree; +import Common.UI.UI; +import Common.Utils.Utils; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +public class VersionsMenu extends GraphMenu { + VisualiserMenuItem m_select_all; + VisualiserMenuItem m_unselect_all; + VisualiserMenuItem m_multiselection; + public VersionsMenu(DataTree tree) { + super(tree, "подверÑии"); + add(Pass_2021.passes.get(PassCode_2021.DeleteSubversions).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.DeleteLonelyM).createMenuItem()); + addSeparator(); + m_multiselection = new VisualiserMenuItem("МаÑÑовый режим работы Ñ Ð²ÐµÑ€ÑиÑми"); + m_multiselection.setIcon(Utils.getIcon(Global.versions_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png")); + m_multiselection.addActionListener(e -> { + Global.versions_multiselection = !Global.versions_multiselection; + m_multiselection.setIcon(Utils.getIcon(Global.versions_multiselection ? "/icons/Pick.png" : "/icons/NotPick.png")); + Current.getRoot().SelectAllVersions(false); + UI.getVersionsWindow().getVersionsForm().getTree().updateUI(); + }); + add(m_multiselection); + addSeparator(); + add(Pass_2021.passes.get(PassCode_2021.DeleteVersion).createMenuItem()); + //- + m_select_all = new StableMenuItem("Выбрать вÑÑ‘, кроме резервных копий","/icons/SelectAll.png"); + m_select_all.addActionListener(e -> { + Current.getRoot().SelectAllVersions(true); + tree.updateUI(); + }); + add(m_select_all); + m_unselect_all = new StableMenuItem("Отменить вÑÑ‘","/icons/UnselectAll.png"); + m_unselect_all.addActionListener(e -> { + Current.getRoot().SelectAllVersions(false); + tree.updateUI(); + }); + add(m_unselect_all); + add(Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).createMenuItem()); + } + @Override + public void CheckElementsVisibility() { + Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).setControlsVisible(!Global.versions_multiselection); + Pass_2021.passes.get(PassCode_2021.DeleteSelectedVersions).setControlsVisible(Global.versions_multiselection); + Pass_2021.passes.get(PassCode_2021.DeleteVersion).setControlsVisible(!Global.versions_multiselection); + m_select_all.setVisible(Global.versions_multiselection); + m_unselect_all.setVisible(Global.versions_multiselection); + } +} diff --git a/src/Common/UI/Menus/VisualiserMenuItem.java b/src/Common/UI/Menus/VisualiserMenuItem.java new file mode 100644 index 00000000..9e35d957 --- /dev/null +++ b/src/Common/UI/Menus/VisualiserMenuItem.java @@ -0,0 +1,21 @@ +package Common.UI.Menus; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; +import Common.Utils.Utils; + +import javax.swing.*; +public class VisualiserMenuItem extends JMenuItem { + public VisualiserMenuItem(String text) { + super(text, null); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + } + public VisualiserMenuItem(String text, String icon_path) { + super(text); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + if (icon_path != null) + setIcon(Utils.getIcon(icon_path)); + } + public VisualiserMenuItem(){ + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + } +} diff --git a/src/Common/UI/Menus_2023/BugReportsMenuBar/BugReportsMenuBar.java b/src/Common/UI/Menus_2023/BugReportsMenuBar/BugReportsMenuBar.java new file mode 100644 index 00000000..74e69199 --- /dev/null +++ b/src/Common/UI/Menus_2023/BugReportsMenuBar/BugReportsMenuBar.java @@ -0,0 +1,17 @@ +package Common.UI.Menus_2023.BugReportsMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class BugReportsMenuBar extends DataMenuBar { + public BugReportsMenuBar() { + super("отчёты об ошибках", + PassCode_2021.SynchronizeBugReports, + PassCode_2021.DownloadAllBugReportsArchives, + PassCode_2021.AddBugReport, + PassCode_2021.PublishBugReport, + PassCode_2021.OpenBugReportTestProject, + PassCode_2021.OpenBugReport, + PassCode_2021.UpdateBugReportProgress, + PassCode_2021.CloseBugReport, + PassCode_2021.DeleteBugReport); + } +} diff --git a/src/Common/UI/Menus_2023/CompilersMenuBar/CompilersMenuBar.java b/src/Common/UI/Menus_2023/CompilersMenuBar/CompilersMenuBar.java new file mode 100644 index 00000000..96adb6d1 --- /dev/null +++ b/src/Common/UI/Menus_2023/CompilersMenuBar/CompilersMenuBar.java @@ -0,0 +1,13 @@ +package Common.UI.Menus_2023.CompilersMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class CompilersMenuBar extends DataMenuBar { + public CompilersMenuBar() { + super("компилÑторы", + PassCode_2021.AddCompiler, + PassCode_2021.EditCompiler, + PassCode_2021.DeleteCompiler, + PassCode_2021.ShowCompilerVersion, + PassCode_2021.ShowCompilerHelp); + } +} diff --git a/src/Common/UI/Menus_2023/ComponentsMenuBar/ComponentsMenuBar.java b/src/Common/UI/Menus_2023/ComponentsMenuBar/ComponentsMenuBar.java new file mode 100644 index 00000000..a979cefc --- /dev/null +++ b/src/Common/UI/Menus_2023/ComponentsMenuBar/ComponentsMenuBar.java @@ -0,0 +1,27 @@ +package Common.UI.Menus_2023.ComponentsMenuBar; +import Common.Current; +import Common.UI.Menus_2023.DataMenuBar; +import Common.UI.Menus_2023.VisualiserMenu; +import Common.UI.Themes.VisualiserFonts; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +public class ComponentsMenuBar extends DataMenuBar { + public ComponentsMenuBar() { + super("компоненты"); + addMenus( + new VisualiserMenu( + "ВоÑÑтановление предыдущей верÑии компонента", "/icons/Resurrect.png") { + { + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + add(Pass_2021.passes.get(PassCode_2021.ResurrectComponent).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.ResurrectComponentFromServer).createMenuItem()); + } + } + ); + addPasses(PassCode_2021.InstallComponentFromFolder, + PassCode_2021.UpdateSelectedComponents, + PassCode_2021.PublishComponent, + PassCode_2021.ShowComponentChangesLog); + Pass_2021.passes.get(PassCode_2021.PublishComponent).setControlsVisible(false); + } +} diff --git a/src/Common/UI/Menus_2023/ConfigurationsMenuBar/ConfigurationsMenuBar.java b/src/Common/UI/Menus_2023/ConfigurationsMenuBar/ConfigurationsMenuBar.java new file mode 100644 index 00000000..054ab9d1 --- /dev/null +++ b/src/Common/UI/Menus_2023/ConfigurationsMenuBar/ConfigurationsMenuBar.java @@ -0,0 +1,33 @@ +package Common.UI.Menus_2023.ConfigurationsMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class ConfigurationsMenuBar extends DataMenuBar { + public ConfigurationsMenuBar() { + super("конфигурации"); + /* + add(new MenuBarButton() { + { + setText("Оповещение по email"); + setToolTipText("Оповещение о прогреÑÑе Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ð°ÐºÐµÑ‚Ð° теÑтов"); + Mark(); + addActionListener(e -> { + email = !email; + Mark(); + }); + } + public void Mark() { + setIcon(Utils.getIcon(email ? "/icons/Pick.png" : "/icons/NotPick.png")); + } + + }); + */ + addPasses( + PassCode_2021.EditMachineKernels, + PassCode_2021.StartTests, + PassCode_2021.PublishConfiguration, + PassCode_2021.CopyConfigurations, + PassCode_2021.EditConfiguration, + PassCode_2021.DeleteSelectedConfigurations + ); + } +} diff --git a/src/Common/UI/Menus_2023/DVMParametersMenuBar/DVMParametersMenuBar.java b/src/Common/UI/Menus_2023/DVMParametersMenuBar/DVMParametersMenuBar.java new file mode 100644 index 00000000..142234aa --- /dev/null +++ b/src/Common/UI/Menus_2023/DVMParametersMenuBar/DVMParametersMenuBar.java @@ -0,0 +1,11 @@ +package Common.UI.Menus_2023.DVMParametersMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class DVMParametersMenuBar extends DataMenuBar { + public DVMParametersMenuBar() { + super("параметры", + PassCode_2021.AddDVMParameter, + PassCode_2021.EditDVMParameter, + PassCode_2021.DeleteDVMParameter); + } +} diff --git a/src/Common/UI/Menus_2023/DataMenuBar.java b/src/Common/UI/Menus_2023/DataMenuBar.java new file mode 100644 index 00000000..99de7d41 --- /dev/null +++ b/src/Common/UI/Menus_2023/DataMenuBar.java @@ -0,0 +1,54 @@ +package Common.UI.Menus_2023; +import Common.Database.DataSet; +import Visual_DVM_2021.Passes.PassCode_2021; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionListener; +public class DataMenuBar extends VisualiserMenuBar { + public JLabel countLabel = null; + JButton selectAllButton = null; + JButton unselectAllButton = null; + //- + public ActionListener selectAllListener = null; + public ActionListener unselectAllListener = null; + //- + public DataMenuBar(String dataName, PassCode_2021... passes) { + // Font font = Current.getTheme().Fonts.get(VisualiserFonts.TreeBoldItalic).deriveFont(12.0F); + add(new JLabel(dataName + " ")); + add(countLabel = new JLabel("?")); + addPasses(passes); + } + public void createSelectionButtons(DataSet dataSet) { + java.awt.Dimension d = new Dimension(25, 25); + if (selectAllButton == null) { + add(selectAllButton = new MenuBarButton() { + { + setIcon("/icons/SelectAll.png"); + setToolTipText("Выбрать вÑÑ‘"); + setPreferredSize(d); + setMinimumSize(d); + setMaximumSize(d); + } + }, 0); + } + if (unselectAllButton == null) { + add(unselectAllButton = new MenuBarButton() { + { + setIcon("/icons/UnselectAll.png"); + setToolTipText("Отменить вÑÑ‘"); + setPreferredSize(d); + setMinimumSize(d); + setMaximumSize(d); + } + }, 1); + } + if (selectAllListener != null) { + selectAllButton.removeActionListener(selectAllListener); } + selectAllButton.addActionListener(selectAllListener = e -> dataSet.CheckAll(true)); + if (unselectAllListener != null) { + unselectAllButton.removeActionListener(unselectAllListener); + } + unselectAllButton.addActionListener(unselectAllListener = e -> dataSet.CheckAll(false)); + } +} diff --git a/src/Common/UI/Menus_2023/EnvironmentValuesMenuBar/EnvironmentValuesMenuBar.java b/src/Common/UI/Menus_2023/EnvironmentValuesMenuBar/EnvironmentValuesMenuBar.java new file mode 100644 index 00000000..463c8c23 --- /dev/null +++ b/src/Common/UI/Menus_2023/EnvironmentValuesMenuBar/EnvironmentValuesMenuBar.java @@ -0,0 +1,12 @@ +package Common.UI.Menus_2023.EnvironmentValuesMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class EnvironmentValuesMenuBar extends DataMenuBar { + public EnvironmentValuesMenuBar() { + super("переменные окружениÑ", PassCode_2021.AddEnvironmentValue, + PassCode_2021.EditEnvironmentValue, + PassCode_2021.DeleteEnvironmentValue, + PassCode_2021.PickCompilerEnvironments + ); + } +} diff --git a/src/Common/UI/Menus_2023/FastAccessMenuBar/FastAccessMenuBar.java b/src/Common/UI/Menus_2023/FastAccessMenuBar/FastAccessMenuBar.java new file mode 100644 index 00000000..40c31d1d --- /dev/null +++ b/src/Common/UI/Menus_2023/FastAccessMenuBar/FastAccessMenuBar.java @@ -0,0 +1,49 @@ +package Common.UI.Menus_2023.FastAccessMenuBar; +import Common.Global; +import Common.UI.Menus_2023.VisualiserMenuBar; +import Common.UI.UI; +import GlobalData.Settings.SettingName; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; + +import javax.swing.*; +import java.awt.*; +import java.util.LinkedHashMap; +public class FastAccessMenuBar extends VisualiserMenuBar { + LinkedHashMap passesButtons = new LinkedHashMap<>(); + public FastAccessMenuBar() { + Refresh(); + } + @Override + public void setSizeLimits() { + //еÑли задавать PreffredSize 0, Ñкролл ÐЕ РÐБОТÐЕТ. МагиÑ! + } + public void showPass(Pass_2021 pass) { + JButton button = null; + if (passesButtons.containsKey(pass.code())) + button = passesButtons.get((pass.code())); + else { + button = pass.createButton(); + passesButtons.put(pass.code(), button); + } + add(button); + Dimension d = button.getPreferredSize(); + button.setPreferredSize(new Dimension(d.width, 30)); + revalidate(); + repaint(); + } + public void Refresh() { + UI.Clear(this); + int i = 1; + for (Pass_2021 pass : Pass_2021.FAPasses) { + if (pass.stats.HasUsages()) { + showPass(pass); + ++i; + if (i > (Global.db.settings.get(SettingName.FastAccessPassesCount).toInt32())) break; + } + } + } + public void Drop(){ + UI.Clear(this); + } +} diff --git a/src/Common/UI/Menus_2023/FileMenuBar/FileMenuBar.java b/src/Common/UI/Menus_2023/FileMenuBar/FileMenuBar.java new file mode 100644 index 00000000..2ea937c8 --- /dev/null +++ b/src/Common/UI/Menus_2023/FileMenuBar/FileMenuBar.java @@ -0,0 +1,84 @@ +package Common.UI.Menus_2023.FileMenuBar; +import Common.UI.Menus_2023.MenuBarButton; +import Common.UI.Menus_2023.VisualiserMenuBar; +import Common.UI.UI; +import ProjectData.Files.UI.Editor.SPFEditor; +import Visual_DVM_2021.Passes.PassCode_2021; + +import javax.swing.*; +import java.awt.*; +public class FileMenuBar extends VisualiserMenuBar { + public JSpinner sToGo; + JLabel LineCountLabel; + public JLabel CurrentSymbolLabel; + SPFEditor editor; + FileSettingsMenu fileSettingsMenu; + public FileMenuBar(SPFEditor editor_in) { + editor = editor_in; + add(new MenuBarButton() { + { + setToolTipText("ПоиÑк(Ctrl+F)"); + setIcon("/icons/LastOpened.png"); + addActionListener(e -> UI.ShowSearchForm()); + } + }); + addPasses(PassCode_2021.Save); + add(new MenuBarButton() { + { + setToolTipText("Увеличить шрифт(Ctrl+'+')"); + setIcon("/icons/Editor/Font+.png"); + addActionListener(e -> editor.FontUp()); + } + }); + add(new MenuBarButton() { + { + setToolTipText("Уменьшить шрифт(Ctrl+'-')"); + setIcon("/icons/Editor/Font-.png"); + addActionListener(e -> editor.FontDown()); + } + }); + add(new MenuBarButton() { + boolean isOn = false; + { + setToolTipText("Отображать ÑпецÑимволы"); + setIcon("/icons/Editor/ShowNoSigns.png"); + addActionListener(e-> { + isOn = !isOn; + if (isOn) { + setIcon("/icons/Editor/ShowAllSigns.png"); + setToolTipText("Скрыть ÑпецÑимволы"); + editor.setWhitespaceVisible(true); + editor.setEOLMarkersVisible(true); + } else { + setIcon("/icons/Editor/ShowNoSigns.png"); + setToolTipText("Отображать ÑпецÑимволы"); + editor.setWhitespaceVisible(false); + editor.setEOLMarkersVisible(false); + } + }); + } + }); + add(new JLabel(" Строка ")); + add(sToGo = new JSpinner()); + sToGo.setPreferredSize(new Dimension(60, 25)); + sToGo.setMaximumSize(new Dimension(60, 25)); + add(new JLabel(" из ")); + add(LineCountLabel = new JLabel("?")); + add(new JLabel(" | ")); + add(new JLabel("ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ ")); + add(CurrentSymbolLabel = new JLabel()); + add(new JSeparator()); + addMenus(fileSettingsMenu = new FileSettingsMenu()); + //-- + // addPasses(PassCode_2021.CloseCurrentFile); + //- + setPreferredSize(new Dimension(0, 30)); + } + public void ShowLinesCount() { + LineCountLabel.setText(String.valueOf(editor.getLineCount())); + } + //- + public void ShowLanguage(){fileSettingsMenu.ShowLanguage();} + public void ShowType(){fileSettingsMenu.ShowType();} + public void ShowStyle(){fileSettingsMenu.ShowStyle();} +} diff --git a/src/Common/UI/Menus_2023/FileMenuBar/FileSettingsMenu.java b/src/Common/UI/Menus_2023/FileMenuBar/FileSettingsMenu.java new file mode 100644 index 00000000..3ab9069e --- /dev/null +++ b/src/Common/UI/Menus_2023/FileMenuBar/FileSettingsMenu.java @@ -0,0 +1,63 @@ +package Common.UI.Menus_2023.FileMenuBar; +import Common.Current; +import Common.UI.Menus_2023.LanguagesSubmenu; +import Common.UI.Menus_2023.StylesSubmenu; +import Common.UI.Menus_2023.TypesSubmenu; +import Common.UI.Menus_2023.VisualiserMenu; +import Common.UI.UI; +import ProjectData.Files.FileType; +import ProjectData.Files.LanguageStyle; +import ProjectData.LanguageName; + +import javax.swing.*; +public class FileSettingsMenu extends VisualiserMenu { + JMenu mLanguage; + JMenu mStyle; + JMenu mType; + public FileSettingsMenu() { + super("ÐаÑтройки файла", "/icons/Settings.png"); + add(mLanguage = new LanguagesSubmenu() { + @Override + public void action(LanguageName languageName) { + if (Current.getFile().UpdateLanguage(languageName)) { + Current.getSapfor().ResetAllAnalyses(); + Current.getFile().form.ShowLanguage(); + UI.getMainWindow().getProjectWindow().getFilesTreeForm().getTree().RefreshNode(Current.getFile().node); + } + } + }); + ShowLanguage(); + //-- + add(mStyle = new StylesSubmenu() { + @Override + public void action(LanguageStyle languageStyle) { + if (Current.getFile().UpdateStyle(languageStyle)) { + Current.getSapfor().ResetAllAnalyses(); + Current.getFile().form.ShowStyle(); + } + } + }); + ShowStyle(); + //-- + add(mType = new TypesSubmenu() { + @Override + public void action(FileType fileType) { + if (Current.getFile().UpdateType(fileType)) { + Current.getSapfor().ResetAllAnalyses(); + UI.getMainWindow().getProjectWindow().getFilesTreeForm().getTree().RefreshNode(Current.getFile().node); + Current.getFile().form.ShowType(); + } + } + }); + ShowType(); + } + public void ShowLanguage() { + mLanguage.setText("Язык: " + Current.getFile().languageName.getDescription()); + } + public void ShowStyle() { + mStyle.setText("Стиль: " + Current.getFile().style.getDescription()); + } + public void ShowType() { + mType.setText("Тип: " + Current.getFile().fileType.getDescription()); + } +} diff --git a/src/Common/UI/Menus_2023/GroupsMenuBar/GroupsMenuBar.java b/src/Common/UI/Menus_2023/GroupsMenuBar/GroupsMenuBar.java new file mode 100644 index 00000000..2dbc22cc --- /dev/null +++ b/src/Common/UI/Menus_2023/GroupsMenuBar/GroupsMenuBar.java @@ -0,0 +1,42 @@ +package Common.UI.Menus_2023.GroupsMenuBar; +import Common.Global; +import Common.UI.Menus_2023.DataMenuBar; +import Common.UI.Menus_2023.MenuBarButton; +import Common.Utils.Utils; +import TestingSystem.Group.GroupInterface; +import Visual_DVM_2021.Passes.PassCode_2021; + +import javax.swing.*; +public class GroupsMenuBar extends DataMenuBar { + public GroupsMenuBar() { + super("группы", PassCode_2021.SynchronizeTests, PassCode_2021.DownloadGroup, PassCode_2021.ConvertCorrectnessTests, PassCode_2021.PublishGroup, PassCode_2021.CopyGroups, PassCode_2021.EditGroup, PassCode_2021.DeleteSelectedGroups); + add(new JSeparator()); + add(new MenuBarButton() { + { + setText("Свои"); + setToolTipText("Отображать только группы теÑтов авторÑтва пользователÑ"); + Mark(); + addActionListener(e -> { + GroupInterface.filterMyOnly = !GroupInterface.filterMyOnly; + Mark(); + Global.testingServer.db.groups.ShowUI(); + }); + } + public void Mark() { + setIcon(Utils.getIcon(GroupInterface.filterMyOnly ? "/icons/Pick.png" : "/icons/NotPick.png")); + } + }); + } + public void addFilters(JMenu typesFilterMenu, JMenu languagesFilterMenu) { + filters = addMenus(typesFilterMenu, languagesFilterMenu); + } + JMenuBar filters= null; + public void DropFilters() { + if (filters != null) { + remove(filters); + filters = null; + } + revalidate(); + repaint(); + } +} diff --git a/src/Common/UI/Menus_2023/LanguagesSubmenu.java b/src/Common/UI/Menus_2023/LanguagesSubmenu.java new file mode 100644 index 00000000..710a1e23 --- /dev/null +++ b/src/Common/UI/Menus_2023/LanguagesSubmenu.java @@ -0,0 +1,34 @@ +package Common.UI.Menus_2023; +import Common.Utils.Utils; +import ProjectData.LanguageName; + +import javax.swing.*; +import java.awt.event.ActionEvent; +public abstract class LanguagesSubmenu extends VisualiserMenu { + public LanguagesSubmenu() { + this("Язык"); + } + public LanguagesSubmenu(String text) { + super(text, "/icons/Language.png", true); + for (LanguageName languageName : LanguageName.values()) { + if (languageName.equals(LanguageName.fortran) || + (languageName.equals(LanguageName.c) || + (languageName.equals(LanguageName.cpp)))) { + + JMenuItem languageItem = new StableMenuItem(languageName.getDescription()); + String li = languageName.getIcon(); + if (!li.isEmpty()) + languageItem.setIcon(Utils.getIcon(li)); + languageItem.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + action(languageName); + } + }); + add(languageItem); + } + } + } + public abstract void action(LanguageName languageName); +} diff --git a/src/Common/UI/Menus_2023/MachinesMenuBar/MachinesMenuBar.java b/src/Common/UI/Menus_2023/MachinesMenuBar/MachinesMenuBar.java new file mode 100644 index 00000000..1eadd19d --- /dev/null +++ b/src/Common/UI/Menus_2023/MachinesMenuBar/MachinesMenuBar.java @@ -0,0 +1,11 @@ +package Common.UI.Menus_2023.MachinesMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class MachinesMenuBar extends DataMenuBar { + public MachinesMenuBar() { + super("машины", + PassCode_2021.AddMachine, + PassCode_2021.EditMachine, + PassCode_2021.DeleteMachine); + } +} diff --git a/src/Common/UI/Menus_2023/MainMenuBar/AnalysesMenu.java b/src/Common/UI/Menus_2023/MainMenuBar/AnalysesMenu.java new file mode 100644 index 00000000..bc997d69 --- /dev/null +++ b/src/Common/UI/Menus_2023/MainMenuBar/AnalysesMenu.java @@ -0,0 +1,14 @@ +package Common.UI.Menus_2023.MainMenuBar; +import Common.UI.Menus_2023.VisualiserMenu; +import Repository.Component.Sapfor.Sapfor; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +public class AnalysesMenu extends VisualiserMenu { + public AnalysesMenu() { + super("Ðнализаторы","/icons/Analyses.png" ); + for (PassCode_2021 code : Sapfor.getAnalysesCodes()) + add(Pass_2021.passes.get(code).createMenuItem()); + addSeparator(); + add(Pass_2021.passes.get(PassCode_2021.SPF_GetGCovInfo).createMenuItem()); + } +} diff --git a/src/Common/UI/Menus_2023/MainMenuBar/GlobalCleaningMenu.java b/src/Common/UI/Menus_2023/MainMenuBar/GlobalCleaningMenu.java new file mode 100644 index 00000000..5d6d8aa4 --- /dev/null +++ b/src/Common/UI/Menus_2023/MainMenuBar/GlobalCleaningMenu.java @@ -0,0 +1,20 @@ +package Common.UI.Menus_2023.MainMenuBar; +import Common.UI.Menus_2023.VisualiserMenu; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +public class GlobalCleaningMenu extends VisualiserMenu { + public GlobalCleaningMenu() { + super("ОчиÑтка", "/icons/Clean.png", false); + add(Pass_2021.passes.get(PassCode_2021.DropLastProjects).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.DropFastAccess).createMenuItem()); + addSeparator(); + add(Pass_2021.passes.get(PassCode_2021.DeleteDownloadedBugReports).createMenuItem()); + addSeparator(); + add(Pass_2021.passes.get(PassCode_2021.DropAnalyses).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.CleanAnalyses).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.DropSavedArrays).createMenuItem()); + add(Pass_2021.passes.get(PassCode_2021.DeleteDebugResults).createMenuItem()); + addSeparator(); + add(Pass_2021.passes.get(PassCode_2021.ResetCurrentProject).createMenuItem()); + } +} diff --git a/src/Common/UI/Menus_2023/MainMenuBar/LastOpenedProjectsMenu.java b/src/Common/UI/Menus_2023/MainMenuBar/LastOpenedProjectsMenu.java new file mode 100644 index 00000000..1f4e8d1d --- /dev/null +++ b/src/Common/UI/Menus_2023/MainMenuBar/LastOpenedProjectsMenu.java @@ -0,0 +1,48 @@ +package Common.UI.Menus_2023.MainMenuBar; +import Common.Global; +import Common.UI.Menus.VisualiserMenuItem; +import Common.UI.Menus_2023.VisualiserMenu; +import GlobalData.DBLastProject.DBLastProject; +import GlobalData.Settings.SettingName; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; + +import javax.swing.*; +import javax.swing.event.MenuEvent; +import javax.swing.event.MenuListener; +import java.awt.event.ActionEvent; +import java.io.File; +import java.util.Vector; +public class LastOpenedProjectsMenu extends VisualiserMenu { + public LastOpenedProjectsMenu() { + super("Ðедавние проекты", "/icons/LastOpened.png"); + addMenuListener(new MenuListener() { + @Override + public void menuSelected(MenuEvent e) { + removeAll(); + Vector projects = Global.db.lastProjects.getOrdered(); + int k = 1; + for (DBLastProject p : projects) { + if (new File(p.HomePath).exists() && p.lastOpened != 0) { + VisualiserMenuItem i = new VisualiserMenuItem(p.HomePath); + i.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + Pass_2021.passes.get(PassCode_2021.OpenCurrentProject).Do(new File(p.HomePath)); + } + }); + add(i); + ++k; + if (k > (Global.db.settings.get(SettingName.LastOpenedProjectsCount).toInt32())) break; + } + } + } + @Override + public void menuDeselected(MenuEvent e) { + } + @Override + public void menuCanceled(MenuEvent e) { + } + }); + } +} diff --git a/src/Common/UI/Menus_2023/MainMenuBar/MainMenuBar.java b/src/Common/UI/Menus_2023/MainMenuBar/MainMenuBar.java new file mode 100644 index 00000000..a38dfcce --- /dev/null +++ b/src/Common/UI/Menus_2023/MainMenuBar/MainMenuBar.java @@ -0,0 +1,87 @@ +package Common.UI.Menus_2023.MainMenuBar; +import Common.Global; +import Common.UI.Menus_2023.MenuBarButton; +import Common.UI.Menus_2023.VisualiserMenuBar; +import Common.UI.UI; +import Repository.Component.PerformanceAnalyzer.PerformanceAnalyzer; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; + +import javax.swing.*; +import java.awt.*; +public class MainMenuBar extends VisualiserMenuBar { + JMenu analyses; + JMenu transformations; + MenuBarButton components; + public MainMenuBar() { + addMenus(new LastOpenedProjectsMenu()); + addPasses(PassCode_2021.OpenCurrentProject, PassCode_2021.CreateEmptyProject); + addMenus( + analyses = new AnalysesMenu(), + transformations = new TransformationsMenu(), + new GlobalCleaningMenu(), + new VisualiserSettingsMenu() + ); + add(components = new MenuBarButton() { + { + setToolTipText("Компоненты"); + setIcon("/icons/ComponentsActual.png"); + addActionListener(e -> { + if (PerformanceAnalyzer.isActive) { + UI.Info("Перед работой Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ‚Ð°Ð¼Ð¸ закройте анализатор производительноÑти!"); + } else { + Pass_2021.passes.get(PassCode_2021.GetComponentsActualVersions).Do(); + Global.RefreshUpdatesStatus(); + UI.ShowComponentsWindow(); + } + }); + } + }); + add(new MenuBarButton() { + { + setIcon("/icons/Comparsion.png"); + setToolTipText("Ðнализатор ÑтатиÑтик"); + addActionListener(e -> { + Global.performanceAnalyzer.Start(); + }); + } + }); + addPasses(PassCode_2021.ShowInstruction); + //- + setPreferredSize(new Dimension(0, 30)); + //--- + /* + add(new MenuBarButton() { + { + setIcon("/icons/Apply.png"); + setToolTipText("Test"); + addActionListener(e -> { + Current.getProject().hasSubdirectories(); + }); + } + }); + */ + //--- + ShowProject(false); + } + public void ShowUpdatesIcon() { + components.setIcon( + (Global.need_update > 0) || (Global.bad_state > 0) + ? "/icons/ComponentsNeedUpdate.gif" + : (Global.need_publish > 0 ? "/icons/ComponentsNeedPublish_2023.gif" : "/icons/ComponentsActual.png")); + } + public void ShowProject(boolean flag) { + analyses.setEnabled(flag); + transformations.setEnabled(flag); + Pass_2021[] cleaningPasses = new Pass_2021[]{ + Pass_2021.passes.get(PassCode_2021.DropAnalyses), + Pass_2021.passes.get(PassCode_2021.DropSavedArrays), + Pass_2021.passes.get(PassCode_2021.CleanAnalyses), + Pass_2021.passes.get(PassCode_2021.DeleteDebugResults), + Pass_2021.passes.get(PassCode_2021.ResetCurrentProject) + }; + for (Pass_2021 pass: cleaningPasses){ + pass.setControlsEnabled(flag); + } + } +} diff --git a/src/Common/UI/Menus_2023/MainMenuBar/MainWindow.java b/src/Common/UI/Menus_2023/MainMenuBar/MainWindow.java new file mode 100644 index 00000000..e16ccfb6 --- /dev/null +++ b/src/Common/UI/Menus_2023/MainMenuBar/MainWindow.java @@ -0,0 +1,19 @@ +package Common.UI.Menus_2023.MainMenuBar; +import Visual_DVM_2021.UI.Interface.CallbackWindow; +import Visual_DVM_2021.UI.Interface.ProjectWindow; +import Visual_DVM_2021.UI.Interface.TestingWindow; +public interface MainWindow { + void Show(); + void ShowProject(); + void ShowNoProject(); + ProjectWindow getProjectWindow(); + CallbackWindow getCallbackWindow(); + //- + void ShowUpdatesIcon(); + void FocusProject(); + void FocusCallback(); + void FocusTesting(); + TestingWindow getTestingWindow(); + void ShowTestingTab(); + void HideTestingTab(); +} diff --git a/src/Common/UI/Menus_2023/MainMenuBar/TransformationsMenu.java b/src/Common/UI/Menus_2023/MainMenuBar/TransformationsMenu.java new file mode 100644 index 00000000..4a1b45f5 --- /dev/null +++ b/src/Common/UI/Menus_2023/MainMenuBar/TransformationsMenu.java @@ -0,0 +1,36 @@ +package Common.UI.Menus_2023.MainMenuBar; +import Common.UI.Menus.PassesSubMenu; +import Common.UI.Menus_2023.VisualiserMenu; +import Repository.Component.Sapfor.Sapfor; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +public class TransformationsMenu extends VisualiserMenu { + public TransformationsMenu() { + super("ПреобразованиÑ", "/icons/Transformations.png"); + add(new PassesSubMenu("Циклы", "/icons/Menu/Loops.png", + Sapfor.getLoopsTransformationsCodes())); + addSeparator(); + add(new PassesSubMenu("Приватные переменные", "/icons/Menu/Privates.png", + Sapfor.getPrivatesTransformationsCodes())); + addSeparator(); + add(new PassesSubMenu("Процедуры", "/icons/Menu/Functions.png", + Sapfor.getProceduresTransformationsCodes())); + addSeparator(); + add(new PassesSubMenu("DVM директивы", "/icons/Menu/Dvm.png", + Sapfor.getDVMTransformationsCodes())); + addSeparator(); + add(new PassesSubMenu("Интервалы", "/icons/Menu/Intervals.png", + Sapfor.getIntervalsTransformationsCodes() + )); + addSeparator(); + add(new PassesSubMenu("ОблаÑти раÑпараллеливаниÑ", "/icons/Menu/Regions.png", + Sapfor.getRegionsTransformationsCodes() + )); + addSeparator(); + add(new PassesSubMenu("Предобработка проекта", "/icons/Menu/Preprocessing.png", + Sapfor.getPreparationTransformationsCodes() + ) + ); + add(Pass_2021.passes.get(PassCode_2021.SPF_SharedMemoryParallelization).createMenuItem()); + } +} \ No newline at end of file diff --git a/src/Common/UI/Menus_2023/MainMenuBar/VisualiserSettingsMenu.java b/src/Common/UI/Menus_2023/MainMenuBar/VisualiserSettingsMenu.java new file mode 100644 index 00000000..cb3905ab --- /dev/null +++ b/src/Common/UI/Menus_2023/MainMenuBar/VisualiserSettingsMenu.java @@ -0,0 +1,47 @@ +package Common.UI.Menus_2023.MainMenuBar; +import Common.Global; +import Common.UI.Menus.PropertiesSubmenu; +import Common.UI.Menus_2023.SettingsSubmenu; +import Common.UI.Menus_2023.VisualiserMenu; +import GlobalData.Settings.SettingName; +public class VisualiserSettingsMenu extends VisualiserMenu { + public VisualiserSettingsMenu() { + super("ÐаÑтройки визуализатора", "/icons/Settings.png"); + //- + add(new PropertiesSubmenu("ÐŸÐ¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ уведомлениÑ", null, + "ShowPassesDone", + "ConfirmPassesStart", + "FocusPassesResult" + )); + add(new SettingsSubmenu("КомпактноÑть отображениÑ", null, + SettingName.SmallScreen, + SettingName.ShowFullTabsNames, + SettingName.ShowFullArraysDeclarations, + SettingName.FastAccessPassesCount, + SettingName.LastOpenedProjectsCount + )); + if (Global.isWindows) { + add(new SettingsSubmenu("КомпилÑÑ†Ð¸Ñ Ð½Ð° локальной машине", null, + SettingName.LocalMakePathWindows, + SettingName.Kernels + )); + } else { + add(new SettingsSubmenu("КомпилÑÑ†Ð¸Ñ Ð½Ð° локальной машине", null, + SettingName.Kernels + )); + } + add(new SettingsSubmenu("СинхронизациÑ", null, + SettingName.AutoBugReportsLoad, + SettingName.AutoTestsLoad + )); + add(new SettingsSubmenu("Сравнение", null, + SettingName.ExtensionsOn, + SettingName.RegisterOn, + SettingName.SpacesOn, + SettingName.EmptyLinesOn, + SettingName.FortranWrapsOn, + SettingName.ComparsionDiffMergeOn + )); + add(Global.db.settings.get(SettingName.Workspace).getMenuItem()); + } +} diff --git a/src/Common/UI/Menus_2023/MakefilesMenuBar/MakefilesMenuBar.java b/src/Common/UI/Menus_2023/MakefilesMenuBar/MakefilesMenuBar.java new file mode 100644 index 00000000..4dc80800 --- /dev/null +++ b/src/Common/UI/Menus_2023/MakefilesMenuBar/MakefilesMenuBar.java @@ -0,0 +1,14 @@ +package Common.UI.Menus_2023.MakefilesMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class MakefilesMenuBar extends DataMenuBar { + public MakefilesMenuBar() { + super("мейкфайлы", + PassCode_2021.Compile, + PassCode_2021.AddMakefile, + PassCode_2021.EditMakefile, + PassCode_2021.DeleteMakefile); + addSeparator(); + addPasses(PassCode_2021.ShowMakefilePreview, PassCode_2021.EditProjectCompilationMaxtime); + } +} diff --git a/src/Common/UI/Menus_2023/MenuBarButton.java b/src/Common/UI/Menus_2023/MenuBarButton.java new file mode 100644 index 00000000..5edf9d10 --- /dev/null +++ b/src/Common/UI/Menus_2023/MenuBarButton.java @@ -0,0 +1,32 @@ +package Common.UI.Menus_2023; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; +import Common.Utils.Utils; + +import javax.swing.*; +import java.awt.*; +//https://java-online.ru/swing-jbutton.xhtml +public class MenuBarButton extends JButton { + public MenuBarButton() { + super(); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + // + setBorderPainted(false); + setContentAreaFilled(false); + setOpaque(false); + //setFocusPainted(false); + //- + setMinimumSize(new Dimension(38, 30)); //иначе ÑужаютÑÑ Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾. + } + @Override + protected void paintComponent(Graphics g) { + if (getModel().isPressed()) { + g.setColor(new Color(163, 184, 204)); + g.fillRect(0, 0, getWidth(), getHeight()); + } + super.paintComponent(g); + } + public void setIcon(String icon_path) { + setIcon(Utils.getIcon(icon_path)); + } +} diff --git a/src/Common/UI/Menus_2023/ModulesMenuBar/ModulesMenuBar.java b/src/Common/UI/Menus_2023/ModulesMenuBar/ModulesMenuBar.java new file mode 100644 index 00000000..bca2de3b --- /dev/null +++ b/src/Common/UI/Menus_2023/ModulesMenuBar/ModulesMenuBar.java @@ -0,0 +1,8 @@ +package Common.UI.Menus_2023.ModulesMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class ModulesMenuBar extends DataMenuBar { + public ModulesMenuBar() { + super("Ñзыковые модули", PassCode_2021.EditModule); + } +} diff --git a/src/Common/UI/Menus_2023/PassButton.java b/src/Common/UI/Menus_2023/PassButton.java new file mode 100644 index 00000000..43f05d35 --- /dev/null +++ b/src/Common/UI/Menus_2023/PassButton.java @@ -0,0 +1,25 @@ +package Common.UI.Menus_2023; +import Visual_DVM_2021.Passes.Pass_2021; + +import java.awt.*; +public class PassButton extends MenuBarButton implements PassControl { + public PassButton(Pass_2021 pass, boolean tab) { + setText(pass.getButtonText()); + setToolTipText(pass.getDescription()); + if (pass.getIconPath() != null) { + if (tab) { + setIcon(pass.getTabIcon()); + setPreferredSize(new Dimension(18,18)); + setMaximumSize(new Dimension(18,18)); + setMinimumSize(new Dimension(18,18)); + } + else + setIcon(pass.getIconPath()); + } + addActionListener(pass.getControlAction()); + pass.controls.add(this); + } + public PassButton(Pass_2021 pass) { + this(pass, false); + } +} diff --git a/src/Common/UI/Menus_2023/PassControl.java b/src/Common/UI/Menus_2023/PassControl.java new file mode 100644 index 00000000..7aae17b9 --- /dev/null +++ b/src/Common/UI/Menus_2023/PassControl.java @@ -0,0 +1,7 @@ +package Common.UI.Menus_2023; +public interface PassControl { + void setIcon(String icon_path); + void setEnabled(boolean flag); + void setVisible(boolean flag); + void setToolTipText(String text); +} diff --git a/src/Common/UI/Menus_2023/PassMenuItem.java b/src/Common/UI/Menus_2023/PassMenuItem.java new file mode 100644 index 00000000..15a2c5c1 --- /dev/null +++ b/src/Common/UI/Menus_2023/PassMenuItem.java @@ -0,0 +1,17 @@ +package Common.UI.Menus_2023; +import Common.UI.Menus.VisualiserMenuItem; +import Common.Utils.Utils; +import Visual_DVM_2021.Passes.Pass_2021; +public class PassMenuItem extends VisualiserMenuItem implements PassControl { + @Override + public void setIcon(String icon_path) { + setIcon(Utils.getIcon(icon_path)); + } + public PassMenuItem(Pass_2021 pass) { + setText(pass.getDescription()); + setToolTipText(pass.getDescription()); + if (pass.getIconPath() != null) setIcon(pass.getIconPath()); + addActionListener(pass.getControlAction()); + pass.controls.add(this); + } +} diff --git a/src/Common/UI/Menus_2023/ProjectMenuBar/FilesOperationsMenu.java b/src/Common/UI/Menus_2023/ProjectMenuBar/FilesOperationsMenu.java new file mode 100644 index 00000000..f3dada3d --- /dev/null +++ b/src/Common/UI/Menus_2023/ProjectMenuBar/FilesOperationsMenu.java @@ -0,0 +1,7 @@ +package Common.UI.Menus_2023.ProjectMenuBar; +import Common.UI.Menus_2023.VisualiserMenu; +public class FilesOperationsMenu extends VisualiserMenu { + public FilesOperationsMenu() { + super("МаÑÑовые операции над файлами","/icons/MassFiles.png" ); + } +} diff --git a/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectMenuBar.java b/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectMenuBar.java new file mode 100644 index 00000000..3fd5036a --- /dev/null +++ b/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectMenuBar.java @@ -0,0 +1,33 @@ +package Common.UI.Menus_2023.ProjectMenuBar; +import Common.UI.Menus_2023.MenuBarButton; +import Common.UI.Menus_2023.VisualiserMenuBar; +import Common.UI.UI; + +import javax.swing.*; +import java.awt.*; +public class ProjectMenuBar extends VisualiserMenuBar { + public ProjectViewMenu projectViewMenu; + public ProjectMenuBar() { + addMenus(projectViewMenu = new ProjectViewMenu()); + add(new JSeparator()); + addMenus( + new ProjectSettingsMenu() + ); + add(new MenuBarButton() { + { + setToolTipText("Профили"); + setIcon("/icons/Profiles.png"); + addActionListener(e -> { + UI.ShowProfilesWindow(); + }); + } + }); + } + public ProjectViewMenu getProjectViewMenu() { + return projectViewMenu; + } + @Override + public void setSizeLimits() { + setPreferredSize(new Dimension(0, 32)); + } +} diff --git a/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectSettingsMenu.java b/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectSettingsMenu.java new file mode 100644 index 00000000..475c8026 --- /dev/null +++ b/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectSettingsMenu.java @@ -0,0 +1,73 @@ +package Common.UI.Menus_2023.ProjectMenuBar; +import Common.Current; +import Common.Global; +import Common.UI.Menus_2023.LanguagesSubmenu; +import Common.UI.Menus_2023.SettingsSubmenu; +import Common.UI.Menus_2023.StylesSubmenu; +import Common.UI.Menus_2023.VisualiserMenu; +import GlobalData.Settings.SettingName; +import ProjectData.Files.LanguageStyle; +import ProjectData.LanguageName; + +import javax.swing.*; +public class ProjectSettingsMenu extends VisualiserMenu { + JMenu mLanguage; + JMenu mStyle; + public ProjectSettingsMenu() { + super("ÐаÑтройки проекта", "/icons/Settings.png"); + add(mLanguage = new LanguagesSubmenu() { + @Override + public void action(LanguageName languageName) { + if (Current.getProject().UpdateLanguage(languageName)) { + Current.getSapfor().ResetAllAnalyses(); + ShowLanguage(); + } + } + }); + ShowLanguage(); + //-- + add(mStyle = new StylesSubmenu() { + @Override + public void action(LanguageStyle languageStyle) { + if (Current.getProject().UpdateStyle(languageStyle)) + ShowStyle(); + } + }); + ShowStyle(); + addSeparator(); + add(new SettingsSubmenu("Ðнализ", null, + SettingName.Precompilation, + SettingName.STATIC_SHADOW_ANALYSIS, + SettingName.KEEP_DVM_DIRECTIVES, + SettingName.IGNORE_IO_SAPFOR, + SettingName.MPI_PROGRAM, + SettingName.ANALYSIS_OPTIONS, + SettingName.PARALLELIZE_FREE_LOOPS + )); + addSeparator(); + add(new SettingsSubmenu("ПоÑтроение ÑиÑтемы интервалов", null, + SettingName.KEEP_LOOPS_CLOSE_NESTING, + SettingName.KEEP_GCOV + )); + addSeparator(); + add(new SettingsSubmenu("ПоÑтроение верÑий", null, + SettingName.FREE_FORM, + SettingName.KEEP_SPF_DIRECTIVES, + SettingName.KEEP_SPF_DIRECTIVES_AMONG_TRANSFORMATIONS, + SettingName.OUTPUT_UPPER, + SettingName.MAX_SHADOW_WIDTH, + SettingName.DVMConvertationOptions, + SettingName.SaveModifications + )); + addSeparator(); + add(Global.db.settings.get(SettingName.TRANSLATE_MESSAGES).getMenuItem()); + add(Global.db.settings.get(SettingName.DEBUG_PRINT_ON).getMenuItem()); + add(Global.db.settings.get(SettingName.GCOVLimit).getMenuItem()); + } + public void ShowLanguage() { + mLanguage.setText("Язык: " + Current.getProject().languageName.getDescription()); + } + public void ShowStyle() { + mStyle.setText("Стиль: " + Current.getProject().style.getDescription()); + } +} diff --git a/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectViewMenu.java b/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectViewMenu.java new file mode 100644 index 00000000..36f20823 --- /dev/null +++ b/src/Common/UI/Menus_2023/ProjectMenuBar/ProjectViewMenu.java @@ -0,0 +1,34 @@ +package Common.UI.Menus_2023.ProjectMenuBar; +import Common.Current; +import Common.UI.Menus_2023.VisualiserMenu; +import Common.UI.Themes.VisualiserFonts; +import Common.UI.UI; +import Common.Utils.Utils; +import ProjectData.ProjectView; + +import javax.swing.*; +import java.util.LinkedHashMap; +public class ProjectViewMenu extends VisualiserMenu { + LinkedHashMap views; + public ProjectViewMenu() { + super("", ""); + views = new LinkedHashMap<>(); + for (ProjectView view : ProjectView.values()) { + JMenuItem m = new JMenuItem(view.getDescription()) { + { + setIcon(Utils.getIcon(view.getIcon())); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreeItalic)); + addActionListener(e -> { + Current.set(Current.ProjectView, view); + UI.getMainWindow().getProjectWindow().ShowProjectView(); + }); + } + }; + add(m); + views.put(view, m); + } + } + public void SelectView(ProjectView view){ + views.get(view).doClick(); + } +} diff --git a/src/Common/UI/Menus_2023/RemoteSapforsMenuBar/RemoteSapforsMenuBar.java b/src/Common/UI/Menus_2023/RemoteSapforsMenuBar/RemoteSapforsMenuBar.java new file mode 100644 index 00000000..c3fa2b96 --- /dev/null +++ b/src/Common/UI/Menus_2023/RemoteSapforsMenuBar/RemoteSapforsMenuBar.java @@ -0,0 +1,11 @@ +package Common.UI.Menus_2023.RemoteSapforsMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class RemoteSapforsMenuBar extends DataMenuBar { + public RemoteSapforsMenuBar() { + super("SAPFOR", PassCode_2021.InstallRemoteSapfor, + PassCode_2021.AddSapfor, + PassCode_2021.EditSapfor, + PassCode_2021.DeleteSapfor); + } +} diff --git a/src/Common/UI/Menus_2023/RunConfigurationsMenuBar/RunConfigurationsMenuBar.java b/src/Common/UI/Menus_2023/RunConfigurationsMenuBar/RunConfigurationsMenuBar.java new file mode 100644 index 00000000..c8689e12 --- /dev/null +++ b/src/Common/UI/Menus_2023/RunConfigurationsMenuBar/RunConfigurationsMenuBar.java @@ -0,0 +1,13 @@ +package Common.UI.Menus_2023.RunConfigurationsMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; + +import javax.swing.*; +public class RunConfigurationsMenuBar extends DataMenuBar { + public RunConfigurationsMenuBar() { + super("конфигурации запуÑка", PassCode_2021.Run, + PassCode_2021.AddRunConfiguration, PassCode_2021.EditRunConfiguration, PassCode_2021.DeleteRunConfiguration); + add(new JSeparator()); + addPasses(PassCode_2021.EditProjectRunMaxtime); + } +} diff --git a/src/Common/UI/Menus_2023/SapforConfigurationCommandsMenuBar/SapforConfigurationCommandsMenuBar.java b/src/Common/UI/Menus_2023/SapforConfigurationCommandsMenuBar/SapforConfigurationCommandsMenuBar.java new file mode 100644 index 00000000..ae1e7cd1 --- /dev/null +++ b/src/Common/UI/Menus_2023/SapforConfigurationCommandsMenuBar/SapforConfigurationCommandsMenuBar.java @@ -0,0 +1,12 @@ +package Common.UI.Menus_2023.SapforConfigurationCommandsMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class SapforConfigurationCommandsMenuBar extends DataMenuBar { + public SapforConfigurationCommandsMenuBar() { + super("команды", + PassCode_2021.PublishSapforConfigurationCommand, + PassCode_2021.EditSapforConfigurationCommand, + PassCode_2021.DeleteSapforConfigurationCommand + ); + } +} diff --git a/src/Common/UI/Menus_2023/SapforConfigurationsMenuBar/SapforConfigurationsMenuBar.java b/src/Common/UI/Menus_2023/SapforConfigurationsMenuBar/SapforConfigurationsMenuBar.java new file mode 100644 index 00000000..abb7aa17 --- /dev/null +++ b/src/Common/UI/Menus_2023/SapforConfigurationsMenuBar/SapforConfigurationsMenuBar.java @@ -0,0 +1,12 @@ +package Common.UI.Menus_2023.SapforConfigurationsMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class SapforConfigurationsMenuBar extends DataMenuBar { + public SapforConfigurationsMenuBar() { + super("конфигурации", PassCode_2021.StartSapforTests, + PassCode_2021.PublishSapforConfiguration, + PassCode_2021.EditSapforConfiguration, + PassCode_2021.DeleteSapforConfiguration + ); + } +} diff --git a/src/Common/UI/Menus_2023/SapforTasksMenuBar/SapforTasksMenuBar.java b/src/Common/UI/Menus_2023/SapforTasksMenuBar/SapforTasksMenuBar.java new file mode 100644 index 00000000..537d5cb6 --- /dev/null +++ b/src/Common/UI/Menus_2023/SapforTasksMenuBar/SapforTasksMenuBar.java @@ -0,0 +1,8 @@ +package Common.UI.Menus_2023.SapforTasksMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class SapforTasksMenuBar extends DataMenuBar { + public SapforTasksMenuBar() { + super("задачи", PassCode_2021.OpenSapforTest); + } +} diff --git a/src/Common/UI/Menus_2023/SapforTasksPackagesBar/SapforTasksPackagesBar.java b/src/Common/UI/Menus_2023/SapforTasksPackagesBar/SapforTasksPackagesBar.java new file mode 100644 index 00000000..56ad5fda --- /dev/null +++ b/src/Common/UI/Menus_2023/SapforTasksPackagesBar/SapforTasksPackagesBar.java @@ -0,0 +1,8 @@ +package Common.UI.Menus_2023.SapforTasksPackagesBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class SapforTasksPackagesBar extends DataMenuBar { + public SapforTasksPackagesBar() { + super("пакеты задач", PassCode_2021.DeleteSapforTasksPackage); + } +} diff --git a/src/Common/UI/Menus_2023/SettingsSubmenu.java b/src/Common/UI/Menus_2023/SettingsSubmenu.java new file mode 100644 index 00000000..eeccb752 --- /dev/null +++ b/src/Common/UI/Menus_2023/SettingsSubmenu.java @@ -0,0 +1,19 @@ +package Common.UI.Menus_2023; +import Common.Current; +import Common.Global; +import Common.UI.Themes.VisualiserFonts; +import Common.Utils.Utils; +import GlobalData.Settings.SettingName; + +import javax.swing.*; +public class SettingsSubmenu extends JMenu { + public SettingsSubmenu(String title, String icon, SettingName... settings) { + super(title); + if (icon != null) + setIcon(Utils.getIcon(icon)); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Menu)); + for (SettingName c : settings) { + add(Global.db.settings.get(c).getMenuItem()); + } + } +} diff --git a/src/Common/UI/Menus_2023/StableMenuItem.java b/src/Common/UI/Menus_2023/StableMenuItem.java new file mode 100644 index 00000000..8bac9d47 --- /dev/null +++ b/src/Common/UI/Menus_2023/StableMenuItem.java @@ -0,0 +1,41 @@ +package Common.UI.Menus_2023; +import Common.UI.Menus.VisualiserMenuItem; +import Common.UI.UI; +import Common.Utils.Utils; + +import javax.swing.*; +import javax.swing.plaf.ComponentUI; +import javax.swing.plaf.basic.BasicMenuItemUI; +//неичезающий меню итем. нужен Ð´Ð»Ñ Ð½Ð°Ñтроек +//https://translated.turbopages.org/proxy_u/en-ru.ru.64537f6c-6460c460-8e74a1ab-74722d776562/https/tips4java.wordpress.com/2010/09/12/keeping-menus-open/ +class StableItemUI extends BasicMenuItemUI { + public static ComponentUI createUI(JComponent c) { + return new StableItemUI(); + } + @Override + protected void doClick(MenuSelectionManager msm) { + menuItem.doClick(0); + if (UI.last_menu_path != null) + MenuSelectionManager.defaultManager().setSelectedPath(UI.last_menu_path); + } +} +public class StableMenuItem extends VisualiserMenuItem { + { + getModel().addChangeListener(e -> { + if (getModel().isArmed() && isShowing()) + UI.last_menu_path = MenuSelectionManager.defaultManager().getSelectedPath(); + }); + } + public StableMenuItem(String text) { + super(text); + setUI(new StableItemUI()); + } + public StableMenuItem(String text, String icon_path) { + super(text); + setIcon(Utils.getIcon(icon_path)); + setUI(new StableItemUI()); + } + public StableMenuItem() { + setUI(new StableItemUI()); + } +} diff --git a/src/Common/UI/Menus_2023/StablePassMenuItem.java b/src/Common/UI/Menus_2023/StablePassMenuItem.java new file mode 100644 index 00000000..1474b20e --- /dev/null +++ b/src/Common/UI/Menus_2023/StablePassMenuItem.java @@ -0,0 +1,16 @@ +package Common.UI.Menus_2023; +import Common.Utils.Utils; +import Visual_DVM_2021.Passes.Pass_2021; +public class StablePassMenuItem extends StableMenuItem implements PassControl { + @Override + public void setIcon(String icon_path) { + setIcon(Utils.getIcon(icon_path)); + } + public StablePassMenuItem(Pass_2021 pass) { + setText(pass.getDescription()); + setToolTipText(pass.getDescription()); + if (pass.getIconPath() != null) setIcon(pass.getIconPath()); + addActionListener(pass.getControlAction()); + pass.controls.add(this); + } +} diff --git a/src/Common/UI/Menus_2023/StylesSubmenu.java b/src/Common/UI/Menus_2023/StylesSubmenu.java new file mode 100644 index 00000000..0dda3ec0 --- /dev/null +++ b/src/Common/UI/Menus_2023/StylesSubmenu.java @@ -0,0 +1,25 @@ +package Common.UI.Menus_2023; +import ProjectData.Files.LanguageStyle; + +import javax.swing.*; +import java.awt.event.ActionEvent; +public abstract class StylesSubmenu extends VisualiserMenu { + public StylesSubmenu() { + this("Стиль"); + } + public StylesSubmenu(String text) { + super(text, "/icons/Style.png", true); + for (LanguageStyle languageStyle : LanguageStyle.values()) { + JMenuItem m = new StableMenuItem(languageStyle.getDescription()); + m.addActionListener( + new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + action(languageStyle); + } + }); + add(m); + } + } + public abstract void action(LanguageStyle languageStyle); +} diff --git a/src/Common/UI/Menus_2023/SubscribersMenuBar/SubscribersMenuBar.java b/src/Common/UI/Menus_2023/SubscribersMenuBar/SubscribersMenuBar.java new file mode 100644 index 00000000..0c0edb5e --- /dev/null +++ b/src/Common/UI/Menus_2023/SubscribersMenuBar/SubscribersMenuBar.java @@ -0,0 +1,13 @@ +package Common.UI.Menus_2023.SubscribersMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class SubscribersMenuBar extends DataMenuBar { + public SubscribersMenuBar() { + super("ÐдреÑаты", + PassCode_2021.SaveBugReportExecutor, + PassCode_2021.SaveBugReportRecipients, + PassCode_2021.AddSubscriber, + PassCode_2021.EditSubscriber, + PassCode_2021.DeleteSubscriber); + } +} diff --git a/src/Common/UI/Menus_2023/TasksPackagesMenuBar/TasksPackagesMenuBar.java b/src/Common/UI/Menus_2023/TasksPackagesMenuBar/TasksPackagesMenuBar.java new file mode 100644 index 00000000..b5407024 --- /dev/null +++ b/src/Common/UI/Menus_2023/TasksPackagesMenuBar/TasksPackagesMenuBar.java @@ -0,0 +1,51 @@ +package Common.UI.Menus_2023.TasksPackagesMenuBar; +import Common.Current; +import Common.UI.Menus_2023.DataMenuBar; +import Common.UI.Menus_2023.MenuBarButton; +import Common.UI.Themes.VisualiserFonts; +import Common.UI.UI; +import Common.Utils.Utils; +import TestingSystem.TestingServer; +import Visual_DVM_2021.Passes.PassCode_2021; + +import javax.swing.*; +import java.awt.*; +public class TasksPackagesMenuBar extends DataMenuBar { + JButton autorefreshButton; + JSpinner sCheckTime; + public TasksPackagesMenuBar() { + super("пакеты задач", PassCode_2021.SynchronizeTestsTasks, PassCode_2021.AbortSelectedPackages); + add(autorefreshButton = new MenuBarButton() { + { + setText("проверка раз в"); + setToolTipText("автоматичеÑкое обновление ÑоÑтоÑÐ½Ð¸Ñ Ð¿Ð°ÐºÐµÑ‚Ð° задач"); + Mark(); + addActionListener(e -> { + TestingServer.checkTasks = !TestingServer.checkTasks; + TestingServer.switchTimer(TestingServer.checkTasks); + Mark(); + }); + } + public void Mark() { + setIcon(Utils.getIcon(TestingServer.checkTasks ? "/icons/Pick.png" : "/icons/NotPick.png")); + } + }); + add(sCheckTime = new JSpinner()); + sCheckTime.setPreferredSize(new Dimension(60, 26)); + sCheckTime.setMaximumSize(new Dimension(60, 26)); + sCheckTime.setModel(new SpinnerNumberModel(TestingServer.checkIntervalSecond, 10, 3600, 1)); + UI.MakeSpinnerRapid(sCheckTime, e -> { + TestingServer.checkIntervalSecond = (int) sCheckTime.getValue(); + if (TestingServer.checkTasks) TestingServer.ResetTimer(); + }); + add(new JLabel(" Ñек") { + { + setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreeItalic)); + } + }); + } + + public void ShowAutorefresh() { + autorefreshButton.setIcon(Utils.getIcon(TestingServer.checkTasks ? "/icons/Pick.png" : "/icons/NotPick.png")); + } +} diff --git a/src/Common/UI/Menus_2023/TestRunTasksMenuBar/TestRunTasksMenuBar.java b/src/Common/UI/Menus_2023/TestRunTasksMenuBar/TestRunTasksMenuBar.java new file mode 100644 index 00000000..7aed90cc --- /dev/null +++ b/src/Common/UI/Menus_2023/TestRunTasksMenuBar/TestRunTasksMenuBar.java @@ -0,0 +1,22 @@ +package Common.UI.Menus_2023.TestRunTasksMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; + +import javax.swing.*; +public class TestRunTasksMenuBar extends DataMenuBar { + JMenuBar filters= null; + public void DropFilters() { + if (filters != null) { + remove(filters); + filters = null; + } + revalidate(); + repaint(); + } + public void addFilters(JMenu cFilterMenu, JMenu rFilterMenu) { + filters= addMenus(cFilterMenu, rFilterMenu); + } + public TestRunTasksMenuBar() { + super("задачи", PassCode_2021.DownloadTaskTest); + } +} diff --git a/src/Common/UI/Menus_2023/TestsMenuBar/TestsMenuBar.java b/src/Common/UI/Menus_2023/TestsMenuBar/TestsMenuBar.java new file mode 100644 index 00000000..fb782f41 --- /dev/null +++ b/src/Common/UI/Menus_2023/TestsMenuBar/TestsMenuBar.java @@ -0,0 +1,12 @@ +package Common.UI.Menus_2023.TestsMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class TestsMenuBar extends DataMenuBar { + public TestsMenuBar() { + super("теÑты", + PassCode_2021.DownloadTest, + PassCode_2021.PublishTest, + PassCode_2021.EditTest, + PassCode_2021.DeleteSelectedTests); + } +} diff --git a/src/Common/UI/Menus_2023/TypesSubmenu.java b/src/Common/UI/Menus_2023/TypesSubmenu.java new file mode 100644 index 00000000..c81b6ca0 --- /dev/null +++ b/src/Common/UI/Menus_2023/TypesSubmenu.java @@ -0,0 +1,26 @@ +package Common.UI.Menus_2023; +import ProjectData.Files.FileType; + +import javax.swing.*; +import java.awt.event.ActionEvent; +public abstract class TypesSubmenu extends VisualiserMenu { + public TypesSubmenu() { + this("Тип"); + } + public TypesSubmenu(String text) { + super(text, "/icons/type.png", true); + for (FileType fileType : FileType.values()) { + if (fileType != FileType.forbidden) { + JMenuItem m = new StableMenuItem(fileType.getDescription()); + m.addActionListener(new AbstractAction() { + @Override + public void actionPerformed(ActionEvent e) { + action(fileType); + } + }); + add(m); + } + } + } + public abstract void action(FileType fileType); +} diff --git a/src/Common/UI/Menus_2023/UsersMenuBar/UsersMenuBar.java b/src/Common/UI/Menus_2023/UsersMenuBar/UsersMenuBar.java new file mode 100644 index 00000000..d57fb2cf --- /dev/null +++ b/src/Common/UI/Menus_2023/UsersMenuBar/UsersMenuBar.java @@ -0,0 +1,11 @@ +package Common.UI.Menus_2023.UsersMenuBar; +import Common.UI.Menus_2023.DataMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class UsersMenuBar extends DataMenuBar { + public UsersMenuBar() { + super("пользователи", PassCode_2021.AddUser, + PassCode_2021.EditUser, + PassCode_2021.InitialiseUser, + PassCode_2021.DeleteUser); + } +} diff --git a/src/Common/UI/Menus_2023/VariantsMenuBar/VariantsMenuBar.java b/src/Common/UI/Menus_2023/VariantsMenuBar/VariantsMenuBar.java new file mode 100644 index 00000000..a28bbf92 --- /dev/null +++ b/src/Common/UI/Menus_2023/VariantsMenuBar/VariantsMenuBar.java @@ -0,0 +1,28 @@ +package Common.UI.Menus_2023.VariantsMenuBar; +import Common.UI.Menus.VisualiserMenuItem; +import Common.UI.Menus_2023.DataMenuBar; +import Common.UI.Menus_2023.VisualiserMenu; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; +public class VariantsMenuBar extends DataMenuBar { + public VariantsMenuBar() { + super("варианты"); + addMenus(new VisualiserMenu("Отображение параллельных вариантов", + "/icons/ShowPassword.png") { + { + add(new VisualiserMenuItem("Ð’Ñе варианты") { + { + addActionListener(e -> Pass_2021.passes.get(PassCode_2021.GenerateParallelVariants).Do(true)); + } + }); + add(new VisualiserMenuItem("Минимальное покрытие вариантов") { + { + addActionListener(e -> Pass_2021.passes.get(PassCode_2021.GenerateParallelVariants).Do(false)); + } + }); + } + ; + }); + addPasses(PassCode_2021.PredictParallelVariants, PassCode_2021.CreateParallelVariants); + } +} diff --git a/src/Common/UI/Menus_2023/VersionsMenuBar/VersionsMenuBar.java b/src/Common/UI/Menus_2023/VersionsMenuBar/VersionsMenuBar.java new file mode 100644 index 00000000..f436acd1 --- /dev/null +++ b/src/Common/UI/Menus_2023/VersionsMenuBar/VersionsMenuBar.java @@ -0,0 +1,8 @@ +package Common.UI.Menus_2023.VersionsMenuBar; +import Common.UI.Menus_2023.VisualiserMenuBar; +import Visual_DVM_2021.Passes.PassCode_2021; +public class VersionsMenuBar extends VisualiserMenuBar { + public VersionsMenuBar(){ + addPasses(PassCode_2021.CreateTestsGroupFromSelectedVersions); + } +} diff --git a/src/Common/UI/Menus_2023/VisualiserMenu.java b/src/Common/UI/Menus_2023/VisualiserMenu.java new file mode 100644 index 00000000..e7eae0fa --- /dev/null +++ b/src/Common/UI/Menus_2023/VisualiserMenu.java @@ -0,0 +1,21 @@ +package Common.UI.Menus_2023; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; +import Common.Utils.Utils; + +import javax.swing.*; +import java.awt.*; +public class VisualiserMenu extends JMenu { + public VisualiserMenu(String text, String iconPath, boolean textVisible) { + setMinimumSize(new Dimension(38, 30)); //иначе ÑужаютÑÑ Ð²ÐµÑ€Ñ‚Ð¸ÐºÐ°Ð»ÑŒÐ½Ð¾. + setToolTipText(text); + if (textVisible) + setText(text); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreeItalic)); + if (!iconPath.isEmpty()) + setIcon(Utils.getIcon(iconPath)); + } + public VisualiserMenu(String text, String iconPath) { + this(text, iconPath, false); + } +} diff --git a/src/Common/UI/Menus_2023/VisualiserMenuBar.java b/src/Common/UI/Menus_2023/VisualiserMenuBar.java new file mode 100644 index 00000000..036bd01e --- /dev/null +++ b/src/Common/UI/Menus_2023/VisualiserMenuBar.java @@ -0,0 +1,31 @@ +package Common.UI.Menus_2023; +import Visual_DVM_2021.Passes.PassCode_2021; +import Visual_DVM_2021.Passes.Pass_2021; + +import javax.swing.*; +import java.awt.*; +//https://java-online.ru/swing-menu.xhtml +public class VisualiserMenuBar extends JToolBar { + public VisualiserMenuBar() { + setFloatable(false); + setSizeLimits(); + } + public void addPasses(PassCode_2021... codes) { + //- кнопки. ÑвÑзать их Ñ Ð¿Ñ€Ð¾Ñ…Ð¾Ð´Ð°Ð¼Ð¸. (!) + for (PassCode_2021 code : codes) + add(Pass_2021.passes.get(code).createButton()); + } + public JMenuBar addMenus(JMenu... menus) { + JMenuBar bar = new JMenuBar() { + { + for (JMenu menu : menus) + add(menu); + } + }; + add(bar); + return bar; + } + public void setSizeLimits() { + setPreferredSize(new Dimension(0, 30)); + } +} diff --git a/src/Common/UI/ProgressBar/StyledProgressBar.java b/src/Common/UI/ProgressBar/StyledProgressBar.java new file mode 100644 index 00000000..00895232 --- /dev/null +++ b/src/Common/UI/ProgressBar/StyledProgressBar.java @@ -0,0 +1,16 @@ +package Common.UI.ProgressBar; +import Common.Current; +import Common.UI.Themes.ThemeElement; + +import javax.swing.*; +public class StyledProgressBar extends JProgressBar implements ThemeElement { + public StyledProgressBar() { + setStringPainted(true); + applyTheme(); + } + @Override + public void applyTheme() { + setBackground(Current.getTheme().bar_background); + setForeground(Current.getTheme().bar_foreground); + } +} diff --git a/src/Common/UI/Selectable.java b/src/Common/UI/Selectable.java new file mode 100644 index 00000000..b113c4dd --- /dev/null +++ b/src/Common/UI/Selectable.java @@ -0,0 +1,38 @@ +package Common.UI; +import Common.Utils.Utils; + +import javax.swing.*; +public interface Selectable { + boolean isSelected(); + default void Select(boolean flag) { + if (isSelectionEnabled()) + select(flag); + } + void select(boolean flag); + //- + default ImageIcon GetSelectionIcon() { + return + isSelectionEnabled() ? + Utils.getIcon("/icons/" + (isSelected() ? "Pick" : "NotPick") + ".png") : + GetDisabledIcon(); + } + default ImageIcon GetDisabledIcon() { + return Utils.getIcon("/icons/Arrays/Unknown.png"); + } + default void SwitchSelection() { + Select(!isSelected()); + } + //Ñтрочный контент Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ´Ð°Ñ‡Ð¸ параметров проходам. + default String getSelectionContent() { + return toString(); + } + //- + default String getSelectionText() { + return toString(); + } + default boolean isSelectionEnabled() { + return true; + } + default void SelectAllChildren(boolean select) { + } +} diff --git a/src/Common/UI/StatusEnum.java b/src/Common/UI/StatusEnum.java new file mode 100644 index 00000000..e6085209 --- /dev/null +++ b/src/Common/UI/StatusEnum.java @@ -0,0 +1,13 @@ +package Common.UI; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; + +import java.awt.*; +public interface StatusEnum { + default Font getFont() { + return Current.getTheme().Fonts.get(VisualiserFonts.UnknownState); + } + default String getDescription() { + return toString(); + } +} diff --git a/src/Common/UI/Tables/ColumnFilter.java b/src/Common/UI/Tables/ColumnFilter.java new file mode 100644 index 00000000..7b33ba63 --- /dev/null +++ b/src/Common/UI/Tables/ColumnFilter.java @@ -0,0 +1,78 @@ +package Common.UI.Tables; +import Common.Database.DataSet; +import Common.UI.TextField.StyledTextField; +import Common.Utils.Utils; + +import javax.swing.*; +import javax.swing.border.MatteBorder; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +public class ColumnFilter { + public JTextField textField; + public JPopupMenu popup; + public ColumnFilter(DataSet dataSet, int columnIndex) { + textField = new StyledTextField() { + { + setBorder(null); + addActionListener(e -> { + popup.setVisible(false); + dataSet.ui_.control.getTableHeader().repaint(); + }); + getDocument().addDocumentListener(new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + dataSet.changeColumnFilterValue(columnIndex, getText()); + dataSet.ShowUI(); + } + @Override + public void removeUpdate(DocumentEvent e) { + dataSet.changeColumnFilterValue(columnIndex, getText()); + dataSet.ShowUI(); + } + @Override + public void changedUpdate(DocumentEvent e) { + } + }); + } + }; + popup = new JPopupMenu() { + { + setBorder(new MatteBorder(0, 1, 1, 1, Color.DARK_GRAY)); + } + }; + popup.add(textField); + //-- + dataSet.getUi().control.getColumnModel().getColumn(columnIndex).setHeaderRenderer((table, value, isSelected, hasFocus, row, column1) -> new JLabel() { + { + setIcon(Utils.getIcon("/icons/Filter.png")); + setForeground(dataSet.getUi().control.getTableHeader().getForeground()); + setBackground(dataSet.getUi().control.getTableHeader().getBackground()); + setFont(dataSet.getUi().control.getTableHeader().getFont()); + setBorder(new MatteBorder(0, 0, 1, 1, Color.DARK_GRAY)); + setText("текÑÑ‚ : "+dataSet.getColumnFilterValue(columnIndex)); + } + }); + //-- + dataSet.getUi().control.getTableHeader().addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent event) { + if (event.getClickCount() == 1) { + int columnIndex = dataSet.getUi().control.getTableHeader().columnAtPoint(event.getPoint()); + if (dataSet.columnsFilters.containsKey(columnIndex)) { + Rectangle columnRectangle = dataSet.getUi().control.getTableHeader().getHeaderRect(columnIndex); + Dimension d = new Dimension(columnRectangle.width - 72, columnRectangle.height - 1); + popup.setPreferredSize(d); + popup.setMaximumSize(d); + popup.show(dataSet.getUi().control.getTableHeader(), columnRectangle.x + 72, 0); + textField.setText(dataSet.getColumnFilterValue(columnIndex).toString()); + textField.requestFocusInWindow(); + textField.selectAll(); + } + } + } + }); + } +} diff --git a/src/Common/UI/Tables/ColumnInfo.java b/src/Common/UI/Tables/ColumnInfo.java new file mode 100644 index 00000000..76d2f71a --- /dev/null +++ b/src/Common/UI/Tables/ColumnInfo.java @@ -0,0 +1,94 @@ +package Common.UI.Tables; +import Common.Utils.Utils; +public class ColumnInfo { + private String Name = "?"; + private boolean visible = true; + private boolean editable = false; + private TableRenderers renderer = TableRenderers.RendererDefault; + private TableEditors editor = TableEditors.EditorDefault; + private int maxWidth = Utils.Nan; + private int minWidth = Utils.Nan; + //private int lastWidth = Utils.Nan; + // public void setLastWidth(int width_in) { + // lastWidth = width_in; + // } + // public int getLastWidth() { + // return lastWidth; + // } + public ColumnInfo(String name_in) { + setName(name_in); + } + public ColumnInfo(String name_in, TableRenderers renderer_in, TableEditors editor_in) { + setName(name_in); + setRenderer(renderer_in); + setEditable(true); + setEditor(editor_in); + } + public ColumnInfo(String name_in, TableRenderers renderer_in) { + setName(name_in); + setRenderer(renderer_in); + } + public String getName() { + return Name; + } + public void setName(String name_in) { + Name = name_in; + } + public boolean isVisible() { + return visible; + } + public void setVisible(boolean visible_in) { + this.visible = visible_in; + } + public boolean isEditable() { + return editable; + } + public void setEditable(boolean editable_in) { + this.editable = editable_in; + } + public TableRenderers getRenderer() { + return renderer; + } + public void setRenderer(TableRenderers renderer_in) { + this.renderer = renderer_in; + } + public TableEditors getEditor() { + return editor; + } + public void setEditor(TableEditors editor_in) { + this.editor = editor_in; + setEditable(editor != TableEditors.EditorDefault); + } + public boolean hasRenderer() { + return getRenderer() != TableRenderers.RendererDefault; + } + public boolean hasEditor() { + return getEditor() != TableEditors.EditorDefault; + } + public int getMaxWidth() { + return maxWidth; + } + public void setMaxWidth(int maxWidth_in) { + this.maxWidth = maxWidth_in; + } + public boolean hasMaxWidth() { + return maxWidth != Utils.Nan; + } + //- + public int getMinWidth() { + return minWidth; + } + public void setMinWidth(int minWidth_in) { + this.minWidth = minWidth_in; + } + public boolean hasMinWidth() { + return minWidth != Utils.Nan; + } + +/* + public boolean hasLastWidth() { + return lastWidth != Utils.Nan; + } + */ + //- +} diff --git a/src/Common/UI/Tables/DBObjectEditor.java b/src/Common/UI/Tables/DBObjectEditor.java new file mode 100644 index 00000000..2aea8d2b --- /dev/null +++ b/src/Common/UI/Tables/DBObjectEditor.java @@ -0,0 +1,88 @@ +package Common.UI.Tables; +import Common.Database.DBObject; +import Common.UI.DataControl; + +import javax.swing.*; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.table.TableCellEditor; +import java.awt.*; +import java.util.EventObject; +import java.util.Objects; +public abstract class DBObjectEditor extends EditorCell implements TableCellEditor { + //задаетÑÑ Ð¿Ñ€Ð¸ редактировании клетки. + public T value = null; + protected transient ChangeEvent changeEvent; + public abstract void Action(); + public void InitValue(JTable table, Object value_in, int row, int column) { + value = (T) ((DataControl) table).getRowObject(row); + } + @Override + public Component getTableCellEditorComponent( + JTable table, Object value_in, boolean isSelected, int row, int column) { + this.setBackground(table.getSelectionBackground()); + InitValue(table, value_in, row, column); + Action(); + return this; + } + //Copied from AbstractCellEditor + //protected EventListenerList listenerList = new EventListenerList(); + @Override + public boolean isCellEditable(EventObject e) { + return true; + } + @Override + public boolean shouldSelectCell(EventObject anEvent) { + return true; + } + @Override + public boolean stopCellEditing() { + fireEditingStopped(); + return true; + } + @Override + public void cancelCellEditing() { + fireEditingCanceled(); + } + @Override + public void addCellEditorListener(CellEditorListener l) { + listenerList.add(CellEditorListener.class, l); + } + @Override + public void removeCellEditorListener(CellEditorListener l) { + listenerList.remove(CellEditorListener.class, l); + } + public CellEditorListener[] getCellEditorListeners() { + return listenerList.getListeners(CellEditorListener.class); + } + protected void fireEditingStopped() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == CellEditorListener.class) { + // Lazily create the event: + if (Objects.isNull(changeEvent)) { + changeEvent = new ChangeEvent(this); + } + ((CellEditorListener) listeners[i + 1]).editingStopped(changeEvent); + } + } + } + protected void fireEditingCanceled() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == CellEditorListener.class) { + // Lazily create the event: + if (Objects.isNull(changeEvent)) { + changeEvent = new ChangeEvent(this); + } + ((CellEditorListener) listeners[i + 1]).editingCanceled(changeEvent); + } + } + } +} diff --git a/src/Common/UI/Tables/DBObjectRenderer.java b/src/Common/UI/Tables/DBObjectRenderer.java new file mode 100644 index 00000000..1af0e5ac --- /dev/null +++ b/src/Common/UI/Tables/DBObjectRenderer.java @@ -0,0 +1,11 @@ +package Common.UI.Tables; +import Common.Database.DBObject; +import Common.UI.DataControl; + +import javax.swing.*; +public abstract class DBObjectRenderer extends RendererCell { + @Override + public DBObject Init(JTable table, Object value, int row, int column) { + return ((DataControl) table).getRowObject(row); + } +} \ No newline at end of file diff --git a/src/Common/UI/Tables/DBObjectSelectionRenderer.java b/src/Common/UI/Tables/DBObjectSelectionRenderer.java new file mode 100644 index 00000000..b83afe20 --- /dev/null +++ b/src/Common/UI/Tables/DBObjectSelectionRenderer.java @@ -0,0 +1,14 @@ +package Common.UI.Tables; +public class DBObjectSelectionRenderer extends DBObjectRenderer { + /* + @Override + public Dimension getMinimumSize() { + return new Dimension(25,25); + } + */ + @Override + public void Display() { + if (value != null) + setIcon(value.GetSelectionIcon()); + } +} diff --git a/src/Common/UI/Tables/DBObjectSelector.java b/src/Common/UI/Tables/DBObjectSelector.java new file mode 100644 index 00000000..b7c235de --- /dev/null +++ b/src/Common/UI/Tables/DBObjectSelector.java @@ -0,0 +1,13 @@ +package Common.UI.Tables; +import Common.Database.DBObject; +public class DBObjectSelector extends DBObjectEditor { + @Override + public void Action() { + value.SwitchSelection(); + setIcon(value.GetSelectionIcon()); + } + @Override + public Object getCellEditorValue() { + return value.isSelected(); + } +} diff --git a/src/Common/UI/Tables/DataTable.java b/src/Common/UI/Tables/DataTable.java new file mode 100644 index 00000000..43b2d0c0 --- /dev/null +++ b/src/Common/UI/Tables/DataTable.java @@ -0,0 +1,64 @@ +package Common.UI.Tables; +import Common.Database.DBObject; +import Common.UI.DataControl; + +import javax.swing.table.AbstractTableModel; +public abstract class DataTable extends StyledTable implements DataControl { + public DataTable(AbstractTableModel model) { + super(model); + } + @Override + public void SelectRowByPK(Object pk) { + for (int i = 0; i < getRowCount(); ++i) { + DBObject o = getRowObject(i); + if (o!=null) { + if (o.getPK() + .equals(pk)) { + SelectRow(i); + scrollToVisible(i, 0); + return; + } + } + } + } + //------------------------------- + /* + public void SelectRow(int r) { + getSelectionModel().setSelectionInterval(r, r); + } + public Object getRowKey(int r) { + return getValueAt(r, 0); + } + public DBObject getRowObject(int row) { + return (DBObject) getGrid().getDataSource().get(getRowKey(row)); + } + //------------------------------- + + public int getRowByKey(Object key) { + for (int i = 0; i < getRowCount(); ++i) { + if (getRowKey(i).equals(key)) return i; + } + return -1; + } + public void SelectRowByKey(Object key) { + int r = getRowByKey(key); + if (r >= 0) + SelectRow(r); + } + public void ClearSelectionSync() { + events_on = false; + getSelectionModel().clearSelection(); + current_row_i = Utils.Nan; + events_on = true; + } + public void SelectRowByKeySync(Object key) { + int r = getRowByKey(key); + events_on = false; + if (r >= 0) + SelectRow(r); + events_on = true; + current_row_i = r; + } + + */ +} diff --git a/src/Common/UI/Tables/DateRenderer_.java b/src/Common/UI/Tables/DateRenderer_.java new file mode 100644 index 00000000..6c432062 --- /dev/null +++ b/src/Common/UI/Tables/DateRenderer_.java @@ -0,0 +1,18 @@ +package Common.UI.Tables; +import Common.Utils.Utils; + +import javax.swing.*; +import java.util.Date; +//название переÑекаетÑÑ Ñ Ð²Ñтроенным клаÑÑом поÑтому подчеркивание. +public class DateRenderer_ extends RendererCell { + private static final Date zero = new Date(0); + @Override + public Date Init(JTable table, Object value, int row, int column) { + return (Date) value; + } + @Override + public void Display() { + if (value != null) + setText(value.equals(zero) ? "нет" : Utils.print_date(value)); + } +} diff --git a/src/Common/UI/Tables/EditableHeaderRenderer.java b/src/Common/UI/Tables/EditableHeaderRenderer.java new file mode 100644 index 00000000..2264a369 --- /dev/null +++ b/src/Common/UI/Tables/EditableHeaderRenderer.java @@ -0,0 +1,82 @@ +package Common.UI.Tables; +import javax.swing.*; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +public class EditableHeaderRenderer implements TableCellRenderer { + private JTable table = null; + private MouseEventReposter reporter = null; + private JComponent editor; + public EditableHeaderRenderer(JComponent editor) { + this.editor = editor; + this.editor.setBorder(UIManager.getBorder("TableHeader.cellBorder")); + } + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int col) { + if (table != null && this.table != table) { + this.table = table; + final JTableHeader header = table.getTableHeader(); + if (header != null) { + this.editor.setForeground(header.getForeground()); + this.editor.setBackground(header.getBackground()); + this.editor.setFont(header.getFont()); + reporter = new MouseEventReposter(header, col, this.editor); + header.addMouseListener(reporter); + } + } + if (reporter != null) reporter.setColumn(col); + return this.editor; + } + static public class MouseEventReposter extends MouseAdapter { + private Component dispatchComponent; + private JTableHeader header; + private int column = -1; + private Component editor; + public MouseEventReposter(JTableHeader header, int column, Component editor) { + this.header = header; + this.column = column; + this.editor = editor; + } + public void setColumn(int column) { + this.column = column; + } + private void setDispatchComponent(MouseEvent e) { + int col = header.getTable().columnAtPoint(e.getPoint()); + if (col != column || col == -1) return; + Point p = e.getPoint(); + Point p2 = SwingUtilities.convertPoint(header, p, editor); + dispatchComponent = SwingUtilities.getDeepestComponentAt(editor, p2.x, p2.y); + } + private boolean repostEvent(MouseEvent e) { + if (dispatchComponent == null) { + return false; + } + MouseEvent e2 = SwingUtilities.convertMouseEvent(header, e, dispatchComponent); + dispatchComponent.dispatchEvent(e2); + return true; + } + @Override + public void mousePressed(MouseEvent e) { + if (header.getResizingColumn() == null) { + Point p = e.getPoint(); + int col = header.getTable().columnAtPoint(p); + if (col != column || col == -1) return; + int index = header.getColumnModel().getColumnIndexAtX(p.x); + if (index == -1) return; + editor.setBounds(header.getHeaderRect(index)); + header.add(editor); + editor.validate(); + setDispatchComponent(e); + repostEvent(e); + } + } + @Override + public void mouseReleased(MouseEvent e) { + repostEvent(e); + dispatchComponent = null; + header.remove(editor); + } + } +} diff --git a/src/Common/UI/Tables/EditorCell.java b/src/Common/UI/Tables/EditorCell.java new file mode 100644 index 00000000..85c3b881 --- /dev/null +++ b/src/Common/UI/Tables/EditorCell.java @@ -0,0 +1,7 @@ +package Common.UI.Tables; +import java.awt.*; +public class EditorCell extends StyledCellLabel { + public EditorCell() { + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + } +} diff --git a/src/Common/UI/Tables/Grid/GridAnchestor.java b/src/Common/UI/Tables/Grid/GridAnchestor.java new file mode 100644 index 00000000..05f7c73e --- /dev/null +++ b/src/Common/UI/Tables/Grid/GridAnchestor.java @@ -0,0 +1,28 @@ +package Common.UI.Tables.Grid; +import javax.swing.table.AbstractTableModel; +import java.util.Collection; +import java.util.Vector; +public abstract class GridAnchestor extends AbstractTableModel { + public Vector data = new Vector<>(); + protected Vector columnNames = new Vector<>(); //маÑÑив имен Ñтолбцов. + public GridAnchestor(Collection columnNames_in, Collection data_in) { + columnNames.addAll(columnNames_in); + data.addAll(data_in); + } + @Override + public String getColumnName(int col) { + return columnNames.get(col); + } + @Override + public int getColumnCount() { + return columnNames.size(); + } + @Override + public int getRowCount() { + return data.size(); + } + @Override + public Class getColumnClass(int column) { + return getValueAt(0, column).getClass(); + } +} diff --git a/src/Common/UI/Tables/HiddenListRenderer.java b/src/Common/UI/Tables/HiddenListRenderer.java new file mode 100644 index 00000000..23e185cd --- /dev/null +++ b/src/Common/UI/Tables/HiddenListRenderer.java @@ -0,0 +1,17 @@ +package Common.UI.Tables; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; + +import javax.swing.*; +import java.util.Vector; +public class HiddenListRenderer extends RendererCell> { + @Override + public Vector Init(JTable table, Object value, int row, int column) { + return (Vector) value; + } + @Override + public void Display() { + setText(String.join(";", value)); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain)); + } +} diff --git a/src/Common/UI/Tables/HyperlinksRenderer.java b/src/Common/UI/Tables/HyperlinksRenderer.java new file mode 100644 index 00000000..6856748d --- /dev/null +++ b/src/Common/UI/Tables/HyperlinksRenderer.java @@ -0,0 +1,15 @@ +package Common.UI.Tables; +import Common.UI.List.HyperlinksStyledList; + +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +import java.util.Vector; +public class HyperlinksRenderer extends HyperlinksStyledList implements TableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + setListData((Vector) value); + return this; + } +} diff --git a/src/Common/UI/Tables/MaskedIntegerValueRenderer.java b/src/Common/UI/Tables/MaskedIntegerValueRenderer.java new file mode 100644 index 00000000..25af520f --- /dev/null +++ b/src/Common/UI/Tables/MaskedIntegerValueRenderer.java @@ -0,0 +1,18 @@ +package Common.UI.Tables; +import javax.swing.*; +public class MaskedIntegerValueRenderer extends RendererCell { + @Override + public Long Init(JTable table, Object value, int row, int column) { + return (Long) value; + } + public long getMask() { + return -1; + } + public String getMaskText() { + return " — "; + } + public void Display() { + if (value != null) + setText(value.equals((getMask())) ? getMaskText() : String.valueOf(value)); + } +} diff --git a/src/Common/UI/Tables/MultilineRenderer.java b/src/Common/UI/Tables/MultilineRenderer.java new file mode 100644 index 00000000..e4785f42 --- /dev/null +++ b/src/Common/UI/Tables/MultilineRenderer.java @@ -0,0 +1,16 @@ +package Common.UI.Tables; +import Common.UI.List.StyledList; + +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +import java.util.Vector; +public class MultilineRenderer extends StyledList implements TableCellRenderer { + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + setListData((Vector) value); + return this; + } +} + diff --git a/src/Common/UI/Tables/ProgressBarRenderer.java b/src/Common/UI/Tables/ProgressBarRenderer.java new file mode 100644 index 00000000..ad1c44ba --- /dev/null +++ b/src/Common/UI/Tables/ProgressBarRenderer.java @@ -0,0 +1,15 @@ +package Common.UI.Tables; +import Common.UI.ProgressBar.StyledProgressBar; + +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +public class ProgressBarRenderer extends StyledProgressBar implements TableCellRenderer { + @Override + public java.awt.Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + setValue((Integer) value); + return this; + } +} + + diff --git a/src/Common/UI/Tables/RendererCell.java b/src/Common/UI/Tables/RendererCell.java new file mode 100644 index 00000000..5b87d32d --- /dev/null +++ b/src/Common/UI/Tables/RendererCell.java @@ -0,0 +1,16 @@ +package Common.UI.Tables; +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +public abstract class RendererCell extends StyledCellLabel implements TableCellRenderer { + public T value; + public abstract T Init(JTable table, Object value, int row, int column); //получить значение + public abstract void Display(); //отобразить его. + @Override + public Component getTableCellRendererComponent(JTable table, Object value_in, boolean isSelected, boolean hasFocus, int row, int column) { + setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + value = Init(table, value_in, row, column); + Display(); + return this; + } +} diff --git a/src/Common/UI/Tables/StatusEnumRenderer.java b/src/Common/UI/Tables/StatusEnumRenderer.java new file mode 100644 index 00000000..f7ff213b --- /dev/null +++ b/src/Common/UI/Tables/StatusEnumRenderer.java @@ -0,0 +1,17 @@ +package Common.UI.Tables; +import Common.UI.StatusEnum; + +import javax.swing.*; +public class StatusEnumRenderer extends RendererCell { + @Override + public StatusEnum Init(JTable table, Object value, int row, int column) { + return (StatusEnum) value; + } + @Override + public void Display() { + if (value != null) { + setText(value.getDescription()); + setFont(value.getFont()); + } + } +} diff --git a/src/Common/UI/Tables/StyledCellLabel.java b/src/Common/UI/Tables/StyledCellLabel.java new file mode 100644 index 00000000..401e6030 --- /dev/null +++ b/src/Common/UI/Tables/StyledCellLabel.java @@ -0,0 +1,21 @@ +package Common.UI.Tables; +import Common.Current; +import Common.UI.Themes.ThemeElement; +import Common.UI.Themes.VisualiserFonts; + +import javax.swing.*; +//наиболее раÑпроÑтраненный Ñлучай. переотображение текÑта и/или Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð² Ñчейке таблицы. +public class StyledCellLabel extends JLabel implements ThemeElement { + public StyledCellLabel() { + setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain)); + setHorizontalAlignment(SwingConstants.LEFT); + setVerticalAlignment(SwingConstants.CENTER); + setOpaque(true); + applyTheme(); + } + @Override + public void applyTheme() { + setBackground(Current.getTheme().table_background); + setForeground(Current.getTheme().foreground); + } +} diff --git a/src/Common/UI/Tables/StyledTable.java b/src/Common/UI/Tables/StyledTable.java new file mode 100644 index 00000000..44af8512 --- /dev/null +++ b/src/Common/UI/Tables/StyledTable.java @@ -0,0 +1,101 @@ +package Common.UI.Tables; +import Common.Current; +import Common.UI.Menus.TableMenu; +import Common.UI.Themes.ThemeElement; +import Common.UI.Themes.VisualiserFonts; + +import javax.swing.*; +import javax.swing.table.*; +import java.awt.*; +public abstract class StyledTable extends JTable implements ThemeElement { + //https://askdev.ru/q/kak-upravlyat-stilem-cvetom-i-razmerom-shrifta-vnutri-jtable-455196/ + //https://stackoverflow.com/questions/4129666/how-to-convert-hex-to-rgb-using-java цвета + public StyledTable(AbstractTableModel model) { + super(model); + setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + setFillsViewportHeight(true); + setAutoCreateRowSorter(dataModel.getRowCount() > 0); + Init(); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain)); + JTableHeader header = getTableHeader(); + header.setFont(Current.getTheme().Fonts.get(VisualiserFonts.TreePlain)); + putClientProperty("terminateEditOnFocusLost", Boolean.TRUE); + setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + //текущий объет может определÑтьÑÑ Ð¿Ð¾ первому Ñтолбцу. могут быть баги еÑли не запретить + getTableHeader().setReorderingAllowed(false); + CorrectSizes(); + setComponentPopupMenu(CreateMenu()); + applyTheme(); + } + public TableMenu CreateMenu() { + return new TableMenu(this); + } + public void Init() { + } + private void adjustColumnSizes(int column, int margin) { + DefaultTableColumnModel colModel = (DefaultTableColumnModel) getColumnModel(); + TableColumn col = colModel.getColumn(column); + int width; + TableCellRenderer renderer = col.getHeaderRenderer(); + if (renderer == null) { + renderer = getTableHeader().getDefaultRenderer(); + } + Component comp = renderer.getTableCellRendererComponent(this, col.getHeaderValue(), false, false, 0, 0); + width = comp.getPreferredSize().width; + for (int r = 0; r < getRowCount(); r++) { + renderer = getCellRenderer(r, column); + comp = renderer.getTableCellRendererComponent(this, getValueAt(r, column), false, false, r, column); + int currentWidth = comp.getPreferredSize().width; + width = Math.max(width, currentWidth); + } + width += 2 * margin; + col.setPreferredWidth(width); + col.setWidth(width); + } + private void adjustJTableRowSizes() { + for (int row = 0; row < getRowCount(); row++) { + int maxHeight = 0; + for (int column = 0; column < getColumnCount(); column++) { + TableCellRenderer cellRenderer = getCellRenderer(row, column); + Object valueAt = getValueAt(row, column); + Component tableCellRendererComponent = cellRenderer.getTableCellRendererComponent(this, valueAt, false, false, row, column); + int heightPreferable = tableCellRendererComponent.getPreferredSize().height; + maxHeight = Math.max(heightPreferable, maxHeight); + } + setRowHeight(row, maxHeight); + } + } + public void CorrectSizes() { + adjustJTableRowSizes(); + CorrectColumnsSizes(); + this.removeEditor();//отлючение Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÐµÑ‚Ð¾Ðº еÑли таковые были. + } + public void CorrectColumnsSizes() { + for (int i = 0; i < getColumnCount(); i++) { + adjustColumnSizes(i, 2); + } + } + @Override + public void applyTheme() { + setBackground(Current.getTheme().table_background); + setForeground(Current.getTheme().foreground); + setSelectionBackground(Current.getTheme().selection_background); + setSelectionForeground(Current.getTheme().foreground); + } + public void SelectRow(int r) { + getSelectionModel().setSelectionInterval(r, r); + } + public void scrollToVisible(int rowIndex, int vColIndex) { + if (!(getParent() instanceof JViewport)) { + return; + } + JViewport viewport = (JViewport) getParent(); + Rectangle rect = getCellRect(rowIndex, vColIndex, true); + Point pt = viewport.getViewPosition(); + rect.setLocation(rect.x - pt.x, rect.y - pt.y); + viewport.scrollRectToVisible(rect); + } + public void scrollToLastRow() { + scrollToVisible(getRowCount() - 1, 0); + } +} diff --git a/src/Common/UI/Tables/TableEditors.java b/src/Common/UI/Tables/TableEditors.java new file mode 100644 index 00000000..090c6751 --- /dev/null +++ b/src/Common/UI/Tables/TableEditors.java @@ -0,0 +1,8 @@ +package Common.UI.Tables; +public enum TableEditors { + EditorDefault, + EditorSelect, + EditorHyperlinks, + EditorDimension, + EditorCompilerEnvironmentValue, EditorCompilerOptionParameterValue +} diff --git a/src/Common/UI/Tables/TableRenderers.java b/src/Common/UI/Tables/TableRenderers.java new file mode 100644 index 00000000..82598e50 --- /dev/null +++ b/src/Common/UI/Tables/TableRenderers.java @@ -0,0 +1,19 @@ +package Common.UI.Tables; +public enum TableRenderers { + RendererDefault, + RendererDate, + RendererProgress, + RendererSelect, + RendererDimension, + RendererMultiline, + RendererHyperlinks, + RendererTopLeft, + RendererMaskedInt, + RendererVariantRank, + RendererHiddenList, + RendererWrapText, + RendererCompilerOptionParameterValue, + RendererCompilerEnvironmentValue, + RendererCompilerOptionParameterName, + RendererStatusEnum +} diff --git a/src/Common/UI/Tables/TopLeftRenderer.java b/src/Common/UI/Tables/TopLeftRenderer.java new file mode 100644 index 00000000..e866714a --- /dev/null +++ b/src/Common/UI/Tables/TopLeftRenderer.java @@ -0,0 +1,13 @@ +package Common.UI.Tables; +import javax.swing.*; +public class TopLeftRenderer extends RendererCell { + @Override + public Object Init(JTable table, Object value, int row, int column) { + return value; + } + @Override + public void Display() { + if (value != null) + setText(value.toString()); + } +} diff --git a/src/Common/UI/Tables/VectorEditor.java b/src/Common/UI/Tables/VectorEditor.java new file mode 100644 index 00000000..d7882867 --- /dev/null +++ b/src/Common/UI/Tables/VectorEditor.java @@ -0,0 +1,89 @@ +package Common.UI.Tables; +import ProjectData.Files.UI.FilesHyperlinksPanel; + +import javax.swing.*; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.table.TableCellEditor; +import java.awt.*; +import java.util.EventObject; +import java.util.Objects; +import java.util.Vector; +public class VectorEditor extends FilesHyperlinksPanel implements TableCellEditor { + protected transient ChangeEvent changeEvent; + @Override + public Component getTableCellEditorComponent( + JTable table, Object value, boolean isSelected, int row, int column) { + if (value instanceof Vector) { + UpdateByCell((Vector) value); + this.Hyperlinks.setBackground(table.getSelectionBackground()); + Hyperlinks.setSelectionBackground(table.getSelectionBackground()); + Hyperlinks.setSelectionForeground(table.getSelectionForeground()); + } + return this; + } + @Override + public Object getCellEditorValue() { + return links; + } + //Copied from AbstractCellEditor + //protected EventListenerList listenerList = new EventListenerList(); + @Override + public boolean isCellEditable(EventObject e) { + return true; + } + @Override + public boolean shouldSelectCell(EventObject anEvent) { + return true; + } + @Override + public boolean stopCellEditing() { + fireEditingStopped(); + return true; + } + @Override + public void cancelCellEditing() { + fireEditingCanceled(); + } + @Override + public void addCellEditorListener(CellEditorListener l) { + listenerList.add(CellEditorListener.class, l); + } + @Override + public void removeCellEditorListener(CellEditorListener l) { + listenerList.remove(CellEditorListener.class, l); + } + public CellEditorListener[] getCellEditorListeners() { + return listenerList.getListeners(CellEditorListener.class); + } + protected void fireEditingStopped() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == CellEditorListener.class) { + // Lazily create the event: + if (Objects.isNull(changeEvent)) { + changeEvent = new ChangeEvent(this); + } + ((CellEditorListener) listeners[i + 1]).editingStopped(changeEvent); + } + } + } + protected void fireEditingCanceled() { + // Guaranteed to return a non-null array + Object[] listeners = listenerList.getListenerList(); + // Process the listeners last to first, notifying + // those that are interested in this event + for (int i = listeners.length - 2; i >= 0; i -= 2) { + if (listeners[i] == CellEditorListener.class) { + // Lazily create the event: + if (Objects.isNull(changeEvent)) { + changeEvent = new ChangeEvent(this); + } + ((CellEditorListener) listeners[i + 1]).editingCanceled(changeEvent); + } + } + } +} diff --git a/src/Common/UI/Tables/WrapTextRenderer.java b/src/Common/UI/Tables/WrapTextRenderer.java new file mode 100644 index 00000000..6732d97c --- /dev/null +++ b/src/Common/UI/Tables/WrapTextRenderer.java @@ -0,0 +1,25 @@ +package Common.UI.Tables; +import Common.Current; +import Common.UI.Themes.VisualiserFonts; + +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +import java.awt.*; +public class WrapTextRenderer extends JTextArea implements TableCellRenderer { + public WrapTextRenderer() { + setLineWrap(true); + setWrapStyleWord(true); + // setOpaque(false); + setFont(Current.getTheme().Fonts.get(VisualiserFonts.Distribution).deriveFont(14.0f)); + } + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); + setText((value == null) ? "" : value.toString()); + setSize(table.getColumnModel().getColumn(column).getWidth(), + getPreferredSize().height); + if (table.getRowHeight(row) != getPreferredSize().height) { + table.setRowHeight(row, getPreferredSize().height); + } + return this; + } +} diff --git a/src/Common/UI/TextArea/StyledTextArea.java b/src/Common/UI/TextArea/StyledTextArea.java new file mode 100644 index 00000000..f8c61d0c --- /dev/null +++ b/src/Common/UI/TextArea/StyledTextArea.java @@ -0,0 +1,9 @@ +package Common.UI.TextArea; +import Common.UI.Menus.TextEditorMenu; + +import javax.swing.*; +public class StyledTextArea extends JTextArea { + public StyledTextArea() { + setComponentPopupMenu(new TextEditorMenu(this)); + } +} diff --git a/src/Common/UI/TextField/StyledPasswordField.java b/src/Common/UI/TextField/StyledPasswordField.java new file mode 100644 index 00000000..19817aeb --- /dev/null +++ b/src/Common/UI/TextField/StyledPasswordField.java @@ -0,0 +1,11 @@ +package Common.UI.TextField; +import Common.UI.Menus.StyledPopupMenu; +import Common.UI.Menus.TextEditorMenu; + +import javax.swing.*; +public class StyledPasswordField extends JPasswordField { + private StyledPopupMenu menu; + public StyledPasswordField() { + setComponentPopupMenu(new TextEditorMenu(this)); + } +} diff --git a/src/Common/UI/TextField/StyledTextField.java b/src/Common/UI/TextField/StyledTextField.java new file mode 100644 index 00000000..8e6a0cfe --- /dev/null +++ b/src/Common/UI/TextField/StyledTextField.java @@ -0,0 +1,11 @@ +package Common.UI.TextField; +import Common.UI.Menus.StyledPopupMenu; +import Common.UI.Menus.TextEditorMenu; + +import javax.swing.*; +public class StyledTextField extends JTextField { + private StyledPopupMenu menu; + public StyledTextField() { + setComponentPopupMenu(new TextEditorMenu(this)); + } +} diff --git a/src/Common/UI/Themes/DarkVisualiserTheme.java b/src/Common/UI/Themes/DarkVisualiserTheme.java new file mode 100644 index 00000000..86f43d52 --- /dev/null +++ b/src/Common/UI/Themes/DarkVisualiserTheme.java @@ -0,0 +1,64 @@ +package Common.UI.Themes; +import java.awt.*; +public class DarkVisualiserTheme extends VisualiserTheme { + @Override + protected String getEditorThemePath() { + return "/Common/UI/Themes/dark_editor.xml"; + } + @Override + protected String getForegroundHex() { + return "#e0e5eb"; + } + @Override + protected String getBackgroundHex() { + return "#484a4c"; + } + @Override + protected String getSelectionBackgroundHex() { + return "#20355a"; + } + @Override + protected String getTreeBackgroundHex() { + return "#293134"; + } + @Override + protected String getBarForegroundHex() { + return "#000000"; + } + @Override + protected String getBarBackgroundHex() { + return "#484a4c"; + } + @Override + protected String getTableBackgroundHex() { + return "#293134"; + } + @Override + protected Color getGoodFontColor() { + return Color.decode("#24ff58"); + } + @Override + protected Color getReadyFontColor2() { + return Color.decode("#FFFF00"); + } + @Override + protected Color getProgressFontColor() { + return Color.orange; + } + @Override + protected Color getBadFontColor() { + return Color.decode("#8B0000"); + } + @Override + protected Color getFatalFontColor() { + return Color.red; + } + @Override + protected Color getUnknownFontColor() { + return Color.decode("#c7c7c7"); + } + @Override + protected Color getHyperlinkFontColor() { + return Color.decode("#00aee9"); + } +} diff --git a/src/Common/UI/Themes/FortranSPFTokenMaker.java b/src/Common/UI/Themes/FortranSPFTokenMaker.java new file mode 100644 index 00000000..3eba5883 --- /dev/null +++ b/src/Common/UI/Themes/FortranSPFTokenMaker.java @@ -0,0 +1,408 @@ +package Common.UI.Themes; +import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities; +import org.fife.ui.rsyntaxtextarea.Token; +import org.fife.ui.rsyntaxtextarea.TokenMap; + +import javax.swing.text.Segment; +public class FortranSPFTokenMaker extends ProvidedTokenMaker { + @Override + public TokenMap getWordsToHighlight() { + TokenMap tokenMap = new TokenMap(true); + fillTokenMap(tokenMap, Token.RESERVED_WORD, + "FORALL", "ENDFORALL", "PUBLIC", "PRIVATE", "ADMIT", "ASSIGNMENT", "CALL", "COMMON", + "CYCLE", "DIMENSION", "END", "ENDDO", "ENTRY", "FORMAT", "IMPLICIT", "INTENT", "MAP", + "OPEN", "POINTER", "PROGRAM", "RECURSIVE", "STOP", "THEN", "WHILE", "ALLOCATABLE", + "ATEND", "CASE", "COMPLEX", "DATA", "DO", "ENDFILE", "EQUIVALENCE", "FUNCTION", + "INCLUDE", "INTERFACE", "MODULE", "OPTIONAL", "PRINT", "PURE", "READ", "RETURN", + "STRUCTURE", "TYPE", "WRITE", "ALLOCATE", "BACKSPACE", "CHARACTER", "CONTAINS", + "DEALLOCATE", "DOUBLE", "ENDIF", "EXIT", "GOTO", "INQUIRE", "INTRINSIC", "NAMELIST", + "PARAMETER", "PRECISION", "REAL", "REWIND", "SUBROUTINE", "UNION", "ASSIGN", "BLOCKDATA", + "CLOSE", "CONTINUE", "DEFAULT", "ELSE", "ELSEIF", "ENDSELECT", "EXTERNAL", "IF", "INTEGER", + "LOGICAL", "NONE", "PAUSE", "PROCEDURE", "RECORD", "SAVE", "TARGET", "USE", "SELECT", "BLOCK", "WHERE" + ); + fillTokenMap(tokenMap, Token.OPERATOR, + ".EQ.", + ".NE.", ".LT.", ".LE.", + ".GT.", ".GE.", + ".NOT.", ".AND.", ".EQV.", ".NEQV.", + ".OR.", ".TRUE.", ".FALSE." + ); + return tokenMap; + } + @Override + public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) { + int finalTokenType = tokenType; + switch (tokenType) { + case Token.COMMENT_EOL: + if (segment.count >= 5) { + switch (segment.subSequence(1, 5).toString().toUpperCase()) { + case "$SPF": + finalTokenType = Token.COMMENT_DOCUMENTATION; + break; + case "DVM$": + finalTokenType = Token.COMMENT_MARKUP; + break; + case "$OMP": + finalTokenType = Token.COMMENT_KEYWORD; + break; + default: + break; + } + } + break; + case Token.IDENTIFIER: + int value = wordsToHighlight.get(segment, start, end); + //ключевое Ñлово + if (value != -1) { + finalTokenType = value; + } + break; + default: + break; + } + super.addToken(segment, start, end, finalTokenType, startOffset); + } + @Override + public void Body(TokenProvider provider) { + switch (provider.position) { + // + case 0: + //тут вÑегда currentTokenType=NULL. переноÑимый извеÑтеи в startTokenType + provider.start(); + switch (provider.c) { + case '!': + case '*': + case 'C': + case 'c': + case 'D': + case 'd': + //комментарий. анализ закончен + provider.setType(Token.COMMENT_EOL); + provider.stop(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + //метка. + provider.setType(Token.MARKUP_TAG_NAME); + provider.label_flag = true; + break; + case ' ': + case '\r': + //пробелы + provider.setType(Token.WHITESPACE); + break; + case '\t': + provider.SkipWrap(); + break; + default: + //вÑе оÑтальное + provider.setType(Token.IDENTIFIER); + break; + } + break; + case 1: + case 2: + case 3: + case 4: + switch (provider.currentTokenType) { + case Token.MARKUP_TAG_NAME: + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '\r': + break; + case '!': + SaveCurrent(provider); + provider.start(); + //комментарий. анализ закончен + provider.setType(Token.COMMENT_EOL); + provider.stop(); + break; + case ' ': + SaveCurrent(provider); + provider.start(); + provider.setType(Token.WHITESPACE); + break; + case '\t': + SaveCurrent(provider); + provider.start(); + provider.SkipWrap(); + break; + default: + //Ñто не метка. менÑем тип. + provider.setType(Token.IDENTIFIER); + break; + } + break; + case Token.WHITESPACE: + switch (provider.c) { + case ' ': + case '\r': + break; + case '\t': + provider.SkipWrap(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + SaveCurrent(provider); + provider.start(); + //еÑли метка уже бывала. значит больше меток нет + if (provider.label_flag) { + provider.setType(Token.IDENTIFIER); + } else { + provider.setType(Token.MARKUP_TAG_NAME); + provider.label_flag = true; + } + break; + case '!': + SaveCurrent(provider); + provider.start(); + //комментарий. анализ закончен + provider.setType(Token.COMMENT_EOL); + provider.stop(); + break; + default: + SaveCurrent(provider); + provider.start(); + provider.setType(Token.IDENTIFIER); + break; + } + break; + case Token.IDENTIFIER: + switch (provider.c) { + case '!': + SaveCurrent(provider); + provider.start(); + //комментарий. анализ закончен + provider.setType(Token.COMMENT_EOL); + provider.stop(); + break; + case '\t': + SaveCurrent(provider); + provider.start(); + provider.SkipWrap(); + break; + default: + //уже неважно что Ñто. + break; + } + break; + } + break; + case 5: + switch (provider.c) { + case ' ': + case '\r': + case '\t': + switch (provider.currentTokenType) { + case Token.WHITESPACE: + //Ñто пробел, и нам норм. + break; + default: + SaveCurrent(provider); + provider.start(); + provider.setType(Token.WHITESPACE); + break; + } + //Ñто пробелы. переноÑа нет. убираем Ñохранение типа + provider.startTokenType = Token.NULL; + break; + default: + //Ñто - Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа. ÑохранÑем вÑе что было до нее. + SaveCurrent(provider); + provider.start(); + provider.setType(Token.OPERATOR); + SaveCurrent_(provider); //ÑохранÑем его как одиночный оператор. + provider.setType(provider.startTokenType); + //берем унаÑледование от предыдущей Ñтроки + break; + } + break; + // + // + default: + switch (provider.currentTokenType) { + case Token.NULL: + provider.start(); + provider.detectType(); + break; + case Token.WHITESPACE: + switch (provider.c) { + case ' ': + case '\t': + case '\r': + break; + default: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + } + break; + case Token.OPERATOR: + provider.checkWrap(); + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + case Token.LITERAL_NUMBER_DECIMAL_INT: + provider.checkWrap(); + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '\r': + break; + case '.': + case 'e': + case 'E': + case 'd': + case 'D': + provider.setType(Token.LITERAL_NUMBER_FLOAT); + break; + default: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + } + break; + case Token.LITERAL_NUMBER_FLOAT: + provider.checkWrap(); + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '\r': + break; + case 'e': + case 'E': + case 'd': + case 'D': + SaveCurrent_(provider); + provider.setType(Token.NULL); + break; + default: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + } + break; + case Token.RESERVED_WORD_2: + provider.checkWrap(); + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + //Ð¿Ð¾Ð´Ð¾Ð·Ñ€ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¸Ð»Ð¸ÑÑŒ. Ñто дробь. + provider.setType(Token.LITERAL_NUMBER_FLOAT); + break; + case '\r': + break; + default: + provider.setType(Token.IDENTIFIER); + break; + } + break; + case Token.LITERAL_CHAR: + switch (provider.c) { + case '\'': + SaveCurrent_(provider); + provider.setType(Token.NULL); + break; + default: + break; + } + break; + case Token.LITERAL_STRING_DOUBLE_QUOTE: + switch (provider.c) { + case '"': + SaveCurrent_(provider); + provider.setType(Token.NULL); + break; + default: + break; + } + break; + case Token.IDENTIFIER: + provider.checkWrap(); + if (! + (RSyntaxUtilities.isLetter(provider.c) || + RSyntaxUtilities.isDigit(provider.c) || + (provider.c == '_') || + (provider.c == '.') + )) { + SaveCurrent(provider); + provider.start(); + provider.detectType(); + } + break; + } + // + } + } + @Override + public void performFinish(TokenProvider provider) { + switch (provider.currentTokenType) { + case Token.NULL: + addNullToken(); + break; + // case Token.IDENTIFIER: + case Token.LITERAL_NUMBER_DECIMAL_INT: + case Token.LITERAL_NUMBER_FLOAT: + case Token.RESERVED_WORD_2: + SaveCurrent(provider); + break; + default: + SaveCurrent(provider); + addNullToken(); + break; + } + } +} diff --git a/src/Common/UI/Themes/FreeFortranSPFTokenMaker.java b/src/Common/UI/Themes/FreeFortranSPFTokenMaker.java new file mode 100644 index 00000000..b2474c4c --- /dev/null +++ b/src/Common/UI/Themes/FreeFortranSPFTokenMaker.java @@ -0,0 +1,297 @@ +package Common.UI.Themes; +import org.fife.ui.rsyntaxtextarea.RSyntaxUtilities; +import org.fife.ui.rsyntaxtextarea.Token; +import org.fife.ui.rsyntaxtextarea.TokenMap; + +import javax.swing.text.Segment; +public class FreeFortranSPFTokenMaker extends ProvidedTokenMaker { + @Override + public TokenMap getWordsToHighlight() { + TokenMap tokenMap = new TokenMap(true); + fillTokenMap(tokenMap, Token.RESERVED_WORD, + "FORALL", "ENDFORALL", "PUBLIC", "PRIVATE", "ADMIT", "ASSIGNMENT", "CALL", "COMMON", + "CYCLE", "DIMENSION", "END", "ENDDO", "ENTRY", "FORMAT", "IMPLICIT", "INTENT", "MAP", + "OPEN", "POINTER", "PROGRAM", "RECURSIVE", "STOP", "THEN", "WHILE", "ALLOCATABLE", + "ATEND", "CASE", "COMPLEX", "DATA", "DO", "ENDFILE", "EQUIVALENCE", "FUNCTION", + "INCLUDE", "INTERFACE", "MODULE", "OPTIONAL", "PRINT", "PURE", "READ", "RETURN", + "STRUCTURE", "TYPE", "WRITE", "ALLOCATE", "BACKSPACE", "CHARACTER", "CONTAINS", + "DEALLOCATE", "DOUBLE", "ENDIF", "EXIT", "GOTO", "INQUIRE", "INTRINSIC", "NAMELIST", + "PARAMETER", "PRECISION", "REAL", "REWIND", "SUBROUTINE", "UNION", "ASSIGN", "BLOCKDATA", + "CLOSE", "CONTINUE", "DEFAULT", "ELSE", "ELSEIF", "ENDSELECT", "EXTERNAL", "IF", "INTEGER", + "LOGICAL", "NONE", "PAUSE", "PROCEDURE", "RECORD", "SAVE", "TARGET", "USE", "SELECT", "BLOCK", "WHERE" + ); + fillTokenMap(tokenMap, Token.OPERATOR, + ".EQ.", + ".NE.", ".LT.", ".LE.", + ".GT.", ".GE.", + ".NOT.", ".AND.", ".EQV.", ".NEQV.", + ".OR.", ".TRUE.", ".FALSE." + ); + return tokenMap; + } + @Override + public void addToken(Segment segment, int start, int end, int tokenType, int startOffset) { + int finalTokenType = tokenType; + switch (tokenType) { + case Token.COMMENT_EOL: + if (segment.count >= 5) { + switch (segment.subSequence(1, 5).toString().toUpperCase()) { + case "$SPF": + finalTokenType = Token.COMMENT_DOCUMENTATION; + break; + case "DVM$": + finalTokenType = Token.COMMENT_MARKUP; + break; + case "$OMP": + finalTokenType = Token.COMMENT_KEYWORD; + break; + default: + break; + } + } + break; + case Token.IDENTIFIER: + int value = wordsToHighlight.get(segment, start, end); + //ключевое Ñлово + if (value != -1) { + finalTokenType = value; + } + break; + default: + break; + } + super.addToken(segment, start, end, finalTokenType, startOffset); + } + @Override + public void Body(TokenProvider provider) { + /* + switch (provider.position) { + // + case 0: + //тут вÑегда currentTokenType=NULL. переноÑимый извеÑтеи в startTokenType + provider.start(); + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + //метка. может поÑвитьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ 0-4 позиций. оÑтальной анализ. аналогичен обычному. + provider.setType(Token.MARKUP_TAG_NAME); + provider.label_flag = true; + break; + default: + //вÑе оÑтальное + provider.detectType(); + break; + } + break; + case 1: + case 2: + case 3: + case 4: + switch (provider.currentTokenType) { + case Token.MARKUP_TAG_NAME: + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '\r': + break; + default: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + } + break; + default: + DefaultLineParse(provider); + break; + } + break; + case 5: + switch (provider.c) { + case '&': + //Ñто - Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¿ÐµÑ€ÐµÐ½Ð¾Ñа. ÑохранÑем вÑе что было до нее. + SaveCurrent(provider); + provider.start(); + provider.setType(Token.OPERATOR); + SaveCurrent_(provider); //ÑохранÑем его как одиночный оператор. + provider.setType(provider.startTokenType); + //берем унаÑледование от предыдущей Ñтроки + break; + default: + if (provider.currentTokenType==Token.MARKUP_TAG_NAME){ + //метка на Ñтом Ñимволе уже обÑзана закончитьÑÑ. + SaveCurrent(provider); + provider.start(); + provider.detectType(); + }else + DefaultLineParse(provider); + break; + } + break; + // + // + default: + DefaultLineParse(provider); + // + } + */ + DefaultLineParse(provider); + } + public void DefaultLineParse(TokenProvider provider) { + switch (provider.currentTokenType) { + case Token.NULL: + provider.start(); + provider.detectType(); + break; + case Token.WHITESPACE: + switch (provider.c) { + case ' ': + case '\t': + case '\r': + break; + default: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + } + break; + case Token.OPERATOR: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + case Token.LITERAL_NUMBER_DECIMAL_INT: + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '\r': + break; + case '.': + case 'e': + case 'E': + case 'd': + case 'D': + provider.setType(Token.LITERAL_NUMBER_FLOAT); + break; + default: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + } + break; + case Token.LITERAL_NUMBER_FLOAT: + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '\r': + break; + case 'e': + case 'E': + case 'd': + case 'D': + SaveCurrent_(provider); + provider.setType(Token.NULL); + break; + default: + SaveCurrent(provider); + provider.start(); + provider.detectType(); + break; + } + break; + case Token.RESERVED_WORD_2: + switch (provider.c) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + //Ð¿Ð¾Ð´Ð¾Ð·Ñ€ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð´Ð¸Ð»Ð¸ÑÑŒ. Ñто дробь. + provider.setType(Token.LITERAL_NUMBER_FLOAT); + break; + case '\r': + break; + default: + provider.setType(Token.IDENTIFIER); + break; + } + break; + case Token.LITERAL_CHAR: + switch (provider.c) { + case '\'': + SaveCurrent_(provider); + provider.setType(Token.NULL); + break; + default: + break; + } + break; + case Token.LITERAL_STRING_DOUBLE_QUOTE: + switch (provider.c) { + case '"': + SaveCurrent_(provider); + provider.setType(Token.NULL); + break; + default: + break; + } + break; + case Token.IDENTIFIER: + if (! + (RSyntaxUtilities.isLetter(provider.c) || + RSyntaxUtilities.isDigit(provider.c) || + (provider.c == '_') || + (provider.c == '.') + )) { + SaveCurrent(provider); + provider.start(); + provider.detectType(); + } + break; + } + } + @Override + public void performFinish(TokenProvider provider) { + SaveCurrent(provider); + addNullToken(); + } +} diff --git a/src/Common/UI/Themes/LightVisualiserTheme.java b/src/Common/UI/Themes/LightVisualiserTheme.java new file mode 100644 index 00000000..0a5ecb3d --- /dev/null +++ b/src/Common/UI/Themes/LightVisualiserTheme.java @@ -0,0 +1,64 @@ +package Common.UI.Themes; +import java.awt.*; +public class LightVisualiserTheme extends VisualiserTheme { + @Override + protected String getEditorThemePath() { + return "/Common/UI/Themes/light_editor.xml"; + } + @Override + protected String getForegroundHex() { + return "#000000"; + } + @Override + protected String getBackgroundHex() { + return "#f7f7f7"; + } + @Override + protected String getSelectionBackgroundHex() { + return "#dae3f1"; + } + @Override + protected String getTreeBackgroundHex() { + return "#ffffff"; + } + @Override + protected String getBarForegroundHex() { + return "#637780"; + } + @Override + protected String getBarBackgroundHex() { + return "#ffffff"; + } + @Override + protected String getTableBackgroundHex() { + return "#ffffff"; + } + @Override + protected Color getGoodFontColor() { + return Color.decode("#009738"); + } + @Override + protected Color getReadyFontColor2() { + return Color.decode("#FFD700"); + } + @Override + protected Color getProgressFontColor() { + return Color.decode("#f39a28"); + } + @Override + protected Color getBadFontColor() { + return Color.decode("#ab0000"); + } + @Override + protected Color getFatalFontColor() { + return Color.decode("#FF4500"); + } + @Override + protected Color getUnknownFontColor() { + return Color.GRAY; + } + @Override + protected Color getHyperlinkFontColor() { + return Color.blue; + } +} diff --git a/src/Common/UI/Themes/ProvidedTokenMaker.java b/src/Common/UI/Themes/ProvidedTokenMaker.java new file mode 100644 index 00000000..6c0a7a72 --- /dev/null +++ b/src/Common/UI/Themes/ProvidedTokenMaker.java @@ -0,0 +1,47 @@ +package Common.UI.Themes; +import org.fife.ui.rsyntaxtextarea.AbstractTokenMaker; +import org.fife.ui.rsyntaxtextarea.Token; +import org.fife.ui.rsyntaxtextarea.TokenMap; + +import javax.swing.text.Segment; +//объект ÑоздаетÑÑ 1 раз, при уÑтановке ÑÑ‚Ð¸Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¾Ñ€Ð°. +//ÐИ Ð’ КОЕМ СЛУЧÐЕ ÐЕЛЬЗЯ ПЕРЕДÐÐ’ÐТЬ ПО ССЫЛКЕ методам ради рефакторинга +//вÑе переменные должны быть Ñугубо локальными +//иначе возможны непредÑказуемые поÑледÑтвиÑ. +//Метод вызываетÑÑ Ð°Ñинхронно, причем неÑколькими ÑобытиÑми) +public abstract class ProvidedTokenMaker extends AbstractTokenMaker { + public static void fillTokenMap(TokenMap map, int type, String... words) { + for (String word : words) + map.put(word, type); + } + //Ñохранить не Ð·Ð°Ð±Ð¸Ñ€Ð°Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¹ Ñимвол. + public void SaveCurrent(TokenProvider provider) { + addToken(provider.text, provider.currentTokenStart, + provider.i - 1, provider.currentTokenType, + provider.newStartOffset + provider.currentTokenStart); + } + //Ñохранить Ð·Ð°Ð±Ð¸Ñ€Ð°Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¹ Ñимвол + public void SaveCurrent_(TokenProvider provider) { + addToken(provider.text, provider.currentTokenStart, + provider.i, provider.currentTokenType, + provider.newStartOffset + provider.currentTokenStart); + } + public abstract void Body(TokenProvider provider); + public abstract void performFinish(TokenProvider provider); + public Token getTokenList(Segment text, int startTokenType, int startOffset) { + // System.out.println(Utils.Brackets(text.toString())); + resetTokenList(); + //Ñтруктура Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑов Ñмещений, текущего ÑоÑтоÑÐ½Ð¸Ñ Ð¸ Ñ‚ д. + TokenProvider provider = new TokenProvider(text, startTokenType, startOffset); + // provider.checkFortranWrap(); + // System.out.println(this.); + while (provider.canRead()) { + provider.readNext(); + Body(provider); + provider.gotoNext(); + } + performFinish(provider); + // Return the first token in our linked list. + return firstToken; + } +} diff --git a/src/Common/UI/Themes/ThemeElement.java b/src/Common/UI/Themes/ThemeElement.java new file mode 100644 index 00000000..f97cdc97 --- /dev/null +++ b/src/Common/UI/Themes/ThemeElement.java @@ -0,0 +1,8 @@ +package Common.UI.Themes; +public interface ThemeElement { + default void FontUp() { + } + default void FontDown() { + } + void applyTheme(); +} diff --git a/src/Common/UI/Themes/TokenProvider.java b/src/Common/UI/Themes/TokenProvider.java new file mode 100644 index 00000000..155d74af --- /dev/null +++ b/src/Common/UI/Themes/TokenProvider.java @@ -0,0 +1,134 @@ +package Common.UI.Themes; +import org.fife.ui.rsyntaxtextarea.Token; + +import javax.swing.text.Segment; +//Ñткуртура контейнер Ð´Ð»Ñ Ð²Ñех текущих переменных. +//Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ð¹. +public class TokenProvider { + public Segment text; + public char[] array; + public int offset; + public int count; + public int end; + // Token starting offsets are always of the form: + // 'startOffset + (currentTokenStart-offset)', but since startOffset and + // offset are constant, tokens' starting positions become: + // 'newStartOffset+currentTokenStart'. + public int newStartOffset; + public int currentTokenStart; + public int startTokenType; //хранить тип токена который нам передали, ради переноÑов + public int currentTokenType; + public int i; + public int position; + public char c; + public boolean label_flag; + public TokenProvider(Segment text_in, int startTokenType_in, int startOffset) { + text = text_in; + startTokenType = startTokenType_in; //может указывать на то, что мы продолжаем. + array = text.array; + offset = text.offset; + count = text.count; + end = offset + count; + // Token starting offsets are always of the form: + // 'startOffset + (currentTokenStart-offset)', but since startOffset and + // offset are constant, tokens' starting positions become: + // 'newStartOffset+currentTokenStart'. + newStartOffset = startOffset - offset; + currentTokenStart = offset; + currentTokenType = Token.NULL; //изначально не знаем что будем обрабатывать. + position = 0; + i = offset; + label_flag = false; + } + public void checkWrap() { + if (startTokenType != Token.NULL) { + start(); + startTokenType = Token.NULL; + } + } + public void readNext() { + c = array[i]; + } + public void gotoNext() { + ++i; + ++position; + //todo от греха от табов надо избавлÑтьÑÑ. + // возникает раÑхожедние между реальным и табÑким Ñмещением. отÑюда галюны. + // лучше бы их не отображать даже еÑли они еÑть. но Ñто к текÑту файла. или как то узнавать их длину.. + } + public boolean canRead() { + return i < end; + } + public void setType(int currentTokenType_in) { + currentTokenType = currentTokenType_in; + } + public void stop() { + i = end - 1; + } + public void start() { + currentTokenStart = i; + } + //в зоне оÑновной Ñтроки + //по текущему Ñимволу определÑем тип уже начатого токена. + public void detectType() { + switch (c) { + case ' ': + case '\t': + case '\r': + currentTokenType = Token.WHITESPACE; + break; + case '+': + case '-': + case '*': + case '/': + case '=': + case '(': + case ')': + case '[': + case ']': + case '<': + case '>': + case '{': + case '}': + case ',': + case '&': + currentTokenType = Token.OPERATOR; + break; + case '\'': + currentTokenType = Token.LITERAL_CHAR; + break; + case '"': + currentTokenType = Token.LITERAL_STRING_DOUBLE_QUOTE; + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + currentTokenType = Token.LITERAL_NUMBER_DECIMAL_INT; + break; + case '.': + //возможный кандидат на чиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой. + currentTokenType = Token.RESERVED_WORD_2; + break; + case '!': + currentTokenType = Token.COMMENT_EOL; + stop(); + break; + default: + currentTokenType = Token.IDENTIFIER; + break; + } + } + //доÑрочный выход из зоны переноÑа. + public void SkipWrap() { + startTokenType = Token.NULL; //Ð¿ÐµÑ€ÐµÐ½Ð¾Ñ Ð¸ÑключаетÑÑ. + position += 6; //гарантированное непопадание в зону переноÑа при анализе. + setType(Token.WHITESPACE); //Ñтоит таб, значит переноÑа не будет. идет набор пробелов. + } +} diff --git a/src/Common/UI/Themes/VisualiserColor.java b/src/Common/UI/Themes/VisualiserColor.java new file mode 100644 index 00000000..0d314082 --- /dev/null +++ b/src/Common/UI/Themes/VisualiserColor.java @@ -0,0 +1,5 @@ +package Common.UI.Themes; +public enum VisualiserColor { + ToolTip_background, + ToolTip_foreground +} diff --git a/src/Common/UI/Themes/VisualiserFonts.java b/src/Common/UI/Themes/VisualiserFonts.java new file mode 100644 index 00000000..20df3e04 --- /dev/null +++ b/src/Common/UI/Themes/VisualiserFonts.java @@ -0,0 +1,21 @@ +package Common.UI.Themes; +public enum VisualiserFonts { + GoodState, + ReadyState, + BadState, + Fatal, + ProgressState, + UnknownState, + Hyperlink, + Disabled, + //беÑцветные + Distribution, + //--- + TreeItalic, + TreePlain, + TreeBold, + TreeBoldItalic, + BlueState, + NewVersion, //--- + Menu +} diff --git a/src/Common/UI/Themes/VisualiserTheme.java b/src/Common/UI/Themes/VisualiserTheme.java new file mode 100644 index 00000000..28577bbd --- /dev/null +++ b/src/Common/UI/Themes/VisualiserTheme.java @@ -0,0 +1,183 @@ +package Common.UI.Themes; +import Common.Global; +import org.fife.ui.rsyntaxtextarea.Theme; + +import java.awt.*; +import java.awt.font.TextAttribute; +import java.util.HashMap; +import java.util.LinkedHashMap; + +import static java.awt.Font.MONOSPACED; +public abstract class VisualiserTheme { + public Color foreground; + public Color background; + public Color selection_background; + public Color trees_background; + public Color bar_foreground; + public Color bar_background; + public Color table_background; + public LinkedHashMap Fonts = new LinkedHashMap<>(); + public LinkedHashMap Colors = new LinkedHashMap<>(); + public VisualiserTheme() { + try { + //----------------------------------------------- + //----------------------------------------------- + foreground = Color.decode(getForegroundHex()); + background = Color.decode(getBackgroundHex()); + selection_background = Color.decode(getSelectionBackgroundHex()); + trees_background = Color.decode(getTreeBackgroundHex()); + bar_foreground = Color.decode(getBarForegroundHex()); + bar_background = Color.decode(getBarBackgroundHex()); + table_background = Color.decode(getTableBackgroundHex()); + // + Fonts.put(VisualiserFonts.GoodState, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, getGoodFontColor()); + put(TextAttribute.SIZE, 16); + } + } + )); + Fonts.put(VisualiserFonts.ReadyState, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, getReadyFontColor2()); + put(TextAttribute.SIZE, 16); + } + } + )); + Fonts.put(VisualiserFonts.BadState, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, getBadFontColor()); + put(TextAttribute.SIZE, 16); + } + } + )); + Fonts.put(VisualiserFonts.BlueState, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, getHyperlinkFontColor()); + put(TextAttribute.SIZE, 16); + } + } + )); + Fonts.put(VisualiserFonts.Fatal, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, getFatalFontColor()); + put(TextAttribute.SIZE, 16); + } + } + )); + Fonts.put(VisualiserFonts.UnknownState, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, getUnknownFontColor()); + put(TextAttribute.SIZE, 16); + } + } + )); + Fonts.put(VisualiserFonts.Hyperlink, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, MONOSPACED); + put(TextAttribute.FOREGROUND, getHyperlinkFontColor()); + put(TextAttribute.SIZE, 18); + put(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD); + put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); + } + } + )); + Fonts.put(VisualiserFonts.ProgressState, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, getProgressFontColor()); + put(TextAttribute.SIZE, 16); + } + } + )); + Fonts.put(VisualiserFonts.Disabled, new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, MONOSPACED); + put(TextAttribute.BACKGROUND, Color.lightGray); + put(TextAttribute.FOREGROUND, Color.lightGray); + put(TextAttribute.SIZE, 18); + put(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON); + } + } + )); + Fonts.put(VisualiserFonts.Distribution, + new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, MONOSPACED); + put(TextAttribute.SIZE, 16); + } + } + ) + ); + Fonts.put(VisualiserFonts.TreePlain, new Font("Times New Roman", Font.PLAIN, 16)); + Fonts.put(VisualiserFonts.TreeItalic, new Font("Times New Roman", Font.ITALIC, 16)); + Fonts.put(VisualiserFonts.TreeBold, new Font("Times New Roman", Font.BOLD, 16)); + Fonts.put(VisualiserFonts.TreeBoldItalic, new Font("Times New Roman", Font.BOLD|Font.ITALIC, 16)); + Fonts.put(VisualiserFonts.Menu, new Font("Times New Roman", Font.ITALIC, 16)); + Fonts.put(VisualiserFonts.NewVersion, new Font( + new HashMap() { + { + put(TextAttribute.FAMILY, "Times New Roman"); + put(TextAttribute.FOREGROUND, Color.BLACK); + put(TextAttribute.BACKGROUND, Color.YELLOW); + put(TextAttribute.SIZE, 16); + } + } + + )); + // + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + } + protected abstract String getEditorThemePath(); + protected abstract String getForegroundHex(); + protected abstract String getBackgroundHex(); + protected abstract String getSelectionBackgroundHex(); + protected abstract String getTreeBackgroundHex(); + protected abstract String getBarForegroundHex(); + protected abstract String getBarBackgroundHex(); + protected abstract String getTableBackgroundHex(); + protected abstract Color getGoodFontColor(); + protected abstract Color getReadyFontColor2(); + protected abstract Color getProgressFontColor(); + protected abstract Color getBadFontColor(); + protected abstract Color getFatalFontColor(); + protected abstract Color getUnknownFontColor(); + protected abstract Color getHyperlinkFontColor(); //- + //еÑли иÑпользовать один и тот же объект на вÑе едиторы пÑвлÑÑŽÑ‚ÑÑ ÑтранноÑти + //значит при применении выделÑем новый ÑкземплÑÑ€. + public Theme getEditorTheme() { + Theme res = null; + try { + res = Theme.load(getClass().getResourceAsStream(getEditorThemePath())); + } catch (Exception ex) { + Global.Log.PrintException(ex); + } + return res; + } +} diff --git a/src/Common/UI/Themes/VisualiserThemeName.java b/src/Common/UI/Themes/VisualiserThemeName.java new file mode 100644 index 00000000..e378b0f8 --- /dev/null +++ b/src/Common/UI/Themes/VisualiserThemeName.java @@ -0,0 +1,5 @@ +package Common.UI.Themes; +public enum VisualiserThemeName { + Light, + Dark +} diff --git a/src/Common/UI/Themes/dark_editor.xml b/src/Common/UI/Themes/dark_editor.xml new file mode 100644 index 00000000..9855f78c --- /dev/null +++ b/src/Common/UI/Themes/dark_editor.xml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +