This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch past-M2 in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit bee2fc2f893dad553b9248a1481ff29e89b9174e Author: Andrus Adamchik <[email protected]> AuthorDate: Thu Jun 11 18:16:13 2026 -0400 CAY-2959 Modeler: DbRelationship dialog "Cancel" does not cancel --- RELEASE-NOTES.txt | 1 + .../modeler/toolkit/table/CMTableModel.java | 9 + .../ui/action/CreateRelationshipAction.java | 4 +- .../ui/dbrelationship/DbJoinTableModel.java | 79 +++--- .../ui/dbrelationship/DbRelationshipDialog.java | 287 ++++++++++----------- .../dbentity/properties/DbRelationshipPanel.java | 4 +- .../relinfo/ObjRelationshipInfoDialog.java | 38 +-- 7 files changed, 202 insertions(+), 220 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index ede153c1b..a002a2091 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -19,6 +19,7 @@ CAY-2957 Get rid of adapter for legacy HSQLDB <= 1.8 Bug Fixes: CAY-2958 Empty join is saved +CAY-2959 Modeler: DbRelationship dialog "Cancel" doesn't cancel ---------------------------------- Release: 5.0-M2 diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java index 5f2fae576..ac4173fd3 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/table/CMTableModel.java @@ -108,6 +108,15 @@ public abstract class CMTableModel<T> extends AbstractTableModel { fireTableDataChanged(); } + public void removeAllRows() { + if (objectList.isEmpty()) { + return; + } + + objectList.clear(); + fireTableDataChanged(); + } + /** * Moves a row up, jumping down if row is already at the top. */ diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java index 972a8f2eb..41fb7983e 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java @@ -94,9 +94,7 @@ public class CreateRelationshipAction extends AppAction { DbEntity dbEnt = getProjectSession().getSelectedDbEntity(); if (dbEnt != null) { - new DbRelationshipDialog(getProjectSession(), app.getFrame()) - .createNewRelationship(dbEnt) - .open(); + DbRelationshipDialog.openForCreate(getProjectSession(), app.getFrame(), dbEnt); } } } diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java index 1a8ab08b0..4dbbf2f55 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbJoinTableModel.java @@ -19,6 +19,7 @@ package org.apache.cayenne.modeler.ui.dbrelationship; +import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.DbJoin; import org.apache.cayenne.map.DbRelationship; @@ -26,49 +27,39 @@ import org.apache.cayenne.modeler.project.ProjectSession; import org.apache.cayenne.modeler.toolkit.table.CMTableModel; import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; -/** - * Model for editing DbAttributePair-s. Changes in the join attributes - * don't take place until commit() is called. Creation of the new - * DbAttributes is not allowed - user should choose from the existing ones. - */ -public class DbJoinTableModel extends CMTableModel<DbJoin> { +class DbJoinTableModel extends CMTableModel<DbJoin> { - // Columns static final int SOURCE = 0; static final int TARGET = 1; - protected DbRelationship relationship; - protected DbEntity source; - protected DbEntity target; - - /** - * Is the table editable. - */ - private boolean editable; + private final DbRelationship relationship; + private final DbEntity source; + private final DbEntity target; public DbJoinTableModel( DbRelationship relationship, ProjectSession session, - Object src) { + Object src, + List<DbJoin> joins, + DbEntity target) { - super(session, src, new ArrayList<>(relationship.getJoins())); + super(session, src, copyJoins(relationship, joins)); this.relationship = relationship; this.source = relationship.getSourceEntity(); - this.target = relationship.getTargetEntity(); + this.target = target; } - public DbJoinTableModel( - DbRelationship relationship, - ProjectSession session, - Object src, - boolean editable) { - - this(relationship, session, src); - this.editable = editable; + private static List<DbJoin> copyJoins(DbRelationship relationship, List<DbJoin> joins) { + return joins.stream() + .map(j -> new DbJoin(relationship, j.getSourceName(), j.getTargetName())) + .collect(Collectors.toCollection(ArrayList::new)); } - public Class getElementsClass() { + @Override + public Class<?> getElementsClass() { return DbJoin.class; } @@ -79,6 +70,32 @@ public class DbJoinTableModel extends CMTableModel<DbJoin> { .toList()); } + /** + * Same check as {@link DbRelationship#isValidForDepPk()}, but over the uncommitted joins and target + * entity of this table. + */ + public boolean isValidForDepPk() { + if (objectList.isEmpty()) { + return false; + } + + for (DbJoin join : objectList) { + DbAttribute sourceAttribute = source != null && join.getSourceName() != null + ? source.getAttribute(join.getSourceName()) + : null; + DbAttribute targetAttribute = target != null && join.getTargetName() != null + ? target.getAttribute(join.getTargetName()) + : null; + + if (targetAttribute != null && !targetAttribute.isPrimaryKey() + || sourceAttribute != null && !sourceAttribute.isPrimaryKey()) { + return false; + } + } + + return true; + } + @Override public int getColumnCount() { return 2; @@ -87,9 +104,9 @@ public class DbJoinTableModel extends CMTableModel<DbJoin> { @Override public String getColumnName(int column) { if (column == SOURCE) - return relationship.getSourceEntity().getName(); + return source.getName(); else if (column == TARGET) - return relationship.getTargetEntity().getName(); + return target != null ? target.getName() : ""; else return ""; } @@ -142,9 +159,9 @@ public class DbJoinTableModel extends CMTableModel<DbJoin> { public boolean isCellEditable(int row, int col) { if (col == SOURCE) { - return relationship.getSourceEntity() != null && editable; + return source != null; } else if (col == TARGET) { - return relationship.getTargetEntity() != null && editable; + return target != null; } return false; diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java index 804a716a8..377342a53 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbrelationship/DbRelationshipDialog.java @@ -32,45 +32,28 @@ import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjRelationship; import org.apache.cayenne.modeler.event.display.DbRelationshipDisplayEvent; import org.apache.cayenne.modeler.event.model.DbRelationshipEvent; +import org.apache.cayenne.modeler.pref.adapters.CMTablePrefs; import org.apache.cayenne.modeler.project.DbRelationshipOps; +import org.apache.cayenne.modeler.project.ProjectSession; +import org.apache.cayenne.modeler.toolkit.ProjectDialog; import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel; import org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion; -import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox; import org.apache.cayenne.modeler.toolkit.combobox.CMAutoCompleteComboBoxCellEditor; +import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox; import org.apache.cayenne.modeler.toolkit.table.CMTable; -import org.apache.cayenne.modeler.pref.adapters.CMTablePrefs; -import org.apache.cayenne.modeler.toolkit.ProjectDialog; -import org.apache.cayenne.modeler.project.ProjectSession; import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit; import org.apache.cayenne.modeler.undo.RelationshipUndoableEdit; import org.apache.cayenne.project.extension.info.ObjectInfo; -import java.util.Objects; -import javax.swing.AbstractListModel; -import javax.swing.ComboBoxModel; -import javax.swing.DefaultListModel; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JList; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; -import javax.swing.ListSelectionModel; +import javax.swing.*; import javax.swing.table.TableColumn; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Window; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; +import java.awt.*; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.function.Function; @@ -98,15 +81,46 @@ public class DbRelationshipDialog extends ProjectDialog { private final JButton saveButton; private final JButton cancelButton; - private DbRelationship relationship; - private DbRelationship reverseRelationship; - private boolean create; - private boolean cancelPressed; - private RelationshipUndoableEdit undo; + private final DbRelationship relationship; + private final DbRelationship reverseRelationship; + private final boolean create; + private boolean saved; + private final RelationshipUndoableEdit undo; + + // dialog-local editing state, applied to the relationship only on save + private DbEntity currentTarget; + private boolean unsetReverseDepPk; + + public static Optional<DbRelationship> openForCreate(ProjectSession session, Window owner, DbEntity sourceEntity) { + DbRelationship relationship = new DbRelationship(); + relationship.setName(NameBuilder.builder(relationship, sourceEntity).name()); + relationship.setSourceEntity(sourceEntity); + + DbRelationshipDialog dialog = new DbRelationshipDialog(session, owner, relationship, true); + dialog.open(); + return dialog.saved ? Optional.of(relationship) : Optional.empty(); + } + + public static void openForEdit(ProjectSession session, Window owner, DbRelationship relationship) { + new DbRelationshipDialog(session, owner, relationship, false).open(); + } - public DbRelationshipDialog(ProjectSession session, Window owner) { + private DbRelationshipDialog(ProjectSession session, Window owner, DbRelationship relationship, boolean create) { super(session, owner, "Create dbRelationship", ModalityType.APPLICATION_MODAL); + if (relationship.getSourceEntity() == null) { + throw new CayenneRuntimeException("Null source entity: %s", relationship); + } + if (relationship.getSourceEntity().getDataMap() == null) { + throw new CayenneRuntimeException("Null DataMap: %s", relationship.getSourceEntity()); + } + + this.relationship = relationship; + this.create = create; + this.undo = new RelationshipUndoableEdit(session, relationship); + this.reverseRelationship = relationship.getReverseRelationship(); + this.currentTarget = relationship.getTargetEntity(); + this.name = new JTextField(25); this.targetEntities = new JComboBox<>(); this.toDepPk = new JCheckBox(); @@ -122,38 +136,8 @@ public class DbRelationshipDialog extends ProjectDialog { this.table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION); initLayout(); - } - - public DbRelationshipDialog createNewRelationship(DbEntity dbEntity) { - this.create = true; - - DbRelationship rel = new DbRelationship(); - rel.setName(NameBuilder.builder(rel, dbEntity).name()); - rel.setSourceEntity(dbEntity); - - return modifyRelationship(rel); - } - - public DbRelationshipDialog modifyRelationship(DbRelationship dbRelationship) { - this.undo = new RelationshipUndoableEdit(session, dbRelationship); - this.relationship = dbRelationship; - this.reverseRelationship = relationship.getReverseRelationship(); - - if (relationship.getSourceEntity() == null) { - throw new CayenneRuntimeException("Null source entity: %s", relationship); - } - if (relationship.getSourceEntity().getDataMap() == null) { - throw new CayenneRuntimeException("Null DataMap: %s", relationship.getSourceEntity()); - } - initBindings(); initFromModel(); - - return this; - } - - public Optional<DbRelationship> getRelationship() { - return cancelPressed ? Optional.empty() : Optional.of(relationship); } private void initLayout() { @@ -197,10 +181,7 @@ public class DbRelationshipDialog extends ProjectDialog { } private void initFromModel() { - TargetComboBoxModel targetComboBoxModel = - new TargetComboBoxModel(session.entityResolver().getDbEntities()); - targetEntities.setModel(targetComboBoxModel); - + targetEntities.setModel(new TargetComboBoxModel(session.entityResolver().getDbEntities())); sourceName.setText(relationship.getSourceEntityName()); toDepPk.setSelected(relationship.isToDependentPK()); toMany.setSelected(relationship.isToMany()); @@ -210,7 +191,7 @@ public class DbRelationshipDialog extends ProjectDialog { reverseName.setText(reverseRelationship.getName()); } - if (relationship.getTargetEntity() == null) { + if (currentTarget == null) { enableOptions(false); } else { enableInfo(); @@ -222,27 +203,29 @@ public class DbRelationshipDialog extends ProjectDialog { private void initBindings() { targetEntities.addActionListener(action -> { DbEntity selectedItem = ((TargetComboBoxModel) targetEntities.getModel()).selected; - if (relationship.getTargetEntityName() == null) { - relationship.setTargetEntityName(selectedItem.getName()); - } else if (!relationship.getTargetEntityName().equals(selectedItem.getName())) { + boolean joinsReset = false; + if (currentTarget == null) { + currentTarget = selectedItem; + } else if (currentTarget != selectedItem) { if (showWarningDialog(relationship)) { - relationship.removeAllJoins(); - relationship.setTargetEntityName(selectedItem.getName()); + currentTarget = selectedItem; + joinsReset = true; } else { - targetEntities.setSelectedItem(relationship.getTargetEntityName()); + targetEntities.setSelectedItem(currentTarget.getName()); } - relationship.setToDependentPK(false); - toDepPk.setSelected(relationship.isValidForDepPk()); - session.fireDbRelationshipEvent(DbRelationshipEvent.ofChange(this, relationship, relationship.getSourceEntity())); } enableInfo(); + if (joinsReset) { + // joins to the old target make no sense for the new one; reset the uncommitted table rows + ((DbJoinTableModel) table.getModel()).removeAllRows(); + toDepPk.setSelected(false); + toDepPk.setEnabled(false); + } }); addButton.addActionListener(e -> { DbJoinTableModel model = (DbJoinTableModel) table.getModel(); - DbJoin join = new DbJoin(relationship); - relationship.addJoin(join); - model.addRow(join); + model.addRow(new DbJoin(relationship)); table.select(model.getRowCount() - 1); }); @@ -250,51 +233,36 @@ public class DbRelationshipDialog extends ProjectDialog { DbJoinTableModel model = (DbJoinTableModel) table.getModel(); stopEditing(); int row = table.getSelectedRow(); - DbJoin join = model.getJoin(row); + model.removeRow(model.getJoin(row)); - relationship.removeJoin(join); - if (relationship.isValidForDepPk()) { + if (model.isValidForDepPk()) { toDepPk.setEnabled(true); } else { toDepPk.setEnabled(false); toDepPk.setSelected(false); - relationship.setToDependentPK(false); } - - model.removeRow(join); }); saveButton.addActionListener(e -> { - cancelPressed = false; save(); + saved = true; dispose(); }); - cancelButton.addActionListener(e -> { - cancelPressed = true; - dispose(); - }); - - addWindowListener(new WindowAdapter() { - @Override - public void windowClosing(WindowEvent e) { - cancelPressed = true; - } - }); + cancelButton.addActionListener(e -> dispose()); toDepPk.setEnabled(relationship.isValidForDepPk()); toDepPk.addActionListener(selected -> { - boolean isSelected = toDepPk.isSelected(); - DbRelationship reverse = relationship.getReverseRelationship(); - if (reverse != null && reverse.isToDependentPK() && isSelected) { - boolean setToDepPk = JOptionPane.showConfirmDialog( + unsetReverseDepPk = false; + if (toDepPk.isSelected() && reverseRelationship != null && reverseRelationship.isToDependentPK()) { + unsetReverseDepPk = JOptionPane.showConfirmDialog( app.getFrame(), "Unset reverse relationship's \"To Dep PK\" setting?", "Warning", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE) == JOptionPane.OK_OPTION; - relationship.setToDependentPK(setToDepPk); - reverse.setToDependentPK(!setToDepPk); - } else { - relationship.setToDependentPK(toDepPk.isSelected()); + if (!unsetReverseDepPk) { + // both sides can't be dep PK, and the user chose to keep it on the reverse + toDepPk.setSelected(false); + } } }); } @@ -302,10 +270,16 @@ public class DbRelationshipDialog extends ProjectDialog { private void enableInfo() { enableOptions(true); - table.setModel(new DbJoinTableModel(relationship, session, this, true)); - table.getModel().addTableModelListener(change -> { + // carry uncommitted joins over from the previous model, if any; the relationship itself only + // reflects the table state after "Done" + List<DbJoin> joins = table.getModel() instanceof DbJoinTableModel previous + ? previous.getObjectList() + : relationship.getJoins(); + DbJoinTableModel model = new DbJoinTableModel(relationship, session, this, joins, currentTarget); + table.setModel(model); + model.addTableModelListener(change -> { if (change.getLastRow() != Integer.MAX_VALUE) { - toDepPk.setEnabled(relationship.isValidForDepPk()); + toDepPk.setEnabled(model.isValidForDepPk()); } }); @@ -317,7 +291,7 @@ public class DbRelationshipDialog extends ProjectDialog { TableColumn targetColumn = table.getColumnModel().getColumn(DbJoinTableModel.TARGET); JComboBox<String> targetCombo = new CMComboBox<>( - dbAttributeNames(relationship.getTargetEntity()).stream().sorted().toArray(String[]::new)); + dbAttributeNames(currentTarget).stream().sorted().toArray(String[]::new)); AutoCompletion.enable(targetCombo, session::getSelectedDataMap); targetColumn.setCellEditor(new CMAutoCompleteComboBoxCellEditor(targetCombo)); @@ -343,53 +317,81 @@ public class DbRelationshipDialog extends ProjectDialog { private void save() { stopEditing(); - DbJoinTableModel model = (DbJoinTableModel) table.getModel(); - handleNameUpdate(relationship, name.getText().trim()); - model.commit(); + // the single place where the dialog editing state is written to the relationship + relationship.setTargetEntityName(currentTarget != null ? currentTarget.getName() : null); + relationship.setToMany(toMany.isSelected()); + relationship.setToDependentPK(toDepPk.isSelected()); + if (unsetReverseDepPk && reverseRelationship != null) { + reverseRelationship.setToDependentPK(false); + } + + ((DbJoinTableModel) table.getModel()).commit(); // check after commit, as it filters out empty joins boolean updatingReverse = !relationship.getJoins().isEmpty(); - relationship.setToMany(toMany.isSelected()); - ObjectInfo.putToMetaData(app.getMetaData(), relationship, ObjectInfo.COMMENT, comment.getText()); // If new reverse DbRelationship was created, add it to the target. // Don't create reverse with no joins - makes no sense... if (updatingReverse) { - if (reverseRelationship == null) { - reverseRelationship = new DbRelationship(); - reverseRelationship.setName(NameBuilder - .builder(reverseRelationship, relationship.getTargetEntity()) + DbRelationship reverse = reverseRelationship; + if (reverse == null) { + reverse = new DbRelationship(); + reverse.setName(NameBuilder + .builder(reverse, relationship.getTargetEntity()) .baseName(reverseName.getText().trim()) .name()); - reverseRelationship.setSourceEntity(relationship.getTargetEntity()); - reverseRelationship.setTargetEntityName(relationship.getSourceEntity()); - reverseRelationship.setToMany(!relationship.isToMany()); - relationship.getTargetEntity().addRelationship(reverseRelationship); + reverse.setSourceEntity(relationship.getTargetEntity()); + reverse.setTargetEntityName(relationship.getSourceEntity()); + reverse.setToMany(!relationship.isToMany()); + relationship.getTargetEntity().addRelationship(reverse); // fire only if the relationship is to the same entity (needed to update entity view) if (relationship.getSourceEntity() == relationship.getTargetEntity()) { session.fireDbRelationshipEvent(DbRelationshipEvent.ofAdd( - this, reverseRelationship, reverseRelationship.getSourceEntity())); + this, reverse, reverse.getSourceEntity())); } } else { - handleNameUpdate(reverseRelationship, reverseName.getText().trim()); + handleNameUpdate(reverse, reverseName.getText().trim()); } - Collection<DbJoin> reverseJoins = getReverseJoins(); - reverseRelationship.setJoins(reverseJoins); + reverse.setJoins(getReverseJoins(reverse)); - if (!relationship.isToDependentPK() && reverseRelationship.isValidForDepPk()) { - reverseRelationship.setToDependentPK(true); + if (!relationship.isToDependentPK() && reverse.isValidForDepPk()) { + reverse.setToDependentPK(true); } } - fireDbRelationshipEvent(create); + if (create) { + DbEntity dbEntity = relationship.getSourceEntity(); + if (dbEntity.getRelationship(relationship.getName()) == null) { + dbEntity.addRelationship(relationship); + } + + session.fireDbRelationshipEvent(DbRelationshipEvent.ofAdd(this, relationship, dbEntity)); + + DbRelationshipDisplayEvent rde = new DbRelationshipDisplayEvent( + this, + (DataChannelDescriptor) session.project().getRootNode(), + session.getSelectedDataMap(), + dbEntity, + relationship); + + session.displayDbRelationship(rde); + app.getUndoManager().addEdit( + new CreateRelationshipUndoableEdit(session, relationship.getSourceEntity(), + new DbRelationship[]{relationship})); + + } else { + session.fireDbRelationshipEvent( + DbRelationshipEvent.ofChange(this, relationship, relationship.getSourceEntity())); + app.getUndoManager().addEdit(undo); + } } private void handleNameUpdate(DbRelationship rel, String userInputName) { @@ -411,7 +413,7 @@ public class DbRelationshipDialog extends ProjectDialog { session.fireDbRelationshipEvent(DbRelationshipEvent.ofChange(this, rel, rel.getSourceEntity(), oldName)); } - private Collection<DbJoin> getReverseJoins() { + private Collection<DbJoin> getReverseJoins(DbRelationship reverse) { Collection<DbJoin> joins = relationship.getJoins(); if ((joins == null) || (joins.isEmpty())) { @@ -424,40 +426,13 @@ public class DbRelationshipDialog extends ProjectDialog { for (DbJoin pair : joins) { DbJoin reverseJoin = pair.createReverseJoin(); // since reverse relationship is not yet initialized, the reverse join is wired by hand - reverseJoin.setRelationship(reverseRelationship); + reverseJoin.setRelationship(reverse); reverseJoins.add(reverseJoin); } return reverseJoins; } - private void fireDbRelationshipEvent(boolean isCreate) { - if (!isCreate) { - session.fireDbRelationshipEvent( - DbRelationshipEvent.ofChange(this, relationship, relationship.getSourceEntity())); - app.getUndoManager().addEdit(undo); - } else { - DbEntity dbEntity = relationship.getSourceEntity(); - if (dbEntity.getRelationship(relationship.getName()) == null) { - dbEntity.addRelationship(relationship); - } - - session.fireDbRelationshipEvent(DbRelationshipEvent.ofAdd(this, relationship, dbEntity)); - - DbRelationshipDisplayEvent rde = new DbRelationshipDisplayEvent( - this, - (DataChannelDescriptor) session.project().getRootNode(), - session.getSelectedDataMap(), - dbEntity, - relationship); - - session.displayDbRelationship(rde); - app.getUndoManager().addEdit( - new CreateRelationshipUndoableEdit(session, relationship.getSourceEntity(), - new DbRelationship[]{relationship})); - } - } - private boolean showWarningDialog(DbRelationship relationship) { DataChannelDescriptor domain = (DataChannelDescriptor) session.project().getRootNode(); Collection<ObjRelationship> objRelationships = DbRelationshipOps.objRelationshipsUsingDbRelationship(domain, relationship); diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java index 6f37b3848..5258cb378 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbRelationshipPanel.java @@ -267,9 +267,7 @@ public class DbRelationshipPanel extends ProjectPanel implements DbEntityDisplay DbRelationshipTableModel model = (DbRelationshipTableModel) table.getModel(); DbRelationship rel = model.getRelationship(row); - new DbRelationshipDialog(session, app.getFrame()) - .modifyRelationship(rel) - .open(); + DbRelationshipDialog.openForEdit(session, app.getFrame(), rel); } private void valueChanged(ListSelectionEvent e) { diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java index 1af631bb9..d085d39e8 100644 --- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java +++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java @@ -32,41 +32,30 @@ import org.apache.cayenne.map.ObjEntity; import org.apache.cayenne.map.ObjRelationship; import org.apache.cayenne.modeler.event.display.ObjRelationshipDisplayEvent; import org.apache.cayenne.modeler.event.model.ObjRelationshipEvent; -import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel; +import org.apache.cayenne.modeler.project.ProjectComparators; +import org.apache.cayenne.modeler.project.ProjectSession; +import org.apache.cayenne.modeler.toolkit.ProjectDialog; import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel; +import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel; import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox; -import org.apache.cayenne.modeler.toolkit.ProjectDialog; +import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel; +import org.apache.cayenne.modeler.toolkit.tree.EntityTreeRelationshipFilter; import org.apache.cayenne.modeler.ui.dbrelationship.DbRelationshipDialog; -import org.apache.cayenne.modeler.project.ProjectSession; import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit; import org.apache.cayenne.modeler.undo.RelationshipUndoableEdit; -import org.apache.cayenne.modeler.project.ProjectComparators; -import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel; -import org.apache.cayenne.modeler.toolkit.tree.EntityTreeRelationshipFilter; import org.apache.cayenne.project.extension.info.ObjectInfo; import org.apache.cayenne.util.DeleteRuleUpdater; -import javax.swing.JButton; -import javax.swing.JCheckBox; -import javax.swing.JComboBox; -import javax.swing.JLabel; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JTextField; +import javax.swing.*; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.TreePath; -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.Window; +import java.awt.*; import java.awt.event.ItemEvent; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Objects; -import java.util.Optional; /** * Modal "ObjRelationship inspector" — name, target entity, semantics, collection type, @@ -363,12 +352,7 @@ public class ObjRelationshipInfoDialog extends ProjectDialog implements TreeSele private void createRelationship() { DbEntity dbEntity = relationship.getSourceEntity().getDbEntity(); - DbRelationshipDialog dialog = - new DbRelationshipDialog(session, this).createNewRelationship(dbEntity); - dialog.open(); - - Optional<DbRelationship> dbRelationship = dialog.getRelationship(); - if (dbRelationship.isPresent()) { + DbRelationshipDialog.openForCreate(session, this, dbEntity).ifPresent(dbRelationship -> { Object[] oldPath = new Object[]{getStartEntity()}; EntityTreeModel treeModel = (EntityTreeModel) pathBrowser.getModel(); @@ -379,9 +363,9 @@ public class ObjRelationshipInfoDialog extends ProjectDialog implements TreeSele Object[] path = new Object[oldPath.length + 1]; System.arraycopy(oldPath, 0, path, 0, path.length - 1); - path[path.length - 1] = dbRelationship.get(); + path[path.length - 1] = dbRelationship; pathBrowser.setSelectionPath(new TreePath(path)); - } + }); } private void setDeleteRule() {
