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


Reply via email to