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 [1/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...

Author: andrey
Date: Mon Oct  5 18:40:25 2009
New Revision: 821956

URL: http://svn.apache.org/viewvc?rev=821956&view=rev
Log:
CAY-1191 Undo/Redo support in modeler (patch by Anton Sakalouski)

Added:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/UndoAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/AddPrefetchUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneCompoundEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneTableModelUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoManager.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CayenneUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateAttributeUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateCallbackMethodUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDataMapUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDbEntityUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateDomainUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbAttributeUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEmbeddableUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateEntityListenerUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateNodeUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateObjEntityUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateProcedureUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateQueryUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/CreateRelationshipUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/InferRelationshipsUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JComboBoxUndoListener.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JComboBoxUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/JTextFieldUndoListener.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteCompoundUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/PasteUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RelationshipUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveAttributeUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveCompoundUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveRelationshipUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/JTextFieldUndoable.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-redo.gif   (with props)
    cayenne/main/trunk/framework/cayenne-modeler/src/main/resources/org/apache/cayenne/modeler/images/icon-undo.gif   (with props)
Modified:
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ActionManager.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractCreateCallbackMethodAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractRemoveCallbackMethodAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDomainAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityListenerAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDBAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveCallbackMethodAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveEntityListenerAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveEntityListenerForDataMapAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveProcedureParameterAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveRelationshipAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RevertAction.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/AboutDialog.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/FindDialog.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/ResolveDbRelationshipDialog.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/query/QueryTypeController.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataDomainView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/DataMapView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/EmbeddableAttributeTableModel.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ProcedureQueryView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/RawQueryPropertiesPanel.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplateMainTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectPropertiesPanel.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryOrderingTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/AdapterView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/CustomDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/DBCPDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JDBCDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/JNDIDataSourceView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/MainDataNodeView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/datanode/PasswordEncoderView.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneWidgetFactory.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/TextAdapter.java
    cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/swing/components/textpane/JCayenneTextPane.java
    cayenne/main/trunk/framework/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/action/CreateNodeActionTest.java

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ActionManager.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ActionManager.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ActionManager.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ActionManager.java Mon Oct  5 18:40:25 2009
@@ -75,6 +75,7 @@
 import org.apache.cayenne.modeler.action.OpenProjectAction;
 import org.apache.cayenne.modeler.action.PasteAction;
 import org.apache.cayenne.modeler.action.ProjectAction;
+import org.apache.cayenne.modeler.action.RedoAction;
 import org.apache.cayenne.modeler.action.RemoveAction;
 import org.apache.cayenne.modeler.action.RemoveAttributeAction;
 import org.apache.cayenne.modeler.action.RemoveCallbackMethodAction;
@@ -88,6 +89,7 @@
 import org.apache.cayenne.modeler.action.SaveAction;
 import org.apache.cayenne.modeler.action.SaveAsAction;
 import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
+import org.apache.cayenne.modeler.action.UndoAction;
 import org.apache.cayenne.modeler.action.ValidateAction;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.ProjectPath;
@@ -99,7 +101,7 @@
 public class ActionManager {
 
     static final Collection<String> SPECIAL_ACTIONS = Arrays.asList(SaveAction
-            .getActionName());
+            .getActionName(), UndoAction.getActionName(), RedoAction.getActionName());
 
     // search action added to project actions
     static final Collection<String> PROJECT_ACTIONS = Arrays.asList(RevertAction
@@ -116,7 +118,6 @@
                 CreateNodeAction.getActionName(),
                 ImportDBAction.getActionName(),
                 ImportEOModelAction.getActionName(),
-                
                 PasteAction.getActionName()));
     }
     
@@ -247,6 +248,14 @@
         registerAction(new CopyProcedureParameterAction(application));
         registerAction(new PasteAction(application));
         
+        UndoAction undoAction = new UndoAction(application); 
+        undoAction.setEnabled(false);
+        registerAction(undoAction);
+        
+        RedoAction redoAction = new RedoAction(application);
+        redoAction.setEnabled(false);
+        registerAction(redoAction);
+        
         registerAction(new CreateEmbeddableAction(application));
     }
 

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/Application.java Mon Oct  5 18:40:25 2009
@@ -29,6 +29,7 @@
 import javax.swing.JOptionPane;
 import javax.swing.JRootPane;
 import javax.swing.SwingUtilities;
+import javax.swing.undo.UndoManager;
 
 import org.apache.cayenne.modeler.dialog.LogConsole;
 import org.apache.cayenne.modeler.util.AdapterMapping;
@@ -84,6 +85,8 @@
     protected String preferencesDB;
     protected BindingFactory bindingFactory;
     protected AdapterMapping adapterMapping;
+    
+    protected UndoManager undoManager;
 
     // This is for OS X support
     private boolean isQuittingApplication = false;
@@ -146,6 +149,13 @@
     public ActionManager getActionManager() {
         return actionManager;
     }
