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 21:04:39 UTC

svn commit: r424788 - in /incubator/cayenne/soc/trunk/cayenne-rop/rop-browser: ./ META-INF/ cayenne/ dist/ lib/server/ src/org/apache/cayenne/ropbrowser/ src/org/apache/cayenne/ropbrowser/actions/ src/org/apache/cayenne/ropbrowser/commands/ src/org/apa...

Author: aadamchik
Date: Sun Jul 23 12:04:37 2006
New Revision: 424788

URL: http://svn.apache.org/viewvc?rev=424788&view=rev
Log:
CAY-606 - cleaning client project

Added:
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/RollbackAction.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/SetNameAction.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/SetNameElementCommand.java
Removed:
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/cayenne/
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/dist/
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/lib/server/
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/server/
Modified:
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/.classpath
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/META-INF/MANIFEST.MF
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ConnectionManager.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditor.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditorContextMenuProvider.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ROPBrowserPlugin.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/DeleteAction.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/DeleteObjectCommand.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/PopOutCommand.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CollectionFigure.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CompartmentFigure.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/ElementFigure.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/SingleFigure.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/AbstractObject.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/CollectionModelElement.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/Connection.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ElementDiagram.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/MemberConnection.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/ModelElement.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/RelationshipConnection.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/SingleModelElement.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Artist.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Gallery.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Painting.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/CollectionEditPart.java
    incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/parts/ElementDiagramEditPart.java

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/.classpath
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/.classpath?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/.classpath (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/.classpath Sun Jul 23 12:04:37 2006
@@ -1,9 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry excluding="org/apache/cayenne/ropbrowser/Artist.java|org/apache/cayenne/ropbrowser/Gallery.java|org/apache/cayenne/ropbrowser/Painting.java|org/apache/cayenne/ropbrowser/auto/|org/apache/cayenne/ropbrowser/server/|org/apache/cayenne/ropbrowser/ModelTest.java" kind="src" path="src"/>
+	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="cayenne"/>
 	<classpathentry kind="lib" path="lib/commons-collections-3.1.jar"/>
 	<classpathentry kind="lib" path="lib/commons-lang-2.1.jar"/>
 	<classpathentry kind="lib" path="lib/commons-logging.jar"/>

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/META-INF/MANIFEST.MF
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/META-INF/MANIFEST.MF?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/META-INF/MANIFEST.MF (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/META-INF/MANIFEST.MF Sun Jul 23 12:04:37 2006
@@ -5,14 +5,14 @@
 Bundle-Version: 1.0.0
 Bundle-Activator: org.apache.cayenne.ropbrowser.ROPBrowserPlugin
 Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.forms,
- org.eclipse.ui.views,
- org.eclipse.gef
 Eclipse-AutoStart: true
 Bundle-ClassPath: lib/hessian-3.0.13.jar,
  lib/commons-logging.jar,
  lib/commons-lang-2.1.jar,
  lib/commons-collections-3.1.jar,
  lib/cayenne-client-nodeps-1.2.jar
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.gef,
+ org.eclipse.ui.views

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ConnectionManager.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ConnectionManager.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ConnectionManager.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ConnectionManager.java Sun Jul 23 12:04:37 2006
@@ -39,10 +39,10 @@
 	
 	private static ConnectionManager _ref;
 	/** All connections made by the application */
-	private Hashtable<String, ObjectContext> connections;
+	private Hashtable<String, ClientConnection> connections;
 	
 	private ConnectionManager() {
-		connections = new Hashtable<String, ObjectContext>();
+		connections = new Hashtable<String, ClientConnection>();
 	}
 	
 	public static ConnectionManager getInstance() {
@@ -59,16 +59,18 @@
 	 */
 	public ObjectContext getObjectContext(String address) {
 		
+		ClientConnection connection;
+		
 		if (connections.containsKey(address)) {
-			return connections.get(address);
+			connection = connections.get(address);
+		}
+		else {
+			connection = new HessianConnection(address, null, null, "conference");
+			connections.put(address, connection);
 		}
-		
-		ClientConnection connection = new HessianConnection(address, null, null, "conference");
 		DataChannel channel = new ClientChannel(connection);
 		// TODO configure query caching
 		ObjectContext context = new CayenneContext(channel);
-		
-		connections.put(address, context);
 		
 		return context;
 	}

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditor.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditor.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditor.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditor.java Sun Jul 23 12:04:37 2006
@@ -21,8 +21,11 @@
 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.actions.RollbackAction;
+import org.apache.cayenne.ropbrowser.actions.SetNameAction;
 import org.apache.cayenne.ropbrowser.actions.ToggleLayoutAction;
 import org.apache.cayenne.ropbrowser.model.ElementDiagram;
+import org.apache.cayenne.ropbrowser.parts.ElementDiagramEditPart;
 import org.apache.cayenne.ropbrowser.parts.ElementEditPartFactory;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.gef.ContextMenuProvider;
@@ -52,8 +55,6 @@
 	public static final String ID = "org.apache.cayenne.ropbrowser.ObjectEditor";
 	/** Root component of the data model */
 	private ElementDiagram elementDiagram;
-	/** ObjectContext for all the objects in the editor */
-	private ObjectContext context;
 	
 	private boolean dirty;
 	
@@ -100,7 +101,7 @@
 	 * Saves changes made in the editor back to the database.
 	 */
 	public void doSave(IProgressMonitor monitor) {
-		context.commitChanges();
+		elementDiagram.commitChanges();
 		dirty = false;
 		firePropertyChange(IEditorPart.PROP_DIRTY);
 	}
@@ -127,8 +128,7 @@
 	 */
 	protected void setInput(IEditorInput input) {
 		super.setInput(input);
-		this.context = ((ObjectEditorInput) input).getContext();
-		elementDiagram = new ElementDiagram(this.context, ((ObjectEditorInput) input).getQuery());
+		elementDiagram = new ElementDiagram(((ObjectEditorInput) input).getContext(), ((ObjectEditorInput) input).getQuery());
 	}
 	
 	protected void createActions() {
@@ -146,11 +146,26 @@
 		getActionRegistry().registerAction(action);
 		getSelectionActions().add(action.getId());
 		
+		action = new SetNameAction(this);
+		getActionRegistry().registerAction(action);
+		getSelectionActions().add(action.getId());
+		
 		action = new ToggleLayoutAction(this);
 		getActionRegistry().registerAction(action);
+		
+		action = new RollbackAction(this);
+		getActionRegistry().registerAction(action);
 	}
 
 	public ElementDiagram getDiagram() {
 		return elementDiagram;
+	}
+	
+	public void dispose() {
+		super.dispose();
+		// do it directly so as not to fire property change events
+		if (isDirty()) {
+			elementDiagram.getObjectContext().rollbackChanges();
+		}
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditorContextMenuProvider.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditorContextMenuProvider.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditorContextMenuProvider.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ObjectEditorContextMenuProvider.java Sun Jul 23 12:04:37 2006
@@ -19,6 +19,8 @@
 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.actions.RollbackAction;
+import org.apache.cayenne.ropbrowser.actions.SetNameAction;
 import org.apache.cayenne.ropbrowser.actions.ToggleLayoutAction;
 import org.eclipse.gef.ContextMenuProvider;
 import org.eclipse.gef.EditPartViewer;
@@ -82,7 +84,17 @@
 			menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
 		}
 		
+		action = getAction(SetNameAction.ID);
+		if (action.isEnabled()) {
+			menu.appendToGroup(GEFActionConstants.GROUP_EDIT, action);
+		}
+		
 		action = getAction(ToggleLayoutAction.ID);
+		if (action.isEnabled()) {
+			menu.appendToGroup(GEFActionConstants.GROUP_REST, action);
+		}
+		
+		action = getAction(RollbackAction.ID);
 		if (action.isEnabled()) {
 			menu.appendToGroup(GEFActionConstants.GROUP_REST, action);
 		}

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ROPBrowserPlugin.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ROPBrowserPlugin.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ROPBrowserPlugin.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/ROPBrowserPlugin.java Sun Jul 23 12:04:37 2006
@@ -17,6 +17,8 @@
 package org.apache.cayenne.ropbrowser;
 
 import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
@@ -27,6 +29,7 @@
 
 	//The shared instance.
 	private static ROPBrowserPlugin plugin;
+	private Font boldFont;
 	
 	/**
 	 * The constructor.
@@ -40,6 +43,7 @@
 	 */
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
+		boldFont = new Font(null, "Arial", 9, SWT.BOLD);
 	}
 
 	/**
@@ -47,6 +51,7 @@
 	 */
 	public void stop(BundleContext context) throws Exception {
 		super.stop(context);
+		boldFont.dispose();
 		plugin = null;
 	}
 
@@ -66,5 +71,9 @@
 	 */
 	public static ImageDescriptor getImageDescriptor(String path) {
 		return AbstractUIPlugin.imageDescriptorFromPlugin("ropbrowser", path);
+	}
+	
+	public Font getBoldFont() {
+		return boldFont;
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/DeleteAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/DeleteAction.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/DeleteAction.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/DeleteAction.java Sun Jul 23 12:04:37 2006
@@ -17,6 +17,7 @@
 
 import java.util.List;
 
+import org.apache.cayenne.ropbrowser.model.ModelElement;
 import org.apache.cayenne.ropbrowser.parts.SingleEditPart;
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.Request;
@@ -54,6 +55,9 @@
 		for (int i=0; i<parts.size(); i++){
 			Object o = parts.get(i);
 			if (!(o instanceof SingleEditPart)) {
+				return false;
+			}
+			if (((ModelElement) ((SingleEditPart) o).getModel()).isNull()) {
 				return false;
 			}
 		}

Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/RollbackAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/RollbackAction.java?rev=424788&view=auto
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/RollbackAction.java (added)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/RollbackAction.java Sun Jul 23 12:04:37 2006
@@ -0,0 +1,37 @@
+/*
+ *  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.actions;
+
+import org.apache.cayenne.ropbrowser.ObjectEditor;
+import org.eclipse.jface.action.Action;
+
+
+public class RollbackAction  extends Action {
+	
+	private ObjectEditor editor;
+	
+	public static final String ID = "org.apache.cayenne.ropbrowser.actions.RollbackAction";
+	
+	public RollbackAction(ObjectEditor editor) {
+		this.editor = editor;
+		setId(ID);
+		setText("Rollback Changes");
+	}
+	
+	public void run() {
+		editor.getDiagram().rollbackChanges();
+	}
+}

Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/SetNameAction.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/SetNameAction.java?rev=424788&view=auto
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/SetNameAction.java (added)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/actions/SetNameAction.java Sun Jul 23 12:04:37 2006
@@ -0,0 +1,72 @@
+/*
+ *  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.actions;
+
+import java.util.List;
+
+import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
+import org.apache.cayenne.ropbrowser.model.ModelElement;
+import org.apache.cayenne.ropbrowser.parts.CollectionEditPart;
+import org.apache.cayenne.ropbrowser.parts.SingleEditPart;
+import org.eclipse.gef.EditPart;
+import org.eclipse.gef.Request;
+import org.eclipse.gef.commands.Command;
+import org.eclipse.gef.commands.CompoundCommand;
+import org.eclipse.gef.ui.actions.SelectionAction;
+import org.eclipse.ui.IWorkbenchPart;
+
+public class SetNameAction extends SelectionAction {
+	
+	private Request request;
+	
+	public static final String ID = "org.apache.cayenne.ropbrowser.actions.SetNameAction";
+	public static final String SET_NAME_REQUEST = "Set Name";
+	
+	public SetNameAction(IWorkbenchPart part) {
+		super(part);
+		setId(ID);
+		setText("Set Name");
+		request = new Request(SET_NAME_REQUEST);
+	}
+
+	protected boolean calculateEnabled() {
+		return canPerformAction();
+	}
+	
+	public void run() {
+		execute(getCommand());
+	}
+	
+	private boolean canPerformAction() {
+		if (getSelectedObjects().isEmpty() || getSelectedObjects().size() > 1)
+			return false;
+		List parts = getSelectedObjects();
+		Object o = parts.get(0);
+		if (!(o instanceof CollectionEditPart)) {
+			return false;
+		}
+		if (((CollectionModelElement) ((CollectionEditPart) o).getModel()).isRoot()) {
+			return true;
+		}
+		return false;
+	}
+	
+	private Command getCommand() {
+		List editparts = getSelectedObjects();
+		EditPart part = (EditPart)editparts.get(0);
+		return part.getCommand(request);
+	}
+}

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/DeleteObjectCommand.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/DeleteObjectCommand.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/DeleteObjectCommand.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/DeleteObjectCommand.java Sun Jul 23 12:04:37 2006
@@ -37,7 +37,7 @@
 		if (element == null) {
 			throw new IllegalArgumentException();
 		}
-		setLabel("element expunction");
+		setLabel("delete");
 		this.element = element;
 	}
 	
@@ -52,7 +52,7 @@
 	 * @see org.eclipse.gef.commands.Command#execute()
 	 */
 	public void execute() {
-		element.getDiagram().removeObject(element.getCurrentObject());
+		//element.getDiagram().removeObject(element.getCurrentObject());
 		element.deleteCurrentObject();
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/PopOutCommand.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/PopOutCommand.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/PopOutCommand.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/PopOutCommand.java Sun Jul 23 12:04:37 2006
@@ -38,13 +38,15 @@
 		return true;
 	}
 	
+	public boolean canExecute() {
+		return !element.isNull();
+	}
+	
 	/**
 	 * @see org.eclipse.gef.commands.Command#execute()
 	 */
 	public void execute() {
-		if (element.getCurrentObject() != null) {
-			redo();
-		}
+		redo();
 	}
 	
 	/**

Added: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/SetNameElementCommand.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/SetNameElementCommand.java?rev=424788&view=auto
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/SetNameElementCommand.java (added)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/commands/SetNameElementCommand.java Sun Jul 23 12:04:37 2006
@@ -0,0 +1,93 @@
+/*
+ *  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.commands;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
+import org.apache.cayenne.ropbrowser.model.Connection;
+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.eclipse.gef.commands.Command;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * Command for deleting an element from the ObjectDiagram.
+ * 
+ * @author Marcel Gordon
+ */
+public class SetNameElementCommand extends Command {
+	
+	/** ModelElement to remove. */
+	private final ModelElement element;
+	
+	private String newName;
+	private String oldName;
+	
+	/**
+	 * Create a command that will remove the ModelElement from its parent ElementDiagram.
+	 * @param parent the ElementDiagram containing the child
+	 * @param child    the ModelElement to remove
+	 * @throws IllegalArgumentException if any parameter is null
+	 */
+	public SetNameElementCommand(ModelElement element) {
+		if (element == null) {
+			throw new IllegalArgumentException();
+		}
+		setLabel("set name");
+		this.element = element;
+	}
+	
+	/**
+	 * @see org.eclipse.gef.commands.Command#canUndo()
+	 */
+	public boolean canUndo() {
+		return true;
+	}
+	
+	/**
+	 * @see org.eclipse.gef.commands.Command#execute()
+	 */
+	public void execute() {
+		oldName = element.getName();
+		InputDialog iDialog = new InputDialog(Display.getCurrent().getActiveShell(), "Set Name", "Enter the name of the object", "", null);
+		int result = iDialog.open();
+		if (result == InputDialog.OK) {
+			newName = iDialog.getValue();
+			redo();
+		}
+	}
+	
+	/**
+	 * @see org.eclipse.gef.commands.Command#redo()
+	 */
+	public void redo() {
+		element.setName(newName);
+	}
+	
+	/**
+	 * @see org.eclipse.gef.commands.Command#undo()
+	 */
+	public void undo() {
+		element.setName(oldName);
+	}
+}
\ No newline at end of file

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CollectionFigure.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CollectionFigure.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CollectionFigure.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CollectionFigure.java Sun Jul 23 12:04:37 2006
@@ -29,10 +29,10 @@
 	protected void setBackgroundColour() {
 		// root figure should be a different colour
 		if (getElementCast().isRoot()) {
-			setBackgroundColor(ColorConstants.lightBlue);
+			name.setBackgroundColor(ColorConstants.lightBlue);
 		}
 		else {
-			setBackgroundColor(ColorConstants.yellow);
+			name.setBackgroundColor(ColorConstants.yellow);
 		}
 	}
 

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CompartmentFigure.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CompartmentFigure.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CompartmentFigure.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/CompartmentFigure.java Sun Jul 23 12:04:37 2006
@@ -17,6 +17,7 @@
 package org.apache.cayenne.ropbrowser.figures;
 
 import org.eclipse.draw2d.AbstractBorder;
+import org.eclipse.draw2d.Border;
 import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.Graphics;
 import org.eclipse.draw2d.IFigure;
@@ -34,14 +35,14 @@
 		ToolbarLayout layout = new ToolbarLayout();
 		layout.setMinorAlignment(ToolbarLayout.ALIGN_TOPLEFT);
 		layout.setStretchMinorAxis(false);
-		layout.setSpacing(2);
+		layout.setSpacing(5);
 		setLayoutManager(layout);
 		setBorder(new CompartmentFigureBorder());
 	}
 	    
 	public class CompartmentFigureBorder extends AbstractBorder {
 		public Insets getInsets(IFigure figure) {
-			return new Insets(1,0,0,0);
+			return new Insets(5,5,5,5);
 		}
 		public void paint(IFigure figure, Graphics graphics, Insets insets) {
 			graphics.drawLine(getPaintRectangle(figure, insets).getTopLeft(), tempRect.getTopRight());

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/ElementFigure.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/ElementFigure.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/ElementFigure.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/ElementFigure.java Sun Jul 23 12:04:37 2006
@@ -18,6 +18,7 @@
 
 import java.util.Iterator;
 
+import org.apache.cayenne.ropbrowser.ROPBrowserPlugin;
 import org.apache.cayenne.ropbrowser.model.AbstractObject;
 import org.apache.cayenne.ropbrowser.model.ModelElement;
 import org.apache.cayenne.ropbrowser.parts.ElementEditPart;
@@ -26,6 +27,9 @@
 import org.eclipse.draw2d.Label;
 import org.eclipse.draw2d.LineBorder;
 import org.eclipse.draw2d.ToolbarLayout;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Font;
+import org.eclipse.swt.widgets.Display;
 import org.objectstyle.cayenne.map.Attribute;
 
 /**
@@ -41,7 +45,7 @@
 	/** name of the object, or MSG_NULL_RESULT if none can be obtained */
 	protected Label name;
 	/** name to be used where no name can be located */
-	public static final String MSG_NULL_RESULT = "NULL";
+	public static final String MSG_NULL_RESULT = "NULL"; 
 	
 	protected ElementEditPart part;
 	
@@ -62,6 +66,8 @@
 	protected void addComponents() {
 		name = new Label();
 		add(name);
+		name.setOpaque(true);
+		name.setFont(ROPBrowserPlugin.getDefault().getBoldFont());
 		
 		add(attributeFigure);
 	}
@@ -86,15 +92,18 @@
 	}
 
 	protected void setAttributes(AbstractObject model) {
-		getAttributeCompartment().removeAll();
-		
 		if (model != null) {
+			getAttributeCompartment().removeAll();
+			
 			Iterator i = model.getAttributes().iterator();
 			while (i.hasNext()) {
 				Attribute a = (Attribute) i.next();
 				Label l = new Label(a.getName() + " : " + model.getPropertyValue(a.getName()));
+				if (model.isDeleted()) {
+					l.setForegroundColor(ColorConstants.gray);
+				}
 				getAttributeCompartment().add(l);
-			}
+			}	
 		}
 	}
 

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/SingleFigure.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/SingleFigure.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/SingleFigure.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/figures/SingleFigure.java Sun Jul 23 12:04:37 2006
@@ -15,16 +15,13 @@
  */
 package org.apache.cayenne.ropbrowser.figures;
 
-import org.apache.cayenne.ropbrowser.model.AbstractObject;
-import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
 import org.apache.cayenne.ropbrowser.model.SingleModelElement;
 import org.apache.cayenne.ropbrowser.parts.SingleEditPart;
-import org.eclipse.draw2d.ActionEvent;
-import org.eclipse.draw2d.ActionListener;
 import org.eclipse.draw2d.Button;
 import org.eclipse.draw2d.Clickable;
 import org.eclipse.draw2d.ColorConstants;
-import org.objectstyle.cayenne.PersistenceState;
+import org.eclipse.draw2d.CompoundBorder;
+import org.eclipse.draw2d.MarginBorder;
 import org.objectstyle.cayenne.map.Relationship;
 
 public class SingleFigure extends ElementFigure {
@@ -38,11 +35,11 @@
 	
 	protected void setBackgroundColour() {
 		if (getElementCast().getCurrentObject() != null &&
-				getElementCast().getCurrentObject().getPersistenceState() == PersistenceState.DELETED) {
-			setBackgroundColor(ColorConstants.red);
+				getElementCast().isDeleted()) {
+			name.setBackgroundColor(ColorConstants.red);
 		}
 		else {
-			setBackgroundColor(ColorConstants.lightGray);
+			name.setBackgroundColor(ColorConstants.green);
 		}
 	}
 
@@ -66,7 +63,6 @@
 		if (getElementCast().getCurrentObject() == null) return;
 		
 		Button relButton;
-		String buttonLabel;
 		for (Object o : getElementCast().getCurrentObject().getRelationships()) {
 			Relationship relationship = (Relationship) o;
 			relButton = new Button(relationship.getName() + " -> " + relationship.getTargetEntityName() + (relationship.isToMany() ? " (1-n)" : " (1-1)"));
@@ -74,6 +70,9 @@
 			relButton.getModel().setUserData(relationship);
 			relButton.addActionListener((SingleEditPart) part);
 			relButton.setSelected(((SingleEditPart) part).isRelationshipExpanded(relationship));
+			relButton.setOpaque(true);
+			relButton.setBackgroundColor(ColorConstants.button);
+			relButton.setBorder(new CompoundBorder(relButton.getBorder(), new MarginBorder(1)));
 			relationshipFigure.add(relButton);
 		}
 	}

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/AbstractObject.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/AbstractObject.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/AbstractObject.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/AbstractObject.java Sun Jul 23 12:04:37 2006
@@ -26,6 +26,7 @@
 
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
 import org.eclipse.ui.views.properties.TextPropertyDescriptor;
+import org.objectstyle.cayenne.PersistenceState;
 import org.objectstyle.cayenne.PersistentObject;
 import org.objectstyle.cayenne.map.EntityResolver;
 import org.objectstyle.cayenne.map.ObjAttribute;
@@ -46,6 +47,8 @@
 	/** Delegate used to implemenent property-change-support. */
 	private transient PropertyChangeSupport pcsDelegate = new PropertyChangeSupport(this);
 	
+	protected Collection attributes;
+	
 	public String getName() {
 		return this.getClass().getSimpleName();
 	}
@@ -64,8 +67,12 @@
 	 * @return a collection of {@link org.objectstyle.cayenne.map.Attribute} objects.
 	 */
 	public Collection getAttributes() {
-		if (objectContext != null) {
-			return objectContext.getEntityResolver().getObjEntity(getName()).getAttributes();
+		if (attributes != null) {
+			return attributes;
+		}
+		else if (objectContext != null) {
+			attributes = objectContext.getEntityResolver().getObjEntity(getName()).getAttributes();
+			return attributes;
 		}
 		return Collections.EMPTY_LIST;
 	}
@@ -256,5 +263,9 @@
 			return properties;
 		}
 		return new IPropertyDescriptor[0];
+	}
+
+	public boolean isDeleted() {
+		return (getPersistenceState() == PersistenceState.DELETED);
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/CollectionModelElement.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/CollectionModelElement.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/CollectionModelElement.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/CollectionModelElement.java Sun Jul 23 12:04:37 2006
@@ -286,4 +286,23 @@
 		firePropertyChange(PROP_RECORDS, null, objects);
 		validateCurrent();
 	}
+
+	@Override
+	public boolean isNull() {
+		return (objects == null || objects.isEmpty());
+	}
+
+	public void memberObjectChanged() {
+		firePropertyChange(PROP_RECORDS, null, objects);
+	}
+
+	@Override
+	public boolean isContextless() {
+		for (AbstractObject object : objects) {
+			if (object.getObjectContext() != null) {
+				return false;
+			}
+		}
+		return !isNull();
+	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/Connection.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/Connection.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/Connection.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/Connection.java Sun Jul 23 12:04:37 2006
@@ -24,9 +24,9 @@
 public class Connection {
 	
 	/** Connection's source endpoint. */
-	private ModelElement source;
+	protected ModelElement source;
 	/** Connection's target endpoint. */
-	private ModelElement target;
+	protected ModelElement target;
 	
 	private boolean connected;
 

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=424788&r1=424787&r2=424788&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 Sun Jul 23 12:04:37 2006
@@ -19,14 +19,9 @@
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.util.ArrayList;
-import java.util.EventObject;
-import java.util.Iterator;
+import java.util.Collection;
 import java.util.List;
-
-import org.apache.cayenne.ropbrowser.ConnectionManager;
-import org.objectstyle.cayenne.DataChannel;
 import org.objectstyle.cayenne.ObjectContext;
-import org.objectstyle.cayenne.event.EventSubject;
 import org.objectstyle.cayenne.query.NamedQuery;
 
 /**
@@ -39,21 +34,23 @@
 	
 	// TODO label connections (not just tooltip)
 	
+	public static final String PROP_COMMIT = "ObjectDiagram.GraphCommitted";
+	public static final String PROP_LAYOUT = "ObjectDiagram.LayoutChanged";
 	/** 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> elements = new ArrayList<ModelElement>();
+	public static final String PROP_ROLLBACK = "ObjectDiagram.GraphRollback";
+	private boolean autoLayout;
 	/** the Cayenne context in which the objects represented by the ModelElements exist */
 	protected ObjectContext context;
 	
+	/** the ModelElements contained in the diagram */
+	protected List<ModelElement> elements = new ArrayList<ModelElement>();
+	
 	/** 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
@@ -91,35 +88,6 @@
 		return false;
 	}
 	
-	/**
-	 * Remove an element from the diagram
-	 * @param element the element to remove
-	 * @return true if removed; false otherwise
-	 */
-	public boolean removeElement(ModelElement element) {
-		if (element != null) {
-			elements.remove(element);
-			firePropertyChange(PROP_NODE_REMOVED, null, element);
-			return true;
-		}
-		return false;
-	}
-	
-	/** Return a List of Objects in this diagram.  The returned List should not be modified. */
-	public List<ModelElement> getElements() {
-		return elements;
-	}
-	
-	/** 
-	 * Remove a PropertyChangeListener from this component.
-	 * @param l a PropertyChangeListener instance
-	 */
-	public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
-		if (l != null) {
-			pcsDelegate.removePropertyChangeListener(l);
-		}
-	}
-	
 	/** 
 	 * Attach a non-null PropertyChangeListener to this object.
 	 * @param l a non-null PropertyChangeListener instance
@@ -132,6 +100,35 @@
 		pcsDelegate.addPropertyChangeListener(l);
 	}
 	
+	public void commitChanges() {
+		removeDeletedObjects();
+		context.commitChanges();
+		firePropertyChange(PROP_COMMIT, false, true);
+	}
+	
+	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((CollectionModelElement) element, (SingleModelElement) 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((CollectionModelElement) child, (SingleModelElement) element);
+						connection.connect();
+					}
+				}
+			}
+		}
+	}
+	
 	/** 
 	 * Report a property change to registered listeners (for example edit parts).
 	 * @param property the programmatic name of the property that changed
@@ -143,57 +140,76 @@
 			pcsDelegate.firePropertyChange(property, oldValue, newValue);
 		}
 	}
-
-	public void removeObject(AbstractObject current) {
+	
+	public ModelElement getElement(ModelElement newElement) {
 		for (ModelElement element : elements) {
-			if (element instanceof CollectionModelElement) {
-				((CollectionModelElement) element).removeObject(current);
+			if (element.equals(newElement)) {
+				return element;
 			}
 		}
+		return null;
 	}
 
-	public void toggleAutoLayout() {
-		autoLayout = !autoLayout;
-		firePropertyChange(PROP_LAYOUT, !autoLayout, autoLayout);
+	/** Return a List of Objects in this diagram.  The returned List should not be modified. */
+	public List<ModelElement> getElements() {
+		return elements;
+	}
+
+	public ObjectContext getObjectContext() {
+		return context;
 	}
 	
 	public boolean isAutoLayoutDesired() {
 		return autoLayout;
 	}
 
-	public ModelElement getElement(ModelElement newElement) {
-		for (ModelElement element : elements) {
-			if (element.equals(newElement)) {
-				return element;
-			}
+	private void removeDeletedObjects() {
+		Collection deleted = context.deletedObjects();
+		for (Object o : deleted) {
+			AbstractObject abstractObject = (AbstractObject) o;
+			removeObjectFromDiagram(abstractObject);
 		}
-		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();
-					}
-				}
-			}
+	/**
+	 * Remove an element from the diagram
+	 * @param element the element to remove
+	 * @return true if removed; false otherwise
+	 */
+	public boolean removeElement(ModelElement element) {
+		if (element != null) {
+			elements.remove(element);
+			firePropertyChange(PROP_NODE_REMOVED, null, element);
+			return true;
 		}
-		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();
-					}
-				}
+		return false;
+	}
+	
+	private void removeObjectFromDiagram(AbstractObject current) {
+		for (ModelElement element : elements) {
+			if (element instanceof CollectionModelElement) {
+				((CollectionModelElement) element).removeObject(current);
 			}
 		}
 	}
