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;
}
}