You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by tv...@apache.org on 2009/09/16 19:55:35 UTC

svn commit: r815913 - in /incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk: ./ content/ skin/terra/

Author: tvolkert
Date: Wed Sep 16 17:55:34 2009
New Revision: 815913

URL: http://svn.apache.org/viewvc?rev=815913&view=rev
Log:
Preliminary work towards implementing PIVOT-299

Modified:
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Editor.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TableView.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewCellEditor.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraAccordionSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java
    incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Editor.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Editor.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Editor.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/Editor.java Wed Sep 16 17:55:34 2009
@@ -27,15 +27,15 @@
 
     /**
      * Saves an edit that is in progress by updating the appropriate data
-     * object. It is up to subclasses to define the behavior when
+     * object. It is up to implementations to define the behavior when
      * <tt>isEditing() == false</tt>.
      */
-    public void save();
+    public void saveChanges();
 
     /**
      * Cancels an edit that is in progress by reverting any edits the user has
-     * made. It is up to subclasses to define the behavior when
+     * made. It is up to implementations to define the behavior when
      * <tt>isEditing() == false</tt>.
      */
-    public void cancel();
+    public void cancelEdit();
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java Wed Sep 16 17:55:34 2009
@@ -28,6 +28,7 @@
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Vote;
 import org.apache.pivot.wtk.content.ListViewItemRenderer;
 
 
