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

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

commit c7a33dad83a5aaff755646958b63e8b28c4d8ee5
Author: Arseni Bulatski <ancars...@gmail.com>
AuthorDate: Mon Feb 18 16:20:07 2019 +0300

    CAY-2540 Modeler: redesign dbRelationship editor dialog
---
 .../cayenne/modeler/DbRelationshipDialogView.java  |  26 +++---
 .../modeler/action/RemoveRelationshipAction.java   |   7 +-
 .../modeler/dialog/DbRelationshipDialog.java       |  48 ++++++++--
 .../dialog/WarningDialogByDbTargetChange.java      |  20 ++--
 .../dialog/objentity/ObjRelationshipInfo.java      |   5 +-
 .../editor/dbentity/DbRelationshipTableModel.java  |  15 +--
 .../modeler/undo/RelationshipUndoableEdit.java     | 104 ++++++---------------
 7 files changed, 104 insertions(+), 121 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/DbRelationshipDialogView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/DbRelationshipDialogView.java
index 46f5369..9cd223a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/DbRelationshipDialogView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/DbRelationshipDialogView.java
@@ -99,7 +99,7 @@ public class DbRelationshipDialogView extends CayenneDialog {
         PanelBuilder builder = new PanelBuilder(
                 new FormLayout(
                         "right:max(50dlu;pref), 3dlu, fill:min(150dlu;pref), 
3dlu, fill:min(50dlu;pref)",
-                        "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, 
p, 3dlu, p, 3dlu, " +
+                        "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, 
p, 3dlu, " +
                                 "p, 3dlu, p, 9dlu, p, 3dlu, top:14dlu, 3dlu, 
top:p:grow"));
         builder.setDefaultDialogBorder();
 
@@ -108,11 +108,14 @@ public class DbRelationshipDialogView extends 
CayenneDialog {
         builder.addLabel("Relationship Name:", cc.xy(1, 3));
         builder.add(name, cc.xywh(3, 3, 1, 1));
 
-        builder.addLabel("Target Entity:", cc.xy(1, 5));
-        builder.add(targetEntities, cc.xywh(3, 5, 1, 1));
+        builder.addLabel("Source Entity:", cc.xy(1, 5));
+        builder.add(sourceName, cc.xywh(3, 5, 1, 1));
 
-        builder.addLabel("To Dep PK:", cc.xy(1, 7));
-        builder.add(toDepPk, cc.xywh(3, 7, 1, 1));
+        builder.addLabel("Target Entity:", cc.xy(1, 7));
+        builder.add(targetEntities, cc.xywh(3, 7, 1, 1));
+
+        builder.addLabel("To Dep PK:", cc.xy(1, 9));
+        builder.add(toDepPk, cc.xywh(3, 9, 1, 1));
 
         builder.addLabel("To Many:", cc.xy(1, 11));
         builder.add(toMany, cc.xywh(3, 11, 1, 1));
@@ -122,20 +125,17 @@ public class DbRelationshipDialogView extends 
CayenneDialog {
 
         builder.addSeparator("DbRelationship Information", cc.xywh(1, 15, 5, 
1));
 
-        builder.addLabel("Source Entity:", cc.xy(1, 17));
-        builder.add(sourceName, cc.xywh(3, 17, 1, 1));
-
-        builder.addLabel("Reverse Relationship Name:", cc.xy(1, 19));
-        builder.add(reverseName, cc.xywh(3, 19, 1, 1));
+        builder.addLabel("Reverse Relationship Name:", cc.xy(1, 17));
+        builder.add(reverseName, cc.xywh(3, 17, 1, 1));
 
-        builder.addSeparator("Joins", cc.xywh(1, 21, 5, 1));
-        builder.add(new JScrollPane(table), cc.xywh(1, 23, 3, 3, "fill, 
fill"));
+        builder.addSeparator("Joins", cc.xywh(1, 19, 5, 1));
+        builder.add(new JScrollPane(table), cc.xywh(1, 21, 3, 3, "fill, 
fill"));
 
         JPanel joinButtons = new JPanel(new FlowLayout(FlowLayout.LEADING));
         joinButtons.add(addButton);
         joinButtons.add(removeButton);
 
-        builder.add(joinButtons, cc.xywh(5, 23, 1, 3));
+        builder.add(joinButtons, cc.xywh(5, 21, 1, 3));
 
         getContentPane().add(builder.getPanel(), BorderLayout.CENTER);
         JButton[] buttons = {cancelButton, saveButton};
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java
index 6682a5a..b45eeb6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java
@@ -125,11 +125,12 @@ public class RemoveRelationshipAction extends 
RemoveAction implements
        public void removeDbRelationships(DbEntity entity, DbRelationship[] 
rels) {
                ProjectController mediator = getProjectController();
 
-               for (DbRelationship rel : rels) {
-                       entity.removeRelationship(rel.getName());
+               for(int i = 0; i < rels.length; i++) {
+                       rels[i] = entity.getRelationship(rels[i].getName());
+                       entity.removeRelationship(rels[i].getName());
 
                        RelationshipEvent e = new 
RelationshipEvent(Application.getFrame(),
-                                       rel, entity, MapEvent.REMOVE);
+                                       rels[i], entity, MapEvent.REMOVE);
                        mediator.fireDbRelationshipEvent(e);
                }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbRelationshipDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbRelationshipDialog.java
index 92f49d9..d2c9bb7 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbRelationshipDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/DbRelationshipDialog.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.dialog;
 
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JComboBox;
+import javax.swing.JOptionPane;
 import javax.swing.table.TableColumn;
 import java.awt.Component;
 import java.awt.event.WindowAdapter;
@@ -142,12 +143,16 @@ public class DbRelationshipDialog extends 
CayenneController {
             String selectedItem = 
(String)view.getTargetEntities().getSelectedItem();
             if(relationship.getTargetEntityName() == null) {
                 relationship.setTargetEntityName(selectedItem);
-            } else {
+            } else 
if(!relationship.getTargetEntityName().equals(selectedItem)){
                 if 
(WarningDialogByDbTargetChange.showWarningDialog(projectController, 
relationship)) {
                     // clear joins...
                     relationship.removeAllJoins();
                     relationship.setTargetEntityName(selectedItem);
+                } else {
+                    
view.getTargetEntities().setSelectedItem(relationship.getTargetEntityName());
                 }
+                relationship.setToDependentPK(false);
+                view.getToDepPk().setSelected(relationship.isValidForDepPk());
                 projectController.fireDbRelationshipEvent(new 
RelationshipEvent(this, relationship, relationship.getSourceEntity()));
             }
             enableInfo();
@@ -157,6 +162,7 @@ public class DbRelationshipDialog extends CayenneController 
{
             DbJoinTableModel model = (DbJoinTableModel) 
view.getTable().getModel();
 
             DbJoin join = new DbJoin(relationship);
+            relationship.addJoin(join);
             model.addRow(join);
 
             view.getTable().select(model.getRowCount() - 1);
@@ -169,6 +175,15 @@ public class DbRelationshipDialog extends 
CayenneController {
 
             DbJoin join = model.getJoin(row);
 
+            relationship.removeJoin(join);
+            if(relationship.isValidForDepPk()) {
+                view.getToDepPk().setEnabled(true);
+            } else {
+                view.getToDepPk().setEnabled(false);
+                view.getToDepPk().setSelected(false);
+                relationship.setToDependentPK(false);
+            }
+
             model.removeRow(join);
         });
 
@@ -192,7 +207,19 @@ public class DbRelationshipDialog extends 
CayenneController {
             }
         });
 
-        view.getToDepPk().setEnabled(false);
+        view.getToDepPk().setEnabled(relationship.isValidForDepPk());
+        view.getToDepPk().addActionListener(selected -> {
+            boolean isSelected = view.getToDepPk().isSelected();
+            DbRelationship reverseRelationship = 
relationship.getReverseRelationship();
+            if(reverseRelationship != null && 
reverseRelationship.isToDependentPK() && isSelected) {
+                boolean setToDepPk = 
JOptionPane.showConfirmDialog(Application.getFrame(), "Unset reverse 
relationship's \"To Dep PK\" setting?",
+                        "Warning", JOptionPane.OK_CANCEL_OPTION, 
JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION;
+                relationship.setToDependentPK(setToDepPk);
+                reverseRelationship.setToDependentPK(!setToDepPk);
+            } else {
+                relationship.setToDependentPK(view.getToDepPk().isSelected());
+            }
+        });
     }
 
     private void enableInfo() {
@@ -200,6 +227,17 @@ public class DbRelationshipDialog extends 
CayenneController {
 
         view.getTable().setModel(new DbJoinTableModel(relationship,
                 projectController, this, true));
+
+        view.getTable().getModel().addTableModelListener(change -> {
+            if(change.getLastRow() != Integer.MAX_VALUE) {
+                if(relationship.isValidForDepPk()) {
+                    view.getToDepPk().setEnabled(true);
+                } else {
+                    view.getToDepPk().setEnabled(false);
+                }
+            }
+        });
+
         TableColumn sourceColumn = 
view.getTable().getColumnModel().getColumn(DbJoinTableModel.SOURCE);
         JComboBox comboBox = Application.getWidgetFactory().createComboBox(
                 
ModelerUtil.getDbAttributeNames(relationship.getSourceEntity()), true);
@@ -243,12 +281,6 @@ public class DbRelationshipDialog extends 
CayenneController {
 
         relationship.setToMany(view.getToMany().isSelected());
 
-        // check "to dep pk" setting,
-        // maybe this is no longer valid
-        if (relationship.isToDependentPK() && !relationship.isValidForDepPk()) 
{
-            relationship.setToDependentPK(false);
-        }
-
         
ObjectInfo.putToMetaData(projectController.getApplication().getMetaData(),
                 relationship,
                 ObjectInfo.COMMENT, view.getComment().getText());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/WarningDialogByDbTargetChange.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/WarningDialogByDbTargetChange.java
index 93408ea..d170fd0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/WarningDialogByDbTargetChange.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/WarningDialogByDbTargetChange.java
@@ -19,6 +19,15 @@
 
 package org.apache.cayenne.modeler.dialog;
 
+import javax.swing.DefaultListModel;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import java.awt.BorderLayout;
+import java.util.Collection;
+
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjRelationship;
@@ -26,10 +35,6 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.ProjectUtil;
 
-import javax.swing.*;
-import java.awt.*;
-import java.util.Collection;
-
 /**
  * @since 4.0
  */
@@ -45,12 +50,15 @@ public class WarningDialogByDbTargetChange {
 
     public static boolean showWarningDialog(ProjectController mediator, 
DbRelationship relationship) {
 
+        int result;
         Collection<ObjRelationship> objRelationshipsForDbRelationship = 
ProjectUtil
                 .findObjRelationshipsForDbRelationship(mediator, relationship);
         Collection<ObjAttribute> fObjAttributesForDbRelationship = ProjectUtil
                 .findObjAttributesForDbRelationship(mediator, relationship);
         if (fObjAttributesForDbRelationship.isEmpty() && 
objRelationshipsForDbRelationship.isEmpty()) {
-            return true;
+            result = JOptionPane.showConfirmDialog(Application.getFrame(), 
"Changing target entity will reset all joins.",
+                    "Warning", JOptionPane.OK_CANCEL_OPTION, 
JOptionPane.PLAIN_MESSAGE);
+            return (result == JOptionPane.OK_OPTION);
         }
 
         JPanel dialogPanel = new JPanel();
@@ -79,7 +87,7 @@ public class WarningDialogByDbTargetChange {
         }
 
         dialogPanel.add(scrollPane, BorderLayout.SOUTH);
-        int result = JOptionPane.showConfirmDialog(Application.getFrame(), 
dialogPanel,
+        result = JOptionPane.showConfirmDialog(Application.getFrame(), 
dialogPanel,
                 "Warning", JOptionPane.OK_CANCEL_OPTION, 
JOptionPane.PLAIN_MESSAGE);
         return (result == JOptionPane.OK_OPTION);
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
index 2bf03af..c3c3062 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
@@ -18,11 +18,12 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.dialog.objentity;
 
-import javax.swing.*;
+import javax.swing.JOptionPane;
+import javax.swing.WindowConstants;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
 import javax.swing.tree.TreePath;
-import java.awt.*;
+import java.awt.Component;
 import java.awt.event.ItemEvent;
 import java.util.ArrayList;
 import java.util.Collection;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
index 20d3cc6..594f05e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbRelationshipTableModel.java
@@ -138,20 +138,7 @@ public class DbRelationshipTableModel extends 
CayenneTableModel<DbRelationship>
             rel.setName((String) aValue);
             mediator.fireDbRelationshipEvent(e);
             fireTableCellUpdated(row, column);
-        }
-//        else if (column == TARGET) {
-//            // If target column
-//            DbEntity target = (DbEntity) aValue;
-//
-//            if (WarningDialogByDbTargetChange.showWarningDialog(mediator, 
rel)) {
-//                // clear joins...
-//                rel.removeAllJoins();
-//                rel.setTargetEntityName(target);
-//            }
-//
-//            mediator.fireDbRelationshipEvent(new 
RelationshipEvent(eventSource, rel, entity));
-//        }
-        else if (column == TO_DEPENDENT_KEY) {
+        } else if (column == TO_DEPENDENT_KEY) {
             boolean flag = (Boolean) aValue;
 
             // make sure reverse relationship "to-dep-pk" is unset.
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
index cd3359c..f230c05 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
@@ -18,37 +18,45 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.undo;
 
-import javax.swing.undo.AbstractUndoableEdit;
 import javax.swing.undo.CannotRedoException;
 import javax.swing.undo.CannotUndoException;
-import javax.swing.undo.CompoundEdit;
 
-import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.dialog.DbRelationshipDialog;
-import org.apache.cayenne.modeler.util.ProjectUtil;
+import org.apache.cayenne.modeler.ProjectController;
 
-public class RelationshipUndoableEdit extends CompoundEdit {
+public class RelationshipUndoableEdit extends CayenneUndoableEdit {
 
     private DbRelationship relationship;
+    private DbRelationship prevRelationship;
+    private ProjectController projectController;
 
        public RelationshipUndoableEdit(DbRelationship relationship) {
+               this.projectController = 
Application.getInstance().getFrameController().getProjectController();
                this.relationship = relationship;
+               this.prevRelationship = copyRelationship(relationship);
        }
 
     @Override
        public void redo() throws CannotRedoException {
-               new 
DbRelationshipDialog(Application.getInstance().getFrameController().getProjectController())
-                               .modifyRaltionship(relationship)
-                               .startUp();
+               fireDbRelationshipEvent(relationship, prevRelationship);
        }
 
        @Override
        public void undo() throws CannotUndoException {
-               new 
DbRelationshipDialog(Application.getInstance().getFrameController().getProjectController())
-                               .modifyRaltionship(relationship)
-                               .startUp();
+               fireDbRelationshipEvent(prevRelationship, relationship);
+       }
+
+       private void fireDbRelationshipEvent(DbRelationship relToFire, 
DbRelationship currRel) {
+               DbEntity dbEntity = currRel.getSourceEntity();
+               dbEntity.removeRelationship(currRel.getName());
+               dbEntity.addRelationship(relToFire);
+               projectController
+                               .fireDbRelationshipEvent(
+                                               new RelationshipEvent(this, 
relToFire, relToFire.getSourceEntity(), MapEvent.ADD));
        }
 
        @Override
@@ -61,68 +69,14 @@ public class RelationshipUndoableEdit extends CompoundEdit {
                return "Undo Edit relationship";
        }
 
-       @Override
-       public boolean isSignificant() {
-       return true;
-       }
-
-       @Override
-       public boolean canUndo() {
-               return true;
-       }
-
-       public void addDbJoinAddUndo(final DbJoin join) {
-               this.addEdit(new AbstractUndoableEdit() {
-                       
-
-                       @Override
-                       public void redo() throws CannotRedoException {
-                               relationship.addJoin(join);
-                       }
-
-                       @Override
-                       public void undo() throws CannotUndoException {
-                               relationship.removeJoin(join);
-                       }
-               });
-       }
-
-       public void addDbJoinRemoveUndo(final DbJoin join) {
-               this.addEdit(new AbstractUndoableEdit() {
-
-                       
-
-                       @Override
-                       public void redo() throws CannotRedoException {
-                               relationship.removeJoin(join);
-                       }
-
-                       @Override
-                       public void undo() throws CannotUndoException {
-                               relationship.addJoin(join);
-                       }
-
-               });
-       }
-
-       public void addNameUndo(final DbRelationship relationship,
-                       final String oldName, final String newName) {
-               this.addEdit(new AbstractUndoableEdit() {
-
-                       
-
-                       @Override
-                       public void redo() throws CannotRedoException {
-                               
ProjectUtil.setRelationshipName(relationship.getSourceEntity(),
-                                               relationship, newName);
-                       }
-
-                       @Override
-                       public void undo() throws CannotUndoException {
-                               
ProjectUtil.setRelationshipName(relationship.getSourceEntity(),
-                                               relationship, oldName);
-                       }
-
-               });
+       private DbRelationship copyRelationship(DbRelationship dbRelationship) {
+               DbRelationship rel = new DbRelationship();
+               rel.setName(dbRelationship.getName());
+               rel.setToDependentPK(dbRelationship.isToDependentPK());
+               rel.setToMany(dbRelationship.isToMany());
+               rel.setTargetEntityName(dbRelationship.getTargetEntityName());
+               rel.setSourceEntity(dbRelationship.getSourceEntity());
+               rel.setJoins(rel.getJoins());
+               return rel;
        }
 }

Reply via email to