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:38:00 UTC

(cayenne) 03/15: Modeler cleanup

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);
-    }
-}