-	
-	public ObjectContext getObjectContext() {
-		return context;
+
+	/** 
+	 * Remove a PropertyChangeListener from this component.
+	 * @param l a PropertyChangeListener instance
+	 */
+	public synchronized void removePropertyChangeListener(PropertyChangeListener l) {
+		if (l != null) {
+			pcsDelegate.removePropertyChangeListener(l);
+		}
+	}
+
+	public void rollbackChanges() {
+		context.rollbackChanges();
+		firePropertyChange(PROP_ROLLBACK, false, true);
+	}
+
+	public void toggleAutoLayout() {
+		autoLayout = !autoLayout;
+		firePropertyChange(PROP_LAYOUT, !autoLayout, autoLayout);
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/MemberConnection.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/MemberConnection.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/MemberConnection.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/MemberConnection.java Sun Jul 23 12:04:37 2006
@@ -29,7 +29,15 @@
 	 * @param target a target endpoint for this connection (non null)
 	 * @throws IllegalArgumentException if any of the parameters are null or source == target 
 	 */
-	public MemberConnection(ModelElement source, ModelElement target) {
+	public MemberConnection(CollectionModelElement source, SingleModelElement target) {
 		super(source, target);
+	}
+	
+	public CollectionModelElement getSource() {
+		return (CollectionModelElement) source;
+	}
+	
+	public SingleModelElement getTarget() {
+		return (SingleModelElement) target;
 	}
 }

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=424788&r1=424787&r2=424788&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 Sun Jul 23 12:04:37 2006
@@ -49,6 +49,8 @@
 	 */
 	public static final String PROP_RECORDS = "ModelElement.Records";
 	
+	public static final String PROP_NAME = "ModelElement.Name";
+	
 	protected ElementDiagram diagram;
 	
 	protected String name;
@@ -245,6 +247,11 @@
 	public void deleteCurrentObject() {
 		getCurrentObject().getObjectContext().deleteObject(getCurrentObject());
 		firePropertyChange(PROP_RECORDS, null, getCurrentObject());
+		for (Connection conn : getTargetConnections()) {
+			if (conn instanceof MemberConnection) {
+				((MemberConnection) conn).getSource().memberObjectChanged();
+			}
+		}
 	}
 
 	public abstract void addObject(AbstractObject object);
@@ -269,4 +276,19 @@
 	{
 		return bounds;
 	}
+	
+	public abstract boolean isNull();
+
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		firePropertyChange(PROP_NAME, oldName, name);
+	}
+
+	/**
+	 * Check if the element has objects, but none with a context.
+	 * If isNull returns true, isContextless should return false (ie an element
+	 * that is null is not contextless).
+	 */
+	public abstract boolean isContextless();
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/RelationshipConnection.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/RelationshipConnection.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/RelationshipConnection.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/RelationshipConnection.java Sun Jul 23 12:04:37 2006
@@ -34,7 +34,7 @@
 	 * @param target a target endpoint for this connection (non null)
 	 * @throws IllegalArgumentException if any of the parameters are null or source == target 
 	 */
-	public RelationshipConnection(ModelElement source, ModelElement target, Relationship relationship) {
+	public RelationshipConnection(SingleModelElement source, ModelElement target, Relationship relationship) {
 		super(source, target);
 		this.relationship = relationship;		
 	}
@@ -44,5 +44,9 @@
 	 */
 	public Relationship getRelationship() {
 		return relationship;
+	}
+	
+	public SingleModelElement getSource() {
+		return (SingleModelElement) source;
 	}
 }

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=424788&r1=424787&r2=424788&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 Sun Jul 23 12:04:37 2006
@@ -20,6 +20,7 @@
 import java.beans.PropertyChangeListener;
 
 import org.eclipse.ui.views.properties.IPropertyDescriptor;
+import org.objectstyle.cayenne.PersistenceState;
 import org.objectstyle.cayenne.map.Relationship;
 
 /**
@@ -156,5 +157,19 @@
 			}
 		}
 		setObject(object);
+	}
+
+	public boolean isDeleted() {
+		return getCurrentObject().isDeleted();
+	}
+
+	@Override
+	public boolean isNull() {
+		return (object == null);
+	}
+
+	@Override
+	public boolean isContextless() {
+		return (getCurrentObject() != null && getCurrentObject().getObjectContext() == null);
 	}
 }

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Artist.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Artist.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Artist.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Artist.java Sun Jul 23 12:04:37 2006
@@ -4,7 +4,7 @@
 import java.util.List;
 
 import org.apache.cayenne.ropbrowser.model.AbstractObject;
-import org.apache.cayenne.ropbrowser.model.Painting;
+import org.apache.cayenne.ropbrowser.model.Painting;
 
 /**
  * A generated persistent class mapped as "Artist" Cayenne entity. It is a good idea to

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Gallery.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Gallery.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Gallery.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Gallery.java Sun Jul 23 12:04:37 2006
@@ -3,7 +3,7 @@
 import java.util.List;
 
 import org.apache.cayenne.ropbrowser.model.AbstractObject;
-import org.apache.cayenne.ropbrowser.model.Painting;
+import org.apache.cayenne.ropbrowser.model.Painting;
 
 /**
  * A generated persistent class mapped as "Gallery" Cayenne entity. It is a good idea to

Modified: incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Painting.java
URL: http://svn.apache.org/viewvc/incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Painting.java?rev=424788&r1=424787&r2=424788&view=diff
==============================================================================
--- incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Painting.java (original)
+++ incubator/cayenne/soc/trunk/cayenne-rop/rop-browser/src/org/apache/cayenne/ropbrowser/model/auto/_Painting.java Sun Jul 23 12:04:37 2006
@@ -3,7 +3,7 @@
 import org.apache.cayenne.ropbrowser.model.AbstractObject;
 import org.apache.cayenne.ropbrowser.model.Artist;
 import org.apache.cayenne.ropbrowser.model.Gallery;
-import org.objectstyle.cayenne.ValueHolder;
+import org.objectstyle.cayenne.ValueHolder;
 
 /**
  * A generated persistent class mapped as "Painting" Cayenne entity. It is a good idea to
@@ -17,19 +17,19 @@
     public static final String PAINTING_ARTIST_PROPERTY = "paintingArtist";
     public static final String PAINTING_GALLERY_PROPERTY = "paintingGallery";
 
-    protected Float estimatedPrice;
+    protected Double estimatedPrice;
     protected String paintingName;
     protected ValueHolder paintingArtist;
     protected ValueHolder paintingGallery;
 
-    public Float getEstimatedPrice() {
+    public Double getEstimatedPrice() {
         if(objectContext != null) {
             objectContext.prepareForAccess(this, "estimatedPrice");
         }
         
         return estimatedPrice;
     }
-    public void setEstimatedPrice(Float estimatedPrice) {
+    public void setEstimatedPrice(Double estimatedPrice) {
         if(objectContext != null) {
             objectContext.prepareForAccess(this, "estimatedPrice");
         }

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=424788&r1=424787&r2=424788&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 Sun Jul 23 12:04:37 2006
@@ -18,8 +18,12 @@
 
 import java.beans.PropertyChangeEvent;
 
+import org.apache.cayenne.ropbrowser.actions.HideAction;
 import org.apache.cayenne.ropbrowser.actions.InsertAction;
+import org.apache.cayenne.ropbrowser.actions.SetNameAction;
+import org.apache.cayenne.ropbrowser.commands.HideElementCommand;
 import org.apache.cayenne.ropbrowser.commands.ObjectInsertCommand;
+import org.apache.cayenne.ropbrowser.commands.SetNameElementCommand;
 import org.apache.cayenne.ropbrowser.figures.CollectionFigure;
 import org.apache.cayenne.ropbrowser.figures.ElementFigure;
 import org.apache.cayenne.ropbrowser.model.CollectionModelElement;
@@ -78,6 +82,9 @@
 	}
 	
 	public Command getCommand(Request request) {
+		if (request.getType().equals(SetNameAction.SET_NAME_REQUEST)) {
+			return new SetNameElementCommand(this.getModelCast());
+		}
 		// 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/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=424788&r1=424787&r2=424788&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 Sun Jul 23 12:04:37 2006
@@ -18,12 +18,15 @@
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import org.apache.cayenne.ropbrowser.commands.HideElementCommand;
 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.model.SingleModelElement;
 import org.eclipse.draw2d.ConnectionLayer;
 import org.eclipse.draw2d.Figure;
 import org.eclipse.draw2d.FreeformLayer;
@@ -105,7 +108,16 @@
 	 */
 	protected List getModelChildren() {
 		ElementDiagram diagram = (ElementDiagram) this.getModel();
-		return  diagram.getElements(); // return a list of objects
+		return new ArrayList<ModelElement>(diagram.getElements()); // return a list of objects
+	}
+	
+	public void hideNullObjects() {
+		for (Object o : getModelChildren()) {
+			ModelElement element = (ModelElement) o;
+			if (element.isNull() || element.isContextless()) {
+				getViewer().getEditDomain().getCommandStack().execute(new HideElementCommand(element));
+			}
+		}
 	}
 	
 	/**
@@ -121,10 +133,20 @@
 		else if (ElementDiagram.PROP_LAYOUT.equals(prop)) {
 			getFigure().setLayoutManager(delegatingLayoutManager);
 		}
+		else if (ElementDiagram.PROP_COMMIT.equals(prop)) {
+			hideNullObjects();
+		}
+		else if (ElementDiagram.PROP_ROLLBACK.equals(prop)) {
+			refreshVisuals();
+		}
 	}
 
 	public boolean isAutoLayoutDesired() {
-		return ((ElementDiagram) getModel()).isAutoLayoutDesired();
+		return getModelCast().isAutoLayoutDesired();
+	}
+	
+	public ElementDiagram getModelCast() {
+		return (ElementDiagram) getModel();
 	}
 
 	/**