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/24 23:11:58 UTC

(cayenne) 01/04: Modeler refactoring

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 fddcc5d17f0b2ad8a1d7589c9882110291755849
Author: Andrus Adamchik <an...@objectstyle.com>
AuthorDate: Fri Apr 24 12:56:39 2026 -0400

    Modeler refactoring
---
 .../org/apache/cayenne/modeler/osx/OSXPanelUI.java |   6 +-
 .../org/apache/cayenne/modeler/Application.java    |  40 +++++--
 .../main/java/org/apache/cayenne/modeler/Main.java |  39 +------
 ...ayenneModelerModule.java => ModelerModule.java} |   5 +-
 .../apache/cayenne/modeler/ModelerPreferences.java |  37 ++-----
 .../apache/cayenne/modeler/action/FindAction.java  |   4 +-
 .../cayenne/modeler/action/NewProjectAction.java   |   4 +-
 .../cayenne/modeler/action/OpenProjectAction.java  |   6 +-
 .../cayenne/modeler/action/ProjectAction.java      |   4 +-
 .../cayenne/modeler/action/RevertAction.java       |   4 +-
 .../org/apache/cayenne/modeler/ui/MainToolBar.java |  89 +++++++++++++++
 ...delerController.java => ModelerController.java} |   8 +-
 ...{CayenneModelerFrame.java => ModelerFrame.java} | 121 +--------------------
 .../org/apache/cayenne/modeler/ui/SearchPanel.java |  66 +++++++++++
 .../cayenne/modeler/ui/errors/ErrorDialog.java     |   4 +-
 .../cayenne/modeler/ui/errors/WarningDialog.java   |   4 +-
 .../modeler/ui/project/ProjectController.java      |   6 +-
 .../graph/action/ShowGraphEntityAction.java        |   4 +-
 .../jdbc/JDBCDataSourceEditorController.java       |   4 +-
 .../duplicates/DuplicatedAttributesDialog.java     |   8 +-
 .../modeler/undo/JComboBoxUndoListener.java        |  30 ++---
 .../modeler/undo/JTextFieldUndoListener.java       |  23 ++--
 .../modeler/undo/JUndoableCheckBoxEdit.java        |   8 +-
 .../modeler/undo/RelationshipUndoableEdit.java     |  16 ++-
 .../undo/RemoveCallbackMethodUndoableEdit.java     |  10 +-
 .../cayenne/modeler/undo/TextCompoundEdit.java     |  55 +++++-----
 .../apache/cayenne/modeler/util/CayenneAction.java |   4 +-
 .../apache/cayenne/modeler/util/CayenneDialog.java |   8 +-
 .../apache/cayenne/modeler/util/CayenneTable.java  |  12 +-
 .../cayenne/modeler/util/ComboBoxAdapter.java      |  72 ------------
 .../cayenne/modeler/util/DefaultWidgetFactory.java |  19 ++--
 .../cayenne/pref/UpgradeCayennePreference.java     |  19 +---
 .../cayenne/swing/components/MainToolBar.java      |  50 ---------
 .../modeler/CayenneModelerValidationIT.java        |   3 +-
 34 files changed, 318 insertions(+), 474 deletions(-)

