From 2257818973d50c421bf084d51d09022eed6d402c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johan=20Kj=C3=B6lhede?= Date: Sat, 20 Dec 2014 14:32:51 +0100 Subject: [PATCH] Removing mgen-visualdesigner from main mgen repo. It is now in the mgen-visualdesigner repo --- build.sbt | 2 - buildimpl.py | 29 +- mgen-visualdesigner/.gitignore | 2 - mgen-visualdesigner/assembly.sbt | 4 - mgen-visualdesigner/build.sbt | 69 -- mgen-visualdesigner/model/project.xml | 12 - ....culvertsoft.mgen.visualdesigner.model.xml | 126 --- mgen-visualdesigner/project/plugins.sbt | 4 - .../mgen/visualdesigner/images/add_class.png | Bin 339 -> 0 bytes .../mgen/visualdesigner/images/add_enum.png | Bin 227 -> 0 bytes .../mgen/visualdesigner/images/add_field.png | Bin 245 -> 0 bytes .../mgen/visualdesigner/images/add_module.png | Bin 268 -> 0 bytes .../images/arrange_align_bottom.png | Bin 357 -> 0 bytes .../images/arrange_align_bottom_v3.png | Bin 353 -> 0 bytes .../arrange_align_horizontal_middle.png | Bin 278 -> 0 bytes .../images/arrange_align_left.png | Bin 286 -> 0 bytes .../images/arrange_align_right.png | Bin 303 -> 0 bytes .../images/arrange_align_top.png | Bin 360 -> 0 bytes .../images/arrange_align_top_v3.png | Bin 359 -> 0 bytes .../images/arrange_align_vertical_middle.png | Bin 300 -> 0 bytes .../visualdesigner/images/arrange_auto.png | Bin 398 -> 0 bytes .../visualdesigner/images/arrange_auto_v3.png | Bin 390 -> 0 bytes .../images/arrange_same_height.png | Bin 373 -> 0 bytes .../images/arrange_same_width.png | Bin 374 -> 0 bytes .../arrange_spacing_equal_horizontal.png | Bin 311 -> 0 bytes .../images/arrange_spacing_equal_vertical.png | Bin 315 -> 0 bytes .../images/arrange_spacing_horizontal.png | Bin 346 -> 0 bytes .../images/arrange_spacing_vertical.png | Bin 281 -> 0 bytes .../mgen/visualdesigner/images/list_down.png | Bin 264 -> 0 bytes .../mgen/visualdesigner/images/list_find.png | Bin 578 -> 0 bytes .../visualdesigner/images/list_icon_class.png | Bin 195 -> 0 bytes .../visualdesigner/images/list_icon_field.png | Bin 222 -> 0 bytes .../images/list_icon_module.png | Bin 213 -> 0 bytes .../visualdesigner/images/list_rename.png | Bin 223 -> 0 bytes .../mgen/visualdesigner/images/list_up.png | Bin 246 -> 0 bytes .../visualdesigner/images/logo_concept.png | Bin 45187 -> 0 bytes .../visualdesigner/images/placeholder.png | Bin 714 -> 0 bytes .../visualdesigner/images/toggle_details.png | Bin 613 -> 0 bytes .../images/toggle_fullscreen.png | Bin 322 -> 0 bytes .../mgen/visualdesigner/images/view_back.png | Bin 252 -> 0 bytes .../visualdesigner/images/view_forward.png | Bin 251 -> 0 bytes .../visualdesigner/images/view_selected.png | Bin 279 -> 0 bytes .../mgen/visualdesigner/images/view_top.png | Bin 291 -> 0 bytes .../mgen/visualdesigner/images/view_up.png | Bin 256 -> 0 bytes .../mgen/visualdesigner/Actions.scala | 317 -------- .../mgen/visualdesigner/EntityFactory.scala | 141 ---- .../mgen/visualdesigner/HotKey.scala | 65 -- .../mgen/visualdesigner/Icons.scala | 68 -- .../mgen/visualdesigner/VisualDesigner.scala | 151 ---- .../classlookup/Type2String.scala | 74 -- .../control/AlignmentController.scala | 92 --- .../control/BoundsController.scala | 198 ----- .../visualdesigner/control/Controller.scala | 461 ----------- .../control/ControllerListener.scala | 60 -- .../control/CopyPasteController.scala | 289 ------- .../control/EntityAddController.scala | 343 -------- .../control/GenerateController.scala | 16 - .../control/KeyboardInputController.scala | 22 - .../control/ModelChangeListener.scala | 46 -- .../control/ModelSerializer.scala | 41 - .../control/MouseControlAction.scala | 44 - .../control/MouseInputController.scala | 505 ------------ .../control/SaveController.scala | 354 --------- .../control/SettingsController.scala | 18 - .../control/SubController.scala | 5 - .../mgen/visualdesigner/control/UiPos.scala | 75 -- .../visualdesigner/control/UndoBuffer.scala | 79 -- .../control/UndoController.scala | 107 --- .../visualdesigner/images/MkImgIcon.scala | 33 - .../mgen/visualdesigner/model/Api2Vd.scala | 308 ------- .../model/Api2VdConversionState.scala | 76 -- .../mgen/visualdesigner/model/Model.scala | 360 --------- .../model/ModelConversion.scala | 73 -- .../mgen/visualdesigner/model/ModelOps.scala | 405 ---------- .../model/RichPlacedEntity.scala | 25 - .../mgen/visualdesigner/model/Vd2Api.scala | 252 ------ .../visualdesigner/uiInit/MainMenuInit.scala | 104 --- .../visualdesigner/uiInit/PanelsInit.scala | 36 - .../visualdesigner/uiInit/ToolbarsInit.scala | 114 --- .../mgen/visualdesigner/util/Asof.scala | 32 - .../mgen/visualdesigner/util/AwtMath.scala | 32 - .../visualdesigner/util/ConsolePipe.scala | 56 -- .../visualdesigner/util/ConsoleTarget.scala | 11 - .../visualdesigner/util/LayOutEntities.scala | 105 --- .../mgen/visualdesigner/util/LayoutNode.scala | 149 ---- .../util/MkActionListener.scala | 21 - .../util/MkDocumentListener.scala | 21 - .../mgen/visualdesigner/util/Observable.scala | 39 - .../visualdesigner/util/OperationStatus.scala | 33 - .../visualdesigner/util/RichMouseEvent.scala | 102 --- .../mgen/visualdesigner/util/TextPanel.scala | 66 -- .../mgen/visualdesigner/util/TimeUtil.scala | 19 - .../mgen/visualdesigner/util/Util.scala | 91 --- .../mgen/visualdesigner/util/ZwingUtils.scala | 21 - .../visualdesigner/view/AbsoluteLayout.scala | 32 - .../visualdesigner/view/AbstractView.scala | 303 ------- .../visualdesigner/view/AddressField.scala | 60 -- .../visualdesigner/view/BackGrounded.scala | 42 - .../mgen/visualdesigner/view/Bordered.scala | 37 - .../mgen/visualdesigner/view/ClampPos.scala | 33 - .../mgen/visualdesigner/view/ClassView.scala | 224 ------ .../visualdesigner/view/ClassViewLayout.scala | 47 -- .../visualdesigner/view/ContentPane.scala | 18 - .../visualdesigner/view/CursorChanging.scala | 51 -- .../visualdesigner/view/EnumEntryView.scala | 197 ----- .../mgen/visualdesigner/view/EnumView.scala | 174 ---- .../mgen/visualdesigner/view/FieldView.scala | 232 ------ .../visualdesigner/view/FocusHelper.scala | 49 -- .../visualdesigner/view/Graphics2DOps.scala | 43 - .../visualdesigner/view/Inheritable.scala | 68 -- .../mgen/visualdesigner/view/Labeled.scala | 167 ---- .../mgen/visualdesigner/view/MkAction.scala | 66 -- .../mgen/visualdesigner/view/ModuleView.scala | 137 ---- .../mgen/visualdesigner/view/Movable.scala | 32 - .../mgen/visualdesigner/view/Overlay.scala | 11 - .../visualdesigner/view/PackageExplorer.scala | 340 -------- .../visualdesigner/view/PaintListener.scala | 8 - .../visualdesigner/view/ProjectView.scala | 25 - .../mgen/visualdesigner/view/Resizeable.scala | 138 ---- .../visualdesigner/view/ScaleSetBox.scala | 35 - .../visualdesigner/view/ScrollableView.scala | 75 -- .../mgen/visualdesigner/view/Selectable.scala | 90 --- .../view/SelectionBoxable.scala | 62 -- .../visualdesigner/view/StandardView.scala | 36 - .../visualdesigner/view/ToolbarButton.scala | 38 - .../view/TopContainerView.scala | 184 ----- .../visualdesigner/view/ViewComplexity.scala | 6 - .../visualdesigner/view/ViewManager.scala | 751 ------------------ .../mgen/visualdesigner/view/ZoomLevels.scala | 37 - .../view/autobox2/AutoBox.scala | 342 -------- .../view/autobox2/AutoBoxDocument.scala | 137 ---- .../view/autobox2/AutoBoxItem.scala | 19 - .../view/autobox2/AutoBoxListener.scala | 10 - .../view/autobox2/AutoBoxModel.scala | 16 - .../view/autobox2/AutoBoxRenderer.scala | 35 - .../ClassFieldTypeAutoComboBox2.scala | 81 -- .../view/autobox2/EntityAutoBoxItem.scala | 68 -- .../view/autobox2/FTChildParent.scala | 5 - .../visualdesigner/view/autobox2/FTOps.scala | 142 ---- .../view/autobox2/FieldTypeAutoBoxItem.scala | 63 -- .../view/autobox2/FieldTypes.scala | 54 -- .../autobox2/FindEntityAutoComboBox2.scala | 68 -- .../autobox2/SelectViewRootAutoBox2.scala | 10 - .../autobox2/SuperTypeAutoComboBox2.scala | 61 -- .../view/searchdialog/SearchDialog.scala | 294 ------- .../window/GeneratorPanel.scala | 79 -- .../window/GeneratorWindow.scala | 88 -- .../visualdesigner/window/SettingsPanel.scala | 47 -- .../visualdesigner/window/SettingsRow.scala | 32 - 149 files changed, 3 insertions(+), 11899 deletions(-) delete mode 100644 mgen-visualdesigner/.gitignore delete mode 100644 mgen-visualdesigner/assembly.sbt delete mode 100644 mgen-visualdesigner/build.sbt delete mode 100644 mgen-visualdesigner/model/project.xml delete mode 100644 mgen-visualdesigner/model/se.culvertsoft.mgen.visualdesigner.model.xml delete mode 100644 mgen-visualdesigner/project/plugins.sbt delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_class.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_enum.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_field.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_module.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_bottom.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_bottom_v3.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_horizontal_middle.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_left.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_right.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_top.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_top_v3.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_vertical_middle.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_auto.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_auto_v3.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_same_height.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_same_width.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_equal_horizontal.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_equal_vertical.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_horizontal.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_vertical.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_down.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_find.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_icon_class.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_icon_field.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_icon_module.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_rename.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_up.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/logo_concept.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/placeholder.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/toggle_details.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/toggle_fullscreen.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_back.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_forward.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_selected.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_top.png delete mode 100644 mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_up.png delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Actions.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/EntityFactory.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/HotKey.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Icons.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/VisualDesigner.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/classlookup/Type2String.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/AlignmentController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/BoundsController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/Controller.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ControllerListener.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/CopyPasteController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/EntityAddController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/GenerateController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/KeyboardInputController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelChangeListener.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelSerializer.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseControlAction.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseInputController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SaveController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SettingsController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SubController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UiPos.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoBuffer.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoController.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/images/MkImgIcon.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2Vd.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2VdConversionState.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Model.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelConversion.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelOps.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/RichPlacedEntity.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Vd2Api.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/MainMenuInit.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/PanelsInit.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/ToolbarsInit.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Asof.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/AwtMath.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsolePipe.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsoleTarget.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayOutEntities.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayoutNode.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkActionListener.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkDocumentListener.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Observable.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/OperationStatus.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/RichMouseEvent.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TextPanel.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TimeUtil.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Util.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ZwingUtils.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbsoluteLayout.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbstractView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AddressField.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/BackGrounded.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Bordered.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClampPos.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassViewLayout.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ContentPane.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/CursorChanging.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumEntryView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FieldView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FocusHelper.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Graphics2DOps.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Inheritable.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Labeled.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/MkAction.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ModuleView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Movable.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Overlay.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PackageExplorer.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PaintListener.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ProjectView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Resizeable.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScaleSetBox.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScrollableView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Selectable.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/SelectionBoxable.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/StandardView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ToolbarButton.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/TopContainerView.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewComplexity.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewManager.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ZoomLevels.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBox.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxDocument.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxItem.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxListener.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxModel.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxRenderer.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/ClassFieldTypeAutoComboBox2.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/EntityAutoBoxItem.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTChildParent.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTOps.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypeAutoBoxItem.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypes.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FindEntityAutoComboBox2.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SelectViewRootAutoBox2.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SuperTypeAutoComboBox2.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/searchdialog/SearchDialog.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorPanel.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorWindow.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsPanel.scala delete mode 100644 mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsRow.scala diff --git a/build.sbt b/build.sbt index 289fd183..0da97a46 100644 --- a/build.sbt +++ b/build.sbt @@ -32,5 +32,3 @@ lazy val mgen_javagenerator = (project in file("mgen-javagenerator")).dependsOn( lazy val mgen_cppgenerator = (project in file("mgen-cppgenerator")).dependsOn(mgen_compiler) lazy val mgen_javascriptgenerator = (project in file("mgen-javascriptgenerator")).dependsOn(mgen_compiler) - -lazy val mgen_visualdesigner = (project in file("mgen-visualdesigner")).dependsOn(mgen_compiler, mgen_javalib) diff --git a/buildimpl.py b/buildimpl.py index 7c9fb4c2..559d85c3 100644 --- a/buildimpl.py +++ b/buildimpl.py @@ -15,9 +15,7 @@ def clean(): def build(): createVersionFiles() - fastbuild_step1() - fastbuild_generate_code() - fastbuild_step2() + build_jvm_parts() def test(): @@ -103,10 +101,9 @@ def createVersionFiles(): createJavaVersionFile2("javagenerator", mgen_version) createJavaVersionFile2("javalib", mgen_version) createJavaVersionFile2("javascriptgenerator", mgen_version) - createJavaVersionFile2("visualdesigner", mgen_version) -def fastbuild_step1(): +def build_jvm_parts(): sbt(".", ('"project mgen_api" publish-local ' '"project mgen_idlparser" publish-local ' '"project mgen_idlgenerator" publish-local ' @@ -117,14 +114,6 @@ def fastbuild_step1(): '"project mgen_javascriptgenerator" publish-local ')) -def fastbuild_generate_code(): - check_call(mgen_cmd + 'model/project.xml plugin_paths="../mgen-javagenerator/target"', cwd="mgen-visualdesigner", shell=True) - - -def fastbuild_step2(): - sbt(".", '"project mgen_visualdesigner" assembly publish-local ') - - def tests_generate_code(): # Ideally here we'd just generate once, not nLangs times. for lang in ["java", "cpp", "javascript"]: for model in ["project.xml", "transient_testmodel/project.xml", "defaultvalues_testmodel/project.xml", "defaultvaluesreq_testmodel/project.xml"]: @@ -190,7 +179,6 @@ def copyJarFilesToZipDir(): copySubProjectJarFilesToZipDir("mgen-javascriptgenerator", mgen_version, False) copySubProjectJarFilesToZipDir("mgen-cppgenerator", mgen_version, False) copySubProjectJarFilesToZipDir("mgen-javalib", mgen_version, False) - copySubProjectJarFilesToZipDir("mgen-visualdesigner", mgen_version, True) def getCppIncludeDir(): @@ -217,18 +205,11 @@ def create_install_zip(): copyFile("mgen-starters/mgen.sh", "target/install_zip/bin/mgen.sh") copyFile("mgen-starters/mgen.ex_", "target/install_zip/bin/mgen.exe") - copyFile("mgen-starters/mgen-visualdesigner.sh", "target/install_zip/bin/mgen-visualdesigner") - copyFile("mgen-starters/mgen-visualdesigner.sh", "target/install_zip/bin/mgen-visualdesigner.sh") - copyFile("mgen-starters/mgen-visualdesigner.ex_", "target/install_zip/bin/mgen-visualdesigner.exe") - copyFile("LICENSE", "target/install_zip/LICENSE.TXT") mkFileExecutable("target/install_zip/bin/mgen") mkFileExecutable("target/install_zip/bin/mgen.sh") - mkFileExecutable("target/install_zip/bin/mgen-visualdesigner") - mkFileExecutable("target/install_zip/bin/mgen-visualdesigner.sh") - versionFile = open("target/install_zip/BUILD.TXT", "w") versionFile.write("Release version: " + mgen_version + "\n") versionFile.write("Git commit date: " + getCommitDateString() + "\n") @@ -266,9 +247,6 @@ def install(): mkFileExecutable(installPath + "/bin/mgen") mkFileExecutable(installPath + "/bin/mgen.sh") - mkFileExecutable(installPath + "/bin/mgen-visualdesigner") - mkFileExecutable(installPath + "/bin/mgen-visualdesigner.sh") - def upload_to_culvertsoft(): folderName = mgen_version.lower() @@ -291,8 +269,7 @@ def publish_to_sonatype(): '"project mgen_compiler" publish-signed ' '"project mgen_javagenerator" publish-signed ' '"project mgen_cppgenerator" publish-signed ' - '"project mgen_javascriptgenerator" publish-signed ' - '"project mgen_visualdesigner" publish-signed ')) + '"project mgen_javascriptgenerator" publish-signed ')) def publish_impl(): diff --git a/mgen-visualdesigner/.gitignore b/mgen-visualdesigner/.gitignore deleted file mode 100644 index dd416945..00000000 --- a/mgen-visualdesigner/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -src_generated/ - diff --git a/mgen-visualdesigner/assembly.sbt b/mgen-visualdesigner/assembly.sbt deleted file mode 100644 index 296d884f..00000000 --- a/mgen-visualdesigner/assembly.sbt +++ /dev/null @@ -1,4 +0,0 @@ -import AssemblyKeys._ // put this at the top of the file - -assemblySettings - diff --git a/mgen-visualdesigner/build.sbt b/mgen-visualdesigner/build.sbt deleted file mode 100644 index aa6bd0d3..00000000 --- a/mgen-visualdesigner/build.sbt +++ /dev/null @@ -1,69 +0,0 @@ - -// Remember, sbt needs empty lines between active settings - -name := "mgen-visualdesigner" - -organization := "se.culvertsoft" - -EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource - -version := scala.util.Properties.envOrElse("MGEN_BUILD_VERSION", "SNAPSHOT") - -scalaVersion := "2.11.4" - -isSnapshot := version.value.contains("SNAPSHOT") - -pomIncludeRepository := { _ => false } - -publishMavenStyle := true - -publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) - Some("snapshots" at nexus + "content/repositories/snapshots") - else - Some("releases" at nexus + "service/local/staging/deploy/maven2") -} - -publishArtifact in Test := false - -pomExtra := ( - http://github.com/culvertsoft/mgen - - - GPL 2 - https://github.com/culvertsoft/mgen/blob/master/LICENSE - repo - - - - git@github.com:culvertsoft/mgen.git - scm:git:git@github.com:culvertsoft/mgen.git - - - - PhroZenOne - Mikael Berglund - - - GiGurra - Johan Kjölhede - - ) - -crossPaths := false - -unmanagedSourceDirectories in Compile += baseDirectory.value / "src_generated/main/java" - -libraryDependencies += "se.culvertsoft" % "mgen-compiler" % version.value - -libraryDependencies += "se.culvertsoft" % "mgen-javalib" % version.value - -libraryDependencies += "org.scala-lang" % "scala-reflect" % scalaVersion.value - -libraryDependencies += "com.miglayout" % "miglayout-swing" % "4.2" - -EclipseKeys.withSource := true - -EclipseKeys.relativizeLibs := false - diff --git a/mgen-visualdesigner/model/project.xml b/mgen-visualdesigner/model/project.xml deleted file mode 100644 index cd1057d2..00000000 --- a/mgen-visualdesigner/model/project.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - se.culvertsoft.mgen.javapack.generator.JavaGenerator - - src_generated/main/java - se.culvertsoft.mgen.visualdesigner - - - - se.culvertsoft.mgen.visualdesigner.model.xml - - \ No newline at end of file diff --git a/mgen-visualdesigner/model/se.culvertsoft.mgen.visualdesigner.model.xml b/mgen-visualdesigner/model/se.culvertsoft.mgen.visualdesigner.model.xml deleted file mode 100644 index aa0bceb1..00000000 --- a/mgen-visualdesigner/model/se.culvertsoft.mgen.visualdesigner.model.xml +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/mgen-visualdesigner/project/plugins.sbt b/mgen-visualdesigner/project/plugins.sbt deleted file mode 100644 index ba4ee59e..00000000 --- a/mgen-visualdesigner/project/plugins.sbt +++ /dev/null @@ -1,4 +0,0 @@ -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2") - -addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.5.0") - diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_class.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_class.png deleted file mode 100644 index 94a35bff69054b37b215753b42b9bf9eb8930231..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VORmmtT}V`<;yxP|*cX7sn8b z-ltO>xta|GT4}HC)}2gxUpuAv z++610`@|DZZ(5K!tEN3QQmuP=rjTsb+V4NU-z%8+yg1={sb_?ROwg~Y)AbxSK5zIV dXDz8_iuj&$Hh4wsJfPngJYD@<);T3K0RZp?f;j*H diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_enum.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_enum.png deleted file mode 100644 index cfccf5443a857ed9807b859a080511d15570987a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprQm%7sn8b z-lvlfavd<>aQ^J}|Nr#OlNYy7J$tTsL%9&wO0_PP+hJ@D+jdr42YKmBd`w>X;M@uA zQ||9HIb!C0AU5+BvH{<*7-~o+9cH%wMk;vCmAs@uIvbv!~)W Ppj`}}u6{1-oD!M^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprRsA7sn8b z-ltOoxeh4sILEhN|GcGY|GQ+4n*x%dZ5wK?F7lMtmU_VQ;N7((gTe~DWM4f-IZ7O diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_module.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/add_module.png deleted file mode 100644 index 184fdd7778b4287dfe470dc8ab769c184e58bcf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprTGs7sn8b z-nUa6xtJ9NSXLjdyL3InZZZFd#<|W(9C>$oPs$bDXku({Op0=3;McmDwoR-dO51kn z6b;VXnWlFh7)iAVFg)tX3BEDm3BNWY$A{e~l)W^c%$dJ8S7qzBUAq&{Kh|D(+m~0~vEjMMyhHT@UBAogCCpW9!*_6gebEMV6oaR$pUXO@ GgeCxIdtZ$J diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_bottom.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_bottom.png deleted file mode 100644 index 414fd1e721b2e1ef48635f25340abba188ae582b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 357 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR&eJ1 zxAbxN2^ktKU8eOMrLPOt&&$x5AP$u-wwzvOsdl(rxs>B4D_M|5B ze6rd9WNPY5Z64ou9M5Iu6j$%jIbHa;@d`ANNcJHBZ0Zwd&7Cr!+rtoDW`t}tL-|NR5^PtnT7wF|bN0Q#1})78&qol`;+0AA>cPXGV_ diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_bottom_v3.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_bottom_v3.png deleted file mode 100644 index 5e7c19532bb9d521fa70ba5d6082d2f7b43164de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprU)8E{-7< zy=$lJ=4vqzaDBfwut`;e;@<0seQwC30KbLh*2~7YDOpaUt diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_horizontal_middle.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_horizontal_middle.png deleted file mode 100644 index 4c3e27507eeeecc74de720bde00e821ee1582e06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprXm1E{-7< zy;mm(avf0+aE|Xf9_|17PX4!K(I^S)=nbvU+$S#RoXk-m#M5M?6u=Ob{d`T7E*U-lJinwwh47A-@lyuI!(D% zs>>>Enr%Q#n!fC-87`^)&voR_HNW!Y(!C$Nm*clp-z(2bq4^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprYBHE{-7< zy=Q|R`3@`aY+f$A>3HFzl^!*`Dl9j1rC#4!kvwshFz1afStnKz1`Znr5uIayH%|yM za#U=&yZd&O{p|<4Qv@}a{#iF`NpU;Fsi!tyrvEW_T2VBWr(l9jE|=$4hAa)k@b@pe zYq^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprSRNE{-7< zy+=bF`3@`aYz|cI+tVZL-^%Ro?4-2YNA{-L3%Aw3M3y`_V$sOJ(k&p^B*JimLE)Ii z-Y0wQUGl=LezP$NO#B}@Ib@Rm`vT^MDVIz>ZZqF=Y)Yt*X}i*)r`xPz9)IGf@seB^ zZmG&*7hY`Q^nABXwDqK*>{i3|x3*rhEjzbx%A)$&l0Al97ou*9hwN^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprWUqE{-7< zy=SL5cC{D?xW=m_>}iZ%ue{^aiZ1JqVL=Md&M!)@;@NV`jL&Cn(9!ktSDjjK(YWK{ zChL<7b4s!sEe@P>n8egj{O(H`|C8A3st1>4mI0p5a^Yo}w~o$|Y!TR!o~Gt7>BqF`XL7{j zr!D<+by`x-5sCT#%I;12kmh#(yXU2eImZfZj>N6ou$-Qm#=isZq^@qIW-&p^DDE@ZQtl6b3t9gJPX7F_Nb6Mw<&;$Ug CN|*Bh diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_top_v3.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_align_top_v3.png deleted file mode 100644 index 2d3132b70ff7263d5410ebc53010909a935fe121..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprR+9E{-7< zy=SLv>}xULahc!m@w{)^wEasKFmP6>)J zu{7O?p>Y3J2bK-S6L)Jjbj*1t*YJK>=A;MH~*{9DdZ(PPNDZs)2;@0j|P{V%)B zd#*ouYN{v0iA_2)Z+z0`V5q&XesJCEGVz|r9UXhF%#vKO>ixkpG6m(&ugBS)|GaLW z1{Z&LzesXQ%adOj?3Ec{>x$c)u}VLuwGj82^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprVzYE{-7< zy=y}Z`Ir@XHfyU`-8-D{aP^#bnH)zZ@a0}jR$O=}TIqCxx`SY&s7mN2K9sO%l^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_nlMPZ!4! zi{7(SH|8BS;BmPxI&JDP=Uu69=BGcK;u?QtZL*vC>CzQ<;FSn?De^^l9VzKl|zTM?b4DKz;hk_H{F>Jf7d)Pq1l(noiQDWUUeSYIR z2R{pQNd$X&JSy7BkWhU&MQ7*x>IV5}->b8t6Y_uGk?A$Dwqwj^xa+ikrcz$p+d`#t zpTEz4zG3yZ`Q6D^Zfsq$SgnTrT92Q}vc;39h}(156&pXED81z5?{$;*-;z`9b%@iN z)|`AP{voS^lEzYl?^lEb4}PprS-M3mKyT@jAg_5c&v%Eu`#o>x$LJ4#%74bU9cJGi qdhfQKw^Xp#PAQqwTK8?_<8N-Rzq+CD;ss#XF?hQAxvX^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_nlEPZ!4! zi{7(S4gC)r2(<2R_uDk{)U}ECZ=6kT=ac-UepAADSLe8&3jw(#}rR({w==?eB z+ky#FIjei`I$he)$!I6Tw`7XN{PSl%{}Fba9>gHg#@N8%p*gYm-NhRhuG#+eddk%z*PM($FR);W z)47?KUw+v+Piv`&Qd6RYnWchkzdOULuebHwSxP^C`|zXsXFOlK`L@`5xA%F>Qc^m2 i_29;LpPqgH$oRWBp-J_r*gRmEF?hQAxvX^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprTKnE{-7< zy=Ozb`&tzQ)|g4%tkel#W3y`h5$VbnKb~tkZZ#j+3ho^_8sa1}YgI@&vy+fzhlgE7 z(-MUn;r9iP74|&4c5BWi28UAhABG-j?$=98&bc~=u3U9zTkrjnrhnekg2eL z-p0U?>@z92ot0JdeQ(4xRVALo1*y|a3RzuVu+}QC*;;VUwWap{`ugNEt52r~=k1>3 zZP~uW`Te3ysWYEt1Zz$)ELgR_IO6*Hr;jZb%~&NStHyf0RCkh{*qh(~&NubnpR(j| z=B#<5JQHhq?iI#$EJ~<2;QYZx>EI#L`aNy`;{!NE;%AH0T`@QyUg|UV?LKptuRz~3 Nc)I$ztaD0e0ss^Mk^}$% diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_same_width.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_same_width.png deleted file mode 100644 index 29f593599ce9fed7b9d8f3c9c92e6a391209237c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprX&7E{-7< zy?a9p`I-%QY@7v7aSJHtC#EGmn!83}-XZZB3PMWnE|?{Rn0AJIRa5Uf_uM-vDXpcc zV^6zihs2pLt*%dg?-PHyEc1vJ=QMGSqyzUqdn*cVG-QjMw)4uq_j-C=Os}$c%THLQ zIq6A`&iT*5vVtKU7i%=Fc$!a?#y)?P8tK4rBi$rE%C65@V~Nr5dgAABE+u$?^|QIYoi{c}a8XNeu<`8EviyfapQerCuH^ge^9 LtDnm{r-UW|1O<+# diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_equal_horizontal.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_equal_horizontal.png deleted file mode 100644 index 41618afbda7eb8726926a1afa67ca84ad73679ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprS3FE{-7< zy-%kY3N;xBxZW>MnBrxft?lnTwfa(l;$BA83pKMJB&bZaXinbsrv7(&db#k;w6mL| zufCOTWAgjl@b;aiSG&)>2R`drmN=#E?r+=47N2up>GIiDrUkjt46k<8oz9unwn>MP zL(!lwxl2Y}t>pu=^UZw=8}vHo=JGR4`sH))>Ni^>{n-or=g(U*-BwSi^yFTpcd02= z3HGsb4ZLmFY-rU@I3Y4E^_u*t|F!YA&1)DMm$=&oGww16x}U+*)z4*}Q$iB}hb?mf diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_equal_vertical.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_equal_vertical.png deleted file mode 100644 index 01fae16ffbc4bbd511cce76d00237d4411c282e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 315 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprRd~E{-7< zy>}xX1h=5adRJ=e`NimgDHok|@^3z|;kzHMv& z^OY&R4iJ+paAD9{fKp00i_>zopr E0C&B2>;M1& diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_horizontal.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_horizontal.png deleted file mode 100644 index 403146a50b0ef18acfbf4e7cd2df1b94bc8fd890..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprY%ZE{-7< zy>F-ZcC|S0wC>O7tYDfx@5EH?^O_wU>_sonFY7U<*V*z-hWtc l9U{8=!qz77g5P}g3^yKzT(RkzZUXcogQu&X%Q~loCIEgFjt>9; diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_vertical.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/arrange_spacing_vertical.png deleted file mode 100644 index 7835afac06ab44227955d0c0aa1589415209c740..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprUD>E{-7< zy>EjJ`Hm>?bg$;C>FZps^wCU(<>i$)=5VH6$*a|Q)E-1I8eisQkpIMx=Jvj3z4@N+ zP0`s~%~`f-eq{)VK4;18==Cy6IyvOD??LPQBL`~uojIDUpI3eV+O$;UU~*3|>-F|U zu?cAxV#B|dF*x9rrH&X40L)Y^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprTe!7sn8b z-nUl{@-`a?xLo`h$hCNG$;PEiH=jJ}=x{BL&#pnlyZ8Xld7*7Raog1Tj{CgfKPOr7 zPVIH%I*#3+)4mVD0WVaW~?WHC1-1-kP)h<=3#}-xH?xKj82_ z$ny3n`|Bq43nJ1@%v-vrCTwMl^o!-YpPXX7>K(hlYp!+wz3uJ;9mL@2>gTe~DWM4f DNcmqB diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_find.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_find.png deleted file mode 100644 index 38020f6885a818520fcedd6154b4aa9bdf950f5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 578 zcmV-I0=@l-P)Sj6}d zL5W`kCuji4B`)Q_MMlOT#KF^x6dqw0&+#@VoWogM$meSj@xBWX5i+#E5;jop z==~B2H}E-oioI{8OUrnL@qfX3z~kAo)CI&Te8lmC!b;E+**n!~-;vy-_>Ww`YgDSJ z;TtrY&EBDP#r*tyUp*oorj)MZQh}K~&Hs%Tm?^a1*t)q%jFp`pHdN@+oRKu?N@*uhnN-`w0B2-_#_<4r{D?yaws((=g2$Wo)x zI5svm*4MR958+Pv+1%UO+G;E=E`D8IUHyH4s(#{Ek2cqL!4^gFcyx4hYIb(^=)}Z? z$;n9(pB~@?*5AXpyXyGMp<1#Aw?uzz*JQorE0CJ>6Gco4j Qf&c&j07*qoM6N<$f`s7;!~g&Q diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_icon_class.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_icon_class.png deleted file mode 100644 index 223ec30b480dcd11a0c5af995f121a5a20e932df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5m^jW ze;tGwoit`w00kvWTq8f4u@pObhHwBu4M$1`kk47*5m^jW ze;tGwoit`w00kvWTq8HCKay2ur$ZtNTZzl|@$^&ZSDuUNe_kVH diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_icon_module.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_icon_module.png deleted file mode 100644 index 502e3f127c5e948d26266e50742dbc854b58aa90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V8<6ZZI=>f4u@pObhHwBu4M$1`kk47*5m^jW ze;tGwoit`w00kvWTq8^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprRO07sn8b z-nUZ@@*XhYV6F}Q7SFuRM^2Py!mgkt)27=;u=UI=J{38A>RVnXmB@6tNl)%1_w#TB zq?z4Y8Mq*Xsb6G%{nPm$91eX;l(bZmdjDhM?(^TPz7;&EX57uNHd#hQgPYkNXb*#@ LtDnm{r-UW|7@SBL diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_up.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/list_up.png deleted file mode 100644 index cf952e6edabbe8add4309168599b7d71fe567d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 246 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 XZJsJ^dqrCa|In7WJ6&{KzwiG8h6|d2 diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/placeholder.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/placeholder.png deleted file mode 100644 index af486c940c60b746d56e757686d51801bf18ae72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmV;*0yX`KP)MscT0g(~ZNI{bH#Y_Utm11j?0+FF&hK-qRX-TePYY3~f zgtoM;)~2M+AJew!(sr+7^KN&$cgxoJcJAGZGzzQ(AD(j#=leYm&p8hTfchUO*=18r zr!~koJq|$qh+zB()q@3G>7PU6y;(H$c~Nhe#3lU)C~l9VR_BJ=;N(S}WT3GGbJ~$L zY!^k>SWYq!Z~hmmJ4PWHsEvN4)9Gy^Z?)wOR0E3;1OdDR51!|xxx?Z3jR~6$3lGcS zw`wrecMQ|rMHQ4-uw*icvKH@8Qe-U(ejNgB1!Gqt;e8II!iaktI@}570bpEkH@7b5obwc$sUX75)sc{ zLoV$^I#`Q!&qeqKv2}x;Q6ZOcK?qbLvr>-a zyc(hY)2O@Nn=hiGX9AH(WK#{q_3OcQFyqRCxB{6^XTi-jVaae3jL(UZMoZqHPUiu` zFod;2WZ-*e#Qe)flJ*;9mgV@eat;ZSNkD%BUpZPjbEd(ZH>lOVM>tFq!k`K6p&rZ) zt12-&(V<8oA9F-Oc!oCq@PvQW{0``D3AONE*fZt6-G6K6?>+q?gw;DtTL1t607*qoM6N<$g3ymi=>Px# diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/toggle_details.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/toggle_details.png deleted file mode 100644 index 5ce18b473a0ea00a66dd77b9c042b321db42f647..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 613 zcmV-r0-F7aP)^&8c`I*e{V?UJp*-{O`xFbuJQpSWS8vB(yCZ0 zw8bydb%~@<9BJ$#3pY`OF0*PtDD)e&kZl)*gc+51y0F^uPezjqZ}ILt&YW}axz|Vn zz!>9zkmMLha!Xlb4DbQ?wiVC&zE8W|p4~^I5&3*R`4S|@< zw^nB3&H(B#u7Xdg#9k1v=Xq0A|BE*m;G84Thoj+;Q{WAFUw3!exwznEsf2TmX0u5) zo5eXtrBc~|p~QZpK^FLZe9ZgXTgKPd>jcgF(D!|HIvsT`FZJ{2XkycHS-QV}uvv>f zU1lip;_Qs)y&gA*hx|A>LA~C5DUxP9&d`AB6Zdb-Y?0v%Fg{ML?QMm3ce2*1-|s7z z%gI`+LZKjQt%4v>CXfjb*4i21q|33bF@p12Dh1vX7tz9?H}+vCX=2t%HkvSd z2L!-t1ODQYSd4_G3=mWWpJw|E9INMalN0>~4^=4dehqL~00000NkvXXu0mjf0KF0Z diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/toggle_fullscreen.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/toggle_fullscreen.png deleted file mode 100644 index 6f017d81037003dc8ce78280360cf4fc7636d91b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprZYrE{-7< zy;mn6gTb-@h<@@Dv_F*%iLSE z=qs1swt2Fe465rl|689hxrXKY@3Q`)^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprT4o7sn8b z-mRA}@-`T7xL%BYtkCyNLw4z63orA7_KUYh1vRwT7YQ9=7EHY2z-D%JjgWAHd9%4s zLlTp;PlFY2nE~S`k&J_J3q-3Mzopr0DaL?tpET3 diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_forward.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_forward.png deleted file mode 100644 index 463d77c63879617ae80ab00b41e4f7afdd60a3bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 251 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprQ&-7sn8b z-lJD8ayA(7xL#a6xnxUUkon7uyib2Ll@@&qRbu-TD8)BriKEb77NLMOQNm{$WUjDg zGw)u(y^j5ZVClgkru;x|8OPiUuI&!&Pal2C74!6YD*tzN)u81?UC_Pgg&ebxsLQ05~;OBLDyZ diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_selected.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_selected.png deleted file mode 100644 index c1a3aceba7754805b288747c7e3a00b9b69fc163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VORKIsGxTEo2BlYt4{x#M zm_GgLu)jEou_VuhpXY$=jPm>-M*9mtx0W+hRrg178{anZ*cA3ZvTk;8Be$08tAACy SCo2Hm$KdJe=d#Wzp$P!Wwq{oV diff --git a/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_top.png b/mgen-visualdesigner/src/main/resources/se/culvertsoft/mgen/visualdesigner/images/view_top.png deleted file mode 100644 index 8f5c5e4da5a7856c78e65e489456e7a73cf78cc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 291 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VOR^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprQqyE{-7< zy=Si+ovx&CT|+N=`yoyE+&ZGN&YZ zzGP!tP}^^G|A5YwcW2&iF fA-@y<+W%lmYJVSM`ZP@+=vD?#S3j3^P6^eP*AeOHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IXprTq&7sn8b z-nW-`^Bz#(X?ghH$kQ!Z#O-9p%_oDVOc*FOXlQf9AF31zr#%6pqndPT$c zb(#B^vz@9pipU;xDiNu6-Jj5(@rz;YW?_leb)Va6Ha%vZF{eXP;{el|?bely{4aK` u*FCW2&1+99)*S6q{tL|l?0+;fZ)L35o_&r-U)lud5C%_IKbLh*2~7Yx?^%oh diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Actions.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Actions.scala deleted file mode 100644 index d61b17e3..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Actions.scala +++ /dev/null @@ -1,317 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner - -import java.awt.event.KeyEvent - -import javax.swing.Action -import se.culvertsoft.mgen.visualdesigner.HotKey.toStroke -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.control.ControllerListener -import se.culvertsoft.mgen.visualdesigner.view.MkAction -import se.culvertsoft.mgen.visualdesigner.window.GeneratorWindow - -object Actions { - - object TreeView { - - def MOVE_UP(implicit c: Controller) = MkAction("Move Up", Icons.TreeView.Top.MOVE_UP, HotKey.ctrl(KeyEvent.VK_UP)) { - c.moveUp() - } - def MOVE_DOWN(implicit c: Controller) = MkAction("Move Down", Icons.TreeView.Top.MOVE_DOWN, HotKey.ctrl(KeyEvent.VK_DOWN)) { - c.moveDown() - } - def RENAME(implicit c: Controller) = MkAction("Rename", Icons.TreeView.Top.RENAME, "Rename selected item") { - c.renameSelection() - } - def FIND_SELECTED(implicit c: Controller) = MkAction("Find Selected", Icons.TreeView.Top.FIND, "Find selected item") { - c.viewMgr.findSelected() - } - - } - - object DashBoard { - - object Top { - - def ALIGN_X_RIGHT_BTN(implicit c: Controller) = MkAction("Align to Right", Icons.DashBoard.Top.ALIGN_X_RIGHT_ICON) { - c.alignmentMgr.alignSelectionXRight() - } - def ALIGN_X_CENTER_BTN(implicit c: Controller) = MkAction("Align to Center Horizontally", Icons.DashBoard.Top.ALIGN_X_CENTER_ICON) { - c.alignmentMgr.alignSelectionXCenter() - } - def ALIGN_X_LEFT_BTN(implicit c: Controller) = MkAction("Align to Left", Icons.DashBoard.Top.ALIGN_X_LEFT_ICON) { - c.alignmentMgr.alignSelectionXLeft() - } - - def ALIGN_Y_TOP_BTN(implicit c: Controller) = MkAction("Align to Top", Icons.DashBoard.Top.ALIGN_Y_TOP_ICON) { - c.alignmentMgr.alignSelectionYTop() - } - def ALIGN_Y_CENTER_BTN(implicit c: Controller) = MkAction("Align to Center Vertically", Icons.DashBoard.Top.ALIGN_Y_CENTER_ICON) { - c.alignmentMgr.alignSelectionYCenter() - } - def ALIGN_Y_BOTTOM_BTN(implicit c: Controller) = MkAction("Align to Bottom", Icons.DashBoard.Top.ALIGN_Y_BOTTOM_ICON) { - c.alignmentMgr.alignSelectionYBottom() - } - - def SPREAD_EQUAL_X(implicit c: Controller) = MkAction("Spread even Horizontally", Icons.DashBoard.Top.SPREAD_EQUAL_X) { - c.boundsMgr.spreadEqualX() - } - def SPREAD_EQUAL_Y(implicit c: Controller) = MkAction("Spread even Vertically", Icons.DashBoard.Top.SPREAD_EQUAL_Y) { - c.boundsMgr.spreadEqualY() - } - - def RESIZE_EQUAL_X(implicit c: Controller) = MkAction("Resize to same Width", Icons.DashBoard.Top.RESIZE_EQUAL_X) { - c.boundsMgr.resizeSameWidth() - } - def RESIZE_EQUAL_Y(implicit c: Controller) = MkAction("Resize to same Height", Icons.DashBoard.Top.RESIZE_EQUAL_Y) { - c.boundsMgr.resizeSameHeight() - } - - def SPACE_OUT_X(implicit c: Controller) = MkAction("Space out Horizontally", Icons.DashBoard.Top.SPACE_OUT_X) { - c.boundsMgr.spaceOutX() - } - def SPACE_OUT_Y(implicit c: Controller) = MkAction("Space out Vertically", Icons.DashBoard.Top.SPACE_OUT_Y) { - c.boundsMgr.spaceOutY() - } - - def LAY_OUT(implicit c: Controller) = MkAction("Lay out Entities", Icons.DashBoard.Top.LAY_OUT) { - c.boundsMgr.layOut(false) - } - /* - def GENERATE(implicit c: Controller) = MkAction("Generate Code", Icons.DashBoard.Top.GENERATE) { - c.generateMgr.generate() - }*/ - } - - object Left { - - def GO_UP(implicit c: Controller) = MkAction("Go Up", Icons.DashBoard.Left.GO_UP, "Set the view root to one level above") { - c.viewMgr.goUp() - } - def GO_BACK(implicit c: Controller) = MkAction("Go Back", Icons.DashBoard.Left.GO_BACK, "Go back to the previous view root") { - c.viewMgr.goBack() - } - def GO_FORWARD(implicit c: Controller) = MkAction("Go Forward", Icons.DashBoard.Left.GO_FORWARD, "Go forward to the next view root") { - c.viewMgr.goForward() - } - def SET_VIEW_ROOT(implicit c: Controller) = MkAction("Set as View Root", Icons.DashBoard.Left.VIEW_SELECTED, "Set View Root: Sets the selected entity as the view root") { - c.viewMgr.setSelectedAsRootView() - } - def TOGGLE_FULL_SCREEN(implicit c: Controller) = MkAction("Maximize", Icons.DashBoard.Left.TOGGLE_FULL_SCREEN, "Maximize: Removes toolbars and package explorer (left side column)") { - c.viewMgr.maximize() - } - def RESET_VIEW_ROOT(implicit c: Controller) = MkAction("Reset View Root", Icons.DashBoard.Left.RESET_VIEW, "Reset the view root back to the top level project") { - c.viewMgr.resetViewRoot() - } - def NEW_MODULE(implicit c: Controller) = MkAction("New Module", Icons.DashBoard.Left.NEW_MODULE) { - c.entityAddMgr.addModule() - } - def NEW_TYPE(implicit c: Controller) = MkAction("New Class/Type", Icons.DashBoard.Left.NEW_CLASS) { - c.entityAddMgr.addType() - } - def NEW_ENUM(implicit c: Controller) = MkAction("New Enumeration", Icons.DashBoard.Left.NEW_ENUM) { - c.entityAddMgr.addEnum() - } - def NEW_FIELD(implicit c: Controller) = MkAction("Add Field/Entry", Icons.DashBoard.Left.NEW_FIELD, "Add field/entry to selected class/enum") { - c.entityAddMgr.addFieldOrEntry() - } - - } - - } - - object MainMenu { - - object File { - def NEW(implicit c: Controller) = MkAction("New Project", HotKey.ctrl('N')) { - c.saveMgr.startNewProject() - } - def LOAD(implicit c: Controller) = MkAction("Open Project", HotKey.ctrl('O')) { - c.saveMgr.loadFromFile() - } - def SAVE(implicit c: Controller) = MkAction("Save Project", HotKey.ctrl('S')) { - c.saveMgr.save() - } - def SAVE_AS(implicit c: Controller) = MkAction("Save Project As", HotKey.ctrl().shift('S')) { - c.saveMgr.saveAs() - } - def EXIT(implicit c: Controller) = MkAction("Exit", HotKey.alt(KeyEvent.VK_F4)) { - c.saveMgr.closeApplication() - } - } - - object Edit { - - def UNDO(implicit c: Controller) = MkAction("Undo", HotKey.ctrl('Z')) { - c.undoMgr.undo() - } - def REDO(implicit c: Controller) = MkAction("Redo", HotKey.ctrl('Y')) { - c.undoMgr.redo() - } - - def CUT(implicit c: Controller) = MkAction("Cut", HotKey.ctrl('X')) { - c.copyPasteMgr.cutSelectionToClipBoard() - } - def COPY(implicit c: Controller) = MkAction("Copy", HotKey.ctrl('C')) { - c.copyPasteMgr.copySelectionToClipBoard() - } - def PASTE(implicit c: Controller) = MkAction("Paste", HotKey.ctrl('V')) { - c.copyPasteMgr.pasteFromClipBoard() - } - - def FIND_BY_NAME(implicit c: Controller) = MkAction("Find", HotKey.ctrl('F'), "Find item by name") { - c.viewMgr.findByName() - } - - def FIND_SELECTED(implicit c: Controller) = MkAction("Find Selected", HotKey.ctrl().shift('F'), "Find selected item") { - c.viewMgr.findSelected() - } - - def SELECT_ALL(implicit c: Controller) = MkAction("Select All", HotKey.ctrl('A')) { - c.selectAll() - } - def DESELECT_ALL(implicit c: Controller) = MkAction("Clear Selection", HotKey.ctrl('Q')) { - c.deselectAll(null) - } - def RENAME(implicit c: Controller) = MkAction("Rename", HotKey.alt('M'), "Rename selected item") { - c.renameSelection() - } - def DELETE(implicit c: Controller) = MkAction("Delete", HotKey(KeyEvent.VK_DELETE), "Delete selected items") { - c.entityAddMgr.deleteSelection() - } - } - - object View { - - def GO_UP(implicit c: Controller) = MkAction("Go Up", HotKey.alt(KeyEvent.VK_UP), "Set the view root to one level above") { - c.viewMgr.goUp() - } - def GO_BACK(implicit c: Controller) = MkAction("Go Back", HotKey.alt(KeyEvent.VK_LEFT), "Go back to the previous view root") { - c.viewMgr.goBack() - } - def GO_FORWARD(implicit c: Controller) = MkAction("Go Forward", HotKey.alt(KeyEvent.VK_RIGHT), "Go forward to the next view root") { - c.viewMgr.goForward() - } - - def SET_VIEW_ROOT(implicit c: Controller) = MkAction("Set as View Root", HotKey.ctrl(KeyEvent.VK_ENTER), "Set View Root: Sets the selected entity as the view root") { - c.viewMgr.setSelectedAsRootView() - } - def TOGGLE_FULL_SCREEN(implicit c: Controller) = MkAction("Maximize", HotKey.alt(KeyEvent.VK_ENTER), "Maximize: Removes toolbars and package explorer (left side column)") { - c.viewMgr.maximize() - } - - def RESET_VIEW_ROOT(implicit c: Controller) = MkAction("Reset View Root", HotKey.alt(KeyEvent.VK_BACK_SPACE), "Reset the view root to the top level project") { - c.viewMgr.resetViewRoot() - } - - def ICONS_ONLY_VIEW(implicit c: Controller) = { - - val uncheckedName = "Simple view " - val checkedName = "Simple view " - - val out = MkAction(uncheckedName, HotKey.ctrl(KeyEvent.VK_I), "Force all dashboard items show minimal details") { - c.viewMgr.toggleIconOverride() - } - c.addObserver(new ControllerListener() { - override def onIconOverrideChanged() { - out.putValue(Action.NAME, if (c.viewMgr.isIconOverrideActive) checkedName else uncheckedName) - } - }) - out - } - - def REBUILD_VIEW(implicit c: Controller) = MkAction("Rebuild View", HotKey.ctrl('R'), "Rebuild the view (Useful if it loses synchronizeation with the model due to a bug)") { - c.rebuildView(false, false) - } - - } - - object Tools { - - def NEW_MODULE(implicit c: Controller) = MkAction("New Module", HotKey.ctrl('M')) { - c.entityAddMgr.addModule() - } - def NEW_TYPE(implicit c: Controller) = MkAction("New Class/Type", HotKey.ctrl('T')) { - c.entityAddMgr.addType() - } - def NEW_ENUM(implicit c: Controller) = MkAction("New Enumeration", HotKey.ctrl('E')) { - c.entityAddMgr.addEnum() - } - def NEW_FIELD(implicit c: Controller) = MkAction("Add Field/Entry", HotKey.ctrl(KeyEvent.VK_ADD), "Add field/entry to selected class/enum") { - c.entityAddMgr.addFieldOrEntry() - } - - def ALIGN_X_RIGHT_BTN(implicit c: Controller) = MkAction("Align to Right", HotKey.ctrl(KeyEvent.VK_RIGHT)) { - c.alignmentMgr.alignSelectionXRight() - } - def ALIGN_X_CENTER_BTN(implicit c: Controller) = MkAction("Align to Center Horizontally", HotKey.ctrl().shift(KeyEvent.VK_LEFT)) { - c.alignmentMgr.alignSelectionXCenter() - } - def ALIGN_X_LEFT_BTN(implicit c: Controller) = MkAction("Align to Left", HotKey.ctrl(KeyEvent.VK_LEFT)) { - c.alignmentMgr.alignSelectionXLeft() - } - - def ALIGN_Y_TOP_BTN(implicit c: Controller) = MkAction("Align to Top", HotKey.ctrl(KeyEvent.VK_UP)) { - c.alignmentMgr.alignSelectionYTop() - } - def ALIGN_Y_CENTER_BTN(implicit c: Controller) = MkAction("Align to Center Vertically", HotKey.ctrl().shift(KeyEvent.VK_UP)) { - c.alignmentMgr.alignSelectionYCenter() - } - def ALIGN_Y_BOTTOM_BTN(implicit c: Controller) = MkAction("Align to Bottom", HotKey.ctrl(KeyEvent.VK_DOWN)) { - c.alignmentMgr.alignSelectionYBottom() - } - - def SPREAD_EQUAL_X(implicit c: Controller) = MkAction("Spread even Horizontally", HotKey.ctrl().shift(KeyEvent.VK_RIGHT)) { - c.boundsMgr.spreadEqualX() - } - def SPREAD_EQUAL_Y(implicit c: Controller) = MkAction("Spread even Vertically", HotKey.ctrl().shift(KeyEvent.VK_DOWN)) { - c.boundsMgr.spreadEqualY() - } - - def RESIZE_EQUAL_X(implicit c: Controller) = MkAction("Resize to same Width", HotKey.ctrl('W')) { - c.boundsMgr.resizeSameWidth() - } - def RESIZE_EQUAL_Y(implicit c: Controller) = MkAction("Resize to same Height", HotKey.ctrl('H')) { - c.boundsMgr.resizeSameHeight() - } - - def SPACE_OUT_X(implicit c: Controller) = MkAction("Space out Horizontally", HotKey.ctrl().alt(KeyEvent.VK_RIGHT)) { - c.boundsMgr.spaceOutX() - } - def SPACE_OUT_Y(implicit c: Controller) = MkAction("Space out Vertically", HotKey.ctrl().alt(KeyEvent.VK_DOWN)) { - c.boundsMgr.spaceOutY() - } - - def LAY_OUT(implicit c: Controller) = MkAction("Lay out Entities", HotKey.ctrl(KeyEvent.VK_D)) { - c.boundsMgr.layOut(false) - } - - def LAY_OUT_AND_RESIZE(implicit c: Controller) = MkAction("Lay out and resize Entities", HotKey.ctrl().shift(KeyEvent.VK_D)) { - c.boundsMgr.layOut(true) - } - - def GENERATE(implicit c: Controller) = MkAction("Generate Code", HotKey.ctrl('G')) { - c.generateMgr.generate() - } - - } - - object Settings { - def GENERATION(implicit c: Controller) = MkAction("Generator Settings", HotKey.ctrl('G')) { - new GeneratorWindow(c) - } - } - - object About { - def HELP(implicit c: Controller) = MkAction("Help", HotKey(KeyEvent.VK_F1)) { - } - def ABOUT(implicit c: Controller) = MkAction("About", HotKey(KeyEvent.VK_F2)) { - } - } - - } - - object Impl { - - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/EntityFactory.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/EntityFactory.scala deleted file mode 100644 index d7fb92c4..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/EntityFactory.scala +++ /dev/null @@ -1,141 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner - -import java.util.ArrayList -import java.util.UUID -import se.culvertsoft.mgen.visualdesigner.model.ClassPathEntityId -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.EntityId -import se.culvertsoft.mgen.visualdesigner.model.Int32Type -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.Placement -import se.culvertsoft.mgen.visualdesigner.model.Project -import se.culvertsoft.mgen.visualdesigner.util.LayOutEntities -import se.culvertsoft.mgen.visualdesigner.model.FilePath -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry - -object EntityFactory { - - def nextId(): EntityId = { - val uuid = UUID.randomUUID() - new EntityId(uuid.getLeastSignificantBits(), uuid.getMostSignificantBits()) - } - - def mkModule( - name: String, - left: Int, - top: Int, - width: Int, - height: Int, - saveDir: FilePath): Module = { - new Module() - .setId(nextId()) - .setSaveDir(saveDir) - .setName(name) - .setPlacement(new Placement(left, top, width, height)) - .setSettings(new java.util.HashMap) - .setSubmodules(new java.util.ArrayList) - .setTypes(new java.util.ArrayList) - .setEnums(new ArrayList) - } - - def mkField(name: String): CustomTypeField = { - - val f = new CustomTypeField - f.setId(EntityFactory.nextId()) - f.setName(name) - f.setType(new Int32Type) - f.setFlags(new ArrayList) - - f - } - - def mkEnumEntry(name: String, constant: String): EnumEntry = { - - val f = new EnumEntry - f.setName(name) - f.setConstant(constant) - f.setId(EntityFactory.nextId()) - - f - } - - def mkModule(name: String, saveDir: FilePath): Module = { - mkModule( - name, - LayOutEntities.DEFAULT_WALL_OFFSET_X, - LayOutEntities.DEFAULT_WALL_OFFSET_Y, - LayOutEntities.DEFAULT_MODULE_WIDTH, - LayOutEntities.DEFAULT_MODULE_HEIGHT, - saveDir) - } - - def mkId(path: String): ClassPathEntityId = { - new ClassPathEntityId(path) - } - - def mkClass( - name: String, - left: Int, - top: Int, - width: Int, - height: Int): CustomType = { - new CustomType() - .setId(nextId()) - .setName(name) - .setFields(new java.util.ArrayList) - .setPlacement(new Placement(left, top, width, height)) - .setSubTypes(new ArrayList) - } - - def mkEnum( - name: String, - left: Int, - top: Int, - width: Int, - height: Int): EnumType = { - new EnumType() - .setId(nextId()) - .setName(name) - .setPlacement(new Placement(left, top, width, height)) - .setEntries(new ArrayList) - } - - def mkClass(name: String): CustomType = { - mkClass( - name, - LayOutEntities.DEFAULT_WALL_OFFSET_X, - LayOutEntities.DEFAULT_WALL_OFFSET_Y, - LayOutEntities.DEFAULT_CLASS_WIDTH, - LayOutEntities.DEFAULT_CLASS_HEIGHT) - } - - def mkEnum(name: String): EnumType = { - mkEnum( - name, - LayOutEntities.DEFAULT_WALL_OFFSET_X, - LayOutEntities.DEFAULT_WALL_OFFSET_Y, - LayOutEntities.DEFAULT_CLASS_WIDTH, - LayOutEntities.DEFAULT_CLASS_HEIGHT) - } - - def mkProject(name: String, filePath: FilePath): Project = { - new Project() - .setId(nextId()) - .setFilePath(filePath) - .setName(name) - .setGenerators(new java.util.ArrayList) - .setModules(new java.util.ArrayList) - .setSettings(new java.util.HashMap) - .setDependencies(new java.util.ArrayList) - } - - def mkModel(): Model = { - - new Model(mkProject("project", new FilePath("project.xml", "project.xml"))) - - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/HotKey.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/HotKey.scala deleted file mode 100644 index c122f03f..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/HotKey.scala +++ /dev/null @@ -1,65 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner - -import java.awt.event.InputEvent - -import scala.language.implicitConversions - -import javax.swing.KeyStroke - -object HotKey { - - def apply() = new HotKey() - def apply(c: Character) = new HotKey(char2vkey(c)) - def apply(vkey: Int) = new HotKey(vkey) - - def ctrl(c: Character): HotKey = new HotKey().ctrl(c) - def shift(c: Character): HotKey = new HotKey().shift(c) - def alt(c: Character): HotKey = new HotKey().alt(c) - - def ctrl(vkey: Int = 0): HotKey = new HotKey().ctrl(vkey) - def shift(vkey: Int = 0): HotKey = new HotKey().shift(vkey) - def alt(vkey: Int = 0): HotKey = new HotKey().alt(vkey) - - def char2vkey(c: Character): Int = KeyStroke.getKeyStroke(c, 0).getKeyCode() - - implicit def toStroke(s: HotKey) = - KeyStroke.getKeyStroke(s.vkey, s.modifiers) - -} - -class HotKey( - private var _vkey: Int = 0) { - private var _modifiers: Int = 0 - - private def set(vkey: Int, mods: Int): HotKey = { - setVkey(vkey) - addModifier(mods) - this - } - - def ctrl(vkey: Int = _vkey): HotKey = { set(vkey, InputEvent.CTRL_DOWN_MASK) } - def shift(vkey: Int = _vkey): HotKey = { set(vkey, InputEvent.SHIFT_DOWN_MASK) } - def alt(vkey: Int = _vkey): HotKey = { set(vkey, InputEvent.ALT_DOWN_MASK) } - - def ctrl(c: Character): HotKey = { ctrl(HotKey.char2vkey(c)) } - def shift(c: Character): HotKey = { shift(HotKey.char2vkey(c)) } - def alt(c: Character): HotKey = { alt(HotKey.char2vkey(c)) } - - def apply(c: Character): HotKey = { - setChar(c) - this - } - - def apply(vkey: Int): HotKey = { - setVkey(vkey) - this - } - - def vkey(): Int = _vkey - def modifiers(): Int = _modifiers - - private def setChar(c: Character) { _vkey = HotKey.char2vkey(c) } - private def setVkey(vkey: Int) { _vkey = vkey } - private def addModifier(m: Int) { _modifiers |= m } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Icons.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Icons.scala deleted file mode 100644 index 1e1990a1..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/Icons.scala +++ /dev/null @@ -1,68 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner - -import se.culvertsoft.mgen.visualdesigner.images.MkImgIcon - -object Icons { - - object TreeView { - - object Dash { - val PROJECT_ICON = MkImgIcon.small("placeholder.png") - val MODULE_ICON = MkImgIcon.small("list_icon_module.png") - val CLASS_ICON = MkImgIcon.small("list_icon_class.png") - val FIELD_ICON = MkImgIcon.small("list_icon_field.png") - } - - object Top { - val MOVE_UP = MkImgIcon.large("list_up.png") - val MOVE_DOWN = MkImgIcon.large("list_down.png") - val RENAME = MkImgIcon.large("list_rename.png") - val FIND = MkImgIcon.large("list_find.png") - } - - } - - object DashBoard { - - object Top { - - val ALIGN_X_RIGHT_ICON = MkImgIcon.large("arrange_align_right.png") - val ALIGN_X_CENTER_ICON = MkImgIcon.large("arrange_align_horizontal_middle.png") - val ALIGN_X_LEFT_ICON = MkImgIcon.large("arrange_align_left.png") - - val ALIGN_Y_TOP_ICON = MkImgIcon.large("arrange_align_top.png") - val ALIGN_Y_CENTER_ICON = MkImgIcon.large("arrange_align_vertical_middle.png") - val ALIGN_Y_BOTTOM_ICON = MkImgIcon.large("arrange_align_bottom.png") - - val SPREAD_EQUAL_X = MkImgIcon.large("arrange_spacing_equal_horizontal.png") - val SPREAD_EQUAL_Y = MkImgIcon.large("arrange_spacing_equal_vertical.png") - - val RESIZE_EQUAL_X = MkImgIcon.large("arrange_same_width.png") - val RESIZE_EQUAL_Y = MkImgIcon.large("arrange_same_height.png") - - val SPACE_OUT_X = MkImgIcon.large("arrange_spacing_horizontal.png") - val SPACE_OUT_Y = MkImgIcon.large("arrange_spacing_vertical.png") - - val LAY_OUT = MkImgIcon.large("arrange_auto.png") - - } - - object Left { - - val GO_UP = MkImgIcon.large("view_up.png") - val GO_BACK = MkImgIcon.large("view_back.png") - val GO_FORWARD = MkImgIcon.large("view_forward.png") - val RESET_VIEW = MkImgIcon.large("view_top.png") - val VIEW_SELECTED = MkImgIcon.large("view_selected.png") - val TOGGLE_FULL_SCREEN = MkImgIcon.large("toggle_fullscreen.png") - - val NEW_MODULE = MkImgIcon.large("add_module.png") - val NEW_CLASS = MkImgIcon.large("add_class.png") - val NEW_ENUM = MkImgIcon.large("add_enum.png") - val NEW_FIELD = MkImgIcon.large("add_field.png") - - } - - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/VisualDesigner.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/VisualDesigner.scala deleted file mode 100644 index 45da7246..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/VisualDesigner.scala +++ /dev/null @@ -1,151 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner - -import java.awt.AWTEvent -import java.awt.BorderLayout -import java.awt.Color -import java.awt.Dimension -import java.awt.EventQueue -import java.awt.Frame -import java.awt.Toolkit -import java.awt.event.WindowAdapter -import java.awt.event.WindowEvent -import java.io.File - -import EntityFactory.mkModel -import javax.swing.JLabel -import javax.swing.JPanel -import javax.swing.JSplitPane -import javax.swing.SwingUtilities -import javax.swing.ToolTipManager -import javax.swing.UIManager -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.compiler.util.ParseKeyValuePairs -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.images.MkImgIcon -import se.culvertsoft.mgen.visualdesigner.uiInit.MainMenuInit -import se.culvertsoft.mgen.visualdesigner.uiInit.PanelsInit -import se.culvertsoft.mgen.visualdesigner.uiInit.ToolbarsInit -import se.culvertsoft.mgen.visualdesigner.util.ConsolePipe -import se.culvertsoft.mgen.visualdesigner.view.AddressField -import se.culvertsoft.mgen.visualdesigner.view.PackageExplorer - -object VisualDesigner { - - def main(args: Array[String]) { - - // Redirect stdOut and stdErr first - val consolePanel = PanelsInit.mkTextPanel() - val msgConsole = new ConsolePipe(consolePanel) - msgConsole.redirectOut(Color.BLACK, System.out) - msgConsole.redirectErr(Color.RED, System.err) - - // Parse cmd line arguments - val cmdLineArgs = ParseKeyValuePairs(args) - - // This will be required for a later gui call - var controller: Controller = null - - // Create the gui - SwingUtilities.invokeLater(new Runnable() { - override def run() { - - UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel") - ToolTipManager.sharedInstance().setInitialDelay(200) - ToolTipManager.sharedInstance().setDismissDelay(999999999) - - // Configure main gui areas - val window = PanelsInit.mkWindow() - val leftPanel = PanelsInit.mkContentPane("leftPanel") - val rightPanelBase = PanelsInit.mkContentPane("rightPanelBase") - val rightPanel = PanelsInit.mkContentPane("rightPanelBase") - val dashBoard = PanelsInit.mkContentPane("drawArea") - val rightTopPanel = new JPanel { setLayout(new MigLayout("insets 0 0 0 0")) } - - // Configure splitters - val leftRightPanelSplitter = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, true, leftPanel, rightPanelBase) - val rightPanelSplitter = new JSplitPane(JSplitPane.VERTICAL_SPLIT, true, rightPanel, consolePanel) - rightPanelBase.add(rightPanelSplitter) - window.add(leftRightPanelSplitter, BorderLayout.CENTER) - - // Configure status bar - val statusBar = new JLabel() - statusBar.setPreferredSize(new Dimension(200, 20)) - statusBar.setText(" Welcome to MGen Visual Designer! This is the status bar where various information will me posted.") - window.add(statusBar, BorderLayout.PAGE_END) - - // Configure model and controller - val model = mkModel() - controller = new Controller(model, dashBoard, window) - - // Configure view helpers - val pkgExplorer = new PackageExplorer(controller, leftPanel) - val addressField = new AddressField(controller) - - // Configure toolbars - val leftPanelTopToolBar = ToolbarsInit.mkLeftPanelTopToolBar(controller) - val rightPanelTopToolbar = ToolbarsInit.mkRightPanelTopToolbar(controller) - val rightPanelLeftToolbar = ToolbarsInit.mkRightPanelLeftToolBar(controller) - - // Add toolbars and helpers to main panels - leftPanel.add(leftPanelTopToolBar, BorderLayout.PAGE_START) - rightPanel.add(rightPanelLeftToolbar, BorderLayout.WEST) - rightPanel.add(dashBoard, BorderLayout.CENTER) - rightPanel.add(rightTopPanel, BorderLayout.NORTH) - rightTopPanel.add(rightPanelTopToolbar, "growx, wrap") - rightTopPanel.add(addressField, "growx") - leftPanel.add(pkgExplorer) - - // Finally configure window - window.setJMenuBar(MainMenuInit.mkMainMenu(controller)); - window.setIconImage(MkImgIcon.huge("logo_concept.png").getImage()); - window.setLocation(50, 50) - window.addWindowListener(new WindowAdapter() { - override def windowClosing(e: WindowEvent) { - controller.saveMgr.closeApplication() - } - }) - window.setVisible(true) - window.setExtendedState(window.getExtendedState() | Frame.MAXIMIZED_BOTH) - - // Configure splitter sizes - leftRightPanelSplitter.setResizeWeight(0.1) - rightPanelSplitter.setResizeWeight(0.9) - leftRightPanelSplitter.setDividerLocation(200) - rightPanelSplitter.setDividerLocation(window.getHeight() - 200) - - // Configure our AWT event filter - Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueue() { - override def dispatchEvent(event: AWTEvent) { - try { - if (controller.filterGlobalEvent(event)) { - super.dispatchEvent(event) - } - } catch { - case e: Exception => - e.printStackTrace() - } - } - }) - - } - }) - - SwingUtilities.invokeLater(new Runnable() { - override def run() { - - // Print something fun in the console - println(" --- Welcome to MGen Visual Designer ---") - println(" --- Happy modeling! --- ") - - // Load project or start new one - cmdLineArgs.get("project") match { - case Some(filePath) => controller.saveMgr.load(new File(filePath)) - case _ => controller.saveMgr.forceStartNewProject() - } - - } - }) - - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/classlookup/Type2String.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/classlookup/Type2String.scala deleted file mode 100644 index 680475e6..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/classlookup/Type2String.scala +++ /dev/null @@ -1,74 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.classlookup - -import se.culvertsoft.mgen.visualdesigner.model.ArrayType -import se.culvertsoft.mgen.visualdesigner.model.BoolType -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.FieldType -import se.culvertsoft.mgen.visualdesigner.model.Float32Type -import se.culvertsoft.mgen.visualdesigner.model.Float64Type -import se.culvertsoft.mgen.visualdesigner.model.Int16Type -import se.culvertsoft.mgen.visualdesigner.model.Int32Type -import se.culvertsoft.mgen.visualdesigner.model.Int64Type -import se.culvertsoft.mgen.visualdesigner.model.Int8Type -import se.culvertsoft.mgen.visualdesigner.model.ListType -import se.culvertsoft.mgen.visualdesigner.model.MapType -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.NoType -import se.culvertsoft.mgen.visualdesigner.model.StringType -import se.culvertsoft.mgen.visualdesigner.model.Project -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef -import se.culvertsoft.mgen.visualdesigner.model.EnumType - -object Type2String { - - def defaltGetCustomTypeName(t: UserTypeRef)(implicit model: Model): String = { - model.getEntity(t.getId()) match { - case Some(t) => t.getName() - case None => "" - } - } - - def getClassPath(e: Entity)(implicit model: Model): String = { - val parentPrefix = model.parentOf(e) match { - case Some(parent: Project) => "" - case Some(parent) => getClassPath(parent) + "." - case _ => "" - } - parentPrefix + e.getName() - } - - def getCustomTypeNameLong(t: UserTypeRef)(implicit model: Model): String = { - model.getEntity(t.getId()) match { - case Some(e) => s"${getClassPath(e)}" - case None => "." - } - } - - def apply(t: FieldType, fGetCustomTypeRefName: UserTypeRef => String)(implicit model: Model): String = { - t match { - case t: BoolType => "bool" - case t: Int8Type => "int8" - case t: Int16Type => "int16" - case t: Int32Type => "int32" - case t: Int64Type => "int64" - case t: Float32Type => "float32" - case t: Float64Type => "float64" - case t: StringType => "string" - case t: NoType => "no_type" - case t: ListType => s"list[${apply(t.getElementType(), fGetCustomTypeRefName)}]" - case t: ArrayType => s"array[${apply(t.getElementType(), fGetCustomTypeRefName)}]" - case t: MapType => s"map[${apply(t.getKeyType(), fGetCustomTypeRefName)}, ${apply(t.getValueType(), fGetCustomTypeRefName)}]" - case t: UserTypeRef => fGetCustomTypeRefName(t) - case _ => "" - } - } - - def apply(t: FieldType)(implicit model: Model): String = { - apply(t, defaltGetCustomTypeName) - } - - def long(t: FieldType)(implicit model: Model): String = { - apply(t, getCustomTypeNameLong) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/AlignmentController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/AlignmentController.scala deleted file mode 100644 index b393af87..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/AlignmentController.scala +++ /dev/null @@ -1,92 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import java.awt.Point -import java.awt.Rectangle - -class AlignmentController(controller: Controller) extends SubController(controller) { - import se.culvertsoft.mgen.visualdesigner.model.RichPlacedEntity._ - - private case class EBounds( - val xMin: Int, - val xCenter: Int, - val xMax: Int, - val yMin: Int, - val yCenter: Int, - val yMax: Int) - - private def align( - fx: (PlacedEntity, EBounds) => Int, - fy: (PlacedEntity, EBounds) => Int) { - - if (controller.checkAtLeastSelected(2) && - controller.checkSelectionHaveSameParent() && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val entities = controller.selectedPlacedEntities - val parentEntity = controller.model.parentOf(entities(0)).get - val views = controller.viewMgr.selectedViews - val parentView = views(0).getParent.get - - val xMax = entities.map(_.right()).max - val xMin = entities.map(_.x()).min - val xCenter = (xMax + xMin) / 2 - val yMax = entities.map(_.bottom()).max - val yMin = entities.map(_.y()).min - val yCenter = (yMax + yMin) / 2 - - val eb = EBounds(xMin, xCenter, xMax, yMin, yCenter, yMax) - - controller.bulkOperation { - for (entity <- entities) { - val x = fx(entity, eb) - val y = fy(entity, eb) - controller.boundsMgr.moveTo(entity, parentEntity, x, y, false) - } - } - - controller.triggerObservers(_.onModelModified()) - - } - } - - def alignSelectionXLeft() { - align( - (e, eb) => eb.xMin, - (e, eb) => e.y) - } - - def alignSelectionXCenter() { - align( - (e, eb) => eb.xCenter - e.width / 2, - (e, eb) => e.y) - } - - def alignSelectionXRight() { - align( - (e, eb) => eb.xMax - e.width, - (e, eb) => e.y) - } - - def alignSelectionYTop() { - align( - (e, eb) => e.x, - (e, eb) => eb.yMin) - } - - def alignSelectionYCenter() { - align( - (e, eb) => e.x, - (e, eb) => eb.yCenter - e.height / 2) - - } - - def alignSelectionYBottom() { - align( - (e, eb) => e.x, - (e, eb) => eb.yMax - e.height) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/BoundsController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/BoundsController.scala deleted file mode 100644 index 1229e56f..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/BoundsController.scala +++ /dev/null @@ -1,198 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.Rectangle - -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import se.culvertsoft.mgen.visualdesigner.model.RichPlacedEntity.RichPlacedEnt -import se.culvertsoft.mgen.visualdesigner.util.LayOutEntities -import se.culvertsoft.mgen.visualdesigner.view.Resizeable.ResizePoint -import se.culvertsoft.mgen.visualdesigner.view.Resizeable.ResizePointSE - -class BoundsController(controller: Controller) extends SubController(controller) { - - import se.culvertsoft.mgen.visualdesigner.model.RichPlacedEntity._ - - def moveTo(entity: PlacedEntity, parent: Entity, _x: Int, _y: Int, clamped: Boolean) { - - val x = if (clamped) math.max(_x, 5) else _x - val y = if (clamped) math.max(_y, 5) else _y - - entity.getPlacement() - .setX(x) - .setY(y) - - controller.triggerObservers(_.onEntityMoved(entity, parent)) - } - - def resizeTo( - entity: PlacedEntity, - entityInitBounds: Rectangle, - parent: Entity, - _w: Int, - _h: Int, - rp: ResizePoint = ResizePointSE) { - - val view = controller.viewMgr.view(entity) - - val _dx = (entityInitBounds.width - _w) * rp.xMove - val _dy = (entityInitBounds.height - _h) * rp.yMove - - val _x = entityInitBounds.x + _dx - val _y = entityInitBounds.y + _dy - - val x2 = _x + _w - val y2 = _y + _h - - var x = math.max(_x, 5) - var y = math.max(_y, 5) - val w = math.max(x2 - x, view.minWidth()) - val h = math.max(y2 - y, view.minHeight()) - - if (w > _w) { - x += (_w - w) * rp.xMove - } - - if (h > _h) { - y += (_h - h) * rp.yMove - } - - entity.setPos(x, y) - entity.setSize(w, h) - - controller.triggerObservers(_.onEntityResized(entity, parent)) - - } - - private def spread( - entities: Seq[PlacedEntity], - start: Int, - end: Int, - isX: Boolean) { - - val step = (end - start).toDouble / (entities.size - 1).toDouble + 1e-6 - - controller.bulkOperation { - for ((e, i) <- entities.zipWithIndex) { - val midPt = (start + step * i).toInt - val parent = controller.model.parentOf(e).get - if (isX) { - moveTo(e, parent, midPt - e.width / 2, e.y, true) - } else { - moveTo(e, parent, e.x, midPt - e.height / 2, true) - } - } - } - - controller.triggerObservers(_.onModelModified()) - } - - def spreadEqualY() { - if (controller.checkSelectionHaveSameParent() && - controller.checkAtLeastSelected(3) && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - val selection = controller.selectedPlacedEntities - val yMidStart = selection.map(_.midPt.y).min - val yMidEnd = selection.map(_.midPt.y).max - spread(selection, yMidStart, yMidEnd, false) - } - } - - def spreadEqualX() { - - if (controller.checkSelectionHaveSameParent() && - controller.checkAtLeastSelected(3) && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val selection = controller.selectedPlacedEntities - val xMidStart = selection.map(_.midPt.x).min - val xMidEnd = selection.map(_.midPt.x).max - spread(selection, xMidStart, xMidEnd, true) - } - } - - def spaceOutY() { - if (controller.checkSelectionHaveSameParent() && - controller.checkAtLeastSelected(2) && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val pad = 50 - val selection = controller.selectedPlacedEntities - val yMidStart = selection.map(_.midPt.y).min - val h = selection.map(_.height).max - val yMidEnd = yMidStart + (selection.size - 1) * (h + pad) - spread(selection, yMidStart, yMidEnd, false) - } - } - - def layOut(allowResize: Boolean) { - if (controller.checkHasExactlySelected(1)) { - val e = controller.selectedEntities()(0) - LayOutEntities(e, controller.model, allowResize) - - controller.bulkOperation { - e.foreach { cp => - cp.child match { - case child: PlacedEntity => - controller.triggerObservers(_.onEntityMoved(child, cp.parent)) - case _ => - } - } - } - - controller.triggerObservers(_.onModelModified()) - - } - } - - def spaceOutX() { - if (controller.checkSelectionHaveSameParent() && - controller.checkAtLeastSelected(2) && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val pad = 30 - val selection = controller.selectedPlacedEntities - val xMidStart = selection.map(_.midPt.x).min - val w = selection.map(_.width).max - val xMidEnd = xMidStart + (selection.size - 1) * (w + pad) - spread(selection, xMidStart, xMidEnd, true) - } - } - - def resizeSameWidth() { - - if (controller.checkAtLeastSelected(2) && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val selection = controller.selectedPlacedEntities - val w = selection.map(_.width()).max - - controller.bulkOperation { - for (e <- selection) { - resizeTo(e, e.bounds(), controller.model.parentOf(e).get, w, e.height()) - } - } - - controller.triggerObservers(_.onModelModified()) - - } - } - - def resizeSameHeight() { - if (controller.checkAtLeastSelected(2) && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val selection = controller.selectedPlacedEntities - val h = selection.map(_.height()).max - controller.bulkOperation { - for (e <- selection) { - resizeTo(e, e.bounds(), controller.model.parentOf(e).get, e.width(), h) - } - } - - controller.triggerObservers(_.onModelModified()) - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/Controller.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/Controller.scala deleted file mode 100644 index e4e677ec..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/Controller.scala +++ /dev/null @@ -1,461 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.AWTEvent -import java.awt.Point -import java.awt.event.KeyEvent -import java.awt.event.MouseEvent -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashMap -import scala.reflect.ClassTag -import javax.swing.JFrame -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.model.FieldType -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import se.culvertsoft.mgen.visualdesigner.util.Asof.RichFilterable -import se.culvertsoft.mgen.visualdesigner.util.Observable -import se.culvertsoft.mgen.visualdesigner.util.OperationStatus -import se.culvertsoft.mgen.visualdesigner.view.AbstractView -import se.culvertsoft.mgen.visualdesigner.view.ContentPane -import se.culvertsoft.mgen.visualdesigner.view.Selectable -import se.culvertsoft.mgen.visualdesigner.view.ViewManager -import se.culvertsoft.mgen.visualdesigner.model.UserDefinedType -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry - -class Controller( - - /** - * ***************************************************** - * - * - * STATE - * - * ***************************************************** - */ - - private var _model: Model, - private val topContainer: ContentPane, - private val window: JFrame) extends Observable[ControllerListener] { - private val bulkOperationStatus = new OperationStatus - - val boundsMgr = new BoundsController(this) - val alignmentMgr = new AlignmentController(this) - val entityAddMgr = new EntityAddController(this) - val keyboardInputMgr = new KeyboardInputController(this) - val mouseInputMgr = new MouseInputController(this) - val copyPasteMgr = new CopyPasteController(this) - val saveMgr = new SaveController(this, window) - val undoMgr = new UndoController(this) - val generateMgr = new GenerateController(this) - val viewMgr = new ViewManager(this, topContainer) - val settingsMgr = new SettingsController(this) - - /** - * ***************************************************** - * - * - * METHODS - * - * ***************************************************** - */ - - def model() = { - _model - } - - def isBulkOperationActive(): Boolean = { - bulkOperationStatus.isActive() - } - - def bulkOperation(f: => Unit) { - bulkOperationStatus active f - } - - def selectedEntities(): Seq[Entity] = { - viewMgr.selectedViews().map(_.entity) - } - - def selectedPlacedEntities(): Seq[PlacedEntity] = { - selectedEntities().filterOfType[PlacedEntity] - } - - def deselectAll(exception: Entity) { - - bulkOperation { - viewMgr - .selectedViews() - .filterNot(_ eq viewMgr.view(exception)) - .foreach(_.setSelected(false)) - } - - triggerObservers(_.onSelectionChanged(selectedEntities(), None)) - - } - - def select(entity: Entity, deselectOthers: Boolean = true, editFocus: Boolean = true) { - - bulkOperation { - - if (deselectOthers) - deselectAll(entity) - - viewMgr.view(entity) match { - case s: Selectable if (!s.isSelected()) => s.setSelected(true) - case _ => - } - - } - - triggerObservers(_.onSelectionChanged(selectedEntities(), if (editFocus) Some(entity) else None)) - - } - - def hover(state: Boolean, s: Selectable, e: Entity) { - - if (mouseInputMgr.isHoverInhibitActive) - return - - mouseInputMgr.mouseDragAction() match { - case action: MouseDragAttachSuperTypeAction if state => - e match { - case e: CustomType if !(e eq action.subType) => s.setHovered(true) - case _ => s.setHovered(false) - } - case _ => s.setHovered(state) - } - - } - - def deSelect(entity: Entity, deselectOthers: Boolean = true) { - - bulkOperation { - - if (deselectOthers) - deselectAll(entity) - - viewMgr.view(entity) match { - case selectable: Selectable => selectable.setSelected(false) - case _ => - } - - } - - triggerObservers(_.onSelectionChanged(selectedEntities(), None)) - - } - - def filterGlobalEvent(e: AWTEvent): Boolean = { - e match { - case mouseEvent: MouseEvent => mouseInputMgr.filterGlobalEvent(mouseEvent) - case keyEvent: KeyEvent => keyboardInputMgr.filterGlobalEvent(keyEvent) - case _ => true - } - } - - def findNewParentFor(screenPos: Point, entity: Entity): Option[Entity] = { - viewMgr.findDeepestEntityAt( - screenPos, - x => !(x eq entity) && viewMgr.isVisible(x) && x.canBeParentOf(entity), - x => !(x eq entity) && viewMgr.isVisible(x)) - } - - def focusGained(entity: Entity) { - triggerObservers(_.onFocusGained(entity)) - } - - def focusLost(entity: Entity) { - triggerObservers(_.onFocusLost(entity)) - } - - def getKeepableClassViews(oldModel: Model, newModel: Model): Seq[(Entity, AbstractView)] = { - - // The whole purpose of this algorithm is to prevent - // The creation of new class objects and especially - // new java Swing objects when the old entities - // can be reused. - - oldModel.updateCache() - newModel.updateCache() - - val newEntities = newModel.findEach[UserDefinedType]() - - val out = new ArrayBuffer[(Entity, AbstractView)] - - // Find classes that can be replaced with old ones - for (newEntity <- newEntities) { - oldModel.getEntity(newEntity.getId()) match { - case Some(oldEntity: UserDefinedType) => - - // Begin by setting all old placements to the new ones - oldEntity.setPlacement(newEntity.getPlacement()) - - // Now check if they are equal (scala: "==" is ok) - if (oldEntity == newEntity) { - - // Replace newClass with oldClass - val newParent = newModel.parentOf(newEntity).get.asInstanceOf[Module] - - newEntity match { - case eNew: CustomType => - - val eOld = oldEntity.asInstanceOf[CustomType] - - val idx = newParent.getTypes().indexOf(eNew) - newParent.getTypes().set(idx, eOld) - - val clsView = viewMgr.view(eOld) - - // Ensure the view is resized properly - clsView.updateBounds() - - out += ((eOld, clsView)) - - for (oldField <- eOld.getFields()) { - val fldView = viewMgr.view(oldField) - out += ((oldField, fldView)) - } - - case eNew: EnumType => - val eOld = oldEntity.asInstanceOf[EnumType] - - val idx = newParent.getEnums().indexOf(eNew) - newParent.getEnums().set(idx, eOld) - - val clsView = viewMgr.view(eOld) - - // Ensure the view is resized properly - clsView.updateBounds() - - out += ((eOld, clsView)) - - for (oldEntry <- eOld.getEntries()) { - val fldView = viewMgr.view(oldEntry) - out += ((oldEntry, fldView)) - } - } - } - - case _ => - } - } - - // So that the cache doesnt point to old types - newModel.updateCache() - - out - - } - - def setModel(newModel: Model, clearUndoBuffer: Boolean, allowCaching: Boolean = true) { - - val oldModel = _model - - val keepableClassViews = if (allowCaching) getKeepableClassViews(oldModel, newModel) else Nil - println(keepableClassViews.map(_._1.getName())) - - _model = newModel - - val prevViewRootId = viewMgr.root().getId() - - bulkOperation { - - viewMgr.setViewRootShallow(model.project) - - triggerObservers(_.onModelCleared()) - - for (v <- keepableClassViews) - viewMgr.injectView(v._1, v._2) - - model.foreach(cp => { - val parentName = if (cp.parent != null) cp.parent.getName() else "null" - val childName = cp.child.getName() - entityAddMgr.add(cp.child, cp.parent) - }) - - if (clearUndoBuffer) - undoMgr.resetUndoBuffer() - - if (keepableClassViews.nonEmpty) { - val toMarkDirty = new HashMap[EntityIdBase, Entity] - for ((e, _) <- keepableClassViews) { - e match { - case e: CustomType => - model.foreachReferencedUserType(e) { x => - toMarkDirty.put(x.getId(), x) - } - case _ => - } - } - for ((_, e) <- toMarkDirty) { - triggerObservers(_.onEntityModified(e, false, None)) - } - } - - } - - model.getEntity(prevViewRootId) match { - case Some(e) => viewMgr.setViewRoot(e) - case None => viewMgr.setViewRoot(model.project) - } - - triggerObservers(_.onModelModified()) - - } - - def rebuildView(clearUndoBuffer: Boolean = false, allowCaching: Boolean = true) { - setModel(model, clearUndoBuffer, allowCaching) - } - - def selectAll() { - - bulkOperation { - - val parent = - viewMgr.getAllViews[Selectable]() - .filter(_.isSelected()) - .headOption - .map(_.entity) - .getOrElse(viewMgr.root()) - - deselectAll(null) - parent.foreachFirstLevelChild(cp => select(cp.child, false)) - - } - - triggerObservers(_.onSelectionChanged(selectedEntities(), None)) - - } - - def moveUp() { - if (checkSelectionHaveSameParent()) { - val selection = selectedEntities() - val parent = model.parentOf(selection(0)).get - bulkOperation { selection foreach parent.moveChildUp } - triggerObservers(_.onChildrenReordered(parent)) - } - } - - def moveDown() { - if (checkSelectionHaveSameParent()) { - val selection = selectedEntities() - val parent = model.parentOf(selection(0)).get - bulkOperation { selection.reverse foreach parent.moveChildDown } - triggerObservers(_.onChildrenReordered(parent)) - } - } - - def checkSelectedMeetCondition(errMsg: String)(condition: Entity => Boolean): Boolean = { - if (selectedEntities.forall(condition)) { - true - } else { - viewMgr.popupPreconditionFailed(errMsg) - false - } - } - - def checkAllSelectedAreOfType[T: ClassTag](errMsg: String = "Not all selected entities matched the requirement"): Boolean = { - checkSelectedMeetCondition(errMsg)(_ match { - case t: T => true - case _ => false - }) - } - - def checkAtLeastSelected(n: Int): Boolean = { - if (selectedEntities.size >= n) true - else viewMgr.popupPreconditionFailed(s"You need to select at least $n item(s) to perform this operation.") - } - - def checkAtMostSelected(n: Int): Boolean = { - if (selectedEntities.size <= n) true - else viewMgr.popupPreconditionFailed(s"You need to select at most $n item(s) to perform this operation.") - } - - def checkHasExactlySelected(n: Int): Boolean = { - checkAtLeastSelected(n) && checkAtMostSelected(n) - } - - def checkSelectionHaveSameParent(): Boolean = { - val parents = selectedEntities().map(_.getParent()).distinct - if (parents.size == 1) { - true - } else if (parents.isEmpty) { - viewMgr.popupPreconditionFailed("You need to select at least one item to perform this operation.") - } else { - viewMgr.popupPreconditionFailed("You may only select items with the same parent to perform this operation.") - } - } - - def renameSelection() { - if (checkHasExactlySelected(1)) { - val e = selectedEntities()(0) - val c = viewMgr.view(e).innerPanel - viewMgr.popupGetString("Enter new name", e.getName(), c) match { - case Some(name) => rename(e, name) - case _ => - } - } - } - - def rename(e: Entity, newName: String) { - if (newName != e.getName() && newName.trim.nonEmpty) { - e.setName(newName) - triggerObservers(_.onEntityModified(e, false, model.parentOf(e))) - } - } - - def changeType(parent: CustomTypeField, newType: FieldType) { - if (newType != parent.getType()) { - parent.setType(newType) - triggerObservers(_.onEntityModified(parent, false, model.parentOf(parent))) - } - } - - def removeSuperTypeOf(subType: CustomType) { - if (subType.hasSuperType()) { - model.detachSuperTypeOf(subType) - - if (!isBulkOperationActive) { - model.superTypeOf(subType) foreach { superType => triggerObservers(_.onEntityModified(superType, false, None)) } - triggerObservers(_.onEntityModified(subType, false, None)) - triggerObservers(_.onModelModified()) - } - } - } - - def changeSuperType(subType: CustomType, superType: CustomType) { - if (!subType.hasSuperType() || subType.getId() != superType.getSuperType()) { - - bulkOperation { - removeSuperTypeOf(subType) - model.attachSubType(subType, superType) - } - - triggerObservers(_.onEntityModified(subType, false, None)) - triggerObservers(_.onModelModified()) - - } - } - - def changeFlags(parent: CustomTypeField, newFlags: java.util.ArrayList[String]) { - if (newFlags != parent.getFlags()) { - parent.setFlags(newFlags) - triggerObservers(_.onEntityModified(parent, false, model.parentOf(parent))) - } - } - - def changeEnumEntryConstant(e: EnumEntry, newConstant: String) { - if (newConstant != e.getConstant()) { - val trimmed = if (newConstant != null && newConstant.trim().nonEmpty) newConstant.trim() else null - e.setConstant(trimmed) - triggerObservers(_.onEntityModified(e, false, model.parentOf(e))) - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ControllerListener.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ControllerListener.scala deleted file mode 100644 index b5b4edef..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ControllerListener.scala +++ /dev/null @@ -1,60 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity - -trait ControllerListener { - - /** - * **************************** - * - * - * MODEL CHANGES - * - * *************************** - */ - - def onEntityAdded(child: Entity, parent: Entity) {} - - def onEntityTransferred(child: Entity, newParent: Entity, oldParent: Entity) {} - - def onEntityDeleted(child: Entity, parent: Option[Entity]) {} - - def onEntityMoved(entity: PlacedEntity, parent: Entity) {} - - def onEntityResized(entity: PlacedEntity, parent: Entity) {} - - def onEntityModified(child: Entity, validate: Boolean = false, parent: Option[Entity] = None) {} - - def onChildrenReordered(parent: Entity) {} - - def onModelCleared() {} - - def onModelModified(isPreview: Boolean) {} - - def onNewModel() {} - - final def onModelModified() { onModelModified(false) } - - /** - * **************************** - * - * - * VIEW CHANGES - * - * *************************** - */ - - def onScaleFactorChanged() {} - - def onIconOverrideChanged() {} - - def onViewRootChanged() {} - - def onFocusGained(entity: Entity) {} - - def onFocusLost(entity: Entity) {} - - def onSelectionChanged(selected: Seq[Entity], focused: Option[Entity]) {} - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/CopyPasteController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/CopyPasteController.scala deleted file mode 100644 index 24a24efc..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/CopyPasteController.scala +++ /dev/null @@ -1,289 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.Toolkit -import java.awt.datatransfer.DataFlavor -import java.awt.datatransfer.StringSelection -import java.util.ArrayList -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.JavaConversions.bufferAsJavaList -import scala.collection.JavaConversions.seqAsJavaList -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashMap -import scala.collection.mutable.HashSet -import se.culvertsoft.mgen.visualdesigner.EntityFactory -import se.culvertsoft.mgen.visualdesigner.model.ArrayType -import se.culvertsoft.mgen.visualdesigner.model.ChildParent -import se.culvertsoft.mgen.visualdesigner.model.ClipboardContents -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EntityId -import se.culvertsoft.mgen.visualdesigner.model.FieldType -import se.culvertsoft.mgen.visualdesigner.model.ListType -import se.culvertsoft.mgen.visualdesigner.model.MapType -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.Project -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.classlookup.Type2String -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry - -class CopyPasteController(controller: Controller) extends SubController(controller) { - - private val modelSerializer = new ModelSerializer - - def checkSelectionForCopy(): Boolean = { - - val parents = selectedEntities() - .map(_.getParent()) - .distinct - - if (selectedEntities.exists(_.isInstanceOf[Project])) { - controller.viewMgr.popupPreconditionFailed("Cannot copy Projects. Can only copy modules, classes or fields.") - } else if (parents.isEmpty) { - controller.viewMgr.popupPreconditionFailed("No items selected. Need to select one or more items with the same parent.") - } else if (parents.size > 1) { - controller.viewMgr.popupPreconditionFailed("Invalid items selected. Need to select one or more items with the same parent.") - } else { - true - } - } - - def copySelectionToClipBoard(): Boolean = { - if (checkSelectionForCopy()) { - val clipboardData = new ClipboardContents().setItems(new ArrayList(selectedEntities())) - val serialized = modelSerializer.serializeAny(clipboardData) - val toClipboard = new StringSelection(new String(serialized)) - val clipboard = Toolkit.getDefaultToolkit().getSystemClipboard() - clipboard.setContents(toClipboard, null) - true - } else { - false - } - } - - def cutSelectionToClipBoard() { - if (copySelectionToClipBoard()) { - controller.entityAddMgr.deleteSelection(false) - } - } - - def pasteFromClipBoard() { - - val allSelected = selectedEntities() - - if (allSelected.size == 1) { - doPaste(allSelected(0)) - } else if (allSelected.isEmpty) { - controller.viewMgr.popupPreconditionFailed("No items selected to paste into. Need to select exactly one item to paste clipboard into.") - } else { - controller.viewMgr.popupPreconditionFailed("Too many items selected to paste into. Need to select exactly one item to paste clipboard into.") - } - - } - - private def doPaste(tgt: Entity) { - - controller.checkHasExactlySelected(1) - - getClipboardContents() foreach { text => - - val o = modelSerializer.deSerializeAny(text.getBytes()) - - o match { - case clipboardContents: ClipboardContents => doPaste2(clipboardContents.getItems(), tgt) - case entity: Entity => doPaste2(Seq(entity), tgt) - case _ => // Nothing we can handle - } - - } - - def doPaste2(topLevelEntities: Seq[Entity], tgt: Entity) { - - if (topLevelEntities.isEmpty) - return - - val inPaste = new ArrayBuffer[ChildParent]() - - for (e <- topLevelEntities) { - - if (!tgt.canBeParentOf(e)) { - controller.viewMgr.popupPreconditionFailed(s"Incorrect paste target type. Cannot paste ${e.getName} into ${tgt.getName}") - return - } - - e.foreach { cp => - inPaste += cp - } - } - - // Find ids of all entities in paste - val idsInPaste = inPaste.map(_.child.getId()).toSet - - // Find and sort all referenced ids in paste (parents, supertypes, subtypes) into: - // -> internal - // -> external - val allIds = new HashSet[EntityIdBase] - val intIds = new HashSet[EntityIdBase] - val extIds = new HashSet[EntityIdBase] - for (cp <- inPaste) { - val id = cp.child.getId() - if (idsInPaste.contains(id)) { - intIds += id - } else { - extIds += id - } - allIds += id - } - - // Find replacements for internal id duplicates with current model - val idReplacements = new HashMap[EntityIdBase, EntityIdBase] - for (id <- intIds) { - if (controller.model.exists(id)) { - idReplacements.put(id, EntityFactory.nextId()) - } - } - - // Remove all external subtype references in the paste - for (e <- inPaste) { - e.child match { - case t: CustomType if (t.hasSubTypes()) => - val newSubTypes = t.getSubTypes().filter(intIds.contains) - t.setSubTypes(new ArrayList(newSubTypes)) - case _ => - } - } - - // Apply id replacements - // -> own - // -> parents - // -> supertype - // -> suptypes - // -> fieldtypes - for (cp <- inPaste) { - - val e = cp.child - val id = e.getId() - val oldParent = controller.model.parentOf(e) - - // Replace own id if needed - if (idReplacements.contains(id)) { - e.setId(idReplacements(id)) - e match { - case e: Module => - case e: CustomTypeField => e.unsetId16Bit() - case e: EnumEntry => - case e: CustomType => e.unsetId16Bit() - case e: EnumType => - } - - // TODO Replace name if duplicate - - } - - // Replace parent id if needed - if (e.hasParent) { - if (idReplacements.contains(e.getParent())) { - e.setParent(idReplacements(e.getParent())) - } - } - - // add to any already existing parent - if (e.hasParent()) - - e match { - case e: Project => - case e: Module => - case e: CustomTypeField => - def replace(t: FieldType): FieldType = { - t match { - case t: UserTypeRef if (idReplacements.contains(t.getId())) => new UserTypeRef(idReplacements(t.getId())) - case t: ListType => new ListType(replace(t.getElementType())) - case t: ArrayType => new ArrayType(replace(t.getElementType())) - case t: MapType => new MapType(t.getKeyType(), replace(t.getValueType())) - case _ => t - } - } - e.setType(replace(e.getType())) - case e: CustomType => - - if (e.hasSuperType()) { - if (idReplacements.contains(e.getSuperType())) { - // Replace super type id if needed - e.setSuperType(idReplacements(e.getSuperType())) - } else { - // Re-add to super type if needed - controller.model.superTypeOf(e) match { - case Some(superType) => - if (!superType.getSubTypes().contains(e)) - superType.getSubTypes().add(e.getId()) - case _ => - } - } - } - - // Replace sub type ids if needed - if (e.hasSubTypes()) { - val oldSubTypes = e.getSubTypes() - val newSubTypes = oldSubTypes map { id => - if (idReplacements.contains(id)) { - idReplacements(id) - } else { - id - } - } - e.setSubTypes(new ArrayList(newSubTypes)) - } - case e: EnumType => - case e: EnumEntry => - - } - } - - // Add to model - controller.bulkOperation { - for (eTopLevel <- topLevelEntities) { - if (tgt.canBeParentOf(eTopLevel)) { - tgt.add(eTopLevel) - eTopLevel.setParent(tgt.getId()) - eTopLevel.foreach { cp => - val parent = if (cp.parent != null) cp.parent else tgt - val child = cp.child - - if (!parent.containsAtFirstLevel(child)) - parent.add(child) - child.setParent(parent.getId()) - - controller.entityAddMgr.add(child, parent) - } - } - } - - controller.deselectAll(null) - for (e <- topLevelEntities) { - controller.select(e, false) - } - } - - controller.triggerObservers(_.onModelModified()) - - } - - } - - def getClipboardContents(): Option[String] = { - - val clipboard = Toolkit.getDefaultToolkit().getSystemClipboard() - val contents = clipboard.getContents(null); - val hasTransferableText = (contents != null) && contents.isDataFlavorSupported(DataFlavor.stringFlavor) - - if (hasTransferableText) { - Some(contents.getTransferData(DataFlavor.stringFlavor).asInstanceOf[String]) - } else { - None - } - - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/EntityAddController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/EntityAddController.scala deleted file mode 100644 index 85cb9880..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/EntityAddController.scala +++ /dev/null @@ -1,343 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.Point -import java.awt.Rectangle - -import javax.swing.JOptionPane -import se.culvertsoft.mgen.compiler.util.FileUtils -import se.culvertsoft.mgen.visualdesigner.EntityFactory -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.FilePath -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import se.culvertsoft.mgen.visualdesigner.util.Asof.RichFilterable -import se.culvertsoft.mgen.visualdesigner.util.LayOutEntities -import se.culvertsoft.mgen.visualdesigner.view.ModuleView - -class EntityAddController(controller: Controller) extends SubController(controller) { - - def add(child: Entity, parent: Entity) { - - if (parent != null && !child.hasParent()) { - if (!parent.containsAtFirstLevel(child)) - parent.add(child) - child.setParent(parent.getId()) - } - - controller.triggerObservers(_.onEntityAdded(child, parent)) - - } - - def add(child: Entity) { - add(child, controller.model.project) - } - - def transfer(child: Entity, newParent: Entity, oldParent: Entity) { - - oldParent.remove(child) - newParent.add(child) - child.setParent(newParent.getId()) - - controller.triggerObservers(_.onEntityTransferred(child, newParent, oldParent)) - } - - def getNewModuleSaveDir(): FilePath = { - val writtenDir = FileUtils.directoryOf("") - val absoluteDir = FileUtils.directoryOf(controller.model.project.getFilePath().getAbsolute()) - new FilePath(writtenDir, absoluteDir) - } - - def addModule() { - - val module = EntityFactory.mkModule("NewModule", getNewModuleSaveDir()) - .setSettings(new java.util.HashMap) - .setSubmodules(new java.util.ArrayList) - .setTypes(new java.util.ArrayList) - - val (parent, position) = findPositionForNewModule(module.getPlacement().getWidth(), module.getPlacement().getHeight()) - - module - .getPlacement() - .setX(position.x) - .setY(position.y) - - parent.add(module) - module.setParent(parent.getId()) - - add(module, parent) - - controller.select(parent, true) - - } - - def addEnum(): Option[EnumType] = { - - if (!controller.checkHasExactlySelected(1)) - return None - - if (!controller.checkAllSelectedAreOfType[Module]("Classes can only be added to Modules. Select a module before trying to add a class.")) - return None - - val e = EntityFactory.mkEnum("NewEnum") - - val (parent, position) = findPositionForNewModule( - e.getPlacement().getWidth(), - e.getPlacement().getHeight()) - - parent match { - case parent: Module => - e - .getPlacement() - .setX(position.x) - .setY(position.y) - return Some(addEnum(e, parent)) - } - - return None - - } - - def addEnum(e: EnumType, parent: Module): EnumType = { - - parent.add(e) - e.setParent(parent.getId()) - - add(e, parent) - - controller.select(parent, true) - - e - } - - def addType(): Option[CustomType] = { - - if (!controller.checkHasExactlySelected(1)) - return None - - if (!controller.checkAllSelectedAreOfType[Module]("Classes can only be added to Modules. Select a module before trying to add a class.")) - return None - - val cls = EntityFactory.mkClass("NewType") - - val (parent, position) = findPositionForNewModule( - cls.getPlacement().getWidth(), - cls.getPlacement().getHeight()) - - parent match { - case parent: Module => - cls - .getPlacement() - .setX(position.x) - .setY(position.y) - return Some(addType(cls, parent)) - } - - return None - - } - - def addType(cls: CustomType, parent: Module): CustomType = { - - parent.add(cls) - cls.setParent(parent.getId()) - - add(cls, parent) - - controller.select(parent, true) - - cls - } - - def addField(t: CustomType, name: String) { - - val f = EntityFactory.mkField(name) - - f.setParent(t.getId()) - t.add(f) - - add(f, t) - - controller.select(t, true) - - } - - def addEntry(t: EnumType, name: String) { - - val f = EntityFactory.mkEnumEntry(name, null) - - f.setParent(t.getId()) - t.add(f) - - add(f, t) - - controller.select(t, true) - - } - - def addFieldOrEntry() { - if (controller.checkHasExactlySelected(1)) { - val e = controller.selectedEntities()(0) - e match { - case t: CustomTypeField => - controller.model().parentOf(t) match { - case Some(t: CustomType) => addField(t, "newField") - case _ => - } - case t: CustomType => addField(t, "newField") - case t: EnumEntry => - controller.model().parentOf(t) match { - case Some(t: EnumType) => addEntry(t, "newEnumEntry") - case _ => - } - case t: EnumType => addEntry(t, "newEnumEntry") - case _ => controller.viewMgr.popupPreconditionFailed("You need to select a class or enum to add a field/entry.") - } - } - } - - private def boundsOf(e: Entity): Rectangle = { - e match { - case e: PlacedEntity => new Rectangle( - e.getPlacement().getX(), - e.getPlacement().getY(), - e.getPlacement().getWidth(), - e.getPlacement().getHeight()) - case _ => - new Rectangle(0, 0, 0, 0) - } - } - - def isSpaceAvailable(parent: Entity, _space: Rectangle, pad: Int = 20): Boolean = { - val space = new Rectangle(_space.x - pad, _space.y - pad, _space.width + 2 * pad, _space.height + 2 * pad) - parent.firstLevelChildren().forall(!boundsOf(_).intersects(space)) - } - - def findFirstFreePosition(parent: Entity, w: Int, h: Int): Point = { - - var x = LayOutEntities.DEFAULT_WALL_OFFSET_X - var y = LayOutEntities.DEFAULT_WALL_OFFSET_Y - - val placements = parent.firstLevelChildren.filterOfType[PlacedEntity]().map(_.getPlacement()) - while (placements.exists(p => p.getX == x)) { - x += LayOutEntities.DEFAULT_CLASS_WIDTH_PADDED - } - - return new Point(x, y) - - val firstLvlChildren = parent.firstLevelChildren() - - if (firstLvlChildren.isEmpty) - return new Point(15, 40) - - val xMax = math.max(5, firstLvlChildren.map(p => boundsOf(p).x /*+ p.width()*/ ).max) - val yMax = math.max(15, firstLvlChildren.map(p => boundsOf(p).y /* + p.height()*/ ).max) - - val whRatio = 2 - - // First try a random position spanned by the box above - // Try 25 times - for (extension <- 0 until 100) { - for (iy <- 0 until math.max(1, yMax / w)) { - for (ix <- 0 until math.max(1, xMax / w)) { - - var xr = 0.0 - var yr = 0.0 - - if (math.random > 0.5) { - xr = 1.0 - } else { - yr = 1.0 - } - - val x = 5 + ix * w + extension * whRatio * 100 + math.random * w * whRatio * xr - val y = 5 + iy * h + extension * 100 + math.random * h * yr - val rect = new Rectangle(x.toInt, y.toInt, w, h) - if (isSpaceAvailable(parent, rect, 20)) { - return rect.getLocation() - } - } - } - } - - // Failed to find free space - new Point(15, 40) - - } - - def findPositionForNewModule(w: Int, h: Int): (Entity, Point) = { - - val parent = - controller.viewMgr.getAllViews[ModuleView]().filter(_.isSelected()).headOption match { - case Some(parentModule) => parentModule.entity - case None => controller.viewMgr.root() - } - - (parent, findFirstFreePosition(parent, w, h)) - } - - def getSelectedEntitiesForDelete(): Seq[Entity] = { - val selected = selectedEntities() - val children = selected.flatMap(_.allChildren()) - (selected ++ children).distinct.filterNot(_ eq controller.model.project) - } - - def deleteSelection(confirm: Boolean = true) { - - val entities = getSelectedEntitiesForDelete() - - controller.bulkOperation { - - def confirmDialog(): Boolean = { - - val answer = controller.viewMgr.showConfirmDialog( - "Do you wish to delete selected entities including children, and orphan any excluded subtypes?", - "Confirm deletion", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) - - answer match { - case JOptionPane.YES_OPTION => true - case _ => false - } - - } - - if (!confirm || confirmDialog()) { - entities.reverse.foreach(delete(_)) - } - - } - - controller.triggerObservers(_.onModelModified()) - - } - - def delete(entity: Entity) { - - val parent = controller.model.parentOf(entity) - - controller.bulkOperation { - - controller.model.detachParentOf(entity) - - entity match { - case entity: CustomType => - controller.model.detachSuperTypeOf(entity) - controller.model.detachSubTypesOf(entity) - case _ => - } - - controller.model.removeFromCache(entity) - - } - - controller.triggerObservers(_.onEntityDeleted(entity, parent)) - - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/GenerateController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/GenerateController.scala deleted file mode 100644 index 59e776bf..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/GenerateController.scala +++ /dev/null @@ -1,16 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import se.culvertsoft.mgen.visualdesigner.model.ModelConversion - -class GenerateController(controller: Controller) extends SubController(controller) { - def generate() { - println("Called 'generate()'") - - val apiModel = ModelConversion.vd2Api(controller.model) - - val modelBack = ModelConversion.api2Vd(apiModel) - - controller.setModel(modelBack, false, false) - - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/KeyboardInputController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/KeyboardInputController.scala deleted file mode 100644 index 55ea23ca..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/KeyboardInputController.scala +++ /dev/null @@ -1,22 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.event.KeyEvent - -class KeyboardInputController(controller: Controller) extends SubController(controller) { - - private var _isControlDown: Boolean = false - - def isControlDown(): Boolean = { - _isControlDown - } - - def filterGlobalEvent(e: KeyEvent): Boolean = { - _isControlDown = e.isControlDown() - e.getKeyCode() match { - case KeyEvent.VK_ESCAPE => controller.mouseInputMgr.cancelMouseOperations() - case _ => - } - true - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelChangeListener.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelChangeListener.scala deleted file mode 100644 index d7f1fbb6..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelChangeListener.scala +++ /dev/null @@ -1,46 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity - -trait ModelChangeListener extends ControllerListener { - - override def onModelModified(isPreview: Boolean) - - override def onEntityAdded(child: Entity, parent: Entity) { - onModelModified(false) - } - - override def onEntityTransferred(child: Entity, newParent: Entity, oldParent: Entity) { - onModelModified(false) - } - - override def onEntityDeleted(child: Entity, parent: Option[Entity]) { - onModelModified(false) - } - - override def onEntityMoved(entity: PlacedEntity, parent: Entity) { - onModelModified(false) - } - - override def onEntityResized(entity: PlacedEntity, parent: Entity) { - onModelModified(false) - } - - override def onEntityModified(child: Entity, validate: Boolean = false, parent: Option[Entity] = None) { - onModelModified(false) - } - - override def onChildrenReordered(parent: Entity) { - onModelModified(false) - } - - override def onModelCleared() { - onModelModified(false) - } - - override def onNewModel() { - onModelModified(false) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelSerializer.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelSerializer.scala deleted file mode 100644 index a00f61b4..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/ModelSerializer.scala +++ /dev/null @@ -1,41 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.io.ByteArrayInputStream -import java.io.ByteArrayOutputStream -import se.culvertsoft.mgen.javapack.classes.MGenBase -import se.culvertsoft.mgen.javapack.serialization.JsonReader -import se.culvertsoft.mgen.javapack.serialization.JsonWriter -import se.culvertsoft.mgen.visualdesigner.ClassRegistry -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.Project -import se.culvertsoft.mgen.javapack.serialization.JsonPrettyWriter - -class ModelSerializer { - - private val bos = new ByteArrayOutputStream - private val classRegistry = new ClassRegistry - private val writer = new JsonPrettyWriter(bos, classRegistry) - - def serialize(model: Model): Array[Byte] = { - serializeAny(model.project) - } - - def deSerialize(bytes: Array[Byte]): Model = { - val project = deSerializeAny(bytes).asInstanceOf[Project] - new Model(project) - } - - def serializeAny(o: MGenBase): Array[Byte] = { - writer.writeObject(o) - val bytes = bos.toByteArray() - bos.reset() - bytes - } - - def deSerializeAny(bytes: Array[Byte]): MGenBase = { - val bis = new ByteArrayInputStream(bytes) - val reader = new JsonReader(bis, classRegistry) - reader.readObject() - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseControlAction.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseControlAction.scala deleted file mode 100644 index fa8e0848..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseControlAction.scala +++ /dev/null @@ -1,44 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.Rectangle -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.view.Resizeable.ResizePoint -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import se.culvertsoft.mgen.visualdesigner.view.ScrollableView - -abstract class MouseDragAction - -case class MouseMoveEntity( - val initPos: UiPos, - val entityInitPos: UiPos, - val entity: PlacedEntity) - -case class MouseMoveAction( - val entities: Seq[MouseMoveEntity]) extends MouseDragAction - -case class MouseResizeAction( - val initPos: UiPos, - val entityInitBounds: Rectangle, - val entity: PlacedEntity, - val resizePoint: ResizePoint) extends MouseDragAction - -case class MousePanAction( - val initPos: UiPos, - val hBarInitValue: Int, - val vBarInitValue: Int, - val view: ScrollableView) extends MouseDragAction - -case class MouseSelectionBoxAction( - val initPos: UiPos, - val containerEntity: Entity) extends MouseDragAction - -case class MouseDragCreateSubTypeAction( - val initPos: UiPos, - val superType: CustomType) extends MouseDragAction - -case class MouseDragAttachSuperTypeAction( - val initPos: UiPos, - val subType: CustomType) extends MouseDragAction - -case object NoMouseDragAction extends MouseDragAction diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseInputController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseInputController.scala deleted file mode 100644 index 8ba4f316..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/MouseInputController.scala +++ /dev/null @@ -1,505 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.Cursor -import java.awt.Dimension -import java.awt.Rectangle -import java.awt.event.MouseEvent -import java.awt.event.MouseWheelEvent - -import se.culvertsoft.mgen.visualdesigner.EntityFactory -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import se.culvertsoft.mgen.visualdesigner.model.RichPlacedEntity.RichPlacedEnt -import se.culvertsoft.mgen.visualdesigner.util.Asof.RichFilterable -import se.culvertsoft.mgen.visualdesigner.util.AwtMath.RichDimension -import se.culvertsoft.mgen.visualdesigner.util.AwtMath.RichPoint -import se.culvertsoft.mgen.visualdesigner.util.LeftMouseButton -import se.culvertsoft.mgen.visualdesigner.util.MiddleMouseButton -import se.culvertsoft.mgen.visualdesigner.util.RichMouseEvent.RichMouseEventOps -import se.culvertsoft.mgen.visualdesigner.view.AbstractView -import se.culvertsoft.mgen.visualdesigner.view.ClassView -import se.culvertsoft.mgen.visualdesigner.view.Resizeable.ResizePoint -import se.culvertsoft.mgen.visualdesigner.view.ScrollableView -import se.culvertsoft.mgen.visualdesigner.view.Selectable - -class MouseInputController(controller: Controller) extends SubController(controller) { - - private var _lastMousePressPos = new UiPos() - private var _mousePos = new UiPos() - private var _lastMousePos = new UiPos() - private var _mouseDragAction: MouseDragAction = NoMouseDragAction - private var _cursor: Cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) - private var _pendingNewCursor: Cursor = Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) - - def mousePos() = _mousePos - def lastMousePressPos() = _lastMousePressPos - def mouseDragAction() = _mouseDragAction - def isMouseDragActionActive() = mouseDragAction() != NoMouseDragAction - def setCursor(id: Int) { setCursor(Cursor.getPredefinedCursor(id)) } - - def filterGlobalEvent(mouseEvent: MouseEvent): Boolean = { - val p = new UiPos(mouseEvent) - if (p != mousePos()) { - _lastMousePos = _mousePos - _mousePos = p - } - - if (mouseEvent.isBackBtn) { - if (mouseEvent.isPress) - controller.viewMgr.goBack() - return false - } else if (mouseEvent.isForwardBtn) { - if (mouseEvent.isPress) - controller.viewMgr.goForward() - return false - } else if (mouseEvent.isMiddleBtn) { - if (mouseEvent.isPress) { - startMousePanAction(mouseEvent) - } else if (mouseEvent.isDrag) { - handleMouseDragAction(mouseEvent) - } else if (mouseEvent.isRelease) { - finishMouseAction() - } - return false - } - - mouseEvent.getID() match { - case MouseEvent.MOUSE_PRESSED => - _lastMousePressPos = new UiPos(mouseEvent) - case MouseEvent.MOUSE_RELEASED => - finishMouseAction() - case MouseEvent.MOUSE_DRAGGED => - handleMouseDragAction(mouseEvent) - case _ => - mouseEvent match { - case mouseEvent: MouseWheelEvent => - if (mouseEvent.isControlDown()) { - return scaleByMouseWheel(mouseEvent) - } - case _ => - } - } - true - } - - def setMouseDragAction(action: MouseDragAction) { - _mouseDragAction = action - if (action != NoMouseDragAction) - _pendingNewCursor = _cursor - } - - def startMouseMoveAction(entity: PlacedEntity) { - - if (!isMouseDragActionActive() && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val p = lastMousePressPos() - val entityPos = controller.viewMgr.getUiPosOf(entity) - val selectedEntities = controller.selectedPlacedEntities - val selectedViews = selectedEntities map controller.viewMgr.view - val entitiesToMove = selectedViews.map(x => - new MouseMoveEntity( - p, - controller.viewMgr.getUiPosOf(x.entity), - x.entity.asInstanceOf[PlacedEntity])) - val ents = - setMouseDragAction(new MouseMoveAction(entitiesToMove)) - } - } - - def startMouseResizeAction(e: MouseEvent, rp: ResizePoint, entity: PlacedEntity) { - - if (!isMouseDragActionActive() && - controller.checkAllSelectedAreOfType[PlacedEntity]()) { - - val p = lastMousePressPos() - val entityPos = controller.viewMgr.getUiPosOf(entity) - - setMouseDragAction(new MouseResizeAction(p, entity.bounds(), entity, rp)) - } - } - - def startMouseSelectionBoxAction(e: MouseEvent, parent: Entity) { - if (!isMouseDragActionActive()) { - val p = new UiPos(e) - setMouseDragAction(new MouseSelectionBoxAction(p, parent)) - } - } - - def handleMouseDragAction(mouseEvent: MouseEvent) { - mouseEvent.button match { - case LeftMouseButton => handleMouseLeftBtnDrag(mouseEvent) - case MiddleMouseButton => handleMouseMiddleBtnDrag(mouseEvent) - case _ => - } - } - - def handleMouseLeftBtnDrag(mouseEvent: MouseEvent) { - mouseDragAction() match { - case moveAction: MouseMoveAction => - handleMouseDragMoveEntity(mouseEvent, moveAction) - case resizeAction: MouseResizeAction => - handleMouseDragResizeEntity(mouseEvent, resizeAction) - case selectionBoxAction: MouseSelectionBoxAction => - handleMouseSelectionBox(mouseEvent, selectionBoxAction) - case createSubtypeAction: MouseDragCreateSubTypeAction => - handleCreateSubTypeAction(mouseEvent, createSubtypeAction) - case attachSuperTypeAction: MouseDragAttachSuperTypeAction => - handleAttachSuperTypeAction(mouseEvent, attachSuperTypeAction) - case _ => - } - } - def handleMouseMiddleBtnDrag(mouseEvent: MouseEvent) { - mouseDragAction() match { - case action: MousePanAction => - handleMousePanAction(mouseEvent, action) - case _ => - } - } - - def handleMouseDragMoveEntity(mouseEvent: MouseEvent, _action: MouseMoveAction) { - - controller.bulkOperation { - - _action.entities.foreach { action => - - val view = controller.viewMgr.view(action.entity) - - val oldParent = controller.model.parentOf(action.entity).get - val entityMouseOffset = action.entityInitPos.onScreen - action.initPos.onScreen - val pEntityNewPtOnScreen = mousePos().onScreen + entityMouseOffset - val pEntityNewMidPtOnScreen = pEntityNewPtOnScreen + view.halfSize - val parent = controller.findNewParentFor(pEntityNewMidPtOnScreen, action.entity) - - parent.filterNot(_ eq oldParent) match { - - case Some(newParent) => - - val newParentView = controller.viewMgr.view(newParent) - val pNewNewComp = UiPos.getCompCoordFromScreen(pEntityNewPtOnScreen, newParentView.innerPanel) - - controller.entityAddMgr.transfer(action.entity, newParent, oldParent) - controller.boundsMgr.moveTo( - action.entity, - newParent, - (pNewNewComp.x / view.scaleFactor).toInt, - (pNewNewComp.y / view.scaleFactor).toInt, - false) - - case None => - val oldParentView = controller.viewMgr.view(oldParent) - val pEntityNewPtOnComp = UiPos.getCompCoordFromScreen(pEntityNewPtOnScreen, oldParentView.innerPanel) - controller.boundsMgr.moveTo( - action.entity, - oldParent, - (pEntityNewPtOnComp.x / view.scaleFactor).toInt, - (pEntityNewPtOnComp.y / view.scaleFactor).toInt, - true) - - } - - } - - } - - controller.triggerObservers(_.onModelModified(true)) - - } - - def handleMouseDragResizeEntity(mouseEvent: MouseEvent, action: MouseResizeAction) { - - val parent = controller.model.parentOf(action.entity).get - val view = controller.viewMgr.view(action.entity) - - controller.bulkOperation { - - val delta_unsigned = mousePos().onScreen - action.initPos.onScreen - val delta = new Dimension( - (delta_unsigned.x * action.resizePoint.xSign.toInt / view.scaleFactor).toInt, - (delta_unsigned.y * action.resizePoint.ySign.toInt / view.scaleFactor).toInt) - val newSize = action.entityInitBounds.getSize() + delta - - controller.boundsMgr.resizeTo( - action.entity, - action.entityInitBounds, - parent, - newSize.width, - newSize.height, - action.resizePoint) - - } - - controller.triggerObservers(_.onModelModified(true)) - - } - - def handleMouseSelectionBox(mouseEvent: MouseEvent, action: MouseSelectionBoxAction) { - - controller.bulkOperation { - - controller.viewMgr.getAllViews[Selectable]().filter(_.isHovered()).foreach(_.setHovered(false)) - - val hoverableChildren = action - .containerEntity - .firstLevelChildren() - .map(controller.viewMgr.view) - .filterOfType[Selectable]() - .asInstanceOf[Seq[AbstractView with Selectable]] - - hoverableChildren.foreach(_.setHovered(false)) - - val pOld = action.initPos.onComponent - val pNew = UiPos.getCompCoordFromScreen(mouseEvent.getLocationOnScreen(), action.initPos.component) - - val x0 = math.min(pOld.x, pNew.x) - val y0 = math.min(pOld.y, pNew.y) - - val x1 = math.max(pOld.x, pNew.x) - val y1 = math.max(pOld.y, pNew.y) - - val w = x1 - x0 - val h = y1 - y0 - - val selectionBox = new Rectangle(x0, y0, w, h) - - hoverableChildren - .filter(e => selectionBox.contains(e.midPt())) - .foreach(_.setHovered(true)) - - } - - controller.triggerObservers(_.onEntityModified(action.containerEntity)) - - } - - def finishSelectionBoxAction(action: MouseSelectionBoxAction) { - - controller.bulkOperation { - val selected = controller.viewMgr.getAllViews[Selectable]().filter(_.isSelected()) - val hovered = controller.viewMgr.getAllViews[Selectable]().filter(_.isHovered()) - if (hovered.nonEmpty) { - if (!controller.keyboardInputMgr.isControlDown()) - selected.foreach(_.setSelected(false)) - hovered.foreach(_.setHovered(false)) - hovered.foreach(_.setSelected(true)) - controller.triggerObservers(_.onSelectionChanged(selectedEntities(), selectedEntities().headOption)) - } - } - - controller.triggerObservers(_.onEntityModified(action.containerEntity)) - - } - - def finishMouseAction() { - if (isMouseDragActionActive()) { - if (mousePos.onScreen != lastMousePressPos.onScreen) { - mouseDragAction match { - case action: MouseMoveAction => finishMouseMoveAction(action) - case action: MouseResizeAction => finishMouseResizeAction(action) - case action: MousePanAction => finishMousePanAction(action) - case action: MouseSelectionBoxAction => finishSelectionBoxAction(action) - case action: MouseDragAttachSuperTypeAction => finishAttachSuperTypeAction(action) - case _ => - } - } - setMouseDragAction(NoMouseDragAction) - setCursor(_pendingNewCursor) - - } - } - - def finishMouseMoveAction(action: MouseMoveAction) { - controller.triggerObservers(_.onModelModified()) - } - - def finishMouseResizeAction(action: MouseResizeAction) { - controller.triggerObservers(_.onModelModified()) - } - - def finishMousePanAction(action: MousePanAction) { - - } - - def setCursor(c: Cursor) { - _pendingNewCursor = c - if (!isMouseDragActionActive && c != _cursor) { - _cursor = c - controller.viewMgr.setCursor(c) - } - } - - def isHoverInhibitActive(): Boolean = { - mouseDragAction().isInstanceOf[MouseSelectionBoxAction] - } - - def startMouseDragAttachSuperTypeAction(subType: CustomType, e: MouseEvent) { - if (!isMouseDragActionActive()) { - println("startMouseDragAttachSuperTypeAction") - val uiPos = new UiPos(e) - val action = new MouseDragAttachSuperTypeAction(uiPos, subType) - setMouseDragAction(action) - } - } - - def findDeepestCurrentlyScrollableViewAt(uiPos: UiPos): ScrollableView = { - var out = controller.viewMgr.rootView - val screenPos = uiPos.onScreen - controller.viewMgr.findDeepestEntityAt( - screenPos, - x => { - controller.viewMgr.view(x) match { - case x: ScrollableView => - if (x.scrollpane.getHorizontalScrollBar().isShowing() || x.scrollpane.getVerticalScrollBar().isShowing()) { - out = x - true - } else - false - case _ => - false - } - }, - x => controller.viewMgr.isVisible(x)) - out - } - - def startMousePanAction(e: MouseEvent) { - if (!isMouseDragActionActive()) { - val uiPos = new UiPos(e) - val view = findDeepestCurrentlyScrollableViewAt(uiPos) - val action = new MousePanAction( - uiPos, - view.scrollpane.getHorizontalScrollBar().getValue(), - view.scrollpane.getVerticalScrollBar().getValue(), - view) - if (view.screenBounds.contains(uiPos.onScreen)) { - setCursor(Cursor.MOVE_CURSOR) - setMouseDragAction(action) - setCursor(Cursor.DEFAULT_CURSOR) - } - } - } - - def startMouseDragCreateSubTypeAction(superType: CustomType, e: MouseEvent) { - if (!isMouseDragActionActive()) { - println("startMouseDragCreateSubTypeAction") - val uiPos = new UiPos(e) - val action = new MouseDragCreateSubTypeAction(uiPos, superType) - setMouseDragAction(action) - } - } - - def handleCreateSubTypeAction(mEvent: MouseEvent, selectionBoxAction: MouseDragCreateSubTypeAction) { - - val superType = selectionBoxAction.superType - val parent = controller.model.parentOf(selectionBoxAction.superType).get.asInstanceOf[Module] - - val e = EntityFactory.mkClass( - "NewType", - superType.x, - superType.y + superType.height, - superType.width, - superType.height) - - controller.model.attachSubType(e, superType) - controller.entityAddMgr.addType(e, parent) - - val singleEntityMove = - new MouseMoveEntity( - lastMousePressPos(), - controller.viewMgr.getUiPosOf(e), - e) - - setMouseDragAction(NoMouseDragAction) - setCursor(Cursor.MOVE_CURSOR) - - controller.select(e, true, false) - - setMouseDragAction(new MouseMoveAction(Seq(singleEntityMove))) - setCursor(Cursor.DEFAULT_CURSOR) - - } - - def handleAttachSuperTypeAction(mEvent: MouseEvent, attachSuperTypeAction: MouseDragAttachSuperTypeAction) { - - } - - def finishPanAction(action: MousePanAction) { - - } - - def finishAttachSuperTypeAction(attachSuperTypeAction: MouseDragAttachSuperTypeAction) { - - val subType = attachSuperTypeAction.subType - val hovered = controller.viewMgr.hoveredViews - - hovered.headOption match { - case Some(superView: ClassView) => - controller.changeSuperType(subType, superView.entity) - case _ => - } - - } - - def cancelMouseOperations() { - if (isMouseDragActionActive()) { - finishMouseAction() - controller.undoMgr.undo() - } - } - - def scaleByMouseWheel(mouseEvent: MouseWheelEvent): Boolean = { - if (controller.viewMgr.isInsideDashBoard(new UiPos(mouseEvent))) { - - // Check mouse pos before in view - val mousePos0 = new UiPos(mouseEvent) - val rootView = controller.viewMgr.rootView() - val scrollpane = rootView.scrollpane - val mousePosBefore = UiPos.getCompCoordFromScreen(mousePos0.onScreen, rootView.innerPanel) / controller.viewMgr.scaleFactor() - - // Perform the scaling - controller.viewMgr.offsetScaleFactorIndex(-math.signum(mouseEvent.getWheelRotation())) - - // Check mouse pos after - val mousePosAfter = UiPos.getCompCoordFromScreen(mousePos0.onScreen, rootView.innerPanel) / controller.viewMgr.scaleFactor() - val entityError = mousePosBefore - mousePosAfter - val scaledError = entityError * controller.viewMgr.scaleFactor() - val scrollx = scrollpane.getHorizontalScrollBar().getValue() - val scrolly = scrollpane.getVerticalScrollBar().getValue() - - // TODO: Check if we need to extend the view to support scrolling(!) - // TODO: Or how do we handle this? Should we move the cursor instead? - // wth ? ..... not sure how this should work! - - // Set the new scrollbar positions - scrollpane.getHorizontalScrollBar().setValue(scrollx + scaledError.x) - scrollpane.getVerticalScrollBar().setValue(scrolly + scaledError.y) - - false - } else { - true - } - } - - def handleMousePanAction(mouseEvent: MouseEvent, action: MousePanAction) { - - val delta = mouseEvent.getLocationOnScreen() - action.initPos.onScreen - - val newHbarPos = action.hBarInitValue - delta.x - val newVbarPos = action.vBarInitValue - delta.y - - val scrollpane = action.view.scrollpane - val hbar = scrollpane.getHorizontalScrollBar() - val vbar = scrollpane.getVerticalScrollBar() - - if (hbar.isShowing()) - hbar.setValue(newHbarPos) - - if (vbar.isShowing()) - vbar.setValue(newVbarPos) - - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SaveController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SaveController.scala deleted file mode 100644 index c57614aa..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SaveController.scala +++ /dev/null @@ -1,354 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.io.File - -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.mutable.HashMap -import scala.util.Failure -import scala.util.Success -import scala.util.Try - -import javax.swing.JFileChooser -import javax.swing.JFrame -import javax.swing.JOptionPane -import javax.swing.filechooser.FileNameExtensionFilter -import se.culvertsoft.mgen.compiler.components.LinkTypes -import se.culvertsoft.mgen.compiler.components.ParseProject -import se.culvertsoft.mgen.compiler.components.PluginLoader -import se.culvertsoft.mgen.compiler.util.FileUtils -import se.culvertsoft.mgen.idlgenerator.IdlGenerator -import se.culvertsoft.mgen.visualdesigner.ClassRegistry -import se.culvertsoft.mgen.visualdesigner.EntityFactory -import se.culvertsoft.mgen.visualdesigner.model.FilePath -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.ModelConversion -import se.culvertsoft.mgen.visualdesigner.model.Module - -class SaveController(controller: Controller, window: JFrame) extends SubController(controller) { - - val classRegistry = new ClassRegistry - - private var _currentSelectDirectory: Option[File] = None - private var _currentSaveFile: Option[File] = None - private var _currentSavedModel: Option[Model] = None - - val saveFileChooser = new JFileChooser(currentSaveLoadDir) - val loadFileChooser = new JFileChooser(currentSaveLoadDir) - val xmlFilter = new FileNameExtensionFilter(".xml (mgen compiler)", "xml") - saveFileChooser.setAcceptAllFileFilterUsed(false) - saveFileChooser.addChoosableFileFilter(xmlFilter) - loadFileChooser.setAcceptAllFileFilterUsed(false) - loadFileChooser.addChoosableFileFilter(xmlFilter) - saveFileChooser.setFileFilter(xmlFilter) - loadFileChooser.setFileFilter(xmlFilter) - - controller.addObserver(new ModelChangeListener() { - override def onModelModified(isPreview: Boolean) { - if (!controller.isBulkOperationActive) { - updateWindowTitle() - } - } - }) - - /** - * *********************************************************** - * - * - * METHODS - * - * ********************************************************** - */ - - def isFileType(file: File, ext: String): Boolean = { - file != null && file.getName().toLowerCase().endsWith(s".$ext") - } - - def isXmlFile(file: File): Boolean = { - isFileType(file, "xml") - } - - def isXmlFile(file: Option[File]): Boolean = { - file.map(isXmlFile).getOrElse(false) - } - - def appendExtension(file: File, filter: FileNameExtensionFilter): File = { - val ext = filter.getExtensions().head - if (file.getName().toLowerCase().endsWith(s".$ext")) { - file - } else { - new File(s"${file.getPath()}.$ext") - } - } - - def confirmOverwrite(): Boolean = { - - val saveQuestionReply = controller.viewMgr.showConfirmDialog( - "That file already exists, do you want to overwrite it?", - "Confirm overwrite", - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE) - - saveQuestionReply match { - case JOptionPane.YES_OPTION => true - case _ => false - } - } - - def saveAs(): Boolean = { - - saveFileChooser.setCurrentDirectory(currentSaveLoadDir) - - val returnVal = controller.viewMgr.showSaveDialog(saveFileChooser) - if (returnVal == JFileChooser.APPROVE_OPTION) { - - val filter = saveFileChooser.getFileFilter().asInstanceOf[FileNameExtensionFilter] - - val file = appendExtension(saveFileChooser.getSelectedFile(), filter) - if (file.exists() && !confirmOverwrite()) { - false - } else { - - resetSave() - _currentSaveFile = Some(file) - _currentSelectDirectory = Some(file) - - saveToCurrentFile() - - true - } - - } else { - println("User aborted save file selection") - false - } - } - - def getCurrentSaveFilePath(): String = { - _currentSaveFile match { - case Some(file) => file.getAbsolutePath() - case _ => "unsaved" - } - } - - def currentSaveLoadDir(): File = { - _currentSelectDirectory.getOrElse(null) - } - - def loadFromFile() { - - def loadFunc { - - loadFileChooser.setCurrentDirectory(currentSaveLoadDir) - - val returnVal = controller.viewMgr.showOpenDialog(loadFileChooser) - - if (returnVal == JFileChooser.APPROVE_OPTION) { - load(loadFileChooser.getSelectedFile()) - } else { - println("User aborted load file selection") - } - } - - if (isModified()) { - checkSaveBeforeContinue( - "Exit", - "Do you want to save your project before loading a new file?", - loadFunc) - - } else { - loadFunc - } - } - - def isModified(): Boolean = { - _currentSavedModel match { - case Some(model) => model != controller.model - case _ => true - } - } - - def load(file: File): Boolean = { - - _currentSelectDirectory = Some(file) - - println(s"Loading file: $file") - - val optLoadedModel = - if (isXmlFile(file)) { - tryLoadFromXml(file) - } else { - throw new RuntimeException(s"Tried to load unknown file type $file") - } - - optLoadedModel match { - - case Success(model) => - controller.setModel(model, true) - _currentSavedModel = Some(model.deepCopy()) - _currentSaveFile = Some(file) - - controller.viewMgr.configureViewOnLoadedNewFile() - println(s"Loaded project file file: $file") - - case Failure(failure) => - System.err.println(s"Could not load project file: $file") - failure.printStackTrace() - - } - - updateWindowTitle() - controller.triggerObservers(_.onNewModel()) - return true - } - - def save(): Boolean = { - _currentSaveFile match { - case Some(file) if (isModified()) => saveToCurrentFile() - case Some(file) => true - case None => saveAs() - } - } - - private def updateWindowTitle() { - if (!controller.isBulkOperationActive) { - window.setTitle("MGen Visual Designer: " + getCurrentSaveFilePath() + (if (isModified()) " * " else "")) - } - } - - private def saveToCurrentFile(): Boolean = { - - _currentSaveFile match { - case Some(file) if (isModified()) => - - val project = controller.model.project - val newAbsPath = file.getCanonicalPath() - val oldAbsPath = project.getFilePath().getAbsolute() - - println(s"Saving model to: $newAbsPath") - - if (!isXmlFile(file)) - throw new RuntimeException("Trying to save with unknown file extension") - - if (FileUtils.directoryOf(newAbsPath) != FileUtils.directoryOf(oldAbsPath)) { - - project.getFilePath().setWritten("").setAbsolute(newAbsPath) - - val saveDir = new FilePath("", FileUtils.directoryOf(newAbsPath)) - def setSaveDirOfModules(ms: Seq[Module]) { - for (m <- ms) { - setSaveDirOfModules(m.getSubmodules()) - m.setSaveDir(saveDir) - } - } - - setSaveDirOfModules(project.getModules()) - } - - val apiProject = ModelConversion.vd2Api(controller.model) - apiProject.setFilePath(file.getPath()) - apiProject.setAbsoluteFilePath(file.getCanonicalPath()) - - val sources = new IdlGenerator().generate(apiProject) - - FileUtils.writeIfChanged(sources) - - _currentSavedModel = Some(controller.model.deepCopy()) - updateWindowTitle() - - true - - case Some(file) => true - case None => false - } - - } - - def checkSaveBeforeContinue( - title: String, - message: String, - onContinue: => Unit = {}, - onCancel: => Unit = {}) { - - if (isModified()) { - - val saveQuestionReply = controller.viewMgr.showConfirmDialog( - message, - title, - JOptionPane.YES_NO_CANCEL_OPTION, - JOptionPane.QUESTION_MESSAGE) - - saveQuestionReply match { - case JOptionPane.YES_OPTION => { if (save) onContinue } - case JOptionPane.NO_OPTION => onContinue - case _ => onCancel - } - - } else { - onContinue - } - - } - - def resetSave() { - _currentSaveFile = None - _currentSavedModel = None - } - - def startNewProject() { - checkSaveBeforeContinue( - "Confirm new project", - "Do you want to save your changes before starting a new project?", - forceStartNewProject()) - } - - def forceStartNewProject() { - resetSave() - controller.setModel(EntityFactory.mkModel(), true) - controller.triggerObservers(_.onNewModel()) - } - - def closeApplication() { - - if (isModified()) { - - checkSaveBeforeContinue( - "Exit", - "Do you want to save your project before exiting?", - System.exit(0)) - - } else if (controller.viewMgr.showConfirmDialog( - "Are you sure you want to exit?", - "Exit", - JOptionPane.YES_NO_OPTION, - JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) { - System.exit(0) - } - } - - private def tryLoadFromXml(file: File): Try[Model] = { - - Try { - - val settings = new HashMap[String, String] - settings.put("project", file.getPath()) - - val pluginFinder = new PluginLoader(Nil, true) - val project = ParseProject(settings.toMap, pluginFinder) - LinkTypes(project) - - println(s"Loading xml project: ${project.name}") - - import scala.collection.JavaConversions.asScalaBuffer - if (project.dependencies.nonEmpty) { - System.err.println("WARNING: Project contains dependencies. This feature is not yet supported by MGenVisualDesigner.") - } - - println(s"Converting xml project to MGenVisualDesigner format") - - ModelConversion.api2Vd(project) - - } - - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SettingsController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SettingsController.scala deleted file mode 100644 index 70fa6c7c..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SettingsController.scala +++ /dev/null @@ -1,18 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.util.ArrayList - -import scala.collection.JavaConversions.seqAsJavaList - -import se.culvertsoft.mgen.visualdesigner.model.Generator - -class SettingsController(controller: Controller) extends SubController(controller) { - - def getGenerators() = controller.model.project.getGenerators() - - def setGenerators(generators: Seq[Generator]) { - controller.model.project.setGenerators(new ArrayList(generators)) - controller.triggerObservers(_.onModelModified()) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SubController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SubController.scala deleted file mode 100644 index e567731d..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/SubController.scala +++ /dev/null @@ -1,5 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -abstract class SubController(controller: Controller) { - def selectedEntities() = controller.selectedEntities() -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UiPos.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UiPos.scala deleted file mode 100644 index 8de99b0b..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UiPos.scala +++ /dev/null @@ -1,75 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import java.awt.Component -import java.awt.Container -import java.awt.Point -import java.awt.Rectangle -import java.awt.event.MouseEvent - -import javax.swing.SwingUtilities - -object UiPos { - - def getScreenCoordFromComp(p: Point, c: Component): Point = { - val pc = new Point(p) - SwingUtilities.convertPointToScreen(pc, c) - pc - } - - def getCompCoordFromScreen(p: Point, c: Component): Point = { - val pc = new Point(p) - SwingUtilities.convertPointFromScreen(pc, c) - pc - } - - def getCompCoordFromCompCord(p: Point, src: Component, tgt: Component): Point = { - SwingUtilities.convertPoint(src, p.x, p.y, tgt) - } - - def getCompBoundsFromScreen(b: Rectangle, c: Component): Rectangle = { - val p = getCompCoordFromScreen(b.getLocation(), c) - new Rectangle(p.x, p.y, b.width, b.height) - } - - def getScreenBoundsFromComp(b: Rectangle, c: Component): Rectangle = { - val p = getScreenCoordFromComp(b.getLocation(), c) - new Rectangle(p.x, p.y, b.width, b.height) - } - - def getCompBoundsFromCompBounds(b: Rectangle, src: Component, tgt: Component): Rectangle = { - val p = getCompCoordFromCompCord(b.getLocation(), src, tgt) - new Rectangle(p.x, p.y, b.width, b.height) - } - - def getScreenBoundsOfComp(c: Component): Rectangle = { - getScreenBoundsFromComp(c.getBounds(), c.getParent()) - } - - def getScreenPosOf(e: MouseEvent): Point = { - if (e.getSource().asInstanceOf[Component].getParent() != null) { - e.getLocationOnScreen() - } else { - getScreenCoordFromComp(e.getPoint(), e.getSource().asInstanceOf[Component]) - } - } - -} - -case class UiPos( - val onScreen: Point, - val onComponent: Point, - val component: Component) { - - def this(e: MouseEvent) = this( - UiPos.getScreenPosOf(e), - e.getPoint(), - e.getSource().asInstanceOf[Component]) - - def this(pOnComp: Point, comp: Component) = this( - UiPos.getScreenCoordFromComp(pOnComp, comp), - pOnComp, - comp) - - def this() = this(new Point(), new Point(), null) - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoBuffer.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoBuffer.scala deleted file mode 100644 index cec73adc..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoBuffer.scala +++ /dev/null @@ -1,79 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import scala.collection.mutable.Stack - -class UndoBuffer[T](_state0: T, sizer: T => Int) { - - private val prevStates = new Stack[T] - private val futureStates = new Stack[T] - prevStates.push(_state0) - - def pushState(state: T, allowDuplicate: Boolean) { - if (allowDuplicate || prevStates.head != state) { - futureStates.clear() - prevStates.push(state) - } - } - - def optPrevious(): Option[T] = { - prevStates.headOption - } - - def optFuture(): Option[T] = { - futureStates.headOption - } - - def goBack(current: T): Option[T] = { - - while (prevStates.nonEmpty) { - - val isLast = prevStates.size == 1 - val move = if (isLast) prevStates.head else prevStates.pop() - - if (futureStates.isEmpty || futureStates.head != move) { - futureStates.push(move) - } - - if (move != current) { - return Some(move) - } - - if (isLast) - return None - - } - - return None - } - - def goForward(current: T): Option[T] = { - - while (futureStates.nonEmpty) { - val move = futureStates.pop() - if (prevStates.isEmpty || prevStates.head != move) { - prevStates.push(move) - } - if (move != current) { - return Some(move) - } - } - - return None - - } - - def size(): Int = { - prevStates.map(sizer(_)).sum - } - - def dropLast() { - prevStates.dropRight(1) - } - - def clear(_state0: T) { - futureStates.clear() - prevStates.clear() - prevStates.push(_state0) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoController.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoController.scala deleted file mode 100644 index 6deec620..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/control/UndoController.scala +++ /dev/null @@ -1,107 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.control - -import se.culvertsoft.mgen.visualdesigner.model.Model - -class UndoController(controller: Controller) extends SubController(controller) { - - private val undoBuffer = new UndoBuffer[Model](controller.model.deepCopy, _ => 1000) - private var _undoing = false - - resetUndoBuffer() - - controller.addObserver(new ModelChangeListener() { - override def onModelModified(isPreview: Boolean) { - if (!controller.isBulkOperationActive && !isPreview) { - updateUndoBuffer() - } - } - }) - - private def undoing(f: => Unit) { - _undoing = true - try { - f - } finally { - _undoing = false - } - } - - private def updateUndoBuffer() { - - if (!controller.isBulkOperationActive && !isUndoing) { - - val state = controller.model() - val previous = undoBuffer.optPrevious - val future = undoBuffer.optFuture - - if (previous.isDefined && previous.get == state) { - return - } - - /* if (future.isDefined && future.get == state) { - return - }*/ - - undoBuffer.pushState(state.deepCopy(), true) - - } - - } - - def isUndoing(): Boolean = { - _undoing - } - - def undo(prevAttemptState: Model = null) { - - undoing { - - controller.viewMgr.keepScrollbarPos { - - undoBuffer.goBack(controller.model) match { - case Some(prevState) => - val prevModel = prevState - if (prevModel.project != controller.model.project) { - controller.setModel(prevModel.deepCopy(), false) - } else { - if (!(prevState eq prevAttemptState)) - undo(prevState) - } - case _ => - } - - } - - } - - } - - def redo() { - - undoing { - - controller.viewMgr.keepScrollbarPos { - - undoBuffer.goForward(controller.model) match { - case Some(prevState) => - val prevModel = prevState - if (prevModel.project != controller.model.project) { - controller.setModel(prevModel.deepCopy(), false) - } else { - redo() - } - case _ => - } - - } - - } - - } - - def resetUndoBuffer() { - undoBuffer.clear(controller.model.deepCopy) - updateUndoBuffer() - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/images/MkImgIcon.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/images/MkImgIcon.scala deleted file mode 100644 index 8675586e..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/images/MkImgIcon.scala +++ /dev/null @@ -1,33 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.images - -import javax.swing.ImageIcon - -object MkImgIcon { - - val imgPath = "/se/culvertsoft/mgen/visualdesigner/images/" - - def native(path: String): ImageIcon = { - new ImageIcon(classOf[MkImgIcon].getResource(imgPath + path)) - } - - def small(path: String): ImageIcon = { - val img = native(path).getImage(); - val newimg = img.getScaledInstance(10, 10, java.awt.Image.SCALE_SMOOTH); - new ImageIcon(newimg); - } - - def large(path: String): ImageIcon = { - val img = native(path).getImage(); - val newimg = img.getScaledInstance(20, 20, java.awt.Image.SCALE_SMOOTH); - new ImageIcon(newimg); - } - - def huge(path: String): ImageIcon = { - val img = native(path).getImage(); - val newimg = img.getScaledInstance(40, 40, java.awt.Image.SCALE_SMOOTH); - new ImageIcon(newimg); - } - -} - -abstract class MkImgIcon diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2Vd.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2Vd.scala deleted file mode 100644 index 1d769712..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2Vd.scala +++ /dev/null @@ -1,308 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.model - -import scala.collection.JavaConversions.asJavaCollection -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.mutable.LinkedHashMap - -import ModelConversion.ApiArrayType -import ModelConversion.ApiBoolType -import ModelConversion.ApiCustomType -import ModelConversion.ApiEnumEntry -import ModelConversion.ApiEnumType -import ModelConversion.ApiField -import ModelConversion.ApiFloat32Type -import ModelConversion.ApiFloat64Type -import ModelConversion.ApiGenerator -import ModelConversion.ApiInt16Type -import ModelConversion.ApiInt32Type -import ModelConversion.ApiInt64Type -import ModelConversion.ApiInt8Type -import ModelConversion.ApiListType -import ModelConversion.ApiMapType -import ModelConversion.ApiModule -import ModelConversion.ApiProject -import ModelConversion.ApiStringType -import ModelConversion.VdClass -import ModelConversion.VdEntity -import ModelConversion.VdEnum -import ModelConversion.VdEnumEntry -import ModelConversion.VdField -import ModelConversion.VdGenerator -import ModelConversion.VdModule -import ModelConversion.VdProject -import se.culvertsoft.mgen.api.model.Type -import se.culvertsoft.mgen.compiler.util.FileUtils -import se.culvertsoft.mgen.idlgenerator.util.IdlGenUtil -import se.culvertsoft.mgen.visualdesigner.EntityFactory -import se.culvertsoft.mgen.visualdesigner.util.LayOutEntities - -case class UnlinkedId(val apiType: ModelConversion.ApiUserDefinedType) extends EntityId - -object Api2Vd { - import ModelConversion._ - - def apply(apiProject: ApiProject): Model = { - val state = new Api2VdConversionState - val out = new Model(cvtProject(apiProject, None, state)) - out.updateCache() - - linkTypes(state, out, apiProject) - - LayOutEntities(out.project, out, true) - - out - } - - def toJava[T](seq: Iterable[T]) = new java.util.ArrayList(seq) - - def toJava[K, V](map: java.util.Map[K, V]) = new java.util.HashMap[K, V](map) - - def cvtProject(apiProject: ApiProject, parent: Option[VdProject], state: Api2VdConversionState): VdProject = { - - state.converted(apiProject) match { - case Some(done) => - done - - case _ => - - val vdProject = EntityFactory.mkProject(apiProject.name, getFilePath(apiProject)) - state.markConverted(apiProject, vdProject) - - parent.foreach { parent => - vdProject.setParent(parent.getId()) - parent.getDependencies().add(vdProject) - } - - // Set FilePath - vdProject.setFilePath(getFilePath(apiProject)) - - // Convert settings - vdProject.setSettings(toJava(apiProject.settings)) - - // Convert generators - vdProject.setGenerators(toJava(apiProject.generators().map(cvtGenerator))) - - // Convert dependencies - vdProject.setDependencies(toJava(apiProject.dependencies.map(cvtProject(_, Some(vdProject), state)))) - - // Convert Modules - vdProject.setModules(toJava(apiProject.modules().map(cvtModule(_, vdProject, state)))) - - // Split modules - splitModules(vdProject, state) - - vdProject - - } - - } - - /** - * What this does is that it splits the single api style full.module.name - * into vd modules (grandparent, parent, child). - */ - def splitModules(project: VdProject, state: Api2VdConversionState) { - - val writtenFilePath = project.getFilePath().getWritten() - val absoluteFilePath = project.getFilePath().getAbsolute() - - if (state.isModuleSplitDone(project)) - return - state.markProjectModulesSplitDone(project) - - def splitModules(source: Seq[VdModule]): java.util.ArrayList[VdModule] = { - - // Storage for this level - val lkUp = new LinkedHashMap[String, VdModule] - - val writtenDir = FileUtils.directoryOf(writtenFilePath).trim() - val absoluteDir = FileUtils.directoryOf(absoluteFilePath).trim() - - // Merge this level - for (m <- source.sortBy(_.getName)) { - - val moduleNameParts = m.getName().split('.') - val part0 = moduleNameParts(0) - - if (moduleNameParts.size == 1) { - - lkUp.put(part0, m) - - } else { - - val parent = lkUp.getOrElseUpdate(part0, EntityFactory.mkModule(part0, m.getSaveDir)) - m.setName(m.getName.substring(parent.getName.length + 1)) - parent.getSubmodules().add(m) - m.setParent(parent.getId()) - } - } - - // Merge the next level - for (m <- lkUp.values) { - m.setSubmodules(splitModules(m.getSubmodules())) - } - - toJava(lkUp.values) - } - - def mergeProjectModules(project: VdProject) { - project.setModules(splitModules(project.getModules)) - } - - // Start top down, with dependencies first - project.getDependencies foreach mergeProjectModules - mergeProjectModules(project) - - } - - def cvtModule(apiModule: ApiModule, parent: VdEntity, state: Api2VdConversionState): VdModule = { - - state.converted(apiModule) match { - case Some(done) => - done - - case _ => - val vdModule = EntityFactory.mkModule(apiModule.path, getSaveDir(apiModule)) - state.markConverted(apiModule, vdModule) - - vdModule.setParent(parent.getId) - parent match { - case p: VdProject => p.getModules().add(vdModule) - case m: VdModule => m.getSubmodules().add(vdModule) - } - vdModule.setSaveDir(getSaveDir(apiModule)) - vdModule.setSettings(toJava(apiModule.settings())) - vdModule.setTypes(toJava(apiModule.classes.map(cvtClass(_, vdModule, state)))) - vdModule.setEnums(toJava(apiModule.enums.map(cvtEnum(_, vdModule, state)))) - vdModule - } - } - - def cvtEnum(apiEnum: ApiEnumType, module: VdModule, state: Api2VdConversionState): VdEnum = { - val vdEnum = EntityFactory.mkEnum(apiEnum.shortName) - state.markConverted(apiEnum, vdEnum) - - vdEnum.setEntries(toJava(apiEnum.entries.map(cvtEnumEntry(_, vdEnum, state)))) - - module.getEnums().add(vdEnum) - vdEnum.setParent(module.getId) - - vdEnum - } - - def cvtEnumEntry(apiEnumEntry: ApiEnumEntry, parent: VdEnum, state: Api2VdConversionState): VdEnumEntry = { - val const = if (apiEnumEntry.constant != null && apiEnumEntry.constant.trim.nonEmpty) apiEnumEntry.constant else null - val entry = EntityFactory.mkEnumEntry(apiEnumEntry.name, const) - entry.setParent(parent.getId) - entry - } - - def cvtClass(apiClass: ApiCustomType, parent: VdModule, state: Api2VdConversionState): VdClass = { - val cls = EntityFactory.mkClass(apiClass.shortName) - state.markConverted(apiClass, cls) - - if (apiClass.hasSuperType) { - cls.setSuperType(new UnlinkedId(apiClass.superType.asInstanceOf[ApiCustomType])) - state.addUnlinked(cls) - } - - parent.getTypes().add(cls) - cls.setParent(parent.getId) - - cls.setFields(toJava(apiClass.fields().map(cvtField(_, cls, state)))) - - cls.setId16Bit(apiClass.typeId16Bit()) - - cls - } - - def cvtField(apiField: ApiField, parent: VdClass, state: Api2VdConversionState): VdField = { - val fld = EntityFactory.mkField(apiField.name) - fld.setFlags(toJava(apiField.flags())) - fld.setParent(parent.getId) - parent.getFields().add(fld) - fld.setType(cvtFieldType(apiField, state)) - fld.setId16Bit(apiField.id()) - fld.setDefaultValue(IdlGenUtil.defaultVal2String(apiField.defaultValue)) - fld - } - - def cvtGenerator(apiGenerator: ApiGenerator): VdGenerator = { - val out = new VdGenerator - out.setClassRegistryPath(apiGenerator.getGeneratorSettings().get("classregistry_path")) - out.setGeneratorClassName(apiGenerator.getGeneratorClassPath()) - out.setGeneratorJarFileFolder("") // TODO: No such field? - out.setName(apiGenerator.getGeneratorName()) - out.setOutputFolder(apiGenerator.getGeneratorSettings().get("output_path")) - val settings = new java.util.HashMap[String, String] - settings.putAll(apiGenerator.getGeneratorSettings()) - settings.remove("class_path") - settings.remove("output_path") - settings.remove("classregistry_path") - out.setSettings(settings) - out - } - - def cvtFieldType(apiField: ApiField, state: Api2VdConversionState): FieldType = { - def cv(t: Type): FieldType = { - t match { - case t: ApiBoolType => new BoolType - case t: ApiInt8Type => new Int8Type - case t: ApiInt16Type => new Int16Type - case t: ApiInt32Type => new Int32Type - case t: ApiInt64Type => new Int64Type - case t: ApiFloat32Type => new Float32Type - case t: ApiFloat64Type => new Float64Type - case t: ApiStringType => new StringType - case t: ApiListType => new ListType(cv(t.elementType)) - case t: ApiArrayType => new ArrayType(cv(t.elementType)) - case t: ApiMapType => new MapType(cv(t.keyType).asInstanceOf[SimpleType], cv(t.valueType)) - case t: ApiCustomType => - val fld = new UserTypeRef(new UnlinkedId(t)) - state.addUnlinked(fld) - fld - case t: ApiEnumType => - val fld = new UserTypeRef(new UnlinkedId(t)) - state.addUnlinked(fld) - fld - } - } - cv(apiField.typ) - } - - def linkTypes(state: Api2VdConversionState, model: Model, apiProject: ApiProject) { - - for (c <- state.unlinkedClasses) { - c match { - case c: VdClass => - val id = c.getSuperType().asInstanceOf[UnlinkedId] - val superType = state.getLinked(id.apiType).asInstanceOf[VdClass] - superType.getSubTypes().add(c.getId()) - c.setSuperType(superType.getId) - case c: VdEnum => // Doesn't have unlinked children - } - } - - for (f <- state.unlinkedFieldTypes) { - val id = f.getId().asInstanceOf[UnlinkedId] - f.setId(state.getLinked(id.apiType).getId) - } - - } - - def getFilePath(apiProject: ApiProject): FilePath = { - new FilePath(apiProject.filePath(), apiProject.absoluteFilePath()) - } - - def getSaveDir(apiModule: ApiModule): FilePath = { - new FilePath(FileUtils.directoryOf(apiModule.filePath()), FileUtils.directoryOf(apiModule.absoluteFilePath())) - } - - private def extractSaveDir(apiModule: ApiModule): FilePath = { - val absoluteDir = FileUtils.directoryOf(apiModule.absoluteFilePath) - val nToDrop = apiModule.absoluteFilePath.length - absoluteDir.length - val writtenDir = apiModule.filePath.dropRight(nToDrop) - new FilePath(writtenDir, absoluteDir) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2VdConversionState.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2VdConversionState.scala deleted file mode 100644 index 6f7d5003..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Api2VdConversionState.scala +++ /dev/null @@ -1,76 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.model - -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashMap -import scala.collection.mutable.HashSet - -import ModelConversion.ApiModule -import ModelConversion.ApiProject -import ModelConversion.ApiUserDefinedType -import ModelConversion.VdModule -import ModelConversion.VdProject -import ModelConversion.VdUserDefinedType - -class Api2VdConversionState { - - private val projects = new HashMap[String, VdProject] // absoluteFilePath->Project - private val modules = new HashMap[String, VdModule] // absoluteFilePath->Module - private val types = new HashMap[ApiUserDefinedType, VdUserDefinedType] - private val projectsSplitDone = new HashSet[String] // absoluteFilePath - - private val _unlinkedFieldTypes = new ArrayBuffer[UserTypeRef] - private val _unlinkedTypes = new ArrayBuffer[VdUserDefinedType] - - def converted(apiProject: ApiProject): Option[VdProject] = { - projects.get(apiProject.absoluteFilePath) - } - - def converted(apiModule: ApiModule): Option[VdModule] = { - modules.get(apiModule.absoluteFilePath) - } - - def converted(apiType: ApiUserDefinedType): Option[VdUserDefinedType] = { - types.get(apiType) - } - - def markConverted(apiProject: ApiProject, vdProject: VdProject) { - projects.put(apiProject.absoluteFilePath, vdProject) - } - - def markConverted(apiModule: ApiModule, vdModule: VdModule) { - modules.put(apiModule.absoluteFilePath, vdModule) - } - - def markConverted(apiType: ApiUserDefinedType, vdType: VdUserDefinedType) { - types.put(apiType, vdType) - } - - def isModuleSplitDone(p: VdProject): Boolean = { - projectsSplitDone.contains(p.getFilePath.getAbsolute) - } - - def markProjectModulesSplitDone(p: VdProject) { - projectsSplitDone += p.getFilePath.getAbsolute - } - - def getLinked(apiType: ApiUserDefinedType): VdUserDefinedType = { - types.get(apiType).getOrElse(throw new RuntimeException(s"Could not convert ${apiType.shortName}")) - } - - def addUnlinked(t: UserTypeRef) { - _unlinkedFieldTypes += t - } - - def addUnlinked(c: VdUserDefinedType) { - _unlinkedTypes += c - } - - def unlinkedFieldTypes() = { - _unlinkedFieldTypes - } - - def unlinkedClasses() = { - _unlinkedTypes - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Model.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Model.scala deleted file mode 100644 index e605f06b..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Model.scala +++ /dev/null @@ -1,360 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.model - -import java.util.ArrayList -import scala.annotation.tailrec -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashMap -import scala.reflect.ClassTag -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import scala.collection.mutable.HashSet - -class Model(val project: Project) { - - private val cache = new java.util.HashMap[EntityIdBase, Entity] - - def traverse(f: ChildParent => Boolean) = { - project.traverse(f) - } - - def foreach[A](f: ChildParent => A) = { - traverse { cp => - f(cp) - true - } - } - - def findFirst(f: ChildParent => Boolean): Option[ChildParent] = { - foreach { x => - if (f(x)) { - return Some(x) - } - } - return None - } - - def findLast(f: ChildParent => Boolean): Option[ChildParent] = { - var out: Option[ChildParent] = None - foreach { cp => - if (f(cp)) { - out = Some(cp) - } - } - out - } - - def findEach(f: ChildParent => Boolean): Seq[ChildParent] = { - val out = new ArrayBuffer[ChildParent] - foreach { cp => - if (f(cp)) { - out += cp - } - } - out - } - - def findEach[T <: Entity: ClassTag](f: T => Boolean = { t: T => true }): Seq[T] = { - val out = new ArrayBuffer[T] - foreach(_.child match { - case c: T if (f(c)) => out += c - case _ => - }) - out - } - - def clearCaches() { - cache.clear() - } - - override def equals(x: Any): Boolean = { - if (x == null) return false - if (!(x.getClass() == classOf[Model])) return false - if (x.asInstanceOf[Model] eq this) return true - val otherModel = x.asInstanceOf[Model] - return project == otherModel.project - } - - def getEntity(id: EntityIdBase): Option[Entity] = { - - val cached = cache.get(id) - - if (cached != null) { - return Some(cached) - } else { - findFirst(_.child.getId() == id) match { - case Some(cp) => - cache.put(id, cp.child) - Some(cp.child) - case _ => - None - } - } - - } - - def getUserType(id: EntityIdBase): Option[UserDefinedType] = { - getEntity(id) match { - case x @ Some(e: UserDefinedType) => x.map(_.asInstanceOf[UserDefinedType]) - case _ => None - } - } - - def parentOf(entity: Entity): Option[Entity] = { - if (entity.hasParent()) { - getEntity(entity.getParent()) - } else { - None - } - } - - def parentOf(id: EntityIdBase): Option[Entity] = { - getEntity(id).flatMap(parentOf) - } - - def superTypeOf(entity: CustomType): Option[CustomType] = { - if (entity.hasSuperType()) { - getEntity(entity.getSuperType()).map(_.asInstanceOf[CustomType]) - } else { - None - } - } - - def superTypeOf(entityId: EntityIdBase): Option[CustomType] = { - getEntity(entityId) match { - case Some(entity: CustomType) => superTypeOf(entity) - case _ => None - } - } - - def subtypesOf(entity: CustomType): Seq[CustomType] = { - if (entity.hasSubTypes()) { - entity - .getSubTypes() - .flatMap(getEntity) - .map(_.asInstanceOf[CustomType]) - } else { - Nil - } - } - - def isRootProject(entity: Entity): Boolean = { - entity eq project - } - - @tailrec - final def exists(entity: Entity): Boolean = { - if (isRootProject(entity)) { - true - } else { - parentOf(entity) match { - case None => false - case Some(parent) => exists(parent) - } - } - } - - def exists(id: EntityIdBase): Boolean = { - getEntity(id).map(exists).getOrElse(false) - } - - def removeFromCache(id: EntityIdBase) { - cache.remove(id) - } - - def removeFromCache(entity: Entity) { - removeFromCache(entity.getId()) - } - - def deepCopy(): Model = { - new Model(project.deepCopy()) - } - - final def superTypesOf(subType: CustomType): List[CustomType] = { - superTypeOf(subType) match { - case Some(superType) => superType :: superTypesOf(superType) - case _ => Nil - } - } - - @tailrec - final def foreachParentOf(typeId: EntityIdBase)(f: Entity => Unit) { - parentOf(typeId) match { - case Some(parent) => - f(parent) - foreachParentOf(parent.getId())(f) - case _ => - } - } - - @tailrec - final def foreachSuperTypeOf(subTypeId: EntityIdBase)(f: CustomType => Unit) { - superTypeOf(subTypeId) match { - case Some(superType) => - f(superType) - if (superType.hasSuperType()) { - foreachSuperTypeOf(superType.getId())(f) - } - case _ => Nil - } - } - - def isInheritanceAllowed(subTypeId: EntityIdBase, superTypeId: EntityIdBase): Boolean = { - if (subTypeId == superTypeId) - return false - foreachSuperTypeOf(superTypeId) { t => - if (t.getId() == subTypeId || t.getId() == superTypeId) { - return false - } - } - return true - } - - def attachSubType(subType: CustomType, superType: CustomType) { - - // Ensure subtype is not already in this chain - if (!isInheritanceAllowed(subType.getId(), superType.getId())) { - throw new RuntimeException(s"Illegal inheritance (self inheritance): Cannot set supertype of ${subType.getName()} to ${superType.getName()}") - } - - detachSuperTypeOf(subType) - - subType.setSuperType(superType.getId()) - if (!superType.hasSubTypes()) - superType.setSubTypes(new ArrayList) - superType.getSubTypes().add(subType.getId()) - } - - def detachSubType(subType: CustomType, superType: CustomType) { - subType.unsetSuperType() - if (superType.hasSubTypes()) - superType.getSubTypes().remove(subType.getId()) - } - - def detachSuperTypeOf(subType: CustomType) { - if (subType.hasSuperType()) { - for (superType <- getEntity(subType.getSuperType())) { - detachSubType(subType, superType.asInstanceOf[CustomType]) - } - } - } - - def detachSubTypesOf(superType: CustomType) { - if (superType.hasSubTypes()) { - for (subTypeId <- superType.getSubTypes().reverse) { - for (subType <- getEntity(subTypeId)) { - detachSubType(subType.asInstanceOf[CustomType], superType) - } - } - } - } - - def attachParent(child: Entity, parent: Entity) { - - detachParentOf(child) - - child.setParent(parent.getId()) - if (!parent.firstLevelChildren().contains(child)) { - parent.add(child) - } - } - - def detachParent(child: Entity, parent: Entity) { - child.unsetParent() - parent.remove(child) - } - - def detachParentOf(child: Entity) { - if (child.hasParent()) { - getEntity(child.getParent()) foreach { parent => - detachParent(child, parent) - } - } - } - - def updateCache() { - cache.clear() - - // Add all of this project - foreach { cp => - cache.put(cp.child.getId(), cp.child) - } - - } - - private def foreachReferencedUserType[A](t: FieldType)(f: UserDefinedType => A) { - def foreachReferencedUserType(fieldType: FieldType) { - fieldType match { - case fieldType: UserTypeRef => - getUserType(fieldType.getId()) foreach f - case fieldType: GenericType => - fieldType match { - case fieldType: ListOrArrayType => - foreachReferencedUserType(fieldType.getElementType()) - case fieldType: MapType => - foreachReferencedUserType(fieldType.getKeyType()) - foreachReferencedUserType(fieldType.getValueType()) - } - case _ => - } - } - foreachReferencedUserType(t) - } - - private def isChildClass( - potentialChild: UserDefinedType, - potentialParent: Entity): Boolean = { - - foreachParentOf(potentialChild.getId()) { parent => - if (parent.getId() == potentialParent.getId()) { - return true - } - } - return false - } - - def foreachReferencedUserType[A](from: CustomTypeField)(f: UserDefinedType => A) { - foreachReferencedUserType(from.getType())(f) - } - - def foreachReferencedUserType[A](t: CustomType)(f: UserDefinedType => A) { - - val superType = if (t.hasSuperType()) new UserTypeRef(t.getSuperType()) else null - val subTypes = if (t.hasSubTypes()) t.getSubTypes().map(id => new UserTypeRef(id)) else null - val fields = if (t.hasFields()) t.getFields().map(_.getType()) else null - - if (superType != null) { - foreachReferencedUserType(superType)(f) - } - - if (subTypes != null) { - for (subType <- subTypes) { - foreachReferencedUserType(subType)(f) - } - } - - if (fields != null) { - for (field <- fields) { - foreachReferencedUserType(field)(f) - } - } - - } - - def existsReference(from: FieldType, to: Entity): Boolean = { - foreachReferencedUserType(from) { c => - if (c.getId() == to.getId() || isChildClass(c, to)) { - return true - } - } - return false - } - - def existsReference(from: EntityIdBase, to: Entity): Boolean = { - getEntity(from) match { - case Some(t: UserDefinedType) => existsReference(new UserTypeRef(from), to) - case None => false - case _ => ??? - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelConversion.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelConversion.scala deleted file mode 100644 index 9849f373..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelConversion.scala +++ /dev/null @@ -1,73 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.model - -object ModelConversion { - - type ApiEntity = Object - type ApiProject = se.culvertsoft.mgen.api.model.Project - type ApiModule = se.culvertsoft.mgen.api.model.Module - type ApiClass = se.culvertsoft.mgen.api.model.ClassType - type ApiField = se.culvertsoft.mgen.api.model.Field - type ApiGenerator = se.culvertsoft.mgen.api.model.GeneratorDescriptor - type ApiUserDefinedType = se.culvertsoft.mgen.api.model.UserDefinedType - type ApiType = se.culvertsoft.mgen.api.model.Type - type ApiEnum = se.culvertsoft.mgen.api.model.EnumType - type ApiEnumEntry = se.culvertsoft.mgen.api.model.EnumEntry - - type VdModel = se.culvertsoft.mgen.visualdesigner.model.Model - type VdEntity = se.culvertsoft.mgen.visualdesigner.model.Entity - type VdProject = se.culvertsoft.mgen.visualdesigner.model.Project - type VdModule = se.culvertsoft.mgen.visualdesigner.model.Module - type VdClass = se.culvertsoft.mgen.visualdesigner.model.CustomType - type VdField = se.culvertsoft.mgen.visualdesigner.model.CustomTypeField - type VdFieldType = se.culvertsoft.mgen.visualdesigner.model.FieldType - type VdGenerator = se.culvertsoft.mgen.visualdesigner.model.Generator - type VdEnum = se.culvertsoft.mgen.visualdesigner.model.EnumType - type VdEnumEntry = se.culvertsoft.mgen.visualdesigner.model.EnumEntry - type VdUserDefinedType = se.culvertsoft.mgen.visualdesigner.model.UserDefinedType - - type VdEnumType = se.culvertsoft.mgen.visualdesigner.model.EnumType - type VdBoolType = se.culvertsoft.mgen.visualdesigner.model.BoolType - type VdInt8Type = se.culvertsoft.mgen.visualdesigner.model.Int8Type - type VdInt16Type = se.culvertsoft.mgen.visualdesigner.model.Int16Type - type VdInt32Type = se.culvertsoft.mgen.visualdesigner.model.Int32Type - type VdInt64Type = se.culvertsoft.mgen.visualdesigner.model.Int64Type - type VdFloat32Type = se.culvertsoft.mgen.visualdesigner.model.Float32Type - type VdFloat64Type = se.culvertsoft.mgen.visualdesigner.model.Float64Type - type VdStringType = se.culvertsoft.mgen.visualdesigner.model.StringType - type VdListType = se.culvertsoft.mgen.visualdesigner.model.ListType - type VdArrayType = se.culvertsoft.mgen.visualdesigner.model.ArrayType - type VdMapType = se.culvertsoft.mgen.visualdesigner.model.MapType - type VdUserTypeRef = se.culvertsoft.mgen.visualdesigner.model.UserTypeRef - - type ApiEnumType = se.culvertsoft.mgen.api.model.EnumType - type ApiBoolType = se.culvertsoft.mgen.api.model.BoolType - type ApiInt8Type = se.culvertsoft.mgen.api.model.Int8Type - type ApiInt16Type = se.culvertsoft.mgen.api.model.Int16Type - type ApiInt32Type = se.culvertsoft.mgen.api.model.Int32Type - type ApiInt64Type = se.culvertsoft.mgen.api.model.Int64Type - type ApiFloat32Type = se.culvertsoft.mgen.api.model.Float32Type - type ApiFloat64Type = se.culvertsoft.mgen.api.model.Float64Type - type ApiStringType = se.culvertsoft.mgen.api.model.StringType - type ApiListType = se.culvertsoft.mgen.api.model.ListType - type ApiArrayType = se.culvertsoft.mgen.api.model.ArrayType - type ApiMapType = se.culvertsoft.mgen.api.model.MapType - type ApiCustomType = se.culvertsoft.mgen.api.model.ClassType - - val ApiBoolTypeInstance = se.culvertsoft.mgen.api.model.BoolType.INSTANCE - val ApiInt8TypeInstance = se.culvertsoft.mgen.api.model.Int8Type.INSTANCE - val ApiInt16TypeInstance = se.culvertsoft.mgen.api.model.Int16Type.INSTANCE - val ApiInt32TypeInstance = se.culvertsoft.mgen.api.model.Int32Type.INSTANCE - val ApiInt64TypeInstance = se.culvertsoft.mgen.api.model.Int64Type.INSTANCE - val ApiFloat32TypeInstance = se.culvertsoft.mgen.api.model.Float32Type.INSTANCE - val ApiFloat64TypeInstance = se.culvertsoft.mgen.api.model.Float64Type.INSTANCE - val ApiStringTypeInstance = se.culvertsoft.mgen.api.model.StringType.INSTANCE - - def vd2Api(model: VdModel): ApiProject = { - Vd2Api(model) - } - - def api2Vd(project: ApiProject): VdModel = { - Api2Vd(project) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelOps.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelOps.scala deleted file mode 100644 index 93fd63e4..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/ModelOps.scala +++ /dev/null @@ -1,405 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.model - -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.mutable.ArrayBuffer -import scala.language.implicitConversions - -case class ChildParent(child: Entity, parent: Entity) - -class RichEntity(base: Entity) { - - def clear() { throw new RuntimeException(s"Cannot call clear() on $this") } - - def traverse(parent: Entity, f: ChildParent => Boolean) { throw new RuntimeException(s"Cannot call traverse(..) on $this") } - - def moveChildUp(child: Entity) { throw new RuntimeException(s"Cannot call moveChildUp(..) on $this") } - def moveChildDown(child: Entity) { throw new RuntimeException(s"Cannot call moveChildUp(..) on $this") } - - def canBeParentOf(e: Entity): Boolean = { throw new RuntimeException(s"Cannot call canBeParentOf(..,..) on $this") } - - def add(e: Project) { throw new RuntimeException(s"Cannot add $e to $this") } - def add(e: Module) { throw new RuntimeException(s"Cannot add $e to $this") } - def add(e: EnumEntry) { throw new RuntimeException(s"Cannot add $e to $this") } - def add(e: EnumType) { throw new RuntimeException(s"Cannot add $e to $this") } - def add(e: CustomType) { throw new RuntimeException(s"Cannot add $e to $this") } - def add(e: CustomTypeField) { throw new RuntimeException(s"Cannot add $e to $this") } - - def remove(e: Project) { throw new RuntimeException(s"Cannot transferAway $e from $this") } - def remove(e: Module) { throw new RuntimeException(s"Cannot transferAway $e from $this") } - def remove(e: EnumEntry) { throw new RuntimeException(s"Cannot transferAway $e from $this") } - def remove(e: EnumType) { throw new RuntimeException(s"Cannot transferAway $e from $this") } - def remove(e: CustomType) { throw new RuntimeException(s"Cannot transferAway $e from $this") } - def remove(e: CustomTypeField) { throw new RuntimeException(s"Cannot transferAway $e from $this") } - - final def traverse(f: ChildParent => Boolean) { traverse(null, f) } - final def foreach[A](f: ChildParent => A) { traverse({ x: ChildParent => f(x); true }) } - final def foreachFirstLevelChild[A](f: ChildParent => A) { traverse { x: ChildParent => if (x.parent != null) f(x); x.parent == null } } - final def firstLevelChildren(): Seq[Entity] = { val out = new ArrayBuffer[Entity]; foreachFirstLevelChild(out += _.child); out } - final def numFirstLevelChildren(): Int = { var out = 0; foreachFirstLevelChild(_ => out += 1); out } - final def allChildren(): Seq[Entity] = { val out = new ArrayBuffer[Entity]; foreach(cp => if (cp.parent != null) out += cp.child); out } - - final def contains(e: Entity): Boolean = { - findFirst(_.child.getId() == e.getId()).isDefined - } - - final def containsAtFirstLevel(e: Entity): Boolean = { - foreachFirstLevelChild { cp => - if (cp.child eq e) { - return true - } - } - return false - } - - final def findFirst(f: ChildParent => Boolean): Option[ChildParent] = { - foreach { cp => - if (f(cp)) { - return Some(cp) - } - } - return None - } - - final def findLast(f: ChildParent => Boolean): Option[ChildParent] = { - var out: Option[ChildParent] = None - foreach { cp => - if (f(cp)) { - out = Some(cp) - } - } - return out - } - - def add(e: Entity) { - e match { - case e: Project => add(e) - case e: Module => add(e) - case e: EnumEntry => add(e) - case e: EnumType => add(e) - case e: CustomType => add(e) - case e: CustomTypeField => add(e) - } - } - - def remove(e: Entity) { - e match { - case e: Project => remove(e) - case e: Module => remove(e) - case e: EnumEntry => remove(e) - case e: EnumType => remove(e) - case e: CustomType => remove(e) - case e: CustomTypeField => remove(e) - } - } - -} - -class RichProject(base: Project) extends RichEntity(base) { - import ModelOps._ - - override def clear() { - base.getModules().clear() - } - - override def traverse(parent: Entity, f: ChildParent => Boolean) { - if (f(ChildParent(base, parent))) { - for (d <- base.getDependencies()) { - d.traverse(base, f) - } - for (m <- base.getModules()) { - m.traverse(base, f) - } - } - } - - override def canBeParentOf(e: Entity): Boolean = { - e match { - case e: CustomType => false - case _ => true - } - } - - override def add(e: Project) { base.getDependencies().add(e) } - override def add(e: Module) { base.getModules().add(e) } - - override def remove(e: Project) { base.getDependencies().remove(e) } - override def remove(e: Module) { base.getModules().remove(e) } - - override def moveChildUp(child: Entity) { - child match { - case module: Module => - val iprev = base.getModules().indexWhere(_ eq module) - if (iprev >= 1) { - base.getModules().remove(iprev) - base.getModules().insert(iprev - 1, module) - } - } - } - - override def moveChildDown(child: Entity) { - child match { - case module: Module => - val iprev = base.getModules().indexWhere(_ eq module) - if (iprev < (base.getModules().size() - 1)) { - base.getModules().remove(iprev) - base.getModules().insert(iprev + 1, module) - } - } - } - -} - -class RichModule(base: Module) extends RichEntity(base) { - import ModelOps._ - - override def clear() { - base.getSubmodules().clear() - base.getEnums().clear() - base.getTypes().clear() - } - - override def traverse(parent: Entity, f: ChildParent => Boolean) { - if (f(ChildParent(base, parent))) { - for (m <- base.getSubmodules()) { - m.traverse(base, f) - } - for (t <- base.getEnums()) { - t.traverse(base, f) - } - for (t <- base.getTypes()) { - t.traverse(base, f) - } - } - } - - override def canBeParentOf(e: Entity): Boolean = { - e match { - case e: Module => true - case e: CustomType => true - case e: EnumType => true - case _ => false - } - } - - override def add(e: Module) { base.getSubmodules().add(e) } - override def add(e: EnumType) { base.getEnums().add(e) } - override def add(e: CustomType) { base.getTypes().add(e) } - override def remove(e: Module) { base.getSubmodules().remove(e) } - override def remove(e: EnumType) { base.getEnums().remove(e) } - override def remove(e: CustomType) { base.getTypes().remove(e) } - - override def moveChildUp(child: Entity) { - child match { - case module: Module => - val iprev = base.getSubmodules().indexWhere(_ eq module) - if (iprev >= 1) { - base.getSubmodules().remove(iprev) - base.getSubmodules().insert(iprev - 1, module) - } - case typ: EnumType => - val iprev = base.getEnums().indexWhere(_ eq typ) - if (iprev >= 1) { - base.getEnums().remove(iprev) - base.getEnums().insert(iprev - 1, typ) - } - case typ: CustomType => - val iprev = base.getTypes().indexWhere(_ eq typ) - if (iprev >= 1) { - base.getTypes().remove(iprev) - base.getTypes().insert(iprev - 1, typ) - } - } - } - - override def moveChildDown(child: Entity) { - child match { - case module: Module => - val iprev = base.getSubmodules().indexWhere(_ eq module) - if (iprev < (base.getSubmodules().size() - 1)) { - base.getSubmodules().remove(iprev) - base.getSubmodules().insert(iprev + 1, module) - } - case typ: EnumType => - val iprev = base.getEnums().indexWhere(_ eq typ) - if (iprev < (base.getEnums().size() - 1)) { - base.getEnums().remove(iprev) - base.getEnums().insert(iprev + 1, typ) - } - case typ: CustomType => - val iprev = base.getTypes().indexWhere(_ eq typ) - if (iprev < (base.getTypes().size() - 1)) { - base.getTypes().remove(iprev) - base.getTypes().insert(iprev + 1, typ) - } - } - } - -} - -class RichEnumEntry(base: EnumEntry) extends RichEntity(base) { - - override def clear() { - } - - override def traverse(parent: Entity, f: ChildParent => Boolean) { - if (f(ChildParent(base, parent))) { - } - } - - override def canBeParentOf(e: Entity): Boolean = { - false - } - - override def moveChildUp(child: Entity) { - } - - override def moveChildDown(child: Entity) { - } - -} - -class RichEnumType(base: EnumType) extends RichEntity(base) { - import ModelOps._ - - override def clear() { - base.getEntries().clear() - } - - override def traverse(parent: Entity, f: ChildParent => Boolean) { - if (f(ChildParent(base, parent))) { - for (field <- base.getEntries()) { - field.traverse(base, f) - } - } - } - - override def add(e: EnumEntry) { - base.getEntries().add(e) - } - - override def remove(e: EnumEntry) { - base.getEntries().remove(e) - } - - override def canBeParentOf(e: Entity): Boolean = { - e match { - case field: EnumEntry => true - case _ => false - } - } - - override def moveChildUp(child: Entity) { - child match { - case field: EnumEntry => - val iprev = base.getEntries().indexWhere(_ eq field) - if (iprev >= 1) { - base.getEntries().remove(iprev) - base.getEntries().insert(iprev - 1, field) - } - } - } - - override def moveChildDown(child: Entity) { - child match { - case field: EnumEntry => - val iprev = base.getEntries().indexWhere(_ eq field) - if (iprev < (base.getEntries().size() - 1)) { - base.getEntries().remove(iprev) - base.getEntries().insert(iprev + 1, field) - } - } - } - -} - - -class RichCustomType(base: CustomType) extends RichEntity(base) { - import ModelOps._ - - override def clear() { - base.getFields().clear() - } - - override def traverse(parent: Entity, f: ChildParent => Boolean) { - if (f(ChildParent(base, parent))) { - for (field <- base.getFields()) { - field.traverse(base, f) - } - } - } - - override def add(e: CustomTypeField) { - base.getFields().add(e) - } - - override def remove(e: CustomTypeField) { - base.getFields().remove(e) - } - - override def canBeParentOf(e: Entity): Boolean = { - e match { - case field: CustomTypeField => true - case _ => false - } - } - - override def moveChildUp(child: Entity) { - child match { - case field: CustomTypeField => - val iprev = base.getFields().indexWhere(_ eq field) - if (iprev >= 1) { - base.getFields().remove(iprev) - base.getFields().insert(iprev - 1, field) - } - } - } - - override def moveChildDown(child: Entity) { - child match { - case field: CustomTypeField => - val iprev = base.getFields().indexWhere(_ eq field) - if (iprev < (base.getFields().size() - 1)) { - base.getFields().remove(iprev) - base.getFields().insert(iprev + 1, field) - } - } - } - -} - -class RichCustomTypeField(base: CustomTypeField) extends RichEntity(base) { - - override def clear() { - } - - override def traverse(parent: Entity, f: ChildParent => Boolean) { - if (f(ChildParent(base, parent))) { - } - } - - override def canBeParentOf(e: Entity): Boolean = { - false - } - - override def moveChildUp(child: Entity) { - } - - override def moveChildDown(child: Entity) { - } - -} - -object ModelOps { - - implicit def toRichCustomType(base: Entity): RichEntity = { - base match { - case base: Project => new RichProject(base) - case base: Module => new RichModule(base) - case base: EnumEntry => new RichEnumEntry(base) - case base: EnumType => new RichEnumType(base) - case base: CustomType => new RichCustomType(base) - case base: CustomTypeField => new RichCustomTypeField(base) - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/RichPlacedEntity.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/RichPlacedEntity.scala deleted file mode 100644 index 1b292dc7..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/RichPlacedEntity.scala +++ /dev/null @@ -1,25 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.model - -import java.awt.Point -import java.awt.Rectangle - -object RichPlacedEntity { - implicit class RichPlacedEnt(base: PlacedEntity) { - def x(): Int = base.getPlacement().getX() - def y(): Int = base.getPlacement().getY() - def width(): Int = base.getPlacement().getWidth() - def height(): Int = base.getPlacement().getHeight() - def top(): Int = y - def bottom(): Int = y + height - def left(): Int = x - def right(): Int = x + width - def setPos(x: Int, y: Int) { base.getPlacement().setX(x).setY(y) } - def setSize(w: Int, h: Int) { base.getPlacement().setWidth(w).setHeight(h) } - def setPos(x: Double, y: Double) { setPos(x.toInt, y.toInt) } - def setSize(w: Double, h: Double) { setSize(w.toInt, h.toInt) } - def midX() = (left + right) / 2 - def midY() = (top + bottom) / 2 - def midPt() = new Point(midX, midY) - def bounds() = new Rectangle(x, y, width, height) - } -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Vd2Api.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Vd2Api.scala deleted file mode 100644 index b283ee63..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/model/Vd2Api.scala +++ /dev/null @@ -1,252 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.model - -import java.io.File - -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.JavaConversions.bufferAsJavaList -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.LinkedHashMap - -import ModelConversion.ApiArrayType -import ModelConversion.ApiBoolTypeInstance -import ModelConversion.ApiClass -import ModelConversion.ApiEntity -import ModelConversion.ApiEnum -import ModelConversion.ApiEnumEntry -import ModelConversion.ApiEnumType -import ModelConversion.ApiField -import ModelConversion.ApiFloat32TypeInstance -import ModelConversion.ApiFloat64TypeInstance -import ModelConversion.ApiGenerator -import ModelConversion.ApiInt16TypeInstance -import ModelConversion.ApiInt32TypeInstance -import ModelConversion.ApiInt64TypeInstance -import ModelConversion.ApiInt8TypeInstance -import ModelConversion.ApiListType -import ModelConversion.ApiMapType -import ModelConversion.ApiModule -import ModelConversion.ApiProject -import ModelConversion.ApiStringTypeInstance -import ModelConversion.ApiType -import ModelConversion.ApiUserDefinedType -import ModelConversion.VdArrayType -import ModelConversion.VdBoolType -import ModelConversion.VdClass -import ModelConversion.VdEntity -import ModelConversion.VdEnum -import ModelConversion.VdEnumEntry -import ModelConversion.VdField -import ModelConversion.VdFieldType -import ModelConversion.VdFloat32Type -import ModelConversion.VdFloat64Type -import ModelConversion.VdGenerator -import ModelConversion.VdInt16Type -import ModelConversion.VdInt32Type -import ModelConversion.VdInt64Type -import ModelConversion.VdInt8Type -import ModelConversion.VdListType -import ModelConversion.VdMapType -import ModelConversion.VdModel -import ModelConversion.VdModule -import ModelConversion.VdProject -import ModelConversion.VdStringType -import ModelConversion.VdUserTypeRef -import se.culvertsoft.mgen.api.model.UnlinkedType -import se.culvertsoft.mgen.api.util.CRC16 -import se.culvertsoft.mgen.compiler.components.LinkTypes -import se.culvertsoft.mgen.idlparser.IdlDefaultValue -import se.culvertsoft.mgen.visualdesigner.classlookup.Type2String - -class Vd2ApiConversionState(val srcModel: Model) { - import ModelConversion._ - val apiObjLkup = new LinkedHashMap[String, ApiEntity] // classpath -> Entity -} - -object Vd2Api { - import ModelConversion._ - - private def cvtGenerator(vdGenerator: VdGenerator)(implicit cvState: Vd2ApiConversionState): ApiGenerator = { - val settings = new java.util.LinkedHashMap[String, String](vdGenerator.getSettings()) - settings.put("jar_file_folder", vdGenerator.getGeneratorJarFileFolder()) - settings.put("class_path", vdGenerator.getGeneratorClassName()) - settings.put("output_path", vdGenerator.getOutputFolder()) - settings.put("classregistry_path", vdGenerator.getClassRegistryPath()) - new ApiGenerator(vdGenerator.getName(), vdGenerator.getGeneratorClassName(), settings) - } - - private def getApiCustomType(fullClassPath: String)(implicit cvState: Vd2ApiConversionState): ApiUserDefinedType = { - cvState.apiObjLkup.getOrElseUpdate(fullClassPath, new UnlinkedType(fullClassPath)).asInstanceOf[ApiUserDefinedType] - } - - private def getApiCustomType(vdType: VdUserDefinedType)(implicit cvState: Vd2ApiConversionState): ApiUserDefinedType = { - getApiCustomType(Type2String.getClassPath(vdType)(cvState.srcModel)) - } - - private def getApiCustomType(vdType: UserTypeRef)(implicit cvState: Vd2ApiConversionState): ApiUserDefinedType = { - getApiCustomType(cvState.srcModel.getEntity(vdType.getId()).get.asInstanceOf[VdUserDefinedType]) - } - - private def cvtFieldType(t: VdFieldType)(implicit cvState: Vd2ApiConversionState): ApiType = { - t match { - case t: VdBoolType => ApiBoolTypeInstance - case t: VdInt8Type => ApiInt8TypeInstance - case t: VdInt16Type => ApiInt16TypeInstance - case t: VdInt32Type => ApiInt32TypeInstance - case t: VdInt64Type => ApiInt64TypeInstance - case t: VdFloat32Type => ApiFloat32TypeInstance - case t: VdFloat64Type => ApiFloat64TypeInstance - case t: VdStringType => ApiStringTypeInstance - case t: VdListType => new ApiListType(cvtFieldType(t.getElementType())) - case t: VdArrayType => new ApiArrayType(cvtFieldType(t.getElementType())) - case t: VdMapType => new ApiMapType(cvtFieldType(t.getKeyType), cvtFieldType(t.getValueType)) - case t: VdUserTypeRef => getApiCustomType(t) - case _ => throw new RuntimeException(s"Unknown field type: ${t}") - } - } - - def getId16Bit(e: VdEntity)(implicit cvState: Vd2ApiConversionState): Short = { - implicit val model = cvState.srcModel - val (has, get, name) = e match { - case e: VdField => (() => e.hasId16Bit, () => e.getId16Bit, () => e.getName) - case e: VdClass => (() => e.hasId16Bit, () => e.getId16Bit, () => Type2String.getClassPath(e)) - } - if (has()) { - get() - } else { - CRC16.calc(name()) - } - - } - - private def cvtField(vdField: VdField, parentClass: ApiClass)(implicit cvState: Vd2ApiConversionState): ApiField = { - new ApiField( - parentClass.fullName(), - vdField.getName(), - cvtFieldType(vdField.getType()), - vdField.getFlags(), - getId16Bit(vdField), - if (vdField.hasDefaultValue()) new IdlDefaultValue(vdField.getDefaultValue, parentClass) else null) - } - - private def cvtEnumEntry(vdEntry: VdEnumEntry, parentEnum: ApiEnum)(implicit cvState: Vd2ApiConversionState): ApiEnumEntry = { - new ApiEnumEntry(vdEntry.getName(), vdEntry.getConstant()) - } - - private def cvtEnum(vdEnum: VdEnum, parentModule: ApiModule)(implicit cvState: Vd2ApiConversionState): ApiEnumType = { - - implicit val model = cvState.srcModel - - val t = new ApiEnumType(vdEnum.getName(), Type2String.getClassPath(vdEnum), parentModule) - - cvState.apiObjLkup.put(Type2String.getClassPath(vdEnum), t) - - t.setEntries(vdEnum.getEntries.map(cvtEnumEntry(_, t))) - - t - } - - private def cvtType(vdClass: VdClass, parentModule: ApiModule)(implicit cvState: Vd2ApiConversionState): ApiClass = { - - implicit val model = cvState.srcModel - - val apiSuperType = - if (vdClass.hasSuperType() && vdClass.getSuperType() != null) - getApiCustomType(model.getEntity(vdClass.getSuperType).get.asInstanceOf[VdClass]) - else - null - - val t = new ApiClass(vdClass.getName(), parentModule, getId16Bit(vdClass), apiSuperType) - - cvState.apiObjLkup.put(Type2String.getClassPath(vdClass), t) - - t.setFields(vdClass.getFields.map(cvtField(_, t))) - - t - } - - private def getSavePath( - vdModule: VdModule, - fullModuleName: String): FilePath = { - - val writtenDir = vdModule.getSaveDir.getWritten - val absoluteDir = vdModule.getSaveDir.getAbsolute - - val writtenPrepend = if (writtenDir.nonEmpty) (writtenDir + File.separator) else "" - val absolutePrepend = absoluteDir + File.separator - - new FilePath( - writtenPrepend + fullModuleName + ".xml", - absolutePrepend + fullModuleName + ".xml") - } - - private def cvtModule(vdModule: VdModule, apiProject: ApiProject, parentPath: String = "")(implicit cvState: Vd2ApiConversionState): Seq[ApiModule] = { - - val out = new ArrayBuffer[ApiModule] - - val fullModuleName = if (parentPath.nonEmpty) s"${parentPath}.${vdModule.getName()}" else vdModule.getName - val savePath = getSavePath(vdModule, fullModuleName) - - val apiModule = new ApiModule( - fullModuleName, - savePath.getWritten(), - savePath.getAbsolute(), - vdModule.getSettings(), - apiProject) - - cvState.apiObjLkup.put(fullModuleName, apiModule) - - apiModule.setEnums(vdModule.getEnums().map(cvtEnum(_, apiModule))) - apiModule.setClasses(vdModule.getTypes().map(cvtType(_, apiModule))) - - out += apiModule - out ++= vdModule.getSubmodules().flatMap(cvtModule(_, apiProject, fullModuleName)) - - out - } - - private def cvtProject(vdProject: VdProject, isRoot: Boolean, apiParent: ApiProject = null)(implicit cvState: Vd2ApiConversionState): ApiProject = { - - cvState.apiObjLkup.getOrElse(vdProject.getFilePath().getAbsolute(), { - - val apiProject = new ApiProject( - vdProject.getName(), - vdProject.getFilePath().getWritten(), - vdProject.getFilePath().getAbsolute(), - apiParent) - - cvState.apiObjLkup.put(vdProject.getFilePath().getAbsolute(), apiProject) - - if (vdProject.hasGenerators) - apiProject.setGenerators(vdProject.getGenerators.map(cvtGenerator)) - - if (vdProject.hasModules) - apiProject.setModules(vdProject.getModules.flatMap(cvtModule(_, apiProject))) - - if (vdProject.hasSettings) - apiProject.setSettings(vdProject.getSettings) - - if (vdProject.hasDependencies) - apiProject.setDependencies(vdProject.getDependencies.map(cvtProject(_, false, apiParent))) - - apiProject - - }).asInstanceOf[ApiProject] - - } - - private def linkTypes(apiProject: ApiProject) { - LinkTypes(apiProject) - } - - def apply(model: VdModel): ApiProject = { - - implicit val cvState = new Vd2ApiConversionState(model) - - val out = cvtProject(model.project, true) - - linkTypes(out) - - out - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/MainMenuInit.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/MainMenuInit.scala deleted file mode 100644 index a4b3a4d8..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/MainMenuInit.scala +++ /dev/null @@ -1,104 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.uiInit - -import javax.swing.JMenu -import javax.swing.JMenuBar -import se.culvertsoft.mgen.visualdesigner.Actions -import se.culvertsoft.mgen.visualdesigner.control.Controller - -object MainMenuInit { - - def mkMainMenu(implicit controller: Controller): JMenuBar = { - - // Main menu object - val menuBar = new JMenuBar() - - // File menu - val fileMenu = new JMenu("File") - fileMenu.add(Actions.MainMenu.File.NEW) - fileMenu.add(Actions.MainMenu.File.LOAD) - fileMenu.add(Actions.MainMenu.File.SAVE) - fileMenu.add(Actions.MainMenu.File.SAVE_AS) - fileMenu.addSeparator() - - fileMenu.add(Actions.MainMenu.File.EXIT) - - // Edit menu - val editMenu = new JMenu("Edit") - editMenu.add(Actions.MainMenu.Edit.UNDO) - editMenu.add(Actions.MainMenu.Edit.REDO) - editMenu.addSeparator() - editMenu.add(Actions.MainMenu.Edit.CUT) - editMenu.add(Actions.MainMenu.Edit.COPY) - editMenu.add(Actions.MainMenu.Edit.PASTE) - editMenu.addSeparator() - editMenu.add(Actions.MainMenu.Edit.FIND_BY_NAME) - editMenu.add(Actions.MainMenu.Edit.FIND_SELECTED) - editMenu.addSeparator() - editMenu.add(Actions.MainMenu.Edit.SELECT_ALL) - editMenu.add(Actions.MainMenu.Edit.DESELECT_ALL) - editMenu.addSeparator() - editMenu.add(Actions.MainMenu.Edit.RENAME) - editMenu.add(Actions.MainMenu.Edit.DELETE) - - // View menu - val viewMenu = new JMenu("View") - viewMenu.add(Actions.MainMenu.View.GO_UP) - viewMenu.add(Actions.MainMenu.View.GO_BACK) - viewMenu.add(Actions.MainMenu.View.GO_FORWARD) - viewMenu.addSeparator() - viewMenu.add(Actions.MainMenu.View.SET_VIEW_ROOT) - viewMenu.add(Actions.MainMenu.View.RESET_VIEW_ROOT) - viewMenu.add(Actions.MainMenu.View.TOGGLE_FULL_SCREEN) - viewMenu.addSeparator() - viewMenu.add(Actions.MainMenu.View.ICONS_ONLY_VIEW) - viewMenu.addSeparator() - viewMenu.add(Actions.MainMenu.View.REBUILD_VIEW) - - // Tools menu - val toolsMenu = new JMenu("Tools") - toolsMenu.add(Actions.MainMenu.Tools.NEW_MODULE) - toolsMenu.add(Actions.MainMenu.Tools.NEW_TYPE) - toolsMenu.add(Actions.MainMenu.Tools.NEW_ENUM) - toolsMenu.add(Actions.MainMenu.Tools.NEW_FIELD) - toolsMenu.addSeparator() - toolsMenu.addSeparator() - toolsMenu.add(Actions.MainMenu.Tools.ALIGN_Y_TOP_BTN) - toolsMenu.add(Actions.MainMenu.Tools.ALIGN_Y_CENTER_BTN) - toolsMenu.add(Actions.MainMenu.Tools.ALIGN_Y_BOTTOM_BTN) - toolsMenu.add(Actions.MainMenu.Tools.ALIGN_X_LEFT_BTN) - toolsMenu.add(Actions.MainMenu.Tools.ALIGN_X_CENTER_BTN) - toolsMenu.add(Actions.MainMenu.Tools.ALIGN_X_RIGHT_BTN) - toolsMenu.addSeparator() - toolsMenu.add(Actions.MainMenu.Tools.SPREAD_EQUAL_Y) - toolsMenu.add(Actions.MainMenu.Tools.SPREAD_EQUAL_X) - toolsMenu.addSeparator() - toolsMenu.add(Actions.MainMenu.Tools.RESIZE_EQUAL_X) - toolsMenu.add(Actions.MainMenu.Tools.RESIZE_EQUAL_Y) - toolsMenu.addSeparator() - toolsMenu.add(Actions.MainMenu.Tools.SPACE_OUT_Y) - toolsMenu.add(Actions.MainMenu.Tools.SPACE_OUT_X) - toolsMenu.addSeparator() - toolsMenu.add(Actions.MainMenu.Tools.LAY_OUT) - toolsMenu.add(Actions.MainMenu.Tools.LAY_OUT_AND_RESIZE) - - // Settings menu - val settingsMenu = new JMenu("Settings") - settingsMenu.add(Actions.MainMenu.Settings.GENERATION) - - // Help menu - val helpMenu = new JMenu("Help") - helpMenu.add(Actions.MainMenu.About.HELP) - helpMenu.add(Actions.MainMenu.About.ABOUT) - - // Add all menus - menuBar.add(fileMenu) - menuBar.add(editMenu) - menuBar.add(viewMenu) - menuBar.add(toolsMenu) - menuBar.add(settingsMenu) - menuBar.add(helpMenu) - - menuBar - - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/PanelsInit.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/PanelsInit.scala deleted file mode 100644 index cf513057..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/PanelsInit.scala +++ /dev/null @@ -1,36 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.uiInit - -import java.awt.BorderLayout -import java.awt.Component - -import javax.swing.JFrame -import javax.swing.WindowConstants -import se.culvertsoft.mgen.visualdesigner.util.TextPanel -import se.culvertsoft.mgen.visualdesigner.view.ContentPane - -object PanelsInit { - - def mkWindow(): JFrame = { - val window = new JFrame("MGen Visual Designer") - //window.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE) - window.setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE) - window.setSize(1400, 1024) - window - } - - def mkTextPanel(): TextPanel = { - val panel = new TextPanel - panel - } - - def mkContentPane(name: String) = { - val c = new ContentPane() - c.setName(s"$name.contentPane") - c.setLayout(new BorderLayout() { - override def addLayoutComponent(comp: Component, constraints: Object) { - super.addLayoutComponent(comp, if (constraints == null) BorderLayout.CENTER else constraints) - } - }) - c - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/ToolbarsInit.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/ToolbarsInit.scala deleted file mode 100644 index e0230487..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/uiInit/ToolbarsInit.scala +++ /dev/null @@ -1,114 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.uiInit - -import java.awt.Dimension - -import javax.swing.JToolBar -import javax.swing.SwingConstants -import se.culvertsoft.mgen.visualdesigner.Actions -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.view.ScaleSetBox - -object ToolbarsInit { - - def mkRightPanelBottomToolbar(implicit controller: Controller): JToolBar = { - - val toolbar = new JToolBar() - toolbar.setFloatable(true) - - toolbar - } - - def mkRightPanelTopToolbar(implicit controller: Controller): JToolBar = { - - val toolbar = new JToolBar() - toolbar.setFloatable(false) - - toolbar.addSeparator() - - val cb = new ScaleSetBox(controller) - cb.setMaximumSize(new Dimension(75, 30)) - toolbar.add(cb) - - toolbar.addSeparator() - - toolbar.add(Actions.DashBoard.Top.ALIGN_Y_TOP_BTN) - toolbar.add(Actions.DashBoard.Top.ALIGN_Y_CENTER_BTN) - toolbar.add(Actions.DashBoard.Top.ALIGN_Y_BOTTOM_BTN) - - toolbar.addSeparator() - - toolbar.add(Actions.DashBoard.Top.ALIGN_X_LEFT_BTN) - toolbar.add(Actions.DashBoard.Top.ALIGN_X_CENTER_BTN) - toolbar.add(Actions.DashBoard.Top.ALIGN_X_RIGHT_BTN) - - toolbar.addSeparator() - - toolbar.add(Actions.DashBoard.Top.RESIZE_EQUAL_Y) - toolbar.add(Actions.DashBoard.Top.RESIZE_EQUAL_X) - - toolbar.addSeparator() - - toolbar.add(Actions.DashBoard.Top.SPACE_OUT_Y) - toolbar.add(Actions.DashBoard.Top.SPACE_OUT_X) - - toolbar.addSeparator() - - toolbar.add(Actions.DashBoard.Top.SPREAD_EQUAL_Y) - toolbar.add(Actions.DashBoard.Top.SPREAD_EQUAL_X) - - toolbar.addSeparator() - - toolbar.add(Actions.DashBoard.Top.LAY_OUT) - - toolbar.addSeparator() - toolbar.addSeparator() - toolbar.addSeparator() - - toolbar - - } - - def mkLeftPanelTopToolBar(implicit controller: Controller): JToolBar = { - - val toolbar = new JToolBar() - toolbar.addSeparator() - - toolbar.add(Actions.TreeView.MOVE_UP) - toolbar.add(Actions.TreeView.MOVE_DOWN) - toolbar.add(Actions.TreeView.FIND_SELECTED) - toolbar.add(Actions.TreeView.RENAME) - toolbar.setFloatable(false) - - toolbar - - } - - def mkRightPanelLeftToolBar(implicit controller: Controller): JToolBar = { - - val toolbar = new JToolBar() - toolbar.setOrientation(SwingConstants.VERTICAL) - toolbar.setFloatable(false) - - toolbar.add(Actions.DashBoard.Left.RESET_VIEW_ROOT) - toolbar.add(Actions.DashBoard.Left.GO_UP) - toolbar.add(Actions.DashBoard.Left.GO_BACK) - toolbar.add(Actions.DashBoard.Left.GO_FORWARD) - toolbar.add(Actions.DashBoard.Left.SET_VIEW_ROOT) - toolbar.add(Actions.DashBoard.Left.TOGGLE_FULL_SCREEN) - - toolbar.addSeparator() - toolbar.addSeparator() - - toolbar.add(Actions.DashBoard.Left.NEW_MODULE) - toolbar.add(Actions.DashBoard.Left.NEW_TYPE) - toolbar.add(Actions.DashBoard.Left.NEW_ENUM) - toolbar.add(Actions.DashBoard.Left.NEW_FIELD) - toolbar.addSeparator() - - toolbar.addSeparator() - toolbar.addSeparator() - - toolbar - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Asof.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Asof.scala deleted file mode 100644 index 8fc02388..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Asof.scala +++ /dev/null @@ -1,32 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import scala.language.implicitConversions -import scala.reflect.ClassTag -import scala.collection.mutable.ArrayBuffer - -object Asof { - - implicit class AsofOps(x: Any) { - def as[T: ClassTag]: Option[T] = { - x match { - case x: T => Some(x) - case _ => None - } - } - def ifIs[T: ClassTag](f: T => Unit) { - x.as[T].foreach(f) - } - } - - implicit class RichFilterable[T0](xs: Seq[T0]) { - def filterOfType[T: ClassTag](): Seq[T0 with T] = { - val out = new ArrayBuffer[T0 with T] - xs foreach (_ match { - case x: T => out += x.asInstanceOf[T0 with T] - case _ => - }) - out - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/AwtMath.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/AwtMath.scala deleted file mode 100644 index 064c6517..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/AwtMath.scala +++ /dev/null @@ -1,32 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.Dimension -import java.awt.Point - -import scala.language.implicitConversions - -object AwtMath { - - implicit class RichPoint(a: Point) { - def -(b: Point): Point = new Point(a.x - b.x, a.y - b.y) - def +(b: Point): Point = new Point(a.x + b.x, a.y + b.y) - def -(b: Dimension): Point = new Point(a.x - b.width, a.y - b.height) - def +(b: Dimension): Point = new Point(a.x + b.width, a.y + b.height) - def /(d: Int): Point = new Point(a.x / d, a.y / d) - def *(m: Int): Point = new Point(a.x * m, a.y * m) - def /(d: Double): Point = new Point((a.x / d).round.toInt, (a.y / d).round.toInt) - def *(m: Double): Point = new Point((a.x * m).round.toInt, (a.y * m).round.toInt) - } - - implicit class RichDimension(a: Dimension) { - def -(b: Point): Dimension = new Dimension(a.width - b.x, a.height - b.y) - def +(b: Point): Dimension = new Dimension(a.width + b.x, a.height + b.y) - def -(b: Dimension): Dimension = new Dimension(a.width - b.width, a.height - b.height) - def +(b: Dimension): Dimension = new Dimension(a.width + b.width, a.height + b.height) - def /(d: Int): Dimension = new Dimension(a.width / d, a.height / d) - def *(m: Int): Dimension = new Dimension(a.width * m, a.height * m) - def /(d: Double): Dimension = new Dimension((a.width / d).round.toInt, (a.height / d).round.toInt) - def *(m: Double): Dimension = new Dimension((a.width * m).round.toInt, (a.height * m).round.toInt) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsolePipe.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsolePipe.scala deleted file mode 100644 index d71ca606..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsolePipe.scala +++ /dev/null @@ -1,56 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util; - -import java.awt.Color -import java.io.ByteArrayOutputStream -import java.io.PrintStream - -class ConsolePipe(val target: ConsoleTarget) { - - def redirectOut(textColor: Color, printStream: PrintStream) { - val cos = new ConsoleOutputStream(textColor, printStream); - System.setOut(new PrintStream(cos, true)); - } - - def redirectErr(textColor: Color, printStream: PrintStream) { - val cos = new ConsoleOutputStream(textColor, printStream); - System.setErr(new PrintStream(cos, true)); - } - - class ConsoleOutputStream( - val color: Color, - val printStream: PrintStream) extends ByteArrayOutputStream { - val EOL = System.getProperty("line.separator"); - val buffer = new StringBuilder(80); - - override def flush() { - val message = toString(); - if (message.length() != 0) { - handleAppend(message); - reset(); - } - } - - def handleAppend(message: String) { - if (target.getLength() == 0) - buffer.setLength(0); - if (EOL.equals(message)) { - buffer.append(message); - } else { - buffer.append(message); - clearBuffer(); - } - } - - def clearBuffer() { - val line = buffer.toString(); - - target.append(line, color); - - if (printStream != null) { - printStream.print(line); - } - - buffer.setLength(0); - } - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsoleTarget.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsoleTarget.scala deleted file mode 100644 index 5de0d118..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ConsoleTarget.scala +++ /dev/null @@ -1,11 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.Color - -trait ConsoleTarget { - def getLength(): Int - def isVisible(): Boolean - def setVisible(state: Boolean) - def append(msg: String, c: Color) - def toFront() -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayOutEntities.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayOutEntities.scala deleted file mode 100644 index a739a5d4..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayOutEntities.scala +++ /dev/null @@ -1,105 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.Dimension -import java.awt.Point - -import scala.collection.JavaConversions.asScalaBuffer - -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.Project - -object LayOutEntities { - - import se.culvertsoft.mgen.visualdesigner.util.AwtMath._ - - val DEFAULT_WALL_OFFSET_X = 80 - val DEFAULT_WALL_OFFSET_Y = 120 - - val DEFAULT_SPACING_X = 80 - val DEFAULT_SPACING_Y = 200 - - val P0 = new Point(DEFAULT_WALL_OFFSET_X, DEFAULT_WALL_OFFSET_Y) - - val DEFAULT_MODULE_WIDTH = 700 - val DEFAULT_MODULE_HEIGHT = 900 - val DEFAULT_MODULE_WIDTH_PADDED = DEFAULT_MODULE_WIDTH + DEFAULT_SPACING_X - val DEFAULT_MODULE_HEIGHT_PADDED = DEFAULT_MODULE_HEIGHT + DEFAULT_SPACING_Y - val DEFAULT_MODULE_SIZE = new Dimension(DEFAULT_MODULE_WIDTH, DEFAULT_MODULE_HEIGHT) - val DEFAULT_MODULE_SIZE_PADDED = new Dimension(DEFAULT_MODULE_WIDTH_PADDED, DEFAULT_MODULE_HEIGHT_PADDED) - - val DEFAULT_CLASS_WIDTH = 275 - val DEFAULT_CLASS_HEIGHT = 375 - val DEFAULT_CLASS_WIDTH_PADDED = DEFAULT_CLASS_WIDTH + DEFAULT_SPACING_X - val DEFAULT_CLASS_HEIGHT_PADDED = DEFAULT_CLASS_HEIGHT + DEFAULT_SPACING_Y - val DEFAULT_CLASS_SIZE = new Dimension(DEFAULT_CLASS_WIDTH, DEFAULT_CLASS_HEIGHT) - val DEFAULT_CLASS_SIZE_PADDED = new Dimension(DEFAULT_CLASS_WIDTH_PADDED, DEFAULT_CLASS_HEIGHT_PADDED) - - private def modules(parent: Entity, model: Model, allowResize: Boolean): Point = { - - val modules = parent match { - case parent: Project => parent.getModules() - case parent: Module => parent.getSubmodules() - } - - var x = P0.x - - for (m <- modules) { - - module(m, model, allowResize) - - m.getPlacement() - .setX(x) - .setY(P0.y) - - if (allowResize) { - m.getPlacement() - .setWidth(DEFAULT_MODULE_WIDTH) - .setHeight(DEFAULT_MODULE_HEIGHT) - } - - x += m.getPlacement.getWidth + DEFAULT_SPACING_X - } - - new Point(P0.x + DEFAULT_MODULE_WIDTH_PADDED * modules.size(), P0.y) - - } - - private def userTypes(xOffset: Double, module: Module, model: Model, allowResize: Boolean) { - - if (allowResize) { - for (c <- (module.getEnums() ++ module.getTypes())) { - c.getPlacement() - .setWidth(DEFAULT_CLASS_WIDTH) - .setHeight(DEFAULT_CLASS_HEIGHT) - } - } - - new TopLayoutNode(xOffset, module, model) - } - - private def module(module: Module, model: Model, allowResize: Boolean) { - val sizeOccupiedBySubModules = modules(module, model, allowResize) - userTypes(sizeOccupiedBySubModules.x, module, model, allowResize) - } - - private def model(model: Model, allowResize: Boolean) { - model.updateCache() - modules(model.project, model, allowResize) - } - - private def project(project: Project, model: Model, allowResize: Boolean) { - project.getDependencies().foreach(apply(_, model, allowResize)) - modules(project, model, allowResize) - } - - def apply(entity: Entity, model: Model, allowResize: Boolean) { - entity match { - case entity: Project => project(entity, model, allowResize) - case entity: Module => module(entity, model, allowResize) - case _ => - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayoutNode.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayoutNode.scala deleted file mode 100644 index 62bd3a9a..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/LayoutNode.scala +++ /dev/null @@ -1,149 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.Point - -import scala.collection.JavaConversions.asScalaBuffer - -import LayOutEntities.DEFAULT_SPACING_X -import LayOutEntities.DEFAULT_SPACING_Y -import LayOutEntities.DEFAULT_WALL_OFFSET_X -import LayOutEntities.DEFAULT_WALL_OFFSET_Y -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.Module - -abstract class LayoutNode(model: Model, module: Module) { - def parent(): Option[LayoutNode] - def children(): Seq[LayoutNode] - def width(): Double - def height(): Double - def halfWidth(): Double - def placeAt(x: Double, y: Double) - def name(): String - - private val thisModulesIds = module.getTypes.map(_.getId).toSet - - def isInThisModule(t: EntityIdBase): Boolean = { - thisModulesIds.contains(t) - } -} - -class TopLayoutNode(xOffset: Double, module: Module, model: Model) extends LayoutNode(model, module) { - - val children = - module.getEnums().map(new EnumLayoutNode(_, module, model, Some(this))) ++ - module - .getTypes() - .filter(e => !e.hasSuperType || !isInThisModule(e.getSuperType())) - .map(new ClassLayoutNode(_, module, model, Some(this))) - - val parent: Option[LayoutNode] = None - - val widthOfChildren = if (children.nonEmpty) children.map(_.width).sum else 0.0 - val heightOfChildren = if (children.nonEmpty) children.map(_.height).max else 0.0 - val width: Double = widthOfChildren - val height: Double = heightOfChildren - val halfWidth = width / 2 - - placeAt(xOffset + DEFAULT_WALL_OFFSET_X + halfWidth, DEFAULT_WALL_OFFSET_Y) - - def placeAt(xCtr: Double, yCtr: Double) { - - var x = xCtr - halfWidth - for (c <- children) { - x += c.halfWidth - c.placeAt(x, yCtr) - x += c.halfWidth - } - } - - def name(): String = module.getName() - -} - -class ClassLayoutNode( - val clas: CustomType, - val module: Module, - val model: Model, - val parent: Option[LayoutNode]) extends LayoutNode(model, module) { - - import LayOutEntities._ - - private var _pos = new Point(0, 0) - - val children: Seq[ClassLayoutNode] = - clas - .getSubTypes().filter(isInThisModule) - .map(id => model.getEntity(id).get.asInstanceOf[CustomType]) - .filter(_.getParent() == module.getId()) - .map(new ClassLayoutNode(_, module, model, Some(this))) - - val widthOfChildren = if (children.nonEmpty) children.map(_.width).sum else 0.0 - val heightOfChildren = if (children.nonEmpty) children.map(_.height).max else 0.0 - val depthOfChildren: Int = if (children.nonEmpty) children.map(_.depthOfChildren + 1).max else 0 - val widthOfTopClass = clas.getPlacement().getWidth() + DEFAULT_SPACING_X - val heightOfTopClass = clas.getPlacement().getHeight() - val width: Double = math.max(widthOfTopClass, widthOfChildren) - val height: Double = heightOfChildren + heightOfTopClass - val halfWidth = width / 2 - - def placeAt(xCtr: Double, yCtr: Double) { - - clas.getPlacement() - .setX((xCtr - clas.getPlacement().getWidth() / 2).toInt) - .setY(yCtr.toInt) - - var x = xCtr - halfWidth - for (c <- children) { - x += c.halfWidth - c.placeAt(x, yCtr + heightOfTopClass + DEFAULT_SPACING_Y) - x += c.halfWidth - } - - } - - def name(): String = clas.getName() - -} - -class EnumLayoutNode( - val e: EnumType, - val module: Module, - val model: Model, - val parent: Option[LayoutNode]) extends LayoutNode(model, module) { - - import LayOutEntities._ - - private var _pos = new Point(0, 0) - - val children: Seq[ClassLayoutNode] = Nil - - val widthOfChildren = if (children.nonEmpty) children.map(_.width).sum else 0.0 - val heightOfChildren = if (children.nonEmpty) children.map(_.height).max else 0.0 - val depthOfChildren: Int = if (children.nonEmpty) children.map(_.depthOfChildren + 1).max else 0 - val widthOfTopClass = e.getPlacement().getWidth() + DEFAULT_SPACING_X - val heightOfTopClass = e.getPlacement().getHeight() - val width: Double = math.max(widthOfTopClass, widthOfChildren) - val height: Double = heightOfChildren + heightOfTopClass - val halfWidth = width / 2 - - def placeAt(xCtr: Double, yCtr: Double) { - - e.getPlacement() - .setX((xCtr - e.getPlacement().getWidth() / 2).toInt) - .setY(yCtr.toInt) - - var x = xCtr - halfWidth - for (c <- children) { - x += c.halfWidth - c.placeAt(x, yCtr + heightOfTopClass + DEFAULT_SPACING_Y) - x += c.halfWidth - } - - } - - def name(): String = e.getName() - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkActionListener.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkActionListener.scala deleted file mode 100644 index c6050796..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkActionListener.scala +++ /dev/null @@ -1,21 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.event.ActionEvent -import java.awt.event.ActionListener - -object MkActionListener { - def apply[T](f: ActionEvent => T): ActionListener = { - new ActionListener() { - override def actionPerformed(e: ActionEvent) { - f(e) - } - } - } - def apply[T](f: => T): ActionListener = { - new ActionListener() { - override def actionPerformed(e: ActionEvent) { - f - } - } - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkDocumentListener.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkDocumentListener.scala deleted file mode 100644 index 88dc82bf..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/MkDocumentListener.scala +++ /dev/null @@ -1,21 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import javax.swing.event.DocumentListener -import javax.swing.event.DocumentEvent - -object MkDocumentListener { - def apply[T](f: => T): DocumentListener = { - new DocumentListener() { - override def changedUpdate(d: DocumentEvent) { f } - override def insertUpdate(d: DocumentEvent) { f } - override def removeUpdate(d: DocumentEvent) { f } - } - } - def apply[T](f: DocumentEvent => T): DocumentListener = { - new DocumentListener() { - override def changedUpdate(d: DocumentEvent) { f(d) } - override def insertUpdate(d: DocumentEvent) { f(d) } - override def removeUpdate(d: DocumentEvent) { f(d) } - } - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Observable.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Observable.scala deleted file mode 100644 index 9a040ad3..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Observable.scala +++ /dev/null @@ -1,39 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.util.IdentityHashMap - -import scala.collection.JavaConversions.bufferAsJavaList -import scala.collection.mutable.ArrayBuffer -import scala.language.postfixOps - -trait Observable[ObserverType] { - - private val observers = new IdentityHashMap[ObserverType, ObserverType] - private val status = new OperationStatus - private val tempList = new ArrayBuffer[ObserverType] - - def addObserver(o: ObserverType) { - observers.put(o, o) - } - - def removeObserver(o: ObserverType) { - observers.remove(o) - } - - def clearObservers() { - observers.clear() - } - - def triggerObservers(f: ObserverType => Unit) { - status.active { - tempList addAll observers.values - tempList foreach f - tempList clear - } - } - - def isTriggeringObservers(): Boolean = { - status.isActive() - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/OperationStatus.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/OperationStatus.scala deleted file mode 100644 index 87ef98c7..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/OperationStatus.scala +++ /dev/null @@ -1,33 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -class OperationStatus { - - private var _active = false - - def active(f: => Unit) { - val prev = isActive - enable() - try { - f - } finally { - set(prev) - } - } - - def enable() { - set(true) - } - - def disable() { - set(false) - } - - def set(state: Boolean) { - _active = state - } - - def isActive(): Boolean = { - _active - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/RichMouseEvent.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/RichMouseEvent.scala deleted file mode 100644 index fa8be648..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/RichMouseEvent.scala +++ /dev/null @@ -1,102 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.event.InputEvent -import java.awt.event.MouseEvent - -import javax.swing.SwingUtilities - -object RichMouseEvent { - - val BACK_BTN_MASK = InputEvent.getMaskForButton(4) - val FWD_BTN_MASK = InputEvent.getMaskForButton(5) - - implicit class RichMouseEventOps(base: MouseEvent) { - - def button(): MouseButton = { - - if (SwingUtilities.isLeftMouseButton(base)) { - LeftMouseButton - } else if (SwingUtilities.isMiddleMouseButton(base)) { - MiddleMouseButton - } else if (SwingUtilities.isRightMouseButton(base)) { - RightMouseButton - } else if ((base.getModifiersEx() & BACK_BTN_MASK) == BACK_BTN_MASK) { - BackMouseButton - } else if ((base.getModifiersEx() & FWD_BTN_MASK) == FWD_BTN_MASK) { - ForwardMouseButton - } else { - UnknownMouseButton - } - } - - def isLeftBtn(): Boolean = isBtn(LeftMouseButton) - def isMiddleBtn(): Boolean = isBtn(MiddleMouseButton) - def isRightBtn(): Boolean = isBtn(RightMouseButton) - def isBackBtn(): Boolean = isBtn(BackMouseButton) - def isForwardBtn(): Boolean = isBtn(ForwardMouseButton) - def isBtn(reference: MouseButton): Boolean = RichMouseEvent.isBtn(button, reference) - - def isPress(): Boolean = isTyp(MousePress) - def isRelease(): Boolean = isTyp(MouseRelease) - def isClick(): Boolean = isTyp(MouseClick) - def isExit(): Boolean = isTyp(MouseExit) - def isEnter(): Boolean = isTyp(MouseEnter) - def isMove(): Boolean = isTyp(MouseMove) - def isDrag(): Boolean = isTyp(MouseDrag) - def isTyp(reference: MouseEventType): Boolean = RichMouseEvent.isTyp(typ, reference) - - def typ(): MouseEventType = { - base.getID() match { - case MouseEvent.MOUSE_PRESSED => MousePress - case MouseEvent.MOUSE_RELEASED => MouseRelease - case MouseEvent.MOUSE_CLICKED => MouseClick - case MouseEvent.MOUSE_EXITED => MouseExit - case MouseEvent.MOUSE_ENTERED => MouseEnter - case MouseEvent.MOUSE_MOVED => MouseMove - case MouseEvent.MOUSE_DRAGGED => MouseDrag - case _ => MouseUnknownEventType - } - } - - } - - def isBtn(btn: MouseButton, reference: MouseButton): Boolean = { - btn == reference - } - - def isTyp(typ: MouseEventType, reference: MouseEventType): Boolean = { - typ == reference - } - -} - -abstract class MouseEventType { - -} - -case object MouseMove extends MouseEventType -case object MouseDrag extends MouseEventType -case object MousePress extends MouseEventType -case object MouseRelease extends MouseEventType -case object MouseClick extends MouseEventType -case object MouseExit extends MouseEventType -case object MouseEnter extends MouseEventType -case object MouseUnknownEventType extends MouseEventType - -case object MouseMoveEvent extends MouseEventType - -abstract class MouseButton { - def isLeft() = RichMouseEvent.isBtn(this, LeftMouseButton) - def isMiddle() = RichMouseEvent.isBtn(this, MiddleMouseButton) - def isRight() = RichMouseEvent.isBtn(this, RightMouseButton) - def isUnknown() = RichMouseEvent.isBtn(this, UnknownMouseButton) - def isBack() = RichMouseEvent.isBtn(this, BackMouseButton) - def isForward() = RichMouseEvent.isBtn(this, ForwardMouseButton) -} - -case object LeftMouseButton extends MouseButton -case object MiddleMouseButton extends MouseButton -case object RightMouseButton extends MouseButton -case object BackMouseButton extends MouseButton -case object ForwardMouseButton extends MouseButton -case object UnknownMouseButton extends MouseButton diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TextPanel.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TextPanel.scala deleted file mode 100644 index 5c3ec8b5..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TextPanel.scala +++ /dev/null @@ -1,66 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.BorderLayout -import java.awt.Color -import java.awt.Insets - -import javax.swing.JPanel -import javax.swing.JScrollPane -import javax.swing.JTextPane -import javax.swing.border.EmptyBorder -import javax.swing.text.BadLocationException -import javax.swing.text.DefaultCaret -import javax.swing.text.SimpleAttributeSet -import javax.swing.text.StyleConstants -import javax.swing.text.StyleContext - -class TextPanel extends JPanel with ConsoleTarget { - - val textPane = new JTextPane; - val scrollPane = new JScrollPane(textPane); - val eb = new EmptyBorder(new Insets(10, 10, 10, 10)); - - setLayout(new BorderLayout()); - textPane.setBorder(eb); - textPane.setMargin(new Insets(5, 5, 5, 5)); - textPane.setEditable(false); - add(scrollPane); - - /** - * ********************************************* - * - * - * METHODS - * - * ******************************************** - */ - - def toFront() { - - } - - def append(msg: String, c: Color) { - val sc = StyleContext.getDefaultStyleContext(); - val aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.Foreground, c); - val len = textPane.getDocument().getLength(); - - textPane.setCaretPosition(len); - textPane.setCharacterAttributes(aset, false); - - try { - textPane.getDocument().insertString(getLength(), msg, aset); - } catch { - case e: BadLocationException => - // Can't print this since we would get feedback out stdout(stackoverflow) - } - - val caret = textPane.getCaret().asInstanceOf[DefaultCaret]; - caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); - - } - - def getLength(): Int = { - textPane.getDocument().getLength() - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TimeUtil.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TimeUtil.scala deleted file mode 100644 index 08ce620b..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/TimeUtil.scala +++ /dev/null @@ -1,19 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -object TimeUtil { - - def clock(f: => Unit): Double = { - val t0 = System.nanoTime() / 1e9 - f - System.nanoTime() / 1e9 - t0 - } - - def clockPrint(id: String)(f: => Unit) { - println(s"$id: " + clock(f)) - } - - def clockPrint(f: => Unit) { - println("Time elapsed(s): " + clock(f)) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Util.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Util.scala deleted file mode 100644 index 23693ea1..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/Util.scala +++ /dev/null @@ -1,91 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.io.BufferedInputStream -import java.io.BufferedOutputStream -import java.io.Closeable -import java.io.File -import java.io.FileInputStream -import java.io.FileOutputStream - -object Util { - - def manage[T <: Closeable, ReturnType](fopen: => T)(fuse: T => ReturnType): ReturnType = { - var t: T = null.asInstanceOf[T] - try { - t = fopen - fuse(t) - } finally { - if (t != null) t.close - } - } - - def clamp(_min: Short, _val: Short, _max: Short): Short = math.max(_min, math.min(_val, _max)).toShort - def clamp(_min: Int, _val: Int, _max: Int) = math.max(_min, math.min(_val, _max)) - def clamp(_min: Float, _val: Float, _max: Float) = math.max(_min, math.min(_val, _max)) - def clamp(_min: Double, _val: Double, _max: Double) = math.max(_min, math.min(_val, _max)) - - def manageFileIn(file: File)(fUse: BufferedInputStream => Unit) { - manage(new BufferedInputStream(new FileInputStream(file)))(fUse) - } - - def manageFileIn(fName: String)(fUse: BufferedInputStream => Unit) { - manageFileIn(new File(fName))(fUse) - } - - def manageFileOut(file: File)(fUse: BufferedOutputStream => Unit) { - manage(new BufferedOutputStream(new FileOutputStream(file)))(fUse) - } - - def manageFileOut(fName: String)(fUse: BufferedOutputStream => Unit) { - manageFileOut(new File(fName))(fUse) - } - - // def levenshtein(_a: String, _b: String) : Int = { - // val a = _a.toLowerCase(); - // val b = _b.toLowerCase(); - // // i == 0 - // val costs = new Array[Int](b.length() + 1) - // - // for(j <- 0 until costs.length){ - // costs(j) = j; - // } - // for(i <- 1 until a.length){ - // // j == 0; nw = lev(i - 1, j) - // costs(0) = i; - // var nw = i - 1; - // for (j <- 1 until b.length){ - // val cj = math.min(1 + math.min(costs(j), costs(j - 1)), ( if (a(i - 1) == b(j - 1)) nw else nw + 1)); - // nw = costs(j); - // costs(j) = cj; - // } - // } - // return costs(b.length()); - // } - - def levenshtein(str1: String, str2: String): Int = { - val lenStr1 = str1.length - val lenStr2 = str2.length - - val d: Array[Array[Int]] = Array.ofDim(lenStr1 + 1, lenStr2 + 1) - - for (i <- 0 to lenStr1) d(i)(0) = i - for (j <- 0 to lenStr2) d(0)(j) = j - - for (i <- 1 to lenStr1; j <- 1 to lenStr2) { - val cost = if (str1(i - 1) == str2(j - 1)) 0 else 1 - - d(i)(j) = min( - d(i - 1)(j) + 1, // deletion - d(i)(j - 1) + 1, // insertion - d(i - 1)(j - 1) + cost // substitution - ) - } - - val ret = d(lenStr1)(lenStr2) - println(s"str1: $str1, str2: $str2, ret: $ret") - ret - } - - def min(nums: Int*): Int = nums.min - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ZwingUtils.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ZwingUtils.scala deleted file mode 100644 index 24217b2f..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/util/ZwingUtils.scala +++ /dev/null @@ -1,21 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.util - -import java.awt.Component -import java.awt.event.KeyEvent - -import javax.swing.SwingUtilities - -object ZwingUtils { - - def hasAncestor(c: Component, potentialAncestor: Component): Boolean = { - SwingUtilities.isDescendingFrom(c, potentialAncestor) - } - - def originatesFromChild(e: KeyEvent, potentialAncestor: Component): Boolean = { - e.getSource() match { - case c: Component => hasAncestor(c, potentialAncestor) - case _ => false - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbsoluteLayout.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbsoluteLayout.scala deleted file mode 100644 index 8d1d00f5..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbsoluteLayout.scala +++ /dev/null @@ -1,32 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Component -import java.awt.Container -import java.awt.Dimension -import java.awt.LayoutManager - -class AbsoluteLayout extends LayoutManager { - override def addLayoutComponent(name: String, comp: Component) {} - override def removeLayoutComponent(comp: Component) {} - override def preferredLayoutSize(parent: Container) = { minimumLayoutSize(parent) } - override def layoutContainer(parent: Container) {} - override def minimumLayoutSize(parent: Container): Dimension = { - - val max = new Dimension() - - for (c <- parent.getComponents()) { - val x = c.getLocation().x; - val y = c.getLocation().y; - val width = c.getSize().width; - val height = c.getSize().height; - if (x + width > max.width) - max.width = x + width; - if (y + height > max.height) - max.height = y + height; - } - - max - - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbstractView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbstractView.scala deleted file mode 100644 index 956a3c15..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AbstractView.scala +++ /dev/null @@ -1,303 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Component -import java.awt.Container -import java.awt.Dimension -import java.awt.Graphics -import java.awt.Graphics2D -import java.awt.Point -import java.awt.Rectangle -import java.awt.event.ComponentAdapter -import java.awt.event.ComponentEvent - -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashSet - -import javax.swing.JComponent -import javax.swing.JPanel -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.control.ModelChangeListener -import se.culvertsoft.mgen.visualdesigner.control.UiPos -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity - -abstract class AbstractView( - _entity: Entity, - _controller: Controller, - _overlaySizePad: Int) extends ModelChangeListener { - - lazy val boundingComponent = addBoundsChangeListener(mkBoundingComponent()) - - lazy val _innerPanel = createInnerPanel() - lazy val overlayPanel = createOverlayGlassPane() - private val overlays = new ArrayBuffer[Overlay] - - private val childViews = new HashSet[AbstractView] - - private var _scaleFactorFromParent: Double = 1.0 - private var _viewComplexity: ViewComplexity = VIEW_COMPLEXITY_UNSET - - /** - * ********************************************************** - * - * METHODS - * - * ********************************************************* - */ - - def unregister() { _controller.removeObserver(this) } - def register() { _controller.addObserver(this) } - - def overlaySizePad() = _overlaySizePad - def maxBounds() = overlayPanel.getBounds().union(bounds()) - def innerPanel(): Container = _innerPanel - def bounds() = boundingComponent.getBounds() - def screenBounds() = UiPos.getScreenBoundsOfComp(boundingComponent) - def x() = bounds.x - def y() = bounds.y - def pos(): Point = new Point(x, y) - def width() = bounds.width - def height() = bounds.height - def size() = new Dimension(width, height) - def halfSize() = new Dimension(width / 2, height / 2) - def top(): Int = y - def right(): Int = x + width - def left(): Int = x - def bottom(): Int = y + height - def midX(): Int = (left + right) / 2 - def midY(): Int = (top + bottom) / 2 - def midPt(): Point = new Point(midX, midY) - def minWidth() = 10 - def minHeight() = 10 - def preferredWidth() = innerPanel.getWidth() - def preferredHeight() = innerPanel.getHeight() - def overlaySize(): Dimension = { new Dimension(overlayPanel.getWidth(), overlayPanel.getHeight()) } - def overlayOffset(): Point = { new Point(overlayPanel.getX() - x, overlayPanel.getY() - y) } - def controller(): Controller = _controller - def entity(): Entity = _entity - def isRootView(): Boolean = controller.viewMgr.isRoot(entity) - - def getParent(): Option[AbstractView] = { - controller.model.parentOf(entity).map(controller.viewMgr.view) - } - - def setX(x: Int) { setPos(x, y) } - def setY(y: Int) { setPos(x, y) } - def setPos(pt: Point) { setPos(pt.x, pt.y) } - def setPos(x: Int, y: Int) { setBounds(x, y, width, height) } - def setWidth(w: Int) { setSize(w, height) } - def setHeight(h: Int) { setSize(width, h) } - def setSize(dim: Dimension) { setSize(dim.width, dim.height) } - def setSize(w: Int, h: Int) { setBounds(x, y, w, h) } - def setBounds(bounds: Rectangle) { setBounds(bounds.x, bounds.y, bounds.width, bounds.height) } - - private def calcChildScaleFactor(): Double = { - _scaleFactorFromParent * (if (isRoot) 1.0 else childrenFitScaleFactor) - } - - def setBounds(x: Int, y: Int, width: Int, height: Int) { - if (boundingComponent.getX() != x || - boundingComponent.getY() != y || - boundingComponent.getWidth() != width || - boundingComponent.getHeight() != height) { - - boundingComponent.setBounds(x, y, width, height) - overlayPanel.setBounds( - x - overlaySizePad, - y - overlaySizePad, - width + overlaySizePad * 2, - height + overlaySizePad * 2) - overlays.foreach(_.reposition()) - checkViewComplexity() - } - } - - def add(view: AbstractView) { - view.beAddedToSwingParent(innerPanel) - childViews += view - view.updateScaleFactorReduction(calcChildScaleFactor) - } - - def remove(view: AbstractView) { - view.beRemovedFromSwingParent(innerPanel) - childViews.remove(view) - } - - def removeAllChildren() { - for (v <- childViews.toArray) { - remove(v) - } - } - - def createInnerPanel(): Container = { - new JPanel(new AbsoluteLayout) { - override def paintBorder(g: Graphics) { - super.paintBorder(g) - drawInnerPanelBorder(g.asInstanceOf[Graphics2D]) - } - override def paintComponent(g: Graphics) { - super.paintComponent(g) - drawInnerPanelComponent(g.asInstanceOf[Graphics2D]) - } - override def paintChildren(g: Graphics) { - super.paintChildren(g) - drawInnerPanelComponentAfterChildren(g.asInstanceOf[Graphics2D]) - } - override def isOptimizedDrawingEnabled(): Boolean = { - false - } - } - } - - def createOverlayGlassPane(): Container = { - new JPanel(new AbsoluteLayout) { - setOpaque(false) - override def paintBorder(g: Graphics) { drawOverlayPanelBorder(g.asInstanceOf[Graphics2D]) } - override def paintComponent(g: Graphics) { drawOverlayPanelComponent(g.asInstanceOf[Graphics2D]) } - } - } - - def addOverlay(o: Overlay) { - overlays += o - overlayPanel.add(o.component(), 0) - o.reposition() - } - - def addOverlay(component: JComponent, x: => Int, y: => Int, w: => Int, h: => Int) { - addOverlay(new Overlay(component, new Rectangle(x, y, w, h))) - } - - def addOverlayOffsetBounds(component: JComponent, x: => Int, y: => Int, w: => Int, h: => Int) { - addOverlay(new Overlay(component, new Rectangle(x - overlayOffset().x, y - overlayOffset().y, w, h))) - } - - def validate() { - if (!controller.isBulkOperationActive) { - boundingComponent.validate() - overlayPanel.validate() - } - } - - def isRoot(): Boolean = { - controller.viewMgr.isRoot(entity) - } - - def repaint() { - if (!controller.isBulkOperationActive) { - if (isRoot) { - controller.viewMgr.repaintAll() - } else { - overlayPanel.repaint() - } - } - } - - def requestFocus() { - } - - def hasFocus(): Boolean = { - false - } - - def parentComponent(): Container = { - boundingComponent.getParent() - } - - def mkBoundingComponent(): Component = { - innerPanel() - } - - def updateBounds() { - entity match { - case e: PlacedEntity => - setBounds( - (e.getPlacement().getX() * scaleFactor).toInt, - (e.getPlacement().getY() * scaleFactor).toInt, - (e.getPlacement().getWidth() * scaleFactor).toInt, - (e.getPlacement().getHeight() * scaleFactor).toInt) - case _ => - } - checkViewComplexity() - } - - final def childrenFitScaleFactor(): Double = { - 0.5 - } - - def updateScaleFactorReduction(newThisFactor: Double) { - _scaleFactorFromParent = newThisFactor - updateBounds() - rescaleChildren() - } - - def rescaleChildren() { - val newChildFactor = calcChildScaleFactor - for (v <- childViews) - v.updateScaleFactorReduction(newChildFactor) - } - - def scaleFactor(): Double = { - math.max(0.1, controller.viewMgr.scaleFactor * _scaleFactorFromParent) - } - - override def onIconOverrideChanged() { - checkViewComplexity() - } - - def checkViewComplexity() { - val desired = desiredViewComplexity - if (_viewComplexity != desired) { - onViewComplexityChange(desired) - _viewComplexity = desired - } - } - - def resetViewComplexity() { - _viewComplexity = VIEW_COMPLEXITY_UNSET - checkViewComplexity() - } - - /** - * ********************************************************** - * - * OPTIONAL OVERLOADS - * - * ********************************************************* - */ - - protected def drawInnerPanelBorder(g: Graphics2D) {} - protected def drawInnerPanelComponent(g: Graphics2D) {} - protected def drawInnerPanelComponentAfterChildren(g: Graphics2D) {} - protected def drawOverlayPanelBorder(g: Graphics2D) {} - protected def drawOverlayPanelComponent(g: Graphics2D) {} - protected def desiredViewComplexity(): ViewComplexity = { VIEW_COMPLEXITY_UNSET } - protected def onViewComplexityChange(complexity: ViewComplexity) {} - - /** - * ********************************************************** - * - * MANDATORY OVERLOADS - * - * ********************************************************* - */ - - def beAddedToSwingParent(parent: Container) - def beRemovedFromSwingParent(parent: Container) - - /** - * ********************************************************** - * - * some helpers... - * - * ********************************************************* - */ - - private final def addBoundsChangeListener(comp: Component): Component = { - comp.addComponentListener(new ComponentAdapter { - override def componentResized(e: ComponentEvent) { setBounds(x, y, width, height) } - override def componentMoved(e: ComponentEvent) { setBounds(x, y, width, height) } - }) - comp - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AddressField.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AddressField.scala deleted file mode 100644 index 8ec7ea3e..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/AddressField.scala +++ /dev/null @@ -1,60 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Dimension - -import javax.swing.JLabel -import javax.swing.JPanel -import javax.swing.JTextField -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.control.ControllerListener -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.view.autobox2.AutoBoxListener -import se.culvertsoft.mgen.visualdesigner.view.autobox2.EntityAutoBoxItem -import se.culvertsoft.mgen.visualdesigner.view.autobox2.SelectViewRootAutoBox2 - -class AddressField(controller: Controller) extends JPanel { - setLayout(new MigLayout("insets 3 3 5 3")) - - val prefix = "Viewing: " - val label = new JLabel(prefix) - val selectBtn = new SelectViewRootAutoBox2(controller) { - addObserver(new AutoBoxListener[EntityAutoBoxItem]() { - override def finishedItem(t: EntityAutoBoxItem) { - controller.model.getEntity(t.id) match { - case Some(entity) => controller.viewMgr.setViewRoot(entity) - case _ => - } - } - }) - - override def getToolTipText(): String = { - "Type or select view root" - } - - } - - val textField = new JTextField("?") - textField.setEnabled(false) - textField.setDisabledTextColor(Color.BLACK) - textField.setPreferredSize(new Dimension(99999, selectBtn.getPreferredSize().height)) - - add(label, "gapleft 10, align right") - add(textField, "gapleft 2, grow") - add(selectBtn, "gapleft 2") - - controller.addObserver(new ControllerListener() { - override def onViewRootChanged() { - textField.setText(" " + getAddressString(controller.viewMgr.root)) - } - }) - - def getAddressString(entity: Entity): String = { - controller.model.parentOf(entity) match { - case Some(parent) => getAddressString(parent) + " -> " + entity.getName() - case _ => entity.getName() - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/BackGrounded.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/BackGrounded.scala deleted file mode 100644 index 17521f1b..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/BackGrounded.scala +++ /dev/null @@ -1,42 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.BasicStroke -import java.awt.Color -import java.awt.Graphics2D - -import Graphics2DOps.RichGraphics2D - -object BackGrounded { - val BG_COLOR = new Color(240, 240, 240) -} - -trait BackGrounded { - self: AbstractView => - import Graphics2DOps._ - import BackGrounded._ - - val dashedLine = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, Array(1.0f), 0); - - def backgroundColor(): Color = { - BG_COLOR - } - - def drawBackground(g: Graphics2D) { - - g.color(backgroundColor()) { - g.fillRect(-10, -10, preferredWidth() + 15, preferredHeight() + 15) - } - - if (hasFocus()) { - g.stroke(dashedLine) { - val focusLineInset = 2 - g.drawRect( - focusLineInset, - focusLineInset, - preferredWidth() - 2 * focusLineInset - 1, - preferredHeight() - 2 * focusLineInset - 1) - } - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Bordered.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Bordered.scala deleted file mode 100644 index bf9b83b6..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Bordered.scala +++ /dev/null @@ -1,37 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Graphics2D - -import Graphics2DOps.RichGraphics2D -import se.culvertsoft.mgen.visualdesigner.util.Asof.AsofOps - -object Bordered { - val DEFAULT_COLOR = new Color(128, 128, 128) -} - -trait Bordered { - self: AbstractView => - import Graphics2DOps._ - import Bordered._ - - def borderColor(): Color = { - DEFAULT_COLOR - } - - def drawBorder(g: Graphics2D) { -/* - self.ifIs[AbstractView with BackGrounded] { self => - g.color(self.backgroundColor()) { - g.lineWidth(5) { - g.drawRect(0, 0, width - 1, height - 1); - } - } - } -*/ - g.color(borderColor()) { - g.drawRect(0, 0, width - 1, height - 1); - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClampPos.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClampPos.scala deleted file mode 100644 index 68489337..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClampPos.scala +++ /dev/null @@ -1,33 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Component - -object ClampPos { - - def apply(toClamp: Component, within: Component, pad: Int = 20) { - - val bounds = toClamp.getBounds() - val window = within.getBounds() - - val dx = - if (bounds.x < (window.x + pad)) { - window.x + pad - bounds.x - } else if ((bounds.x + bounds.width + pad) > (window.x + window.width)) { - (window.x + window.width) - (pad + bounds.x + bounds.width) - } else { - 0 - } - - val dy = - if (bounds.y < (window.y + pad)) { - window.y + pad - bounds.y - } else if ((bounds.y + bounds.height + pad) > (window.y + window.height)) { - (window.y + window.height) - (pad + bounds.y + bounds.height) - } else { - 0 - } - - toClamp.setLocation(bounds.x + dx, bounds.y + dy) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassView.scala deleted file mode 100644 index bfbc0724..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassView.scala +++ /dev/null @@ -1,224 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Dimension -import java.awt.Graphics2D - -import scala.collection.JavaConversions.asScalaBuffer -import scala.language.reflectiveCalls - -import javax.swing.JCheckBox -import javax.swing.JLabel -import javax.swing.ScrollPaneConstants -import javax.swing.SwingConstants -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.NoType -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef -import se.culvertsoft.mgen.visualdesigner.view.autobox2.AutoBoxListener -import se.culvertsoft.mgen.visualdesigner.view.autobox2.FieldTypeAutoBoxItem -import se.culvertsoft.mgen.visualdesigner.view.autobox2.SuperTypeAutoComboBox2 - -object ClassView { - val BG_COLOR = new Color(210, 210, 210) -} - -class ClassView(override val entity: CustomType, controller: Controller) - extends ScrollableView(entity, controller) - with BackGrounded - with Bordered - with Labeled - with Selectable - with SelectionBoxable - with Inheritable - with Movable - with Resizeable - with CursorChanging { - - override def onEntityModified(child: Entity, validate: Boolean, parent: Option[Entity]) { - super.onEntityModified(child, validate, parent) - - if (child eq entity) { - nameLabel.setText(nameLabel.getText()) - nameLabel.updateTooltipText() - superTypeComboBox.onNewSuperType(entity.getSuperType()) - if (validate) - super.validate() - super.repaint() - } - - if (entity.hasSuperType()) { - if (controller.model.existsReference(entity.getSuperType(), child)) { - superTypeComboBox.update() - } - } - } - - val abstractCheckBox = new JCheckBox() { - addMouseListener(selectMouseListenerWOFocus) - } - - val nameLabel = new JLabel { - override def getText(): String = entity.getName() - addMouseListener(selectMouseListenerWFocus) - addMouseListener(moveByMouseListener) - addMouseListener(renameDblClickMouseListener) - override def getMinimumSize(): Dimension = { - new Dimension(30, super.getMinimumSize().height) - } - def updateTooltipText() { - setToolTipText(s"class name: ${entity.getName}") - } - updateTooltipText() - setHorizontalAlignment(SwingConstants.CENTER) - } - - val colonLabel = new JLabel(":") { - addMouseListener(selectMouseListenerWFocus) - addMouseListener(moveByMouseListener) - addMouseListener(renameDblClickMouseListener) - } - - val superTypeComboBox = new SuperTypeAutoComboBox2(entity, controller) { - addExternalMouseListener(selectMouseListenerWOFocus) - addMouseListener(renameDblClickMouseListener) - override def getMinimumSize(): Dimension = { - new Dimension(0, super.getMinimumSize().height) - } - addObserver(new AutoBoxListener[FieldTypeAutoBoxItem]() { - override def finishedItem(item: FieldTypeAutoBoxItem) { - println("Finished super") - item.fieldType match { - case fieldType: UserTypeRef => - val t = controller.model.getEntity(fieldType.getId()).get.asInstanceOf[CustomType] - controller.changeSuperType(entity, t) - case fieldType: NoType => - controller.removeSuperTypeOf(entity) - } - } - }) - /* override def getPreferredSize(): Dimension = { - new Dimension(80, super.getMinimumSize().height) - }*/ - setMaximumSize(new Dimension(9999, colonLabel.getPreferredSize().height)) - - } - - override def desiredViewComplexity(): ViewComplexity = { - if (ClassView.this.width < 100 || controller.viewMgr.isIconOverrideActive) { - VIEW_COMPLEXITY_SIMPLE - } else { - VIEW_COMPLEXITY_COMPLEX - } - } - - override def onViewComplexityChange(complexity: ViewComplexity) { - complexity match { - case VIEW_COMPLEXITY_SIMPLE => setSimple() - case _ => setComplex() - } - } - - //superTypeComboBox.setMaximumSize(new Dimension(width() / 3, superTypeComboBox.getPreferredSize().height)) - superTypeComboBox.setOpaque(false) - abstractCheckBox.setOpaque(false) - abstractCheckBox.setToolTipText("abstract") - - scrollpane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) - - val layout = new ClassOrEnumViewLayout(this, () => entity.getFields(), controller) - innerPanel().setLayout(layout) - - resetViewComplexity() - - /** - * *************************************************************************** - * - * - * METHODS - * - * ************************************************************************** - */ - - def setSimple() { - if (labelPanel != null) { - labelPanel.removeAll() - labelPanel.setLayout(new MigLayout("center, insets 2 0 0 0")) - labelPanel.add(nameLabel, "align center") - labelPanel.validate() - labelPanel.repaint() - } - } - - def setComplex() { - if (labelPanel != null) { - labelPanel.removeAll() - labelPanel.setOpaque(false) - labelPanel.setLayout(new MigLayout("center, insets 2 0 0 0")) - //labelPanel.add(abstractCheckBox, " width 5%, gapleft 5") - labelPanel.add(nameLabel, "gapleft 5") - labelPanel.add(colonLabel, "gapleft 3") - labelPanel.add(superTypeComboBox, "gapleft 5, width 30%" /*, width 30%, wrap, "gapleft 10, width 30%!"*/ ) - labelPanel.validate() - labelPanel.repaint() - } - } - - override def labelWidth(i: Int = labelTextWidth): Int = { - width - 1 - } - - override def labelText(): String = { - entity.getName() - } - - override def labelBackgroundColor(): Color = { - ClassView.BG_COLOR - } - - override def backgroundColor(): Color = { - ClassView.BG_COLOR - } - - override def resizeableAtCorners(): Boolean = { - true - } - - override def resizeableEW(): Boolean = { - true - } - - override def resizeableNS(): Boolean = { - false - } - - override def initRename() { - controller.renameSelection() - } - - override protected def drawScrollpaneBorder(g: Graphics2D) { - drawBorder(g) - } - - override protected def drawInnerPanelComponent(g: Graphics2D) { - drawBackground(g) - } - - override def setBounds(x: Int, y: Int, width: Int, height: Int) { - /* if (superTypeComboBox != null) - superTypeComboBox.setMaximumSize(new Dimension(width / 4, superTypeComboBox.getPreferredSize().height)) - */ super.setBounds(x, y, width, height) - innerPanel.setBounds(innerPanel.getX(), innerPanel.getY(), width, innerPanel.getHeight()) - } - - override def drawLabelText(g: Graphics2D) { - - } - - override def rescaleChildren() { - // Currently does nothing - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassViewLayout.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassViewLayout.scala deleted file mode 100644 index ccd6fdd0..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ClassViewLayout.scala +++ /dev/null @@ -1,47 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Container -import java.awt.Dimension - -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.Entity - -class ClassOrEnumViewLayout( - classView: ScrollableView, - fGetChildren: () => Seq[Entity], - controller: Controller) extends AbsoluteLayout { - - val xFieldPad = 2 - val yFieldPad = 1 - val innerFieldHeight = 26 - val outerFieldHeight = innerFieldHeight + yFieldPad - - override def preferredLayoutSize(parent: Container) = { - minimumLayoutSize(parent) - } - - override def layoutContainer(parent: Container) { - - val y0 = yFieldPad + 1 - val fields = fGetChildren() - val x = xFieldPad - val w = math.max(40, classView.scrollpane.getWidth() - 2 * xFieldPad - 2) - val h = innerFieldHeight - - controller.bulkOperation { - for ((field, i) <- fields.zipWithIndex) { - val y = y0 + i * outerFieldHeight - val view = controller.viewMgr.view(field) - view.setBounds(x, y, w, h) - } - } - - } - - override def minimumLayoutSize(parent: Container): Dimension = { - val types = fGetChildren() - val h = fGetChildren().size * outerFieldHeight - new Dimension(math.max(100, classView.scrollpane.getWidth() - 10), h) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ContentPane.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ContentPane.scala deleted file mode 100644 index 2ce07d1d..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ContentPane.scala +++ /dev/null @@ -1,18 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Graphics -import java.awt.Graphics2D - -import javax.swing.JPanel -import se.culvertsoft.mgen.visualdesigner.util.Observable - -class ContentPane - extends JPanel - with Observable[PaintListener] { - - override def paintChildren(g: Graphics) { - triggerObservers(_.prePaint(g.asInstanceOf[Graphics2D])) - super.paintChildren(g) - triggerObservers(_.postPaint(g.asInstanceOf[Graphics2D])) - } -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/CursorChanging.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/CursorChanging.scala deleted file mode 100644 index b3f8bd33..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/CursorChanging.scala +++ /dev/null @@ -1,51 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Component -import java.awt.Cursor -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent - -import se.culvertsoft.mgen.visualdesigner.util.Asof.AsofOps - -trait CursorChanging { - self: AbstractView => - import Graphics2DOps._ - import Labeled._ - - val cursorChange_btn = createEnterExitCursorChangeListener(Cursor.HAND_CURSOR) - val cursorChange_N_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.N_RESIZE_CURSOR) - val cursorChange_NE_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.NE_RESIZE_CURSOR) - val cursorChange_E_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.E_RESIZE_CURSOR) - val cursorChange_SE_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.SE_RESIZE_CURSOR) - val cursorChange_S_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.S_RESIZE_CURSOR) - val cursorChange_SW_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.SW_RESIZE_CURSOR) - val cursorChange_W_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.W_RESIZE_CURSOR) - val cursorChange_NW_RESIZE_CURSOR = createEnterExitCursorChangeListener(Cursor.NW_RESIZE_CURSOR) - - - this.ifIs[Resizeable with Selectable](x => { - x.RESIZE_SQUARE_N.addMouseListener(cursorChange_N_RESIZE_CURSOR) - x.RESIZE_SQUARE_NE.addMouseListener(cursorChange_NE_RESIZE_CURSOR) - x.RESIZE_SQUARE_E.addMouseListener(cursorChange_E_RESIZE_CURSOR) - x.RESIZE_SQUARE_SE.addMouseListener(cursorChange_SE_RESIZE_CURSOR) - x.RESIZE_SQUARE_S.addMouseListener(cursorChange_S_RESIZE_CURSOR) - x.RESIZE_SQUARE_SW.addMouseListener(cursorChange_SW_RESIZE_CURSOR) - x.RESIZE_SQUARE_W.addMouseListener(cursorChange_W_RESIZE_CURSOR) - x.RESIZE_SQUARE_NW.addMouseListener(cursorChange_NW_RESIZE_CURSOR) - }) - - def createEnterExitCursorChangeListener(id: Int): MouseAdapter = { - new MouseAdapter() { - override def mouseEntered(e: MouseEvent) { - if (isRootView()) - controller.mouseInputMgr.setCursor(Cursor.DEFAULT_CURSOR) - else - controller.mouseInputMgr.setCursor(id) - } - override def mouseExited(e: MouseEvent) { - controller.mouseInputMgr.setCursor(Cursor.DEFAULT_CURSOR) - } - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumEntryView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumEntryView.scala deleted file mode 100644 index 7e2a70fc..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumEntryView.scala +++ /dev/null @@ -1,197 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.BorderLayout -import java.awt.Graphics -import java.awt.Graphics2D -import java.awt.GridLayout -import java.awt.Insets -import java.awt.event.ActionEvent -import java.awt.event.FocusAdapter -import java.awt.event.FocusEvent -import java.awt.event.FocusListener -import java.awt.event.KeyEvent - -import javax.swing.AbstractAction -import javax.swing.JPanel -import javax.swing.JTextField -import javax.swing.SwingConstants -import javax.swing.ToolTipManager -import javax.swing.border.EmptyBorder -import se.culvertsoft.mgen.visualdesigner.HotKey -import se.culvertsoft.mgen.visualdesigner.HotKey.toStroke -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry - -object EnumEntryView { - val FIELD_FONT = FieldView.FIELD_FONT -} - -class EnumEntryView( - entry: EnumEntry, - controller: Controller) - extends StandardView(entry, controller, 5) - with BackGrounded - with Bordered - with Selectable - with Movable - with CursorChanging { - import EnumEntryView._ - - innerPanel.setLayout(new BorderLayout()) - - override def onEntityModified(child: Entity, validate: Boolean, parent: Option[Entity]) { - - } - - val fieldPanel = new JPanel(new GridLayout(1, 3, 3, 3)) { - setOpaque(false) - setBorder(new EmptyBorder(4, 2, 5, 2)) - } - - val nameField = new EditLabel(entry.getName()) { - setFont(FIELD_FONT) - setMargin(new Insets(1, 1, 1, 4)) - setHorizontalAlignment(SwingConstants.RIGHT) - addFocusListener(new FocusAdapter() { - override def focusLost(e: FocusEvent) { - controller.rename(entry, getText()) - } - }) - override def getToolTipText(): String = { - s"enum entry name: ${entry.getName()}" - } - } - - val constantField = new EditLabel(entry.getConstant) { - setFont(FIELD_FONT) - setMargin(new Insets(1, 5, 1, 1)) - setHorizontalAlignment(SwingConstants.LEFT) - - addFocusListener(new FocusAdapter() { - override def focusLost(e: FocusEvent) { - controller.changeEnumEntryConstant(entry, getText()) - } - }) - override def getToolTipText(): String = { - s"enum entry constant: ${getText()}" - } - } - - val ttmgr = ToolTipManager.sharedInstance() - - ttmgr.registerComponent(nameField) - ttmgr.registerComponent(constantField) - - innerPanel.add(fieldPanel) - - resetViewComplexity() - - /** - * *************************************************************** - * - * - * METHODS - * - * ************************************************************** - */ - - override def desiredViewComplexity(): ViewComplexity = { - if (EnumEntryView.this.width < 150 || controller.viewMgr.isIconOverrideActive) { - VIEW_COMPLEXITY_SIMPLE - } else { - VIEW_COMPLEXITY_COMPLEX - } - } - - override def onViewComplexityChange(complexity: ViewComplexity) { - complexity match { - case VIEW_COMPLEXITY_COMPLEX => setComplex() - case _ => setSimple() - } - } - - def setComplex() { - if (fieldPanel != null) { - fieldPanel.removeAll() - fieldPanel.add(nameField) - fieldPanel.add(constantField) - nameField.setHorizontalAlignment(SwingConstants.RIGHT) - fieldPanel.validate() - fieldPanel.repaint() - } - } - - def setSimple() { - if (fieldPanel != null) { - fieldPanel.removeAll() - fieldPanel.add(nameField) - nameField.setHorizontalAlignment(SwingConstants.CENTER) - fieldPanel.validate() - fieldPanel.repaint() - } - } - - override protected def drawInnerPanelBorder(g: Graphics2D) { drawBorder(g) } - override protected def drawInnerPanelComponent(g: Graphics2D) { drawBackground(g) } - - class EditLabel(resetString: => String) extends JTextField(resetString) { - - override def paintBorder(g: Graphics) { - if (hasFocus()) { - super.paintBorder(g) - } - } - - override def paintComponent(g: Graphics) { - super.paintComponent(g) - } - - addFocusListener(new FocusListener() { - override def focusGained(e: FocusEvent) { - - if (!EnumEntryView.this.isSelected()) { - controller.select(entry, true, false) - } - - setOpaque(true) - setSelectionStart(0) - setSelectionEnd(getText().length()) - repaint() - } - override def focusLost(e: FocusEvent) { - setOpaque(false) - repaint() - } - }) - - val im = getInputMap() - val am = getActionMap() - - // Enter key - im.put(HotKey(KeyEvent.VK_ENTER), "ok") - am.put("ok", new AbstractAction { - override def actionPerformed(e: ActionEvent) { - transferFocus() - } - }) - - // Escape key - im.put(HotKey(KeyEvent.VK_ESCAPE), "cancel") - am.put("cancel", new AbstractAction { - override def actionPerformed(e: ActionEvent) { - setText(resetString) - EnumEntryView.this.requestFocus() - //transferFocus() - } - }) - - setOpaque(false) - - } - - override def rescaleChildren() { - // Currently does nothing - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumView.scala deleted file mode 100644 index 2acdf0d2..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/EnumView.scala +++ /dev/null @@ -1,174 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Dimension -import java.awt.Graphics2D -import scala.language.reflectiveCalls -import javax.swing.JCheckBox -import javax.swing.JLabel -import javax.swing.ScrollPaneConstants -import javax.swing.SwingConstants -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.NoType -import se.culvertsoft.mgen.visualdesigner.view.autobox2.AutoBoxListener -import se.culvertsoft.mgen.visualdesigner.view.autobox2.FieldTypeAutoBoxItem -import se.culvertsoft.mgen.visualdesigner.view.autobox2.SuperTypeAutoComboBox2 -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef -import se.culvertsoft.mgen.visualdesigner.model.EnumType - -import scala.collection.JavaConversions._ - -object EnumView { - val BG_COLOR = ClassView.BG_COLOR -} - -class EnumView(override val entity: EnumType, controller: Controller) - extends ScrollableView(entity, controller) - with BackGrounded - with Bordered - with Labeled - with Selectable - with SelectionBoxable - with Movable - with Resizeable - with CursorChanging { - - override def onEntityModified(child: Entity, validate: Boolean, parent: Option[Entity]) { - super.onEntityModified(child, validate, parent) - - if (child eq entity) { - nameLabel.setText(nameLabel.getText()) - nameLabel.updateTooltipText() - if (validate) - super.validate() - super.repaint() - } - - } - - val nameLabel = new JLabel { - override def getText(): String = entity.getName() - addMouseListener(selectMouseListenerWFocus) - addMouseListener(moveByMouseListener) - addMouseListener(renameDblClickMouseListener) - override def getMinimumSize(): Dimension = { - new Dimension(30, super.getMinimumSize().height) - } - def updateTooltipText() { - setToolTipText(s"class name: ${entity.getName}") - } - updateTooltipText() - setHorizontalAlignment(SwingConstants.CENTER) - } - - override def desiredViewComplexity(): ViewComplexity = { - if (EnumView.this.width < 100 || controller.viewMgr.isIconOverrideActive) { - VIEW_COMPLEXITY_SIMPLE - } else { - VIEW_COMPLEXITY_COMPLEX - } - } - - override def onViewComplexityChange(complexity: ViewComplexity) { - complexity match { - case VIEW_COMPLEXITY_SIMPLE => setSimple() - case _ => setComplex() - } - } - - scrollpane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) - - val layout = new ClassOrEnumViewLayout(this, () => entity.getEntries(), controller) - innerPanel().setLayout(layout) - - resetViewComplexity() - - /** - * *************************************************************************** - * - * - * METHODS - * - * ************************************************************************** - */ - - def setSimple() { - if (labelPanel != null) { - labelPanel.removeAll() - labelPanel.setLayout(new MigLayout("center, insets 2 0 0 0")) - labelPanel.add(nameLabel, "align center") - labelPanel.validate() - labelPanel.repaint() - } - } - - def setComplex() { - if (labelPanel != null) { - labelPanel.removeAll() - labelPanel.setOpaque(false) - labelPanel.setLayout(new MigLayout("center, insets 2 0 0 0")) - labelPanel.add(nameLabel, "align center") - labelPanel.validate() - labelPanel.repaint() - } - } - - override def labelWidth(i: Int = labelTextWidth): Int = { - width - 1 - } - - override def labelText(): String = { - entity.getName() - } - - override def labelBackgroundColor(): Color = { - EnumView.BG_COLOR - } - - override def backgroundColor(): Color = { - EnumView.BG_COLOR - } - - override def resizeableAtCorners(): Boolean = { - true - } - - override def resizeableEW(): Boolean = { - true - } - - override def resizeableNS(): Boolean = { - false - } - - override def initRename() { - controller.renameSelection() - } - - override protected def drawScrollpaneBorder(g: Graphics2D) { - drawBorder(g) - } - - override protected def drawInnerPanelComponent(g: Graphics2D) { - drawBackground(g) - } - - override def setBounds(x: Int, y: Int, width: Int, height: Int) { - /* if (superTypeComboBox != null) - superTypeComboBox.setMaximumSize(new Dimension(width / 4, superTypeComboBox.getPreferredSize().height)) - */ super.setBounds(x, y, width, height) - innerPanel.setBounds(innerPanel.getX(), innerPanel.getY(), width, innerPanel.getHeight()) - } - - override def drawLabelText(g: Graphics2D) { - - } - - override def rescaleChildren() { - // Currently does nothing - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FieldView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FieldView.scala deleted file mode 100644 index 787deb2c..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FieldView.scala +++ /dev/null @@ -1,232 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.BorderLayout -import java.awt.Font -import java.awt.Graphics -import java.awt.Graphics2D -import java.awt.GridLayout -import java.awt.Insets -import java.awt.event.ActionEvent -import java.awt.event.FocusAdapter -import java.awt.event.FocusEvent -import java.awt.event.FocusListener -import java.awt.event.KeyEvent -import java.util.ArrayList - -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.JavaConversions.seqAsJavaList - -import javax.swing.AbstractAction -import javax.swing.JPanel -import javax.swing.JTextField -import javax.swing.SwingConstants -import javax.swing.ToolTipManager -import javax.swing.border.EmptyBorder -import se.culvertsoft.mgen.visualdesigner.HotKey -import se.culvertsoft.mgen.visualdesigner.HotKey.toStroke -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.view.autobox2.AutoBoxListener -import se.culvertsoft.mgen.visualdesigner.view.autobox2.ClassFieldTypeAutoComboBox2 -import se.culvertsoft.mgen.visualdesigner.view.autobox2.FieldTypeAutoBoxItem - -object FieldView { - val FIELD_FONT = new Font("Arial", Font.PLAIN, 10) -} - -class FieldView( - field: CustomTypeField, - controller: Controller) - extends StandardView(field, controller, 5) - with BackGrounded - with Bordered - with Selectable - with Movable - with CursorChanging { - import FieldView._ - - innerPanel.setLayout(new BorderLayout()) - - override def onEntityModified(child: Entity, validate: Boolean, parent: Option[Entity]) { - if (controller.model.existsReference(field.getType(), child)) { - typeField.update() - } - } - - val fieldPanel = new JPanel(new GridLayout(1, 3, 3, 3)) { - setOpaque(false) - setBorder(new EmptyBorder(4, 2, 5, 2)) - } - - val nameField = new EditLabel(field.getName()) { - setFont(FIELD_FONT) - setMargin(new Insets(1, 1, 1, 4)) - setHorizontalAlignment(SwingConstants.RIGHT) - addFocusListener(new FocusAdapter() { - override def focusLost(e: FocusEvent) { - controller.rename(field, getText()) - } - }) - override def getToolTipText(): String = { - s"field name: ${field.getName()}" - } - } - - val typeField = new ClassFieldTypeAutoComboBox2(field.getType(), controller) { - - setFont(FIELD_FONT) - addObserver(new AutoBoxListener[FieldTypeAutoBoxItem]() { - override def requestFocusUp() { - FieldView.this.requestFocus() - } - override def finishedItem(newType: FieldTypeAutoBoxItem) { - controller.changeType(field, newType.fieldType) - } - override def focusGained(e: FocusEvent) { - if (!FieldView.this.isSelected()) { - controller.select(field, true, false) - } - } - }) - override def getToolTipText(): String = { - s"field ${super.getToolTipText()}" - } - } - - val flagsField = new EditLabel(field.getFlags().map(_.trim()).mkString(", ")) { - setFont(FIELD_FONT) - setMargin(new Insets(1, 5, 1, 1)) - setHorizontalAlignment(SwingConstants.LEFT) - - addFocusListener(new FocusAdapter() { - override def focusLost(e: FocusEvent) { - val text = if (getText() != null) getText() else "" - val flags = new ArrayList(text.split(",").map(_.trim()).filter(_.nonEmpty).toList) - controller.changeFlags(field, flags) - } - }) - override def getToolTipText(): String = { - s"field flags: ${getText()}" - } - } - - val ttmgr = ToolTipManager.sharedInstance() - - ttmgr.registerComponent(nameField) - ttmgr.registerComponent(typeField) - ttmgr.registerComponent(flagsField) - - innerPanel.add(fieldPanel) - - resetViewComplexity() - - /** - * *************************************************************** - * - * - * METHODS - * - * ************************************************************** - */ - - override def desiredViewComplexity(): ViewComplexity = { - if (FieldView.this.width < 150 || controller.viewMgr.isIconOverrideActive) { - VIEW_COMPLEXITY_SIMPLE - } else { - VIEW_COMPLEXITY_COMPLEX - } - } - - override def onViewComplexityChange(complexity: ViewComplexity) { - complexity match { - case VIEW_COMPLEXITY_COMPLEX => setComplex() - case _ => setSimple() - } - } - - def setComplex() { - if (fieldPanel != null) { - fieldPanel.removeAll() - fieldPanel.add(nameField) - fieldPanel.add(typeField) - fieldPanel.add(flagsField) - fieldPanel.validate() - fieldPanel.repaint() - } - } - - def setSimple() { - if (fieldPanel != null) { - fieldPanel.removeAll() - fieldPanel.add(nameField) - fieldPanel.add(typeField) - //fieldPanel.add(flagsField) - fieldPanel.validate() - fieldPanel.repaint() - } - } - - override protected def drawInnerPanelBorder(g: Graphics2D) { drawBorder(g) } - override protected def drawInnerPanelComponent(g: Graphics2D) { drawBackground(g) } - - class EditLabel(resetString: => String) extends JTextField(resetString) { - - override def paintBorder(g: Graphics) { - if (hasFocus()) { - super.paintBorder(g) - } - } - - override def paintComponent(g: Graphics) { - super.paintComponent(g) - } - - addFocusListener(new FocusListener() { - override def focusGained(e: FocusEvent) { - - if (!FieldView.this.isSelected()) { - controller.select(field, true, false) - } - - setOpaque(true) - setSelectionStart(0) - setSelectionEnd(getText().length()) - repaint() - } - override def focusLost(e: FocusEvent) { - setOpaque(false) - repaint() - } - }) - - val im = getInputMap() - val am = getActionMap() - - // Enter key - im.put(HotKey(KeyEvent.VK_ENTER), "ok") - am.put("ok", new AbstractAction { - override def actionPerformed(e: ActionEvent) { - transferFocus() - } - }) - - // Escape key - im.put(HotKey(KeyEvent.VK_ESCAPE), "cancel") - am.put("cancel", new AbstractAction { - override def actionPerformed(e: ActionEvent) { - setText(resetString) - FieldView.this.requestFocus() - //transferFocus() - } - }) - - setOpaque(false) - - } - - override def rescaleChildren() { - // Currently does nothing - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FocusHelper.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FocusHelper.scala deleted file mode 100644 index 3566c772..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/FocusHelper.scala +++ /dev/null @@ -1,49 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Graphics -import java.awt.event.FocusAdapter -import java.awt.event.FocusEvent - -import javax.swing.ButtonModel -import javax.swing.JButton -import javax.swing.event.ChangeEvent -import javax.swing.event.ChangeListener -import se.culvertsoft.mgen.visualdesigner.control.Controller - -class FocusHelper( - parent: AbstractView, - controller: Controller) extends JButton { - - var _pressed = false - - override def paintBorder(g: Graphics) { - } - - override def paintComponent(g: Graphics) { - } - - addFocusListener(new FocusAdapter() { - override def focusGained(e: FocusEvent) { - controller.focusGained(parent.entity) - } - override def focusLost(e: FocusEvent) { - controller.focusLost(parent.entity) - } - }) - - getModel().addChangeListener(new ChangeListener() { - override def stateChanged(e: ChangeEvent) { - val model = e.getSource().asInstanceOf[ButtonModel] - if (model.isPressed() && !_pressed) { - controller.select( - parent.entity, - !controller.keyboardInputMgr.isControlDown()) - } - _pressed = model.isPressed() - } - }) - - setBounds(0, 0, 0, 0) - setOpaque(false) - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Graphics2DOps.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Graphics2DOps.scala deleted file mode 100644 index 60e3668d..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Graphics2DOps.scala +++ /dev/null @@ -1,43 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.BasicStroke -import java.awt.Color -import java.awt.Graphics2D -import java.awt.Point -import java.awt.Stroke - -object Graphics2DOps { - - implicit class RichGraphics2D(g: Graphics2D) { - - def color(c: Color)(f: => Unit) { - val prevColor = g.getColor() - g.setColor(c) - f - g.setColor(prevColor) - } - - def stroke(s: Stroke)(f: => Unit) { - val prevStroke = g.getStroke() - g.setStroke(s) - f - g.setStroke(prevStroke) - } - - def transl(x: Int, y: Int)(f: => Unit) { - g.translate(x, y) - f - g.translate(-x, -y) - } - - def transl(p: Point)(f: => Unit) { - transl(p.x, p.y)(f) - } - - def lineWidth(lw: Int)(f: => Unit) { - stroke(new BasicStroke(lw))(f) - } - - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Inheritable.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Inheritable.scala deleted file mode 100644 index 24c0f85e..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Inheritable.scala +++ /dev/null @@ -1,68 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Graphics -import java.awt.Graphics2D -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent - -import Graphics2DOps.RichGraphics2D -import javax.swing.JPanel - -object Inheritable { - val INHERITS_COLOR = Color.CYAN -} - -trait Inheritable { - self: ClassView with Selectable => - import Graphics2DOps._ - import Inheritable._ - - private val D = Resizeable.RESIZE_SQUARE_WIDTH * 6 / 5 - private val r = D / 2 - - val inhUpPanel = new InhBall() { setToolTipText("Click and drag from this point to set a super class") } - val inhDownPanel = new InhBall() { setToolTipText("Click and drag from this point to create a new sub class") } - - inhUpPanel.addMouseListener(selectMouseListenerWOFocus) - inhDownPanel.addMouseListener(selectMouseListenerWOFocus) - - inhUpPanel.addMouseMotionListener(new MouseAdapter() { - override def mouseDragged(e: MouseEvent) { - controller.mouseInputMgr.startMouseDragAttachSuperTypeAction(entity, e) - } - }) - - inhDownPanel.addMouseMotionListener(new MouseAdapter() { - override def mouseDragged(e: MouseEvent) { - controller.mouseInputMgr.startMouseDragCreateSubTypeAction(entity, e) - } - }) - - addOverlayOffsetBounds(inhUpPanel, width() / 2 - r, -r, D, D) - addOverlayOffsetBounds(inhDownPanel, width() / 2 - r, height() - r, D, D) - - def drawInheritable(g: Graphics2D) { - - def fillCall = (g.fillArc _).tupled - def drawCall = (g.drawArc _).tupled - - val args = (0, 0, D, D, 0, 360) - - if (isHovered() || isSelected()) { - g.color(borderColor()) { - fillCall(args) - } - } - - } - - class InhBall extends JPanel { - override def paintBorder(g: Graphics) {} - override def paintComponent(g: Graphics) { - drawInheritable(g.asInstanceOf[Graphics2D]) - } - setSize(D, D) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Labeled.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Labeled.scala deleted file mode 100644 index 27844c83..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Labeled.scala +++ /dev/null @@ -1,167 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Graphics -import java.awt.Graphics2D -import java.awt.event.ActionEvent -import java.awt.event.FocusAdapter -import java.awt.event.FocusEvent -import java.awt.event.KeyEvent -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent - -import Graphics2DOps.RichGraphics2D -import javax.swing.AbstractAction -import javax.swing.JPanel -import javax.swing.JTextField -import se.culvertsoft.mgen.visualdesigner.HotKey -import se.culvertsoft.mgen.visualdesigner.HotKey.toStroke - -object Labeled { - val BG_COLOR = new Color(240, 240, 240) - val DEFAULT_PADDING = 10 - val DEFAULT_BORDER_COLOR = Bordered.DEFAULT_COLOR - val DEFAULT_TEXT_COLOR = Color.DARK_GRAY - val LABEL_PADDING = 10 - val LABEL_HEIGHT = 22 - val OVERFLOW_TEXT_ENDING = "..." -} - -trait Labeled { - self: AbstractView => - import Graphics2DOps._ - import Labeled._ - - var labelTextWidth = 0 - var overflowTextEndingWidth = 0 - - val labelPanel = new JPanel() { - override def paintComponent(g: Graphics) { - drawLabel(g.asInstanceOf[Graphics2D]) - } - } - addOverlayOffsetBounds(labelPanel, 0, -labelHeight(), labelWidth(), labelHeight()) - - val acceptAction = new AbstractAction() { - override def actionPerformed(e: ActionEvent) { - acceptRename() - } - } - - val cancelAction = new AbstractAction() { - override def actionPerformed(e: ActionEvent) { - cancelRename() - } - } - - val renameTextField = new JTextField - renameTextField.getInputMap().put(HotKey(KeyEvent.VK_ENTER), "accept") - renameTextField.getInputMap().put(HotKey(KeyEvent.VK_ESCAPE), "cancel") - renameTextField.getActionMap().put("accept", acceptAction) - renameTextField.getActionMap().put("cancel", cancelAction) - val renameDblClickMouseListener = new MouseAdapter() { - override def mouseClicked(e: MouseEvent) { - if (e.getClickCount() == 2 && renameTextField.getParent() == null) { - initRename() - } - } - } - - renameTextField.addFocusListener(new FocusAdapter() { - override def focusLost(e: FocusEvent) { - acceptRename() - } - }) - - def initRename() { - renameTextField.setText(self.entity.getName()) - renameTextField.setSelectionStart(0) - renameTextField.setSelectionEnd(self.entity.getName().length()) - renameTextField.setPreferredSize(labelPanel.getSize()) - labelPanel.add(renameTextField) - labelPanel.validate() - labelPanel.repaint() - renameTextField.requestFocusInWindow() - } - - def cancelRename() { - labelPanel.remove(renameTextField) - labelPanel.repaint() - } - - def acceptRename() { - if (renameTextField.getParent() != null) { - labelPanel.remove(renameTextField) - labelPanel.repaint() - controller.rename(entity, renameTextField.getText()) - } - } - - labelPanel.addMouseListener(renameDblClickMouseListener) - - def getLabelTextWidth(g: Graphics2D, label: String = labelText): Int = g.getFontMetrics().stringWidth(label) - def getLabelTextHeight(g: Graphics2D): Int = g.getFontMetrics().getHeight() - - def labelHeight(): Int = LABEL_HEIGHT - def labelPadding(): Int = LABEL_HEIGHT - def labelText(): String - - def labelTextColor(): Color = { DEFAULT_TEXT_COLOR } - def labelBackgroundColor(): Color = { BG_COLOR } - def labelBorderColor(): Color = { - this match { - case _this: Selectable if (_this.isSelected()) => Selectable.DEFAULT_SELECTED_BORDER_COLOR - case _this: Selectable if (_this.isHovered()) => Selectable.DEFAULT_HOVERED_BORDER_COLOR - case _ => Labeled.DEFAULT_BORDER_COLOR - } - } - - def labelWidth(s: Int = labelTextWidth): Int = { - return Math.min(s + DEFAULT_PADDING, self.width()) - } - - def drawLabel(g: Graphics2D) { - if (labelTextWidth != getLabelTextWidth(g, labelText)) { - labelTextWidth = getLabelTextWidth(g, labelText) - labelPanel.setSize(labelWidth(), labelPanel.getHeight()) - overflowTextEndingWidth = getLabelTextWidth(g, OVERFLOW_TEXT_ENDING) - } - - val width = labelWidth() - val height = labelHeight() - - g.color(labelBackgroundColor()) { - g.fillRoundRect(0, 0, width - 1, height, 5, 5); - } - - g.color(labelBorderColor()) { - g.drawRoundRect(0, 0, width - 1, height, 5, 5); - } - - drawLabelText(g) - - } - - def drawLabelText(g: Graphics2D) { - - val width = labelWidth() - val height = labelHeight() - - g.color(labelTextColor()) { - if (labelTextWidth + DEFAULT_PADDING <= width) { - g.drawString(labelText, (width - labelTextWidth) / 2, height - (height - getLabelTextHeight(g)) / 2 - 2) - } else { - var textWidth = labelTextWidth - var text = labelText - var removedLetters = 1 - while (textWidth > self.width() && removedLetters != labelText.size) { - text = labelText.substring(0, labelText.size - removedLetters) + OVERFLOW_TEXT_ENDING - textWidth = getLabelTextWidth(g, text) - removedLetters += 1 - } - g.drawString(text, DEFAULT_PADDING / 2, height - (height - getLabelTextHeight(g)) / 2 - 2) - } - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/MkAction.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/MkAction.scala deleted file mode 100644 index 7f35fa89..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/MkAction.scala +++ /dev/null @@ -1,66 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.event.ActionEvent - -import javax.swing.AbstractAction -import javax.swing.Action -import javax.swing.ImageIcon -import javax.swing.KeyStroke - -object MkAction { - - def apply( - name: String, - icon: ImageIcon, - hotkey: KeyStroke, - tooltip: String)(f: => Unit): AbstractAction = { - - new AbstractAction(name) { - if (icon != null) { putValue(Action.SMALL_ICON, icon) } - if (tooltip != null && tooltip.nonEmpty) { putValue(Action.SHORT_DESCRIPTION, tooltip); } else { putValue(Action.SHORT_DESCRIPTION, name); } - if (hotkey != null) { putValue(Action.ACCELERATOR_KEY, hotkey); } - override def actionPerformed(e: ActionEvent) { - f - } - } - - } - - def apply( - name: String, - icon: ImageIcon)(f: => Unit): AbstractAction = { - apply(name, icon, "")(f) - } - - def apply( - name: String, - icon: ImageIcon, - tooltip: String)(f: => Unit): AbstractAction = { - apply(name, icon, null, tooltip)(f) - } - - def apply( - name: String, - icon: ImageIcon, - hotKey: KeyStroke)(f: => Unit): AbstractAction = { - apply(name, icon, hotKey, "")(f) - } - - def apply( - name: String, - hotKey: KeyStroke, - tooltip: String)(f: => Unit): AbstractAction = { - apply(name, null, hotKey, "")(f) - } - - def apply( - name: String, - hotKey: KeyStroke)(f: => Unit): AbstractAction = { - apply(name, null, hotKey, "")(f) - } - - def apply(f: => Unit): AbstractAction = { - apply("", null, null, "")(f) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ModuleView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ModuleView.scala deleted file mode 100644 index 78d0a98c..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ModuleView.scala +++ /dev/null @@ -1,137 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Graphics2D -import scala.collection.JavaConversions.asScalaBuffer -import Graphics2DOps.RichGraphics2D -import javax.swing.SwingConstants -import javax.swing.plaf.basic.BasicArrowButton -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.Module -import java.awt.Dimension -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity - -object ModuleView { - val BG_COLOR = new Color(240, 240, 240) - val grey_arrow = new BasicArrowButton(0) - // val blue_arrow = new BasicArrowButton(0, Color.BLUE, Color.BLUE, Color.BLUE, Color.BLUE) -} - -class ModuleView(module: Module, controller: Controller) - extends ScrollableView(module, controller) - with BackGrounded - with Bordered - with Labeled - with Selectable - with SelectionBoxable - with Movable - with Resizeable - with CursorChanging { - import ModuleView._ - import Graphics2DOps._ - - override def labelText(): String = module.getName() - override def resizeableAtCorners(): Boolean = true - override def resizeableEW(): Boolean = true - override def resizeableNS(): Boolean = true - - override protected def drawScrollpaneBorder(g: Graphics2D) { drawBorder(g) } - override protected def drawInnerPanelComponent(g: Graphics2D) { - drawBackground(g) - drawInheritanceArrows(g) - } - - def drawInheritanceArrows(g: Graphics2D) { - for (subType <- module.getTypes()) { - controller.model.superTypeOf(subType) match { - case Some(superType) if (subType.getParent() == superType.getParent()) => - drawInheritanceArrow(subType, superType, g) - case _ => - } - } - } - - /* - * This is broken: When dragging items across parents, this canges itself...bad.. - override def childrenFitScaleFactor(): Double = { - - if (module.getSubmodules().isEmpty() && module.getTypes().isEmpty()) { - return 1.0 - } - - // TODO: Take into account actual size of children - val spaceAvailable = new Dimension(module.getPlacement().getWidth(), module.getPlacement().getHeight()) - - def forAllChildren(f: PlacedEntity => Unit) { - module.getSubmodules foreach f - module.getTypes foreach f - } - - var xMax = 1 - var yMax = 1 - forAllChildren { e => - val right = e.getPlacement().getX() + e.getPlacement().getWidth() - val bottom = e.getPlacement().getY() + e.getPlacement().getHeight() - xMax = math.max(xMax, right) - yMax = math.max(yMax, bottom) - } - - val s = 1.0 / math.max( - xMax.toDouble / spaceAvailable.width.toDouble, - yMax.toDouble / spaceAvailable.height.toDouble) - - return math.max(0.50, math.min(s, 1.0)) - }*/ - - def drawInheritanceArrow(subType: CustomType, superType: CustomType, g: Graphics2D) { - - val subTypeView = controller.viewMgr.view(subType).asInstanceOf[AbstractView with Selectable] - val superTypeView = controller.viewMgr.view(superType).asInstanceOf[AbstractView with Selectable] - - import se.culvertsoft.mgen.visualdesigner.util.Asof._ - - val selected = subTypeView.isSelected || superTypeView.isSelected - - val scale = scaleFactor - val arrowWidth = math.max(5, (10 * scale).toInt) - val minLineHeight = (10 * scale).toInt - val x0 = subTypeView.midX - val y0 = subTypeView.y - labelPanel.getHeight() - val xLast = superTypeView.midX - val yLast = superTypeView.bottom + arrowWidth - - g.color(if (selected) Color.BLUE else Color.DARK_GRAY) { - g.lineWidth(if (selected) 2 else 1) { - - val xStart = x0 - val yStart = y0 - minLineHeight - val xEnd = xLast - val yEnd = yLast + minLineHeight - - val (xHalfWayA, yHalfWayA, xHalfWayB, yHalfWayB) = - if (yStart >= yEnd) { - (xStart, (yStart + yEnd) / 2, xEnd, (yStart + yEnd) / 2) - } else { - ((xStart + xEnd) / 2, yStart, (xStart + xEnd) / 2, yEnd) - } - - { // Draw lines - g.drawLine(x0, y0, xStart, yStart) - g.drawLine(xStart, yStart, xHalfWayA, yHalfWayA) - g.drawLine(xHalfWayA, yHalfWayA, xHalfWayB, yHalfWayB) - g.drawLine(xHalfWayB, yHalfWayB, xEnd, yEnd) - g.drawLine(xEnd, yEnd, xLast, yLast) - } - - { // Draw arrow head - val x = superTypeView.midX - arrowWidth / 2 + 1 - val y = superTypeView.bottom - // val arrow = if (selected) blue_arrow else grey_arrow - grey_arrow.paintTriangle(g, x, y, arrowWidth, SwingConstants.NORTH, true) - } - } - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Movable.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Movable.scala deleted file mode 100644 index fd801777..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Movable.scala +++ /dev/null @@ -1,32 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Cursor -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent -import se.culvertsoft.mgen.visualdesigner.util.Asof.AsofOps -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity - -trait Movable { - self: AbstractView => - import Graphics2DOps._ - import Labeled._ - - val moveByMouseListener = new MouseAdapter() { - override def mouseEntered(e: MouseEvent) { controller.mouseInputMgr.setCursor(Cursor.MOVE_CURSOR) } - override def mouseExited(e: MouseEvent) { controller.mouseInputMgr.setCursor(Cursor.DEFAULT_CURSOR) } - override def mousePressed(e: MouseEvent) { - if (!e.isControlDown()) { - entity match { - case entity: PlacedEntity => controller.mouseInputMgr.startMouseMoveAction(entity) - case _ => - } - - } - } - } - - this.ifIs[Labeled](l => { - l.labelPanel.addMouseListener(moveByMouseListener) - }) - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Overlay.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Overlay.scala deleted file mode 100644 index e200cfcb..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Overlay.scala +++ /dev/null @@ -1,11 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Rectangle - -import javax.swing.JComponent - -class Overlay(_component: JComponent, _position: => Rectangle) { - def component() = _component - def position() = _position - def reposition() { _component.setBounds(position()) } -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PackageExplorer.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PackageExplorer.scala deleted file mode 100644 index 398e3a63..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PackageExplorer.scala +++ /dev/null @@ -1,340 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view; - -import java.awt.BorderLayout -import java.awt.Component -import java.awt.Container - -import scala.Array.canBuildFrom -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.LinkedHashMap - -import javax.swing.InputMap -import javax.swing.JComponent -import javax.swing.JPanel -import javax.swing.JScrollPane -import javax.swing.JTree -import javax.swing.event.TreeSelectionEvent -import javax.swing.event.TreeSelectionListener -import javax.swing.tree.DefaultMutableTreeNode -import javax.swing.tree.DefaultTreeCellRenderer -import javax.swing.tree.DefaultTreeModel -import javax.swing.tree.TreeNode -import javax.swing.tree.TreePath -import se.culvertsoft.mgen.visualdesigner.Icons -import se.culvertsoft.mgen.visualdesigner.classlookup.Type2String -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.control.ControllerListener -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.Project -import se.culvertsoft.mgen.visualdesigner.util.OperationStatus - -class PackageExplorer( - - private val controller: Controller, - private val container: Container) extends JPanel with ControllerListener { - private val root = new DefaultMutableTreeNode(); - private val treeModel = new DefaultTreeModel(root); - private val renderer = new TreeRenderer(); - private val tree = new JTree(treeModel); - private val id2node = new LinkedHashMap[EntityIdBase, DefaultMutableTreeNode] - private val id2entity = new LinkedHashMap[EntityIdBase, Entity] - private val mouseInputStatus = new OperationStatus - - javax.swing.ToolTipManager.sharedInstance().registerComponent(tree); - - initialize() - controller.addObserver(this) - - case class StrEntity(val entity: Entity) { - override def toString(): String = { - entity match { - case entity: CustomTypeField => - val nameStr = entity.getName() - val typeStr = Type2String(entity.getType())(controller.model) - val flagsStr = - if (entity.hasFlags() && entity.getFlags().nonEmpty) - s"{${entity.getFlags().map(_.trim()).mkString(", ")}}" - else - "" - - s"$nameStr: $typeStr $flagsStr" - case entity: EnumEntry => - val nameStr = entity.getName() - if (entity.hasConstant) - s"$nameStr = ${entity.getConstant}" - else - s"$nameStr" - case _ => entity.getName() - } - } - } - - def initialize() { - - val scrollpane = new JScrollPane(tree) - - setLayout(new BorderLayout()); - add(scrollpane, BorderLayout.CENTER); - - tree.setCellRenderer(renderer); - tree.addTreeSelectionListener(new TreeSelectionListener() { - - override def valueChanged(e: TreeSelectionEvent) { - - if (!controller.isTriggeringObservers) { - - mouseInputStatus active { - - controller.bulkOperation { - - controller.deselectAll(null) - val selectionPaths = tree.getSelectionPaths() - - if (selectionPaths != null) { - val selectedEntities = selectionPaths - .map(_.getLastPathComponent().asInstanceOf[DefaultMutableTreeNode]) - .map(_.getUserObject().asInstanceOf[StrEntity]) - - for (strEntity <- selectedEntities.filter(_ != null)) { - controller.viewMgr.view(strEntity.entity) match { - case selectable: Selectable => selectable.setSelected(true) - case _ => - } - } - } - - } - - controller.triggerObservers(_.onSelectionChanged(controller.selectedEntities(), None)) - - } - } - } - - }) - - for ( - condition <- List( - JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, - JComponent.WHEN_FOCUSED, - JComponent.WHEN_IN_FOCUSED_WINDOW) - ) { - - def clearIM(inputMap: InputMap) { - - if (inputMap == null) - return - - if (inputMap.getParent() != null) { - clearIM(inputMap.getParent()) - } - - val keyStrokes = inputMap.keys(); - if (keyStrokes != null) { - for (keyStroke <- keyStrokes) { - inputMap.get(keyStroke) match { - case "copy" => inputMap.remove(keyStroke) - case "cut" => inputMap.remove(keyStroke) - case "paste" => inputMap.remove(keyStroke) - case _ => - } - } - } - - } - - clearIM(tree.getInputMap(condition)) - - } - - } - - def updateSelection(nodes: Seq[DefaultMutableTreeNode]) { - if (!mouseInputStatus.isActive) { - val nodePaths = nodes.map(node => - new TreePath(node.getPath().asInstanceOf[Array[Object]])); - - if (nodePaths == null || nodePaths.isEmpty) - tree.clearSelection() - else - tree.setSelectionPaths(nodePaths.toArray) - } - } - - def updateSelection() { - if (!mouseInputStatus.isActive) { - updateSelection(controller.selectedEntities().map(x => id2node(x.getId()))) - } - } - - def expand(parentNode: DefaultMutableTreeNode) { - if (!controller.isBulkOperationActive) { - if (!mouseInputStatus.isActive) { - if (parentNode != null) { - val parentPath = new TreePath(parentNode.getPath().asInstanceOf[Array[Object]]); - tree.expandPath(parentPath); - } else { - tree.expandRow(0); - } - } - tree.updateUI() - } - } - - def getChildren(node: TreeNode): Seq[TreeNode] = { - val out = new ArrayBuffer[TreeNode] - val n = node.getChildCount() - for (i <- 0 until n) { - out += node.getChildAt(i) - } - out - } - - def reAddChildrenSorted(parent: Entity) { - - val parentNode = id2node(parent.getId()) - parentNode.removeAllChildren() - - parent.firstLevelChildren().foreach { ec => - for (childNode <- id2node.get(ec.getId())) { - parentNode.add(childNode) - } - } - - } - - override def onEntityAdded(child: Entity, parent: Entity) { - if (parent != null) { - val parentNode = id2node(parent.getId()) - val childNode = id2node.getOrElseUpdate(child.getId(), new DefaultMutableTreeNode(new StrEntity(child))); - id2node.put(child.getId(), childNode) - id2entity.put(child.getId(), child) - reAddChildrenSorted(parent) - expand(parentNode) - - } else { - val usrObj = new StrEntity(child) - root.setUserObject(usrObj) - id2node.put(child.getId(), root) - id2entity.put(child.getId(), child) - expand(root); - } - } - - override def onChildrenReordered(parent: Entity) { - reAddChildrenSorted(parent) - if (!controller.isBulkOperationActive) { - tree.updateUI() - } - } - - override def onEntityTransferred(child: Entity, newParent: Entity, oldParent: Entity) { - val oldParentNode = id2node(oldParent.getId()) - val childNode = id2node(child.getId()) - oldParentNode.remove(childNode) - expand(oldParentNode); - onEntityAdded(child, newParent) - } - - override def onEntityDeleted(child: Entity, parent: Option[Entity]) { - id2node.remove(child.getId()) foreach { childNode => - parent foreach { parent => - val oldParentNode = id2node(parent.getId()) - oldParentNode.remove(childNode) - expand(oldParentNode); - } - } - } - - override def onSelectionChanged(selection: Seq[Entity], focused: Option[Entity]) { - val selectedNodes = selection.map(x => id2node(x.getId())) - updateSelection(selectedNodes) - } - - override def onEntityModified(child: Entity, validate: Boolean = false, parent: Option[Entity] = None) { - if (!controller.isBulkOperationActive) { - tree.updateUI() - } - } - - override def onModelCleared() { - root.setUserObject(null) - id2node.clear() - id2entity.clear() - root.removeAllChildren() - if (!controller.isBulkOperationActive) - treeModel.reload() - } - - override def onModelModified(isPreview: Boolean) { - if (!controller.isBulkOperationActive && !isPreview) { - expand(root) - } - } - - class TreeRenderer extends DefaultTreeCellRenderer { - - override def getTreeCellRendererComponent( - tree: JTree, - value: Object, - selected: Boolean, - expanded: Boolean, - leaf: Boolean, - row: Int, - hasFocus: Boolean): Component = { - super.getTreeCellRendererComponent( - tree, - value, - selected, - expanded, - leaf, - row, - hasFocus); - - implicit val model = controller.model - - val strEntity = value.asInstanceOf[DefaultMutableTreeNode].getUserObject().asInstanceOf[StrEntity] - - if (strEntity != null) { - strEntity.entity match { - case project: Project => - setToolTipText(project.getFilePath.getAbsolute) - setIcon(Icons.TreeView.Dash.PROJECT_ICON) - case module: Module => - setToolTipText(Type2String.getClassPath(module)) - setIcon(Icons.TreeView.Dash.MODULE_ICON) - case enumEntry: EnumEntry => - setToolTipText(Type2String.getClassPath(enumEntry)) - setIcon(Icons.TreeView.Dash.FIELD_ICON) - case enumType: EnumType => - setToolTipText(Type2String.getClassPath(enumType)) - setIcon(Icons.TreeView.Dash.CLASS_ICON) - case cls: CustomType => - setToolTipText(Type2String.getClassPath(cls)) - setIcon(Icons.TreeView.Dash.CLASS_ICON) - case field: CustomTypeField => - setToolTipText(Type2String.getClassPath(field)) - setIcon(Icons.TreeView.Dash.FIELD_ICON) - } - - } - - return this; - } - - } - - override def onViewRootChanged() { - val node = id2node(controller.viewMgr.root.getId) - expand(node) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PaintListener.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PaintListener.scala deleted file mode 100644 index a924ddab..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/PaintListener.scala +++ /dev/null @@ -1,8 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Graphics2D - -trait PaintListener { - def prePaint(g: Graphics2D) {} - def postPaint(g: Graphics2D) {} -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ProjectView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ProjectView.scala deleted file mode 100644 index 3f71cb99..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ProjectView.scala +++ /dev/null @@ -1,25 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.Project -import java.awt.Graphics2D -import java.awt.Color - -class ProjectView(project: Project, controller: Controller) extends ScrollableView(project, controller) - with Selectable - with SelectionBoxable { - - override def backgroundColor(): Color = { - Color.white - } - - override protected def drawInnerPanelComponent(g: Graphics2D) { - drawBackground(g) - } - - override def add(child: AbstractView) { - if (!child.isInstanceOf[ProjectView]) - super.add(child) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Resizeable.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Resizeable.scala deleted file mode 100644 index 41f736ac..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Resizeable.scala +++ /dev/null @@ -1,138 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Dimension -import java.awt.Graphics -import java.awt.Graphics2D -import java.awt.Rectangle -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent -import java.awt.event.MouseListener - -import Graphics2DOps.RichGraphics2D -import javax.swing.JPanel -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import se.culvertsoft.mgen.visualdesigner.util.Asof.AsofOps -import se.culvertsoft.mgen.visualdesigner.util.RichMouseEvent.RichMouseEventOps - -object Resizeable { - val RESIZE_SQUARE_WIDTH = 10 - val HALF_RESIZE_SQUARE_WIDTH = RESIZE_SQUARE_WIDTH / 2 - - abstract class ResizePoint( - val xSign: Double, - val ySign: Double, - val xMove: Double, - val yMove: Double) - - object ResizePointN extends ResizePoint(0, -1, 0, 1) - object ResizePointNE extends ResizePoint(1, -1, 0, 1) - object ResizePointE extends ResizePoint(1, 0, 0, 0) - object ResizePointSE extends ResizePoint(1, 1, 0, 0) - object ResizePointS extends ResizePoint(0, 1, 0, 0) - object ResizePointSW extends ResizePoint(-1, 1, 1, 0) - object ResizePointW extends ResizePoint(-1, 0, 1, 0) - object ResizePointNW extends ResizePoint(-1, -1, 1, 1) - -} - -trait Resizeable { - self: AbstractView => - import Resizeable._ - import Graphics2DOps._ - - def resizeableAtCorners(): Boolean = false - def resizeableEW(): Boolean = false - def resizeableNS(): Boolean = false - def resizeSquareWidth(): Int = RESIZE_SQUARE_WIDTH - - val RESIZE_SQUARE_N = mkResizeSquare(ResizePointN, resizeableNS) - val RESIZE_SQUARE_NE = mkResizeSquare(ResizePointNE, resizeableAtCorners) - val RESIZE_SQUARE_E = mkResizeSquare(ResizePointE, resizeableEW) - val RESIZE_SQUARE_SE = mkResizeSquare(ResizePointSE, resizeableAtCorners) - val RESIZE_SQUARE_S = mkResizeSquare(ResizePointS, resizeableNS) - val RESIZE_SQUARE_SW = mkResizeSquare(ResizePointSW, resizeableAtCorners) - val RESIZE_SQUARE_W = mkResizeSquare(ResizePointW, resizeableEW) - val RESIZE_SQUARE_NW = mkResizeSquare(ResizePointNW, resizeableAtCorners) - - def drawResizeSquare(g: Graphics2D, p: ResizePoint) { - this match { - case _this: Selectable => - if (_this.isHovered() || _this.isSelected()) { - g.color(_this.borderColor()) { - val b = resizeSquareBounds(p) - g.fillRect(0, 0, b.width, b.height) - } - } - case _ => - } - } - - def resizeSquareBounds(p: ResizePoint): Rectangle = { - val xw = -resizeSquareWidth / 2 - val xe = width() - resizeSquareWidth / 2 - val xm = (xw + xe) / 2 - val yn = -resizeSquareWidth / 2 - val ys = height() - resizeSquareWidth / 2 - val ym = (yn + ys) / 2 - p match { - case ResizePointN => new Rectangle(xm, yn, resizeSquareWidth, resizeSquareWidth) - case ResizePointNE => new Rectangle(xe, yn, resizeSquareWidth, resizeSquareWidth) - case ResizePointE => new Rectangle(xe, ym, resizeSquareWidth, resizeSquareWidth) - case ResizePointSE => new Rectangle(xe, ys, resizeSquareWidth, resizeSquareWidth) - case ResizePointS => new Rectangle(xm, ys, resizeSquareWidth, resizeSquareWidth) - case ResizePointSW => new Rectangle(xw, ys, resizeSquareWidth, resizeSquareWidth) - case ResizePointW => new Rectangle(xw, ym, resizeSquareWidth, resizeSquareWidth) - case ResizePointNW => new Rectangle(xw, yn, resizeSquareWidth, resizeSquareWidth) - } - } - - def resizeTo(sz: Dimension, p: ResizePoint) { - - } - - def mkResizeListener(p: ResizePoint): MouseListener = { - new MouseAdapter() { - override def mousePressed(e: MouseEvent) { - if (e.isLeftBtn) { - entity match { - case entity: PlacedEntity => controller.mouseInputMgr.startMouseResizeAction(e, p, entity) - case _ => - } - } - } - } - } - - private final def mkResizeSquare(p: ResizePoint, add: Boolean = true): JPanel = { - - val out = new JPanel() { - - Resizeable.this.ifIs[Selectable](s => addMouseListener(new MouseAdapter() { - override def mousePressed(e: MouseEvent) { - if (!e.isControlDown() && e.isLeftBtn) { - controller.deselectAll(null) - } - } - })) - Resizeable.this.ifIs[Selectable](s => addMouseListener(s.selectMouseListenerWOFocus)) - - override def paintComponent(g: Graphics) { - drawResizeSquare(g.asInstanceOf[Graphics2D], p) - } - - addMouseListener(mkResizeListener(p)) - - } - - if (add) { - addOverlayOffsetBounds(out, - resizeSquareBounds(p).x, - resizeSquareBounds(p).y, - resizeSquareBounds(p).width, - resizeSquareBounds(p).height) - } - - out - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScaleSetBox.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScaleSetBox.scala deleted file mode 100644 index 16743314..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScaleSetBox.scala +++ /dev/null @@ -1,35 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.event.ActionEvent -import java.awt.event.ActionListener - -import javax.swing.DefaultComboBoxModel -import javax.swing.JComboBox -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.control.ControllerListener - -class ScaleSetBox(c: Controller) extends JComboBox[String] { - - private val stringScaleLevels = ZoomLevels.levels.map(x => (x * 100.0).toInt.toString() + "%") - private val cbModel = getModel().asInstanceOf[DefaultComboBoxModel[Object]] - - stringScaleLevels foreach cbModel.addElement - cbModel.setSelectedItem("100%") - - c.addObserver(new ControllerListener() { - override def onScaleFactorChanged() { - cbModel.setSelectedItem(stringScaleLevels(c.viewMgr.scaleFactorIndex)) - } - }) - - addActionListener(new ActionListener() { - override def actionPerformed(e: ActionEvent) { - if (!c.isTriggeringObservers()) { - val s = getSelectedItem().toString.filterNot(_ == '%') - val decimal = s.toDouble / 100.0 - c.viewMgr.setScaleFactor(decimal) - } - } - }) - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScrollableView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScrollableView.scala deleted file mode 100644 index 3891ba82..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ScrollableView.scala +++ /dev/null @@ -1,75 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Graphics -import java.awt.Graphics2D - -import javax.swing.JScrollPane -import javax.swing.JViewport -import javax.swing.event.ChangeEvent -import javax.swing.event.ChangeListener -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.Entity - -class ScrollableView( - entity: Entity, - controller: Controller, - overlaySizePad: Int = 25) - extends StandardView(entity, controller, overlaySizePad) { - - val scrollpane = new JScrollPane(innerPanel) { - override def paintBorder(g: Graphics) { - super.paintBorder(g) - drawScrollpaneBorder(g.asInstanceOf[Graphics2D]) - } - override def paintComponent(g: Graphics) { - super.paintComponent(g) - drawScrollpaneComponent(g.asInstanceOf[Graphics2D]) - } - } - - private val savedScrollpaneWheelListener = scrollpane.getMouseWheelListeners()(0) - scrollpane.getViewport().setScrollMode(JViewport.SIMPLE_SCROLL_MODE) - scrollpane.getVerticalScrollBar().setUnitIncrement(10) - scrollpane.getHorizontalScrollBar().setUnitIncrement(10) - scrollpane.getViewport().addChangeListener(new ChangeListener() { - override def stateChanged(e: ChangeEvent) { - if (scrollpane.getVerticalScrollBar().isShowing() || scrollpane.getHorizontalScrollBar().isShowing()) { - if (scrollpane.getMouseWheelListeners().isEmpty) { - scrollpane.addMouseWheelListener(savedScrollpaneWheelListener) - } - } else { - if (scrollpane.getMouseWheelListeners().nonEmpty) { - scrollpane.removeMouseWheelListener(savedScrollpaneWheelListener) - } - } - } - }) - - updateBounds() - - /** - * *********************************************** - * - * - * METHODS - * - * *********************************************** - */ - - override def minWidth(): Int = 50 - override def minHeight(): Int = 50 - override def mkBoundingComponent() = scrollpane - - /** - * *********************************************** - * - * - * OVERRIDEABLE DRAW CALLBACKS - * - * *********************************************** - */ - - protected def drawScrollpaneBorder(g: Graphics2D) {} - protected def drawScrollpaneComponent(g: Graphics2D) {} - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Selectable.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Selectable.scala deleted file mode 100644 index 965400a1..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/Selectable.scala +++ /dev/null @@ -1,90 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent - -import se.culvertsoft.mgen.visualdesigner.util.Asof.AsofOps -import se.culvertsoft.mgen.visualdesigner.util.RichMouseEvent.RichMouseEventOps -object Selectable { - val DEFAULT_SELECTED_BORDER_COLOR = Color.BLUE - val DEFAULT_HOVERED_BORDER_COLOR = new Color(175, 175, 245); -} - -trait Selectable extends Bordered { - self: AbstractView => - import Graphics2DOps._ - import Selectable._ - - private var _selected = false - private var _hovered = false - - private def mkSelectMouseListener(reFocus: Boolean) = new MouseAdapter { - override def mousePressed(e: MouseEvent) { - if (e.isLeftBtn) { - if (e.isControlDown()) { - if (isSelected()) { - controller.deSelect(entity, false) - } else { - controller.select(entity, false, reFocus) - } - } else { - controller.select(entity, !isSelected(), reFocus) - } - } - } - override def mouseClicked(e: MouseEvent) { - if (e.isLeftBtn) { - if (!e.isControlDown()) { - if (isSelected()) { - controller.select(entity, true, reFocus) - } - } - } - } - override def mouseEntered(e: MouseEvent) { - controller.hover(true, Selectable.this, entity) - } - override def mouseExited(e: MouseEvent) { - controller.hover(false, Selectable.this, entity) - } - } - - val selectMouseListenerWFocus = mkSelectMouseListener(true) - val selectMouseListenerWOFocus = mkSelectMouseListener(false) - - innerPanel.addMouseListener(selectMouseListenerWFocus) - this.ifIs[Labeled](_.labelPanel.addMouseListener(selectMouseListenerWFocus)) - - override def borderColor(): Color = { - this match { - case _ if (isSelected()) => DEFAULT_SELECTED_BORDER_COLOR - case _ if (isHovered()) => DEFAULT_HOVERED_BORDER_COLOR - case _ => super.borderColor() - } - } - - def isHovered(): Boolean = { - _hovered - } - - def isSelected(): Boolean = { - _selected - } - - def setHovered(state: Boolean) { - if (state != _hovered) { - _hovered = state - if (!controller.isBulkOperationActive) { - self.repaint() - } - } - } - - def setSelected(state: Boolean) { - if (_selected != state) { - _selected = state - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/SelectionBoxable.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/SelectionBoxable.scala deleted file mode 100644 index c3ec60cf..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/SelectionBoxable.scala +++ /dev/null @@ -1,62 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Color -import java.awt.Graphics2D -import java.awt.Rectangle -import java.awt.event.MouseAdapter -import java.awt.event.MouseEvent - -import se.culvertsoft.mgen.visualdesigner.control.MouseSelectionBoxAction -import se.culvertsoft.mgen.visualdesigner.control.UiPos -import se.culvertsoft.mgen.visualdesigner.util.RichMouseEvent.RichMouseEventOps - -object SelectionBoxable { - val BOX_COLOR = Color.DARK_GRAY -} - -trait SelectionBoxable - extends AbstractView - with BackGrounded { - import Graphics2DOps._ - - override def drawInnerPanelComponentAfterChildren(g: Graphics2D) { - super.drawInnerPanelComponentAfterChildren(g) - - controller.mouseInputMgr.mouseDragAction() match { - case action: MouseSelectionBoxAction if (action.containerEntity eq entity) => - - val pOld = action.initPos.onComponent - val pNew = UiPos.getCompCoordFromScreen(controller.mouseInputMgr.mousePos().onScreen, action.initPos.component) - - val x0 = math.min(pOld.x, pNew.x) - val y0 = math.min(pOld.y, pNew.y) - - val x1 = math.max(pOld.x, pNew.x) - val y1 = math.max(pOld.y, pNew.y) - - val w = x1 - x0 - val h = y1 - y0 - - val selectionBox = new Rectangle(x0, y0, w, h) - - g.drawRect(x0, y0, w, h) - - case _ => - } - } - - val selectionBoxableListener = new MouseAdapter { - override def mouseDragged(e: MouseEvent) { - if (e.isLeftBtn) { - controller.mouseInputMgr.startMouseSelectionBoxAction(e, entity) - } - } - } - - innerPanel.addMouseMotionListener(selectionBoxableListener) - - override def drawBackground(g: Graphics2D) { - super.drawBackground(g) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/StandardView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/StandardView.scala deleted file mode 100644 index 769e0f13..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/StandardView.scala +++ /dev/null @@ -1,36 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Container - -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.Entity - -abstract class StandardView( - entity: Entity, - _controller: Controller, - _overlaySizePad: Int) extends AbstractView(entity, _controller, _overlaySizePad) { - - val focusHelper = new FocusHelper(this, controller) - - innerPanel.add(focusHelper) - - override def hasFocus(): Boolean = { - focusHelper.hasFocus() - } - - override def requestFocus() { - focusHelper.requestFocus() - } - - override def beAddedToSwingParent(parent: Container) = { - parent.add(boundingComponent, 0) - if (!isRoot()) - parent.add(overlayPanel, 0) - } - - override def beRemovedFromSwingParent(parent: Container) = { - parent.remove(overlayPanel) - parent.remove(boundingComponent) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ToolbarButton.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ToolbarButton.scala deleted file mode 100644 index a01378de..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ToolbarButton.scala +++ /dev/null @@ -1,38 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.event.ActionEvent - -import javax.swing.AbstractAction -import javax.swing.Action -import javax.swing.ImageIcon -import se.culvertsoft.mgen.visualdesigner.images.MkImgIcon - -class ToolbarButton( - val icon: ImageIcon, - val tooltip: String) extends AbstractAction("", icon) { - var action: () => Unit = null - - def this(imagePath: String, tooltip: String) = this(MkImgIcon.large(imagePath), tooltip) - - if (tooltip != null && tooltip.nonEmpty) - putValue(Action.SHORT_DESCRIPTION, tooltip) - - def setName(name: String): ToolbarButton = { - putValue(Action.NAME, name) - this - } - - def setAction(f: => Unit): ToolbarButton = { - action = () => f - this - } - - override def actionPerformed(event: ActionEvent) { - if (action != null) { - action() - } else { - println(s"$this.actionPerformed(..) called on event: $event") - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/TopContainerView.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/TopContainerView.scala deleted file mode 100644 index 4af0619e..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/TopContainerView.scala +++ /dev/null @@ -1,184 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Container -import java.awt.Graphics2D - -import scala.collection.JavaConversions.asScalaBuffer -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashMap - -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.Project - -private case class AbsolutePos(val x: Int, val y: Int) -private case class TypeWithSuper(val subType: CustomType, val superType: CustomType) - -class TopContainerView( - controller: Controller, - topContainer: ContentPane) extends AbstractView(null, controller, 0) { - - private val absPositions = new HashMap[EntityIdBase, AbsolutePos] - private val typesWSuper = new ArrayBuffer[TypeWithSuper] - - private var _currentChild: AbstractView = null - - topContainer.addObserver(new PaintListener() { - override def postPaint(g: Graphics2D) { - paintGlobalOverlay(g) - } - }) - - /** - * *********************************** - * - * - * METHODS - * - * ********************************** - */ - - override def mkBoundingComponent() = { - topContainer - } - - override def add(e: AbstractView) { - if (!(e eq _currentChild)) { - _currentChild = e - topContainer.removeAll() - e.beAddedToSwingParent(topContainer) - } - } - - override def createInnerPanel() = { - topContainer - } - - override def innerPanel(): Container = { - topContainer - } - - override def validate() { - if (!controller.isBulkOperationActive) { - topContainer.validate() - } - } - - override def repaint() { - if (!controller.isBulkOperationActive) { - topContainer.repaint() - } - } - - def currentChild(): AbstractView = { - _currentChild - } - - def beAddedToSwingParent(parent: Container) { - throw new RuntimeException("Should not be here") - } - - def beRemovedFromSwingParent(parent: Container) { - throw new RuntimeException("Should not be here") - } - - def clear() { - topContainer.removeAll() - } - - override def onViewRootChanged() { - if (!controller.isBulkOperationActive) { - updateScaleFactorReduction(1.0) - validate() - repaint() - } - } - - override def updateScaleFactorReduction(newThisFactor: Double) { - _currentChild.updateScaleFactorReduction(newThisFactor) - } - - def paintGlobalOverlay(g: Graphics2D) { - - return - - // TODO: Come back later and draw inheritance arrows - - updateLkup() - - for (TypeWithSuper(subType, superType) <- typesWSuper) { - val pAbsSubType = absPositions(subType.getId()) - val pAbsSuperType = absPositions(superType.getId()) - drawInheritance(g, subType, superType, pAbsSubType, pAbsSuperType) - } - - } - - def updateLkup() { - - absPositions.clear() - typesWSuper.clear() - - controller.viewMgr.root match { - case p: Project => updateLkup(p, 0, 0) - case m: Module => updateLkup(m, 0, 0) - case c: CustomType => updateLkup(c, 0, 0) - } - - } - - def updateLkup(p: Project, _xOffs: Int, _yOffs: Int) { - - val x = _xOffs - val y = _yOffs - - absPositions.put(p.getId(), AbsolutePos(x, y)) - - for (m <- p.getModules()) - updateLkup(m, x, y) - - } - - def updateLkup(m: Module, _xOffs: Int, _yOffs: Int) { - - val x = _xOffs + m.getPlacement().getX() - val y = _yOffs + m.getPlacement().getY() - - absPositions.put(m.getId(), AbsolutePos(x, y)) - - for (p <- m.getSubmodules()) - updateLkup(p, x, y) - for (t <- m.getTypes()) - updateLkup(t, x, y) - - } - - def updateLkup(t: CustomType, _xOffs: Int, _yOffs: Int) { - - val x = _xOffs + t.getPlacement().getX() - val y = _yOffs + t.getPlacement().getY() - - absPositions.put(t.getId(), AbsolutePos(x, y)) - - if (t.hasSuperType()) { - controller.model.getEntity(t.getSuperType()) foreach { superType => - typesWSuper += TypeWithSuper(t, superType.asInstanceOf[CustomType]) - } - } - - } - - def drawInheritance( - g: Graphics2D, - subType: CustomType, - superType: CustomType, - pAbsSubType: AbsolutePos, - pAbsSuperType: AbsolutePos) { - - println(s"Drawing inheritance: ${subType.getName()} --|> ${superType.getName()}") - println(s" ${pAbsSubType} to ${pAbsSuperType}") - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewComplexity.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewComplexity.scala deleted file mode 100644 index eee4638d..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewComplexity.scala +++ /dev/null @@ -1,6 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -abstract class ViewComplexity -case object VIEW_COMPLEXITY_UNSET extends ViewComplexity -case object VIEW_COMPLEXITY_SIMPLE extends ViewComplexity -case object VIEW_COMPLEXITY_COMPLEX extends ViewComplexity \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewManager.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewManager.scala deleted file mode 100644 index cb2f9e58..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ViewManager.scala +++ /dev/null @@ -1,751 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -import java.awt.Component -import java.awt.Cursor -import java.awt.Dimension -import java.awt.Point -import java.awt.Rectangle - -import scala.collection.mutable.ArrayBuffer -import scala.collection.mutable.HashMap -import scala.reflect.ClassTag - -import javax.swing.JFileChooser -import javax.swing.JFrame -import javax.swing.JOptionPane -import javax.swing.JPanel -import javax.swing.JScrollPane -import javax.swing.SwingUtilities -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.control.ControllerListener -import se.culvertsoft.mgen.visualdesigner.control.UiPos -import se.culvertsoft.mgen.visualdesigner.control.UndoBuffer -import se.culvertsoft.mgen.visualdesigner.model.ChildParent -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.ModelOps.toRichCustomType -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.PlacedEntity -import se.culvertsoft.mgen.visualdesigner.model.Project -import se.culvertsoft.mgen.visualdesigner.util.AwtMath.RichDimension -import se.culvertsoft.mgen.visualdesigner.util.AwtMath.RichPoint -import se.culvertsoft.mgen.visualdesigner.util.OperationStatus -import se.culvertsoft.mgen.visualdesigner.view.searchdialog.SearchDialog - -class ViewManager( - private val controller: Controller, - private val dashBoard: ContentPane) extends ControllerListener { - private val topView = new TopContainerView(controller, dashBoard) - private val views = new HashMap[EntityIdBase, AbstractView] - private var _root: Entity = controller.model().project - private var _scaleFactor = 1.0 - private var _iconOverride = false - private val searchDialog: SearchDialog = new SearchDialog(controller) - private val viewHistory = new UndoBuffer[EntityIdBase](_root.getId, _ => 32) - private val movingThroughHistory = new OperationStatus - - controller.addObserver(this) - controller.addObserver(topView) - - /** - * ************************************************************************ - * - * - * API - * - * *********************************************************************** - */ - - def rootView(): ScrollableView = { - view(root).asInstanceOf[ScrollableView] - } - - def isIconOverrideActive(): Boolean = { - _iconOverride - } - - def toggleIconOverride() { - setIconOverride(!isIconOverrideActive) - } - - def setIconOverride(state: Boolean) { - if (_iconOverride != state) { - _iconOverride = state - controller.triggerObservers(_.onIconOverrideChanged()) - } - } - - def parentOf(v: AbstractView): Option[AbstractView] = { - controller.model.parentOf(v.entity).map(view) - } - - def validateAll() { - dashBoard.validate() - } - - def repaintAll() { - dashBoard.repaint() - } - - def setCursor(c: Cursor) { - dashBoard.setCursor(c) - } - - def showConfirmDialog(msg: String, title: String, qType: Int, diaType: Int): Int = { - JOptionPane.showConfirmDialog(dashBoard, msg, title, qType, diaType) - } - - def showSaveDialog(fc: JFileChooser): Int = { - fc.showSaveDialog(dashBoard) - } - - def showOpenDialog(fc: JFileChooser): Int = { - fc.showOpenDialog(dashBoard) - } - - def getWindow(): JFrame = { - SwingUtilities.getWindowAncestor(dashBoard).asInstanceOf[JFrame] - } - - def scaleFactor(): Double = { - _scaleFactor - } - - def scaleFactorIndex(): Int = { - ZoomLevels.findClosestIndex(scaleFactor) - } - - def root(): Entity = { - _root - } - - def isRoot(entity: Entity) = { - entity eq root() - } - - def isViewRoot(v: AbstractView): Boolean = { - view(_root) eq v - } - - def hasView(entity: Entity): Boolean = { - views.contains(entity.getId) - } - - def viewOption(entity: Entity): Option[AbstractView] = { - if (entity != null) { - views.get(entity.getId) - } else { - Some(topView) - } - } - - def view(entity: Entity): AbstractView = { - viewOption(entity).get - } - - def getAllViews[T: ClassTag](): Seq[T with AbstractView] = { - val out = new ArrayBuffer[T] - controller.model.project.foreach { cp => - views.get(cp.child.getId) match { - case Some(x: T) => out += x - case _ => - } - } - out.asInstanceOf[Seq[T with AbstractView]] - } - - def getUiPosOf(entity: Entity): UiPos = { - val view = views.get(entity.getId).get - new UiPos(view.pos(), view.boundingComponent.getParent()) - } - - def getBoundsOf(entity: Entity): Rectangle = { - val view = views.get(entity.getId).get - view.bounds() - } - - def getSizeOf(entity: Entity): Dimension = { - val view = views.get(entity.getId).get - view.size() - } - - def getMidPtOf(entity: Entity): Point = { - val view = views.get(entity.getId).get - view.midPt() - } - - def getScreenBoundsOf(entity: Entity): Rectangle = { - val uiPos = getUiPosOf(entity) - entity match { - case project: Project => new Rectangle(uiPos.onScreen.x, uiPos.onScreen.y, dashBoard.getWidth(), dashBoard.getHeight()) - case _ => - val v = view(entity) - new Rectangle(uiPos.onScreen.x, uiPos.onScreen.y, v.width(), v.height()) - } - } - - def setViewRootShallow(newRoot: Entity, triggerObservers: Boolean = true) { - _root = newRoot - } - - def setViewRoot(newRoot: EntityIdBase) { - controller.model.getEntity(newRoot) foreach setViewRoot - } - - def setViewRoot(newRoot: Entity) { - - if (!movingThroughHistory.isActive) { - viewHistory.pushState(root.getId(), false) - viewHistory.pushState(newRoot.getId(), false) - } - - setViewRootShallow(newRoot, false) - - // Get the previous root - val prevRootView = topView.currentChild() - - if (prevRootView == null || !(newRoot eq prevRootView.entity)) { - - // Add the previous root back to its correct parent - if (prevRootView != null) { - for (properParent <- controller.model.parentOf(prevRootView.entity)) { - val properParentView = view(properParent) - prevRootView.updateBounds() - properParentView.add(prevRootView) - } - } - - topView.add(rootView) - - } - - controller.triggerObservers(_.onViewRootChanged()) - - } - - /** - * ************************************************************************ - * - * - * CONTROLLERLISTENER IMPLEMENTATION - * - * *********************************************************************** - */ - - override def onSelectionChanged(selection: Seq[Entity], focused: Option[Entity]) { - for (e <- focused) { - val v = view(e) - if (!v.hasFocus()) { - v.requestFocus() - } - } - if (!controller.isBulkOperationActive) { - dashBoard.repaint() - } - } - - private def mkViewFor(entity: Entity) { - - if (views.contains(entity.getId)) - return - - println(s"created new view for ${entity.getName()}") - - val newItem = entity match { - case entity: Project => - new ProjectView(entity, controller) - case entity: Module => - new ModuleView(entity, controller) - case entity: EnumEntry => - new EnumEntryView(entity, controller) - case entity: EnumType => - new EnumView(entity, controller) - case entity: CustomType => - new ClassView(entity, controller) - case entity: CustomTypeField => - new FieldView(entity, controller) - } - views.put(entity.getId, newItem) - - controller.addObserver(newItem) - - } - - def existsView(entity: Entity): Boolean = { - views.contains(entity.getId) - } - - override def onEntityAdded(child: Entity, parent: Entity) { - - mkViewFor(child) - - val parentView = view(parent) - parentView.add(view(child)) - if (!controller.isBulkOperationActive) { - parentView.validate() - parentView.repaint() - } - } - - override def onEntityTransferred(child: Entity, newParent: Entity, oldParent: Entity) { - - val childView = view(child) - val oldParentView = view(oldParent) - val newParentView = view(newParent) - - val childHadFocus = childView.hasFocus() - - oldParentView.remove(childView) - newParentView.add(childView) - - if (!(newParent eq oldParent)) { - childView.updateBounds() - if (!controller.isBulkOperationActive) { - oldParentView.validate() - oldParentView.repaint() - } - } - - if (!controller.isBulkOperationActive) - newParentView.validate() - - if (childHadFocus) - childView.requestFocus() - - } - - override def onEntityDeleted(child: Entity, parent: Option[Entity]) { - - for (parent <- parent) { - val parentView = view(parent) - val childView = view(child) - - parentView.remove(childView) - if (!controller.isBulkOperationActive) { - parentView.validate() - parentView.repaint() - } - } - - child.foreach { cp => - views.remove(cp.child.getId) foreach controller.removeObserver - } - - } - - override def onEntityMoved(e: PlacedEntity, parent: Entity) { - view(e).updateBounds() - if (!controller.isBulkOperationActive) { - view(parent).validate() - } - } - - override def onEntityResized(e: PlacedEntity, parent: Entity) { - view(e).updateBounds() - if (!controller.isBulkOperationActive) { - view(parent).validate() - } - } - - override def onModelModified(isPreview: Boolean) { - if (!controller.isBulkOperationActive) { - topView.validate() - topView.repaint() - } - } - - override def onModelCleared() { - views foreach (_._2.unregister()) - views.clear() - topView.clear() - } - - override def onFocusGained(entity: Entity) { - if (!controller.isBulkOperationActive) { - viewOption(entity) foreach (_.repaint()) - } - } - - override def onFocusLost(entity: Entity) { - if (!controller.isBulkOperationActive) { - viewOption(entity) foreach (_.repaint()) - } - } - - override def onEntityModified(child: Entity, validate: Boolean = false, parent: Option[Entity] = None) { - if (!controller.isBulkOperationActive) { - viewOption(child) foreach { v => - if (validate) - v.validate() - v.repaint() - } - } - } - - override def onChildrenReordered(parent: Entity) { - if (!controller.isBulkOperationActive) { - val v = view(parent) - val children = parent.firstLevelChildren() - val childViews = children map (view) - childViews foreach v.remove - childViews foreach v.add - v.validate() - } - } - - def popupGetString(message: String, defaultValue: String = "", triggeringComponent: Component = dashBoard): Option[String] = { - val o = JOptionPane.showInputDialog(triggeringComponent, message, defaultValue); - if (o != null) Some(o) else None - } - - def popupFailed(message: String, label: String): Boolean = { - JOptionPane.showMessageDialog(dashBoard, message, label, JOptionPane.INFORMATION_MESSAGE) - false - } - - def popupPreconditionFailed(message: String): Boolean = { - popupFailed(message, "Precondition check failed") - } - - def getCurrentScrollPane(): JScrollPane = { - rootView.scrollpane - } - - def keepScrollbarPos(f: => Unit) { - - val scrollpaneBefore = getCurrentScrollPane() - val hBarBefore = scrollpaneBefore.getHorizontalScrollBar() - val vBarBefore = scrollpaneBefore.getVerticalScrollBar() - - val h = if (hBarBefore.isVisible()) Some(hBarBefore.getValue()) else None - val v = if (vBarBefore.isVisible()) Some(vBarBefore.getValue()) else None - - f - - val scrollpaneAfter = getCurrentScrollPane() - val hBarAfter = scrollpaneAfter.getHorizontalScrollBar() - val vBarAfter = scrollpaneAfter.getVerticalScrollBar() - - for (h <- h) { - if (h != hBarAfter.getValue()) { - hBarAfter.setValue(h) - } - } - - for (v <- v) { - if (v != vBarAfter.getValue()) { - vBarAfter.setValue(v) - } - } - - } - - def findDeepestEntityAt( - screenPos: Point, - pickFilter: Entity => Boolean, - continueFilter: Entity => Boolean): Option[Entity] = { - - var out: Option[Entity] = None - - root().traverse { - case ChildParent(entity, _) => { - if (isVisible(entity) && getScreenBoundsOf(entity).contains(screenPos)) { - if (pickFilter(entity)) - out = Some(entity) - continueFilter(entity) - } else { - false - } - } - } - - out - - } - - def isVisible(entity: Entity): Boolean = { - - if (isRoot(entity)) - return true - - if (entity.isInstanceOf[Project]) - return false - - if (!root.contains(entity)) - return false - - controller.model.parentOf(entity) match { - case Some(parent) => isVisible(parent) - case _ => false - } - - } - - def makeVisible(entity: Entity) = { - - entity match { - case entity: Project => - setViewRoot(entity) - case _ => - controller.model.parentOf(entity) match { - case Some(parent) => setViewRoot(parent) - case _ => setViewRoot(entity) - } - } - - } - - def selectedViews(): Seq[AbstractView with Selectable] = { - getAllViews[Selectable].filter(_.isSelected()) - } - - def hoveredViews(): Seq[AbstractView with Selectable] = { - getAllViews[Selectable].filter(_.isHovered()) - } - - def getCachedViews(): HashMap[EntityIdBase, AbstractView] = { - val out = new HashMap[EntityIdBase, AbstractView] - for (v <- views) { - out.put(v._1, v._2) - } - out - } - - def injectView(e: Entity, v: AbstractView) { - views.put(e.getId, v) - v.register() - } - - def setSelectedAsRootView() { - if (controller.checkHasExactlySelected(1)) { - val e = controller.selectedEntities()(0) - - if (e eq root) { - resetViewRoot() - } else { - - e match { - case e: Project => - setViewRoot(e) - case e: Module => - setViewRoot(e) - case _ => - popupPreconditionFailed("Can only zoom in on Projects or Modules") - } - } - - } - } - - private object maximizeState { - - val realContentPane = getWindow.getContentPane.asInstanceOf[JPanel] - val realChild = realContentPane.getComponent(0) - val realTopContainerParent = dashBoard.getParent() - - def toggle() { - - def setWindowTopLevelComponent(newTopLevelComponent: Component) { - realContentPane.removeAll() - realContentPane.add(newTopLevelComponent) - realContentPane.validate() - realContentPane.repaint() - } - - if (realContentPane != dashBoard.getParent()) { - setWindowTopLevelComponent(dashBoard) - } else { - realTopContainerParent.add(dashBoard) - setWindowTopLevelComponent(realChild) - } - - } - - } - - def maximize() { - maximizeState.toggle() - } - - def goBack() { - movingThroughHistory.active { - viewHistory.goBack(root.getId()) foreach { - setViewRoot - } - } - } - - def goForward() { - movingThroughHistory.active { - viewHistory goForward (root.getId()) foreach setViewRoot - } - } - - def goUp() { - controller.model.parentOf(root) match { - case Some(parent) => setViewRoot(parent) - case _ => - } - } - - def resetViewRoot() { - setViewRoot(controller.model.project) - } - - def setScaleFactor(factor: Double) { - - _scaleFactor = factor - - if (!controller.isBulkOperationActive) { - - controller.model.foreach(_ match { - case ChildParent(child: PlacedEntity, _) => view(child).updateBounds() - case _ => - }) - - topView.validate() - topView.repaint() - } - - controller.triggerObservers(_.onScaleFactorChanged()) - - } - - def offsetScaleFactorIndex(deltaIndex: Int) { - val newIndex = ZoomLevels.findClosestIndex(scaleFactor) + deltaIndex - if (0 <= newIndex && newIndex < ZoomLevels.levels.size) { - val newScale = ZoomLevels.levels(newIndex) - setScaleFactor(newScale) - } - } - - def resetScaleFactor() { - setScaleFactor(1.0) - } - - def isInsideDashBoard(p: UiPos): Boolean = { - UiPos.getScreenBoundsOfComp(dashBoard).contains(p.onScreen) - } - - def getViewHierarchy(entity: Entity): Seq[AbstractView] = { - def gvh(view: AbstractView): List[AbstractView] = { - parentOf(view) match { - case Some(parentView) => view :: gvh(parentView) - case _ => List(view) - } - } - gvh(view(entity)).reverse - } - - def find(entity: Entity) { - - if (isRoot(entity)) { - popupPreconditionFailed("You tried to find the view root") - return - } - - if (!isVisible(entity)) - makeVisible(entity) - - controller.select(entity, true, false) - - val hierarchy = getViewHierarchy(entity) - val tgt = view(entity) - - for ( - _view <- hierarchy.tail.reverse; - parentView <- parentOf(_view) - ) { - - import se.culvertsoft.mgen.visualdesigner.util.AwtMath._ - - val pad = 30 - - // Get child into visible area by minimal effort - val scrollpane = parentView.asInstanceOf[ScrollableView].scrollpane - val hbar = scrollpane.getHorizontalScrollBar - val vbar = scrollpane.getVerticalScrollBar - val tgtPosOnCurPane = UiPos.getCompBoundsFromCompBounds(tgt.bounds(), tgt.parentComponent(), scrollpane) - - val left = tgtPosOnCurPane.x - pad - val right = tgtPosOnCurPane.x + tgtPosOnCurPane.width + pad - val top = tgtPosOnCurPane.y - pad - val bottom = tgtPosOnCurPane.y + tgtPosOnCurPane.height + pad - - val hCorrection = - if (right > scrollpane.getWidth) { - right - scrollpane.getWidth - } else if (left < 0) { - left - } else { - 0 - } - hbar.setValue(hbar.getValue + hCorrection) - - val vCorrection = - if (top < 0) { - top - } else if (bottom > scrollpane.getHeight) { - bottom - scrollpane.getHeight - } else { - 0 - } - vbar.setValue(vbar.getValue + vCorrection) - - } - - // TODO: Animate - // Just spawn a new thread an perform the above ops over 1 sec, - // maybe with a logarithmic motion - - } - - override def onNewModel() { - viewHistory.clear(controller.model.project.getId()) - } - - def findSelected() { - if (controller.checkHasExactlySelected(1)) { - find(controller.selectedEntities()(0)) - } - } - - def findByName() { - import se.culvertsoft.mgen.visualdesigner.util.AwtMath._ - val mousePos = - controller.mouseInputMgr.mousePos.onScreen - searchDialog.getSize / 2 - - searchDialog.setLocation(mousePos) - - ClampPos(searchDialog, getWindow) - - if (!searchDialog.isVisible()) { - searchDialog.setVisible(true) - } else { - searchDialog.toFront() - searchDialog.repaint() - } - - searchDialog.forwardFocus() - - } - - def configureViewOnLoadedNewFile() { - def setToLowestChildWithNonMultipleChildren(child: Entity) { - val children = child.firstLevelChildren - if (children.size == 1 && children.head.isInstanceOf[Module]) { - setToLowestChildWithNonMultipleChildren(children.head) - } else { - setViewRoot(child) - } - } - setToLowestChildWithNonMultipleChildren(controller.model.project) - setScaleFactor(0.5) - } - -} - diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ZoomLevels.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ZoomLevels.scala deleted file mode 100644 index d266637a..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/ZoomLevels.scala +++ /dev/null @@ -1,37 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view - -object ZoomLevels { - val levels = Array( - 0.100, - 0.125, - 0.150, - 0.175, - 0.200, - 0.225, - 0.250, - 0.275, - 0.300, - 0.350, - 0.400, - 0.450, - 0.500, - 0.600, - 0.700, - 0.800, - 0.900, - 1.000, - 1.250, - 1.500, - 1.750, - 2.000, - 2.250, - 2.500, - 2.750, - 3.000) - - def findClosestIndex(d: Double): Int = { - val currentLevel = levels.minBy(s => math.abs(s - d)) - levels.indexOf(currentLevel) - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBox.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBox.scala deleted file mode 100644 index b1250f93..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBox.scala +++ /dev/null @@ -1,342 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import java.awt.Dimension -import java.awt.event.FocusAdapter -import java.awt.event.FocusEvent -import java.awt.event.KeyAdapter -import java.awt.event.KeyEvent -import java.awt.event.MouseListener - -import scala.reflect.ClassTag -import scala.util.Failure -import scala.util.Try - -import javax.swing.JButton -import javax.swing.JComboBox -import javax.swing.ToolTipManager -import javax.swing.event.PopupMenuEvent -import javax.swing.event.PopupMenuListener -import javax.swing.plaf.metal.MetalComboBoxUI -import javax.swing.text.JTextComponent -import se.culvertsoft.mgen.visualdesigner.HotKey -import se.culvertsoft.mgen.visualdesigner.HotKey.toStroke -import se.culvertsoft.mgen.visualdesigner.util.Observable -import se.culvertsoft.mgen.visualdesigner.util.OperationStatus -import se.culvertsoft.mgen.visualdesigner.view.MkAction - -abstract class AutoBox[ItemType <: AutoBoxItem: ClassTag]( - removeArrow: Boolean, - item0: ItemType, - fallbackItem: ItemType) - extends JComboBox[ItemType] - with Observable[AutoBoxListener[ItemType]] { - - private val inhitibInput = new OperationStatus - private val layingOut = new OperationStatus - private val focusCyclingToReOpenList = new OperationStatus - - private var _cancelled = false - private var _finished: ItemType = item0.deepCopy().asInstanceOf[ItemType] - private var _build: ItemType = null.asInstanceOf[ItemType] - private var _lastSelected: ItemType = null.asInstanceOf[ItemType] - - if (removeArrow) { - // Hack to get around the bullshit of the jcombobox button - // Create it to avoid nullptr exceptions in the superclass, - // but don't add it - setUI(new MetalComboBoxUI() { - override def createArrowButton(): JButton = { - new JButton() { - override def getWidth(): Int = 0 - } - } - override def installComponents() { - arrowButton = createArrowButton(); - if (comboBox.isEditable()) - addEditor(); - comboBox.add(currentValuePane); - } - }) - } - - val cmpModel = new AutoBoxModel(this) - val cmpEditor = getEditor().getEditorComponent().asInstanceOf[JTextComponent] - val cmpDocument = new AutoBoxDocument(this, cmpModel) - val im = cmpEditor.getInputMap() - val am = cmpEditor.getActionMap() - - setModel(cmpModel) - setRenderer(new AutoBoxRenderer) - cmpEditor.setDocument(cmpDocument) - - im.put(HotKey(KeyEvent.VK_ESCAPE), "cancel") - am.put("cancel", MkAction(escCancel())) - - def escCancel() { - if (!isPopupVisible()) - triggerObservers(_.requestFocusUp()) - cancel() - } - - cmpEditor.addKeyListener(new KeyAdapter() { - override def keyPressed(e: KeyEvent) { - if (!isPopupVisible() && e.getKeyCode() == KeyEvent.VK_ENTER) { - cmpEditor.transferFocus() - return - } - if (!isPopupVisible() && e.getKeyCode() != KeyEvent.VK_ESCAPE) { - setPopupVisible(true) - } - } - }) - - val editBorder = cmpEditor.getBorder() - - setEditorGfx(false) - - cmpEditor.addFocusListener(new FocusAdapter() { - override def focusGained(e: FocusEvent) { - if (!isPopupVisible()) - setPopupVisible(true) - if (!isFocusCyclingToReopenList()) { - setEditorGfx(true) - triggerObservers(_.focusGained(e)) - } - focusCyclingToReOpenList.disable() - } - override def focusLost(e: FocusEvent) { - if (!isFocusCyclingToReopenList()) { - setEditorGfx(false) - if (build != null && !isComplete()) - cancel() - } - } - }) - - addPopupMenuListener(new PopupMenuListener() { - - override def popupMenuWillBecomeVisible(e: PopupMenuEvent) { - inhibitInput { - updateSuggestions() - } - if (build == null || isComplete()) { - cmpDocument.highlightCompletedText(0) - } - } - - override def popupMenuWillBecomeInvisible(e: PopupMenuEvent) { - handleFinalInput() - } - - override def popupMenuCanceled(e: PopupMenuEvent) { - cancel() - } - - }) - - cmpDocument.setText(finished.toString()) - cmpDocument.highlightCompletedText(0) - - ToolTipManager.sharedInstance().registerComponent(this) - - setEditable(true) - - /** - * ****************************************************** - * - * - * METHODS - * - * ****************************************************** - */ - - def hideEditorGfx(): Boolean = { - true - } - - def setEditorGfx(state: Boolean) { - if (hideEditorGfx) { - if (state) { - cmpEditor.setOpaque(true) - cmpEditor.setBorder(editBorder) - } else { - cmpEditor.setOpaque(false) - cmpEditor.setBorder(null) - } - } - } - - def select(item: ItemType) { - _lastSelected = item - _finished = item - cmpModel.setSelectedItem(item) - cmpDocument.setText(item.toString()) - cmpDocument.highlightCompletedText(0) - setToolTipText(getToolTipText) - } - - def update() { - select(finished) - } - - def handleFinalInput() { - - safe { - - if (isCancelled()) { - _cancelled = false - _build = null.asInstanceOf[ItemType] - cmpDocument.setText(finished.toString()) - cmpDocument.highlightCompletedText(0) - return - } - - if (build != null) { - if (!build.isComplete() && selected().isDefined) { - _build = build.completeWith(selected().get.deepCopy().asInstanceOf[ItemType]).asInstanceOf[ItemType] - } - } else { - if (selected().isDefined) { - _build = selected().get.deepCopy().asInstanceOf[ItemType] - } - } - - if (isComplete()) { - _finished = build.deepCopy().asInstanceOf[ItemType] - _build = null.asInstanceOf[ItemType] - cmpDocument.setText(_finished.toString()) - cmpDocument.highlightCompletedText(0) - triggerObservers(_.finishedItem(finished)) - } else { - cmpModel.setSelectedItem(fallbackItem.deepCopy().asInstanceOf[ItemType]) - cmpDocument.highlightCompletedText(cmpDocument.getLength()) - if (cmpEditor.hasFocus()) { - focusCyclingToReOpenList.enable() - cmpEditor.transferFocus() - cmpEditor.requestFocusInWindow() - } - } - } - - setToolTipText(getToolTipText()) - } - - def setLastSelected(o: ItemType) { - _lastSelected = o - } - - def finished() = { - _finished - } - - def lastSelected() = { - _lastSelected - } - - def build() = { - _build - } - - def isFocusCyclingToReopenList(): Boolean = { - focusCyclingToReOpenList.isActive() - } - - def isComplete(): Boolean = { - build != null && build.isComplete() - } - - override def doLayout() { - layingOut active { - super.doLayout(); - } - } - - override def getSize(): Dimension = { - val dim = super.getSize(); - if (!layingOut.isActive()) - dim.width = Math.max(dim.width, getPreferredSize().width); - return dim; - } - - def addExternalMouseListener(l: MouseListener) { - cmpEditor.addMouseListener(l) - // if (_arrowBtn != null) - // _arrowBtn.addMouseListener(l) - } - - def cancel() { - _cancelled = true - _build = null.asInstanceOf[ItemType] - _lastSelected = finished().deepCopy().asInstanceOf[ItemType] - inhitibInput.disable() - setSelectedItem(finished()) - cmpDocument.setText(finished.toString()) - setPopupVisible(false) - } - - def isCancelled(): Boolean = { - _cancelled - } - - def isInputInhibited(): Boolean = { - inhitibInput.isActive() - } - - override def getToolTipText(): String = { - s"type: ${finished.tooltipString}" - } - - def safe(f: => Unit) { - Try { - f - } match { - case Failure(err) => - err.printStackTrace() - cmpDocument.revert() - case _ => - } - } - - def setBuild(b: ItemType) { - _build = b - } - - def inhibitInput(f: => Unit) { - inhitibInput active { - f - } - } - - def selected(): Option[ItemType] = { - getSelectedItem() match { - case st: ItemType => Some(st) - case _ => None - } - } - - def getSelectedCore(): ItemType = { - if (build != null) - build.deepCopy().asInstanceOf[ItemType] - else if (selected().isDefined) - selected().get.deepCopy().asInstanceOf[ItemType] - else - finished.deepCopy().asInstanceOf[ItemType] - } - - // checks if str1 starts with str2 - ignores case - def startsWithIgnoreCase(str1: String, str2: String): Boolean = { - str1.toUpperCase().startsWith(str2.toUpperCase()) - } - - /** - * ********************************************************************** - * - * - * ABSTRACT METHODS - * - * ********************************************************************* - */ - - def updateSuggestions() - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxDocument.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxDocument.scala deleted file mode 100644 index 403351ec..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxDocument.scala +++ /dev/null @@ -1,137 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import java.awt.Toolkit - -import scala.reflect.ClassTag - -import javax.swing.DefaultComboBoxModel -import javax.swing.text.AttributeSet -import javax.swing.text.BadLocationException -import javax.swing.text.PlainDocument - -class AutoBoxDocument[ItemType <: AutoBoxItem: ClassTag]( - c: AutoBox[ItemType], - cmpModel: DefaultComboBoxModel[ItemType]) - extends PlainDocument { - - @throws[BadLocationException] - override def insertString(offs: Int, str: String, a: AttributeSet) { - - c.safe { - - if (c.isInputInhibited || !c.isPopupVisible()) - return - - val click_continuing = - offs == 0 && - str.size > 1 //** && - /*c.build != null &&*/ - // !c.isComplete() - - if (click_continuing) { - c.inhibitInput { - if (c.build != null) { - cmpModel.setSelectedItem(c.lastSelected) - super.insertString(0, c.build.deepCopy().completeWith(c.lastSelected).toString(), null) - return - } else { - cmpModel.setSelectedItem(c.lastSelected) - super.insertString(0, c.lastSelected.toString(), null) - return - } - } - } - - val userTextBefore = getText(0, getLength()) - // val selStartBefore = c.cmpEditor.getSelectionStart() - // val selEndBefore = c.cmpEditor.getSelectionEnd() - - super.insertString(offs, str, a) - - // Check how much of "build" that we can keep, - // Remove the rest of the text AND of build - while (c.build != null && !c.build.matches(userTextBefore)) { - c.setBuild(c.build.removeLast().asInstanceOf[ItemType]) - } - - val prependString = if (c.build != null) c.build.toString() else "" - val testString = getText(prependString.length, getLength() - prependString.length) - val item = lookupItem(testString) - - if (item != null) { - - val preview = - if (c.build != null) c.build.deepCopy().completeWith(item.deepCopy()) - else item.deepCopy() - - c.inhibitInput { - cmpModel.setSelectedItem(item.deepCopy()) - setText(preview.toString()) - val highlightFrom = offs + str.length() - highlightCompletedText(highlightFrom) - if (highlightFrom == getLength()) { - c.setPopupVisible(false) - } - } - - } else { - Toolkit.getDefaultToolkit().beep() - c.inhibitInput { - setText(userTextBefore) - } - } - - } - - } - - def lookupItem(pattern: String): ItemType = { - - val n = cmpModel.getSize() - for (i <- 0 until n) { - val anItem = cmpModel.getElementAt(i) - if (startsWithIgnoreCase(anItem.toString(), pattern)) { - return anItem - } - } - - return null.asInstanceOf[ItemType] - } - - // checks if str1 starts with str2 - ignores case - def startsWithIgnoreCase(str1: String, str2: String): Boolean = { - return str1.toUpperCase().startsWith(str2.toUpperCase()) - } - - @throws[BadLocationException] - override def remove(a: Int, b: Int) { - if (!c.isPopupVisible()) - return - super.remove(a, b) - } - - def revert() { - if (c.build != null) { - setText(c.build.toString()) - } else { - c.selected() match { - case Some(s) => - c.setBuild(s.deepCopy().asInstanceOf[ItemType]) - setText(s.toString()) - case None => - c.setBuild(c.finished.deepCopy().asInstanceOf[ItemType]) - setText(c.finished.toString()) - } - } - } - - def setText(text: String) { - super.remove(0, getLength()) - super.insertString(0, text, null) - } - - def highlightCompletedText(start: Int) { - c.cmpEditor.setCaretPosition(getLength()) - c.cmpEditor.moveCaretPosition(start) - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxItem.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxItem.scala deleted file mode 100644 index 783ab6ee..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxItem.scala +++ /dev/null @@ -1,19 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -trait AutoBoxItem { - - def deepCopy(): AutoBoxItem - - def isComplete(): Boolean - - def tooltipString(): String = toString() - - def removeLast(): AutoBoxItem {} - - def completeWith(t: AutoBoxItem): AutoBoxItem {} - - def matches(s: String): Boolean = toString == s - - def idString(): String - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxListener.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxListener.scala deleted file mode 100644 index 7183e1f2..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxListener.scala +++ /dev/null @@ -1,10 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import java.awt.event.FocusEvent -import scala.reflect.ClassTag - -class AutoBoxListener[ItemType <: AutoBoxItem: ClassTag] { - def finishedItem(t: ItemType) {} - def requestFocusUp() {} - def focusGained(e: FocusEvent) {} -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxModel.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxModel.scala deleted file mode 100644 index 06221e3d..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxModel.scala +++ /dev/null @@ -1,16 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import scala.reflect.ClassTag -import javax.swing.DefaultComboBoxModel - -class AutoBoxModel[ItemType <: AutoBoxItem: ClassTag]( - c: AutoBox[ItemType]) - extends DefaultComboBoxModel[ItemType](new Array[ItemType](0)) { - override def setSelectedItem(o: Object) { - o match { - case o: ItemType => c.setLastSelected(o) - case _ => - } - super.setSelectedItem(o) - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxRenderer.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxRenderer.scala deleted file mode 100644 index 90f77f5a..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/AutoBoxRenderer.scala +++ /dev/null @@ -1,35 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import java.awt.Component - -import javax.swing.DefaultListCellRenderer -import javax.swing.JComponent -import javax.swing.JList -import javax.swing.ListCellRenderer - -class AutoBoxRenderer extends ListCellRenderer[Object] { - - private val delegate: ListCellRenderer[Object] = new DefaultListCellRenderer - - override def getListCellRendererComponent( - list: JList[_ <: Object], - value: Object, - index: Int, - isSelected: Boolean, - cellHasFocus: Boolean): Component = { - - val component = delegate.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus).asInstanceOf[JComponent] - - value match { - case t: AutoBoxItem => - val desiredText = t.tooltipString() - if (list.getToolTipText() != desiredText) { - list.setToolTipText(desiredText) - } - case _ => - } - - return component; - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/ClassFieldTypeAutoComboBox2.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/ClassFieldTypeAutoComboBox2.scala deleted file mode 100644 index b19caa44..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/ClassFieldTypeAutoComboBox2.scala +++ /dev/null @@ -1,81 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import FieldTypes.genericTypeTemplates -import FieldTypes.simpleTypes -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.FieldType -import se.culvertsoft.mgen.visualdesigner.model.Int8Type -import se.culvertsoft.mgen.visualdesigner.model.MapType -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef -import se.culvertsoft.mgen.visualdesigner.model.UserDefinedType - -class ClassFieldTypeAutoComboBox2(t: FieldType, controller: Controller) - extends AutoBox[FieldTypeAutoBoxItem]( - true, - FieldTypeAutoBoxItem(t, controller), - FieldTypeAutoBoxItem(new Int8Type, controller)) { - import FieldTypes._ - - override def updateSuggestions() { - val prevSelected = getSelectedCore() - if (build != null) { - val last = FTOps.lastNode(build.fieldType) - last.child match { - case t: MapType => updateSuggestions(t.hasKeyType(), t.hasKeyType(), true) - case t => updateSuggestions(true, true, true) - } - } else { - updateSuggestions(true, true, true) - } - setSelectedItem(prevSelected) - } - - def updateSuggestions( - allowCustom: Boolean, - allowGeneric: Boolean, - allowSimple: Boolean) { - - val prevBuild = if (build != null) build.deepCopy() else null - val prevSelected = if (selected().isDefined) selected().get.deepCopy() else null - - cmpModel.removeAllElements() - - // Always Add simple types - if (allowSimple) { - for (t <- simpleTypes.map(FieldTypeAutoBoxItem(_, controller))) { - cmpModel.addElement(t) - } - } - - if (allowCustom) { - controller.model.foreach(_.child match { - case e: UserDefinedType => - val t = FieldTypeAutoBoxItem(new UserTypeRef(e.getId()), controller) - cmpModel.addElement(t) - case _ => - }) - } - - if (allowGeneric) { - for (t <- genericTypeTemplates().map(FieldTypeAutoBoxItem(_, controller))) { - cmpModel.addElement(t) - } - } - - if (prevSelected != null) { - cmpModel.setSelectedItem(prevSelected) - } - - if (prevBuild != null) { - - cmpDocument.setText(prevBuild.toString()) - setBuild(prevBuild) - } else if (prevSelected != null) { - - cmpDocument.setText(prevSelected.toString()) - } - - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/EntityAutoBoxItem.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/EntityAutoBoxItem.scala deleted file mode 100644 index 8cf566f1..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/EntityAutoBoxItem.scala +++ /dev/null @@ -1,68 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import se.culvertsoft.mgen.visualdesigner.classlookup.Type2String -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.EntityId -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase - -object Entity2String { - - def short(id: EntityIdBase, controller: Controller): String = { - implicit val model = controller.model - model.getEntity(id) match { - case Some(entity: CustomTypeField) => - controller.model.parentOf(entity) match { - case Some(clas) => s"${clas.getName()}.${entity.getName()}" - case _ => s".${entity.getName()}" - } - case Some(entity) => - entity.getName() - case _ => "" - } - } - - def long(id: EntityIdBase, controller: Controller): String = { - implicit val model = controller.model - model.getEntity(id) match { - case Some(entity) => - Type2String.getClassPath(entity) - case _ => "" - } - } - -} - -case class EntityAutoBoxItem(val id: EntityIdBase, controller: Controller) extends AutoBoxItem { - - override def deepCopy(): EntityAutoBoxItem = { - EntityAutoBoxItem(id.deepCopy(), controller) - } - - override def toString(): String = { - Entity2String.short(id, controller) - } - - override def tooltipString(): String = { - Entity2String.long(id, controller) - } - - override def removeLast(): EntityAutoBoxItem = { - null - } - - override def completeWith(t: AutoBoxItem): AutoBoxItem = { - t.deepCopy() - } - - override def isComplete(): Boolean = { - true - } - - override def matches(s: String): Boolean = { - s.toLowerCase().startsWith(toString().toLowerCase()) - } - - override def idString(): String = id.toString() - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTChildParent.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTChildParent.scala deleted file mode 100644 index c8654951..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTChildParent.scala +++ /dev/null @@ -1,5 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import se.culvertsoft.mgen.visualdesigner.model.FieldType - -case class FTChildParent(val parent: FieldType, val child: FieldType) diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTOps.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTOps.scala deleted file mode 100644 index cd6309af..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FTOps.scala +++ /dev/null @@ -1,142 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import se.culvertsoft.mgen.visualdesigner.model.ArrayType -import se.culvertsoft.mgen.visualdesigner.model.FieldType -import se.culvertsoft.mgen.visualdesigner.model.ListOrArrayType -import se.culvertsoft.mgen.visualdesigner.model.ListType -import se.culvertsoft.mgen.visualdesigner.model.MapType -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.SimpleType -import se.culvertsoft.mgen.visualdesigner.model.NoType -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef - -object FTOps { - - def traverse(t: FieldType)(fContinue: FTChildParent => Boolean) { - def traverse(parent: FieldType, child: FieldType): Boolean = { - fContinue(FTChildParent(parent, child)) && - (child match { - case child: MapType => child.hasKeyType() && traverse(child, child.getKeyType()) && - child.hasValueType() && traverse(child, child.getValueType()) - case child: ListOrArrayType => - child.hasElementType() && traverse(child, child.getElementType()) - case _ => true - }) - } - traverse(null, t) - } - - def lastNode(t: FieldType): FTChildParent = { - var out: FTChildParent = null - traverse(t) { cp => - out = cp - true - } - out - } - - def complete(base: FieldType, t: FieldType) { - base match { - case m: MapType => - if (!m.hasKeyType()) - m.setKeyType(t.asInstanceOf[SimpleType]) - else if (!m.hasValueType()) - m.setValueType(t) - else if (!isComplete(m.getValueType())) - complete(m.getValueType(), t) - case l: ListOrArrayType => - if (!l.hasElementType()) - l.setElementType(t) - else if (!isComplete(l.getElementType())) - complete(l.getElementType(), t) - } - } - - def isComplete(t: FieldType): Boolean = { - t match { - case t: SimpleType => true - case t: MapType => t.hasKeyType() && isComplete(t.getKeyType()) && t.hasValueType() && isComplete(t.getValueType()) - case t: ListOrArrayType => t.hasElementType() && isComplete(t.getElementType()) - case t: UserTypeRef => true - case t: NoType => true - } - } - - def removeLast(_t: FieldType): FieldType = { - val t = _t.deepCopy() - t match { - case t: MapType => - if (t.hasValueType()) { - val x = removeLast(t.getValueType()) - if (x != null) - t.setValueType(x) - else - t.unsetValueType() - t - } else if (t.hasKeyType()) { - val x = removeLast(t.getKeyType()).asInstanceOf[SimpleType] - if (x != null) - t.setKeyType(x) - else - t.unsetKeyType() - t - } else { - null - } - case t: ListOrArrayType => - if (t.hasElementType()) { - val x = removeLast(t.getElementType()) - if (x != null) - t.setElementType(x) - else - t.unsetElementType() - t - } else { - null - } - case _ => - null - } - } - - def toString(t: FieldType, toStringFunc: FieldType => String)(implicit model: Model): String = { - t match { - case t: MapType => - if (t.hasKeyType()) { - if (t.hasValueType()) { - if (isComplete(t.getValueType())) { - s"map[${toString(t.getKeyType(), toStringFunc)}, ${toString(t.getValueType(), toStringFunc)}]" - } else { - s"map[${toString(t.getKeyType(), toStringFunc)}, ${toString(t.getValueType(), toStringFunc)}" - } - } else { - s"map[${toString(t.getKeyType(), toStringFunc)}, " - } - } else { - "map[" - } - case t: ListType => - if (t.hasElementType()) { - if (isComplete(t.getElementType())) { - s"list[${toString(t.getElementType(), toStringFunc)}]" - } else { - s"list[${toString(t.getElementType(), toStringFunc)}" - } - } else { - "list[" - } - case t: ArrayType => - if (t.hasElementType()) { - if (isComplete(t.getElementType())) { - s"array[${toString(t.getElementType(), toStringFunc)}]" - } else { - s"array[${toString(t.getElementType(), toStringFunc)}" - } - } else { - "array[" - } - case t => toStringFunc(t) - } - } - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypeAutoBoxItem.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypeAutoBoxItem.scala deleted file mode 100644 index 35e084a2..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypeAutoBoxItem.scala +++ /dev/null @@ -1,63 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import se.culvertsoft.mgen.visualdesigner.classlookup.Type2String -import se.culvertsoft.mgen.visualdesigner.model.FieldType -import se.culvertsoft.mgen.visualdesigner.model.ListOrArrayType -import se.culvertsoft.mgen.visualdesigner.model.MapType -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.SimpleType -import se.culvertsoft.mgen.visualdesigner.control.Controller - -case class FieldTypeAutoBoxItem(val fieldType: FieldType, controller: Controller) extends AutoBoxItem { - - override def deepCopy(): FieldTypeAutoBoxItem = { - FieldTypeAutoBoxItem(fieldType.deepCopy(), controller) - } - - override def toString(): String = { - implicit val model = controller.model - FTOps.toString(fieldType, Type2String.apply) - } - - override def tooltipString(): String = { - implicit val model = controller.model - FTOps.toString(fieldType, Type2String.long) - } - - override def removeLast(): FieldTypeAutoBoxItem = { - val x = FTOps.removeLast(fieldType) - if (x != null) - FieldTypeAutoBoxItem(x, controller) - else - null - } - - override def completeWith(t: AutoBoxItem): FieldTypeAutoBoxItem = { - complete(t.asInstanceOf[FieldTypeAutoBoxItem].fieldType) - } - - override def isComplete(): Boolean = { - FTOps.isComplete(fieldType) - } - - override def matches(s: String): Boolean = { - s.toLowerCase().startsWith(toString().toLowerCase()) - } - - private def complete(t: FieldType): FieldTypeAutoBoxItem = { - val out = fieldType.deepCopy() - FTOps.complete(out, t) - FieldTypeAutoBoxItem(out, controller) - } - - private def isComplete(t: FieldType): Boolean = { - t match { - case t: SimpleType => true - case t: MapType => t.hasKeyType() && isComplete(t.getKeyType()) && t.hasValueType() && isComplete(t.getValueType()) - case t: ListOrArrayType => t.hasElementType() && isComplete(t.getElementType()) - } - } - - override def idString(): String = "" - -} diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypes.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypes.scala deleted file mode 100644 index 605c0f6e..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FieldTypes.scala +++ /dev/null @@ -1,54 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import scala.collection.JavaConversions.collectionAsScalaIterable -import se.culvertsoft.mgen.visualdesigner.ClassRegistry -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.FieldType -import se.culvertsoft.mgen.visualdesigner.model.GenericType -import se.culvertsoft.mgen.visualdesigner.model.ListOrArrayType -import se.culvertsoft.mgen.visualdesigner.model.Model -import se.culvertsoft.mgen.visualdesigner.model.NoType -import se.culvertsoft.mgen.visualdesigner.model.PrimitiveType -import se.culvertsoft.mgen.visualdesigner.model.SimpleType -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef - -object FieldTypes { - - val cr = new ClassRegistry() - - val simpleTypeEntries = cr.entries() - .filter(e => classOf[SimpleType].isAssignableFrom(e.cls())) - .filter { e => e.cls() != classOf[SimpleType] && e.cls() != classOf[PrimitiveType] } - .toSeq - .sortBy(_.cls().getSimpleName()) - - val genericTypeEntries = cr.entries() - .filter(e => classOf[GenericType].isAssignableFrom(e.cls())) - .filter { e => e.cls() != classOf[GenericType] && e.cls() != classOf[ListOrArrayType] } - .toSeq - .sortBy(_.cls().getSimpleName()) - - def simpleTypes(): Seq[FieldType] = { - simpleTypeEntries - .map(_.construct()) - .map(_.asInstanceOf[FieldType]) - } - - def genericTypeTemplates(): Seq[FieldType] = { - genericTypeEntries - .map(_.construct()) - .map(_.asInstanceOf[FieldType]) - } - - def getSuperType(t: CustomType)(implicit model: Model): FieldType = { - if (t.hasSuperType()) { - model.superTypeOf(t) match { - case Some(superType) => new UserTypeRef(superType.getId()) - case None => new NoType - } - } else { - new NoType - } - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FindEntityAutoComboBox2.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FindEntityAutoComboBox2.scala deleted file mode 100644 index c7a2d9f0..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/FindEntityAutoComboBox2.scala +++ /dev/null @@ -1,68 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import scala.reflect.ClassTag - -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.model.EntityId -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.Project - -abstract class FindEntityAutoComboBox2(controller: Controller) - extends AutoBox[EntityAutoBoxItem]( - false, - EntityAutoBoxItem(new EntityId(0L, 0L), controller), - EntityAutoBoxItem(new EntityId(0L, 0L), controller)) { - import FieldTypes._ - - def allowFields(): Boolean - def allowClasses(): Boolean - def allowModules(): Boolean - def allowProjects(): Boolean - - private def addAll[T <: Entity: ClassTag]() { - controller.model.foreach(_.child match { - case e: T => - val t = EntityAutoBoxItem(e.getId(), controller) - cmpModel.addElement(t) - case _ => - }) - } - - override def hideEditorGfx(): Boolean = { - false - } - - override def updateSuggestions() { - - val keepSelected = if (selected().isDefined) selected().get.deepCopy() else null - - cmpModel.removeAllElements() - - if (allowFields) { - addAll[CustomTypeField]() - } - - if (allowClasses) { - addAll[CustomType]() - } - - if (allowModules) { - addAll[Module]() - } - - if (allowProjects) { - addAll[Project]() - } - - if (keepSelected != null) { - cmpModel.setSelectedItem(keepSelected) - cmpDocument.setText(keepSelected.toString()) - } - - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SelectViewRootAutoBox2.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SelectViewRootAutoBox2.scala deleted file mode 100644 index bcb7f033..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SelectViewRootAutoBox2.scala +++ /dev/null @@ -1,10 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import se.culvertsoft.mgen.visualdesigner.control.Controller - -class SelectViewRootAutoBox2(controller: Controller) extends FindEntityAutoComboBox2(controller) { - override def allowFields(): Boolean = false - override def allowClasses(): Boolean = false - override def allowModules(): Boolean = true - override def allowProjects(): Boolean = true -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SuperTypeAutoComboBox2.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SuperTypeAutoComboBox2.scala deleted file mode 100644 index 1aa64933..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/autobox2/SuperTypeAutoComboBox2.scala +++ /dev/null @@ -1,61 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.autobox2 - -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.NoType -import se.culvertsoft.mgen.visualdesigner.model.EntityId -import se.culvertsoft.mgen.visualdesigner.model.EntityIdBase -import se.culvertsoft.mgen.visualdesigner.model.UserTypeRef - -class SuperTypeAutoComboBox2(t: CustomType, controller: Controller) - extends AutoBox[FieldTypeAutoBoxItem]( - true, - FieldTypeAutoBoxItem(FieldTypes.getSuperType(t)(controller.model), controller), - FieldTypeAutoBoxItem(new NoType, controller)) { - import FieldTypes._ - - override def getToolTipText(): String = { - "super " + super.getToolTipText() - } - - def reallyAddItem(item: FieldTypeAutoBoxItem): Boolean = { - item match { - case FieldTypeAutoBoxItem(e: UserTypeRef, _) => controller.model.isInheritanceAllowed(t.getId(), e.getId()) - case _ => true - } - } - - private val noTypeItem = FieldTypeAutoBoxItem(new NoType, controller) - - override def updateSuggestions() { - - val keepSelected = if (selected().isDefined) selected().get.deepCopy() else null - - cmpModel.removeAllElements() - cmpModel.addElement(noTypeItem) - controller.model.foreach(_.child match { - case e: CustomType => - val t = FieldTypeAutoBoxItem(new UserTypeRef(e.getId()), controller) - if (reallyAddItem(t)) { - if (cmpModel.getIndexOf(t) == -1) { - cmpModel.addElement(t) - } - } - case _ => - }) - - if (keepSelected != null) { - cmpDocument.setText(keepSelected.toString()) - cmpModel.setSelectedItem(keepSelected) - } - } - - def onNewSuperType(id: EntityIdBase) { - id match { // it may be null - case id: EntityIdBase => super.select(FieldTypeAutoBoxItem(new UserTypeRef(id), controller)) - case _ => super.select(FieldTypeAutoBoxItem(new NoType, controller)) - } - - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/searchdialog/SearchDialog.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/searchdialog/SearchDialog.scala deleted file mode 100644 index acc0a8d0..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/view/searchdialog/SearchDialog.scala +++ /dev/null @@ -1,294 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.view.searchdialog - -import java.awt.event.KeyEvent -import java.util.regex.Pattern - -import javax.swing.JButton -import javax.swing.JCheckBox -import javax.swing.JDialog -import javax.swing.JLabel -import javax.swing.JPanel -import javax.swing.JTabbedPane -import javax.swing.JTextField -import javax.swing.border.EmptyBorder -import javax.swing.event.ChangeEvent -import javax.swing.event.ChangeListener -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.visualdesigner.HotKey -import se.culvertsoft.mgen.visualdesigner.HotKey.toStroke -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.CustomType -import se.culvertsoft.mgen.visualdesigner.model.CustomTypeField -import se.culvertsoft.mgen.visualdesigner.model.Entity -import se.culvertsoft.mgen.visualdesigner.model.EnumEntry -import se.culvertsoft.mgen.visualdesigner.model.EnumType -import se.culvertsoft.mgen.visualdesigner.model.Module -import se.culvertsoft.mgen.visualdesigner.model.Project -import se.culvertsoft.mgen.visualdesigner.util.MkActionListener -import se.culvertsoft.mgen.visualdesigner.view.MkAction -import se.culvertsoft.mgen.visualdesigner.view.Selectable -import se.culvertsoft.mgen.visualdesigner.view.autobox2.AutoBoxListener -import se.culvertsoft.mgen.visualdesigner.view.autobox2.Entity2String -import se.culvertsoft.mgen.visualdesigner.view.autobox2.EntityAutoBoxItem -import se.culvertsoft.mgen.visualdesigner.view.autobox2.FindEntityAutoComboBox2 - -trait FocusFordwardingTab { - def forwardFocus() -} - -class FilterPanel extends JPanel { - setLayout(new MigLayout) - val projectsCheckbox = new JCheckBox("project", false) { setToolTipText("Include projects in the search") } - val moduleCheckbox = new JCheckBox("module", true) { setToolTipText("Include modules in the search") } - val enumCheckbox = new JCheckBox("enum", true) { setToolTipText("Include enums in the search") } - val classCheckbox = new JCheckBox("class", true) { setToolTipText("Include classes in the search") } - val fieldCheckbox = new JCheckBox("field", false) { setToolTipText("Include fields in the search") } - add(projectsCheckbox) - add(moduleCheckbox) - add(enumCheckbox) - add(classCheckbox) - add(fieldCheckbox) -} - -class ByNamePanel(controller: Controller) extends JPanel with FocusFordwardingTab { - setLayout(new MigLayout) - - val label = new JLabel("Pattern:") - val textField = new JTextField - val findNextBtn = new JButton("Find Next") { addActionListener(MkActionListener(next())) } - val findPreviousBtn = new JButton("Find Previous") { addActionListener(MkActionListener(previous())) } - val filterPanel = new FilterPanel - - val textFieldIM = textField.getInputMap() - val textFieldAM = textField.getActionMap() - - textFieldIM.put(HotKey(KeyEvent.VK_ENTER), "next") - textFieldAM.put("next", MkAction(next())) - - add(label, "align right") - add(textField, "width 130::, growx, wrap") - add(findNextBtn) - add(findPreviousBtn, "wrap") - add(filterPanel, "span 2") - - /** - * ************************************************************** - * - * - * METHODS - * - * ************************************************************* - */ - - def isAllowed(e: Entity): Boolean = { - e match { - case e: CustomTypeField => filterPanel.fieldCheckbox.isSelected() - case e: EnumEntry => filterPanel.fieldCheckbox.isSelected() - case e: EnumType => filterPanel.enumCheckbox.isSelected() - case e: CustomType => filterPanel.classCheckbox.isSelected() - case e: Module => filterPanel.moduleCheckbox.isSelected() - case e: Project => filterPanel.projectsCheckbox.isSelected() - case _ => false - } - } - - def findMatchingItems(entityStringifyer: Entity => String)(matchFcn: (String, String) => Boolean): Seq[Entity] = { - controller.model.findEach[Entity](e => { - if (isAllowed(e)) { - val stringified = entityStringifyer(e) - val stringPattern = textField.getText() - if (stringPattern != null && matchFcn(stringPattern, stringified)) { - true - } else { - false - } - } else { - false - } - }) - } - - def shortNameOf(e: Entity): String = Entity2String.short(e.getId(), controller) - def longNameOf(e: Entity): String = Entity2String.long(e.getId(), controller) - - def exact(pattern: String, name: String): Boolean = pattern == name - def exactNoCase(pattern: String, name: String): Boolean = exact(pattern.toLowerCase(), name.toLowerCase()) - def contains(pattern: String, name: String): Boolean = name.contains(pattern) - def containsNoCase(pattern: String, name: String): Boolean = contains(pattern.toLowerCase(), name.toLowerCase()) - - def exactShortName(): Seq[Entity] = findMatchingItems(shortNameOf)(exact) - def noCaseShortName(): Seq[Entity] = findMatchingItems(shortNameOf)(exactNoCase) - def partialMatchShortName(): Seq[Entity] = findMatchingItems(shortNameOf)(contains) - def partialMatchNoCaseShortName(): Seq[Entity] = findMatchingItems(shortNameOf)(containsNoCase) - - def exactLongName(): Seq[Entity] = findMatchingItems(longNameOf)(exact) - def noCaseLongName(): Seq[Entity] = findMatchingItems(longNameOf)(exactNoCase) - def partialMatchLongName(): Seq[Entity] = findMatchingItems(longNameOf)(contains) - def partialMatchNoCaseLongName(): Seq[Entity] = findMatchingItems(longNameOf)(containsNoCase) - - def regexpMatch(stringiFyer: Entity => String): Seq[Entity] = { - val text = textField.getText() - if (text != null) { - val pattern = Pattern.compile(text) - findMatchingItems(stringiFyer) { (_, stringified) => - val matcher = pattern.matcher(stringified) - matcher.matches - } - } else { - Nil - } - } - - def regexpMatchShortName(): Seq[Entity] = { - regexpMatch(shortNameOf) - } - - def regexpMatchLongName(): Seq[Entity] = { - regexpMatch(longNameOf) - } - - def findMatches(): Seq[Entity] = { - - val testFcns = List( - () => exactShortName, - () => exactLongName, - () => noCaseShortName, - () => noCaseLongName, - () => partialMatchShortName, - () => partialMatchLongName, - () => partialMatchNoCaseShortName, - () => partialMatchNoCaseLongName, - () => regexpMatchShortName, - () => regexpMatchLongName) - - val results = testFcns.toStream.map(_()) - - results.find(_.nonEmpty).getOrElse(Nil) - - } - - def firstSelectedAmong(es: Seq[Entity]): Option[Int] = { - es - .map(controller.viewMgr.view) - .zipWithIndex - .find(_._1 match { - case e: Selectable => e.isSelected() - case _ => false - }) - .map(_._2) - } - - def step(delta: Int) { - - val matches = findMatches() - - if (matches.nonEmpty) { - firstSelectedAmong(matches) match { - case Some(prevIndex) => - val newIndex = (prevIndex + matches.size + delta) % matches.size - controller.viewMgr.find(matches(newIndex)) - case _ => - val newIndex = if (delta > 0) 0 else matches.size - 1 - controller.viewMgr.find(matches(newIndex)) - } - } - } - - def next() { - step(1) - } - - def previous() { - step(-1) - } - - override def forwardFocus() { - textField.requestFocusInWindow() - } - -} - -class FromListPanel(controller: Controller) extends JPanel with FocusFordwardingTab { - setLayout(new MigLayout) - - val label = new JLabel("Select:") - val filterPanel = new FilterPanel - val typeBox = new FindEntityAutoComboBox2(controller) { - override def allowFields(): Boolean = filterPanel.fieldCheckbox.isSelected() - override def allowClasses(): Boolean = filterPanel.classCheckbox.isSelected() - override def allowModules(): Boolean = filterPanel.moduleCheckbox.isSelected() - override def allowProjects(): Boolean = filterPanel.projectsCheckbox.isSelected() - - addObserver(new AutoBoxListener[EntityAutoBoxItem]() { - override def finishedItem(item: EntityAutoBoxItem) { - controller.model.getEntity(item.id) match { - case Some(entity) => controller.viewMgr.find(entity) - case _ => - } - } - }) - - override def setLastSelected(o: EntityAutoBoxItem) { - super.setLastSelected(o) - } - - } - - add(label, "align right") - add(typeBox, "width 130::, growx, wrap") - add(filterPanel, "span 2") - - /** - * ************************************************************** - * - * - * METHODS - * - * ************************************************************* - */ - - override def forwardFocus() { - typeBox.requestFocusInWindow() - } - -} - -class SearchDialog(controller: Controller) extends JDialog { - - // From list panel - val tabbedPane = new JTabbedPane - val searchByNameTab = new ByNamePanel(controller) - val selectFromListTab = new FromListPanel(controller) - - // Finish adding components to top level - tabbedPane.addTab("By Name", searchByNameTab) - tabbedPane.addTab("From List", selectFromListTab) - - tabbedPane.addChangeListener(new ChangeListener() { - override def stateChanged(e: ChangeEvent) { - forwardFocus() - } - }) - - // Top level configuration - setTitle("Search for class, module or project") - add(tabbedPane) - setResizable(false) - - // Required to display at correct size - getContentPane().asInstanceOf[JPanel].setBorder(new EmptyBorder(5, 0, 0, 0)) - pack() - - def exit() { - this.setVisible(false) - } - - def forwardFocus() { - val tab = - tabbedPane - .getComponent(tabbedPane.getSelectedIndex()) - .asInstanceOf[FocusFordwardingTab] - tab.forwardFocus() - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorPanel.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorPanel.scala deleted file mode 100644 index e26e764b..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorPanel.scala +++ /dev/null @@ -1,79 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.window - -import java.awt.Dimension -import javax.swing.JButton -import javax.swing.JLabel -import javax.swing.JPanel -import javax.swing.JTextField -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.visualdesigner.model.Generator -import se.culvertsoft.mgen.visualdesigner.util.MkActionListener -import se.culvertsoft.mgen.visualdesigner.util.MkDocumentListener -import javax.swing.JFileChooser -import javax.swing.BorderFactory -import java.awt.Color -abstract class GeneratorPanel(generator: Generator) extends JPanel() { - setLayout(new MigLayout("inset 10 10 10 10")) - setBorder(BorderFactory.createLineBorder(Color.black)); - val generatorClassName = createTextFieldWithLabel("Generator Class Name", generator.getGeneratorClassName, generator.setGeneratorClassName) - val name = createTextFieldWithLabel("Name", generator.getName, generator.setName) - val classRegistryPath = createTextFieldWithLabel("Class Registry Path", generator.getClassRegistryPath, generator.setClassRegistryPath) - val generatorPath = createTextFieldWithLabel("Generator Path", generator.getGeneratorJarFileFolder, generator.setGeneratorJarFileFolder, true) - val outputFolder = createTextFieldWithLabel("Output Folder", generator.getOutputFolder, generator.setOutputFolder, true) - val settings = new SettingsPanel(generator.getSettings()) - - val delButton = new JButton("Remove Generator") - delButton.addActionListener(MkActionListener { - onDelete() - }) - - add(generatorClassName, "growx, wrap") - add(name, "growx, wrap") - add(classRegistryPath, "growx, wrap") - add(generatorPath, "growx, wrap") - add(outputFolder, "growx, wrap") - add(settings, "span 2, wrap") - add(delButton) - - revalidate() - - def createTextFieldWithLabel(title: String, get: () => String, set: String => Unit, fileBrowser: Boolean = false): JPanel = { - val pane = new JPanel() - pane.setLayout(new MigLayout("inset 0 0 0 0")) - val label = new JLabel(title) - val textField = new JTextField(get()) { - setPreferredSize(new Dimension(999999, 10)) - getDocument().addDocumentListener(MkDocumentListener { - set(getText()) - onUpdate() - }) - } - - pane.add(label, "width 200px!") - - if (fileBrowser) { - val fileBrowserButton = new JButton("Select") - fileBrowserButton.addActionListener(MkActionListener { - val chooser = new JFileChooser(); - chooser.setDialogTitle("Select target directory"); - chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY) - val returnVal = chooser.showOpenDialog(getParent()) - if (returnVal == JFileChooser.APPROVE_OPTION) { - val text = chooser.getSelectedFile().getAbsolutePath() - textField.setText(text) - set(text) - onUpdate() - } - }) - - pane.add(textField, "growx") - pane.add(fileBrowserButton) - } else { - pane.add(textField, "growx") - } - return pane - } - - def onDelete() - def onUpdate() -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorWindow.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorWindow.scala deleted file mode 100644 index 6715642b..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/GeneratorWindow.scala +++ /dev/null @@ -1,88 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.window - -import java.awt.BorderLayout -import java.awt.Dimension - -import scala.collection.JavaConversions.asScalaBuffer - -import javax.swing.JButton -import javax.swing.JDialog -import javax.swing.JPanel -import javax.swing.JScrollPane -import javax.swing.ScrollPaneConstants -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.visualdesigner.control.Controller -import se.culvertsoft.mgen.visualdesigner.model.Generator -import se.culvertsoft.mgen.visualdesigner.util.MkActionListener - -class GeneratorWindow(controller: Controller) { - - val dialog = new JDialog(controller.viewMgr.getWindow, "Generator Settings"); - dialog.setModal(true) - - val content = new JPanel() { - override def getPreferredSize(): Dimension = { - return new Dimension(getScroller().getViewport().getSize().width, super.getPreferredSize.height) - } - } - - content.setLayout(new MigLayout("wrap 1")) - val generators = controller.settingsMgr.getGenerators - - val scroller = new JScrollPane(content) { - getVerticalScrollBar().setUnitIncrement(10) - setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER) - } - - def getScroller(): JScrollPane = { - scroller - } - - dialog.getContentPane().add(scroller, BorderLayout.CENTER); - - def createGeneratorPanel(generator: Generator): GeneratorPanel = { - return new GeneratorPanel(generator) { - override def onDelete() { - generators.remove(generator) - GeneratorWindow.this.remove(this) - updateAndSaveGenerators - } - override def onUpdate(){ - updateAndSaveGenerators - } - } - } - - def remove(g: GeneratorPanel) { - content.remove(g) - content.repaint() - content.validate() - } - - val button = new JButton("Add Generator") - button.addActionListener(MkActionListener { - val g = new Generator("", "", "", "", "", new java.util.HashMap[String, String]) - generators.add(g) - content.add(createGeneratorPanel(g)) - content.validate() - content.revalidate() - updateAndSaveGenerators - }) - content.add(button) - - generators.foreach { generator => - content.add(createGeneratorPanel(generator)) - } - - dialog.pack() - dialog.setSize(800, 768) - import se.culvertsoft.mgen.visualdesigner.util.AwtMath._ - val mousePos = controller.mouseInputMgr.mousePos.onScreen - dialog.setLocation(mousePos) - dialog.setVisible(true) - - def updateAndSaveGenerators(){ - controller.settingsMgr.setGenerators(generators) - } - -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsPanel.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsPanel.scala deleted file mode 100644 index 07ef07cf..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsPanel.scala +++ /dev/null @@ -1,47 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.window - -import java.util.HashMap -import scala.collection.JavaConversions.mapAsScalaMap -import scala.collection.mutable.ArrayBuffer -import javax.swing.JPanel -import net.miginfocom.swing.MigLayout -import javax.swing.JButton -import se.culvertsoft.mgen.visualdesigner.util.MkActionListener -import javax.swing.JLabel - -class SettingsPanel(map: HashMap[String, String]) extends JPanel { - setLayout(new MigLayout("wrap 1")) - add(new JLabel("Settings")) - val addButton = new JButton("Add Setting") - addButton.addActionListener(MkActionListener { - createSettingsRow("", "") - }) - add(addButton) - - val settingsRows = ArrayBuffer[SettingsRow]() - - for ((key, value) <- map) { - createSettingsRow(key, value) - } - - def createSettingsRow(key: String, value: String) { - val s = new SettingsRow(key, value) { - override def onChange() { - updateMap() - } - } - settingsRows += s - add(s) - revalidate() - } - - def updateMap() { - map.clear() - settingsRows.map { row => - if ("" != row.getKey) { - map.put(row.getKey, row.getValue) - } - } - revalidate() - } -} \ No newline at end of file diff --git a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsRow.scala b/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsRow.scala deleted file mode 100644 index 94693b07..00000000 --- a/mgen-visualdesigner/src/main/scala/se/culvertsoft/mgen/visualdesigner/window/SettingsRow.scala +++ /dev/null @@ -1,32 +0,0 @@ -package se.culvertsoft.mgen.visualdesigner.window - -import javax.swing.JPanel -import javax.swing.JTextField -import net.miginfocom.swing.MigLayout -import se.culvertsoft.mgen.visualdesigner.util.MkActionListener -import se.culvertsoft.mgen.visualdesigner.util.MkDocumentListener -import java.awt.Dimension - -abstract class SettingsRow(key: String, value: String) extends JPanel { - setLayout(new MigLayout("insets 0 0 0 0, wrap 2")) - - val keyTF = new JTextField(key) - keyTF.getDocument().addDocumentListener(MkDocumentListener{ - onChange() - }) - keyTF.setPreferredSize(new Dimension(1000, 10)) - - val valueTF = new JTextField(value) - valueTF.getDocument().addDocumentListener(MkDocumentListener{ - onChange() - }) - valueTF.setPreferredSize(new Dimension(1000, 10)) - - add(keyTF, "growx") - add(valueTF, "growx") - - def onChange() - - def getKey() = keyTF.getText() - def getValue() = valueTF.getText() -}