+    
+    /**
+     * Returns undo-edits controller.
+     */
+    public UndoManager getUndoManager() {
+        return undoManager;
+    }
 
     /**
      * Returns controller for the main frame.
@@ -175,6 +185,7 @@
         // init actions before the frame, as it will attempt to build menus out of
         // actions.
         this.actionManager = new ActionManager(this);
+        this.undoManager = new org.apache.cayenne.modeler.undo.CayenneUndoManager(this);
 
         // ...create main frame
         this.frameController = new CayenneModelerController(this, initialProject);

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java Mon Oct  5 18:40:25 2009
@@ -74,11 +74,13 @@
 import org.apache.cayenne.modeler.action.OpenProjectAction;
 import org.apache.cayenne.modeler.action.PasteAction;
 import org.apache.cayenne.modeler.action.ProjectAction;
+import org.apache.cayenne.modeler.action.RedoAction;
 import org.apache.cayenne.modeler.action.RemoveAction;
 import org.apache.cayenne.modeler.action.RevertAction;
 import org.apache.cayenne.modeler.action.SaveAction;
 import org.apache.cayenne.modeler.action.SaveAsAction;
 import org.apache.cayenne.modeler.action.ShowLogConsoleAction;
+import org.apache.cayenne.modeler.action.UndoAction;
 import org.apache.cayenne.modeler.action.ValidateAction;
 import org.apache.cayenne.modeler.dialog.LogConsole;
 import org.apache.cayenne.modeler.editor.EditorView;
@@ -197,6 +199,8 @@
         fileMenu.add(getAction(RevertAction.getActionName()).buildMenu());
         fileMenu.addSeparator();
         
+        editMenu.add(getAction(UndoAction.getActionName()).buildMenu());
+        editMenu.add(getAction(RedoAction.getActionName()).buildMenu());
         editMenu.add(getAction(CutAction.getActionName()).buildMenu());
         editMenu.add(getAction(CopyAction.getActionName()).buildMenu());
         editMenu.add(getAction(PasteAction.getActionName()).buildMenu());
@@ -367,6 +371,11 @@
         toolBar.add(getAction(PasteAction.getActionName()).buildButton());
 
         toolBar.addSeparator();
+        
+        toolBar.add(getAction(UndoAction.getActionName()).buildButton());
+        toolBar.add(getAction(RedoAction.getActionName()).buildButton());
+        
+        toolBar.addSeparator();
 
         toolBar.add(getAction(CreateDomainAction.getActionName()).buildButton());
         toolBar.add(getAction(CreateNodeAction.getActionName()).buildButton());

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractCreateCallbackMethodAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractCreateCallbackMethodAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractCreateCallbackMethodAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractCreateCallbackMethodAction.java Mon Oct  5 18:40:25 2009
@@ -26,19 +26,22 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.editor.CallbackType;
 import org.apache.cayenne.modeler.event.CallbackMethodEvent;
+import org.apache.cayenne.modeler.undo.CreateCallbackMethodUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.util.NameConverter;
 
 /**
  * Base class for creating callback methods
- *
+ * 
  * @version 1.0 Oct 28, 2007
  */
 public abstract class AbstractCreateCallbackMethodAction extends CayenneAction {
 
+    
+
     /**
      * Constructor.
-     *
+     * 
      * @param actionName unique action name
      * @param application Application instance
      */
@@ -60,40 +63,59 @@
 
     /**
      * performs adding new callback method
+     * 
      * @param e event
      */
     public final void performAction(ActionEvent e) {
         CallbackType callbackType = getProjectController().getCurrentCallbackType();
 
-        //generate methodName
+        // generate methodName
         String methodNamePrefix = toMethodName(callbackType.getType());
         String methodName;
-        //now that we're generating the method names based on the callback type, check to see if the
-        //raw prefix, no numbers, is taken.
-        if (!getCallbackMap().getCallbackDescriptor(callbackType.getType()).getCallbackMethods().contains(methodNamePrefix)) {
+        // now that we're generating the method names based on the callback type, check to
+        // see if the
+        // raw prefix, no numbers, is taken.
+        if (!getCallbackMap()
+                .getCallbackDescriptor(callbackType.getType())
+                .getCallbackMethods()
+                .contains(methodNamePrefix)) {
             methodName = methodNamePrefix;
-        } else {
+        }
+        else {
             int counter = 1;
             do {
                 methodName = methodNamePrefix + counter;
                 counter++;
-            } while(getCallbackMap().getCallbackDescriptor(callbackType.getType()).getCallbackMethods().contains(methodName));
+            } while (getCallbackMap()
+                    .getCallbackDescriptor(callbackType.getType())
+                    .getCallbackMethods()
+                    .contains(methodName));
         }
 
-        getCallbackMap().getCallbackDescriptor(callbackType.getType()).addCallbackMethod(methodName);
+        createCallbackMethod(getCallbackMap(), callbackType, methodName);
+        application.getUndoManager().addEdit(
+                new CreateCallbackMethodUndoableEdit(
+                        getCallbackMap(),
+                        callbackType,
+                        methodName));
+    }
+
+    public void createCallbackMethod(
+            CallbackMap map,
+            CallbackType callbackType,
+            String methodName) {
+        map.getCallbackDescriptor(callbackType.getType()).addCallbackMethod(methodName);
 
         CallbackMethodEvent ce = new CallbackMethodEvent(
-                e.getSource(),
+                this,
                 null,
                 methodName,
-                MapEvent.ADD
-        );
+                MapEvent.ADD);
 
         getProjectController().fireCallbackMethodEvent(ce);
     }
 
     private String toMethodName(LifecycleEvent event) {
-        return "on" + NameConverter.underscoredToJava(event.name(),true);
+        return "on" + NameConverter.underscoredToJava(event.name(), true);
     }
 }
-

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractRemoveCallbackMethodAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractRemoveCallbackMethodAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractRemoveCallbackMethodAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AbstractRemoveCallbackMethodAction.java Mon Oct  5 18:40:25 2009
@@ -35,6 +35,8 @@
  */
 public abstract class AbstractRemoveCallbackMethodAction extends RemoveAction {
 
+    
+
     /**
      * Constructor.
      *
@@ -87,16 +89,23 @@
         String[] callbackMethods = mediator.getCurrentCallbackMethods();
 
         for (String callbackMethod : callbackMethods) {
-            getCallbackMap().getCallbackDescriptor(callbackType.getType()).removeCallbackMethod(callbackMethod);
-            CallbackMethodEvent e = new CallbackMethodEvent(
-                    actionEvent.getSource(),
-                    null,
-                    callbackMethod,
-                    MapEvent.REMOVE);
-            mediator.fireCallbackMethodEvent(e);
+            removeCallbackMethod(getCallbackMap(), callbackType, callbackMethod);
         }
     }
     
+    public void removeCallbackMethod(CallbackMap map, CallbackType callbackType, String method) {
+        ProjectController mediator = getProjectController();
+        map.getCallbackDescriptor(callbackType.getType()).removeCallbackMethod(method);
+        
+        CallbackMethodEvent e = new CallbackMethodEvent(
+                this,
+                null,
+                method,
+                MapEvent.REMOVE);
+        
+        mediator.fireCallbackMethodEvent(e);
+    }
+    
     /**
      * Returns action name, depending on count of selected rows
      */

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java Mon Oct  5 18:40:25 2009
@@ -21,6 +21,8 @@
 
 import java.awt.event.ActionEvent;
 
+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;
@@ -35,6 +37,8 @@
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.AttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.EmbeddableAttributeDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateAttributeUndoableEdit;
+import org.apache.cayenne.modeler.undo.CreateEmbAttributeUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.NamedObjectFactory;
 import org.apache.cayenne.project.ProjectPath;
@@ -43,6 +47,8 @@
  */
 public class CreateAttributeAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
         return "Create Attribute";
     }
