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


The following commit(s) were added to refs/heads/master by this push:
     new 6e0419060 Modeler cleanup
6e0419060 is described below

commit 6e04190608df2d1f6b1c0b503d901aaf9ac2ab63
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sat Apr 18 15:45:47 2026 -0400

    Modeler cleanup
---
 .../cayenne/modeler/ProjectFileChangeTracker.java  |  38 ++--
 .../apache/cayenne/modeler/ProjectTreeView.java    | 138 ++++++------
 .../apache/cayenne/modeler/action/CopyAction.java  |   8 +-
 .../modeler/action/CopyAttributeAction.java        |   2 +-
 .../action/CopyAttributeRelationshipAction.java    |   6 +-
 .../modeler/action/CopyCallbackMethodAction.java   |   2 +-
 .../action/CopyProcedureParameterAction.java       |   2 +-
 .../modeler/action/CopyRelationshipAction.java     |   2 +-
 .../modeler/action/CreateAttributeAction.java      |  53 +++--
 .../modeler/action/CreateDataMapAction.java        |   4 +-
 .../modeler/action/CreateDbEntityAction.java       |  17 +-
 .../modeler/action/CreateEmbeddableAction.java     |  12 +-
 .../cayenne/modeler/action/CreateNodeAction.java   |   4 +-
 .../modeler/action/CreateObjEntityAction.java      |  21 +-
 .../modeler/action/CreateProcedureAction.java      |  14 +-
 .../action/CreateProcedureParameterAction.java     |   7 +-
 .../cayenne/modeler/action/RemoveAction.java       | 124 ++++++-----
 .../modeler/editor/ObjEntityAttributePanel.java    | 194 +++++++----------
 .../editor/ObjEntityAttributeRelationshipTab.java  |  68 +++---
 .../modeler/editor/ObjEntityRelationshipPanel.java | 235 ++++++++-------------
 .../modeler/event/ProjectOnSaveListener.java       |  14 +-
 .../cayenne/modeler/util/CayenneController.java    |   1 -
 22 files changed, 413 insertions(+), 553 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java
index 856f56109..6c0e9cfe8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectFileChangeTracker.java
@@ -18,16 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.modeler;
 
-import java.io.File;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.swing.JOptionPane;
-import javax.swing.SwingUtilities;
-
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
@@ -38,6 +28,14 @@ import org.apache.cayenne.project.Project;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.swing.*;
+import java.io.File;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
 /**
  * ProjectWatchdog class is responsible for tracking changes in cayenne.xml and
  * other Cayenne project files
@@ -56,15 +54,15 @@ public class ProjectFileChangeTracker extends Thread {
      * The names of the files to observe for changes.
      */
     protected final Map<URI, FileInfo> files;
-    protected final ProjectController mediator;
+    protected final ProjectController projectController;
 
     protected boolean paused;
     protected boolean isShownChangeDialog;
     protected boolean isShownRemoveDialog;
 