diff --git a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPanelUI.java b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPanelUI.java
index 244a9e65f..bbf00473d 100644
--- a/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPanelUI.java
+++ b/modeler/cayenne-modeler-mac-ext/src/main/java/org/apache/cayenne/modeler/osx/OSXPanelUI.java
@@ -27,7 +27,7 @@ import javax.swing.SwingUtilities;
 import javax.swing.plaf.ComponentUI;
 import javax.swing.plaf.basic.BasicPanelUI;
 
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.SearchPanel;
 
 /**
  * @since 4.0
@@ -65,8 +65,8 @@ public class OSXPanelUI extends BasicPanelUI {
     @Override
     protected void installDefaults(final JPanel p) {
         super.installDefaults(p);
-        if(p instanceof CayenneModelerFrame.SearchPanel) {
-            SwingUtilities.invokeLater(((CayenneModelerFrame.SearchPanel) p)::hideSearchLabel);
+        if(p instanceof SearchPanel) {
+            SwingUtilities.invokeLater(((SearchPanel) p)::hideSearchLabel);
         } else {
             p.setBackground(BACKGROUND);
         }
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 192ac00ab..0fefbfe62 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
@@ -24,10 +24,12 @@ import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 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.ModelerController;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsoleController;
 import org.apache.cayenne.modeler.ui.preferences.classpath.ClasspathPreferencesController;
-import org.apache.cayenne.modeler.ui.CayenneModelerController;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+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.util.WidgetFactory;
@@ -40,6 +42,7 @@ 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;
 import java.util.stream.Collectors;
@@ -63,7 +66,7 @@ public class Application {
 
     protected FileClassLoadingService modelerClassLoader;
     protected LogConsoleController logConsoleController;
-    protected CayenneModelerController frameController;
+    protected ModelerController frameController;
     protected String name;
     protected AdapterMapping adapterMapping;
     protected CayenneUndoManager undoManager;
@@ -90,8 +93,8 @@ public class Application {
     }
 
     // static methods that should probably go away eventually...
-    public static CayenneModelerFrame getFrame() {
-        return (CayenneModelerFrame) getInstance().getFrameController().getView();
+    public static ModelerFrame getFrame() {
+        return (ModelerFrame) getInstance().getFrameController().getView();
     }
 
     public Application() {
@@ -147,7 +150,7 @@ public class Application {
         return undoManager;
     }
 
-    public CayenneModelerController getFrameController() {
+    public ModelerController getFrameController() {
         return frameController;
     }
 
@@ -155,7 +158,7 @@ public class Application {
         return logConsoleController;
     }
 
-    public void startup() {
+    public void startup(File initialProject) {
         this.logConsoleController = new LogConsoleController(this);
 
         // init subsystems
@@ -164,7 +167,7 @@ public class Application {
 
         this.adapterMapping = new AdapterMapping();
         this.undoManager = new CayenneUndoManager(this);
-        this.frameController = new CayenneModelerController(this);
+        this.frameController = new ModelerController(this);
 
         // open up
         frameController.onStartup();
@@ -172,6 +175,14 @@ public class Application {
         // After prefs have been loaded, we can now show the console if needed
         logConsoleController.showConsoleIfNeeded();
         getFrame().setVisible(true);
+
+        if (initialProject == null) {
+            initialProject = initialProjectFromPreferences();
+        }
+
+        if (initialProject != null) {
+            getActionManager().getAction(OpenProjectAction.class).openProject(initialProject);
+        }
     }
 
     public CayenneProjectPreferences getCayenneProjectPreferences() {
@@ -244,4 +255,17 @@ public class Application {
     protected void initPreferences() {
         this.cayenneProjectPreferences = new CayenneProjectPreferences();
     }
+
+    private File initialProjectFromPreferences() {
+
+        Preferences autoLoadLastProject = getPreferencesNode(GeneralPreferencesController.class, "");
+        if ((autoLoadLastProject != null) && autoLoadLastProject.getBoolean(GeneralPreferencesController.AUTO_LOAD_PROJECT_PREFERENCE, false)) {
+            List<File> lastFiles = ModelerPreferences.getLastProjFiles();
+            if (!lastFiles.isEmpty()) {
+                return lastFiles.get(0);
+            }
+        }
+
+        return null;
+    }
 }
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 c404b619e..43d8e0a3e 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,20 +24,15 @@ 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.action.OpenProjectAction;
-import org.apache.cayenne.modeler.ui.preferences.general.GeneralPreferencesController;
-import org.apache.cayenne.modeler.init.CayenneModelerModule;
 import org.apache.cayenne.modeler.init.platform.PlatformInitializer;
 import org.apache.cayenne.project.ProjectModule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.swing.SwingUtilities;
+import javax.swing.*;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.List;
-import java.util.prefs.Preferences;
 
 /**
  * Main class responsible for starting CayenneModeler.
@@ -78,52 +73,26 @@ public class Main {
         LOGGER.info("JRE v." + System.getProperty("java.version") + " at " + System.getProperty("java.home"));
 
         SwingUtilities.invokeLater(() -> {
-
             Application application = injector.getInstance(Application.class);
             Application.setInstance(application);
-            application.startup();
-
-            // start initial project AFTER the app startup, as we need Application
-            // preferences to be bootstrapped.
-
-            File project = initialProjectFromArgs();
-            if (project == null) {
-                project = initialProjectFromPreferences();
-            }
-
-            if (project != null) {
-                new OpenProjectAction(application).openProject(project);
-            }
+            application.startup(initialProjectFromArgs());
         });
 
     }
 
     protected Collection<Module> appendModules(Collection<Module> modules) {
+
         // TODO: this is dirty... CoreModule is out of place inside the Modeler...
         // If we need CayenneRuntime for certain operations, those should start their own stack...
         modules.add(new CoreModule());
 
         modules.add(new ProjectModule());
         modules.add(new DbSyncModule());
-        modules.add(new CayenneModelerModule());
+        modules.add(new ModelerModule());
 
         return modules;
     }
 
-    protected File initialProjectFromPreferences() {
-
-        Preferences autoLoadLastProject = Application.getInstance().getPreferencesNode(GeneralPreferencesController.class, "");
-        if ((autoLoadLastProject != null)
-                && autoLoadLastProject.getBoolean(GeneralPreferencesController.AUTO_LOAD_PROJECT_PREFERENCE, false)) {
-            List<File> lastFiles = ModelerPreferences.getLastProjFiles();
-            if (!lastFiles.isEmpty()) {
-                return lastFiles.get(0);
-            }
-        }
-
-        return null;
-    }
-
     protected File initialProjectFromArgs() {
         if (args != null && args.length == 1) {
             File f = new File(args[0]);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
similarity index 95%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
index 0e9e9f68e..3b8f2148b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/init/CayenneModelerModule.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerModule.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.init;
+package org.apache.cayenne.modeler;
 
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.configuration.xml.DefaultDataChannelMetaData;
@@ -26,7 +26,6 @@ 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.Application;
 import org.apache.cayenne.modeler.action.ActionManager;
 import org.apache.cayenne.modeler.action.DefaultActionManager;
 import org.apache.cayenne.modeler.graph.extension.GraphExtension;
@@ -45,7 +44,7 @@ import org.xml.sax.XMLReader;
 /**
  * A DI module for bootstrapping CayenneModeler services.
  */