@@ -87,10 +88,81 @@
      */
     public interface ItemEditor extends Editor {
         /**
+         * Item editor listener list.
+         */
+        public static class ItemEditorListenerList
+            extends ListenerList<ItemEditorListener>
+            implements ItemEditorListener {
+            @Override
+            public Vote previewEditItem(ItemEditor itemEditor, ListView listView,
+                int index) {
+                Vote vote = Vote.APPROVE;
+
+                for (ItemEditorListener listener : this) {
+                    vote = vote.tally(listener.previewEditItem(itemEditor,
+                        listView, index));
+                }
+
+                return vote;
+            }
+
+            @Override
+            public void editItemVetoed(ItemEditor itemEditor, Vote reason) {
+                for (ItemEditorListener listener : this) {
+                    listener.editItemVetoed(itemEditor, reason);
+                }
+            }
+
+            @Override
+            public void itemEditing(ItemEditor itemEditor, ListView listView,
+                int index) {
+                for (ItemEditorListener listener : this) {
+                    listener.itemEditing(itemEditor, listView, index);
+                }
+            }
+
+            @Override
+            public Vote previewSaveChanges(ItemEditor itemEditor, ListView listView,
+                int index, Object changes) {
+                Vote vote = Vote.APPROVE;
+
+                for (ItemEditorListener listener : this) {
+                    vote = vote.tally(listener.previewSaveChanges(itemEditor,
+                        listView, index, changes));
+                }
+
+                return vote;
+            }
+
+            @Override
+            public void saveChangesVetoed(ItemEditor itemEditor, Vote reason) {
+                for (ItemEditorListener listener : this) {
+                    listener.saveChangesVetoed(itemEditor, reason);
+                }
+            }
+
+            @Override
+            public void changesSaved(ItemEditor itemEditor, ListView listView,
+                int index) {
+                for (ItemEditorListener listener : this) {
+                    listener.changesSaved(itemEditor, listView, index);
+                }
+            }
+
+            @Override
+            public void editCancelled(ItemEditor itemEditor, ListView listView,
+                int index) {
+                for (ItemEditorListener listener : this) {
+                    listener.editCancelled(itemEditor, listView, index);
+                }
+            }
+        }
+
+        /**
          * Notifies the editor that editing should begin. If the editor is
-         * currently installed on the list view, the skin may choose to call
-         * this method when the user executes the appropriate gesture (as
-         * defined by the skin).
+         * currently installed on the list view, the skin may call this method
+         * when the user executes the appropriate gesture (as defined by the
+         * skin).
          *
          * @param listView
          * The list view
@@ -101,7 +173,156 @@
          * @see
          * #setItemEditor(ItemEditor)
          */
-        public void edit(ListView listView, int index);
+        public void editItem(ListView listView, int index);
+
+        /**
+         * Gets the item editor listener list.
+         */
+        public ListenerList<ItemEditorListener> getItemEditorListeners();
+    }
+
+    /**
+     * The item editor listener interface. This provides callers with
+     * notifications about an item editor's activity.
+     */
+    public interface ItemEditorListener {
+        /**
+         * Item editor listener adapter.
+         */
+        public static class Adapter implements ItemEditorListener {
+            @Override
+            public Vote previewEditItem(ItemEditor itemEditor, ListView listView, int index) {
+                return Vote.APPROVE;
+            }
+
+            @Override
+            public void editItemVetoed(ItemEditor itemEditor, Vote reason) {
+            }
+
+            @Override
+            public void itemEditing(ItemEditor itemEditor, ListView listView, int index) {
+            }
+
+            @Override
+            public Vote previewSaveChanges(ItemEditor itemEditor, ListView listView, int index, Object changes) {
+                return Vote.APPROVE;
+            }
+
+            @Override
+            public void saveChangesVetoed(ItemEditor itemEditor, Vote reason) {
+            }
+
+            @Override
+            public void changesSaved(ItemEditor itemEditor, ListView listView, int index) {
+            }
+
+            @Override
+            public void editCancelled(ItemEditor itemEditor, ListView listView, int index) {
+            }
+        }
+
+        /**
+         * Called to preview an item edit.
+         *
+         * @param itemEditor
+         * The item editor
+         *
+         * @param listView
+         * The list view containing the item to be edited.
+         *
+         * @param index
+         * The index of the item to edit.
+         *
+         * @return
+         * A vote on whether editing should be allowed to begin.
+         */
+        public Vote previewEditItem(ItemEditor itemEditor, ListView listView, int index);
+
+        /**
+         * Called when an item edit was vetoed by a listener in the preview
+         * event.
+         *
+         * @param itemEditor
+         * The item editor
+         *
+         * @param reason
+         * The reason for the veto
+         */
+        public void editItemVetoed(ItemEditor itemEditor, Vote reason);
+
+        /**
+         * Called when editing has begun.
+         *
+         * @param itemEditor
+         * The item editor
+         *
+         * @param listView
+         * The list view containing the item being edited.
+         *
+         * @param index
+         * The index of the item being edited.
+         */
+        public void itemEditing(ItemEditor itemEditor, ListView listView, int index);
+
+        /**
+         * Called to preview a save.
+         *
+         * @param itemEditor
+         * The item editor
+         *
+         * @param listView
+         * The list view containing the item being edited.
+         *
+         * @param index
+         * The index of the item being edited.
+         *
+         * @param changes
+         * The proposed changes. The type of this object will depend on the
+         * editor implementation.
+         *
+         * @return
+         * A vote on whether the changes should be allowed to be saved.
+         */
+        public Vote previewSaveChanges(ItemEditor itemEditor, ListView listView, int index, Object changes);
+
+        /**
+         * Called when a save was vetoed by a listener in the preview event.
+         *
+         * @param itemEditor
+         * The item editor
+         *
+         * @param reason
+         * The reason for the veto
+         */
+        public void saveChangesVetoed(ItemEditor itemEditor, Vote reason);
+
+        /**
+         * Called when changes have been saved.
+         *
+         * @param itemEditor
+         * The item editor
+         *
+         * @param listView
+         * The list view containing the item that was edited.
+         *
+         * @param index
+         * The index of the item that was edited.
+         */
+        public void changesSaved(ItemEditor itemEditor, ListView listView, int index);
+
+        /**
+         * Called when an edit has been cancelled.
+         *
+         * @param itemEditor
+         * The item editor
+         *
+         * @param listView
+         * The list view containing the item that was being edited.
+         *
+         * @param index
+         * The index of the item that was being edited.
+         */
+        public void editCancelled(ItemEditor itemEditor, ListView listView, int index);
     }
 
     /**

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TableView.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TableView.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TableView.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TableView.java Wed Sep 16 17:55:34 2009
@@ -29,6 +29,7 @@
 import org.apache.pivot.serialization.SerializationException;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Vote;
 import org.apache.pivot.wtk.content.TableViewCellRenderer;
 
 /**
@@ -429,10 +430,84 @@
      */
     public interface RowEditor extends Editor {
         /**
+         * Row editor listener list.
+         */
+        public static class RowEditorListenerList
+            extends ListenerList<RowEditorListener>
+            implements RowEditorListener {
+            @Override
+            public Vote previewEditRow(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+                Vote vote = Vote.APPROVE;
+
+                for (RowEditorListener listener : this) {
+                    vote = vote.tally(listener.previewEditRow(rowEditor,
+                        tableView, rowIndex, columnIndex));
+                }
+
+                return vote;
+            }
+
+            @Override
+            public void editRowVetoed(RowEditor rowEditor, Vote reason) {
+                for (RowEditorListener listener : this) {
+                    listener.editRowVetoed(rowEditor, reason);
+                }
+            }
+
+            @Override
+            public void rowEditing(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+                for (RowEditorListener listener : this) {
+                    listener.rowEditing(rowEditor, tableView, rowIndex,
+                        columnIndex);
+                }
+            }
+
+            @Override
+            public Vote previewSaveChanges(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex, Dictionary<String, Object> changes) {
+                Vote vote = Vote.APPROVE;
+
+                for (RowEditorListener listener : this) {
+                    vote = vote.tally(listener.previewSaveChanges(rowEditor,
+                        tableView, rowIndex, columnIndex, changes));
+                }
+
+                return vote;
+            }
+
+            @Override
+            public void saveChangesVetoed(RowEditor rowEditor, Vote reason) {
+                for (RowEditorListener listener : this) {
+                    listener.saveChangesVetoed(rowEditor, reason);
+                }
+            }
+
+            @Override
+            public void changesSaved(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+                for (RowEditorListener listener : this) {
+                    listener.changesSaved(rowEditor, tableView, rowIndex,
+                        columnIndex);
+                }
+            }
+
+            @Override
+            public void editCancelled(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+                for (RowEditorListener listener : this) {
+                    listener.editCancelled(rowEditor, tableView, rowIndex,
+                        columnIndex);
+                }
+            }
+        }
+
+        /**
          * Notifies the editor that editing should begin. If the editor is
-         * currently installed on the table view, the skin may choose to call
-         * this method when the user executes the appropriate gesture (as
-         * defined by the skin).
+         * currently installed on the table view, the skin may call this method
+         * when the user executes the appropriate gesture (as defined by the
+         * skin).
          *
          * @param tableView
          * The table view
@@ -446,7 +521,182 @@
          * @see
          * #setRowEditor(RowEditor)
          */
-        public void edit(TableView tableView, int rowIndex, int columnIndex);
+        public void editRow(TableView tableView, int rowIndex, int columnIndex);
+
+        /**
+         * Gets the row editor listener list.
+         */
+        public ListenerList<RowEditorListener> getRowEditorListeners();
+    }
+
+    /**
+     * The row editor listener interface. This provides callers with
+     * notifications about a row editor's activity.
+     */
+    public interface RowEditorListener {
+        /**
+         * Row editor listener adapter.
+         */
+        public static class Adapter implements RowEditorListener {
+            @Override
+            public Vote previewEditRow(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+                return Vote.APPROVE;
+            }
+
+            @Override
+            public void editRowVetoed(RowEditor rowEditor, Vote reason) {
+            }
+
+            @Override
+            public void rowEditing(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+            }
+
+            @Override
+            public Vote previewSaveChanges(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex, Dictionary<String, Object> changes) {
+                return Vote.APPROVE;
+            }
+
+            @Override
+            public void saveChangesVetoed(RowEditor rowEditor, Vote reason) {
+            }
+
+            @Override
+            public void changesSaved(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+            }
+
+            @Override
+            public void editCancelled(RowEditor rowEditor, TableView tableView,
+                int rowIndex, int columnIndex) {
+            }
+        }
+
+        /**
+         * Called to preview a row edit.
+         *
+         * @param rowEditor
+         * The row editor
+         *
+         * @param tableView
+         * The table view containing the row to be edited.
+         *
+         * @param rowIndex
+         * The index of the row to edit.
+         *
+         * @param columnIndex
+         * The index of the column to edit.
+         *
+         * @return
+         * A vote on whether editing should be allowed to begin.
+         */
+        public Vote previewEditRow(RowEditor rowEditor, TableView tableView,
+            int rowIndex, int columnIndex);
+
+        /**
+         * Called when a row edit was vetoed by a listener in the preview
+         * event.
+         *
+         * @param rowEditor
+         * The row editor
+         *
+         * @param reason
+         * The reason for the veto
+         */
+        public void editRowVetoed(RowEditor rowEditor, Vote reason);
+
+        /**
+         * Called when editing has begun.
+         *
+         * @param rowEditor
+         * The row editor
+         *
+         * @param tableView
+         * The table view containing the row being edited.
+         *
+         * @param rowIndex
+         * The index of the row being edited.
+         *
+         * @param columnIndex
+         * The index of the column being edited.
+         */
+        public void rowEditing(RowEditor rowEditor, TableView tableView,
+            int rowIndex, int columnIndex);
+
+        /**
+         * Called to preview a save.
+         *
+         * @param rowEditor
+         * The row editor
+         *
+         * @param tableView
+         * The table view containing the row being edited.
+         *
+         * @param rowIndex
+         * The index of the row being edited.
+         *
+         * @param columnIndex
+         * The index of the column being edited.
+         *
+         * @param changes
+         * The proposed changes, indexed by table view column name. The type of
+         * each entry in this dictionary will depend on the editor
+         * implementation.
+         *
+         * @return
+         * A vote on whether the changes should be allowed to be saved.
+         */
+        public Vote previewSaveChanges(RowEditor rowEditor, TableView tableView,
+            int rowIndex, int columnIndex, Dictionary<String, Object> changes);
+
+        /**
+         * Called when a save was vetoed by a listener in the preview event.
+         *
+         * @param rowEditor
+         * The row editor
+         *
+         * @param reason
+         * The reason for the veto
+         */
+        public void saveChangesVetoed(RowEditor rowEditor, Vote reason);
+
+        /**
+         * Called when changes have been saved.
+         *
+         * @param rowEditor
+         * The row editor
+         *
+         * @param tableView
+         * The table view containing the row that was edited.
+         *
+         * @param rowIndex
+         * The index of the row that was edited.
+         *
+         * @param columnIndex
+         * The index of the column that was edited.
+         */
+        public void changesSaved(RowEditor rowEditor, TableView tableView,
+            int rowIndex, int columnIndex);
+
+        /**
+         * Called when an edit has been cancelled.
+         *
+         * @param rowEditor
+         * The row editor
+         *
+         * @param tableView
+         * The table view containing the row that was being edited.
+         *
+         * @param rowIndex
+         * The index of the row that was being edited.
+         *
+         * @param columnIndex
+         * The index of the column that was being edited.
+         */
+        public void editCancelled(RowEditor rowEditor, TableView tableView,
+            int rowIndex, int columnIndex);
     }
 
     /**

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java Wed Sep 16 17:55:34 2009
@@ -27,6 +27,7 @@
 import org.apache.pivot.collections.immutable.ImmutableList;
 import org.apache.pivot.util.Filter;
 import org.apache.pivot.util.ListenerList;
+import org.apache.pivot.util.Vote;
 import org.apache.pivot.wtk.content.TreeViewNodeRenderer;
 
 /**
@@ -98,10 +99,81 @@
      */
     public interface NodeEditor extends Editor {
         /**
+         * Node editor listener list.
+         */
+        public static class NodeEditorListenerList
+            extends ListenerList<NodeEditorListener>
+            implements NodeEditorListener {
+            @Override
+            public Vote previewEditNode(NodeEditor nodeEditor, TreeView treeView,
+                Path path) {
+                Vote vote = Vote.APPROVE;
+
+                for (NodeEditorListener listener : this) {
+                    vote = vote.tally(listener.previewEditNode(nodeEditor,
+                        treeView, path));
+                }
+
+                return vote;
+            }
+
+            @Override
+            public void editNodeVetoed(NodeEditor nodeEditor, Vote reason) {
+                for (NodeEditorListener listener : this) {
+                    listener.editNodeVetoed(nodeEditor, reason);
+                }
+            }
+
+            @Override
+            public void nodeEditing(NodeEditor nodeEditor, TreeView treeView,
+                Path path) {
+                for (NodeEditorListener listener : this) {
+                    listener.nodeEditing(nodeEditor, treeView, path);
+                }
+            }
+
+            @Override
+            public Vote previewSaveChanges(NodeEditor nodeEditor, TreeView treeView,
+                Path path, Object changes) {
+                Vote vote = Vote.APPROVE;
+
+                for (NodeEditorListener listener : this) {
+                    vote = vote.tally(listener.previewSaveChanges(nodeEditor,
+                        treeView, path, changes));
+                }
+
+                return vote;
+            }
+
+            @Override
+            public void saveChangesVetoed(NodeEditor nodeEditor, Vote reason) {
+                for (NodeEditorListener listener : this) {
+                    listener.saveChangesVetoed(nodeEditor, reason);
+                }
+            }
+
+            @Override
+            public void changesSaved(NodeEditor nodeEditor, TreeView treeView,
+                Path path) {
+                for (NodeEditorListener listener : this) {
+                    listener.changesSaved(nodeEditor, treeView, path);
+                }
+            }
+
+            @Override
+            public void editCancelled(NodeEditor nodeEditor, TreeView treeView,
+                Path path) {
+                for (NodeEditorListener listener : this) {
+                    listener.editCancelled(nodeEditor, treeView, path);
+                }
+            }
+        }
+
+        /**
          * Notifies the editor that editing should begin. If the editor is
-         * currently installed on the tree view, the skin may choose to
-         * call this method when the user executes the appropriate gesture
-         * (as defined by the skin).
+         * currently installed on the tree view, the skin may call this method
+         * when the user executes the appropriate gesture (as defined by the
+         * skin).
          *
          * @param treeView
          * The tree view containing the node to be edited.
@@ -112,7 +184,156 @@
          * @see
          * #setNodeEditor(NodeEditor)
          */
-        public void edit(TreeView treeView, Path path);
+        public void editNode(TreeView treeView, Path path);
+
+        /**
+         * Gets the node editor listener list.
+         */
+        public ListenerList<NodeEditorListener> getNodeEditorListeners();
+    }
+
+    /**
+     * The node editor listener interface. This provides callers with
+     * notifications about a node editor's activity.
+     */
+    public interface NodeEditorListener {
+        /**
+         * Node editor listener adapter.
+         */
+        public static class Adapter implements NodeEditorListener {
+            @Override
+            public Vote previewEditNode(NodeEditor nodeEditor, TreeView treeView, Path path) {
+                return Vote.APPROVE;
+            }
+
+            @Override
+            public void editNodeVetoed(NodeEditor nodeEditor, Vote reason) {
+            }
+
+            @Override
+            public void nodeEditing(NodeEditor nodeEditor, TreeView treeView, Path path) {
+            }
+
+            @Override
+            public Vote previewSaveChanges(NodeEditor nodeEditor, TreeView treeView, Path path, Object changes) {
+                return Vote.APPROVE;
+            }
+
+            @Override
+            public void saveChangesVetoed(NodeEditor nodeEditor, Vote reason) {
+            }
+
+            @Override
+            public void changesSaved(NodeEditor nodeEditor, TreeView treeView, Path path) {
+            }
+
+            @Override
+            public void editCancelled(NodeEditor nodeEditor, TreeView treeView, Path path) {
+            }
+        }
+
+        /**
+         * Called to preview a node edit.
+         *
+         * @param nodeEditor
+         * The node editor
+         *
+         * @param treeView
+         * The tree view containing the node to be edited.
+         *
+         * @param path
+         * The path to the node to edit.
+         *
+         * @return
+         * A vote on whether editing should be allowed to begin.
+         */
+        public Vote previewEditNode(NodeEditor nodeEditor, TreeView treeView, Path path);
+
+        /**
+         * Called when a node edit was vetoed by a listener in the preview
+         * event.
+         *
+         * @param nodeEditor
+         * The node editor
+         *
+         * @param reason
+         * The reason for the veto
+         */
+        public void editNodeVetoed(NodeEditor nodeEditor, Vote reason);
+
+        /**
+         * Called when editing has begun.
+         *
+         * @param nodeEditor
+         * The node editor
+         *
+         * @param treeView
+         * The tree view containing the node being edited.
+         *
+         * @param path
+         * The path to the node being edited.
+         */
+        public void nodeEditing(NodeEditor nodeEditor, TreeView treeView, Path path);
+
+        /**
+         * Called to preview a save.
+         *
+         * @param nodeEditor
+         * The node editor
+         *
+         * @param treeView
+         * The tree view containing the node being edited.
+         *
+         * @param path
+         * The path to the node being edited.
+         *
+         * @param changes
+         * The proposed changes. The type of this object will depend on the
+         * editor implementation.
+         *
+         * @return
+         * A vote on whether the changes should be allowed to be saved.
+         */
+        public Vote previewSaveChanges(NodeEditor nodeEditor, TreeView treeView, Path path, Object changes);
+
+        /**
+         * Called when a save was vetoed by a listener in the preview event.
+         *
+         * @param nodeEditor
+         * The node editor
+         *
+         * @param reason
+         * The reason for the veto
+         */
+        public void saveChangesVetoed(NodeEditor nodeEditor, Vote reason);
+
+        /**
+         * Called when changes have been saved.
+         *
+         * @param nodeEditor
+         * The node editor
+         *
+         * @param treeView
+         * The tree view containing the node that was edited.
+         *
+         * @param path
+         * The path to the node that was edited.
+         */
+        public void changesSaved(NodeEditor nodeEditor, TreeView treeView, Path path);
+
+        /**
+         * Called when an edit has been cancelled.
+         *
+         * @param nodeEditor
+         * The node editor
+         *
+         * @param treeView
+         * The tree view containing the node that was being edited.
+         *
+         * @param path
+         * The path to the node that was being edited.
+         */
+        public void editCancelled(NodeEditor nodeEditor, TreeView treeView, Path path);
     }
 
     /**

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java Wed Sep 16 17:55:34 2009
@@ -17,6 +17,7 @@
 package org.apache.pivot.wtk.content;
 
 import org.apache.pivot.collections.List;
+import org.apache.pivot.util.ListenerList;
 import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.Bounds;
 import org.apache.pivot.wtk.Component;
@@ -45,6 +46,8 @@
     private TextInput textInput = null;
     private Window popup = null;
 
+    private ItemEditorListenerList itemEditorListeners = new ItemEditorListenerList();
+
     private ComponentListener componentListener = new ComponentListener.Adapter() {
         @Override
         public void sizeChanged(Component component, int previousWidth, int previousHeight) {
@@ -70,34 +73,34 @@
     private ListViewListener listViewListener = new ListViewListener.Adapter() {
         @Override
         public void listDataChanged(ListView listView, List<?> previousListData) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void itemEditorChanged(ListView listView, ListView.ItemEditor previousItemEditor) {
-            cancel();
+            cancelEdit();
         }
     };
 
     private ListViewItemListener listViewItemListener = new ListViewItemListener.Adapter() {
         @Override
         public void itemInserted(ListView listView, int index) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void itemsRemoved(ListView listView, int index, int count) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void itemUpdated(ListView listView, int index) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void itemsSorted(ListView listView) {
-            cancel();
+            cancelEdit();
         }
     };
 
@@ -105,9 +108,9 @@
         @Override
         public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
             if (keyCode == Keyboard.KeyCode.ENTER) {
-                save();
+                saveChanges();
             } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
-                cancel();
+                cancelEdit();
             }
 
             return false;
@@ -152,7 +155,7 @@
             Window window = (Window)display.getComponentAt(x, y);
 
             if (popup != window) {
-                save();
+                saveChanges();
             }
 
             return false;
@@ -182,7 +185,7 @@
      * {@inheritDoc}
      */
     @Override
