You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2026/04/25 21:37:57 UTC

(cayenne) branch master updated (f97d95561 -> 7ad056aa2)

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git


    from f97d95561 Removing all @since tags from the modeler classes
     new 9cd71d481 Modeler cleanup
     new 7144b20e2 Modeler cleanup
     new 3f576adc9 Modeler cleanup
     new 1ad1d904d Modeler cleanup
     new 4be649db9 Modeler cleanup
     new b36f06f01 Modeler cleanup
     new 550c2bb36 Modeler cleanup
     new 52ac06358 Modeler cleanup
     new 5d3c3a107 Modeler cleanup
     new 4c0163ebf Modeler cleanup
     new 7aafab8b0 Modeler cleanup
     new 9ea38f341 Fixing per-project preferences
     new 6c05cd892 Modeler cleanup
     new bc090b07c Modeler cleanup
     new 7ad056aa2 Modeler cleanup

The 15 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../cayenne/modeler/generic/GenericButtonUI.java   |   2 +-
 .../generic/GenericCayenneModelerModule.java       |   2 +-
 .../generic/GenericPlatformInitializer.java        |   2 +-
 .../modeler/osx/OSXCayenneModelerModule.java       |   2 +-
 .../modeler/osx/OSXPlatformInitializer.java        |  95 ++-
 .../modeler/win/WinCayenneModelerModule.java       |   2 +-
 .../modeler/win/WinPlatformInitializer.java        |  50 +-
 .../org/apache/cayenne/modeler/Application.java    | 125 ++--
 .../cayenne/modeler/ClassLoadingService.java       |  38 --
 .../main/java/org/apache/cayenne/modeler/Main.java |   2 +-
 .../org/apache/cayenne/modeler/ModelerModule.java  |  17 +-
 .../cayenne/modeler/action/ActionManager.java      |  62 --
 .../modeler/dbimport/ModelerDbLoaderContext.java   |   8 +-
 .../event/display/CallbackMethodDisplayEvent.java  |   2 +-
 .../event/display/CallbackTypeDisplayEvent.java    |   2 +-
 .../cayenne/modeler/graph/BaseGraphBuilder.java    |  12 +-
 .../modeler/graph/ObjEntityCellMetadata.java       |   6 +-
 .../modeler/pref/CayenneProjectPreferences.java    |  11 -
 .../cayenne/modeler/pref/DBConnectionInfo.java     |  15 +-
 .../cayenne/modeler/pref/ProjectSelectionMemo.java | 691 +++++++++++++++++++++
 .../modeler/pref/ProjectStatePreferences.java      |  19 +
 .../modeler/pref/TableColumnPreferences.java       |   2 +-
 .../action/GlobalActions.java}                     |  51 +-
 .../classloader/ModelerClassLoader.java}           |  85 +--
 .../extension => service/graph}/EntityHandler.java |   2 +-
 .../graph}/GraphExtension.java                     |  13 +-
 .../extension => service/graph}/GraphHandler.java  |  27 +-
 .../graph}/GraphLoaderDelegate.java                |  12 +-
 .../graph}/GraphSaverDelegate.java                 |   2 +-
 .../graph}/GraphsRootHandler.java                  |  12 +-
 .../platform/DefaultPlatformInitializer.java       |   2 +-
 .../platform/PlatformInitializer.java              |   2 +-
 .../validator}/ConfigurableProjectValidator.java   |   2 +-
 .../extension/ValidationConfigHandler.java         |   2 +-
 .../validator}/extension/ValidationExtension.java  |   2 +-
 .../extension/ValidationLoaderDelegate.java        |   2 +-
 .../extension/ValidationSaverDelegate.java         |   2 +-
 .../BrowserControl.java => swing/UrlOpener.java}   |  17 +-
 .../CayenneCheckBox.java}                          |  13 +-
 .../swing/{ => copypaste}/CayenneTransferable.java |  53 +-
 .../cayenne/modeler/swing/table/CayenneTable.java  | 123 +++-
 .../{util => swing/table}/CayenneTableModel.java   |   5 +-
 .../modeler/{util => swing/table}/TableSizer.java  |   2 +-
 .../modeler/swing/text/CayennePasswordField.java   |  32 +-
 .../modeler/swing/text/CayenneTextArea.java        |  21 +-
 ...Factory.java => CayenneTextCommitListener.java} |  24 +-
 .../modeler/swing/text/CayenneTextField.java       |  33 +-
 .../modeler/swing/text/CayenneTextPane.java        |  29 +-
 .../swing/text/CayenneTextPaneEditorKit.java       | 254 ++++++++
 .../swing/text/CayenneUndoableTextPane.java        |   2 +-
 .../cayenne/modeler/swing/text/TextPaneView.java   | 230 -------
 .../modeler/swing/text/ValidatorTextAdapter.java   | 201 ------
 .../modeler/swing/text/style/TextPaneStyleMap.java |  53 --
 .../swing/text/{syntax => style}/TextSyntax.java   |   2 +-
 .../org/apache/cayenne/modeler/ui/MainToolBar.java |  43 +-
 .../cayenne/modeler/ui/ModelerController.java      |  14 +-
 .../apache/cayenne/modeler/ui/ModelerFrame.java    | 139 +----
 .../apache/cayenne/modeler/ui/ModelerMenuBar.java  | 201 ++++++
 .../org/apache/cayenne/modeler/ui/SearchPanel.java |   2 +-
 .../modeler/{ => ui}/action/AboutAction.java       |   2 +-
 .../{ => ui}/action/BaseViewEntityAction.java      |   2 +-
 .../{ => ui}/action/CollapseTreeAction.java        |   2 +-
 .../action/ConfigurePreferencesAction.java         |   2 +-
 .../modeler/{ => ui}/action/CopyAction.java        |   6 +-
 .../{ => ui}/action/CopyAttributeAction.java       |   2 +-
 .../action/CopyAttributeRelationshipAction.java    |   8 +-
 .../{ => ui}/action/CopyCallbackMethodAction.java  |   4 +-
 .../action/CopyProcedureParameterAction.java       |   2 +-
 .../{ => ui}/action/CopyRelationshipAction.java    |   2 +-
 .../{ => ui}/action/CreateAttributeAction.java     |   2 +-
 .../action/CreateCallbackMethodAction.java         |   4 +-
 .../{ => ui}/action/CreateDataMapAction.java       |   2 +-
 .../{ => ui}/action/CreateDbEntityAction.java      |   2 +-
 .../{ => ui}/action/CreateEmbeddableAction.java    |   2 +-
 .../modeler/{ => ui}/action/CreateNodeAction.java  |   2 +-
 .../{ => ui}/action/CreateObjEntityAction.java     |   2 +-
 .../action/CreateObjEntityFromDbAction.java        |   2 +-
 .../{ => ui}/action/CreateProcedureAction.java     |   2 +-
 .../action/CreateProcedureParameterAction.java     |   2 +-
 .../modeler/{ => ui}/action/CreateQueryAction.java |   2 +-
 .../{ => ui}/action/CreateRelationshipAction.java  |   2 +-
 .../cayenne/modeler/{ => ui}/action/CutAction.java |   2 +-
 .../{ => ui}/action/CutAttributeAction.java        |   2 +-
 .../action/CutAttributeRelationshipAction.java     |   6 +-
 .../{ => ui}/action/CutCallbackMethodAction.java   |   2 +-
 .../action/CutProcedureParameterAction.java        |   2 +-
 .../{ => ui}/action/CutRelationshipAction.java     |   2 +-
 .../{ => ui}/action/DBConnectionAwareAction.java   |   2 +-
 .../{ => ui}/action/DbEntityCounterpartAction.java |   2 +-
 .../{ => ui}/action/DbEntitySyncAction.java        |   2 +-
 .../action/DisableValidationInspectionAction.java  |   2 +-
 .../{ => ui}/action/DocumentationAction.java       |   6 +-
 .../modeler/{ => ui}/action/ExitAction.java        |   2 +-
 .../modeler/{ => ui}/action/FilterAction.java      |   2 +-
 .../modeler/{ => ui}/action/FindAction.java        |   4 +-
 .../{ => ui}/action/GenerateCodeAction.java        |   2 +-
 .../modeler/{ => ui}/action/GenerateDBAction.java  |   2 +-
 .../{ => ui}/action/ImportDataMapAction.java       |   4 +-
 .../{ => ui}/action/ImportEOModelAction.java       |  79 ++-
 .../{ => ui}/action/InferRelationshipsAction.java  |   2 +-
 .../modeler/{ => ui}/action/LinkDataMapAction.java |   2 +-
 .../{ => ui}/action/LinkDataMapsAction.java        |   2 +-
 .../modeler/{ => ui}/action/MigrateAction.java     |   5 +-
 .../{ => ui}/action/ModelerAbstractAction.java     |   4 +-
 .../{ => ui}/action/MultipleObjectsAction.java     |   2 +-
 .../modeler/{ => ui}/action/NavigateAction.java    |   2 +-
 .../{ => ui}/action/NavigateBackwardAction.java    |   2 +-
 .../{ => ui}/action/NavigateForwardAction.java     |   2 +-
 .../modeler/{ => ui}/action/NewProjectAction.java  |   2 +-
 .../action/ObjEntityCounterpartAction.java         |   2 +-
 .../{ => ui}/action/ObjEntitySyncAction.java       |   2 +-
 .../action/ObjEntityToSuperEntityAction.java       |   2 +-
 .../modeler/{ => ui}/action/OpenProjectAction.java |   7 +-
 .../modeler/{ => ui}/action/PasteAction.java       |   6 +-
 .../modeler/{ => ui}/action/ProjectAction.java     |   2 +-
 .../modeler/{ => ui}/action/ProjectOpener.java     |   2 +-
 .../modeler/{ => ui}/action/RedoAction.java        |   2 +-
 .../modeler/{ => ui}/action/RemoveAction.java      |   6 +-
 .../{ => ui}/action/RemoveAttributeAction.java     |   2 +-
 .../action/RemoveAttributeRelationshipAction.java  |   6 +-
 .../action/RemoveCallbackMethodAction.java         |   6 +-
 .../action/RemoveProcedureParameterAction.java     |   2 +-
 .../{ => ui}/action/RemoveRelationshipAction.java  |   2 +-
 .../{ => ui}/action/ReverseEngineeringAction.java  |   4 +-
 .../modeler/{ => ui}/action/RevertAction.java      |   2 +-
 .../modeler/{ => ui}/action/SaveAction.java        |   4 +-
 .../modeler/{ => ui}/action/SaveAsAction.java      |   6 +-
 .../{ => ui}/action/ShowLogConsoleAction.java      |   2 +-
 .../action/ShowValidationConfigAction.java         |   2 +-
 .../action/ShowValidationOptionAction.java         |   2 +-
 .../modeler/{ => ui}/action/UndoAction.java        |   2 +-
 .../action/UpdateValidationConfigAction.java       |   2 +-
 .../modeler/{ => ui}/action/ValidateAction.java    |   5 +-
 .../InferRelationshipsController.java              |   5 +-
 .../InferRelationshipsTabController.java           |   2 +-
 .../ui/datasource/DataSourceController.java        |   4 +-
 .../ui/dbgen/DBGeneratorOptionsController.java     |   2 +-
 .../modeler/ui/dbgen/TableSelectorController.java  |   4 +-
 .../ui/dbloadresult/DbLoadResultDialog.java        |   2 +-
 .../ui/dbmerge/MergerOptionsController.java        |   7 +-
 .../ui/dbrelationship/DbJoinTableModel.java        |   2 +-
 .../cayenne/modeler/ui/errors/ErrorDialog.java     |   4 +-
 .../modeler/ui/find/FindDialogController.java      |   2 +-
 .../cayenne/modeler/ui/find/FindDialogView.java    |   2 +-
 .../modeler/ui/logconsole/LogConsoleView.java      |   2 +-
 .../ui/preferences/PreferenceDialogContext.java    |   2 +-
 .../DataSourcePreferencesController.java           |  22 +-
 .../preferences/datasource/creator/Adapters.java}  |  75 +--
 .../creator/DataSourceCreatorController.java       |   7 +-
 .../modeler/ui/project/ProjectController.java      |  94 +--
 .../ui/project/ProjectFileChangeTracker.java       |   4 +-
 .../cayenne/modeler/ui/project/ProjectView.java    |  16 +-
 .../modeler/ui/project/editor/EditorPanelView.java |  16 +-
 .../project/editor}/ExpressionConvertor.java       |  27 +-
 .../editor/datadomain/DataDomainTabbedView.java    |   4 +-
 .../project/editor/datadomain/DataDomainView.java  |  21 +-
 .../datadomain/dbimport/DbImportTabController.java |   2 +-
 .../graph/action/EntityDisplayAction.java          |   4 +-
 .../graph/action/RebuildGraphAction.java           |   2 +-
 .../graph/action/RemoveEntityAction.java           |   2 +-
 .../datadomain/graph/action/SaveAsImageAction.java |   2 +-
 .../graph/action/ShowGraphEntityAction.java        |   4 +-
 .../datadomain/graph/action/ZoomInAction.java      |   2 +-
 .../datadomain/graph/action/ZoomOutAction.java     |   2 +-
 .../validation/ValidationTabController.java        |   4 +-
 .../cgen/CgenArtefactSelectorController.java       |   2 +-
 .../editor/datamap/cgen/CgenConfigController.java  |  10 +-
 .../editor/datamap/cgen/CgenConfigPanel.java       | 115 ++--
 .../editor/datamap/dbimport/CatalogPopUpMenu.java  |   5 +-
 .../datamap/dbimport/DatabaseSchemaLoader.java     |   8 +-
 .../editor/datamap/dbimport/DbImportTree.java      |  14 +-
 .../datamap/dbimport/DbImportTreeCellEditor.java   |  19 +-
 .../editor/datamap/dbimport/DbImportView.java      | 129 ++--
 .../editor/datamap/dbimport/DefaultPopUpMenu.java  |  17 +-
 .../datamap/dbimport/DraggableTreePanel.java       |  80 +--
 .../datamap/dbimport/IncludeTablePopUpMenu.java    |   5 +-
 .../dbimport/ReverseEngineeringConfigPanel.java    | 130 ++--
 .../dbimport/ReverseEngineeringTreePanel.java      |  40 +-
 .../editor/datamap/dbimport/RootPopUpMenu.java     |  36 +-
 .../editor/datamap/dbimport/SchemaPopUpMenu.java   |   5 +-
 .../editor/datamap/dbimport/TreeToolbarPanel.java  | 123 ++--
 .../datamap/dbimport/action}/AddCatalogAction.java |   7 +-
 .../dbimport/action}/AddExcludeColumnAction.java   |   7 +-
 .../action}/AddExcludeProcedureAction.java         |   7 +-
 .../dbimport/action}/AddExcludeTableAction.java    |   7 +-
 .../dbimport/action}/AddIncludeColumnAction.java   |   7 +-
 .../action}/AddIncludeProcedureAction.java         |   7 +-
 .../dbimport/action}/AddIncludeTableAction.java    |   7 +-
 .../dbimport/action}/AddPatternParamAction.java    |  18 +-
 .../datamap/dbimport/action}/AddSchemaAction.java  |   7 +-
 .../datamap/dbimport/action/DbImportActions.java   | 168 +++++
 .../datamap/dbimport/action}/DeleteNodeAction.java |  32 +-
 .../dbimport/action}/DragAndDropNodeAction.java    |   7 +-
 .../datamap/dbimport/action}/EditNodeAction.java   |   9 +-
 .../dbimport}/action/GetDbConnectionAction.java    |   3 +-
 .../dbimport}/action/LoadDbSchemaAction.java       |  48 +-
 .../dbimport/action}/MoveImportNodeAction.java     |  48 +-
 .../dbimport/action}/MoveInvertNodeAction.java     |   9 +-
 .../datamap/dbimport}/action/SortNodesAction.java  |   8 +-
 .../dbimport/action}/TreeManipulationAction.java   |  50 +-
 .../editor/datamap/main/DataMapMainView.java       |  85 +--
 .../superclass/SuperclassUpdateController.java     |   2 +-
 .../{DbEntityTabbedView.java => DbEntityView.java} |  26 +-
 .../DbEntityMainView.java}                         | 109 ++--
 .../{ => main}/PKCustomSequenceGeneratorPanel.java |  29 +-
 .../dbentity/{ => main}/PKDBGeneratorPanel.java    |   2 +-
 .../{ => main}/PKDefaultGeneratorPanel.java        |   2 +-
 .../dbentity/{ => main}/PKGeneratorPanel.java      |   2 +-
 .../{ => properties}/DbAttributePanel.java         |  36 +-
 .../{ => properties}/DbAttributeTableModel.java    |   4 +-
 .../DbEntityPropertiesView.java}                   |  51 +-
 .../{ => properties}/DbRelationshipPanel.java      |  42 +-
 .../{ => properties}/DbRelationshipTableModel.java |   4 +-
 .../project/editor/embeddable/EmbeddableView.java  |  12 +-
 .../attributes/EmbeddableAttributeTableModel.java  |   2 +-
 .../attributes/EmbeddableAttributesView.java       |  32 +-
 .../editor/embeddable/main/EmbeddableMainView.java |  36 +-
 ...ObjEntityTabbedView.java => ObjEntityView.java} |  35 +-
 .../attrinfo/ObjAttributeInfoDialogController.java |   2 +-
 .../OverrideEmbeddableAttributeTableModel.java     |   2 +-
 .../CallbackDescriptorTableModel.java              |   4 +-
 .../objentity/{ => callbacks}/CallbackType.java    |   2 +-
 .../{ => callbacks}/ObjCallbackMethod.java         |   2 +-
 .../ObjEntityCallbacksView.java}                   |  26 +-
 .../duplicates/DuplicatedAttributesDialog.java     |   2 +-
 .../ObjEntityMainView.java}                        | 134 ++--
 .../{ => properties}/ObjAttributePanel.java        |  44 +-
 .../{ => properties}/ObjAttributeTableModel.java   |   4 +-
 .../ObjEntityPropertiesView.java}                  |  44 +-
 .../{ => properties}/ObjRelationshipPanel.java     |  40 +-
 .../ObjRelationshipTableModel.java                 |   4 +-
 .../relinfo/ObjRelationshipInfoController.java     |   2 +-
 .../editor/procedure/ProcedureParameterTab.java    |  36 +-
 .../procedure/ProcedureParameterTableModel.java    |   2 +-
 .../editor/procedure/ProcedureQueryView.java       |  28 +-
 .../ui/project/editor/procedure/ProcedureTab.java  |  54 +-
 .../editor/procedure/ProcedureTabbedView.java      |   2 +-
 .../ui/project/editor/query/BaseQueryMainTab.java  |   6 +-
 .../editor/query/ObjectQueryPropertiesPanel.java   |  12 +-
 .../editor/query/RawQueryPropertiesPanel.java      |  14 +-
 .../project/editor/query/RootSelectionHandler.java |   2 +-
 .../editor/query/SelectPropertiesPanel.java        |  41 +-
 .../editor/query/ejbql/EjbqlQueryMainTab.java      |  27 +-
 .../query/ejbql/EjbqlQueryPropertiesPanel.java     |   8 +-
 .../ui/project/editor/query/ejbql/EjbqlSyntax.java |   2 +-
 .../query/selectquery/SelectQueryMainTab.java      |  92 +--
 .../query/selectquery/SelectQueryOrderingTab.java  |   2 +-
 .../query/selectquery/SelectQueryPrefetchTab.java  |   2 +-
 .../editor/query/sqltemplate/SQLSyntax.java        |   2 +-
 .../query/sqltemplate/SQLTemplateMainTab.java      |  27 +-
 .../query/sqltemplate/SQLTemplatePrefetchTab.java  |   2 +-
 .../ui/project/tree/ProjectTreeController.java     |  58 +-
 .../ui/project/tree/ProjectTreeFactory.java        |  10 +-
 .../modeler/ui/project/tree/TreeDropTarget.java    |   2 +-
 .../ProjectValidatorDialogController.java          |  14 +-
 .../validator/ProjectValidatorDialogView.java      |  12 +-
 .../cayenne/modeler/ui/welcome/WelcomeScreen.java  |   4 +-
 .../undo/BaseRemovePropertyUndoableEdit.java       |   6 +-
 .../undo/CayenneTableModelUndoableEdit.java        |   2 +-
 .../cayenne/modeler/undo/CayenneUndoManager.java   |   6 +-
 .../cayenne/modeler/undo/CayenneUndoableEdit.java  |   6 +-
 .../modeler/undo/CreateAttributeUndoableEdit.java  |   8 +-
 .../undo/CreateCallbackMethodUndoableEdit.java     |  10 +-
 .../modeler/undo/CreateDataMapUndoableEdit.java    |   6 +-
 .../modeler/undo/CreateDbEntityUndoableEdit.java   |   8 +-
 .../undo/CreateEmbAttributeUndoableEdit.java       |   8 +-
 .../modeler/undo/CreateEmbeddableUndoableEdit.java |   8 +-
 .../modeler/undo/CreateNodeUndoableEdit.java       |   6 +-
 .../modeler/undo/CreateObjEntityUndoableEdit.java  |   8 +-
 .../undo/CreateProcedureParameterUndoableEdit.java |   8 +-
 .../modeler/undo/CreateProcedureUndoableEdit.java  |   8 +-
 .../modeler/undo/CreateQueryUndoableEdit.java      |   8 +-
 .../undo/CreateRelationshipUndoableEdit.java       |   8 +-
 .../modeler/undo/JTextFieldUndoListener.java       |  11 +-
 .../modeler/undo/JUndoableCheckBoxEdit.java        |   2 +-
 .../modeler/undo/LinkDataMapUndoableEdit.java      |   4 +-
 .../cayenne/modeler/undo/PasteUndoableEdit.java    |  26 +-
 .../modeler/undo/RemoveAttributeUndoableEdit.java  |   8 +-
 .../undo/RemoveCallbackMethodUndoableEdit.java     |  12 +-
 .../undo/RemoveRelationshipUndoableEdit.java       |   8 +-
 .../cayenne/modeler/undo/RemoveUndoableEdit.java   |  32 +-
 .../cayenne/modeler/undo/TextCompoundEdit.java     |  15 +-
 .../undo/UpdateValidationConfigUndoableEdit.java   |   6 +-
 .../cayenne/modeler/util/CayenneUserDir.java       | 109 ----
 .../apache/cayenne/modeler/util/Comparators.java   |  31 +-
 .../util/DbAttributePathComboBoxEditor.java        |   2 +-
 .../util/DbRelationshipPathComboBoxEditor.java     |   2 +-
 .../cayenne/modeler/util/EntityTreeModel.java      |   4 +-
 .../apache/cayenne/modeler/util/ModelerUtil.java   |  10 +-
 .../modeler/util/NameGeneratorPreferences.java     |   2 +-
 .../util/PathChooserComboBoxCellEditor.java        |   1 +
 .../cayenne/modeler/util/RecentFileMenu.java       |  87 ---
 .../cayenne/modeler/util/TableHeaderListener.java  | 126 ----
 .../apache/cayenne/modeler/util/TextAdapter.java   | 154 -----
 .../util/state/AttributeDisplayEventType.java      | 106 ----
 .../util/state/DataMapDisplayEventType.java        |  68 --
 .../util/state/DataNodeDisplayEventType.java       |  55 --
 .../modeler/util/state/DisplayEventType.java       |  80 ---
 .../modeler/util/state/DisplayEventTypes.java      | 198 ------
 .../modeler/util/state/DomainDisplayEventType.java |  49 --
 .../state/EmbeddableAttributeDisplayEventType.java |  98 ---
 .../util/state/EmbeddableDisplayEventType.java     |  62 --
 .../modeler/util/state/EntityDisplayEventType.java |  98 ---
 .../state/MultipleObjectsDisplayEventType.java     | 166 -----
 .../util/state/ProcedureDisplayEventType.java      |  63 --
 .../state/ProcedureParameterDisplayEventType.java  |  93 ---
 .../modeler/util/state/QueryDisplayEventType.java  |  62 --
 .../util/state/RelationshipDisplayEventType.java   | 106 ----
 .../modeler/CayenneModelerValidationIT.java        |   2 +-
 .../{ => ui}/action/CreateNodeActionTest.java      |   2 +-
 310 files changed, 3252 insertions(+), 4816 deletions(-)
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ClassLoadingService.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ActionManager.java
 create mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectSelectionMemo.java
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/DefaultActionManager.java => service/action/GlobalActions.java} (85%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{FileClassLoadingService.java => service/classloader/ModelerClassLoader.java} (50%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{graph/extension => service/graph}/EntityHandler.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{graph/extension => service/graph}/GraphExtension.java (84%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{graph/extension => service/graph}/GraphHandler.java (85%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{graph/extension => service/graph}/GraphLoaderDelegate.java (82%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{graph/extension => service/graph}/GraphSaverDelegate.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{graph/extension => service/graph}/GraphsRootHandler.java (86%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => service}/platform/DefaultPlatformInitializer.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => service}/platform/PlatformInitializer.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{validation => service/validator}/ConfigurableProjectValidator.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{validation => service/validator}/extension/ValidationConfigHandler.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{validation => service/validator}/extension/ValidationExtension.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{validation => service/validator}/extension/ValidationLoaderDelegate.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{validation => service/validator}/extension/ValidationSaverDelegate.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{util/BrowserControl.java => swing/UrlOpener.java} (83%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/{JCayenneCheckBox.java => checkbox/CayenneCheckBox.java} (81%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/{ => copypaste}/CayenneTransferable.java (80%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{util => swing/table}/CayenneTableModel.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{util => swing/table}/TableSizer.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/{TextPaneViewFactory.java => CayenneTextCommitListener.java} (69%)
 create mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/TextPaneView.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/ValidatorTextAdapter.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/style/TextPaneStyleMap.java
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/{syntax => style}/TextSyntax.java (96%)
 create mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/AboutAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/BaseViewEntityAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CollapseTreeAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ConfigurePreferencesAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CopyAction.java (95%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CopyAttributeAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CopyAttributeRelationshipAction.java (90%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CopyCallbackMethodAction.java (94%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CopyProcedureParameterAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CopyRelationshipAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateAttributeAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateCallbackMethodAction.java (95%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateDataMapAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateDbEntityAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateEmbeddableAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateNodeAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateObjEntityAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateObjEntityFromDbAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateProcedureAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateProcedureParameterAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateQueryAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CreateRelationshipAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CutAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CutAttributeAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CutAttributeRelationshipAction.java (92%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CutCallbackMethodAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CutProcedureParameterAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/CutRelationshipAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/DBConnectionAwareAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/DbEntityCounterpartAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/DbEntitySyncAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/DisableValidationInspectionAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/DocumentationAction.java (94%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ExitAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/FilterAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/FindAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/GenerateCodeAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/GenerateDBAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ImportDataMapAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ImportEOModelAction.java (79%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/InferRelationshipsAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/LinkDataMapAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/LinkDataMapsAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/MigrateAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ModelerAbstractAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/MultipleObjectsAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/NavigateAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/NavigateBackwardAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/NavigateForwardAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/NewProjectAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ObjEntityCounterpartAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ObjEntitySyncAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ObjEntityToSuperEntityAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/OpenProjectAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/PasteAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ProjectAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ProjectOpener.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RedoAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RemoveAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RemoveAttributeAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RemoveAttributeRelationshipAction.java (92%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RemoveCallbackMethodAction.java (94%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RemoveProcedureParameterAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RemoveRelationshipAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ReverseEngineeringAction.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/RevertAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/SaveAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/SaveAsAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ShowLogConsoleAction.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ShowValidationConfigAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ShowValidationOptionAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/UndoAction.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/UpdateValidationConfigAction.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui}/action/ValidateAction.java (93%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{util/AdapterMapping.java => ui/preferences/datasource/creator/Adapters.java} (56%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{util => ui/project/editor}/ExpressionConvertor.java (70%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddCatalogAction.java (88%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddExcludeColumnAction.java (81%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddExcludeProcedureAction.java (81%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddExcludeTableAction.java (81%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddIncludeColumnAction.java (81%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddIncludeProcedureAction.java (81%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddIncludeTableAction.java (89%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddPatternParamAction.java (89%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/AddSchemaAction.java (90%)
 create mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/DeleteNodeAction.java (90%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/DragAndDropNodeAction.java (95%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/EditNodeAction.java (91%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui/project/editor/datamap/dbimport}/action/GetDbConnectionAction.java (93%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui/project/editor/datamap/dbimport}/action/LoadDbSchemaAction.java (81%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/MoveImportNodeAction.java (91%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/MoveInvertNodeAction.java (70%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{ => ui/project/editor/datamap/dbimport}/action/SortNodesAction.java (88%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/{action/dbimport => ui/project/editor/datamap/dbimport/action}/TreeManipulationAction.java (83%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{DbEntityTabbedView.java => DbEntityView.java} (80%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{DbEntityTab.java => main/DbEntityMainView.java} (75%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => main}/PKCustomSequenceGeneratorPanel.java (85%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => main}/PKDBGeneratorPanel.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => main}/PKDefaultGeneratorPanel.java (95%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => main}/PKGeneratorPanel.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => properties}/DbAttributePanel.java (88%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => properties}/DbAttributeTableModel.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{DbEntityAttributeRelationshipTab.java => properties/DbEntityPropertiesView.java} (76%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => properties}/DbRelationshipPanel.java (90%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/{ => properties}/DbRelationshipTableModel.java (98%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ObjEntityTabbedView.java => ObjEntityView.java} (78%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ => callbacks}/CallbackDescriptorTableModel.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ => callbacks}/CallbackType.java (97%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ => callbacks}/ObjCallbackMethod.java (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ObjEntityCallbackMethodsTab.java => callbacks/ObjEntityCallbacksView.java} (96%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ObjEntityTab.java => main/ObjEntityMainView.java} (82%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ => properties}/ObjAttributePanel.java (92%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ => properties}/ObjAttributeTableModel.java (99%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ObjEntityAttributeRelationshipTab.java => properties/ObjEntityPropertiesView.java} (78%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ => properties}/ObjRelationshipPanel.java (92%)
 rename modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/{ => properties}/ObjRelationshipTableModel.java (98%)
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneUserDir.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/RecentFileMenu.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableHeaderListener.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataMapDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataNodeDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventTypes.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DomainDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableAttributeDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/MultipleObjectsDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureParameterDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/QueryDisplayEventType.java
 delete mode 100644 modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java
 rename modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/{ => ui}/action/CreateNodeActionTest.java (97%)


(cayenne) 04/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 1ad1d904dc812aacf4a60d566585d0f807d4b029
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
    
    TextAdapter should be replaced with Cayenne*TextField
---
 .../editor/datamap/cgen/CgenConfigPanel.java       |  40 ++++----
 .../editor/datamap/dbimport/DbImportView.java      |   8 +-
 .../dbimport/ReverseEngineeringConfigPanel.java    | 111 ++++++++++-----------
 .../editor/datamap/main/DataMapMainView.java       |  61 ++++-------
 .../ui/project/editor/dbentity/DbEntityTab.java    |  39 +++-----
 .../dbentity/PKCustomSequenceGeneratorPanel.java   |  13 +--
 .../editor/embeddable/main/EmbeddableMainView.java |  13 +--
 .../ui/project/editor/objentity/ObjEntityTab.java  |  41 +++-----
 .../editor/procedure/ProcedureQueryView.java       |  13 +--
 .../ui/project/editor/procedure/ProcedureTab.java  |  37 +++----
 .../editor/query/ObjectQueryPropertiesPanel.java   |   2 +-
 .../editor/query/RawQueryPropertiesPanel.java      |   2 +-
 .../editor/query/SelectPropertiesPanel.java        |  12 +--
 .../editor/query/ejbql/EjbqlQueryMainTab.java      |  13 +--
 .../query/ejbql/EjbqlQueryPropertiesPanel.java     |   2 +-
 .../query/selectquery/SelectQueryMainTab.java      |  13 +--
 .../query/sqltemplate/SQLTemplateMainTab.java      |  13 +--
 17 files changed, 176 insertions(+), 257 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
index 8f476c0d9..15210ae97 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
@@ -24,6 +24,7 @@ import com.jgoodies.forms.layout.CellConstraints;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.TemplateType;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.validation.ValidationException;
@@ -53,8 +54,8 @@ public class CgenConfigPanel extends JPanel {
     private final JCheckBox usePackagePath;
     private final JCheckBox createPropertyNames;
     private final JCheckBox pkProperties;
-    private TextAdapter superPkg;
-    protected TextAdapter outputPattern;
+    private CayenneUndoableTextField superPkg;
+    protected CayenneUndoableTextField outputPattern;
     private JButton editSuperclassTemplateBtn;
     private JButton editSubclassTemplateBtn;
     private JButton editEmbeddableTemplateBtn;
@@ -135,10 +136,10 @@ public class CgenConfigPanel extends JPanel {
         builder.addLabel("Create PK properties", cc.xyw(3, 17, 3));
 
         builder.addLabel("Output Pattern", cc.xyw(1, 19, 5));
-        builder.add(outputPattern.getComponent(), cc.xyw(1, 21, 5));
+        builder.add(outputPattern, cc.xyw(1, 21, 5));
 
         builder.addLabel("Superclass package", cc.xyw(1, 23, 5));
-        builder.add(superPkg.getComponent(), cc.xyw(1, 25, 5));
+        builder.add(superPkg, cc.xyw(1, 25, 5));
 
 
         //Templates options panel
@@ -167,22 +168,17 @@ public class CgenConfigPanel extends JPanel {
     }
 
     private void initTextFields() {
-        JTextField superPkgField = new JTextField();
-        this.superPkg = new TextAdapter(superPkgField) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-                getCgenConfig().setSuperPkg(text);
-                checkConfigDirty();
-            }
-        };
-
-        JTextField outputPatternField = new JTextField();
-        this.outputPattern = new TextAdapter(outputPatternField) {
-            protected void updateModel(String text) {
-                getCgenConfig().setOutputPattern(text);
-                checkConfigDirty();
-            }
-        };
+        this.superPkg = new CayenneUndoableTextField();
+        this.superPkg.addCommitListener(text -> {
+            getCgenConfig().setSuperPkg(text);
+            checkConfigDirty();
+        });
+
+        this.outputPattern = new CayenneUndoableTextField();
+        this.outputPattern.addCommitListener(text -> {
+            getCgenConfig().setOutputPattern(text);
+            checkConfigDirty();
+        });
 
         this.outputFolder = new TextAdapter(new JTextField()) {
             @Override
@@ -246,11 +242,11 @@ public class CgenConfigPanel extends JPanel {
         return pkProperties;
     }
 
-    public TextAdapter getOutputPattern() {
+    public CayenneUndoableTextField getOutputPattern() {
         return outputPattern;
     }
 
-    public TextAdapter getSuperPkg() {
+    public CayenneUndoableTextField getSuperPkg() {
         return superPkg;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
index 72edcbd94..6e3630f84 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
@@ -210,7 +210,7 @@ public class DbImportView extends JPanel {
                 configPanel.getTableTypes().setText(String.join(",", tableTypes));
             } else {
                 configPanel.getTableTypes().setText("TABLE, VIEW");
-                configPanel.getTableTypes().updateModel();
+                configPanel.applyTableTypes("TABLE, VIEW");
             }
             treePanel.updateTree();
             DbImportTreeNode root = draggableTreePanel.getSourceTree().getRootNode();
@@ -243,8 +243,8 @@ public class DbImportView extends JPanel {
     }
 
     public String getMeaningfulPk() {
-        return "".equals(configPanel.getMeaningfulPk().getComponent().getText())
-                ? null : configPanel.getMeaningfulPk().getComponent().getText();
+        return "".equals(configPanel.getMeaningfulPk().getText())
+                ? null : configPanel.getMeaningfulPk().getText();
     }
 
     public String getNamingStrategy() {
@@ -252,7 +252,7 @@ public class DbImportView extends JPanel {
     }
 
     public String getStripFromTableNames() {
-        return configPanel.getStripFromTableNames().getComponent().getText();
+        return configPanel.getStripFromTableNames().getText();
     }
 
     public JProgressBar getLoadDbSchemaProgress() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
index 6d576c766..eb4a3b834 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
@@ -24,7 +24,6 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
-import javax.swing.JTextField;
 import java.util.Vector;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
@@ -32,27 +31,26 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
-import org.apache.cayenne.validation.ValidationException;
 
 public class ReverseEngineeringConfigPanel extends JPanel {
 
     private static final String DATA_FIELDS_LAYOUT = "right:pref, 3dlu, fill:235dlu";
 
     private JComboBox<String> strategyCombo;
-    private TextAdapter meaningfulPk;
-    private TextAdapter stripFromTableNames;
+    private CayenneUndoableTextField meaningfulPk;
+    private CayenneUndoableTextField stripFromTableNames;
     private JCheckBox skipRelationshipsLoading;
     private JCheckBox skipPrimaryKeyLoading;
     private JCheckBox forceDataMapCatalog;
     private JCheckBox forceDataMapSchema;
     private JCheckBox useJava7Types;
 
-    private TextAdapter tableTypes;
+    private CayenneUndoableTextField tableTypes;
 
     private ProjectController projectController;
 
@@ -71,15 +69,15 @@ public class ReverseEngineeringConfigPanel extends JPanel {
         DefaultFormBuilder panelBuilder = new DefaultFormBuilder(panelLayout);
         panelBuilder.setDefaultDialogBorder();
 
-        panelBuilder.append("Tables with Meaningful PK Pattern:", meaningfulPk.getComponent());
-        panelBuilder.append("Strip from table names:", stripFromTableNames.getComponent());
+        panelBuilder.append("Tables with Meaningful PK Pattern:", meaningfulPk);
+        panelBuilder.append("Strip from table names:", stripFromTableNames);
         panelBuilder.append("Skip relationships loading:", skipRelationshipsLoading);
         panelBuilder.append("Skip primary key loading:", skipPrimaryKeyLoading);
         panelBuilder.append("Force datamap catalog:", forceDataMapCatalog);
         panelBuilder.append("Force datamap schema:", forceDataMapSchema);
         panelBuilder.append("Use java.util.Date type:", useJava7Types);
         panelBuilder.append("Naming strategy:", strategyCombo);
-        panelBuilder.append("Table types:", tableTypes.getComponent());
+        panelBuilder.append("Table types:", tableTypes);
 
         add(panelBuilder.getPanel());
     }
@@ -115,59 +113,30 @@ public class ReverseEngineeringConfigPanel extends JPanel {
         AutoCompletion.enable(strategyCombo, false, true);
         strategyCombo.setToolTipText("Naming strategy to use");
 
-        JTextField meaningfulPkField = new JTextField();
-        meaningfulPkField.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
+        meaningfulPk = new CayenneUndoableTextField();
+        meaningfulPk.setToolTipText("<html>Regular expression to filter tables with meaningful primary keys.<br>" +
                 "Multiple expressions divided by comma can be used.<br>" +
                 "Example: <b>^table1|^table2|^prefix.*|table_name</b></html>");
-        meaningfulPk = new TextAdapter(meaningfulPkField) {
-            protected void updateModel(String text) {
-                getReverseEngineeringBySelectedMap().setMeaningfulPkTables(text);
-                if(!dbImportView.isInitFromModel()) {
-                    projectController.setDirty(true);
-                }
+        meaningfulPk.addCommitListener(text -> {
+            getReverseEngineeringBySelectedMap().setMeaningfulPkTables(text);
+            if (!dbImportView.isInitFromModel()) {
+                projectController.setDirty(true);
             }
-        };
+        });
 
-        JTextField stripFromTableNamesField = new JTextField();
-        stripFromTableNamesField.setToolTipText("<html>Regex that matches the part of the table name that needs to be stripped off " +
+        stripFromTableNames = new CayenneUndoableTextField();
+        stripFromTableNames.setToolTipText("<html>Regex that matches the part of the table name that needs to be stripped off " +
                 "when generating ObjEntity name</html>");
-        stripFromTableNames = new TextAdapter(stripFromTableNamesField) {
-            protected void updateModel(String text) {
-                getReverseEngineeringBySelectedMap().setStripFromTableNames(text);
-                if(!dbImportView.isInitFromModel()) {
-                    projectController.setDirty(true);
-                }
-            }
-        };
-
-        JTextField tableTypesField = new JTextField();
-        tableTypesField.setToolTipText("<html>Default types to import is TABLE and VIEW.");
-        tableTypes = new TextAdapter(tableTypesField) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-                ReverseEngineering reverseEngineering = getReverseEngineeringBySelectedMap();
-                if(text == null || text.isEmpty()) {
-                    String[] tableTypesFromReverseEngineering = reverseEngineering.getTableTypes();
-                    tableTypes.setText(String.join(",", tableTypesFromReverseEngineering));
-                    JOptionPane.showMessageDialog(
-                            Application.getInstance().getFrameController().getView(),
-                            "Table types field can't be empty.",
-                            "Error setting table types",
-                            JOptionPane.ERROR_MESSAGE);
-                } else {
-                    reverseEngineering.getTableTypesCollection().clear();
-                    String[] types = text.split("\\s*,\\s*");
-                    for(String type : types) {
-                        if(!type.isEmpty()) {
-                            reverseEngineering.addTableType(type.trim());
-                        }
-                    }
-                    if(!dbImportView.isInitFromModel()) {
-                        projectController.setDirty(true);
-                    }
-                }
+        stripFromTableNames.addCommitListener(text -> {
+            getReverseEngineeringBySelectedMap().setStripFromTableNames(text);
+            if (!dbImportView.isInitFromModel()) {
+                projectController.setDirty(true);
             }
-        };
+        });
+
+        tableTypes = new CayenneUndoableTextField();
+        tableTypes.setToolTipText("<html>Default types to import is TABLE and VIEW.");
+        tableTypes.addCommitListener(this::applyTableTypes);
 
         skipRelationshipsLoading = new JCheckBox();
         skipRelationshipsLoading.setToolTipText("<html>Whether to load relationships.</html>");
@@ -240,15 +209,39 @@ public class ReverseEngineeringConfigPanel extends JPanel {
         }
     }
 
+    void applyTableTypes(String text) {
+        ReverseEngineering reverseEngineering = getReverseEngineeringBySelectedMap();
+        if (text == null || text.isEmpty()) {
+            String[] tableTypesFromReverseEngineering = reverseEngineering.getTableTypes();
+            tableTypes.setText(String.join(",", tableTypesFromReverseEngineering));
+            JOptionPane.showMessageDialog(
+                    Application.getInstance().getFrameController().getView(),
+                    "Table types field can't be empty.",
+                    "Error setting table types",
+                    JOptionPane.ERROR_MESSAGE);
+        } else {
+            reverseEngineering.getTableTypesCollection().clear();
+            String[] types = text.split("\\s*,\\s*");
+            for (String type : types) {
+                if (!type.isEmpty()) {
+                    reverseEngineering.addTableType(type.trim());
+                }
+            }
+            if (!dbImportView.isInitFromModel()) {
+                projectController.setDirty(true);
+            }
+        }
+    }
+
     JComboBox<String> getStrategyCombo() {
         return strategyCombo;
     }
 
-    TextAdapter getMeaningfulPk() {
+    CayenneUndoableTextField getMeaningfulPk() {
         return meaningfulPk;
     }
 
-    TextAdapter getStripFromTableNames() {
+    CayenneUndoableTextField getStripFromTableNames() {
         return stripFromTableNames;
     }
 
@@ -272,7 +265,7 @@ public class ReverseEngineeringConfigPanel extends JPanel {
         return useJava7Types;
     }
 
-    TextAdapter getTableTypes() {
+    CayenneUndoableTextField getTableTypes() {
         return tableTypes;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
index 06d8739dd..536184d3e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
@@ -37,6 +37,7 @@ import org.apache.cayenne.modeler.ui.project.editor.datamap.main.superclass.Supe
 import org.apache.cayenne.modeler.event.model.ProjectSavedEvent;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.swing.CellRenderers;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
@@ -68,13 +69,13 @@ public class DataMapMainView extends JPanel {
     private final JLabel location;
     private final JComboBox<DataNodeDescriptor> nodeSelector;
     private final JCheckBox defaultLockType;
-    private final TextAdapter defaultCatalog;
-    private final TextAdapter defaultSchema;
-    private final TextAdapter defaultPackage;
-    private final TextAdapter defaultSuperclass;
+    private final CayenneUndoableTextField defaultCatalog;
+    private final CayenneUndoableTextField defaultSchema;
+    private final CayenneUndoableTextField defaultPackage;
+    private final CayenneUndoableTextField defaultSuperclass;
     private final JCheckBox quoteSQLIdentifiers;
 
-    private final TextAdapter comment;
+    private final CayenneUndoableTextField comment;
 
     public DataMapMainView(ProjectController controller) {
         this.controller = controller;
@@ -92,45 +93,25 @@ public class DataMapMainView extends JPanel {
         nodeSelector.setRenderer(CellRenderers.listRendererWithIcons());
 
         JButton updateDefaultCatalog = new JButton("Update...");
-        defaultCatalog = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDefaultCatalog(text);
-            }
-        };
+        defaultCatalog = new CayenneUndoableTextField();
+        defaultCatalog.addCommitListener(this::setDefaultCatalog);
 
         JButton updateDefaultSchema = new JButton("Update...");
-        defaultSchema = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDefaultSchema(text);
-            }
-        };
+        defaultSchema = new CayenneUndoableTextField();
+        defaultSchema.addCommitListener(this::setDefaultSchema);
 
         quoteSQLIdentifiers = new JCayenneCheckBox();
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-                updateComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::updateComment);
 
         JButton updateDefaultPackage = new JButton("Update...");
-        defaultPackage = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDefaultPackage(text);
-            }
-        };
+        defaultPackage = new CayenneUndoableTextField();
+        defaultPackage.addCommitListener(this::setDefaultPackage);
 
         JButton updateDefaultSuperclass = new JButton("Update...");
-        defaultSuperclass = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDefaultSuperclass(text);
-            }
-        };
+        defaultSuperclass = new CayenneUndoableTextField();
+        defaultSuperclass.addCommitListener(this::setDefaultSuperclass);
 
         JButton updateDefaultLockType = new JButton("Update...");
         defaultLockType = new JCayenneCheckBox();
@@ -147,18 +128,18 @@ public class DataMapMainView extends JPanel {
         builder.append("File:", location, 3);
         builder.append("DataNode:", nodeSelector, 2);
         builder.append("Quote SQL Identifiers:", quoteSQLIdentifiers, 3);
-        builder.append("Comment:", comment.getComponent(), 2);
+        builder.append("Comment:", comment, 2);
 
         builder.appendSeparator("Entity Defaults");
-        builder.append("DB Catalog:", defaultCatalog.getComponent(), updateDefaultCatalog);
-        builder.append("DB Schema:", defaultSchema.getComponent(), updateDefaultSchema);
+        builder.append("DB Catalog:", defaultCatalog, updateDefaultCatalog);
+        builder.append("DB Schema:", defaultSchema, updateDefaultSchema);
         builder.append(
                 "Java Package:",
-                defaultPackage.getComponent(),
+                defaultPackage,
                 updateDefaultPackage);
         builder.append(
                 "Custom Superclass:",
-                defaultSuperclass.getComponent(),
+                defaultSuperclass,
                 updateDefaultSuperclass);
         builder.append("Optimistic Locking:", defaultLockType, updateDefaultLockType);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTab.java
index ae2503a49..b1f331289 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTab.java
@@ -37,6 +37,7 @@ import org.apache.cayenne.modeler.action.DbEntitySyncAction;
 import org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
 import org.apache.cayenne.modeler.util.ExpressionConvertor;
 import org.apache.cayenne.modeler.util.TextAdapter;
@@ -59,10 +60,10 @@ public class DbEntityTab extends JPanel implements ExistingSelectionProcessor, D
     private final ProjectController controller;
 
     private final TextAdapter name;
-    private final TextAdapter catalog;
-    private final TextAdapter schema;
+    private final CayenneUndoableTextField catalog;
+    private final CayenneUndoableTextField schema;
     private final TextAdapter qualifier;
-    private final TextAdapter comment;
+    private final CayenneUndoableTextField comment;
 
     private final JLabel catalogLabel;
     private final JLabel schemaLabel;
@@ -101,18 +102,12 @@ public class DbEntityTab extends JPanel implements ExistingSelectionProcessor, D
         };
 
         catalogLabel = new JLabel("Catalog:");
-        catalog = new TextAdapter(new JTextField()) {
-            protected void updateModel(String text) throws ValidationException {
-                setCatalog(text);
-            }
-        };
+        catalog = new CayenneUndoableTextField();
+        catalog.addCommitListener(this::setCatalog);
 
         schemaLabel = new JLabel("Schema:");
-        schema = new TextAdapter(new JTextField()) {
-            protected void updateModel(String text) throws ValidationException {
-                setSchema(text);
-            }
-        };
+        schema = new CayenneUndoableTextField();
+        schema.addCommitListener(this::setSchema);
 
         qualifier = new TextAdapter(new JTextField()) {
             protected void updateModel(String qualifier) {
@@ -120,12 +115,8 @@ public class DbEntityTab extends JPanel implements ExistingSelectionProcessor, D
             }
         };
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-                setComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::setComment);
 
         pkGeneratorType = new JComboBox<>();
         pkGeneratorType.setEditable(false);
@@ -144,10 +135,10 @@ public class DbEntityTab extends JPanel implements ExistingSelectionProcessor, D
 
         builder.appendSeparator("DbEntity Configuration");
         builder.append("DbEntity Name:", name.getComponent());
-        builder.append(catalogLabel, catalog.getComponent());
-        builder.append(schemaLabel, schema.getComponent());
+        builder.append(catalogLabel, catalog);
+        builder.append(schemaLabel, schema);
         builder.append("Qualifier:", qualifier.getComponent());
-        builder.append("Comment:", comment.getComponent());
+        builder.append("Comment:", comment);
 
         builder.appendSeparator("Primary Key");
         builder.append("PK Generation Strategy:", pkGeneratorType);
@@ -217,10 +208,10 @@ public class DbEntityTab extends JPanel implements ExistingSelectionProcessor, D
         }
 
         catalogLabel.setEnabled(true);
-        catalog.getComponent().setEnabled(true);
+        catalog.setEnabled(true);
 
         schemaLabel.setEnabled(true);
-        schema.getComponent().setEnabled(true);
+        schema.setEnabled(true);
         pkGeneratorDetail.setVisible(true);
         pkGeneratorType.setVisible(true);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKCustomSequenceGeneratorPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKCustomSequenceGeneratorPanel.java
index 8a542bb0a..ece2e2d65 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKCustomSequenceGeneratorPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKCustomSequenceGeneratorPanel.java
@@ -28,6 +28,7 @@ import javax.swing.JTextField;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbKeyGenerator;
 import org.apache.cayenne.map.event.EntityEvent;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.util.Util;
@@ -38,7 +39,7 @@ import com.jgoodies.forms.layout.FormLayout;
 
 public class PKCustomSequenceGeneratorPanel extends PKGeneratorPanel {
 
-    protected TextAdapter customPKName;
+    protected CayenneUndoableTextField customPKName;
     protected TextAdapter customPKSize;
 
     public PKCustomSequenceGeneratorPanel(ProjectController mediator) {
@@ -52,12 +53,8 @@ public class PKCustomSequenceGeneratorPanel extends PKGeneratorPanel {
                 "* Custom sequences are supported on Oracle and Postgres");
         note.setFont(note.getFont().deriveFont(Font.ITALIC).deriveFont(11f));
 
-        customPKName = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) throws ValidationException {
-                setPKName(text);
-            }
-        };
+        customPKName = new CayenneUndoableTextField();
+        customPKName.addCommitListener(this::setPKName);
         customPKSize = new TextAdapter(new JTextField()) {
 
             protected void updateModel(String text) throws ValidationException {
@@ -73,7 +70,7 @@ public class PKCustomSequenceGeneratorPanel extends PKGeneratorPanel {
 
         builder.setDefaultDialogBorder();
 
-        builder.append("Sequence Name:", customPKName.getComponent(), 3);
+        builder.append("Sequence Name:", customPKName, 3);
         builder.append("Cached PK Size:", customPKSize.getComponent());
         builder.nextLine();
         builder.append("", note, 3);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
index 7de8ede29..122f2d1e6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
@@ -33,6 +33,7 @@ import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayListener;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
@@ -48,7 +49,7 @@ public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListe
 
     protected ProjectController mediator;
     protected TextAdapter className;
-    protected TextAdapter comment;
+    protected CayenneUndoableTextField comment;
 
     public EmbeddableMainView(ProjectController mediator) {
         this.mediator = mediator;
@@ -78,12 +79,8 @@ public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListe
             }
         };
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::setComment);
 
         FormLayout layout = new FormLayout(
                 "right:50dlu, 3dlu, fill:150dlu, 3dlu, fill:100",
@@ -91,7 +88,7 @@ public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListe
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
         builder.append("Class Name:", className.getComponent(), 3);
-        builder.append("Comment:", comment.getComponent(), 3);
+        builder.append("Comment:", comment, 3);
 
         add(builder.getPanel(), BorderLayout.CENTER);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTab.java
index 190f205fc..3e4aa79a7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTab.java
@@ -43,6 +43,7 @@ import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayListener;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
 import org.apache.cayenne.modeler.swing.CellRenderers;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.ExpressionConvertor;
 import org.apache.cayenne.modeler.util.TextAdapter;
@@ -67,10 +68,10 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
 
     private final ProjectController controller;
     private final TextAdapter name;
-    private final TextAdapter className;
+    private final CayenneUndoableTextField className;
 
     private final JLabel superclassLabel;
-    private final TextAdapter superClassName;
+    private final CayenneUndoableTextField superClassName;
     private final TextAdapter qualifier;
     private final JComboBox<DbEntity> dbEntityCombo;
     private final JComboBox<ObjEntity> superEntityCombo;
@@ -78,7 +79,7 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
     private final JCheckBox optimisticLocking;
 
     private final JCheckBox isAbstract;
-    private final TextAdapter comment;
+    private final CayenneUndoableTextField comment;
 
     public ObjEntityTab(ProjectController controller) {
         this.controller = controller;
@@ -107,18 +108,10 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
                 setEntityName(text);
             }
         };
-        superClassName = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setSuperClassName(text);
-            }
-        };
-        className = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setClassName(text);
-            }
-        };
+        superClassName = new CayenneUndoableTextField();
+        superClassName.addCommitListener(this::setSuperClassName);
+        className = new CayenneUndoableTextField();
+        className.addCommitListener(this::setClassName);
         qualifier = new TextAdapter(new JTextField()) {
             @Override
             protected void updateModel(String text) {
@@ -147,12 +140,8 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
 
         isAbstract = new JCayenneCheckBox();
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-                setComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::setComment);
 
         // assemble
         FormLayout layout = new FormLayout("right:pref, 3dlu, fill:200dlu", "");
@@ -163,12 +152,12 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
         builder.append("ObjEntity Name:", name.getComponent());
         builder.append("Inheritance:", superEntityCombo);
         builder.append(tableLabel, dbEntityCombo);
-        builder.append("Comment:", comment.getComponent());
+        builder.append("Comment:", comment);
         builder.appendSeparator();
 
-        builder.append("Java Class:", className.getComponent());
-     
-        superclassLabel = builder.append("Superclass:", superClassName.getComponent());
+        builder.append("Java Class:", className);
+
+        superclassLabel = builder.append("Superclass:", superClassName);
         builder.append("Qualifier:", qualifier.getComponent());
         builder.append("Read-Only:", readOnly);
         builder.append("Optimistic Locking:", optimisticLocking);
@@ -427,7 +416,7 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
     }
 
     void toggleEnabled(boolean directTableMapping) {
-        superClassName.getComponent().setEnabled(directTableMapping);
+        superClassName.setEnabled(directTableMapping);
         superclassLabel.setEnabled(directTableMapping);
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
index 7bcdabd56..2283049d3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
@@ -36,6 +36,7 @@ import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.swing.CellRenderers;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
@@ -73,7 +74,7 @@ public class ProcedureQueryView extends JPanel {
 
     protected ProjectController mediator;
     protected TextAdapter name;
-    protected TextAdapter comment;
+    protected CayenneUndoableTextField comment;
     protected JComboBox<Procedure> queryRoot;
     protected SelectPropertiesPanel properties;
 
@@ -93,12 +94,8 @@ public class ProcedureQueryView extends JPanel {
             }
         };
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQueryComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::setQueryComment);
 
         queryRoot = WidgetFactory.createUndoableComboBox();
         queryRoot.setRenderer(CellRenderers.listRendererWithIcons());
@@ -118,7 +115,7 @@ public class ProcedureQueryView extends JPanel {
         builder.addLabel("Procedure:", cc.xy(1, 5));
         builder.add(queryRoot, cc.xy(3, 5));
         builder.addLabel("Comment:", cc.xy(1, 7));
-        builder.add(comment.getComponent(), cc.xy(3, 7));
+        builder.add(comment, cc.xy(3, 7));
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.NORTH);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
index a9ed159f2..de602c2d7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
@@ -31,6 +31,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.modeler.event.model.ProcedureEvent;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
@@ -48,9 +49,9 @@ public class ProcedureTab extends JPanel implements ProcedureDisplayListener, Ex
 
     protected ProjectController eventController;
     protected TextAdapter name;
-    protected TextAdapter schema;
-    protected TextAdapter catalog;
-    protected TextAdapter comment;
+    protected CayenneUndoableTextField schema;
+    protected CayenneUndoableTextField catalog;
+    protected CayenneUndoableTextField comment;
     protected JCheckBox returnsValue;
     protected boolean ignoreChange;
 
@@ -71,26 +72,14 @@ public class ProcedureTab extends JPanel implements ProcedureDisplayListener, Ex
             }
         };
 
-        this.schema = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setSchema(text);
-            }
-        };
+        this.schema = new CayenneUndoableTextField();
+        this.schema.addCommitListener(this::setSchema);
 
-        this.catalog = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setCatalog(text);
-            }
-        };
+        this.catalog = new CayenneUndoableTextField();
+        this.catalog.addCommitListener(this::setCatalog);
 
-        this.comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setComment(text);
-            }
-        };
+        this.comment = new CayenneUndoableTextField();
+        this.comment.addCommitListener(this::setComment);
 
         this.returnsValue = new JCayenneCheckBox();
         this.returnsValue.setToolTipText("first parameter will be used as return value");
@@ -101,10 +90,10 @@ public class ProcedureTab extends JPanel implements ProcedureDisplayListener, Ex
 
         builder.appendSeparator("Stored Procedure Configuration");
         builder.append("Procedure Name:", name.getComponent());
-        builder.append("Catalog:", catalog.getComponent());
-        builder.append("Schema:", schema.getComponent());
+        builder.append("Catalog:", catalog);
+        builder.append("Schema:", schema);
         builder.append("Returns Value:", returnsValue);
-        builder.append("Comment:", comment.getComponent());
+        builder.append("Comment:", comment);
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.CENTER);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
index 725140550..fb6e2ff52 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
@@ -61,7 +61,7 @@ public class ObjectQueryPropertiesPanel extends SelectPropertiesPanel {
         builder.addLabel("Result Caching:", cc.xy(1, 3));
         builder.add(cacheStrategy, cc.xywh(3, 3, 2, 1));
         cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 7));
-        builder.add(cacheGroups.getComponent(), cc.xywh(3, 7, 2, 1));
+        builder.add(cacheGroups, cc.xywh(3, 7, 2, 1));
         builder.addLabel("Fetch Data Rows:", cc.xy(1, 9));
         builder.add(dataRows, cc.xy(3, 9));
         builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 11));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
index 890de59f8..40ce08531 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
@@ -78,7 +78,7 @@ public abstract class RawQueryPropertiesPanel extends SelectPropertiesPanel {
         builder.addLabel("Result Caching:", cc.xy(1, 3));
         builder.add(cacheStrategy, cc.xywh(3, 3, 5, 1));
         cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 7));
-        builder.add(cacheGroups.getComponent(), cc.xywh(3, 7, 5, 1));
+        builder.add(cacheGroups, cc.xywh(3, 7, 5, 1));
         builder.addLabel("Fetch Persistent Objects:", cc.xy(1, 9));
         builder.add(persistentObjects, cc.xy(3, 9));
         builder.add(entities, cc.xywh(5, 9, 3, 1));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
index 18c18c459..599b3b2b8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
@@ -35,6 +35,7 @@ import javax.swing.JTextField;
 import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.query.QueryCacheStrategy;
@@ -80,7 +81,7 @@ public abstract class SelectPropertiesPanel extends JPanel {
     protected TextAdapter fetchLimit;
     protected TextAdapter pageSize;
     protected JComboBox<QueryCacheStrategy> cacheStrategy;
-    protected TextAdapter cacheGroups;
+    protected CayenneUndoableTextField cacheGroups;
     protected JComponent cacheGroupsLabel;
 
     protected ProjectController mediator;
@@ -112,11 +113,8 @@ public abstract class SelectPropertiesPanel extends JPanel {
 
         cacheStrategy = WidgetFactory.createUndoableComboBox();
         cacheStrategy.setRenderer(new CacheStrategyRenderer());
-        cacheGroups = new TextAdapter(new JTextField()) {
-            protected void updateModel(String text) {
-                setCacheGroups(text);
-            }
-        };
+        cacheGroups = new CayenneUndoableTextField();
+        cacheGroups.addCommitListener(this::setCacheGroups);
     }
 
     protected void initController() {
@@ -216,7 +214,7 @@ public abstract class SelectPropertiesPanel extends JPanel {
     }
 
     protected void setCacheGroupsEnabled(boolean enabled) {
-        cacheGroups.getComponent().setEnabled(enabled);
+        cacheGroups.setEnabled(enabled);
         cacheGroupsLabel.setEnabled(enabled);
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
index eb4712cf1..f897a41f4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
@@ -26,6 +26,7 @@ import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.MappingNamespace;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.map.QueryDescriptor;
@@ -41,7 +42,7 @@ public class EjbqlQueryMainTab extends JPanel{
 
     protected ProjectController mediator;
     protected TextAdapter name;
-    protected TextAdapter comment;
+    protected CayenneUndoableTextField comment;
     protected EjbqlQueryPropertiesPanel properties;
     protected TextAdapter qualifier;
 
@@ -59,12 +60,8 @@ public class EjbqlQueryMainTab extends JPanel{
             }
         };
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQueryComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::setQueryComment);
 
         properties = new EjbqlQueryPropertiesPanel(mediator);
         // assemble
@@ -78,7 +75,7 @@ public class EjbqlQueryMainTab extends JPanel{
         builder.addLabel("Query Name:", cc.xy(1, 3));
         builder.add(name.getComponent(), cc.xy(3, 3));
         builder.addLabel("Comment:", cc.xy(1, 5));
-        builder.add(comment.getComponent(), cc.xy(3, 5));
+        builder.add(comment, cc.xy(3, 5));
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.NORTH);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
index 94279c4b8..a3d728ad8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
@@ -47,7 +47,7 @@ public class EjbqlQueryPropertiesPanel extends SelectPropertiesPanel {
         builder.addLabel("Result Caching:", cc.xy(1, 3));
         builder.add(cacheStrategy, cc.xywh(3, 3, 5, 1));
         cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 7));
-        builder.add(cacheGroups.getComponent(), cc.xywh(3, 7, 5, 1));
+        builder.add(cacheGroups, cc.xywh(3, 7, 5, 1));
         builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 9));
         builder.add(fetchOffset.getComponent(), cc.xywh(3, 9, 3, 1));
         builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 11));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
index 7ca6dc389..1d5bafdc9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
@@ -40,6 +40,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.ExpressionConvertor;
@@ -60,7 +61,7 @@ import com.jgoodies.forms.layout.FormLayout;
  */
 public class SelectQueryMainTab extends BaseQueryMainTab {
 
-    protected TextAdapter comment;
+    protected CayenneUndoableTextField comment;
     protected TextAdapter qualifier;
     protected JCheckBox distinct;
     protected ObjectQueryPropertiesPanel properties;
@@ -96,12 +97,8 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
             }
         };
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQueryComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::setQueryComment);
 
         distinct = new JCayenneCheckBox();
 
@@ -125,7 +122,7 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
         builder.addLabel("Distinct:", cc.xy(1, 9));
         builder.add(distinct, cc.xy(3, 9));
         builder.addLabel("Comment:", cc.xy(1, 11));
-        builder.add(comment.getComponent(), cc.xy(3, 11));
+        builder.add(comment, cc.xy(3, 11));
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.NORTH);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
index 8729e78b4..821d23c08 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
@@ -32,6 +32,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.TextAdapter;
@@ -72,7 +73,7 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
         labelCapsLabels.put(CapsStrategy.UPPER, UPPER_CAPS_LABEL);
     }
 
-    protected TextAdapter comment;
+    protected CayenneUndoableTextField comment;
     protected SelectPropertiesPanel properties;
 
     public SQLTemplateMainTab(ProjectController mediator) {
@@ -91,12 +92,8 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
             }
         };
 
-        comment = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQueryComment(text);
-            }
-        };
+        comment = new CayenneUndoableTextField();
+        comment.addCommitListener(this::setQueryComment);
 
         properties = new SQLTemplateQueryPropertiesPanel(controller);
 
@@ -112,7 +109,7 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
         builder.addLabel("Query Name:", cc.xy(1, 3));
         builder.add(name.getComponent(), cc.xy(3, 3));
         builder.addLabel("Comment:", cc.xy(1, 5));
-        builder.add(comment.getComponent(), cc.xy(3, 5));
+        builder.add(comment, cc.xy(3, 5));
         builder.addLabel("Query Root:", cc.xy(1, 7));
         builder.add(queryRoot, cc.xy(3, 7));
 


(cayenne) 06/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit b36f06f0196f378fd578b5def1b299433ad06464
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
---
 .../cayenne/modeler/swing/table/CayenneTable.java  | 114 +++++++++++++++++--
 .../cayenne/modeler/util/TableHeaderListener.java  | 126 ---------------------
 2 files changed, 106 insertions(+), 134 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
index 28bf4300c..42d7c189e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
@@ -22,7 +22,6 @@ package org.apache.cayenne.modeler.swing.table;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.util.CayenneTableModel;
-import org.apache.cayenne.modeler.util.TableHeaderListener;
 
 import javax.swing.*;
 import javax.swing.event.ChangeEvent;
@@ -30,30 +29,34 @@ import javax.swing.event.TableModelEvent;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.JTableHeader;
 import javax.swing.table.TableCellEditor;
+import javax.swing.table.TableCellRenderer;
+import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableModel;
 import javax.swing.text.JTextComponent;
 import java.awt.*;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.util.EventObject;
 
 /**
- * Common superclass of tables used in Cayenne. Contains some common configuration
- * settings and utility methods.
+ * Common superclass of tables used in Cayenne. Contains some common configuration settings and utility methods.
  */
 public class CayenneTable extends JTable {
 
     private final SortButtonRenderer renderer;
-    protected TableHeaderListener tableHeaderListener;
+    private final CayenneTableHeaderListener tableHeaderListener;
+
     private boolean isColumnWidthChanged;
 
     public CayenneTable() {
         setRowHeight(25);
         setRowMargin(3);
 
-        renderer = new SortButtonRenderer();
-        JTableHeader header = getTableHeader();
-        tableHeaderListener = new TableHeaderListener(header, renderer);
-        header.addMouseListener(tableHeaderListener);
+        this.renderer = new SortButtonRenderer();
+        this.tableHeaderListener = new CayenneTableHeaderListener(getTableHeader(), renderer);
+        
+        getTableHeader().addMouseListener(tableHeaderListener);
         setSelectionModel(new CayenneListSelectionModel());
     }
 
@@ -222,6 +225,7 @@ public class CayenneTable extends JTable {
         }
     }
 
+    @Override
     public boolean editCellAt(int row, int column, EventObject e) {
 
         boolean result = false;
@@ -232,6 +236,7 @@ public class CayenneTable extends JTable {
         return result;
     }
 
+    @Override
     public void changeSelection(final int row, final int column, boolean toggle, boolean extend) {
         super.changeSelection(row, column, toggle, extend);
     }
@@ -258,4 +263,97 @@ public class CayenneTable extends JTable {
     public void setSortable(boolean sortable) {
         renderer.setSortingEnabled(sortable);
     }
+
+    static class CayenneTableHeaderListener extends MouseAdapter {
+
+        private static final int EPSILON = 5;
+        private static final Cursor EAST = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
+        private static final Cursor WEST = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
+
+        private JTableHeader header;
+        private SortButtonRenderer renderer;
+        private JTable table;
+
+        private TableColumnPreferences tableColumnPreferences;
+
+        public CayenneTableHeaderListener(JTableHeader header, SortButtonRenderer renderer) {
+            this.header = header;
+            this.renderer = renderer;
+            table = header.getTable();
+        }
+
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            if (e.getClickCount() > 1 && isResizeCursor()) {
+                resize(getLeftColumn(e.getPoint()));
+            } else if (!isResizeCursor()) {
+                int col = header.columnAtPoint(e.getPoint());
+                int sortCol = table.convertColumnIndexToModel(col);
+                if (renderer.isSortingEnabled() && ((CayenneTableModel) table.getModel()).isColumnSortable(sortCol)) {
+                    boolean isAscent = SortButtonRenderer.DOWN != renderer.getState(col);
+                    sortByDefinedColumn(col, sortCol, isAscent);
+                    tableColumnPreferences.setSortOrder(isAscent);
+                    tableColumnPreferences.setSortColumn(sortCol);
+                }
+            }
+        }
+
+        public void mouseReleased(MouseEvent e) {
+            header.repaint();
+        }
+
+        public void sortByDefinedColumn(int col, int sortCol, boolean order) {
+            CayenneTableModel model = (CayenneTableModel) table.getModel();
+            if (renderer.isSortingEnabled() && model.isColumnSortable(sortCol)) {
+                renderer.setSelectedColumn(col, order);
+                header.repaint();
+
+                if (table.isEditing()) {
+                    table.getCellEditor().stopCellEditing();
+                }
+
+                model.sortByColumn(sortCol, order);
+            }
+        }
+
+        public void setPreferences(TableColumnPreferences tableColumnPreferences) {
+            if (this.tableColumnPreferences == null) {
+                this.tableColumnPreferences = tableColumnPreferences;
+            }
+        }
+
+        private boolean isResizeCursor() {
+            Cursor cursor = table.getTableHeader().getCursor();
+            return cursor.equals(EAST) || cursor.equals(WEST);
+        }
+
+        private int getLeftColumn(Point pt) {
+            pt.x -= EPSILON;
+            return table.getTableHeader().columnAtPoint(pt);
+        }
+
+        private void resize(int col) {
+            TableColumnModel tcm = table.getColumnModel();
+            TableColumn tc = tcm.getColumn(col);
+            TableCellRenderer tcr = tc.getHeaderRenderer();
+            if (tcr == null)
+                tcr = table.getTableHeader().getDefaultRenderer();
+            Object obj = tc.getHeaderValue();
+            Component comp = tcr.getTableCellRendererComponent(table, obj, false, false, 0, 0);
+            int maxWidth = comp.getPreferredSize().width;
+
+            for (int i = 0, ub = table.getRowCount(); i != ub; ++i) {
+                tcr = table.getCellRenderer(i, col);
+                obj = table.getValueAt(i, col);
+                comp = tcr.getTableCellRendererComponent(table, obj, false, false, i, col);
+                int w = comp.getPreferredSize().width;
+                if (w > maxWidth)
+                    maxWidth = w;
+            }
+            maxWidth += 10;
+            tc.setPreferredWidth(maxWidth);
+            tc.setWidth(maxWidth);
+        }
+
+    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableHeaderListener.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableHeaderListener.java
deleted file mode 100644
index 0bec364b7..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableHeaderListener.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.pref.TableColumnPreferences;
-import org.apache.cayenne.modeler.swing.table.SortButtonRenderer;
-
-import javax.swing.JTable;
-import javax.swing.table.JTableHeader;
-import javax.swing.table.TableCellRenderer;
-import javax.swing.table.TableColumn;
-import javax.swing.table.TableColumnModel;
-import java.awt.Component;
-import java.awt.Cursor;
-import java.awt.Point;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-
-public class TableHeaderListener extends MouseAdapter {
-
-    private static final int EPSILON = 5;
-    private static final Cursor EAST = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
-    private static final Cursor WEST = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
-
-    private JTableHeader header;
-    private SortButtonRenderer renderer;
-    private JTable table;
-
-    private TableColumnPreferences tableColumnPreferences;
-
-    public TableHeaderListener(JTableHeader header, SortButtonRenderer renderer) {
-        this.header = header;
-        this.renderer = renderer;
-        table = header.getTable();
-    }
-
-    @Override
-    public void mouseClicked(MouseEvent e) {
-        if(e.getClickCount() > 1 && isResizeCursor()) {
-            resize(getLeftColumn(e.getPoint()));
-        } else if (!isResizeCursor()) {
-            int col = header.columnAtPoint(e.getPoint());
-            int sortCol = table.convertColumnIndexToModel(col);
-            if (renderer.isSortingEnabled() && ((CayenneTableModel) table.getModel()).isColumnSortable(sortCol)) {
-                boolean isAscent = SortButtonRenderer.DOWN != renderer.getState(col);
-                sortByDefinedColumn(col, sortCol, isAscent);
-                tableColumnPreferences.setSortOrder(isAscent);
-                tableColumnPreferences.setSortColumn(sortCol);
-            }
-        }
-    }
-
-    public void mouseReleased(MouseEvent e) {
-        header.repaint();
-    }
-
-    public void sortByDefinedColumn(int col, int sortCol, boolean order) {
-        CayenneTableModel model = (CayenneTableModel) table.getModel();
-        if (renderer.isSortingEnabled() && model.isColumnSortable(sortCol)) {
-            renderer.setSelectedColumn(col, order);
-            header.repaint();
-
-            if (table.isEditing()) {
-                table.getCellEditor().stopCellEditing();
-            }
-
-            model.sortByColumn(sortCol, order);
-        }
-    }
-
-    public void setPreferences(TableColumnPreferences tableColumnPreferences) {
-        if (this.tableColumnPreferences == null) {
-            this.tableColumnPreferences = tableColumnPreferences;
-        }
-    }
-
-    private boolean isResizeCursor() {
-        Cursor cursor = table.getTableHeader().getCursor();
-        return cursor.equals(EAST) || cursor.equals(WEST);
-    }
-
-    private int getLeftColumn(Point pt) {
-        pt.x -= EPSILON;
-        return table.getTableHeader().columnAtPoint(pt);
-    }
-
-    private void resize(int col) {
-        TableColumnModel tcm = table.getColumnModel();
-        TableColumn tc = tcm.getColumn(col);
-        TableCellRenderer tcr = tc.getHeaderRenderer();
-        if (tcr == null)
-            tcr = table.getTableHeader().getDefaultRenderer();
-        Object obj = tc.getHeaderValue();
-        Component comp = tcr.getTableCellRendererComponent(table, obj, false, false, 0, 0);
-        int maxWidth = comp.getPreferredSize().width;
-
-        for(int i=0, ub = table.getRowCount(); i!=ub; ++i) {
-            tcr = table.getCellRenderer(i, col);
-            obj = table.getValueAt(i, col);
-            comp = tcr.getTableCellRendererComponent(table, obj, false, false, i, col);
-            int w = comp.getPreferredSize().width;
-            if (w > maxWidth)
-                maxWidth = w;
-        }
-        maxWidth += 10;
-        tc.setPreferredWidth(maxWidth);
-        tc.setWidth(maxWidth);
-    }
-
-}


(cayenne) 03/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 3f576adc980ed402b4cfe9dd695531cdd73ca9e2
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
    
    decomposing MainFrame
---
 .../apache/cayenne/modeler/action/FindAction.java  |   2 +-
 .../modeler/action/ModelerAbstractAction.java      |   2 +-
 .../cayenne/modeler/ui/ModelerController.java      |   5 +-
 .../apache/cayenne/modeler/ui/ModelerFrame.java    | 131 ++-----------
 .../ui/{ModelerFrame.java => ModelerMenuBar.java}  | 216 ++++++---------------
 .../ui/dbloadresult/DbLoadResultDialog.java        |   2 +-
 .../graph/action/ShowGraphEntityAction.java        |   2 +-
 .../modeler/undo/JUndoableCheckBoxEdit.java        |   2 +-
 .../cayenne/modeler/undo/TextCompoundEdit.java     |   4 +-
 .../cayenne/modeler/util/RecentFileMenu.java       |  87 ---------
 10 files changed, 82 insertions(+), 371 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
index 957bf0ae3..c2af85e86 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
@@ -137,7 +137,7 @@ public class FindAction extends ModelerAbstractAction {
      * Navigate to search result
      */
     public static void jumpToResult(FindAction.SearchResultEntry searchResultEntry) {
-        ProjectView projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView()).getEditorPanel();
+        ProjectView projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView()).getProjectView();
         DataChannelDescriptor domain = (DataChannelDescriptor) Application.getInstance().getProject().getRootNode();
         ProjectController controller = Application.getInstance().getFrameController().getProjectController();
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ModelerAbstractAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ModelerAbstractAction.java
index 421167e91..31fc46339 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ModelerAbstractAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ModelerAbstractAction.java
@@ -255,6 +255,6 @@ public abstract class ModelerAbstractAction extends AbstractAction {
         return ((ModelerFrame) Application
                 .getInstance()
                 .getFrameController()
-                .getView()).getEditorPanel();
+                .getView()).getProjectView();
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
index 58bd425bf..062fe35ef 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
@@ -38,7 +38,6 @@ import org.apache.cayenne.validation.ValidationResult;
 
 import javax.swing.*;
 import javax.swing.filechooser.FileFilter;
-import java.awt.*;
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
 import java.awt.dnd.DropTarget;
@@ -162,7 +161,7 @@ public class ModelerController extends RootController {
         projectController.saveSelectionToPrefs();
 
         // --- update view
-        view.setEditorPanel(null);
+        view.setProjectView(null);
 
         // repaint is needed, since sometimes there is a
         // trace from menu left on the screen
@@ -182,7 +181,7 @@ public class ModelerController extends RootController {
 
         projectController.projectOpened(project);
         view.setTitle(getProjectLocationString());
-        view.setEditorPanel(projectController.getView());
+        view.setProjectView(projectController.getView());
 
         projectController.restoreSelectionFromPrefs();
         application.getActionManager().projectOpened();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
index c5ff4c796..5482286b6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
@@ -20,13 +20,11 @@
 package org.apache.cayenne.modeler.ui;
 
 import org.apache.cayenne.modeler.ui.project.ProjectView;
-import org.apache.cayenne.modeler.action.*;
+import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 import org.apache.cayenne.modeler.ui.welcome.WelcomeScreen;
-import org.apache.cayenne.modeler.event.model.RecentFileListListener;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.util.ModelerUtil;
-import org.apache.cayenne.modeler.util.RecentFileMenu;
 import org.apache.cayenne.modeler.swing.border.TopBorder;
 import org.slf4j.LoggerFactory;
 
@@ -34,34 +32,29 @@ import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
-import java.awt.event.KeyEvent;
-import java.util.ArrayList;
-import java.util.List;
 
 /**
  * Main frame of CayenneModeler GUI
  */
 public class ModelerFrame extends JFrame {
 
-    private final LogConsoleController logConsoleController;
     private final ActionManager actionManager;
-    private final List<RecentFileListListener> recentFileListeners;
 
     private final JSplitPane splitPane;
     private final JLabel status;
     private final WelcomeScreen welcomePanel;
+    private final ModelerMenuBar menuBar;
 
     private ProjectView projectView;
-    private JCheckBoxMenuItem logMenu;
     private Component dockComponent;
 
     public ModelerFrame(ActionManager actionManager, LogConsoleController logConsoleController) {
         this.actionManager = actionManager;
-        this.logConsoleController = logConsoleController;
-        this.recentFileListeners = new ArrayList<>();
 
         setIconImage(ModelerUtil.buildIcon("CayenneModeler.png").getImage());
-        initMenus();
+        getContentPane().setLayout(new BorderLayout());
+        this.menuBar = new ModelerMenuBar(actionManager, logConsoleController);
+        setJMenuBar(menuBar);
         initToolbar();
 
         status = new JLabel();
@@ -93,111 +86,18 @@ public class ModelerFrame extends JFrame {
         getContentPane().add(statusBar, BorderLayout.SOUTH);
 
         this.welcomePanel = new WelcomeScreen();
-        recentFileListeners.add(welcomePanel);
+        this.menuBar.addRecentFileListener(welcomePanel);
 
         fireRecentFileListChanged(); // start filling list in welcome screen and in menu
 
-        setEditorPanel(null);
-    }
-
-    protected void initMenus() {
-        getContentPane().setLayout(new BorderLayout());
-
-        JMenu fileMenu = new JMenu("File");
-        JMenu editMenu = new JMenu("Edit");
-        JMenu projectMenu = new JMenu("Project");
-        JMenu toolMenu = new JMenu("Tools");
-        JMenu helpMenu = new JMenu("Help");
-
-        fileMenu.setMnemonic(KeyEvent.VK_F);
-        editMenu.setMnemonic(KeyEvent.VK_E);
-        projectMenu.setMnemonic(KeyEvent.VK_P);
-        toolMenu.setMnemonic(KeyEvent.VK_T);
-        helpMenu.setMnemonic(KeyEvent.VK_H);
-
-        fileMenu.add(actionManager.getAction(NewProjectAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(OpenProjectAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(ProjectAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(ImportDataMapAction.class).buildMenu());
-        fileMenu.addSeparator();
-        fileMenu.add(actionManager.getAction(SaveAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(SaveAsAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(RevertAction.class).buildMenu());
-        fileMenu.addSeparator();
-
-        editMenu.add(actionManager.getAction(UndoAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(RedoAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(CutAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(CopyAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(PasteAction.class).buildMenu());
-
-        RecentFileMenu recentFileMenu = new RecentFileMenu("Recent Projects");
-        recentFileListeners.add(recentFileMenu);
-        fileMenu.add(recentFileMenu);
-
-        fileMenu.addSeparator();
-        fileMenu.add(actionManager.getAction(ExitAction.class).buildMenu());
-
-        projectMenu.add(actionManager.getAction(ValidateAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(ShowValidationConfigAction.class).buildMenu());
-        projectMenu.addSeparator();
-        projectMenu.add(actionManager.getAction(CreateNodeAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateDataMapAction.class).buildMenu());
-
-        projectMenu.add(actionManager.getAction(CreateObjEntityAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateEmbeddableAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateDbEntityAction.class).buildMenu());
-
-        projectMenu.add(actionManager.getAction(CreateProcedureAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateQueryAction.class).buildMenu());
-
-        projectMenu.addSeparator();
-        projectMenu.add(actionManager.getAction(ObjEntitySyncAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(DbEntitySyncAction.class).buildMenu());
-        projectMenu.addSeparator();
-        projectMenu.add(actionManager.getAction(RemoveAction.class).buildMenu());
-
-        toolMenu.add(actionManager.getAction(InferRelationshipsAction.class).buildMenu());
-        toolMenu.add(actionManager.getAction(ImportEOModelAction.class).buildMenu());
-        toolMenu.addSeparator();
-        toolMenu.add(actionManager.getAction(GenerateCodeAction.class).buildMenu());
-        toolMenu.add(actionManager.getAction(GenerateDBAction.class).buildMenu());
-        toolMenu.add(actionManager.getAction(MigrateAction.class).buildMenu());
-
-        // Menu for opening Log console
-        toolMenu.addSeparator();
-        logMenu = actionManager.getAction(ShowLogConsoleAction.class).buildCheckBoxMenu();
-
-        if (!logConsoleController.getConsoleProperty(LogConsoleController.DOCKED_PROPERTY)
-                && logConsoleController.getConsoleProperty(LogConsoleController.SHOW_CONSOLE_PROPERTY)) {
-            logConsoleController.setConsoleProperty(LogConsoleController.SHOW_CONSOLE_PROPERTY, false);
-        }
-
-        updateLogConsoleMenu();
-        toolMenu.add(logMenu);
-
-        toolMenu.addSeparator();
-        toolMenu.add(actionManager.getAction(ConfigurePreferencesAction.class).buildMenu());
-
-        helpMenu.add(actionManager.getAction(AboutAction.class).buildMenu());
-        helpMenu.add(actionManager.getAction(DocumentationAction.class).buildMenu());
-
-        JMenuBar menuBar = new JMenuBar();
-
-        menuBar.add(fileMenu);
-        menuBar.add(editMenu);
-        menuBar.add(projectMenu);
-        menuBar.add(toolMenu);
-        menuBar.add(helpMenu);
-
-        setJMenuBar(menuBar);
+        setProjectView(null);
     }
 
     /**
      * Selects/deselects menu item, depending on status of log console
      */
     public void updateLogConsoleMenu() {
-        logMenu.setSelected(logConsoleController.getConsoleProperty(LogConsoleController.SHOW_CONSOLE_PROPERTY));
+        menuBar.updateLogConsoleMenu();
     }
 
     /**
@@ -263,15 +163,15 @@ public class ModelerFrame extends JFrame {
         });
     }
 
-    public ProjectView getEditorPanel() {
-        return projectView;
-    }
-
     public JLabel getStatus() {
         return status;
     }
 
-    public void setEditorPanel(ProjectView projectView) {
+    public ProjectView getProjectView() {
+        return projectView;
+    }
+
+    public void setProjectView(ProjectView projectView) {
         int oldLocation = splitPane.getDividerLocation();
 
         this.projectView = projectView;
@@ -290,9 +190,6 @@ public class ModelerFrame extends JFrame {
      * Notifies all listeners that recent file list has changed
      */
     public void fireRecentFileListChanged() {
-        for (RecentFileListListener recentFileListener : recentFileListeners) {
-            recentFileListener.recentFileListChanged();
-        }
+        menuBar.fireRecentFileListChanged();
     }
-
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
similarity index 51%
copy from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
copy to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
index c5ff4c796..09a83c4d2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
@@ -19,90 +19,29 @@
 
 package org.apache.cayenne.modeler.ui;
 
-import org.apache.cayenne.modeler.ui.project.ProjectView;
+import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.action.*;
-import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
-import org.apache.cayenne.modeler.ui.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.event.model.RecentFileListListener;
-import org.apache.cayenne.modeler.pref.ComponentGeometry;
-import org.apache.cayenne.modeler.util.ModelerUtil;
-import org.apache.cayenne.modeler.util.RecentFileMenu;
-import org.apache.cayenne.modeler.swing.border.TopBorder;
-import org.slf4j.LoggerFactory;
+import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
+import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
-/**
- * Main frame of CayenneModeler GUI
- */
-public class ModelerFrame extends JFrame {
+class ModelerMenuBar extends JMenuBar {
 
     private final LogConsoleController logConsoleController;
-    private final ActionManager actionManager;
+    private final JCheckBoxMenuItem logMenu;
     private final List<RecentFileListListener> recentFileListeners;
 
-    private final JSplitPane splitPane;
-    private final JLabel status;
-    private final WelcomeScreen welcomePanel;
-
-    private ProjectView projectView;
-    private JCheckBoxMenuItem logMenu;
-    private Component dockComponent;
-
-    public ModelerFrame(ActionManager actionManager, LogConsoleController logConsoleController) {
-        this.actionManager = actionManager;
+    ModelerMenuBar(ActionManager actionManager, LogConsoleController logConsoleController) {
         this.logConsoleController = logConsoleController;
         this.recentFileListeners = new ArrayList<>();
 
-        setIconImage(ModelerUtil.buildIcon("CayenneModeler.png").getImage());
-        initMenus();
-        initToolbar();
-
-        status = new JLabel();
-        status.setFont(status.getFont().deriveFont(Font.PLAIN, 10));
-
-        splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
-        splitPane.setBorder(TopBorder.create());
-        splitPane.getInsets().left = 5;
-        splitPane.getInsets().right = 5;
-        splitPane.setResizeWeight(0.7);
-
-        try {
-            ComponentGeometry geometry = new ComponentGeometry(this.getClass(), getClass().getSimpleName() + "/splitPane/divider");
-            geometry.bindIntProperty(splitPane, JSplitPane.DIVIDER_LOCATION_PROPERTY, 400);
-        } catch (Exception ex) {
-            LoggerFactory.getLogger(getClass()).error("Cannot bind divider property", ex);
-        }
-
-        JPanel statusBar = new JPanel(new FlowLayout(FlowLayout.LEFT, 3, 1));
-        statusBar.setBorder(TopBorder.create());
-        // add placeholder
-        statusBar.add(Box.createVerticalStrut(16));
-        statusBar.add(status);
-
-        if (getContentPane() instanceof JPanel) {
-            ((JPanel) getContentPane()).setBorder(BorderFactory.createEmptyBorder());
-        }
-        getContentPane().add(splitPane, BorderLayout.CENTER);
-        getContentPane().add(statusBar, BorderLayout.SOUTH);
-
-        this.welcomePanel = new WelcomeScreen();
-        recentFileListeners.add(welcomePanel);
-
-        fireRecentFileListChanged(); // start filling list in welcome screen and in menu
-
-        setEditorPanel(null);
-    }
-
-    protected void initMenus() {
-        getContentPane().setLayout(new BorderLayout());
-
         JMenu fileMenu = new JMenu("File");
         JMenu editMenu = new JMenu("Edit");
         JMenu projectMenu = new JMenu("Project");
@@ -182,117 +121,80 @@ public class ModelerFrame extends JFrame {
         helpMenu.add(actionManager.getAction(AboutAction.class).buildMenu());
         helpMenu.add(actionManager.getAction(DocumentationAction.class).buildMenu());
 
-        JMenuBar menuBar = new JMenuBar();
-
-        menuBar.add(fileMenu);
-        menuBar.add(editMenu);
-        menuBar.add(projectMenu);
-        menuBar.add(toolMenu);
-        menuBar.add(helpMenu);
-
-        setJMenuBar(menuBar);
+        add(fileMenu);
+        add(editMenu);
+        add(projectMenu);
+        add(toolMenu);
+        add(helpMenu);
     }
 
     /**
      * Selects/deselects menu item, depending on status of log console
      */
-    public void updateLogConsoleMenu() {
+    void updateLogConsoleMenu() {
         logMenu.setSelected(logConsoleController.getConsoleProperty(LogConsoleController.SHOW_CONSOLE_PROPERTY));
     }
 
-    /**
-     * Plugs a component in the frame, between main area and status bar
-     */
-    public void setDockComponent(Component c) {
-        if (dockComponent == c) {
-            return;
-        }
+    void addRecentFileListener(RecentFileListListener listener) {
+        recentFileListeners.add(listener);
+    }
 
-        if (dockComponent != null) {
-            splitPane.setBottomComponent(null);
+    void fireRecentFileListChanged() {
+        for (RecentFileListListener listener : recentFileListeners) {
+            listener.recentFileListChanged();
         }
+    }
 
-        dockComponent = c;
+    static class RecentFileMenu extends JMenu implements RecentFileListListener {
 
-        if (dockComponent != null) {
-            splitPane.setBottomComponent(dockComponent);
+        public RecentFileMenu(String s) {
+            super(s);
         }
 
-        splitPane.validate();
-    }
+        /**
+         * Rebuilds internal menu items list with the files stored in CayenneModeler preferences.
+         */
+        public void rebuildFromPreferences() {
 
-    protected void initToolbar() {
-
-        MainToolBar toolBar = new MainToolBar(actionManager);
-        getContentPane().add(toolBar, BorderLayout.NORTH);
-
-        // Hide some buttons when frame is too small
-        int defaultBtnWidth = toolBar.getDefaultButtonWidth();
-        addComponentListener(new ComponentAdapter() {
-            private final int[] empty = {};
-            private final int[] all = {6, 7, 8, 9, 10, 11, 12, 13, 14};
-            private final int[] remove = {6, 7};
-            private final int[] removeAndCopy = {6, 7, 8, 9, 10, 11};
-            private final int[] undo = {12, 13, 14};
-            private final int[] undoAndCopy = {8, 9, 10, 11, 12, 13, 14};
-
-            @Override
-            public void componentResized(ComponentEvent e) {
-                int[] hidden, shown;
-                if (getSize().width < (13 * defaultBtnWidth + 300)) {
-                    hidden = all;
-                    shown = empty;
-                } else if (getSize().width < (16 * defaultBtnWidth + 300)) {
-                    hidden = removeAndCopy;
-                    shown = undo;
-                } else if (getSize().width < (18 * defaultBtnWidth + 300)) {
-                    hidden = remove;
-                    shown = undoAndCopy;
-                } else {
-                    hidden = empty;
-                    shown = all;
-                }
+            List<File> files = LastProjectsPreferences.getFiles();
 
-                for (int i : hidden) {
-                    toolBar.getComponentAtIndex(i).setVisible(false);
-                }
-                for (int i : shown) {
-                    toolBar.getComponentAtIndex(i).setVisible(true);
-                }
-            }
-        });
-    }
+            // read menus
+            Component[] comps = getMenuComponents();
+            int curSize = comps.length;
+            int prefSize = files.size();
 
-    public ProjectView getEditorPanel() {
-        return projectView;
-    }
+            OpenProjectAction action = Application.getInstance().getActionManager().getAction(OpenProjectAction.class);
 
-    public JLabel getStatus() {
-        return status;
-    }
-
-    public void setEditorPanel(ProjectView projectView) {
-        int oldLocation = splitPane.getDividerLocation();
+            for (int i = 0; i < prefSize; i++) {
+                String name = files.get(i).getAbsolutePath();
+                if (i < curSize) {
+                    ((JMenuItem) comps[i]).setText(name);
+                } else {
 
-        this.projectView = projectView;
+                    JMenuItem item = new JMenuItem(name) {
+                        @Override
+                        protected void configurePropertiesFromAction(Action a) {
+                            // exclude most generic action keys that are not applicable here
+                            setIcon((Icon) a.getValue(Action.SMALL_ICON));
+                            setEnabled(a.isEnabled());
+                        }
+                    };
+
+                    item.setAction(action);
+                    add(item);
+                }
+            }
 
-        if (projectView != null) {
-            splitPane.setTopComponent(projectView);
-        } else {
-            splitPane.setTopComponent(welcomePanel);
+            // remove any hanging items
+            for (int i = curSize - 1; i >= prefSize; i--) {
+                remove(i);
+            }
         }
 
-        validate();
-        splitPane.setDividerLocation(oldLocation);
-    }
-
-    /**
-     * Notifies all listeners that recent file list has changed
-     */
-    public void fireRecentFileListChanged() {
-        for (RecentFileListListener recentFileListener : recentFileListeners) {
-            recentFileListener.recentFileListChanged();
+        @Override
+        public void recentFileListChanged() {
+            rebuildFromPreferences();
+            setEnabled(getMenuComponentCount() > 0);
         }
     }
-
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbloadresult/DbLoadResultDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbloadresult/DbLoadResultDialog.java
index 0a9cff1a1..4685eb2b1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbloadresult/DbLoadResultDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbloadresult/DbLoadResultDialog.java
@@ -73,7 +73,7 @@ public class DbLoadResultDialog extends JDialog {
         this.setModal(false);
         this.setPreferredSize(new Dimension(400, 400));
         this.pack();
-        this.setLocationRelativeTo(Application.getInstance().getFrameController().getView().getEditorPanel());
+        this.setLocationRelativeTo(Application.getInstance().getFrameController().getView().getProjectView());
     }
 
     private void initElements() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
index 262dfd3f1..494a2dd3f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
@@ -76,7 +76,7 @@ public class ShowGraphEntityAction extends ModelerAbstractAction {
         ProjectView editor = ((ModelerFrame) Application
                 .getInstance()
                 .getFrameController()
-                .getView()).getEditorPanel();
+                .getView()).getProjectView();
 
         editor.getProjectTreeView().getSelectionModel().setSelectionPath(
                 editor
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JUndoableCheckBoxEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JUndoableCheckBoxEdit.java
index 1c8b306a6..0e7ee40a9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JUndoableCheckBoxEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JUndoableCheckBoxEdit.java
@@ -56,7 +56,7 @@ public class JUndoableCheckBoxEdit extends AbstractUndoableEdit {
         this.actionListener = actionListener;
         this.isSelected = checkBox.isSelected();
 
-        projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView()).getEditorPanel();
+        projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView()).getProjectView();
 
         treePath = projectView.getProjectTreeView().getSelectionPath();
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
index 0b21fc144..62b8ea9b4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
@@ -67,7 +67,7 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
         this.listener = listener;
 
         ProjectView projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView())
-                .getEditorPanel();
+                .getProjectView();
 
         treePath = projectView.getProjectTreeView().getSelectionPath();
 
@@ -118,7 +118,7 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
     private void restoreSelections() {
 
         ProjectView projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView())
-                .getEditorPanel();
+                .getProjectView();
 
         projectView.getProjectTreeView().getSelectionModel().setSelectionPath(treePath);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/RecentFileMenu.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/RecentFileMenu.java
deleted file mode 100644
index 77d2a768d..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/RecentFileMenu.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
-import org.apache.cayenne.modeler.event.model.RecentFileListListener;
-
-import javax.swing.*;
-import java.awt.*;
-import java.io.File;
-import java.util.List;
-
-/**
- * Menu that contains a list of previously used files. It is built from CayenneModeler preferences via
- * {@link #rebuildFromPreferences()}
- */
-public class RecentFileMenu extends JMenu implements RecentFileListListener {
-
-    public RecentFileMenu(String s) {
-        super(s);
-    }
-
-    /**
-     * Rebuilds internal menu items list with the files stored in CayenneModeler preferences.
-     */
-    public void rebuildFromPreferences() {
-
-        List<File> files = LastProjectsPreferences.getFiles();
-
-        // read menus
-        Component[] comps = getMenuComponents();
-        int curSize = comps.length;
-        int prefSize = files.size();
-
-        OpenProjectAction action = Application.getInstance().getActionManager().getAction(OpenProjectAction.class);
-
-        for (int i = 0; i < prefSize; i++) {
-            String name = files.get(i).getAbsolutePath();
-            if (i < curSize) {
-                ((JMenuItem) comps[i]).setText(name);
-            } else {
-
-                JMenuItem item = new JMenuItem(name) {
-                    @Override
-                    protected void configurePropertiesFromAction(Action a) {
-                        // exclude most generic action keys that are not applicable here
-                        setIcon((Icon) a.getValue(Action.SMALL_ICON));
-                        setEnabled(a.isEnabled());
-                    }
-                };
-
-                item.setAction(action);
-                add(item);
-            }
-        }
-
-        // remove any hanging items
-        for (int i = curSize - 1; i >= prefSize; i--) {
-            remove(i);
-        }
-    }
-
-    @Override
-    public void recentFileListChanged() {
-        rebuildFromPreferences();
-        setEnabled(getMenuComponentCount() > 0);
-    }
-}


(cayenne) 10/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 4c0163ebfdbeae5e88bdb6d43bef62be6c68f4d1
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
---
 .../org/apache/cayenne/modeler/Application.java    |   8 --
 .../apache/cayenne/modeler/action/CopyAction.java  |   2 +-
 .../modeler/action/DocumentationAction.java        |   4 +-
 .../modeler/action/ImportEOModelAction.java        |  75 ++++++++++----
 .../apache/cayenne/modeler/action/PasteAction.java |   2 +-
 .../project}/AttributeDisplayEventType.java        |   2 +-
 .../project}/DataMapDisplayEventType.java          |   2 +-
 .../project}/DataNodeDisplayEventType.java         |   2 +-
 .../state => pref/project}/DisplayEventType.java   |   2 +-
 .../state => pref/project}/DisplayEventTypes.java  |   2 +-
 .../project}/DomainDisplayEventType.java           |   2 +-
 .../EmbeddableAttributeDisplayEventType.java       |   2 +-
 .../project}/EmbeddableDisplayEventType.java       |   2 +-
 .../project}/EntityDisplayEventType.java           |   2 +-
 .../project}/MultipleObjectsDisplayEventType.java  |   2 +-
 .../project}/ProcedureDisplayEventType.java        |   2 +-
 .../ProcedureParameterDisplayEventType.java        |   2 +-
 .../project}/QueryDisplayEventType.java            |   2 +-
 .../project}/RelationshipDisplayEventType.java     |   2 +-
 .../BrowserControl.java => swing/UrlOpener.java}   |  17 ++--
 .../CayenneCheckBox.java}                          |  13 +--
 .../swing/{ => copypaste}/CayenneTransferable.java |  53 ++++------
 .../cayenne/modeler/swing/table/CayenneTable.java  |   1 -
 .../{util => swing/table}/CayenneTableModel.java   |   5 +-
 .../ui/dbrelationship/DbJoinTableModel.java        |   2 +-
 .../cayenne/modeler/ui/errors/ErrorDialog.java     |   4 +-
 .../preferences/datasource/creator/Adapters.java}  |  75 +++-----------
 .../creator/DataSourceCreatorController.java       |   7 +-
 .../modeler/ui/project/ProjectController.java      |   8 +-
 .../project/editor/datadomain/DataDomainView.java  |   6 +-
 .../editor/datamap/cgen/CgenConfigPanel.java       |  12 +--
 .../editor/datamap/main/DataMapMainView.java       |   8 +-
 .../superclass/SuperclassUpdateController.java     |   2 +-
 .../dbentity/properties/DbAttributeTableModel.java |   2 +-
 .../properties/DbRelationshipTableModel.java       |   2 +-
 .../attributes/EmbeddableAttributeTableModel.java  |   2 +-
 .../editor/embeddable/main/EmbeddableMainView.java |   2 +-
 .../OverrideEmbeddableAttributeTableModel.java     |   2 +-
 .../callbacks/CallbackDescriptorTableModel.java    |   2 +-
 .../duplicates/DuplicatedAttributesDialog.java     |   2 +-
 .../editor/objentity/main/ObjEntityMainView.java   |  12 +--
 .../objentity/properties/ObjAttributePanel.java    |   2 +-
 .../properties/ObjAttributeTableModel.java         |   2 +-
 .../properties/ObjRelationshipTableModel.java      |   2 +-
 .../relinfo/ObjRelationshipInfoController.java     |   2 +-
 .../procedure/ProcedureParameterTableModel.java    |   2 +-
 .../editor/procedure/ProcedureQueryView.java       |   2 +-
 .../ui/project/editor/procedure/ProcedureTab.java  |   4 +-
 .../editor/query/ObjectQueryPropertiesPanel.java   |   4 +-
 .../editor/query/RawQueryPropertiesPanel.java      |   6 +-
 .../query/selectquery/SelectQueryMainTab.java      |   6 +-
 .../query/sqltemplate/SQLTemplateMainTab.java      |   3 +-
 .../ui/project/tree/ProjectTreeController.java     |  28 +++---
 .../ui/project/tree/ProjectTreeFactory.java        |  10 +-
 .../undo/CayenneTableModelUndoableEdit.java        |   2 +-
 .../cayenne/modeler/util/CayenneUserDir.java       | 109 ---------------------
 .../apache/cayenne/modeler/util/Comparators.java   |  31 +++---
 .../cayenne/modeler/util/EntityTreeModel.java      |   4 +-
 .../util/PathChooserComboBoxCellEditor.java        |   1 +
 59 files changed, 209 insertions(+), 369 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index b879114ed..96d7cd81d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -35,7 +35,6 @@ import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 import org.apache.cayenne.modeler.ui.preferences.classpath.ClasspathPreferencesController;
 import org.apache.cayenne.modeler.ui.preferences.general.GeneralPreferencesController;
 import org.apache.cayenne.modeler.undo.CayenneUndoManager;
-import org.apache.cayenne.modeler.util.AdapterMapping;
 import org.apache.cayenne.modeler.pref.CayennePreference;
 import org.apache.cayenne.modeler.pref.CayenneProjectPreferences;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
@@ -76,7 +75,6 @@ public class Application {
     protected LogConsoleController logConsoleController;
     protected ModelerController frameController;
     protected String name;
-    protected AdapterMapping adapterMapping;
     protected CayenneUndoManager undoManager;
     protected CayenneProjectPreferences cayenneProjectPreferences;
     protected CayennePreference cayennePreference;
@@ -132,11 +130,6 @@ public class Application {
         return modelerClassLoader;
     }
 
-    public AdapterMapping getAdapterMapping() {
-        return adapterMapping;
-    }
-
-
     public ActionManager getActionManager() {
         return injector.getInstance(ActionManager.class);
     }
@@ -196,7 +189,6 @@ public class Application {
         initPreferences();
         initClassLoader();
 
-        this.adapterMapping = new AdapterMapping();
         this.undoManager = new CayenneUndoManager(this);
         this.frameController = new ModelerController(this);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
index c9794a836..3e204f581 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
@@ -34,7 +34,7 @@ import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
-import org.apache.cayenne.modeler.swing.CayenneTransferable;
+import org.apache.cayenne.modeler.swing.copypaste.CayenneTransferable;
 
 import javax.swing.*;
 import java.awt.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
index 41dc600b6..4d5dafd6a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.action;
 import java.awt.event.ActionEvent;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.BrowserControl;
+import org.apache.cayenne.modeler.swing.UrlOpener;
 import org.apache.cayenne.util.LocalizedStringsHandler;
 
 public class DocumentationAction extends ModelerAbstractAction {
@@ -42,7 +42,7 @@ public class DocumentationAction extends ModelerAbstractAction {
         if(!majorVersion.isEmpty()) {
             url = url + majorVersion + "/cayenne-guide/";
         }
-        BrowserControl.displayURL(url);
+        UrlOpener.displayURL(url);
     }
 
     private static String getMajorVersion() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
index 4476f2913..7ac3c1055 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
@@ -23,11 +23,22 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.DataSourceDescriptor;
-import org.apache.cayenne.modeler.event.model.DataNodeEvent;
-import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.configuration.runtime.JNDIDataSourceFactory;
 import org.apache.cayenne.configuration.runtime.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.dba.DbAdapter;
+import org.apache.cayenne.dba.db2.DB2Adapter;
+import org.apache.cayenne.dba.derby.DerbyAdapter;
+import org.apache.cayenne.dba.firebird.FirebirdAdapter;
+import org.apache.cayenne.dba.frontbase.FrontBaseAdapter;
+import org.apache.cayenne.dba.h2.H2Adapter;
+import org.apache.cayenne.dba.hsqldb.HSQLDBAdapter;
+import org.apache.cayenne.dba.ingres.IngresAdapter;
+import org.apache.cayenne.dba.mysql.MySQLAdapter;
+import org.apache.cayenne.dba.oracle.OracleAdapter;
+import org.apache.cayenne.dba.postgres.PostgresAdapter;
+import org.apache.cayenne.dba.sqlite.SQLiteAdapter;
+import org.apache.cayenne.dba.sqlserver.SQLServerAdapter;
+import org.apache.cayenne.dba.sybase.SybaseAdapter;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -36,27 +47,27 @@ import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.errors.ErrorsController;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
 import org.apache.cayenne.modeler.event.display.DataNodeDisplayEvent;
+import org.apache.cayenne.modeler.event.model.DataNodeEvent;
+import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.modeler.pref.FSPath;
-import org.apache.cayenne.modeler.util.AdapterMapping;
+import org.apache.cayenne.modeler.ui.errors.ErrorsController;
+import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.FileFilters;
 import org.apache.cayenne.wocompat.EOModelProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.JDialog;
-import javax.swing.JFileChooser;
+import javax.swing.*;
 import javax.swing.filechooser.FileFilter;
-import java.awt.Component;
-import java.awt.HeadlessException;
+import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.io.File;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -67,14 +78,38 @@ public class ImportEOModelAction extends ModelerAbstractAction {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ImportEOModelAction.class);
 
-    public static String getActionName() {
-        return "Import EOModel";
-    }
+    private final Map<String, String> adaptersByEofPlugin;
+    private final Map<String, String> adaptersByDriver;
 
-    protected JFileChooser eoModelChooser;
+    private JFileChooser eoModelChooser;
 
     public ImportEOModelAction(Application application) {
-        super(getActionName(), application);
+        super("Import EOModel", application);
+
+        this.adaptersByEofPlugin = new HashMap<>();
+        adaptersByEofPlugin.put("com.webobjects.jdbcadaptor.SybasePlugIn", SybaseAdapter.class.getName());
+        adaptersByEofPlugin.put("com.webobjects.jdbcadaptor.MerantPlugIn", SQLServerAdapter.class.getName());
+        adaptersByEofPlugin.put("com.webobjects.jdbcadaptor.MicrosoftPlugIn", SQLServerAdapter.class.getName());
+        adaptersByEofPlugin.put("com.webobjects.jdbcadaptor.MySQLPlugIn", MySQLAdapter.class.getName());
+        adaptersByEofPlugin.put("com.webobjects.jdbcadaptor.OraclePlugIn", OracleAdapter.class.getName());
+        adaptersByEofPlugin.put("com.webobjects.jdbcadaptor.FrontbasePlugIn", FrontBaseAdapter.class.getName());
+        adaptersByEofPlugin.put("PostgresqlPlugIn", PostgresAdapter.class.getName());
+
+        this.adaptersByDriver = new HashMap<>();
+        adaptersByDriver.put("oracle.jdbc.driver.OracleDriver", OracleAdapter.class.getName());
+        adaptersByDriver.put("com.sybase.jdbc2.jdbc.SybDriver", SybaseAdapter.class.getName());
+        adaptersByDriver.put("com.mysql.jdbc.Driver", MySQLAdapter.class.getName());
+        adaptersByDriver.put("com.mysql.cj.jdbc.Driver", MySQLAdapter.class.getName());
+        adaptersByDriver.put("com.ibm.db2.jcc.DB2Driver", DB2Adapter.class.getName());
+        adaptersByDriver.put("org.hsqldb.jdbcDriver", HSQLDBAdapter.class.getName());
+        adaptersByDriver.put("org.h2.Driver", H2Adapter.class.getName());
+        adaptersByDriver.put("org.postgresql.Driver", PostgresAdapter.class.getName());
+        adaptersByDriver.put("com.microsoft.sqlserver.jdbc.SQLServerDriver", SQLServerAdapter.class.getName());
+        adaptersByDriver.put("org.apache.derby.jdbc.EmbeddedDriver", DerbyAdapter.class.getName());
+        adaptersByDriver.put("jdbc.FrontBase.FBJDriver", FrontBaseAdapter.class.getName());
+        adaptersByDriver.put("com.ingres.jdbc.IngresDriver", IngresAdapter.class.getName());
+        adaptersByDriver.put("org.sqlite.JDBC", SQLiteAdapter.class.getName());
+        adaptersByDriver.put("org.firebirdsql.jdbc.FBDriver", FirebirdAdapter.class.getName());
     }
 
     public String getIconName() {
@@ -135,7 +170,7 @@ public class ImportEOModelAction extends ModelerAbstractAction {
         // node).
 
         String adapter = (String) eomodelIndex.get("adaptorName");
-        Map connection = (Map) eomodelIndex.get("connectionDictionary");
+        Map<?, ?> connection = (Map) eomodelIndex.get("connectionDictionary");
 
         if (adapter != null && connection != null) {
             CreateNodeAction nodeBuilder = application.getActionManager().getAction(CreateNodeAction.class);
@@ -149,11 +184,13 @@ public class ImportEOModelAction extends ModelerAbstractAction {
                 node.setDataSourceFactoryType(JNDIDataSourceFactory.class.getName());
                 node.setParameters((String) connection.get("serverUrl"));
             } else {
+
                 // guess adapter from plugin or driver
-                AdapterMapping adapterDefaults = application.getAdapterMapping();
-                String cayenneAdapter = adapterDefaults.adapterForEOFPluginOrDriver(
-                        (String) connection.get("plugin"),
-                        (String) connection.get("driver"));
+                String cayenneAdapter = adaptersByEofPlugin.get(connection.get("plugin"));
+                if (cayenneAdapter == null) {
+                    cayenneAdapter = adaptersByDriver.get(connection.get("driver"));
+                }
+
                 if (cayenneAdapter != null) {
                     try {
                         Class<DbAdapter> adapterClass = application
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
index d41bf7c47..3210100ef 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
@@ -45,7 +45,7 @@ import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallb
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.PasteCompoundUndoableEdit;
 import org.apache.cayenne.modeler.undo.PasteUndoableEdit;
-import org.apache.cayenne.modeler.swing.CayenneTransferable;
+import org.apache.cayenne.modeler.swing.copypaste.CayenneTransferable;
 import org.apache.cayenne.query.Query;
 
 import javax.swing.KeyStroke;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/AttributeDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/AttributeDisplayEventType.java
index 4d72e8f3c..e7f09a3ff 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/AttributeDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataMapDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataMapDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataMapDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataMapDisplayEventType.java
index 366a586af..dda2c2acf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataMapDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataMapDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataNodeDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataNodeDisplayEventType.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataNodeDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataNodeDisplayEventType.java
index f683e523f..c5f51c595 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DataNodeDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataNodeDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventType.java
index 16a376c17..d0fe9d087 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventTypes.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventTypes.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventTypes.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventTypes.java
index 6d777e92d..6e46e3efa 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DisplayEventTypes.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventTypes.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DomainDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DomainDisplayEventType.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DomainDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DomainDisplayEventType.java
index 2033d655c..7579a0a72 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/DomainDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DomainDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableAttributeDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableAttributeDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableAttributeDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableAttributeDisplayEventType.java
index b938794b6..0bf2bf432 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableAttributeDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableAttributeDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableDisplayEventType.java
index 6e15cda1d..9d22e1cbc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EmbeddableDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EntityDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EntityDisplayEventType.java
index e6ef654b2..c9d689b93 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EntityDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/MultipleObjectsDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/MultipleObjectsDisplayEventType.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/MultipleObjectsDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/MultipleObjectsDisplayEventType.java
index 413e2b952..02ea66058 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/MultipleObjectsDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/MultipleObjectsDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureDisplayEventType.java
index bbc4baa3c..97a6d3cbd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureParameterDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureParameterDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureParameterDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureParameterDisplayEventType.java
index 0422a74cb..8638363d6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/ProcedureParameterDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureParameterDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/QueryDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/QueryDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/QueryDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/QueryDisplayEventType.java
index c91111c4e..abb87f45d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/QueryDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/QueryDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/RelationshipDisplayEventType.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/RelationshipDisplayEventType.java
index 615223417..78204f7c3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/RelationshipDisplayEventType.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util.state;
+package org.apache.cayenne.modeler.pref.project;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BrowserControl.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/UrlOpener.java
similarity index 83%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BrowserControl.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/UrlOpener.java
index 1936e36a8..fe4eb84e5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/BrowserControl.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/UrlOpener.java
@@ -17,7 +17,9 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.swing;
+
+import org.apache.cayenne.modeler.util.OperatingSystem;
 
 import java.awt.Desktop;
 import java.net.URI;
@@ -25,21 +27,14 @@ import java.net.URI;
 /**
  * Opens a URL in the system default browser.
  */
-public class BrowserControl {
-    /**
-     * Display a file in the system browser. If you want to display a file, you must
-     * include the absolute path name.
-     *
-     * @param url the file's url (the url must start with either "http://" or "file://").
-     */
-    // see public domain code at
-    // http://www.centerkey.com/java/browser/myapp/BareBonesBrowserLaunch.java
+public class UrlOpener {
+
     public static void displayURL(String url) {
         try {
             // use direct Java support for the Desktop if available
             if (Desktop.isDesktopSupported() && Desktop.getDesktop().isSupported(Desktop.Action.BROWSE)) {
                 Desktop.getDesktop().browse(new URI(url));
-            // failover to a platform-specific hacks
+                // failover to a platform-specific hacks
             } else if (OperatingSystem.getOS() == OperatingSystem.WINDOWS) {
                 String cmd = "rundll32 url.dll,FileProtocolHandler " + url;
                 Runtime.getRuntime().exec(cmd);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/JCayenneCheckBox.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/checkbox/CayenneCheckBox.java
similarity index 81%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/JCayenneCheckBox.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/checkbox/CayenneCheckBox.java
index cc7fe66cc..6d104c41e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/JCayenneCheckBox.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/checkbox/CayenneCheckBox.java
@@ -17,22 +17,19 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.swing;
+package org.apache.cayenne.modeler.swing.checkbox;
 
 import org.apache.cayenne.modeler.undo.JCheckBoxUndoListener;
 
-import java.awt.event.ActionListener;
+import javax.swing.*;
 import java.awt.event.ItemListener;
-import javax.swing.JCheckBox;
 
-public class JCayenneCheckBox extends JCheckBox {
+public class CayenneCheckBox extends JCheckBox {
 
-    private ActionListener actionListener;
     private boolean modelUpdateDisabled;
 
-    public JCayenneCheckBox() {
-        this.actionListener = new JCheckBoxUndoListener();
-        this.addActionListener(this.actionListener);
+    public CayenneCheckBox() {
+        this.addActionListener(new JCheckBoxUndoListener());
     }
 
     @Override
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/CayenneTransferable.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/copypaste/CayenneTransferable.java
similarity index 80%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/CayenneTransferable.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/copypaste/CayenneTransferable.java
index 513de794d..5d8927c8d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/CayenneTransferable.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/copypaste/CayenneTransferable.java
@@ -16,49 +16,37 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.swing;
+package org.apache.cayenne.modeler.swing.copypaste;
+
+import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
+import org.apache.cayenne.configuration.EmptyConfigurationNodeVisitor;
+import org.apache.cayenne.util.XMLEncoder;
+import org.apache.cayenne.util.XMLSerializable;
 
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.Transferable;
-import java.awt.datatransfer.UnsupportedFlavorException;
-import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.Serializable;
 import java.io.StringWriter;
 import java.util.List;
 
-import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
-import org.apache.cayenne.configuration.EmptyConfigurationNodeVisitor;
-import org.apache.cayenne.util.XMLEncoder;
-import org.apache.cayenne.util.XMLSerializable;
-
 /**
- * CayenneTransferable is a data holder of Cayenne object(s), like
- * Entities, Attributes, Relationships etc.
+ * CayenneTransferable is a data holder of Cayenne object(s), like Entities, Attributes, Relationships etc.
  */
 public class CayenneTransferable implements Transferable {
-    /**
-     * Flavor used for copy-paste between Cayenne Modeler applications
-     */
+
     public static final DataFlavor CAYENNE_FLAVOR = new DataFlavor(Serializable.class, "Cayenne Object");
-    
-    /**
-     * Supported flavors
-     */
-    private static final DataFlavor[] FLAVORS = new DataFlavor[] { CAYENNE_FLAVOR, DataFlavor.stringFlavor };
-    
-    /**
-     * Data in the buffer
-     */
-    private Object data;
-    
+    private static final DataFlavor[] FLAVORS = new DataFlavor[]{CAYENNE_FLAVOR, DataFlavor.stringFlavor};
+
+    private final Object data;
+
     public CayenneTransferable(Object data) {
         this.data = data;
     }
 
-    public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException,
-            IOException {
-        
+    @Override
+    public Object getTransferData(DataFlavor flavor) {
+
         if (flavor == CAYENNE_FLAVOR) {
             return data;
         } else {
@@ -67,26 +55,27 @@ public class CayenneTransferable implements Transferable {
             ConfigurationNodeVisitor visitor = new EmptyConfigurationNodeVisitor();
 
             encoder.println("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
-            
+
             if (data instanceof XMLSerializable) {
                 ((XMLSerializable) data).encodeAsXML(encoder, visitor);
             } else if (data instanceof List) {
-                for (Object o : (List) data) {
+                for (Object o : (List<?>) data) {
                     ((XMLSerializable) o).encodeAsXML(encoder, visitor);
                 }
             }
-            
+
             return out.toString();
         }
-        
+
     }
 
+    @Override
     public DataFlavor[] getTransferDataFlavors() {
         return FLAVORS;
     }
 
+    @Override
     public boolean isDataFlavorSupported(DataFlavor flavor) {
         return flavor == CAYENNE_FLAVOR || flavor == DataFlavor.stringFlavor;
     }
-
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
index cf86af94c..97ae4c89d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
@@ -21,7 +21,6 @@ package org.apache.cayenne.modeler.swing.table;
 
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
 
 import javax.swing.*;
 import javax.swing.event.ChangeEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTableModel.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTableModel.java
index ffd983efc..d29c5f8ac 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTableModel.java
@@ -17,10 +17,9 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.swing.table;
 
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.undo.CayenneTableModelUndoableEdit;
 import org.apache.cayenne.util.Util;
@@ -49,7 +48,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
     protected Object eventSource;
     protected List<T> objectList;
 
-    public CayenneTableModel(ProjectController controller, Object eventSource, List<T> objectList) {
+    protected CayenneTableModel(ProjectController controller, Object eventSource, List<T> objectList) {
         this.eventSource = eventSource;
         this.controller = controller;
         this.objectList = objectList;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java
index cf8e53311..bdf437086 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 
 import java.util.ArrayList;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
index d893e57e7..2c37edd87 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.ui.errors;
 
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.ui.ModelerFrame;
-import org.apache.cayenne.modeler.util.BrowserControl;
+import org.apache.cayenne.modeler.swing.UrlOpener;
 import org.apache.cayenne.modeler.swing.dialog.CayenneDialog;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.util.LocalizedStringsHandler;
@@ -74,7 +74,7 @@ class ErrorDialog extends CayenneDialog implements ActionListener {
         // popup hyperlinks
         infoText.addHyperlinkListener(e -> {
             if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
-                BrowserControl.displayURL(e.getURL().toExternalForm());
+                UrlOpener.displayURL(e.getURL().toExternalForm());
             }
         });
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/AdapterMapping.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/creator/Adapters.java
similarity index 56%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/AdapterMapping.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/creator/Adapters.java
index 7998596df..69b85d754 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/AdapterMapping.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/creator/Adapters.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.ui.preferences.datasource.creator;
 
 import org.apache.cayenne.dba.db2.DB2Adapter;
 import org.apache.cayenne.dba.derby.DerbyAdapter;
@@ -36,42 +36,14 @@ import org.apache.cayenne.dba.sybase.SybaseAdapter;
 import java.util.HashMap;
 import java.util.Map;
 
-/**
- * Contains mappings for guessing defaults for various adapter and JDBC settings.
- */
-public class AdapterMapping {
+class Adapters {
 
-    protected Map<String, String> adapterToJDBCDriverMap;
-    protected Map<String, String> adapterToJDBCURLMap;
-    protected Map<String, String> jdbcDriverToAdapterMap;
-    protected Map<String, String> eofPluginToAdapterMap;
+    private static final Map<String, String> adapterToJDBCDriverMap;
+    private static final Map<String, String> adapterToJDBCURLMap;
 
-    public AdapterMapping() {
-        this.adapterToJDBCDriverMap = new HashMap<>();
-        this.adapterToJDBCURLMap = new HashMap<>();
-        this.jdbcDriverToAdapterMap = new HashMap<>();
-        this.eofPluginToAdapterMap = new HashMap<>();
-
-        initDefaults();
-    }
-
-    protected void initDefaults() {
-        // TODO: make configuration external...
-
-        // drivers
-        jdbcDriverToAdapterMap.put("oracle.jdbc.driver.OracleDriver", OracleAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("com.sybase.jdbc2.jdbc.SybDriver", SybaseAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("com.mysql.jdbc.Driver", MySQLAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("com.ibm.db2.jcc.DB2Driver", DB2Adapter.class.getName());
-        jdbcDriverToAdapterMap.put("org.hsqldb.jdbcDriver", HSQLDBAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("org.h2.Driver", H2Adapter.class.getName());
-        jdbcDriverToAdapterMap.put("org.postgresql.Driver", PostgresAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("com.microsoft.sqlserver.jdbc.SQLServerDriver", SQLServerAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("org.apache.derby.jdbc.EmbeddedDriver", DerbyAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("jdbc.FrontBase.FBJDriver", FrontBaseAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("com.ingres.jdbc.IngresDriver", IngresAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("org.sqlite.JDBC", SQLiteAdapter.class.getName());
-        jdbcDriverToAdapterMap.put("org.firebirdsql.jdbc.FBDriver", FirebirdAdapter.class.getName());
+    static {
+        adapterToJDBCDriverMap = new HashMap<>();
+        adapterToJDBCURLMap = new HashMap<>();
 
         // urls
         adapterToJDBCURLMap.put(OracleAdapter.class.getName(), "jdbc:oracle:thin:@//localhost:1521/database");
@@ -85,18 +57,15 @@ public class AdapterMapping {
                 "jdbc:sqlserver://localhost:1433;databaseName=database;SelectMethod=cursor");
         adapterToJDBCURLMap.put(SQLiteAdapter.class.getName(), "jdbc:sqlite:testdb");
         adapterToJDBCURLMap.put(FirebirdAdapter.class.getName(), "jdbc:firebirdsql:localhost/3050:database.fdb");
-
-        // TODO: embedded Derby Mode... change to client-server once we figure
-        // it out
+        // TODO: embedded Derby Mode... change to client-server once we figure it out
         adapterToJDBCURLMap.put(DerbyAdapter.class.getName(), "jdbc:derby:testdb;create=true");
-
         adapterToJDBCURLMap.put(FrontBaseAdapter.class.getName(), "jdbc:FrontBase://localhost/database");
         adapterToJDBCURLMap.put(IngresAdapter.class.getName(), "jdbc:ingres://127.0.0.1:II7/database");
 
         // adapters
         adapterToJDBCDriverMap.put(OracleAdapter.class.getName(), "oracle.jdbc.driver.OracleDriver");
         adapterToJDBCDriverMap.put(SybaseAdapter.class.getName(), "com.sybase.jdbc2.jdbc.SybDriver");
-        adapterToJDBCDriverMap.put(MySQLAdapter.class.getName(), "com.mysql.jdbc.Driver");
+        adapterToJDBCDriverMap.put(MySQLAdapter.class.getName(), "com.mysql.cj.jdbc.Driver");
         adapterToJDBCDriverMap.put(DB2Adapter.class.getName(), "com.ibm.db2.jcc.DB2Driver");
         adapterToJDBCDriverMap.put(HSQLDBAdapter.class.getName(), "org.hsqldb.jdbcDriver");
         adapterToJDBCDriverMap.put(H2Adapter.class.getName(), "org.h2.Driver");
@@ -109,35 +78,13 @@ public class AdapterMapping {
         adapterToJDBCDriverMap.put(IngresAdapter.class.getName(), "com.ingres.jdbc.IngresDriver");
         adapterToJDBCDriverMap.put(SQLiteAdapter.class.getName(), "org.sqlite.JDBC");
         adapterToJDBCDriverMap.put(FirebirdAdapter.class.getName(), "org.firebirdsql.jdbc.FBDriver");
-
-        // EOF plugins...
-        eofPluginToAdapterMap.put("com.webobjects.jdbcadaptor.SybasePlugIn", SybaseAdapter.class.getName());
-        eofPluginToAdapterMap.put("com.webobjects.jdbcadaptor.MerantPlugIn", SQLServerAdapter.class.getName());
-        eofPluginToAdapterMap.put("com.webobjects.jdbcadaptor.MicrosoftPlugIn", SQLServerAdapter.class.getName());
-        eofPluginToAdapterMap.put("com.webobjects.jdbcadaptor.MySQLPlugIn", MySQLAdapter.class.getName());
-        eofPluginToAdapterMap.put("com.webobjects.jdbcadaptor.OraclePlugIn", OracleAdapter.class.getName());
-        eofPluginToAdapterMap.put("com.webobjects.jdbcadaptor.FrontbasePlugIn", FrontBaseAdapter.class.getName());
-        eofPluginToAdapterMap.put("PostgresqlPlugIn", PostgresAdapter.class.getName());
     }
 
-    public String jdbcURLForAdapter(String adapterClass) {
+    public static String jdbcURL(String adapterClass) {
         return adapterToJDBCURLMap.get(adapterClass);
     }
 
-    public String jdbcDriverForAdapter(String adapterClass) {
+    public static String driver(String adapterClass) {
         return adapterToJDBCDriverMap.get(adapterClass);
     }
-
-    public String adapterForJDBCDriver(String driverClass) {
-        return jdbcDriverToAdapterMap.get(driverClass);
-    }
-
-    public String adapterForEOFPlugin(String eofPlugin) {
-        return eofPluginToAdapterMap.get(eofPlugin);
-    }
-
-    public String adapterForEOFPluginOrDriver(String eofPlugin, String jdbcDriver) {
-        String adapter = adapterForEOFPlugin(eofPlugin);
-        return (adapter != null) ? adapter : adapterForJDBCDriver(jdbcDriver);
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/creator/DataSourceCreatorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/creator/DataSourceCreatorController.java
index 459e7903f..e5e33b0c7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/creator/DataSourceCreatorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/creator/DataSourceCreatorController.java
@@ -22,14 +22,12 @@ package org.apache.cayenne.modeler.ui.preferences.datasource.creator;
 import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.ui.preferences.datasource.DataSourcePreferencesController;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
-import org.apache.cayenne.modeler.util.AdapterMapping;
 import org.apache.cayenne.modeler.util.DbAdapterInfo;
 
 import javax.swing.*;
 import java.awt.*;
 import java.util.Map;
 
-
 public class DataSourceCreatorController extends ChildController<DataSourcePreferencesController> {
 
     private static final String NO_ADAPTER = "Custom / Undefined";
@@ -139,9 +137,8 @@ public class DataSourceCreatorController extends ChildController<DataSourcePrefe
             dataSource.setDbAdapter(adapterString);
 
             // guess adapter defaults...
-            AdapterMapping defaultMap = getApplication().getAdapterMapping();
-            dataSource.setJdbcDriver(defaultMap.jdbcDriverForAdapter(adapterString));
-            dataSource.setUrl(defaultMap.jdbcURLForAdapter(adapterString));
+            dataSource.setJdbcDriver(Adapters.driver(adapterString));
+            dataSource.setUrl(Adapters.jdbcURL(adapterString));
         }
 
         return dataSource;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
index ea9422d84..343073b01 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
@@ -66,8 +66,8 @@ import org.apache.cayenne.modeler.pref.DataNodeDefaults;
 import org.apache.cayenne.modeler.pref.ProjectStatePreferences;
 import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.state.DisplayEventTypes;
-import org.apache.cayenne.modeler.util.state.MultipleObjectsDisplayEventType;
+import org.apache.cayenne.modeler.pref.project.DisplayEventTypes;
+import org.apache.cayenne.modeler.pref.project.MultipleObjectsDisplayEventType;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.util.IDUtil;
@@ -235,8 +235,8 @@ public class ProjectController extends ChildController<ModelerController> {
              * would be set.
              */
             result.sort(parent instanceof DataMap
-                    ? Comparators.getDataMapChildrenComparator()
-                    : Comparators.getDataDomainChildrenComparator());
+                    ? Comparators.forDataMapChildren()
+                    : Comparators.forDataDomainChildren());
 
             return result;
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
index 41981e760..00ed01d3d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.access.DataDomain;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.event.model.DomainEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
 import org.apache.cayenne.modeler.event.display.DomainDisplayListener;
@@ -68,8 +68,8 @@ public class DataDomainView extends JPanel implements DomainDisplayListener {
         this.name = new CayenneUndoableTextField();
         this.name.addCommitListener(this::setDomainName);
 
-        this.objectValidation = new JCayenneCheckBox();
-        this.sharedCache = new JCayenneCheckBox();
+        this.objectValidation = new CayenneCheckBox();
+        this.sharedCache = new CayenneCheckBox();
 
         // assemble
         CellConstraints cc = new CellConstraints();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
index 6422703b3..db5ad8763 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
@@ -25,7 +25,7 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.TemplateType;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.validation.ValidationException;
 
 import javax.swing.BorderFactory;
@@ -71,11 +71,11 @@ public class CgenConfigPanel extends JPanel {
     public CgenConfigPanel(CgenController cgenController) {
         this.cgenController = cgenController;
         this.selectOutputFolder = new JButton("..");
-        this.pairs = new JCayenneCheckBox();
-        this.overwrite = new JCayenneCheckBox();
-        this.usePackagePath = new JCayenneCheckBox();
-        this.createPropertyNames = new JCayenneCheckBox();
-        this.pkProperties = new JCayenneCheckBox();
+        this.pairs = new CayenneCheckBox();
+        this.overwrite = new CayenneCheckBox();
+        this.usePackagePath = new CayenneCheckBox();
+        this.createPropertyNames = new CayenneCheckBox();
+        this.pkProperties = new CayenneCheckBox();
 
         initTextFields();
         initEditTemplateLabels();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
index 80072d432..3d8ac23a3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
@@ -40,7 +40,7 @@ import org.apache.cayenne.modeler.swing.CellRenderers;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
@@ -94,7 +94,7 @@ public class DataMapMainView extends JPanel {
         defaultSchema = new CayenneUndoableTextField();
         defaultSchema.addCommitListener(this::setDefaultSchema);
 
-        quoteSQLIdentifiers = new JCayenneCheckBox();
+        quoteSQLIdentifiers = new CayenneCheckBox();
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::updateComment);
@@ -108,7 +108,7 @@ public class DataMapMainView extends JPanel {
         defaultSuperclass.addCommitListener(this::setDefaultSuperclass);
 
         JButton updateDefaultLockType = new JButton("Update...");
-        defaultLockType = new JCayenneCheckBox();
+        defaultLockType = new CayenneCheckBox();
 
         // assemble
         FormLayout layout = new FormLayout(
@@ -181,7 +181,7 @@ public class DataMapMainView extends JPanel {
 
         // now add the entities
         if (nodes.length > 0) {
-            Arrays.sort(nodes, Comparators.getNamedObjectComparator());
+            Arrays.sort(nodes, Comparators.forNamedObjects());
             System.arraycopy(nodes, 0, objects, 1, nodes.length);
         }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateController.java
index 1afcb2d09..887458705 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateController.java
@@ -68,7 +68,7 @@ public class SuperclassUpdateController extends DefaultsPreferencesController {
         String defaultSuperclass = dataMap.getDefaultSuperclass();
 
         dataMap.getObjEntities().stream()
-                .sorted(Comparators.getDataMapChildrenComparator()).forEach(entity -> {
+                .sorted(Comparators.forDataMapChildren()).forEach(entity -> {
                     if (doAll || Util.isEmptyString(getSuperClassName(entity))) {
                         if (!Util.nullSafeEquals(defaultSuperclass, getSuperClassName(entity))) {
                             setSuperClassName(entity, defaultSuperclass);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributeTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributeTableModel.java
index 1fa792a3c..bb1cbd46e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributeTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributeTableModel.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.modeler.util.ProjectUtil;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipTableModel.java
index 799382bbd..e43758fa6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipTableModel.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.modeler.util.ProjectUtil;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributeTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributeTableModel.java
index 61f8aa4d5..3733e7426 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributeTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributeTableModel.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.map.event.EmbeddableAttributeEvent;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.swing.table.CayenneTable;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.table.CellEditorForAttributeTable;
 import org.apache.cayenne.util.Util;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
index 2e8bead90..61eea315e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
@@ -138,7 +138,7 @@ public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListe
             while (it.hasNext()) {
                 DataMap dataMap = (DataMap) it.next();
                 Iterator<ObjEntity> ent = dataMap.getObjEntities().stream()
-                        .sorted(Comparators.getDataMapChildrenComparator())
+                        .sorted(Comparators.forDataMapChildren())
                         .iterator();
 
                 while (ent.hasNext()) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/OverrideEmbeddableAttributeTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/OverrideEmbeddableAttributeTableModel.java
index fdea5e645..a73e12762 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/OverrideEmbeddableAttributeTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/OverrideEmbeddableAttributeTableModel.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.map.EmbeddedAttribute;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.swing.table.CayenneTable;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.table.CellEditorForAttributeTable;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackDescriptorTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackDescriptorTableModel.java
index 7ca5cdfad..4123f85f7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackDescriptorTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackDescriptorTableModel.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 
 import java.util.List;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/duplicates/DuplicatedAttributesDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/duplicates/DuplicatedAttributesDialog.java
index da1d60b90..fd295c2f3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/duplicates/DuplicatedAttributesDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/duplicates/DuplicatedAttributesDialog.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.swing.dialog.CayenneDialog;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 
 import javax.swing.JButton;
 import javax.swing.JComboBox;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index 819445b16..93f2e8622 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -37,7 +37,7 @@ import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayListener;
 import org.apache.cayenne.modeler.swing.CellRenderers;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
@@ -115,9 +115,9 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         AutoCompletion.enable(dbEntityCombo);
         AutoCompletion.enable(superEntityCombo);
 
-        readOnly = new JCayenneCheckBox();
+        readOnly = new CayenneCheckBox();
 
-        optimisticLocking = new JCayenneCheckBox();
+        optimisticLocking = new CayenneCheckBox();
 
         // borderless clickable button used as a label
         JButton tableLabel = new JButton("Table/View:");
@@ -128,7 +128,7 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         tableLabel.setBorder(null);
 
 
-        isAbstract = new JCayenneCheckBox();
+        isAbstract = new CayenneCheckBox();
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setComment);
@@ -291,7 +291,7 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         EntityResolver resolver = controller.getEntityResolver();
         DataMap map = controller.getSelectedDataMap();
         DbEntity[] dbEntities = resolver.getDbEntities().toArray(new DbEntity[0]);
-        Arrays.sort(dbEntities, Comparators.getDataMapChildrenComparator());
+        Arrays.sort(dbEntities, Comparators.forDataMapChildren());
 
         DefaultComboBoxModel<DbEntity> dbModel = new DefaultComboBoxModel<>(dbEntities);
         dbModel.setSelectedItem(entity.getDbEntity());
@@ -307,7 +307,7 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         // do not show this entity or any of the subentities
         List<ObjEntity> objEntities = map.getObjEntities().stream()
                 .filter(object -> entity != object && !object.isSubentityOf(entity))
-                .sorted(Comparators.getDataMapChildrenComparator())
+                .sorted(Comparators.forDataMapChildren())
                 .collect(Collectors.toList());
         objEntities.add(0, NO_INHERITANCE);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
index 377cd2805..c0a77c2cf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
@@ -44,7 +44,7 @@ import org.apache.cayenne.modeler.event.model.ProjectOnSaveListener;
 import org.apache.cayenne.modeler.event.display.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.swing.table.CayenneTable;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.modeler.util.DbAttributePathComboBoxEditor;
 import org.apache.cayenne.modeler.util.DbAttributePathComboBoxRenderer;
 import org.apache.cayenne.modeler.util.ModelerUtil;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
index d94d55cbd..7d643eebe 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
@@ -36,7 +36,7 @@ import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.swing.table.CayenneTable;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.table.CellEditorForAttributeTable;
 import org.apache.cayenne.modeler.util.ModelerUtil;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipTableModel.java
index e97869270..fc33c707c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipTableModel.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoController.java
index 4f4769f93..24d40ab3f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoController.java
@@ -402,7 +402,7 @@ public class ObjRelationshipInfoController extends ChildController<ProjectContro
 
         if (dbTarget != null) {
             objectTargets.addAll(dbTarget.getDataMap().getMappedEntities(dbTarget));
-            objectTargets.sort(Comparators.getNamedObjectComparator());
+            objectTargets.sort(Comparators.forNamedObjects());
         }
         view.getTargetCombo().removeAllItems();
         for (ObjEntity s : objectTargets) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTableModel.java
index 96939e3ce..d7faf83dc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTableModel.java
@@ -24,7 +24,7 @@ import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.JOptionPane;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
index 486560352..ebcc13fa3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
@@ -161,7 +161,7 @@ public class ProcedureQueryView extends JPanel {
         Procedure[] roots = map.getProcedures().toArray(new Procedure[0]);
 
         if (roots.length > 1) {
-            Arrays.sort(roots, Comparators.getDataMapChildrenComparator());
+            Arrays.sort(roots, Comparators.forDataMapChildren());
         }
 
         DefaultComboBoxModel<Procedure> model = new DefaultComboBoxModel<>(roots);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
index c411a7d9e..e417fcdd3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
@@ -33,7 +33,7 @@ import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.modeler.event.model.ProcedureEvent;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
 
@@ -76,7 +76,7 @@ public class ProcedureTab extends JPanel implements ProcedureDisplayListener, Ex
         this.comment = new CayenneUndoableTextField();
         this.comment.addCommitListener(this::setComment);
 
-        this.returnsValue = new JCayenneCheckBox();
+        this.returnsValue = new CayenneCheckBox();
         this.returnsValue.setToolTipText("first parameter will be used as return value");
 
         FormLayout layout = new FormLayout("right:pref, 3dlu, fill:200dlu", "");
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
index a970a2c19..a1786eb2e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
@@ -23,7 +23,7 @@ import java.awt.BorderLayout;
 
 import javax.swing.JCheckBox;
 
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.query.QueryMetadata;
@@ -48,7 +48,7 @@ public class ObjectQueryPropertiesPanel extends SelectPropertiesPanel {
         super.initView();
         // create widgets
 
-        dataRows = new JCayenneCheckBox();
+        dataRows = new CayenneCheckBox();
 
         // assemble
         CellConstraints cc = new CellConstraints();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
index f141affce..35340b0ad 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
@@ -29,7 +29,7 @@ import javax.swing.JComboBox;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.swing.CellRenderers;
@@ -96,7 +96,7 @@ public abstract class RawQueryPropertiesPanel extends SelectPropertiesPanel {
 
         // create widgets
 
-        persistentObjects = new JCayenneCheckBox();
+        persistentObjects = new CayenneCheckBox();
 
         entities = WidgetFactory.createUndoableComboBox();
         entities.setRenderer(CellRenderers.listRendererWithIcons());
@@ -123,7 +123,7 @@ public abstract class RawQueryPropertiesPanel extends SelectPropertiesPanel {
         List<ObjEntity> objEntities = new ArrayList<>(map.getObjEntities());
 
         if (objEntities.size() > 1) {
-            objEntities.sort(Comparators.getDataMapChildrenComparator());
+            objEntities.sort(Comparators.forDataMapChildren());
         }
 
         entities.setEnabled(fetchingDO && isEnabled());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
index b564ac8ab..68154d94e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
@@ -31,7 +31,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.apache.cayenne.modeler.event.model.QueryEvent;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
+import org.apache.cayenne.modeler.swing.checkbox.CayenneCheckBox;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
@@ -78,7 +78,7 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setQueryComment);
 
-        distinct = new JCayenneCheckBox();
+        distinct = new CayenneCheckBox();
 
         properties = new ObjectQueryPropertiesPanel(controller);
 
@@ -150,7 +150,7 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
         ObjEntity[] roots = map.getObjEntities().toArray(new ObjEntity[0]);
 
         if (roots.length > 1) {
-            Arrays.sort(roots, Comparators.getDataMapChildrenComparator());
+            Arrays.sort(roots, Comparators.forDataMapChildren());
         }
 
         DefaultComboBoxModel<ObjEntity> model = new DefaultComboBoxModel<>(roots);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
index cfe073d24..e3c1cd851 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
@@ -43,7 +43,6 @@ import javax.swing.DefaultComboBoxModel;
 import javax.swing.DefaultListCellRenderer;
 import javax.swing.JComboBox;
 import javax.swing.JList;
-import javax.swing.JTextField;
 import java.awt.BorderLayout;
 import java.awt.Component;
 import java.util.Arrays;
@@ -133,7 +132,7 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
         ObjEntity[] roots = map.getObjEntities().toArray(new ObjEntity[0]);
 
         if (roots.length > 1) {
-            Arrays.sort(roots, Comparators.getDataMapChildrenComparator());
+            Arrays.sort(roots, Comparators.forDataMapChildren());
         }
 
         DefaultComboBoxModel<ObjEntity> model = new DefaultComboBoxModel<>(roots);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java
index d908c6086..899ff872b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java
@@ -323,7 +323,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
 
         Procedure procedure = e.getProcedure();
         DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(procedure, false);
-        positionNode(node, currentNode, Comparators.getDataMapChildrenComparator());
+        positionNode(node, currentNode, Comparators.forDataMapChildren());
         view.navigateTo(currentNode);
     }
 
@@ -336,7 +336,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
             };
 
             updateNode(path);
-            positionNode(path, Comparators.getDataMapChildrenComparator());
+            positionNode(path, Comparators.forDataMapChildren());
             navigateTo(path);
         }
     }
@@ -367,7 +367,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
 
         QueryDescriptor query = e.getQuery();
         DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(query, false);
-        positionNode(node, currentNode, Comparators.getDataMapChildrenComparator());
+        positionNode(node, currentNode, Comparators.forDataMapChildren());
         view.navigateTo(currentNode);
     }
 
@@ -383,7 +383,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
             };
 
             updateNode(path);
-            positionNode(path, Comparators.getDataMapChildrenComparator());
+            positionNode(path, Comparators.forDataMapChildren());
             navigateTo(path);
         }
     }
@@ -407,7 +407,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
         updateNode(path);
 
         if (e.isNameChange()) {
-            positionNode(path, Comparators.getNamedObjectComparator());
+            positionNode(path, Comparators.forNamedObjects());
             navigateTo(path);
         }
     }
@@ -428,7 +428,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
 
             if (e.isNameChange()) {
                 positionNode((DefaultMutableTreeNode) node.getParent(), node,
-                        Comparators.getDataDomainChildrenComparator());
+                        Comparators.forDataDomainChildren());
                 view.navigateTo(node);
             } else {
 
@@ -456,7 +456,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
                         if (!found) {
                             DefaultMutableTreeNode newMapNode =
                                     new DefaultMutableTreeNode(domain.getDataMap(aMapsName), false);
-                            positionNode(node, newMapNode, Comparators.getNamedObjectComparator());
+                            positionNode(node, newMapNode, Comparators.forNamedObjects());
                             break;
                         }
                     }
@@ -502,7 +502,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
 
         DataNodeDescriptor dataNode = e.getDataNode();
         DefaultMutableTreeNode currentNode = ProjectTreeFactory.wrapProjectNode(dataNode);
-        positionNode(node, currentNode, Comparators.getDataDomainChildrenComparator());
+        positionNode(node, currentNode, Comparators.forDataDomainChildren());
         view.navigateTo(currentNode);
     }
 
@@ -532,7 +532,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
 
         if (e.isNameChange()) {
             parent.updateEntityResolver();
-            positionNode(path, Comparators.getDataDomainChildrenComparator());
+            positionNode(path, Comparators.forDataDomainChildren());
             navigateTo(path);
         }
     }
@@ -551,7 +551,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
 
         parent.getEntityResolver().addDataMap(e.getDataMap());
 
-        positionNode(domainNode, newMapNode, Comparators.getDataDomainChildrenComparator());
+        positionNode(domainNode, newMapNode, Comparators.forDataDomainChildren());
         if (Application.getInstance().getFrameController().getDbImportController().isGlobalImport()) {
             view.setSelected(newMapNode);
         } else {
@@ -636,7 +636,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
             };
 
             updateNode(path);
-            positionNode(path, Comparators.getDataMapChildrenComparator());
+            positionNode(path, Comparators.forDataMapChildren());
             navigateTo(path);
         }
     }
@@ -663,7 +663,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
         }
 
         DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(entity, false);
-        positionNode(mapNode, currentNode, Comparators.getDataMapChildrenComparator());
+        positionNode(mapNode, currentNode, Comparators.forDataMapChildren());
         view.navigateTo(currentNode);
     }
 
@@ -702,7 +702,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
         }
 
         DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(embeddable, false);
-        positionNode(mapNode, currentNode, Comparators.getDataMapChildrenComparator());
+        positionNode(mapNode, currentNode, Comparators.forDataMapChildren());
         view.navigateTo(currentNode);
     }
 
@@ -717,7 +717,7 @@ public class ProjectTreeController extends ChildController<ProjectController>
             };
 
             updateNode(path);
-            positionNode(path, Comparators.getDataMapChildrenComparator());
+            positionNode(path, Comparators.forDataMapChildren());
             navigateTo(path);
         }
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java
index a899a85d5..f84a23c06 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java
@@ -133,23 +133,23 @@ class ProjectTreeFactory {
 
             //Should be sorted manually because dataMap don't provide sorted collection.
             dataMap.getObjEntities().stream()
-                    .sorted(Comparators.getDataMapChildrenComparator())
+                    .sorted(Comparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getEmbeddables().stream()
-                    .sorted(Comparators.getDataMapChildrenComparator())
+                    .sorted(Comparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getDbEntities().stream()
-                    .sorted(Comparators.getDataMapChildrenComparator())
+                    .sorted(Comparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getProcedures().stream()
-                    .sorted(Comparators.getDataMapChildrenComparator())
+                    .sorted(Comparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getQueryDescriptors().stream()
-                    .sorted(Comparators.getDataMapChildrenComparator())
+                    .sorted(Comparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             return popNode();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneTableModelUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneTableModelUndoableEdit.java
index 5f6bada30..49aae654b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneTableModelUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneTableModelUndoableEdit.java
@@ -22,7 +22,7 @@ import javax.swing.undo.AbstractUndoableEdit;
 import javax.swing.undo.CannotRedoException;
 import javax.swing.undo.CannotUndoException;
 
-import org.apache.cayenne.modeler.util.CayenneTableModel;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 
 public class CayenneTableModelUndoableEdit extends AbstractUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneUserDir.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneUserDir.java
deleted file mode 100644
index 859999999..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneUserDir.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import java.io.File;
-
-/**
- * CayenneUserDir represents a directory where all Cayenne-related information is stored
- * on the user machine. This is normally a <code>$HOME/.cayenne</code> directory.
- */
-public class CayenneUserDir {
-
-    protected static CayenneUserDir sharedInstance;
-
-    public static final String CAYENNE_DIR = ".cayenne";
-
-    /**
-     * A property name for the property that allows to define an alternative location of
-     * Cayenne User Directory (instead of default "$HOME/.cayenne").
-     */
-    public static final String ALT_USER_DIR_PROPERTY = "cayenne.userdir";
-
-    protected File cayenneUserDir;
-
-    public static CayenneUserDir getInstance() {
-        if (sharedInstance == null) {
-            sharedInstance = new CayenneUserDir();
-        }
-        return sharedInstance;
-    }
-
-    /**
-     * Constructor for CayenneUserDir.
-     */
-    protected CayenneUserDir() {
-        super();
-
-        File tmpDir = null;
-        String dirName = System.getProperty(ALT_USER_DIR_PROPERTY);
-
-        if (dirName != null) {
-            tmpDir = new File(dirName);
-        }
-        else {
-            File homeDir = new File(System.getProperty("user.home"));
-            tmpDir = new File(homeDir, CAYENNE_DIR);
-        }
-
-        if (tmpDir.exists() && !tmpDir.isDirectory()) {
-            tmpDir = null;
-        }
-        else if (tmpDir.exists() && !tmpDir.canRead()) {
-            tmpDir = null;
-        }
-        else if (!tmpDir.exists()) {
-            tmpDir.mkdirs();
-            if (!tmpDir.exists()) {
-                tmpDir = null;
-            }
-        }
-
-        cayenneUserDir = tmpDir;
-    }
-
-    /**
-     * Returns a directory object where all user Cayenne-related configuration is stored.
-     * May return null if the directory is not accessible for whatever reason.
-     */
-    public File getDirectory() {
-        return cayenneUserDir;
-    }
-
-    /**
-     * Return false if the directory is not accessible for any reason at least for
-     * reading.
-     */
-    public boolean canRead() {
-        return cayenneUserDir != null;
-    }
-
-    /**
-     * Return false if the directory is not accessible for any reason at least for
-     * reading.
-     */
-    public boolean canWrite() {
-        return cayenneUserDir != null && cayenneUserDir.canWrite();
-    }
-
-    public File resolveFile(String name) {
-        return new File(cayenneUserDir, name);
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java
index 7466a3a8e..b6c5a1d6e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.modeler.util;
 
-import java.util.Comparator;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.map.Attribute;
@@ -33,26 +31,25 @@ import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.query.Query;
 
+import java.util.Comparator;
+
 /**
  * A collection of useful Comparators used by the modeler.
  */
 public class Comparators {
 
-    private static final Comparator<ConfigurationNode> dataDomainChildrenComparator = new DataDomainChildrenComparator();
-
-    private static final Comparator<ConfigurationNode> dataMapChildrenComparator = new DataMapChildrenComparator();
-
-    private static final Comparator<ConfigurationNode> entityChildrenComparator = new EntityChildrenComparator();
-
-    private static final Comparator<ConfigurationNode> namedObjectComparator = new NamedObjectComparator();
+    private static final Comparator<ConfigurationNode> dataDomainChildren = new DataDomainChildrenComparator();
+    private static final Comparator<ConfigurationNode> dataMapChildren = new DataMapChildrenComparator();
+    private static final Comparator<ConfigurationNode> entityChildren = new EntityChildrenComparator();
+    private static final Comparator<ConfigurationNode> namedObjects = new NamedObjectComparator();
 
     /**
      * Returns a comparator to order DataMap objects of mixed types. Objects of the same
      * type are ordered based on "name" property. Objects of different types are ordered
      * based on the following precedence: DataMap, DataNode.
      */
-    public static Comparator<ConfigurationNode> getDataDomainChildrenComparator() {
-        return dataDomainChildrenComparator;
+    public static Comparator<ConfigurationNode> forDataDomainChildren() {
+        return dataDomainChildren;
     }
 
     /**
@@ -61,8 +58,8 @@ public class Comparators {
      * based on the following precedence: DataMap, ObjEntity, DbEntity, Procedure and
      * Query.
      */
-    public static Comparator<ConfigurationNode> getDataMapChildrenComparator() {
-        return dataMapChildrenComparator;
+    public static Comparator<ConfigurationNode> forDataMapChildren() {
+        return dataMapChildren;
     }
 
     /**
@@ -71,15 +68,15 @@ public class Comparators {
      * Objects of different types are ordered based on the following precedence:
      * Attribute, Relationship.
      */
-    public static Comparator<ConfigurationNode> getEntityChildrenComparator() {
-        return entityChildrenComparator;
+    public static Comparator<ConfigurationNode> forEntityChildren() {
+        return entityChildren;
     }
 
     /**
      * Returns a comparator to order java beans according to their "name" property.
      */
-    public static Comparator<ConfigurationNode> getNamedObjectComparator() {
-        return namedObjectComparator;
+    public static Comparator<ConfigurationNode> forNamedObjects() {
+        return namedObjects;
     }
 
     static class NamedObjectComparator implements Comparator<ConfigurationNode> {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
index 96061b288..69591d20b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
@@ -78,7 +78,7 @@ public class EntityTreeModel implements TreeModel {
 
         // wonder if linear search will be faster, considering that
         // this comparator uses reflection?
-        return Arrays.binarySearch(sortedChildren(node), (ConfigurationNode)child, Comparators.getNamedObjectComparator());
+        return Arrays.binarySearch(sortedChildren(node), (ConfigurationNode)child, Comparators.forNamedObjects());
     }
 
     public void addTreeModelListener(TreeModelListener listener) {
@@ -121,7 +121,7 @@ public class EntityTreeModel implements TreeModel {
 
             sortedForNode = nodes.toArray(new ConfigurationNode[0]);
 
-            Arrays.sort(sortedForNode, Comparators.getEntityChildrenComparator());
+            Arrays.sort(sortedForNode, Comparators.forEntityChildren());
             sortedChildren.put(node, sortedForNode);
         }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
index d53dc3fbf..627f0f5d6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.modeler.swing.CellRenderers;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
+import org.apache.cayenne.modeler.swing.table.CayenneTableModel;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.AbstractCellEditor;


(cayenne) 09/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 5d3c3a107a8ed9a35818d525789f9bb128c53e96
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
    
    ... changing "patternSyntaxStyle" to non-static. Looks like previously
    it wasn't scoped properly
---
 .../modeler/pref/TableColumnPreferences.java       |   2 +-
 .../cayenne/modeler/swing/table/CayenneTable.java  | 118 +++++++--------------
 .../project/editor}/ExpressionConvertor.java       |  27 +----
 .../editor/dbentity/main/DbEntityMainView.java     |  15 ++-
 .../editor/objentity/main/ObjEntityMainView.java   |  27 +++--
 .../query/selectquery/SelectQueryMainTab.java      |  41 +++----
 6 files changed, 80 insertions(+), 150 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/TableColumnPreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/TableColumnPreferences.java
index 1f2d4947c..8cf50785e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/TableColumnPreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/TableColumnPreferences.java
@@ -97,7 +97,7 @@ public class TableColumnPreferences extends CayennePreference {
             int defaultSortColumn,
             boolean defaultSortOrder) {
         bind(table, minSizes, maxSizes, defaultSizes);
-        ((CayenneTable) table).setSortPreferenceSaver(this);
+        ((CayenneTable) table).setColumnPreferences(this);
         this.defaultSortColumn = defaultSortColumn;
         this.defaultSortOrder = defaultSortOrder;
         updateSort(defaultSortColumn, defaultSortOrder);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
index 42d7c189e..cf86af94c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/CayenneTable.java
@@ -28,12 +28,10 @@ import javax.swing.event.ChangeEvent;
 import javax.swing.event.TableModelEvent;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.JTableHeader;
-import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableModel;
-import javax.swing.text.JTextComponent;
 import java.awt.*;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -44,9 +42,13 @@ import java.util.EventObject;
  */
 public class CayenneTable extends JTable {
 
+    private final static int EPSILON = 5;
+    private final static Cursor east = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
+    private final static Cursor west = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
+
     private final SortButtonRenderer renderer;
-    private final CayenneTableHeaderListener tableHeaderListener;
 
+    private TableColumnPreferences columnPreferences;
     private boolean isColumnWidthChanged;
 
     public CayenneTable() {
@@ -54,9 +56,8 @@ public class CayenneTable extends JTable {
         setRowMargin(3);
 
         this.renderer = new SortButtonRenderer();
-        this.tableHeaderListener = new CayenneTableHeaderListener(getTableHeader(), renderer);
-        
-        getTableHeader().addMouseListener(tableHeaderListener);
+
+        getTableHeader().addMouseListener(new HeaderListener());
         setSelectionModel(new CayenneListSelectionModel());
     }
 
@@ -136,23 +137,6 @@ public class CayenneTable extends JTable {
         ((CayenneListSelectionModel) getSelectionModel()).setSelection(rows);
     }
 
-    public JTextComponent getSelectedTextComponent() {
-        int row = getSelectedRow();
-        int column = getSelectedColumn();
-        if (row < 0 || column < 0) {
-            return null;
-        }
-
-        TableCellEditor editor = this.getCellEditor(row, column);
-        if (editor instanceof DefaultCellEditor) {
-            Component comp = ((DefaultCellEditor) editor).getComponent();
-            if (comp instanceof JTextComponent) {
-                return (JTextComponent) comp;
-            }
-        }
-        return null;
-    }
-
     @Override
     public void tableChanged(TableModelEvent e) {
         cancelEditing();
@@ -242,14 +226,16 @@ public class CayenneTable extends JTable {
     }
 
     public void sort(int column, boolean isAscend) {
-        tableHeaderListener.sortByDefinedColumn(
+        sortByDefinedColumn(
                 convertColumnIndexToView(column),
                 column,
                 isAscend);
     }
 
-    public void setSortPreferenceSaver(TableColumnPreferences tableColumnPreferences) {
-        tableHeaderListener.setPreferences(tableColumnPreferences);
+    public void setColumnPreferences(TableColumnPreferences tableColumnPreferences) {
+        if (this.columnPreferences == null) {
+            this.columnPreferences = tableColumnPreferences;
+        }
     }
 
     public boolean getColumnWidthChanged() {
@@ -264,88 +250,67 @@ public class CayenneTable extends JTable {
         renderer.setSortingEnabled(sortable);
     }
 
-    static class CayenneTableHeaderListener extends MouseAdapter {
+    private void sortByDefinedColumn(int col, int sortCol, boolean order) {
+        CayenneTableModel model = (CayenneTableModel) getModel();
+        if (renderer.isSortingEnabled() && model.isColumnSortable(sortCol)) {
+            renderer.setSelectedColumn(col, order);
+            getTableHeader().repaint();
 
-        private static final int EPSILON = 5;
-        private static final Cursor EAST = Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR);
-        private static final Cursor WEST = Cursor.getPredefinedCursor(Cursor.W_RESIZE_CURSOR);
-
-        private JTableHeader header;
-        private SortButtonRenderer renderer;
-        private JTable table;
-
-        private TableColumnPreferences tableColumnPreferences;
+            if (isEditing()) {
+                getCellEditor().stopCellEditing();
+            }
 
-        public CayenneTableHeaderListener(JTableHeader header, SortButtonRenderer renderer) {
-            this.header = header;
-            this.renderer = renderer;
-            table = header.getTable();
+            model.sortByColumn(sortCol, order);
         }
+    }
+
+    class HeaderListener extends MouseAdapter {
 
         @Override
         public void mouseClicked(MouseEvent e) {
+            JTableHeader header = getTableHeader();
             if (e.getClickCount() > 1 && isResizeCursor()) {
                 resize(getLeftColumn(e.getPoint()));
             } else if (!isResizeCursor()) {
                 int col = header.columnAtPoint(e.getPoint());
-                int sortCol = table.convertColumnIndexToModel(col);
-                if (renderer.isSortingEnabled() && ((CayenneTableModel) table.getModel()).isColumnSortable(sortCol)) {
+                int sortCol = convertColumnIndexToModel(col);
+                if (renderer.isSortingEnabled() && ((CayenneTableModel) getModel()).isColumnSortable(sortCol)) {
                     boolean isAscent = SortButtonRenderer.DOWN != renderer.getState(col);
                     sortByDefinedColumn(col, sortCol, isAscent);
-                    tableColumnPreferences.setSortOrder(isAscent);
-                    tableColumnPreferences.setSortColumn(sortCol);
+                    columnPreferences.setSortOrder(isAscent);
+                    columnPreferences.setSortColumn(sortCol);
                 }
             }
         }
 
+        @Override
         public void mouseReleased(MouseEvent e) {
-            header.repaint();
-        }
-
-        public void sortByDefinedColumn(int col, int sortCol, boolean order) {
-            CayenneTableModel model = (CayenneTableModel) table.getModel();
-            if (renderer.isSortingEnabled() && model.isColumnSortable(sortCol)) {
-                renderer.setSelectedColumn(col, order);
-                header.repaint();
-
-                if (table.isEditing()) {
-                    table.getCellEditor().stopCellEditing();
-                }
-
-                model.sortByColumn(sortCol, order);
-            }
-        }
-
-        public void setPreferences(TableColumnPreferences tableColumnPreferences) {
-            if (this.tableColumnPreferences == null) {
-                this.tableColumnPreferences = tableColumnPreferences;
-            }
+            getTableHeader().repaint();
         }
 
         private boolean isResizeCursor() {
-            Cursor cursor = table.getTableHeader().getCursor();
-            return cursor.equals(EAST) || cursor.equals(WEST);
+            Cursor cursor = getTableHeader().getCursor();
+            return cursor.equals(east) || cursor.equals(west);
         }
 
         private int getLeftColumn(Point pt) {
             pt.x -= EPSILON;
-            return table.getTableHeader().columnAtPoint(pt);
+            return getTableHeader().columnAtPoint(pt);
         }
 
         private void resize(int col) {
-            TableColumnModel tcm = table.getColumnModel();
-            TableColumn tc = tcm.getColumn(col);
+            TableColumn tc = getColumnModel().getColumn(col);
             TableCellRenderer tcr = tc.getHeaderRenderer();
             if (tcr == null)
-                tcr = table.getTableHeader().getDefaultRenderer();
+                tcr = getTableHeader().getDefaultRenderer();
             Object obj = tc.getHeaderValue();
-            Component comp = tcr.getTableCellRendererComponent(table, obj, false, false, 0, 0);
+            Component comp = tcr.getTableCellRendererComponent(CayenneTable.this, obj, false, false, 0, 0);
             int maxWidth = comp.getPreferredSize().width;
 
-            for (int i = 0, ub = table.getRowCount(); i != ub; ++i) {
-                tcr = table.getCellRenderer(i, col);
-                obj = table.getValueAt(i, col);
-                comp = tcr.getTableCellRendererComponent(table, obj, false, false, i, col);
+            for (int i = 0, ub = getRowCount(); i != ub; ++i) {
+                tcr = getCellRenderer(i, col);
+                obj = getValueAt(i, col);
+                comp = tcr.getTableCellRendererComponent(CayenneTable.this, obj, false, false, i, col);
                 int w = comp.getPreferredSize().width;
                 if (w > maxWidth)
                     maxWidth = w;
@@ -354,6 +319,5 @@ public class CayenneTable extends JTable {
             tc.setPreferredWidth(maxWidth);
             tc.setWidth(maxWidth);
         }
-
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ExpressionConvertor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/ExpressionConvertor.java
similarity index 70%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ExpressionConvertor.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/ExpressionConvertor.java
index c327efba5..67cb55aa2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ExpressionConvertor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/ExpressionConvertor.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.ui.project.editor;
 
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionException;
@@ -25,25 +25,13 @@ import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.exp.parser.ParseException;
 import org.apache.cayenne.util.Util;
 
-/**
- * A Scope convertor that allows to display expressions in text fields.
- */
 public class ExpressionConvertor {
 
-    public String valueAsString(Object value) throws IllegalArgumentException {
-        if (value == null) {
-            return null;
-        }
-
-        if (!(value instanceof Expression)) {
-            throw new IllegalArgumentException(
-                "Unsupported value class: " + value.getClass().getName());
-        }
-
-        return value.toString();
+    public static String asString(Expression value) throws IllegalArgumentException {
+        return value != null ? value.toString() : null;
     }
 
-    public Object stringAsValue(String string) throws IllegalArgumentException {
+    public static Expression fromString(String string) throws IllegalArgumentException {
         if (string == null || string.trim().length() == 0) {
             return null;
         }
@@ -53,16 +41,11 @@ public class ExpressionConvertor {
         } catch (ExpressionException eex) {
             // this is likely a parse exception... show detailed message
             Throwable cause = Util.unwindException(eex);
-            String message =
-                (cause instanceof ParseException)
+            String message = (cause instanceof ParseException)
                     ? cause.getMessage()
                     : "Invalid expression: " + string;
 
             throw new IllegalArgumentException(message);
         }
     }
-
-    public boolean supportsStringAsValue() {
-        return true;
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
index 47bab7617..4ac063246 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
@@ -22,24 +22,23 @@ package org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.action.CreateObjEntityFromDbAction;
 import org.apache.cayenne.modeler.action.CreateRelationshipAction;
 import org.apache.cayenne.modeler.action.DbEntityCounterpartAction;
 import org.apache.cayenne.modeler.action.DbEntitySyncAction;
-import org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
+import org.apache.cayenne.modeler.ui.project.ProjectController;
+import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
-import org.apache.cayenne.modeler.util.ExpressionConvertor;
+import org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
@@ -184,7 +183,7 @@ public class DbEntityMainView extends JPanel implements ExistingSelectionProcess
         name.setText(entity.getName());
         catalog.setText(entity.getCatalog());
         schema.setText(entity.getSchema());
-        qualifier.setText(new ExpressionConvertor().valueAsString(entity.getQualifier()));
+        qualifier.setText(ExpressionConvertor.asString(entity.getQualifier()));
         comment.setText(getComment(entity));
 
         String type = PK_DEFAULT_GENERATOR;
@@ -281,12 +280,10 @@ public class DbEntityMainView extends JPanel implements ExistingSelectionProcess
         DbEntity ent = controller.getSelectedDbEntity();
 
         if (ent != null && !Util.nullSafeEquals(ent.getQualifier(), qualifier)) {
-            ExpressionConvertor convertor = new ExpressionConvertor();
             try {
-                String oldQualifier = convertor.valueAsString(ent.getQualifier());
+                String oldQualifier = ExpressionConvertor.asString(ent.getQualifier());
                 if (!Util.nullSafeEquals(oldQualifier, qualifier)) {
-                    Expression exp = (Expression) convertor.stringAsValue(qualifier);
-                    ent.setQualifier(exp);
+                    ent.setQualifier(ExpressionConvertor.fromString(qualifier));
                     controller.fireDbEntityEvent(new EntityEvent(this, ent));
                 }
             } catch (IllegalArgumentException ex) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index d9c5c2819..819445b16 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -19,11 +19,9 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.objentity.main;
 
-import org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.EntityResolver;
@@ -31,25 +29,26 @@ import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.action.CreateRelationshipAction;
 import org.apache.cayenne.modeler.action.ObjEntityCounterpartAction;
 import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.classname.ClassNameUpdaterController;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.duplicates.DuplicatedAttributesDialog;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayListener;
-import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
 import org.apache.cayenne.modeler.swing.CellRenderers;
-import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
-import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.ExpressionConvertor;
+import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
+import org.apache.cayenne.modeler.ui.project.ProjectController;
+import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
+import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.classname.ClassNameUpdaterController;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.duplicates.DuplicatedAttributesDialog;
+import org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
+import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
-import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
 
@@ -281,7 +280,7 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         isAbstract.setSelected(entity.isAbstract());
         comment.setText(getComment(entity));
 
-        qualifier.setText(new ExpressionConvertor().valueAsString(entity.getDeclaredQualifier()));
+        qualifier.setText(ExpressionConvertor.asString(entity.getDeclaredQualifier()));
 
         // TODO: fix inheritance - we should allow to select optimistic
         // lock if superclass is not already locked,
@@ -353,12 +352,10 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
 
         ObjEntity entity = controller.getSelectedObjEntity();
         if (entity != null) {
-            ExpressionConvertor convertor = new ExpressionConvertor();
             try {
-                String oldQualifier = convertor.valueAsString(entity.getDeclaredQualifier());
+                String oldQualifier = ExpressionConvertor.asString(entity.getDeclaredQualifier());
                 if (!Util.nullSafeEquals(oldQualifier, text)) {
-                    Expression exp = (Expression) convertor.stringAsValue(text);
-                    entity.setDeclaredQualifier(exp);
+                    entity.setDeclaredQualifier(ExpressionConvertor.fromString(text));
                     controller.fireObjEntityEvent(new EntityEvent(this, entity));
                 }
             } catch (IllegalArgumentException ex) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
index 2848333b1..b564ac8ab 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
@@ -19,17 +19,9 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.query.selectquery;
 
-import org.apache.cayenne.modeler.ui.project.editor.query.BaseQueryMainTab;
-import org.apache.cayenne.modeler.ui.project.editor.query.ObjectQueryPropertiesPanel;
-
-import java.awt.BorderLayout;
-import java.util.Arrays;
-import java.util.Iterator;
-
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JCheckBox;
-
-import org.apache.cayenne.modeler.event.model.QueryEvent;
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.exp.parser.ASTPath;
@@ -38,19 +30,23 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
+import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
+import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
+import org.apache.cayenne.modeler.ui.project.editor.query.BaseQueryMainTab;
+import org.apache.cayenne.modeler.ui.project.editor.query.ObjectQueryPropertiesPanel;
 import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.ExpressionConvertor;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
 
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
+import javax.swing.*;
+import java.awt.*;
+import java.util.Arrays;
+import java.util.Iterator;
 
 /**
  * A tabbed pane that contains editors for various SelectQuery parts.
@@ -176,18 +172,12 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
                 : null;
     }
 
-    /**
-     * Initializes Query qualifier from string.
-     */
     void setQueryQualifier(String text) {
-        if (text != null && text.trim().length() == 0) {
+        if (text != null && text.trim().isEmpty()) {
             text = null;
         }
 
-        Expression qualifier = createQualifier(text);
-
-        //getQuery() is not null if we reached here
-        getQuery().setQualifier((qualifier));
+        getQuery().setQualifier(createQualifier(text));
         controller.fireQueryEvent(new QueryEvent(this, getQuery()));
     }
 
@@ -204,11 +194,10 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
             return null;
         }
 
-        ExpressionConvertor convertor = new ExpressionConvertor();
         try {
-            String oldQualifier = convertor.valueAsString(query.getQualifier());
+            String oldQualifier = ExpressionConvertor.asString(query.getQualifier());
             if (!Util.nullSafeEquals(oldQualifier, text)) {
-                Expression exp = (Expression) convertor.stringAsValue(text);
+                Expression exp = ExpressionConvertor.fromString(text);
 
                 /*
                  * Advanced checking. See CAY-888 #1


(cayenne) 02/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 7144b20e25c4e420c8414fcae2c62e38c9eeab0f
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
    
    .. don't expose Application.injector. Instead, let Application be a facade to all the services
---
 .../org/apache/cayenne/modeler/Application.java    | 49 ++++++++++++++++++++--
 .../modeler/action/ImportDataMapAction.java        |  2 +-
 .../cayenne/modeler/action/MigrateAction.java      |  3 +-
 .../cayenne/modeler/action/OpenProjectAction.java  |  5 +--
 .../apache/cayenne/modeler/action/SaveAction.java  |  2 +-
 .../cayenne/modeler/action/SaveAsAction.java       |  4 +-
 .../cayenne/modeler/action/ValidateAction.java     |  3 +-
 .../cayenne/modeler/pref/DBConnectionInfo.java     |  5 +--
 .../cayenne/modeler/ui/ModelerController.java      |  5 +--
 .../modeler/ui/dbgen/TableSelectorController.java  |  2 +-
 .../modeler/ui/project/ProjectController.java      |  3 +-
 .../validation/ValidationTabController.java        |  2 +-
 12 files changed, 59 insertions(+), 26 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index 942cb4b22..b879114ed 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -20,11 +20,15 @@
 package org.apache.cayenne.modeler;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataMapLoader;
+import org.apache.cayenne.configuration.runtime.DbAdapterFactory;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.OpenProjectAction;
+import org.apache.cayenne.modeler.platform.PlatformInitializer;
 import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
 import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
@@ -34,7 +38,12 @@ import org.apache.cayenne.modeler.undo.CayenneUndoManager;
 import org.apache.cayenne.modeler.util.AdapterMapping;
 import org.apache.cayenne.modeler.pref.CayennePreference;
 import org.apache.cayenne.modeler.pref.CayenneProjectPreferences;
+import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 import org.apache.cayenne.project.Project;
+import org.apache.cayenne.project.ProjectLoader;
+import org.apache.cayenne.project.ProjectSaver;
+import org.apache.cayenne.project.upgrade.UpgradeService;
+import org.apache.cayenne.project.validation.ProjectValidator;
 import org.apache.cayenne.util.IDUtil;
 
 import javax.swing.*;
@@ -107,10 +116,6 @@ public class Application {
         return newProjectTemporaryName;
     }
 
-    public Injector getInjector() {
-        return injector;
-    }
-
     public Project getProject() {
         return getFrameController().getProjectController().getProject();
     }
@@ -136,6 +141,42 @@ public class Application {
         return injector.getInstance(ActionManager.class);
     }
 
+    public ProjectValidator getProjectValidator() {
+        return injector.getInstance(ProjectValidator.class);
+    }
+
+    public ProjectSaver getProjectSaver() {
+        return injector.getInstance(ProjectSaver.class);
+    }
+
+    public ProjectLoader getProjectLoader() {
+        return injector.getInstance(ProjectLoader.class);
+    }
+
+    public DataMapLoader getDataMapLoader() {
+        return injector.getInstance(DataMapLoader.class);
+    }
+
+    public UpgradeService getUpgradeService() {
+        return injector.getInstance(UpgradeService.class);
+    }
+
+    public PlatformInitializer getPlatformInitializer() {
+        return injector.getInstance(PlatformInitializer.class);
+    }
+
+    public ConfigurationNodeParentGetter getConfigurationNodeParentGetter() {
+        return injector.getInstance(ConfigurationNodeParentGetter.class);
+    }
+
+    public DbAdapterFactory getDbAdapterFactory() {
+        return injector.getInstance(DbAdapterFactory.class);
+    }
+
+    public MergerTokenFactoryProvider getMergerTokenFactoryProvider() {
+        return injector.getInstance(MergerTokenFactoryProvider.class);
+    }
+
     public CayenneUndoManager getUndoManager() {
         return undoManager;
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
index 0398b2f04..5d32b59e0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
@@ -72,7 +72,7 @@ public class ImportDataMapAction extends ModelerAbstractAction {
 
         try {
             URL url = dataMapFile.toURI().toURL();
-            DataMapLoader loader = application.getInjector().getInstance(DataMapLoader.class);
+            DataMapLoader loader = application.getDataMapLoader();
             newMap = loader.load(new URLResource(url));
 
             ConfigurationNode root = getProjectController().getProject().getRootNode();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
index a3da712d3..95953a9ba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
@@ -74,8 +74,7 @@ public class MigrateAction extends DBConnectionAwareAction {
         String selectedCatalog = optionsDialog == null ? null : optionsDialog.getSelectedCatalog();
         String selectedSchema = optionsDialog == null ? null : optionsDialog.getSelectedSchema();
 
-        MergerTokenFactoryProvider mergerTokenFactoryProvider =
-                application.getInjector().getInstance(MergerTokenFactoryProvider.class);
+        MergerTokenFactoryProvider mergerTokenFactoryProvider = application.getMergerTokenFactoryProvider();
 
         // ... show dialog...
         new MergerOptionsController(
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java
index e46627771..d069b5cc2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.ui.errors.ErrorsController;
 import org.apache.cayenne.project.Project;
-import org.apache.cayenne.project.ProjectLoader;
 import org.apache.cayenne.project.upgrade.UpgradeMetaData;
 import org.apache.cayenne.project.upgrade.UpgradeService;
 import org.apache.cayenne.resource.Resource;
@@ -145,7 +144,7 @@ public class OpenProjectAction extends ProjectAction {
             URL url = file.toURI().toURL();
             Resource rootSource = new URLResource(url);
 
-            UpgradeService upgradeService = application.getInjector().getInstance(UpgradeService.class);
+            UpgradeService upgradeService = application.getUpgradeService();
             UpgradeMetaData metaData = upgradeService.getUpgradeType(rootSource);
             switch (metaData.getUpgradeType()) {
                 case INTERMEDIATE_UPGRADE_NEEDED:
@@ -185,7 +184,7 @@ public class OpenProjectAction extends ProjectAction {
     }
 
     private Project openProjectResourse(Resource resource, ModelerController controller) {
-        Project project = application.getInjector().getInstance(ProjectLoader.class).loadProject(resource);
+        Project project = application.getProjectLoader().loadProject(resource);
         controller.onProjectOpened(project);
         return project;
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAction.java
index dfbbc19f0..9b7ceda4b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAction.java
@@ -60,7 +60,7 @@ public class SaveAction extends SaveAsAction {
         File oldProjectFile = new File(p.getConfigurationResource().getURL().toURI());
 
         getProjectController().pauseFileChangeTracking();
-        ProjectSaver saver = application.getInjector().getInstance(ProjectSaver.class);
+        ProjectSaver saver = application.getProjectSaver();
         saver.save(p);
 
         RenamedPreferences.removeOldPreferences();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java
index ede238418..5c33c3ea7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java
@@ -90,7 +90,7 @@ public class SaveAsAction extends ModelerAbstractAction {
 
         URLResource res = new URLResource(projectDir.toURI().toURL());
 
-        ProjectSaver saver = application.getInjector().getInstance(ProjectSaver.class);
+        ProjectSaver saver = application.getProjectSaver();
 
         boolean isNewProject = p.getConfigurationResource() == null;
         Preferences tempOldPref = null;
@@ -151,7 +151,7 @@ public class SaveAsAction extends ModelerAbstractAction {
 
     public void performAction() {
 
-        ProjectValidator projectValidator = application.getInjector().getInstance(ProjectValidator.class);
+        ProjectValidator projectValidator = application.getProjectValidator();
         ValidationResult validationResult = projectValidator.validate(getCurrentProject().getRootNode());
         
         getProjectController().fireProjectOnSaveEvent(new ProjectOnSaveEvent(SaveAsAction.class));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ValidateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ValidateAction.java
index 4ef487a8c..0f23a8630 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ValidateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ValidateAction.java
@@ -50,8 +50,7 @@ public class ValidateAction extends ModelerAbstractAction {
     @Override
     public void performAction(ActionEvent e) {
 
-        ProjectValidator projectValidator = application.getInjector().getInstance(
-                ProjectValidator.class);
+        ProjectValidator projectValidator = application.getProjectValidator();
         ValidationResult validationResult = projectValidator.validate(getCurrentProject()
                 .getRootNode());
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java
index 6370e2465..107cad5f4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java
@@ -21,7 +21,6 @@ package org.apache.cayenne.modeler.pref;
 
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.DataSourceDescriptor;
-import org.apache.cayenne.configuration.runtime.DbAdapterFactory;
 import org.apache.cayenne.datasource.DriverDataSource;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.modeler.Application;
@@ -168,9 +167,7 @@ public class DBConnectionInfo extends CayennePreference {
 		DataNodeDescriptor descriptor = new DataNodeDescriptor();
 		descriptor.setAdapterType(getDbAdapter());
 		DataSource dataSource = makeDataSource(classLoader);
-		return Application.getInstance().getInjector()
-				.getInstance(DbAdapterFactory.class)
-				.createAdapter(descriptor, dataSource);
+		return Application.getInstance().getDbAdapterFactory().createAdapter(descriptor, dataSource);
 	}
 
 	/**
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
index 4f97185fa..58bd425bf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
@@ -24,7 +24,6 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.action.ExitAction;
 import org.apache.cayenne.modeler.action.OpenProjectAction;
 import org.apache.cayenne.modeler.mvc.RootController;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
@@ -69,7 +68,7 @@ public class ModelerController extends RootController {
         super(application);
 
         this.view = new ModelerFrame(application.getActionManager(), application.getLogConsoleController());
-        application.getInjector().getInstance(PlatformInitializer.class).setupMenus(view);
+        application.getPlatformInitializer().setupMenus(view);
         this.projectController = new ProjectController(this);
         this.dbImportController = new DbImportController();
     }
@@ -214,7 +213,7 @@ public class ModelerController extends RootController {
             allFailures.addAll(loadFailures);
         }
 
-        ProjectValidator projectValidator = getApplication().getInjector().getInstance(ProjectValidator.class);
+        ProjectValidator projectValidator = getApplication().getProjectValidator();
         ValidationResult validationResult = projectValidator.validate(project.getRootNode());
         allFailures.addAll(validationResult.getFailures());
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java
index 0c82c09d2..4cb6bff44 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java
@@ -136,7 +136,7 @@ public class TableSelectorController extends ChildController<ProjectController>
         validationMessages.clear();
 
         Project project = getApplication().getProject();
-        ProjectValidator projectValidator = getApplication().getInjector().getInstance(ProjectValidator.class);
+        ProjectValidator projectValidator = getApplication().getProjectValidator();
         ValidationResult validationResult = projectValidator.validate(project.getRootNode());
 
         if (validationResult.getFailures().size() > 0) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
index ad206f45f..19b3ef398 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
@@ -223,8 +223,7 @@ public class ProjectController extends ChildController<ModelerController> {
         } else if (getSelectedPaths() != null) { // multiple objects
             ConfigurationNode[] paths = getSelectedPaths();
 
-            ConfigurationNodeParentGetter parentGetter = getApplication().getInjector()
-                    .getInstance(ConfigurationNodeParentGetter.class);
+            ConfigurationNodeParentGetter parentGetter = getApplication().getConfigurationNodeParentGetter();
             Object parent = parentGetter.getParent(paths[0]);
 
             List<ConfigurationNode> result = new ArrayList<>(Arrays.asList(paths));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java
index 345bae085..3104d32ff 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java
@@ -46,7 +46,7 @@ public class ValidationTabController implements DomainListener, ValidationConfig
 
     public ValidationTabController(ProjectController projectController) {
         this.projectController = projectController;
-        this.metaData = projectController.getApplication().getInjector().getInstance(DataChannelMetaData.class);
+        this.metaData = projectController.getApplication().getMetaData();
         this.view = new ValidationTab(this);
     }
 


(cayenne) 13/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 6c05cd892e123508d98821b0bbc46493c933ba84
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 15:36:50 2026 -0400

    Modeler cleanup
    
    DB Import actions moved to a more narrow scope
---
 .../modeler/action/DefaultActionManager.java       |  29 ----
 .../editor/datamap/dbimport/CatalogPopUpMenu.java  |   5 +-
 .../editor/datamap/dbimport/DbImportTree.java      |  14 +-
 .../datamap/dbimport/DbImportTreeCellEditor.java   |  19 +--
 .../editor/datamap/dbimport/DbImportView.java      | 117 +++++++-------
 .../editor/datamap/dbimport/DefaultPopUpMenu.java  |  17 +--
 .../datamap/dbimport/DraggableTreePanel.java       |  78 ++--------
 .../datamap/dbimport/IncludeTablePopUpMenu.java    |   5 +-
 .../dbimport/ReverseEngineeringConfigPanel.java    |  19 +--
 .../dbimport/ReverseEngineeringTreePanel.java      |  40 +++--
 .../editor/datamap/dbimport/RootPopUpMenu.java     |  36 ++---
 .../editor/datamap/dbimport/SchemaPopUpMenu.java   |   5 +-
 .../editor/datamap/dbimport/TreeToolbarPanel.java  | 123 +++++----------
 .../datamap/dbimport/action}/AddCatalogAction.java |   7 +-
 .../dbimport/action}/AddExcludeColumnAction.java   |   7 +-
 .../action}/AddExcludeProcedureAction.java         |   7 +-
 .../dbimport/action}/AddExcludeTableAction.java    |   7 +-
 .../dbimport/action}/AddIncludeColumnAction.java   |   7 +-
 .../action}/AddIncludeProcedureAction.java         |   7 +-
 .../dbimport/action}/AddIncludeTableAction.java    |   7 +-
 .../dbimport/action}/AddPatternParamAction.java    |  18 +--
 .../datamap/dbimport/action}/AddSchemaAction.java  |   7 +-
 .../datamap/dbimport/action/DbImportActions.java   | 168 +++++++++++++++++++++
 .../datamap/dbimport/action}/DeleteNodeAction.java |  32 ++--
 .../dbimport/action}/DragAndDropNodeAction.java    |   7 +-
 .../datamap/dbimport/action}/EditNodeAction.java   |   9 +-
 .../dbimport}/action/GetDbConnectionAction.java    |   3 +-
 .../dbimport}/action/LoadDbSchemaAction.java       |  42 +++---
 .../dbimport/action}/MoveImportNodeAction.java     |  46 +++---
 .../dbimport/action}/MoveInvertNodeAction.java     |   9 +-
 .../datamap/dbimport}/action/SortNodesAction.java  |   8 +-
 .../dbimport/action}/TreeManipulationAction.java   |  48 +++---
 32 files changed, 485 insertions(+), 468 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
index bed2591ec..80193f326 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
@@ -22,19 +22,6 @@ import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.dbimport.AddCatalogAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddSchemaAction;
-import org.apache.cayenne.modeler.action.dbimport.DeleteNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.DragAndDropNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.EditNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.MoveImportNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.MoveInvertNodeAction;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 
@@ -201,22 +188,6 @@ public class DefaultActionManager implements ActionManager {
         registerAction(new ImportEOModelAction(application));
         registerAction(new GenerateDBAction(application));
         registerAction(new MigrateAction(application));
-        registerAction(new AddSchemaAction(application)).setAlwaysOn(true);
-        registerAction(new AddCatalogAction(application)).setAlwaysOn(true);
-        registerAction(new AddIncludeTableAction(application)).setAlwaysOn(true);
-        registerAction(new AddExcludeTableAction(application)).setAlwaysOn(true);
-        registerAction(new AddIncludeColumnAction(application)).setAlwaysOn(true);
-        registerAction(new AddExcludeColumnAction(application)).setAlwaysOn(true);
-        registerAction(new AddIncludeProcedureAction(application)).setAlwaysOn(true);
-        registerAction(new AddExcludeProcedureAction(application)).setAlwaysOn(true);
-        registerAction(new GetDbConnectionAction(application)).setAlwaysOn(true);
-        registerAction(new EditNodeAction(application)).setAlwaysOn(true);
-        registerAction(new DeleteNodeAction(application)).setAlwaysOn(true);
-        registerAction(new MoveImportNodeAction(application)).setAlwaysOn(true);
-        registerAction(new DragAndDropNodeAction(application)).setAlwaysOn(true);
-        registerAction(new LoadDbSchemaAction(application)).setAlwaysOn(true);
-        registerAction(new SortNodesAction(application)).setAlwaysOn(true);
-        registerAction(new MoveInvertNodeAction(application)).setAlwaysOn(true);
         registerAction(new AboutAction(application)).setAlwaysOn(true);
         registerAction(new DocumentationAction(application)).setAlwaysOn(true);
         registerAction(new ConfigurePreferencesAction(application)).setAlwaysOn(true);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/CatalogPopUpMenu.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/CatalogPopUpMenu.java
index 934fde9c9..0b6524c65 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/CatalogPopUpMenu.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/CatalogPopUpMenu.java
@@ -19,9 +19,12 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
+
 public class CatalogPopUpMenu extends RootPopUpMenu {
 
-    public CatalogPopUpMenu() {
+    public CatalogPopUpMenu(DbImportActions actions) {
+        super(actions);
         delete.setVisible(true);
         rename.setVisible(true);
         addCatalog.setVisible(false);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTree.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTree.java
index 281d9fb7a..a99e64578 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTree.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTree.java
@@ -27,8 +27,7 @@ import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.LoadDbSchemaAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.LoadDbSchemaAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.TransferableNode;
 
@@ -49,6 +48,7 @@ public class DbImportTree extends JTree {
 
     private boolean isTransferable;
     private ReverseEngineering reverseEngineering;
+    private LoadDbSchemaAction loadDbSchemaAction;
 
     public DbImportTree(TreeNode node) {
         super(node);
@@ -57,6 +57,10 @@ public class DbImportTree extends JTree {
         createTreeExpandListener();
     }
 
+    public void setLoadDbSchemaAction(LoadDbSchemaAction loadDbSchemaAction) {
+        this.loadDbSchemaAction = loadDbSchemaAction;
+    }
+
     public void translateReverseEngineeringToTree(ReverseEngineering reverseEngineering, boolean isTransferable) {
         this.isTransferable = isTransferable;
         this.reverseEngineering = reverseEngineering;
@@ -341,9 +345,9 @@ public class DbImportTree extends JTree {
                 DbImportTreeNode node = (DbImportTreeNode) lastPathComponent;
                 if ((node.isIncludeTable() || node.isSchema() || node.isCatalog()) && !node.isLoaded()) {
                     //reload tables and columns action.
-
-                    LoadDbSchemaAction action = Application.getInstance().getActionManager().getAction(LoadDbSchemaAction.class);
-                    action.loadDbSchema(path);
+                    if (loadDbSchemaAction != null) {
+                        loadDbSchemaAction.loadDbSchema(path);
+                    }
                 }
             }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTreeCellEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTreeCellEditor.java
index 7e4270a08..ed43e346d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTreeCellEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportTreeCellEditor.java
@@ -19,9 +19,9 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.dbimport.DeleteNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.EditNodeAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DeleteNodeAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.EditNodeAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.util.Util;
 
@@ -38,10 +38,11 @@ import java.util.regex.Pattern;
 
 public class DbImportTreeCellEditor extends DefaultTreeCellEditor {
 
-    private ProjectController projectController;
+    private final DbImportActions actions;
 
-    public DbImportTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
+    public DbImportTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer, DbImportActions actions) {
         super(tree, renderer);
+        this.actions = actions;
         setFont(UIManager.getFont("Tree.font"));
         this.addCellEditorListener(new CellEditorListener() {
             @Override
@@ -104,13 +105,13 @@ public class DbImportTreeCellEditor extends DefaultTreeCellEditor {
             return;
         }
         if (!Util.isEmptyString(super.getCellEditorValue().toString()) && !insertableNodeExist() && (isValidReverseEngineering())) {
-            EditNodeAction action = projectController.getApplication().getActionManager().getAction(EditNodeAction.class);
+            EditNodeAction action = actions.getEditNodeAction();
             action.setActionName(super.getCellEditorValue().toString());
             action.actionPerformed(null);
         } else {
             DbImportTreeNode selectedNode = (DbImportTreeNode) tree.getSelectionPath().getLastPathComponent();
             if (Util.isEmptyString(selectedNode.getSimpleNodeName()) || (insertableNodeExist())) {
-                DeleteNodeAction action = projectController.getApplication().getActionManager().getAction(DeleteNodeAction.class);
+                DeleteNodeAction action = actions.getDeleteNodeAction();
                 TreePath parentPath = tree.getSelectionPath().getParentPath();
                 action.actionPerformed(null);
                 tree.setSelectionPath(parentPath);
@@ -147,8 +148,4 @@ public class DbImportTreeCellEditor extends DefaultTreeCellEditor {
         }
         return false;
     }
-
-    public void setProjectController(ProjectController projectController) {
-        this.projectController = projectController;
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
index 6e3630f84..44da66703 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
@@ -22,9 +22,10 @@ import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.action.LoadDbSchemaAction;
 import org.apache.cayenne.modeler.action.ReverseEngineeringAction;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.LoadDbSchemaAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.ColorTreeRenderer;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.TransferableNode;
@@ -38,21 +39,17 @@ import java.awt.event.ActionEvent;
 
 public class DbImportView extends JPanel {
 
-    private static final String MAIN_LAYOUT = "fill:160dlu:grow, 5dlu, fill:50dlu, 5dlu, fill:160dlu:grow";
-    private static final String HEADER_LAYOUT = "fill:80dlu:grow";
-    private static final String BUTTON_PANEL_LAYOUT = "fill:50dlu";
-    private static final String PROGRESS_PANEL_LAYOUT = "fill:160dlu:grow, 60dlu, fill:160dlu:grow";
     private static final int ALL_LINE_SPAN = 5;
     private static final ImageIcon rightArrow = ModelerUtil.buildIcon("icon-arrow-closed.png");
     private static final ImageIcon downArrow = ModelerUtil.buildIcon("icon-arrow-open.png");
 
-    private TreeToolbarPanel treeToolbar;
-    private ReverseEngineeringTreePanel treePanel;
-    private ReverseEngineeringConfigPanel configPanel;
-    private DraggableTreePanel draggableTreePanel;
-    private JProgressBar loadDbSchemaProgress;
-    private JProgressBar reverseEngineeringProgress;
-    private ModelerAbstractAction.CayenneToolbarButton loadDbSchemaButton;
+    private final TreeToolbarPanel treeToolbar;
+    private final ReverseEngineeringTreePanel treePanel;
+    private final ReverseEngineeringConfigPanel configPanel;
+    private final DraggableTreePanel draggableTreePanel;
+    private final JProgressBar loadDbSchemaProgress;
+    private final JProgressBar reverseEngineeringProgress;
+    private final ModelerAbstractAction.CayenneToolbarButton loadDbSchemaButton;
 
     private final ProjectController controller;
 
@@ -60,36 +57,62 @@ public class DbImportView extends JPanel {
 
     public DbImportView(ProjectController controller) {
         this.controller = controller;
-        this.initFromModel = false;
-        initFormElements();
-        buildForm();
-        draggableTreePanel.getSourceTree().repaint();
-    }
 
-    private void buildForm() {
-        FormLayout buttonPanelLayout = new FormLayout(BUTTON_PANEL_LAYOUT);
+        DbImportTreeNode root = new DbImportTreeNode(new ReverseEngineering());
+        DbImportTreeNode draggableTreeRoot = new DbImportTreeNode(new ReverseEngineering());
+        DbImportTree reverseEngineeringTree = new DbImportTree(root);
+        DbImportTree draggableTree = new DbImportTree(new TransferableNode(draggableTreeRoot));
+        DbImportModel model = new DbImportModel(root);
+        model.setCanBeCleaned(true);
+        DbImportModel draggableTreeModel = new DbImportModel(draggableTreeRoot);
+        draggableTreeModel.setCanBeCleaned(false);
+
+        draggableTree.setRootVisible(false);
+        draggableTree.setShowsRootHandles(true);
+        draggableTree.setModel(draggableTreeModel);
+        reverseEngineeringTree.setRootVisible(false);
+        reverseEngineeringTree.setModel(model);
+        reverseEngineeringTree.setShowsRootHandles(true);
+
+        DbImportActions actions = new DbImportActions(controller.getApplication(), this, reverseEngineeringTree, draggableTree);
+
+        this.draggableTreePanel = new DraggableTreePanel(draggableTree, reverseEngineeringTree, actions);
+
+        draggableTree.setLoadDbSchemaAction(actions.getLoadDbSchemaAction());
+        treeToolbar = new TreeToolbarPanel(reverseEngineeringTree, actions);
+        treePanel = new ReverseEngineeringTreePanel(controller, reverseEngineeringTree, draggableTree, actions);
+        treePanel.setTreeToolbar(treeToolbar);
+        model.setDbSchemaTree(draggableTree);
+        draggableTreeModel.setDbSchemaTree(draggableTree);
+        ((ColorTreeRenderer) draggableTreePanel.getSourceTree().getCellRenderer()).
+                setReverseEngineeringTree(reverseEngineeringTree);
+
+        configPanel = new ReverseEngineeringConfigPanel(controller, this);
+        configPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
+        configPanel.setVisible(false);
+
+
+        FormLayout buttonPanelLayout = new FormLayout("fill:50dlu");
         DefaultFormBuilder buttonBuilder = new DefaultFormBuilder(buttonPanelLayout);
         buttonBuilder.append(draggableTreePanel.getMoveButton());
         buttonBuilder.append(draggableTreePanel.getMoveInvertButton());
 
-        FormLayout layout = new FormLayout(MAIN_LAYOUT);
+        FormLayout layout = new FormLayout("fill:160dlu:grow, 5dlu, fill:50dlu, 5dlu, fill:160dlu:grow");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.append(treeToolbar, ALL_LINE_SPAN);
-        FormLayout headerLayout = new FormLayout(HEADER_LAYOUT);
+        FormLayout headerLayout = new FormLayout("fill:80dlu:grow");
 
         DefaultFormBuilder reverseEngineeringHeaderBuilder = new DefaultFormBuilder(headerLayout);
         JLabel importLabel = new JLabel("Database Import Configuration");
-        importLabel.setBorder(new EmptyBorder(0, 5, 0,0));
+        importLabel.setBorder(new EmptyBorder(0, 5, 0, 0));
         reverseEngineeringHeaderBuilder.append(importLabel);
         builder.append(reverseEngineeringHeaderBuilder.getPanel());
 
         DefaultFormBuilder databaseHeaderBuilder = new DefaultFormBuilder(headerLayout);
         JLabel schemaLabel = new JLabel("Database Schema");
-        schemaLabel.setBorder(new EmptyBorder(0, 5, 0,0));
+        schemaLabel.setBorder(new EmptyBorder(0, 5, 0, 0));
         databaseHeaderBuilder.append(schemaLabel);
-        LoadDbSchemaAction loadDbSchemaAction = controller.getApplication().getActionManager().
-                getAction(LoadDbSchemaAction.class);
-        loadDbSchemaAction.setDraggableTreePanel(draggableTreePanel);
+        LoadDbSchemaAction loadDbSchemaAction = actions.getLoadDbSchemaAction();
         loadDbSchemaButton = (ModelerAbstractAction.CayenneToolbarButton) loadDbSchemaAction.buildButton(0);
         loadDbSchemaButton.setShowingText(false);
         loadDbSchemaButton.setText("Refresh DB Schema");
@@ -121,7 +144,7 @@ public class DbImportView extends JPanel {
         loadDbSchemaProgress.setVisible(false);
         reverseEngineeringProgress.setIndeterminate(true);
         reverseEngineeringProgress.setVisible(false);
-        FormLayout progressLayout = new FormLayout(PROGRESS_PANEL_LAYOUT, "fill:10dlu");
+        FormLayout progressLayout = new FormLayout("fill:160dlu:grow, 60dlu, fill:160dlu:grow", "fill:10dlu");
         DefaultFormBuilder progressBarBuilder = new DefaultFormBuilder(progressLayout);
         progressBarBuilder.append(reverseEngineeringProgress);
         progressBarBuilder.append(loadDbSchemaProgress);
@@ -139,6 +162,7 @@ public class DbImportView extends JPanel {
                 initFromModel(map);
             }
         });
+        draggableTreePanel.getSourceTree().repaint();
     }
 
     private void createAdvancedOptionsHiderPanel(DefaultFormBuilder builder) {
@@ -159,37 +183,6 @@ public class DbImportView extends JPanel {
         builder.append(advancedOptionsPanel, ALL_LINE_SPAN);
     }
 
-    private void initFormElements() {
-        DbImportTreeNode root = new DbImportTreeNode(new ReverseEngineering());
-        DbImportTreeNode draggableTreeRoot = new DbImportTreeNode(new ReverseEngineering());
-        DbImportTree reverseEngineeringTree = new DbImportTree(root);
-        DbImportTree draggableTree = new DbImportTree(new TransferableNode(draggableTreeRoot));
-        DbImportModel model = new DbImportModel(root);
-        model.setCanBeCleaned(true);
-        DbImportModel draggableTreeModel = new DbImportModel(draggableTreeRoot);
-        draggableTreeModel.setCanBeCleaned(false);
-
-        draggableTree.setRootVisible(false);
-        draggableTree.setShowsRootHandles(true);
-        draggableTree.setModel(draggableTreeModel);
-        reverseEngineeringTree.setRootVisible(false);
-        reverseEngineeringTree.setModel(model);
-        reverseEngineeringTree.setShowsRootHandles(true);
-
-        draggableTreePanel = new DraggableTreePanel(controller, draggableTree, reverseEngineeringTree);
-        treeToolbar = new TreeToolbarPanel(controller, reverseEngineeringTree, draggableTreePanel);
-        treePanel = new ReverseEngineeringTreePanel(controller, reverseEngineeringTree, draggableTree);
-        treePanel.setTreeToolbar(treeToolbar);
-        model.setDbSchemaTree(draggableTree);
-        draggableTreeModel.setDbSchemaTree(draggableTree);
-        ((ColorTreeRenderer) draggableTreePanel.getSourceTree().getCellRenderer()).
-                setReverseEngineeringTree(reverseEngineeringTree);
-
-        configPanel = new ReverseEngineeringConfigPanel(controller, this);
-        configPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
-        configPanel.setVisible(false);
-    }
-
     public void initFromModel(DataMap map) {
         treePanel.getReverseEngineeringTree().stopEditing();
         if (map != null) {
@@ -197,7 +190,7 @@ public class DbImportView extends JPanel {
             treeToolbar.unlockButtons();
             ReverseEngineering reverseEngineering = DbImportView.this.controller.getApplication()
                     .getMetaData().get(map, ReverseEngineering.class);
-            if(reverseEngineering == null) {
+            if (reverseEngineering == null) {
                 // create config with default values
                 reverseEngineering = new ReverseEngineering();
                 DbImportView.this.controller.getApplication().getMetaData().add(map, reverseEngineering);
@@ -206,7 +199,7 @@ public class DbImportView extends JPanel {
             configPanel.initializeTextFields(reverseEngineering);
             configPanel.initStrategy(reverseEngineering);
             String[] tableTypes = reverseEngineering.getTableTypes();
-            if(tableTypes.length != 0) {
+            if (tableTypes.length != 0) {
                 configPanel.getTableTypes().setText(String.join(",", tableTypes));
             } else {
                 configPanel.getTableTypes().setText("TABLE, VIEW");
@@ -275,6 +268,10 @@ public class DbImportView extends JPanel {
         return loadDbSchemaButton;
     }
 
+    public DraggableTreePanel getDraggableTreePanel() {
+        return draggableTreePanel;
+    }
+
     public boolean isInitFromModel() {
         return initFromModel;
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DefaultPopUpMenu.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DefaultPopUpMenu.java
index a745532e8..481733171 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DefaultPopUpMenu.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DefaultPopUpMenu.java
@@ -19,10 +19,8 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.dbimport.DeleteNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.EditNodeAction;
 
 import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
@@ -35,9 +33,10 @@ public class DefaultPopUpMenu extends JPopupMenu {
     protected DbImportTreeNode selectedElement;
     protected DbImportTreeNode parentElement;
     protected JTree tree;
-    protected ProjectController projectController;
+    protected final DbImportActions actions;
 
-    public DefaultPopUpMenu() {
+    public DefaultPopUpMenu(DbImportActions actions) {
+        this.actions = actions;
         rename = new JMenuItem("Rename");
         delete = new JMenuItem("Delete");
         this.add(rename);
@@ -48,12 +47,12 @@ public class DefaultPopUpMenu extends JPopupMenu {
     private void initListeners() {
         rename.addActionListener(e -> {
             if ((selectedElement != null) && (parentElement != null)) {
-                projectController.getApplication().getActionManager().getAction(EditNodeAction.class).actionPerformed(e);
+                actions.getEditNodeAction().actionPerformed(e);
             }
         });
         delete.addActionListener(e -> {
             if ((selectedElement != null) && (parentElement != null)) {
-                projectController.getApplication().getActionManager().getAction(DeleteNodeAction.class).actionPerformed(e);
+                actions.getDeleteNodeAction().actionPerformed(e);
             }
         });
     }
@@ -69,8 +68,4 @@ public class DefaultPopUpMenu extends JPopupMenu {
     public void setTree(JTree tree) {
         this.tree = tree;
     }
-
-    public void setProjectController(ProjectController projectController) {
-        this.projectController = projectController;
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java
index 7e1615e82..78587bb75 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java
@@ -29,30 +29,15 @@ import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.dbimport.AddCatalogAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddSchemaAction;
-import org.apache.cayenne.modeler.action.dbimport.DragAndDropNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.MoveImportNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.MoveInvertNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.TreeManipulationAction;
+import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DragAndDropNodeAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.TreeManipulationAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.ColorTreeRenderer;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.TransferableNode;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.ColorTreeRenderer;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
 
-import javax.swing.DropMode;
-import javax.swing.JButton;
-import javax.swing.JComponent;
-import javax.swing.JScrollPane;
-import javax.swing.JTree;
-import javax.swing.TransferHandler;
+import javax.swing.*;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
 import javax.swing.tree.TreePath;
@@ -80,45 +65,31 @@ public class DraggableTreePanel extends JScrollPane {
     private static final String MOVE_BUTTON_LABEL = "Include";
     private static final String MOVE_INV_BUTTON_LABEL = "Exclude";
 
-    private final ProjectController projectController;
     private final DbImportTree sourceTree;
     private final DbImportTree targetTree;
+    private final DbImportActions actions;
     private final Map<DataMap, ReverseEngineering> databaseStructures;
     private final Map<Class<?>, Integer> levels;
     private final Map<Class<?>, List<Class<?>>> insertableLevels;
-    private final Map<Class<?>, Class<? extends TreeManipulationAction>> actions;
 
     private ModelerAbstractAction.CayenneToolbarButton moveButton;
     private ModelerAbstractAction.CayenneToolbarButton moveInvertButton;
     private ImportSourceTree importSourceTree;
 
-    public DraggableTreePanel(ProjectController projectController, DbImportTree sourceTree, DbImportTree targetTree) {
+    public DraggableTreePanel(DbImportTree sourceTree, DbImportTree targetTree, DbImportActions actions) {
         super(sourceTree);
         this.targetTree = targetTree;
         this.sourceTree = sourceTree;
-        this.projectController = projectController;
+        this.actions = actions;
         this.databaseStructures = new HashMap<>();
         this.levels = new HashMap<>();
         this.insertableLevels = new HashMap<>();
-        this.actions = new HashMap<>();
 
         initLevels();
         initElement();
-        initActions();
         initListeners();
     }
 
-    private void initActions() {
-        actions.put(Catalog.class, AddCatalogAction.class);
-        actions.put(Schema.class, AddSchemaAction.class);
-        actions.put(IncludeTable.class, AddIncludeTableAction.class);
-        actions.put(ExcludeTable.class, AddExcludeTableAction.class);
-        actions.put(IncludeColumn.class, AddIncludeColumnAction.class);
-        actions.put(ExcludeColumn.class, AddExcludeColumnAction.class);
-        actions.put(IncludeProcedure.class, AddIncludeProcedureAction.class);
-        actions.put(ExcludeProcedure.class, AddExcludeProcedureAction.class);
-    }
-
     public void updateTree(DataMap dataMap) {
         DbImportModel model = (DbImportModel) sourceTree.getModel();
         model.reload();
@@ -157,20 +128,10 @@ public class DraggableTreePanel extends JScrollPane {
         sourceTree.setCellRenderer(new ColorTreeRenderer());
         sourceTree.setDropMode(DropMode.INSERT);
 
-        MoveImportNodeAction action = projectController.getApplication().getActionManager()
-                .getAction(MoveImportNodeAction.class);
-        action.setPanel(this);
-        action.setSourceTree(sourceTree);
-        action.setTargetTree(targetTree);
-        moveButton = (ModelerAbstractAction.CayenneToolbarButton) action.buildButton();
+        moveButton = (ModelerAbstractAction.CayenneToolbarButton) actions.getMoveImportNodeAction().buildButton();
         moveButton.setShowingText(true);
         moveButton.setText(MOVE_BUTTON_LABEL);
-        MoveInvertNodeAction actionInv = projectController.getApplication().getActionManager()
-                .getAction(MoveInvertNodeAction.class);
-        actionInv.setPanel(this);
-        actionInv.setSourceTree(sourceTree);
-        actionInv.setTargetTree(targetTree);
-        moveInvertButton = (ModelerAbstractAction.CayenneToolbarButton) actionInv.buildButton();
+        moveInvertButton = (ModelerAbstractAction.CayenneToolbarButton) actions.getMoveInvertNodeAction().buildButton();
         moveInvertButton.setShowingText(true);
         moveInvertButton.setText(MOVE_INV_BUTTON_LABEL);
     }
@@ -251,11 +212,7 @@ public class DraggableTreePanel extends JScrollPane {
     }
 
     public TreeManipulationAction getActionByNodeType(Class<?> nodeType) {
-        Class<? extends TreeManipulationAction> actionClass = actions.get(nodeType);
-        if (actionClass == null) {
-            return null;
-        }
-        return projectController.getApplication().getActionManager().getAction(actionClass);
+        return actions.getAction(nodeType);
     }
 
     public void bindReverseEngineeringToDatamap(DataMap dataMap, ReverseEngineering reverseEngineering) {
@@ -426,12 +383,7 @@ public class DraggableTreePanel extends JScrollPane {
             }
             DbImportTreeNode[] nodes = getNodesFromSupport(support);
             if (nodes != null) {
-                MoveImportNodeAction action = projectController.getApplication().getActionManager()
-                        .getAction(MoveImportNodeAction.class);
-                action.setSourceTree(sourceTree);
-                action.setTargetTree(targetTree);
-                action.setPanel(DraggableTreePanel.this);
-                action.performAction(null);
+                actions.getMoveImportNodeAction().performAction(null);
                 return true;
             }
             return false;
@@ -443,13 +395,11 @@ public class DraggableTreePanel extends JScrollPane {
 
             DbImportTreeNode[] nodes = getNodesFromSupport(support);
             if (nodes != null) {
-                DragAndDropNodeAction action = projectController.getApplication().getActionManager()
-                        .getAction(DragAndDropNodeAction.class);
+                DragAndDropNodeAction action = actions.getDragAndDropNodeAction();
                 action.setDropLocationParentNode(dropLocationParentNode);
                 action.setSourceParentNode(sourceParentNode);
                 action.setDropLocation(dropLocation);
                 action.setNodes(nodes);
-                action.setTree(targetTree);
                 action.performAction(null);
                 return true;
             }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/IncludeTablePopUpMenu.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/IncludeTablePopUpMenu.java
index 4a1eb0bd3..a98e0fb4d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/IncludeTablePopUpMenu.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/IncludeTablePopUpMenu.java
@@ -19,9 +19,12 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
+
 public class IncludeTablePopUpMenu extends RootPopUpMenu {
 
-    public IncludeTablePopUpMenu() {
+    public IncludeTablePopUpMenu(DbImportActions actions) {
+        super(actions);
         rename.setVisible(true);
         delete.setVisible(true);
         addCatalog.setVisible(false);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
index eb4a3b834..1c288cb1b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
@@ -19,23 +19,19 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JCheckBox;
-import javax.swing.JComboBox;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import java.util.Vector;
-
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.swing.WidgetFactory;
+import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
-import org.apache.cayenne.modeler.swing.WidgetFactory;
-import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
+
+import javax.swing.*;
+import java.util.Vector;
 
 public class ReverseEngineeringConfigPanel extends JPanel {
 
@@ -52,9 +48,8 @@ public class ReverseEngineeringConfigPanel extends JPanel {
 
     private CayenneUndoableTextField tableTypes;
 
-    private ProjectController projectController;
-
-    private DbImportView dbImportView;
+    private final ProjectController projectController;
+    private final DbImportView dbImportView;
 
     ReverseEngineeringConfigPanel(ProjectController projectController, DbImportView dbImportView) {
         this.projectController = projectController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringTreePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringTreePanel.java
index be50a9991..1418878f9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringTreePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringTreePanel.java
@@ -30,12 +30,8 @@ import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.CatalogPopUpMenu;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DefaultPopUpMenu;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.IncludeTablePopUpMenu;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.RootPopUpMenu;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.SchemaPopUpMenu;
 
 import javax.swing.JScrollPane;
 import javax.swing.JTree;
@@ -49,24 +45,25 @@ import java.util.Map;
 
 class ReverseEngineeringTreePanel extends JScrollPane {
 
-    private DbImportTree reverseEngineeringTree;
-    private DbImportTree dbSchemaTree;
+    private final DbImportTree reverseEngineeringTree;
+    private final DbImportTree dbSchemaTree;
 
-    private ProjectController projectController;
+    private final ProjectController projectController;
+    private final DbImportActions actions;
     private TreeToolbarPanel treeToolbar;
     private Map<Class<?>, DefaultPopUpMenu> popups;
 
     ReverseEngineeringTreePanel(ProjectController projectController, DbImportTree reverseEngineeringTree,
-                                DbImportTree dbSchemaTree) {
+                                DbImportTree dbSchemaTree, DbImportActions actions) {
         super(reverseEngineeringTree);
         this.projectController = projectController;
         this.reverseEngineeringTree = reverseEngineeringTree;
         this.dbSchemaTree = dbSchemaTree;
+        this.actions = actions;
         reverseEngineeringTree.setEditable(true);
         reverseEngineeringTree.setCellRenderer(new DbImportTreeCellRenderer());
         DbImportTreeCellEditor editor = new DbImportTreeCellEditor(reverseEngineeringTree,
-                (DefaultTreeCellRenderer) reverseEngineeringTree.getCellRenderer());
-        editor.setProjectController(projectController);
+                (DefaultTreeCellRenderer) reverseEngineeringTree.getCellRenderer(), actions);
         reverseEngineeringTree.setCellEditor(editor);
         initListeners();
         initPopupMenus();
@@ -79,16 +76,16 @@ class ReverseEngineeringTreePanel extends JScrollPane {
 
     private void initPopupMenus() {
         popups = new HashMap<>();
-        popups.put(Catalog.class, new CatalogPopUpMenu());
-        popups.put(Schema.class, new SchemaPopUpMenu());
-        popups.put(ReverseEngineering.class, new RootPopUpMenu());
-        popups.put(String.class, new RootPopUpMenu());
-        popups.put(IncludeTable.class, new IncludeTablePopUpMenu());
-        popups.put(ExcludeTable.class, new DefaultPopUpMenu());
-        popups.put(IncludeColumn.class, new DefaultPopUpMenu());
-        popups.put(ExcludeColumn.class, new DefaultPopUpMenu());
-        popups.put(IncludeProcedure.class, new DefaultPopUpMenu());
-        popups.put(ExcludeProcedure.class, new DefaultPopUpMenu());
+        popups.put(Catalog.class, new CatalogPopUpMenu(actions));
+        popups.put(Schema.class, new SchemaPopUpMenu(actions));
+        popups.put(ReverseEngineering.class, new RootPopUpMenu(actions));
+        popups.put(String.class, new RootPopUpMenu(actions));
+        popups.put(IncludeTable.class, new IncludeTablePopUpMenu(actions));
+        popups.put(ExcludeTable.class, new DefaultPopUpMenu(actions));
+        popups.put(IncludeColumn.class, new DefaultPopUpMenu(actions));
+        popups.put(ExcludeColumn.class, new DefaultPopUpMenu(actions));
+        popups.put(IncludeProcedure.class, new DefaultPopUpMenu(actions));
+        popups.put(ExcludeProcedure.class, new DefaultPopUpMenu(actions));
     }
 
     private void initListeners() {
@@ -116,7 +113,6 @@ class ReverseEngineeringTreePanel extends JScrollPane {
                         popupMenu = popups.get(ReverseEngineering.class);
                     }
                     if (popupMenu != null) {
-                        popupMenu.setProjectController(projectController);
                         popupMenu.setSelectedElement(selectedElement);
                         popupMenu.setParentElement(selectedElement.getParent());
                         popupMenu.setTree(reverseEngineeringTree);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/RootPopUpMenu.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/RootPopUpMenu.java
index c1b563cc2..24405d447 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/RootPopUpMenu.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/RootPopUpMenu.java
@@ -19,14 +19,7 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
-import org.apache.cayenne.modeler.action.dbimport.AddCatalogAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddSchemaAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
 
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
@@ -46,7 +39,8 @@ public class RootPopUpMenu extends DefaultPopUpMenu {
     protected JMenuItem addExcludeProcedure;
 
 
-    public RootPopUpMenu() {
+    public RootPopUpMenu(DbImportActions actions) {
+        super(actions);
         initPopUpMenuElements();
         initListeners();
         this.add(addItem, FIRST_POSITION);
@@ -55,22 +49,14 @@ public class RootPopUpMenu extends DefaultPopUpMenu {
     }
 
     private void initListeners() {
-        addCatalog.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddCatalogAction.class).actionPerformed(e));
-        addSchema.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddSchemaAction.class).actionPerformed(e));
-        addIncludeTable.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddIncludeTableAction.class).actionPerformed(e));
-        addExcludeTable.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddExcludeTableAction.class).actionPerformed(e));
-        addIncludeColumn.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddIncludeColumnAction.class).actionPerformed(e));
-        addExcludeColumn.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddExcludeColumnAction.class).actionPerformed(e));
-        addIncludeProcedure.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddIncludeProcedureAction.class).actionPerformed(e));
-        addExcludeProcedure.addActionListener(e -> projectController.getApplication().getActionManager()
-                .getAction(AddExcludeProcedureAction.class).actionPerformed(e));
+        addCatalog.addActionListener(e -> actions.getAddCatalogAction().actionPerformed(e));
+        addSchema.addActionListener(e -> actions.getAddSchemaAction().actionPerformed(e));
+        addIncludeTable.addActionListener(e -> actions.getAddIncludeTableAction().actionPerformed(e));
+        addExcludeTable.addActionListener(e -> actions.getAddExcludeTableAction().actionPerformed(e));
+        addIncludeColumn.addActionListener(e -> actions.getAddIncludeColumnAction().actionPerformed(e));
+        addExcludeColumn.addActionListener(e -> actions.getAddExcludeColumnAction().actionPerformed(e));
+        addIncludeProcedure.addActionListener(e -> actions.getAddIncludeProcedureAction().actionPerformed(e));
+        addExcludeProcedure.addActionListener(e -> actions.getAddExcludeProcedureAction().actionPerformed(e));
     }
 
     private void initPopUpMenuElements() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SchemaPopUpMenu.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SchemaPopUpMenu.java
index a5fee2b88..c2b3a9841 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SchemaPopUpMenu.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SchemaPopUpMenu.java
@@ -19,9 +19,12 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
+
 public class SchemaPopUpMenu extends RootPopUpMenu {
 
-    public SchemaPopUpMenu() {
+    public SchemaPopUpMenu(DbImportActions actions) {
+        super(actions);
         rename.setVisible(true);
         delete.setVisible(true);
         addSchema.setVisible(false);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/TreeToolbarPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/TreeToolbarPanel.java
index 350f60639..a50b0e294 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/TreeToolbarPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/TreeToolbarPanel.java
@@ -20,29 +20,10 @@
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
-import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
-import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
-import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
-import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
-import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.GetDbConnectionAction;
-import org.apache.cayenne.modeler.action.SortNodesAction;
-import org.apache.cayenne.modeler.action.dbimport.AddCatalogAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddExcludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeColumnAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeProcedureAction;
-import org.apache.cayenne.modeler.action.dbimport.AddIncludeTableAction;
-import org.apache.cayenne.modeler.action.dbimport.AddPatternParamAction;
-import org.apache.cayenne.modeler.action.dbimport.AddSchemaAction;
-import org.apache.cayenne.modeler.action.dbimport.DeleteNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.EditNodeAction;
-import org.apache.cayenne.modeler.action.dbimport.TreeManipulationAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 
 import javax.swing.JButton;
@@ -55,30 +36,41 @@ import java.util.Map;
 
 class TreeToolbarPanel extends JToolBar {
 
-    private JButton schemaButton;
-    private JButton catalogButton;
-    private JButton includeTableButton;
-    private JButton excludeTableButton;
-    private JButton includeColumnButton;
-    private JButton excludeColumnButton;
-    private JButton includeProcedureButton;
-    private JButton excludeProcedureButton;
-    private JButton editButton;
-    private JButton deleteButton;
-    private JButton configureButton;
-    private JButton sortButton;
-    private DbImportTree reverseEngineeringTree;
-
-    private Map<Class, List<JButton>> levels;
-    private ProjectController projectController;
-
-    TreeToolbarPanel(ProjectController projectController, DbImportTree reverseEngineeringTree, DraggableTreePanel treePanel) {
-        this.projectController = projectController;
+    private final JButton schemaButton;
+    private final JButton catalogButton;
+    private final JButton includeTableButton;
+    private final JButton excludeTableButton;
+    private final JButton includeColumnButton;
+    private final JButton excludeColumnButton;
+    private final JButton includeProcedureButton;
+    private final JButton excludeProcedureButton;
+    private final JButton editButton;
+    private final JButton deleteButton;
+    private final JButton configureButton;
+    private final JButton sortButton;
+    private final DbImportTree reverseEngineeringTree;
+
+    private final Map<Class<?>, List<JButton>> levels;
+
+    TreeToolbarPanel(DbImportTree reverseEngineeringTree, DbImportActions actions) {
         this.reverseEngineeringTree = reverseEngineeringTree;
-        createButtons(treePanel);
-        initLevels();
+
+        this.schemaButton = actions.getAddSchemaAction().buildButton(0);
+        this.catalogButton = actions.getAddCatalogAction().buildButton(0);
+        this.includeTableButton = actions.getAddIncludeTableAction().buildButton(1);
+        this.excludeTableButton = actions.getAddExcludeTableAction().buildButton(2);
+        this.includeColumnButton = actions.getAddIncludeColumnAction().buildButton(2);
+        this.excludeColumnButton = actions.getAddExcludeColumnAction().buildButton(2);
+        this.includeProcedureButton = actions.getAddIncludeProcedureAction().buildButton(2);
+        this.excludeProcedureButton = actions.getAddExcludeProcedureAction().buildButton(3);
+        this.sortButton = actions.getSortNodesAction().buildButton(0);
+        this.editButton = actions.getEditNodeAction().buildButton(0);
+        this.deleteButton = actions.getDeleteNodeAction().buildButton(0);
+        this.configureButton = actions.getGetDbConnectionAction().buildButton(0);
+
+        this.levels = initLevels();
         addButtons();
-        this.setBorder(new EmptyBorder(0,0,0,0));
+        this.setBorder(new EmptyBorder(0, 0, 0, 0));
     }
 
     void unlockButtons() {
@@ -117,8 +109,8 @@ class TreeToolbarPanel extends JToolBar {
         }
     }
 
-    private void initLevels() {
-        levels = new HashMap<>();
+    private Map<Class<?>, List<JButton>> initLevels() {
+        Map<Class<?>, List<JButton>> levels = new HashMap<>();
 
         List<JButton> rootLevelButtons = new ArrayList<>();
         rootLevelButtons.add(catalogButton);
@@ -155,6 +147,7 @@ class TreeToolbarPanel extends JToolBar {
         levels.put(Catalog.class, catalogLevelButtons);
         levels.put(Schema.class, schemaLevelButtons);
         levels.put(IncludeTable.class, includeTableLevelButtons);
+        return levels;
     }
 
     private void addButtons() {
@@ -197,46 +190,4 @@ class TreeToolbarPanel extends JToolBar {
         editButton.setEnabled(true);
         deleteButton.setEnabled(true);
     }
-
-
-
-    private void createButtons(DraggableTreePanel panel) {
-        schemaButton = createButton(AddSchemaAction.class, 0);
-        catalogButton = createButton(AddCatalogAction.class, 0);
-        includeTableButton = createButton(AddIncludeTableAction.class, 1);
-        excludeTableButton = createButton(AddExcludeTableAction.class, 2, ExcludeTable.class);
-        includeColumnButton = createButton(AddIncludeColumnAction.class, 2, IncludeColumn.class);
-        excludeColumnButton = createButton(AddExcludeColumnAction.class, 2, ExcludeColumn.class);
-        includeProcedureButton = createButton(AddIncludeProcedureAction.class, 2, IncludeProcedure.class);
-        excludeProcedureButton = createButton(AddExcludeProcedureAction.class, 3, ExcludeProcedure.class);
-        sortButton = createButton(SortNodesAction.class,0);
-        editButton = createButton(EditNodeAction.class, 0);
-        deleteButton = createDeleteButton(panel);
-        configureButton = createConfigureButton();
-    }
-
-    private <T extends TreeManipulationAction> JButton createButton(Class<T> actionClass, int position) {
-        TreeManipulationAction action = projectController.getApplication().getActionManager().getAction(actionClass);
-        action.setTree(reverseEngineeringTree);
-        return action.buildButton(position);
-    }
-
-    private <T extends AddPatternParamAction> JButton createButton(Class<T> actionClass, int position, Class paramClass) {
-        AddPatternParamAction action = projectController.getApplication().getActionManager().getAction(actionClass);
-        action.setTree(reverseEngineeringTree);
-        action.setParamClass(paramClass);
-        return action.buildButton(position);
-    }
-
-    private JButton createConfigureButton() {
-        GetDbConnectionAction action = projectController.getApplication().getActionManager().getAction(GetDbConnectionAction.class);
-        return action.buildButton(0);
-    }
-
-    private JButton createDeleteButton(DraggableTreePanel panel) {
-        DeleteNodeAction deleteNodeAction = projectController.getApplication().getActionManager().getAction(DeleteNodeAction.class);
-        deleteNodeAction.setTree(reverseEngineeringTree);
-        deleteNodeAction.setPanel(panel);
-        return deleteNodeAction.buildButton(0);
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddCatalogAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddCatalogAction.java
similarity index 88%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddCatalogAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddCatalogAction.java
index bd65b6225..73f1e389e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddCatalogAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddCatalogAction.java
@@ -17,11 +17,12 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 
 import java.awt.event.ActionEvent;
@@ -31,8 +32,8 @@ public class AddCatalogAction extends TreeManipulationAction {
     private static final String ACTION_NAME = "Add Catalog";
     private static final String ICON_NAME = "icon-dbi-catalog.png";
 
-    public AddCatalogAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddCatalogAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree);
         insertableNodeClass = Catalog.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeColumnAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeColumnAction.java
similarity index 81%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeColumnAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeColumnAction.java
index c51727751..7db2b9df4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeColumnAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeColumnAction.java
@@ -17,18 +17,19 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 
 public class AddExcludeColumnAction extends AddPatternParamAction {
 
     private static final String ACTION_NAME = "Exclude Column";
     private static final String ICON_NAME = "icon-dbi-excludeColumn.png";
 
-    public AddExcludeColumnAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddExcludeColumnAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree, ExcludeColumn.class);
         insertableNodeClass = ExcludeColumn.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeProcedureAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeProcedureAction.java
similarity index 81%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeProcedureAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeProcedureAction.java
index fc48a8d86..1f79d93ad 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeProcedureAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeProcedureAction.java
@@ -17,18 +17,19 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 
 public class AddExcludeProcedureAction extends AddPatternParamAction {
 
     private static final String ACTION_NAME = "Exclude Procedure";
     private static final String ICON_NAME = "icon-dbi-excludeProcedure.png";
 
-    public AddExcludeProcedureAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddExcludeProcedureAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree, ExcludeProcedure.class);
         insertableNodeClass = ExcludeProcedure.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeTableAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeTableAction.java
similarity index 81%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeTableAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeTableAction.java
index a1dc5f3c5..dae04fee1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddExcludeTableAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddExcludeTableAction.java
@@ -17,18 +17,19 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 
 public class AddExcludeTableAction extends AddPatternParamAction {
 
     private static final String ACTION_NAME = "Exclude Table";
     private static final String ICON_NAME = "icon-dbi-excludeTable.png";
 
-    public AddExcludeTableAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddExcludeTableAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree, ExcludeTable.class);
         insertableNodeClass = ExcludeTable.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeColumnAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeColumnAction.java
similarity index 81%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeColumnAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeColumnAction.java
index ccee497f2..77b502807 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeColumnAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeColumnAction.java
@@ -17,18 +17,19 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 
 public class AddIncludeColumnAction extends AddPatternParamAction {
 
     private static final String ACTION_NAME = "Include Column";
     private static final String ICON_NAME = "icon-dbi-includeColumn.png";
 
-    public AddIncludeColumnAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddIncludeColumnAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree, IncludeColumn.class);
         insertableNodeClass = IncludeColumn.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeProcedureAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeProcedureAction.java
similarity index 81%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeProcedureAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeProcedureAction.java
index 13cff06c4..bd3baf746 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeProcedureAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeProcedureAction.java
@@ -17,18 +17,19 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 
 public class AddIncludeProcedureAction extends AddPatternParamAction {
 
     private static final String ACTION_NAME = "Include Procedure";
     private static final String ICON_NAME = "icon-dbi-includeProcedure.png";
 
-    public AddIncludeProcedureAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddIncludeProcedureAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree, IncludeProcedure.class);
         insertableNodeClass = IncludeProcedure.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeTableAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeTableAction.java
similarity index 89%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeTableAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeTableAction.java
index 738310292..7dee78938 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddIncludeTableAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeTableAction.java
@@ -17,12 +17,13 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 
 import java.awt.event.ActionEvent;
@@ -32,8 +33,8 @@ public class AddIncludeTableAction extends TreeManipulationAction {
     private static final String ACTION_NAME = "Include Table";
     private static final String ICON_NAME = "icon-dbi-includeTable.png";
 
-    public AddIncludeTableAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddIncludeTableAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree);
         insertableNodeClass = IncludeTable.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddPatternParamAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddPatternParamAction.java
similarity index 89%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddPatternParamAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddPatternParamAction.java
index 0984b0b26..324e7d28e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddPatternParamAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddPatternParamAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
@@ -29,19 +29,21 @@ import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 
 import java.awt.event.ActionEvent;
 
 public abstract class AddPatternParamAction extends TreeManipulationAction {
 
-    private Class paramClass;
+    private final Class<?> paramClass;
 
-    AddPatternParamAction(String name, Application application) {
-        super(name, application);
+    AddPatternParamAction(String name, Application application, DbImportTree tree, Class<?> paramClass) {
+        super(name, application, tree);
+        this.paramClass = paramClass;
     }
 
-    private void addPatternParamToContainer(Class paramClass, Object selectedObject, String name, DbImportTreeNode node) {
+    private void addPatternParamToContainer(Class<?> paramClass, Object selectedObject, String name, DbImportTreeNode node) {
         FilterContainer container = (FilterContainer) selectedObject;
         PatternParam element = null;
         if (paramClass == ExcludeTable.class) {
@@ -63,7 +65,7 @@ public abstract class AddPatternParamAction extends TreeManipulationAction {
         node.add(new DbImportTreeNode(element));
     }
 
-    private void addPatternParamToIncludeTable(Class paramClass, Object selectedObject, String name, DbImportTreeNode node) {
+    private void addPatternParamToIncludeTable(Class<?> paramClass, Object selectedObject, String name, DbImportTreeNode node) {
         IncludeTable includeTable = (IncludeTable) selectedObject;
         PatternParam element = null;
         if (paramClass == IncludeColumn.class) {
@@ -106,8 +108,4 @@ public abstract class AddPatternParamAction extends TreeManipulationAction {
         }
         completeInserting(reverseEngineeringOldCopy);
     }
-
-    public void setParamClass(Class paramClass) {
-        this.paramClass = paramClass;
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddSchemaAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddSchemaAction.java
similarity index 90%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddSchemaAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddSchemaAction.java
index 2ab997463..00f29e17b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/AddSchemaAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddSchemaAction.java
@@ -17,13 +17,14 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.dbsync.reverse.dbimport.SchemaContainer;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 
 import java.awt.event.ActionEvent;
@@ -33,8 +34,8 @@ public class AddSchemaAction extends TreeManipulationAction {
     private static final String ACTION_NAME = "Add Schema";
     private static final String ICON_NAME = "icon-dbi-schema.png";
 
-    public AddSchemaAction(Application application) {
-        super(ACTION_NAME, application);
+    public AddSchemaAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree);
         insertableNodeClass = Schema.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
new file mode 100644
index 000000000..cfc6cfd41
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
@@ -0,0 +1,168 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Per-view container of action instances used by the DataMap DB Import view.
+ * Owns one instance of each action; consumers (toolbar, popup menus, cell editor,
+ * tree) receive the same instances by typed accessor.
+ */
+public class DbImportActions {
+
+    private final AddCatalogAction addCatalog;
+    private final AddSchemaAction addSchema;
+    private final AddIncludeTableAction addIncludeTable;
+    private final AddExcludeTableAction addExcludeTable;
+    private final AddIncludeColumnAction addIncludeColumn;
+    private final AddExcludeColumnAction addExcludeColumn;
+    private final AddIncludeProcedureAction addIncludeProcedure;
+    private final AddExcludeProcedureAction addExcludeProcedure;
+    private final EditNodeAction editNode;
+    private final DeleteNodeAction deleteNode;
+    private final SortNodesAction sortNodes;
+    private final GetDbConnectionAction getDbConnection;
+    private final LoadDbSchemaAction loadDbSchema;
+    private final MoveImportNodeAction moveImportNode;
+    private final MoveInvertNodeAction moveInvertNode;
+    private final DragAndDropNodeAction dragAndDropNode;
+
+    private final Map<Class<?>, TreeManipulationAction> actionsByNodeType;
+
+    public DbImportActions(Application application, DbImportView view, DbImportTree targetTree, DbImportTree sourceTree) {
+        // ModelerAbstractAction starts disabled by default; setAlwaysOn(true) latches each
+        // action enabled so the toolbar and popup menus aren't greyed out. The view exists
+        // only when a DataMap is open, so the global "no project => disable" rule doesn't apply.
+        this.addCatalog = enabled(new AddCatalogAction(application, targetTree));
+        this.addSchema = enabled(new AddSchemaAction(application, targetTree));
+        this.addIncludeTable = enabled(new AddIncludeTableAction(application, targetTree));
+        this.addExcludeTable = enabled(new AddExcludeTableAction(application, targetTree));
+        this.addIncludeColumn = enabled(new AddIncludeColumnAction(application, targetTree));
+        this.addExcludeColumn = enabled(new AddExcludeColumnAction(application, targetTree));
+        this.addIncludeProcedure = enabled(new AddIncludeProcedureAction(application, targetTree));
+        this.addExcludeProcedure = enabled(new AddExcludeProcedureAction(application, targetTree));
+        this.editNode = enabled(new EditNodeAction(application, targetTree));
+        this.deleteNode = enabled(new DeleteNodeAction(application, view, targetTree));
+        this.sortNodes = enabled(new SortNodesAction(application, targetTree));
+        this.getDbConnection = enabled(new GetDbConnectionAction(application));
+        this.loadDbSchema = enabled(new LoadDbSchemaAction(application, view));
+        this.moveImportNode = enabled(new MoveImportNodeAction(application, view, sourceTree, targetTree));
+        this.moveInvertNode = enabled(new MoveInvertNodeAction(application, view, sourceTree, targetTree));
+        this.dragAndDropNode = enabled(new DragAndDropNodeAction(application, targetTree));
+
+        this.actionsByNodeType = new HashMap<>();
+        actionsByNodeType.put(Catalog.class, addCatalog);
+        actionsByNodeType.put(Schema.class, addSchema);
+        actionsByNodeType.put(IncludeTable.class, addIncludeTable);
+        actionsByNodeType.put(ExcludeTable.class, addExcludeTable);
+        actionsByNodeType.put(IncludeColumn.class, addIncludeColumn);
+        actionsByNodeType.put(ExcludeColumn.class, addExcludeColumn);
+        actionsByNodeType.put(IncludeProcedure.class, addIncludeProcedure);
+        actionsByNodeType.put(ExcludeProcedure.class, addExcludeProcedure);
+    }
+
+    private static <T extends ModelerAbstractAction> T enabled(T action) {
+        action.setAlwaysOn(true);
+        return action;
+    }
+
+    public TreeManipulationAction getAction(Class<?> nodeType) {
+        return actionsByNodeType.get(nodeType);
+    }
+
+    public AddCatalogAction getAddCatalogAction() {
+        return addCatalog;
+    }
+
+    public AddSchemaAction getAddSchemaAction() {
+        return addSchema;
+    }
+
+    public AddIncludeTableAction getAddIncludeTableAction() {
+        return addIncludeTable;
+    }
+
+    public AddExcludeTableAction getAddExcludeTableAction() {
+        return addExcludeTable;
+    }
+
+    public AddIncludeColumnAction getAddIncludeColumnAction() {
+        return addIncludeColumn;
+    }
+
+    public AddExcludeColumnAction getAddExcludeColumnAction() {
+        return addExcludeColumn;
+    }
+
+    public AddIncludeProcedureAction getAddIncludeProcedureAction() {
+        return addIncludeProcedure;
+    }
+
+    public AddExcludeProcedureAction getAddExcludeProcedureAction() {
+        return addExcludeProcedure;
+    }
+
+    public EditNodeAction getEditNodeAction() {
+        return editNode;
+    }
+
+    public DeleteNodeAction getDeleteNodeAction() {
+        return deleteNode;
+    }
+
+    public SortNodesAction getSortNodesAction() {
+        return sortNodes;
+    }
+
+    public GetDbConnectionAction getGetDbConnectionAction() {
+        return getDbConnection;
+    }
+
+    public LoadDbSchemaAction getLoadDbSchemaAction() {
+        return loadDbSchema;
+    }
+
+    public MoveImportNodeAction getMoveImportNodeAction() {
+        return moveImportNode;
+    }
+
+    public MoveInvertNodeAction getMoveInvertNodeAction() {
+        return moveInvertNode;
+    }
+
+    public DragAndDropNodeAction getDragAndDropNodeAction() {
+        return dragAndDropNode;
+    }
+}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/DeleteNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DeleteNodeAction.java
similarity index 90%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/DeleteNodeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DeleteNodeAction.java
index d3371346e..e78f5842c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/DeleteNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DeleteNodeAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
@@ -31,10 +31,10 @@ import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportModel;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
-import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DraggableTreePanel;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 
 import javax.swing.tree.TreePath;
 import java.awt.event.ActionEvent;
@@ -45,10 +45,11 @@ public class DeleteNodeAction extends TreeManipulationAction {
     private static final String ACTION_NAME = "Delete";
     private static final String ICON_NAME = "icon-trash.png";
 
-    private DraggableTreePanel panel;
+    private final DbImportView view;
 
-    public DeleteNodeAction(Application application) {
-        super(ACTION_NAME, application);
+    public DeleteNodeAction(Application application, DbImportView view, DbImportTree tree) {
+        super(ACTION_NAME, application, tree);
+        this.view = view;
     }
 
     public String getIconName() {
@@ -120,13 +121,14 @@ public class DeleteNodeAction extends TreeManipulationAction {
     @Override
     public void performAction(ActionEvent e) {
         tree.stopEditing();
-        final TreePath[] paths = tree.getSelectionPaths();
-        final DbImportView rootParent = ((DbImportView) panel.getParent().getParent());
-        rootParent.getLoadDbSchemaButton().setEnabled(false);
-        rootParent.getReverseEngineeringProgress().setVisible(true);
+        TreePath[] paths = tree.getSelectionPaths();
+
+        view.getLoadDbSchemaButton().setEnabled(false);
+        view.getReverseEngineeringProgress().setVisible(true);
+
         if (paths != null) {
             ReverseEngineering reverseEngineeringOldCopy = new ReverseEngineering(tree.getReverseEngineering());
-            rootParent.lockToolbarButtons();
+            view.lockToolbarButtons();
             for (TreePath path : paths) {
                 selectedElement = (DbImportTreeNode) path.getLastPathComponent();
                 parentElement = selectedElement.getParent();
@@ -156,12 +158,8 @@ public class DeleteNodeAction extends TreeManipulationAction {
                 updateParentChilds();
             }
             putReverseEngineeringToUndoManager(reverseEngineeringOldCopy);
-            rootParent.getLoadDbSchemaButton().setEnabled(true);
-            rootParent.getReverseEngineeringProgress().setVisible(false);
+            view.getLoadDbSchemaButton().setEnabled(true);
+            view.getReverseEngineeringProgress().setVisible(false);
         }
     }
-
-    public void setPanel(DraggableTreePanel panel) {
-        this.panel = panel;
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/DragAndDropNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DragAndDropNodeAction.java
similarity index 95%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/DragAndDropNodeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DragAndDropNodeAction.java
index 446e6e9a5..ef7e9b667 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/DragAndDropNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DragAndDropNodeAction.java
@@ -17,13 +17,14 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportModel;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportSorter;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 
 import javax.swing.JOptionPane;
 import javax.swing.JTree;
@@ -41,8 +42,8 @@ public class DragAndDropNodeAction extends TreeManipulationAction {
     private DbImportTreeNode sourceParentNode;
     private JTree.DropLocation dropLocation;
 
-    public DragAndDropNodeAction(Application application) {
-        super(ACTION_NAME, application);
+    public DragAndDropNodeAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree);
     }
 
     @Override
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/EditNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/EditNodeAction.java
similarity index 91%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/EditNodeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/EditNodeAction.java
index 3a938fe56..44d3ccd9f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/EditNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/EditNodeAction.java
@@ -17,13 +17,14 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
 import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportSorter;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.tree.TreePath;
@@ -36,8 +37,8 @@ public class EditNodeAction extends TreeManipulationAction {
 
     private String actionName;
 
-    public EditNodeAction(Application application) {
-        super(ACTION_NAME, application);
+    public EditNodeAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree);
     }
 
     public String getIconName() {
@@ -71,7 +72,7 @@ public class EditNodeAction extends TreeManipulationAction {
                     }
                     updateModel(true);
                 }
-                if (!actionName.equals(EMPTY_NAME)) {
+                if (!actionName.equals("")) {
                     putReverseEngineeringToUndoManager(reverseEngineeringOldCopy);
                 }
             }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/GetDbConnectionAction.java
similarity index 93%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/GetDbConnectionAction.java
index 8d66c25f6..633f45032 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GetDbConnectionAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/GetDbConnectionAction.java
@@ -17,9 +17,10 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.action.DBConnectionAwareAction;
 import org.apache.cayenne.modeler.ui.datasource.DataSourceController;
 
 import java.awt.event.ActionEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
similarity index 83%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
index 268cb693d..b8c9481e1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LoadDbSchemaAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
@@ -17,13 +17,14 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.action.DBConnectionAwareAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DatabaseSchemaLoader;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportModel;
@@ -46,10 +47,12 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
 
     private static final String ICON_NAME = "icon-dbi-refresh.png";
     private static final String ACTION_NAME = "Refresh Db Schema";
-    private DraggableTreePanel draggableTreePanel;
 
-    LoadDbSchemaAction(Application application) {
+    private final DbImportView view;
+
+    public LoadDbSchemaAction(Application application, DbImportView view) {
         super(ACTION_NAME, application);
+        this.view = view;
     }
 
     public String getIconName() {
@@ -62,12 +65,12 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
     }
 
     public void loadDbSchema(TreePath tablePath) {
-        DbImportView rootParent = ((DbImportView) draggableTreePanel.getParent().getParent());
-        rootParent.getLoadDbSchemaProgress().setVisible(true);
-        rootParent.getLoadDbSchemaButton().setEnabled(false);
+        DraggableTreePanel draggableTreePanel = view.getDraggableTreePanel();
+        view.getLoadDbSchemaProgress().setVisible(true);
+        view.getLoadDbSchemaButton().setEnabled(false);
         Thread thread = new Thread(() -> {
             LoadDbSchemaAction.this.setEnabled(false);
-            rootParent.lockToolbarButtons();
+            view.lockToolbarButtons();
             draggableTreePanel.getMoveButton().setEnabled(false);
             draggableTreePanel.getMoveInvertButton().setEnabled(false);
             try {
@@ -85,14 +88,14 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
                     if (userObject instanceof Catalog) {
                         Catalog catalog = (Catalog) userObject;
                         if (catalog.getSchemas().isEmpty()) {
-                            loadTables(connectionInfo, tablePath, rootParent);
+                            loadTables(connectionInfo, tablePath);
                         }
                     } else if (userObject instanceof Schema) {
-                        loadTables(connectionInfo, tablePath, rootParent);
+                        loadTables(connectionInfo, tablePath);
                     } else if (userObject instanceof IncludeTable) {
                         loadColumns(connectionInfo, tablePath);
                     } else {
-                        loadTables(connectionInfo, tablePath, rootParent);
+                        loadTables(connectionInfo, tablePath);
                     }
                 } else {
                     loadDataBase(connectionInfo);
@@ -105,15 +108,16 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
                         JOptionPane.ERROR_MESSAGE);
                 LOGGER.warn("Error loading db schema", ex);
             } finally {
-                rootParent.getLoadDbSchemaButton().setEnabled(true);
-                rootParent.getLoadDbSchemaProgress().setVisible(false);
-                rootParent.unlockToolbarButtons();
+                view.getLoadDbSchemaButton().setEnabled(true);
+                view.getLoadDbSchemaProgress().setVisible(false);
+                view.unlockToolbarButtons();
             }
         });
         thread.start();
     }
 
     private void loadDataBase(DBConnectionInfo connectionInfo) throws Exception {
+        DraggableTreePanel draggableTreePanel = view.getDraggableTreePanel();
         ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
                 .load(connectionInfo, application.getClassLoadingService());
         draggableTreePanel.getSourceTree()
@@ -125,28 +129,24 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
         ((DbImportModel) draggableTreePanel.getSourceTree().getModel()).reload();
     }
 
-    private void loadTables(DBConnectionInfo connectionInfo,
-                            TreePath tablePath,
-                            DbImportView rootParent) throws Exception {
+    private void loadTables(DBConnectionInfo connectionInfo, TreePath tablePath) throws Exception {
+        DraggableTreePanel draggableTreePanel = view.getDraggableTreePanel();
         ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
                 .loadTables(connectionInfo,
                         application.getClassLoadingService(),
                         tablePath,
-                        rootParent.getTableTypes());
+                        view.getTableTypes());
         draggableTreePanel.getSourceTree()
                 .update(databaseReverseEngineering,
                         new PrintTablesBiFunction(draggableTreePanel.getSourceTree()));
     }
 
     private void loadColumns(DBConnectionInfo connectionInfo, TreePath tablePath) throws SQLException {
+        DraggableTreePanel draggableTreePanel = view.getDraggableTreePanel();
         ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
                 .loadColumns(connectionInfo, application.getClassLoadingService(), tablePath);
         draggableTreePanel.getSourceTree()
                 .update(databaseReverseEngineering,
                         new PrintColumnsBiFunction(draggableTreePanel.getSourceTree()));
     }
-
-    public void setDraggableTreePanel(DraggableTreePanel draggableTreePanel) {
-        this.draggableTreePanel = draggableTreePanel;
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/MoveImportNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
similarity index 92%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/MoveImportNodeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
index e8d0e56de..0a5a37e36 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/MoveImportNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
@@ -50,28 +50,33 @@ public class MoveImportNodeAction extends ModelerAbstractAction {
     private static final String ACTION_NAME = "Include";
     private static final String EMPTY_NAME = "";
 
-    private DbImportTree sourceTree;
-    private DbImportTree targetTree;
-    private DraggableTreePanel panel;
+    private final DbImportView view;
+    private final DbImportTree sourceTree;
+    private final DbImportTree targetTree;
     protected boolean moveInverted;
-    private Map<Class, Class> classMap;
+    private final Map<Class<?>, Class<?>> classMap;
 
-    public MoveImportNodeAction(Application application) {
-        super(ACTION_NAME, application);
+    public MoveImportNodeAction(Application application, DbImportView view, DbImportTree sourceTree, DbImportTree targetTree) {
+        this(ACTION_NAME, application, view, sourceTree, targetTree);
     }
 
-    MoveImportNodeAction(String actionName, Application application) {
+    MoveImportNodeAction(String actionName, Application application, DbImportView view,
+                         DbImportTree sourceTree, DbImportTree targetTree) {
         super(actionName, application);
-        initMap();
+        this.view = view;
+        this.sourceTree = sourceTree;
+        this.targetTree = targetTree;
+        this.classMap = initMap();
     }
 
-    private void initMap() {
-        classMap = new HashMap<>();
+    private static Map<Class<?>, Class<?>> initMap() {
+        Map<Class<?>, Class<?>> classMap = new HashMap<>();
         classMap.put(IncludeTable.class, ExcludeTable.class);
         classMap.put(IncludeColumn.class, ExcludeColumn.class);
         classMap.put(IncludeProcedure.class, ExcludeProcedure.class);
         classMap.put(Schema.class, Schema.class);
         classMap.put(Catalog.class, Catalog.class);
+        return classMap;
     }
 
     public String getIconName() {
@@ -119,8 +124,8 @@ public class MoveImportNodeAction extends ModelerAbstractAction {
         TreeManipulationAction action = null;
         DbImportTreeNode foundNode = null;
         String insertableName = EMPTY_NAME;
-        DbImportView rootParent = (DbImportView) panel.getParent().getParent();
-        rootParent.getReverseEngineeringProgress().setVisible(true);
+        DraggableTreePanel panel = view.getDraggableTreePanel();
+        view.getReverseEngineeringProgress().setVisible(true);
         if (paths != null) {
             boolean isChanged = false;
             ReverseEngineering reverseEngineeringOldCopy = new ReverseEngineering(targetTree.getReverseEngineering());
@@ -145,7 +150,6 @@ public class MoveImportNodeAction extends ModelerAbstractAction {
                             if (canInsert(new TreePath(insertedNode.getPath()), previousNode)) {
                                 manipulationAction.setFoundNode(previousNode);
                                 manipulationAction.setInsertableNodeName(insertedNode.getSimpleNodeName());
-                                manipulationAction.setTree(targetTree);
                                 manipulationAction.setMovedFromDbSchema(true);
                                 manipulationAction.actionPerformed(e);
                                 manipulationAction.setFoundNode(null);
@@ -170,7 +174,6 @@ public class MoveImportNodeAction extends ModelerAbstractAction {
                             insertableName = selectedElement.getSimpleNodeName();
                             action.setFoundNode(foundNode);
                             action.setInsertableNodeName(Matcher.quoteReplacement(insertableName));
-                            action.setTree(targetTree);
                             action.setMovedFromDbSchema(true);
                             action.actionPerformed(e);
                             action.setFoundNode(null);
@@ -201,7 +204,7 @@ public class MoveImportNodeAction extends ModelerAbstractAction {
                     targetTree.setSelectionPath(new TreePath(foundNode.getLastChild().getPath()));
                 }
             } finally {
-                rootParent.getReverseEngineeringProgress().setVisible(false);
+                view.getReverseEngineeringProgress().setVisible(false);
                 if (action != null) {
                     action.resetActionFlags();
                 }
@@ -228,15 +231,4 @@ public class MoveImportNodeAction extends ModelerAbstractAction {
         return false;
     }
 
-    public void setSourceTree(DbImportTree sourceTree) {
-        this.sourceTree = sourceTree;
-    }
-
-    public void setTargetTree(DbImportTree targetTree) {
-        this.targetTree = targetTree;
-    }
-
-    public void setPanel(DraggableTreePanel panel) {
-        this.panel = panel;
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/MoveInvertNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveInvertNodeAction.java
similarity index 70%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/MoveInvertNodeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveInvertNodeAction.java
index f674950cb..88ac05df8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/MoveInvertNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveInvertNodeAction.java
@@ -17,16 +17,19 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
 
 public class MoveInvertNodeAction extends MoveImportNodeAction {
 
     private static final String ACTION_NAME = "Exclude";
 
-    public MoveInvertNodeAction(Application application) {
-        super(ACTION_NAME, application);
+    public MoveInvertNodeAction(Application application, DbImportView view,
+                                DbImportTree sourceTree, DbImportTree targetTree) {
+        super(ACTION_NAME, application, view, sourceTree, targetTree);
         moveInverted = true;
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SortNodesAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/SortNodesAction.java
similarity index 88%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SortNodesAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/SortNodesAction.java
index 9698535ee..10743002d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SortNodesAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/SortNodesAction.java
@@ -17,13 +17,13 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.dbimport.TreeManipulationAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportSorter;
+import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 
 import java.awt.event.ActionEvent;
 import java.util.List;
@@ -33,8 +33,8 @@ public class SortNodesAction extends TreeManipulationAction {
     private static final String ACTION_NAME = "Sort";
     private static final String ICON_NAME = "icon-dbi-sort.png";
 
-    public SortNodesAction(Application application) {
-        super(ACTION_NAME, application);
+    public SortNodesAction(Application application, DbImportTree tree) {
+        super(ACTION_NAME, application, tree);
     }
 
     @Override
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/TreeManipulationAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
similarity index 84%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/TreeManipulationAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
index 60da9ca0c..ce4ee36be 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/dbimport/TreeManipulationAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action.dbimport;
+package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
 import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
@@ -49,9 +49,7 @@ public abstract class TreeManipulationAction extends ModelerAbstractAction {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(TreeManipulationAction.class);
 
-    static final String EMPTY_NAME = "";
-
-    protected DbImportTree tree;
+    protected final DbImportTree tree;
     protected DbImportTreeNode selectedElement;
     DbImportTreeNode parentElement;
     DbImportTreeNode foundNode;
@@ -59,26 +57,27 @@ public abstract class TreeManipulationAction extends ModelerAbstractAction {
     Class<?> insertableNodeClass;
     boolean isMultipleAction;
     private boolean movedFromDbSchema;
-    private Map<Class<?>, List<Class<?>>> levels;
+    private final Map<Class<?>, List<Class<?>>> levels;
     protected String name;
     protected boolean updateSelected;
 
-    public TreeManipulationAction(String name, Application application) {
+    public TreeManipulationAction(String name, Application application, DbImportTree tree) {
         super(name, application);
-        initLevels();
+        this.tree = tree;
+        this.levels = initLevels();
     }
 
     void completeInserting(ReverseEngineering reverseEngineeringOldCopy) {
         if (!isMultipleAction) {
             updateAfterInsert();
         }
-        if ((!isMultipleAction) && (!insertableNodeName.equals(EMPTY_NAME))) {
+        if ((!isMultipleAction) && (!insertableNodeName.equals(""))) {
             putReverseEngineeringToUndoManager(reverseEngineeringOldCopy);
         }
     }
 
     private String getNodeName() {
-        return insertableNodeName != null ? insertableNodeName : EMPTY_NAME;
+        return insertableNodeName != null ? insertableNodeName : "";
     }
 
     protected ReverseEngineering prepareElements() {
@@ -113,14 +112,14 @@ public abstract class TreeManipulationAction extends ModelerAbstractAction {
 
     boolean reverseEngineeringIsEmpty() {
         ReverseEngineering reverseEngineering = tree.getReverseEngineering();
-        return ((reverseEngineering.getCatalogs().size() == 0) && (reverseEngineering.getSchemas().size() == 0)
-                && (reverseEngineering.getIncludeTables().size() == 0) && (reverseEngineering.getExcludeTables().size() == 0)
-                && (reverseEngineering.getIncludeColumns().size() == 0) && (reverseEngineering.getExcludeColumns().size() == 0)
-                && (reverseEngineering.getIncludeProcedures().size() == 0) && (reverseEngineering.getExcludeProcedures().size() == 0));
+        return ((reverseEngineering.getCatalogs().isEmpty()) && (reverseEngineering.getSchemas().isEmpty())
+                && (reverseEngineering.getIncludeTables().isEmpty()) && (reverseEngineering.getExcludeTables().isEmpty())
+                && (reverseEngineering.getIncludeColumns().isEmpty()) && (reverseEngineering.getExcludeColumns().isEmpty())
+                && (reverseEngineering.getIncludeProcedures().isEmpty()) && (reverseEngineering.getExcludeProcedures().isEmpty()));
     }
 
-    private void initLevels() {
-        levels = new HashMap<>();
+    private static Map<Class<?>, List<Class<?>>> initLevels() {
+        Map<Class<?>, List<Class<?>>> levels = new HashMap<>();
 
         List<Class<?>> schemaChildren = Arrays.asList(
                 IncludeTable.class, ExcludeTable.class,
@@ -139,10 +138,7 @@ public abstract class TreeManipulationAction extends ModelerAbstractAction {
         levels.put(ExcludeColumn.class, Collections.emptyList());
         levels.put(IncludeProcedure.class, Collections.emptyList());
         levels.put(ExcludeProcedure.class, Collections.emptyList());
-    }
-
-    public void setTree(DbImportTree tree) {
-        this.tree = tree;
+        return levels;
     }
 
     public JTree getTree() {
@@ -156,7 +152,7 @@ public abstract class TreeManipulationAction extends ModelerAbstractAction {
         Class<?> selectedObjectClass = node.getUserObject().getClass();
         List<Class<?>> classes = levels.get(selectedObjectClass);
         if(classes == null) {
-            LOGGER.warn("Trying to insert node of the unknown class '" + selectedObjectClass.getName() + "' to the dbimport tree.");
+            LOGGER.warn("Trying to insert node of the unknown class '{}' to the dbimport tree.", selectedObjectClass.getName());
             return false;
         }
         return classes.contains(insertableNodeClass);
@@ -195,9 +191,9 @@ public abstract class TreeManipulationAction extends ModelerAbstractAction {
         updateModel(updateSelected);
         if (!movedFromDbSchema) {
             if (updateSelected) {
-                tree.startEditingAtPath(new TreePath(((DbImportTreeNode) selectedElement.getLastChild()).getPath()));
+                tree.startEditingAtPath(new TreePath(selectedElement.getLastChild().getPath()));
             } else {
-                tree.startEditingAtPath(new TreePath(((DbImportTreeNode) parentElement.getLastChild()).getPath()));
+                tree.startEditingAtPath(new TreePath(parentElement.getLastChild().getPath()));
             }
         }
         resetActionFlags();
@@ -209,19 +205,19 @@ public abstract class TreeManipulationAction extends ModelerAbstractAction {
         insertableNodeName = "";
     }
 
-    void setInsertableNodeName(String nodeName) {
+    public void setInsertableNodeName(String nodeName) {
         this.insertableNodeName = nodeName;
     }
 
-    void setMultipleAction(boolean multipleAction) {
+    public void setMultipleAction(boolean multipleAction) {
         isMultipleAction = multipleAction;
     }
 
-    void setMovedFromDbSchema(boolean movedFromDbSchema) {
+    public void setMovedFromDbSchema(boolean movedFromDbSchema) {
         this.movedFromDbSchema = movedFromDbSchema;
     }
 
-    void setFoundNode(DbImportTreeNode node) {
+    public void setFoundNode(DbImportTreeNode node) {
         this.foundNode = node;
     }
 }


(cayenne) 01/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 9cd71d4812944a0e11cd422b53c7512864ea93d6
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
---
 .../modeler/{util => swing/table}/TableSizer.java  |   2 +-
 .../modeler/swing/text/CayenneTextPane.java        |  27 +--
 .../swing/text/CayenneTextPaneEditorKit.java       | 235 +++++++++++++++++++++
 .../cayenne/modeler/swing/text/TextPaneView.java   | 230 --------------------
 .../modeler/swing/text/TextPaneViewFactory.java    |  37 ----
 .../InferRelationshipsTabController.java           |   2 +-
 .../modeler/ui/dbgen/TableSelectorController.java  |   2 +-
 .../cgen/CgenArtefactSelectorController.java       |   2 +-
 8 files changed, 241 insertions(+), 296 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableSizer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/TableSizer.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableSizer.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/TableSizer.java
index c108b8a90..a18007ddd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TableSizer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/table/TableSizer.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.swing.table;
 
 import javax.swing.*;
 import javax.swing.table.TableCellRenderer;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java
index 34ef85ea2..d746b7b9f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java
@@ -30,8 +30,6 @@ import javax.swing.text.BadLocationException;
 import javax.swing.text.Document;
 import javax.swing.text.Highlighter;
 import javax.swing.text.JTextComponent;
-import javax.swing.text.StyledEditorKit;
-import javax.swing.text.ViewFactory;
 import java.awt.*;
 import java.awt.event.MouseEvent;
 import java.awt.geom.Rectangle2D;
@@ -137,7 +135,7 @@ public class CayenneTextPane extends JPanel {
         setMinimumSize(dimension);
         setBorder(null);
 
-        pane = new JTextPaneScrollable(new EditorKit(syntax)) {
+        pane = new JTextPaneScrollable(new CayenneTextPaneEditorKit(syntax)) {
             public void paint(Graphics g) {
                 super.paint(g);
                 CayenneTextPane.this.repaint();
@@ -340,7 +338,7 @@ public class CayenneTextPane extends JPanel {
 
     class JTextPaneScrollable extends JTextPane {
 
-        JTextPaneScrollable(EditorKit editorKit) {
+        JTextPaneScrollable(CayenneTextPaneEditorKit editorKit) {
             // Set editor kit
             this.setEditorKitForContentType(editorKit.getContentType(), editorKit);
             this.setContentType(editorKit.getContentType());
@@ -363,25 +361,4 @@ public class CayenneTextPane extends JPanel {
         }
     }
 
-    static class EditorKit extends StyledEditorKit {
-
-        private final ViewFactory xmlViewFactory;
-        private final String contentType;
-
-        public EditorKit(TextSyntax syntax) {
-            contentType = syntax.contentType();
-            xmlViewFactory = new TextPaneViewFactory(syntax);
-        }
-
-        @Override
-        public ViewFactory getViewFactory() {
-            return xmlViewFactory;
-        }
-
-        @Override
-        public String getContentType() {
-            return contentType;
-        }
-    }
-
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java
new file mode 100644
index 000000000..500b3e9f9
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java
@@ -0,0 +1,235 @@
+package org.apache.cayenne.modeler.swing.text;
+
+import org.apache.cayenne.modeler.swing.text.style.SyntaxStyle;
+import org.apache.cayenne.modeler.swing.text.style.TextPaneStyleMap;
+import org.apache.cayenne.modeler.swing.text.style.TextPaneStyleTypes;
+import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
+
+import javax.swing.text.BadLocationException;
+import javax.swing.text.Element;
+import javax.swing.text.PlainDocument;
+import javax.swing.text.PlainView;
+import javax.swing.text.Segment;
+import javax.swing.text.StyledDocument;
+import javax.swing.text.StyledEditorKit;
+import javax.swing.text.Utilities;
+import javax.swing.text.ViewFactory;
+import java.awt.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+class CayenneTextPaneEditorKit extends StyledEditorKit {
+
+    private final ViewFactory xmlViewFactory;
+    private final String contentType;
+
+    public CayenneTextPaneEditorKit(TextSyntax syntax) {
+        contentType = syntax.contentType();
+        xmlViewFactory = e -> new TextPaneView(e, syntax);
+    }
+
+    @Override
+    public ViewFactory getViewFactory() {
+        return xmlViewFactory;
+    }
+
+    @Override
+    public String getContentType() {
+        return contentType;
+    }
+
+    static class TextPaneView extends PlainView {
+
+        private static final HashMap<Pattern, SyntaxStyle> patternSyntaxStyle;
+        private static final Pattern patternComment;
+        private static final Pattern patternCommentStart;
+
+        private static final SyntaxStyle syntaxStyleComment;
+        private static final HashMap<Pattern, SyntaxStyle> patternValue;
+        private static final TextPaneStyleMap style = new TextPaneStyleMap();
+
+        static {
+            patternSyntaxStyle = new HashMap<>();
+            patternValue = new HashMap<>();
+            patternComment = Pattern.compile(TextSyntax.COMMENT_TEXT,
+                    Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
+            patternCommentStart = Pattern.compile(TextSyntax.COMMENT_TEXT_START,
+                    Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
+            syntaxStyleComment = style.syntaxStyleMap.get(TextPaneStyleTypes.COMMENT);
+        }
+
+        public TextPaneView(Element elem, TextSyntax syntax) {
+            super(elem);
+            getDocument().putProperty(PlainDocument.tabSizeAttribute, 4);
+
+            if (patternSyntaxStyle.isEmpty()) {
+                addConstants(syntax.keywords(), TextPaneStyleTypes.KEYWORDS);
+                addConstants(syntax.keywords2(), TextPaneStyleTypes.KEYWORDS2);
+                addConstants(syntax.operators(), TextPaneStyleTypes.KEYWORDS);
+                addConstants(syntax.types(), TextPaneStyleTypes.TYPE);
+            }
+
+            if (patternValue.isEmpty()) {
+                patternValue.put(
+                        Pattern.compile(TextSyntax.NUMBER_TEXT),
+                        style.syntaxStyleMap.get(TextPaneStyleTypes.NUMBER));
+            }
+        }
+
+        private void addConstants(String[] constants, TextPaneStyleTypes type) {
+            for (String keyword : constants) {
+                String pattern = "(" + keyword + ")";
+                patternSyntaxStyle.put(
+                        Pattern.compile(pattern, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE),
+                        style.syntaxStyleMap.get(type));
+            }
+        }
+
+        @Override
+        protected float drawUnselectedText(Graphics2D graphics, float x, float y, int p0, int p1)
+                throws BadLocationException {
+
+            boolean lineComment = false;
+            Map<Integer, Integer> comment = new HashMap<>();
+            Map<Integer, Integer> commentInLine = new HashMap<>();
+            StyledDocument doc = (StyledDocument) getDocument();
+
+            String text = doc.getText(p0, p1 - p0);
+            Segment segment = getLineBuffer();
+
+            Matcher m = patternComment.matcher(doc.getText(0, doc.getLength()));
+            int maxEnd = 0;
+            while (m.find()) {
+                comment.put(m.start(), m.end());
+                if (maxEnd < m.end()) {
+                    maxEnd = m.end();
+                }
+            }
+            Matcher m3 = patternCommentStart.matcher(doc.getText(0, doc.getLength()));
+            while (m3.find()) {
+                if (maxEnd < m3.start()) {
+                    comment.put(m3.start(), doc.getLength());
+                    break;
+                }
+            }
+
+            for (Map.Entry<Integer, Integer> entry : comment.entrySet()) {
+                if (p0 >= entry.getKey() && p1 <= entry.getValue()) {
+                    lineComment = true;
+                    break;
+                } else if (p0 < entry.getKey() && p1 > entry.getValue()) {
+                    commentInLine.put(entry.getKey() - p0, entry.getValue() - p0);
+                } else if (p0 < entry.getKey() && p1 >= entry.getKey()) {
+                    commentInLine.put(entry.getKey() - p0, p1 - p0);
+                } else if (p0 <= entry.getValue() && p1 > entry.getValue()) {
+                    commentInLine.put(0, entry.getValue() - p0);
+                }
+            }
+
+            SortedMap<Integer, Integer> startMap = new TreeMap<>();
+            SortedMap<Integer, SyntaxStyle> syntaxStyleMap = new TreeMap<>();
+
+            if (lineComment) {
+                startMap.put(0, text.length());
+                syntaxStyleMap.put(0, syntaxStyleComment);
+            } else {
+                for (Map.Entry<Integer, Integer> entryCommentInLine : commentInLine.entrySet()) {
+                    startMap.put(entryCommentInLine.getKey(), entryCommentInLine.getValue());
+                    syntaxStyleMap.put(entryCommentInLine.getKey(), syntaxStyleComment);
+                }
+                // Match all regexes on this snippet, store positions
+                for (Map.Entry<Pattern, SyntaxStyle> entry : patternSyntaxStyle.entrySet()) {
+                    Matcher matcher = entry.getKey().matcher(text);
+                    while (matcher.find()) {
+                        if ((text.length() == matcher.end()
+                                || text.charAt(matcher.end()) == '\t'
+                                || text.charAt(matcher.end()) == ' '
+                                || text.charAt(matcher.end()) == '\n')
+                                && (matcher.start() == 0
+                                || text.charAt(matcher.start() - 1) == '\t'
+                                || text.charAt(matcher.start() - 1) == '\n'
+                                || text.charAt(matcher.start() - 1) == ' ')) {
+                            boolean inComment = false;
+                            for (Map.Entry<Integer, Integer> entryCommentInLine : commentInLine.entrySet()) {
+                                if (matcher.start(1) >= entryCommentInLine.getKey()
+                                        && matcher.end() <= entryCommentInLine.getValue()) {
+                                    inComment = true;
+                                    break;
+                                }
+                            }
+                            if (!inComment) {
+                                startMap.put(matcher.start(1), matcher.end());
+                                syntaxStyleMap.put(matcher.start(1), entry.getValue());
+                            }
+                        }
+                    }
+                }
+
+                for (Map.Entry<Pattern, SyntaxStyle> entry : patternValue.entrySet()) {
+                    Matcher matcher = entry.getKey().matcher(text);
+                    while (matcher.find()) {
+                        if ((text.length() == matcher.end()
+                                || text.charAt(matcher.end()) == ' '
+                                || text.charAt(matcher.end()) == ')'
+                                || text.charAt(matcher.end()) == '\t'
+                                || text.charAt(matcher.end()) == '\n')
+                                && (matcher.start() == 0
+                                || text.charAt(matcher.start() - 1) == '\t'
+                                || text.charAt(matcher.start() - 1) == ' '
+                                || text.charAt(matcher.start() - 1) == '='
+                                || text.charAt(matcher.start() - 1) == '(')) {
+                            boolean inComment = false;
+                            for (Map.Entry<Integer, Integer> entryCommentInLine : commentInLine.entrySet()) {
+                                if (matcher.start() >= entryCommentInLine.getKey()
+                                        && matcher.end() <= entryCommentInLine.getValue()) {
+                                    inComment = true;
+                                    break;
+                                }
+                            }
+                            if (!inComment) {
+                                startMap.put(matcher.start(), matcher.end());
+                                syntaxStyleMap.put(matcher.start(), entry.getValue());
+                            }
+                        }
+                    }
+                }
+            }
+            // TODO: check the map for overlapping parts
+
+            int i = 0;
+            // Colour the parts
+            for (Map.Entry<Integer, Integer> entry : startMap.entrySet()) {
+                int start = entry.getKey();
+                int end = entry.getValue();
+
+                if (i < start) {
+                    graphics.setColor(TextSyntax.DEFAULT_COLOR);
+                    graphics.setFont(TextSyntax.DEFAULT_FONT);
+                    doc.getText(p0 + i, start - i, segment);
+                    x = Utilities.drawTabbedText(segment, x, y, graphics, this, i);
+                }
+
+                graphics.setFont(syntaxStyleMap.get(start).getFont());
+                graphics.setColor(syntaxStyleMap.get(start).getColor());
+                i = end;
+                doc.getText(p0 + start, i - start, segment);
+
+                x = Utilities.drawTabbedText(segment, x, y, graphics, this, start);
+            }
+
+            // Paint possible remaining text black
+            if (i < text.length()) {
+                graphics.setColor(TextSyntax.DEFAULT_COLOR);
+                graphics.setFont(TextSyntax.DEFAULT_FONT);
+                doc.getText(p0 + i, text.length() - i, segment);
+                x = Utilities.drawTabbedText(segment, x, y, graphics, this, i);
+            }
+
+            return x;
+        }
+    }
+}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/TextPaneView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/TextPaneView.java
deleted file mode 100644
index b15efc21e..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/TextPaneView.java
+++ /dev/null
@@ -1,230 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.swing.text;
-
-import org.apache.cayenne.modeler.swing.text.style.SyntaxStyle;
-import org.apache.cayenne.modeler.swing.text.style.TextPaneStyleMap;
-import org.apache.cayenne.modeler.swing.text.style.TextPaneStyleTypes;
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
-
-import javax.swing.text.BadLocationException;
-import javax.swing.text.Element;
-import javax.swing.text.PlainDocument;
-import javax.swing.text.PlainView;
-import javax.swing.text.Segment;
-import javax.swing.text.StyledDocument;
-import javax.swing.text.Utilities;
-import java.awt.*;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class TextPaneView extends PlainView {
-
-    private static final HashMap<Pattern, SyntaxStyle> patternSyntaxStyle;
-    private static final Pattern patternComment;
-    private static final Pattern patternCommentStart;
-
-    private static final SyntaxStyle syntaxStyleComment;
-    private static final HashMap<Pattern, SyntaxStyle> patternValue;
-    private static final TextPaneStyleMap style = new TextPaneStyleMap();
-
-    static {
-        patternSyntaxStyle = new HashMap<>();
-        patternValue = new HashMap<>();
-        patternComment = Pattern.compile(TextSyntax.COMMENT_TEXT,
-                                         Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
-        patternCommentStart = Pattern.compile(TextSyntax.COMMENT_TEXT_START,
-                                              Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
-        syntaxStyleComment = style.syntaxStyleMap.get(TextPaneStyleTypes.COMMENT);
-    }
-
-    public TextPaneView(Element elem, TextSyntax syntax) {
-        super(elem);
-        getDocument().putProperty(PlainDocument.tabSizeAttribute, 4);
-
-        if (patternSyntaxStyle.isEmpty()) {
-            addConstants(syntax.keywords(), TextPaneStyleTypes.KEYWORDS);
-            addConstants(syntax.keywords2(), TextPaneStyleTypes.KEYWORDS2);
-            addConstants(syntax.operators(), TextPaneStyleTypes.KEYWORDS);
-            addConstants(syntax.types(), TextPaneStyleTypes.TYPE);
-        }
-
-        if (patternValue.isEmpty()) {
-            patternValue.put(
-                Pattern.compile(TextSyntax.NUMBER_TEXT),
-                style.syntaxStyleMap.get(TextPaneStyleTypes.NUMBER));
-        }
-    }
-
-    private void addConstants(String[] constants, TextPaneStyleTypes type) {
-        for (String keyword : constants) {
-            String pattern = "(" + keyword + ")";
-            patternSyntaxStyle.put(
-                Pattern.compile(pattern, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE),
-                style.syntaxStyleMap.get(type));
-        }
-    }
-
-    @Override
-    protected float drawUnselectedText(Graphics2D graphics, float x, float y, int p0, int p1)
-        throws BadLocationException {
-
-        boolean lineComment = false;
-        Map<Integer, Integer> comment = new HashMap<>();
-        Map<Integer, Integer> commentInLine = new HashMap<>();
-        StyledDocument doc = (StyledDocument) getDocument();
-
-        String text = doc.getText(p0, p1 - p0);
-        Segment segment = getLineBuffer();
-
-        Matcher m = patternComment.matcher(doc.getText(0, doc.getLength()));
-        int maxEnd = 0;
-        while (m.find()) {
-            comment.put(m.start(), m.end());
-            if (maxEnd < m.end()) {
-                maxEnd = m.end();
-            }
-        }
-        Matcher m3 = patternCommentStart.matcher(doc.getText(0, doc.getLength()));
-        while (m3.find()) {
-            if (maxEnd < m3.start()) {
-                comment.put(m3.start(), doc.getLength());
-                break;
-            }
-        }
-
-        for (Map.Entry<Integer, Integer> entry : comment.entrySet()) {
-            if (p0 >= entry.getKey() && p1 <= entry.getValue()) {
-                lineComment = true;
-                break;
-            } else if (p0 < entry.getKey() && p1 > entry.getValue()) {
-                commentInLine.put(entry.getKey() - p0, entry.getValue() - p0);
-            } else if (p0 < entry.getKey() && p1 >= entry.getKey()) {
-                commentInLine.put(entry.getKey() - p0, p1 - p0);
-            } else if (p0 <= entry.getValue() && p1 > entry.getValue()) {
-                commentInLine.put(0, entry.getValue() - p0);
-            }
-        }
-
-        SortedMap<Integer, Integer> startMap = new TreeMap<>();
-        SortedMap<Integer, SyntaxStyle> syntaxStyleMap = new TreeMap<>();
-
-        if (lineComment) {
-            startMap.put(0, text.length());
-            syntaxStyleMap.put(0, syntaxStyleComment);
-        } else {
-            for (Map.Entry<Integer, Integer> entryCommentInLine : commentInLine.entrySet()) {
-                startMap.put(entryCommentInLine.getKey(), entryCommentInLine.getValue());
-                syntaxStyleMap.put(entryCommentInLine.getKey(), syntaxStyleComment);
-            }
-            // Match all regexes on this snippet, store positions
-            for (Map.Entry<Pattern, SyntaxStyle> entry : patternSyntaxStyle.entrySet()) {
-                Matcher matcher = entry.getKey().matcher(text);
-                while (matcher.find()) {
-                    if ((text.length() == matcher.end()
-                         || text.charAt(matcher.end()) == '\t'
-                         || text.charAt(matcher.end()) == ' '
-                         || text.charAt(matcher.end()) == '\n')
-                        && (matcher.start() == 0
-                            || text.charAt(matcher.start() - 1) == '\t'
-                            || text.charAt(matcher.start() - 1) == '\n'
-                            || text.charAt(matcher.start() - 1) == ' ')) {
-                        boolean inComment = false;
-                        for (Map.Entry<Integer, Integer> entryCommentInLine : commentInLine.entrySet()) {
-                            if (matcher.start(1) >= entryCommentInLine.getKey()
-                                && matcher.end() <= entryCommentInLine.getValue()) {
-                                inComment = true;
-                                break;
-                            }
-                        }
-                        if (!inComment) {
-                            startMap.put(matcher.start(1), matcher.end());
-                            syntaxStyleMap.put(matcher.start(1), entry.getValue());
-                        }
-                    }
-                }
-            }
-
-            for (Map.Entry<Pattern, SyntaxStyle> entry : patternValue.entrySet()) {
-                Matcher matcher = entry.getKey().matcher(text);
-                while (matcher.find()) {
-                    if ((text.length() == matcher.end()
-                         || text.charAt(matcher.end()) == ' '
-                         || text.charAt(matcher.end()) == ')'
-                         || text.charAt(matcher.end()) == '\t'
-                         || text.charAt(matcher.end()) == '\n')
-                        && (matcher.start() == 0
-                            || text.charAt(matcher.start() - 1) == '\t'
-                            || text.charAt(matcher.start() - 1) == ' '
-                            || text.charAt(matcher.start() - 1) == '='
-                            || text.charAt(matcher.start() - 1) == '(')) {
-                        boolean inComment = false;
-                        for (Map.Entry<Integer, Integer> entryCommentInLine : commentInLine.entrySet()) {
-                            if (matcher.start() >= entryCommentInLine.getKey()
-                                && matcher.end() <= entryCommentInLine.getValue()) {
-                                inComment = true;
-                                break;
-                            }
-                        }
-                        if (!inComment) {
-                            startMap.put(matcher.start(), matcher.end());
-                            syntaxStyleMap.put(matcher.start(), entry.getValue());
-                        }
-                    }
-                }
-            }
-        }
-        // TODO: check the map for overlapping parts
-
-        int i = 0;
-        // Colour the parts
-        for (Map.Entry<Integer, Integer> entry : startMap.entrySet()) {
-            int start = entry.getKey();
-            int end = entry.getValue();
-
-            if (i < start) {
-                graphics.setColor(TextSyntax.DEFAULT_COLOR);
-                graphics.setFont(TextSyntax.DEFAULT_FONT);
-                doc.getText(p0 + i, start - i, segment);
-                x = Utilities.drawTabbedText(segment, x, y, graphics, this, i);
-            }
-
-            graphics.setFont(syntaxStyleMap.get(start).getFont());
-            graphics.setColor(syntaxStyleMap.get(start).getColor());
-            i = end;
-            doc.getText(p0 + start, i - start, segment);
-
-            x = Utilities.drawTabbedText(segment, x, y, graphics, this, start);
-        }
-
-        // Paint possible remaining text black
-        if (i < text.length()) {
-            graphics.setColor(TextSyntax.DEFAULT_COLOR);
-            graphics.setFont(TextSyntax.DEFAULT_FONT);
-            doc.getText(p0 + i, text.length() - i, segment);
-            x = Utilities.drawTabbedText(segment, x, y, graphics, this, i);
-        }
-
-        return x;
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/TextPaneViewFactory.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/TextPaneViewFactory.java
deleted file mode 100644
index 69170d78c..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/TextPaneViewFactory.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.swing.text;
-
-import javax.swing.text.Element;
-import javax.swing.text.View;
-import javax.swing.text.ViewFactory;
-
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
-
-public class TextPaneViewFactory extends Object implements ViewFactory {
-
-    TextSyntax syntax;
-    public TextPaneViewFactory(TextSyntax syntax) {
-        this.syntax = syntax;
-    }
-
-    public View create(Element elem) {
-        return new TextPaneView(elem, syntax);
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsTabController.java
index 703917623..4e6408e26 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsTabController.java
@@ -19,7 +19,7 @@
 package org.apache.cayenne.modeler.ui.autorelationship;
 
 import org.apache.cayenne.modeler.mvc.ChildController;
-import org.apache.cayenne.modeler.util.TableSizer;
+import org.apache.cayenne.modeler.swing.table.TableSizer;
 
 import javax.swing.table.AbstractTableModel;
 import java.awt.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java
index 909d0dcd8..0c82c09d2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/TableSelectorController.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.mvc.ChildController;
-import org.apache.cayenne.modeler.util.TableSizer;
+import org.apache.cayenne.modeler.swing.table.TableSizer;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.validation.ProjectValidator;
 import org.apache.cayenne.validation.ValidationFailure;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtefactSelectorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtefactSelectorController.java
index 52f1f485c..22e9a4a13 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtefactSelectorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenArtefactSelectorController.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.modeler.swing.CellRenderers;
 import org.apache.cayenne.modeler.swing.table.CheckBoxHeader;
 import org.apache.cayenne.modeler.swing.table.ImageRendererColumn;
 import org.apache.cayenne.modeler.util.ModelerUtil;
-import org.apache.cayenne.modeler.util.TableSizer;
+import org.apache.cayenne.modeler.swing.table.TableSizer;
 import org.apache.cayenne.validation.ValidationFailure;
 import org.apache.cayenne.validation.ValidationResult;
 


(cayenne) 11/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 7aafab8b0b79d74ffde26c180f78fd2a3a3246e3
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
---
 .../cayenne/modeler/pref/ProjectSelectionMemo.java | 691 +++++++++++++++++++++
 .../modeler/pref/ProjectStatePreferences.java      |  19 +
 .../pref/project/AttributeDisplayEventType.java    | 106 ----
 .../pref/project/DataMapDisplayEventType.java      |  68 --
 .../pref/project/DataNodeDisplayEventType.java     |  55 --
 .../modeler/pref/project/DisplayEventType.java     |  80 ---
 .../modeler/pref/project/DisplayEventTypes.java    | 198 ------
 .../pref/project/DomainDisplayEventType.java       |  49 --
 .../EmbeddableAttributeDisplayEventType.java       |  98 ---
 .../pref/project/EmbeddableDisplayEventType.java   |  62 --
 .../pref/project/EntityDisplayEventType.java       |  98 ---
 .../project/MultipleObjectsDisplayEventType.java   | 166 -----
 .../pref/project/ProcedureDisplayEventType.java    |  63 --
 .../ProcedureParameterDisplayEventType.java        |  93 ---
 .../pref/project/QueryDisplayEventType.java        |  62 --
 .../pref/project/RelationshipDisplayEventType.java | 106 ----
 .../modeler/ui/project/ProjectController.java      |  39 +-
 17 files changed, 712 insertions(+), 1341 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectSelectionMemo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectSelectionMemo.java
new file mode 100644
index 000000000..ad52bcd50
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectSelectionMemo.java
@@ -0,0 +1,691 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.pref;
+
+import org.apache.cayenne.configuration.ConfigurationNode;
+import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.DataNodeDescriptor;
+import org.apache.cayenne.map.Attribute;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.map.QueryDescriptor;
+import org.apache.cayenne.map.Relationship;
+import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
+import org.apache.cayenne.modeler.event.display.DataNodeDisplayEvent;
+import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
+import org.apache.cayenne.modeler.event.display.EmbeddableAttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
+import org.apache.cayenne.modeler.event.display.MultipleObjectsDisplayEvent;
+import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
+import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
+import org.apache.cayenne.modeler.event.display.QueryDisplayEvent;
+import org.apache.cayenne.modeler.event.display.RelationshipDisplayEvent;
+import org.apache.cayenne.modeler.ui.project.ProjectController;
+import org.apache.cayenne.util.CayenneMapEntry;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Saves and restores the modeler's last project selection through {@link ProjectStatePreferences}.
+ * Replaces the parallel {@code DisplayEventType} hierarchy by deriving the selection kind directly
+ * from the controller state and dispatching to the right {@code controller.display*()} method.
+ */
+final class ProjectSelectionMemo {
+
+    enum Kind {
+        domain, dataNode, dataMap,
+        objEntity, dbEntity,
+        objAttributes, dbAttributes,
+        objRelationships, dbRelationships,
+        embeddable, embeddableAttributes,
+        procedure, procedureParameters,
+        query, multipleObjects
+    }
+
+    private ProjectSelectionMemo() {
+    }
+
+    static void save(ProjectController controller, ProjectStatePreferences prefs) {
+        Kind kind = leafKind(controller);
+        if (kind == null) {
+            return;
+        }
+
+        prefs.setEvent(kind.name());
+
+        switch (kind) {
+            case domain:
+                saveDomainPath(controller, prefs);
+                break;
+            case dataNode:
+                saveNodePath(controller, prefs);
+                break;
+            case dataMap:
+                saveDataMapPath(controller, prefs);
+                break;
+            case objEntity:
+            case dbEntity:
+                saveEntityPath(controller, prefs);
+                break;
+            case objAttributes:
+                saveEntityPath(controller, prefs);
+                prefs.setObjAttrs(joinNames(controller.getSelectedObjAttributes()));
+                break;
+            case dbAttributes:
+                saveEntityPath(controller, prefs);
+                prefs.setDbAttrs(joinNames(controller.getSelectedDbAttributes()));
+                break;
+            case objRelationships:
+                saveEntityPath(controller, prefs);
+                prefs.setObjRels(joinNames(controller.getSelectedObjRelationships()));
+                break;
+            case dbRelationships:
+                saveEntityPath(controller, prefs);
+                prefs.setDbRels(joinNames(controller.getSelectedDbRelationships()));
+                break;
+            case embeddable:
+                saveEmbeddablePath(controller, prefs);
+                break;
+            case embeddableAttributes:
+                saveEmbeddablePath(controller, prefs);
+                prefs.setEmbAttrs(joinEmbeddableAttributeNames(controller.getSelectedEmbeddableAttributes()));
+                break;
+            case procedure:
+                saveProcedurePath(controller, prefs);
+                break;
+            case procedureParameters:
+                saveProcedurePath(controller, prefs);
+                prefs.setProcedureParams(joinNames(controller.getSelectedProcedureParameters()));
+                break;
+            case query:
+                saveQueryPath(controller, prefs);
+                break;
+            case multipleObjects:
+                saveMultipleObjects(controller, prefs);
+                break;
+        }
+    }
+
+    static void restore(ProjectController controller, ProjectStatePreferences prefs) {
+        Kind kind = parseKind(prefs.getEvent());
+        if (kind == null) {
+            return;
+        }
+
+        DataChannelDescriptor domain = (DataChannelDescriptor) controller.getProject().getRootNode();
+        if (!domain.getName().equals(prefs.getDomain())) {
+            return;
+        }
+
+        switch (kind) {
+            case domain:
+                controller.displayDomain(new DomainDisplayEvent(ProjectSelectionMemo.class, domain));
+                break;
+            case dataNode:
+                restoreDataNode(controller, domain, prefs);
+                break;
+            case dataMap:
+                restoreDataMap(controller, domain, prefs);
+                break;
+            case objEntity:
+            case dbEntity:
+                restoreEntity(controller, domain, prefs);
+                break;
+            case objAttributes:
+            case dbAttributes:
+                restoreAttributes(controller, domain, prefs);
+                break;
+            case objRelationships:
+            case dbRelationships:
+                restoreRelationships(controller, domain, prefs);
+                break;
+            case embeddable:
+                restoreEmbeddable(controller, domain, prefs);
+                break;
+            case embeddableAttributes:
+                restoreEmbeddableAttributes(controller, domain, prefs);
+                break;
+            case procedure:
+                restoreProcedure(controller, domain, prefs);
+                break;
+            case procedureParameters:
+                restoreProcedureParameters(controller, domain, prefs);
+                break;
+            case query:
+                restoreQuery(controller, domain, prefs);
+                break;
+            case multipleObjects:
+                restoreMultipleObjects(controller, domain, prefs);
+                break;
+        }
+    }
+
+    private static Kind leafKind(ProjectController c) {
+        if (c.getSelectedObjAttributes() != null && c.getSelectedObjAttributes().length > 0) {
+            return Kind.objAttributes;
+        }
+        if (c.getSelectedDbAttributes() != null && c.getSelectedDbAttributes().length > 0) {
+            return Kind.dbAttributes;
+        }
+        if (c.getSelectedObjRelationships() != null && c.getSelectedObjRelationships().length > 0) {
+            return Kind.objRelationships;
+        }
+        if (c.getSelectedDbRelationships() != null && c.getSelectedDbRelationships().length > 0) {
+            return Kind.dbRelationships;
+        }
+        if (c.getSelectedEmbeddableAttributes() != null && c.getSelectedEmbeddableAttributes().length > 0) {
+            return Kind.embeddableAttributes;
+        }
+        if (c.getSelectedProcedureParameters() != null && c.getSelectedProcedureParameters().length > 0) {
+            return Kind.procedureParameters;
+        }
+        if (c.getSelectedObjEntity() != null) {
+            return Kind.objEntity;
+        }
+        if (c.getSelectedDbEntity() != null) {
+            return Kind.dbEntity;
+        }
+        if (c.getSelectedEmbeddable() != null) {
+            return Kind.embeddable;
+        }
+        if (c.getSelectedProcedure() != null) {
+            return Kind.procedure;
+        }
+        if (c.getSelectedQuery() != null) {
+            return Kind.query;
+        }
+        if (c.getSelectedDataMap() != null) {
+            return Kind.dataMap;
+        }
+        if (c.getSelectedDataNode() != null) {
+            return Kind.dataNode;
+        }
+        if (c.getSelectedPaths() != null && c.getSelectedPaths().length > 0) {
+            return Kind.multipleObjects;
+        }
+        if (c.getSelectedDataDomain() != null) {
+            return Kind.domain;
+        }
+        return null;
+    }
+
+    private static Kind parseKind(String name) {
+        if (name == null || name.isEmpty()) {
+            return null;
+        }
+        try {
+            return Kind.valueOf(name);
+        } catch (IllegalArgumentException e) {
+            return null;
+        }
+    }
+
+    // -------------------- save helpers --------------------
+
+    private static void saveDomainPath(ProjectController controller, ProjectStatePreferences prefs) {
+        prefs.setDomain(controller.getSelectedDataDomain().getName());
+    }
+
+    private static void saveNodePath(ProjectController controller, ProjectStatePreferences prefs) {
+        prefs.setDomain(controller.getSelectedDataDomain().getName());
+        prefs.setNode(controller.getSelectedDataNode().getName());
+    }
+
+    private static void saveDataMapPath(ProjectController controller, ProjectStatePreferences prefs) {
+        DataChannelDescriptor domain = controller.getSelectedDataDomain();
+        if (domain == null) {
+            return;
+        }
+        prefs.setDomain(domain.getName());
+        DataNodeDescriptor node = controller.getSelectedDataNode();
+        prefs.setNode(node != null ? node.getName() : "");
+        DataMap dataMap = controller.getSelectedDataMap();
+        if (dataMap != null) {
+            prefs.setDataMap(dataMap.getName());
+        }
+    }
+
+    private static void saveEntityPath(ProjectController controller, ProjectStatePreferences prefs) {
+        prefs.setDomain(controller.getSelectedDataDomain().getName());
+        DataNodeDescriptor node = controller.getSelectedDataNode();
+        prefs.setNode(node != null ? node.getName() : "");
+        prefs.setDataMap(controller.getSelectedDataMap().getName());
+
+        ObjEntity objEntity = controller.getSelectedObjEntity();
+        DbEntity dbEntity = controller.getSelectedDbEntity();
+        if (objEntity != null) {
+            prefs.setObjEntity(objEntity.getName());
+            prefs.setDbEntity(null);
+        } else if (dbEntity != null) {
+            prefs.setDbEntity(dbEntity.getName());
+            prefs.setObjEntity(null);
+        }
+    }
+
+    private static void saveEmbeddablePath(ProjectController controller, ProjectStatePreferences prefs) {
+        prefs.setDomain(controller.getSelectedDataDomain().getName());
+        prefs.setDataMap(controller.getSelectedDataMap().getName());
+        prefs.setEmbeddable(controller.getSelectedEmbeddable().getClassName());
+    }
+
+    private static void saveProcedurePath(ProjectController controller, ProjectStatePreferences prefs) {
+        prefs.setDomain(controller.getSelectedDataDomain().getName());
+        prefs.setDataMap(controller.getSelectedDataMap().getName());
+        prefs.setProcedure(controller.getSelectedProcedure().getName());
+    }
+
+    private static void saveQueryPath(ProjectController controller, ProjectStatePreferences prefs) {
+        prefs.setDomain(controller.getSelectedDataDomain().getName());
+        prefs.setDataMap(controller.getSelectedDataMap().getName());
+        prefs.setQuery(controller.getSelectedQuery().getName());
+    }
+
+    private static void saveMultipleObjects(ProjectController controller, ProjectStatePreferences prefs) {
+        prefs.setParentObject(nameOf(controller.getSelectedParentPath()));
+
+        ConfigurationNode[] paths = controller.getSelectedPaths();
+        if (paths == null) {
+            prefs.setMultipleObjects("");
+            return;
+        }
+
+        StringBuilder sb = new StringBuilder();
+        for (ConfigurationNode object : paths) {
+            String objectName = nameOf(object);
+            if (!objectName.isEmpty()) {
+                sb.append(objectName).append(",");
+            }
+        }
+        prefs.setMultipleObjects(sb.toString());
+    }
+
+    // -------------------- restore helpers --------------------
+
+    private static void restoreDataNode(ProjectController controller, DataChannelDescriptor domain,
+                                        ProjectStatePreferences prefs) {
+        DataNodeDescriptor node = domain.getNodeDescriptor(prefs.getNode());
+        if (node == null) {
+            return;
+        }
+        controller.displayDataNode(new DataNodeDisplayEvent(ProjectSelectionMemo.class, domain, node));
+    }
+
+    private static void restoreDataMap(ProjectController controller, DataChannelDescriptor domain,
+                                       ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        DataNodeDescriptor node = domain.getNodeDescriptor(prefs.getNode());
+        controller.displayDataMap(new DataMapDisplayEvent(ProjectSelectionMemo.class, dataMap, domain, node));
+    }
+
+    private static void restoreEntity(ProjectController controller, DataChannelDescriptor domain,
+                                      ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        Entity<?, ?, ?> entity = lookupEntity(dataMap, prefs);
+        if (entity == null) {
+            return;
+        }
+        DataNodeDescriptor node = domain.getNodeDescriptor(prefs.getNode());
+        EntityDisplayEvent event = new EntityDisplayEvent(ProjectSelectionMemo.class, entity, dataMap, node, domain);
+        if (entity instanceof ObjEntity) {
+            controller.displayObjEntity(event);
+        } else if (entity instanceof DbEntity) {
+            controller.displayDbEntity(event);
+        }
+    }
+
+    private static void restoreAttributes(ProjectController controller, DataChannelDescriptor domain,
+                                          ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        Entity<?, ?, ?> entity = lookupEntity(dataMap, prefs);
+        if (entity == null) {
+            return;
+        }
+        DataNodeDescriptor node = domain.getNodeDescriptor(prefs.getNode());
+
+        EntityDisplayEvent entityEvent = new EntityDisplayEvent(ProjectSelectionMemo.class, entity, dataMap, node, domain);
+        Attribute<?, ?, ?>[] attrs = lookupEntityAttributes(entity, prefs);
+        AttributeDisplayEvent attrEvent = new AttributeDisplayEvent(ProjectSelectionMemo.class, attrs, entity, dataMap, domain);
+
+        if (entity instanceof ObjEntity) {
+            controller.displayObjEntity(entityEvent);
+            controller.displayObjAttribute(attrEvent);
+        } else if (entity instanceof DbEntity) {
+            controller.displayDbEntity(entityEvent);
+            controller.displayDbAttribute(attrEvent);
+        }
+    }
+
+    private static void restoreRelationships(ProjectController controller, DataChannelDescriptor domain,
+                                             ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        Entity<?, ?, ?> entity = lookupEntity(dataMap, prefs);
+        if (entity == null) {
+            return;
+        }
+        DataNodeDescriptor node = domain.getNodeDescriptor(prefs.getNode());
+
+        EntityDisplayEvent entityEvent = new EntityDisplayEvent(ProjectSelectionMemo.class, entity, dataMap, node, domain);
+        Relationship<?, ?, ?>[] rels = lookupEntityRelationships(entity, prefs);
+        RelationshipDisplayEvent relEvent = new RelationshipDisplayEvent(ProjectSelectionMemo.class, rels, entity, dataMap, domain);
+
+        if (entity instanceof ObjEntity) {
+            controller.displayObjEntity(entityEvent);
+            controller.displayObjRelationship(relEvent);
+        } else if (entity instanceof DbEntity) {
+            controller.displayDbEntity(entityEvent);
+            controller.displayDbRelationship(relEvent);
+        }
+    }
+
+    private static void restoreEmbeddable(ProjectController controller, DataChannelDescriptor domain,
+                                          ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        Embeddable embeddable = dataMap.getEmbeddable(prefs.getEmbeddable());
+        if (embeddable == null) {
+            return;
+        }
+        controller.displayEmbeddable(new EmbeddableDisplayEvent(ProjectSelectionMemo.class, embeddable, dataMap, domain));
+    }
+
+    private static void restoreEmbeddableAttributes(ProjectController controller, DataChannelDescriptor domain,
+                                                    ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        Embeddable embeddable = dataMap.getEmbeddable(prefs.getEmbeddable());
+        if (embeddable == null) {
+            return;
+        }
+        controller.displayEmbeddable(new EmbeddableDisplayEvent(ProjectSelectionMemo.class, embeddable, dataMap, domain));
+
+        EmbeddableAttribute[] attrs = lookupEmbeddableAttributes(embeddable, prefs);
+        controller.displayEmbeddableAttribute(new EmbeddableAttributeDisplayEvent(
+                ProjectSelectionMemo.class, embeddable, attrs, dataMap, domain));
+    }
+
+    private static void restoreProcedure(ProjectController controller, DataChannelDescriptor domain,
+                                         ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        Procedure procedure = dataMap.getProcedure(prefs.getProcedure());
+        if (procedure == null) {
+            return;
+        }
+        controller.displayProcedure(new ProcedureDisplayEvent(ProjectSelectionMemo.class, procedure, dataMap, domain));
+    }
+
+    private static void restoreProcedureParameters(ProjectController controller, DataChannelDescriptor domain,
+                                                   ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        Procedure procedure = dataMap.getProcedure(prefs.getProcedure());
+        if (procedure == null) {
+            return;
+        }
+        controller.displayProcedure(new ProcedureDisplayEvent(ProjectSelectionMemo.class, procedure, dataMap, domain));
+
+        ProcedureParameter[] params = lookupProcedureParameters(procedure, prefs);
+        controller.displayProcedureParameter(new ProcedureParameterDisplayEvent(
+                ProjectSelectionMemo.class, params, procedure, dataMap, domain));
+    }
+
+    private static void restoreQuery(ProjectController controller, DataChannelDescriptor domain,
+                                     ProjectStatePreferences prefs) {
+        DataMap dataMap = domain.getDataMap(prefs.getDataMap());
+        if (dataMap == null) {
+            return;
+        }
+        QueryDescriptor query = dataMap.getQueryDescriptor(prefs.getQuery());
+        if (query == null) {
+            return;
+        }
+        controller.displayQuery(new QueryDisplayEvent(ProjectSelectionMemo.class, query, dataMap, domain));
+    }
+
+    private static void restoreMultipleObjects(ProjectController controller, DataChannelDescriptor domain,
+                                               ProjectStatePreferences prefs) {
+        String parentName = prefs.getParentObject();
+        ConfigurationNode parent;
+        ConfigurationNode[] objects;
+
+        DataMap parentMap = domain.getDataMap(parentName);
+        DataNodeDescriptor parentNode = domain.getNodeDescriptor(parentName);
+
+        if (parentMap != null) {
+            parent = parentMap;
+            objects = lookupMultipleObjects(parentMap, prefs);
+        } else if (parentNode != null) {
+            parent = parentNode;
+            objects = lookupMultipleObjects(parentNode, prefs);
+        } else {
+            parent = domain;
+            objects = lookupMultipleObjects(domain, prefs);
+        }
+
+        controller.displayMultipleObjects(new MultipleObjectsDisplayEvent(ProjectSelectionMemo.class, objects, parent));
+    }
+
+    // -------------------- name lookups --------------------
+
+    private static Entity<?, ?, ?> lookupEntity(DataMap dataMap, ProjectStatePreferences prefs) {
+        return !prefs.getObjEntity().isEmpty()
+                ? dataMap.getObjEntity(prefs.getObjEntity())
+                : dataMap.getDbEntity(prefs.getDbEntity());
+    }
+
+    private static Attribute<?, ?, ?>[] lookupEntityAttributes(Entity<?, ?, ?> entity, ProjectStatePreferences prefs) {
+        String stored = (entity instanceof ObjEntity) ? prefs.getObjAttrs() : prefs.getDbAttrs();
+        List<Attribute<?, ?, ?>> result = new ArrayList<>();
+        for (String name : stored.split(",")) {
+            Attribute<?, ?, ?> attr = entity.getAttribute(name);
+            if (attr != null) {
+                result.add(attr);
+            }
+        }
+        return result.toArray(new Attribute[0]);
+    }
+
+    private static Relationship<?, ?, ?>[] lookupEntityRelationships(Entity<?, ?, ?> entity, ProjectStatePreferences prefs) {
+        String stored = (entity instanceof ObjEntity) ? prefs.getObjRels() : prefs.getDbRels();
+        List<Relationship<?, ?, ?>> result = new ArrayList<>();
+        for (String name : stored.split(",")) {
+            Relationship<?, ?, ?> rel = entity.getRelationship(name);
+            if (rel != null) {
+                result.add(rel);
+            }
+        }
+        return result.toArray(new Relationship[0]);
+    }
+
+    private static EmbeddableAttribute[] lookupEmbeddableAttributes(Embeddable embeddable, ProjectStatePreferences prefs) {
+        String stored = prefs.getEmbAttrs();
+        List<EmbeddableAttribute> result = new ArrayList<>();
+        if (stored.isEmpty()) {
+            return new EmbeddableAttribute[0];
+        }
+        for (String name : stored.split(",")) {
+            EmbeddableAttribute attr = embeddable.getAttribute(name);
+            if (attr != null) {
+                result.add(attr);
+            }
+        }
+        return result.toArray(new EmbeddableAttribute[0]);
+    }
+
+    private static ProcedureParameter[] lookupProcedureParameters(Procedure procedure, ProjectStatePreferences prefs) {
+        String stored = prefs.getProcedureParams();
+        List<ProcedureParameter> result = new ArrayList<>();
+        if (stored.isEmpty()) {
+            return new ProcedureParameter[0];
+        }
+        for (String name : stored.split(",")) {
+            for (ProcedureParameter p : procedure.getCallParameters()) {
+                if (p.getName().equals(name)) {
+                    result.add(p);
+                }
+            }
+        }
+        return result.toArray(new ProcedureParameter[0]);
+    }
+
+    private static ConfigurationNode[] lookupMultipleObjects(DataChannelDescriptor domain, ProjectStatePreferences prefs) {
+        String stored = prefs.getMultipleObjects();
+        if (stored.isEmpty()) {
+            return new ConfigurationNode[0];
+        }
+        List<ConfigurationNode> result = new ArrayList<>();
+        for (String name : stored.split(",")) {
+            ConfigurationNode node = findInDomain(domain, name);
+            if (node != null) {
+                result.add(node);
+            }
+        }
+        return result.toArray(new ConfigurationNode[0]);
+    }
+
+    private static ConfigurationNode[] lookupMultipleObjects(DataNodeDescriptor node, ProjectStatePreferences prefs) {
+        String stored = prefs.getMultipleObjects();
+        if (stored.isEmpty()) {
+            return new ConfigurationNode[0];
+        }
+        List<ConfigurationNode> result = new ArrayList<>();
+        for (String name : stored.split(",")) {
+            if (node.getDataMapNames().contains(name)) {
+                result.add(node.getDataChannelDescriptor().getDataMap(name));
+            }
+        }
+        return result.toArray(new ConfigurationNode[0]);
+    }
+
+    private static ConfigurationNode[] lookupMultipleObjects(DataMap dataMap, ProjectStatePreferences prefs) {
+        String stored = prefs.getMultipleObjects();
+        if (stored.isEmpty()) {
+            return new ConfigurationNode[0];
+        }
+        List<ConfigurationNode> result = new ArrayList<>();
+        for (String name : stored.split(",")) {
+            if (dataMap.getObjEntity(name) != null) {
+                result.add(dataMap.getObjEntity(name));
+            } else if (dataMap.getDbEntity(name) != null) {
+                result.add(dataMap.getDbEntity(name));
+            } else if (dataMap.getEmbeddable(name) != null) {
+                result.add(dataMap.getEmbeddable(name));
+            } else if (dataMap.getProcedure(name) != null) {
+                result.add(dataMap.getProcedure(name));
+            } else if (dataMap.getQueryDescriptor(name) != null) {
+                result.add(dataMap.getQueryDescriptor(name));
+            }
+        }
+        return result.toArray(new ConfigurationNode[0]);
+    }
+
+    private static ConfigurationNode findInDomain(DataChannelDescriptor domain, String name) {
+        if (domain.getName().equals(name)) {
+            return domain;
+        }
+        for (DataNodeDescriptor n : domain.getNodeDescriptors()) {
+            if (n.getName().equals(name)) {
+                return n;
+            }
+        }
+        for (DataMap m : domain.getDataMaps()) {
+            if (m.getName().equals(name)) {
+                return m;
+            }
+        }
+        return null;
+    }
+
+    // -------------------- name formatting --------------------
+
+    private static String joinNames(CayenneMapEntry[] entries) {
+        if (entries == null) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (CayenneMapEntry entry : entries) {
+            if (entry == null) {
+                continue;
+            }
+            sb.append(entry.getName()).append(",");
+        }
+        return sb.toString();
+    }
+
+    private static String joinEmbeddableAttributeNames(EmbeddableAttribute[] entries) {
+        if (entries == null) {
+            return "";
+        }
+        StringBuilder sb = new StringBuilder();
+        for (EmbeddableAttribute entry : entries) {
+            if (entry == null) {
+                continue;
+            }
+            sb.append(entry.getName()).append(",");
+        }
+        return sb.toString();
+    }
+
+    private static String nameOf(ConfigurationNode object) {
+        if (object instanceof CayenneMapEntry) {
+            return ((CayenneMapEntry) object).getName();
+        } else if (object instanceof DataChannelDescriptor) {
+            return ((DataChannelDescriptor) object).getName();
+        } else if (object instanceof DataNodeDescriptor) {
+            return ((DataNodeDescriptor) object).getName();
+        } else if (object instanceof DataMap) {
+            return ((DataMap) object).getName();
+        } else if (object instanceof Embeddable) {
+            return ((Embeddable) object).getClassName();
+        } else if (object instanceof QueryDescriptor) {
+            return ((QueryDescriptor) object).getName();
+        }
+        return "";
+    }
+}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectStatePreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectStatePreferences.java
index 6d7a6e56c..3a33a9230 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectStatePreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/ProjectStatePreferences.java
@@ -19,6 +19,9 @@
 
 package org.apache.cayenne.modeler.pref;
 
+import org.apache.cayenne.modeler.ui.project.ProjectController;
+
+import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
 
 public class ProjectStatePreferences extends RenamedPreferences {
@@ -63,6 +66,22 @@ public class ProjectStatePreferences extends RenamedPreferences {
         super(pref);
     }
 
+    public void saveSelection(ProjectController controller) {
+        if (getCurrentPreference() == null) {
+            return;
+        }
+        try {
+            getCurrentPreference().clear();
+        } catch (BackingStoreException e) {
+            // ignore exception
+        }
+        ProjectSelectionMemo.save(controller, this);
+    }
+
+    public void restoreSelection(ProjectController controller) {
+        ProjectSelectionMemo.restore(controller, this);
+    }
+
     public String getEvent() {
         if (event == null) {
             event = getCurrentPreference().get(EVENT_PROPERTY, "");
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/AttributeDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/AttributeDisplayEventType.java
deleted file mode 100644
index e7f09a3ff..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/AttributeDisplayEventType.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.Attribute;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.Entity;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
-import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class AttributeDisplayEventType extends EntityDisplayEventType {
-
-    AttributeDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataNodeDescriptor dataNode = dataChannel.getNodeDescriptor(preferences.getNode());
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        Entity<?,?,?> entity = getLastEntity(dataMap);
-        if (entity == null) {
-            return;
-        }
-
-        Attribute<?,?,?>[] attributes = getLastEntityAttributes(entity);
-
-        EntityDisplayEvent entityDisplayEvent = new EntityDisplayEvent(this, entity, dataMap, dataNode, dataChannel);
-        AttributeDisplayEvent attributeDisplayEvent = new AttributeDisplayEvent(this, attributes, entity, dataMap, dataChannel);
-
-        if (entity instanceof ObjEntity) {
-            controller.displayObjEntity(entityDisplayEvent);
-            controller.displayObjAttribute(attributeDisplayEvent);
-        } else if (entity instanceof DbEntity) {
-            controller.displayDbEntity(entityDisplayEvent);
-            controller.displayDbAttribute(attributeDisplayEvent);
-        }
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(AttributeDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setNode(controller.getSelectedDataNode() != null ? controller.getSelectedDataNode().getName() : "");
-        preferences.setDataMap(controller.getSelectedDataMap().getName());
-
-        if (controller.getSelectedObjEntity() != null) {
-            preferences.setObjEntity(controller.getSelectedObjEntity().getName());
-            preferences.setObjAttrs(parseToString(controller.getSelectedObjAttributes()));
-            preferences.setDbEntity(null);
-        } else if (controller.getSelectedDbEntity() != null) {
-            preferences.setDbEntity(controller.getSelectedDbEntity().getName());
-            preferences.setDbAttrs(parseToString(controller.getSelectedDbAttributes()));
-            preferences.setObjEntity(null);
-        }
-    }
-
-    protected Attribute<?,?,?>[] getLastEntityAttributes(Entity<?,?,?> entity) {
-        List<Attribute<?,?,?>> attributeList = new ArrayList<>();
-
-        String attrs = (entity instanceof ObjEntity) ? preferences.getObjAttrs() : preferences.getDbAttrs();
-        for (String attrName : attrs.split(",")) {
-            Attribute<?,?,?> attr = entity.getAttribute(attrName);
-            if(attr != null) {
-                attributeList.add(attr);
-            }
-        }
-
-        return attributeList.toArray(new Attribute[0]);
-    }
-
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataMapDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataMapDisplayEventType.java
deleted file mode 100644
index dda2c2acf..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataMapDisplayEventType.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
-
-class DataMapDisplayEventType extends DisplayEventType {
-
-    public DataMapDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataNodeDescriptor dataNode = dataChannel.getNodeDescriptor(preferences.getNode());
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        DataMapDisplayEvent dataMapDisplayEvent = new DataMapDisplayEvent(this, dataMap, dataChannel, dataNode);
-        controller.displayDataMap(dataMapDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(DataMapDisplayEvent.class.getSimpleName());
-
-        DataChannelDescriptor domain = controller.getSelectedDataDomain();
-        DataNodeDescriptor node = controller.getSelectedDataNode();
-        DataMap dataMap = controller.getSelectedDataMap();
-
-        if (domain != null) {
-            preferences.setDomain(domain.getName());
-            preferences.setNode(node != null ? node.getName() : "");
-
-            if (dataMap != null) {
-                preferences.setDataMap(dataMap.getName());
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataNodeDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataNodeDisplayEventType.java
deleted file mode 100644
index c5f51c595..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DataNodeDisplayEventType.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.DataNodeDisplayEvent;
-
-class DataNodeDisplayEventType extends DisplayEventType {
-
-    public DataNodeDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataNodeDescriptor dataNode = dataChannel.getNodeDescriptor(preferences.getNode());
-        if (dataNode == null) {
-            return;
-        }
-
-        DataNodeDisplayEvent dataNodeDisplayEvent = new DataNodeDisplayEvent(this, dataChannel, dataNode);
-        controller.displayDataNode(dataNodeDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(DataNodeDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setNode(controller.getSelectedDataNode().getName());
-    }
-}
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventType.java
deleted file mode 100644
index d0fe9d087..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventType.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.ConfigurationNode;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.pref.ProjectStatePreferences;
-import org.apache.cayenne.util.CayenneMapEntry;
-
-public abstract class DisplayEventType {
-
-    protected ProjectController controller;
-    protected ProjectStatePreferences preferences;
-
-    public DisplayEventType(ProjectController controller) {
-        this.controller = controller;
-        this.preferences = controller.getProjectStatePreferences();
-    }
-
-    public abstract void fireLastDisplayEvent();
-
-    public abstract void saveLastDisplayEvent();
-
-    protected String getObjectName(ConfigurationNode object) {
-        if (object instanceof CayenneMapEntry) {
-            return ((CayenneMapEntry) object).getName();
-        } else if (object instanceof DataChannelDescriptor) {
-            return ((DataChannelDescriptor) object).getName();
-        } else if (object instanceof DataNodeDescriptor) {
-            return ((DataNodeDescriptor) object).getName();
-        } else if (object instanceof DataMap) {
-            return ((DataMap) object).getName();
-        } else if (object instanceof Embeddable) {
-            return ((Embeddable) object).getClassName();
-        } else if (object instanceof QueryDescriptor) {
-            return ((QueryDescriptor) object).getName();
-        } else {
-            return "";
-        }
-    }
-
-    protected String parseToString(CayenneMapEntry[] array) {
-        if (array == null) {
-            return "";
-        }
-
-        StringBuilder sb = new StringBuilder();
-        for (CayenneMapEntry entry : array) {
-            if(entry == null) {
-                continue;
-            }
-            sb.append(entry.getName()).append(",");
-        }
-
-        return sb.toString();
-    }
-
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventTypes.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventTypes.java
deleted file mode 100644
index 6e46e3efa..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DisplayEventTypes.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
-import org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
-import org.apache.cayenne.modeler.event.display.DataNodeDisplayEvent;
-import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
-import org.apache.cayenne.modeler.event.display.EmbeddableAttributeDisplayEvent;
-import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
-import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
-import org.apache.cayenne.modeler.event.display.MultipleObjectsDisplayEvent;
-import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
-import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
-import org.apache.cayenne.modeler.event.display.QueryDisplayEvent;
-import org.apache.cayenne.modeler.event.display.RelationshipDisplayEvent;
-
-public enum DisplayEventTypes {
-
-    DomainDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new DomainDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return DomainDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    DataNodeDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new DataNodeDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return DataNodeDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    DataMapDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new DataMapDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return DataMapDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    EntityDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            if (controller.getSelectedObjAttributes().length != 0 || controller.getSelectedDbAttributes().length != 0) {
-                return new AttributeDisplayEventType(controller);
-            } else if (controller.getSelectedObjRelationships().length != 0 || controller.getSelectedDbRelationships().length != 0) {
-                return new RelationshipDisplayEventType(controller);
-            } else {
-                return new EntityDisplayEventType(controller);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return EntityDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    AttributeDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new AttributeDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return AttributeDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    RelationshipDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new RelationshipDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return RelationshipDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    EmbeddableDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            if (controller.getSelectedEmbeddableAttributes().length != 0) {
-                return new EmbeddableAttributeDisplayEventType(controller);
-            } else {
-                return new EmbeddableDisplayEventType(controller);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return EmbeddableDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    EmbeddableAttributeDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new EmbeddableAttributeDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return EmbeddableAttributeDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    ProcedureDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            if (controller.getSelectedProcedureParameters().length != 0) {
-                return new ProcedureParameterDisplayEventType(controller);
-            } else {
-                return new ProcedureDisplayEventType(controller);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return ProcedureDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    ProcedureParameterDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new ProcedureParameterDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return ProcedureParameterDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    QueryDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new QueryDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return QueryDisplayEvent.class.getSimpleName();
-        }
-    },
-
-    MultipleObjectsDisplayEvent {
-        @Override
-        public DisplayEventType createDisplayEventType(ProjectController controller) {
-            return new MultipleObjectsDisplayEventType(controller);
-        }
-
-        @Override
-        public String toString() {
-            return MultipleObjectsDisplayEvent.class.getSimpleName();
-        }
-    };
-
-    public abstract DisplayEventType createDisplayEventType(ProjectController controller);
-
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DomainDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DomainDisplayEventType.java
deleted file mode 100644
index 7579a0a72..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/DomainDisplayEventType.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
-
-class DomainDisplayEventType extends DisplayEventType {
-
-    public DomainDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DomainDisplayEvent domainDisplayEvent = new DomainDisplayEvent(this, dataChannel);
-        controller.displayDomain(domainDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(DomainDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-    }
-
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableAttributeDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableAttributeDisplayEventType.java
deleted file mode 100644
index 0bf2bf432..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableAttributeDisplayEventType.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.EmbeddableAttributeDisplayEvent;
-import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class EmbeddableAttributeDisplayEventType extends EmbeddableDisplayEventType {
-
-    public EmbeddableAttributeDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        Embeddable embeddable = dataMap.getEmbeddable(preferences.getEmbeddable());
-        if (embeddable == null) {
-            return;
-        }
-
-        EmbeddableDisplayEvent embeddableDisplayEvent = new EmbeddableDisplayEvent(this, embeddable, dataMap, dataChannel);
-        controller.displayEmbeddable(embeddableDisplayEvent);
-
-        EmbeddableAttribute[] embeddableAttributes = getLastEmbeddableAttributes(embeddable);
-        EmbeddableAttributeDisplayEvent attributeDisplayEvent = new EmbeddableAttributeDisplayEvent(this, embeddable, embeddableAttributes, dataMap, dataChannel);
-        controller.displayEmbeddableAttribute(attributeDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(EmbeddableAttributeDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setDataMap(controller.getSelectedDataMap().getName());
-        preferences.setEmbeddable(controller.getSelectedEmbeddable().getClassName());
-
-        EmbeddableAttribute[] currentEmbAttributes = controller.getSelectedEmbeddableAttributes();
-        if (currentEmbAttributes == null) {
-            preferences.setEmbAttrs("");
-        } else {
-            StringBuilder sb = new StringBuilder();
-            for (EmbeddableAttribute embeddableAttribute : currentEmbAttributes) {
-                sb.append(embeddableAttribute.getName()).append(",");
-            }
-            preferences.setEmbAttrs(sb.toString());
-        }
-    }
-
-    protected EmbeddableAttribute[] getLastEmbeddableAttributes(Embeddable embeddable) {
-        List<EmbeddableAttribute> embeddableAttributeList = new ArrayList<EmbeddableAttribute>();
-        EmbeddableAttribute[] attributes = new EmbeddableAttribute[0];
-
-        String embAttrs = preferences.getEmbAttrs();
-        if (embAttrs.isEmpty()) {
-            return embeddableAttributeList.toArray(attributes);
-        }
-
-        for (String embAttrName : embAttrs.split(",")) {
-            embeddableAttributeList.add(embeddable.getAttribute(embAttrName));
-        }
-
-        return embeddableAttributeList.toArray(attributes);
-    }
-}
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableDisplayEventType.java
deleted file mode 100644
index 9d22e1cbc..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EmbeddableDisplayEventType.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
-
-class EmbeddableDisplayEventType extends DisplayEventType {
-
-    public EmbeddableDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        Embeddable embeddable = dataMap.getEmbeddable(preferences.getEmbeddable());
-        if (embeddable == null) {
-            return;
-        }
-
-        EmbeddableDisplayEvent embeddableDisplayEvent = new EmbeddableDisplayEvent(this, embeddable, dataMap, dataChannel);
-        controller.displayEmbeddable(embeddableDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(EmbeddableDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setDataMap(controller.getSelectedDataMap().getName());
-        preferences.setEmbeddable(controller.getSelectedEmbeddable().getClassName());
-    }
-}
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EntityDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EntityDisplayEventType.java
deleted file mode 100644
index c9d689b93..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/EntityDisplayEventType.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.Entity;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
-
-class EntityDisplayEventType extends DisplayEventType {
-
-    EntityDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataNodeDescriptor dataNode = dataChannel.getNodeDescriptor(preferences.getNode());
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        Entity<?, ?, ?> entity = getLastEntity(dataMap);
-        if (entity == null) {
-            return;
-        }
-
-        EntityDisplayEvent entityDisplayEvent = new EntityDisplayEvent(this, entity, dataMap, dataNode, dataChannel);
-        if (entity instanceof ObjEntity) {
-            controller.displayObjEntity(entityDisplayEvent);
-        } else if (entity instanceof DbEntity) {
-            controller.displayDbEntity(entityDisplayEvent);
-        }
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-
-        preferences.setEvent(EntityDisplayEvent.class.getSimpleName());
-
-        DataChannelDescriptor domain = controller.getSelectedDataDomain();
-        DataNodeDescriptor node = controller.getSelectedDataNode();
-        DataMap dataMap = controller.getSelectedDataMap();
-        DbEntity dbEntity = controller.getSelectedDbEntity();
-        ObjEntity objEntity = controller.getSelectedObjEntity();
-
-        if (domain != null) {
-            preferences.setDomain(domain.getName());
-            preferences.setNode(node != null ? node.getName() : "");
-
-            if (dataMap != null) {
-
-                preferences.setDataMap(dataMap.getName());
-
-                if (objEntity != null) {
-                    preferences.setObjEntity(objEntity.getName());
-                    preferences.setDbEntity(null);
-                } else if (dbEntity != null) {
-                    preferences.setDbEntity(dbEntity.getName());
-                    preferences.setObjEntity(null);
-                }
-            }
-        }
-    }
-
-    Entity<?, ?, ?> getLastEntity(DataMap dataMap) {
-        return !preferences.getObjEntity().isEmpty()
-                ? dataMap.getObjEntity(preferences.getObjEntity())
-                : dataMap.getDbEntity(preferences.getDbEntity());
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/MultipleObjectsDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/MultipleObjectsDisplayEventType.java
deleted file mode 100644
index 02ea66058..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/MultipleObjectsDisplayEventType.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.ConfigurationNode;
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.MultipleObjectsDisplayEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class MultipleObjectsDisplayEventType extends DisplayEventType {
-
-    public MultipleObjectsDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-
-        String parentObjectName = preferences.getParentObject();
-        ConfigurationNode parentObject;
-        ConfigurationNode[] multipleObjects;
-
-        if (dataChannel.getDataMap(parentObjectName) != null) {
-            DataMap dataMap = dataChannel.getDataMap(parentObjectName);
-            parentObject = dataMap;
-            multipleObjects = getLastMultipleObjects(dataMap);
-        } else if (dataChannel.getNodeDescriptor(parentObjectName) != null) {
-            DataNodeDescriptor dataNode = dataChannel.getNodeDescriptor(parentObjectName);
-            parentObject = dataNode;
-            multipleObjects = getLastMultipleObjects(dataNode);
-        } else {
-            parentObject = dataChannel;
-            multipleObjects = getLastMultipleObjects(dataChannel);
-        }
-
-        MultipleObjectsDisplayEvent multipleDisplayEvent = new MultipleObjectsDisplayEvent(this, multipleObjects, parentObject);
-        controller.displayMultipleObjects(multipleDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(MultipleObjectsDisplayEvent.class.getSimpleName());
-        preferences.setParentObject(getObjectName(controller.getSelectedParentPath()));
-
-        ConfigurationNode[] multipleObjects = controller.getSelectedPaths();
-        if (multipleObjects == null) {
-            preferences.setMultipleObjects("");
-        } else {
-            StringBuilder sb = new StringBuilder();
-            for (ConfigurationNode object : multipleObjects) {
-                String objectName = getObjectName(object);
-                if (!objectName.isEmpty()) {
-                    sb.append(objectName).append(",");
-                }
-            }
-            preferences.setMultipleObjects(sb.toString());
-        }
-    }
-
-    protected ConfigurationNode[] getLastMultipleObjects(DataChannelDescriptor dataChannel) {
-        List<ConfigurationNode> configurationNodeList = new ArrayList<>();
-        ConfigurationNode[] nodes = new ConfigurationNode[0];
-
-        String multipleObjects = preferences.getMultipleObjects();
-        if (multipleObjects.isEmpty()) {
-            return configurationNodeList.toArray(nodes);
-        }
-
-        for (String objectName : multipleObjects.split(",")) {
-            ConfigurationNode configNode = getConfigNode(dataChannel, objectName);
-            if (configNode != null) {
-                configurationNodeList.add(configNode);
-            }
-        }
-
-        return configurationNodeList.toArray(nodes);
-    }
-
-    protected ConfigurationNode[] getLastMultipleObjects(DataNodeDescriptor dataNode) {
-        List<ConfigurationNode> configurationNodeList = new ArrayList<>();
-        ConfigurationNode[] nodes = new ConfigurationNode[0];
-
-        String multipleObjects = preferences.getMultipleObjects();
-        if (multipleObjects.isEmpty()) {
-            return configurationNodeList.toArray(nodes);
-        }
-
-        for (String objectName : multipleObjects.split(",")) {
-            if (dataNode.getDataMapNames().contains(objectName)) {
-                configurationNodeList.add(dataNode.getDataChannelDescriptor().getDataMap(objectName));
-            }
-        }
-
-        return configurationNodeList.toArray(nodes);
-    }
-
-    protected ConfigurationNode[] getLastMultipleObjects(DataMap dataMap) {
-        List<ConfigurationNode> configurationNodeList = new ArrayList<>();
-        ConfigurationNode[] nodes = new ConfigurationNode[0];
-
-        String multipleObjects = preferences.getMultipleObjects();
-        if (multipleObjects.isEmpty()) {
-            return configurationNodeList.toArray(nodes);
-        }
-
-        for (String objectName : multipleObjects.split(",")) {
-            if (dataMap.getObjEntity(objectName) != null) {
-                configurationNodeList.add(dataMap.getObjEntity(objectName));
-            } else if (dataMap.getDbEntity(objectName) != null) {
-                configurationNodeList.add(dataMap.getDbEntity(objectName));
-            } else if (dataMap.getEmbeddable(objectName) != null) {
-                configurationNodeList.add(dataMap.getEmbeddable(objectName));
-            } else if (dataMap.getProcedure(objectName) != null) {
-                configurationNodeList.add(dataMap.getProcedure(objectName));
-            } else if (dataMap.getQueryDescriptor(objectName) != null) {
-                configurationNodeList.add(dataMap.getQueryDescriptor(objectName));
-            }
-        }
-
-        return configurationNodeList.toArray(nodes);
-    }
-
-    private ConfigurationNode getConfigNode(DataChannelDescriptor dataChannel, String objectName) {
-        if (dataChannel.getName().equals(objectName)) {
-            return dataChannel;
-        }
-
-        for (DataNodeDescriptor dataNode : dataChannel.getNodeDescriptors()) {
-            if (dataNode.getName().equals(objectName)) {
-                return dataNode;
-            }
-        }
-
-        for (DataMap dataMap : dataChannel.getDataMaps()) {
-            if (dataMap.getName().equals(objectName)) {
-                return dataMap;
-            }
-        }
-
-        return null;
-    }
-
-}
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureDisplayEventType.java
deleted file mode 100644
index 97a6d3cbd..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureDisplayEventType.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
-
-class ProcedureDisplayEventType extends DisplayEventType {
-
-    public ProcedureDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        Procedure procedure = dataMap.getProcedure(preferences.getProcedure());
-        if (procedure == null) {
-            return;
-        }
-
-        ProcedureDisplayEvent procedureDisplayEvent = new ProcedureDisplayEvent(this, procedure, dataMap, dataChannel);
-        controller.displayProcedure(procedureDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(ProcedureDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setDataMap(controller.getSelectedDataMap().getName());
-        preferences.setProcedure(controller.getSelectedProcedure().getName());
-    }
-
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureParameterDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureParameterDisplayEventType.java
deleted file mode 100644
index 8638363d6..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/ProcedureParameterDisplayEventType.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
-import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class ProcedureParameterDisplayEventType extends ProcedureDisplayEventType {
-
-    public ProcedureParameterDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        Procedure procedure = dataMap.getProcedure(preferences.getProcedure());
-        if (procedure == null) {
-            return;
-        }
-
-        ProcedureDisplayEvent procedureDisplayEvent = new ProcedureDisplayEvent(this, procedure, dataMap, dataChannel);
-        controller.displayProcedure(procedureDisplayEvent);
-
-        ProcedureParameter[] procedureParameters = getLastProcedureParameters(procedure);
-        ProcedureParameterDisplayEvent procedureParameterDisplayEvent =
-                new ProcedureParameterDisplayEvent(this, procedureParameters, procedure, dataMap, dataChannel);
-        controller.displayProcedureParameter(procedureParameterDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(ProcedureParameterDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setDataMap(controller.getSelectedDataMap().getName());
-        preferences.setProcedure(controller.getSelectedProcedure().getName());
-        preferences.setProcedureParams(parseToString(controller.getSelectedProcedureParameters()));
-    }
-
-    protected ProcedureParameter[] getLastProcedureParameters(Procedure procedure) {
-        List<ProcedureParameter> procedureParameterList = new ArrayList<ProcedureParameter>();
-        ProcedureParameter[] parameters = new ProcedureParameter[0];
-
-        String procedureParams = preferences.getProcedureParams();
-        if (procedureParams.isEmpty()) {
-            return procedureParameterList.toArray(parameters);
-        }
-
-        for (String procedureParamName : procedureParams.split(",")) {
-            for (ProcedureParameter procedureParameter : procedure.getCallParameters()) {
-                if (procedureParameter.getName().equals(procedureParamName)) {
-                    procedureParameterList.add(procedureParameter);
-                }
-            }
-        }
-
-        return procedureParameterList.toArray(parameters);
-    }
-}
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/QueryDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/QueryDisplayEventType.java
deleted file mode 100644
index abb87f45d..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/QueryDisplayEventType.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.QueryDisplayEvent;
-import org.apache.cayenne.map.QueryDescriptor;
-
-class QueryDisplayEventType extends DisplayEventType {
-
-    public QueryDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        QueryDescriptor query = dataMap.getQueryDescriptor(preferences.getQuery());
-        if (query == null) {
-            return;
-        }
-
-        QueryDisplayEvent queryDisplayEvent = new QueryDisplayEvent(this, query, dataMap, dataChannel);
-        controller.displayQuery(queryDisplayEvent);
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(QueryDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setDataMap(controller.getSelectedDataMap().getName());
-        preferences.setQuery(controller.getSelectedQuery().getName());
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/RelationshipDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/RelationshipDisplayEventType.java
deleted file mode 100644
index 78204f7c3..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/project/RelationshipDisplayEventType.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.pref.project;
-
-import org.apache.cayenne.configuration.DataChannelDescriptor;
-import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.Entity;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.Relationship;
-import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
-import org.apache.cayenne.modeler.event.display.RelationshipDisplayEvent;
-
-import java.util.ArrayList;
-import java.util.List;
-
-class RelationshipDisplayEventType extends EntityDisplayEventType {
-
-    RelationshipDisplayEventType(ProjectController controller) {
-        super(controller);
-    }
-
-    @Override
-    public void fireLastDisplayEvent() {
-        DataChannelDescriptor dataChannel = (DataChannelDescriptor) controller.getProject().getRootNode();
-        if (!dataChannel.getName().equals(preferences.getDomain())) {
-            return;
-        }
-
-        DataNodeDescriptor dataNode = dataChannel.getNodeDescriptor(preferences.getNode());
-        DataMap dataMap = dataChannel.getDataMap(preferences.getDataMap());
-        if (dataMap == null) {
-            return;
-        }
-
-        Entity<?,?,?> entity = getLastEntity(dataMap);
-        if (entity == null) {
-            return;
-        }
-
-        Relationship<?,?,?>[] relationships = getLastEntityRelationships(entity);
-
-        EntityDisplayEvent entityDisplayEvent = new EntityDisplayEvent(this, entity, dataMap, dataNode, dataChannel);
-        RelationshipDisplayEvent displayEvent = new RelationshipDisplayEvent(this, relationships, entity, dataMap, dataChannel);
-
-        if (entity instanceof ObjEntity) {
-            controller.displayObjEntity(entityDisplayEvent);
-            controller.displayObjRelationship(displayEvent);
-        } else if (entity instanceof DbEntity) {
-            controller.displayDbEntity(entityDisplayEvent);
-            controller.displayDbRelationship(displayEvent);
-        }
-    }
-
-    @Override
-    public void saveLastDisplayEvent() {
-        preferences.setEvent(RelationshipDisplayEvent.class.getSimpleName());
-        preferences.setDomain(controller.getSelectedDataDomain().getName());
-        preferences.setNode(controller.getSelectedDataNode() != null ? controller.getSelectedDataNode().getName() : "");
-        preferences.setDataMap(controller.getSelectedDataMap().getName());
-
-        if (controller.getSelectedObjEntity() != null) {
-            preferences.setObjEntity(controller.getSelectedObjEntity().getName());
-            preferences.setObjRels(parseToString(controller.getSelectedObjRelationships()));
-            preferences.setDbEntity(null);
-        } else if (controller.getSelectedDbEntity() != null) {
-            preferences.setDbEntity(controller.getSelectedDbEntity().getName());
-            preferences.setDbRels(parseToString(controller.getSelectedDbRelationships()));
-            preferences.setObjEntity(null);
-        }
-    }
-
-    private Relationship<?,?,?>[] getLastEntityRelationships(Entity<?,?,?> entity) {
-        List<Relationship<?,?,?>> relationshipList = new ArrayList<>();
-
-        String rels = (entity instanceof ObjEntity) ? preferences.getObjRels() : preferences.getDbRels();
-        for (String objRelName : rels.split(",")) {
-            Relationship<?,?,?> rel = entity.getRelationship(objRelName);
-            if(rel != null) {
-                relationshipList.add(rel);
-            }
-        }
-
-        return relationshipList.toArray(new Relationship[0]);
-    }
-
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
index 343073b01..956904c35 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
@@ -66,8 +66,6 @@ import org.apache.cayenne.modeler.pref.DataNodeDefaults;
 import org.apache.cayenne.modeler.pref.ProjectStatePreferences;
 import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.pref.project.DisplayEventTypes;
-import org.apache.cayenne.modeler.pref.project.MultipleObjectsDisplayEventType;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.util.IDUtil;
@@ -79,12 +77,10 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.EventListener;
-import java.util.EventObject;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
 
 /**
@@ -298,45 +294,14 @@ public class ProjectController extends ChildController<ModelerController> {
     }
 
     public void saveSelectionToPrefs() {
-
         if (project == null) {
             return;
         }
-
-        EventObject displayEvent = getLastDisplayEvent();
-        ConfigurationNode[] multiplyObjects = getSelectedPaths();
-
-        if (displayEvent == null && multiplyObjects == null) {
-            return;
-        }
-
-        ProjectStatePreferences preferences = getProjectStatePreferences();
-        if (preferences.getCurrentPreference() == null) {
-            return;
-        }
-
-        try {
-            preferences.getCurrentPreference().clear();
-        } catch (BackingStoreException e) {
-            // ignore exception
-        }
-
-        if (displayEvent != null) {
-            DisplayEventTypes.valueOf(displayEvent.getClass().getSimpleName())
-                    .createDisplayEventType(this)
-                    .saveLastDisplayEvent();
-        } else if (multiplyObjects.length != 0) {
-            new MultipleObjectsDisplayEventType(this).saveLastDisplayEvent();
-        }
+        getProjectStatePreferences().saveSelection(this);
     }
 
     public void restoreSelectionFromPrefs() {
-        ProjectStatePreferences preferences = getProjectStatePreferences();
-
-        String displayEventName = preferences.getEvent();
-        if (!displayEventName.isEmpty()) {
-            DisplayEventTypes.valueOf(displayEventName).createDisplayEventType(this).fireLastDisplayEvent();
-        }
+        getProjectStatePreferences().restoreSelection(this);
     }
 
     public boolean isDirty() {


(cayenne) 14/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit bc090b07ce32562c68545da60512ef0cfe480662
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 15:36:50 2026 -0400

    Modeler cleanup
---
 .../cayenne/modeler/generic/GenericButtonUI.java   |  2 +-
 .../modeler/osx/OSXPlatformInitializer.java        |  8 +++---
 .../org/apache/cayenne/modeler/Application.java    |  4 +--
 .../org/apache/cayenne/modeler/ModelerModule.java  |  4 +--
 .../cayenne/modeler/graph/BaseGraphBuilder.java    |  6 ++---
 .../org/apache/cayenne/modeler/ui/MainToolBar.java |  1 +
 .../cayenne/modeler/ui/ModelerController.java      |  4 +--
 .../apache/cayenne/modeler/ui/ModelerFrame.java    |  2 +-
 .../apache/cayenne/modeler/ui/ModelerMenuBar.java  |  1 +
 .../org/apache/cayenne/modeler/ui/SearchPanel.java |  2 +-
 .../modeler/{ => ui}/action/AboutAction.java       |  2 +-
 .../modeler/{ => ui}/action/ActionManager.java     |  2 +-
 .../{ => ui}/action/BaseViewEntityAction.java      |  2 +-
 .../{ => ui}/action/CollapseTreeAction.java        |  2 +-
 .../action/ConfigurePreferencesAction.java         |  2 +-
 .../modeler/{ => ui}/action/CopyAction.java        |  2 +-
 .../{ => ui}/action/CopyAttributeAction.java       |  2 +-
 .../action/CopyAttributeRelationshipAction.java    |  2 +-
 .../{ => ui}/action/CopyCallbackMethodAction.java  |  2 +-
 .../action/CopyProcedureParameterAction.java       |  2 +-
 .../{ => ui}/action/CopyRelationshipAction.java    |  2 +-
 .../{ => ui}/action/CreateAttributeAction.java     |  2 +-
 .../action/CreateCallbackMethodAction.java         |  2 +-
 .../{ => ui}/action/CreateDataMapAction.java       |  2 +-
 .../{ => ui}/action/CreateDbEntityAction.java      |  2 +-
 .../{ => ui}/action/CreateEmbeddableAction.java    |  2 +-
 .../modeler/{ => ui}/action/CreateNodeAction.java  |  2 +-
 .../{ => ui}/action/CreateObjEntityAction.java     |  2 +-
 .../action/CreateObjEntityFromDbAction.java        |  2 +-
 .../{ => ui}/action/CreateProcedureAction.java     |  2 +-
 .../action/CreateProcedureParameterAction.java     |  2 +-
 .../modeler/{ => ui}/action/CreateQueryAction.java |  2 +-
 .../{ => ui}/action/CreateRelationshipAction.java  |  2 +-
 .../cayenne/modeler/{ => ui}/action/CutAction.java |  2 +-
 .../{ => ui}/action/CutAttributeAction.java        |  2 +-
 .../action/CutAttributeRelationshipAction.java     |  2 +-
 .../{ => ui}/action/CutCallbackMethodAction.java   |  2 +-
 .../action/CutProcedureParameterAction.java        |  2 +-
 .../{ => ui}/action/CutRelationshipAction.java     |  2 +-
 .../{ => ui}/action/DBConnectionAwareAction.java   |  2 +-
 .../{ => ui}/action/DbEntityCounterpartAction.java |  2 +-
 .../{ => ui}/action/DbEntitySyncAction.java        |  2 +-
 .../{ => ui}/action/DefaultActionManager.java      |  2 +-
 .../action/DisableValidationInspectionAction.java  |  2 +-
 .../{ => ui}/action/DocumentationAction.java       |  2 +-
 .../modeler/{ => ui}/action/ExitAction.java        |  2 +-
 .../modeler/{ => ui}/action/FilterAction.java      |  2 +-
 .../modeler/{ => ui}/action/FindAction.java        |  2 +-
 .../{ => ui}/action/GenerateCodeAction.java        |  2 +-
 .../modeler/{ => ui}/action/GenerateDBAction.java  |  2 +-
 .../{ => ui}/action/ImportDataMapAction.java       |  2 +-
 .../{ => ui}/action/ImportEOModelAction.java       |  2 +-
 .../{ => ui}/action/InferRelationshipsAction.java  |  2 +-
 .../modeler/{ => ui}/action/LinkDataMapAction.java |  2 +-
 .../{ => ui}/action/LinkDataMapsAction.java        |  2 +-
 .../modeler/{ => ui}/action/MigrateAction.java     |  2 +-
 .../{ => ui}/action/ModelerAbstractAction.java     |  2 +-
 .../{ => ui}/action/MultipleObjectsAction.java     |  2 +-
 .../modeler/{ => ui}/action/NavigateAction.java    |  2 +-
 .../{ => ui}/action/NavigateBackwardAction.java    |  2 +-
 .../{ => ui}/action/NavigateForwardAction.java     |  2 +-
 .../modeler/{ => ui}/action/NewProjectAction.java  |  2 +-
 .../action/ObjEntityCounterpartAction.java         |  2 +-
 .../{ => ui}/action/ObjEntitySyncAction.java       |  2 +-
 .../action/ObjEntityToSuperEntityAction.java       |  2 +-
 .../modeler/{ => ui}/action/OpenProjectAction.java |  2 +-
 .../modeler/{ => ui}/action/PasteAction.java       |  2 +-
 .../modeler/{ => ui}/action/ProjectAction.java     |  2 +-
 .../modeler/{ => ui}/action/ProjectOpener.java     |  2 +-
 .../modeler/{ => ui}/action/RedoAction.java        |  2 +-
 .../modeler/{ => ui}/action/RemoveAction.java      |  2 +-
 .../{ => ui}/action/RemoveAttributeAction.java     |  2 +-
 .../action/RemoveAttributeRelationshipAction.java  |  2 +-
 .../action/RemoveCallbackMethodAction.java         |  2 +-
 .../action/RemoveProcedureParameterAction.java     |  2 +-
 .../{ => ui}/action/RemoveRelationshipAction.java  |  2 +-
 .../{ => ui}/action/ReverseEngineeringAction.java  |  2 +-
 .../modeler/{ => ui}/action/RevertAction.java      |  2 +-
 .../modeler/{ => ui}/action/SaveAction.java        |  2 +-
 .../modeler/{ => ui}/action/SaveAsAction.java      |  2 +-
 .../{ => ui}/action/ShowLogConsoleAction.java      |  2 +-
 .../action/ShowValidationConfigAction.java         |  2 +-
 .../action/ShowValidationOptionAction.java         |  2 +-
 .../modeler/{ => ui}/action/UndoAction.java        |  2 +-
 .../action/UpdateValidationConfigAction.java       |  2 +-
 .../modeler/{ => ui}/action/ValidateAction.java    |  2 +-
 .../modeler/ui/find/FindDialogController.java      |  2 +-
 .../cayenne/modeler/ui/find/FindDialogView.java    |  2 +-
 .../modeler/ui/logconsole/LogConsoleView.java      |  2 +-
 .../modeler/ui/project/ProjectController.java      |  8 +++---
 .../ui/project/ProjectFileChangeTracker.java       |  4 +--
 .../cayenne/modeler/ui/project/ProjectView.java    |  6 ++---
 .../editor/datadomain/DataDomainTabbedView.java    |  4 +--
 .../datadomain/dbimport/DbImportTabController.java |  2 +-
 .../graph/action/EntityDisplayAction.java          |  4 +--
 .../graph/action/RebuildGraphAction.java           |  2 +-
 .../graph/action/RemoveEntityAction.java           |  2 +-
 .../datadomain/graph/action/SaveAsImageAction.java |  2 +-
 .../graph/action/ShowGraphEntityAction.java        |  2 +-
 .../datadomain/graph/action/ZoomInAction.java      |  2 +-
 .../datadomain/graph/action/ZoomOutAction.java     |  2 +-
 .../validation/ValidationTabController.java        |  2 +-
 .../editor/datamap/dbimport/DbImportView.java      |  4 +--
 .../datamap/dbimport/DraggableTreePanel.java       |  2 +-
 .../datamap/dbimport/action/DbImportActions.java   |  2 +-
 .../dbimport/action/GetDbConnectionAction.java     |  2 +-
 .../dbimport/action/LoadDbSchemaAction.java        |  2 +-
 .../dbimport/action/MoveImportNodeAction.java      |  2 +-
 .../dbimport/action/TreeManipulationAction.java    |  2 +-
 .../editor/datamap/main/DataMapMainView.java       |  2 +-
 .../ui/project/editor/dbentity/DbEntityView.java   |  6 ++---
 .../editor/dbentity/main/DbEntityMainView.java     | 12 ++++-----
 .../dbentity/properties/DbAttributePanel.java      | 10 ++++----
 .../properties/DbEntityPropertiesView.java         | 22 ++++++++--------
 .../dbentity/properties/DbRelationshipPanel.java   | 10 ++++----
 .../project/editor/embeddable/EmbeddableView.java  |  6 ++---
 .../attributes/EmbeddableAttributesView.java       | 12 ++++-----
 .../editor/embeddable/main/EmbeddableMainView.java |  4 +--
 .../ui/project/editor/objentity/ObjEntityView.java |  8 +++---
 .../callbacks/ObjEntityCallbacksView.java          | 12 ++++-----
 .../editor/objentity/main/ObjEntityMainView.java   | 10 ++++----
 .../objentity/properties/ObjAttributePanel.java    | 12 ++++-----
 .../properties/ObjEntityPropertiesView.java        | 20 +++++++--------
 .../objentity/properties/ObjRelationshipPanel.java | 12 ++++-----
 .../editor/procedure/ProcedureParameterTab.java    | 14 +++++-----
 .../editor/procedure/ProcedureTabbedView.java      |  2 +-
 .../query/selectquery/SelectQueryOrderingTab.java  |  2 +-
 .../query/selectquery/SelectQueryPrefetchTab.java  |  2 +-
 .../query/sqltemplate/SQLTemplatePrefetchTab.java  |  2 +-
 .../ui/project/tree/ProjectTreeController.java     | 30 +++++++++++-----------
 .../modeler/ui/project/tree/TreeDropTarget.java    |  2 +-
 .../ProjectValidatorDialogController.java          |  8 +++---
 .../validator/ProjectValidatorDialogView.java      |  6 ++---
 .../cayenne/modeler/ui/welcome/WelcomeScreen.java  |  4 +--
 .../undo/BaseRemovePropertyUndoableEdit.java       |  2 +-
 .../cayenne/modeler/undo/CayenneUndoManager.java   |  6 ++---
 .../cayenne/modeler/undo/CayenneUndoableEdit.java  |  2 +-
 .../modeler/undo/CreateAttributeUndoableEdit.java  |  4 +--
 .../undo/CreateCallbackMethodUndoableEdit.java     |  4 +--
 .../modeler/undo/CreateDataMapUndoableEdit.java    |  4 +--
 .../modeler/undo/CreateDbEntityUndoableEdit.java   |  4 +--
 .../undo/CreateEmbAttributeUndoableEdit.java       |  4 +--
 .../modeler/undo/CreateEmbeddableUndoableEdit.java |  4 +--
 .../modeler/undo/CreateNodeUndoableEdit.java       |  4 +--
 .../modeler/undo/CreateObjEntityUndoableEdit.java  |  4 +--
 .../undo/CreateProcedureParameterUndoableEdit.java |  4 +--
 .../modeler/undo/CreateProcedureUndoableEdit.java  |  4 +--
 .../modeler/undo/CreateQueryUndoableEdit.java      |  4 +--
 .../undo/CreateRelationshipUndoableEdit.java       |  4 +--
 .../modeler/undo/LinkDataMapUndoableEdit.java      |  2 +-
 .../cayenne/modeler/undo/PasteUndoableEdit.java    | 12 ++++-----
 .../modeler/undo/RemoveAttributeUndoableEdit.java  |  4 +--
 .../undo/RemoveCallbackMethodUndoableEdit.java     |  4 +--
 .../undo/RemoveRelationshipUndoableEdit.java       |  4 +--
 .../cayenne/modeler/undo/RemoveUndoableEdit.java   | 18 ++++++-------
 .../undo/UpdateValidationConfigUndoableEdit.java   |  2 +-
 .../apache/cayenne/modeler/util/ModelerUtil.java   |  6 ++---
 .../modeler/action/CreateNodeActionTest.java       |  1 +
 158 files changed, 297 insertions(+), 294 deletions(-)

diff --git a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java
index a2781507f..eb441907b 100644
--- a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java
+++ b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java
@@ -30,7 +30,7 @@ import javax.swing.JComponent;
 import javax.swing.border.Border;
 import javax.swing.plaf.ComponentUI;
 
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 
 /**
  * @since 4.0
diff --git a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
index 727d51f24..f7596fcf8 100644
--- a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
+++ b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
@@ -37,10 +37,10 @@ import javax.swing.border.AbstractBorder;
 import javax.swing.border.Border;
 
 import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.modeler.action.AboutAction;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.ConfigurePreferencesAction;
-import org.apache.cayenne.modeler.action.ExitAction;
+import org.apache.cayenne.modeler.ui.action.AboutAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.ConfigurePreferencesAction;
+import org.apache.cayenne.modeler.ui.action.ExitAction;
 import org.apache.cayenne.modeler.platform.PlatformInitializer;
 
 public class OSXPlatformInitializer implements PlatformInitializer {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index 96d7cd81d..a724a6841 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -26,8 +26,8 @@ import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.OpenProjectAction;
 import org.apache.cayenne.modeler.platform.PlatformInitializer;
 import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
 import org.apache.cayenne.modeler.ui.ModelerController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
index e3a7a06b1..f98c980fc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
@@ -26,8 +26,8 @@ import org.apache.cayenne.dbsync.xml.DbImportExtension;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.gen.xml.CgenExtension;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.DefaultActionManager;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.DefaultActionManager;
 import org.apache.cayenne.modeler.graph.extension.GraphExtension;
 import org.apache.cayenne.modeler.platform.DefaultPlatformInitializer;
 import org.apache.cayenne.modeler.platform.PlatformInitializer;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
index a8703526f..0da0b1d9e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
@@ -49,9 +49,9 @@ import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.EntityDisplayAction;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.RemoveEntityAction;
 import org.apache.cayenne.util.XMLEncoder;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java
index 5e61dd09b..ed082f5b9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java
@@ -1,6 +1,7 @@
 package org.apache.cayenne.modeler.ui;
 
 import org.apache.cayenne.modeler.action.*;
+import org.apache.cayenne.modeler.ui.action.*;
 
 import javax.swing.*;
 import javax.swing.border.Border;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
index 062fe35ef..a415ea578 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
@@ -21,8 +21,8 @@ package org.apache.cayenne.modeler.ui;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ExitAction;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
+import org.apache.cayenne.modeler.ui.action.ExitAction;
+import org.apache.cayenne.modeler.ui.action.OpenProjectAction;
 import org.apache.cayenne.modeler.mvc.RootController;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.pref.FSPath;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
index 5482286b6..af9569b9c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.ui;
 
 import org.apache.cayenne.modeler.ui.project.ProjectView;
-import org.apache.cayenne.modeler.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 import org.apache.cayenne.modeler.ui.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
index 09a83c4d2..5acb7b4e6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.action.*;
 import org.apache.cayenne.modeler.event.model.RecentFileListListener;
 import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
+import org.apache.cayenne.modeler.ui.action.*;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 
 import javax.swing.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/SearchPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/SearchPanel.java
index b78dbd8b3..4259e27cb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/SearchPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/SearchPanel.java
@@ -1,6 +1,6 @@
 package org.apache.cayenne.modeler.ui;
 
-import org.apache.cayenne.modeler.action.FindAction;
+import org.apache.cayenne.modeler.ui.action.FindAction;
 
 import javax.swing.*;
 import java.awt.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AboutAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/AboutAction.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AboutAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/AboutAction.java
index 2716b888f..4ad99b1e0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AboutAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/AboutAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.about.AboutDialog;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ActionManager.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ActionManager.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ActionManager.java
index 1aabfe398..394760e18 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ActionManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ActionManager.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/BaseViewEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/BaseViewEntityAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/BaseViewEntityAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/BaseViewEntityAction.java
index a0e17cd79..5aab39632 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/BaseViewEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/BaseViewEntityAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DbEntity;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CollapseTreeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CollapseTreeAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CollapseTreeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CollapseTreeAction.java
index f3d47c2ab..6d3120c3f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CollapseTreeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CollapseTreeAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ConfigurePreferencesAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ConfigurePreferencesAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ConfigurePreferencesAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ConfigurePreferencesAction.java
index 74ec80b7c..7be58c8d2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ConfigurePreferencesAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ConfigurePreferencesAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.preferences.PreferenceDialogController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAction.java
index 3e204f581..7f4b4b7e8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.DataMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeAction.java
index da02a0603..e74549956 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.util.Arrays;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeRelationshipAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeRelationshipAction.java
index 1e56b6947..38b82cd61 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeRelationshipAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyCallbackMethodAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyCallbackMethodAction.java
index a5c412247..02f24b02a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyCallbackMethodAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.util.Arrays;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyProcedureParameterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyProcedureParameterAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyProcedureParameterAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyProcedureParameterAction.java
index 426e2803c..e57b70bb2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyProcedureParameterAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyProcedureParameterAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.util.Arrays;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyRelationshipAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyRelationshipAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyRelationshipAction.java
index 35e32ca2d..d87901673 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyRelationshipAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.util.Arrays;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
index a3b86488b..446b11208 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
index 822359a60..36aaef980 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.CallbackMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
index 683484b17..2397fc84d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
index d927c688a..752299566 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
index 141fd9c40..f6bf9d92b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
index 93be71fe7..abaf21c0a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.access.dbsync.SkipSchemaUpdateStrategy;
 import org.apache.cayenne.configuration.ConfigurationNode;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
index ae756ade6..878113704 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
@@ -16,7 +16,7 @@
  *    specific language governing permissions and limitations
  *    under the License.
  */
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityFromDbAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityFromDbAction.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityFromDbAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityFromDbAction.java
index 0d65a1c48..e6c0e56fc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityFromDbAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityFromDbAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
index c4776e0dc..6bae883dc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
index 8290b36bf..6982d8154 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateQueryAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateQueryAction.java
index 9afbda253..a3607b770 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateQueryAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.event.model.QueryEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
index 03eeb7b98..9a9ac9d0a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAction.java
index b94814d2c..2694c7cf0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeAction.java
index 8845ef910..38ef45d43 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.awt.event.ActionEvent;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeRelationshipAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeRelationshipAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeRelationshipAction.java
index ae33e952a..d4917ede7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeRelationshipAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutCallbackMethodAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutCallbackMethodAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutCallbackMethodAction.java
index 732779337..f5093d67d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutCallbackMethodAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.awt.event.ActionEvent;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutProcedureParameterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutProcedureParameterAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutProcedureParameterAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutProcedureParameterAction.java
index 1cc7b917f..0207ba7a7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutProcedureParameterAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutProcedureParameterAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.ProcedureParameter;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutRelationshipAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutRelationshipAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutRelationshipAction.java
index e0fad81ed..be2e098c2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutRelationshipAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.Relationship;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBConnectionAwareAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBConnectionAwareAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
index 1e40211d5..a9e6a1dfa 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBConnectionAwareAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntityCounterpartAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntityCounterpartAction.java
index 599118f94..c2db957f7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntityCounterpartAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
index 98837386e..0550f629b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntitySyncAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DefaultActionManager.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DefaultActionManager.java
index 80193f326..8272de12b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DefaultActionManager.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.ConfigurationNode;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DisableValidationInspectionAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DisableValidationInspectionAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DisableValidationInspectionAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DisableValidationInspectionAction.java
index 0200e9029..1b57f4c03 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DisableValidationInspectionAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DisableValidationInspectionAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DocumentationAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DocumentationAction.java
index 4d5dafd6a..a41f76c0e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DocumentationAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.awt.event.ActionEvent;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ExitAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ExitAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ExitAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ExitAction.java
index e2dad22bb..0fd01f220 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ExitAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ExitAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FilterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FilterAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FilterAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FilterAction.java
index 6a6b48247..542b3860b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FilterAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FilterAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.tree.treefilter.TreeFilterPopup;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FindAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FindAction.java
index c2af85e86..dd909ce91 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FindAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.reverse.dbload.DbRelationshipDetected;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateCodeAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateCodeAction.java
index c572254d3..b25eea0fc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateCodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateCodeAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateDBAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateDBAction.java
index 6db28e72e..09ba51fa5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/GenerateDBAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateDBAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
index 5d32b59e0..dd1161c03 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.ConfigurationNode;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
index 7ac3c1055..3b265ab5f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportEOModelAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/InferRelationshipsAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/InferRelationshipsAction.java
index 2b10e43ee..aa9922a94 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/InferRelationshipsAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LinkDataMapAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LinkDataMapAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapAction.java
index 6ef0c7362..1d9b56999 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LinkDataMapAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LinkDataMapsAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapsAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LinkDataMapsAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapsAction.java
index 3b4276bc8..a3b2b6514 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/LinkDataMapsAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapsAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/MigrateAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/MigrateAction.java
index 95953a9ba..0046e9043 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MigrateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/MigrateAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ModelerAbstractAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ModelerAbstractAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ModelerAbstractAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ModelerAbstractAction.java
index 31fc46339..9c55f9380 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ModelerAbstractAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ModelerAbstractAction.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MultipleObjectsAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/MultipleObjectsAction.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MultipleObjectsAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/MultipleObjectsAction.java
index 6c848346b..6b85ed240 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/MultipleObjectsAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/MultipleObjectsAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import javax.swing.Action;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateAction.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateAction.java
index b0bf34644..5901fdbca 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateBackwardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateBackwardAction.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateBackwardAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateBackwardAction.java
index 1e950f7c1..db8d855b7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateBackwardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateBackwardAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateForwardAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateForwardAction.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateForwardAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateForwardAction.java
index 1a11be0f5..77d4e30f7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NavigateForwardAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateForwardAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
index 2c466395d..0b9e89104 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityCounterpartAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityCounterpartAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityCounterpartAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityCounterpartAction.java
index d9fe087d5..a7b86e0fe 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityCounterpartAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityCounterpartAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntitySyncAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntitySyncAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
index c0d5536ea..1f63cbec1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntitySyncAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.merge.context.EntityMergeSupport;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityToSuperEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityToSuperEntityAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityToSuperEntityAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityToSuperEntityAction.java
index 6d9f868a1..dfee3e61e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityToSuperEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityToSuperEntityAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
index d069b5cc2..618052bbc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.ModelerController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
index 3210100ef..0910410fb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectAction.java
index a17daf1f0..8f6369fd7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.awt.event.ActionEvent;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectOpener.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectOpener.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
index b594d7f19..f4c443f92 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectOpener.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.awt.Frame;
 import java.io.File;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RedoAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RedoAction.java
index b972d0f52..1ebd11ad0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RedoAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import java.awt.Toolkit;
 import java.awt.event.ActionEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAction.java
index fda9b4253..24a902a89 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAttributeAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAttributeAction.java
index d879e4ad3..7c477b764 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAttributeAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.Attribute;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAttributeRelationshipAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeRelationshipAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAttributeRelationshipAction.java
index 9be54f97f..9ef1d9770 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAttributeRelationshipAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveCallbackMethodAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveCallbackMethodAction.java
index 06baa7f37..0d35399a7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveCallbackMethodAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveProcedureParameterAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveProcedureParameterAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveProcedureParameterAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveProcedureParameterAction.java
index 726adee23..e39dfb614 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveProcedureParameterAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveProcedureParameterAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.event.model.ProcedureParameterEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveRelationshipAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveRelationshipAction.java
index bbf3410ea..a3fb8a647 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveRelationshipAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.DbEntity;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ReverseEngineeringAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ReverseEngineeringAction.java
index cfa7344a9..d68cd4d9b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ReverseEngineeringAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.dbsync.DbSyncModule;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RevertAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RevertAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RevertAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RevertAction.java
index a002d34b2..0161d5630 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RevertAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RevertAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.ModelerController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAction.java
index 9b7ceda4b..1bd780677 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.model.ProjectSavedEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
index 5c33c3ea7..33075df65 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/SaveAsAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.ConfigurationNode;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowLogConsoleAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowLogConsoleAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
index f85669c69..c8179a9b7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowLogConsoleAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowValidationConfigAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationConfigAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowValidationConfigAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationConfigAction.java
index 6dfec2840..0cf9177ac 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowValidationConfigAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationConfigAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowValidationOptionAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationOptionAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowValidationOptionAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationOptionAction.java
index 4189101b2..99e479c86 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ShowValidationOptionAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationOptionAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.Application;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/UndoAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UndoAction.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/UndoAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UndoAction.java
index 3dbd0d894..d4c6e7a1e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/UndoAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UndoAction.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/UpdateValidationConfigAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UpdateValidationConfigAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/UpdateValidationConfigAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UpdateValidationConfigAction.java
index d456bd74f..2ab3511ad 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/UpdateValidationConfigAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UpdateValidationConfigAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.event.model.DomainEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ValidateAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ValidateAction.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ValidateAction.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ValidateAction.java
index 0f23a8630..8b2253ec4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ValidateAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ValidateAction.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.validator.ProjectValidatorDialogController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogController.java
index 568920d97..46701588a 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogController.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.find;
 
-import org.apache.cayenne.modeler.action.FindAction;
+import org.apache.cayenne.modeler.ui.action.FindAction;
 import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.mvc.RootController;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogView.java
index f72191402..5ff148da9 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/find/FindDialogView.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.find;
 
-import org.apache.cayenne.modeler.action.FindAction;
+import org.apache.cayenne.modeler.ui.action.FindAction;
 import org.apache.cayenne.modeler.swing.CellRenderers;
 import org.apache.cayenne.modeler.swing.table.ImageRendererColumn;
 import org.apache.cayenne.modeler.swing.border.TopBorder;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsoleView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsoleView.java
index d5cca8007..d9d76b7bf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsoleView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsoleView.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.modeler.ui.logconsole;
 import javax.swing.*;
 import javax.swing.text.JTextComponent;
 
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.swing.border.TopBorder;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
index a6c8bd75a..c5e1931e0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
@@ -52,10 +52,10 @@ import org.apache.cayenne.map.event.ObjAttributeListener;
 import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.map.event.ObjRelationshipListener;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.RevertAction;
-import org.apache.cayenne.modeler.action.SaveAction;
-import org.apache.cayenne.modeler.action.SaveAsAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.RevertAction;
+import org.apache.cayenne.modeler.ui.action.SaveAction;
+import org.apache.cayenne.modeler.ui.action.SaveAsAction;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.modeler.event.display.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectFileChangeTracker.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectFileChangeTracker.java
index 71d3fc6ee..ea53d6ebf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectFileChangeTracker.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectFileChangeTracker.java
@@ -22,8 +22,8 @@ import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
-import org.apache.cayenne.modeler.action.SaveAction;
+import org.apache.cayenne.modeler.ui.action.OpenProjectAction;
+import org.apache.cayenne.modeler.ui.action.SaveAction;
 import org.apache.cayenne.modeler.ui.filedeleted.FileDeletedDialog;
 import org.apache.cayenne.project.Project;
 import org.slf4j.Logger;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
index 1a9b20ea6..aeaa05605 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
@@ -19,9 +19,9 @@
 
 package org.apache.cayenne.modeler.ui.project;
 
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CollapseTreeAction;
-import org.apache.cayenne.modeler.action.FilterAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CollapseTreeAction;
+import org.apache.cayenne.modeler.ui.action.FilterAction;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
 import org.apache.cayenne.modeler.ui.project.editor.EditorPanelView;
 import org.apache.cayenne.modeler.ui.project.tree.ProjectTreeController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainTabbedView.java
index 88081e563..14c178f29 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainTabbedView.java
@@ -19,8 +19,8 @@
 package org.apache.cayenne.modeler.ui.project.editor.datadomain;
 
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.GenerateCodeAction;
-import org.apache.cayenne.modeler.action.ShowValidationConfigAction;
+import org.apache.cayenne.modeler.ui.action.GenerateCodeAction;
+import org.apache.cayenne.modeler.ui.action.ShowValidationConfigAction;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.cgen.CgenTabController;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.dbimport.DbImportTabController;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.validation.ValidationTabController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/dbimport/DbImportTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/dbimport/DbImportTabController.java
index ddc941c66..cf7c78d83 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/dbimport/DbImportTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/dbimport/DbImportTabController.java
@@ -24,7 +24,7 @@ import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ReverseEngineeringAction;
+import org.apache.cayenne.modeler.ui.action.ReverseEngineeringAction;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.GeneratorsTabController;
 import org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java
index 5c9d4804e..8da0ef794 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java
@@ -26,9 +26,9 @@ import javax.swing.Icon;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.FindAction;
+import org.apache.cayenne.modeler.ui.action.FindAction;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 
 /**
  * Action that displays one of the objects in main tree, and then fires another action (if specified)
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java
index d9b3d3d37..23cb29fbf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java
@@ -22,7 +22,7 @@ import java.awt.event.ActionEvent;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 
 /**
  * Action for refreshing the graph 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RemoveEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RemoveEntityAction.java
index 665bfafb6..e42511358 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RemoveEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RemoveEntityAction.java
@@ -22,7 +22,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 import org.apache.cayenne.modeler.ui.confirmremove.ConfirmRemoveDialog;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
 import org.apache.cayenne.modeler.undo.RemoveUndoableEdit;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java
index 769fb4dca..044b867b2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java
@@ -19,7 +19,7 @@
 package org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
 import org.apache.cayenne.modeler.util.FileFilters;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
index 494a2dd3f..2fedd1b25 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 
 /**
  * Action that shows entity on the graph
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java
index b114a4e5b..40550f72f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java
@@ -23,7 +23,7 @@ import java.awt.event.ActionEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.jgraph.JGraph;
 
 /**
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java
index 349984f5c..a96ebd97d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java
@@ -23,7 +23,7 @@ import java.awt.event.ActionEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.jgraph.JGraph;
 
 /**
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java
index 3104d32ff..8396530b5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/validation/ValidationTabController.java
@@ -22,7 +22,7 @@ import org.apache.cayenne.modeler.event.model.DomainEvent;
 import org.apache.cayenne.modeler.event.model.DomainListener;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.UpdateValidationConfigAction;
+import org.apache.cayenne.modeler.ui.action.UpdateValidationConfigAction;
 import org.apache.cayenne.modeler.event.display.ValidationConfigDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ValidationConfigDisplayListener;
 import org.apache.cayenne.project.validation.Inspection;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
index 44da66703..1bf5fa1aa 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
@@ -22,14 +22,14 @@ import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.action.ReverseEngineeringAction;
+import org.apache.cayenne.modeler.ui.action.ReverseEngineeringAction;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.LoadDbSchemaAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.ColorTreeRenderer;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.TransferableNode;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 
 import javax.swing.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java
index 78587bb75..6868326ec 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DraggableTreePanel.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DragAndDropNodeAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.TreeManipulationAction;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
index cfc6cfd41..775b65819 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/GetDbConnectionAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/GetDbConnectionAction.java
index 633f45032..97cb00b42 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/GetDbConnectionAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/GetDbConnectionAction.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.DBConnectionAwareAction;
+import org.apache.cayenne.modeler.ui.action.DBConnectionAwareAction;
 import org.apache.cayenne.modeler.ui.datasource.DataSourceController;
 
 import java.awt.event.ActionEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
index b8c9481e1..caa5285f3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
@@ -24,7 +24,7 @@ import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.DBConnectionAwareAction;
+import org.apache.cayenne.modeler.ui.action.DBConnectionAwareAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DatabaseSchemaLoader;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportModel;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
index 0a5a37e36..e7618d7da 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
@@ -35,7 +35,7 @@ import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTre
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DraggableTreePanel;
 import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 
 import javax.swing.tree.TreePath;
 import java.awt.event.ActionEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
index ce4ee36be..c5b7a99b7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
index 3d8ac23a3..3eac0a331 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.LinkDataMapAction;
+import org.apache.cayenne.modeler.ui.action.LinkDataMapAction;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.main.catalog.CatalogUpdateController;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.main.locking.LockingUpdateController;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.main.pkg.PackageUpdateController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
index c4676b282..135ffe361 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
@@ -27,9 +27,9 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
-import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveRelationshipAction;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.RelationshipDisplayEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
index 4ac063246..189c602e6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
@@ -26,12 +26,12 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.CreateObjEntityFromDbAction;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
-import org.apache.cayenne.modeler.action.DbEntityCounterpartAction;
-import org.apache.cayenne.modeler.action.DbEntitySyncAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateObjEntityFromDbAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.DbEntityCounterpartAction;
+import org.apache.cayenne.modeler.ui.action.DbEntitySyncAction;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
index df2babd42..a47c653b0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
@@ -25,11 +25,11 @@ import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.DbAttributeListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.CutAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
index 24f4078f6..f03edb0a5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
@@ -24,20 +24,20 @@ import org.apache.cayenne.map.event.DbEntityListener;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.CreateObjEntityFromDbAction;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
-import org.apache.cayenne.modeler.action.CutAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.DbEntityCounterpartAction;
-import org.apache.cayenne.modeler.action.DbEntitySyncAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateObjEntityFromDbAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.DbEntityCounterpartAction;
+import org.apache.cayenne.modeler.ui.action.DbEntitySyncAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.swing.image.FilteredIconFactory;
 import org.slf4j.LoggerFactory;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
index df48f59e6..0687470b0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
@@ -27,11 +27,11 @@ import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.CutAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.dbrelationship.DbRelationshipDialogController;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
index ac07f0621..a6cfb3a67 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
@@ -25,9 +25,9 @@ import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
-import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
 import org.apache.cayenne.modeler.event.display.EmbeddableAttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
index ecb585667..fd1a5b016 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
@@ -29,12 +29,12 @@ import org.apache.cayenne.map.event.EmbeddableEvent;
 import org.apache.cayenne.map.event.EmbeddableListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyAttributeAction;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.CutAttributeAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CutAttributeAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.event.display.EmbeddableAttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayListener;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
index 61eea315e..67b96e4b5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
@@ -29,8 +29,8 @@ import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.EmbeddableEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayListener;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
index c278551fc..94fbac10a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
@@ -28,10 +28,10 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
-import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
-import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.RemoveRelationshipAction;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.RelationshipDisplayEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
index 049db9237..1ab1f10e5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
@@ -27,18 +27,18 @@ import org.apache.cayenne.map.CallbackMap;
 import org.apache.cayenne.map.LifecycleEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.CopyCallbackMethodAction;
-import org.apache.cayenne.modeler.action.CreateCallbackMethodAction;
-import org.apache.cayenne.modeler.action.CutCallbackMethodAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.CopyCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.CreateCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.CutCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
 import org.apache.cayenne.modeler.event.display.CallbackMethodDisplayEvent;
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.event.model.CallbackMethodListener;
 import org.apache.cayenne.modeler.event.display.CallbackTypeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.swing.table.CayenneTable;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.slf4j.Logger;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index 93f2e8622..a1d4d8ffb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -29,11 +29,11 @@ import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
-import org.apache.cayenne.modeler.action.ObjEntityCounterpartAction;
-import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntityCounterpartAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntitySyncAction;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayListener;
 import org.apache.cayenne.modeler.swing.CellRenderers;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
index c0a77c2cf..809138398 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
@@ -29,12 +29,12 @@ import org.apache.cayenne.map.event.ObjAttributeListener;
 import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.CutAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.ObjEntityToSuperEntityAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntityToSuperEntityAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.attrinfo.ObjAttributeInfoDialogController;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
index 3bdd41cce..1acfc6dec 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
@@ -22,19 +22,19 @@ import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
-import org.apache.cayenne.modeler.action.CutAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.ObjEntityCounterpartAction;
-import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntityCounterpartAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntitySyncAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayListener;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.swing.image.FilteredIconFactory;
 import org.slf4j.LoggerFactory;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
index e7db453de..d0a3cce0a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
@@ -28,12 +28,12 @@ import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.CutAttributeRelationshipAction;
-import org.apache.cayenne.modeler.action.ObjEntityToSuperEntityAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntityToSuperEntityAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.relinfo.ObjRelationshipInfoController;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayListener;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
index 1780b13c6..a6c2aae5b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
@@ -30,18 +30,18 @@ import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.CopyProcedureParameterAction;
-import org.apache.cayenne.modeler.action.CreateProcedureParameterAction;
-import org.apache.cayenne.modeler.action.CutProcedureParameterAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.CopyProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.CreateProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.CutProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveProcedureParameterAction;
 import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ProcedureDisplayListener;
 import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
 import org.apache.cayenne.modeler.event.display.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.table.CayenneCellEditor;
 import org.apache.cayenne.modeler.swing.table.CayenneTable;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java
index 77fbf80ff..17e2f9df3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProce
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.RemoveProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.RemoveProcedureParameterAction;
 import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
index 5be4a55b3..56d02a9a2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.EntityTreeModel;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.swing.MultiColumnBrowser;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java
index ce5fb0c8f..b98670501 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.undo.AddPrefetchUndoableEdit;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.EntityTreeFilter;
 import org.apache.cayenne.modeler.util.EntityTreeModel;
 import org.apache.cayenne.modeler.util.ModelerUtil;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
index 0d06036e8..50f3e6b4f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.map.SQLTemplateDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.undo.AddPrefetchUndoableEditForSqlTemplate;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.EntityTreeFilter;
 import org.apache.cayenne.modeler.util.EntityTreeModel;
 import org.apache.cayenne.modeler.util.ModelerUtil;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java
index 899ff872b..d5e25a4f6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeController.java
@@ -35,20 +35,20 @@ import org.apache.cayenne.map.event.EmbeddableListener;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.CopyAction;
-import org.apache.cayenne.modeler.action.CreateDataMapAction;
-import org.apache.cayenne.modeler.action.CreateDbEntityAction;
-import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
-import org.apache.cayenne.modeler.action.CreateNodeAction;
-import org.apache.cayenne.modeler.action.CreateObjEntityAction;
-import org.apache.cayenne.modeler.action.CreateProcedureAction;
-import org.apache.cayenne.modeler.action.CreateQueryAction;
-import org.apache.cayenne.modeler.action.CutAction;
-import org.apache.cayenne.modeler.action.DbEntitySyncAction;
-import org.apache.cayenne.modeler.action.LinkDataMapsAction;
-import org.apache.cayenne.modeler.action.ObjEntitySyncAction;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CopyAction;
+import org.apache.cayenne.modeler.ui.action.CreateDataMapAction;
+import org.apache.cayenne.modeler.ui.action.CreateDbEntityAction;
+import org.apache.cayenne.modeler.ui.action.CreateEmbeddableAction;
+import org.apache.cayenne.modeler.ui.action.CreateNodeAction;
+import org.apache.cayenne.modeler.ui.action.CreateObjEntityAction;
+import org.apache.cayenne.modeler.ui.action.CreateProcedureAction;
+import org.apache.cayenne.modeler.ui.action.CreateQueryAction;
+import org.apache.cayenne.modeler.ui.action.CutAction;
+import org.apache.cayenne.modeler.ui.action.DbEntitySyncAction;
+import org.apache.cayenne.modeler.ui.action.LinkDataMapsAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntitySyncAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 import org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
 import org.apache.cayenne.modeler.event.display.DataMapDisplayListener;
 import org.apache.cayenne.modeler.event.display.DataNodeDisplayEvent;
@@ -78,7 +78,7 @@ import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.modeler.event.model.QueryListener;
 import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.util.Comparators;
 
 import javax.swing.Action;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/TreeDropTarget.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/TreeDropTarget.java
index 0633f7635..135cd8d15 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/TreeDropTarget.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/TreeDropTarget.java
@@ -20,7 +20,7 @@ package org.apache.cayenne.modeler.ui.project.tree;
 
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.action.LinkDataMapAction;
+import org.apache.cayenne.modeler.ui.action.LinkDataMapAction;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 
 import javax.swing.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java
index bd444b531..cc0901b37 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java
@@ -20,10 +20,10 @@
 package org.apache.cayenne.modeler.ui.project.validator;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.DisableValidationInspectionAction;
-import org.apache.cayenne.modeler.action.ShowValidationOptionAction;
-import org.apache.cayenne.modeler.action.ValidateAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.DisableValidationInspectionAction;
+import org.apache.cayenne.modeler.ui.action.ShowValidationOptionAction;
+import org.apache.cayenne.modeler.ui.action.ValidateAction;
 import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.project.validation.Inspection;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java
index 72bfc84ab..8e0ac65b5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java
@@ -23,9 +23,9 @@ import com.jgoodies.forms.builder.PanelBuilder;
 import com.jgoodies.forms.layout.CellConstraints;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.DisableValidationInspectionAction;
-import org.apache.cayenne.modeler.action.ShowValidationOptionAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.DisableValidationInspectionAction;
+import org.apache.cayenne.modeler.ui.action.ShowValidationOptionAction;
 import org.apache.cayenne.modeler.event.display.TablePopupHandler;
 import org.apache.cayenne.modeler.swing.dialog.CayenneDialog;
 import org.apache.cayenne.validation.ValidationFailure;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java
index c861d1d4d..de920dd1f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/welcome/WelcomeScreen.java
@@ -21,8 +21,8 @@ package org.apache.cayenne.modeler.ui.welcome;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
-import org.apache.cayenne.modeler.action.NewProjectAction;
-import org.apache.cayenne.modeler.action.OpenProjectAction;
+import org.apache.cayenne.modeler.ui.action.NewProjectAction;
+import org.apache.cayenne.modeler.ui.action.OpenProjectAction;
 import org.apache.cayenne.modeler.event.model.RecentFileListListener;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java
index 2d9e99181..94d69105c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.action.ObjEntityCounterpartAction;
+import org.apache.cayenne.modeler.ui.action.ObjEntityCounterpartAction;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 
 public abstract class BaseRemovePropertyUndoableEdit extends CayenneUndoableEdit {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoManager.java
index 73ef23f79..bc7a4e2fc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoManager.java
@@ -23,9 +23,9 @@ import javax.swing.undo.CannotUndoException;
 import javax.swing.undo.UndoableEdit;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.RedoAction;
-import org.apache.cayenne.modeler.action.UndoAction;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.RedoAction;
+import org.apache.cayenne.modeler.ui.action.UndoAction;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 
 public class CayenneUndoManager extends javax.swing.undo.UndoManager {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java
index 12cbb92e9..761b781d0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java
@@ -22,7 +22,7 @@ import javax.swing.undo.AbstractUndoableEdit;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
 
 public abstract class CayenneUndoableEdit extends AbstractUndoableEdit {
     
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java
index ef1986b58..0e83a4d77 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 
 public class CreateAttributeUndoableEdit extends CayenneUndoableEdit {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
index 5615d812e..0ebb29c92 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
@@ -21,8 +21,8 @@ package org.apache.cayenne.modeler.undo;
 import javax.swing.undo.CannotRedoException;
 import javax.swing.undo.CannotUndoException;
 
-import org.apache.cayenne.modeler.action.CreateCallbackMethodAction;
-import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.CreateCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 
 public class CreateCallbackMethodUndoableEdit extends CayenneUndoableEdit {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java
index 0d89bb42b..96f3d0993 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java
@@ -20,8 +20,8 @@ package org.apache.cayenne.modeler.undo;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.action.CreateDataMapAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateDataMapAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
 
 import javax.swing.undo.CannotRedoException;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java
index 52ce21025..de3daf14d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java
@@ -23,8 +23,8 @@ import javax.swing.undo.CannotUndoException;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.modeler.action.CreateDbEntityAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateDbEntityAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 
 public class CreateDbEntityUndoableEdit extends CayenneUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java
index 66597180e..3a985e485 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java
@@ -23,8 +23,8 @@ import javax.swing.undo.CannotUndoException;
 
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
 
 public class CreateEmbAttributeUndoableEdit extends CayenneUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java
index 08767a760..c795e8eb6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java
@@ -23,8 +23,8 @@ import javax.swing.undo.CannotUndoException;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Embeddable;
-import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateEmbeddableAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 
 public class CreateEmbeddableUndoableEdit extends CayenneUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java
index 481e0f0c6..8cc8506d6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java
@@ -19,8 +19,8 @@
 package org.apache.cayenne.modeler.undo;
 
 import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.modeler.action.CreateNodeAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateNodeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 
 import javax.swing.undo.CannotRedoException;
 import javax.swing.undo.CannotUndoException;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java
index ac0067688..7719f8a96 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java
@@ -23,8 +23,8 @@ import javax.swing.undo.CannotUndoException;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.action.CreateObjEntityAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateObjEntityAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 
 public class CreateObjEntityUndoableEdit extends CayenneUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java
index c8fb3eca6..ce74e5e2a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java
@@ -23,8 +23,8 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.modeler.action.CreateProcedureParameterAction;
-import org.apache.cayenne.modeler.action.RemoveProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.CreateProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.RemoveProcedureParameterAction;
 import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
 
 import javax.swing.undo.CannotRedoException;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java
index 1480ef64a..c22160271 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java
@@ -23,8 +23,8 @@ import javax.swing.undo.CannotUndoException;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Procedure;
-import org.apache.cayenne.modeler.action.CreateProcedureAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateProcedureAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 
 public class CreateProcedureUndoableEdit extends CayenneUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java
index 3e4181d83..ff66138b8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java
@@ -23,8 +23,8 @@ import javax.swing.undo.CannotUndoException;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.action.CreateQueryAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateQueryAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 import org.apache.cayenne.map.QueryDescriptor;
 
 public class CreateQueryUndoableEdit extends CayenneUndoableEdit {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java
index 909e4b09f..c83b4b78a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java
@@ -26,8 +26,8 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
-import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.RemoveRelationshipAction;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 
 public class CreateRelationshipUndoableEdit extends CayenneUndoableEdit {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java
index 7c67aa569..46d84502e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java
@@ -22,7 +22,7 @@ import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.modeler.event.model.DataNodeEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.LinkDataMapAction;
+import org.apache.cayenne.modeler.ui.action.LinkDataMapAction;
 
 import javax.swing.undo.CannotRedoException;
 import javax.swing.undo.CannotUndoException;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
index 5e3d70e43..344c646b8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
@@ -34,12 +34,12 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
-import org.apache.cayenne.modeler.action.PasteAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
-import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
-import org.apache.cayenne.modeler.action.RemoveProcedureParameterAction;
-import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.PasteAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.RemoveProcedureParameterAction;
+import org.apache.cayenne.modeler.ui.action.RemoveRelationshipAction;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.map.QueryDescriptor;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
index 8d1a3d505..d06073c07 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.action.CreateAttributeAction;
-import org.apache.cayenne.modeler.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
 
 public class RemoveAttributeUndoableEdit extends BaseRemovePropertyUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
index 4f49601d4..367310bed 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
@@ -18,8 +18,8 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.undo;
 
-import org.apache.cayenne.modeler.action.CreateCallbackMethodAction;
-import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.CreateCallbackMethodAction;
+import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
index 3a978a3d3..a75a450fc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
@@ -25,8 +25,8 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
-import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.RemoveRelationshipAction;
 
 public class RemoveRelationshipUndoableEdit extends BaseRemovePropertyUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
index 75a56d53e..e878a54ef 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
@@ -31,15 +31,15 @@ import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.action.CreateDataMapAction;
-import org.apache.cayenne.modeler.action.CreateDbEntityAction;
-import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
-import org.apache.cayenne.modeler.action.CreateNodeAction;
-import org.apache.cayenne.modeler.action.CreateObjEntityAction;
-import org.apache.cayenne.modeler.action.CreateProcedureAction;
-import org.apache.cayenne.modeler.action.CreateQueryAction;
-import org.apache.cayenne.modeler.action.CreateRelationshipAction;
-import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.ui.action.CreateDataMapAction;
+import org.apache.cayenne.modeler.ui.action.CreateDbEntityAction;
+import org.apache.cayenne.modeler.ui.action.CreateEmbeddableAction;
+import org.apache.cayenne.modeler.ui.action.CreateNodeAction;
+import org.apache.cayenne.modeler.ui.action.CreateObjEntityAction;
+import org.apache.cayenne.modeler.ui.action.CreateProcedureAction;
+import org.apache.cayenne.modeler.ui.action.CreateQueryAction;
+import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.ui.action.RemoveAction;
 
 import javax.swing.undo.CannotRedoException;
 import javax.swing.undo.CannotUndoException;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java
index 4435799f5..2d1a60488 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.undo;
 
-import org.apache.cayenne.modeler.action.UpdateValidationConfigAction;
+import org.apache.cayenne.modeler.ui.action.UpdateValidationConfigAction;
 import org.apache.cayenne.project.validation.ValidationConfig;
 
 import javax.swing.undo.CannotRedoException;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
index 077e14182..1dacf4d8b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
@@ -25,9 +25,9 @@ import org.apache.cayenne.gen.internal.Utils;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.ActionManager;
-import org.apache.cayenne.modeler.action.ModelerAbstractAction;
-import org.apache.cayenne.modeler.action.MultipleObjectsAction;
+import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.ui.action.MultipleObjectsAction;
 import org.apache.cayenne.modeler.pref.FSPath;
 import org.apache.cayenne.reflect.PropertyUtils;
 import org.apache.cayenne.util.CayenneMapEntry;
diff --git a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java
index 5821e3e21..75e209da9 100644
--- a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java
+++ b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.modeler.action;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.DataSourceDescriptor;
+import org.apache.cayenne.modeler.ui.action.CreateNodeAction;
 import org.junit.Test;
 
 import static org.junit.Assert.assertNotNull;


(cayenne) 07/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 550c2bb363f65e8a15c64aeee86a5ce70c99d8c6
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
    
    TextAdapter should be replaced with Cayenne*TextField
---
 .../modeler/swing/text/CayennePasswordField.java   |  32 +++-
 .../modeler/swing/text/CayenneTextArea.java        |  21 ++-
 .../swing/text/CayenneTextCommitListener.java      |  33 ++++
 .../modeler/swing/text/CayenneTextField.java       |  33 +++-
 .../modeler/swing/text/ValidatorTextAdapter.java   | 201 ---------------------
 .../project/editor/datadomain/DataDomainView.java  |  15 +-
 .../editor/datamap/cgen/CgenConfigController.java  |  10 +-
 .../editor/datamap/cgen/CgenConfigPanel.java       |  61 +++----
 .../editor/datamap/main/DataMapMainView.java       |  14 +-
 .../editor/dbentity/main/DbEntityMainView.java     |  23 +--
 .../main/PKCustomSequenceGeneratorPanel.java       |  14 +-
 .../editor/embeddable/main/EmbeddableMainView.java |  13 +-
 .../editor/objentity/main/ObjEntityMainView.java   |  28 +--
 .../editor/procedure/ProcedureQueryView.java       |  13 +-
 .../ui/project/editor/procedure/ProcedureTab.java  |  13 +-
 .../ui/project/editor/query/BaseQueryMainTab.java  |   6 +-
 .../editor/query/ObjectQueryPropertiesPanel.java   |   6 +-
 .../editor/query/RawQueryPropertiesPanel.java      |   6 +-
 .../project/editor/query/RootSelectionHandler.java |   2 +-
 .../editor/query/SelectPropertiesPanel.java        |  29 +--
 .../editor/query/ejbql/EjbqlQueryMainTab.java      |  14 +-
 .../query/ejbql/EjbqlQueryPropertiesPanel.java     |   6 +-
 .../query/selectquery/SelectQueryMainTab.java      |  32 +---
 .../query/sqltemplate/SQLTemplateMainTab.java      |  11 +-
 .../modeler/undo/JTextFieldUndoListener.java       |  11 +-
 .../cayenne/modeler/undo/TextCompoundEdit.java     |  11 --
 .../apache/cayenne/modeler/util/TextAdapter.java   | 154 ----------------
 27 files changed, 212 insertions(+), 600 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayennePasswordField.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayennePasswordField.java
index 0c6a0e23b..b1b36a40e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayennePasswordField.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayennePasswordField.java
@@ -19,24 +19,29 @@
 
 package org.apache.cayenne.modeler.swing.text;
 
+import org.apache.cayenne.validation.ValidationException;
+
 import javax.swing.InputVerifier;
 import javax.swing.JComponent;
+import javax.swing.JOptionPane;
 import javax.swing.JPasswordField;
+import javax.swing.SwingUtilities;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.function.Consumer;
 
 /**
  * A {@link JPasswordField} that fires registered commit listeners whenever the field value
  * changes and is committed — either by pressing Enter (action) or by losing focus (input
  * verifier). Empty strings are normalized to {@code null} before listeners are notified.
  * Listeners are not notified when the committed value matches the previous committed value
- * (or the value most recently assigned via {@link #setText}).
+ * (or the value most recently assigned via {@link #setText}). Listeners may throw
+ * {@link ValidationException} to reject the input — the field reverts to the previously
+ * committed value and surfaces the message in an error dialog.
  */
 public class CayennePasswordField extends JPasswordField {
 
-    private final List<Consumer<String>> commitListeners;
+    private final List<CayenneTextCommitListener> commitListeners;
     private String lastCommittedValue;
 
     public CayennePasswordField() {
@@ -51,7 +56,7 @@ public class CayennePasswordField extends JPasswordField {
         });
     }
 
-    public void addCommitListener(Consumer<String> listener) {
+    public void addCommitListener(CayenneTextCommitListener listener) {
         commitListeners.add(listener);
     }
 
@@ -66,11 +71,22 @@ public class CayennePasswordField extends JPasswordField {
         String previous = this.lastCommittedValue;
         String normalized = normalize(getText());
 
-        if (!Objects.equals(normalized, previous)) {
-            this.lastCommittedValue = normalized;
-            for (Consumer<String> listener : commitListeners) {
-                listener.accept(normalized);
+        if (Objects.equals(normalized, previous)) {
+            return;
+        }
+
+        try {
+            for (CayenneTextCommitListener listener : commitListeners) {
+                listener.onCommit(normalized);
             }
+            this.lastCommittedValue = normalized;
+        } catch (ValidationException ex) {
+            setText(previous == null ? "" : previous);
+            JOptionPane.showMessageDialog(
+                    SwingUtilities.getWindowAncestor(this),
+                    ex.getUnlabeledMessage(),
+                    "Invalid value",
+                    JOptionPane.ERROR_MESSAGE);
         }
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextArea.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextArea.java
index 3e21582ea..374d0ac56 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextArea.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextArea.java
@@ -19,21 +19,28 @@
 
 package org.apache.cayenne.modeler.swing.text;
 
+import org.apache.cayenne.validation.ValidationException;
+
 import javax.swing.JTextArea;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.function.Consumer;
 
 /**
  * A {@link JTextArea} that fires registered commit listeners on every text-content change
  * (insert / remove). Empty strings are normalized to {@code null} before listeners are
  * notified.
+ * <p>
+ * A listener may declare {@link ValidationException} for API symmetry with the other
+ * Cayenne text widgets, but unlike them this area fires per keystroke — there is no prior
+ * committed value to revert to and surfacing a dialog mid-typing would be hostile, so any
+ * thrown {@code ValidationException} is silently dropped here. Validation that reverts and
+ * prompts belongs on a commit-on-focus-lost widget such as {@link CayenneTextField}.
  */
 public class CayenneTextArea extends JTextArea {
 
-    private final List<Consumer<String>> commitListeners;
+    private final List<CayenneTextCommitListener> commitListeners;
 
     public CayenneTextArea() {
         commitListeners = new ArrayList<>(2);
@@ -54,15 +61,19 @@ public class CayenneTextArea extends JTextArea {
         });
     }
 
-    public void addCommitListener(Consumer<String> listener) {
+    public void addCommitListener(CayenneTextCommitListener listener) {
         commitListeners.add(listener);
     }
 
     private void fireCommit() {
         String text = getText();
         String value = (text != null && text.isEmpty()) ? null : text;
-        for (Consumer<String> listener : commitListeners) {
-            listener.accept(value);
+        for (CayenneTextCommitListener listener : commitListeners) {
+            try {
+                listener.onCommit(value);
+            } catch (ValidationException ignored) {
+                // see class javadoc — per-keystroke fire makes revert/dialog unsuitable
+            }
         }
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextCommitListener.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextCommitListener.java
new file mode 100644
index 000000000..978783774
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextCommitListener.java
@@ -0,0 +1,33 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    https://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ ****************************************************************/
+
+package org.apache.cayenne.modeler.swing.text;
+
+import org.apache.cayenne.validation.ValidationException;
+
+/**
+ * Listener invoked when a Cayenne text widget commits a new value. Implementations may
+ * throw {@link ValidationException} to reject the input — the widget will revert to the
+ * previous committed value and surface the message to the user.
+ */
+@FunctionalInterface
+public interface CayenneTextCommitListener {
+
+    void onCommit(String value) throws ValidationException;
+}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextField.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextField.java
index 988f58405..b58799d55 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextField.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextField.java
@@ -19,13 +19,16 @@
 
 package org.apache.cayenne.modeler.swing.text;
 
+import org.apache.cayenne.validation.ValidationException;
+
 import javax.swing.InputVerifier;
 import javax.swing.JComponent;
+import javax.swing.JOptionPane;
 import javax.swing.JTextField;
+import javax.swing.SwingUtilities;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
-import java.util.function.Consumer;
 
 /**
  * A {@link JTextField} that fires registered commit listeners whenever the field value
@@ -34,10 +37,14 @@ import java.util.function.Consumer;
  * When the {@code trim} property is enabled, leading and trailing whitespace is stripped
  * from the field on commit. Listeners are not notified when the committed value matches
  * the previous committed value (or the value most recently assigned via {@link #setText}).
+ * <p>
+ * Listeners may throw {@link ValidationException} to reject the input. The field then
+ * reverts to the previously committed value and shows the exception message in an error
+ * dialog.
  */
 public class CayenneTextField extends JTextField {
 
-    private final List<Consumer<String>> commitListeners;
+    private final List<CayenneTextCommitListener> commitListeners;
     private boolean trim;
     private String lastCommittedValue;
 
@@ -51,7 +58,7 @@ public class CayenneTextField extends JTextField {
         setColumns(columns);
     }
 
-    public void addCommitListener(Consumer<String> listener) {
+    public void addCommitListener(CayenneTextCommitListener listener) {
         commitListeners.add(listener);
     }
 
@@ -92,11 +99,23 @@ public class CayenneTextField extends JTextField {
             }
         }
 
-        if (!Objects.equals(normalized, previous)) {
-            this.lastCommittedValue = normalized;
-            for (Consumer<String> listener : commitListeners) {
-                listener.accept(normalized);
+        if (Objects.equals(normalized, previous)) {
+            return;
+        }
+
+        try {
+            for (CayenneTextCommitListener listener : commitListeners) {
+                listener.onCommit(normalized);
             }
+            this.lastCommittedValue = normalized;
+        } catch (ValidationException ex) {
+            // revert visible value to last committed; setText also resets lastCommittedValue
+            setText(previous == null ? "" : previous);
+            JOptionPane.showMessageDialog(
+                    SwingUtilities.getWindowAncestor(this),
+                    ex.getUnlabeledMessage(),
+                    "Invalid value",
+                    JOptionPane.ERROR_MESSAGE);
         }
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/ValidatorTextAdapter.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/ValidatorTextAdapter.java
deleted file mode 100644
index 141a1ca82..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/ValidatorTextAdapter.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.swing.text;
-
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.validation.ValidationException;
-
-import javax.swing.*;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.JTextComponent;
-import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
-import java.util.Timer;
-import java.util.TimerTask;
-
-/**
- * Text adapter with live validation, which is fired in VALIDATION_DELAY time.
- */
-public abstract class ValidatorTextAdapter extends TextAdapter {
-    /**
-     * Time between end of user input and validation firing
-     */
-    static final long VALIDATION_DELAY = 1500L;
-
-    /**
-     * Is the live-checking enabled for the text component
-     */
-    boolean liveCheckEnabled;
-
-    public ValidatorTextAdapter(JTextField textField) {
-        this(textField, true);
-    }
-
-    public ValidatorTextAdapter(JTextField textField, boolean liveCheckEnabled) {
-        super(textField, true);
-        setLiveCheckEnabled(liveCheckEnabled);
-        install(textField);
-    }
-
-    protected void install(JTextComponent textComponent) {
-        TimerScheduler ts = new TimerScheduler();
-
-        textComponent.getDocument().addDocumentListener(ts);
-        textComponent.addFocusListener(ts);
-    }
-
-    /**
-     * Live-checks if text is correct
-     * 
-     * @throws ValidationException
-     *             if the text is incorrect
-     */
-    protected abstract void validate(String text) throws ValidationException;
-
-    /**
-     * @return Is the live-checking enabled for the text component
-     */
-    public boolean isLiveCheckEnabled() {
-        return liveCheckEnabled;
-    }
-
-    /**
-     * Enables/disables live-checking
-     */
-    public void setLiveCheckEnabled(boolean b) {
-        liveCheckEnabled = b;
-    }
-
-    /**
-     * Task to be fired after some delay
-     */
-    class ValidationTimerTask extends TimerTask {
-        @Override
-        public void run() {
-            validate();
-        }
-    }
-
-    protected void validate() {
-        try {
-            validate(textComponent.getText());
-            clear();
-        } catch (ValidationException vex) {
-            textComponent.setBackground(errorColor);
-            textComponent.setToolTipText(wrapTooltip(vex.getUnlabeledMessage()));
-        }
-    }
-
-    /**
-     * Wraps the tooltip, making it multi-lined if needed. Current
-     * implementation uses HTML markup to break the lines
-     * 
-     * @param tooltip
-     *            single-line tooltip
-     * @return multi-line tooltip.
-     */
-    protected String wrapTooltip(String tooltip) {
-        tooltip = encodeHTMLAttribute(tooltip);
-        tooltip = tooltip.replaceAll(System.lineSeparator(), "<br>");
-
-        return "<html>" + tooltip + "</html>";
-    }
-
-/**
-     * Encodes a string so that it can be used as an attribute value in an HMTL document.
-     * Will do conversion of the greater/less signs and ampersands.
-     * 
-     * ***
-     * This method is almost a copy of Util.encodeXmlAttribute(), but it does not replace
-     * single quotes. So only '<', '>', '&', '"' chars will be replaced. 
-     */
-    public static String encodeHTMLAttribute(String str) {
-        if (str == null) {
-            return null;
-        }
-
-        int len = str.length();
-        if (len == 0) {
-            return str;
-        }
-
-        StringBuilder encoded = new StringBuilder();
-        for (int i = 0; i < len; i++) {
-            char c = str.charAt(i);
-            if (c == '<') {
-                encoded.append("&lt;");
-            } else if (c == '\"') {
-                encoded.append("&quot;");
-            } else if (c == '>') {
-                encoded.append("&gt;");
-            } else if (c == '&') {
-                encoded.append("&amp;");
-            } else {
-                encoded.append(c);
-            }
-        }
-
-        return encoded.toString();
-    }
-
-    /**
-     * Listener to user input, which fires validation timer
-     */
-    class TimerScheduler implements DocumentListener, FocusListener {
-        /**
-         * The timer, which fires validation after some delay
-         */
-        Timer validationTimer;
-
-        public void insertUpdate(DocumentEvent e) {
-            schedule();
-        }
-
-        public void changedUpdate(DocumentEvent e) {
-            schedule();
-        }
-
-        public void removeUpdate(DocumentEvent e) {
-            schedule();
-        }
-
-        void schedule() {
-            if (isLiveCheckEnabled()) {
-                if (validationTimer != null) {
-                    validationTimer.cancel();
-                }
-
-                clear();
-
-                validationTimer = new Timer("cayenne-validation-timer");
-                validationTimer.schedule(new ValidationTimerTask(), VALIDATION_DELAY);
-            }
-        }
-
-        public void focusGained(FocusEvent e) {
-        }
-
-        public void focusLost(FocusEvent e) {
-            if (validationTimer != null) {
-                validationTimer.cancel();
-            }
-        }
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
index d8b665276..41981e760 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
@@ -30,14 +30,13 @@ import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
 import org.apache.cayenne.modeler.event.display.DomainDisplayListener;
-import org.apache.cayenne.modeler.util.TextAdapter;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.pref.RenamedPreferences;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
 
 import javax.swing.JCheckBox;
 import javax.swing.JPanel;
-import javax.swing.JTextField;
 import java.awt.BorderLayout;
 import java.util.Map;
 import java.util.prefs.Preferences;
@@ -49,7 +48,7 @@ public class DataDomainView extends JPanel implements DomainDisplayListener {
 
     private final ProjectController controller;
 
-    protected TextAdapter name;
+    protected CayenneUndoableTextField name;
     protected JCheckBox objectValidation;
     protected JCheckBox sharedCache;
 
@@ -66,12 +65,8 @@ public class DataDomainView extends JPanel implements DomainDisplayListener {
     protected void initView() {
 
         // create widgets
-        this.name = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDomainName(text);
-            }
-        };
+        this.name = new CayenneUndoableTextField();
+        this.name.addCommitListener(this::setDomainName);
 
         this.objectValidation = new JCayenneCheckBox();
         this.sharedCache = new JCayenneCheckBox();
@@ -87,7 +82,7 @@ public class DataDomainView extends JPanel implements DomainDisplayListener {
 
         builder.addSeparator("DataDomain Configuration", cc.xywh(1, 1, 7, 1));
         builder.addLabel("DataDomain Name:", cc.xy(1, 3));
-        builder.add(name.getComponent(), cc.xywh(3, 3, 5, 1));
+        builder.add(name, cc.xywh(3, 3, 5, 1));
 
         builder.addLabel("Object Validation:", cc.xy(1, 5));
         builder.add(objectValidation, cc.xy(3, 5));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigController.java
index e77d29b4e..254b3efa6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigController.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.modeler.ui.project.editor.datamap.cgen.templateeditor.
 import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.pref.FSPath;
-import org.apache.cayenne.modeler.util.TextAdapter;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.*;
@@ -147,7 +147,7 @@ public class CgenConfigController extends ChildController<CgenController> {
             parent.setCurrentClass(cgenConfiguration.getDataMap());
             parent.setSelected(true);
         }
-        view.getOutputFolder().updateModel();
+        view.applyOutputFolder(view.getOutputFolder().getText());
         view.getOutputPattern().setText(cgenConfiguration.getOutputPattern());
         view.getPairs().setSelected(cgenConfiguration.isMakePairs());
         view.getUsePackagePath().setSelected(cgenConfiguration.isUsePkgPath());
@@ -224,8 +224,8 @@ public class CgenConfigController extends ChildController<CgenController> {
      */
     public void selectOutputFolderAction() {
 
-        TextAdapter outputFolder = view.getOutputFolder();
-        String currentDir = outputFolder.getComponent().getText();
+        CayenneUndoableTextField outputFolder = view.getOutputFolder();
+        String currentDir = outputFolder.getText();
 
         JFileChooser chooser = new JFileChooser();
         chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
@@ -246,7 +246,7 @@ public class CgenConfigController extends ChildController<CgenController> {
             // update model
             String path = selected.getAbsolutePath();
             view.getOutputFolder().setText(path);
-            view.getOutputFolder().updateModel();
+            view.applyOutputFolder(path);
         }
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
index 15210ae97..6422703b3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/cgen/CgenConfigPanel.java
@@ -25,7 +25,6 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.gen.CgenConfiguration;
 import org.apache.cayenne.gen.TemplateType;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.validation.ValidationException;
 
@@ -34,7 +33,6 @@ import javax.swing.JButton;
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JTextField;
 import javax.swing.border.Border;
 import java.awt.BorderLayout;
 import java.nio.file.InvalidPathException;
@@ -43,7 +41,7 @@ import java.nio.file.Paths;
 
 public class CgenConfigPanel extends JPanel {
 
-    protected TextAdapter outputFolder;
+    protected CayenneUndoableTextField outputFolder;
     protected JButton selectOutputFolder;
     protected CgenController cgenController;
     private boolean isDataValid;
@@ -114,7 +112,7 @@ public class CgenConfigPanel extends JPanel {
         PanelBuilder builder = new PanelBuilder(layout);
         builder.setDefaultDialogBorder();
         builder.addLabel("Output Directory", cc.xyw(1, 1, 3));
-        builder.add(outputFolder.getComponent(), cc.xyw(1, 3, 7));
+        builder.add(outputFolder, cc.xyw(1, 3, 7));
         builder.add(selectOutputFolder, cc.xy(9, 3));
 
         // Advanced options panel
@@ -180,40 +178,41 @@ public class CgenConfigPanel extends JPanel {
             checkConfigDirty();
         });
 
-        this.outputFolder = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) throws ValidationException {
-                CgenConfiguration cgenByDataMap = getCgenConfig();
-                if (cgenByDataMap != null) {
-                    Path path;
-                    try {
-                        path = Paths.get(text);
-                    } catch (InvalidPathException e) {
-                        updateGenerateButton(false);
-                        throw new ValidationException(INVALID_PATH_MSG);
-                    }
-                    if (cgenByDataMap.getRootPath() == null && !path.isAbsolute()) {
-                        updateGenerateButton(false);
-                        throw new ValidationException(NEED_TO_SAVE_PROJECT_MSG);
-                    }
-                    cgenByDataMap.updateOutputPath(path);
-                    updateGenerateButton(true);
-                    checkConfigDirty();
-                }
-            }
-
+        this.outputFolder = new CayenneUndoableTextField() {
             @Override
             public void setText(String text) {
                 super.setText(text);
+                boolean valid = true;
                 try {
-                    Paths.get(text);
+                    Paths.get(text == null ? "" : text);
                 } catch (InvalidPathException e) {
-                    updateGenerateButton(false);
-                    throw new ValidationException(INVALID_PATH_MSG);
+                    valid = false;
                 }
-                updateGenerateButton(true);
+                updateGenerateButton(valid);
             }
         };
+        this.outputFolder.addCommitListener(this::applyOutputFolder);
+    }
+
+    void applyOutputFolder(String text) {
+        CgenConfiguration cgenByDataMap = getCgenConfig();
+        if (cgenByDataMap == null) {
+            return;
+        }
+        Path path;
+        try {
+            path = Paths.get(text == null ? "" : text);
+        } catch (InvalidPathException e) {
+            updateGenerateButton(false);
+            throw new ValidationException(INVALID_PATH_MSG);
+        }
+        if (cgenByDataMap.getRootPath() == null && !path.isAbsolute()) {
+            updateGenerateButton(false);
+            throw new ValidationException(NEED_TO_SAVE_PROJECT_MSG);
+        }
+        cgenByDataMap.updateOutputPath(path);
+        updateGenerateButton(true);
+        checkConfigDirty();
     }
 
     private void updateGenerateButton(boolean isDataValid){
@@ -299,7 +298,7 @@ public class CgenConfigPanel extends JPanel {
     }
 
 
-    public TextAdapter getOutputFolder() {
+    public CayenneUndoableTextField getOutputFolder() {
         return outputFolder;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
index 536184d3e..80072d432 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
@@ -39,7 +39,6 @@ import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.swing.CellRenderers;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
@@ -52,7 +51,6 @@ import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JTextField;
 import java.awt.BorderLayout;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -65,7 +63,7 @@ public class DataMapMainView extends JPanel {
 
     private final ProjectController controller;
 
-    private final TextAdapter name;
+    private final CayenneUndoableTextField name;
     private final JLabel location;
     private final JComboBox<DataNodeDescriptor> nodeSelector;
     private final JCheckBox defaultLockType;
@@ -81,12 +79,8 @@ public class DataMapMainView extends JPanel {
         this.controller = controller;
 
         // create widgets
-        name = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) {
-                setDataMapName(text);
-            }
-        };
+        name = new CayenneUndoableTextField();
+        name.addCommitListener(this::setDataMapName);
 
         location = new JLabel();
         nodeSelector = WidgetFactory.createUndoableComboBox();
@@ -124,7 +118,7 @@ public class DataMapMainView extends JPanel {
         builder.setDefaultDialogBorder();
 
         builder.appendSeparator("DataMap Configuration");
-        builder.append("DataMap Name:", name.getComponent(), 2);
+        builder.append("DataMap Name:", name, 2);
         builder.append("File:", location, 3);
         builder.append("DataNode:", nodeSelector, 2);
         builder.append("Quote SQL Identifiers:", quoteSQLIdentifiers, 3);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
index 1427b86ca..47bab7617 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
@@ -40,7 +40,6 @@ import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
 import org.apache.cayenne.modeler.util.ExpressionConvertor;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
@@ -59,10 +58,10 @@ public class DbEntityMainView extends JPanel implements ExistingSelectionProcess
 
     private final ProjectController controller;
 
-    private final TextAdapter name;
+    private final CayenneUndoableTextField name;
     private final CayenneUndoableTextField catalog;
     private final CayenneUndoableTextField schema;
-    private final TextAdapter qualifier;
+    private final CayenneUndoableTextField qualifier;
     private final CayenneUndoableTextField comment;
 
     private final JLabel catalogLabel;
@@ -95,11 +94,8 @@ public class DbEntityMainView extends JPanel implements ExistingSelectionProcess
         toolBar.add(actionManager.getAction(ShowGraphEntityAction.class).buildButton());
 
         // create widgets
-        name = new TextAdapter(new JTextField()) {
-            protected void updateModel(String text) {
-                setEntityName(text);
-            }
-        };
+        name = new CayenneUndoableTextField();
+        name.addCommitListener(this::setEntityName);
 
         catalogLabel = new JLabel("Catalog:");
         catalog = new CayenneUndoableTextField();
@@ -109,11 +105,8 @@ public class DbEntityMainView extends JPanel implements ExistingSelectionProcess
         schema = new CayenneUndoableTextField();
         schema.addCommitListener(this::setSchema);
 
-        qualifier = new TextAdapter(new JTextField()) {
-            protected void updateModel(String qualifier) {
-                setQualifier(qualifier);
-            }
-        };
+        qualifier = new CayenneUndoableTextField();
+        qualifier.addCommitListener(this::setQualifier);
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setComment);
@@ -134,10 +127,10 @@ public class DbEntityMainView extends JPanel implements ExistingSelectionProcess
         builder.setDefaultDialogBorder();
 
         builder.appendSeparator("DbEntity Configuration");
-        builder.append("DbEntity Name:", name.getComponent());
+        builder.append("DbEntity Name:", name);
         builder.append(catalogLabel, catalog);
         builder.append(schemaLabel, schema);
-        builder.append("Qualifier:", qualifier.getComponent());
+        builder.append("Qualifier:", qualifier);
         builder.append("Comment:", comment);
 
         builder.appendSeparator("Primary Key");
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
index 97a9077fe..a999276aa 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
@@ -23,14 +23,12 @@ import java.awt.BorderLayout;
 import java.awt.Font;
 
 import javax.swing.JLabel;
-import javax.swing.JTextField;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbKeyGenerator;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
 
@@ -40,7 +38,7 @@ import com.jgoodies.forms.layout.FormLayout;
 public class PKCustomSequenceGeneratorPanel extends PKGeneratorPanel {
 
     protected CayenneUndoableTextField customPKName;
-    protected TextAdapter customPKSize;
+    protected CayenneUndoableTextField customPKSize;
 
     public PKCustomSequenceGeneratorPanel(ProjectController mediator) {
         super(mediator);
@@ -55,12 +53,8 @@ public class PKCustomSequenceGeneratorPanel extends PKGeneratorPanel {
 
         customPKName = new CayenneUndoableTextField();
         customPKName.addCommitListener(this::setPKName);
-        customPKSize = new TextAdapter(new JTextField()) {
-
-            protected void updateModel(String text) throws ValidationException {
-                setPKSize(text);
-            }
-        };
+        customPKSize = new CayenneUndoableTextField();
+        customPKSize.addCommitListener(this::setPKSize);
 
         // assemble
 
@@ -71,7 +65,7 @@ public class PKCustomSequenceGeneratorPanel extends PKGeneratorPanel {
         builder.setDefaultDialogBorder();
 
         builder.append("Sequence Name:", customPKName, 3);
-        builder.append("Cached PK Size:", customPKSize.getComponent());
+        builder.append("Cached PK Size:", customPKSize);
         builder.nextLine();
         builder.append("", note, 3);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
index 122f2d1e6..2e8bead90 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
@@ -35,7 +35,6 @@ import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayListener;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
@@ -48,7 +47,7 @@ import java.util.Iterator;
 public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListener {
 
     protected ProjectController mediator;
-    protected TextAdapter className;
+    protected CayenneUndoableTextField className;
     protected CayenneUndoableTextField comment;
 
     public EmbeddableMainView(ProjectController mediator) {
@@ -72,12 +71,8 @@ public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListe
 
         add(toolBar, BorderLayout.NORTH);
 
-        className = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setClassName(text);
-            }
-        };
+        className = new CayenneUndoableTextField();
+        className.addCommitListener(this::setClassName);
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setComment);
@@ -87,7 +82,7 @@ public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListe
                 "");
         DefaultFormBuilder builder = new DefaultFormBuilder(layout);
         builder.setDefaultDialogBorder();
-        builder.append("Class Name:", className.getComponent(), 3);
+        builder.append("Class Name:", className, 3);
         builder.append("Comment:", comment, 3);
 
         add(builder.getPanel(), BorderLayout.CENTER);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index e1c6faf82..d9c5c2819 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -46,7 +46,6 @@ import org.apache.cayenne.modeler.swing.CellRenderers;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.ExpressionConvertor;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
@@ -67,12 +66,12 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
     private static final ObjEntity NO_INHERITANCE = new ObjEntity("Direct Mapping to Table/View");
 
     private final ProjectController controller;
-    private final TextAdapter name;
+    private final CayenneUndoableTextField name;
     private final CayenneUndoableTextField className;
 
     private final JLabel superclassLabel;
     private final CayenneUndoableTextField superClassName;
-    private final TextAdapter qualifier;
+    private final CayenneUndoableTextField qualifier;
     private final JComboBox<DbEntity> dbEntityCombo;
     private final JComboBox<ObjEntity> superEntityCombo;
     private final JCheckBox readOnly;
@@ -102,22 +101,14 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         add(toolBar, BorderLayout.NORTH);
 
         // create widgets
-        name = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setEntityName(text);
-            }
-        };
+        name = new CayenneUndoableTextField();
+        name.addCommitListener(this::setEntityName);
         superClassName = new CayenneUndoableTextField();
         superClassName.addCommitListener(this::setSuperClassName);
         className = new CayenneUndoableTextField();
         className.addCommitListener(this::setClassName);
-        qualifier = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQualifier(text);
-            }
-        };
+        qualifier = new CayenneUndoableTextField();
+        qualifier.addCommitListener(this::setQualifier);
 
         dbEntityCombo = WidgetFactory.createComboBox();
         superEntityCombo = WidgetFactory.createComboBox();
@@ -149,7 +140,7 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         builder.setDefaultDialogBorder();
 
         builder.appendSeparator("ObjEntity Configuration");
-        builder.append("ObjEntity Name:", name.getComponent());
+        builder.append("ObjEntity Name:", name);
         builder.append("Inheritance:", superEntityCombo);
         builder.append(tableLabel, dbEntityCombo);
         builder.append("Comment:", comment);
@@ -158,7 +149,7 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         builder.append("Java Class:", className);
 
         superclassLabel = builder.append("Superclass:", superClassName);
-        builder.append("Qualifier:", qualifier.getComponent());
+        builder.append("Qualifier:", qualifier);
         builder.append("Read-Only:", readOnly);
         builder.append("Optimistic Locking:", optimisticLocking);
 
@@ -282,9 +273,6 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
      * @param entity current entity
      */
     private void initFromModel(final ObjEntity entity) {
-        // TODO: this is a hack until we implement a real MVC
-        qualifier.getComponent().setBackground(Color.WHITE);
-
         name.setText(entity.getName());
         superClassName.setText(entity.getSuperClassName());
         className.setText(entity.getClassName());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
index 2283049d3..486560352 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
@@ -38,7 +38,6 @@ import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.swing.CellRenderers;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.query.CapsStrategy;
 import org.apache.cayenne.query.ProcedureQuery;
@@ -73,7 +72,7 @@ public class ProcedureQueryView extends JPanel {
     }
 
     protected ProjectController mediator;
-    protected TextAdapter name;
+    protected CayenneUndoableTextField name;
     protected CayenneUndoableTextField comment;
     protected JComboBox<Procedure> queryRoot;
     protected SelectPropertiesPanel properties;
@@ -87,12 +86,8 @@ public class ProcedureQueryView extends JPanel {
 
     private void initView() {
         // create widgets
-        name = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQueryName(text);
-            }
-        };
+        name = new CayenneUndoableTextField();
+        name.addCommitListener(this::setQueryName);
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setQueryComment);
@@ -111,7 +106,7 @@ public class ProcedureQueryView extends JPanel {
 
         builder.addSeparator("ProcedureQuery Settings", cc.xywh(1, 1, 3, 1));
         builder.addLabel("Query Name:", cc.xy(1, 3));
-        builder.add(name.getComponent(), cc.xy(3, 3));
+        builder.add(name, cc.xy(3, 3));
         builder.addLabel("Procedure:", cc.xy(1, 5));
         builder.add(queryRoot, cc.xy(3, 5));
         builder.addLabel("Comment:", cc.xy(1, 7));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
index de602c2d7..c411a7d9e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTab.java
@@ -32,7 +32,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.modeler.event.model.ProcedureEvent;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.modeler.swing.JCayenneCheckBox;
 import org.apache.cayenne.util.Util;
@@ -48,7 +47,7 @@ import java.util.EventObject;
 public class ProcedureTab extends JPanel implements ProcedureDisplayListener, ExistingSelectionProcessor {
 
     protected ProjectController eventController;
-    protected TextAdapter name;
+    protected CayenneUndoableTextField name;
     protected CayenneUndoableTextField schema;
     protected CayenneUndoableTextField catalog;
     protected CayenneUndoableTextField comment;
@@ -65,12 +64,8 @@ public class ProcedureTab extends JPanel implements ProcedureDisplayListener, Ex
     private void initView() {
         // create widgets
 
-        this.name = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setProcedureName(text);
-            }
-        };
+        this.name = new CayenneUndoableTextField();
+        this.name.addCommitListener(this::setProcedureName);
 
         this.schema = new CayenneUndoableTextField();
         this.schema.addCommitListener(this::setSchema);
@@ -89,7 +84,7 @@ public class ProcedureTab extends JPanel implements ProcedureDisplayListener, Ex
         builder.setDefaultDialogBorder();
 
         builder.appendSeparator("Stored Procedure Configuration");
-        builder.append("Procedure Name:", name.getComponent());
+        builder.append("Procedure Name:", name);
         builder.append("Catalog:", catalog);
         builder.append("Schema:", schema);
         builder.append("Returns Value:", returnsValue);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/BaseQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/BaseQueryMainTab.java
index 83a2194b4..fd26304da 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/BaseQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/BaseQueryMainTab.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.swing.CellRenderers;
-import org.apache.cayenne.modeler.util.TextAdapter;
+import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.combo.AutoCompletion;
 import org.apache.cayenne.util.Util;
@@ -38,7 +38,7 @@ import javax.swing.*;
 public abstract class BaseQueryMainTab extends JPanel {
 
     protected final ProjectController controller;
-    protected TextAdapter name;
+    protected CayenneUndoableTextField name;
     protected JComboBox<ObjEntity> queryRoot;
 
     protected BaseQueryMainTab(ProjectController controller) {
@@ -57,7 +57,7 @@ public abstract class BaseQueryMainTab extends JPanel {
         queryRoot.getEditor().getEditorComponent().addFocusListener(rootHandler);
     }
 
-    public TextAdapter getNameField() {
+    public CayenneUndoableTextField getNameField() {
         return name;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
index fb6e2ff52..a970a2c19 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ObjectQueryPropertiesPanel.java
@@ -65,11 +65,11 @@ public class ObjectQueryPropertiesPanel extends SelectPropertiesPanel {
         builder.addLabel("Fetch Data Rows:", cc.xy(1, 9));
         builder.add(dataRows, cc.xy(3, 9));
         builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 11));
-        builder.add(fetchOffset.getComponent(), cc.xy(3, 11));
+        builder.add(fetchOffset, cc.xy(3, 11));
         builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 13));
-        builder.add(fetchLimit.getComponent(), cc.xy(3, 13));
+        builder.add(fetchLimit, cc.xy(3, 13));
         builder.addLabel("Page Size:", cc.xy(1, 15));
-        builder.add(pageSize.getComponent(), cc.xy(3, 15));
+        builder.add(pageSize, cc.xy(3, 15));
 
         this.setLayout(new BorderLayout());
         this.add(builder.getPanel(), BorderLayout.CENTER);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
index 40ce08531..f141affce 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
@@ -83,11 +83,11 @@ public abstract class RawQueryPropertiesPanel extends SelectPropertiesPanel {
         builder.add(persistentObjects, cc.xy(3, 9));
         builder.add(entities, cc.xywh(5, 9, 3, 1));
         builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 11));
-        builder.add(fetchOffset.getComponent(), cc.xywh(3, 11, 3, 1));
+        builder.add(fetchOffset, cc.xywh(3, 11, 3, 1));
         builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 13));
-        builder.add(fetchLimit.getComponent(), cc.xywh(3, 13, 3, 1));
+        builder.add(fetchLimit, cc.xywh(3, 13, 3, 1));
         builder.addLabel("Page Size:", cc.xy(1, 15));
-        builder.add(pageSize.getComponent(), cc.xywh(3, 15, 3, 1));
+        builder.add(pageSize, cc.xywh(3, 15, 3, 1));
         return builder;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RootSelectionHandler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RootSelectionHandler.java
index 8609c592e..0b801227a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RootSelectionHandler.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RootSelectionHandler.java
@@ -101,6 +101,6 @@ class RootSelectionHandler implements FocusListener, ActionListener {
         String prefix = query.getRoot() == null ? "UntitledQuery" :
                 CellRenderers.asString(query.getRoot(), queryTab.getController().getSelectedDataMap()) + "Query";
 
-        return queryTab.getNameField().getComponent().getText().startsWith(prefix);
+        return queryTab.getNameField().getText().startsWith(prefix);
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
index 599b3b2b8..16ce4ce8a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/SelectPropertiesPanel.java
@@ -30,14 +30,12 @@ import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JList;
 import javax.swing.JPanel;
-import javax.swing.JTextField;
 
 import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.query.QueryCacheStrategy;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.query.QueryMetadata;
@@ -77,9 +75,9 @@ public abstract class SelectPropertiesPanel extends JPanel {
         cachePolicyLabels.put(QueryCacheStrategy.SHARED_CACHE,  SHARED_CACHE_LABEL);
     }
 
-    protected TextAdapter fetchOffset;
-    protected TextAdapter fetchLimit;
-    protected TextAdapter pageSize;
+    protected CayenneUndoableTextField fetchOffset;
+    protected CayenneUndoableTextField fetchLimit;
+    protected CayenneUndoableTextField pageSize;
     protected JComboBox<QueryCacheStrategy> cacheStrategy;
     protected CayenneUndoableTextField cacheGroups;
     protected JComponent cacheGroupsLabel;
@@ -93,23 +91,14 @@ public abstract class SelectPropertiesPanel extends JPanel {
     }
 
     protected void initView() {
-        fetchOffset = new TextAdapter(new JTextField(7)) {
-            protected void updateModel(String text) {
-                setFetchOffset(text);
-            }
-        };
+        fetchOffset = new CayenneUndoableTextField(7);
+        fetchOffset.addCommitListener(this::setFetchOffset);
 
-        fetchLimit = new TextAdapter(new JTextField(7)) {
-            protected void updateModel(String text) {
-                setFetchLimit(text);
-            }
-        };
+        fetchLimit = new CayenneUndoableTextField(7);
+        fetchLimit.addCommitListener(this::setFetchLimit);
 
-        pageSize = new TextAdapter(new JTextField(7)) {
-            protected void updateModel(String text) {
-                setPageSize(text);
-            }
-        };
+        pageSize = new CayenneUndoableTextField(7);
+        pageSize.addCommitListener(this::setPageSize);
 
         cacheStrategy = WidgetFactory.createUndoableComboBox();
         cacheStrategy.setRenderer(new CacheStrategyRenderer());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
index f897a41f4..bf327314b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryMainTab.java
@@ -28,7 +28,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
@@ -41,10 +40,9 @@ import com.jgoodies.forms.layout.FormLayout;
 public class EjbqlQueryMainTab extends JPanel{
 
     protected ProjectController mediator;
-    protected TextAdapter name;
+    protected CayenneUndoableTextField name;
     protected CayenneUndoableTextField comment;
     protected EjbqlQueryPropertiesPanel properties;
-    protected TextAdapter qualifier;
 
     public EjbqlQueryMainTab(ProjectController mediator) {
         this.mediator = mediator;
@@ -53,12 +51,8 @@ public class EjbqlQueryMainTab extends JPanel{
 
     private void initView() {
         // create widgets
-        name = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQueryName(text);
-            }
-        };
+        name = new CayenneUndoableTextField();
+        name.addCommitListener(this::setQueryName);
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setQueryComment);
@@ -73,7 +67,7 @@ public class EjbqlQueryMainTab extends JPanel{
         builder.setDefaultDialogBorder();
         builder.addSeparator("EJBQL Query Settings", cc.xywh(1, 1, 3, 1));
         builder.addLabel("Query Name:", cc.xy(1, 3));
-        builder.add(name.getComponent(), cc.xy(3, 3));
+        builder.add(name, cc.xy(3, 3));
         builder.addLabel("Comment:", cc.xy(1, 5));
         builder.add(comment, cc.xy(3, 5));
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
index a3d728ad8..d4a774e38 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlQueryPropertiesPanel.java
@@ -49,11 +49,11 @@ public class EjbqlQueryPropertiesPanel extends SelectPropertiesPanel {
         cacheGroupsLabel = builder.addLabel("Cache Group:", cc.xy(1, 7));
         builder.add(cacheGroups, cc.xywh(3, 7, 5, 1));
         builder.addLabel("Fetch Offset, Rows:", cc.xy(1, 9));
-        builder.add(fetchOffset.getComponent(), cc.xywh(3, 9, 3, 1));
+        builder.add(fetchOffset, cc.xywh(3, 9, 3, 1));
         builder.addLabel("Fetch Limit, Rows:", cc.xy(1, 11));
-        builder.add(fetchLimit.getComponent(), cc.xywh(3, 11, 3, 1));
+        builder.add(fetchLimit, cc.xywh(3, 11, 3, 1));
         builder.addLabel("Page Size:", cc.xy(1, 13));
-        builder.add(pageSize.getComponent(), cc.xywh(3, 13, 3, 1));
+        builder.add(pageSize, cc.xywh(3, 13, 3, 1));
         return builder;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
index 1d5bafdc9..2848333b1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
@@ -28,7 +28,6 @@ import java.util.Iterator;
 
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JCheckBox;
-import javax.swing.JTextField;
 
 import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.exp.Expression;
@@ -44,8 +43,6 @@ import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.ExpressionConvertor;
-import org.apache.cayenne.modeler.util.TextAdapter;
-import org.apache.cayenne.modeler.swing.text.ValidatorTextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
@@ -62,7 +59,7 @@ import com.jgoodies.forms.layout.FormLayout;
 public class SelectQueryMainTab extends BaseQueryMainTab {
 
     protected CayenneUndoableTextField comment;
-    protected TextAdapter qualifier;
+    protected CayenneUndoableTextField qualifier;
     protected JCheckBox distinct;
     protected ObjectQueryPropertiesPanel properties;
 
@@ -76,26 +73,11 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
 
     private void initView() {
         // create widgets
-        name = new TextAdapter(new JTextField()) {
+        name = new CayenneUndoableTextField();
+        name.addCommitListener(this::setQueryName);
 
-            @Override
-            protected void updateModel(String text) {
-                setQueryName(text);
-            }
-        };
-
-        qualifier = new ValidatorTextAdapter(new JTextField()) {
-
-            @Override
-            protected void updateModel(String text) {
-                setQueryQualifier(text);
-            }
-
-            @Override
-            protected void validate(String text) throws ValidationException {
-                createQualifier(text);
-            }
-        };
+        qualifier = new CayenneUndoableTextField();
+        qualifier.addCommitListener(this::setQueryQualifier);
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setQueryComment);
@@ -114,11 +96,11 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
 
         builder.addSeparator("SelectQuery Settings", cc.xywh(1, 1, 3, 1));
         builder.addLabel("Query Name:", cc.xy(1, 3));
-        builder.add(name.getComponent(), cc.xy(3, 3));
+        builder.add(name, cc.xy(3, 3));
         builder.addLabel("Query Root:", cc.xy(1, 5));
         builder.add(queryRoot, cc.xy(3, 5));
         builder.addLabel("Qualifier:", cc.xy(1, 7));
-        builder.add(qualifier.getComponent(), cc.xy(3, 7));
+        builder.add(qualifier, cc.xy(3, 7));
         builder.addLabel("Distinct:", cc.xy(1, 9));
         builder.add(distinct, cc.xy(3, 9));
         builder.addLabel("Comment:", cc.xy(1, 11));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
index 821d23c08..cfe073d24 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
@@ -35,7 +35,6 @@ import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.swing.text.CayenneUndoableTextField;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.query.CapsStrategy;
 import org.apache.cayenne.query.SQLTemplate;
@@ -85,12 +84,8 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
 
     private void initView() {
         // create widgets
-        name = new TextAdapter(new JTextField()) {
-            @Override
-            protected void updateModel(String text) {
-                setQueryName(text);
-            }
-        };
+        name = new CayenneUndoableTextField();
+        name.addCommitListener(this::setQueryName);
 
         comment = new CayenneUndoableTextField();
         comment.addCommitListener(this::setQueryComment);
@@ -107,7 +102,7 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
 
         builder.addSeparator("SQLTemplate Settings", cc.xywh(1, 1, 3, 1));
         builder.addLabel("Query Name:", cc.xy(1, 3));
-        builder.add(name.getComponent(), cc.xy(3, 3));
+        builder.add(name, cc.xy(3, 3));
         builder.addLabel("Comment:", cc.xy(1, 5));
         builder.add(comment, cc.xy(3, 5));
         builder.addLabel("Query Root:", cc.xy(1, 7));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java
index 08a9b3c6d..7c0fa4bc5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java
@@ -19,7 +19,6 @@
 package org.apache.cayenne.modeler.undo;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.TextAdapter;
 
 import javax.swing.event.UndoableEditEvent;
 import javax.swing.event.UndoableEditListener;
@@ -35,18 +34,12 @@ public class JTextFieldUndoListener implements UndoableEditListener {
 
     private final JTextComponent editor;
     private CompoundEdit compoundEdit;
-    private TextAdapter adapter;
 
     private int lastOffset;
     private int lastLength;
 
     private boolean isKeyEdit;
 
-    public JTextFieldUndoListener(TextAdapter adapter) {
-        this(adapter.getComponent());
-        this.adapter = adapter;
-    }
-
     public JTextFieldUndoListener(JTextComponent editor) {
         this.editor = editor;
         this.editor.addFocusListener(new FocusAdapter() {
@@ -98,9 +91,7 @@ public class JTextFieldUndoListener implements UndoableEditListener {
         lastOffset = editor.getCaretPosition();
         lastLength = editor.getDocument().getLength();
 
-        compoundEdit = (this.adapter != null)
-                ? new TextCompoundEdit(adapter, this)
-                : new TextCompoundEdit(editor, this);
+        compoundEdit = new TextCompoundEdit(editor, this);
 
         if (isKeyEdit) {
             compoundEdit.addEdit(anEdit);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
index 62b8ea9b4..d883b4dec 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/TextCompoundEdit.java
@@ -28,7 +28,6 @@ import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
 import org.apache.cayenne.modeler.ui.project.editor.EditorPanelView;
 import org.apache.cayenne.modeler.ui.project.editor.query.sqltemplate.SQLTemplateTabbedView;
-import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.SQLTemplate;
 
@@ -44,7 +43,6 @@ import javax.swing.undo.CompoundEdit;
 
 public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
 
-    private TextAdapter adapter;
     private final JTextComponent editor;
 
     private final TreePath treePath;
@@ -56,11 +54,6 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
 
     private final JTextFieldUndoListener listener;
 
-    public TextCompoundEdit(TextAdapter adapter, JTextFieldUndoListener listener) {
-        this(adapter.getComponent(), listener);
-        this.adapter = adapter;
-    }
-
     public TextCompoundEdit(JTextComponent editor, JTextFieldUndoListener listener) {
 
         this.editor = editor;
@@ -179,10 +172,6 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
             die();
         }
 
-        if (adapter != null) {
-            adapter.updateModel();
-        }
-
         editor.requestFocusInWindow();
         editor.selectAll();
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java
deleted file mode 100644
index 9566c9286..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.util;
-
-import org.apache.cayenne.modeler.ui.project.validator.ProjectValidatorDialogView;
-import org.apache.cayenne.modeler.undo.JTextFieldUndoListener;
-import org.apache.cayenne.validation.ValidationException;
-
-import javax.swing.*;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.event.UndoableEditListener;
-import javax.swing.text.JTextComponent;
-import java.awt.*;
-
-/**
- * A validating adapter for JTextComponent. Implement {@link #updateModel(String)} initialize model on text change.
- */
-public abstract class TextAdapter {
-
-    protected Color defaultBGColor;
-    protected Color errorColor;
-
-    protected String defaultToolTip;
-    protected boolean modelUpdateDisabled;
-    protected UndoableEditListener undoableListener;
-
-    protected JTextComponent textComponent;
-
-    public TextAdapter(JTextField textField) {
-        this(textField, true);
-    }
-
-    public TextAdapter(JTextField textField, boolean checkOnEnter) {
-        this(textField, true, false);
-        if (checkOnEnter) {
-            textField.addActionListener(e -> updateModel());
-        }
-    }
-
-    public TextAdapter(JTextComponent textField) {
-        this(textField, false, true);
-    }
-
-    public TextAdapter(JTextComponent textComponent, boolean checkOnFocusLost, boolean checkOnTyping) {
-
-        this.errorColor = ProjectValidatorDialogView.WARNING_COLOR;
-        this.defaultBGColor = textComponent.getBackground();
-        this.defaultToolTip = textComponent.getToolTipText();
-        this.textComponent = textComponent;
-
-        this.undoableListener = new JTextFieldUndoListener(this);
-        this.textComponent.getDocument().addUndoableEditListener(this.undoableListener);
-
-        if (checkOnFocusLost) {
-            textComponent.setInputVerifier(new InputVerifier() {
-
-                public boolean verify(JComponent c) {
-                    SwingUtilities.invokeLater(() -> updateModel());
-                    // release focus after coloring the field...
-                    return true;
-                }
-            });
-        }
-
-        if (checkOnTyping) {
-            textComponent.getDocument().addDocumentListener(new DocumentListener() {
-
-                public void insertUpdate(DocumentEvent e) {
-                    verifyTextChange();
-                }
-
-                public void changedUpdate(DocumentEvent e) {
-                    verifyTextChange();
-                }
-
-                public void removeUpdate(DocumentEvent e) {
-                    verifyTextChange();
-                }
-
-                void verifyTextChange() {
-                    if (!modelUpdateDisabled) {
-                        updateModel();
-                    }
-                }
-            });
-        }
-    }
-
-    /**
-     * Updates bound model with document text.
-     */
-    protected abstract void updateModel(String text) throws ValidationException;
-
-    /**
-     * Returns internal text component.
-     */
-    public JTextComponent getComponent() {
-        return textComponent;
-    }
-
-    /**
-     * Sets the text of the underlying text field.
-     */
-    public void setText(String text) {
-        modelUpdateDisabled = true;
-
-        this.textComponent
-                .getDocument()
-                .removeUndoableEditListener(this.undoableListener);
-
-        try {
-            clear();
-            textComponent.setText(text);
-        } finally {
-            modelUpdateDisabled = false;
-            this.textComponent.getDocument().addUndoableEditListener(this.undoableListener);
-        }
-
-    }
-
-    public void updateModel() {
-        try {
-            updateModel(textComponent.getText());
-            clear();
-        } catch (ValidationException vex) {
-            textComponent.setBackground(errorColor);
-            textComponent.setToolTipText(vex.getUnlabeledMessage());
-        }
-    }
-
-    protected void clear() {
-        textComponent.setBackground(defaultBGColor);
-        textComponent.setToolTipText(defaultToolTip);
-    }
-
-}


(cayenne) 05/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 4be649db9f6f6521509452d71092407cdc0194f6
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
    
    ui package structure further reorg
---
 .../org/apache/cayenne/modeler/action/CopyAction.java |  2 +-
 .../action/CopyAttributeRelationshipAction.java       |  4 ++--
 .../modeler/action/CopyCallbackMethodAction.java      |  2 +-
 .../modeler/action/CreateCallbackMethodAction.java    |  2 +-
 .../action/CutAttributeRelationshipAction.java        |  4 ++--
 .../apache/cayenne/modeler/action/PasteAction.java    |  2 +-
 .../apache/cayenne/modeler/action/RemoveAction.java   |  4 ++--
 .../action/RemoveAttributeRelationshipAction.java     |  4 ++--
 .../modeler/action/RemoveCallbackMethodAction.java    |  4 ++--
 .../event/display/CallbackMethodDisplayEvent.java     |  2 +-
 .../event/display/CallbackTypeDisplayEvent.java       |  2 +-
 .../cayenne/modeler/ui/project/ProjectController.java |  4 ++--
 .../modeler/ui/project/editor/EditorPanelView.java    | 16 ++++++++--------
 .../{DbEntityTabbedView.java => DbEntityView.java}    | 14 +++++++++-----
 .../{DbEntityTab.java => main/DbEntityMainView.java}  |  6 +++---
 .../{ => main}/PKCustomSequenceGeneratorPanel.java    |  2 +-
 .../dbentity/{ => main}/PKDBGeneratorPanel.java       |  2 +-
 .../dbentity/{ => main}/PKDefaultGeneratorPanel.java  |  2 +-
 .../editor/dbentity/{ => main}/PKGeneratorPanel.java  |  2 +-
 .../dbentity/{ => properties}/DbAttributePanel.java   |  6 +++---
 .../{ => properties}/DbAttributeTableModel.java       |  2 +-
 .../DbEntityPropertiesView.java}                      |  9 +++------
 .../{ => properties}/DbRelationshipPanel.java         |  6 +++---
 .../{ => properties}/DbRelationshipTableModel.java    |  2 +-
 .../{ObjEntityTabbedView.java => ObjEntityView.java}  | 19 ++++++++++++-------
 .../attrinfo/ObjAttributeInfoDialogController.java    |  2 +-
 .../{ => callbacks}/CallbackDescriptorTableModel.java |  2 +-
 .../objentity/{ => callbacks}/CallbackType.java       |  2 +-
 .../objentity/{ => callbacks}/ObjCallbackMethod.java  |  2 +-
 .../ObjEntityCallbacksView.java}                      | 14 +++++++-------
 .../ObjEntityMainView.java}                           |  8 ++++----
 .../objentity/{ => properties}/ObjAttributePanel.java |  6 +++---
 .../{ => properties}/ObjAttributeTableModel.java      |  2 +-
 .../ObjEntityPropertiesView.java}                     |  6 +++---
 .../{ => properties}/ObjRelationshipPanel.java        |  6 +++---
 .../{ => properties}/ObjRelationshipTableModel.java   |  2 +-
 .../undo/CreateCallbackMethodUndoableEdit.java        |  2 +-
 .../cayenne/modeler/undo/PasteUndoableEdit.java       |  2 +-
 .../undo/RemoveCallbackMethodUndoableEdit.java        |  4 ++--
 .../modeler/util/DbAttributePathComboBoxEditor.java   |  2 +-
 .../util/DbRelationshipPathComboBoxEditor.java        |  2 +-
 41 files changed, 97 insertions(+), 91 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
index c8c5bac0c..c9794a836 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
@@ -33,7 +33,7 @@ import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.modeler.swing.CayenneTransferable;
 
 import javax.swing.*;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
index 5614036ad..1e56b6947 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
@@ -21,8 +21,8 @@ package org.apache.cayenne.modeler.action;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjAttributePanel;
-import org.apache.cayenne.modeler.ui.project.editor.dbentity.DbAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.properties.DbAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjAttributePanel;
 import javax.swing.JComponent;
 
 public class CopyAttributeRelationshipAction extends CopyAction implements MultipleObjectsAction {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
index 1074cdf0c..a5c412247 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
@@ -23,7 +23,7 @@ import java.util.Arrays;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 
 public class CopyCallbackMethodAction extends CopyAction implements MultipleObjectsAction {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
index 3180534ed..822359a60 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.CallbackMap;
 import org.apache.cayenne.map.LifecycleEvent;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.CallbackType;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.CreateCallbackMethodUndoableEdit;
 import org.apache.cayenne.util.Util;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeRelationshipAction.java
index 4dfa86248..ae33e952a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CutAttributeRelationshipAction.java
@@ -20,8 +20,8 @@ package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjAttributePanel;
-import org.apache.cayenne.modeler.ui.project.editor.dbentity.DbAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.properties.DbAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjAttributePanel;
 
 import javax.swing.JComponent;
 import java.awt.event.ActionEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
index 1ec39590f..d41bf7c47 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
@@ -41,7 +41,7 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.errors.ErrorsController;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.querytype.QueryTypeController;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.PasteCompoundUndoableEdit;
 import org.apache.cayenne.modeler.undo.PasteUndoableEdit;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
index aa86e47dd..fda9b4253 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
@@ -52,8 +52,8 @@ import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.confirmremove.ConfirmRemoveDialog;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.CallbackType;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.RemoveAttributeUndoableEdit;
 import org.apache.cayenne.modeler.undo.RemoveCallbackMethodUndoableEdit;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeRelationshipAction.java
index b99756bdb..9be54f97f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeRelationshipAction.java
@@ -20,8 +20,8 @@ package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjAttributePanel;
-import org.apache.cayenne.modeler.ui.project.editor.dbentity.DbAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.properties.DbAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjAttributePanel;
 
 import javax.swing.JComponent;
 import java.awt.event.ActionEvent;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java
index ad60f4fb5..06baa7f37 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java
@@ -22,8 +22,8 @@ import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.confirmremove.ConfirmRemoveDialog;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.CallbackType;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.RemoveCallbackMethodUndoableEdit;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackMethodDisplayEvent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackMethodDisplayEvent.java
index d5b39bdce..b9dbe1fd4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackMethodDisplayEvent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackMethodDisplayEvent.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.event.display;
 
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 
 import java.util.EventObject;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackTypeDisplayEvent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackTypeDisplayEvent.java
index b055b17d3..5cf9d1447 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackTypeDisplayEvent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/display/CallbackTypeDisplayEvent.java
@@ -19,7 +19,7 @@
 package org.apache.cayenne.modeler.event.display;
 
 import org.apache.cayenne.event.CayenneEvent;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.CallbackType;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 
 public class CallbackTypeDisplayEvent extends CayenneEvent {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
index 19b3ef398..ea9422d84 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
@@ -56,8 +56,8 @@ import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.RevertAction;
 import org.apache.cayenne.modeler.action.SaveAction;
 import org.apache.cayenne.modeler.action.SaveAsAction;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.CallbackType;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.modeler.event.display.*;
 import org.apache.cayenne.modeler.event.model.*;
 import org.apache.cayenne.modeler.mvc.ChildController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java
index 9ae44a6aa..b7b334c12 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/EditorPanelView.java
@@ -25,9 +25,9 @@ import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.DataDomainTabbedView;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.DataMapView;
 import org.apache.cayenne.modeler.ui.project.editor.datanode.DataNodeController;
-import org.apache.cayenne.modeler.ui.project.editor.dbentity.DbEntityTabbedView;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.DbEntityView;
 import org.apache.cayenne.modeler.ui.project.editor.embeddable.EmbeddableView;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjEntityTabbedView;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjEntityView;
 import org.apache.cayenne.modeler.ui.project.editor.procedure.ProcedureQueryView;
 import org.apache.cayenne.modeler.ui.project.editor.procedure.ProcedureTabbedView;
 import org.apache.cayenne.modeler.ui.project.editor.query.ejbql.EjbqlTabbedView;
@@ -57,8 +57,8 @@ public class EditorPanelView extends JPanel {
 
     private final CardLayout detailLayout;
 
-    private final DbEntityTabbedView dbDetailView;
-    private final ObjEntityTabbedView objDetailView;
+    private final DbEntityView dbDetailView;
+    private final ObjEntityView objDetailView;
     private final EmbeddableView embeddableView;
     private final DataDomainTabbedView dataDomainView;
     private final DataMapView dataMapView;
@@ -104,10 +104,10 @@ public class EditorPanelView extends JPanel {
         embeddableView = new EmbeddableView(controller);
         add(embeddableView, EMBEDDABLE_VIEW);
 
-        objDetailView = new ObjEntityTabbedView(controller);
+        objDetailView = new ObjEntityView(controller);
         add(objDetailView, OBJ_VIEW);
 
-        dbDetailView = new DbEntityTabbedView(controller);
+        dbDetailView = new DbEntityView(controller);
         add(dbDetailView, DB_VIEW);
 
         controller.addDomainDisplayListener(e -> detailLayout.show(this, e.getDomain() == null ? EMPTY_VIEW : DOMAIN_VIEW));
@@ -137,11 +137,11 @@ public class EditorPanelView extends JPanel {
         return embeddableView;
     }
 
-    public DbEntityTabbedView getDbDetailView() {
+    public DbEntityView getDbDetailView() {
         return dbDetailView;
     }
 
-    public ObjEntityTabbedView getObjDetailView() {
+    public ObjEntityView getObjDetailView() {
         return objDetailView;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
similarity index 87%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTabbedView.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
index 37c7d888b..c4676b282 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
@@ -33,25 +33,29 @@ import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.RelationshipDisplayEvent;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.main.DbEntityMainView;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.properties.DbAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.properties.DbEntityPropertiesView;
+import org.apache.cayenne.modeler.ui.project.editor.dbentity.properties.DbRelationshipPanel;
 
 import javax.swing.*;
 import javax.swing.event.ChangeEvent;
 import java.awt.*;
 
-public class DbEntityTabbedView extends JTabbedPane {
+public class DbEntityView extends JTabbedPane {
 
     private final Component entityPanel;
-    private final DbEntityAttributeRelationshipTab attributeRelationshipTab;
+    private final DbEntityPropertiesView attributeRelationshipTab;
     private int lastTabIndex;
 
-    public DbEntityTabbedView(ProjectController controller) {
+    public DbEntityView(ProjectController controller) {
 
         setTabPlacement(JTabbedPane.TOP);
 
-        this.entityPanel = new JScrollPane(new DbEntityTab(controller));
+        this.entityPanel = new JScrollPane(new DbEntityMainView(controller));
         addTab("Entity", entityPanel);
 
-        this.attributeRelationshipTab = new DbEntityAttributeRelationshipTab(controller);
+        this.attributeRelationshipTab = new DbEntityPropertiesView(controller);
         addTab("Properties", attributeRelationshipTab);
 
         controller.addDbEntityDisplayListener(this::currentDbEntityChanged);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTab.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
index b1f331289..1427b86ca 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.layout.FormLayout;
@@ -49,7 +49,7 @@ import javax.swing.*;
 import java.awt.*;
 import java.util.EventObject;
 
-public class DbEntityTab extends JPanel implements ExistingSelectionProcessor, DbEntityDisplayListener {
+public class DbEntityMainView extends JPanel implements ExistingSelectionProcessor, DbEntityDisplayListener {
 
     static final String PK_DEFAULT_GENERATOR = "Cayenne-Generated (Default)";
     static final String PK_DB_GENERATOR = "Database-Generated";
@@ -74,7 +74,7 @@ public class DbEntityTab extends JPanel implements ExistingSelectionProcessor, D
 
     private final JToolBar toolBar;
 
-    public DbEntityTab(ProjectController controller) {
+    public DbEntityMainView(ProjectController controller) {
         super();
         this.controller = controller;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKCustomSequenceGeneratorPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKCustomSequenceGeneratorPanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
index ece2e2d65..97a9077fe 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKCustomSequenceGeneratorPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKCustomSequenceGeneratorPanel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
 
 import java.awt.BorderLayout;
 import java.awt.Font;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKDBGeneratorPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDBGeneratorPanel.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKDBGeneratorPanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDBGeneratorPanel.java
index 9e281d164..73d6015ef 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKDBGeneratorPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDBGeneratorPanel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
 
 import java.awt.BorderLayout;
 import java.awt.Component;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKDefaultGeneratorPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
similarity index 95%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKDefaultGeneratorPanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
index f848b1189..bcdcfff93 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKDefaultGeneratorPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKDefaultGeneratorPanel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKGeneratorPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKGeneratorPanel.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKGeneratorPanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKGeneratorPanel.java
index 8dd988969..0d6410c7d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/PKGeneratorPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/PKGeneratorPanel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.main;
 
 import javax.swing.JPanel;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbAttributePanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
index 533e502c1..df2babd42 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.properties;
 
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
@@ -57,9 +57,9 @@ public class DbAttributePanel extends JPanel implements DbEntityDisplayListener,
     private final ProjectController controller;
     private final CayenneTable table;
     private final TableColumnPreferences tablePreferences;
-    private final DbEntityAttributeRelationshipTab parentPanel;
+    private final DbEntityPropertiesView parentPanel;
 
-    public DbAttributePanel(ProjectController controller, DbEntityAttributeRelationshipTab parentPanel) {
+    public DbAttributePanel(ProjectController controller, DbEntityPropertiesView parentPanel) {
         this.controller = controller;
         this.parentPanel = parentPanel;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbAttributeTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributeTableModel.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbAttributeTableModel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributeTableModel.java
index b53d69184..1fa792a3c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbAttributeTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributeTableModel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.properties;
 
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityAttributeRelationshipTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
similarity index 95%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityAttributeRelationshipTab.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
index a2baa66b9..24f4078f6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityAttributeRelationshipTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.properties;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
@@ -50,10 +50,7 @@ import javax.swing.JToolBar;
 import java.awt.BorderLayout;
 import java.awt.event.ActionListener;
 
-/**
- * Combines DbEntityAttributeTab and DbEntityRelationshipTab in JSplitPane.
- */
-public class DbEntityAttributeRelationshipTab extends JPanel implements DbEntityDisplayListener, DbEntityListener {
+public class DbEntityPropertiesView extends JPanel implements DbEntityDisplayListener, DbEntityListener {
 
     private final DbAttributePanel attributePanel;
     private final DbRelationshipPanel relationshipPanel;
@@ -61,7 +58,7 @@ public class DbEntityAttributeRelationshipTab extends JPanel implements DbEntity
     private final JSplitPane splitPane;
     private final JToolBar toolBar;
 
-    public DbEntityAttributeRelationshipTab(ProjectController controller) {
+    public DbEntityPropertiesView(ProjectController controller) {
 
         this.setLayout(new BorderLayout());
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbRelationshipPanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
index 1db80b609..df48f59e6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.properties;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
@@ -65,11 +65,11 @@ public class DbRelationshipPanel extends JPanel implements DbEntityDisplayListen
     private final ProjectController controller;
     private final CayenneTable table;
     private final TableColumnPreferences tablePreferences;
-    private final DbEntityAttributeRelationshipTab parentPanel;
+    private final DbEntityPropertiesView parentPanel;
     private final JMenuItem editMenu;
     private JComboBox<DbEntity> targetCombo;
 
-    public DbRelationshipPanel(ProjectController controller, DbEntityAttributeRelationshipTab parentPanel) {
+    public DbRelationshipPanel(ProjectController controller, DbEntityPropertiesView parentPanel) {
         this.controller = controller;
         this.parentPanel = parentPanel;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipTableModel.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbRelationshipTableModel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipTableModel.java
index e6ffbeb23..799382bbd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipTableModel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.dbentity;
+package org.apache.cayenne.modeler.ui.project.editor.dbentity.properties;
 
 import javax.swing.JOptionPane;
 import java.util.ArrayList;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
similarity index 86%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTabbedView.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
index a271c59eb..c278551fc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
@@ -35,19 +35,24 @@ import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.RelationshipDisplayEvent;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjEntityCallbacksView;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.main.ObjEntityMainView;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjAttributePanel;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjEntityPropertiesView;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjRelationshipPanel;
 
 import javax.swing.*;
 import javax.swing.event.ChangeEvent;
 import java.awt.*;
 
-public class ObjEntityTabbedView extends JTabbedPane {
+public class ObjEntityView extends JTabbedPane {
 
     private final Component entityPanel;
-    private final ObjEntityAttributeRelationshipTab attributeRelationshipTab;
-    private final ObjEntityCallbackMethodsTab callbacksPanel;
+    private final ObjEntityPropertiesView attributeRelationshipTab;
+    private final ObjEntityCallbacksView callbacksPanel;
     private int lastTabIndex;
 
-    public ObjEntityTabbedView(ProjectController controller) {
+    public ObjEntityView(ProjectController controller) {
 
         setTabPlacement(JTabbedPane.TOP);
 
@@ -55,13 +60,13 @@ public class ObjEntityTabbedView extends JTabbedPane {
         // note that those panels that have no internal scrollable tables
         // must be wrapped in a scroll pane
 
-        entityPanel = new JScrollPane(new ObjEntityTab(controller));
+        entityPanel = new JScrollPane(new ObjEntityMainView(controller));
         addTab("Entity", entityPanel);
 
-        attributeRelationshipTab = new ObjEntityAttributeRelationshipTab(controller);
+        attributeRelationshipTab = new ObjEntityPropertiesView(controller);
         addTab("Properties", attributeRelationshipTab);
 
-        callbacksPanel = new ObjEntityCallbackMethodsTab(controller);
+        callbacksPanel = new ObjEntityCallbacksView(controller);
         addTab("Callbacks", callbacksPanel);
 
         controller.addObjEntityDisplayListener(this::currentObjEntityChanged);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialogController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialogController.java
index b3b267a26..7d801f04d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialogController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialogController.java
@@ -31,7 +31,7 @@ import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjAttributeTableModel;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjAttributeTableModel;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EntityDisplayEvent;
 import org.apache.cayenne.modeler.mvc.ChildController;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/CallbackDescriptorTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackDescriptorTableModel.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/CallbackDescriptorTableModel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackDescriptorTableModel.java
index c1c5c0508..7ca5cdfad 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/CallbackDescriptorTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackDescriptorTableModel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks;
 
 import org.apache.cayenne.map.CallbackDescriptor;
 import org.apache.cayenne.map.ObjEntity;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/CallbackType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackType.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/CallbackType.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackType.java
index 84265e205..868cc84af 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/CallbackType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/CallbackType.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks;
 
 import org.apache.cayenne.map.LifecycleEvent;
 import org.apache.cayenne.util.Util;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjCallbackMethod.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjCallbackMethod.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjCallbackMethod.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjCallbackMethod.java
index de7d28e99..d024fdb6e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjCallbackMethod.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjCallbackMethod.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks;
 
 import java.io.Serializable;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityCallbackMethodsTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityCallbackMethodsTab.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
index 92fcf9f35..049db9237 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityCallbackMethodsTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks;
 
 import com.jgoodies.forms.builder.DefaultFormBuilder;
 import com.jgoodies.forms.builder.PanelBuilder;
@@ -77,9 +77,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
-public class ObjEntityCallbackMethodsTab extends JPanel {
+public class ObjEntityCallbacksView extends JPanel {
 
-    private static final Logger LOGGER = LoggerFactory.getLogger(ObjEntityCallbackMethodsTab.class);
+    private static final Logger LOGGER = LoggerFactory.getLogger(ObjEntityCallbacksView.class);
 
     private static final Map<Integer, Integer> MIN_SIZES = Collections.singletonMap(0, 150);
 
@@ -102,7 +102,7 @@ public class ObjEntityCallbackMethodsTab extends JPanel {
 
     private final CayenneTable[] tables = new CayenneTable[callbackTypes.length];
 
-    public ObjEntityCallbackMethodsTab(ProjectController controller) {
+    public ObjEntityCallbacksView(ProjectController controller) {
         this.controller = controller;
         this.setLayout(new BorderLayout());
 
@@ -175,7 +175,7 @@ public class ObjEntityCallbackMethodsTab extends JPanel {
         });
 
         controller.addObjEntityDisplayListener(e -> {
-            if (ObjEntityCallbackMethodsTab.this.isVisible()) {
+            if (ObjEntityCallbacksView.this.isVisible()) {
                 rebuildTables();
             }
         });
@@ -243,7 +243,7 @@ public class ObjEntityCallbackMethodsTab extends JPanel {
             builder.append(createTablePanel(tables[index++]));
         }
 
-        tablePreferences = new TableColumnPreferences(ObjEntityCallbackMethodsTab.class, "objEntity/callbackTable");
+        tablePreferences = new TableColumnPreferences(ObjEntityCallbacksView.class, "objEntity/callbackTable");
 
         auxPanel.add(builder.getPanel(), BorderLayout.CENTER);
         validate();
@@ -496,7 +496,7 @@ public class ObjEntityCallbackMethodsTab extends JPanel {
                 for (CayenneTable nextTable : tables) {
                     nextTable.getColumnModel().getColumn(0).setPreferredWidth(table.getWidth());
                 }
-                tablePreferences = new TableColumnPreferences(ObjEntityCallbackMethodsTab.class, "objEntity/callbackTable");
+                tablePreferences = new TableColumnPreferences(ObjEntityCallbacksView.class, "objEntity/callbackTable");
                 table.setColumnWidthChanged(false);
             }
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTab.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index 3e4aa79a7..e1c6faf82 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.main;
 
 import org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
 import com.jgoodies.forms.builder.DefaultFormBuilder;
@@ -62,7 +62,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, ExistingSelectionProcessor {
+public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListener, ExistingSelectionProcessor {
 
     private static final ObjEntity NO_INHERITANCE = new ObjEntity("Direct Mapping to Table/View");
 
@@ -81,7 +81,7 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
     private final JCheckBox isAbstract;
     private final CayenneUndoableTextField comment;
 
-    public ObjEntityTab(ProjectController controller) {
+    public ObjEntityMainView(ProjectController controller) {
         this.controller = controller;
 
         this.setLayout(new BorderLayout());
@@ -176,7 +176,7 @@ public class ObjEntityTab extends JPanel implements ObjEntityDisplayListener, Ex
 
             if (dbEntity != entity.getDbEntity()) {
                 entity.setDbEntity(dbEntity);
-                controller.fireObjEntityEvent(new EntityEvent(ObjEntityTab.this, entity));
+                controller.fireObjEntityEvent(new EntityEvent(ObjEntityMainView.this, entity));
             }
         });
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjAttributePanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
index bb809a27f..377cd2805 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.properties;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
@@ -79,13 +79,13 @@ public class ObjAttributePanel extends JPanel implements ObjEntityDisplayListene
     private static final ImageIcon INHERITANCE_ICON = ModelerUtil.buildIcon("icon-inheritance.png");
 
     private final ProjectController controller;
-    private final ObjEntityAttributeRelationshipTab parentPanel;
+    private final ObjEntityPropertiesView parentPanel;
 
     private final CayenneTable table;
     private final TableColumnPreferences tablePreferences;
     private final JMenuItem editMenu;
 
-    public ObjAttributePanel(ProjectController controller, ObjEntityAttributeRelationshipTab parentPanel) {
+    public ObjAttributePanel(ProjectController controller, ObjEntityPropertiesView parentPanel) {
         this.controller = controller;
         this.parentPanel = parentPanel;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjAttributeTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjAttributeTableModel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
index 125b507e6..d94d55cbd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjAttributeTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.properties;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityAttributeRelationshipTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityAttributeRelationshipTab.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
index de0cd8e6a..3bdd41cce 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityAttributeRelationshipTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.properties;
 
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.ObjEntityListener;
@@ -50,7 +50,7 @@ import java.awt.event.ActionListener;
 /**
  * Combines ObjEntityAttributeTab and ObjEntityRelationshipTab in JSplitPane.
  */
-public class ObjEntityAttributeRelationshipTab extends JPanel implements ObjEntityDisplayListener, ObjEntityListener {
+public class ObjEntityPropertiesView extends JPanel implements ObjEntityDisplayListener, ObjEntityListener {
 
     private final ObjAttributePanel attributePanel;
     private final ObjRelationshipPanel relationshipPanel;
@@ -58,7 +58,7 @@ public class ObjEntityAttributeRelationshipTab extends JPanel implements ObjEnti
     private final JToolBar toolBar;
     private final JButton editButton;
 
-    public ObjEntityAttributeRelationshipTab(ProjectController controller) {
+    public ObjEntityPropertiesView(ProjectController controller) {
         this.setLayout(new BorderLayout());
 
         this.editButton = new ModelerAbstractAction.CayenneToolbarButton(null, 0);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjRelationshipPanel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
index 4ac054921..e7db453de 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.properties;
 
 import org.apache.cayenne.map.DeleteRule;
 import org.apache.cayenne.map.ObjEntity;
@@ -74,10 +74,10 @@ public class ObjRelationshipPanel extends JPanel implements ObjEntityDisplayList
     private final ProjectController controller;
     private final CayenneTable table;
     private final TableColumnPreferences tablePreferences;
-    private final ObjEntityAttributeRelationshipTab parentPanel;
+    private final ObjEntityPropertiesView parentPanel;
     private final JMenuItem editMenu;
 
-    public ObjRelationshipPanel(ProjectController controller, ObjEntityAttributeRelationshipTab parentPanel) {
+    public ObjRelationshipPanel(ProjectController controller, ObjEntityPropertiesView parentPanel) {
         this.controller = controller;
         this.parentPanel = parentPanel;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipTableModel.java
similarity index 99%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjRelationshipTableModel.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipTableModel.java
index 24a236e07..e97869270 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipTableModel.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.ui.project.editor.objentity;
+package org.apache.cayenne.modeler.ui.project.editor.objentity.properties;
 
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
index 14b89e7a0..5615d812e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
@@ -23,7 +23,7 @@ import javax.swing.undo.CannotUndoException;
 
 import org.apache.cayenne.modeler.action.CreateCallbackMethodAction;
 import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.CallbackType;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 
 public class CreateCallbackMethodUndoableEdit extends CayenneUndoableEdit {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
index 3e736a834..5e3d70e43 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
@@ -40,7 +40,7 @@ import org.apache.cayenne.modeler.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
 import org.apache.cayenne.modeler.action.RemoveProcedureParameterAction;
 import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.map.QueryDescriptor;
 
 public class PasteUndoableEdit extends CayenneUndoableEdit {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
index e64fbb25f..4f49601d4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
@@ -20,8 +20,8 @@ package org.apache.cayenne.modeler.undo;
 
 import org.apache.cayenne.modeler.action.CreateCallbackMethodAction;
 import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.CallbackType;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 
 import javax.swing.undo.CannotRedoException;
 import javax.swing.undo.CannotUndoException;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
index 08f6b4b25..83a7df59d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjAttributeTableModel;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjAttributeTableModel;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
index 60a8ef977..58d3297fd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjRelationshipTableModel;
+import org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjRelationshipTableModel;
 
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;


(cayenne) 08/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 52ac063583c94cb6fbe2c2f766db7c879e7f887a
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 08:01:13 2026 -0400

    Modeler cleanup
    
    ... changing "patternSyntaxStyle" to non-static. Looks like previously
    it wasn't scoped properly
---
 .../modeler/swing/text/CayenneTextPane.java        |  2 +-
 .../swing/text/CayenneTextPaneEditorKit.java       | 47 +++++++++++++------
 .../swing/text/CayenneUndoableTextPane.java        |  2 +-
 .../modeler/swing/text/style/TextPaneStyleMap.java | 53 ----------------------
 .../swing/text/{syntax => style}/TextSyntax.java   |  2 +-
 .../ui/project/editor/query/ejbql/EjbqlSyntax.java |  2 +-
 .../editor/query/sqltemplate/SQLSyntax.java        |  2 +-
 7 files changed, 38 insertions(+), 72 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java
index d746b7b9f..6b89f9163 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPane.java
@@ -19,7 +19,7 @@
 package org.apache.cayenne.modeler.swing.text;
 
 import org.apache.cayenne.modeler.util.ModelerUtil;
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
+import org.apache.cayenne.modeler.swing.text.style.TextSyntax;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java
index 500b3e9f9..bc9944857 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneTextPaneEditorKit.java
@@ -1,9 +1,8 @@
 package org.apache.cayenne.modeler.swing.text;
 
 import org.apache.cayenne.modeler.swing.text.style.SyntaxStyle;
-import org.apache.cayenne.modeler.swing.text.style.TextPaneStyleMap;
 import org.apache.cayenne.modeler.swing.text.style.TextPaneStyleTypes;
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
+import org.apache.cayenne.modeler.swing.text.style.TextSyntax;
 
 import javax.swing.text.BadLocationException;
 import javax.swing.text.Element;
@@ -44,39 +43,59 @@ class CayenneTextPaneEditorKit extends StyledEditorKit {
 
     static class TextPaneView extends PlainView {
 
-        private static final HashMap<Pattern, SyntaxStyle> patternSyntaxStyle;
         private static final Pattern patternComment;
         private static final Pattern patternCommentStart;
 
         private static final SyntaxStyle syntaxStyleComment;
         private static final HashMap<Pattern, SyntaxStyle> patternValue;
-        private static final TextPaneStyleMap style = new TextPaneStyleMap();
+        private static final Map<TextPaneStyleTypes, SyntaxStyle> syntaxStyleMap;
 
         static {
-            patternSyntaxStyle = new HashMap<>();
+            syntaxStyleMap = new HashMap<>();
+            Font plainFont = TextSyntax.DEFAULT_FONT;
+            Font boldFont = new Font(plainFont.getFamily(), Font.BOLD, plainFont.getSize());
+            Font italicFont = new Font(plainFont.getFamily(), Font.ITALIC, plainFont.getSize());
+
+            SyntaxStyle keywordsStyle = new SyntaxStyle(Color.blue, boldFont);
+            SyntaxStyle numberStyle = new SyntaxStyle(Color.ORANGE, italicFont);
+            SyntaxStyle typeStyle = new SyntaxStyle(Color.BLUE, boldFont);
+            SyntaxStyle stringStyle = new SyntaxStyle(Color.blue, italicFont);
+            SyntaxStyle commentStyle = new SyntaxStyle(Color.LIGHT_GRAY, italicFont);
+            SyntaxStyle keywords2Style = new SyntaxStyle(Color.MAGENTA, plainFont);
+
+            syntaxStyleMap.put(TextPaneStyleTypes.KEYWORDS, keywordsStyle);
+            syntaxStyleMap.put(TextPaneStyleTypes.KEYWORDS2, keywords2Style);
+            syntaxStyleMap.put(TextPaneStyleTypes.OPERATORS, keywordsStyle);
+            syntaxStyleMap.put(TextPaneStyleTypes.NUMBER, numberStyle);
+            syntaxStyleMap.put(TextPaneStyleTypes.TYPE, typeStyle);
+            syntaxStyleMap.put(TextPaneStyleTypes.STRING, stringStyle);
+            syntaxStyleMap.put(TextPaneStyleTypes.COMMENT, commentStyle);
+
             patternValue = new HashMap<>();
             patternComment = Pattern.compile(TextSyntax.COMMENT_TEXT,
                     Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
             patternCommentStart = Pattern.compile(TextSyntax.COMMENT_TEXT_START,
                     Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
-            syntaxStyleComment = style.syntaxStyleMap.get(TextPaneStyleTypes.COMMENT);
+            syntaxStyleComment = syntaxStyleMap.get(TextPaneStyleTypes.COMMENT);
         }
 
+        private final HashMap<Pattern, SyntaxStyle> patternSyntaxStyle;
+
         public TextPaneView(Element elem, TextSyntax syntax) {
             super(elem);
             getDocument().putProperty(PlainDocument.tabSizeAttribute, 4);
 
-            if (patternSyntaxStyle.isEmpty()) {
-                addConstants(syntax.keywords(), TextPaneStyleTypes.KEYWORDS);
-                addConstants(syntax.keywords2(), TextPaneStyleTypes.KEYWORDS2);
-                addConstants(syntax.operators(), TextPaneStyleTypes.KEYWORDS);
-                addConstants(syntax.types(), TextPaneStyleTypes.TYPE);
-            }
+            patternSyntaxStyle = new HashMap<>();
+
+            addConstants(syntax.keywords(), TextPaneStyleTypes.KEYWORDS);
+            addConstants(syntax.keywords2(), TextPaneStyleTypes.KEYWORDS2);
+            addConstants(syntax.operators(), TextPaneStyleTypes.KEYWORDS);
+            addConstants(syntax.types(), TextPaneStyleTypes.TYPE);
 
             if (patternValue.isEmpty()) {
                 patternValue.put(
                         Pattern.compile(TextSyntax.NUMBER_TEXT),
-                        style.syntaxStyleMap.get(TextPaneStyleTypes.NUMBER));
+                        syntaxStyleMap.get(TextPaneStyleTypes.NUMBER));
             }
         }
 
@@ -85,7 +104,7 @@ class CayenneTextPaneEditorKit extends StyledEditorKit {
                 String pattern = "(" + keyword + ")";
                 patternSyntaxStyle.put(
                         Pattern.compile(pattern, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE),
-                        style.syntaxStyleMap.get(type));
+                        syntaxStyleMap.get(type));
             }
         }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneUndoableTextPane.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneUndoableTextPane.java
index 752e8013c..c40f3d783 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneUndoableTextPane.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/CayenneUndoableTextPane.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.swing.text;
 
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
+import org.apache.cayenne.modeler.swing.text.style.TextSyntax;
 import org.apache.cayenne.modeler.undo.JTextFieldUndoListener;
 
 import javax.swing.event.UndoableEditListener;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/style/TextPaneStyleMap.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/style/TextPaneStyleMap.java
deleted file mode 100644
index 13227240b..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/style/TextPaneStyleMap.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.swing.text.style;
-
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
-
-import java.awt.*;
-import java.util.HashMap;
-import java.util.Map;
-
-
-public class TextPaneStyleMap {
-	
-	public Map<TextPaneStyleTypes, SyntaxStyle> syntaxStyleMap = new HashMap<>();
-	
-	public TextPaneStyleMap() {
-		Font plainFont = TextSyntax.DEFAULT_FONT;
-		Font boldFont = new Font(plainFont.getFamily(), Font.BOLD , plainFont.getSize());
-		Font italicFont = new Font(plainFont.getFamily(), Font.ITALIC, plainFont.getSize());
-		
-		SyntaxStyle keywordsStyle = new SyntaxStyle(Color.blue, boldFont);
-		SyntaxStyle numberStyle = new SyntaxStyle(Color.ORANGE, italicFont);
-		SyntaxStyle typeStyle = new SyntaxStyle(Color.BLUE, boldFont);
-		SyntaxStyle stringStyle = new SyntaxStyle(Color.blue, italicFont);
-		SyntaxStyle commentStyle = new SyntaxStyle(Color.LIGHT_GRAY, italicFont);
-		SyntaxStyle keywords2Style = new SyntaxStyle(Color.MAGENTA, plainFont);
-		
-		syntaxStyleMap.put(TextPaneStyleTypes.KEYWORDS, keywordsStyle);
-		syntaxStyleMap.put(TextPaneStyleTypes.KEYWORDS2, keywords2Style);
-		syntaxStyleMap.put(TextPaneStyleTypes.OPERATORS, keywordsStyle);
-		syntaxStyleMap.put(TextPaneStyleTypes.NUMBER, numberStyle);
-		syntaxStyleMap.put(TextPaneStyleTypes.TYPE, typeStyle);
-		syntaxStyleMap.put(TextPaneStyleTypes.STRING, stringStyle);
-		syntaxStyleMap.put(TextPaneStyleTypes.COMMENT, commentStyle);	
-	}
-
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/syntax/TextSyntax.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/style/TextSyntax.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/syntax/TextSyntax.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/style/TextSyntax.java
index e96953e27..be46fc166 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/syntax/TextSyntax.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/swing/text/style/TextSyntax.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.swing.text.syntax;
+package org.apache.cayenne.modeler.swing.text.style;
 
 import java.awt.Color;
 import java.awt.Font;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlSyntax.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlSyntax.java
index 58e2fda16..5d2c0c280 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlSyntax.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlSyntax.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.project.editor.query.ejbql;
 
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
+import org.apache.cayenne.modeler.swing.text.style.TextSyntax;
 
 class EjbqlSyntax implements TextSyntax {
     private static final String[] KEYWORDS = {"AS", "ABS", "ASC", "AVG", "BETWEEN",
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLSyntax.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLSyntax.java
index 594cace3d..6a62080ba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLSyntax.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLSyntax.java
@@ -19,7 +19,7 @@
 package org.apache.cayenne.modeler.ui.project.editor.query.sqltemplate;
 
 
-import org.apache.cayenne.modeler.swing.text.syntax.TextSyntax;
+import org.apache.cayenne.modeler.swing.text.style.TextSyntax;
 
 class SQLSyntax implements TextSyntax {
 


(cayenne) 12/15: Fixing per-project preferences

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 9ea38f341959dd43066c2ac90cec22d9d71afb90
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 15:36:50 2026 -0400

    Fixing per-project preferences
---
 .../cayenne/modeler/ui/project/ProjectController.java  | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
index 956904c35..a6c8bd75a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
@@ -68,7 +68,6 @@ import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 import org.apache.cayenne.project.Project;
-import org.apache.cayenne.util.IDUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -1359,21 +1358,20 @@ public class ProjectController extends ChildController<ModelerController> {
 
     private Preferences buildPreferences() {
 
-        if (preferences == null) {
-            return Preferences.userNodeForPackage(Project.class);
+        Preferences root = Preferences.userNodeForPackage(Project.class);
+        if (project == null) {
+            return root;
         }
 
-        String key = getProject().getConfigurationResource() == null
-                ? new String(IDUtil.pseudoUniqueByteSequence16())
+        String resourcePath = project.getConfigurationResource() == null
+                ? null
                 : project.getConfigurationResource().getURL().getPath();
 
-        if (key.isEmpty()) {
-            return Preferences.userNodeForPackage(Project.class);
+        if (resourcePath == null || resourcePath.isEmpty() || !resourcePath.contains(".xml")) {
+            return root.node(getApplication().getNewProjectTemporaryName());
         }
 
-        return key.contains(".xml")
-                ? preferences.node(preferences.absolutePath() + key.replace(".xml", ""))
-                : preferences.node(preferences.absolutePath()).node(getApplication().getNewProjectTemporaryName());
+        return root.node(root.absolutePath() + resourcePath.replace(".xml", ""));
     }
 
 


(cayenne) 15/15: Modeler cleanup

Posted by aa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 7ad056aa2239f3aa587e8206531002f938b8596c
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Sat Apr 25 15:36:50 2026 -0400

    Modeler cleanup
    
    service layer refactoring
---
 .../generic/GenericCayenneModelerModule.java       |  2 +-
 .../generic/GenericPlatformInitializer.java        |  2 +-
 .../modeler/osx/OSXCayenneModelerModule.java       |  2 +-
 .../modeler/osx/OSXPlatformInitializer.java        | 93 ++++++++++------------
 .../modeler/win/WinCayenneModelerModule.java       |  2 +-
 .../modeler/win/WinPlatformInitializer.java        | 50 ++++++------
 .../org/apache/cayenne/modeler/Application.java    | 76 ++++++++----------
 .../cayenne/modeler/ClassLoadingService.java       | 38 ---------
 .../main/java/org/apache/cayenne/modeler/Main.java |  2 +-
 .../org/apache/cayenne/modeler/ModelerModule.java  | 17 ++--
 .../modeler/dbimport/ModelerDbLoaderContext.java   |  8 +-
 .../cayenne/modeler/graph/BaseGraphBuilder.java    |  8 +-
 .../modeler/graph/ObjEntityCellMetadata.java       |  6 +-
 .../modeler/pref/CayenneProjectPreferences.java    | 11 ---
 .../cayenne/modeler/pref/DBConnectionInfo.java     | 10 +--
 .../action/GlobalActions.java}                     | 22 ++---
 .../classloader/ModelerClassLoader.java}           | 85 ++++++--------------
 .../extension => service/graph}/EntityHandler.java |  2 +-
 .../graph}/GraphExtension.java                     | 13 ++-
 .../extension => service/graph}/GraphHandler.java  | 27 +++----
 .../graph}/GraphLoaderDelegate.java                | 12 +--
 .../graph}/GraphSaverDelegate.java                 |  2 +-
 .../graph}/GraphsRootHandler.java                  | 12 +--
 .../platform/DefaultPlatformInitializer.java       |  2 +-
 .../platform/PlatformInitializer.java              |  2 +-
 .../validator}/ConfigurableProjectValidator.java   |  2 +-
 .../extension/ValidationConfigHandler.java         |  2 +-
 .../validator}/extension/ValidationExtension.java  |  2 +-
 .../extension/ValidationLoaderDelegate.java        |  2 +-
 .../extension/ValidationSaverDelegate.java         |  2 +-
 .../org/apache/cayenne/modeler/ui/MainToolBar.java | 42 +++++-----
 .../apache/cayenne/modeler/ui/ModelerFrame.java    | 12 +--
 .../apache/cayenne/modeler/ui/ModelerMenuBar.java  | 72 ++++++++---------
 .../cayenne/modeler/ui/action/ActionManager.java   | 62 ---------------
 .../ui/action/CopyAttributeRelationshipAction.java |  2 +-
 .../modeler/ui/action/ImportEOModelAction.java     |  2 +-
 .../ui/action/ReverseEngineeringAction.java        |  2 +-
 .../InferRelationshipsController.java              |  5 +-
 .../ui/datasource/DataSourceController.java        |  4 +-
 .../ui/dbgen/DBGeneratorOptionsController.java     |  2 +-
 .../ui/dbmerge/MergerOptionsController.java        |  7 +-
 .../ui/preferences/PreferenceDialogContext.java    |  2 +-
 .../DataSourcePreferencesController.java           | 22 +++--
 .../modeler/ui/project/ProjectController.java      | 20 ++---
 .../cayenne/modeler/ui/project/ProjectView.java    | 12 +--
 .../datamap/dbimport/DatabaseSchemaLoader.java     |  8 +-
 .../dbimport/action/LoadDbSchemaAction.java        |  6 +-
 .../ui/project/editor/dbentity/DbEntityView.java   |  8 +-
 .../editor/dbentity/main/DbEntityMainView.java     | 16 ++--
 .../dbentity/properties/DbAttributePanel.java      | 22 ++---
 .../properties/DbEntityPropertiesView.java         | 22 ++---
 .../dbentity/properties/DbRelationshipPanel.java   | 28 +++----
 .../project/editor/embeddable/EmbeddableView.java  |  8 +-
 .../attributes/EmbeddableAttributesView.java       | 22 ++---
 .../editor/embeddable/main/EmbeddableMainView.java |  6 +-
 .../ui/project/editor/objentity/ObjEntityView.java | 10 +--
 .../editor/objentity/main/ObjEntityMainView.java   | 14 ++--
 .../objentity/properties/ObjAttributePanel.java    | 26 +++---
 .../properties/ObjEntityPropertiesView.java        | 20 ++---
 .../objentity/properties/ObjRelationshipPanel.java | 24 +++---
 .../editor/procedure/ProcedureParameterTab.java    | 24 +++---
 .../ProjectValidatorDialogController.java          |  8 +-
 .../validator/ProjectValidatorDialogView.java      |  8 +-
 .../undo/BaseRemovePropertyUndoableEdit.java       |  4 +-
 .../cayenne/modeler/undo/CayenneUndoableEdit.java  |  6 +-
 .../modeler/undo/CreateAttributeUndoableEdit.java  |  4 +-
 .../undo/CreateCallbackMethodUndoableEdit.java     |  4 +-
 .../modeler/undo/CreateDataMapUndoableEdit.java    |  2 +-
 .../modeler/undo/CreateDbEntityUndoableEdit.java   |  4 +-
 .../undo/CreateEmbAttributeUndoableEdit.java       |  4 +-
 .../modeler/undo/CreateEmbeddableUndoableEdit.java |  4 +-
 .../modeler/undo/CreateNodeUndoableEdit.java       |  2 +-
 .../modeler/undo/CreateObjEntityUndoableEdit.java  |  4 +-
 .../undo/CreateProcedureParameterUndoableEdit.java |  4 +-
 .../modeler/undo/CreateProcedureUndoableEdit.java  |  4 +-
 .../modeler/undo/CreateQueryUndoableEdit.java      |  4 +-
 .../undo/CreateRelationshipUndoableEdit.java       |  4 +-
 .../modeler/undo/LinkDataMapUndoableEdit.java      |  2 +-
 .../cayenne/modeler/undo/PasteUndoableEdit.java    | 12 +--
 .../modeler/undo/RemoveAttributeUndoableEdit.java  |  4 +-
 .../undo/RemoveCallbackMethodUndoableEdit.java     |  4 +-
 .../undo/RemoveRelationshipUndoableEdit.java       |  4 +-
 .../cayenne/modeler/undo/RemoveUndoableEdit.java   | 14 ++--
 .../undo/UpdateValidationConfigUndoableEdit.java   |  4 +-
 .../apache/cayenne/modeler/util/ModelerUtil.java   |  6 +-
 .../modeler/util/NameGeneratorPreferences.java     |  2 +-
 .../modeler/CayenneModelerValidationIT.java        |  2 +-
 .../{ => ui}/action/CreateNodeActionTest.java      |  3 +-
 88 files changed, 495 insertions(+), 680 deletions(-)

diff --git a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericCayenneModelerModule.java b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericCayenneModelerModule.java
index f4c5a383a..7fa1aca65 100644
--- a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericCayenneModelerModule.java
+++ b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericCayenneModelerModule.java
@@ -20,7 +20,7 @@ package org.apache.cayenne.modeler.generic;
 
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 
 public class GenericCayenneModelerModule implements Module {
 
diff --git a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java
index 883d3eb8b..3c0fef8c2 100644
--- a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java
+++ b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericPlatformInitializer.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.modeler.generic;
 import com.jgoodies.looks.plastic.PlasticLookAndFeel;
 import com.jgoodies.looks.plastic.PlasticTheme;
 import com.jgoodies.looks.plastic.PlasticXPLookAndFeel;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXCayenneModelerModule.java b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXCayenneModelerModule.java
index 06ca403b6..4be3efc55 100644
--- a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXCayenneModelerModule.java
+++ b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXCayenneModelerModule.java
@@ -20,7 +20,7 @@ package org.apache.cayenne.modeler.osx;
 
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 
 public class OSXCayenneModelerModule implements Module {
 
diff --git a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
index f7596fcf8..e455a0771 100644
--- a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
+++ b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPlatformInitializer.java
@@ -18,36 +18,26 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.osx;
 
-import java.awt.Color;
-import java.awt.Component;
-import java.awt.Desktop;
-import java.awt.Graphics;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.swing.Action;
-import javax.swing.BorderFactory;
-import javax.swing.JFrame;
-import javax.swing.JMenu;
-import javax.swing.JMenuBar;
-import javax.swing.JMenuItem;
-import javax.swing.JPopupMenu;
-import javax.swing.UIManager;
-import javax.swing.border.AbstractBorder;
-import javax.swing.border.Border;
-
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.AboutAction;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
 import org.apache.cayenne.modeler.ui.action.ConfigurePreferencesAction;
 import org.apache.cayenne.modeler.ui.action.ExitAction;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+
+import javax.swing.*;
+import javax.swing.border.AbstractBorder;
+import javax.swing.border.Border;
+import java.awt.*;
+import java.util.HashSet;
+import java.util.Set;
 
 public class OSXPlatformInitializer implements PlatformInitializer {
 
     @Inject
-    protected ActionManager actionManager;
+    protected GlobalActions globalActions;
 
+    @Override
     public void initLookAndFeel() {
 
         // override some default styles and colors, assuming that Aqua theme will be used
@@ -55,10 +45,10 @@ public class OSXPlatformInitializer implements PlatformInitializer {
 
         Desktop desktop = Desktop.getDesktop();
 
-        desktop.setAboutHandler(e -> actionManager.getAction(AboutAction.class).showAboutDialog());
-        desktop.setPreferencesHandler(e -> actionManager.getAction(ConfigurePreferencesAction.class).showPreferencesDialog());
+        desktop.setAboutHandler(e -> globalActions.getAction(AboutAction.class).showAboutDialog());
+        desktop.setPreferencesHandler(e -> globalActions.getAction(ConfigurePreferencesAction.class).showPreferencesDialog());
         desktop.setQuitHandler((e, r) -> {
-            if(!actionManager.getAction(ExitAction.class).exit()) {
+            if (!globalActions.getAction(ExitAction.class).exit()) {
                 r.cancelQuit();
             } else {
                 r.performQuit();
@@ -68,38 +58,38 @@ public class OSXPlatformInitializer implements PlatformInitializer {
 
     private void overrideUIDefaults() {
         Color lightGrey = new Color(0xEEEEEE);
-        Color darkGrey  = new Color(225, 225, 225);
+        Color darkGrey = new Color(225, 225, 225);
         Border darkBorder = BorderFactory.createLineBorder(darkGrey);
 
-        UIManager.put("ToolBarSeparatorUI",           OSXToolBarSeparatorUI.class.getName());
-        UIManager.put("PanelUI",                      OSXPanelUI.class.getName());
+        UIManager.put("ToolBarSeparatorUI", OSXToolBarSeparatorUI.class.getName());
+        UIManager.put("PanelUI", OSXPanelUI.class.getName());
         // next two is custom-made for Cayenne's MainToolBar
-        UIManager.put("ToolBar.background",           lightGrey);
-        UIManager.put("MainToolBar.background",       lightGrey);
-        UIManager.put("MainToolBar.border",           BorderFactory.createEmptyBorder(0, 7, 0, 7));
-        UIManager.put("ToolBar.border",               darkBorder);
-        UIManager.put("ScrollPane.border",            darkBorder);
-        UIManager.put("Table.scrollPaneBorder",       darkBorder);
-        UIManager.put("SplitPane.border",             BorderFactory.createEmptyBorder());
-        UIManager.put("SplitPane.background",         darkGrey);
-        UIManager.put("Tree.rendererFillBackground",  Boolean.TRUE);
-        UIManager.put("Tree.paintLines",              Boolean.FALSE);
-        UIManager.put("ComboBox.background",          Color.WHITE);
+        UIManager.put("ToolBar.background", lightGrey);
+        UIManager.put("MainToolBar.background", lightGrey);
+        UIManager.put("MainToolBar.border", BorderFactory.createEmptyBorder(0, 7, 0, 7));
+        UIManager.put("ToolBar.border", darkBorder);
+        UIManager.put("ScrollPane.border", darkBorder);
+        UIManager.put("Table.scrollPaneBorder", darkBorder);
+        UIManager.put("SplitPane.border", BorderFactory.createEmptyBorder());
+        UIManager.put("SplitPane.background", darkGrey);
+        UIManager.put("Tree.rendererFillBackground", Boolean.TRUE);
+        UIManager.put("Tree.paintLines", Boolean.FALSE);
+        UIManager.put("ComboBox.background", Color.WHITE);
         UIManager.put("ComboBox.selectionBackground", darkGrey);
         UIManager.put("ComboBox.selectionForeground", Color.BLACK);
-        UIManager.put("CheckBox.background",          Color.WHITE);
-        UIManager.put("Tree.background",              Color.WHITE);
-        UIManager.put("Tree.selectionForeground",     Color.BLACK);
-        UIManager.put("Tree.selectionBackground",     lightGrey);
-        UIManager.put("Tree.selectionBorderColor",    lightGrey);
-        UIManager.put("Table.selectionForeground",    Color.BLACK);
-        UIManager.put("Table.selectionBackground",    lightGrey);
+        UIManager.put("CheckBox.background", Color.WHITE);
+        UIManager.put("Tree.background", Color.WHITE);
+        UIManager.put("Tree.selectionForeground", Color.BLACK);
+        UIManager.put("Tree.selectionBackground", lightGrey);
+        UIManager.put("Tree.selectionBorderColor", lightGrey);
+        UIManager.put("Table.selectionForeground", Color.BLACK);
+        UIManager.put("Table.selectionBackground", lightGrey);
         UIManager.put("Table.focusCellHighlightBorder", BorderFactory.createEmptyBorder());
-        UIManager.put("CheckBoxHeader.border",          BorderFactory.createEmptyBorder(0, 9, 0, 0));
+        UIManager.put("CheckBoxHeader.border", BorderFactory.createEmptyBorder(0, 9, 0, 0));
 
         // MacOS BigSur needs additional style tweaking for the tabs active state
         OSXVersion version = OSXVersion.fromSystemProperties();
-        if(version.gt(OSXVersion.CATALINA)) {
+        if (version.gt(OSXVersion.CATALINA)) {
             UIManager.put("TabbedPane.selectedTabTitlePressedColor", Color.BLACK);
             UIManager.put("TabbedPane.selectedTabTitleNormalColor", Color.BLACK);
             UIManager.put("TabbedPane.selectedTabTitleShadowDisabledColor", new Color(0, 0, 0, 0));
@@ -114,17 +104,18 @@ public class OSXPlatformInitializer implements PlatformInitializer {
             }
         };
         UIManager.put("MenuItem.selectedBackgroundPainter", backgroundPainter);
-        UIManager.put("MenuItem.selectionForeground",       Color.BLACK);
+        UIManager.put("MenuItem.selectionForeground", Color.BLACK);
     }
 
+    @Override
     public void setupMenus(JFrame frame) {
         // set additional look and feel for the window
         frame.getRootPane().putClientProperty("apple.awt.brushMetalLook", Boolean.TRUE);
 
         Set<Action> removeActions = new HashSet<>();
-        removeActions.add(actionManager.getAction(ExitAction.class));
-        removeActions.add(actionManager.getAction(AboutAction.class));
-        removeActions.add(actionManager.getAction(ConfigurePreferencesAction.class));
+        removeActions.add(globalActions.getAction(ExitAction.class));
+        removeActions.add(globalActions.getAction(AboutAction.class));
+        removeActions.add(globalActions.getAction(ConfigurePreferencesAction.class));
 
         JMenuBar menuBar = frame.getJMenuBar();
         for (Component menu : menuBar.getComponents()) {
diff --git a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinCayenneModelerModule.java b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinCayenneModelerModule.java
index a92162fbd..6c31d16b0 100644
--- a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinCayenneModelerModule.java
+++ b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinCayenneModelerModule.java
@@ -20,7 +20,7 @@ package org.apache.cayenne.modeler.win;
 
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 
 public class WinCayenneModelerModule implements Module {
 
diff --git a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java
index cdaf42506..ea1f5f49b 100644
--- a/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java
+++ b/modeler/cayenne-modeler-win-ext/src/main/java/org/apache/cayenne/modeler/win/WinPlatformInitializer.java
@@ -19,7 +19,7 @@
 package org.apache.cayenne.modeler.win;
 
 import com.jgoodies.looks.windows.WindowsLookAndFeel;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -33,9 +33,11 @@ public class WinPlatformInitializer implements PlatformInitializer {
 
     private static Logger logger = LoggerFactory.getLogger(WinPlatformInitializer.class);
 
+    @Override
     public void setupMenus(JFrame frame) {
     }
 
+    @Override
     public void initLookAndFeel() {
         try {
             UIManager.setLookAndFeel(WindowsLookAndFeel.class.getName());
@@ -49,33 +51,33 @@ public class WinPlatformInitializer implements PlatformInitializer {
     private void overrideUIDefaults() {
         Color darkGrey = new Color(203, 203, 203);
 
-        UIManager.put("TextFieldUI",            WinCustomTextFieldUI.class.getName());
-        UIManager.put("Tree.expandedIcon",      ModelerUtil.buildIcon("icon-arrow-open.png"));
-        UIManager.put("Tree.collapsedIcon",     ModelerUtil.buildIcon("icon-arrow-closed.png"));
-        UIManager.put("Tree.paintLines",        Boolean.FALSE);
-        UIManager.put("Tree.drawDashedFocusIndicator",  Boolean.FALSE);
-        UIManager.put("Tree.selectionBackground",       darkGrey);
-        UIManager.put("Tree.selectionForeground",       Color.BLACK);
-        UIManager.put("Tree.selectionBorderColor",      UIManager.get("Tree.selectionBackground"));
-        UIManager.put("Table.selectionForeground",      Color.BLACK);
-        UIManager.put("Table.selectionBackground",      darkGrey);
+        UIManager.put("TextFieldUI", WinCustomTextFieldUI.class.getName());
+        UIManager.put("Tree.expandedIcon", ModelerUtil.buildIcon("icon-arrow-open.png"));
+        UIManager.put("Tree.collapsedIcon", ModelerUtil.buildIcon("icon-arrow-closed.png"));
+        UIManager.put("Tree.paintLines", Boolean.FALSE);
+        UIManager.put("Tree.drawDashedFocusIndicator", Boolean.FALSE);
+        UIManager.put("Tree.selectionBackground", darkGrey);
+        UIManager.put("Tree.selectionForeground", Color.BLACK);
+        UIManager.put("Tree.selectionBorderColor", UIManager.get("Tree.selectionBackground"));
+        UIManager.put("Table.selectionForeground", Color.BLACK);
+        UIManager.put("Table.selectionBackground", darkGrey);
         UIManager.put("Table.focusCellHighlightBorder", BorderFactory.createEmptyBorder());
-        UIManager.put("ScrollPane.border",      BorderFactory.createEmptyBorder());
+        UIManager.put("ScrollPane.border", BorderFactory.createEmptyBorder());
         UIManager.put("Table.scrollPaneBorder", BorderFactory.createEmptyBorder());
-        UIManager.put("SplitPane.border",       BorderFactory.createEmptyBorder());
-        UIManager.put("CheckBoxHeader.border",  BorderFactory.createEmptyBorder(0, 15, 0, 0));
-        UIManager.put("SplitPane.background",   darkGrey);
-        UIManager.put("Separator.background",   darkGrey);
-        UIManager.put("Separator.foreground",   darkGrey);
-        UIManager.put("Separator.opaque",       Boolean.TRUE);
-        UIManager.put("MenuItem.selectionBackground",            darkGrey);
-        UIManager.put("CheckBoxMenuItem.selectionBackground",    darkGrey);
+        UIManager.put("SplitPane.border", BorderFactory.createEmptyBorder());
+        UIManager.put("CheckBoxHeader.border", BorderFactory.createEmptyBorder(0, 15, 0, 0));
+        UIManager.put("SplitPane.background", darkGrey);
+        UIManager.put("Separator.background", darkGrey);
+        UIManager.put("Separator.foreground", darkGrey);
+        UIManager.put("Separator.opaque", Boolean.TRUE);
+        UIManager.put("MenuItem.selectionBackground", darkGrey);
+        UIManager.put("CheckBoxMenuItem.selectionBackground", darkGrey);
         UIManager.put("RadioButtonMenuItem.selectionBackground", darkGrey);
-        UIManager.put("MenuItem.selectionForeground",            Color.BLACK);
-        UIManager.put("CheckBoxMenuItem.selectionForeground",    Color.BLACK);
+        UIManager.put("MenuItem.selectionForeground", Color.BLACK);
+        UIManager.put("CheckBoxMenuItem.selectionForeground", Color.BLACK);
         UIManager.put("RadioButtonMenuItem.selectionForeground", Color.BLACK);
-        UIManager.put("MenuItem.opaque",            Boolean.TRUE);
-        UIManager.put("CheckBoxMenuItem.opaque",    Boolean.TRUE);
+        UIManager.put("MenuItem.opaque", Boolean.TRUE);
+        UIManager.put("CheckBoxMenuItem.opaque", Boolean.TRUE);
         UIManager.put("RadioButtonMenuItem.opaque", Boolean.TRUE);
         UIManager.put("Button.border", BorderFactory.createEmptyBorder());
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
index a724a6841..34186f01a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
@@ -26,17 +26,18 @@ import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactoryProvider;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
-import org.apache.cayenne.modeler.ui.action.OpenProjectAction;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.pref.CayennePreference;
+import org.apache.cayenne.modeler.pref.CayenneProjectPreferences;
 import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 import org.apache.cayenne.modeler.ui.ModelerController;
+import org.apache.cayenne.modeler.ui.action.OpenProjectAction;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 import org.apache.cayenne.modeler.ui.preferences.classpath.ClasspathPreferencesController;
 import org.apache.cayenne.modeler.ui.preferences.general.GeneralPreferencesController;
 import org.apache.cayenne.modeler.undo.CayenneUndoManager;
-import org.apache.cayenne.modeler.pref.CayennePreference;
-import org.apache.cayenne.modeler.pref.CayenneProjectPreferences;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.ProjectLoader;
@@ -48,7 +49,6 @@ import org.apache.cayenne.util.IDUtil;
 import javax.swing.*;
 import java.io.File;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
@@ -71,7 +71,6 @@ public class Application {
 
     private static Application instance;
 
-    protected FileClassLoadingService modelerClassLoader;
     protected LogConsoleController logConsoleController;
     protected ModelerController frameController;
     protected String name;
@@ -82,8 +81,6 @@ public class Application {
     @Inject
     protected Injector injector;
 
-    @Inject
-    protected DataChannelMetaData metaData;
     private String newProjectTemporaryName;
 
     public static Application getInstance() {
@@ -126,12 +123,12 @@ public class Application {
         return name;
     }
 
-    public ClassLoadingService getClassLoadingService() {
-        return modelerClassLoader;
+    public ModelerClassLoader getClassLoader() {
+        return injector.getInstance(ModelerClassLoader.class);
     }
 
-    public ActionManager getActionManager() {
-        return injector.getInstance(ActionManager.class);
+    public GlobalActions getActionManager() {
+        return injector.getInstance(GlobalActions.class);
     }
 
     public ProjectValidator getProjectValidator() {
@@ -166,6 +163,10 @@ public class Application {
         return injector.getInstance(DbAdapterFactory.class);
     }
 
+    public DataChannelMetaData getMetaData() {
+        return injector.getInstance(DataChannelMetaData.class);
+    }
+
     public MergerTokenFactoryProvider getMergerTokenFactoryProvider() {
         return injector.getInstance(MergerTokenFactoryProvider.class);
     }
@@ -185,9 +186,19 @@ public class Application {
     public void startup(File initialProject) {
         this.logConsoleController = new LogConsoleController(this);
 
-        // init subsystems
-        initPreferences();
-        initClassLoader();
+        // TODO: should "project" preferences reside in ProjectController?
+        this.cayenneProjectPreferences = new CayenneProjectPreferences();
+
+        refreshClassLoader();
+
+        // TODO: is this used by DB Import and CGen? If so, the corresponding actions must set it in a proper scope.
+        //  Or a better idea - get rid of thread-bound classloaders everywhere
+        ModelerClassLoader classLoader = getClassLoader();
+        if (SwingUtilities.isEventDispatchThread()) {
+            Thread.currentThread().setContextClassLoader(classLoader.getClassLoader());
+        } else {
+            SwingUtilities.invokeLater(() -> Thread.currentThread().setContextClassLoader(classLoader.getClassLoader()));
+        }
 
         this.undoManager = new CayenneUndoManager(this);
         this.frameController = new ModelerController(this);
@@ -236,51 +247,30 @@ public class Application {
         return pref.node(pref.absolutePath() + path);
     }
 
-
     /**
      * Reinitializes ModelerClassLoader from preferences.
      */
-    public void initClassLoader() {
-        FileClassLoadingService classLoader = new FileClassLoadingService();
+    public void refreshClassLoader() {
 
         // init from preferences...
-        Preferences classLoaderPreference = Application.getInstance().getPreferencesNode(
-                ClasspathPreferencesController.class,
-                "");
+        Preferences classLoaderPref = getPreferencesNode(ClasspathPreferencesController.class, "");
 
         String[] keys;
-        Collection<String> values = new ArrayList<>();
+        List<String> values = new ArrayList<>();
 
         try {
-            keys = classLoaderPreference.keys();
+            keys = classLoaderPref.keys();
             for (String cpKey : keys) {
-                values.add(classLoaderPreference.get(cpKey, ""));
+                values.add(classLoaderPref.get(cpKey, ""));
             }
         } catch (BackingStoreException ignored) {
         }
 
         if (!values.isEmpty()) {
-            classLoader.setPathFiles(values.stream().map(File::new).collect(Collectors.toList()));
-        }
-
-        this.modelerClassLoader = classLoader;
-
-        // set as EventDispatch thread default class loader
-        if (SwingUtilities.isEventDispatchThread()) {
-            Thread.currentThread().setContextClassLoader(classLoader.getClassLoader());
-        } else {
-            SwingUtilities.invokeLater(() -> Thread.currentThread().setContextClassLoader(classLoader.getClassLoader()));
+            getClassLoader().setFiles(values.stream().map(File::new).collect(Collectors.toList()));
         }
     }
 
-    public DataChannelMetaData getMetaData() {
-        return metaData;
-    }
-
-    protected void initPreferences() {
-        this.cayenneProjectPreferences = new CayenneProjectPreferences();
-    }
-
     private File initialProjectFromPreferences() {
 
         Preferences autoLoadLastProject = getPreferencesNode(GeneralPreferencesController.class, "");
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ClassLoadingService.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ClassLoadingService.java
deleted file mode 100644
index 7410a6968..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ClassLoadingService.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler;
-
-/**
- * An interface defining a service for locating external Java resources.
- */
-public interface ClassLoadingService {
-
-    /**
-     * Returns Java ClassLoader that knows how to load all classes configured for this
-     * service.
-     */
-    ClassLoader getClassLoader();
-
-    /**
-     * Returns a class for given class name.
-     */
-    <T> Class<T> loadClass(Class<T> interfaceType, String className)
-            throws ClassNotFoundException;
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java
index f66b7c63d..60984cd6c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Main.java
@@ -24,7 +24,7 @@ import org.apache.cayenne.dbsync.DbSyncModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
 import org.apache.cayenne.di.Module;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
 import org.apache.cayenne.project.ProjectModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
index f98c980fc..a435f4bb1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
@@ -26,13 +26,13 @@ import org.apache.cayenne.dbsync.xml.DbImportExtension;
 import org.apache.cayenne.di.Binder;
 import org.apache.cayenne.di.Module;
 import org.apache.cayenne.gen.xml.CgenExtension;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
-import org.apache.cayenne.modeler.ui.action.DefaultActionManager;
-import org.apache.cayenne.modeler.graph.extension.GraphExtension;
-import org.apache.cayenne.modeler.platform.DefaultPlatformInitializer;
-import org.apache.cayenne.modeler.platform.PlatformInitializer;
-import org.apache.cayenne.modeler.validation.ConfigurableProjectValidator;
-import org.apache.cayenne.modeler.validation.extension.ValidationExtension;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
+import org.apache.cayenne.modeler.service.graph.GraphExtension;
+import org.apache.cayenne.modeler.service.platform.DefaultPlatformInitializer;
+import org.apache.cayenne.modeler.service.platform.PlatformInitializer;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
+import org.apache.cayenne.modeler.service.validator.ConfigurableProjectValidator;
+import org.apache.cayenne.modeler.service.validator.extension.ValidationExtension;
 import org.apache.cayenne.project.ProjectModule;
 import org.apache.cayenne.project.extension.ExtensionAwareHandlerFactory;
 import org.apache.cayenne.project.extension.info.InfoExtension;
@@ -46,8 +46,9 @@ public class ModelerModule implements Module {
 
     public void configure(Binder binder) {
 
-        binder.bind(ActionManager.class).to(DefaultActionManager.class);
         binder.bind(Application.class).to(Application.class);
+        binder.bind(GlobalActions.class).to(GlobalActions.class);
+        binder.bind(ModelerClassLoader.class).to(ModelerClassLoader.class);
         binder.bind(PlatformInitializer.class).to(DefaultPlatformInitializer.class);
         binder.bind(HandlerFactory.class).to(ExtensionAwareHandlerFactory.class);
         binder.bind(DataChannelMetaData.class).to(DefaultDataChannelMetaData.class);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dbimport/ModelerDbLoaderContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dbimport/ModelerDbLoaderContext.java
index bdd163546..02fc5192d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dbimport/ModelerDbLoaderContext.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dbimport/ModelerDbLoaderContext.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.dbsync.reverse.dbload.DbLoaderDelegate;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfigBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ClassLoadingService;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
@@ -149,10 +149,10 @@ public class ModelerDbLoaderContext {
         config.setUrl(connectionInfo.getUrl());
 
         try {
-            ClassLoadingService classLoadingService = Application.getInstance().getClassLoadingService();
+            ModelerClassLoader classLoader = Application.getInstance().getClassLoader();
             config.getDbLoaderConfig().setFiltersConfig(new FiltersConfigBuilder(reverseEngineering)
-                    .dataSource(connectionInfo.makeDataSource(classLoadingService))
-                    .dbAdapter(connectionInfo.makeAdapter(classLoadingService))
+                    .dataSource(connectionInfo.makeDataSource(classLoader))
+                    .dbAdapter(connectionInfo.makeAdapter(classLoader))
                     .build());
         } catch (Exception e) {
             processException(e, "Fail while building configs.");
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
index 0da0b1d9e..3e3b979fc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
@@ -49,7 +49,7 @@ import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.EntityDisplayAction;
@@ -363,13 +363,13 @@ abstract class BaseGraphBuilder<E extends Entity<E, A, R>, A extends Attribute<E
      * Creates popup menu
      */
     protected JPopupMenu createPopupMenu() {
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
         JPopupMenu menu = new JPopupMenu();
         menu.add(new EntityDisplayAction(this).buildMenu());
         menu.addSeparator();
-        menu.add(new EntityDisplayAction(this, actionManager.getAction(CreateAttributeAction.class)).buildMenu());
-        menu.add(new EntityDisplayAction(this, actionManager.getAction(CreateRelationshipAction.class)).buildMenu());
+        menu.add(new EntityDisplayAction(this, globalActions.getAction(CreateAttributeAction.class)).buildMenu());
+        menu.add(new EntityDisplayAction(this, globalActions.getAction(CreateRelationshipAction.class)).buildMenu());
         menu.addSeparator();
         menu.add(new RemoveEntityAction(this));
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjEntityCellMetadata.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjEntityCellMetadata.java
index a6b724c8f..ad66804bc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjEntityCellMetadata.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjEntityCellMetadata.java
@@ -30,12 +30,12 @@ class ObjEntityCellMetadata extends EntityCellMetadata<ObjEntity, ObjAttribute,
     ObjEntityCellMetadata(ObjGraphBuilder builder, ObjEntity entity) {
         super(builder, entity);
     }
-    
+
     @Override
     public ObjEntity fetchEntity() {
         for (DataMap dm : builder.getDataDomain().getDataMaps()) {
-            ObjEntity objEntity =dm.getObjEntity(entityName) ;
-            if (objEntity!= null) {
+            ObjEntity objEntity = dm.getObjEntity(entityName);
+            if (objEntity != null) {
                 return objEntity;
             }
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/CayenneProjectPreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/CayenneProjectPreferences.java
index 883370af1..f451c35df 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/CayenneProjectPreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/CayenneProjectPreferences.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.CayenneRuntimeException;
 import java.lang.reflect.Constructor;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
 
 public class CayenneProjectPreferences {
@@ -63,14 +62,4 @@ public class CayenneProjectPreferences {
 
         return preference;
     }
-
-    // delete property
-    public void removeProjectDetailObject(Preferences preference) {
-        try {
-            preference.removeNode();
-            modelerProjectPreferences.remove(preference);
-        } catch (BackingStoreException e) {
-            throw new CayenneRuntimeException("Error delete preferences", e);
-        }
-    }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java
index 107cad5f4..d08bc1443 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/pref/DBConnectionInfo.java
@@ -24,7 +24,7 @@ import org.apache.cayenne.configuration.DataSourceDescriptor;
 import org.apache.cayenne.datasource.DriverDataSource;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ClassLoadingService;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
 import org.apache.cayenne.util.Util;
 
 import javax.sql.DataSource;
@@ -163,7 +163,7 @@ public class DBConnectionInfo extends CayennePreference {
 	/**
 	 * Creates a DbAdapter based on configured values.
 	 */
-	public DbAdapter makeAdapter(final ClassLoadingService classLoader) throws Exception {
+	public DbAdapter makeAdapter(final ModelerClassLoader classLoader) throws Exception {
 		DataNodeDescriptor descriptor = new DataNodeDescriptor();
 		descriptor.setAdapterType(getDbAdapter());
 		DataSource dataSource = makeDataSource(classLoader);
@@ -175,7 +175,7 @@ public class DBConnectionInfo extends CayennePreference {
 	 * Returned DataSource is not pooling its connections. It can be wrapped in
 	 * PoolManager if pooling is needed.
 	 */
-	public DataSource makeDataSource(final ClassLoadingService classLoader) throws SQLException {
+	public DataSource makeDataSource(final ModelerClassLoader classLoader) throws SQLException {
 
 		// validate...
 		if (getJdbcDriver() == null) {
@@ -304,9 +304,9 @@ public class DBConnectionInfo extends CayennePreference {
 
 	private class DeferredDataSource implements DataSource {
 
-		private final ClassLoadingService classLoader;
+		private final ModelerClassLoader classLoader;
 
-		public DeferredDataSource(ClassLoadingService classLoader) {
+		public DeferredDataSource(ModelerClassLoader classLoader) {
 			this.classLoader = classLoader;
 		}
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DefaultActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/action/GlobalActions.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DefaultActionManager.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/action/GlobalActions.java
index 8272de12b..e646ecdb1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DefaultActionManager.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/action/GlobalActions.java
@@ -16,12 +16,13 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.ui.action;
+package org.apache.cayenne.modeler.service.action;
 
 import org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ui.action.*;
 import org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 
@@ -37,7 +38,7 @@ import java.util.Set;
 /**
  * Stores a map of modeler actions, and deals with activating/deactivating those actions on state changes.
  */
-public class DefaultActionManager implements ActionManager {
+public class GlobalActions {
 
     private final Set<String> specialActions;
     private final Set<String> projectActions;
@@ -53,7 +54,7 @@ public class DefaultActionManager implements ActionManager {
     private final Map<String, Action> actionMap;
     private final ConfigurationNodeParentGetter nodeParentGetter;
 
-    public DefaultActionManager(
+    public GlobalActions(
             @Inject Application application,
             @Inject ConfigurationNameMapper nameMapper,
             @Inject ConfigurationNodeParentGetter nodeParentGetter) {
@@ -241,66 +242,55 @@ public class DefaultActionManager implements ActionManager {
         return action;
     }
 
-    @Override
     public <T extends Action> T getAction(Class<T> actionClass) {
         return (T) actionMap.get(actionClass.getName());
     }
 
-    @Override
     public void projectOpened() {
         processActionsState(projectActions);
         updateActions("");
     }
 
-    @Override
     public void projectClosed() {
         processActionsState(Collections.emptySet());
         updateActions("");
     }
 
-    @Override
     public void domainSelected() {
         processActionsState(domainActions);
         updateActions("DataDomain");
     }
 
-    @Override
     public void dataNodeSelected() {
         processActionsState(dataNodeActions);
         updateActions("DataNode");
     }
 
-    @Override
     public void dataMapSelected() {
         processActionsState(dataMapActions);
         updateActions("DataMap");
     }
 
-    @Override
     public void objEntitySelected() {
         processActionsState(objEntityActions);
         updateActions("ObjEntity");
     }
 
-    @Override
     public void dbEntitySelected() {
         processActionsState(dbEntityActions);
         updateActions("DbEntity");
     }
 
-    @Override
     public void procedureSelected() {
         processActionsState(procedureActions);
         updateActions("Procedure");
     }
 
-    @Override
     public void querySelected() {
         processActionsState(dataMapActions);
         updateActions("Query");
     }
 
-    @Override
     public void embeddableSelected() {
         processActionsState(embeddableActions);
         updateActions("Embeddable");
@@ -309,8 +299,7 @@ public class DefaultActionManager implements ActionManager {
     /**
      * Invoked when several objects were selected in ProjectTree at time
      */
-    @Override
-    public void multipleObjectsSelected(ConfigurationNode[] objects) {
+    public void objectsSelected(ConfigurationNode[] objects) {
         processActionsState(multipleObjectsActions);
 
         updateActions("Selected Objects");
@@ -364,7 +353,6 @@ public class DefaultActionManager implements ActionManager {
         }
     }
 
-    @Override
     public void setupCutCopyPaste(
             JComponent comp,
             Class<? extends Action> cutActionType,
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/classloader/ModelerClassLoader.java
similarity index 50%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/classloader/ModelerClassLoader.java
index 6c2d5732a..343f5687b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/FileClassLoadingService.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/classloader/ModelerClassLoader.java
@@ -17,90 +17,50 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler;
+package org.apache.cayenne.modeler.service.classloader;
 
 import java.io.File;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
- * A default implementation of ClassLoadingService used in CayenneModeler.
+ * A mutable class loader for the Modeler to dynamically access adapters, drivers and other classes and resources.
  */
-public class FileClassLoadingService implements ClassLoadingService {
+public class ModelerClassLoader {
 
-    private FileClassLoader classLoader;
-    private List<File> pathFiles;
-
-    public FileClassLoadingService() {
-        this.pathFiles = new ArrayList<>(15);
-    }
+    private Set<File> files;
+    private FileClassLoader delegate;
 
     /**
-     * Returns class for a given name, loading it if needed from configured
-     * locations.
+     * Returns a class for given class name.
      */
-    @SuppressWarnings("unchecked")
     public <T> Class<T> loadClass(Class<T> interfaceType, String className) throws ClassNotFoundException {
-        return (Class<T>) nonNullClassLoader().loadClass(className);
-    }
-
-    /**
-     * Returns a ClassLoader based on the current configured CLASSPATH settings.
-     */
-    public ClassLoader getClassLoader() {
-        return nonNullClassLoader();
-    }
-
-    /**
-     * Returns an unmodifiable list of configured CLASSPATH locations.
-     */
-    public List<File> getPathFiles() {
-        return Collections.unmodifiableList(pathFiles);
+        return (Class<T>) getClassLoader().loadClass(className);
     }
 
-    public void setPathFiles(Collection<File> files) {
-
-        pathFiles.clear();
-        classLoader = null;
 
-        for (File file : files) {
-            addFile(file);
-        }
-    }
-
-    /**
-     * Adds a new location to the list of configured locations.
-     */
-    private void addFile(File file) {
-        file = file.getAbsoluteFile();
-
-        if (pathFiles.contains(file)) {
-            return;
+    public ClassLoader getClassLoader() {
+        if (delegate == null) {
+            delegate = new FileClassLoader(getClass().getClassLoader(), getFiles());
         }
 
-        if (classLoader != null) {
-            try {
-                classLoader.addURL(file.toURI().toURL());
-            } catch (MalformedURLException ex) {
-                return;
-            }
-        }
+        return delegate;
+    }
 
-        pathFiles.add(file);
+    public Set<File> getFiles() {
+        Set<File> files = this.files;
+        return files != null ? files : Set.of();
     }
 
-    private FileClassLoader nonNullClassLoader() {
-        // init class loader on demand
-        if (classLoader == null) {
-            classLoader = new FileClassLoader(getClass().getClassLoader(), pathFiles);
-        }
+    public void setFiles(Collection<File> files) {
+        Set<File> resolved = files.stream().map(File::getAbsoluteFile).collect(Collectors.toSet());
 
-        return classLoader;
+        this.files = resolved;
+        this.delegate = null;
     }
 
     // URLClassLoader with addURL method exposed.
@@ -110,7 +70,7 @@ public class FileClassLoadingService implements ClassLoadingService {
             super(new URL[0], parent);
         }
 
-        FileClassLoader(ClassLoader parent, List<File> files) {
+        FileClassLoader(ClassLoader parent, Set<File> files) {
             this(parent);
 
             for (File file : files) {
@@ -122,6 +82,7 @@ public class FileClassLoadingService implements ClassLoadingService {
             }
         }
 
+        @Override
         public void addURL(URL url) {
             super.addURL(url);
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/EntityHandler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/EntityHandler.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/EntityHandler.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/EntityHandler.java
index 71d7419e7..e51646a5e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/EntityHandler.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/EntityHandler.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.graph.extension;
+package org.apache.cayenne.modeler.service.graph;
 
 import java.awt.geom.Rectangle2D;
 import java.util.Hashtable;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphExtension.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphExtension.java
similarity index 84%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphExtension.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphExtension.java
index 48b2d2a44..0611cda9c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphExtension.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphExtension.java
@@ -17,13 +17,13 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.graph.extension;
+package org.apache.cayenne.modeler.service.graph;
 
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.di.Provider;
-import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.graph.GraphRegistry;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.extension.BaseNamingDelegate;
@@ -38,16 +38,16 @@ public class GraphExtension implements ProjectExtension {
     static final String GRAPH_SUFFIX = ".graph.xml";
 
     @Inject
-    protected Provider<Application> applicationProvider;
+    protected Provider<DataChannelMetaData> metaDataProvider;
 
     @Override
     public LoaderDelegate createLoaderDelegate() {
-        return new GraphLoaderDelegate(applicationProvider.get());
+        return new GraphLoaderDelegate(metaDataProvider.get());
     }
 
     @Override
     public SaverDelegate createSaverDelegate() {
-        return new GraphSaverDelegate(applicationProvider.get().getMetaData());
+        return new GraphSaverDelegate(metaDataProvider.get());
     }
 
     @Override
@@ -56,8 +56,7 @@ public class GraphExtension implements ProjectExtension {
             @Override
             public String visitDataChannelDescriptor(DataChannelDescriptor channelDescriptor) {
                 // if there is no registry, than there is no need to save anything
-                GraphRegistry registry = applicationProvider.get().getMetaData()
-                        .get(channelDescriptor, GraphRegistry.class);
+                GraphRegistry registry = metaDataProvider.get().get(channelDescriptor, GraphRegistry.class);
                 if (registry == null) {
                     return null;
                 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphHandler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphHandler.java
similarity index 85%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphHandler.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphHandler.java
index 83087f65b..19303f7b0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphHandler.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphHandler.java
@@ -16,15 +16,10 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.graph.extension;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.swing.undo.UndoableEdit;
+package org.apache.cayenne.modeler.service.graph;
 
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
 import org.apache.cayenne.modeler.graph.GraphMap;
 import org.apache.cayenne.modeler.graph.GraphRegistry;
@@ -35,6 +30,10 @@ import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
 
+import javax.swing.undo.UndoableEdit;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * Class to load graph from XML
  */
@@ -49,14 +48,14 @@ class GraphHandler extends NamespaceAwareNestedTagHandler {
     GraphType graphType;
 
     double scale;
-            
-    public GraphHandler(NamespaceAwareNestedTagHandler parent, final Application application) {
+
+    public GraphHandler(NamespaceAwareNestedTagHandler parent, DataChannelMetaData metaData) {
         super(parent);
         loaderContext.addDataChannelListener(dataChannelDescriptor -> {
-            GraphRegistry registry = application.getMetaData().get(dataChannelDescriptor, GraphRegistry.class);
-            if(registry == null) {
+            GraphRegistry registry = metaData.get(dataChannelDescriptor, GraphRegistry.class);
+            if (registry == null) {
                 registry = new GraphRegistry();
-                application.getMetaData().add(dataChannelDescriptor, registry);
+                metaData.add(dataChannelDescriptor, registry);
             }
 
             GraphMap map = registry.getGraphMap(dataChannelDescriptor);
@@ -66,7 +65,7 @@ class GraphHandler extends NamespaceAwareNestedTagHandler {
 
             // lookup
             Map<DefaultGraphCell, Map<String, ?>> propertiesMap = new HashMap<>();
-            for(Map.Entry<String, Map<String, ?>> entry : GraphHandler.this.propertiesMap.entrySet()) {
+            for (Map.Entry<String, Map<String, ?>> entry : GraphHandler.this.propertiesMap.entrySet()) {
                 DefaultGraphCell cell = builder.getEntityCell(entry.getKey());
                 propertiesMap.put(cell, entry.getValue());
             }
@@ -87,7 +86,7 @@ class GraphHandler extends NamespaceAwareNestedTagHandler {
                 }
 
                 graphType = GraphType.valueOf(type);
-                scale = Double.valueOf(attributes.getValue("scale"));
+                scale = Double.parseDouble(attributes.getValue("scale"));
                 propertiesMap = new HashMap<>();
                 return true;
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphLoaderDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphLoaderDelegate.java
similarity index 82%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphLoaderDelegate.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphLoaderDelegate.java
index 01d15f41b..e95271a3a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphLoaderDelegate.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphLoaderDelegate.java
@@ -17,18 +17,18 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.graph.extension;
+package org.apache.cayenne.modeler.service.graph;
 
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.project.extension.LoaderDelegate;
 
 class GraphLoaderDelegate implements LoaderDelegate {
 
-    Application application;
+    private final DataChannelMetaData metaData;
 
-    GraphLoaderDelegate(Application application) {
-        this.application = application;
+    GraphLoaderDelegate(DataChannelMetaData metaData) {
+        this.metaData = metaData;
     }
 
     @Override
@@ -39,7 +39,7 @@ class GraphLoaderDelegate implements LoaderDelegate {
     @Override
     public NamespaceAwareNestedTagHandler createHandler(NamespaceAwareNestedTagHandler parent, String tag) {
         if(GraphsRootHandler.GRAPHS_TAG.equals(tag)) {
-            return new GraphsRootHandler(parent, application);
+            return new GraphsRootHandler(parent, metaData);
         }
         return null;
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphSaverDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphSaverDelegate.java
similarity index 98%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphSaverDelegate.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphSaverDelegate.java
index ca3a05c71..960642ef2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphSaverDelegate.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphSaverDelegate.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.graph.extension;
+package org.apache.cayenne.modeler.service.graph;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphsRootHandler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphsRootHandler.java
similarity index 86%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphsRootHandler.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphsRootHandler.java
index 0b3cee76e..fc951e352 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/extension/GraphsRootHandler.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/graph/GraphsRootHandler.java
@@ -17,10 +17,10 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.graph.extension;
+package org.apache.cayenne.modeler.service.graph;
 
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
-import org.apache.cayenne.modeler.Application;
 import org.xml.sax.Attributes;
 import org.xml.sax.ContentHandler;
 import org.xml.sax.SAXException;
@@ -29,12 +29,12 @@ class GraphsRootHandler extends NamespaceAwareNestedTagHandler {
 
     static final String GRAPHS_TAG = "graphs";
 
-    Application application;
+    private final DataChannelMetaData metaData;
 
-    public GraphsRootHandler(NamespaceAwareNestedTagHandler parentHandler, Application application) {
+    public GraphsRootHandler(NamespaceAwareNestedTagHandler parentHandler, DataChannelMetaData metaData) {
         super(parentHandler);
         setTargetNamespace(GraphExtension.NAMESPACE);
-        this.application = application;
+        this.metaData = metaData;
     }
 
     @Override
@@ -45,7 +45,7 @@ class GraphsRootHandler extends NamespaceAwareNestedTagHandler {
     @Override
     protected ContentHandler createChildTagHandler(String namespaceURI, String localName, String qName, Attributes attributes) {
         if(GraphHandler.GRAPH_TAG.equals(localName)) {
-            return new GraphHandler(this, application);
+            return new GraphHandler(this, metaData);
         }
         return super.createChildTagHandler(namespaceURI, localName, qName, attributes);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/DefaultPlatformInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/DefaultPlatformInitializer.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/DefaultPlatformInitializer.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/DefaultPlatformInitializer.java
index 8b8274a33..a2ae1b3a3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/DefaultPlatformInitializer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/DefaultPlatformInitializer.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.platform;
+package org.apache.cayenne.modeler.service.platform;
 
 import javax.swing.JFrame;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/PlatformInitializer.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/PlatformInitializer.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/PlatformInitializer.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/PlatformInitializer.java
index 058c0e2ba..2234a11ef 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/platform/PlatformInitializer.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/platform/PlatformInitializer.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.platform;
+package org.apache.cayenne.modeler.service.platform;
 
 import javax.swing.JFrame;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/ConfigurableProjectValidator.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/ConfigurableProjectValidator.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/ConfigurableProjectValidator.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/ConfigurableProjectValidator.java
index 94a875350..6093fa2dc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/ConfigurableProjectValidator.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/ConfigurableProjectValidator.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.validation;
+package org.apache.cayenne.modeler.service.validator;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationConfigHandler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationConfigHandler.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationConfigHandler.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationConfigHandler.java
index f68d94eb4..898cf4e57 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationConfigHandler.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationConfigHandler.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.validation.extension;
+package org.apache.cayenne.modeler.service.validator.extension;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationExtension.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationExtension.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationExtension.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationExtension.java
index e3a7c78af..4445c5c27 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationExtension.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationExtension.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.validation.extension;
+package org.apache.cayenne.modeler.service.validator.extension;
 
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationLoaderDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationLoaderDelegate.java
similarity index 96%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationLoaderDelegate.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationLoaderDelegate.java
index 6361cd2a2..2e864289c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationLoaderDelegate.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationLoaderDelegate.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.validation.extension;
+package org.apache.cayenne.modeler.service.validator.extension;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationSaverDelegate.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationSaverDelegate.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationSaverDelegate.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationSaverDelegate.java
index ef0844de4..d28cd66ff 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/validation/extension/ValidationSaverDelegate.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/validator/extension/ValidationSaverDelegate.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.validation.extension;
+package org.apache.cayenne.modeler.service.validator.extension;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java
index ed082f5b9..415e5282e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java
@@ -1,6 +1,6 @@
 package org.apache.cayenne.modeler.ui;
 
-import org.apache.cayenne.modeler.action.*;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.*;
 
 import javax.swing.*;
@@ -12,60 +12,60 @@ class MainToolBar extends JToolBar {
     private final JButton backButton;
     private final JButton removeButton;
 
-    public MainToolBar(ActionManager actionManager) {
+    public MainToolBar(GlobalActions globalActions) {
         setFloatable(false);
 
         Dimension smallBtnDim = new Dimension(30, 30);
-        backButton = actionManager.getAction(NavigateBackwardAction.class).buildButton(1);
+        backButton = globalActions.getAction(NavigateBackwardAction.class).buildButton(1);
         backButton.setMinimumSize(smallBtnDim);
         backButton.setPreferredSize(smallBtnDim);
         add(backButton);
 
-        JButton forwardButton = actionManager.getAction(NavigateForwardAction.class).buildButton(3);
+        JButton forwardButton = globalActions.getAction(NavigateForwardAction.class).buildButton(3);
         forwardButton.setMinimumSize(smallBtnDim);
         forwardButton.setPreferredSize(smallBtnDim);
         add(forwardButton);
 
         addSeparator(new Dimension(30, 0));
 
-        add(actionManager.getAction(NewProjectAction.class).buildButton(1));
-        add(actionManager.getAction(OpenProjectAction.class).buildButton(2));
-        add(actionManager.getAction(SaveAction.class).buildButton(3));
+        add(globalActions.getAction(NewProjectAction.class).buildButton(1));
+        add(globalActions.getAction(OpenProjectAction.class).buildButton(2));
+        add(globalActions.getAction(SaveAction.class).buildButton(3));
 
         addSeparator();
 
-        removeButton = actionManager.getAction(RemoveAction.class).buildButton();
+        removeButton = globalActions.getAction(RemoveAction.class).buildButton();
         add(removeButton);
 
         addSeparator();
 
-        add(actionManager.getAction(CutAction.class).buildButton(1));
-        add(actionManager.getAction(CopyAction.class).buildButton(2));
-        add(actionManager.getAction(PasteAction.class).buildButton(3));
+        add(globalActions.getAction(CutAction.class).buildButton(1));
+        add(globalActions.getAction(CopyAction.class).buildButton(2));
+        add(globalActions.getAction(PasteAction.class).buildButton(3));
 
         addSeparator();
 
-        add(actionManager.getAction(UndoAction.class).buildButton(1));
-        add(actionManager.getAction(RedoAction.class).buildButton(3));
+        add(globalActions.getAction(UndoAction.class).buildButton(1));
+        add(globalActions.getAction(RedoAction.class).buildButton(3));
 
         addSeparator();
 
-        add(actionManager.getAction(CreateNodeAction.class).buildButton(1));
-        add(actionManager.getAction(CreateDataMapAction.class).buildButton(3));
+        add(globalActions.getAction(CreateNodeAction.class).buildButton(1));
+        add(globalActions.getAction(CreateDataMapAction.class).buildButton(3));
 
         addSeparator();
 
-        add(actionManager.getAction(CreateDbEntityAction.class).buildButton(1));
-        add(actionManager.getAction(CreateProcedureAction.class).buildButton(3));
+        add(globalActions.getAction(CreateDbEntityAction.class).buildButton(1));
+        add(globalActions.getAction(CreateProcedureAction.class).buildButton(3));
 
         addSeparator();
 
-        add(actionManager.getAction(CreateObjEntityAction.class).buildButton(1));
-        add(actionManager.getAction(CreateEmbeddableAction.class).buildButton(2));
-        add(actionManager.getAction(CreateQueryAction.class).buildButton(3));
+        add(globalActions.getAction(CreateObjEntityAction.class).buildButton(1));
+        add(globalActions.getAction(CreateEmbeddableAction.class).buildButton(2));
+        add(globalActions.getAction(CreateQueryAction.class).buildButton(3));
 
         // is used to place search feature components the most right on a toolbar
-        add(new SearchPanel(actionManager.getAction(FindAction.class)));
+        add(new SearchPanel(globalActions.getAction(FindAction.class)));
     }
 
     int getDefaultButtonWidth() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
index af9569b9c..8b3dee733 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.ui;
 
 import org.apache.cayenne.modeler.ui.project.ProjectView;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 import org.apache.cayenne.modeler.ui.welcome.WelcomeScreen;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
@@ -38,7 +38,7 @@ import java.awt.event.ComponentEvent;
  */
 public class ModelerFrame extends JFrame {
 
-    private final ActionManager actionManager;
+    private final GlobalActions globalActions;
 
     private final JSplitPane splitPane;
     private final JLabel status;
@@ -48,12 +48,12 @@ public class ModelerFrame extends JFrame {
     private ProjectView projectView;
     private Component dockComponent;
 
-    public ModelerFrame(ActionManager actionManager, LogConsoleController logConsoleController) {
-        this.actionManager = actionManager;
+    public ModelerFrame(GlobalActions globalActions, LogConsoleController logConsoleController) {
+        this.globalActions = globalActions;
 
         setIconImage(ModelerUtil.buildIcon("CayenneModeler.png").getImage());
         getContentPane().setLayout(new BorderLayout());
-        this.menuBar = new ModelerMenuBar(actionManager, logConsoleController);
+        this.menuBar = new ModelerMenuBar(globalActions, logConsoleController);
         setJMenuBar(menuBar);
         initToolbar();
 
@@ -123,7 +123,7 @@ public class ModelerFrame extends JFrame {
 
     protected void initToolbar() {
 
-        MainToolBar toolBar = new MainToolBar(actionManager);
+        MainToolBar toolBar = new MainToolBar(globalActions);
         getContentPane().add(toolBar, BorderLayout.NORTH);
 
         // Hide some buttons when frame is too small
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
index 5acb7b4e6..5ea4fd3c5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerMenuBar.java
@@ -20,9 +20,9 @@
 package org.apache.cayenne.modeler.ui;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.action.*;
 import org.apache.cayenne.modeler.event.model.RecentFileListListener;
 import org.apache.cayenne.modeler.pref.LastProjectsPreferences;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.*;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 
@@ -39,7 +39,7 @@ class ModelerMenuBar extends JMenuBar {
     private final JCheckBoxMenuItem logMenu;
     private final List<RecentFileListListener> recentFileListeners;
 
-    ModelerMenuBar(ActionManager actionManager, LogConsoleController logConsoleController) {
+    ModelerMenuBar(GlobalActions globalActions, LogConsoleController logConsoleController) {
         this.logConsoleController = logConsoleController;
         this.recentFileListeners = new ArrayList<>();
 
@@ -55,58 +55,58 @@ class ModelerMenuBar extends JMenuBar {
         toolMenu.setMnemonic(KeyEvent.VK_T);
         helpMenu.setMnemonic(KeyEvent.VK_H);
 
-        fileMenu.add(actionManager.getAction(NewProjectAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(OpenProjectAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(ProjectAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(ImportDataMapAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(NewProjectAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(OpenProjectAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(ProjectAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(ImportDataMapAction.class).buildMenu());
         fileMenu.addSeparator();
-        fileMenu.add(actionManager.getAction(SaveAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(SaveAsAction.class).buildMenu());
-        fileMenu.add(actionManager.getAction(RevertAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(SaveAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(SaveAsAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(RevertAction.class).buildMenu());
         fileMenu.addSeparator();
 
-        editMenu.add(actionManager.getAction(UndoAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(RedoAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(CutAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(CopyAction.class).buildMenu());
-        editMenu.add(actionManager.getAction(PasteAction.class).buildMenu());
+        editMenu.add(globalActions.getAction(UndoAction.class).buildMenu());
+        editMenu.add(globalActions.getAction(RedoAction.class).buildMenu());
+        editMenu.add(globalActions.getAction(CutAction.class).buildMenu());
+        editMenu.add(globalActions.getAction(CopyAction.class).buildMenu());
+        editMenu.add(globalActions.getAction(PasteAction.class).buildMenu());
 
         RecentFileMenu recentFileMenu = new RecentFileMenu("Recent Projects");
         recentFileListeners.add(recentFileMenu);
         fileMenu.add(recentFileMenu);
 
         fileMenu.addSeparator();
-        fileMenu.add(actionManager.getAction(ExitAction.class).buildMenu());
+        fileMenu.add(globalActions.getAction(ExitAction.class).buildMenu());
 
-        projectMenu.add(actionManager.getAction(ValidateAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(ShowValidationConfigAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(ValidateAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(ShowValidationConfigAction.class).buildMenu());
         projectMenu.addSeparator();
-        projectMenu.add(actionManager.getAction(CreateNodeAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateDataMapAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(CreateNodeAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(CreateDataMapAction.class).buildMenu());
 
-        projectMenu.add(actionManager.getAction(CreateObjEntityAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateEmbeddableAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateDbEntityAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(CreateObjEntityAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(CreateEmbeddableAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(CreateDbEntityAction.class).buildMenu());
 
-        projectMenu.add(actionManager.getAction(CreateProcedureAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(CreateQueryAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(CreateProcedureAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(CreateQueryAction.class).buildMenu());
 
         projectMenu.addSeparator();
-        projectMenu.add(actionManager.getAction(ObjEntitySyncAction.class).buildMenu());
-        projectMenu.add(actionManager.getAction(DbEntitySyncAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(ObjEntitySyncAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(DbEntitySyncAction.class).buildMenu());
         projectMenu.addSeparator();
-        projectMenu.add(actionManager.getAction(RemoveAction.class).buildMenu());
+        projectMenu.add(globalActions.getAction(RemoveAction.class).buildMenu());
 
-        toolMenu.add(actionManager.getAction(InferRelationshipsAction.class).buildMenu());
-        toolMenu.add(actionManager.getAction(ImportEOModelAction.class).buildMenu());
+        toolMenu.add(globalActions.getAction(InferRelationshipsAction.class).buildMenu());
+        toolMenu.add(globalActions.getAction(ImportEOModelAction.class).buildMenu());
         toolMenu.addSeparator();
-        toolMenu.add(actionManager.getAction(GenerateCodeAction.class).buildMenu());
-        toolMenu.add(actionManager.getAction(GenerateDBAction.class).buildMenu());
-        toolMenu.add(actionManager.getAction(MigrateAction.class).buildMenu());
+        toolMenu.add(globalActions.getAction(GenerateCodeAction.class).buildMenu());
+        toolMenu.add(globalActions.getAction(GenerateDBAction.class).buildMenu());
+        toolMenu.add(globalActions.getAction(MigrateAction.class).buildMenu());
 
         // Menu for opening Log console
         toolMenu.addSeparator();
-        logMenu = actionManager.getAction(ShowLogConsoleAction.class).buildCheckBoxMenu();
+        logMenu = globalActions.getAction(ShowLogConsoleAction.class).buildCheckBoxMenu();
 
         if (!logConsoleController.getConsoleProperty(LogConsoleController.DOCKED_PROPERTY)
                 && logConsoleController.getConsoleProperty(LogConsoleController.SHOW_CONSOLE_PROPERTY)) {
@@ -117,10 +117,10 @@ class ModelerMenuBar extends JMenuBar {
         toolMenu.add(logMenu);
 
         toolMenu.addSeparator();
-        toolMenu.add(actionManager.getAction(ConfigurePreferencesAction.class).buildMenu());
+        toolMenu.add(globalActions.getAction(ConfigurePreferencesAction.class).buildMenu());
 
-        helpMenu.add(actionManager.getAction(AboutAction.class).buildMenu());
-        helpMenu.add(actionManager.getAction(DocumentationAction.class).buildMenu());
+        helpMenu.add(globalActions.getAction(AboutAction.class).buildMenu());
+        helpMenu.add(globalActions.getAction(DocumentationAction.class).buildMenu());
 
         add(fileMenu);
         add(editMenu);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ActionManager.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ActionManager.java
deleted file mode 100644
index 394760e18..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ActionManager.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-
-package org.apache.cayenne.modeler.ui.action;
-
-import org.apache.cayenne.configuration.ConfigurationNode;
-
-import javax.swing.*;
-
-/**
- * Stores a map of modeler actions, and deals with activating/deactivating those actions on state changes.
- */
-public interface ActionManager {
-
-    <T extends Action> T getAction(Class<T> actionClass);
-
-    void projectOpened();
-
-    void projectClosed();
-
-    void domainSelected();
-
-    void dataNodeSelected();
-
-    void dataMapSelected();
-
-    void objEntitySelected();
-
-    void dbEntitySelected();
-
-    void procedureSelected();
-
-    void querySelected();
-
-    void embeddableSelected();
-
-    void multipleObjectsSelected(ConfigurationNode[] objects);
-
-    /**
-     * Replaces standard Cut, Copy and Paste action maps, so that accelerators like Ctrl+X, Ctrl+C, Ctrl+V would work.
-     */
-    void setupCutCopyPaste(
-            JComponent comp,
-            Class<? extends Action> cutActionType,
-            Class<? extends Action> copyActionType);
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeRelationshipAction.java
index 38b82cd61..f89ac4637 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeRelationshipAction.java
@@ -31,7 +31,7 @@ public class CopyAttributeRelationshipAction extends CopyAction implements Multi
     private final CopyRelationshipAction copyRelationshipAction;
     private JComponent currentSelectedPanel;
 
-    protected CopyAttributeRelationshipAction(Application application) {
+    public CopyAttributeRelationshipAction(Application application) {
         super(application);
         copyAttributeAction = new CopyAttributeAction(application);
         copyRelationshipAction = new CopyRelationshipAction(application);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
index 3b265ab5f..d575a6227 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
@@ -194,7 +194,7 @@ public class ImportEOModelAction extends ModelerAbstractAction {
                 if (cayenneAdapter != null) {
                     try {
                         Class<DbAdapter> adapterClass = application
-                                .getClassLoadingService()
+                                .getClassLoader()
                                 .loadClass(DbAdapter.class, cayenneAdapter);
                         node.setAdapterType(adapterClass.toString());
                     } catch (Throwable ex) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ReverseEngineeringAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ReverseEngineeringAction.java
index d68cd4d9b..a4dc63ba0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ReverseEngineeringAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ReverseEngineeringAction.java
@@ -89,7 +89,7 @@ public class ReverseEngineeringAction extends DBConnectionAwareAction {
         }
 
         try {
-            context.setConnection(connectionInfo.makeDataSource(application.getClassLoadingService()).getConnection());
+            context.setConnection(connectionInfo.makeDataSource(application.getClassLoader()).getConnection());
         } catch (SQLException ex) {
             JOptionPane.showMessageDialog(
                     application.getFrameController().getView(),
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsController.java
index 218cf6686..aca1f85fa 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsController.java
@@ -26,8 +26,7 @@ import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ClassLoadingService;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.mvc.RootController;
@@ -257,7 +256,7 @@ public class InferRelationshipsController extends ChildController<RootController
 
     public ObjectNameGenerator createNamingStrategy(String strategyClass) {
         try {
-            ClassLoadingService classLoader = application.getClassLoadingService();
+            ModelerClassLoader classLoader = application.getClassLoader();
 
             return classLoader.loadClass(ObjectNameGenerator.class, strategyClass).getDeclaredConstructor().newInstance();
         } catch (Throwable th) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceController.java
index f2ef232f2..5aadf5f9d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/datasource/DataSourceController.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.ui.datasource;
 
 import org.apache.cayenne.dba.DbAdapter;
-import org.apache.cayenne.modeler.ClassLoadingService;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.preferences.general.GeneralPreferencesController;
 import org.apache.cayenne.modeler.ui.preferences.PreferenceDialogController;
@@ -177,7 +177,7 @@ public class DataSourceController extends ChildController<ProjectController> {
      */
     public void okAction() {
         DBConnectionInfo info = getConnectionInfo();
-        ClassLoadingService classLoader = getApplication().getClassLoadingService();
+        ModelerClassLoader classLoader = getApplication().getClassLoader();
 
         // doing connection testing...
         try {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsController.java
index 438cfbccf..6ea84d395 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsController.java
@@ -123,7 +123,7 @@ public class DBGeneratorOptionsController extends ChildController<ProjectControl
      */
     protected void prepareGenerator() {
         try {
-            DbAdapter adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
+            DbAdapter adapter = connectionInfo.makeAdapter(getApplication().getClassLoader());
             generators = new ArrayList<>();
             for (DataMap dataMap : dataMaps) {
                 this.generators.add(new DbGenerator(
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsController.java
index 234c0f92c..e40404008 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbmerge/MergerOptionsController.java
@@ -43,7 +43,6 @@ import org.apache.cayenne.dbsync.reverse.filters.TableFilter;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.model.DataMapEvent;
 import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
@@ -135,7 +134,7 @@ public class MergerOptionsController extends ChildController<ProjectController>
      */
     protected void prepareMigrator() {
         try {
-            adapter = connectionInfo.makeAdapter(getApplication().getClassLoadingService());
+            adapter = connectionInfo.makeAdapter(getApplication().getClassLoader());
 
             MergerTokenFactory mergerTokenFactory = mergerTokenFactoryProvider.get(adapter);
             tokens.setMergerTokenFactory(mergerTokenFactory);
@@ -151,7 +150,7 @@ public class MergerOptionsController extends ChildController<ProjectController>
             DbLoaderConfiguration config = new DbLoaderConfiguration();
             config.setFiltersConfig(filters);
 
-            DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoadingService());
+            DataSource dataSource = connectionInfo.makeDataSource(getApplication().getClassLoader());
 
             DataMap dbImport;
             try (Connection conn = dataSource.getConnection()) {
@@ -244,7 +243,7 @@ public class MergerOptionsController extends ChildController<ProjectController>
         DataSource dataSource;
         try {
             dataSource = connectionInfo.makeDataSource(getApplication()
-                    .getClassLoadingService());
+                    .getClassLoader());
         } catch (SQLException ex) {
             reportError("Migration Error", ex);
             return;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/PreferenceDialogContext.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/PreferenceDialogContext.java
index de5685f80..1a55a3386 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/PreferenceDialogContext.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/PreferenceDialogContext.java
@@ -85,7 +85,7 @@ public class PreferenceDialogContext {
             }
         }
 
-        application.initClassLoader();
+        application.refreshClassLoader();
     }
 
     public void revert() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/DataSourcePreferencesController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/DataSourcePreferencesController.java
index ec2257277..6fd0928b6 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/DataSourcePreferencesController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/datasource/DataSourcePreferencesController.java
@@ -19,17 +19,17 @@
 
 package org.apache.cayenne.modeler.ui.preferences.datasource;
 
-import org.apache.cayenne.modeler.ui.preferences.PreferenceDialogController;
-import org.apache.cayenne.modeler.ui.preferences.classpath.ClasspathPreferencesController;
-import org.apache.cayenne.modeler.ui.preferences.datasource.creator.DataSourceCreatorController;
-import org.apache.cayenne.modeler.ui.preferences.datasource.duplicator.DataSourceDuplicatorController;
 import org.apache.cayenne.datasource.DriverDataSource;
 import org.apache.cayenne.map.event.MapEvent;
-import org.apache.cayenne.modeler.FileClassLoadingService;
 import org.apache.cayenne.modeler.event.model.DataSourceEvent;
 import org.apache.cayenne.modeler.mvc.ChildController;
-import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 import org.apache.cayenne.modeler.pref.ChildrenMapPreference;
+import org.apache.cayenne.modeler.pref.DBConnectionInfo;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
+import org.apache.cayenne.modeler.ui.preferences.PreferenceDialogController;
+import org.apache.cayenne.modeler.ui.preferences.classpath.ClasspathPreferencesController;
+import org.apache.cayenne.modeler.ui.preferences.datasource.creator.DataSourceCreatorController;
+import org.apache.cayenne.modeler.ui.preferences.datasource.duplicator.DataSourceDuplicatorController;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.*;
@@ -41,15 +41,14 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.prefs.Preferences;
 import java.util.stream.Collectors;
 
 /**
  * Editor for the local DataSources configured in preferences.
- * 
  */
 public class DataSourcePreferencesController extends ChildController<PreferenceDialogController> {
 
@@ -217,10 +216,9 @@ public class DataSourcePreferencesController extends ChildController<PreferenceD
 
 		try {
 
-			FileClassLoadingService classLoader = new FileClassLoadingService();
+			ModelerClassLoader classLoader = new ModelerClassLoader();
 
-			List<File> oldPathFiles = ((FileClassLoadingService) getApplication().getClassLoadingService())
-					.getPathFiles();
+			Set<File> oldPathFiles = getApplication().getClassLoader().getFiles();
 
 			Collection<String> details = new ArrayList<>();
 			for (File oldPathFile : oldPathFiles) {
@@ -249,7 +247,7 @@ public class DataSourcePreferencesController extends ChildController<PreferenceD
 			}
 
 			if (!details.isEmpty()) {
-				classLoader.setPathFiles(details.stream().map(File::new).collect(Collectors.toList()));
+				classLoader.setFiles(details.stream().map(File::new).collect(Collectors.toList()));
 			}
 
 			Class<Driver> driverClass = classLoader.loadClass(Driver.class, currentDataSource.getJdbcDriver());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
index c5e1931e0..af0b4509f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectController.java
@@ -52,7 +52,7 @@ import org.apache.cayenne.map.event.ObjAttributeListener;
 import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.map.event.ObjRelationshipListener;
 import org.apache.cayenne.map.event.RelationshipEvent;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.RevertAction;
 import org.apache.cayenne.modeler.ui.action.SaveAction;
 import org.apache.cayenne.modeler.ui.action.SaveAsAction;
@@ -259,16 +259,16 @@ public class ProjectController extends ChildController<ModelerController> {
         this.entityResolver = new EntityResolver();
         updateEntityResolver();
 
-        ActionManager actionManager = application.getActionManager();
+        GlobalActions globalActions = application.getActionManager();
 
-        addDataNodeDisplayListener(e -> actionManager.dataNodeSelected());
-        addDataMapDisplayListener(e -> actionManager.dataMapSelected());
-        addObjEntityDisplayListener(e -> actionManager.objEntitySelected());
-        addDbEntityDisplayListener(e -> actionManager.dbEntitySelected());
-        addQueryDisplayListener(e -> actionManager.querySelected());
-        addProcedureDisplayListener(e -> actionManager.procedureSelected());
-        addMultipleObjectsDisplayListener(e -> actionManager.multipleObjectsSelected(e.getNodes()));
-        addEmbeddableDisplayListener(e -> actionManager.embeddableSelected());
+        addDataNodeDisplayListener(e -> globalActions.dataNodeSelected());
+        addDataMapDisplayListener(e -> globalActions.dataMapSelected());
+        addObjEntityDisplayListener(e -> globalActions.objEntitySelected());
+        addDbEntityDisplayListener(e -> globalActions.dbEntitySelected());
+        addQueryDisplayListener(e -> globalActions.querySelected());
+        addProcedureDisplayListener(e -> globalActions.procedureSelected());
+        addMultipleObjectsDisplayListener(e -> globalActions.objectsSelected(e.getNodes()));
+        addEmbeddableDisplayListener(e -> globalActions.embeddableSelected());
 
         this.projectView = new ProjectView(this);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
index aeaa05605..3eae936fe 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/ProjectView.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.modeler.ui.project;
 
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CollapseTreeAction;
 import org.apache.cayenne.modeler.ui.action.FilterAction;
 import org.apache.cayenne.modeler.pref.ComponentGeometry;
@@ -44,9 +44,9 @@ public class ProjectView extends JPanel {
 
     public ProjectView(ProjectController controller) {
 
-        ActionManager actionManager = controller.getApplication().getActionManager();
-        actionManager.getAction(CollapseTreeAction.class).setAlwaysOn(true);
-        actionManager.getAction(FilterAction.class).setAlwaysOn(true);
+        GlobalActions globalActions = controller.getApplication().getActionManager();
+        globalActions.getAction(CollapseTreeAction.class).setAlwaysOn(true);
+        globalActions.getAction(FilterAction.class).setAlwaysOn(true);
 
         setBorder(BorderFactory.createEmptyBorder(1, 0, 0, 1));
 
@@ -56,8 +56,8 @@ public class ProjectView extends JPanel {
         barPanel.setBorder(BorderFactory.createEmptyBorder());
         barPanel.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
 
-        JButton collapseButton = actionManager.getAction(CollapseTreeAction.class).buildButton(1);
-        JButton filterButton = actionManager.getAction(FilterAction.class).buildButton(3);
+        JButton collapseButton = globalActions.getAction(CollapseTreeAction.class).buildButton(1);
+        JButton filterButton = globalActions.getAction(FilterAction.class).buildButton(3);
         filterButton.setPreferredSize(new Dimension(30, 30));
         collapseButton.setPreferredSize(new Dimension(30, 30));
         barPanel.add(filterButton);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DatabaseSchemaLoader.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DatabaseSchemaLoader.java
index 9e579b77d..d24d24cc8 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DatabaseSchemaLoader.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DatabaseSchemaLoader.java
@@ -38,7 +38,7 @@ import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.dbsync.reverse.dbimport.SchemaContainer;
-import org.apache.cayenne.modeler.ClassLoadingService;
+import org.apache.cayenne.modeler.service.classloader.ModelerClassLoader;
 import org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
 
@@ -53,7 +53,7 @@ public class DatabaseSchemaLoader {
     }
 
     public ReverseEngineering load(DBConnectionInfo connectionInfo,
-                                   ClassLoadingService loadingService) throws Exception {
+                                   ModelerClassLoader loadingService) throws Exception {
         DbAdapter dbAdapter = connectionInfo.makeAdapter(loadingService);
         try (Connection connection = connectionInfo.makeDataSource(loadingService).getConnection()) {
             processCatalogs(connection, dbAdapter);
@@ -123,7 +123,7 @@ public class DatabaseSchemaLoader {
     }
 
     public ReverseEngineering loadTables(DBConnectionInfo connectionInfo,
-                                         ClassLoadingService loadingService,
+                                         ModelerClassLoader loadingService,
                                          TreePath path,
                                          String[] tableTypesFromConfig) throws Exception {
         int pathIndex = 1;
@@ -174,7 +174,7 @@ public class DatabaseSchemaLoader {
     }
 
     public ReverseEngineering loadColumns(DBConnectionInfo connectionInfo,
-                                          ClassLoadingService loadingService,
+                                          ModelerClassLoader loadingService,
                                           TreePath path) throws SQLException {
         int pathIndex = 1;
         String catalogName = null, schemaName = null;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
index caa5285f3..5278d7517 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/LoadDbSchemaAction.java
@@ -119,7 +119,7 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
     private void loadDataBase(DBConnectionInfo connectionInfo) throws Exception {
         DraggableTreePanel draggableTreePanel = view.getDraggableTreePanel();
         ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
-                .load(connectionInfo, application.getClassLoadingService());
+                .load(connectionInfo, application.getClassLoader());
         draggableTreePanel.getSourceTree()
                 .setEnabled(true);
         draggableTreePanel.getSourceTree()
@@ -133,7 +133,7 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
         DraggableTreePanel draggableTreePanel = view.getDraggableTreePanel();
         ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
                 .loadTables(connectionInfo,
-                        application.getClassLoadingService(),
+                        application.getClassLoader(),
                         tablePath,
                         view.getTableTypes());
         draggableTreePanel.getSourceTree()
@@ -144,7 +144,7 @@ public class LoadDbSchemaAction extends DBConnectionAwareAction {
     private void loadColumns(DBConnectionInfo connectionInfo, TreePath tablePath) throws SQLException {
         DraggableTreePanel draggableTreePanel = view.getDraggableTreePanel();
         ReverseEngineering databaseReverseEngineering = new DatabaseSchemaLoader()
-                .loadColumns(connectionInfo, application.getClassLoadingService(), tablePath);
+                .loadColumns(connectionInfo, application.getClassLoader(), tablePath);
         draggableTreePanel.getSourceTree()
                 .update(databaseReverseEngineering,
                         new PrintColumnsBiFunction(draggableTreePanel.getSourceTree()));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
index 135ffe361..0b6865322 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.ui.action.RemoveRelationshipAction;
 import org.apache.cayenne.modeler.event.display.AttributeDisplayEvent;
@@ -66,10 +66,10 @@ public class DbEntityView extends JTabbedPane {
     }
 
     private void resetRemoveButtons() {
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        actionManager.getAction(RemoveAttributeAction.class).setEnabled(false);
-        actionManager.getAction(RemoveRelationshipAction.class).setEnabled(false);
+        globalActions.getAction(RemoveAttributeAction.class).setEnabled(false);
+        globalActions.getAction(RemoveRelationshipAction.class).setEnabled(false);
     }
 
     private void stateChanged(ChangeEvent e) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
index 189c602e6..bfe87134c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/main/DbEntityMainView.java
@@ -26,7 +26,7 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CreateObjEntityFromDbAction;
 import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
@@ -79,18 +79,18 @@ public class DbEntityMainView extends JPanel implements ExistingSelectionProcess
         toolBar = new JToolBar();
         toolBar.setBorder(BorderFactory.createEmptyBorder());
         toolBar.setFloatable(false);
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CreateRelationshipAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CreateAttributeAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CreateRelationshipAction.class).buildButton(3));
         toolBar.addSeparator();
 
-        toolBar.add(actionManager.getAction(CreateObjEntityFromDbAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(DbEntitySyncAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(DbEntityCounterpartAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CreateObjEntityFromDbAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(DbEntitySyncAction.class).buildButton(2));
+        toolBar.add(globalActions.getAction(DbEntityCounterpartAction.class).buildButton(3));
         toolBar.addSeparator();
 
-        toolBar.add(actionManager.getAction(ShowGraphEntityAction.class).buildButton());
+        toolBar.add(globalActions.getAction(ShowGraphEntityAction.class).buildButton());
 
         // create widgets
         name = new CayenneUndoableTextField();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
index a47c653b0..e793705e5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.DbAttributeListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
@@ -65,7 +65,7 @@ public class DbAttributePanel extends JPanel implements DbEntityDisplayListener,
 
         this.setLayout(new BorderLayout());
 
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
         // Create table with two columns and no rows.
         table = new CayenneTable();
@@ -77,12 +77,12 @@ public class DbAttributePanel extends JPanel implements DbEntityDisplayListener,
         // TODO: There is no edit panel for DbAttributes, so for now no edit contextual menu and the edit button is disabled
 
         JPopupMenu popup = new JPopupMenu();
-        popup.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
 
         popup.addSeparator();
-        popup.add(actionManager.getAction(CutAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(CopyAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(PasteAction.class).buildMenu());
+        popup.add(globalActions.getAction(CutAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(CopyAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(PasteAction.class).buildMenu());
 
         TablePopupHandler.install(table, popup);
         add(WidgetFactory.createTablePanel(table, null), BorderLayout.CENTER);
@@ -92,7 +92,7 @@ public class DbAttributePanel extends JPanel implements DbEntityDisplayListener,
 
         table.getSelectionModel().addListSelectionListener(this::valueChanged);
 
-        actionManager.setupCutCopyPaste(
+        globalActions.setupCutCopyPaste(
                 table,
                 CutAttributeRelationshipAction.class,
                 CopyAttributeRelationshipAction.class);
@@ -208,11 +208,11 @@ public class DbAttributePanel extends JPanel implements DbEntityDisplayListener,
                 parentPanel.getRelationshipPanel().getTable().getCellEditor().stopCellEditing();
             }
 
-            ActionManager actionManager = Application.getInstance().getActionManager();
+            GlobalActions globalActions = Application.getInstance().getActionManager();
 
-            actionManager.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
 
             if (table.getSelectedRow() >= 0) {
                 DbAttributeTableModel model = (DbAttributeTableModel) table.getModel();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
index f03edb0a5..0eddd063f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
@@ -24,7 +24,7 @@ import org.apache.cayenne.map.event.DbEntityListener;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CreateObjEntityFromDbAction;
@@ -84,15 +84,15 @@ public class DbEntityPropertiesView extends JPanel implements DbEntityDisplayLis
         add(splitPane);
         toolBar = new JToolBar();
         toolBar.setFloatable(false);
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CreateRelationshipAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CreateAttributeAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CreateRelationshipAction.class).buildButton(3));
         toolBar.addSeparator();
 
-        toolBar.add(actionManager.getAction(CreateObjEntityFromDbAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(DbEntitySyncAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(DbEntityCounterpartAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CreateObjEntityFromDbAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(DbEntitySyncAction.class).buildButton(2));
+        toolBar.add(globalActions.getAction(DbEntityCounterpartAction.class).buildButton(3));
         toolBar.addSeparator();
 
         Icon ico = ModelerUtil.buildIcon("icon-edit.png");
@@ -102,11 +102,11 @@ public class DbEntityPropertiesView extends JPanel implements DbEntityDisplayLis
         toolBar.add(editButton).setEnabled(false);
 
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildButton());
+        toolBar.add(globalActions.getAction(RemoveAttributeRelationshipAction.class).buildButton());
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(CutAttributeRelationshipAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CopyAttributeRelationshipAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(PasteAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CutAttributeRelationshipAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CopyAttributeRelationshipAction.class).buildButton(2));
+        toolBar.add(globalActions.getAction(PasteAction.class).buildButton(3));
 
         add(toolBar, BorderLayout.NORTH);
         controller.addDbEntityDisplayListener(this);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
index 0687470b0..1cb9c98bb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
@@ -75,7 +75,7 @@ public class DbRelationshipPanel extends JPanel implements DbEntityDisplayListen
 
         this.setLayout(new BorderLayout());
 
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
         table = new CayenneTable();
         table.setDefaultRenderer(DbEntity.class, CellRenderers.entityTableRendererWithIcons(controller));
@@ -86,12 +86,12 @@ public class DbRelationshipPanel extends JPanel implements DbEntityDisplayListen
 
         JPopupMenu popup = new JPopupMenu();
         popup.add(editMenu);
-        popup.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
 
         popup.addSeparator();
-        popup.add(actionManager.getAction(CutAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(CopyAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(PasteAction.class).buildMenu());
+        popup.add(globalActions.getAction(CutAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(CopyAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(PasteAction.class).buildMenu());
 
         TablePopupHandler.install(table, popup);
         add(WidgetFactory.createTablePanel(table, null), BorderLayout.CENTER);
@@ -132,10 +132,10 @@ public class DbRelationshipPanel extends JPanel implements DbEntityDisplayListen
         List listRels = model.getObjectList();
         int[] newSel = new int[rels.length];
 
-        ActionManager actionManager = Application.getInstance().getActionManager();
-        actionManager.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-        actionManager.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-        actionManager.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+        GlobalActions globalActions = Application.getInstance().getActionManager();
+        globalActions.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+        globalActions.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+        globalActions.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
 
         parentPanel.updateActions(rels);
 
@@ -288,10 +288,10 @@ public class DbRelationshipPanel extends JPanel implements DbEntityDisplayListen
                 parentPanel.getAttributePanel().getTable().getCellEditor().stopCellEditing();
             }
 
-            ActionManager actionManager = Application.getInstance().getActionManager();
-            actionManager.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            GlobalActions globalActions = Application.getInstance().getActionManager();
+            globalActions.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
 
             boolean editEnabled = table.getSelectedRow() >= 0;
             parentPanel.rebindEditButton(editEnabled, "Edit Relationship", this::edit);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
index a6cfb3a67..de3d1044b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
 import org.apache.cayenne.modeler.event.display.EmbeddableAttributeDisplayEvent;
@@ -68,10 +68,10 @@ public class EmbeddableView extends JTabbedPane {
     }
 
     private void resetRemoveButtons() {
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        actionManager.getAction(RemoveAttributeAction.class).setEnabled(false);
-        actionManager.getAction(RemoveCallbackMethodAction.class).setEnabled(false);
+        globalActions.getAction(RemoveAttributeAction.class).setEnabled(false);
+        globalActions.getAction(RemoveCallbackMethodAction.class).setEnabled(false);
     }
 
     private void currentEmbeddableChanged(EmbeddableDisplayEvent e) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
index fd1a5b016..38e1500bd 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.event.EmbeddableEvent;
 import org.apache.cayenne.map.event.EmbeddableListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeAction;
@@ -72,17 +72,17 @@ public class EmbeddableAttributesView extends JPanel implements
 
         JToolBar toolBar = new JToolBar();
         toolBar.setFloatable(false);
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton());
+        toolBar.add(globalActions.getAction(CreateAttributeAction.class).buildButton());
         toolBar.addSeparator();
 
-        toolBar.add(actionManager.getAction(RemoveAttributeAction.class).buildButton());
+        toolBar.add(globalActions.getAction(RemoveAttributeAction.class).buildButton());
         toolBar.addSeparator();
 
-        toolBar.add(actionManager.getAction(CutAttributeAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CopyAttributeAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(PasteAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CutAttributeAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CopyAttributeAction.class).buildButton(2));
+        toolBar.add(globalActions.getAction(PasteAction.class).buildButton(3));
 
         add(toolBar, BorderLayout.NORTH);
 
@@ -94,13 +94,13 @@ public class EmbeddableAttributesView extends JPanel implements
 
         // Create and install a popup
         JPopupMenu popup = new JPopupMenu();
-        popup.add(actionManager.getAction(RemoveAttributeAction.class).buildMenu());
+        popup.add(globalActions.getAction(RemoveAttributeAction.class).buildMenu());
 
         popup.addSeparator();
 
-        popup.add(actionManager.getAction(CutAttributeAction.class).buildMenu());
-        popup.add(actionManager.getAction(CopyAttributeAction.class).buildMenu());
-        popup.add(actionManager.getAction(PasteAction.class).buildMenu());
+        popup.add(globalActions.getAction(CutAttributeAction.class).buildMenu());
+        popup.add(globalActions.getAction(CopyAttributeAction.class).buildMenu());
+        popup.add(globalActions.getAction(PasteAction.class).buildMenu());
 
         TablePopupHandler.install(table, popup);
         add(WidgetFactory.createTablePanel(table, null), BorderLayout.CENTER);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
index 67b96e4b5..960958705 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.EmbeddableEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayListener;
@@ -66,8 +66,8 @@ public class EmbeddableMainView extends JPanel implements EmbeddableDisplayListe
         JToolBar toolBar = new JToolBar();
         toolBar.setBorder(BorderFactory.createEmptyBorder());
         toolBar.setFloatable(false);
-        ActionManager actionManager = Application.getInstance().getActionManager();
-        toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton());
+        GlobalActions globalActions = Application.getInstance().getActionManager();
+        toolBar.add(globalActions.getAction(CreateAttributeAction.class).buildButton());
 
         add(toolBar, BorderLayout.NORTH);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
index 94fbac10a..8c360310c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
 import org.apache.cayenne.modeler.ui.action.RemoveRelationshipAction;
@@ -92,11 +92,11 @@ public class ObjEntityView extends JTabbedPane {
     }
 
     private void resetRemoveButtons() {
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        actionManager.getAction(RemoveAttributeAction.class).setEnabled(false);
-        actionManager.getAction(RemoveRelationshipAction.class).setEnabled(false);
-        actionManager.getAction(RemoveCallbackMethodAction.class).setEnabled(false);
+        globalActions.getAction(RemoveAttributeAction.class).setEnabled(false);
+        globalActions.getAction(RemoveRelationshipAction.class).setEnabled(false);
+        globalActions.getAction(RemoveCallbackMethodAction.class).setEnabled(false);
     }
 
     private void currentObjEntityChanged(EntityDisplayEvent e) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index a1d4d8ffb..ed1a24333 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.ObjEntityCounterpartAction;
@@ -87,15 +87,15 @@ public class ObjEntityMainView extends JPanel implements ObjEntityDisplayListene
         JToolBar toolBar = new JToolBar();
         toolBar.setBorder(BorderFactory.createEmptyBorder());
         toolBar.setFloatable(false);
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CreateRelationshipAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CreateAttributeAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CreateRelationshipAction.class).buildButton(3));
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(ObjEntitySyncAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(ObjEntityCounterpartAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(ObjEntitySyncAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(ObjEntityCounterpartAction.class).buildButton(3));
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(ShowGraphEntityAction.class).buildButton());
+        toolBar.add(globalActions.getAction(ShowGraphEntityAction.class).buildButton());
 
         add(toolBar, BorderLayout.NORTH);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
index 809138398..bacb45588 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.event.ObjAttributeListener;
 import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.ObjEntityToSuperEntityAction;
@@ -91,7 +91,7 @@ public class ObjAttributePanel extends JPanel implements ObjEntityDisplayListene
 
         this.setLayout(new BorderLayout());
 
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
         table = new CayenneTable();
         table.setDefaultRenderer(String.class, new CellRenderer());
@@ -122,12 +122,12 @@ public class ObjAttributePanel extends JPanel implements ObjEntityDisplayListene
 
         JPopupMenu popup = new JPopupMenu();
         popup.add(editMenu);
-        popup.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
 
         popup.addSeparator();
-        popup.add(actionManager.getAction(CutAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(CopyAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(PasteAction.class).buildMenu());
+        popup.add(globalActions.getAction(CutAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(CopyAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(PasteAction.class).buildMenu());
 
         TablePopupHandler.install(table, popup);
         add(WidgetFactory.createTablePanel(table, null), BorderLayout.CENTER);
@@ -139,7 +139,7 @@ public class ObjAttributePanel extends JPanel implements ObjEntityDisplayListene
         table.getSelectionModel().addListSelectionListener(this::valueChanged);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
-        actionManager.setupCutCopyPaste(
+        globalActions.setupCutCopyPaste(
                 table,
                 CutAttributeRelationshipAction.class,
                 CopyAttributeRelationshipAction.class);
@@ -403,8 +403,8 @@ public class ObjAttributePanel extends JPanel implements ObjEntityDisplayListene
         public void mouseClicked(MouseEvent event, int x) {
             Point point = event.getPoint();
             if (point.x - x <= INHERITANCE_ICON.getIconWidth()) {
-                ActionManager actionManager = Application.getInstance().getActionManager();
-                actionManager.getAction(ObjEntityToSuperEntityAction.class).performAction(null);
+                GlobalActions globalActions = Application.getInstance().getActionManager();
+                globalActions.getAction(ObjEntityToSuperEntityAction.class).performAction(null);
             }
         }
     }
@@ -456,10 +456,10 @@ public class ObjAttributePanel extends JPanel implements ObjEntityDisplayListene
                 parentPanel.getRelationshipPanel().getTable().getCellEditor().stopCellEditing();
             }
 
-            ActionManager actionManager = Application.getInstance().getActionManager();
-            actionManager.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            GlobalActions globalActions = Application.getInstance().getActionManager();
+            globalActions.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
 
             boolean editEnabled = table.getSelectedRow() >= 0;
             parentPanel.rebindEditButton(editEnabled, "Edit Attribute", this::edit);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
index 1acfc6dec..afb17fda2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
@@ -22,7 +22,7 @@ import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.ObjEntityListener;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
@@ -83,13 +83,13 @@ public class ObjEntityPropertiesView extends JPanel implements ObjEntityDisplayL
 
         toolBar = new JToolBar();
         toolBar.setFloatable(false);
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
-        toolBar.add(actionManager.getAction(CreateAttributeAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CreateRelationshipAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CreateAttributeAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CreateRelationshipAction.class).buildButton(3));
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(ObjEntitySyncAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(ObjEntityCounterpartAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(ObjEntitySyncAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(ObjEntityCounterpartAction.class).buildButton(3));
         toolBar.addSeparator();
 
         Icon ico = ModelerUtil.buildIcon("icon-edit.png");
@@ -99,11 +99,11 @@ public class ObjEntityPropertiesView extends JPanel implements ObjEntityDisplayL
         toolBar.add(editButton).setEnabled(false);
 
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildButton());
+        toolBar.add(globalActions.getAction(RemoveAttributeRelationshipAction.class).buildButton());
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(CutAttributeRelationshipAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CopyAttributeRelationshipAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(PasteAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CutAttributeRelationshipAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CopyAttributeRelationshipAction.class).buildButton(2));
+        toolBar.add(globalActions.getAction(PasteAction.class).buildButton(3));
 
         add(toolBar, BorderLayout.NORTH);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
index d0a3cce0a..89a31aa69 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjRelationshipPanel.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.swing.WidgetFactory;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.ObjEntityToSuperEntityAction;
@@ -83,7 +83,7 @@ public class ObjRelationshipPanel extends JPanel implements ObjEntityDisplayList
 
         this.setLayout(new BorderLayout());
 
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
         table = new CayenneTable();
         table.setDefaultRenderer(String.class, new StringRenderer());
@@ -114,12 +114,12 @@ public class ObjRelationshipPanel extends JPanel implements ObjEntityDisplayList
 
         JPopupMenu popup = new JPopupMenu();
         popup.add(editMenu);
-        popup.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
 
         popup.addSeparator();
-        popup.add(actionManager.getAction(CutAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(CopyAttributeRelationshipAction.class).buildMenu());
-        popup.add(actionManager.getAction(PasteAction.class).buildMenu());
+        popup.add(globalActions.getAction(CutAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(CopyAttributeRelationshipAction.class).buildMenu());
+        popup.add(globalActions.getAction(PasteAction.class).buildMenu());
 
         TablePopupHandler.install(table, popup);
         add(WidgetFactory.createTablePanel(table, null), BorderLayout.CENTER);
@@ -373,8 +373,8 @@ public class ObjRelationshipPanel extends JPanel implements ObjEntityDisplayList
         public void mouseClicked(MouseEvent event, int x) {
             Point point = event.getPoint();
             if (point.x - x <= INHERITANCE_ICON.getIconWidth()) {
-                ActionManager actionManager = Application.getInstance().getActionManager();
-                actionManager.getAction(ObjEntityToSuperEntityAction.class).performAction(null);
+                GlobalActions globalActions = Application.getInstance().getActionManager();
+                globalActions.getAction(ObjEntityToSuperEntityAction.class).performAction(null);
             }
         }
     }
@@ -413,10 +413,10 @@ public class ObjRelationshipPanel extends JPanel implements ObjEntityDisplayList
                 parentPanel.getAttributePanel().getTable().getCellEditor().stopCellEditing();
             }
 
-            ActionManager actionManager = Application.getInstance().getActionManager();
-            actionManager.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
-            actionManager.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            GlobalActions globalActions = Application.getInstance().getActionManager();
+            globalActions.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
+            globalActions.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(this);
 
             boolean editEnabled = table.getSelectedRow() >= 0;
             parentPanel.rebindEditButton(editEnabled, "Edit Relationship", this::edit);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
index a6c2aae5b..ebd3a81d1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.CopyProcedureParameterAction;
 import org.apache.cayenne.modeler.ui.action.CreateProcedureParameterAction;
 import org.apache.cayenne.modeler.ui.action.CutProcedureParameterAction;
@@ -117,9 +117,9 @@ public class ProcedureParameterTab extends JPanel implements ProcedureParameterL
         JToolBar toolBar = new JToolBar();
         toolBar.setFloatable(false);
 
-        ActionManager actionManager = Application.getInstance().getActionManager();
-        toolBar.add(actionManager.getAction(CreateProcedureParameterAction.class).buildButton(1));
-        removeParameterButton = actionManager.getAction(RemoveProcedureParameterAction.class).buildButton(3);
+        GlobalActions globalActions = Application.getInstance().getActionManager();
+        toolBar.add(globalActions.getAction(CreateProcedureParameterAction.class).buildButton(1));
+        removeParameterButton = globalActions.getAction(RemoveProcedureParameterAction.class).buildButton(3);
         toolBar.add(removeParameterButton);
         toolBar.addSeparator();
 
@@ -139,9 +139,9 @@ public class ProcedureParameterTab extends JPanel implements ProcedureParameterL
         toolBar.add(moveDown);
 
         toolBar.addSeparator();
-        toolBar.add(actionManager.getAction(CutProcedureParameterAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CopyProcedureParameterAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(PasteAction.class).buildButton(3));
+        toolBar.add(globalActions.getAction(CutProcedureParameterAction.class).buildButton(1));
+        toolBar.add(globalActions.getAction(CopyProcedureParameterAction.class).buildButton(2));
+        toolBar.add(globalActions.getAction(PasteAction.class).buildButton(3));
 
         add(toolBar, BorderLayout.NORTH);
 
@@ -155,7 +155,7 @@ public class ProcedureParameterTab extends JPanel implements ProcedureParameterL
         // Create and install a popup
         JPopupMenu popup = new JPopupMenu();
 
-        removeParameterMenu = actionManager.getAction(
+        removeParameterMenu = globalActions.getAction(
                 RemoveProcedureParameterAction.class).buildMenu();
 
         popup.add(removeParameterMenu);
@@ -168,18 +168,18 @@ public class ProcedureParameterTab extends JPanel implements ProcedureParameterL
         popup.add(moveDownMenu);
 
         popup.addSeparator();
-        popup.add(actionManager.getAction(CutProcedureParameterAction.class).buildMenu());
+        popup.add(globalActions.getAction(CutProcedureParameterAction.class).buildMenu());
         popup
-                .add(actionManager
+                .add(globalActions
                         .getAction(CopyProcedureParameterAction.class)
                         .buildMenu());
-        popup.add(actionManager.getAction(PasteAction.class).buildMenu());
+        popup.add(globalActions.getAction(PasteAction.class).buildMenu());
 
         TablePopupHandler.install(table, popup);
 
         add(WidgetFactory.createTablePanel(table, null), BorderLayout.CENTER);
 
-        actionManager.setupCutCopyPaste(
+        globalActions.setupCutCopyPaste(
                 table,
                 CutProcedureParameterAction.class,
                 CopyProcedureParameterAction.class);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java
index cc0901b37..8b4b8cc11 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogController.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.ui.project.validator;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.DisableValidationInspectionAction;
 import org.apache.cayenne.modeler.ui.action.ShowValidationOptionAction;
 import org.apache.cayenne.modeler.ui.action.ValidateAction;
@@ -79,11 +79,11 @@ public class ProjectValidatorDialogController extends ChildController<ProjectCon
         Inspection inspection = failure instanceof ProjectValidationFailure
                 ? ((ProjectValidationFailure) failure).getInspection()
                 : null;
-        ActionManager actionManager = getApplication().getActionManager();
-        actionManager.getAction(DisableValidationInspectionAction.class)
+        GlobalActions globalActions = getApplication().getActionManager();
+        globalActions.getAction(DisableValidationInspectionAction.class)
                 .putInspection(inspection)
                 .setEnabled(inspection != null);
-        actionManager.getAction(ShowValidationOptionAction.class)
+        globalActions.getAction(ShowValidationOptionAction.class)
                 .putInspection(inspection);
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java
index 8e0ac65b5..f0364a545 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/validator/ProjectValidatorDialogView.java
@@ -23,7 +23,7 @@ import com.jgoodies.forms.builder.PanelBuilder;
 import com.jgoodies.forms.layout.CellConstraints;
 import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.DisableValidationInspectionAction;
 import org.apache.cayenne.modeler.ui.action.ShowValidationOptionAction;
 import org.apache.cayenne.modeler.event.display.TablePopupHandler;
@@ -71,10 +71,10 @@ public class ProjectValidatorDialogView extends CayenneDialog {
         problemsTable.setTableHeader(null);
         problemsTable.setDefaultRenderer(ValidationFailure.class, new ValidationRenderer());
 
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
         JPopupMenu popup = new JPopupMenu();
-        popup.add(actionManager.getAction(ShowValidationOptionAction.class).buildMenu());
-        popup.add(actionManager.getAction(DisableValidationInspectionAction.class).buildMenu());
+        popup.add(globalActions.getAction(ShowValidationOptionAction.class).buildMenu());
+        popup.add(globalActions.getAction(DisableValidationInspectionAction.class).buildMenu());
         TablePopupHandler.install(problemsTable, popup);
 
         CellConstraints cc = new CellConstraints();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java
index 94d69105c..0727b28de 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/BaseRemovePropertyUndoableEdit.java
@@ -33,11 +33,11 @@ public abstract class BaseRemovePropertyUndoableEdit extends CayenneUndoableEdit
     protected Embeddable embeddable;
 
     protected void focusObjEntity(){
-        actionManager.getAction(ObjEntityCounterpartAction.class).navigateToEntity(objEntity);
+        globalActions.getAction(ObjEntityCounterpartAction.class).navigateToEntity(objEntity);
     }
 
     protected void focusDBEntity(){
-        actionManager.getAction(ObjEntityCounterpartAction.class).navigateToEntity(dbEntity);
+        globalActions.getAction(ObjEntityCounterpartAction.class).navigateToEntity(dbEntity);
     }
 
     protected void focusEmbeddable() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java
index 761b781d0..40051d201 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java
@@ -22,15 +22,15 @@ import javax.swing.undo.AbstractUndoableEdit;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 
 public abstract class CayenneUndoableEdit extends AbstractUndoableEdit {
     
-	protected ActionManager actionManager;
+	protected GlobalActions globalActions;
 	protected ProjectController controller;
 	
 	public CayenneUndoableEdit() {
-		this.actionManager = Application.getInstance().getActionManager();
+		this.globalActions = Application.getInstance().getActionManager();
 		this.controller = Application.getInstance().getFrameController().getProjectController();
 	}
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java
index 0e83a4d77..86bca94db 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java
@@ -54,7 +54,7 @@ public class CreateAttributeUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateAttributeAction action = actionManager
+        CreateAttributeAction action = globalActions
                 .getAction(CreateAttributeAction.class);
 
         if (objEntity != null) {
@@ -68,7 +68,7 @@ public class CreateAttributeUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAttributeAction action = actionManager
+        RemoveAttributeAction action = globalActions
                 .getAction(RemoveAttributeAction.class);
 
         if (objEntity != null) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
index 0ebb29c92..77d485592 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
@@ -37,14 +37,14 @@ public class CreateCallbackMethodUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateCallbackMethodAction action = actionManager
+        CreateCallbackMethodAction action = globalActions
                 .getAction(CreateCallbackMethodAction.class);
         action.createCallbackMethod(callbackType, methodName);
     }
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveCallbackMethodAction action = actionManager
+        RemoveCallbackMethodAction action = globalActions
                 .getAction(RemoveCallbackMethodAction.class);
         action.removeCallbackMethod(callbackType, methodName);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java
index 96f3d0993..2ad63f78c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java
@@ -49,7 +49,7 @@ public class CreateDataMapUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
 
         controller.displayDomain(new DomainDisplayEvent(this, domain));
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java
index de3daf14d..ca7286870 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java
@@ -48,13 +48,13 @@ public class CreateDbEntityUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateDbEntityAction action = actionManager.getAction(CreateDbEntityAction.class);
+        CreateDbEntityAction action = globalActions.getAction(CreateDbEntityAction.class);
         action.createEntity(map, entity);
     }
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
         action.removeDbEntity(map, entity);
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java
index 3a985e485..c1d0869f2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java
@@ -45,7 +45,7 @@ public class CreateEmbAttributeUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateAttributeAction action = actionManager
+        CreateAttributeAction action = globalActions
                 .getAction(CreateAttributeAction.class);
         for (EmbeddableAttribute attr : attrs) {
             action.createEmbAttribute(embeddable, attr);
@@ -54,7 +54,7 @@ public class CreateEmbAttributeUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAttributeAction action = actionManager
+        RemoveAttributeAction action = globalActions
                 .getAction(RemoveAttributeAction.class);
         action.removeEmbeddableAttributes(embeddable, attrs);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java
index c795e8eb6..86a3c08ae 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java
@@ -43,7 +43,7 @@ public class CreateEmbeddableUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateEmbeddableAction action = actionManager
+        CreateEmbeddableAction action = globalActions
                 .getAction(CreateEmbeddableAction.class);
 
         action.createEmbeddable(dataMap, embeddable);
@@ -51,7 +51,7 @@ public class CreateEmbeddableUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
         action.removeEmbeddable(dataMap, embeddable);
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java
index 8cc8506d6..08896fc0b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java
@@ -40,7 +40,7 @@ public class CreateNodeUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
         action.removeDataNode(node);
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java
index 7719f8a96..758b180d9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java
@@ -48,7 +48,7 @@ public class CreateObjEntityUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateObjEntityAction action = actionManager
+        CreateObjEntityAction action = globalActions
                 .getAction(CreateObjEntityAction.class);
 
         action.createObjEntity(map, objEntity);
@@ -56,7 +56,7 @@ public class CreateObjEntityUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
         action.removeObjEntity(map, objEntity);
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java
index ce74e5e2a..394742a7f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureParameterUndoableEdit.java
@@ -48,7 +48,7 @@ public class CreateProcedureParameterUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveProcedureParameterAction action = actionManager.getAction(RemoveProcedureParameterAction.class);
+        RemoveProcedureParameterAction action = globalActions.getAction(RemoveProcedureParameterAction.class);
 
         if (procedure != null) {
             action.removeProcedureParameters(procedure, new ProcedureParameter[] {
@@ -61,7 +61,7 @@ public class CreateProcedureParameterUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateProcedureParameterAction action = actionManager.getAction(CreateProcedureParameterAction.class);
+        CreateProcedureParameterAction action = globalActions.getAction(CreateProcedureParameterAction.class);
         if (procedure != null) {
             action.createProcedureParameter(procedure, parameter);
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java
index c22160271..821d018c4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java
@@ -43,14 +43,14 @@ public class CreateProcedureUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateProcedureAction action = actionManager
+        CreateProcedureAction action = globalActions
                 .getAction(CreateProcedureAction.class);
         action.createProcedure(map, procedure);
     }
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
         action.removeProcedure(map, procedure);
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java
index ff66138b8..1da4305df 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java
@@ -41,7 +41,7 @@ public class CreateQueryUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateQueryAction action = actionManager.getAction(CreateQueryAction.class);
+        CreateQueryAction action = globalActions.getAction(CreateQueryAction.class);
         action.createQuery(domain, map, query);
     }
 
@@ -52,7 +52,7 @@ public class CreateQueryUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
         action.removeQuery(map, query);
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java
index c83b4b78a..1a5f29e67 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java
@@ -55,7 +55,7 @@ public class CreateRelationshipUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        CreateRelationshipAction action = actionManager
+        CreateRelationshipAction action = globalActions
                 .getAction(CreateRelationshipAction.class);
 
         if (objEnt != null) {
@@ -73,7 +73,7 @@ public class CreateRelationshipUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveRelationshipAction action = actionManager
+        RemoveRelationshipAction action = globalActions
                 .getAction(RemoveRelationshipAction.class);
 
         if (objEnt != null) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java
index 46d84502e..f24cc0423 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/LinkDataMapUndoableEdit.java
@@ -49,7 +49,7 @@ public class LinkDataMapUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        LinkDataMapAction action = actionManager.getAction(LinkDataMapAction.class);
+        LinkDataMapAction action = globalActions.getAction(LinkDataMapAction.class);
         action.linkDataMap(map, node);
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
index 344c646b8..a5c2e5af3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
@@ -70,25 +70,25 @@ public class PasteUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        PasteAction action = actionManager.getAction(PasteAction.class);
+        PasteAction action = globalActions.getAction(PasteAction.class);
 
         action.paste(where, content, domain, map);
     }
 
     @Override
     public void undo() throws CannotUndoException {
-        RemoveAttributeAction rAttributeAction = actionManager
+        RemoveAttributeAction rAttributeAction = globalActions
                 .getAction(RemoveAttributeAction.class);
 
-        RemoveAction rAction = actionManager.getAction(RemoveAction.class);
+        RemoveAction rAction = globalActions.getAction(RemoveAction.class);
 
-        RemoveRelationshipAction rRelationShipAction = actionManager
+        RemoveRelationshipAction rRelationShipAction = globalActions
                 .getAction(RemoveRelationshipAction.class);
 
-        RemoveCallbackMethodAction rCallbackMethodAction = actionManager
+        RemoveCallbackMethodAction rCallbackMethodAction = globalActions
                 .getAction(RemoveCallbackMethodAction.class);
 
-        RemoveProcedureParameterAction rProcedureParamAction = actionManager
+        RemoveProcedureParameterAction rProcedureParamAction = globalActions
                 .getAction(RemoveProcedureParameterAction.class);
 
         if (content instanceof DataMap) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
index d06073c07..f76d6220b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
@@ -54,7 +54,7 @@ public class RemoveAttributeUndoableEdit extends BaseRemovePropertyUndoableEdit
 
     @Override
     public void redo() throws CannotRedoException {
-        RemoveAttributeAction action = actionManager.getAction(RemoveAttributeAction.class);
+        RemoveAttributeAction action = globalActions.getAction(RemoveAttributeAction.class);
 
         if (objEntity != null) {
             action.removeObjAttributes(objEntity, objAttributes);
@@ -74,7 +74,7 @@ public class RemoveAttributeUndoableEdit extends BaseRemovePropertyUndoableEdit
 
     @Override
     public void undo() throws CannotUndoException {
-        CreateAttributeAction action = actionManager.getAction(CreateAttributeAction.class);
+        CreateAttributeAction action = globalActions.getAction(CreateAttributeAction.class);
 
         if (objEntity != null) {
             for (ObjAttribute attr : objAttributes) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
index 367310bed..db76944f2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCallbackMethodUndoableEdit.java
@@ -44,7 +44,7 @@ public class RemoveCallbackMethodUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-    	RemoveCallbackMethodAction action = actionManager
+    	RemoveCallbackMethodAction action = globalActions
                 .getAction(RemoveCallbackMethodAction.class);
         for (ObjCallbackMethod method : methods) {
             action.removeCallbackMethod(callbackType, method.getName());
@@ -53,7 +53,7 @@ public class RemoveCallbackMethodUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-    	CreateCallbackMethodAction action = actionManager
+    	CreateCallbackMethodAction action = globalActions
                 .getAction(CreateCallbackMethodAction.class);
         for (ObjCallbackMethod method : methods) {
             action.createCallbackMethod(callbackType, method.getName());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
index a75a450fc..81bc813c3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
@@ -56,7 +56,7 @@ public class RemoveRelationshipUndoableEdit extends BaseRemovePropertyUndoableEd
 
     @Override
     public void redo() throws CannotRedoException {
-        RemoveRelationshipAction action = actionManager.getAction(RemoveRelationshipAction.class);
+        RemoveRelationshipAction action = globalActions.getAction(RemoveRelationshipAction.class);
         if (objEntity != null) {
             action.removeObjRelationships(objEntity, rels);
             focusObjEntity();
@@ -68,7 +68,7 @@ public class RemoveRelationshipUndoableEdit extends BaseRemovePropertyUndoableEd
 
     @Override
     public void undo() throws CannotUndoException {
-        CreateRelationshipAction action = actionManager.getAction(CreateRelationshipAction.class);
+        CreateRelationshipAction action = globalActions.getAction(CreateRelationshipAction.class);
         if (objEntity != null) {
             for (ObjRelationship r : rels) {
                 action.createObjRelationship(objEntity, r);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
index e878a54ef..2cd4c545c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
@@ -170,7 +170,7 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        RemoveAction action = actionManager.getAction(RemoveAction.class);
+        RemoveAction action = globalActions.getAction(RemoveAction.class);
 
         switch (this.mode) {
             case OBJECT_ENTITY:
@@ -203,7 +203,7 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
     @Override
     public void undo() throws CannotUndoException {
 
-        CreateRelationshipAction relationshipAction = actionManager.getAction(CreateRelationshipAction.class);
+        CreateRelationshipAction relationshipAction = globalActions.getAction(CreateRelationshipAction.class);
 
         switch (this.mode) {
             case OBJECT_ENTITY: {
@@ -213,7 +213,7 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
                         relationshipAction.createObjRelationship(objEntity, rel);
                     }
                 }
-                CreateObjEntityAction action = actionManager.getAction(CreateObjEntityAction.class);
+                CreateObjEntityAction action = globalActions.getAction(CreateObjEntityAction.class);
                 action.createObjEntity(map, objEntity);
                 break;
             }
@@ -224,7 +224,7 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
                         relationshipAction.createDbRelationship(dbEntity, rel);
                     }
                 }
-                CreateDbEntityAction action = actionManager.getAction(CreateDbEntityAction.class);
+                CreateDbEntityAction action = globalActions.getAction(CreateDbEntityAction.class);
                 action.createEntity(map, dbEntity);
                 break;
             }
@@ -235,12 +235,12 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
                         .getProjectController()
                         .getProject()
                         .getRootNode();
-                CreateQueryAction action = actionManager.getAction(CreateQueryAction.class);
+                CreateQueryAction action = globalActions.getAction(CreateQueryAction.class);
                 action.createQuery(domain, map, query);
                 break;
             }
             case PROCEDURE: {
-                CreateProcedureAction action = actionManager.getAction(CreateProcedureAction.class);
+                CreateProcedureAction action = globalActions.getAction(CreateProcedureAction.class);
                 action.createProcedure(map, procedure);
                 break;
             }
@@ -261,7 +261,7 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
                 break;
             }
             case EMBEDDABLE: {
-                CreateEmbeddableAction action = actionManager.getAction(CreateEmbeddableAction.class);
+                CreateEmbeddableAction action = globalActions.getAction(CreateEmbeddableAction.class);
                 action.createEmbeddable(map, embeddable);
                 break;
             }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java
index 2d1a60488..d211dbb76 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/UpdateValidationConfigUndoableEdit.java
@@ -41,7 +41,7 @@ public class UpdateValidationConfigUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void redo() throws CannotRedoException {
-        actionManager.getAction(UpdateValidationConfigAction.class)
+        globalActions.getAction(UpdateValidationConfigAction.class)
                 .putConfig(newConfig)
                 .setUndoable(false)
                 .performAction(this);
@@ -49,7 +49,7 @@ public class UpdateValidationConfigUndoableEdit extends CayenneUndoableEdit {
 
     @Override
     public void undo() throws CannotUndoException {
-        actionManager.getAction(UpdateValidationConfigAction.class)
+        globalActions.getAction(UpdateValidationConfigAction.class)
                 .putConfig(oldConfig)
                 .setUndoable(false)
                 .performAction(this);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
index 1dacf4d8b..f54c99a38 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ModelerUtil.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.gen.internal.Utils;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.action.ActionManager;
+import org.apache.cayenne.modeler.service.action.GlobalActions;
 import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
 import org.apache.cayenne.modeler.ui.action.MultipleObjectsAction;
 import org.apache.cayenne.modeler.pref.FSPath;
@@ -180,10 +180,10 @@ public final class ModelerUtil {
      * Updates MultipleObjectActions' state, depending on number of selected objects (attributes, rel etc.)
      */
     public static void updateActions(int numSelected, Class<? extends Action>... actions) {
-        ActionManager actionManager = Application.getInstance().getActionManager();
+        GlobalActions globalActions = Application.getInstance().getActionManager();
 
         for (Class<? extends Action> actionType : actions) {
-            Action action = actionManager.getAction(actionType);
+            Action action = globalActions.getAction(actionType);
 
             if (action instanceof MultipleObjectsAction) {
                 MultipleObjectsAction multiObjectAction = (MultipleObjectsAction) action;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
index 08180af73..e6d568dce 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
@@ -93,7 +93,7 @@ public class NameGeneratorPreferences {
 
     public ObjectNameGenerator createNamingStrategy(Application application) throws Exception {
 
-        return application.getClassLoadingService()
+        return application.getClassLoader()
                 .loadClass(ObjectNameGenerator.class, getLastUsedStrategies().get(0)).getDeclaredConstructor().newInstance();
     }
 
diff --git a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java
index 39952d02a..1c4170404 100644
--- a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java
+++ b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/CayenneModelerValidationIT.java
@@ -22,7 +22,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.reverse.configuration.ToolsModule;
 import org.apache.cayenne.di.DIBootstrap;
 import org.apache.cayenne.di.Injector;
-import org.apache.cayenne.modeler.validation.ConfigurableProjectValidator;
+import org.apache.cayenne.modeler.service.validator.ConfigurableProjectValidator;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.ProjectLoader;
 import org.apache.cayenne.project.ProjectModule;
diff --git a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/ui/action/CreateNodeActionTest.java
similarity index 95%
rename from modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java
rename to modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/ui/action/CreateNodeActionTest.java
index 75e209da9..8d499b701 100644
--- a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java
+++ b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/ui/action/CreateNodeActionTest.java
@@ -17,12 +17,11 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.action;
+package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.DataSourceDescriptor;
-import org.apache.cayenne.modeler.ui.action.CreateNodeAction;
 import org.junit.Test;
 
 import static org.junit.Assert.assertNotNull;