-public class CayenneModelerModule implements Module {
+public class ModelerModule implements Module {
 
     public void configure(Binder binder) {
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerPreferences.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerPreferences.java
index ce8b85b98..705835ab9 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerPreferences.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ModelerPreferences.java
@@ -29,37 +29,18 @@ import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.prefs.BackingStoreException;
-import java.util.prefs.PreferenceChangeEvent;
-import java.util.prefs.PreferenceChangeListener;
 import java.util.prefs.Preferences;
 
-/**
- * ModelerPreferences class supports persistent user preferences. Preferences are saved in
- * the user home directory in "<code>$HOME/.cayenne/modeler.preferences</code>" file.
- * <p>
- * <i>This class is obsolete; its users will be migrated to use preference service. </i>
- * </p>
- */
-public class ModelerPreferences implements PreferenceChangeListener {
-
-    private static Preferences cayennePrefs;
+public class ModelerPreferences {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ModelerPreferences.class);
 
-    /** Name of the log file. */
-    public static final String LOGFILE_NAME = "modeler.log";
-
-    /** List of the last 12 opened project files. */
-    public static final int LAST_PROJ_FILES_SIZE = 12;
-
-    /** Log file */
-    public static final String EDITOR_LOGFILE_ENABLED = "logfileEnabled";
-    public static final String EDITOR_LOGFILE = "logfile";
-
     /**
-     * Number of items in combobox visible without scrolling
+     * List of the last 12 opened project files.
      */
-    public static final int COMBOBOX_MAX_VISIBLE_SIZE = 12;
+    public static final int LAST_PROJ_FILES_SIZE = 12;
+
+    private static Preferences cayennePrefs;
 
     /**
      * Returns Cayenne preferences singleton.
@@ -68,7 +49,6 @@ public class ModelerPreferences implements PreferenceChangeListener {
         if (cayennePrefs == null) {
             Preference decoratedPref = new UpgradeCayennePreference(new CayennePreference());
             cayennePrefs = decoratedPref.getCayennePreference();
-            cayennePrefs.addPreferenceChangeListener(new ModelerPreferences());
         }
         return cayennePrefs;
     }
@@ -95,9 +75,9 @@ public class ModelerPreferences implements PreferenceChangeListener {
         List<File> lastProjectsFiles = new ArrayList<>(len);
         for (int i = 0; i < len; i++) {
             String fileName = filesPrefs.get(Integer.toString(i), "");
-            if(!fileName.isEmpty()) {
+            if (!fileName.isEmpty()) {
                 File file = new File(fileName);
-                if(!lastProjectsFiles.contains(file) && file.exists()) {
+                if (!lastProjectsFiles.contains(file) && file.exists()) {
                     lastProjectsFiles.add(file);
                 }
             }
@@ -105,7 +85,4 @@ public class ModelerPreferences implements PreferenceChangeListener {
         return lastProjectsFiles;
     }
 
-    public void preferenceChange(PreferenceChangeEvent evt) {
-        evt.getNode().put(evt.getKey(), evt.getNewValue());
-    }
 }
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 db5ea2508..1d6a4336c 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
@@ -40,7 +40,7 @@ import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.SQLTemplateDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.tree.ProjectTreeModel;
 import org.apache.cayenne.modeler.ui.project.tree.ProjectTreeView;
@@ -138,7 +138,7 @@ public class FindAction extends CayenneAction {
      * Navigate to search result
      */
     public static void jumpToResult(FindAction.SearchResultEntry searchResultEntry) {
-        ProjectView projectView = ((CayenneModelerFrame) Application.getInstance().getFrameController().getView()).getEditorPanel();
+        ProjectView projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView()).getEditorPanel();
         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/NewProjectAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/NewProjectAction.java
index 81f73fc61..2c466395d 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/action/NewProjectAction.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerController;
+import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
 import org.apache.cayenne.project.Project;
 
@@ -51,7 +51,7 @@ public class NewProjectAction extends ProjectAction {
     @Override
     public void performAction(ActionEvent e) {
 
-        CayenneModelerController controller = Application
+        ModelerController controller = Application
                 .getInstance()
                 .getFrameController();
         // Save and close (if needed) currently open project.
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 7b11698e7..3f3a190c8 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
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerController;
+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;
@@ -134,7 +134,7 @@ public class OpenProjectAction extends ProjectAction {
                 return;
             }
 
-            CayenneModelerController controller = Application.getInstance().getFrameController();
+            ModelerController controller = Application.getInstance().getFrameController();
             controller.addToLastProjListAction(file);
 
             URL url = file.toURI().toURL();
@@ -179,7 +179,7 @@ public class OpenProjectAction extends ProjectAction {
         }
     }
 
-    private Project openProjectResourse(Resource resource, CayenneModelerController controller) {
+    private Project openProjectResourse(Resource resource, ModelerController controller) {
         Project project = getApplication().getInjector().getInstance(ProjectLoader.class).loadProject(resource);
         controller.onProjectOpened(project);
         return project;
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/action/ProjectAction.java
index 9d26917d7..d2cf9ee57 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/action/ProjectAction.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.ui.CayenneModelerController;
+import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.unsavedchanges.UnsavedChangesDialog;
 import org.apache.cayenne.modeler.util.CayenneAction;
@@ -65,7 +65,7 @@ public class ProjectAction extends CayenneAction {
             return false;
         }
 
-        CayenneModelerController controller = Application
+        ModelerController controller = Application
                 .getInstance()
                 .getFrameController();
 
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/action/RevertAction.java
index 4ed77ac39..fb2fd7d1e 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/action/RevertAction.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.action;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerController;
+import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.Project;
 
@@ -43,7 +43,7 @@ public class RevertAction extends CayenneAction {
 
         boolean isNew = project.getConfigurationResource() == null;
 
-        CayenneModelerController controller = getApplication().getFrameController();
+        ModelerController controller = getApplication().getFrameController();
 
         // close ... don't use OpenProjectAction close method as it will ask for save, we don't want that here
         controller.onProjectClosed();
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
new file mode 100644
index 000000000..5e61dd09b
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainToolBar.java
@@ -0,0 +1,89 @@
+package org.apache.cayenne.modeler.ui;
+
+import org.apache.cayenne.modeler.action.*;
+
+import javax.swing.*;
+import javax.swing.border.Border;
+import java.awt.*;
+
+class MainToolBar extends JToolBar {
+
+    private final JButton backButton;
+    private final JButton removeButton;
+
+    public MainToolBar(ActionManager actionManager) {
+        setFloatable(false);
+
+        Dimension smallBtnDim = new Dimension(30, 30);
+        backButton = actionManager.getAction(NavigateBackwardAction.class).buildButton(1);
+        backButton.setMinimumSize(smallBtnDim);
+        backButton.setPreferredSize(smallBtnDim);
+        add(backButton);
+
+        JButton forwardButton = actionManager.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));
+
+        addSeparator();
+
+        removeButton = actionManager.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));
+
+        addSeparator();
+
+        add(actionManager.getAction(UndoAction.class).buildButton(1));
+        add(actionManager.getAction(RedoAction.class).buildButton(3));
+
+        addSeparator();
+
+        add(actionManager.getAction(CreateNodeAction.class).buildButton(1));
+        add(actionManager.getAction(CreateDataMapAction.class).buildButton(3));
+
+        addSeparator();
+
+        add(actionManager.getAction(CreateDbEntityAction.class).buildButton(1));
+        add(actionManager.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));
+
+        // is used to place search feature components the most right on a toolbar
+        add(new SearchPanel(actionManager.getAction(FindAction.class)));
+    }
+
+    int getDefaultButtonWidth() {
+        return removeButton.getUI().getPreferredSize(backButton).width;
+    }
+
+    @Override
+    public void setBorder(Border b) {
+        Object border = UIManager.get("MainToolBar.border");
+        if (border instanceof Border) {
+            super.setBorder((Border) border);
+        }
+    }
+
+    @Override
+    public void setBackground(Color bg) {
+        Object background = UIManager.get("MainToolBar.background");
+        if (background instanceof Color) {
+            super.setBackground((Color) background);
+        }
+    }
+}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/CayenneModelerController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
similarity index 97%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/CayenneModelerController.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
index 199332fcf..edbb1cb0f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/CayenneModelerController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerController.java
@@ -59,16 +59,16 @@ import java.util.prefs.Preferences;
 /**
  * Controller of the main application frame.
  */
-public class CayenneModelerController extends RootController {
+public class ModelerController extends RootController {
 
     private final ProjectController projectController;
-    private final CayenneModelerFrame view;
+    private final ModelerFrame view;
     private final DbImportController dbImportController;
 
-    public CayenneModelerController(Application application) {
+    public ModelerController(Application application) {
         super(application);
 
-        this.view = new CayenneModelerFrame(application.getActionManager(), application.getLogConsoleController());
+        this.view = new ModelerFrame(application.getActionManager(), application.getLogConsoleController());
         application.getInjector().getInstance(PlatformInitializer.class).setupMenus(view);
         this.projectController = new ProjectController(this);
         this.dbImportController = new DbImportController();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/CayenneModelerFrame.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
similarity index 70%
rename from modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/CayenneModelerFrame.java
rename to modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
index 2d49c091e..38dc59070 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/CayenneModelerFrame.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/ModelerFrame.java
@@ -27,7 +27,6 @@ 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.swing.components.MainToolBar;
 import org.apache.cayenne.swing.components.TopBorder;
 import org.slf4j.LoggerFactory;
 
@@ -36,14 +35,13 @@ import java.awt.*;
 import java.awt.event.ComponentAdapter;
 import java.awt.event.ComponentEvent;
 import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
 import java.util.ArrayList;
 import java.util.List;
 
 /**
  * Main frame of CayenneModeler GUI
  */
-public class CayenneModelerFrame extends JFrame {
+public class ModelerFrame extends JFrame {
 
     private final LogConsoleController logConsoleController;
     private final ActionManager actionManager;
@@ -57,7 +55,7 @@ public class CayenneModelerFrame extends JFrame {
     private JCheckBoxMenuItem logMenu;
     private Component dockComponent;
 
-    public CayenneModelerFrame(ActionManager actionManager, LogConsoleController logConsoleController) {
+    public ModelerFrame(ActionManager actionManager, LogConsoleController logConsoleController) {
         this.actionManager = actionManager;
         this.logConsoleController = logConsoleController;
         this.recentFileListeners = new ArrayList<>();
@@ -225,64 +223,11 @@ public class CayenneModelerFrame extends JFrame {
 
     protected void initToolbar() {
 
-        final JToolBar toolBar = new MainToolBar();
-
-        Dimension smallBtnDim = new Dimension(30, 30);
-        JButton backButton = actionManager.getAction(NavigateBackwardAction.class).buildButton(1);
-        backButton.setMinimumSize(smallBtnDim);
-        backButton.setPreferredSize(smallBtnDim);
-        toolBar.add(backButton);
-
-        JButton forwardButton = actionManager.getAction(NavigateForwardAction.class).buildButton(3);
-        forwardButton.setMinimumSize(smallBtnDim);
-        forwardButton.setPreferredSize(smallBtnDim);
-        toolBar.add(forwardButton);
-
-        toolBar.addSeparator(new Dimension(30, 0));
-
-        toolBar.add(actionManager.getAction(NewProjectAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(OpenProjectAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(SaveAction.class).buildButton(3));
-
-        toolBar.addSeparator();
-
-        JButton removeButton = actionManager.getAction(RemoveAction.class).buildButton();
-        toolBar.add(removeButton);
-
-        toolBar.addSeparator();
-
-        toolBar.add(actionManager.getAction(CutAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CopyAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(PasteAction.class).buildButton(3));
-
-        toolBar.addSeparator();
-
-        toolBar.add(actionManager.getAction(UndoAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(RedoAction.class).buildButton(3));
-
-        toolBar.addSeparator();
-
-        toolBar.add(actionManager.getAction(CreateNodeAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CreateDataMapAction.class).buildButton(3));
-
-        toolBar.addSeparator();
-
-        toolBar.add(actionManager.getAction(CreateDbEntityAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CreateProcedureAction.class).buildButton(3));
-
-        toolBar.addSeparator();
-
-        toolBar.add(actionManager.getAction(CreateObjEntityAction.class).buildButton(1));
-        toolBar.add(actionManager.getAction(CreateEmbeddableAction.class).buildButton(2));
-        toolBar.add(actionManager.getAction(CreateQueryAction.class).buildButton(3));
-
-        // is used to place search feature components the most right on a toolbar
-        toolBar.add(new SearchPanel());
-
+        MainToolBar toolBar = new MainToolBar(actionManager);
         getContentPane().add(toolBar, BorderLayout.NORTH);
 
         // Hide some buttons when frame is too small
-        final int defaultBtnWidth = removeButton.getUI().getPreferredSize(backButton).width;
+        int defaultBtnWidth = toolBar.getDefaultButtonWidth();
         addComponentListener(new ComponentAdapter() {
             private final int[] empty = {};
             private final int[] all = {6, 7, 8, 9, 10, 11, 12, 13, 14};
@@ -350,62 +295,4 @@ public class CayenneModelerFrame extends JFrame {
         }
     }
 
-    public class SearchPanel extends JPanel {
-
-        private final JLabel searchLabel;
-        private final JPanel box;
-        private final JTextField findField;
-
-        SearchPanel() {
-            super(new BorderLayout());
-            searchLabel = new JLabel("Search: ");
-            box = new JPanel();
-
-            findField = new JTextField(10);
-            findField.putClientProperty("JTextField.variant", "search");
-            findField.setMaximumSize(new Dimension(100, 22));
-            findField.setPreferredSize(new Dimension(100, 22));
-            findField.addKeyListener(new KeyListener() {
-                public void keyPressed(KeyEvent e) {
-                    if (e.getKeyCode() != KeyEvent.VK_ENTER) {
-                        findField.setBackground(Color.white);
-                    }
-                }
-
-                public void keyReleased(KeyEvent e) {
-                }
-
-                public void keyTyped(KeyEvent e) {
-                }
-            });
-            findField.setAction(actionManager.getAction(FindAction.class));
-
-            Toolkit.getDefaultToolkit().addAWTEventListener(event -> {
-                if (event instanceof KeyEvent) {
-                    if (((KeyEvent) event).getModifiersEx() == Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()
-                            && ((KeyEvent) event).getKeyCode() == KeyEvent.VK_F) {
-                        findField.requestFocus();
-                    }
-                }
-            }, AWTEvent.KEY_EVENT_MASK);
-
-            searchLabel.setLabelFor(findField);
-            // is used to place label and text field one after another
-            box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS));
-            box.add(searchLabel);
-            box.add(findField);
-
-            add(box, BorderLayout.EAST);
-        }
-
-        public void hideSearchLabel() {
-            searchLabel.setVisible(false);
-            findField.setMaximumSize(null);
-            findField.setPreferredSize(new Dimension(100, 40));
-            findField.setToolTipText("Search");
-            box.setOpaque(false);
-            box.setBackground(null);
-        }
-    }
-
 }
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
new file mode 100644
index 000000000..421f3d85b
--- /dev/null
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/SearchPanel.java
@@ -0,0 +1,66 @@
+package org.apache.cayenne.modeler.ui;
+
+import org.apache.cayenne.modeler.action.FindAction;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.KeyEvent;
+import java.awt.event.KeyListener;
+
+class SearchPanel extends JPanel {
+
+    private final JLabel searchLabel;
+    private final JPanel box;
+    private final JTextField findField;
+
+    public SearchPanel(FindAction findAction) {
+        super(new BorderLayout());
+        searchLabel = new JLabel("Search: ");
+        box = new JPanel();
+
+        findField = new JTextField(10);
+        findField.putClientProperty("JTextField.variant", "search");
+        findField.setMaximumSize(new Dimension(100, 22));
+        findField.setPreferredSize(new Dimension(100, 22));
+        findField.addKeyListener(new KeyListener() {
+            public void keyPressed(KeyEvent e) {
+                if (e.getKeyCode() != KeyEvent.VK_ENTER) {
+                    findField.setBackground(Color.white);
+                }
+            }
+
+            public void keyReleased(KeyEvent e) {
+            }
+
+            public void keyTyped(KeyEvent e) {
+            }
+        });
+        findField.setAction(findAction);
+
+        Toolkit.getDefaultToolkit().addAWTEventListener(event -> {
+            if (event instanceof KeyEvent) {
+                if (((KeyEvent) event).getModifiersEx() == Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()
+                        && ((KeyEvent) event).getKeyCode() == KeyEvent.VK_F) {
+                    findField.requestFocus();
+                }
+            }
+        }, AWTEvent.KEY_EVENT_MASK);
+
+        searchLabel.setLabelFor(findField);
+        // is used to place label and text field one after another
+        box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS));
+        box.add(searchLabel);
+        box.add(findField);
+
+        add(box, BorderLayout.EAST);
+    }
+
+    public void hideSearchLabel() {
+        searchLabel.setVisible(false);
+        findField.setMaximumSize(null);
+        findField.setPreferredSize(new Dimension(100, 40));
+        findField.setToolTipText("Search");
+        box.setOpaque(false);
+        box.setBackground(null);
+    }
+}
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 c23305860..fb590e28e 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
@@ -20,7 +20,7 @@
 
 package org.apache.cayenne.modeler.ui.errors;
 
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.util.CayenneDialog;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.PanelFactory;
@@ -45,7 +45,7 @@ class ErrorDialog extends CayenneDialog implements ActionListener {
     protected boolean detailed;
 
     public ErrorDialog(
-            CayenneModelerFrame owner,
+            ModelerFrame owner,
             String title,
             Throwable throwable,
             boolean detailed,
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/WarningDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/WarningDialog.java
index 6c5d47353..24747914e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/WarningDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/WarningDialog.java
@@ -19,13 +19,13 @@
 
 package org.apache.cayenne.modeler.ui.errors;
 
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 
 import java.awt.*;
 
 class WarningDialog extends ErrorDialog {
 
-    public WarningDialog(CayenneModelerFrame owner, String title, Throwable throwable, boolean detailed, boolean modal) throws HeadlessException {
+    public WarningDialog(ModelerFrame owner, String title, Throwable throwable, boolean detailed, boolean modal) throws HeadlessException {
         super(owner, title, throwable, detailed, modal);
     }
 
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 000a2c3f0..ba8cf6353 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,7 +66,7 @@ import org.apache.cayenne.modeler.mvc.ChildController;
 import org.apache.cayenne.modeler.pref.DataMapDefaults;
 import org.apache.cayenne.modeler.pref.DataNodeDefaults;
 import org.apache.cayenne.modeler.pref.ProjectStatePreferences;
-import org.apache.cayenne.modeler.ui.CayenneModelerController;
+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;
@@ -92,7 +92,7 @@ import java.util.prefs.Preferences;
 /**
  * A controller that works with the project tree, tracking selection and dispatching project events.
  */
-public class ProjectController extends ChildController<CayenneModelerController> {
+public class ProjectController extends ChildController<ModelerController> {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ProjectController.class);
 
@@ -106,7 +106,7 @@ public class ProjectController extends ChildController<CayenneModelerController>
     private EntityResolver entityResolver;
     private ProjectFileChangeTracker fileChangeTracker;
 
-    public ProjectController(CayenneModelerController parent) {
+    public ProjectController(ModelerController parent) {
         super(parent);
         this.listeners = new EventListenerList();
         this.state = new ControllerState();
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 0bcfe5c0c..e1774dd6e 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
@@ -24,7 +24,7 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
@@ -73,7 +73,7 @@ public class ShowGraphEntityAction extends CayenneAction {
 
     void showEntity(Entity<?,?,?> entity) {
         // we're always in same domain
-        ProjectView editor = ((CayenneModelerFrame) Application
+        ProjectView editor = ((ModelerFrame) Application
                 .getInstance()
                 .getFrameController()
                 .getView()).getEditorPanel();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourceEditorController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourceEditorController.java
index 9b432d5cc..0c3b44188 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourceEditorController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datanode/jdbc/JDBCDataSourceEditorController.java
@@ -21,7 +21,7 @@ package org.apache.cayenne.modeler.ui.project.editor.datanode.jdbc;
 
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.DataSourceDescriptor;
-import org.apache.cayenne.modeler.ui.CayenneModelerController;
+import org.apache.cayenne.modeler.ui.ModelerController;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.editor.datanode.DataSourceEditorController;
 import org.apache.cayenne.modeler.pref.DBConnectionInfo;
@@ -106,7 +106,7 @@ public class JDBCDataSourceEditorController extends DataSourceEditorController {
     }
 
     public void syncDataSourceAction() {
-        CayenneModelerController mainController = getApplication().getFrameController();
+        ModelerController mainController = getApplication().getFrameController();
 
         if (getNode() == null || getNode().getDataSourceDescriptor() == null) {
             return;
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 355ae73d4..f6d851504 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
@@ -24,7 +24,7 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.util.CayenneDialog;
 import org.apache.cayenne.modeler.util.CayenneTableModel;
@@ -66,8 +66,8 @@ public class DuplicatedAttributesDialog extends CayenneDialog {
     protected JButton cancelButton;
     protected JButton proceedButton;
 
-    public static void showDialog(CayenneModelerFrame editor, List<ObjAttribute> duplicatedAttributes,
-            ObjEntity superEntity, ObjEntity entity) {
+    public static void showDialog(ModelerFrame editor, List<ObjAttribute> duplicatedAttributes,
+                                  ObjEntity superEntity, ObjEntity entity) {
 
         if (instance == null) {
             instance = new DuplicatedAttributesDialog(editor);
@@ -81,7 +81,7 @@ public class DuplicatedAttributesDialog extends CayenneDialog {
         instance.setVisible(true);
     }
 
-    protected DuplicatedAttributesDialog(CayenneModelerFrame editor) {
+    protected DuplicatedAttributesDialog(ModelerFrame editor) {
         super(editor, "Duplicated Attributes", true);
 
         result = CANCEL_RESULT;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JComboBoxUndoListener.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JComboBoxUndoListener.java
index e41455816..444db109b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JComboBoxUndoListener.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JComboBoxUndoListener.java
@@ -18,19 +18,18 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.undo;
 
-import java.awt.event.ItemEvent;
-import java.awt.event.ItemListener;
+import org.apache.cayenne.modeler.Application;
 
-import javax.swing.JComboBox;
+import javax.swing.*;
 import javax.swing.undo.UndoManager;
-
-import org.apache.cayenne.modeler.Application;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
 
 public class JComboBoxUndoListener implements ItemListener {
 
     private Object deselectedItem;
-    private boolean isUserAction = true;
 
+    @Override
     public void itemStateChanged(ItemEvent e) {
         int stateChange = e.getStateChange();
 
@@ -39,22 +38,11 @@ public class JComboBoxUndoListener implements ItemListener {
                 deselectedItem = e.getItem();
                 break;
             case ItemEvent.SELECTED:
-                // don't add event to undo list, if it was just the default setting
-                if (isUserAction) {
-                    UndoManager undoManager = Application.getInstance().getUndoManager();
-                    undoManager.addEdit(new JComboBoxUndoableEdit((JComboBox) e
-                            .getSource(), deselectedItem, e.getItem(), this));
-                    
-                }
-                //set back to default value after the selecting new option
-                isUserAction = true;
+                // TODO: don't add event to undo list, if it was just the default setting?
+                UndoManager undoManager = Application.getInstance().getUndoManager();
+                undoManager.addEdit(new JComboBoxUndoableEdit((JComboBox) e
+                        .getSource(), deselectedItem, e.getItem(), this));
                 break;
-
         }
-
-    }
-
-    public void setIsUserAction(boolean isUserAction) {
-        this.isUserAction = isUserAction;
     }
 }
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 0df193fb7..08a9b3c6d 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
@@ -18,28 +18,24 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.undo;
 
-import java.awt.event.FocusAdapter;
-import java.awt.event.FocusEvent;
-import java.awt.event.KeyAdapter;
-import java.awt.event.KeyEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.TextAdapter;
 
-import javax.swing.event.DocumentEvent;
 import javax.swing.event.UndoableEditEvent;
 import javax.swing.event.UndoableEditListener;
-import javax.swing.text.AbstractDocument;
 import javax.swing.text.JTextComponent;
 import javax.swing.undo.CompoundEdit;
 import javax.swing.undo.UndoableEdit;
-
-import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.util.TextAdapter;
+import java.awt.event.FocusAdapter;
+import java.awt.event.FocusEvent;
+import java.awt.event.KeyAdapter;
+import java.awt.event.KeyEvent;
 
 public class JTextFieldUndoListener implements UndoableEditListener {
 
-    public CompoundEdit compoundEdit;
-
+    private final JTextComponent editor;
+    private CompoundEdit compoundEdit;
     private TextAdapter adapter;
-    private JTextComponent editor;
 
     private int lastOffset;
     private int lastLength;
@@ -53,7 +49,6 @@ public class JTextFieldUndoListener implements UndoableEditListener {
 
     public JTextFieldUndoListener(JTextComponent editor) {
         this.editor = editor;
-
         this.editor.addFocusListener(new FocusAdapter() {
 
             @Override
@@ -61,7 +56,6 @@ public class JTextFieldUndoListener implements UndoableEditListener {
                 finishCurrentEdit();
             }
         });
-
         this.editor.addKeyListener(new KeyAdapter() {
             @Override
             public void keyPressed(KeyEvent e) {
@@ -70,6 +64,7 @@ public class JTextFieldUndoListener implements UndoableEditListener {
         });
     }
 
+    @Override
     public void undoableEditHappened(UndoableEditEvent e) {
 
         if (compoundEdit == null || !compoundEdit.canUndo()) {
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 84c0b70b8..1c8b306a6 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
@@ -23,7 +23,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+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.query.SQLTemplate;
@@ -38,8 +38,8 @@ import java.awt.event.ActionListener;
 
 public class JUndoableCheckBoxEdit extends AbstractUndoableEdit {
 
-    private JCheckBox checkBox;
-    private ActionListener actionListener;
+    private final JCheckBox checkBox;
+    private final ActionListener actionListener;
     private JTabbedPane tabbedPane;
     private TreePath treePath;
     private Object targetObject;
@@ -56,7 +56,7 @@ public class JUndoableCheckBoxEdit extends AbstractUndoableEdit {
         this.actionListener = actionListener;
         this.isSelected = checkBox.isSelected();
 
-        projectView = ((CayenneModelerFrame) Application.getInstance().getFrameController().getView()).getEditorPanel();
+        projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView()).getEditorPanel();
 
         treePath = projectView.getProjectTreeView().getSelectionPath();
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
index d28f93f27..c97b200fb 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
@@ -18,9 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.undo;
 
-import javax.swing.undo.CannotRedoException;
-import javax.swing.undo.CannotUndoException;
-
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
@@ -31,14 +28,15 @@ import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 
-public class RelationshipUndoableEdit extends CayenneUndoableEdit {
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
 
-	private static final long serialVersionUID = -1864303176024098961L;
+public class RelationshipUndoableEdit extends CayenneUndoableEdit {
 
-	private Relationship<?,?,?> relationship;
-    private Relationship<?,?,?> prevRelationship;
-    private ProjectController projectController;
-    private boolean useDb;
+	private final Relationship<?,?,?> relationship;
+    private final Relationship<?,?,?> prevRelationship;
+    private final ProjectController projectController;
+    private final boolean useDb;
 
 	public RelationshipUndoableEdit(Relationship<?,?,?> relationship) {
 		this.projectController = Application.getInstance().getFrameController().getProjectController();
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 0add4717c..e64fbb25f 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,18 +18,18 @@
  ****************************************************************/
 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.project.editor.objentity.CallbackType;
 import org.apache.cayenne.modeler.ui.project.editor.objentity.ObjCallbackMethod;
 
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
 public class RemoveCallbackMethodUndoableEdit extends CayenneUndoableEdit {
 
-    private CallbackType callbackType;
-    private ObjCallbackMethod[] methods;
+    private final CallbackType callbackType;
+    private final ObjCallbackMethod[] methods;
 
     public RemoveCallbackMethodUndoableEdit(CallbackType callbackType,
     		ObjCallbackMethod[] methods) {
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 0532a496b..0b21fc144 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
@@ -18,24 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.undo;
 
-import javax.swing.JTabbedPane;
-import javax.swing.SwingUtilities;
-import javax.swing.event.DocumentEvent;
-import javax.swing.event.DocumentListener;
-import javax.swing.text.JTextComponent;
-import javax.swing.tree.DefaultMutableTreeNode;
-import javax.swing.tree.TreePath;
-import javax.swing.undo.CannotRedoException;
-import javax.swing.undo.CannotUndoException;
-import javax.swing.undo.CompoundEdit;
-
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+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;
@@ -43,23 +32,29 @@ import org.apache.cayenne.modeler.util.TextAdapter;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.SQLTemplate;
 
+import javax.swing.*;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
+import javax.swing.text.JTextComponent;
+import javax.swing.tree.DefaultMutableTreeNode;
+import javax.swing.tree.TreePath;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+import javax.swing.undo.CompoundEdit;
+
 public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
 
     private TextAdapter adapter;
-    private JTextComponent editor;
+    private final JTextComponent editor;
 
-    private TreePath treePath;
+    private final TreePath treePath;
     private int selectedTabIndex;
     private int selectedItem;
     private JTabbedPane tabbedPane;
 
     private Object targetObject;
 
-    private JTextFieldUndoListener listener;
-
-    public Object getTargetObject() {
-        return targetObject;
-    }
+    private final JTextFieldUndoListener listener;
 
     public TextCompoundEdit(TextAdapter adapter, JTextFieldUndoListener listener) {
         this(adapter.getComponent(), listener);
@@ -71,12 +66,12 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
         this.editor = editor;
         this.listener = listener;
 
-        ProjectView projectView = ((CayenneModelerFrame) Application.getInstance().getFrameController().getView())
+        ProjectView projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView())
                 .getEditorPanel();
 
         treePath = projectView.getProjectTreeView().getSelectionPath();
 
-        if(treePath != null) {
+        if (treePath != null) {
             DefaultMutableTreeNode newPath = (DefaultMutableTreeNode) treePath.getLastPathComponent();
             targetObject = newPath.getUserObject();
         }
@@ -122,7 +117,7 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
 
     private void restoreSelections() {
 
-        ProjectView projectView = ((CayenneModelerFrame) Application.getInstance().getFrameController().getView())
+        ProjectView projectView = ((ModelerFrame) Application.getInstance().getFrameController().getView())
                 .getEditorPanel();
 
         projectView.getProjectTreeView().getSelectionModel().setSelectionPath(treePath);
@@ -137,23 +132,24 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
     }
 
     public void insertUpdate(final DocumentEvent e) {
-        SwingUtilities.invokeLater(new Runnable() {
-
-            public void run() {
-                int offset = e.getOffset() + e.getLength();
-                offset = Math.min(offset, editor.getDocument().getLength());
-                editor.setCaretPosition(offset);
-            }
+        SwingUtilities.invokeLater(() -> {
+            int offset = e.getOffset() + e.getLength();
+            offset = Math.min(offset, editor.getDocument().getLength());
+            editor.setCaretPosition(offset);
         });
     }
 
+
+    @Override
     public void removeUpdate(DocumentEvent e) {
         editor.setCaretPosition(e.getOffset());
     }
 
+    @Override
     public void changedUpdate(DocumentEvent e) {
     }
 
+    @Override
     public boolean isInProgress() {
         return false;
     }
@@ -171,6 +167,7 @@ public class TextCompoundEdit extends CompoundEdit implements DocumentListener {
         editor.requestFocusInWindow();
     }
 
+    @Override
     public void undo() throws CannotUndoException {
         restoreSelections();
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java
index f612096d3..4633bccf5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java
@@ -22,7 +22,7 @@ package org.apache.cayenne.modeler.util;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.errors.ErrorsController;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
@@ -255,7 +255,7 @@ public abstract class CayenneAction extends AbstractAction {
     }
     
     protected static ProjectView editor() {
-        return ((CayenneModelerFrame) Application
+        return ((ModelerFrame) Application
                 .getInstance()
                 .getFrameController()
                 .getView()).getEditorPanel();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneDialog.java
index 0f0a8567c..3ed2e5b23 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneDialog.java
@@ -20,7 +20,7 @@
 package org.apache.cayenne.modeler.util;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.CayenneModelerFrame;
+import org.apache.cayenne.modeler.ui.ModelerFrame;
 import org.apache.cayenne.modeler.ui.project.ProjectController;
 
 import javax.swing.*;
@@ -57,7 +57,7 @@ public class CayenneDialog extends JDialog implements HyperlinkListener {
         super(owner, title, modal);
     }
 
-    public CayenneDialog(CayenneModelerFrame frame, String title, boolean modal) {
+    public CayenneDialog(ModelerFrame frame, String title, boolean modal) {
         super(frame, title, modal);
     }
 
@@ -97,8 +97,8 @@ public class CayenneDialog extends JDialog implements HyperlinkListener {
         ModelerUtil.centerWindow(getParentEditor(), this);
     }
 
-    public CayenneModelerFrame getParentEditor() {
-        return (CayenneModelerFrame) super.getParent();
+    public ModelerFrame getParentEditor() {
+        return (ModelerFrame) super.getParent();
     }
 
     /** 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
index 4d9fc2e8c..f72fc9e48 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTable.java
@@ -22,24 +22,16 @@ package org.apache.cayenne.modeler.util;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 
-import javax.swing.BorderFactory;
-import javax.swing.DefaultCellEditor;
-import javax.swing.DefaultListSelectionModel;
-import javax.swing.JTable;
-import javax.swing.JTextField;
-import javax.swing.UIManager;
+import javax.swing.*;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.TableModelEvent;
-import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.JTableHeader;
 import javax.swing.table.TableCellEditor;
-import javax.swing.table.TableColumn;
 import javax.swing.table.TableColumnModel;
 import javax.swing.table.TableModel;
 import javax.swing.text.JTextComponent;
-import java.awt.Color;
-import java.awt.Component;
+import java.awt.*;
 import java.util.EventObject;
 
 /**
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
deleted file mode 100644
index 7b0a8bd5a..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ComboBoxAdapter.java
+++ /dev/null
@@ -1,72 +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.undo.JComboBoxUndoListener;
-import org.apache.cayenne.validation.ValidationException;
-
-import javax.swing.JComboBox;
-import java.awt.event.ActionListener;
-
-/**
- * @since 4.1
- */
-public abstract class ComboBoxAdapter<T> {
-
-    private JComboBox<T> comboBox;
-    private ActionListener listener;
-
-    private JComboBoxUndoListener undoListener;
-
-    protected ComboBoxAdapter(JComboBox<T> comboBox) {
-        this.comboBox = comboBox;
-        listener = e -> updateModel();
-
-        undoListener = new JComboBoxUndoListener();
-
-        comboBox.addActionListener(listener);
-        comboBox.addItemListener(undoListener);
-    }
-
-    public void setItem(Object item) {
-        comboBox.removeActionListener(listener);
-        comboBox.removeItemListener(undoListener);
-
-        try{
-            comboBox.setSelectedItem(item);
-        }
-        finally {
-            comboBox.addActionListener(listener);
-            comboBox.addItemListener(undoListener);
-        }
-    }
-
-    public JComboBox<T> getComboBox() {
-        return comboBox;
-    }
-
-    /**
-     * Updates bound model with document text.
-     */
-    protected abstract void updateModel(T item) throws ValidationException;
-
-    public void updateModel() {
-        updateModel((T)comboBox.getSelectedItem());
-    }
-}
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java
index 9e2bd0bc5..2c304c249 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DefaultWidgetFactory.java
@@ -18,24 +18,23 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.util;
 
-import org.apache.cayenne.modeler.ModelerPreferences;
 import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
 import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 import org.apache.cayenne.modeler.util.combo.ComboBoxCellEditor;
 
-import javax.swing.BorderFactory;
-import javax.swing.DefaultCellEditor;
-import javax.swing.DefaultComboBoxModel;
-import javax.swing.JComboBox;
-import javax.swing.JTextField;
-import javax.swing.UIManager;
+import javax.swing.*;
 import javax.swing.table.TableCellEditor;
-import java.awt.Color;
+import java.awt.*;
 import java.util.Arrays;
 import java.util.Collection;
 
 public class DefaultWidgetFactory implements WidgetFactory {
 
+    /**
+     * Number of items in combobox visible without scrolling
+     */
+    private static final int COMBOBOX_MAX_VISIBLE_SIZE = 12;
+
     /**
      * Creates a new JComboBox with a collection of model objects.
      */
@@ -64,7 +63,7 @@ public class DefaultWidgetFactory implements WidgetFactory {
         JComboBox<T> comboBox = new JComboBox<>();
         comboBox.setFont(UIManager.getFont("Label.font"));
         comboBox.setBackground(Color.WHITE);
-        comboBox.setMaximumRowCount(ModelerPreferences.COMBOBOX_MAX_VISIBLE_SIZE);
+        comboBox.setMaximumRowCount(COMBOBOX_MAX_VISIBLE_SIZE);
         return comboBox;
     }
 
@@ -76,7 +75,7 @@ public class DefaultWidgetFactory implements WidgetFactory {
         JComboBox<T> comboBox = new JComboBox<>();
         comboBox.addItemListener(new JComboBoxUndoListener());
         comboBox.setBackground(Color.WHITE);
-        comboBox.setMaximumRowCount(ModelerPreferences.COMBOBOX_MAX_VISIBLE_SIZE);
+        comboBox.setMaximumRowCount(COMBOBOX_MAX_VISIBLE_SIZE);
         return comboBox;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/UpgradeCayennePreference.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/UpgradeCayennePreference.java
index 834f9621d..4b3bae0f4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/UpgradeCayennePreference.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/pref/UpgradeCayennePreference.java
@@ -18,6 +18,9 @@
  ****************************************************************/
 package org.apache.cayenne.pref;
 
+import org.apache.cayenne.modeler.ModelerPreferences;
+import org.apache.cayenne.modeler.util.CayenneUserDir;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -27,9 +30,6 @@ import java.util.Properties;
 import java.util.prefs.BackingStoreException;
 import java.util.prefs.Preferences;
 
-import org.apache.cayenne.modeler.ModelerPreferences;
-import org.apache.cayenne.modeler.util.CayenneUserDir;
-
 public class UpgradeCayennePreference extends PreferenceDecorator {
 
     /** Name of the preferences file. */
@@ -37,14 +37,6 @@ public class UpgradeCayennePreference extends PreferenceDecorator {
 
     public static final String LAST_PROJ_FILES_OLD = "Editor.lastSeveralProjectFiles";
 
-    /** GUI layout */
-    public static final String EDITOR_LAFNAME_OLD = "Editor.lookAndFeel";
-    public static final String EDITOR_THEMENAME_OLD = "Editor.theme";
-
-    /** Log file */
-    public static final String EDITOR_LOGFILE_ENABLED_OLD = "Editor.logfileEnabled";
-    public static final String EDITOR_LOGFILE_OLD = "Editor.logfile";
-
     public static final String DELIMITER = ",";
 
     public UpgradeCayennePreference(Preference delegate) {
@@ -64,11 +56,6 @@ public class UpgradeCayennePreference extends PreferenceDecorator {
 
                         Preferences prefEditor = Preferences.userRoot().node(CAYENNE_PREFERENCES_PATH).node(EDITOR);
 
-                        prefEditor.putBoolean(ModelerPreferences.EDITOR_LOGFILE_ENABLED,
-                                Boolean.valueOf(ep.getProperty(EDITOR_LOGFILE_ENABLED_OLD)));
-                        prefEditor.put(ModelerPreferences.EDITOR_LOGFILE,
-                                ep.getProperty(EDITOR_LOGFILE_OLD));
-
                         Preferences frefLastProjFiles = prefEditor.node(LAST_PROJ_FILES);
 
                         List<String> arr = getVector(ep.getProperty(LAST_PROJ_FILES_OLD));
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/MainToolBar.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/MainToolBar.java
deleted file mode 100644
index 200bc130d..000000000
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/MainToolBar.java
+++ /dev/null
@@ -1,50 +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.swing.components;
-
-import java.awt.Color;
-import javax.swing.JToolBar;
-import javax.swing.UIManager;
-import javax.swing.border.Border;
-
-/**
- * @since 4.0
- */
-public class MainToolBar extends JToolBar {
-    public MainToolBar() {
-        setFloatable(false);
-    }
-
-    @Override
-    public void setBorder(Border b) {
-        Object border = UIManager.get("MainToolBar.border");
-        if (border instanceof Border) {
-            super.setBorder((Border) border);
-        }
-    }
-
-    @Override
-    public void setBackground(Color bg) {
-        Object background = UIManager.get("MainToolBar.background");
-        if (background instanceof Color) {
-            super.setBackground((Color) background);
-        }
-    }
-}
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 e7aaad638..39952d02a 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,6 @@ 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.init.CayenneModelerModule;
 import org.apache.cayenne.modeler.validation.ConfigurableProjectValidator;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.ProjectLoader;
@@ -55,7 +54,7 @@ public class CayenneModelerValidationIT {
         injector = DIBootstrap.createInjector(List.of(
                 new ToolsModule(LOGGER),
                 new ProjectModule(),
-                new CayenneModelerModule()
+                new ModelerModule()
         ));
     }