You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pivot.apache.org by gb...@apache.org on 2010/10/18 18:29:55 UTC

svn commit: r1023890 - in /pivot/trunk/wtk/src/org/apache/pivot/wtk: ListView.java TreeView.java content/ListViewItemEditor.java content/TreeViewNodeEditor.java

Author: gbrown
Date: Mon Oct 18 16:29:55 2010
New Revision: 1023890

URL: http://svn.apache.org/viewvc?rev=1023890&view=rev
Log:
Commit editor changes to ListView and TreeView.

Modified:
    pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java
    pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java?rev=1023890&r1=1023889&r2=1023890&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/ListView.java Mon Oct 18 16:29:55 2010
@@ -32,7 +32,6 @@ import org.apache.pivot.json.JSONSeriali
 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;
 
 /**
@@ -111,244 +110,16 @@ public class ListView extends Component 
     }
 
     /**
-     * List item editor interface.
+     * List view item editor interface.
      */
-    public interface ItemEditor extends Editor {
+    public interface ItemEditor {
         /**
-         * 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 call this method
-         * when the user executes the appropriate gesture (as defined by the
-         * skin).
+         * Called to begin editing a list item.
          *
          * @param listView
-         * The list view
-         *
-         * @param index
-         * The index of the item to edit
-         *
-         * @see
-         * #setItemEditor(ItemEditor)
-         */
-        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.
+         * @param itemIndex
          */
-        public void editCancelled(ItemEditor itemEditor, ListView listView, int index);
+        public void edit(ListView listView, int itemIndex);
     }
 
     /**

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java?rev=1023890&r1=1023889&r2=1023890&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/TreeView.java Mon Oct 18 16:29:55 2010
@@ -28,7 +28,6 @@ import org.apache.pivot.collections.Sequ
 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;
 
 /**
@@ -146,244 +145,14 @@ public class TreeView extends Component 
     /**
      * Tree view node editor interface.
      */
-    public interface NodeEditor extends Editor {
+    public interface NodeEditor {
         /**
-         * 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 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.
-         *
-         * @param path
-         * The path to the node to edit.
-         *
-         * @see
-         * #setNodeEditor(NodeEditor)
-         */
-        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
+         * Called to begin editing a tree node.
          *
          * @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);
+        public void edit(TreeView treeView, Path path);
     }
 
     /**

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java?rev=1023890&r1=1023889&r2=1023890&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/content/ListViewItemEditor.java Mon Oct 18 16:29:55 2010
@@ -17,140 +17,26 @@
 package org.apache.pivot.wtk.content;
 
 import org.apache.pivot.collections.List;
-import org.apache.pivot.util.ListenerList;
-import org.apache.pivot.util.Vote;
-import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.Bounds;
-import org.apache.pivot.wtk.Component;
-import org.apache.pivot.wtk.ComponentKeyListener;
-import org.apache.pivot.wtk.ComponentListener;
 import org.apache.pivot.wtk.Container;
 import org.apache.pivot.wtk.ContainerMouseListener;
 import org.apache.pivot.wtk.Display;
 import org.apache.pivot.wtk.Insets;
 import org.apache.pivot.wtk.Keyboard;
 import org.apache.pivot.wtk.ListView;
-import org.apache.pivot.wtk.ListViewItemListener;
-import org.apache.pivot.wtk.ListViewListener;
 import org.apache.pivot.wtk.Mouse;
 import org.apache.pivot.wtk.Point;
 import org.apache.pivot.wtk.TextInput;
 import org.apache.pivot.wtk.Window;
-import org.apache.pivot.wtk.WindowStateListener;
-import org.apache.pivot.wtk.Keyboard.KeyCode;
 
 /**
  * Default list view item editor.
  */
-public class ListViewItemEditor implements ListView.ItemEditor {
+public class ListViewItemEditor extends Window implements ListView.ItemEditor {
     private ListView listView = null;
-    private int index = -1;
+    private int itemIndex = -1;
 
-    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) {
-            ApplicationContext.queueCallback(new Runnable() {
-                @Override
-                public void run() {
-                    reposition();
-                }
-            });
-        }
-
-        @Override
-        public void locationChanged(Component component, int previousX, int previousY) {
-            ApplicationContext.queueCallback(new Runnable() {
-                @Override
-                public void run() {
-                    reposition();
-                }
-            });
-        }
-    };
-
-    private ListViewListener listViewListener = new ListViewListener.Adapter() {
-        @Override
-        public void listDataChanged(ListView listView, List<?> previousListData) {
-            cancelEdit();
-        }
-
-        @Override
-        public void itemEditorChanged(ListView listView, ListView.ItemEditor previousItemEditor) {
-            cancelEdit();
-        }
-    };
-
-    private ListViewItemListener listViewItemListener = new ListViewItemListener.Adapter() {
-        @Override
-        public void itemInserted(ListView listView, int index) {
-            cancelEdit();
-        }
-
-        @Override
-        public void itemsRemoved(ListView listView, int index, int count) {
-            cancelEdit();
-        }
-
-        @Override
-        public void itemUpdated(ListView listView, int index) {
-            cancelEdit();
-        }
-
-        @Override
-        public void itemsSorted(ListView listView) {
-            cancelEdit();
-        }
-    };
-
-    private ComponentKeyListener textInputKeyHandler = new ComponentKeyListener.Adapter() {
-        /**
-         * {@link KeyCode#ENTER ENTER} Save the changes.<br>
-         * {@link KeyCode#ESCAPE ESCAPE} Cancel the edit.<br>
-         */
-        @Override
-        public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
-            if (keyCode == Keyboard.KeyCode.ENTER) {
-                saveChanges();
-            } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
-                cancelEdit();
-            }
-
-            return false;
-        }
-    };
-
-    private WindowStateListener popupWindowStateHandler = new WindowStateListener.Adapter() {
-        @Override
-        public void windowOpened(Window window) {
-            Display display = window.getDisplay();
-            display.getContainerMouseListeners().add(displayMouseHandler);
-
-            listView.getComponentListeners().add(componentListener);
-            listView.getListViewListeners().add(listViewListener);
-            listView.getListViewItemListeners().add(listViewItemListener);
-        }
-
-        @Override
-        public void windowClosed(Window window, Display display, Window owner) {
-            display.getContainerMouseListeners().remove(displayMouseHandler);
-
-            listView.getComponentListeners().remove(componentListener);
-            listView.getListViewListeners().remove(listViewListener);
-            listView.getListViewItemListeners().remove(listViewItemListener);
-
-            owner.moveToFront();
-
-            listView = null;
-            index = -1;
-            textInput = null;
-            popup = null;
-        }
-    };
+    private TextInput textInput = new TextInput();
 
     private ContainerMouseListener displayMouseHandler = new ContainerMouseListener.Adapter() {
         @Override
@@ -159,8 +45,9 @@ public class ListViewItemEditor implemen
             Window window = (Window)display.getComponentAt(x, y);
 
             boolean consumed = false;
-            if (popup != window) {
-                consumed = !saveChanges();
+            if (window != ListViewItemEditor.this) {
+                close(true);
+                consumed = true;
             }
 
             return consumed;
@@ -169,167 +56,127 @@ public class ListViewItemEditor implemen
         @Override
         public boolean mouseWheel(Container container, Mouse.ScrollType scrollType,
             int scrollAmount, int wheelRotation, int x, int y) {
-            return true;
-        }
-    };
+            Display display = (Display)container;
+            Window window = (Window)display.getComponentAt(x, y);
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void editItem(ListView listView, int index) {
-        if (this.listView != null) {
-            throw new IllegalStateException("Currently editing.");
+            return (window != ListViewItemEditor.this);
         }
+    };
 
-        Vote vote = itemEditorListeners.previewEditItem(this, listView, index);
-
-        if (vote == Vote.APPROVE) {
-            this.listView = listView;
-            this.index = index;
-
-            // Get the data being edited
-            List<?> listData = listView.getListData();
-            ListItem listItem = (ListItem)listData.get(index);
-
-
-            textInput = new TextInput();
-            textInput.setText(listItem.getText());
-            textInput.getComponentKeyListeners().add(textInputKeyHandler);
+    public ListViewItemEditor() {
+        setContent(textInput);
+    }
 
-            // Create and open the popup
-            popup = new Window(textInput);
-            popup.getWindowStateListeners().add(popupWindowStateHandler);
-            popup.open(listView.getWindow());
-            reposition();
+    @Override
+    public void edit(ListView listView, int itemIndex) {
+        this.listView = listView;
+        this.itemIndex = itemIndex;
 
-            textInput.selectAll();
-            textInput.requestFocus();
+        open(listView.getWindow());
+    }
 
-            itemEditorListeners.itemEditing(this, listView, index);
-        } else if (vote == Vote.DENY) {
-            itemEditorListeners.editItemVetoed(this, vote);
+    @Override
+    public void open(Display display, Window owner) {
+        if (owner == null) {
+            throw new IllegalArgumentException();
         }
-    }
 
-    /**
-     * Repositions the popup to be located over the item being edited.
-     */
-    private void reposition() {
+        super.open(display, owner);
+        display.getContainerMouseListeners().add(displayMouseHandler);
+
         // Get the data being edited
         List<?> listData = listView.getListData();
-        ListItem listItem = (ListItem)listData.get(index);
+        ListItem listItem = (ListItem)listData.get(itemIndex);
+
+        textInput.setText(listItem.getText());
+        textInput.selectAll();
+        textInput.requestFocus();
 
         // Get the item bounds
-        Bounds itemBounds = listView.getItemBounds(index);
+        Bounds itemBounds = listView.getItemBounds(itemIndex);
         int itemIndent = listView.getItemIndent();
         itemBounds = new Bounds(itemBounds.x + itemIndent, itemBounds.y,
             itemBounds.width - itemIndent, itemBounds.height);
 
         // Render the item data
         ListViewItemRenderer itemRenderer = (ListViewItemRenderer)listView.getItemRenderer();
-        itemRenderer.render(listItem, index, listView, false, false, false, false);
+        itemRenderer.render(listItem, itemIndex, listView, false, false, false, false);
         itemRenderer.setSize(itemBounds.width, itemBounds.height);
 
         // Calculate the text bounds
         Bounds textBounds = itemRenderer.getTextBounds();
 
-        // Calculate the bounds of what we're editing
+        // Calculate the bounds of what is being edited
         Insets padding = (Insets)textInput.getStyles().get("padding");
         Bounds editBounds = new Bounds(itemBounds.x + textBounds.x - (padding.left + 1),
             itemBounds.y, itemBounds.width - textBounds.x + (padding.left + 1),
             itemBounds.height);
 
-        // Scroll to make the text as visible as possible
+        // Scroll to make the item as visible as possible
         listView.scrollAreaToVisible(editBounds.x, editBounds.y,
             textBounds.width + padding.left + 1, editBounds.height);
 
-        // Constrain the bounds by what is visible through Viewport ancestors
+        // Constrain the bounds by what is visible through viewport ancestors
         editBounds = listView.getVisibleArea(editBounds);
-        Point displayCoordinates = listView.mapPointToAncestor(listView.getDisplay(),
-            editBounds.x, editBounds.y);
+        Point location = listView.mapPointToAncestor(listView.getDisplay(), editBounds.x, editBounds.y);
 
         textInput.setPreferredWidth(editBounds.width);
-        popup.setLocation(displayCoordinates.x, displayCoordinates.y
-            + (editBounds.height - textInput.getPreferredHeight(-1)) / 2);
+        setLocation(location.x, location.y + (editBounds.height - getPreferredHeight(-1)) / 2);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
-    public boolean isEditing() {
-        return (listView != null);
+    public final void close() {
+        close(false);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @SuppressWarnings("unchecked")
-    @Override
-    public boolean saveChanges() {
-        if (!isEditing()) {
-            throw new IllegalStateException();
-        }
-
-        // Save local reference to members variables before they get cleared
-        ListView listView = this.listView;
-        int index = this.index;
-
-        // Preview the changes
-        String text = textInput.getText();
-        Vote vote = itemEditorListeners.previewSaveChanges(this, listView, index, text);
+    public void close(boolean result) {
+        if (result) {
+            // Update the item data
+            String text = textInput.getText();
 
-        boolean saved = false;
-        if (vote == Vote.APPROVE) {
             List<Object> listData = (List<Object>)listView.getListData();
-            ListItem listItem = (ListItem)listData.get(index);
+            ListItem listItem = (ListItem)listData.get(itemIndex);
 
-            // Update the item data
             listItem.setText(text);
 
-            // Notifying the parent will close the popup
             if (listData.getComparator() == null) {
-                listData.update(index, listItem);
+                listData.update(itemIndex, listItem);
             } else {
-                listData.remove(index, 1);
+                listData.remove(itemIndex, 1);
                 listData.add(listItem);
 
                 // Re-select the item, and make sure it's visible
-                index = listData.indexOf(listItem);
-                listView.setSelectedIndex(index);
-                listView.scrollAreaToVisible(listView.getItemBounds(index));
+                itemIndex = listData.indexOf(listItem);
+                listView.setSelectedIndex(itemIndex);
+                listView.scrollAreaToVisible(listView.getItemBounds(itemIndex));
             }
-
-            itemEditorListeners.changesSaved(this, listView, index);
-            saved = true;
-        } else if (vote == Vote.DENY) {
-            itemEditorListeners.saveChangesVetoed(this, vote);
         }
 
-        return saved;
-    }
+        getOwner().moveToFront();
+        listView.requestFocus();
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void cancelEdit() {
-        if (!isEditing()) {
-            throw new IllegalStateException();
-        }
+        Display display = getDisplay();
+        display.getContainerMouseListeners().remove(displayMouseHandler);
 
-        // Save local reference to members variables before they get cleared
-        ListView listView = this.listView;
-        int index = this.index;
+        super.close();
 
-        popup.close();
-
-        itemEditorListeners.editCancelled(this, listView, index);
+        listView = null;
+        itemIndex = -1;
     }
 
     @Override
-    public ListenerList<ListView.ItemEditorListener> getItemEditorListeners() {
-        return itemEditorListeners;
+    public boolean keyPressed(int keyCode, Keyboard.KeyLocation keyLocation) {
+        boolean consumed = false;
+
+        if (keyCode == Keyboard.KeyCode.ENTER) {
+            close(true);
+            consumed = true;
+        } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
+            close(false);
+            consumed = true;
+        }
+
+        return consumed;
     }
 }

Modified: pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java
URL: http://svn.apache.org/viewvc/pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java?rev=1023890&r1=1023889&r2=1023890&view=diff
==============================================================================
--- pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java (original)
+++ pivot/trunk/wtk/src/org/apache/pivot/wtk/content/TreeViewNodeEditor.java Mon Oct 18 16:29:55 2010
@@ -19,13 +19,7 @@ package org.apache.pivot.wtk.content;
 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.util.Vote;
-import org.apache.pivot.wtk.ApplicationContext;
 import org.apache.pivot.wtk.Bounds;
-import org.apache.pivot.wtk.Component;
-import org.apache.pivot.wtk.ComponentKeyListener;
-import org.apache.pivot.wtk.ComponentListener;
 import org.apache.pivot.wtk.Container;
 import org.apache.pivot.wtk.ContainerMouseListener;
 import org.apache.pivot.wtk.Display;
@@ -35,103 +29,17 @@ import org.apache.pivot.wtk.Mouse;
 import org.apache.pivot.wtk.Point;
 import org.apache.pivot.wtk.TextInput;
 import org.apache.pivot.wtk.TreeView;
-import org.apache.pivot.wtk.TreeViewListener;
-import org.apache.pivot.wtk.TreeViewNodeListener;
 import org.apache.pivot.wtk.Window;
-import org.apache.pivot.wtk.WindowStateListener;
-import org.apache.pivot.wtk.Keyboard.KeyCode;
 
 /**
- * Default tree view node editor, which allows the user to edit the text of a
- * tree node in a <tt>TextInput</tt>. It is only intended to work with
- * {@link TreeNode} data and {@link TreeViewNodeRenderer} renderers.
+ * Default tree view node editor.
  */
-public class TreeViewNodeEditor implements TreeView.NodeEditor {
-    /**
-     * Responsible for repositioning the popup when the table view's size changes.
-     */
-    private ComponentListener componentListener = new ComponentListener.Adapter() {
-        @Override
-        public void sizeChanged(Component component, int previousWidth, int previousHeight) {
-            ApplicationContext.queueCallback(new Runnable() {
-                @Override
-                public void run() {
-                    reposition();
-                }
-            });
-        }
-
-        @Override
-        public void locationChanged(Component component, int previousX, int previousY) {
-            ApplicationContext.queueCallback(new Runnable() {
-                @Override
-                public void run() {
-                    reposition();
-                }
-            });
-        }
-    };
-
-    /**
-     * Responsible for "edit initialization" and "edit finalization" tasks when
-     * the edit popup is opened and closed, respectively.
-     */
-    private WindowStateListener popupStateHandler = new WindowStateListener.Adapter() {
-        @Override
-        public void windowOpened(Window window) {
-            Display display = window.getDisplay();
-            display.getContainerMouseListeners().add(displayMouseHandler);
-
-            treeView.getComponentListeners().add(componentListener);
-            treeView.getTreeViewListeners().add(treeViewHandler);
-            treeView.getTreeViewNodeListeners().add(treeViewNodeHandler);
-        }
-
-        @Override
-        public void windowClosed(Window window, Display display, Window owner) {
-            // Clean up
-            display.getContainerMouseListeners().remove(displayMouseHandler);
-
-            treeView.getComponentListeners().remove(componentListener);
-            treeView.getTreeViewListeners().remove(treeViewHandler);
-            treeView.getTreeViewNodeListeners().remove(treeViewNodeHandler);
-
-            // Move the owner to front
-            owner.moveToFront();
-
-            // Free memory
-            treeView = null;
-            path = null;
-            textInput = null;
-            popup = null;
-        }
-    };
-
-    /**
-     * Responsible for saving or cancelling the edit based on the user pressing
-     * the <tt>ENTER</tt> key or the <tt>ESCAPE</tt> key, respectively.
-     */
-    private ComponentKeyListener textInputKeyHandler = new ComponentKeyListener.Adapter() {
-        /**
-         * {@link KeyCode#ENTER ENTER} Save the changes.<br>
-         * {@link KeyCode#ESCAPE ESCAPE} Cancel the edit.<br>
-         */
-        @Override
-        public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
-            if (keyCode == Keyboard.KeyCode.ENTER) {
-                saveChanges();
-            } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
-                cancelEdit();
-            }
+public class TreeViewNodeEditor extends Window implements TreeView.NodeEditor {
+    private TreeView treeView = null;
+    private Path path = null;
 
-            return false;
-        }
-    };
+    private TextInput textInput = new TextInput();
 
-    /**
-     * Responsible for closing the popup whenever the user clicks outside the
-     * bounds of the popup.
-     */
     private ContainerMouseListener displayMouseHandler = new ContainerMouseListener.Adapter() {
         @Override
         public boolean mouseDown(Container container, Mouse.Button button, int x, int y) {
@@ -139,8 +47,9 @@ public class TreeViewNodeEditor implemen
             Window window = (Window)display.getComponentAt(x, y);
 
             boolean consumed = false;
-            if (popup != window) {
-                consumed = !saveChanges();
+            if (window != TreeViewNodeEditor.this) {
+                close(true);
+                consumed = true;
             }
 
             return consumed;
@@ -149,104 +58,41 @@ public class TreeViewNodeEditor implemen
         @Override
         public boolean mouseWheel(Container container, Mouse.ScrollType scrollType,
             int scrollAmount, int wheelRotation, int x, int y) {
-            return true;
-        }
-    };
-
-    /**
-     * Responsible for cancelling the edit if any relevant changes are made to
-     * the tree view while we're editing.
-     */
-    private TreeViewListener treeViewHandler = new TreeViewListener.Adapter() {
-        @Override
-        public void treeDataChanged(TreeView treeView, List<?> previousTreeData) {
-            cancelEdit();
-        }
-
-        @Override
-        public void nodeEditorChanged(TreeView treeView, TreeView.NodeEditor previousNodeEditor) {
-            cancelEdit();
-        }
-    };
-
-    /**
-     * Responsible for cancelling the edit if any changes are made to
-     * the tree data while we're editing.
-     */
-    private TreeViewNodeListener treeViewNodeHandler = new TreeViewNodeListener.Adapter() {
-        @Override
-        public void nodeInserted(TreeView treeView, Path path, int index) {
-            cancelEdit();
-        }
-
-        @Override
-        public void nodesRemoved(TreeView treeView, Path path, int index, int count) {
-            cancelEdit();
-        }
-
-        @Override
-        public void nodeUpdated(TreeView treeView, Path path, int index) {
-            cancelEdit();
-        }
+            Display display = (Display)container;
+            Window window = (Window)display.getComponentAt(x, y);
 
-        @Override
-        public void nodesSorted(TreeView treeView, Path path) {
-            cancelEdit();
+            return (window != TreeViewNodeEditor.this);
         }
     };
 
-    private TreeView treeView = null;
-    private Path path = null;
+    public TreeViewNodeEditor() {
+        setContent(textInput);
+    }
 
-    private Window popup = null;
-    private TextInput textInput = null;
+    @Override
+    public void edit(TreeView treeView, Path path) {
+        this.treeView = treeView;
+        this.path = path;
 
-    private NodeEditorListenerList nodeEditorListeners = new NodeEditorListenerList();
+        open(treeView.getWindow());
+    }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
-    public void editNode(TreeView treeView, Path path) {
-        if (isEditing()) {
-            throw new IllegalStateException();
+    public void open(Display display, Window owner) {
+        if (owner == null) {
+            throw new IllegalArgumentException();
         }
 
-        Vote vote = nodeEditorListeners.previewEditNode(this, treeView, path);
+        super.open(display, owner);
+        display.getContainerMouseListeners().add(displayMouseHandler);
 
-        if (vote == Vote.APPROVE) {
-            this.treeView = treeView;
-            this.path = path;
-
-            // Get the data being edited
-            List<?> treeData = treeView.getTreeData();
-            TreeNode nodeData = (TreeNode)Sequence.Tree.get(treeData, path);
-
-            textInput = new TextInput();
-            textInput.setText(nodeData.getText());
-            textInput.getComponentKeyListeners().add(textInputKeyHandler);
-
-            popup = new Window(textInput);
-            popup.getWindowStateListeners().add(popupStateHandler);
-            popup.open(treeView.getWindow());
-            reposition();
-
-            textInput.selectAll();
-            textInput.requestFocus();
-
-            nodeEditorListeners.nodeEditing(this, treeView, path);
-        } else if (vote == Vote.DENY) {
-            nodeEditorListeners.editNodeVetoed(this, vote);
-        }
-    }
-
-    /**
-     * Repositions the popup to be located over the node being edited.
-     */
-    private void reposition() {
         // Get the data being edited
         List<?> treeData = treeView.getTreeData();
-        TreeNode nodeData = (TreeNode)Sequence.Tree.get(treeData, path);
+        TreeNode treeNode = (TreeNode)Sequence.Tree.get(treeData, path);
+
+        textInput.setText(treeNode.getText());
+        textInput.selectAll();
+        textInput.requestFocus();
 
         // Get the node bounds
         Bounds nodeBounds = treeView.getNodeBounds(path);
@@ -256,67 +102,47 @@ public class TreeViewNodeEditor implemen
 
         // Render the node data
         TreeViewNodeRenderer nodeRenderer = (TreeViewNodeRenderer)treeView.getNodeRenderer();
-        nodeRenderer.render(nodeData, path, treeView.getRowIndex(path), treeView, false, false,
+        nodeRenderer.render(treeNode, path, treeView.getRowIndex(path), treeView, false, false,
             TreeView.NodeCheckState.UNCHECKED, false, false);
         nodeRenderer.setSize(nodeBounds.width, nodeBounds.height);
 
         // Get the text bounds
         Bounds textBounds = nodeRenderer.getTextBounds();
 
-        // Calculate the bounds of what we're editing
+        // Calculate the bounds of what is being edited
         Insets padding = (Insets)textInput.getStyles().get("padding");
         Bounds editBounds = new Bounds(nodeBounds.x + textBounds.x - (padding.left + 1),
             nodeBounds.y, nodeBounds.width - textBounds.x + (padding.left + 1),
             nodeBounds.height);
 
-        // Scroll to make the text as visible as possible
+        // Scroll to make the node as visible as possible
         treeView.scrollAreaToVisible(editBounds.x, editBounds.y,
             textBounds.width + padding.left + 1, editBounds.height);
 
-        // Constrain the bounds by what is visible through Viewport ancestors
+        // Constrain the bounds by what is visible through viewport ancestors
         editBounds = treeView.getVisibleArea(editBounds);
-        Point displayCoordinates = treeView.mapPointToAncestor(treeView.getDisplay(),
-            editBounds.x, editBounds.y);
+        Point location = treeView.mapPointToAncestor(treeView.getDisplay(), editBounds.x, editBounds.y);
 
         textInput.setPreferredWidth(editBounds.width);
-        popup.setLocation(displayCoordinates.x, displayCoordinates.y
-            + (editBounds.height - textInput.getPreferredHeight(-1)) / 2);
+        setLocation(location.x, location.y + (editBounds.height - getPreferredHeight(-1)) / 2);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
-    public boolean isEditing() {
-        return (treeView != null);
+    public final void close() {
+        close(false);
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @SuppressWarnings("unchecked")
-    @Override
-    public boolean saveChanges() {
-        if (!isEditing()) {
-            throw new IllegalStateException();
-        }
-
-        // Save local reference to members variables before they get cleared
-        TreeView treeView = this.treeView;
-        Path path = this.path;
-
-        // Preview the changes
-        String text = textInput.getText();
-        Vote vote = nodeEditorListeners.previewSaveChanges(this, treeView, path, text);
-
-        boolean saved = false;
-        if (vote == Vote.APPROVE) {
+    public void close(boolean result) {
+        if (result) {
             // Update the node data
+            String text = textInput.getText();
+
             List<?> treeData = treeView.getTreeData();
             TreeNode treeNode = (TreeNode)Sequence.Tree.get(treeData, path);
             treeNode.setText(text);
 
-            // Get a reference to the parent of the node data
+            // Get a reference to node's parent
             int n = path.getLength();
             List<TreeNode> parentData;
 
@@ -327,7 +153,6 @@ public class TreeViewNodeEditor implemen
                 parentData = (List<TreeNode>)Sequence.Tree.get(treeData, parentPath);
             }
 
-            // Notifying the parent will close the popup
             if (parentData.getComparator() == null) {
                 parentData.update(path.get(n - 1), treeNode);
             } else {
@@ -340,39 +165,32 @@ public class TreeViewNodeEditor implemen
                 treeView.setSelectedPath(path);
                 treeView.scrollAreaToVisible(treeView.getNodeBounds(path));
             }
-
-            nodeEditorListeners.changesSaved(this, treeView, path);
-            saved = true;
-        } else if (vote == Vote.DENY) {
-            nodeEditorListeners.saveChangesVetoed(this, vote);
         }
 
-        return saved;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void cancelEdit() {
-        if (!isEditing()) {
-            throw new IllegalStateException();
-        }
+        getOwner().moveToFront();
+        treeView.requestFocus();
 
-        // Save local reference to members variables before they get cleared
-        TreeView treeView = this.treeView;
-        Path path = this.path;
+        Display display = getDisplay();
+        display.getContainerMouseListeners().remove(displayMouseHandler);
 
-        popup.close();
+        super.close();
 
-        nodeEditorListeners.editCancelled(this, treeView, path);
+        treeView = null;
+        path = null;
     }
 
-    /**
-     * {@inheritDoc}
-     */
     @Override
-    public ListenerList<TreeView.NodeEditorListener> getNodeEditorListeners() {
-        return nodeEditorListeners;
+    public boolean keyPressed(int keyCode, Keyboard.KeyLocation keyLocation) {
+        boolean consumed = false;
+
+        if (keyCode == Keyboard.KeyCode.ENTER) {
+            close(true);
+            consumed = true;
+        } else if (keyCode == Keyboard.KeyCode.ESCAPE) {
+            close(false);
+            consumed = true;
+        }
+
+        return consumed;
     }
 }