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