Author: andrey
Date: Wed Nov 12 00:20:59 2008
New Revision: 713309
URL: http://svn.apache.org/viewvc?rev=713309&view=rev
Log:
CAY-1077 ObjRelationship Mapping Dialog Improvements
New dialog
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/EntitySyncController.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoController.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoDialog.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoModel.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipPathBrowser.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MultiColumnBrowser.java
cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/cayennemodeler-strings.properties
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ClassNameUpdater.java
Wed Nov 12 00:20:59 2008
@@ -113,7 +113,7 @@
view.setModal(true);
centerView();
makeCloseableOnEscape();
- view.show();
+ view.setVisible(true);
}
return this.updatePerformed;
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/EntitySyncController.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/EntitySyncController.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/EntitySyncController.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/EntitySyncController.java
Wed Nov 12 00:20:59 2008
@@ -19,19 +19,19 @@
package org.apache.cayenne.modeler.dialog.objentity;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.modeler.util.CayenneController;
-import org.apache.cayenne.modeler.util.DeleteRuleUpdater;
-import org.apache.cayenne.util.EntityMergeSupport;
-
-import java.awt.*;
+import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.modeler.util.CayenneController;
+import org.apache.cayenne.modeler.util.DeleteRuleUpdater;
+import org.apache.cayenne.util.EntityMergeSupport;
+
public class EntitySyncController extends CayenneController {
protected DbEntity dbEntity;
@@ -107,7 +107,7 @@
view.setModal(true);
centerView();
makeCloseableOnEscape();
- view.show();
+ view.setVisible(true);
return cancel[0] ? null : merger;
}
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoController.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoController.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoController.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoController.java
Wed Nov 12 00:20:59 2008
@@ -19,7 +19,22 @@
package org.apache.cayenne.modeler.dialog.objentity;
-import org.apache.cayenne.map.*;
+import java.awt.Component;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Vector;
+
+import javax.swing.JOptionPane;
+import javax.swing.event.TreeSelectionEvent;
+import javax.swing.event.TreeSelectionListener;
+import javax.swing.tree.TreePath;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Relationship;
import org.apache.cayenne.map.event.RelationshipEvent;
import org.apache.cayenne.modeler.Application;
import org.apache.cayenne.modeler.ProjectController;
@@ -31,15 +46,6 @@
import org.scopemvc.core.Control;
import org.scopemvc.core.ControlException;
-import javax.swing.*;
-import javax.swing.event.TreeSelectionEvent;
-import javax.swing.event.TreeSelectionListener;
-import javax.swing.tree.TreePath;
-import java.awt.*;
-import java.util.Collection;
-import java.util.List;
-import java.util.Vector;
-
/**
* @since 1.1
*/
@@ -49,6 +55,10 @@
public static final String CANCEL_CONTROL =
"cayenne.modeler.mapObjRelationship.cancel.button";
public static final String NEW_TOONE_CONTROL =
"cayenne.modeler.mapObjRelationship.newtoone.button";
public static final String NEW_TOMANY_CONTROL =
"cayenne.modeler.mapObjRelationship.newtomany.button";
+
+ public static final String SELECT_PATH_CONTROL =
"cayenne.modeler.mapObjRelationship.select.path.button";
+ public static final String REVERT_PATH_CONTROL =
"cayenne.modeler.mapObjRelationship.revert.path.button";
+ public static final String CLEAR_PATH_CONTROL =
"cayenne.modeler.mapObjRelationship.clear.path.button";
protected ProjectController mediator;
@@ -56,10 +66,7 @@
ObjRelationship relationship) {
this.mediator = mediator;
- Collection<ObjEntity> objEntities =
mediator.getCurrentDataMap().getNamespace().getObjEntities();
- ObjRelationshipInfoModel model = new ObjRelationshipInfoModel(
- relationship,
- objEntities);
+ ObjRelationshipInfoModel model = new
ObjRelationshipInfoModel(relationship);
setModel(model);
}
@@ -104,10 +111,55 @@
else if (control.matchesID(NEW_TOMANY_CONTROL)) {
createRelationship(true);
}
+ else if (control.matchesID(SELECT_PATH_CONTROL)) {
+ selectPath();
+ }
+ else if (control.matchesID(REVERT_PATH_CONTROL)) {
+ revertPath();
+ }
+ else if (control.matchesID(CLEAR_PATH_CONTROL)) {
+ clearPath();
+ }
+ }
+
+ /**
+ * Saves selected path
+ */
+ protected void selectPath() {
+ ObjRelationshipInfoModel model = (ObjRelationshipInfoModel) getModel();
+ model.selectPath();
+ }
+
+ /**
+ * Reverts current path to saved path
+ */
+ protected void revertPath() {
+ ObjRelationshipInfoModel model = (ObjRelationshipInfoModel) getModel();
+ ((ObjRelationshipInfoDialog)
getView()).setSelectionPath(model.getSavedDbRelationships());
+ model.setDbRelationships(model.getSavedDbRelationships());
+ }
+
+ /**
+ * Clears paths and selections in browser
+ */
+ protected void clearPath() {
+ ObjRelationshipInfoModel model = (ObjRelationshipInfoModel) getModel();
+ ((ObjRelationshipInfoDialog)
getView()).getPathBrowser().clearSelection();
+ model.setDbRelationships(new ArrayList<DbRelationship>());
}
protected void saveMapping() {
ObjRelationshipInfoModel model = (ObjRelationshipInfoModel) getModel();
+
+ if
(!model.getDbRelationships().equals(model.getSavedDbRelationships())) {
+ if (JOptionPane.showConfirmDialog((Component) getView(),
+ "You have changed Db Relationship path. Do you want it to
be saved?",
+ "Save ObjRelationship",
+ JOptionPane.YES_NO_OPTION)
+ == JOptionPane.YES_OPTION) {
+ selectPath();
+ }
+ }
if (model.savePath()) {
mediator.fireObjRelationshipEvent(new RelationshipEvent(Application
@@ -125,19 +177,19 @@
*/
protected void createRelationship(boolean toMany) {
ObjRelationshipInfoModel model = (ObjRelationshipInfoModel) getModel();
- DbEntity source = model.getStartEntity();
- DbEntity target = model.getEndEntity();
-
- DbRelationship dbRel = model.getLastRelationship();
- if (dbRel != null) {
- source = (DbEntity) dbRel.getSourceEntity();
- }
+ DbEntity target = model.getNewRelTarget();
if (target == null) {
JOptionPane.showMessageDialog((Component) getView(), "Please
select target entity first.",
"Warning", JOptionPane.WARNING_MESSAGE);
return;
}
+
+ DbEntity source = model.getStartEntity();
+ DbRelationship dbRel = model.getLastRelationship();
+ if (dbRel != null) {
+ source = (DbEntity) dbRel.getTargetEntity();
+ }
DbRelationship dbRelationship = (DbRelationship) NamedObjectFactory
.createRelationship(source, target, toMany);
@@ -168,7 +220,7 @@
treeModel.invalidateChildren(source);
treeModel.invalidateChildren(target);
- Object[] path = new Object[Math.max(oldPath.length, 2)];
+ Object[] path = new Object[oldPath.length + 1];
System.arraycopy(oldPath, 0, path, 0, path.length - 1);
path[path.length - 1] = dbRelationship;
@@ -196,13 +248,13 @@
* Initialize root with one of mapped ObjEntities.
*/
Collection<ObjEntity> objEntities =
target.getDataMap().getMappedEntities(target);
- model.setObjectTarget(objEntities.size() == 0 ? null :
objEntities.iterator().next());
List<DbRelationship> relPath = new
Vector<DbRelationship>(selectedPath.getPathCount() - 1);
for (int i = 1; i < selectedPath.getPathCount(); i++) {
relPath.add((DbRelationship) selectedPath.getPathComponent(i));
}
model.setDbRelationships(relPath);
+ model.setObjectTarget(objEntities.size() == 0 ? null :
objEntities.iterator().next());
((ObjRelationshipInfoDialog) getView()).updateCollectionChoosers();
}
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoDialog.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoDialog.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoDialog.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoDialog.java
Wed Nov 12 00:20:59 2008
@@ -19,9 +19,20 @@
package org.apache.cayenne.modeler.dialog.objentity;
-import com.jgoodies.forms.builder.PanelBuilder;
-import com.jgoodies.forms.layout.CellConstraints;
-import com.jgoodies.forms.layout.FormLayout;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.ComponentOrientation;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.List;
+
+import javax.swing.JButton;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.tree.TreePath;
+
import org.apache.cayenne.map.Attribute;
import org.apache.cayenne.map.DbRelationship;
import org.apache.cayenne.map.Relationship;
@@ -29,14 +40,18 @@
import org.apache.cayenne.modeler.util.EntityTreeModel;
import org.apache.cayenne.modeler.util.MultiColumnBrowser;
import org.apache.cayenne.modeler.util.PanelFactory;
-import org.scopemvc.view.swing.*;
+import org.scopemvc.view.swing.SAction;
+import org.scopemvc.view.swing.SButton;
+import org.scopemvc.view.swing.SComboBox;
+import org.scopemvc.view.swing.SLabel;
+import org.scopemvc.view.swing.SListCellRenderer;
+import org.scopemvc.view.swing.SPanel;
+import org.scopemvc.view.swing.STextField;
+import org.scopemvc.view.swing.SwingView;
-import javax.swing.*;
-import javax.swing.tree.TreePath;
-import java.awt.*;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-import java.util.List;
+import com.jgoodies.forms.builder.PanelBuilder;
+import com.jgoodies.forms.layout.CellConstraints;
+import com.jgoodies.forms.layout.FormLayout;
/**
* A view of the dialog for mapping an ObjRelationship to one or more
DbRelationships.
@@ -77,9 +92,22 @@
SButton newToManyButton = new SButton(new SAction(
ObjRelationshipInfoController.NEW_TOMANY_CONTROL));
newToManyButton.setEnabled(true);
-
+
+ SButton selectPathButton = new SButton(new SAction(
+ ObjRelationshipInfoController.SELECT_PATH_CONTROL));
+ selectPathButton.setEnabled(true);
+ SButton revertPathButton = new SButton(new SAction(
+ ObjRelationshipInfoController.REVERT_PATH_CONTROL));
+ revertPathButton.setEnabled(true);
+ SButton clearPathButton = new SButton(new SAction(
+ ObjRelationshipInfoController.CLEAR_PATH_CONTROL));
+ clearPathButton.setEnabled(true);
+
STextField relationshipName = new STextField(25);
relationshipName.setSelector(ObjRelationshipInfoModel.RELATIONSHIP_NAME_SELECTOR);
+
+ SLabel currentPathLabel = new SLabel();
+
currentPathLabel.setSelector(ObjRelationshipInfoModel.CURRENT_PATH_SELECTOR);
SLabel sourceEntityLabel = new SLabel();
sourceEntityLabel
@@ -105,6 +133,12 @@
pathBrowser.setPreferredColumnSize(BROWSER_CELL_DIM);
pathBrowser.setDefaultRenderer();
+ SComboBox newRelCombo = new SComboBox();
+
newRelCombo.setSelector(ObjRelationshipInfoModel.NEW_REL_TARGETS_SELECTOR);
+
newRelCombo.setSelectionSelector(ObjRelationshipInfoModel.NEW_REL_TARGET_SELECTOR);
+ renderer = (SListCellRenderer) newRelCombo.getRenderer();
+ renderer.setTextSelector("name");
+
// enable/disable map keys for collection type selection
collectionTypeCombo.addActionListener(new ActionListener() {
@@ -121,38 +155,66 @@
CellConstraints cc = new CellConstraints();
PanelBuilder builder = new PanelBuilder(
new FormLayout(
- "right:max(50dlu;pref), 3dlu, fill:min(150dlu;pref),
3dlu, 120dlu, 3dlu, fill:min(120dlu;pref)",
- "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu,
p, 3dlu, top:14dlu, 3dlu, top:p:grow"));
+ "right:max(50dlu;pref), 3dlu, fill:min(150dlu;pref),
3dlu, 300dlu, 3dlu, fill:min(120dlu;pref)",
+ "p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu, p, 3dlu,
p, 3dlu, p, 3dlu, top:14dlu, 3dlu, top:p:grow"));
builder.setDefaultDialogBorder();
builder.addSeparator("ObjRelationship Information", cc.xywh(1, 1, 5,
1));
builder.addLabel("Relationship:", cc.xy(1, 3));
builder.add(relationshipName, cc.xywh(3, 3, 1, 1));
- builder.addLabel("Source:", cc.xy(1, 5));
- builder.add(sourceEntityLabel, cc.xywh(3, 5, 1, 1));
- builder.addLabel("Target:", cc.xy(1, 7));
- builder.add(targetCombo, cc.xywh(3, 7, 1, 1));
- collectionTypeLabel = builder.addLabel("Collection Type:", cc.xy(1,
9));
- builder.add(collectionTypeCombo, cc.xywh(3, 9, 1, 1));
- mapKeysLabel = builder.addLabel("Map Key:", cc.xy(1, 11));
- builder.add(mapKeysCombo, cc.xywh(3, 11, 1, 1));
+
+ builder.addLabel("Current Db Path:", cc.xy(1, 5));
+ builder.add(currentPathLabel, cc.xywh(3, 5, 5, 1));
+
+ builder.addLabel("Source:", cc.xy(1, 7));
+ builder.add(sourceEntityLabel, cc.xywh(3, 7, 1, 1));
+ builder.addLabel("Target:", cc.xy(1, 9));
+ builder.add(targetCombo, cc.xywh(3, 9, 1, 1));
+ collectionTypeLabel = builder.addLabel("Collection Type:", cc.xy(1,
11));
+ builder.add(collectionTypeCombo, cc.xywh(3, 11, 1, 1));
+ mapKeysLabel = builder.addLabel("Map Key:", cc.xy(1, 13));
+ builder.add(mapKeysCombo, cc.xywh(3, 13, 1, 1));
- builder.addSeparator("Mapping to DbRelationships", cc.xywh(1, 13, 5,
1));
+ builder.addSeparator("Mapping to DbRelationships", cc.xywh(1, 15, 5,
1));
builder.add(new JScrollPane(
pathBrowser,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
- JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), cc.xywh(1, 15, 5,
3));
+ JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED), cc.xywh(1, 17, 5,
3));
+
+ PanelBuilder newRelPanelBuilder = new PanelBuilder(
+ new FormLayout(
+ "right:max(50dlu;pref), 3dlu, fill:150dlu, 3dlu,
300dlu",
+ "p, 3dlu, p, 3dlu, p, 3dlu"));
+ newRelPanelBuilder.setDefaultDialogBorder();
+ newRelPanelBuilder.addSeparator("Creating New Db Relationships",
cc.xywh(1, 1, 5, 1));
+ newRelPanelBuilder.addLabel("Target:", cc.xy(1, 3));
+ newRelPanelBuilder.add(newRelCombo, cc.xywh(3, 3, 1, 1));
+
+ JPanel buttonsPanel = new JPanel(new BorderLayout());
- JPanel newRelationshipsButtons = new JPanel(new
FlowLayout(FlowLayout.LEADING));
- newRelationshipsButtons.add(newToOneButton);
+ JPanel newRelationshipsButtons = new JPanel(new
FlowLayout(FlowLayout.CENTER));
+
newRelationshipsButtons.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);
newRelationshipsButtons.add(newToManyButton);
+ newRelationshipsButtons.add(newToOneButton);
+
+ JPanel newRelPanel = new JPanel(new BorderLayout());
+ JPanel selectButtonPanel = new JPanel(new
FlowLayout(FlowLayout.CENTER));
+
+ selectButtonPanel.add(selectPathButton);
+ selectButtonPanel.add(revertPathButton);
+ selectButtonPanel.add(clearPathButton);
+ newRelPanel.add(selectButtonPanel, BorderLayout.NORTH);
+ newRelPanel.add(newRelPanelBuilder.getPanel(), BorderLayout.CENTER);
+
+ buttonsPanel.add(newRelPanel, BorderLayout.NORTH);
+ buttonsPanel.add(newRelationshipsButtons);
+ buttonsPanel.add(PanelFactory.createButtonPanel(new JButton[] {
+ saveButton, cancelButton
+ }), BorderLayout.SOUTH);
- builder.add(newRelationshipsButtons, cc.xywh(7, 15, 1, 3));
add(builder.getPanel(), BorderLayout.CENTER);
- add(PanelFactory.createButtonPanel(new JButton[] {
- saveButton, cancelButton
- }), BorderLayout.SOUTH);
+ add(buttonsPanel, BorderLayout.SOUTH);
}
/**
@@ -200,19 +262,25 @@
pathBrowser.setModel(treeModel);
- List<DbRelationship> rels = model.getDbRelationships();
- if (rels.size() > 0) {
- Object[] path = new Object[rels.size() + 1];
- path[0] = model.getStartEntity();
-
- System.arraycopy(rels.toArray(), 0, path, 1, rels.size());
-
- pathBrowser.setSelectionPath(new TreePath(path));
- }
+ setSelectionPath(model.getSavedDbRelationships());
}
}
/**
+ * Selects path in browser
+ */
+ void setSelectionPath(List<DbRelationship> rels) {
+ ObjRelationshipInfoModel model = (ObjRelationshipInfoModel)
getController().getModel();
+
+ Object[] path = new Object[rels.size() + 1];
+ path[0] = model.getStartEntity();
+
+ System.arraycopy(rels.toArray(), 0, path, 1, rels.size());
+
+ pathBrowser.setSelectionPath(new TreePath(path));
+ }
+
+ /**
* Updates 'collection type' and 'map keys' comboboxes
*/
boolean updateCollectionChoosers() {
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoModel.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoModel.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoModel.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoModel.java
Wed Nov 12 00:20:59 2008
@@ -19,8 +19,20 @@
package org.apache.cayenne.modeler.dialog.objentity;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Relationship;
import org.apache.cayenne.modeler.util.Comparators;
import org.apache.cayenne.modeler.util.DeleteRuleUpdater;
import org.apache.cayenne.util.Util;
@@ -28,8 +40,6 @@
import org.scopemvc.core.Selector;
import org.scopemvc.model.basic.BasicModel;
-import java.util.*;
-
/**
* A Scope model for mapping an ObjRelationship to one or more DbRelationships.
*
@@ -51,6 +61,11 @@
.fromString("objectTarget");
public static final Selector OBJECT_TARGETS_SELECTOR = Selector
.fromString("objectTargets");
+
+ public static final Selector NEW_REL_TARGET_SELECTOR =
Selector.fromString("newRelTarget");
+
+ public static final Selector NEW_REL_TARGETS_SELECTOR =
Selector.fromString("newRelTargets");
+
public static final Selector RELATIONSHIP_NAME_SELECTOR = Selector
.fromString("relationshipName");
public static final Selector TARGET_COLLECTIONS_SELECTOR = Selector
@@ -59,6 +74,8 @@
.fromString("targetCollection");
public static final Selector MAP_KEYS_SELECTOR =
Selector.fromString("mapKeys");
public static final Selector MAP_KEY_SELECTOR =
Selector.fromString("mapKey");
+
+ public static final Selector CURRENT_PATH_SELECTOR =
Selector.fromString("currentPath");
protected ObjRelationship relationship;
@@ -67,15 +84,24 @@
*/
protected List<DbRelationship> dbRelationships;
+ /**
+ * List of current saved DB Relationships
+ */
+ protected List<DbRelationship> savedDbRelationships;
+
protected ObjEntity objectTarget;
protected List<ObjEntity> objectTargets;
protected List<String> targetCollections;
- protected List mapKeys;
+ protected List<String> mapKeys;
protected String relationshipName;
protected String targetCollection;
protected String mapKey;
+
+ protected String currentPath;
+ protected DbEntity newRelTarget;
+ protected List<DbEntity> newRelTargets;
- public ObjRelationshipInfoModel(ObjRelationship relationship,
Collection<ObjEntity> objEntities) {
+ public ObjRelationshipInfoModel(ObjRelationship relationship) {
this.relationship = relationship;
this.relationshipName = relationship.getName();
@@ -85,20 +111,11 @@
if (targetCollection == null) {
targetCollection = ObjRelationship.DEFAULT_COLLECTION_TYPE;
}
-
- // prepare entities - copy those that have DbEntities mapped, and then
sort
-
- this.objectTargets = new ArrayList<ObjEntity>(objEntities.size());
- Iterator<ObjEntity> entities = objEntities.iterator();
- while (entities.hasNext()) {
- ObjEntity entity = entities.next();
- if (entity.getDbEntity() != null) {
- objectTargets.add(entity);
- }
- }
+
this.objectTarget = (ObjEntity) relationship.getTargetEntity();
-
- Collections.sort(objectTargets,
Comparators.getNamedObjectComparator());
+ if (objectTarget != null) {
+ updateTargetCombo(objectTarget.getDbEntity());
+ }
// validate -
// current limitation is that an ObjRelationship must have source
@@ -110,12 +127,16 @@
targetCollections.add(ObjRelationship.DEFAULT_COLLECTION_TYPE);
targetCollections.add(COLLECTION_TYPE_MAP);
targetCollections.add(COLLECTION_TYPE_SET);
+
+ this.newRelTargets = new
ArrayList<DbEntity>(relationship.getSourceEntity().getDataMap().getDbEntities());
+ Collections.sort(newRelTargets,
Comparators.getNamedObjectComparator());
- this.mapKeys = new ArrayList();
+ this.mapKeys = new ArrayList<String>();
initMapKeys();
// setup path
dbRelationships = new
ArrayList<DbRelationship>(relationship.getDbRelationships());
+ selectPath();
// this sets the right enabled state of collection type selectors
fireModelChange(ModelChangeTypes.VALUE_CHANGED,
DB_RELATIONSHIPS_SELECTOR);
@@ -123,6 +144,23 @@
// add dummy last relationship if we are not connected
connectEnds();
}
+
+ /**
+ * Places in objectTargets list all ObjEntities for specified DbEntity
+ */
+ @SuppressWarnings("unchecked")
+ protected void updateTargetCombo(DbEntity dbTarget) {
+ // copy those that have DbEntities mapped to dbTarget, and then sort
+
+ this.objectTargets = new ArrayList<ObjEntity>();
+
+ if (dbTarget != null) {
+
objectTargets.addAll(dbTarget.getDataMap().getMappedEntities(dbTarget));
+ Collections.sort(objectTargets,
Comparators.getNamedObjectComparator());
+ }
+
+ fireModelChange(ModelChangeTypes.VALUE_CHANGED,
OBJECT_TARGETS_SELECTOR);
+ }
public ObjRelationship getRelationship() {
return relationship;
@@ -136,6 +174,13 @@
}
/**
+ * @return list of saved DB Relationships
+ */
+ public List<DbRelationship> getSavedDbRelationships() {
+ return savedDbRelationships;
+ }
+
+ /**
* @return last relationship in the path, or <code>null</code> if path is
empty
*/
public DbRelationship getLastRelationship() {
@@ -147,6 +192,35 @@
*/
public void setDbRelationships(List<DbRelationship> rels) {
this.dbRelationships = rels;
+
+ updateTargetCombo(rels.size() > 0 ?
+ (DbEntity) rels.get(rels.size() - 1).getTargetEntity() : null);
+ }
+
+ /**
+ * Sets list of saved DB Relationships
+ */
+ public void setSavedDbRelationships(List<DbRelationship> rels) {
+ this.savedDbRelationships = rels;
+
+ String currPath = "";
+ for (DbRelationship rel : rels) {
+ currPath += "->" + rel.getName();
+ }
+
+ if (rels.size() > 0) {
+ currPath = currPath.substring(2);
+ }
+
+ currentPath = currPath;
+ fireModelChange(ModelChangeTypes.VALUE_CHANGED, CURRENT_PATH_SELECTOR);
+ }
+
+ /**
+ * Confirms selection of Db Rels
+ */
+ public void selectPath() {
+ setSavedDbRelationships(new
ArrayList<DbRelationship>(dbRelationships));
}
/**
@@ -255,9 +329,9 @@
relationship.setName(relationshipName);
}
- if (dbRelationships.size() > 0) {
+ if (savedDbRelationships.size() > 0) {
DbEntity lastEntity = (DbEntity)
- dbRelationships.get(dbRelationships.size() -
1).getTargetEntity();
+ savedDbRelationships.get(savedDbRelationships.size() -
1).getTargetEntity();
if (objectTarget == null || objectTarget.getDbEntity() !=
lastEntity) {
/**
@@ -283,13 +357,13 @@
// check for path modifications
List<DbRelationship> oldPath = relationship.getDbRelationships();
- if (oldPath.size() != dbRelationships.size()) {
+ if (oldPath.size() != savedDbRelationships.size()) {
hasChanges = true;
updatePath();
}
else {
for (int i = 0; i < oldPath.size(); i++) {
- DbRelationship next = dbRelationships.get(i);
+ DbRelationship next = savedDbRelationships.get(i);
if (oldPath.get(i) != next) {
hasChanges = true;
@@ -417,6 +491,10 @@
this.mapKey = mapKey;
}
+ public String getCurrentPath() {
+ return currentPath;
+ }
+
public String getTargetCollection() {
return targetCollection;
}
@@ -432,4 +510,16 @@
public List<String> getTargetCollections() {
return targetCollections;
}
+
+ public List<DbEntity> getNewRelTargets() {
+ return newRelTargets;
+ }
+
+ public DbEntity getNewRelTarget() {
+ return newRelTarget;
+ }
+
+ public void setNewRelTarget(DbEntity newRelTarget) {
+ this.newRelTarget = newRelTarget;
+ }
}
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipPathBrowser.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipPathBrowser.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipPathBrowser.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipPathBrowser.java
Wed Nov 12 00:20:59 2008
@@ -18,15 +18,16 @@
****************************************************************/
package org.apache.cayenne.modeler.dialog.objentity;
-import org.apache.cayenne.modeler.util.MultiColumnBrowser;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
-import javax.swing.*;
+import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.tree.TreePath;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
+
+import org.apache.cayenne.modeler.util.MultiColumnBrowser;
/**
* Multi-column browser for obj relationships
@@ -52,8 +53,6 @@
@Override
protected void installColumn(BrowserPanel panel) {
- panel.setToolTipText("Double-click on row to extend path");
-
if (panelOpener == null) {
panelOpener = new PanelOpener();
}
@@ -97,8 +96,8 @@
/**
* Invoked when the mouse has been clicked on a component.
*/
- public void mouseClicked(MouseEvent e) {
- if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 2)
{
+ public void mouseReleased(MouseEvent e) {
+ if (SwingUtilities.isLeftMouseButton(e)) {
process(e);
}
}
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
Wed Nov 12 00:20:59 2008
@@ -19,14 +19,22 @@
package org.apache.cayenne.modeler.util;
-import org.apache.cayenne.map.Attribute;
-import org.apache.cayenne.map.Entity;
-import org.apache.cayenne.map.Relationship;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Vector;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
-import java.util.*;
+
+import org.apache.cayenne.map.Attribute;
+import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.Relationship;
/**
* Swing TreeModel for Entity attributes and relationships
@@ -97,7 +105,7 @@
}
synchronized (sortedChildren) {
- Object key = node;
+ Object key = entity;
Object[] sortedForNode = sortedChildren.get(key);
if (sortedForNode == null) {
@@ -140,7 +148,7 @@
*/
public void invalidateChildren(Entity entity) {
synchronized (sortedChildren) {
- sortedChildren.remove(entity.getName());
+ sortedChildren.remove(entity);
}
}
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MultiColumnBrowser.java
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MultiColumnBrowser.java?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MultiColumnBrowser.java
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/MultiColumnBrowser.java
Wed Nov 12 00:20:59 2008
@@ -19,7 +19,26 @@
package org.apache.cayenne.modeler.util;
-import javax.swing.*;
+import java.awt.BorderLayout;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridLayout;
+import java.awt.Rectangle;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import javax.swing.AbstractListModel;
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.ImageIcon;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JViewport;
+import javax.swing.ListCellRenderer;
+import javax.swing.ListSelectionModel;
import javax.swing.border.Border;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
@@ -27,11 +46,6 @@
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
-import java.awt.*;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
/**
@@ -328,6 +342,13 @@
}
/**
+ * Clears selection in browser and removes all unnessesary columns
+ */
+ public void clearSelection() {
+ updateFromModel(model.getRoot(), -1);
+ }
+
+ /**
* Removes all local listeners from the column
*/
protected void uninstallColumn(BrowserPanel panel) {
Modified:
cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/cayennemodeler-strings.properties
URL:
http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/cayennemodeler-strings.properties?rev=713309&r1=713308&r2=713309&view=diff
==============================================================================
---
cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/cayennemodeler-strings.properties
(original)
+++
cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/cayennemodeler-strings.properties
Wed Nov 12 00:20:59 2008
@@ -101,6 +101,13 @@
cayenne.modeler.mapObjRelationship.newtomany.button = New To-Many
DbRelationship
cayenne.modeler.mapObjRelationship.newtomany.button.ShortDescription = New
To-Many DbRelationship
+cayenne.modeler.mapObjRelationship.select.path.button = Save Path
+cayenne.modeler.mapObjRelationship.select.path.button.ShortDescription = Save
Path
+cayenne.modeler.mapObjRelationship.revert.path.button = Revert Path
+cayenne.modeler.mapObjRelationship.revert.path.button.ShortDescription =
Revert Path
+cayenne.modeler.mapObjRelationship.clear.path.button = Clear Path
+cayenne.modeler.mapObjRelationship.clear.path.button.ShortDescription = Clear
Path
+
// QueryType Dialog
cayenne.modeler.queryType.create.button = Create
cayenne.modeler.queryType.create.button.ShortDescription = Create