-    public ProjectFileChangeTracker(ProjectController mediator) {
+    public ProjectFileChangeTracker(ProjectController projectController) {
         this.files = new ConcurrentHashMap<>();
-        this.mediator = mediator;
+        this.projectController = projectController;
         setName("cayenne-modeler-file-change-tracker");
     }
 
@@ -77,7 +75,7 @@ public class ProjectFileChangeTracker extends Thread {
 
         removeAllFiles();
 
-        Project project = mediator.getProject();
+        Project project = projectController.getProject();
 
         // check if project exists and has been saved at least once.
         if (project != null && project.getConfigurationResource() != null) {
@@ -106,27 +104,27 @@ public class ProjectFileChangeTracker extends Thread {
                     + "Do you want to load the changes?")) {
 
                 // Currently we are reloading all project
-                if (mediator.getProject() != null) {
+                if (projectController.getProject() != null) {
                     File fileDirectory;
                     try {
-                        fileDirectory = new 
File(mediator.getProject().getConfigurationResource().getURL().toURI());
+                        fileDirectory = new 
File(projectController.getProject().getConfigurationResource().getURL().toURI());
                     } catch (URISyntaxException e) {
                         throw new CayenneRuntimeException("Unable to open 
project %s",
-                                e, 
mediator.getProject().getConfigurationResource().getURL());
+                                e, 
projectController.getProject().getConfigurationResource().getURL());
                     }
                     Application.getInstance().getActionManager()
                             .getAction(OpenProjectAction.class)
                             .openProject(fileDirectory);
                 }
             } else {
-                mediator.setDirty(true);
+                projectController.setDirty(true);
             }
             isShownChangeDialog = false;
         });
     }
 
     protected void doOnRemove() {
-        if (mediator.getProject() != null) {
+        if (projectController.getProject() != null) {
 
             SwingUtilities.invokeLater(() -> {
                 isShownRemoveDialog = true;
@@ -138,7 +136,7 @@ public class ProjectFileChangeTracker extends Thread {
                 } else if (dialog.shouldClose()) {
                     
Application.getInstance().getFrameController().projectClosedAction();
                 } else {
-                    mediator.setDirty(true);
+                    projectController.setDirty(true);
                 }
                 isShownRemoveDialog = false;
             });
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
index ae39b89fc..681009340 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
@@ -124,20 +124,20 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
     private static final Color SELECTION_COLOR = 
UIManager.getColor("Tree.selectionBackground");
 
-    protected ProjectController mediator;
+    protected ProjectController projectController;
     protected TreeSelectionListener treeSelectionListener;
     protected TreeWillExpandListener treeWillExpandListener;
     protected JPopupMenu popup;
-    private TreeDragSource tds;
+    private final TreeDragSource treeDragSource;
 
-    public ProjectTreeView(ProjectController mediator) {
+    public ProjectTreeView(ProjectController projectController) {
         super();
-        this.mediator = mediator;
+        this.projectController = projectController;
 
         initView();
         initController();
         initFromModel(Application.getInstance().getProject());
-        this.tds = new TreeDragSource(this, DnDConstants.ACTION_COPY, 
mediator);
+        this.treeDragSource = new TreeDragSource(this, 
DnDConstants.ACTION_COPY, projectController);
     }
 
     private void initView() {
@@ -179,7 +179,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
                             projectParentPath = createProjectPath(parentPath);
                         }
 
-                        mediator.fireMultipleObjectsDisplayEvent(new 
MultipleObjectsDisplayEvent(
+                        projectController.fireMultipleObjectsDisplayEvent(new 
MultipleObjectsDisplayEvent(
                                         this,
                                         projectPaths, projectParentPath));
                     } else if (paths.length == 1) {
@@ -225,24 +225,24 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
     }
 
        private void setupMediator() {
-               mediator.addDomainListener(this);
-        mediator.addDomainDisplayListener(this);
-        mediator.addDataNodeListener(this);
-        mediator.addDataNodeDisplayListener(this);
-        mediator.addDataMapListener(this);
-        mediator.addDataMapDisplayListener(this);
-        mediator.addObjEntityListener(this);
-        mediator.addObjEntityDisplayListener(this);
-        mediator.addDbEntityListener(this);
-        mediator.addDbEntityDisplayListener(this);
-        mediator.addEmbeddableDisplayListener(this);
-        mediator.addEmbeddableListener(this);
-        mediator.addProcedureListener(this);
-        mediator.addProcedureDisplayListener(this);
-        mediator.addQueryListener(this);
-        mediator.addQueryDisplayListener(this);
-        mediator.addMultipleObjectsDisplayListener(this);
-        mediator.getApplication().getActionManager().setupCutCopyPaste(
+               projectController.addDomainListener(this);
+        projectController.addDomainDisplayListener(this);
+        projectController.addDataNodeListener(this);
+        projectController.addDataNodeDisplayListener(this);
+        projectController.addDataMapListener(this);
+        projectController.addDataMapDisplayListener(this);
+        projectController.addObjEntityListener(this);
+        projectController.addObjEntityDisplayListener(this);
+        projectController.addDbEntityListener(this);
+        projectController.addDbEntityDisplayListener(this);
+        projectController.addEmbeddableDisplayListener(this);
+        projectController.addEmbeddableListener(this);
+        projectController.addProcedureListener(this);
+        projectController.addProcedureDisplayListener(this);
+        projectController.addQueryListener(this);
+        projectController.addQueryDisplayListener(this);
+        projectController.addMultipleObjectsDisplayListener(this);
+        
projectController.getApplication().getActionManager().setupCutCopyPaste(
                 this,
                 CutAction.class,
                 CopyAction.class);
@@ -411,7 +411,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
         DefaultMutableTreeNode node = getProjectModel().getNodeForObjectPath(
                 new Object[] {
-                        mediator.getProject().getRootNode(),
+                        projectController.getProject().getRootNode(),
                         e.getProcedure().getDataMap()
                 });
 
@@ -428,7 +428,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
     public void procedureChanged(ProcedureEvent e) {
         if (e.isNameChange()) {
             Object[] path = new Object[] {
-                    mediator.getProject().getRootNode(),
+                    projectController.getProject().getRootNode(),
                     e.getProcedure().getDataMap(), e.getProcedure()
             };
 
@@ -441,7 +441,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
     public void procedureRemoved(ProcedureEvent e) {
 
         removeNode(new Object[] {
-                mediator.getProject().getRootNode(),
+                projectController.getProject().getRootNode(),
                 e.getProcedure().getDataMap(), e.getProcedure()
         });
     }
@@ -452,7 +452,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
                 new Object[] {
                         e.getDomain() != null
                                 ? e.getDomain()
-                                : (DataChannelDescriptor) mediator
+                                : (DataChannelDescriptor) projectController
                                         .getProject()
                                         .getRootNode(), e.getDataMap()
                 });
@@ -473,7 +473,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
             Object[] path = new Object[] {
                     e.getDomain() != null
                             ? e.getDomain()
-                            : (DataChannelDescriptor) 
mediator.getProject().getRootNode(),
+                            : (DataChannelDescriptor) 
projectController.getProject().getRootNode(),
                     e.getQuery().getDataMap(), e.getQuery()
             };
 
@@ -485,7 +485,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
     public void queryRemoved(QueryEvent e) {
         removeNode(new Object[] {
-                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) mediator
+                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) projectController
                         .getProject()
                         .getRootNode(), e.getDataMap(), e.getQuery()
         });
@@ -512,7 +512,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
                 new Object[] {
                         e.getDomain() != null
                                 ? e.getDomain()
-                                : (DataChannelDescriptor) mediator
+                                : (DataChannelDescriptor) projectController
                                         .getProject()
                                         .getRootNode(), e.getDataNode()
                 });
@@ -527,7 +527,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
                 getProjectModel().nodeChanged(node);
 
-                DataChannelDescriptor domain = (DataChannelDescriptor) 
mediator.getProject().getRootNode();
+                DataChannelDescriptor domain = (DataChannelDescriptor) 
projectController.getProject().getRootNode();
 
                 // check for DataMap additions/removals...
                 String[] mapsName = 
e.getDataNode().getDataMapNames().toArray(new String[0]);
@@ -585,7 +585,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
                 new Object[] {
                     e.getDomain() != null
                             ? e.getDomain()
-                            : (DataChannelDescriptor) 
mediator.getProject().getRootNode()
+                            : (DataChannelDescriptor) 
projectController.getProject().getRootNode()
                 });
 
         if (node == null) {
@@ -604,7 +604,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
         }
 
         removeNode(new Object[] {
-                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) mediator
+                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) projectController
                         .getProject()
                         .getRootNode(), e.getDataNode()
         });
@@ -613,7 +613,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
     public void dataMapChanged(DataMapEvent e) {
 
         Object[] path = new Object[] {
-                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) mediator
+                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) projectController
                         .getProject()
                         .getRootNode(), e.getDataMap()
         };
@@ -621,7 +621,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
         updateNode(path);
 
         if (e.isNameChange()) {
-            mediator.updateEntityResolver();
+            projectController.updateEntityResolver();
             positionNode(path, Comparators.getDataDomainChildrenComparator());
             showNode(path);
         }
@@ -629,7 +629,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
     public void dataMapAdded(DataMapEvent e) {
         DataChannelDescriptor dataChannelDescriptor = e.getDomain() != null ? 
e.getDomain() :
-                (DataChannelDescriptor) mediator.getProject().getRootNode();
+                (DataChannelDescriptor) 
projectController.getProject().getRootNode();
         DefaultMutableTreeNode domainNode = 
getProjectModel().getNodeForObjectPath(
                 new Object[] {
                    dataChannelDescriptor
@@ -638,7 +638,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
         DefaultMutableTreeNode newMapNode = 
ProjectTreeFactory.wrapProjectNode(e
                 .getDataMap());
 
-        mediator.getEntityResolver().addDataMap(e.getDataMap());
+        projectController.getEntityResolver().addDataMap(e.getDataMap());
 
         positionNode(domainNode, newMapNode, Comparators
                 .getDataDomainChildrenComparator());
@@ -651,7 +651,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
         for (DataNodeDescriptor dataNode : new 
ArrayList<>(dataChannelDescriptor.getNodeDescriptors())) {
             for(String dataMapName : dataNode.getDataMapNames()) {
                 if(e.getDataMap().getName().equals(dataMapName)) {
-                    mediator.fireDataNodeEvent(new DataNodeEvent(this, 
dataNode));
+                    projectController.fireDataNodeEvent(new 
DataNodeEvent(this, dataNode));
                 }
             }
         }
@@ -667,7 +667,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
                 dataChannelDescriptor, map
         });
 
-        mediator.getEntityResolver().removeDataMap(e.getDataMap());
+        projectController.getEntityResolver().removeDataMap(e.getDataMap());
 
         // Clean up map from the nodes
         for (DataNodeDescriptor dataNode : new 
ArrayList<>(dataChannelDescriptor.getNodeDescriptors())) {
@@ -714,7 +714,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
             Object[] path = new Object[] {
                     e.getDomain() != null
                             ? e.getDomain()
-                            : (DataChannelDescriptor) 
mediator.getProject().getRootNode(),
+                            : (DataChannelDescriptor) 
projectController.getProject().getRootNode(),
                     e.getEntity().getDataMap(), e.getEntity()
             };
 
@@ -736,7 +736,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
                 new Object[] {
                         e.getDomain() != null
                                 ? e.getDomain()
-                                : (DataChannelDescriptor) mediator
+                                : (DataChannelDescriptor) projectController
                                         .getProject()
                                         .getRootNode(), 
e.getEntity().getDataMap()
                 });
@@ -761,7 +761,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
         // remove from DataMap tree
         removeNode(new Object[] {
-                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) mediator
+                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) projectController
                         .getProject()
                         .getRootNode(), e.getEntity().getDataMap(), 
e.getEntity()
         });
@@ -888,36 +888,36 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
         if (data.length == 0) {
             // this should clear the right-side panel
             DomainDisplayEvent domEvent = new DomainDisplayEvent(this, null);
-            domEvent.setDomain((DataChannelDescriptor) mediator
+            domEvent.setDomain((DataChannelDescriptor) projectController
                     .getProject()
                     .getRootNode());
-            mediator.fireDomainDisplayEvent(domEvent);
+            projectController.fireDomainDisplayEvent(domEvent);
             return;
         }
 
         Object obj = data[data.length - 1];
         if (obj instanceof DataChannelDescriptor) {
-            mediator.fireDomainDisplayEvent(new DomainDisplayEvent(
+            projectController.fireDomainDisplayEvent(new DomainDisplayEvent(
                     this,
                     (DataChannelDescriptor) obj));
         } else if (obj instanceof DataMap) {
             if (data.length == 2) {
-                mediator.fireDataMapDisplayEvent(new DataMapDisplayEvent(
+                projectController.fireDataMapDisplayEvent(new 
DataMapDisplayEvent(
                         this,
                         (DataMap) obj,
-                        (DataChannelDescriptor) 
mediator.getProject().getRootNode(),
+                        (DataChannelDescriptor) 
projectController.getProject().getRootNode(),
                         (DataNodeDescriptor) data[data.length - 2]));
             } else if (data.length == 1) {
-                mediator.fireDataMapDisplayEvent(new DataMapDisplayEvent(
+                projectController.fireDataMapDisplayEvent(new 
DataMapDisplayEvent(
                         this,
                         (DataMap) obj,
-                        (DataChannelDescriptor) 
mediator.getProject().getRootNode()));
+                        (DataChannelDescriptor) 
projectController.getProject().getRootNode()));
             }
         } else if (obj instanceof DataNodeDescriptor) {
             if (data.length == 1) {
-                mediator.fireDataNodeDisplayEvent(new DataNodeDisplayEvent(
+                projectController.fireDataNodeDisplayEvent(new 
DataNodeDisplayEvent(
                         this,
-                        (DataChannelDescriptor) 
mediator.getProject().getRootNode(),
+                        (DataChannelDescriptor) 
projectController.getProject().getRootNode(),
                         (DataNodeDescriptor) obj));
             }
         } else if (obj instanceof Entity) {
@@ -925,39 +925,39 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
             e.setUnselectAttributes(true);
             if (data.length == 3) {
                 e.setDataMap((DataMap) data[data.length - 2]);
-                e.setDomain((DataChannelDescriptor) 
mediator.getProject().getRootNode());
+                e.setDomain((DataChannelDescriptor) 
projectController.getProject().getRootNode());
                 e.setDataNode((DataNodeDescriptor) data[data.length - 3]);
             } else if (data.length == 2) {
                 e.setDataMap((DataMap) data[data.length - 2]);
-                e.setDomain((DataChannelDescriptor) 
mediator.getProject().getRootNode());
+                e.setDomain((DataChannelDescriptor) 
projectController.getProject().getRootNode());
             }
 
             if (obj instanceof ObjEntity) {
-                mediator.fireObjEntityDisplayEvent(e);
+                projectController.fireObjEntityDisplayEvent(e);
             } else if (obj instanceof DbEntity) {
-                mediator.fireDbEntityDisplayEvent(e);
+                projectController.fireDbEntityDisplayEvent(e);
             }
         } else if (obj instanceof Embeddable) {
             EmbeddableDisplayEvent e = new EmbeddableDisplayEvent(
                     this,
                     (Embeddable) obj,
                     (DataMap) data[data.length - 2],
-                    (DataChannelDescriptor) 
mediator.getProject().getRootNode());
-            mediator.fireEmbeddableDisplayEvent(e);
+                    (DataChannelDescriptor) 
projectController.getProject().getRootNode());
+            projectController.fireEmbeddableDisplayEvent(e);
         } else if (obj instanceof Procedure) {
             ProcedureDisplayEvent e = new ProcedureDisplayEvent(
                     this,
                     (Procedure) obj,
                     (DataMap) data[data.length - 2],
-                    (DataChannelDescriptor) 
mediator.getProject().getRootNode());
-            mediator.fireProcedureDisplayEvent(e);
+                    (DataChannelDescriptor) 
projectController.getProject().getRootNode());
+            projectController.fireProcedureDisplayEvent(e);
         } else if (obj instanceof QueryDescriptor) {
             QueryDisplayEvent e = new QueryDisplayEvent(
                     this,
                     (QueryDescriptor) obj,
                     (DataMap) data[data.length - 2],
-                    (DataChannelDescriptor) 
mediator.getProject().getRootNode());
-            mediator.fireQueryDisplayEvent(e);
+                    (DataChannelDescriptor) 
projectController.getProject().getRootNode());
+            projectController.fireQueryDisplayEvent(e);
         }
 
         this.scrollPathToVisible(path);
@@ -1039,7 +1039,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
      * @param actionType action type
      */
     private JMenuItem buildMenu(Class<? extends Action> actionType) {
-        CayenneAction action = (CayenneAction) mediator
+        CayenneAction action = (CayenneAction) projectController
                 .getApplication()
                 .getActionManager()
                 .getAction(actionType);
@@ -1093,7 +1093,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
                 new Object[] {
                         e.getDomain() != null
                                 ? e.getDomain()
-                                : (DataChannelDescriptor) mediator
+                                : (DataChannelDescriptor) projectController
                                         .getProject()
                                         .getRootNode(), map
                 });
@@ -1112,7 +1112,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
             Object[] path = new Object[] {
                     e.getDomain() != null
                             ? e.getDomain()
-                            : (DataChannelDescriptor) 
mediator.getProject().getRootNode(),
+                            : (DataChannelDescriptor) 
projectController.getProject().getRootNode(),
                     map, e.getEmbeddable()
             };
 
@@ -1129,7 +1129,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
         // remove from DataMap tree
         removeNode(new Object[] {
-                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) mediator
+                e.getDomain() != null ? e.getDomain() : 
(DataChannelDescriptor) projectController
                         .getProject()
                         .getRootNode(), map, e.getEmbeddable()
         });
@@ -1150,7 +1150,7 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
 
     // Filter all disabled actions in popupMenu, but skip Cut-Copy-Paste 
block. It should always exist.
     public void popupMenuFilter() {
-        Action cutAction = 
mediator.getApplication().getActionManager().getAction(CutAction.class);
+        Action cutAction = 
projectController.getApplication().getActionManager().getAction(CutAction.class);
         for (MenuElement element : popup.getSubElements()) {
             JMenuItem item = (JMenuItem) element;
             if (!item.getAction().equals(cutAction)) {
@@ -1161,8 +1161,8 @@ public class ProjectTreeView extends JTree implements 
DomainDisplayListener,
         }
     }
 
-    public TreeDragSource getTds() {
-        return tds;
+    public TreeDragSource getTreeDragSource() {
+        return treeDragSource;
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
index 906651c0e..3a600d995 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAction.java
@@ -81,9 +81,9 @@ public class CopyAction extends CayenneAction {
      */
     @Override
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
+        ProjectController controller = getProjectController();
 
-        Object content = copy(mediator);
+        Object content = copy(controller);
 
         if (content != null) {
             Clipboard sysClip = 
Toolkit.getDefaultToolkit().getSystemClipboard();
@@ -97,8 +97,8 @@ public class CopyAction extends CayenneAction {
     /**
      * Detects selected objects and returns them
      */
-    public Object copy(ProjectController mediator) {
-        return mediator.getCurrentObject();
+    public Object copy(ProjectController controller) {
+        return controller.getCurrentObject();
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeAction.java
index af22b6bfd..64feb1644 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeAction.java
@@ -68,7 +68,7 @@ public class CopyAttributeAction extends CopyAction 
implements MultipleObjectsAc
     }
 
     @Override
-    public Object copy(ProjectController mediator) {
+    public Object copy(ProjectController controller) {
         Object[] attrs = getProjectController().getCurrentObjAttributes();
         if (attrs == null || attrs.length == 0) {
             attrs = getProjectController().getCurrentDbAttributes();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
index 3dfbd40ab..3aa80edee 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyAttributeRelationshipAction.java
@@ -57,11 +57,11 @@ public class CopyAttributeRelationshipAction extends 
CopyAction implements Multi
         }
     }
 
-    public Object copy(ProjectController mediator) {
+    public Object copy(ProjectController controller) {
         if (currentSelectedPanel instanceof ObjEntityAttributePanel || 
currentSelectedPanel instanceof DbEntityAttributePanel) {
-            return copyAttributeAction.copy(mediator);
+            return copyAttributeAction.copy(controller);
         } else {
-            return copyRelationshipAction.copy(mediator);
+            return copyRelationshipAction.copy(controller);
         }
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
index 286f2bad3..168936f61 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyCallbackMethodAction.java
@@ -60,7 +60,7 @@ public class CopyCallbackMethodAction extends CopyAction 
implements MultipleObje
     }
 
     @Override
-    public Object copy(ProjectController mediator) {
+    public Object copy(ProjectController controller) {
         Object[] methods = getProjectController().getCurrentCallbackMethods();
 
         if (methods != null && methods.length > 0) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyProcedureParameterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyProcedureParameterAction.java
index d5c9f2ae7..e0f367459 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyProcedureParameterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyProcedureParameterAction.java
@@ -62,7 +62,7 @@ public class CopyProcedureParameterAction extends CopyAction 
implements Multiple
     }
     
     @Override
-    public Object copy(ProjectController mediator) {
+    public Object copy(ProjectController controller) {
         Object[] params = 
getProjectController().getCurrentProcedureParameters();
         
         if (params != null && params.length > 0) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyRelationshipAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyRelationshipAction.java
index e6733069c..a0b15e863 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyRelationshipAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CopyRelationshipAction.java
@@ -63,7 +63,7 @@ public class CopyRelationshipAction extends CopyAction 
implements MultipleObject
     }
 
     @Override
-    public Object copy(ProjectController mediator) {
+    public Object copy(ProjectController controller) {
         Object[] rels = getProjectController().getCurrentObjRelationships();
         if (rels == null || rels.length == 0) {
             rels = getProjectController().getCurrentDbRelationships();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
index a2a55c1e4..7271f11f7 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
@@ -48,43 +48,42 @@ import java.awt.event.ActionEvent;
 
 public class CreateAttributeAction extends CayenneAction {
 
-    static void fireEmbeddableAttributeEvent(Object src, ProjectController 
mediator, Embeddable embeddable,
-                                             EmbeddableAttribute attr) {
+    static void fireEmbeddableAttributeEvent(Object src, ProjectController 
controller, Embeddable embeddable, EmbeddableAttribute attr) {
 
-        mediator.fireEmbeddableAttributeEvent(new 
EmbeddableAttributeEvent(src, attr, embeddable, MapEvent.ADD));
+        controller.fireEmbeddableAttributeEvent(new 
EmbeddableAttributeEvent(src, attr, embeddable, MapEvent.ADD));
 
         EmbeddableAttributeDisplayEvent e = new 
EmbeddableAttributeDisplayEvent(src, embeddable, attr,
-                mediator.getCurrentDataMap(), (DataChannelDescriptor) 
mediator.getProject().getRootNode());
+                controller.getCurrentDataMap(), (DataChannelDescriptor) 
controller.getProject().getRootNode());
 
-        mediator.fireEmbeddableAttributeDisplayEvent(e);
+        controller.fireEmbeddableAttributeDisplayEvent(e);
     }
 
     /**
      * Fires events when an obj attribute was added
      */
-    static void fireObjAttributeEvent(Object src, ProjectController mediator, 
DataMap map, ObjEntity objEntity,
+    static void fireObjAttributeEvent(Object src, ProjectController 
controller, DataMap map, ObjEntity objEntity,
                                       ObjAttribute attr) {
 
-        mediator.fireObjAttributeEvent(new AttributeEvent(src, attr, 
objEntity, MapEvent.ADD));
+        controller.fireObjAttributeEvent(new AttributeEvent(src, attr, 
objEntity, MapEvent.ADD));
 
-        DataChannelDescriptor domain = (DataChannelDescriptor) 
mediator.getProject().getRootNode();
+        DataChannelDescriptor domain = (DataChannelDescriptor) 
controller.getProject().getRootNode();
 
         AttributeDisplayEvent ade = new AttributeDisplayEvent(src, attr, 
objEntity, map, domain);
 
-        mediator.fireObjAttributeDisplayEvent(ade);
+        controller.fireObjAttributeDisplayEvent(ade);
     }
 
     /**
      * Fires events when a db attribute was added
      */
-    static void fireDbAttributeEvent(Object src, ProjectController mediator, 
DataMap map, DbEntity dbEntity,
+    static void fireDbAttributeEvent(Object src, ProjectController controller, 
DataMap map, DbEntity dbEntity,
                                      DbAttribute attr) {
-        mediator.fireDbAttributeEvent(new AttributeEvent(src, attr, dbEntity, 
MapEvent.ADD));
+        controller.fireDbAttributeEvent(new AttributeEvent(src, attr, 
dbEntity, MapEvent.ADD));
 
         AttributeDisplayEvent ade = new AttributeDisplayEvent(src, attr, 
dbEntity, map,
-                (DataChannelDescriptor) mediator.getProject().getRootNode());
+                (DataChannelDescriptor) controller.getProject().getRootNode());
 
-        mediator.fireDbAttributeDisplayEvent(ade);
+        controller.fireDbAttributeDisplayEvent(ade);
     }
 
     public CreateAttributeAction(Application application) {
@@ -101,10 +100,10 @@ public class CreateAttributeAction extends CayenneAction {
      */
     @Override
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
+        ProjectController controller = getProjectController();
 
         if (getProjectController().getCurrentEmbeddable() != null) {
-            Embeddable embeddable = mediator.getCurrentEmbeddable();
+            Embeddable embeddable = controller.getCurrentEmbeddable();
 
             EmbeddableAttribute attr = new EmbeddableAttribute();
             attr.setName(NameBuilder
@@ -119,16 +118,16 @@ public class CreateAttributeAction extends CayenneAction {
 
         if (getProjectController().getCurrentObjEntity() != null) {
 
-            ObjEntity objEntity = mediator.getCurrentObjEntity();
+            ObjEntity objEntity = controller.getCurrentObjEntity();
 
             ObjAttribute attr = new ObjAttribute();
             attr.setName(NameBuilder.builder(attr, objEntity).name());
 
-            createObjAttribute(mediator.getCurrentDataMap(), objEntity, attr);
+            createObjAttribute(controller.getCurrentDataMap(), objEntity, 
attr);
 
             application.getUndoManager().addEdit(
-                    new CreateAttributeUndoableEdit((DataChannelDescriptor) 
mediator.getProject().getRootNode(),
-                            mediator.getCurrentDataMap(), objEntity, attr));
+                    new CreateAttributeUndoableEdit((DataChannelDescriptor) 
controller.getProject().getRootNode(),
+                            controller.getCurrentDataMap(), objEntity, attr));
         } else if (getProjectController().getCurrentDbEntity() != null) {
             DbEntity dbEntity = getProjectController().getCurrentDbEntity();
 
@@ -137,31 +136,27 @@ public class CreateAttributeAction extends CayenneAction {
             attr.setType(TypesMapping.NOT_DEFINED);
             attr.setEntity(dbEntity);
 
-            createDbAttribute(mediator.getCurrentDataMap(), dbEntity, attr);
+            createDbAttribute(controller.getCurrentDataMap(), dbEntity, attr);
 
             application.getUndoManager().addEdit(
-                    new CreateAttributeUndoableEdit((DataChannelDescriptor) 
mediator.getProject().getRootNode(),
-                            mediator.getCurrentDataMap(), dbEntity, attr));
+                    new CreateAttributeUndoableEdit((DataChannelDescriptor) 
controller.getProject().getRootNode(),
+                            controller.getCurrentDataMap(), dbEntity, attr));
         }
     }
 
     public void createEmbAttribute(Embeddable embeddable, EmbeddableAttribute 
attr) {
-        ProjectController mediator = getProjectController();
         embeddable.addAttribute(attr);
-        fireEmbeddableAttributeEvent(this, mediator, embeddable, attr);
+        fireEmbeddableAttributeEvent(this, getProjectController(), embeddable, 
attr);
     }
 
     public void createObjAttribute(DataMap map, ObjEntity objEntity, 
ObjAttribute attr) {
-
-        ProjectController mediator = getProjectController();
         objEntity.addAttribute(attr);
-        fireObjAttributeEvent(this, mediator, map, objEntity, attr);
+        fireObjAttributeEvent(this, getProjectController(), map, objEntity, 
attr);
     }
 
     public void createDbAttribute(DataMap map, DbEntity dbEntity, DbAttribute 
attr) {
         dbEntity.addAttribute(attr);
-        ProjectController mediator = getProjectController();
-        fireDbAttributeEvent(this, mediator, map, dbEntity, attr);
+        fireDbAttributeEvent(this, getProjectController(), map, dbEntity, 
attr);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
index 0e464f18e..541cfa484 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.undo.CreateDataMapUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
@@ -50,9 +49,8 @@ public class CreateDataMapAction extends CayenneAction {
     }
 
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
 
-        DataChannelDescriptor dataChannelDescriptor = (DataChannelDescriptor) 
mediator
+        DataChannelDescriptor dataChannelDescriptor = (DataChannelDescriptor) 
getProjectController()
                 .getProject()
                 .getRootNode();
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
index 5d6090a80..80c4d437c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
@@ -40,12 +40,12 @@ public class CreateDbEntityAction extends CayenneAction {
     /**
      * Fires events when a db entity was added
      */
-    static void fireDbEntityEvent(Object src, ProjectController mediator, 
DbEntity entity) {
-        mediator.fireDbEntityEvent(new EntityEvent(src, entity, MapEvent.ADD));
-        EntityDisplayEvent displayEvent = new EntityDisplayEvent(src, entity, 
mediator.getCurrentDataMap(),
-                mediator.getCurrentDataNode(), (DataChannelDescriptor) 
mediator.getProject().getRootNode());
+    static void fireDbEntityEvent(Object src, ProjectController controller, 
DbEntity entity) {
+        controller.fireDbEntityEvent(new EntityEvent(src, entity, 
MapEvent.ADD));
+        EntityDisplayEvent displayEvent = new EntityDisplayEvent(src, entity, 
controller.getCurrentDataMap(),
+                controller.getCurrentDataNode(), (DataChannelDescriptor) 
controller.getProject().getRootNode());
         displayEvent.setMainTabFocus(true);
-        mediator.fireDbEntityDisplayEvent(displayEvent);
+        controller.fireDbEntityDisplayEvent(displayEvent);
     }
 
     public CreateDbEntityAction(Application application) {
@@ -61,9 +61,7 @@ public class CreateDbEntityAction extends CayenneAction {
      * Creates new DbEntity, adds it to the current DataMap, fires 
DbEntityEvent and DbEntityDisplayEvent.
      */
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
-
-        DataMap map = mediator.getCurrentDataMap();
+        DataMap map = getProjectController().getCurrentDataMap();
         DbEntity entity = new DbEntity();
         entity.setName(NameBuilder.builder(entity, map).name());
         createEntity(map, entity);
@@ -76,11 +74,10 @@ public class CreateDbEntityAction extends CayenneAction {
      * DataMap.
      */
     public void createEntity(DataMap map, DbEntity entity) {
-        ProjectController mediator = getProjectController();
         entity.setCatalog(map.getDefaultCatalog());
         entity.setSchema(map.getDefaultSchema());
         map.addDbEntity(entity);
-        fireDbEntityEvent(this, mediator, entity);
+        fireDbEntityEvent(this, getProjectController(), entity);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
index 0a286d80a..e69c8f2a3 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
@@ -38,20 +38,20 @@ public class CreateEmbeddableAction extends CayenneAction {
 
     static void fireEmbeddableEvent(
             Object src,
-            ProjectController mediator,
+            ProjectController controller,
             DataMap dataMap,
             Embeddable embeddable) {
 
-        mediator.fireEmbeddableEvent(
+        controller.fireEmbeddableEvent(
                 new EmbeddableEvent(src, embeddable, MapEvent.ADD),
                 dataMap);
         EmbeddableDisplayEvent displayEvent = new EmbeddableDisplayEvent(
                 src,
                 embeddable,
                 dataMap,
-                (DataChannelDescriptor) mediator.getProject().getRootNode());
+                (DataChannelDescriptor) controller.getProject().getRootNode());
         displayEvent.setMainTabFocus(true);
-        mediator.fireEmbeddableDisplayEvent(displayEvent);
+        controller.fireEmbeddableDisplayEvent(displayEvent);
 
     }
 
@@ -66,9 +66,7 @@ public class CreateEmbeddableAction extends CayenneAction {
 
     @Override
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
-
-        DataMap dataMap = mediator.getCurrentDataMap();
+        DataMap dataMap = getProjectController().getCurrentDataMap();
 
         Embeddable embeddable = new Embeddable();
         String baseName = NameBuilder.builder(embeddable, dataMap).name();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
index 9faa7877d..494ee01ec 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
@@ -29,7 +29,6 @@ import 
org.apache.cayenne.configuration.runtime.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
 import org.apache.cayenne.modeler.undo.CreateNodeUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
@@ -74,8 +73,7 @@ public class CreateNodeAction extends CayenneAction {
      * any events.
      */
     public DataNodeDescriptor buildDataNode() {
-        ProjectController mediator = getProjectController();
-        DataChannelDescriptor domain = (DataChannelDescriptor) 
mediator.getProject().getRootNode();
+        DataChannelDescriptor domain = (DataChannelDescriptor) 
getProjectController().getProject().getRootNode();
 
         DataNodeDescriptor node = buildDataNode(domain);
         node.setDataSourceDescriptor(new DataSourceDescriptor());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
index 1955e30b1..08a057cff 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
@@ -47,18 +47,18 @@ public class CreateObjEntityAction extends CayenneAction {
 
     static void fireObjEntityEvent(
             Object src,
-            ProjectController mediator,
+            ProjectController controller,
             DataMap dataMap,
             ObjEntity entity) {
-        mediator.fireObjEntityEvent(new EntityEvent(src, entity, 
MapEvent.ADD));
+        controller.fireObjEntityEvent(new EntityEvent(src, entity, 
MapEvent.ADD));
         EntityDisplayEvent displayEvent = new EntityDisplayEvent(
                 src,
                 entity,
                 dataMap,
-                mediator.getCurrentDataNode(),
-                (DataChannelDescriptor) mediator.getProject().getRootNode());
+                controller.getCurrentDataNode(),
+                (DataChannelDescriptor) controller.getProject().getRootNode());
         displayEvent.setMainTabFocus(true);
-        mediator.fireObjEntityDisplayEvent(displayEvent);
+        controller.fireObjEntityDisplayEvent(displayEvent);
     }
 
     @Override
@@ -72,9 +72,9 @@ public class CreateObjEntityAction extends CayenneAction {
     }
 
     protected void createObjEntity() {
-        ProjectController mediator = getProjectController();
+        ProjectController controller = getProjectController();
 
-        DataMap dataMap = mediator.getCurrentDataMap();
+        DataMap dataMap = controller.getCurrentDataMap();
         ObjEntity entity = new ObjEntity();
         entity.setName(NameBuilder.builder(entity, dataMap).name());
 
@@ -82,7 +82,7 @@ public class CreateObjEntityAction extends CayenneAction {
         entity.setSuperClassName(dataMap.getDefaultSuperclass());
         entity.setDeclaredLockType(dataMap.getDefaultLockType());
 
-        DbEntity dbEntity = mediator.getCurrentDbEntity();
+        DbEntity dbEntity = controller.getCurrentDbEntity();
         if (dbEntity != null) {
             entity.setDbEntity(dbEntity);
 
@@ -105,15 +105,14 @@ public class CreateObjEntityAction extends CayenneAction {
         
merger.addEntityMergeListener(DeleteRuleUpdater.getEntityMergeListener());
         merger.synchronizeWithDbEntity(entity);
 
-        fireObjEntityEvent(this, mediator, dataMap, entity);
+        fireObjEntityEvent(this, controller, dataMap, entity);
 
         application.getUndoManager().addEdit(new 
CreateObjEntityUndoableEdit(dataMap, entity));
     }
 
     public void createObjEntity(DataMap dataMap, ObjEntity entity) {
-        ProjectController mediator = getProjectController();
         dataMap.addObjEntity(entity);
-        fireObjEntityEvent(this, mediator, dataMap, entity);
+        fireObjEntityEvent(this, getProjectController(), dataMap, entity);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
index 08e4ceeaf..baed944b2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
@@ -42,10 +42,10 @@ public class CreateProcedureAction extends CayenneAction {
     /**
      * Fires events when a procedure was added
      */
-    static void fireProcedureEvent(Object src, ProjectController mediator, 
DataMap dataMap, Procedure procedure) {
-        mediator.fireProcedureEvent(new ProcedureEvent(src, procedure, 
MapEvent.ADD));
-        mediator.fireProcedureDisplayEvent(new ProcedureDisplayEvent(src, 
procedure, mediator.getCurrentDataMap(),
-                (DataChannelDescriptor) mediator.getProject().getRootNode()));
+    static void fireProcedureEvent(Object src, ProjectController controller, 
DataMap dataMap, Procedure procedure) {
+        controller.fireProcedureEvent(new ProcedureEvent(src, procedure, 
MapEvent.ADD));
+        controller.fireProcedureDisplayEvent(new ProcedureDisplayEvent(src, 
procedure, controller.getCurrentDataMap(),
+                (DataChannelDescriptor) 
controller.getProject().getRootNode()));
     }
 
     public CreateProcedureAction(Application application) {
@@ -54,8 +54,7 @@ public class CreateProcedureAction extends CayenneAction {
 
     @Override
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
-        DataMap map = mediator.getCurrentDataMap();
+        DataMap map = getProjectController().getCurrentDataMap();
 
         Procedure procedure = new Procedure();
         procedure.setName(NameBuilder.builder(procedure, map).name());
@@ -65,11 +64,10 @@ public class CreateProcedureAction extends CayenneAction {
     }
 
     public void createProcedure(DataMap map, Procedure procedure) {
-        ProjectController mediator = getProjectController();
         procedure.setSchema(map.getDefaultSchema());
         procedure.setCatalog(map.getDefaultCatalog());
         map.addProcedure(procedure);
-        fireProcedureEvent(this, mediator, map, procedure);
+        fireProcedureEvent(this, getProjectController(), map, procedure);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
index f0d1f7051..4797b6b3e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
@@ -64,7 +64,7 @@ public class CreateProcedureParameterAction extends 
CayenneAction {
      */
     @Override
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
+        ProjectController controller = getProjectController();
 
         if (getProjectController().getCurrentProcedure() != null) {
             Procedure procedure = getProjectController().getCurrentProcedure();
@@ -75,7 +75,7 @@ public class CreateProcedureParameterAction extends 
CayenneAction {
 
             application.getUndoManager().addEdit(
                     new CreateProcedureParameterUndoableEdit(
-                            (DataChannelDescriptor) 
mediator.getProject().getRootNode(), mediator.getCurrentDataMap(),
+                            (DataChannelDescriptor) 
controller.getProject().getRootNode(), controller.getCurrentDataMap(),
                             procedure, parameter
                     )
             );
@@ -84,8 +84,7 @@ public class CreateProcedureParameterAction extends 
CayenneAction {
 
     public void createProcedureParameter(Procedure procedure, 
ProcedureParameter parameter) {
         procedure.addCallParameter(parameter);
-        ProjectController mediator = getProjectController();
-        fireProcedureParameterEvent(this, mediator, procedure, parameter);
+        fireProcedureParameterEvent(this, getProjectController(), procedure, 
parameter);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
index eb1e377a5..19bab3111 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
@@ -118,72 +118,72 @@ public class RemoveAction extends CayenneAction {
      */
     public void performAction(ActionEvent e, boolean allowAsking) {
 
-        ProjectController mediator = getProjectController();
+        ProjectController controller = getProjectController();
         ConfirmRemoveDialog dialog = getConfirmDeleteDialog(allowAsking);
         
-        if (mediator.getCurrentObjEntity() != null) {
-            if (dialog.shouldDelete("ObjEntity", 
mediator.getCurrentObjEntity().getName())) {
+        if (controller.getCurrentObjEntity() != null) {
+            if (dialog.shouldDelete("ObjEntity", 
controller.getCurrentObjEntity().getName())) {
 
                 application.getUndoManager()
-                        .addEdit(new 
RemoveUndoableEdit(mediator.getCurrentDataMap(), 
mediator.getCurrentObjEntity()));
-                removeObjEntity(mediator.getCurrentDataMap(), 
mediator.getCurrentObjEntity());
+                        .addEdit(new 
RemoveUndoableEdit(controller.getCurrentDataMap(), 
controller.getCurrentObjEntity()));
+                removeObjEntity(controller.getCurrentDataMap(), 
controller.getCurrentObjEntity());
             }
-        } else if (mediator.getCurrentDbEntity() != null) {
-            if (dialog.shouldDelete("DbEntity", 
mediator.getCurrentDbEntity().getName())) {
+        } else if (controller.getCurrentDbEntity() != null) {
+            if (dialog.shouldDelete("DbEntity", 
controller.getCurrentDbEntity().getName())) {
 
                 application.getUndoManager()
-                        .addEdit(new 
RemoveUndoableEdit(mediator.getCurrentDataMap(), 
mediator.getCurrentDbEntity()));
-                removeDbEntity(mediator.getCurrentDataMap(), 
mediator.getCurrentDbEntity());
+                        .addEdit(new 
RemoveUndoableEdit(controller.getCurrentDataMap(), 
controller.getCurrentDbEntity()));
+                removeDbEntity(controller.getCurrentDataMap(), 
controller.getCurrentDbEntity());
             }
-        } else if (mediator.getCurrentQuery() != null) {
-            if (dialog.shouldDelete("query", 
mediator.getCurrentQuery().getName())) {
+        } else if (controller.getCurrentQuery() != null) {
+            if (dialog.shouldDelete("query", 
controller.getCurrentQuery().getName())) {
 
                 application.getUndoManager()
-                        .addEdit(new 
RemoveUndoableEdit(mediator.getCurrentDataMap(), mediator.getCurrentQuery()));
-                removeQuery(mediator.getCurrentDataMap(), 
mediator.getCurrentQuery());
+                        .addEdit(new 
RemoveUndoableEdit(controller.getCurrentDataMap(), 
controller.getCurrentQuery()));
+                removeQuery(controller.getCurrentDataMap(), 
controller.getCurrentQuery());
             }
-        } else if (mediator.getCurrentProcedure() != null) {
-            if (dialog.shouldDelete("procedure", 
mediator.getCurrentProcedure().getName())) {
+        } else if (controller.getCurrentProcedure() != null) {
+            if (dialog.shouldDelete("procedure", 
controller.getCurrentProcedure().getName())) {
 
                 application.getUndoManager()
-                        .addEdit(new 
RemoveUndoableEdit(mediator.getCurrentDataMap(), 
mediator.getCurrentProcedure()));
-                removeProcedure(mediator.getCurrentDataMap(), 
mediator.getCurrentProcedure());
+                        .addEdit(new 
RemoveUndoableEdit(controller.getCurrentDataMap(), 
controller.getCurrentProcedure()));
+                removeProcedure(controller.getCurrentDataMap(), 
controller.getCurrentProcedure());
             }
-        } else if (mediator.getCurrentEmbeddable() != null) {
-            if (dialog.shouldDelete("embeddable", 
mediator.getCurrentEmbeddable().getClassName())) {
+        } else if (controller.getCurrentEmbeddable() != null) {
+            if (dialog.shouldDelete("embeddable", 
controller.getCurrentEmbeddable().getClassName())) {
 
                 application.getUndoManager()
-                        .addEdit(new 
RemoveUndoableEdit(mediator.getCurrentDataMap(), 
mediator.getCurrentEmbeddable()));
-                removeEmbeddable(mediator.getCurrentDataMap(), 
mediator.getCurrentEmbeddable());
+                        .addEdit(new 
RemoveUndoableEdit(controller.getCurrentDataMap(), 
controller.getCurrentEmbeddable()));
+                removeEmbeddable(controller.getCurrentDataMap(), 
controller.getCurrentEmbeddable());
             }
-        } else if (mediator.getCurrentDataMap() != null) {
-            if (dialog.shouldDelete("data map", 
mediator.getCurrentDataMap().getName())) {
+        } else if (controller.getCurrentDataMap() != null) {
+            if (dialog.shouldDelete("data map", 
controller.getCurrentDataMap().getName())) {
 
                 // In context of Data node just remove from Data Node
-                if (mediator.getCurrentDataNode() != null) {
+                if (controller.getCurrentDataNode() != null) {
                     application.getUndoManager()
-                            .addEdit(new RemoveUndoableEdit(application, 
mediator.getCurrentDataNode(),
-                                    mediator.getCurrentDataMap()));
-                    removeDataMapFromDataNode(mediator.getCurrentDataNode(), 
mediator.getCurrentDataMap());
+                            .addEdit(new RemoveUndoableEdit(application, 
controller.getCurrentDataNode(),
+                                    controller.getCurrentDataMap()));
+                    removeDataMapFromDataNode(controller.getCurrentDataNode(), 
controller.getCurrentDataMap());
                 } else {
                     // Not under Data Node, remove completely
                     application.getUndoManager()
-                            .addEdit(new RemoveUndoableEdit(application, 
mediator.getCurrentDataMap()));
-                    removeDataMap(mediator.getCurrentDataMap());
+                            .addEdit(new RemoveUndoableEdit(application, 
controller.getCurrentDataMap()));
+                    removeDataMap(controller.getCurrentDataMap());
                 }
             }
-        } else if (mediator.getCurrentDataNode() != null) {
-            if (dialog.shouldDelete("data node", 
mediator.getCurrentDataNode().getName())) {
+        } else if (controller.getCurrentDataNode() != null) {
+            if (dialog.shouldDelete("data node", 
controller.getCurrentDataNode().getName())) {
 
                 application.getUndoManager()
-                        .addEdit(new RemoveUndoableEdit(application, 
mediator.getCurrentDataNode()));
-                removeDataNode(mediator.getCurrentDataNode());
+                        .addEdit(new RemoveUndoableEdit(application, 
controller.getCurrentDataNode()));
+                removeDataNode(controller.getCurrentDataNode());
             }
-        } else if (mediator.getCurrentPaths() != null) { // multiple deletion
+        } else if (controller.getCurrentPaths() != null) { // multiple deletion
             if (dialog.shouldDelete("selected objects")) {
 
-                ConfigurationNode[] paths = mediator.getCurrentPaths();
-                ConfigurationNode parentPath = mediator.getCurrentParentPath();
+                ConfigurationNode[] paths = controller.getCurrentPaths();
+                ConfigurationNode parentPath = 
controller.getCurrentParentPath();
 
                 CompoundEdit compoundEdit = new RemoveCompoundUndoableEdit();
                 for (ConfigurationNode path : paths) {
@@ -193,20 +193,20 @@ public class RemoveAction extends CayenneAction {
 
                 application.getUndoManager().addEdit(compoundEdit);
             }
-        } else if(mediator.getCurrentCallbackMethods().length > 0) {
-            removeMethods(mediator, dialog, 
getProjectController().getCurrentCallbackMethods());
-        } else if(mediator.getCurrentObjRelationships().length > 0) {
-               removeObjRelationships(mediator, dialog, 
getProjectController().getCurrentObjRelationships());
-        } else if(mediator.getCurrentDbRelationships().length > 0) {
-               removeDBRelationships(mediator, dialog, 
getProjectController().getCurrentDbRelationships());
-        } else if(mediator.getCurrentObjAttributes().length > 0) {
-               removeObjAttributes(mediator, dialog, 
getProjectController().getCurrentObjAttributes());
-        } else if(mediator.getCurrentEmbAttributes().length > 0) {
-               removeEmbAttributes(mediator, dialog, 
getProjectController().getCurrentEmbAttributes());
-        } else if(mediator.getCurrentDbAttributes().length > 0) {
-               removeDbAttributes(mediator, dialog, 
getProjectController().getCurrentDbAttributes());
-        } else if(mediator.getCurrentProcedureParameters().length > 0) {
-               removeProcedureParameters(mediator.getCurrentProcedure(), 
mediator.getCurrentProcedureParameters());
+        } else if(controller.getCurrentCallbackMethods().length > 0) {
+            removeMethods(controller, dialog, 
getProjectController().getCurrentCallbackMethods());
+        } else if(controller.getCurrentObjRelationships().length > 0) {
+               removeObjRelationships(controller, dialog, 
getProjectController().getCurrentObjRelationships());
+        } else if(controller.getCurrentDbRelationships().length > 0) {
+               removeDBRelationships(controller, dialog, 
getProjectController().getCurrentDbRelationships());
+        } else if(controller.getCurrentObjAttributes().length > 0) {
+               removeObjAttributes(controller, dialog, 
getProjectController().getCurrentObjAttributes());
+        } else if(controller.getCurrentEmbAttributes().length > 0) {
+               removeEmbAttributes(controller, dialog, 
getProjectController().getCurrentEmbAttributes());
+        } else if(controller.getCurrentDbAttributes().length > 0) {
+               removeDbAttributes(controller, dialog, 
getProjectController().getCurrentDbAttributes());
+        } else if(controller.getCurrentProcedureParameters().length > 0) {
+               removeProcedureParameters(controller.getCurrentProcedure(), 
controller.getCurrentProcedureParameters());
         }
 
     }
@@ -265,12 +265,12 @@ public class RemoveAction extends CayenneAction {
        }
        }
 
-       private void removeDbAttributes(ProjectController mediator, 
ConfirmRemoveDialog dialog, DbAttribute[] dbAttrs) {
+       private void removeDbAttributes(ProjectController controller, 
ConfirmRemoveDialog dialog, DbAttribute[] dbAttrs) {
        if (dbAttrs != null && dbAttrs.length > 0) {
                if ((dbAttrs.length == 1 && dialog.shouldDelete("DbAttribute", 
dbAttrs[0].getName()))
                     || (dbAttrs.length > 1 && dialog.shouldDelete("selected 
DbAttributes"))) {
 
-                       DbEntity entity = mediator.getCurrentDbEntity();
+                       DbEntity entity = controller.getCurrentDbEntity();
 
                 application.getUndoManager()
                         .addEdit(new RemoveAttributeUndoableEdit(entity, 
dbAttrs));
@@ -278,42 +278,40 @@ public class RemoveAction extends CayenneAction {
                 for (DbAttribute attrib : dbAttrs) {
                     entity.removeAttribute(attrib.getName());
                     AttributeEvent e = new 
AttributeEvent(Application.getFrame(), attrib, entity, MapEvent.REMOVE);
-                    mediator.fireDbAttributeEvent(e);
+                    controller.fireDbAttributeEvent(e);
                 }
 
-                ProjectUtil.cleanObjMappings(mediator.getCurrentDataMap());
+                ProjectUtil.cleanObjMappings(controller.getCurrentDataMap());
                }
        }
     }
     
-    private void removeDBRelationships(ProjectController mediator, 
ConfirmRemoveDialog dialog,
-                                       DbRelationship[] dbRels) {
+    private void removeDBRelationships(ProjectController controller, 
ConfirmRemoveDialog dialog, DbRelationship[] dbRels) {
                if (dbRels != null && dbRels.length > 0) {
                        if ((dbRels.length == 1 && 
dialog.shouldDelete("DbRelationship", dbRels[0].getName()))
                                        || (dbRels.length > 1 && 
dialog.shouldDelete("selected DbRelationships"))) {
-                               DbEntity entity = mediator.getCurrentDbEntity();
+                               DbEntity entity = 
controller.getCurrentDbEntity();
                                
                                for (DbRelationship rel : dbRels) {
                                        
entity.removeRelationship(rel.getName());
                                        RelationshipEvent e = new 
RelationshipEvent(Application.getFrame(), rel, entity, MapEvent.REMOVE);
-                                       mediator.fireDbRelationshipEvent(e);
+                                       controller.fireDbRelationshipEvent(e);
                                }
 
-                               
ProjectUtil.cleanObjMappings(mediator.getCurrentDataMap());
+                               
ProjectUtil.cleanObjMappings(controller.getCurrentDataMap());
                                
Application.getInstance().getUndoManager().addEdit(new 
RemoveRelationshipUndoableEdit(entity, dbRels));
                        }
                }
        }
 
-       private void removeObjRelationships(ProjectController mediator, 
ConfirmRemoveDialog dialog,
-                                        ObjRelationship[] rels) {
+       private void removeObjRelationships(ProjectController controller, 
ConfirmRemoveDialog dialog, ObjRelationship[] rels) {
                if ((rels.length == 1 && dialog.shouldDelete("ObjRelationship", 
rels[0].getName()))
                                || (rels.length > 1 && 
dialog.shouldDelete("selected ObjRelationships"))) {
-                       ObjEntity entity = mediator.getCurrentObjEntity();
+                       ObjEntity entity = controller.getCurrentObjEntity();
                        for (ObjRelationship rel : rels) {
                                entity.removeRelationship(rel.getName());
                                RelationshipEvent e = new 
RelationshipEvent(Application.getFrame(), rel, entity, MapEvent.REMOVE);
-                               mediator.fireObjRelationshipEvent(e);
+                               controller.fireObjRelationshipEvent(e);
                        }
                        Application.getInstance().getUndoManager().addEdit(new 
RemoveRelationshipUndoableEdit(entity, rels));
                }               
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
index 5951e5aa8..27e16eaf8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributePanel.java
@@ -55,13 +55,12 @@ import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 
 import javax.swing.*;
 import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableCellEditor;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
 import java.awt.*;
-import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
@@ -75,42 +74,21 @@ import java.util.Map;
 /**
  * Detail view of the ObjEntity attributes.
  */
-public class ObjEntityAttributePanel extends JPanel implements 
ObjEntityDisplayListener,
-        ObjEntityListener, ObjAttributeListener, ProjectOnSaveListener {
+public class ObjEntityAttributePanel extends JPanel implements 
ObjEntityDisplayListener, ObjEntityListener, ObjAttributeListener, 
ProjectOnSaveListener {
 
     private static final ImageIcon INHERITANCE_ICON = 
ModelerUtil.buildIcon("icon-inheritance.png");
 
-    private ProjectController mediator;
-    private CayenneTable table;
-    private TableColumnPreferences tablePreferences;
-    private ObjEntityAttributeRelationshipTab parentPanel;
-    private boolean enabledResolve;//for JBottom "resolve" in 
ObjEntityAttrRelationshipTab
+    private final ProjectController controller;
+    private final ObjEntityAttributeRelationshipTab parentPanel;
 
-    private ActionListener resolver;
+    private final CayenneTable table;
+    private final TableColumnPreferences tablePreferences;
+    private final JMenuItem editMenu;
 
-    /**
-     * By now popup menu item is made similar to toolbar button. (i.e. all 
functionality
-     * is here) This should be probably refactored as Action.
-     */
-    private JMenuItem resolveMenu;
-
-    public ObjEntityAttributePanel(ProjectController mediator, 
ObjEntityAttributeRelationshipTab parentPanel) {
-        this.mediator = mediator;
+    public ObjEntityAttributePanel(ProjectController controller, 
ObjEntityAttributeRelationshipTab parentPanel) {
+        this.controller = controller;
         this.parentPanel = parentPanel;
 
-        initView();
-        initController();
-    }
-
-    public CayenneTable getTable() {
-        return table;
-    }
-
-    public void setTable(CayenneTable table) {
-        this.table = table;
-    }
-
-    private void initView() {
         this.setLayout(new BorderLayout());
 
         ActionManager actionManager = 
Application.getInstance().getActionManager();
@@ -127,10 +105,10 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
             public void mouseReleased(MouseEvent e) {
                 int row = table.rowAtPoint(e.getPoint());
                 int col = table.columnAtPoint(e.getPoint());
-                ObjAttribute objAttribute = 
((ObjAttributeTableModel)table.getModel()).getAttribute(row).getValue();
+                ObjAttribute objAttribute = ((ObjAttributeTableModel) 
table.getModel()).getAttribute(row).getValue();
                 int columnFromModel = 
table.getColumnModel().getColumn(col).getModelIndex();
                 if (row >= 0 && columnFromModel == 
ObjAttributeTableModel.OBJ_ATTRIBUTE) {
-                    if(objAttribute.isInherited()) {
+                    if (objAttribute.isInherited()) {
                         TableCellRenderer renderer = 
table.getCellRenderer(row, col);
                         Rectangle rectangle = table.getCellRect(row, col, 
false);
                         ((CellRenderer) renderer).mouseClicked(e, rectangle.x);
@@ -141,10 +119,10 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
 
         // Create and install a popup
         Icon ico = ModelerUtil.buildIcon("icon-edit.png");
-        this.resolveMenu = new JMenuItem("Edit Attribute", ico);
+        this.editMenu = new JMenuItem("Edit Attribute", ico);
 
         JPopupMenu popup = new JPopupMenu();
-        popup.add(resolveMenu);
+        popup.add(editMenu);
         
popup.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
 
         popup.addSeparator();
@@ -154,48 +132,31 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
 
         TablePopupHandler.install(table, popup);
         add(PanelFactory.createTablePanel(table, null), BorderLayout.CENTER);
-    }
 
-    private void initController() {
-        mediator.addObjEntityDisplayListener(this);
-        mediator.addObjEntityListener(this);
-        mediator.addObjAttributeListener(this);
+        controller.addObjEntityDisplayListener(this);
+        controller.addObjEntityListener(this);
+        controller.addObjAttributeListener(this);
 
-        resolver = e -> {
-            int row = table.getSelectedRow();
-            if (row < 0) {
-                return;
-            }
-
-            ObjAttributeTableModel model = (ObjAttributeTableModel) 
table.getModel();
-
-            // ... show dialog...
-            new ObjAttributeInfoDialog(mediator, row, model).startupAction();
-
-            // This is required for a table to be updated properly
-            table.cancelEditing();
-
-            // need to refresh selected row... do this by 
unselecting/selecting the row
-            table.getSelectionModel().clearSelection();
-            table.select(row);
-            enabledResolve = false;
-        };
-        resolveMenu.addActionListener(resolver);
+        editMenu.addActionListener(this::edit);
 
-        table.getSelectionModel().addListSelectionListener(new 
ObjAttributeListSelectionListener());
+        table.getSelectionModel().addListSelectionListener(this::valueChanged);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
-        mediator.getApplication().getActionManager().setupCutCopyPaste(
+        controller.getApplication().getActionManager().setupCutCopyPaste(
                 table,
                 CutAttributeRelationshipAction.class,
                 CopyAttributeRelationshipAction.class);
     }
 
+    public CayenneTable getTable() {
+        return table;
+    }
+
     public void initComboBoxes() {
         List<String> embeddableNames = new ArrayList<>();
         List<String> typeNames = new ArrayList<>();
 
-        for (DataMap dataMap : ((DataChannelDescriptor) 
mediator.getProject().getRootNode()).getDataMaps()) {
+        for (DataMap dataMap : ((DataChannelDescriptor) 
controller.getProject().getRootNode()).getDataMaps()) {
             for (Embeddable emb : dataMap.getEmbeddables()) {
                 embeddableNames.add(emb.getClassName());
             }
@@ -235,8 +196,7 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
 
         table.select(newSel);
 
-        parentPanel.getResolve().removeActionListener(getResolver());
-        parentPanel.getResolve().addActionListener(getResolver());
+        parentPanel.rebindEditButton("Edit Attribute", this::edit);
     }
 
     public void objAttributeChanged(AttributeEvent e) {
@@ -309,7 +269,7 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
         Collection<ObjEntity> objEntities = 
ProjectUtil.getCollectionOfChildren((ObjEntity) e.getEntity());
 
 
-        for (ObjEntity objEntity: objEntities) {
+        for (ObjEntity objEntity : objEntities) {
             if (objEntity.getDeclaredAttribute(e.getAttribute().getName()) != 
null) {
 
                 JOptionPane pane = new JOptionPane(
@@ -358,14 +318,14 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
             TableCellEditor cellEditor = 
table.getCellEditor(table.getEditingRow(), table.getEditingColumn());
             cellEditor.stopCellEditing();
         }
-        ObjAttributeTableModel model = new ObjAttributeTableModel(entity, 
mediator, this);
+        ObjAttributeTableModel model = new ObjAttributeTableModel(entity, 
controller, this);
         table.setModel(model);
         table.setRowHeight(25);
         table.setRowMargin(3);
         setUpTableStructure();
     }
 
-    protected void setUpTableStructure() {
+    private void setUpTableStructure() {
         Map<Integer, Integer> minSizes = new HashMap<>();
         minSizes.put(ObjAttributeTableModel.OBJ_ATTRIBUTE, 150);
 
@@ -415,7 +375,7 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
     }
 
     // custom renderer used for inherited attributes highlighting
-    final class CellRenderer extends DefaultTableCellRenderer {
+    static final class CellRenderer extends DefaultTableCellRenderer {
 
         @Override
         public Component getTableCellRendererComponent(
@@ -444,20 +404,20 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
                 Font font = getFont();
                 Font newFont = font.deriveFont(Font.ITALIC);
                 setFont(newFont);
-                if(column == ObjAttributeTableModel.OBJ_ATTRIBUTE) {
+                if (column == ObjAttributeTableModel.OBJ_ATTRIBUTE) {
                     setIcon(INHERITANCE_ICON);
                 }
             }
 
             setFont(UIManager.getFont("Label.font"));
-            setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+            setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
 
             return this;
         }
 
         public void mouseClicked(MouseEvent event, int x) {
             Point point = event.getPoint();
-            if(point.x - x <= INHERITANCE_ICON.getIconWidth()) {
+            if (point.x - x <= INHERITANCE_ICON.getIconWidth()) {
                 ActionManager actionManager = 
Application.getInstance().getActionManager();
                 
actionManager.getAction(ObjEntityToSuperEntityAction.class).performAction(null);
             }
@@ -477,59 +437,61 @@ public class ObjEntityAttributePanel extends JPanel 
implements ObjEntityDisplayL
         resetTableModel();
     }
 
-    private class ObjAttributeListSelectionListener implements 
ListSelectionListener {
+    private void edit(ActionEvent e) {
+        int row = table.getSelectedRow();
+        if (row < 0) {
+            return;
+        }
 
-        public void valueChanged(ListSelectionEvent e) {
-            ObjAttribute[] attrs = new ObjAttribute[0];
+        ObjAttributeTableModel model = (ObjAttributeTableModel) 
table.getModel();
 
-            if (!e.getValueIsAdjusting() && !((ListSelectionModel) 
e.getSource()).isSelectionEmpty()) {
+        // ... show dialog...
+        new ObjAttributeInfoDialog(controller, row, model).startupAction();
 
-                
parentPanel.getRelationshipPanel().getTable().getSelectionModel().clearSelection();
-                if 
(parentPanel.getRelationshipPanel().getTable().getCellEditor() != null) {
-                    
parentPanel.getRelationshipPanel().getTable().getCellEditor().stopCellEditing();
-                }
-                
Application.getInstance().getActionManager().getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getAttributePanel());
-                
Application.getInstance().getActionManager().getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getAttributePanel());
-                
Application.getInstance().getActionManager().getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getAttributePanel());
-                
parentPanel.getResolve().removeActionListener(parentPanel.getRelationshipPanel().getResolver());
-                parentPanel.getResolve().removeActionListener(getResolver());
-                parentPanel.getResolve().addActionListener(getResolver());
-                parentPanel.getResolve().setToolTipText("Edit Attribute");
-                parentPanel.getResolve().setEnabled(true);
-
-                if (table.getSelectedRow() >= 0) {
-                    ObjAttributeTableModel model = (ObjAttributeTableModel) 
table.getModel();
-
-                    int[] sel = table.getSelectedRows();
-                    attrs = new ObjAttribute[sel.length];
-
-                    for (int i = 0; i < sel.length; i++) {
-                        attrs[i] = model.getAttribute(sel[i]).getValue();
-                    }
+        // This is required for a table to be updated properly
+        table.cancelEditing();
 
-                    if (sel.length == 1) {
-                        UIUtil.scrollToSelectedRow(table);
-                    }
+        // need to refresh selected row... do this by unselecting/selecting 
the row
+        table.getSelectionModel().clearSelection();
+        table.select(row);
+    }
 
-                    enabledResolve = true;
-                } else {
-                    enabledResolve = false;
-                }
-                resolveMenu.setEnabled(enabledResolve);
+    private void valueChanged(ListSelectionEvent e) {
+        ObjAttribute[] attrs = new ObjAttribute[0];
+
+        if (!e.getValueIsAdjusting() && !((ListSelectionModel) 
e.getSource()).isSelectionEmpty()) {
+
+            
parentPanel.getRelationshipPanel().getTable().getSelectionModel().clearSelection();
+            if (parentPanel.getRelationshipPanel().getTable().getCellEditor() 
!= null) {
+                
parentPanel.getRelationshipPanel().getTable().getCellEditor().stopCellEditing();
             }
 
-            mediator.setCurrentObjAttributes(attrs);
-            parentPanel.updateActions(attrs);
-        }
-    }
+            ActionManager actionManager = 
Application.getInstance().getActionManager();
+            
actionManager.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getAttributePanel());
+            
actionManager.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getAttributePanel());
+            
actionManager.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getAttributePanel());
 
-    public boolean isEnabledResolve() {
-        return enabledResolve;
-    }
+            parentPanel.rebindEditButton("Edit Attribute", this::edit);
 
-    public ActionListener getResolver() {
-        return resolver;
-    }
+            if (table.getSelectedRow() >= 0) {
+                ObjAttributeTableModel model = (ObjAttributeTableModel) 
table.getModel();
+
+                int[] sel = table.getSelectedRows();
+                attrs = new ObjAttribute[sel.length];
 
+                for (int i = 0; i < sel.length; i++) {
+                    attrs[i] = model.getAttribute(sel[i]).getValue();
+                }
 
+                if (sel.length == 1) {
+                    UIUtil.scrollToSelectedRow(table);
+                }
+            }
+
+            editMenu.setEnabled(table.getSelectedRow() >= 0);
+        }
+
+        controller.setCurrentObjAttributes(attrs);
+        parentPanel.updateActions(attrs);
+    }
 }
\ No newline at end of file
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java
index bed3aa4f6..f45155d66 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityAttributeRelationshipTab.java
@@ -45,38 +45,26 @@ import javax.swing.JPanel;
 import javax.swing.JSplitPane;
 import javax.swing.JToolBar;
 import java.awt.BorderLayout;
+import java.awt.event.ActionListener;
 
 /**
  * Combines ObjEntityAttributeTab and ObjEntityRelationshipTab in JSplitPane.
  */
+public class ObjEntityAttributeRelationshipTab extends JPanel implements 
ObjEntityDisplayListener, ObjEntityListener {
 
-public class ObjEntityAttributeRelationshipTab extends JPanel implements 
ObjEntityDisplayListener,
-        ObjEntityListener {
+    private final ObjEntityAttributePanel attributePanel;
+    private final ObjEntityRelationshipPanel relationshipPanel;
+    private final JSplitPane splitPane;
+    private final JToolBar toolBar;
+    private final JButton editButton;
 
-    public ObjEntityAttributePanel attributePanel;
-    public ObjEntityRelationshipPanel relationshipPanel;
-    public JButton resolve = new CayenneAction.CayenneToolbarButton(null, 0);
-    private JSplitPane splitPane;
+    public ObjEntityAttributeRelationshipTab(ProjectController controller) {
+        this.editButton = new CayenneAction.CayenneToolbarButton(null, 0);
 
-    private ProjectController mediator;
-
-    private CutAttributeRelationshipAction cut;
-    private RemoveAttributeRelationshipAction remove;
-    private CopyAttributeRelationshipAction copy;
-    private JToolBar toolBar;
-
-    public ObjEntityAttributeRelationshipTab(ProjectController mediator) {
-        this.mediator = mediator;
-
-        init();
-        initToolBar();
-    }
-
-    private void init() {
         this.setLayout(new BorderLayout());
 
-        attributePanel = new ObjEntityAttributePanel(mediator, this);
-        relationshipPanel = new ObjEntityRelationshipPanel(mediator, this);
+        attributePanel = new ObjEntityAttributePanel(controller, this);
+        relationshipPanel = new ObjEntityRelationshipPanel(controller, this);
 
         splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, attributePanel, 
relationshipPanel);
         splitPane.setOneTouchExpandable(true);
@@ -88,15 +76,12 @@ public class ObjEntityAttributeRelationshipTab extends 
JPanel implements ObjEnti
                     "objEntityAttrRelTab/splitPane/divider");
 
             geometry.bindIntProperty(splitPane, 
JSplitPane.DIVIDER_LOCATION_PROPERTY, -1);
-        }
-        catch (Exception ex) {
+        } catch (Exception ex) {
             LoggerFactory.getLogger(getClass()).error("Cannot bind divider 
property", ex);
         }
 
         add(splitPane);
-    }
 
-    private void initToolBar() {
         toolBar = new JToolBar();
         toolBar.setFloatable(false);
         ActionManager actionManager = 
Application.getInstance().getActionManager();
@@ -109,20 +94,16 @@ public class ObjEntityAttributeRelationshipTab extends 
JPanel implements ObjEnti
         toolBar.addSeparator();
 
         Icon ico = ModelerUtil.buildIcon("icon-edit.png");
-        resolve.setToolTipText("Edit");
-        resolve.setIcon(ico);
-        resolve.setDisabledIcon(FilteredIconFactory.createDisabledIcon(ico));
-        toolBar.add(resolve).setEnabled(false);
-
-        cut = actionManager.getAction(CutAttributeRelationshipAction.class);
-        remove = 
actionManager.getAction(RemoveAttributeRelationshipAction.class);
-        copy = actionManager.getAction(CopyAttributeRelationshipAction.class);
+        editButton.setToolTipText("Edit");
+        editButton.setIcon(ico);
+        
editButton.setDisabledIcon(FilteredIconFactory.createDisabledIcon(ico));
+        toolBar.add(editButton).setEnabled(false);
 
         toolBar.addSeparator();
-        toolBar.add(remove.buildButton());
+        
toolBar.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildButton());
         toolBar.addSeparator();
-        toolBar.add(cut.buildButton(1));
-        toolBar.add(copy.buildButton(2));
+        
toolBar.add(actionManager.getAction(CutAttributeRelationshipAction.class).buildButton(1));
+        
toolBar.add(actionManager.getAction(CopyAttributeRelationshipAction.class).buildButton(2));
         toolBar.add(actionManager.getAction(PasteAction.class).buildButton(3));
 
         add(toolBar, BorderLayout.NORTH);
@@ -134,11 +115,16 @@ public class ObjEntityAttributeRelationshipTab extends 
JPanel implements ObjEnti
                 RemoveAttributeRelationshipAction.class,
                 CutAttributeRelationshipAction.class,
                 CopyAttributeRelationshipAction.class);
-        resolve.setEnabled(params.length > 0);
+        editButton.setEnabled(params.length > 0);
     }
 
-    public JButton getResolve() {
-        return resolve;
+    public void rebindEditButton(String tooltipText, ActionListener action) {
+        for (ActionListener al : editButton.getActionListeners()) {
+            editButton.removeActionListener(al);
+        }
+        editButton.addActionListener(action);
+        editButton.setToolTipText(tooltipText);
+        editButton.setEnabled(true);
     }
 
     public JSplitPane getSplitPane() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
index 6f3bb3d53..27e56c783 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityRelationshipPanel.java
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.editor;
 
-import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DeleteRule;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
@@ -41,22 +40,18 @@ import org.apache.cayenne.modeler.event.TablePopupHandler;
 import org.apache.cayenne.modeler.pref.TableColumnPreferences;
 import org.apache.cayenne.modeler.util.CayenneTable;
 import org.apache.cayenne.modeler.util.CellRenderers;
-import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.modeler.util.DbRelationshipPathComboBoxEditor;
 import org.apache.cayenne.modeler.util.ModelerUtil;
 import org.apache.cayenne.modeler.util.PanelFactory;
 import org.apache.cayenne.modeler.util.UIUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import javax.swing.*;
 import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
 import java.awt.*;
-import java.awt.event.ActionListener;
+import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.util.List;
@@ -64,10 +59,7 @@ import java.util.List;
 /**
  * Displays ObjRelationships for the edited ObjEntity.
  */
-public class ObjEntityRelationshipPanel extends JPanel implements 
ObjEntityDisplayListener,
-        ObjEntityListener, ObjRelationshipListener {
-
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(ObjEntityRelationshipPanel.class);
+public class ObjEntityRelationshipPanel extends JPanel implements 
ObjEntityDisplayListener, ObjEntityListener, ObjRelationshipListener {
 
     private static final ImageIcon INHERITANCE_ICON = 
ModelerUtil.buildIcon("icon-inheritance.png");
 
@@ -78,36 +70,16 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
             DeleteRule.deleteRuleName(DeleteRule.DENY),
     };
 
-    private ProjectController mediator;
-    private CayenneTable table;
-    private TableColumnPreferences tablePreferences;
-    private ActionListener resolver;
-    private ObjEntityAttributeRelationshipTab parentPanel;
-    private boolean enabledResolve;//for JBottom "resolve" in 
ObjEntityAttrRelationshipTab
-
-    /**
-     * By now popup menu item is made similar to toolbar button. (i.e. all 
functionality
-     * is here) This should be probably refactored as Action.
-     */
-    private JMenuItem resolveMenu;
+    private final ProjectController controller;
+    private final CayenneTable table;
+    private final TableColumnPreferences tablePreferences;
+    private final ObjEntityAttributeRelationshipTab parentPanel;
+    private final JMenuItem editMenu;
 
-    public ObjEntityRelationshipPanel(ProjectController mediator, 
ObjEntityAttributeRelationshipTab parentPanel) {
-        this.mediator = mediator;
+    public ObjEntityRelationshipPanel(ProjectController controller, 
ObjEntityAttributeRelationshipTab parentPanel) {
+        this.controller = controller;
         this.parentPanel = parentPanel;
 
-        init();
-        initController();
-    }
-
-    public CayenneTable getTable() {
-        return table;
-    }
-
-    public void setTable(CayenneTable table) {
-        this.table = table;
-    }
-
-    private void init() {
         this.setLayout(new BorderLayout());
 
         ActionManager actionManager = 
Application.getInstance().getActionManager();
@@ -128,7 +100,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
                 ObjRelationship relationship = tableModel.getRelationship(row);
                 int columnFromModel = 
table.getColumnModel().getColumn(col).getModelIndex();
                 if (row >= 0 && columnFromModel == 
ObjRelationshipTableModel.REL_NAME) {
-                    if(relationship.getSourceEntity() != 
tableModel.getEntity()) {
+                    if (relationship.getSourceEntity() != 
tableModel.getEntity()) {
                         TableCellRenderer renderer = 
table.getCellRenderer(row, col);
                         Rectangle rectangle = table.getCellRect(row, col, 
false);
                         ((StringRenderer) renderer).mouseClicked(e, 
rectangle.x);
@@ -139,10 +111,10 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
 
         // Create and install a popup
         Icon ico = ModelerUtil.buildIcon("icon-edit.png");
-        resolveMenu = new JMenuItem("Database Mapping", ico);
+        editMenu = new JMenuItem("Edit Relationship", ico);
 
         JPopupMenu popup = new JPopupMenu();
-        popup.add(resolveMenu);
+        popup.add(editMenu);
         
popup.add(actionManager.getAction(RemoveAttributeRelationshipAction.class).buildMenu());
 
         popup.addSeparator();
@@ -152,42 +124,29 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
 
         TablePopupHandler.install(table, popup);
         add(PanelFactory.createTablePanel(table, null), BorderLayout.CENTER);
+
+        initController();
     }
 
     private void initController() {
-        mediator.addObjEntityDisplayListener(this);
-        mediator.addObjEntityListener(this);
-        mediator.addObjRelationshipListener(this);
-
-        resolver = e -> {
-            int row = table.getSelectedRow();
-            if (row < 0) {
-                return;
-            }
-
-            ObjRelationshipTableModel model = (ObjRelationshipTableModel) 
table.getModel();
-            new ObjRelationshipInfo(mediator)
-                    .modifyRelationship(model.getRelationship(row))
-                    .startupAction();
-
-            // This is required for a table to be updated properly
-            table.cancelEditing();
+        controller.addObjEntityDisplayListener(this);
+        controller.addObjEntityListener(this);
+        controller.addObjRelationshipListener(this);
 
-            // need to refresh selected row... do this by 
unselecting/selecting the row
-            table.getSelectionModel().clearSelection();
-            table.select(row);
-            enabledResolve = false;
-        };
-        resolveMenu.addActionListener(resolver);
+        editMenu.addActionListener(this::edit);
 
-        table.getSelectionModel().addListSelectionListener(new 
ObjRelationshipListSelectionListener());
+        table.getSelectionModel().addListSelectionListener(this::valueChanged);
 
-        mediator.getApplication().getActionManager().setupCutCopyPaste(
+        controller.getApplication().getActionManager().setupCutCopyPaste(
                 table,
                 CutAttributeRelationshipAction.class,
                 CopyAttributeRelationshipAction.class);
     }
 
+    public CayenneTable getTable() {
+        return table;
+    }
+
     /**
      * Selects a specified relationship in the relationships table.
      */
@@ -204,8 +163,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
         }
 
         table.select(newSel);
-        parentPanel.getResolve().removeActionListener(getResolver());
-        parentPanel.getResolve().addActionListener(getResolver());
+        parentPanel.rebindEditButton("Edit Relationship", this::edit);
     }
 
     /**
@@ -231,33 +189,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
         }
 
         ObjEntity objEntity = (ObjEntity) e.getEntity();
-        if (objEntity.getSuperEntity() != null) {
-            parentPanel.getToolBar().getComponentAtIndex(2).setEnabled(false);
-        } else {
-            parentPanel.getToolBar().getComponentAtIndex(2).setEnabled(true);
-        }
-    }
-
-    /**
-     * Creates a list of ObjEntity names.
-     */
-    private Object[] createObjEntityComboModel() {
-        DataMap map = mediator.getCurrentDataMap();
-
-        // this actually happens per CAY-221... can't reproduce though
-        if (map == null) {
-            LOGGER.warn("createObjEntityComboModel:: Null DataMap.");
-            return new Object[0];
-        }
-
-        if (map.getNamespace() == null) {
-            LOGGER.warn("createObjEntityComboModel:: Null DataMap namespace - 
" + map);
-            return new Object[0];
-        }
-
-        return map.getNamespace().getObjEntities().stream()
-                .sorted(Comparators.getDataMapChildrenComparator())
-                .toArray();
+        
parentPanel.getToolBar().getComponentAtIndex(2).setEnabled(objEntity.getSuperEntity()
 == null);
     }
 
     public void objEntityChanged(EntityEvent e) {
@@ -297,7 +229,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
         }
 
         // If current model added/removed, do nothing.
-        ObjEntity entity = mediator.getCurrentObjEntity();
+        ObjEntity entity = controller.getCurrentObjEntity();
         if (entity == e.getEntity() || entity == null) {
             return;
         }
@@ -316,14 +248,12 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
     protected void rebuildTable(ObjEntity entity) {
         final ObjRelationshipTableModel model = new ObjRelationshipTableModel(
                 entity,
-                mediator,
+                controller,
                 this);
 
         model.addTableModelListener(e -> {
             if (table.getSelectedRow() >= 0) {
-                ObjRelationship rel = 
model.getRelationship(table.getSelectedRow());
-                enabledResolve = rel.getSourceEntity().getDbEntity() != null;
-                resolveMenu.setEnabled(enabledResolve);
+                
editMenu.setEnabled(model.getRelationship(table.getSelectedRow()).getSourceEntity().getDbEntity()
 != null);
             }
         });
 
@@ -333,11 +263,11 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
 
         TableColumn col = 
table.getColumnModel().getColumn(ObjRelationshipTableModel.REL_TARGET_PATH);
         col.setCellEditor(new DbRelationshipPathComboBoxEditor());
-        col.setCellRenderer(new DefaultTableCellRenderer(){
+        col.setCellRenderer(new DefaultTableCellRenderer() {
             @Override
             public Component getTableCellRendererComponent(JTable table, 
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
                 super.getTableCellRendererComponent(table, value, isSelected, 
hasFocus, row, column);
-                setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+                setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
                 setToolTipText("To choose relationship press enter two 
times.To choose next relationship press dot.");
                 return this;
             }
@@ -350,7 +280,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
         deleteRulesCombo.setFocusable(false);
         deleteRulesCombo.setEditable(true);
         ((JComponent) 
deleteRulesCombo.getEditor().getEditorComponent()).setBorder(null);
-        deleteRulesCombo.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+        deleteRulesCombo.setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 
0));
         deleteRulesCombo.setSelectedIndex(0); // Default to the first value
         col.setCellEditor(Application.getWidgetFactory().createCellEditor(
                 deleteRulesCombo));
@@ -364,7 +294,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
                 true);
     }
 
-    class EntityRenderer extends StringRenderer {
+    static class EntityRenderer extends StringRenderer {
 
         @Override
         public Component getTableCellRendererComponent(
@@ -387,7 +317,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
                     column);
 
             Icon icon = CellRenderers.iconForObject(oldValue);
-            if(isSelected) {
+            if (isSelected) {
                 setForeground(UIManager.getColor("Table.selectionForeground"));
             }
             setIcon(icon);
@@ -395,7 +325,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
         }
     }
 
-    class StringRenderer extends DefaultTableCellRenderer {
+    static class StringRenderer extends DefaultTableCellRenderer {
 
         @Override
         public Component getTableCellRendererComponent(
@@ -430,7 +360,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
             if (relationship != null
                     && relationship.getSourceEntity() != model.getEntity()) {
                 setForeground(isSelected ? new Color(0xEEEEEE) : Color.GRAY);
-                if(column == ObjRelationshipTableModel.REL_NAME) {
+                if (column == ObjRelationshipTableModel.REL_NAME) {
                     setIcon(INHERITANCE_ICON);
                 }
             } else {
@@ -439,7 +369,7 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
                         : table.getForeground());
             }
 
-            setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
+            setBorder(BorderFactory.createEmptyBorder(0, 5, 0, 0));
             setFont(UIManager.getFont("Label.font"));
 
             return this;
@@ -447,65 +377,68 @@ public class ObjEntityRelationshipPanel extends JPanel 
implements ObjEntityDispl
 
         public void mouseClicked(MouseEvent event, int x) {
             Point point = event.getPoint();
-            if(point.x - x <= INHERITANCE_ICON.getIconWidth()) {
+            if (point.x - x <= INHERITANCE_ICON.getIconWidth()) {
                 ActionManager actionManager = 
Application.getInstance().getActionManager();
                 
actionManager.getAction(ObjEntityToSuperEntityAction.class).performAction(null);
             }
         }
     }
 
-    private class ObjRelationshipListSelectionListener implements 
ListSelectionListener {
+    private void edit(ActionEvent e) {
+        int row = table.getSelectedRow();
+        if (row < 0) {
+            return;
+        }
+
+        ObjRelationshipTableModel model = (ObjRelationshipTableModel) 
table.getModel();
+        new ObjRelationshipInfo(controller)
+                .modifyRelationship(model.getRelationship(row))
+                .startupAction();
 
-        public void valueChanged(ListSelectionEvent e) {
-            ObjRelationship[] rels = new ObjRelationship[0];
+        // This is required for a table to be updated properly
+        table.cancelEditing();
 
-            if (!e.getValueIsAdjusting() && !((ListSelectionModel) 
e.getSource()).isSelectionEmpty()) {
+        // need to refresh selected row... do this by unselecting/selecting 
the row
+        table.getSelectionModel().clearSelection();
+        table.select(row);
+    }
 
-                
parentPanel.getAttributePanel().getTable().getSelectionModel().clearSelection();
-                if (parentPanel.getAttributePanel().getTable().getCellEditor() 
!= null) {
-                    
parentPanel.getAttributePanel().getTable().getCellEditor().stopCellEditing();
-                }
-                
Application.getInstance().getActionManager().getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getRelationshipPanel());
-                
Application.getInstance().getActionManager().getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getRelationshipPanel());
-                
Application.getInstance().getActionManager().getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getRelationshipPanel());
-                
parentPanel.getResolve().removeActionListener(parentPanel.getAttributePanel().getResolver());
-                parentPanel.getResolve().removeActionListener(getResolver());
-                parentPanel.getResolve().addActionListener(getResolver());
-                parentPanel.getResolve().setToolTipText("Edit Relationship");
-                parentPanel.getResolve().setEnabled(true);
-
-                if (table.getSelectedRow() >= 0) {
-                    ObjRelationshipTableModel model = 
(ObjRelationshipTableModel) table.getModel();
-
-                    int[] sel = table.getSelectedRows();
-                    rels = new ObjRelationship[sel.length];
-
-                    for (int i = 0; i < sel.length; i++) {
-                        rels[i] = model.getRelationship(sel[i]);
-                    }
+    private void valueChanged(ListSelectionEvent e) {
+        ObjRelationship[] rels = new ObjRelationship[0];
 
-                    if (sel.length == 1) {
-                        UIUtil.scrollToSelectedRow(table);
-                    }
+        if (!e.getValueIsAdjusting() && !((ListSelectionModel) 
e.getSource()).isSelectionEmpty()) {
 
-                    enabledResolve = true;
-                } else {
-                    enabledResolve = false;
+            
parentPanel.getAttributePanel().getTable().getSelectionModel().clearSelection();
+            if (parentPanel.getAttributePanel().getTable().getCellEditor() != 
null) {
+                
parentPanel.getAttributePanel().getTable().getCellEditor().stopCellEditing();
+            }
+
+            ActionManager actionManager = 
Application.getInstance().getActionManager();
+            
actionManager.getAction(RemoveAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getRelationshipPanel());
+            
actionManager.getAction(CutAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getRelationshipPanel());
+            
actionManager.getAction(CopyAttributeRelationshipAction.class).setCurrentSelectedPanel(parentPanel.getRelationshipPanel());
+
+            parentPanel.rebindEditButton("Edit Relationship", this::edit);
+
+            if (table.getSelectedRow() >= 0) {
+                ObjRelationshipTableModel model = (ObjRelationshipTableModel) 
table.getModel();
+
+                int[] sel = table.getSelectedRows();
+                rels = new ObjRelationship[sel.length];
+
+                for (int i = 0; i < sel.length; i++) {
+                    rels[i] = model.getRelationship(sel[i]);
+                }
+
+                if (sel.length == 1) {
+                    UIUtil.scrollToSelectedRow(table);
                 }
-                resolveMenu.setEnabled(enabledResolve);
             }
 
-            mediator.setCurrentObjRelationships(rels);
-            parentPanel.updateActions(rels);
+            editMenu.setEnabled(table.getSelectedRow() >= 0);
         }
-    }
-
-    public boolean isEnabledResolve() {
-        return enabledResolve;
-    }
 
-    public ActionListener getResolver() {
-        return resolver;
+        controller.setCurrentObjRelationships(rels);
+        parentPanel.updateActions(rels);
     }
-
 }
\ No newline at end of file
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java
index 492d04268..6596f430d 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/ProjectOnSaveListener.java
@@ -20,11 +20,13 @@ package org.apache.cayenne.modeler.event;
 
 import java.util.EventListener;
 
-/** 
- * Interface for classes that are interested in ProjectOnSave events. 
+/**
+ * Interface for classes that are interested in ProjectOnSave events.
  */
-public interface ProjectOnSaveListener extends EventListener{
-       
-       /** Changes made before saving project   */
-       public void beforeSaveChanges(ProjectOnSaveEvent e);
+public interface ProjectOnSaveListener extends EventListener {
+
+    /**
+     * Changes made before saving project
+     */
+    void beforeSaveChanges(ProjectOnSaveEvent e);
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneController.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneController.java
index e2c4656c7..30472f14e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneController.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneController.java
@@ -117,7 +117,6 @@ public abstract class CayenneController {
     protected void reportError(String title, Throwable th) {
         th = Util.unwindException(th);
         LOGGER.info("Error in " + getClass().getName(), th);
-        th.printStackTrace();
 
         JOptionPane.showMessageDialog(
                 getView(),

Reply via email to