@@ -64,26 +70,64 @@
      */
     @Override
     public void performAction(ActionEvent e) {
+        ProjectController mediator = getProjectController();
+
         if (getProjectController().getCurrentEmbeddable() != null) {
-            createEmbAttribute();
+            Embeddable embeddable = mediator.getCurrentEmbeddable();
+
+            EmbeddableAttribute attr = (EmbeddableAttribute) NamedObjectFactory
+                    .createObject(EmbeddableAttribute.class, embeddable);
+
+            createEmbAttribute(embeddable, attr);
+
+            application.getUndoManager().addEdit(
+                    new CreateEmbAttributeUndoableEdit(
+                            embeddable,
+                            new EmbeddableAttribute[] {
+                                attr
+                            }));
         }
+
         if (getProjectController().getCurrentObjEntity() != null) {
-            createObjAttribute();
+
+            ObjEntity objEntity = mediator.getCurrentObjEntity();
+
+            ObjAttribute attr = (ObjAttribute) NamedObjectFactory.createObject(
+                    ObjAttribute.class,
+                    objEntity);
+
+            createObjAttribute(mediator.getCurrentDataDomain(), mediator
+                    .getCurrentDataMap(), objEntity, attr);
+
+            application.getUndoManager().addEdit(
+                    new CreateAttributeUndoableEdit(
+                            mediator.getCurrentDataDomain(),
+                            mediator.getCurrentDataMap(),
+                            objEntity,
+                            attr));
         }
         else if (getProjectController().getCurrentDbEntity() != null) {
-            createDbAttribute();
+            DbEntity dbEntity = getProjectController().getCurrentDbEntity();
+
+            DbAttribute attr = (DbAttribute) NamedObjectFactory.createObject(
+                    DbAttribute.class,
+                    dbEntity);
+
+            createDbAttribute(mediator.getCurrentDataDomain(), mediator
+                    .getCurrentDataMap(), dbEntity, attr);
+
+            application.getUndoManager().addEdit(
+                    new CreateAttributeUndoableEdit(
+                            mediator.getCurrentDataDomain(),
+                            mediator.getCurrentDataMap(),
+                            dbEntity,
+                            attr));
         }
     }
 
