You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ab...@apache.org on 2019/02/19 12:51:07 UTC

[cayenne] 02/03: CAY-2540 Modeler: redesign dbRelationship editor dialog

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 <an...@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;
 	}
 }