You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by an...@apache.org on 2009/10/05 20:40:28 UTC

svn commit: r821956 [4/4] - in /cayenne/main/trunk/framework/cayenne-modeler/src: main/java/org/apache/cayenne/modeler/ main/java/org/apache/cayenne/modeler/action/ main/java/org/apache/cayenne/modeler/dialog/ main/java/org/apache/cayenne/modeler/dialo...

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,156 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.modeler.undo;
+
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.ProcedureParameter;
+import org.apache.cayenne.modeler.action.PasteAction;
+import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.modeler.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.action.RemoveProcedureParameterAction;
+import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
+import org.apache.cayenne.query.Query;
+
+public class PasteUndoableEdit extends CayenneUndoableEdit {
+
+    
+
+    private DataDomain domain;
+    private DataMap map;
+    private Object where;
+    private Object content;
+
+    public PasteUndoableEdit(DataDomain domain, DataMap map, Object where, Object content) {
+        this.domain = domain;
+        this.map = map;
+        this.where = where;
+        this.content = content;
+    }
+
+    @Override
+    public String getPresentationName() {
+
+        String className = this.content.getClass().getName();
+        int pos = className.lastIndexOf(".");
+        String contentName = className.substring(pos + 1);
+
+        return "Paste " + contentName;
+    }
+
+    @Override
+    public void redo() throws CannotRedoException {
+        PasteAction action = (PasteAction) actionManager.getAction(PasteAction
+                .getActionName());
+
+        action.paste(where, content, domain, map);
+    }
+
+    @Override
+    public void undo() throws CannotUndoException {
+        RemoveAttributeAction rAttributeAction = (RemoveAttributeAction) actionManager
+                .getAction(RemoveAttributeAction.getActionName());
+
+        RemoveAction rAction = (RemoveAction) actionManager.getAction(RemoveAction
+                .getActionName());
+
+        RemoveRelationshipAction rRelationShipAction = (RemoveRelationshipAction) actionManager
+                .getAction(RemoveRelationshipAction.getActionName());
+
+        RemoveProcedureParameterAction rProcedureParamAction = (RemoveProcedureParameterAction) actionManager
+                .getAction(RemoveProcedureParameterAction.getActionName());
+
+        if (content instanceof DataMap) {
+            if (where instanceof DataDomain) {
+                rAction.removeDataMap((DataDomain) where, (DataMap) content);
+            }
+            else if (where instanceof DataNode) {
+                rAction.removeDataMapFromDataNode((DataNode) where, (DataMap) content);
+            }
+        }
+        else if (where instanceof DataMap) {
+            if (content instanceof DbEntity) {
+                rAction.removeDbEntity(map, (DbEntity) content);
+            }
+            else if (content instanceof ObjEntity) {
+                rAction.removeObjEntity(map, (ObjEntity) content);
+            }
+            else if (content instanceof Query) {
+                rAction.removeQuery(map, (Query) content);
+            }
+            else if (content instanceof Procedure) {
+                rAction.removeProcedure(map, (Procedure) content);
+            }
+        }
+        else if (where instanceof DbEntity) {
+            if (content instanceof DbAttribute) {
+                rAttributeAction.removeDbAttributes(
+                        map,
+                        (DbEntity) where,
+                        new DbAttribute[] {
+                            (DbAttribute) content
+                        });
+            }
+            else if (content instanceof DbRelationship) {
+                rRelationShipAction.removeDbRelationships(
+                        (DbEntity) where,
+                        new DbRelationship[] {
+                            (DbRelationship) content
+                        });
+            }
+        }
+        else if (where instanceof ObjEntity) {
+            if (content instanceof ObjAttribute) {
+                rAttributeAction.removeObjAttributes(
+                        (ObjEntity) where,
+                        new ObjAttribute[] {
+                            (ObjAttribute) content
+                        });
+            }
+            else if (content instanceof ObjRelationship) {
+                rRelationShipAction.removeObjRelationships(
+                        (ObjEntity) where,
+                        new ObjRelationship[] {
+                            (ObjRelationship) content
+                        });
+            }
+        }
+        else if (where instanceof Procedure) {
+            final Procedure procedure = (Procedure) where;
+            if (content instanceof ProcedureParameter) {
+                rProcedureParamAction.removeProcedureParameters(
+                        procedure,
+                        new ProcedureParameter[] {
+                            (ProcedureParameter) content
+                        });
+            }
+        }
+    }
+}

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,129 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.modeler.undo;
+
+import javax.swing.undo.AbstractUndoableEdit;
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.apache.cayenne.map.DbJoin;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.modeler.dialog.ResolveDbRelationshipDialog;
+import org.apache.cayenne.modeler.util.ProjectUtil;
+
+public class RelationshipUndoableEdit extends CayenneCompoundEdit {
+
+	@Override
+	public void redo() throws CannotRedoException {
+		super.redo();
+		
+		ResolveDbRelationshipDialog dialog = new ResolveDbRelationshipDialog(
+				relationship, false);
+
+		dialog.setVisible(true);
+	}
+
+	@Override
+	public void undo() throws CannotUndoException {
+		super.undo();
+		
+		ResolveDbRelationshipDialog dialog = new ResolveDbRelationshipDialog(
+				relationship, false);
+
+		dialog.setVisible(true);
+	}
+
+	@Override
+	public String getRedoPresentationName() {
+		return "Redo Edit relationship";
+	}
+
+	@Override
+	public String getUndoPresentationName() {
+		return "Undo Edit relationship";
+	}
+
+	
+
+	private DbRelationship relationship;
+
+	@Override
+	public boolean canUndo() {
+		return hasEdits();
+	}
+
+	public RelationshipUndoableEdit(DbRelationship relationship) {
+		this.relationship = relationship;
+	}
+
+	public void addDbJoinAddUndo(final DbJoin join) {
+		this.addEdit(new AbstractUndoableEdit() {
+			
+
+			@Override
+			public void redo() throws CannotRedoException {
+				relationship.addJoin(join);
+			}
+
+			@Override
+			public void undo() throws CannotUndoException {
+				relationship.removeJoin(join);
+			}
+		});
+	}
+
+	public void addDbJoinRemoveUndo(final DbJoin join) {
+		this.addEdit(new AbstractUndoableEdit() {
+
+			
+
+			@Override
+			public void redo() throws CannotRedoException {
+				relationship.removeJoin(join);
+			}
+
+			@Override
+			public void undo() throws CannotUndoException {
+				relationship.addJoin(join);
+			}
+
+		});
+	}
+
+	public void addNameUndo(final DbRelationship relationship,
+			final String oldName, final String newName) {
+		this.addEdit(new AbstractUndoableEdit() {
+
+			
+
+			@Override
+			public void redo() throws CannotRedoException {
+				ProjectUtil.setRelationshipName(relationship.getSourceEntity(),
+						relationship, newName);
+			}
+
+			@Override
+			public void undo() throws CannotUndoException {
+				ProjectUtil.setRelationshipName(relationship.getSourceEntity(),
+						relationship, oldName);
+			}
+
+		});
+	}
+}

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,160 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.modeler.undo;
+
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.EmbeddableAttribute;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.modeler.action.CreateAttributeAction;
+import org.apache.cayenne.modeler.action.RemoveAttributeAction;
+import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+
+public class RemoveAttributeUndoableEdit extends CayenneUndoableEdit {
+
+    
+
+    private DataDomain domain;
+    private DataMap dataMap;
+
+    private DbAttribute[] dbAttributes;
+    private ObjAttribute[] objAttributes;
+
+    private ObjEntity objEntity;
+    private DbEntity dbEntity;
+
+    private Embeddable embeddable;
+    private EmbeddableAttribute[] embeddableAttrs;
+
+    public RemoveAttributeUndoableEdit(Embeddable embeddable,
+            EmbeddableAttribute[] embeddableAttrs) {
+        super();
+        this.embeddable = embeddable;
+        this.embeddableAttrs = embeddableAttrs;
+    }
+
+    public RemoveAttributeUndoableEdit(DataDomain domain, DataMap dataMap,
+            ObjEntity entity, ObjAttribute[] attribs) {
+        this.objEntity = entity;
+        this.objAttributes = attribs;
+        this.domain = domain;
+        this.dataMap = dataMap;
+    }
+
+    public RemoveAttributeUndoableEdit(DataDomain domain, DataMap dataMap,
+            DbEntity entity, DbAttribute[] attribs) {
+        this.dbEntity = entity;
+        this.dbAttributes = attribs;
+        this.domain = domain;
+        this.dataMap = dataMap;
+    }
+
+    @Override
+    public void redo() throws CannotRedoException {
+        restoreSelections();
+
+        RemoveAttributeAction action = (RemoveAttributeAction) actionManager
+                .getAction(RemoveAttributeAction.getActionName());
+
+        if (objEntity != null) {
+            action.removeObjAttributes(objEntity, objAttributes);
+            controller.fireObjEntityDisplayEvent(new EntityDisplayEvent(
+                    this,
+                    objEntity,
+                    dataMap,
+                    domain));
+        }
+
+        if (dbEntity != null) {
+            action.removeDbAttributes(dbEntity.getDataMap(), dbEntity, dbAttributes);
+            controller.fireDbEntityDisplayEvent(new EntityDisplayEvent(
+                    this,
+                    dbEntity,
+                    dataMap,
+                    domain));
+        }
+
+        if (embeddable != null) {
+            action.removeEmbeddableAttributes(embeddable, embeddableAttrs);
+            controller.fireEmbeddableDisplayEvent(new EmbeddableDisplayEvent(
+                    this,
+                    embeddable,
+                    dataMap,
+                    domain));
+        }
+    }
+
+    @Override
+    public void undo() throws CannotUndoException {
+        restoreSelections();
+
+        CreateAttributeAction action = (CreateAttributeAction) actionManager
+                .getAction(CreateAttributeAction.getActionName());
+
+        if (objEntity != null) {
+            for (ObjAttribute attr : objAttributes) {
+                action.createObjAttribute(domain, dataMap, objEntity, attr);
+            }
+        }
+
+        if (dbEntity != null) {
+            for (DbAttribute attr : dbAttributes) {
+                action.createDbAttribute(domain, dataMap, dbEntity, attr);
+            }
+        }
+
+        if (embeddable != null) {
+            for (EmbeddableAttribute attr : embeddableAttrs) {
+                action.createEmbAttribute(embeddable, attr);
+            }
+        }
+
+    }
+
+    @Override
+    public String getPresentationName() {
+        if (objEntity != null) {
+            return (objAttributes.length > 1)
+                    ? "Remove ObjAttributes"
+                    : "Remove ObjAttribute";
+        }
+
+        if (dbEntity != null) {
+            return (dbAttributes.length > 1)
+                    ? "Remove DbAttributes"
+                    : "Remove DbAttribute";
+        }
+
+        if (embeddableAttrs != null) {
+            return (embeddableAttrs.length > 1)
+                    ? "Remove Embeddable Attributes"
+                    : "Remove Embeddable Attribute";
+        }
+
+        return super.getPresentationName();
+    }
+}

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCompoundUndoableEdit.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCompoundUndoableEdit.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCompoundUndoableEdit.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCompoundUndoableEdit.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,30 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.modeler.undo;
+
+
+public class RemoveCompoundUndoableEdit extends CayenneCompoundEdit {
+
+    
+
+    @Override
+    public String getPresentationName() {
+        return "Remove Objects";
+    }
+}

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,93 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.modeler.undo;
+
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.modeler.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.action.RemoveRelationshipAction;
+
+public class RemoveRelationshipUndoableEdit extends CayenneUndoableEdit {
+
+	
+
+	private ObjEntity objEntity;
+	private ObjRelationship[] rels;
+
+	private DbEntity dbEntity;
+	private DbRelationship[] dbRels;
+
+	public RemoveRelationshipUndoableEdit(ObjEntity objEntity,
+			ObjRelationship[] rels) {
+		super();
+		this.objEntity = objEntity;
+		this.rels = rels;
+	}
+
+	public RemoveRelationshipUndoableEdit(DbEntity dbEntity,
+			DbRelationship[] dbRels) {
+		super();
+		this.dbEntity = dbEntity;
+		this.dbRels = dbRels;
+	}
+
+	@Override
+	public String getPresentationName() {
+		if (objEntity != null) {
+			return "Remove Obj Relationship";
+		} else {
+			return "Remove Db Relationship";
+		}
+	}
+
+	@Override
+	public void redo() throws CannotRedoException {
+		restoreSelections();
+		
+		RemoveRelationshipAction action = (RemoveRelationshipAction) actionManager
+				.getAction(RemoveRelationshipAction.getActionName());
+		if (objEntity != null) {
+			action.removeObjRelationships(objEntity, rels);
+		} else {
+			action.removeDbRelationships(dbEntity, dbRels);
+		}
+	}
+
+	@Override
+	public void undo() throws CannotUndoException {
+		restoreSelections();
+		
+		CreateRelationshipAction action = (CreateRelationshipAction) actionManager
+				.getAction(CreateRelationshipAction.getActionName());
+		if (objEntity != null) {
+			for (ObjRelationship r : rels) {
+				action.createObjRelationship(objEntity, r);
+			}
+		} else {
+			for (DbRelationship dr : dbRels) {
+				action.createDbRelationship(dbEntity, dr);
+			}
+		}
+	}
+}

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,340 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.modeler.undo;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import javax.swing.undo.CannotRedoException;
+import javax.swing.undo.CannotUndoException;
+
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.access.DataNode;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.Embeddable;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
+import org.apache.cayenne.map.Procedure;
+import org.apache.cayenne.map.Relationship;
+import org.apache.cayenne.map.event.DataNodeEvent;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.action.CreateDataMapAction;
+import org.apache.cayenne.modeler.action.CreateDbEntityAction;
+import org.apache.cayenne.modeler.action.CreateDomainAction;
+import org.apache.cayenne.modeler.action.CreateEmbeddableAction;
+import org.apache.cayenne.modeler.action.CreateNodeAction;
+import org.apache.cayenne.modeler.action.CreateObjEntityAction;
+import org.apache.cayenne.modeler.action.CreateProcedureAction;
+import org.apache.cayenne.modeler.action.CreateQueryAction;
+import org.apache.cayenne.modeler.action.CreateRelationshipAction;
+import org.apache.cayenne.modeler.action.RemoveAction;
+import org.apache.cayenne.query.Query;
+
+public class RemoveUndoableEdit extends CayenneUndoableEdit {
+
+    
+
+    private DataMap map;
+    private DbEntity dbEntity;
+    private ObjEntity objEntity;
+    private Query query;
+    private Procedure procedure;
+
+    private DataNode dataNode;
+    private DataDomain domain;
+
+    private Embeddable embeddable;
+
+    private Map<DbEntity, List<DbRelationship>> dbRelationshipMap = new HashMap<DbEntity, List<DbRelationship>>();
+    private Map<ObjEntity, List<ObjRelationship>> objRelationshipMap = new HashMap<ObjEntity, List<ObjRelationship>>();
+
+    private static enum REMOVE_MODE {
+        OBJECT_ENTITY, DB_ENTITY, QUERY, PROCEDURE, MAP_FROM_NODE, MAP_FROM_DOMAIN, NODE, DOMAIN, EMBEDDABLE
+    };
+
+    private REMOVE_MODE mode;
+
+    public RemoveUndoableEdit(Application application, DataDomain domain) {
+        this.domain = domain;
+        this.mode = REMOVE_MODE.DOMAIN;
+    }
+
+    public RemoveUndoableEdit(Application application, DataNode node, DataMap map) {
+        this.map = map;
+        this.dataNode = node;
+        this.mode = REMOVE_MODE.MAP_FROM_NODE;
+    }
+
+    public RemoveUndoableEdit(Application application, DataDomain domain, DataMap map) {
+        this.domain = domain;
+        this.map = map;
+        this.mode = REMOVE_MODE.MAP_FROM_DOMAIN;
+    }
+
+    public RemoveUndoableEdit(Application application, DataDomain domain, DataNode node) {
+        this.domain = domain;
+        this.dataNode = node;
+        this.mode = REMOVE_MODE.NODE;
+    }
+
+    public RemoveUndoableEdit(DataMap map, ObjEntity objEntity) {
+        this.map = map;
+        this.objEntity = objEntity;
+        this.mode = REMOVE_MODE.OBJECT_ENTITY;
+
+        for (ObjEntity ent : map.getObjEntities()) {
+            // take a copy since we're going to modify the entity
+            for (Relationship relationship : new ArrayList<Relationship>(ent
+                    .getRelationships())) {
+
+                if (this.objEntity.getName().equals(relationship.getTargetEntityName())) {
+
+                    ObjRelationship rel = (ObjRelationship) relationship;
+
+                    if (objRelationshipMap.get(rel.getSourceEntity()) == null) {
+                        objRelationshipMap.put(
+                                (ObjEntity) rel.getSourceEntity(),
+                                new LinkedList<ObjRelationship>());
+                    }
+
+                    objRelationshipMap.get(rel.getSourceEntity()).add(rel);
+                }
+            }
+        }
+    }
+
+    public RemoveUndoableEdit(DataMap map, DbEntity dbEntity) {
+        this.map = map;
+        this.dbEntity = dbEntity;
+        this.mode = REMOVE_MODE.DB_ENTITY;
+
+        for (ObjEntity objEnt : map.getObjEntities()) {
+            for (Relationship rel : objEnt.getRelationships()) {
+                for (DbRelationship dbRel : ((ObjRelationship) rel).getDbRelationships()) {
+                    if (dbRel.getTargetEntity() == dbEntity) {
+
+                        if (dbRelationshipMap.get(dbRel.getSourceEntity()) == null) {
+                            dbRelationshipMap.put(
+                                    (DbEntity) dbRel.getSourceEntity(),
+                                    new LinkedList<DbRelationship>());
+                        }
+                        dbRelationshipMap.get(dbRel.getSourceEntity()).add(dbRel);
+
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    public RemoveUndoableEdit(DataMap map, Query query) {
+        this.map = map;
+        this.query = query;
+        this.mode = REMOVE_MODE.QUERY;
+    }
+
+    public RemoveUndoableEdit(DataMap map, Procedure procedure) {
+        this.map = map;
+        this.procedure = procedure;
+        this.mode = REMOVE_MODE.PROCEDURE;
+    }
+
+    public RemoveUndoableEdit(DataMap map, Embeddable embeddable) {
+        this.map = map;
+        this.embeddable = embeddable;
+        this.mode = REMOVE_MODE.EMBEDDABLE;
+    }
+
+    @Override
+    public String getPresentationName() {
+        switch (this.mode) {
+            case OBJECT_ENTITY:
+                return "Remove Object Entity";
+            case DB_ENTITY:
+                return "Remove Db Entity";
+            case QUERY:
+                return "Remove Query";
+            case PROCEDURE:
+                return "Remove Procedure";
+            case MAP_FROM_NODE:
+                return "Remove DataMap";
+            case MAP_FROM_DOMAIN:
+                return "Remove DataMap";
+            case NODE:
+                return "Remove DataNode";
+            case DOMAIN:
+                return "Remove DataDomain";
+            case EMBEDDABLE:
+                return "Remove Embeddable";
+            default:
+                return "Remove";
+
+        }
+    }
+
+    @Override
+    public void redo() throws CannotRedoException {
+        RemoveAction action = (RemoveAction) actionManager.getAction(RemoveAction
+                .getActionName());
+
+        switch (this.mode) {
+            case OBJECT_ENTITY:
+                action.removeObjEntity(map, objEntity);
+                break;
+            case DB_ENTITY:
+                action.removeDbEntity(map, dbEntity);
+                break;
+            case QUERY:
+                action.removeQuery(map, query);
+                break;
+            case PROCEDURE:
+                action.removeProcedure(map, procedure);
+            case MAP_FROM_NODE:
+                action.removeDataMapFromDataNode(dataNode, map);
+                break;
+            case MAP_FROM_DOMAIN:
+                action.removeDataMap(domain, map);
+                break;
+            case NODE:
+                action.removeDataNode(domain, dataNode);
+                break;
+            case DOMAIN:
+                action.removeDomain(domain);
+                break;
+            case EMBEDDABLE:
+                action.removeEmbeddable(map, embeddable);
+        }
+    }
+
+    @Override
+    public void undo() throws CannotUndoException {
+
+        CreateRelationshipAction relationshipAction = (CreateRelationshipAction) actionManager
+                .getAction(CreateRelationshipAction.getActionName());
+
+        switch (this.mode) {
+            case OBJECT_ENTITY: {
+                for (Entry<ObjEntity, List<ObjRelationship>> entry : objRelationshipMap
+                        .entrySet()) {
+
+                    ObjEntity objEntity = entry.getKey();
+                    for (ObjRelationship rel : entry.getValue()) {
+                        relationshipAction.createObjRelationship(objEntity, rel);
+                    }
+                }
+
+                CreateObjEntityAction action = (CreateObjEntityAction) actionManager
+                        .getAction(CreateObjEntityAction.getActionName());
+                action.createObjEntity(map, objEntity);
+
+                break;
+            }
+            case DB_ENTITY: {
+
+                for (Entry<DbEntity, List<DbRelationship>> entry : dbRelationshipMap
+                        .entrySet()) {
+                    DbEntity dbEntity = entry.getKey();
+                    for (DbRelationship rel : entry.getValue()) {
+                        relationshipAction.createDbRelationship(dbEntity, rel);
+                    }
+                }
+
+                CreateDbEntityAction action = (CreateDbEntityAction) actionManager
+                        .getAction(CreateDbEntityAction.getActionName());
+
+                action.createEntity(map, dbEntity);
+
+                break;
+            }
+            case QUERY: {
+                this.domain = Application
+                        .getInstance()
+                        .getFrameController()
+                        .getProjectController()
+                        .findDomain(map);
+
+                CreateQueryAction action = (CreateQueryAction) actionManager
+                        .getAction(CreateQueryAction.getActionName());
+
+                action.createQuery(domain, map, query);
+
+                break;
+            }
+            case PROCEDURE: {
+                CreateProcedureAction action = (CreateProcedureAction) actionManager
+                        .getAction(CreateProcedureAction.getActionName());
+                action.createProcedure(map, procedure);
+                break;
+            }
+            case MAP_FROM_NODE: {
+                this.dataNode.addDataMap(map);
+
+                DataNodeEvent e = new DataNodeEvent(Application.getFrame(), this.dataNode);
+
+                ProjectController controller = Application
+                        .getInstance()
+                        .getFrameController()
+                        .getProjectController();
+
+                e.setDomain(controller.findDomain(this.dataNode));
+
+                controller.fireDataNodeEvent(e);
+                
+                break;
+            }
+            case MAP_FROM_DOMAIN: {
+                CreateDataMapAction action = (CreateDataMapAction) actionManager
+                        .getAction(CreateDataMapAction.getActionName());
+                action.createDataMap(domain, map);
+                
+                break;
+            }
+            case NODE: {
+                CreateNodeAction action = (CreateNodeAction) actionManager
+                        .getAction(CreateNodeAction.getActionName());
+                action.createDataNode(domain, dataNode);
+                
+                break;
+            }
+
+            case DOMAIN: {
+                CreateDomainAction action = (CreateDomainAction) actionManager
+                        .getAction(CreateDomainAction.getActionName());
+                action.createDomain(domain);
+                
+                break;
+            }
+
+            case EMBEDDABLE: {
+                CreateEmbeddableAction action = (CreateEmbeddableAction) actionManager
+                        .getAction(CreateEmbeddableAction.getActionName());
+                action.createEmbeddable(map, embeddable);
+                
+                break;
+            }
+        }
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java Mon Oct  5 18:40:25 2009
@@ -34,6 +34,7 @@
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.undo.CayenneTableModelUndoableEdit;
 import org.apache.cayenne.util.Util;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -47,7 +48,7 @@
     protected ProjectController mediator;
     protected Object eventSource;
     protected List objectList;
-    
+
     private static Log logObj = LogFactory.getLog(CayenneTableModel.class);
 
     /**
@@ -55,6 +56,7 @@
      */
     public CayenneTableModel(ProjectController mediator, Object eventSource,
             java.util.List objectList) {
+        
         super();
         this.eventSource = eventSource;
         this.mediator = mediator;
@@ -65,8 +67,14 @@
 
     public void setValueAt(Object newVal, int row, int col) {
         try {
-            if (!Util.nullSafeEquals(newVal, getValueAt(row, col))) {
+            
+            Object oldValue = getValueAt(row, col);
+            if (!Util.nullSafeEquals(newVal, oldValue)) {
+                
                 setUpdatedValueAt(newVal, row, col);
+                
+                this.mediator.getApplication().getUndoManager().addEdit(
+                        new CayenneTableModelUndoableEdit(this, oldValue, newVal, row, col));
             }
         }
         catch (IllegalArgumentException e) {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java Mon Oct  5 18:40:25 2009
@@ -17,7 +17,6 @@
  *  under the License.
  ****************************************************************/
 
-
 package org.apache.cayenne.modeler.util;
 
 import java.awt.Color;
@@ -38,6 +37,7 @@
 import javax.swing.table.TableCellEditor;
 
 import org.apache.cayenne.modeler.ModelerPreferences;
+import org.apache.cayenne.modeler.undo.JComboBoxUndoListener;
 import org.apache.cayenne.modeler.util.combo.AutoCompletion;
 import org.apache.cayenne.modeler.util.combo.ComboBoxCellEditor;
 import org.apache.cayenne.swing.components.textpane.JCayenneTextPane;
@@ -68,7 +68,7 @@
     public static JComboBox createComboBox(Collection<String> model, boolean sort) {
         return createComboBox(model.toArray(), sort);
     }
-    
+
     /**
      * Creates a new JComboBox with an array of model objects.
      */
@@ -82,7 +82,7 @@
         comboBox.setModel(new DefaultComboBoxModel(model));
         return comboBox;
     }
-    
+
     /**
      * Creates a new JComboBox.
      */
@@ -91,17 +91,45 @@
         initFormWidget(comboBox);
         comboBox.setBackground(Color.WHITE);
         comboBox.setMaximumRowCount(ModelerPreferences.COMBOBOX_MAX_VISIBLE_SIZE);
-                
         return comboBox;
     }
+
+    /**
+     * Creates undoable JComboBox.
+     * 
+     */
+    public static JComboBox createUndoableComboBox() {
+        JComboBox comboBox = new JComboBox();
+        initFormWidget(comboBox);
+        comboBox.addItemListener(new JComboBoxUndoListener());
+        comboBox.setBackground(Color.WHITE);
+        comboBox.setMaximumRowCount(ModelerPreferences.COMBOBOX_MAX_VISIBLE_SIZE);
+        return comboBox;
+    }
+    
+    /**
+     * Creates undoable JTextField.
+     * 
+     */
+    public static JTextField createUndoableTextField() {
+        return new JTextFieldUndoable();
+    }
     
     /**
+     * Creates undoable JTextField.
+     * 
+     */
+    public static JTextField createUndoableTextField(int size) {
+        return new JTextFieldUndoable(size);
+    }
+
+    /**
      * Creates cell editor for text field
      */
     public static DefaultCellEditor createCellEditor(JTextField textField) {
         return new CayenneCellEditor(textField);
     }
-    
+
     /**
      * Creates cell editor for a table with combo as editor component. Type of this editor
      * depends on auto-completion behavior of JComboBox
@@ -109,12 +137,13 @@
      * @param combo JComboBox to be used as editor component
      */
     public static TableCellEditor createCellEditor(JComboBox combo) {
-        if (Boolean.TRUE.equals(combo.getClientProperty(AutoCompletion.AUTOCOMPLETION_PROPERTY))) {
+        if (Boolean.TRUE.equals(combo
+                .getClientProperty(AutoCompletion.AUTOCOMPLETION_PROPERTY))) {
             return new ComboBoxCellEditor(combo);
         }
-        
+
         DefaultCellEditor editor = new DefaultCellEditor(combo);
-        editor.setClickCountToStart(1);        
+        editor.setClickCountToStart(1);
 
         return editor;
     }
@@ -179,7 +208,7 @@
     public static JButton createButton(String text) {
         return new JButton(text);
     }
-    
+
     /**
      * Creates and returns a JEdit text component with syntax highlighing
      */
@@ -188,29 +217,29 @@
         if (OperatingSystem.getOS() == OperatingSystem.MAC_OS_X) {
             area.setInputHandler(new MacInputHandler());
         }
-        
+
         return area;
     }
-    
-//    public static JSQLTextPane createJSQLTextPane() {
-//        JSQLTextPane area = new JSQLTextPane();
-//        return area;
-//    }
- 
+
+    // public static JSQLTextPane createJSQLTextPane() {
+    // JSQLTextPane area = new JSQLTextPane();
+    // return area;
+    // }
+
     public static JCayenneTextPane createJEJBQLTextPane() {
         JCayenneTextPane area = new JCayenneTextPane(new EJBQLSyntaxConstant());
         return area;
     }
- 
-    
+
     /**
      * Class for enabling Mac OS X keys
      */
     private static class MacInputHandler extends DefaultInputHandler {
+
         MacInputHandler() {
             addDefaultKeyBindings();
         }
-        
+
         /**
          * Sets up the default key bindings.
          */
@@ -243,23 +272,23 @@
 
             addKeyBinding("LEFT", PREV_CHAR);
             addKeyBinding("S+LEFT", SELECT_PREV_CHAR);
-            addKeyBinding("A+LEFT", PREV_WORD); //option + left
-            addKeyBinding("AS+LEFT", SELECT_PREV_WORD); //option + shift + left
+            addKeyBinding("A+LEFT", PREV_WORD); // option + left
+            addKeyBinding("AS+LEFT", SELECT_PREV_WORD); // option + shift + left
             addKeyBinding("RIGHT", NEXT_CHAR);
             addKeyBinding("S+RIGHT", SELECT_NEXT_CHAR);
-            addKeyBinding("A+RIGHT", NEXT_WORD); //option + right
-            addKeyBinding("AS+RIGHT", SELECT_NEXT_WORD); //option + shift + right
+            addKeyBinding("A+RIGHT", NEXT_WORD); // option + right
+            addKeyBinding("AS+RIGHT", SELECT_NEXT_WORD); // option + shift + right
             addKeyBinding("UP", PREV_LINE);
             addKeyBinding("S+UP", SELECT_PREV_LINE);
             addKeyBinding("DOWN", NEXT_LINE);
             addKeyBinding("S+DOWN", SELECT_NEXT_LINE);
 
             addKeyBinding("M+ENTER", REPEAT);
-            
+
             // Clipboard
-            addKeyBinding("M+C", CLIP_COPY); //command + c
-            addKeyBinding("M+V", CLIP_PASTE); //command + v
-            addKeyBinding("M+X", CLIP_CUT); //command + x
+            addKeyBinding("M+C", CLIP_COPY); // command + c
+            addKeyBinding("M+V", CLIP_PASTE); // command + v
+            addKeyBinding("M+X", CLIP_CUT); // command + x
         }
     }
 }

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,54 @@
+/*****************************************************************
+ *   Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you 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.modeler.util;
+
+import javax.swing.JTextField;
+import javax.swing.event.UndoableEditListener;
+
+import org.apache.cayenne.modeler.undo.JTextFieldUndoListener;
+
+class JTextFieldUndoable extends JTextField {
+
+    
+    
+    private UndoableEditListener undoListener;
+
+    JTextFieldUndoable() {
+        super();
+        this.undoListener = new JTextFieldUndoListener(this);
+        this.getDocument().addUndoableEditListener(this.undoListener);
+    }
+    
+    JTextFieldUndoable(int size) {
+        super(size);
+        this.undoListener = new JTextFieldUndoListener(this);
+        this.getDocument().addUndoableEditListener(this.undoListener);
+    }
+
+    @Override
+    public void setText(String t) {
+        this.getDocument().removeUndoableEditListener(this.undoListener);
+        try {
+            super.setText(t);
+        }
+        finally {
+            this.getDocument().addUndoableEditListener(this.undoListener);
+        }
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java Mon Oct  5 18:40:25 2009
@@ -29,9 +29,11 @@
 import javax.swing.JTextField;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
+import javax.swing.event.UndoableEditListener;
 import javax.swing.text.JTextComponent;
 
 import org.apache.cayenne.modeler.dialog.validator.ValidatorDialog;
+import org.apache.cayenne.modeler.undo.JTextFieldUndoListener;
 import org.apache.cayenne.validation.ValidationException;
 
 /**
@@ -46,6 +48,7 @@
     protected JTextComponent textComponent;
     protected String defaultToolTip;
     protected boolean modelUpdateDisabled;
+    protected UndoableEditListener undoableListener;
 
     public TextAdapter(JTextField textField) {
         this(textField, true, false, true);
@@ -53,6 +56,7 @@
 
     public TextAdapter(JTextField textField, boolean checkOnFocusLost,
             boolean checkOnTyping, boolean checkOnEnter) {
+
         this(textField, true, false);
 
         if (checkOnEnter) {
@@ -72,10 +76,14 @@
 
     public TextAdapter(JTextComponent textComponent, boolean checkOnFocusLost,
             boolean checkOnTyping) {
+
         this.errorColor = ValidatorDialog.WARNING_COLOR;
         this.defaultBGColor = textComponent.getBackground();
         this.defaultToolTip = textComponent.getToolTipText();
         this.textComponent = textComponent;
+        
+        this.undoableListener = new JTextFieldUndoListener(this.textComponent);
+        this.textComponent.getDocument().addUndoableEditListener(this.undoableListener);
 
         if (checkOnFocusLost) {
             textComponent.setInputVerifier(new InputVerifier() {
@@ -129,13 +137,21 @@
      */
     public void setText(String text) {
         modelUpdateDisabled = true;
+
+        this.textComponent
+                .getDocument()
+                .removeUndoableEditListener(this.undoableListener);
+
         try {
             clear();
             textComponent.setText(text);
         }
         finally {
             modelUpdateDisabled = false;
+            this.textComponent.getDocument().addUndoableEditListener(
+                    this.undoableListener);
         }
+
     }
 
     protected void updateModel() {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java Mon Oct  5 18:40:25 2009
@@ -345,7 +345,7 @@
 
     class JTextPaneScrollable extends JTextPane {
 
-        private static final long serialVersionUID = 1L;
+        
 
         public JTextPaneScrollable(EditorKit editorKit) {
             // Set editor kit

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-redo.gif
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-redo.gif?rev=821956&view=auto
==============================================================================
Binary file - no diff available.

Propchange: cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-redo.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-undo.gif
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-undo.gif?rev=821956&view=auto
==============================================================================
Binary file - no diff available.

Propchange: cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-undo.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java Mon Oct  5 18:40:25 2009
@@ -42,7 +42,7 @@
             return;
         }
 
-        DataNode node = action.createDataNode(new DataDomain("DD"));
+        DataNode node = action.buildDataNode(new DataDomain("DD"));
 
         assertNotNull(node);
         assertNotNull(node.getName());