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