You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2006/07/23 00:44:41 UTC

svn commit: r424641 [2/2] - in /incubator/cayenne/soc/trunk/cayenne-rop/rop-browser: ./ META-INF/ lib/ lib/server/ src/org/apache/cayenne/ropbrowser/ src/org/apache/cayenne/ropbrowser/actions/ src/org/apache/cayenne/ropbrowser/commands/ src/org/apache/...

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ElementDiagram.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ElementDiagram.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ElementDiagram.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ElementDiagram.java Sat Jul 22 15:44:39 2006
@@ -22,8 +22,6 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
 import org.objectstyle.cayenne.ObjectContext;
 import org.objectstyle.cayenne.query.NamedQuery;
 
@@ -35,22 +33,23 @@
  */
 public class ElementDiagram {
 	
-	// TODO consider removing update connections
-	// TODO fix delete
 	// TODO label connections (not just tooltip)
 	
 	/** property indicating a node (element) has been added */
 	public static final String PROP_NODE_ADDED = "ObjectDiagram.NodeAdded";
 	/** property indicating that a node (element) has been removed */
 	public static final String PROP_NODE_REMOVED = "ObjectDiagram.NodeRemoved";
+	public static final String PROP_LAYOUT = "ObjectDiagram.LayoutChanged";
 	/** the ModelElements contained in the diagram */
-	protected List<ModelElement> objects = new ArrayList<ModelElement>();
+	protected List<ModelElement> elements = new ArrayList<ModelElement>();
 	/** the Cayenne context in which the objects represented by the ModelElements exist */
 	protected ObjectContext context;
 	
 	/** Delegate used to implemenent property-change-support. */
 	private transient PropertyChangeSupport pcsDelegate = new PropertyChangeSupport(this);
 	
+	private boolean autoLayout;
+	
 	/**
 	 * @param context the Cayenne context in which the objects in the diagram are found
 	 * @param query the name of the query contained in the Cayenne data map from which
@@ -61,49 +60,31 @@
 		
 		NamedQuery select = new NamedQuery(query);
 		Object matches = this.context.performQuery(select);
-		ModelElement rootElement = ModelElementFactory.createModelElement(matches, null);
+		CollectionModelElement rootElement = new CollectionModelElement(null, "ROOT");
+		rootElement.setObject(matches);
+		rootElement.setRoot(true);
 		rootElement.setDiagram(this);
 		addElement(rootElement);
+		
+		autoLayout = true;
 	}
 
 	/**
 	 * Add a ModelElement to the diagram
 	 * @param element the element to add
 	 * @return the element or its equivalent if it already exists
-	 */
-	public ModelElement addElement(ModelElement element) {
+	 */	
+	public boolean addElement(ModelElement element) {
 		if (element != null) {
-			if (!objects.contains(element)) {
-				objects.add(element);
-				if (element instanceof CollectionModelElement) {
-					for (ModelElement child : objects) {
-						if (child instanceof SingleModelElement) {
-							if (((CollectionModelElement) element).contains(child.getCurrent())) {
-								MemberConnection connection = new MemberConnection(element, child);
-								connection.connect();
-							}
-						}
-					}
-				}
-				else if (element instanceof SingleModelElement) {
-					for (ModelElement child : objects) {
-						if (child instanceof CollectionModelElement) {
-							if (((CollectionModelElement) child).contains(element.getCurrent())
-									&& !((SingleModelElement) element).memberOf(child)) {
-								MemberConnection connection = new MemberConnection(child, element);
-								connection.connect();
-							}
-						}
-					}
-				}
+			if (!elements.contains(element)) {
+				elements.add(element);
 				
 				firePropertyChange(PROP_NODE_ADDED, null, element);
-			}
-			else {
-				element = objects.get(objects.indexOf(element));
+				
+				return true;
 			}
 		}
-		return element;
+		return false;
 	}
 	
 	/**
@@ -111,14 +92,9 @@
 	 * @param element the element to remove
 	 * @return true if removed; false otherwise
 	 */
-	public boolean removeChild(ModelElement element) {
+	public boolean removeElement(ModelElement element) {
 		if (element != null) {
-			Iterator i = element.getSourceConnections().iterator();
-			while (i.hasNext()) {
-				Connection conn  = (Connection) i.next();
-				removeChild(conn.getTarget());
-			}
-			objects.remove(element);
+			elements.remove(element);
 			firePropertyChange(PROP_NODE_REMOVED, null, element);
 			return true;
 		}
@@ -126,8 +102,8 @@
 	}
 	
 	/** Return a List of Objects in this diagram.  The returned List should not be modified. */
-	public List getObjects() {
-		return objects;
+	public List<ModelElement> getElements() {
+		return elements;
 	}
 	
 	/** 
@@ -162,5 +138,58 @@
 		if (pcsDelegate.hasListeners(property)) {
 			pcsDelegate.firePropertyChange(property, oldValue, newValue);
 		}
+	}
+
+	public void removeObject(AbstractObject current) {
+		for (ModelElement element : elements) {
+			if (element instanceof CollectionModelElement) {
+				((CollectionModelElement) element).removeObject(current);
+			}
+		}
+	}
+
+	public void toggleAutoLayout() {
+		autoLayout = !autoLayout;
+		firePropertyChange(PROP_LAYOUT, !autoLayout, autoLayout);
+	}
+	
+	public boolean isAutoLayoutDesired() {
+		return autoLayout;
+	}
+
+	public ModelElement getElement(ModelElement newElement) {
+		for (ModelElement element : elements) {
+			if (element.equals(newElement)) {
+				return element;
+			}
+		}
+		return null;
+	}
+
+	public void createMemberConnections(ModelElement element) {
+		if (element instanceof CollectionModelElement) {
+			for (ModelElement child : elements) {
+				if (child instanceof SingleModelElement) {
+					if (((CollectionModelElement) element).contains(child.getCurrentObject())) {
+						MemberConnection connection = new MemberConnection(element, child);
+						connection.connect();
+					}
+				}
+			}
+		}
+		else if (element instanceof SingleModelElement) {
+			for (ModelElement child : elements) {
+				if (child instanceof CollectionModelElement) {
+					if (((CollectionModelElement) child).contains(element.getCurrentObject())) {
+						MemberConnection connection = new MemberConnection(child, element);
+						connection.connect();
+					}
+				}
+			}
+		}
+	}
+	
+	public ObjectContext getObjectContext() {
+		return context;
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ModelElement.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ModelElement.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ModelElement.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ModelElement.java Sat Jul 22 15:44:39 2006
@@ -21,6 +21,8 @@
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.IPropertySource;
 
@@ -33,52 +35,47 @@
  */
 public abstract class ModelElement implements IPropertySource {
 	
-	/** Property indicating a transient visual property has changed */
-	public static final String PROP_TRANSIENT = "ModelElement.transient";
 	/** Property indicating that a source connection has been added or removed */
 	public static final String PROP_SOURCE_CONN = "ModelElement.sourceConnection";
+	
 	/** Property indicating that a target connection has been added or removed */
 	public static final String PROP_TARGET_CONN = "ModelElement.targetConnection";
+
+	/** Property indicating a transient visual property has changed */
+	public static final String PROP_BOUNDS = "ModelElement.bounds";
 	
-	// TODO remove this - ensure uniquing
 	/**
-	 * The ModelElement which initiated the creation of this element. Used to
-	 * prevent duplication of elements.
+	 * Property for changes to the records being displayed by this element.
 	 */
-	protected ModelElement createdFrom;
-	private ElementDiagram diagram;
-
+	public static final String PROP_RECORDS = "ModelElement.Records";
 	
-	protected int x = 0;
-	protected int y = 0;
-	protected int height;
-	protected int width;
+	protected ElementDiagram diagram;
 	
-	protected List<Connection> sourceConnections = new ArrayList<Connection>();
-	protected List<Connection> targetConnections = new ArrayList<Connection>();
+	protected String name;
 	
 	/** Delegate used to implemenent property-change-support. */
 	private transient PropertyChangeSupport pcsDelegate = new PropertyChangeSupport(this);
 	
-	public ModelElement(ModelElement createdFrom) {
-		this.createdFrom = createdFrom;
-		if (createdFrom != null) {
-			this.diagram = createdFrom.getDiagram();
-		}
+	protected List<Connection> sourceConnections = new ArrayList<Connection>();
+	protected List<Connection> targetConnections = new ArrayList<Connection>();
+	
+	protected boolean root = false;
+	
+	private boolean alreadyPolled = false;
+
+	private Rectangle bounds;
+	
+	public ModelElement(ElementDiagram diagram) {
+		this.diagram = diagram;
 	}
 	
-	/** 
-	 * @return copy of the List of Connections originating at the ModelElement.
-	 */
-	public List getSourceConnections() {
-		return new ArrayList<Connection>(sourceConnections);
+	public ModelElement(ElementDiagram diagram, String name) {
+		this.diagram = diagram;
+		this.name = name;
 	}
 
-	/** 
-	 * @return copy of the List of Connections terminating at the ModelElement.
-	 */
-	public List getTargetConnections() {
-		return new ArrayList<Connection>(targetConnections);
+	public void setRoot(boolean root) {
+		this.root = root;
 	}
 	
 	/**
@@ -103,22 +100,6 @@
 			}
 		}
 	}
-
-	public int getX() {
-		return x;
-	}
-
-	public int getY() {
-		return y;
-	}
-
-	public int getWidth() {
-		return width;
-	}
-
-	public int getHeight() {
-		return height;
-	}
 	
 	/** 
 	 * Attach a non-null PropertyChangeListener to this object.
@@ -131,7 +112,7 @@
 		}
 		pcsDelegate.addPropertyChangeListener(l);
 	}
-	
+
 	/** 
 	 * Report a property change to registered listeners (for example edit parts).
 	 * @param property the programmatic name of the property that changed
@@ -143,6 +124,10 @@
 			pcsDelegate.firePropertyChange(property, oldValue, newValue);
 		}
 	}
+
+	public ElementDiagram getDiagram() {
+		return diagram;
+	}
 	
 	/**
 	 * Returns a value for this property source that can be edited in a property sheet.
@@ -152,6 +137,12 @@
 		return this;
 	}
 	
+	public String getName() {
+		return name;
+	}
+	
+	public abstract AbstractObject getCurrentObject();
+
 	/**
 	 * Property descriptors for editing via the Eclipse Properties view.
 	 * <p>Default implementation returns an array of size 0. Extending classes
@@ -160,50 +151,32 @@
 	public IPropertyDescriptor[] getPropertyDescriptors() {
 		return new IPropertyDescriptor[0];
 	}
-	
+
 	/**
 	 * @see org.eclipse.ui.views.properties.IPropertySource#getPropertyValue(java.lang.Object) 
 	 */
 	public abstract Object getPropertyValue(Object id);
 	
-	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object) 
+	/** 
+	 * @return copy of the List of Connections originating at the ModelElement.
 	 */
-	public abstract boolean isPropertySet(Object id);
+	public List<Connection> getSourceConnections() {
+		return new ArrayList<Connection>(sourceConnections);
+	}
 	
 	/** 
-	 * Remove a PropertyChangeListener from this component.
-	 * @param l a PropertyChangeListener instance
+	 * @return copy of the List of Connections terminating at the ModelElement.
 	 */
-	public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
-		if (l != null) {
-			pcsDelegate.removePropertyChangeListener(l);
-		}
+	public List<Connection> getTargetConnections() {
+		return new ArrayList<Connection>(targetConnections);
 	}
 	
 	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+	 * @see org.eclipse.ui.views.properties.IPropertySource#isPropertySet(java.lang.Object) 
 	 */
-	public abstract void resetPropertyValue(Object id);
+	public abstract boolean isPropertySet(Object id);
 	
 	/**
-	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
-	 */
-	public abstract void setPropertyValue(Object id, Object value);
-
-	public void setSize(int width, int height) {
-		this.width = width;
-		this.height = height;
-		firePropertyChange(PROP_TRANSIENT, null, null);
-	}
-
-	public void setLocation(int x, int y) {
-		this.x = x;
-		this.y = y;
-		firePropertyChange(PROP_TRANSIENT, null, null);
-	}
-
-	/**
 	 * Remove a connection from the ModelElement. The connection
 	 * will be removed from the source or target list depending
 	 * upon its role in the connection.
@@ -221,29 +194,79 @@
 		}
 	}
 	
-	public abstract AbstractObject getCurrent();
-	
-	public String getName() {
-		if (getCurrent() != null) {
-			return getCurrent().getName();
+	/** 
+	 * Remove a PropertyChangeListener from this component.
+	 * @param l a PropertyChangeListener instance
+	 */
+	public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
+		if (l != null) {
+			pcsDelegate.removePropertyChangeListener(l);
 		}
-		return null;
-	}
-	
-	public ElementDiagram getDiagram() {
-		return diagram;
 	}
 	
+	/**
+	 * @see org.eclipse.ui.views.properties.IPropertySource#resetPropertyValue(java.lang.Object)
+	 */
+	public abstract void resetPropertyValue(Object id);
+
 	public void setDiagram(ElementDiagram diagram) {
 		this.diagram = diagram;
 	}
 	
+	public abstract void setObject(Object object);
+	
 	/**
-	 * @return the ModelElement which initiated the creation of this element.
+	 * @see org.eclipse.ui.views.properties.IPropertySource#setPropertyValue(java.lang.Object, java.lang.Object)
 	 */
-	public ModelElement getCreatedFrom() {
-		return createdFrom;
+	public abstract void setPropertyValue(Object id, Object value);
+	
+	public boolean isConnectedToRoot() {
+		if (isRoot()) {
+			return true;
+		}
+		if (!alreadyPolled) {
+			alreadyPolled = true;
+			for (Connection conn : getTargetConnections()) {
+				if (conn.getSource().isConnectedToRoot()) {
+					alreadyPolled = false;
+					return true;
+				}
+			}
+		}
+		
+		alreadyPolled = false;
+		return false;
 	}
 	
-	public abstract void setData(Object object);
+	public boolean isRoot() {
+		return this.root;
+	}
+
+	public void deleteCurrentObject() {
+		getCurrentObject().getObjectContext().deleteObject(getCurrentObject());
+		firePropertyChange(PROP_RECORDS, null, getCurrentObject());
+	}
+
+	public abstract void addObject(AbstractObject object);
+
+	public void modifyBounds(Rectangle newBounds) {
+		Rectangle oldBounds = this.bounds;
+		if (!newBounds.equals(oldBounds))
+		{
+			this.bounds = newBounds;
+			firePropertyChange(PROP_BOUNDS, oldBounds, this.bounds);
+		}
+	}
+
+	public void setBounds(Rectangle newBounds) {
+		this.bounds = newBounds;
+	}
+	
+	/**
+	 * @return Returns the bounds.
+	 */
+	public Rectangle getBounds()
+	{
+		return bounds;
+	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/SingleModelElement.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/SingleModelElement.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/SingleModelElement.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/SingleModelElement.java Sat Jul 22 15:44:39 2006
@@ -18,17 +18,9 @@
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
 
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-import org.objectstyle.cayenne.map.EntityResolver;
-import org.objectstyle.cayenne.map.ObjAttribute;
-import org.objectstyle.cayenne.map.ObjEntity;
+import org.objectstyle.cayenne.map.Relationship;
 
 /**
  * Class representing a collection of AbstractObjects.
@@ -49,20 +41,8 @@
 	/**
 	 * @param createdFrom the ModelElement which initiated this element's creation.
 	 */
-	public SingleModelElement(ModelElement createdFrom) {
-		super(createdFrom);
-	}
-
-	/**
-	 * Gets the name of the CollectionModelElement.
-	 * 
-	 * @return the name as a String, or null if it cannot be determined.
-	 */
-	public String getName() {
-		if (object != null) {
-			return object.getName();
-		}
-		return null;
+	public SingleModelElement(ElementDiagram diagram, String name) {
+		super(diagram, name);
 	}
 	
 	/**
@@ -71,15 +51,18 @@
 	 * own property change events when the underlying data is changed.
 	 * @param value may be null, an empty list or a list of AbstractObjects.
 	 */
-	public void setData(Object value) {
+	public void setObject(Object value) {
 		
-		if (value == null) {
-			throw new IllegalArgumentException();
-		}
+		AbstractObject oldObject = this.object;
 		
 		this.object = (AbstractObject) value;
-			
-		this.object.addPropertyChangeListener(this);
+		
+		if (object != null) {
+			this.object.addPropertyChangeListener(this);
+			name = this.object.getName();
+		}
+		
+		firePropertyChange(PROP_RECORDS, oldObject, object);
 	}
 	
 	/**
@@ -89,75 +72,56 @@
 	 * CollectionModelElement, or just the latter if the former is null.
 	 */
 	public IPropertyDescriptor[] getPropertyDescriptors() {
-		return object.getPropertyDescriptors();
-	}
-	
-	/**
-	 * @return all the {@link org.objectstyle.cayenne.map.Relationship} of the currently displayed AbstractObject,
-	 * or null if no object is being displayed.
-	 */
-	public Collection getRelationships() {
-		return object.getRelationships();
+		if (object != null) {
+			return object.getPropertyDescriptors();
+		}
+		return new IPropertyDescriptor[0];
 	}
 
 	@Override
 	public Object getPropertyValue(Object id) {
-		return object.getPropertyValue(id);
+		if (object != null) {
+			return object.getPropertyValue(id);
+		}
+		return null;
 	}
 
 	@Override
 	public boolean isPropertySet(Object id) {
-		return object.isPropertySet(id);
+		if (object != null) {
+			return object.isPropertySet(id);
+		}
+		return false;
 	}
 
 	@Override
 	public void resetPropertyValue(Object id) {
-		object.resetPropertyValue(id);
+		if (object != null) {
+			object.resetPropertyValue(id);
+		}
 	}
 
 	@Override
 	public void setPropertyValue(Object id, Object value) {
-		object.setPropertyValue(id, value);
+		if (object != null) {
+			object.setPropertyValue(id, value);
+		}
 	}
 	
 	/**
 	 * @return the AbstractObject objectly being displayed.
 	 */
-	public AbstractObject getCurrent() {
+	public AbstractObject getCurrentObject() {
 		return object;
 	}
 
 	/**
-	 * @return all the {@link org.objectstyle.cayenne.map.Attribute} of the objectly displayed AbstractObject,
-	 * or null if no object is being displayed.
-	 */
-	public Collection getAttributes() {
-		return object.getObjectContext().getEntityResolver().getObjEntity(object.getName()).getAttributes();
-	}
-
-	/**
-	 * @return the ModelElement which initiated the creation of this element.
-	 */
-	public ModelElement getCreatedFrom() {
-		return createdFrom;
-	}
-
-	/**
 	 * Listens for property changes in the underlying AbstractObject
 	 * and fires property change notifications of its own.
 	 */
 	public void propertyChange(PropertyChangeEvent evt) {
 		firePropertyChange(evt.getPropertyName(), evt.getOldValue(), evt.getNewValue());
 	}
-
-	public boolean memberOf(ModelElement child) {
-		for (Connection conn : targetConnections) {
-			if (conn instanceof MemberConnection && conn.getSource() == child) {
-				return true;				
-			}
-		}
-		return false;
-	}
 	
 	/**
 	 * Used to compare two CollectionModelElements to determine if one is
@@ -165,10 +129,32 @@
 	 */
 	public boolean equals(Object o) {
 		if (o instanceof SingleModelElement) {
-			if (this.object.equals(((SingleModelElement) o).getCurrent())) {
-				return true;
-			}
+			return (this.object == ((SingleModelElement) o).getCurrentObject()) &&
+				(this.name.equals(((ModelElement) o).getName()));
 		}
 		return false;
+	}
+
+	public ModelElement followRelationship(Relationship relationship) {
+		for (Connection conn : getSourceConnections()) {
+			if (conn instanceof RelationshipConnection) {
+				if (((RelationshipConnection) conn).getRelationship() == relationship) {
+					return conn.getTarget();
+				}
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public void addObject(AbstractObject object) {
+		for (Connection conn : getTargetConnections()) {
+			if (conn instanceof RelationshipConnection) {
+				RelationshipConnection relConn = (RelationshipConnection) conn;
+				conn.getSource().getCurrentObject().setRelationship(relConn.getRelationship(), getCurrentObject(), object);
+				//object.setRelationship(relConn.getRelationship(), object);
+			}
+		}
+		setObject(object);
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/CollectionEditPart.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/CollectionEditPart.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/CollectionEditPart.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/CollectionEditPart.java Sat Jul 22 15:44:39 2006
@@ -18,25 +18,18 @@
 
 import java.beans.PropertyChangeEvent;
 
+import org.apache.cayenne.ropbrowser.actions.InsertAction;
+import org.apache.cayenne.ropbrowser.commands.ObjectInsertCommand;
 import org.apache.cayenne.ropbrowser.figures.CollectionFigure;
 import org.apache.cayenne.ropbrowser.figures.ElementFigure;
-import org.apache.cayenne.ropbrowser.figures.AbstractButton;
 import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
-import org.apache.cayenne.ropbrowser.model.Connection;
-import org.apache.cayenne.ropbrowser.model.ElementDiagram;
-import org.apache.cayenne.ropbrowser.model.MemberConnection;
 import org.apache.cayenne.ropbrowser.model.ModelElement;
-import org.apache.cayenne.ropbrowser.model.RelationshipConnection;
 import org.apache.cayenne.ropbrowser.policies.CollectionDirectEditPolicy;
 import org.apache.cayenne.ropbrowser.policies.CollectionSelectionPolicy;
-import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.commands.Command;
 
 /**
  * EditPart for the {@link CollectionModelElement} class. Allows
@@ -44,7 +37,7 @@
  * 
  * @author Marcel Gordon
  */
-class CollectionEditPart extends ElementEditPart {
+public class CollectionEditPart extends ElementEditPart {
 	
 	/**
 	 * Extends super to allow scrolling through records on double-click and
@@ -55,18 +48,15 @@
 	protected void createEditPolicies() {
 		super.createEditPolicies();
 		
-		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new CollectionSelectionPolicy());
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new CollectionDirectEditPolicy());
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new CollectionSelectionPolicy(getModelCast()));
+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new CollectionDirectEditPolicy(getModelCast()));
 	}
 		
 	/**
 	 * @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#createFigure()
 	 */
-	protected IFigure createFigure() {
-		
-		CollectionModelElement model = getModelCast();
-		
-		CollectionFigure figure = new CollectionFigure(model);
+	protected IFigure createFigure() {		
+		CollectionFigure figure = new CollectionFigure(this);
 				
 		return figure;
 	}
@@ -78,10 +68,7 @@
 		super.propertyChange(evt);
 		
 		String prop = evt.getPropertyName();
-		if (CollectionModelElement.PROP_CURRENT_RECORD.equals(prop)) {
-			getModelCast().updateConnectedElements();
-		}
-		if (!ModelElement.PROP_TRANSIENT.equals(prop) && !ModelElement.PROP_TARGET_CONN.equals(prop) && !ModelElement.PROP_SOURCE_CONN.equals(prop)) {
+		if (!ModelElement.PROP_BOUNDS.equals(prop) && !ModelElement.PROP_TARGET_CONN.equals(prop) && !ModelElement.PROP_SOURCE_CONN.equals(prop)) {
 			((ElementFigure) getFigure()).refresh();
 		}
 	}
@@ -89,25 +76,9 @@
 	private CollectionModelElement getModelCast() {
 		return (CollectionModelElement) getModel();
 	}
-
-	/**
-	 * Handles {@link RequestConstants#REQ_OPEN} and {@link RequestConstants#REQ_DIRECT_EDIT} requests
-	 * to allow scrolling through records and expansion of relationships.
-	 * 
-	 * @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
-	 */
-	public void performRequest(Request request)
-	{
-		// TODO deal with these in terms of commands / policies
-		// TODO keybinding
-		if (request.getType().equals(RequestConstants.REQ_OPEN)) {
-			getModelCast().next();
-			getModelCast().updateConnectedElements();
-		}
-		else if (request.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {
-			if (getModelCast().getCurrent() != null) {
-				((ElementFigure) getFigure()).doButtonAtPoint(((DirectEditRequest) request).getLocation().getCopy(), getModelCast());
-			}
-		}
+	
+	public Command getCommand(Request request) {
+		// handle requests not in policies; pass the rest along
+		return super.getCommand(request); 
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ConnectionEditPart.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ConnectionEditPart.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ConnectionEditPart.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ConnectionEditPart.java Sat Jul 22 15:44:39 2006
@@ -18,13 +18,13 @@
 
 import org.apache.cayenne.ropbrowser.model.MemberConnection;
 import org.apache.cayenne.ropbrowser.model.RelationshipConnection;
+import org.apache.cayenne.ropbrowser.policies.SingleSelectionPolicy;
 import org.eclipse.draw2d.Graphics;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.Label;
 import org.eclipse.draw2d.PolygonDecoration;
 import org.eclipse.draw2d.PolylineConnection;
-import org.eclipse.draw2d.PolylineDecoration;
-import org.eclipse.draw2d.RotatableDecoration;
+import org.eclipse.gef.EditPolicy;
 import org.eclipse.gef.editparts.AbstractConnectionEditPart;
 
 /**

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java Sat Jul 22 15:44:39 2006
@@ -18,17 +18,15 @@
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.util.Iterator;
 import java.util.List;
 
-import org.apache.cayenne.ropbrowser.commands.ElementSetConstraintCommand;
 import org.apache.cayenne.ropbrowser.layout.DelegatingLayoutManager;
 import org.apache.cayenne.ropbrowser.model.ElementDiagram;
 import org.apache.cayenne.ropbrowser.model.ModelElement;
-import org.apache.cayenne.ropbrowser.policies.ElementXYLayoutEditPolicy;
 import org.eclipse.draw2d.ConnectionLayer;
 import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.FreeformLayer;
-import org.eclipse.draw2d.FreeformLayout;
 import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.MarginBorder;
 import org.eclipse.draw2d.ShortestPathConnectionRouter;
@@ -36,15 +34,9 @@
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.gef.LayerConstants;
-import org.eclipse.gef.Request;
-import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
 import org.eclipse.gef.editpolicies.RootComponentEditPolicy;
-import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
-import org.eclipse.gef.requests.ChangeBoundsRequest;
-import org.eclipse.gef.requests.CreateRequest;
 
-// TODO discover why toggling layout modes changes the decorations on the connections
 
 /**
  * EditPart for the ElementDiagram class, the root of the model.
@@ -113,7 +105,7 @@
 	 */
 	protected List getModelChildren() {
 		ElementDiagram diagram = (ElementDiagram) this.getModel();
-		return  diagram.getObjects(); // return a list of objects
+		return  diagram.getElements(); // return a list of objects
 	}
 	
 	/**
@@ -126,25 +118,92 @@
 				|| ElementDiagram.PROP_NODE_REMOVED.equals(prop)) {
 			refreshChildren();
 		}
+		else if (ElementDiagram.PROP_LAYOUT.equals(prop)) {
+			getFigure().setLayoutManager(delegatingLayoutManager);
+		}
 	}
-	
+
+	public boolean isAutoLayoutDesired() {
+		return ((ElementDiagram) getModel()).isAutoLayoutDesired();
+	}
+
 	/**
-	 * Passes on to the delegating layout manager that the layout type has
-	 * changed. The delegating layout manager will then decide whether to
-	 * delegate layout to the XY or Graph layout
+	 * Updates the table bounds in the model so that the same bounds can be
+	 * restored after saving
+	 * 
+	 * @return whether the procedure execute successfully without any omissions.
+	 *         The latter occurs if any TableFigure has no bounds set for any of
+	 *         the Table model objects
 	 */
-	protected void handleLayoutChange(PropertyChangeEvent evt)
+	public boolean setTableModelBounds()
 	{
-		Boolean layoutType = (Boolean) evt.getNewValue();
-		boolean isManualLayoutDesired = layoutType.booleanValue();
-		getFigure().setLayoutManager(delegatingLayoutManager);
-	}
 
-	public boolean isLayoutManualDesired() {
-		return false;
+		List tableParts = getChildren();
+
+		for (Iterator iter = tableParts.iterator(); iter.hasNext();)
+		{
+			ElementEditPart tablePart = (ElementEditPart) iter.next();
+			Figure tableFigure = (Figure) tablePart.getFigure();
+
+			//if we don't find a node for one of the children then we should
+			// continue
+			if (tableFigure == null)
+				continue;
+
+			Rectangle bounds = tableFigure.getBounds().getCopy();
+			ModelElement table = (ModelElement) tablePart.getModel();
+			table.setBounds(bounds);
+		}
+
+		return true;
+
 	}
 
-	public boolean isLayoutManualAllowed() {
+	/**
+	 * Updates the bounds of the table figure (without invoking any event
+	 * handling), and sets layout constraint data
+	 * 
+	 * @return whether the procedure execute successfully without any omissions.
+	 *         The latter occurs if any Table objects have no bounds set or if
+	 *         no figure is available for the TablePart
+	 */
+	public boolean setTableFigureBounds(boolean updateConstraint)
+	{
+
+		List tableParts = getChildren();
+
+		for (Iterator iter = tableParts.iterator(); iter.hasNext();)
+		{
+			ElementEditPart tablePart = (ElementEditPart) iter.next();
+			ModelElement table = (ModelElement) tablePart.getModel();
+
+			//now check whether we can find an entry in the tableToNodesMap
+			Rectangle bounds = table.getBounds();
+			if (bounds == null)
+			{
+				//TODO handle this better
+				return false;
+			}
+			else
+			{
+				Figure tableFigure = (Figure) tablePart.getFigure();
+				if (tableFigure == null)
+				{
+					return false;
+				}
+				else
+				{
+					if (updateConstraint)
+					{
+						//pass the constraint information to the xy layout
+						//setting the width and height so that the preferred size will be applied
+						delegatingLayoutManager.setXYLayoutConstraint(tableFigure, new Rectangle(bounds.x, bounds.y,
+								-1, -1));
+					}
+				}
+			}
+		}
 		return true;
+
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementEditPart.java Sat Jul 22 15:44:39 2006
@@ -20,16 +20,26 @@
 import java.beans.PropertyChangeListener;
 import java.util.List;
 
+import org.apache.cayenne.ropbrowser.actions.DeleteAction;
+import org.apache.cayenne.ropbrowser.actions.HideAction;
+import org.apache.cayenne.ropbrowser.actions.InsertAction;
+import org.apache.cayenne.ropbrowser.commands.HideElementCommand;
+import org.apache.cayenne.ropbrowser.commands.DeleteObjectCommand;
+import org.apache.cayenne.ropbrowser.commands.ObjectInsertCommand;
 import org.apache.cayenne.ropbrowser.model.ModelElement;
 import org.apache.cayenne.ropbrowser.policies.ElementEditPolicy;
 import org.eclipse.draw2d.ChopboxAnchor;
 import org.eclipse.draw2d.ConnectionAnchor;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.ConnectionEditPart;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.gef.GraphicalEditPart;
 import org.eclipse.gef.NodeEditPart;
 import org.eclipse.gef.Request;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.editparts.AbstractGraphicalEditPart;
 
 /**
@@ -50,7 +60,7 @@
 	public void activate() {
 		if (!isActive()) {
 			super.activate();
-			((ModelElement) getModel()).addPropertyChangeListener(this);
+			getModelCast().addPropertyChangeListener(this);
 		}
 	}
 	
@@ -60,7 +70,7 @@
 	public void deactivate() {
 		if (isActive()) {
 			super.deactivate();
-			((ModelElement) getModel()).removePropertyChangeListener(this);
+			getModelCast().removePropertyChangeListener(this);
 		}
 	}
 	
@@ -78,8 +88,11 @@
 	public void propertyChange(PropertyChangeEvent evt) {
 		String prop = evt.getPropertyName();
 		
-		if (ModelElement.PROP_TRANSIENT.equals(prop)) {
-			refreshVisuals();
+		if (ModelElement.PROP_BOUNDS.equals(prop)) {
+			Figure tableFigure = (Figure) getFigure();
+			Rectangle constraint = (Rectangle) evt.getNewValue();
+			ElementDiagramEditPart parent = (ElementDiagramEditPart) getParent();
+			parent.setLayoutConstraint(this, tableFigure, constraint);
 		}
 		else if (ModelElement.PROP_SOURCE_CONN.equals(prop)) {
 			refreshSourceConnections();
@@ -102,12 +115,11 @@
 	 * should extend as this implementation handles basic operations such as resize and move.
 	 */
 	protected void refreshVisuals() {
-		ModelElement model = getModelCast();
-		if (model.getWidth() == 0 && model.getHeight() == 0) {
-			model.setSize(getFigure().getPreferredSize().width, getFigure().getPreferredSize().height);
-		}
-		Rectangle bounds = new Rectangle(model.getX(), model.getY(), model.getWidth(), model.getHeight());
-		((GraphicalEditPart) getParent()).setLayoutConstraint(this, getFigure(), bounds);
+		Figure tableFigure = (Figure) getFigure();
+		Point location = tableFigure.getLocation();
+		ElementDiagramEditPart parent = (ElementDiagramEditPart) getParent();
+		Rectangle constraint = new Rectangle(location.x, location.y, -1, -1);
+		parent.setLayoutConstraint(this, tableFigure, constraint);
 	}
 	
 	/**
@@ -160,5 +172,30 @@
 	 */
 	public ConnectionAnchor getTargetConnectionAnchor(Request request) {
 		return getConnectionAnchor();
+	}
+	
+	/**
+	 * Handles {@link RequestConstants#REQ_OPEN} and {@link RequestConstants#REQ_DIRECT_EDIT} requests
+	 * to allow scrolling through records and expansion of relationships.
+	 * 
+	 * @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
+	 */
+	public void performRequest(Request request)
+	{
+		getViewer().getEditDomain().getCommandStack().execute(getCommand(request));
+	}
+	
+	public Command getCommand(Request request) {
+		if (request.getType().equals(HideAction.HIDE_REQUEST)) {
+			return new HideElementCommand(this.getModelCast());
+		}
+		if (request.getType().equals(InsertAction.INSERT_REQUEST)) {
+			return new ObjectInsertCommand(this.getModelCast());
+		}
+		return super.getCommand(request); 
+	}
+
+	public boolean isRoot() {
+		return getModelCast().isRoot();
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/SingleEditPart.java Sat Jul 22 15:44:39 2006
@@ -18,26 +18,29 @@
 
 import java.beans.PropertyChangeEvent;
 
+import org.apache.cayenne.ropbrowser.actions.DeleteAction;
+import org.apache.cayenne.ropbrowser.commands.ContractRelationshipCommand;
+import org.apache.cayenne.ropbrowser.commands.HideElementCommand;
+import org.apache.cayenne.ropbrowser.commands.ExpandRelationshipCommand;
+import org.apache.cayenne.ropbrowser.commands.DeleteObjectCommand;
 import org.apache.cayenne.ropbrowser.figures.ElementFigure;
-import org.apache.cayenne.ropbrowser.figures.AbstractButton;
 import org.apache.cayenne.ropbrowser.figures.SingleFigure;
 import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
 import org.apache.cayenne.ropbrowser.model.Connection;
-import org.apache.cayenne.ropbrowser.model.ElementDiagram;
-import org.apache.cayenne.ropbrowser.model.MemberConnection;
 import org.apache.cayenne.ropbrowser.model.ModelElement;
 import org.apache.cayenne.ropbrowser.model.RelationshipConnection;
 import org.apache.cayenne.ropbrowser.model.SingleModelElement;
-import org.apache.cayenne.ropbrowser.policies.CollectionDirectEditPolicy;
-import org.apache.cayenne.ropbrowser.policies.CollectionSelectionPolicy;
-import org.eclipse.draw2d.Figure;
+import org.apache.cayenne.ropbrowser.policies.SingleDirectEditPolicy;
+import org.apache.cayenne.ropbrowser.policies.SingleSelectionPolicy;
+import org.eclipse.draw2d.ActionEvent;
+import org.eclipse.draw2d.ActionListener;
+import org.eclipse.draw2d.Button;
+import org.eclipse.draw2d.ButtonModel;
 import org.eclipse.draw2d.IFigure;
-import org.eclipse.draw2d.Label;
-import org.eclipse.draw2d.geometry.Point;
 import org.eclipse.gef.EditPolicy;
 import org.eclipse.gef.Request;
-import org.eclipse.gef.RequestConstants;
-import org.eclipse.gef.requests.DirectEditRequest;
+import org.eclipse.gef.commands.Command;
+import org.objectstyle.cayenne.map.Relationship;
 
 /**
  * EditPart for the {@link CollectionModelElement} class. Allows
@@ -45,7 +48,7 @@
  * 
  * @author Marcel Gordon
  */
-class SingleEditPart extends ElementEditPart {
+public class SingleEditPart extends ElementEditPart implements ActionListener {
 	
 	/**
 	 * Extends super to allow scrolling through records on double-click and
@@ -56,8 +59,8 @@
 	protected void createEditPolicies() {
 		super.createEditPolicies();
 		
-		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new CollectionSelectionPolicy());
-		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new CollectionDirectEditPolicy());
+		installEditPolicy(EditPolicy.SELECTION_FEEDBACK_ROLE, new SingleSelectionPolicy());
+		installEditPolicy(EditPolicy.DIRECT_EDIT_ROLE, new SingleDirectEditPolicy());
 	}
 		
 	/**
@@ -65,9 +68,7 @@
 	 */
 	protected IFigure createFigure() {
 		
-		SingleModelElement model = getModelCast();
-		
-		SingleFigure figure = new SingleFigure(model);
+		SingleFigure figure = new SingleFigure(this);
 				
 		return figure;
 	}
@@ -80,7 +81,7 @@
 		
 		String prop = evt.getPropertyName();
 		
-		if (!ModelElement.PROP_TRANSIENT.equals(prop) && !ModelElement.PROP_TARGET_CONN.equals(prop) && !ModelElement.PROP_SOURCE_CONN.equals(prop)) {
+		if (!ModelElement.PROP_BOUNDS.equals(prop) && !ModelElement.PROP_TARGET_CONN.equals(prop)) {
 			((ElementFigure) getFigure()).refresh();
 		}
 	}
@@ -89,20 +90,42 @@
 		return (SingleModelElement) getModel();
 	}
 
-	/**
-	 * Handles {@link RequestConstants#REQ_OPEN} and {@link RequestConstants#REQ_DIRECT_EDIT} requests
-	 * to allow scrolling through records and expansion of relationships.
-	 * 
-	 * @see org.eclipse.gef.EditPart#performRequest(org.eclipse.gef.Request)
-	 */
-	public void performRequest(Request request)
-	{
-		// TODO deal with these in terms of commands / policies
-		// TODO keybinding
-		if (request.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {
-			if (getModelCast().getCurrent() != null) {
-				((ElementFigure) getFigure()).doButtonAtPoint(((DirectEditRequest) request).getLocation().getCopy(), getModelCast());
+	public Command getCommand(Request request) {
+		if (request.getType().equals(DeleteAction.DELETE_REQUEST)) {
+			return new DeleteObjectCommand(this.getModelCast());
+		}
+		return super.getCommand(request); 
+	}
+
+	public void actionPerformed(ActionEvent event) {
+		ButtonModel buttonModel = ((Button) event.getSource()).getModel();
+		if (buttonModel.isSelected()) {
+			getViewer().getEditDomain().getCommandStack().execute(new ExpandRelationshipCommand(getModelCast(), (Relationship) buttonModel.getUserData()));
+		}
+		else {
+			getViewer().getEditDomain().getCommandStack().execute(new ContractRelationshipCommand(getRelationshipConnection((Relationship) buttonModel.getUserData())));
+		}
+	}
+	
+	public boolean isRelationshipExpanded(Relationship relationship) {
+		for (Connection conn : getModelCast().getSourceConnections()) {
+			if (conn instanceof RelationshipConnection) {
+				if (((RelationshipConnection) conn).getRelationship() == relationship) {
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+	
+	protected RelationshipConnection getRelationshipConnection(Relationship relationship) {
+		for (Connection conn : getModelCast().getSourceConnections()) {
+			if (conn instanceof RelationshipConnection) {
+				if (((RelationshipConnection) conn).getRelationship() == relationship) {
+					return (RelationshipConnection) conn;
+				}
 			}
 		}
+		return null;
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionDirectEditPolicy.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionDirectEditPolicy.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionDirectEditPolicy.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionDirectEditPolicy.java Sat Jul 22 15:44:39 2006
@@ -16,6 +16,8 @@
  */
 package org.apache.cayenne.ropbrowser.policies;
 
+import org.apache.cayenne.ropbrowser.commands.PopOutCommand;
+import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
 import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.editpolicies.DirectEditPolicy;
 import org.eclipse.gef.requests.DirectEditRequest;
@@ -27,9 +29,15 @@
  */
 public class CollectionDirectEditPolicy extends DirectEditPolicy {
 
+	protected CollectionModelElement element;
+	
+	public CollectionDirectEditPolicy(CollectionModelElement element) {
+		this.element = element;
+	}
+	
 	@Override
 	protected Command getDirectEditCommand(DirectEditRequest request) {
-		return null;
+		return new PopOutCommand(element);
 	}
 
 	@Override

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionSelectionPolicy.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionSelectionPolicy.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionSelectionPolicy.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/CollectionSelectionPolicy.java Sat Jul 22 15:44:39 2006
@@ -16,11 +16,12 @@
  */
 package org.apache.cayenne.ropbrowser.policies;
 
-import org.eclipse.gef.EditPart;
+import org.apache.cayenne.ropbrowser.commands.NextObjectCommand;
+import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
 import org.eclipse.gef.Request;
 import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.commands.Command;
 import org.eclipse.gef.editpolicies.SelectionEditPolicy;
-import org.eclipse.gef.requests.SelectionRequest;
 
 /**
  * An empty {@link org.eclipse.gef.editpolicies.SelectionEditPolicy}.
@@ -29,14 +30,22 @@
  */
 public class CollectionSelectionPolicy extends SelectionEditPolicy {
 	
+	protected CollectionModelElement element;
+	
+	public CollectionSelectionPolicy(CollectionModelElement element) {
+		this.element = element;
+	}
+	
 	protected void showSelection() {
 	}
 	
 	protected void hideSelection() {
 	}
 	
-	// TODO fix exception on drag
-	public EditPart getTargetEditPart(Request request) {
-		return null;
+	public Command getCommand(Request request) {
+		if (request.getType().equals(RequestConstants.REQ_OPEN)) {
+			return new NextObjectCommand(element);
+		}
+		return super.getCommand(request);
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementEditPolicy.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementEditPolicy.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementEditPolicy.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementEditPolicy.java Sat Jul 22 15:44:39 2006
@@ -16,7 +16,7 @@
  */
 package org.apache.cayenne.ropbrowser.policies;
 
-import org.apache.cayenne.ropbrowser.commands.ElementDeleteCommand;
+import org.apache.cayenne.ropbrowser.commands.HideElementCommand;
 import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
 import org.apache.cayenne.ropbrowser.model.ElementDiagram;
 import org.apache.cayenne.ropbrowser.model.ModelElement;
@@ -40,11 +40,11 @@
 		if (parent instanceof ElementDiagram && child instanceof ModelElement) {
 			if (child instanceof CollectionModelElement) {
 				// don't allow deletion of the original ModelElement
-				if (((CollectionModelElement) child).getCreatedFrom() == null) {
+				if (((CollectionModelElement) child).isRoot()) {
 					return null;
 				}
 			}
-			return new ElementDeleteCommand((ElementDiagram) parent, (ModelElement) child);
+			return new HideElementCommand((ModelElement) child);
 		}
 		return super.createDeleteCommand(deleteRequest);
 	}

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/ElementXYLayoutEditPolicy.java Sat Jul 22 15:44:39 2006
@@ -17,11 +17,17 @@
 
 import org.apache.cayenne.ropbrowser.commands.ElementSetConstraintCommand;
 import org.apache.cayenne.ropbrowser.model.ModelElement;
+import org.apache.cayenne.ropbrowser.parts.ElementDiagramEditPart;
 import org.apache.cayenne.ropbrowser.parts.ElementEditPart;
+import org.eclipse.draw2d.Figure;
+import org.eclipse.draw2d.IFigure;
 import org.eclipse.draw2d.geometry.Rectangle;
 import org.eclipse.gef.EditPart;
+import org.eclipse.gef.GraphicalEditPart;
 import org.eclipse.gef.Request;
 import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.ConstrainedLayoutEditPolicy;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
 import org.eclipse.gef.editpolicies.XYLayoutEditPolicy;
 import org.eclipse.gef.requests.ChangeBoundsRequest;
 import org.eclipse.gef.requests.CreateRequest;
@@ -42,11 +48,39 @@
 	 */
 	protected Command createChangeConstraintCommand(ChangeBoundsRequest request,
 			EditPart child, Object constraint) {
-		if (child instanceof ElementEditPart && constraint instanceof Rectangle) {
-			return new ElementSetConstraintCommand(
-					(ModelElement) child.getModel(), request, (Rectangle) constraint);
+		if (!(child instanceof ElementEditPart))
+			return null;
+		if (!(constraint instanceof Rectangle))
+			return null;
+
+		ElementEditPart tablePart = (ElementEditPart) child;
+		ModelElement table = (ModelElement) tablePart.getModel();
+		Figure figure = (Figure) tablePart.getFigure();
+		Rectangle oldBounds = figure.getBounds();
+		Rectangle newBounds = (Rectangle) constraint;
+
+		if (oldBounds.width != newBounds.width && newBounds.width != -1)
+			return null;
+		if (oldBounds.height != newBounds.height && newBounds.height != -1)
+			return null;
+
+		ElementSetConstraintCommand command = new ElementSetConstraintCommand(table, oldBounds.getCopy(), newBounds.getCopy());
+		return command;
+	}
+	
+	/**
+	 * Returns the current bounds as the constraint if none can be found in the
+	 * figures Constraint object
+	 */
+	public Rectangle getCurrentConstraintFor(GraphicalEditPart child)
+	{
+		IFigure fig = child.getFigure();
+		Rectangle rectangle = (Rectangle) fig.getParent().getLayoutManager().getConstraint(fig);
+		if (rectangle == null)
+		{
+			rectangle = fig.getBounds();
 		}
-		return super.createChangeConstraintCommand(request, child, constraint);
+		return rectangle;
 	}
 	
 	/**

Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java?rev=424641&view=auto
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java (added)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SelectionHandlesEditPolicy.java Sat Jul 22 15:44:39 2006
@@ -0,0 +1,52 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.cayenne.ropbrowser.policies;
+
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.EditPolicy;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.LayoutEditPolicy;
+import org.eclipse.gef.editpolicies.NonResizableEditPolicy;
+import org.eclipse.gef.requests.CreateRequest;
+
+/**
+ * An edit policy handling the layout of elements.
+ * 
+ * @author Marcel Gordon
+ */
+public class SelectionHandlesEditPolicy extends LayoutEditPolicy {
+
+	@Override
+	protected EditPolicy createChildEditPolicy(EditPart child) {
+		return new NonResizableEditPolicy();
+	}
+
+	@Override
+	protected Command getCreateCommand(CreateRequest request) {
+		return null;
+	}
+
+	@Override
+	protected Command getDeleteDependantCommand(Request request) {
+		return null;
+	}
+
+	@Override
+	protected Command getMoveChildrenCommand(Request request) {
+		return null;
+	}
+}

Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleDirectEditPolicy.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleDirectEditPolicy.java?rev=424641&view=auto
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleDirectEditPolicy.java (added)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleDirectEditPolicy.java Sat Jul 22 15:44:39 2006
@@ -0,0 +1,41 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.cayenne.ropbrowser.policies;
+
+import org.apache.cayenne.ropbrowser.commands.ExpandRelationshipCommand;
+import org.eclipse.gef.RequestConstants;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.editpolicies.DirectEditPolicy;
+import org.eclipse.gef.requests.DirectEditRequest;
+
+/**
+ * An empty {@link org.eclipse.gef.editpolicies.DirectEditPolicy}.
+ * 
+ * @author Marecl Gordon
+ */
+public class SingleDirectEditPolicy extends DirectEditPolicy {
+
+	@Override
+	protected Command getDirectEditCommand(DirectEditRequest request) {
+		return null;
+	}
+
+	@Override
+	protected void showCurrentEditValue(DirectEditRequest request) {
+	}
+
+}

Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleSelectionPolicy.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleSelectionPolicy.java?rev=424641&view=auto
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleSelectionPolicy.java (added)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/policies/SingleSelectionPolicy.java Sat Jul 22 15:44:39 2006
@@ -0,0 +1,33 @@
+/*
+ *  Copyright 2006 The Apache Software Foundation
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.cayenne.ropbrowser.policies;
+
+import org.eclipse.gef.editpolicies.SelectionEditPolicy;
+
+/**
+ * An empty {@link org.eclipse.gef.editpolicies.SelectionEditPolicy}.
+ * 
+ * @author Marcel Gordon
+ */
+public class SingleSelectionPolicy extends SelectionEditPolicy {
+	
+	protected void showSelection() {
+	}
+	
+	protected void hideSelection() {
+	}
+}
\ No newline at end of file

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java?rev=424641&r1=424640&r2=424641&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/views/ControlPanelView.java Sat Jul 22 15:44:39 2006
@@ -36,7 +36,6 @@
 import org.eclipse.ui.forms.widgets.FormToolkit;
 import org.eclipse.ui.part.ViewPart;
 import org.objectstyle.cayenne.ObjectContext;
-import org.objectstyle.cayenne.event.CayenneEvent;
 import org.objectstyle.cayenne.map.EntityResolver;
 import org.objectstyle.cayenne.query.Query;
 
@@ -56,10 +55,8 @@
 	/** toolkit for creating of form elements */
 	private FormToolkit	toolkit;
 	private Form form;
-	// TODO change to a drop down to take advantage of maintained connections
-	// reselecting should switch back
 	/** server to connect to */
-	private Text serverText;
+	private CCombo serverText;
 	/** button initiates connection */
 	private Button connectButton;
 	/** dropdown for selecting a query to run */
@@ -87,10 +84,11 @@
 		form.getBody().setLayout(layout);
 				
 		toolkit.createLabel(form.getBody(), "Server");
-		serverText = toolkit.createText(form.getBody(), "", SWT.NULL);
+		serverText = new CCombo(form.getBody(), SWT.FLAT);
 		serverText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
 		String defaultServer = ROPBrowserPlugin.getDefault().getPluginPreferences().getString(PREF_SERVER);
 		if (defaultServer != null) {
+			serverText.add(defaultServer);
 			serverText.setText(defaultServer);
 		}
 		
@@ -120,6 +118,10 @@
 	 */
 	public void widgetSelected(SelectionEvent e) {
 		if (e.getSource() == connectButton) {
+			if (serverText.indexOf(serverText.getText()) == -1) {
+				serverText.add(serverText.getText());
+			}
+			
 			ROPBrowserPlugin.getDefault().getPluginPreferences().setValue(PREF_SERVER, serverText.getText());
 			
 			ObjectContext currentContext = connectionManager.getObjectContext(serverText.getText());