-    public void edit(ListView listView, int index) {
+    public void editItem(ListView listView, int index) {
         if (this.listView != null) {
             throw new IllegalStateException("Currently editing.");
         }
@@ -262,7 +265,7 @@
      */
     @SuppressWarnings("unchecked")
     @Override
-    public void save() {
+    public void saveChanges() {
         if (!isEditing()) {
             throw new IllegalStateException();
         }
@@ -295,11 +298,16 @@
      * {@inheritDoc}
      */
     @Override
-    public void cancel() {
+    public void cancelEdit() {
         if (!isEditing()) {
             throw new IllegalStateException();
         }
 
         popup.close();
     }
+
+    @Override
+    public ListenerList<ListView.ItemEditorListener> getItemEditorListeners() {
+        return itemEditorListeners;
+    }
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewCellEditor.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewCellEditor.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewCellEditor.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewCellEditor.java Wed Sep 16 17:55:34 2009
@@ -19,6 +19,7 @@
 import org.apache.pivot.beans.BeanDictionary;
 import org.apache.pivot.collections.Dictionary;
 import org.apache.pivot.collections.List;
+import org.apache.pivot.util.ListenerList;
 import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.Bounds;
 import org.apache.pivot.wtk.Component;
@@ -72,12 +73,12 @@
     private TableViewListener tableViewListener = new TableViewListener.Adapter() {
         @Override
         public void tableDataChanged(TableView tableView, List<?> previousTableData) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowEditorChanged(TableView tableView, TableView.RowEditor previousRowEditor) {
-            cancel();
+            cancelEdit();
         }
     };
 
@@ -88,22 +89,22 @@
     private TableViewRowListener tableViewRowListener = new TableViewRowListener.Adapter() {
         @Override
         public void rowInserted(TableView tableView, int rowIndex) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowsRemoved(TableView tableView, int rowIndex, int count) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowUpdated(TableView tableView, int rowIndex) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowsSorted(TableView tableView) {
-            cancel();
+            cancelEdit();
         }
     };
 
@@ -115,9 +116,9 @@
         @Override
         public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
             if (keyCode == Keyboard.KeyCode.ENTER) {
-                save();
+                saveChanges();
             } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
-                cancel();
+                cancelEdit();
             }
 
             return false;
@@ -172,7 +173,7 @@
             Window window = (Window)display.getComponentAt(x, y);
 
             if (popup != window) {
-                save();
+                saveChanges();
             }
 
             return false;
@@ -192,6 +193,8 @@
     private TextInput textInput = null;
     private Window popup = null;
 
+    private RowEditorListenerList rowEditorListeners = new RowEditorListenerList();
+
     /**
      * Gets the text input that serves as the editor component. This component
      * will only be non-<tt>null</tt> while editing.
@@ -210,7 +213,7 @@
      */
     @SuppressWarnings("unchecked")
     @Override
-    public void edit(TableView tableView, int rowIndex, int columnIndex) {
+    public void editRow(TableView tableView, int rowIndex, int columnIndex) {
         if (isEditing()) {
             throw new IllegalStateException("Currently editing.");
         }
@@ -284,7 +287,7 @@
      */
     @SuppressWarnings("unchecked")
     @Override
-    public void save() {
+    public void saveChanges() {
         if (!isEditing()) {
             throw new IllegalStateException();
         }
@@ -326,11 +329,19 @@
      * {@inheritDoc}
      */
     @Override
-    public void cancel() {
+    public void cancelEdit() {
         if (!isEditing()) {
             throw new IllegalStateException();
         }
 
         popup.close();
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ListenerList<TableView.RowEditorListener> getRowEditorListeners() {
+        return rowEditorListeners;
+    }
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TableViewRowEditor.java Wed Sep 16 17:55:34 2009
@@ -23,6 +23,7 @@
 import org.apache.pivot.collections.HashMap;
 import org.apache.pivot.collections.List;
 import org.apache.pivot.util.Filter;
+import org.apache.pivot.util.ListenerList;
 import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.Bounds;
 import org.apache.pivot.wtk.CardPane;
@@ -294,9 +295,9 @@
         @Override
         protected boolean keyPressed(int keyCode, Keyboard.KeyLocation keyLocation) {
             if (keyCode == Keyboard.KeyCode.ENTER) {
-                save();
+                saveChanges();
             } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
-                cancel();
+                cancelEdit();
             }
 
             return super.keyPressed(keyCode, keyLocation);
@@ -306,14 +307,13 @@
             this.tableViewScrollPane = tableViewScrollPane;
         }
 
-        public void edit() {
-            Window window = tableView.getWindow();
-            open(window.getDisplay());
+        public void editRow() {
+            open(tableView.getDisplay());
             reposition();
         }
 
         @SuppressWarnings("unchecked")
-        public void save() {
+        public void saveChanges() {
             List<Object> tableData = (List<Object>)tableView.getTableData();
 
             // Get the row data, represented as a Dictionary
@@ -342,7 +342,7 @@
             }
         }
 
-        public void cancel() {
+        public void cancelEdit() {
             // Close without updating the table data
             close();
         }
@@ -399,7 +399,7 @@
 
                 if (window != this &&
                     (window == null || !isOwner(window))) {
-                    save();
+                    saveChanges();
                 }
             }
 
@@ -478,7 +478,7 @@
 
         @Override
         public void visibleChanged(Component component) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
@@ -515,12 +515,12 @@
 
         @Override
         public void tableDataChanged(TableView tableView, List<?> previousTableData) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowEditorChanged(TableView tableView, TableView.RowEditor previousRowEditor) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
@@ -537,27 +537,27 @@
 
         @Override
         public void rowInserted(TableView tableView, int index) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowsRemoved(TableView tableView, int index, int count) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowUpdated(TableView tableView, int index) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowsCleared(TableView tableView) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void rowsSorted(TableView tableView) {
-            cancel();
+            cancelEdit();
         }
     }
 
@@ -567,6 +567,8 @@
 
     private CardPaneSkin.SelectionChangeEffect editEffect = null;
 
+    private RowEditorListenerList rowEditorListeners = new RowEditorListenerList();
+
     private static final int IMAGE_CARD_INDEX = 0;
     private static final int EDITOR_CARD_INDEX = 1;
 
@@ -635,7 +637,7 @@
      * {@inheritDoc}
      */
     @Override
-    public void edit(TableView tableView, int rowIndex, int columnIndex) {
+    public void editRow(TableView tableView, int rowIndex, int columnIndex) {
         if (editorPopup != null) {
             throw new IllegalStateException("Edit already in progress.");
         }
@@ -658,7 +660,7 @@
             editorPopup.setTableViewScrollPane((ScrollPane)tableViewParent);
         }
 
-        editorPopup.edit();
+        editorPopup.editRow();
     }
 
     /**
@@ -673,23 +675,31 @@
      * {@inheritDoc}
      */
     @Override
-    public void save() {
+    public void saveChanges() {
         if (editorPopup == null) {
             throw new IllegalStateException("No edit in progress.");
         }
 
-        editorPopup.save();
+        editorPopup.saveChanges();
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void cancel() {
+    public void cancelEdit() {
         if (editorPopup == null) {
             throw new IllegalStateException("No edit in progress.");
         }
 
-        editorPopup.cancel();
+        editorPopup.cancelEdit();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ListenerList<TableView.RowEditorListener> getRowEditorListeners() {
+        return rowEditorListeners;
     }
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java Wed Sep 16 17:55:34 2009
@@ -19,6 +19,7 @@
 import org.apache.pivot.collections.List;
 import org.apache.pivot.collections.Sequence;
 import org.apache.pivot.collections.Sequence.Tree.Path;
+import org.apache.pivot.util.ListenerList;
 import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.Bounds;
 import org.apache.pivot.wtk.Component;
@@ -116,9 +117,9 @@
         @Override
         public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
             if (keyCode == Keyboard.KeyCode.ENTER) {
-                save();
+                saveChanges();
             } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
-                cancel();
+                cancelEdit();
             }
 
             return false;
@@ -136,7 +137,7 @@
             Window window = (Window)display.getComponentAt(x, y);
 
             if (popup != window) {
-                save();
+                saveChanges();
             }
 
             return false;
@@ -156,12 +157,12 @@
     private TreeViewListener treeViewHandler = new TreeViewListener.Adapter() {
         @Override
         public void treeDataChanged(TreeView treeView, List<?> previousTreeData) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void nodeEditorChanged(TreeView treeView, TreeView.NodeEditor previousNodeEditor) {
-            cancel();
+            cancelEdit();
         }
     };
 
@@ -172,22 +173,22 @@
     private TreeViewNodeListener treeViewNodeHandler = new TreeViewNodeListener.Adapter() {
         @Override
         public void nodeInserted(TreeView treeView, Path path, int index) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void nodesRemoved(TreeView treeView, Path path, int index, int count) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void nodeUpdated(TreeView treeView, Path path, int index) {
-            cancel();
+            cancelEdit();
         }
 
         @Override
         public void nodesSorted(TreeView treeView, Path path) {
-            cancel();
+            cancelEdit();
         }
     };
 
@@ -197,6 +198,8 @@
     private Window popup = null;
     private TextInput textInput = null;
 
+    private NodeEditorListenerList nodeEditorListeners = new NodeEditorListenerList();
+
     /**
      * Gets the text input that serves as the editor component. This component
      * will only be non-<tt>null</tt> while editing.
@@ -214,7 +217,7 @@
      * {@inheritDoc}
      */
     @Override
-    public void edit(TreeView treeView, Path path) {
+    public void editNode(TreeView treeView, Path path) {
         if (isEditing()) {
             throw new IllegalStateException();
         }
@@ -293,7 +296,7 @@
      */
     @SuppressWarnings("unchecked")
     @Override
-    public void save() {
+    public void saveChanges() {
         if (!isEditing()) {
             throw new IllegalStateException();
         }
@@ -339,11 +342,19 @@
      * {@inheritDoc}
      */
     @Override
-    public void cancel() {
+    public void cancelEdit() {
         if (!isEditing()) {
             throw new IllegalStateException();
         }
 
         popup.close();
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public ListenerList<TreeView.NodeEditorListener> getNodeEditorListeners() {
+        return nodeEditorListeners;
+    }
 }

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraAccordionSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraAccordionSkin.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraAccordionSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraAccordionSkin.java Wed Sep 16 17:55:34 2009
@@ -51,7 +51,6 @@
 import org.apache.pivot.wtk.skin.ButtonSkin;
 import org.apache.pivot.wtk.skin.ContainerSkin;
 
-
 /**
  * Accordion skin.
  */

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraListViewSkin.java Wed Sep 16 17:55:34 2009
@@ -676,7 +676,7 @@
                     ListView.ItemEditor itemEditor = listView.getItemEditor();
 
                     if (itemEditor != null) {
-                        itemEditor.edit(listView, editIndex);
+                        itemEditor.editItem(listView, editIndex);
                     }
                 }
 

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTableViewSkin.java Wed Sep 16 17:55:34 2009
@@ -946,7 +946,7 @@
 
             if (rowEditor != null
                 && !rowEditor.isEditing()) {
-                rowEditor.edit(tableView, editIndex, getColumnAt(x));
+                rowEditor.editRow(tableView, editIndex, getColumnAt(x));
             }
         }
 

Modified: incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java?rev=815913&r1=815912&r2=815913&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java (original)
+++ incubator/pivot/trunk/wtk/src/org/apache/pivot/wtk/skin/terra/TerraTreeViewSkin.java Wed Sep 16 17:55:34 2009
@@ -1480,7 +1480,7 @@
                         TreeView.NodeEditor nodeEditor = treeView.getNodeEditor();
 
                         if (nodeEditor != null) {
-                            nodeEditor.edit(treeView, nodeInfo.getPath());
+                            nodeEditor.editNode(treeView, nodeInfo.getPath());
                         }
                     }