-    private void createEmbAttribute() {
+    public void createEmbAttribute(Embeddable embeddable, EmbeddableAttribute attr) {
         ProjectController mediator = getProjectController();
-        Embeddable embeddable = mediator.getCurrentEmbeddable();
-
-        EmbeddableAttribute attr = (EmbeddableAttribute) NamedObjectFactory.createObject(
-                EmbeddableAttribute.class,
-                embeddable);
         embeddable.addAttribute(attr);
-
         fireEmbeddableAttributeEvent(this, mediator, embeddable, attr);
     }
 
@@ -92,6 +136,7 @@
             ProjectController mediator,
             Embeddable embeddable,
             EmbeddableAttribute attr) {
+
         mediator.fireEmbeddableAttributeEvent(new EmbeddableAttributeEvent(
                 src,
                 attr,
@@ -108,16 +153,15 @@
         mediator.fireEmbeddableAttributeDisplayEvent(e);
     }
 
-    public void createObjAttribute() {
-        ProjectController mediator = getProjectController();
-        ObjEntity objEntity = mediator.getCurrentObjEntity();
+    public void createObjAttribute(
+            DataDomain domain,
+            DataMap map,
+            ObjEntity objEntity,
+            ObjAttribute attr) {
 
-        ObjAttribute attr = (ObjAttribute) NamedObjectFactory.createObject(
-                ObjAttribute.class,
-                objEntity);
+        ProjectController mediator = getProjectController();
         objEntity.addAttribute(attr);
-
-        fireObjAttributeEvent(this, mediator, objEntity, attr);
+        fireObjAttributeEvent(this, mediator, domain, map, objEntity, attr);
     }
 
     /**
@@ -126,8 +170,11 @@
     static void fireObjAttributeEvent(
             Object src,
             ProjectController mediator,
+            DataDomain domain,
+            DataMap map,
             ObjEntity objEntity,
             ObjAttribute attr) {
+
         mediator.fireObjAttributeEvent(new AttributeEvent(
                 src,
                 attr,
@@ -138,21 +185,20 @@
                 src,
                 attr,
                 objEntity,
-                mediator.getCurrentDataMap(),
-                mediator.getCurrentDataDomain());
+                map,
+                domain);
 
         mediator.fireObjAttributeDisplayEvent(ade);
     }
 
-    public void createDbAttribute() {
-        DbEntity dbEntity = getProjectController().getCurrentDbEntity();
-        DbAttribute attr = (DbAttribute) NamedObjectFactory.createObject(
-                DbAttribute.class,
-                dbEntity);
+    public void createDbAttribute(
+            DataDomain domain,
+            DataMap map,
+            DbEntity dbEntity,
+            DbAttribute attr) {
         dbEntity.addAttribute(attr);
-
         ProjectController mediator = getProjectController();
-        fireDbAttributeEvent(this, mediator, dbEntity, attr);
+        fireDbAttributeEvent(this, mediator, domain, map, dbEntity, attr);
     }
 
     /**
@@ -161,6 +207,8 @@
     static void fireDbAttributeEvent(
             Object src,
             ProjectController mediator,
+            DataDomain domain,
+            DataMap map,
             DbEntity dbEntity,
             DbAttribute attr) {
         mediator.fireDbAttributeEvent(new AttributeEvent(
@@ -173,8 +221,8 @@
                 src,
                 attr,
                 dbEntity,
-                mediator.getCurrentDataMap(),
-                mediator.getCurrentDataDomain());
+                map,
+                domain);
 
         mediator.fireDbAttributeDisplayEvent(ade);
     }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateCallbackMethodAction.java Mon Oct  5 18:40:25 2009
@@ -27,11 +27,16 @@
  * @version 1.0 Oct 30, 2007
  */
 public class CreateCallbackMethodAction extends AbstractCreateCallbackMethodAction {
+    
     /**
      * unique action name
      */
     public static final String ACTION_NAME = "Create callback method";
-
+    
+    public static String getActionName() {
+        return ACTION_NAME;
+    }
+    
     /**
      * Constructor.
      *

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDataMapAction.java Mon Oct  5 18:40:25 2009
@@ -25,6 +25,7 @@
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
+import org.apache.cayenne.modeler.undo.CreateDataMapUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.NamedObjectFactory;
 import org.apache.cayenne.project.ProjectPath;
@@ -35,9 +36,11 @@
  */
 public class CreateDataMapAction extends CayenneAction {
 
-	public static String getActionName() {
-		return "Create DataMap";
-	}
+    
+
+    public static String getActionName() {
+        return "Create DataMap";
+    }
 
     public CreateDataMapAction(Application application) {
         super(getActionName(), application);
@@ -47,27 +50,32 @@
         return "icon-datamap.gif";
     }
 
-    /** Calls addDataMap() or creates new data map if no data node selected.*/
-    protected void createDataMap() {
+    /** Calls addDataMap() or creates new data map if no data node selected. */
+    public void createDataMap(DataDomain domain, DataMap map) {
+        ProjectController mediator = getProjectController();
+        mediator.addDataMap(this, map);
+    }
+
+    public void performAction(ActionEvent e) {
         ProjectController mediator = getProjectController();
         DataDomain currentDomain = mediator.getCurrentDataDomain();
-        
-        // use domain name as DataMap base, as map names must be unique across the project...
-        DataMap map =
-            (DataMap) NamedObjectFactory.createObject(
+
+        // use domain name as DataMap base, as map names must be unique across the
+        // project...
+        DataMap map = (DataMap) NamedObjectFactory.createObject(
                 DataMap.class,
                 currentDomain,
                 currentDomain.getName() + "Map");
-        mediator.addDataMap(this, map);
-    }
 
-    public void performAction(ActionEvent e) {
-        createDataMap();
+        createDataMap(currentDomain, map);
+
+        application.getUndoManager().addEdit(
+                new CreateDataMapUndoableEdit(currentDomain, map));
     }
 
     /**
-    * Returns <code>true</code> if path contains a DataDomain object.
-    */
+     * Returns <code>true</code> if path contains a DataDomain object.
+     */
     public boolean enableForPath(ProjectPath path) {
         if (path == null) {
             return false;

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java Mon Oct  5 18:40:25 2009
@@ -28,6 +28,7 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateDbEntityUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.NamedObjectFactory;
 import org.apache.cayenne.project.ProjectPath;
@@ -36,6 +37,8 @@
  */
 public class CreateDbEntityAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
         return "Create DbEntity";
     }
@@ -59,11 +62,15 @@
      */
     public void performAction(ActionEvent e) {
         ProjectController mediator = getProjectController();
-        DbEntity entity = createEntity(mediator.getCurrentDataMap());
 
-        fireDbEntityEvent(this, mediator, entity);
+        DataMap map = mediator.getCurrentDataMap();
+        DbEntity entity = (DbEntity) NamedObjectFactory.createObject(DbEntity.class, map);
+
+        createEntity(map, entity);
+
+        application.getUndoManager().addEdit(new CreateDbEntityUndoableEdit(map, entity));
     }
-    
+
     /**
      * Fires events when a db entity was added
      */
@@ -79,11 +86,11 @@
     /**
      * Constructs and returns a new DbEntity. Entity returned is added to the DataMap.
      */
-    protected DbEntity createEntity(DataMap map) {
-        DbEntity entity = (DbEntity) NamedObjectFactory.createObject(DbEntity.class, map);
+    public void createEntity(DataMap map, DbEntity entity) {
+        ProjectController mediator = getProjectController();
         entity.setSchema(map.getDefaultSchema());
         map.addDbEntity(entity);
-        return entity;
+        fireDbEntityEvent(this, mediator, entity);
     }
 
     /**

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDomainAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDomainAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDomainAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDomainAction.java Mon Oct  5 18:40:25 2009
@@ -27,6 +27,7 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.DomainDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateDomainUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.ApplicationProject;
 import org.apache.cayenne.project.NamedObjectFactory;
@@ -36,6 +37,8 @@
  */
 public class CreateDomainAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
         return "Create DataDomain";
     }
@@ -54,18 +57,24 @@
     }
 
     public void performAction(ActionEvent e) {
-        createDomain();
-    }
-
-    protected void createDomain() {
-        // only ApplicationProjects can have domains, so this cast is reasonable
         ApplicationProject project = (ApplicationProject) getCurrentProject();
-
         ProjectController mediator = getProjectController();
+
         DataDomain domain = (DataDomain) NamedObjectFactory.createObject(
                 DataDomain.class,
                 project.getConfiguration());
+
         domain.getEntityResolver().setIndexedByClass(false);
+
+        createDomain(domain);
+
+        application.getUndoManager().addEdit(new CreateDomainUndoableEdit(domain));
+    }
+
+    public void createDomain(DataDomain domain) {
+        ApplicationProject project = (ApplicationProject) getCurrentProject();
+        ProjectController mediator = getProjectController();
+
         project.getConfiguration().addDomain(domain);
         mediator.fireDomainEvent(new DomainEvent(this, domain, MapEvent.ADD));
         mediator.fireDomainDisplayEvent(new DomainDisplayEvent(this, domain));

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateEmbeddableAction.java Mon Oct  5 18:40:25 2009
@@ -27,6 +27,7 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateEmbeddableUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.NamedObjectFactory;
 import org.apache.cayenne.project.ProjectPath;
@@ -48,21 +49,23 @@
 
     @Override
     public void performAction(ActionEvent e) {
-        createEmbeddable();
-    }
-
-    private void createEmbeddable() {
         ProjectController mediator = getProjectController();
 
         DataMap dataMap = mediator.getCurrentDataMap();
+
         Embeddable embeddable = (Embeddable) NamedObjectFactory.createObject(
                 Embeddable.class,
                 mediator.getCurrentDataMap());
 
+        createEmbeddable(dataMap, embeddable);
 
-        dataMap.addEmbeddable(embeddable);
+        application.getUndoManager().addEdit(
+                new CreateEmbeddableUndoableEdit(dataMap, embeddable));
+    }
 
-        fireEmbeddableEvent(this, mediator, dataMap, embeddable);
+    public void createEmbeddable(DataMap dataMap, Embeddable embeddable) {
+        dataMap.addEmbeddable(embeddable);
+        fireEmbeddableEvent(this, getProjectController(), dataMap, embeddable);
     }
 
     static void fireEmbeddableEvent(
@@ -71,7 +74,9 @@
             DataMap dataMap,
             Embeddable embeddable) {
 
-        mediator.fireEmbeddableEvent(new EmbeddableEvent(src, embeddable, MapEvent.ADD), dataMap);
+        mediator.fireEmbeddableEvent(
+                new EmbeddableEvent(src, embeddable, MapEvent.ADD),
+                dataMap);
         EmbeddableDisplayEvent displayEvent = new EmbeddableDisplayEvent(
                 src,
                 embeddable,

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateNodeAction.java Mon Oct  5 18:40:25 2009
@@ -33,6 +33,7 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.DataNodeDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateNodeUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.modeler.util.ModelerDbAdapter;
 import org.apache.cayenne.project.NamedObjectFactory;
@@ -43,6 +44,8 @@
  */
 public class CreateNodeAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
         return "Create DataNode";
     }
@@ -64,34 +67,42 @@
      * @see org.apache.cayenne.modeler.util.CayenneAction#performAction(ActionEvent)
      */
     public void performAction(ActionEvent e) {
-        ProjectController mediator = getProjectController();
-        DataDomain domain = mediator.getCurrentDataDomain();
-
-        // use domain name as DataNode base, as node names must be unique across the
-        // project...
         DataNode node = buildDataNode();
-        fireDataNodeEvent(this, mediator, domain, node);
+        createDataNode(getProjectController().getCurrentDataDomain(), node);
+        application.getUndoManager().addEdit(
+                new CreateNodeUndoableEdit(application, getProjectController()
+                        .getCurrentDataDomain(), node));
     }
-    
+
+    public void createDataNode(DataDomain domain, DataNode node) {
+        domain.addNode(node);
+        getProjectController().fireDataNodeEvent(
+                new DataNodeEvent(this, node, MapEvent.ADD));
+        getProjectController().fireDataNodeDisplayEvent(
+                new DataNodeDisplayEvent(this, domain, node));
+    }
+
     /**
-     * Fires events when a obj entity was added
+     * Returns <code>true</code> if path contains a DataDomain object.
      */
-    static void fireDataNodeEvent(Object src, ProjectController mediator, DataDomain domain,
-            DataNode node) {
-        mediator.fireDataNodeEvent(new DataNodeEvent(src, node, MapEvent.ADD));
-        mediator.fireDataNodeDisplayEvent(new DataNodeDisplayEvent(src, domain, node));
+    public boolean enableForPath(ProjectPath path) {
+        if (path == null) {
+            return false;
+        }
+
+        return path.firstInstanceOf(DataDomain.class) != null;
     }
 
     /**
      * Creates a new DataNode, adding to the current domain, but doesn't send any events.
      */
-    protected DataNode buildDataNode() {
+    public DataNode buildDataNode() {
         ProjectController mediator = getProjectController();
         DataDomain domain = mediator.getCurrentDataDomain();
 
         // use domain name as DataNode base, as node names must be unique across the
         // project...
-        DataNode node = createDataNode(domain);
+        DataNode node = buildDataNode(domain);
 
         ProjectDataSource src = new ProjectDataSource(new DataSourceInfo());
         node.setDataSource(src);
@@ -100,15 +111,14 @@
         // by default create JDBC Node
         node.setDataSourceFactory(DriverDataSourceFactory.class.getName());
         node.setSchemaUpdateStrategyName(SkipSchemaUpdateStrategy.class.getName());
-        
-        domain.addNode(node);
+
         return node;
     }
 
     /**
      * A factory method that makes a new DataNode.
      */
-    protected DataNode createDataNode(DataDomain domain) {
+    DataNode buildDataNode(DataDomain domain) {
         String name = NamedObjectFactory.createName(DataNode.class, domain, domain
                 .getName()
                 + "Node");
@@ -122,15 +132,4 @@
             }
         };
     }
-
-    /**
-     * Returns <code>true</code> if path contains a DataDomain object.
-     */
-    public boolean enableForPath(ProjectPath path) {
-        if (path == null) {
-            return false;
-        }
-
-        return path.firstInstanceOf(DataDomain.class) != null;
-    }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityAction.java Mon Oct  5 18:40:25 2009
@@ -29,6 +29,7 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.EntityDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateObjEntityUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.NamedObjectFactory;
 import org.apache.cayenne.project.ProjectPath;
@@ -40,6 +41,8 @@
  */
 public class CreateObjEntityAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
         return "Create ObjEntity";
     }
@@ -115,12 +118,24 @@
         merger.synchronizeWithDbEntity(entity);
 
         fireObjEntityEvent(this, mediator, dataMap, entity);
+
+        application.getUndoManager().addEdit(
+                new CreateObjEntityUndoableEdit(dataMap, entity));
     }
-    
+
+    public void createObjEntity(DataMap dataMap, ObjEntity entity) {
+        ProjectController mediator = getProjectController();
+        dataMap.addObjEntity(entity);
+        fireObjEntityEvent(this, mediator, dataMap, entity);
+    }
+
     /**
      * Fires events when a obj entity was added
      */
-    static void fireObjEntityEvent(Object src, ProjectController mediator, DataMap dataMap,
+    static void fireObjEntityEvent(
+            Object src,
+            ProjectController mediator,
+            DataMap dataMap,
             ObjEntity entity) {
         mediator.fireObjEntityEvent(new EntityEvent(src, entity, MapEvent.ADD));
         EntityDisplayEvent displayEvent = new EntityDisplayEvent(

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityListenerAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityListenerAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityListenerAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateObjEntityListenerAction.java Mon Oct  5 18:40:25 2009
@@ -23,18 +23,22 @@
 import javax.swing.JOptionPane;
 
 import org.apache.cayenne.map.EntityListener;
+import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.EntityListenerEvent;
+import org.apache.cayenne.modeler.undo.CreateEntityListenerUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 
-
 /**
  * Action class for creating entity listeners on an ObjEntity
- *
+ * 
  * @version 1.0 Oct 30, 2007
  */
 public class CreateObjEntityListenerAction extends CayenneAction {
+
+    
+
     /**
      * unique action name
      */
@@ -42,7 +46,7 @@
 
     /**
      * Constructor.
-     *
+     * 
      * @param application Application instance
      */
     public CreateObjEntityListenerAction(Application application) {
@@ -51,7 +55,7 @@
 
     /**
      * Constructor for extending classes.
-     *
+     * 
      * @param actionName unique action name
      * @param application Application instance
      */
@@ -75,7 +79,7 @@
 
     /**
      * checks whether the new name of listener class already exists
-     *
+     * 
      * @param className entered class name
      * @return true or false
      */
@@ -84,41 +88,36 @@
     }
 
     /**
-     * adds new entity listener
-     * @param listener new EntityListener instance
-     */
-    protected void addEntityListener(EntityListener listener) {
-        getProjectController().getCurrentObjEntity().addEntityListener(listener);
-    }
-
-    /**
      * base entity listenre creation logic
-     *
+     * 
      * @param e event
      */
     public void performAction(ActionEvent e) {
-        String listenerClass = JOptionPane.showInputDialog("Please enter listener class:");
+        String listenerClass = JOptionPane
+                .showInputDialog("Please enter listener class:");
         if (listenerClass != null && listenerClass.trim().length() > 0) {
             if (isListenerClassAlreadyExists(listenerClass)) {
                 JOptionPane.showMessageDialog(
                         null,
                         "Listener class already exists.",
                         "Error creating entity listener",
-                        JOptionPane.ERROR_MESSAGE
-                );
+                        JOptionPane.ERROR_MESSAGE);
             }
             else {
-                addEntityListener(new EntityListener(listenerClass));
-                getProjectController().fireEntityListenerEvent(
-                        new EntityListenerEvent(
-                                CreateObjEntityListenerAction.this,
-                                listenerClass,
-                                listenerClass,
-                                MapEvent.ADD
-                        )
-                );
+                ObjEntity objEntity = getProjectController().getCurrentObjEntity();
+                EntityListener listener = new EntityListener(listenerClass);
+                createEntityListener(objEntity, listener);
+                application.getUndoManager().addEdit(
+                        new CreateEntityListenerUndoableEdit(objEntity, listener));
             }
         }
     }
-}
 
+    public void createEntityListener(ObjEntity objEntity, EntityListener listener) {
+        objEntity.addEntityListener(listener);
+
+        getProjectController().fireEntityListenerEvent(
+                new EntityListenerEvent(CreateObjEntityListenerAction.this, listener
+                        .getClassName(), listener.getClassName(), MapEvent.ADD));
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureAction.java Mon Oct  5 18:40:25 2009
@@ -28,6 +28,7 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.ProcedureDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateProcedureUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.NamedObjectFactory;
 import org.apache.cayenne.project.ProjectPath;
@@ -38,6 +39,8 @@
  */
 public class CreateProcedureAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
         return "Create Stored Procedure";
     }
@@ -48,15 +51,25 @@
 
     public void performAction(ActionEvent e) {
         ProjectController mediator = getProjectController();
-        Procedure procedure = createProcedure(mediator.getCurrentDataMap());
+        DataMap map = mediator.getCurrentDataMap();
+
+        Procedure procedure = (Procedure) NamedObjectFactory.createObject(
+                Procedure.class,
+                map);
+
+        createProcedure(map, procedure);
 
-        fireProcedureEvent(this, mediator, mediator.getCurrentDataMap(), procedure);
+        application.getUndoManager().addEdit(
+                new CreateProcedureUndoableEdit(map, procedure));
     }
-    
+
     /**
      * Fires events when a procedure was added
      */
-    static void fireProcedureEvent(Object src, ProjectController mediator, DataMap dataMap,
+    static void fireProcedureEvent(
+            Object src,
+            ProjectController mediator,
+            DataMap dataMap,
             Procedure procedure) {
         mediator.fireProcedureEvent(new ProcedureEvent(src, procedure, MapEvent.ADD));
         mediator.fireProcedureDisplayEvent(new ProcedureDisplayEvent(
@@ -66,14 +79,11 @@
                 mediator.getCurrentDataDomain()));
     }
 
-    protected Procedure createProcedure(DataMap map) {
-        Procedure procedure = (Procedure) NamedObjectFactory.createObject(
-                Procedure.class,
-                map);
+    public void createProcedure(DataMap map, Procedure procedure) {
+        ProjectController mediator = getProjectController();
         procedure.setSchema(map.getDefaultSchema());
-
         map.addProcedure(procedure);
-        return procedure;
+        fireProcedureEvent(this, mediator, map, procedure);
     }
 
     /**

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateProcedureParameterAction.java Mon Oct  5 18:40:25 2009
@@ -36,6 +36,8 @@
  */
 public class CreateProcedureParameterAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
     	return "Create Parameter";
     }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateQueryAction.java Mon Oct  5 18:40:25 2009
@@ -21,15 +21,24 @@
 
 import java.awt.event.ActionEvent;
 
+import org.apache.cayenne.access.DataDomain;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.event.MapEvent;
+import org.apache.cayenne.map.event.QueryEvent;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.query.QueryTypeController;
+import org.apache.cayenne.modeler.event.QueryDisplayEvent;
 import org.apache.cayenne.modeler.util.CayenneAction;
+import org.apache.cayenne.query.Query;
 
 /**
  * @since 1.1
  */
 public class CreateQueryAction extends CayenneAction {
 
+    
+
     public static String getActionName() {
         return "Create Query";
     }
@@ -52,4 +61,19 @@
     protected void createQuery() {
         new QueryTypeController(getProjectController()).startup();
     }
+    
+    public void createQuery(DataDomain domain, DataMap dataMap, Query query) {
+        dataMap.addQuery(query);
+        // notify listeners
+        fireQueryEvent(this, getProjectController(), domain, dataMap, query);
+    }
+     
+    /**
+     * Fires events when a query was added
+     */
+    public static void fireQueryEvent(Object src, ProjectController mediator, DataDomain domain,
+            DataMap dataMap, Query query) {
+        mediator.fireQueryEvent(new QueryEvent(src, query, MapEvent.ADD, dataMap));
+        mediator.fireQueryDisplayEvent(new QueryDisplayEvent(src, query, dataMap, domain));
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java Mon Oct  5 18:40:25 2009
@@ -31,6 +31,7 @@
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.event.RelationshipDisplayEvent;
+import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.NamedObjectFactory;
 import org.apache.cayenne.project.ProjectPath;
@@ -40,9 +41,11 @@
  */
 public class CreateRelationshipAction extends CayenneAction {
 
-	public static String getActionName() {
-		return "Create Relationship";
-	}
+    
+
+    public static String getActionName() {
+        return "Create Relationship";
+    }
 
     /**
      * Constructor for CreateRelationshipAction.
@@ -63,66 +66,94 @@
     public void performAction(ActionEvent e) {
         ObjEntity objEnt = getProjectController().getCurrentObjEntity();
         if (objEnt != null) {
-            createObjRelationship(objEnt);
-        } else {
+
+            ObjRelationship rel = (ObjRelationship) NamedObjectFactory.createObject(
+                    ObjRelationship.class,
+                    objEnt);
+
+            createObjRelationship(objEnt, rel);
+
+            application.getUndoManager().addEdit(
+                    new CreateRelationshipUndoableEdit(objEnt, new ObjRelationship[] {
+                        rel
+                    }));
+        }
+        else {
             DbEntity dbEnt = getProjectController().getCurrentDbEntity();
             if (dbEnt != null) {
-                createDbRelationship(dbEnt);
+
+                DbRelationship rel = (DbRelationship) NamedObjectFactory.createObject(
+                        DbRelationship.class,
+                        dbEnt);
+
+                createDbRelationship(dbEnt, rel);
+
+                application.getUndoManager().addEdit(
+                        new CreateRelationshipUndoableEdit(dbEnt, new DbRelationship[] {
+                            rel
+                        }));
             }
         }
     }
 
-    public void createObjRelationship(ObjEntity objEntity) {
+    public void createObjRelationship(ObjEntity objEntity, ObjRelationship rel) {
         ProjectController mediator = getProjectController();
 
-        ObjRelationship rel =
-            (ObjRelationship) NamedObjectFactory.createObject(
-                ObjRelationship.class,
-                objEntity);
         rel.setSourceEntity(objEntity);
         DeleteRuleUpdater.updateObjRelationship(rel);
-        
+
         objEntity.addRelationship(rel);
         fireObjRelationshipEvent(this, mediator, objEntity, rel);
     }
-    
+
     /**
      * Fires events when a obj rel was added
      */
-    static void fireObjRelationshipEvent(Object src, ProjectController mediator, ObjEntity objEntity, 
+    static void fireObjRelationshipEvent(
+            Object src,
+            ProjectController mediator,
+            ObjEntity objEntity,
             ObjRelationship rel) {
-        mediator.fireObjRelationshipEvent(
-            new RelationshipEvent(src, rel, objEntity, MapEvent.ADD));
-            
+
+        mediator.fireObjRelationshipEvent(new RelationshipEvent(
+                src,
+                rel,
+                objEntity,
+                MapEvent.ADD));
+
         RelationshipDisplayEvent rde = new RelationshipDisplayEvent(
                 src,
                 rel,
                 objEntity,
                 mediator.getCurrentDataMap(),
                 mediator.getCurrentDataDomain());
-        
+
         mediator.fireObjRelationshipDisplayEvent(rde);
     }
 
-    public void createDbRelationship(DbEntity dbEntity) {
+    public void createDbRelationship(DbEntity dbEntity, DbRelationship rel) {
         ProjectController mediator = getProjectController();
 
-        DbRelationship rel =
-            (DbRelationship) NamedObjectFactory.createObject(DbRelationship.class, dbEntity);
-
         rel.setSourceEntity(dbEntity);
         dbEntity.addRelationship(rel);
 
         fireDbRelationshipEvent(this, mediator, dbEntity, rel);
     }
-    
+
     /**
      * Fires events when a db rel was added
      */
-    static void fireDbRelationshipEvent(Object src, ProjectController mediator, DbEntity dbEntity, 
+    static void fireDbRelationshipEvent(
+            Object src,
+            ProjectController mediator,
+            DbEntity dbEntity,
             DbRelationship rel) {
-        mediator.fireDbRelationshipEvent(
-            new RelationshipEvent(src, rel, dbEntity, MapEvent.ADD));
+
+        mediator.fireDbRelationshipEvent(new RelationshipEvent(
+                src,
+                rel,
+                dbEntity,
+                MapEvent.ADD));
 
         RelationshipDisplayEvent rde = new RelationshipDisplayEvent(
                 src,
@@ -130,13 +161,13 @@
                 dbEntity,
                 mediator.getCurrentDataMap(),
                 mediator.getCurrentDataDomain());
-        
+
         mediator.fireDbRelationshipDisplayEvent(rde);
     }
 
     /**
-    * Returns <code>true</code> if path contains an Entity object.
-    */
+     * Returns <code>true</code> if path contains an Entity object.
+     */
     @Override
     public boolean enableForPath(ProjectPath path) {
         if (path == null) {

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DocumentationAction.java Mon Oct  5 18:40:25 2009
@@ -29,7 +29,7 @@
  */
 public class DocumentationAction extends CayenneAction {
 
-    private static final long serialVersionUID = 1L;
+    
 
     public final static String getActionName() {
         return "Documentation";

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java Mon Oct  5 18:40:25 2009
@@ -28,24 +28,17 @@
 import javax.swing.JTextField;
 
 import org.apache.cayenne.map.Attribute;
-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.Entity;
-import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.CayenneModelerFrame;
 import org.apache.cayenne.modeler.dialog.FindDialog;
-import org.apache.cayenne.modeler.editor.EditorView;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.ProjectPath;
 
 public class FindAction extends CayenneAction {
-    private java.util.List paths;
+    private java.util.List<Object> paths;
 
     public static String getActionName() {
         return "Find";
@@ -62,7 +55,7 @@
     public void performAction(ActionEvent e) {
         JTextField source = (JTextField) e.getSource();
 
-        paths = new ArrayList();
+        paths = new ArrayList<Object>();
         if (!source.getText().trim().equals("")) {
             Pattern pattern = Pattern.compile(source.getText().trim(), Pattern.CASE_INSENSITIVE);
 
@@ -90,8 +83,7 @@
             int index = 0;
             if (it.hasNext()) {
                 Object[] path = (Object[]) it.next();
-                EditorView editor =  ((CayenneModelerFrame) getApplication().getFrameController().getView()).getView();
-                FindDialog.jumpToResult(path, editor);
+                FindDialog.jumpToResult(path);
             }   
         }
     }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDBAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDBAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDBAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ImportDBAction.java Mon Oct  5 18:40:25 2009
@@ -22,6 +22,8 @@
 import java.awt.event.ActionEvent;
 import java.sql.Connection;
 
+import javax.swing.SwingUtilities;
+
 import org.apache.cayenne.access.DataDomain;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.modeler.Application;
@@ -68,7 +70,7 @@
         Connection connection = connectWizard.getConnection();
         DbAdapter adapter = connectWizard.getAdapter();
         DBConnectionInfo dataSourceInfo = connectWizard.getConnectionInfo();
-        
+
         // from here pass control to DbLoaderHelper, running it from a thread separate
         // from EventDispatch
 
@@ -81,8 +83,16 @@
 
             public void run() {
                 helper.execute();
+
+                SwingUtilities.invokeLater(new Runnable() {
+
+                    public void run() {
+                        application.getUndoManager().discardAllEdits();
+                    }
+                });
             }
         });
+        
         th.start();
     }
 

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/InferRelationshipsAction.java Mon Oct  5 18:40:25 2009
@@ -23,7 +23,6 @@
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.autorelationship.InferRelationshipsController;
-import org.apache.cayenne.modeler.dialog.codegen.CodeGeneratorController;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.project.ProjectPath;
 

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/OpenProjectAction.java Mon Oct  5 18:40:25 2009
@@ -73,7 +73,7 @@
         if (getProjectController() != null && !checkSaveOnClose()) {
             return;
         }
-
+       
         File f = null;
         if (e.getSource() instanceof FileMenuItem) {
             FileMenuItem menu = (FileMenuItem) e.getSource();
@@ -101,6 +101,8 @@
 
             openProject(f);
         }
+        
+        application.getUndoManager().discardAllEdits();
     }
 
     /** Opens specified project file. File must already exist. */

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/PasteAction.java Mon Oct  5 18:40:25 2009
@@ -48,6 +48,8 @@
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.dialog.ErrorDebugDialog;
 import org.apache.cayenne.modeler.dialog.query.QueryTypeController;
+import org.apache.cayenne.modeler.undo.PasteCompoundUndoableEdit;
+import org.apache.cayenne.modeler.undo.PasteUndoableEdit;
 import org.apache.cayenne.modeler.util.CayenneAction;
 import org.apache.cayenne.modeler.util.CayenneTransferable;
 import org.apache.cayenne.project.ProjectPath;
@@ -100,14 +102,23 @@
             Object currentObject = getProjectController().getCurrentObject();
 
             if (content != null && currentObject != null) {
+                
+                PasteCompoundUndoableEdit undoableEdit = new PasteCompoundUndoableEdit();
+                DataDomain domain = getProjectController().getCurrentDataDomain();
+                DataMap map = getProjectController().getCurrentDataMap();
+                
                 if (content instanceof List) {
                     for (Object o : (List) content) {
                         paste(currentObject, o);
+                        undoableEdit.addEdit(new PasteUndoableEdit(domain, map, currentObject, o));
                     }
                 }
                 else {
                     paste(currentObject, content);
+                    undoableEdit.addEdit(new PasteUndoableEdit(domain, map, currentObject, content));
                 }
+                
+                application.getUndoManager().addEdit(undoableEdit);
             }
         }
         catch (UnsupportedFlavorException ufe) {
@@ -117,13 +128,17 @@
             ErrorDebugDialog.guiException(ex);
         }
     }
+    
+    private void paste(Object where, Object content) {
+    	paste(where, content, getProjectController().getCurrentDataDomain(), getProjectController().getCurrentDataMap()); 
+    }
 
     /**
      * Pastes single object
      */
-    protected void paste(Object where, Object content) {
+    public void paste(Object where, Object content, DataDomain domain, DataMap map) {
         final ProjectController mediator = getProjectController();
-        final DataDomain domain = mediator.getCurrentDataDomain();
+      
 
         /**
          * Add a little intelligence - if a tree leaf is selected, we can paste to a
@@ -331,7 +346,7 @@
 
                 dbEntity.addAttribute(attr);
                 CreateAttributeAction
-                        .fireDbAttributeEvent(this, mediator, dbEntity, attr);
+                        .fireDbAttributeEvent(this, mediator, domain, mediator.getCurrentDataMap(), dbEntity, attr);
             }
             else if (content instanceof DbRelationship) {
                 DbRelationship rel = (DbRelationship) content;
@@ -364,7 +379,7 @@
                 objEntity.addAttribute(attr);
                 CreateAttributeAction.fireObjAttributeEvent(
                         this,
-                        mediator,
+                        mediator, domain, mediator.getCurrentDataMap(), 
                         objEntity,
                         attr);
             }

Modified: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java?rev=821956&r1=821955&r2=821956&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java (original)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ProjectAction.java Mon Oct  5 18:40:25 2009
@@ -85,6 +85,9 @@
         CayenneModelerController controller = Application
                 .getInstance()
                 .getFrameController();
+        
+        application.getUndoManager().discardAllEdits();
+        
         controller.projectClosedAction();
 
         return true;

Added: cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java?rev=821956&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java (added)
+++ cayenne/main/trunk/framework/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RedoAction.java Mon Oct  5 18:40:25 2009
@@ -0,0 +1,67 @@
+/*****************************************************************
+ *   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.action;
+
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.InputEvent;
+import java.awt.event.KeyEvent;
+
+import javax.swing.KeyStroke;
+
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.util.CayenneAction;
+
+public class RedoAction extends CayenneAction {
+
+    @Override
+    public void setEnabled(boolean b) {
+        super.setEnabled(b);
+    }
+
+    
+
+    @Override
+    public boolean isAlwaysOn() {
+        return false;
+    }
+
+    public static String getActionName() {
+        return "Redo";
+    }
+    
+    public RedoAction(Application application) {
+        super(getActionName(), application);
+    }
+    
+    @Override
+    public KeyStroke getAcceleratorKey() {
+        return KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() | InputEvent.SHIFT_MASK);
+    }
+    
+    @Override
+    public String getIconName() {
+        return "icon-redo.gif";
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        application.getUndoManager().redo();
+    }
+}