Author: thomasobrien95
Date: Tue Dec 23 11:48:24 2008
New Revision: 2897

Modified:
   trunk/regress/ca/sqlpower/architect/undo/TestUndoManager.java
   trunk/src/ca/sqlpower/architect/undo/ArchitectUndoManager.java

Log:
Fix for bug 1618. There is now a listener for adding and removing
data sources to the tree in Architect. Data source adds and removes
can now be undone and redone.

The listener added to the root of the data sources does not listen
to changes in the children of the data sources as the children of
a data source are created by the populate method. Children should be lazily loaded and undoing a populate does not make sense. This may need to change when refresh is implemented for data sources.

Modified: trunk/regress/ca/sqlpower/architect/undo/TestUndoManager.java
==============================================================================
--- trunk/regress/ca/sqlpower/architect/undo/TestUndoManager.java       
(original)
+++ trunk/regress/ca/sqlpower/architect/undo/TestUndoManager.java Tue Dec 23 11:48:24 2008
@@ -35,6 +35,7 @@
 import ca.sqlpower.architect.SQLColumn;
 import ca.sqlpower.architect.SQLDatabase;
 import ca.sqlpower.architect.SQLObjectEvent;
+import ca.sqlpower.architect.SQLObjectRoot;
 import ca.sqlpower.architect.SQLRelationship;
 import ca.sqlpower.architect.SQLTable;
 import ca.sqlpower.architect.StubSQLObject;
@@ -44,8 +45,8 @@
 import ca.sqlpower.architect.swingui.TablePane;
 import ca.sqlpower.architect.swingui.TestingArchitectSwingSessionContext;
 import ca.sqlpower.architect.swingui.action.CreateRelationshipAction;
-import ca.sqlpower.architect.undo.UndoCompoundEvent.EventTypes;
import ca.sqlpower.architect.undo.ArchitectUndoManager.SQLObjectUndoableEventAdapter;
+import ca.sqlpower.architect.undo.UndoCompoundEvent.EventTypes;

 public class TestUndoManager extends TestCase {

@@ -369,4 +370,28 @@
            assertEquals(newPkCon, rel.getPkConnectionPoint());
            assertEquals(newFkCon, rel.getFkConnectionPoint());
     }
+       
+       /**
+ * Regression test for bug 1618. Adding a data source should be able to be undone.
+        */
+       public void testUndoAffectsSourceDBs() throws Exception {
+           SQLObjectRoot rootObject = pp.getSession().getRootObject();
+        assertEquals(1, rootObject.getChildCount());
+        SQLDatabase targetDB = (SQLDatabase)rootObject.getChild(0);
+           SQLDatabase db = new SQLDatabase();
+        rootObject.addChild(db);
+           assertEquals(2, rootObject.getChildCount());
+       
+           assertTrue(undoManager.canUndo());
+           undoManager.undo();
+           assertEquals(1, rootObject.getChildCount());
+           assertEquals(targetDB, rootObject.getChild(0));
+       
+           assertTrue(undoManager.canRedo());
+           undoManager.redo();
+           assertEquals(2, rootObject.getChildCount());
+           assertEquals(targetDB, rootObject.getChild(0));
+           assertEquals(db, rootObject.getChild(1));
+       
+       }
 }

Modified: trunk/src/ca/sqlpower/architect/undo/ArchitectUndoManager.java
==============================================================================
--- trunk/src/ca/sqlpower/architect/undo/ArchitectUndoManager.java (original) +++ trunk/src/ca/sqlpower/architect/undo/ArchitectUndoManager.java Tue Dec 23 11:48:24 2008
@@ -102,11 +102,21 @@

         private int compoundEditStackCount;

+        /**
+ * Tracks if the listener should add itself to new children on the object it is listening to.
+         */
+        private boolean addListenerToChildren = true;
+
         public SQLObjectUndoableEventAdapter() {

             ce = null;
             compoundEditStackCount = 0;
         }
+
+ public SQLObjectUndoableEventAdapter(boolean addListenerToChildren) {
+            this();
+            this.addListenerToChildren = addListenerToChildren;
+        }

         /**
          * You should not undo when in a compound edit
@@ -184,11 +194,13 @@
             undoEvent.createEditFromEvent(e);
             addEdit(undoEvent);

-            try {
-                ArchitectUtils.listenToHierarchy(this, e.getChildren());
- ArchitectUtils.addUndoListenerToHierarchy(this, e.getChildren());
-            } catch (ArchitectException ex) {
- logger.error("SQLObjectUndoableEventAdapter cannot attach to new children", ex);
+            if (addListenerToChildren) {
+                try {
+ ArchitectUtils.listenToHierarchy(this, e.getChildren()); + ArchitectUtils.addUndoListenerToHierarchy(this, e.getChildren());
+                } catch (ArchitectException ex) {
+ logger.error("SQLObjectUndoableEventAdapter cannot attach to new children", ex);
+                }
             }

         }
@@ -290,6 +302,7 @@
      */
public ArchitectUndoManager(PlayPen playPen) throws ArchitectException {
         init(playPen, playPen.getSession().getTargetDatabase());
+ playPen.getSession().getRootObject().addSQLObjectListener(new SQLObjectUndoableEventAdapter(false));
     }

public ArchitectUndoManager(SQLObject sqlObjectRoot) throws ArchitectException {

Reply via email to