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/03/24 22:02:46 UTC
svn commit: r758018 - in /incubator/pivot/trunk/wtk/src/pivot/wtk:
TreeView.java content/TreeViewNodeEditor.java
Author: tvolkert
Date: Tue Mar 24 21:02:45 2009
New Revision: 758018
URL: http://svn.apache.org/viewvc?rev=758018&view=rev
Log:
Updated TreeViewNodeEditor to implement newly expanded NodeEditor interface, updated NodeEditor to extend Editor interface
Modified:
incubator/pivot/trunk/wtk/src/pivot/wtk/TreeView.java
incubator/pivot/trunk/wtk/src/pivot/wtk/content/TreeViewNodeEditor.java
Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/TreeView.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/TreeView.java?rev=758018&r1=758017&r2=758018&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/TreeView.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/TreeView.java Tue Mar 24 21:02:45 2009
@@ -105,7 +105,7 @@
*
* @author tvolkert
*/
- public interface NodeEditor {
+ public interface NodeEditor extends Editor {
/**
* Notifies the editor that editing should begin.
*
Modified: incubator/pivot/trunk/wtk/src/pivot/wtk/content/TreeViewNodeEditor.java
URL: http://svn.apache.org/viewvc/incubator/pivot/trunk/wtk/src/pivot/wtk/content/TreeViewNodeEditor.java?rev=758018&r1=758017&r2=758018&view=diff
==============================================================================
--- incubator/pivot/trunk/wtk/src/pivot/wtk/content/TreeViewNodeEditor.java (original)
+++ incubator/pivot/trunk/wtk/src/pivot/wtk/content/TreeViewNodeEditor.java Tue Mar 24 21:02:45 2009
@@ -25,16 +25,14 @@
import pivot.wtk.Container;
import pivot.wtk.ContainerMouseListener;
import pivot.wtk.Display;
+import pivot.wtk.Insets;
import pivot.wtk.Keyboard;
import pivot.wtk.Mouse;
import pivot.wtk.Point;
import pivot.wtk.TextInput;
import pivot.wtk.TreeView;
import pivot.wtk.TreeViewListener;
-import pivot.wtk.TreeViewBranchListener;
import pivot.wtk.TreeViewNodeListener;
-import pivot.wtk.TreeViewNodeStateListener;
-import pivot.wtk.TreeViewSelectionListener;
import pivot.wtk.Window;
import pivot.wtk.WindowStateListener;
import pivot.wtk.content.TreeNode;
@@ -63,15 +61,11 @@
}
public void windowOpened(Window window) {
- // Add this as a container mouse listener on display
Display display = window.getDisplay();
display.getContainerMouseListeners().add(displayMouseHandler);
treeView.getTreeViewListeners().add(treeViewHandler);
- treeView.getTreeViewBranchListeners().add(treeViewHandler);
treeView.getTreeViewNodeListeners().add(treeViewHandler);
- treeView.getTreeViewNodeStateListeners().add(treeViewHandler);
- treeView.getTreeViewSelectionListeners().add(treeViewHandler);
}
public Vote previewWindowClose(Window window) {
@@ -84,18 +78,17 @@
public void windowClosed(Window window, Display display) {
// Clean up
display.getContainerMouseListeners().remove(displayMouseHandler);
+
treeView.getTreeViewListeners().remove(treeViewHandler);
- treeView.getTreeViewBranchListeners().remove(treeViewHandler);
treeView.getTreeViewNodeListeners().remove(treeViewHandler);
- treeView.getTreeViewNodeStateListeners().remove(treeViewHandler);
- treeView.getTreeViewSelectionListeners().remove(treeViewHandler);
// Restore focus to the tree view
treeView.requestFocus();
// Free memory
treeView = null;
- editPath = null;
+ path = null;
+ textInput = null;
popup = null;
}
};
@@ -107,34 +100,11 @@
* @author tvolkert
*/
private ComponentKeyListener textInputKeyHandler = new ComponentKeyListener() {
- @SuppressWarnings("unchecked")
public boolean keyPressed(Component component, int keyCode, Keyboard.KeyLocation keyLocation) {
if (keyCode == Keyboard.KeyCode.ENTER) {
- List<?> treeData = treeView.getTreeData();
- TreeNode nodeData = (TreeNode)Sequence.Tree.get(treeData, editPath);
-
- // Update the node data
- TextInput textInput = (TextInput)component;
- String text = textInput.getText();
- nodeData.setText(text);
-
- // Notify the tree branch that the child was updated. Our
- // treeViewHandler will be notified of this edit and close
- // the popup for us.
- int n = editPath.getLength();
- if (n == 1) {
- // Base case
- int index = editPath.get(0);
- ((List<TreeNode>)treeData).update(index, nodeData);
- } else {
- Sequence<Integer> parentPath = new ArrayList<Integer>(editPath, 0, n - 1);
- TreeBranch parentData = (TreeBranch)Sequence.Tree.get(treeData, parentPath);
- int index = editPath.get(n - 1);
- parentData.update(index, nodeData);
- }
+ save();
} else if (keyCode == Keyboard.KeyCode.ESCAPE) {
- // Close the popup without saving (cancel)
- popup.close();
+ cancel();
}
return false;
@@ -166,8 +136,8 @@
Display display = (Display)container;
Window window = (Window)display.getComponentAt(x, y);
- if (popup != null && window != popup) {
- popup.close();
+ if (popup != window) {
+ save();
}
return false;
@@ -179,18 +149,7 @@
public boolean mouseWheel(Container container, Mouse.ScrollType scrollType,
int scrollAmount, int wheelRotation, int x, int y) {
- boolean consumed = false;
-
- // If the event did not occur within a window that is owned by
- // this popup, close the popup
- Display display = (Display)container;
- Window window = (Window)display.getComponentAt(x, y);
-
- if (popup != null && window != popup) {
- consumed = true;
- }
-
- return consumed;
+ return true;
}
};
@@ -198,163 +157,148 @@
* Responsible for cancelling the edit if any relevant changes are made to
* the tree view while we're editing.
*/
- private class TreeViewHandler implements
- TreeViewListener, TreeViewBranchListener, TreeViewNodeListener,
- TreeViewNodeStateListener, TreeViewSelectionListener {
- private TreeView.PathComparator pathComparator = new TreeView.PathComparator();
-
+ private class TreeViewHandler implements TreeViewListener, TreeViewNodeListener {
public void treeDataChanged(TreeView treeView, List<?> previousTreeData) {
- popup.close();
+ cancel();
}
public void nodeRendererChanged(TreeView treeView, TreeView.NodeRenderer previousNodeRenderer) {
- popup.close();
}
public void nodeEditorChanged(TreeView treeView, TreeView.NodeEditor previousNodeEditor) {
- popup.close();
+ cancel();
}
public void selectModeChanged(TreeView treeView, TreeView.SelectMode previousSelectMode) {
- popup.close();
}
public void checkmarksEnabledChanged(TreeView treeView) {
- popup.close();
}
public void showMixedCheckmarkStateChanged(TreeView treeView) {
}
- public void branchExpanded(TreeView treeView, Sequence<Integer> path) {
- if (pathComparator.compare(path, editPath) < 0) {
- popup.close();
- }
- }
-
- public void branchCollapsed(TreeView treeView, Sequence<Integer> path) {
- if (pathComparator.compare(path, editPath) < 0) {
- popup.close();
- }
- }
-
public void nodeInserted(TreeView treeView, Sequence<Integer> path, int index) {
- Sequence<Integer> childPath = new ArrayList<Integer>(path);
- childPath.add(index);
-
- if (pathComparator.compare(childPath, editPath) <= 0) {
- popup.close();
- }
+ cancel();
}
public void nodesRemoved(TreeView treeView, Sequence<Integer> path, int index, int count) {
- Sequence<Integer> childPath = new ArrayList<Integer>(path);
- childPath.add(index);
-
- if (pathComparator.compare(childPath, editPath) <= 0) {
- popup.close();
- }
+ cancel();
}
public void nodeUpdated(TreeView treeView, Sequence<Integer> path, int index) {
- Sequence<Integer> childPath = new ArrayList<Integer>(path);
- childPath.add(index);
-
- if (pathComparator.compare(childPath, editPath) <= 0) {
- popup.close();
- }
+ cancel();
}
public void nodesSorted(TreeView treeView, Sequence<Integer> path) {
- if (Sequence.Tree.isDescendant(path, editPath)) {
- popup.close();
- }
- }
-
- public void nodeDisabledChanged(TreeView treeView, Sequence<Integer> path) {
- if (pathComparator.compare(path, editPath) == 0) {
- popup.close();
- }
- }
-
- public void nodeCheckStateChanged(TreeView treeView, Sequence<Integer> path,
- TreeView.NodeCheckState previousCheckState) {
- }
-
- public void selectedPathAdded(TreeView treeView, Sequence<Integer> path) {
- }
-
- public void selectedPathRemoved(TreeView treeView, Sequence<Integer> path) {
- if (pathComparator.compare(path, editPath) == 0) {
- popup.close();
- }
- }
-
- public void selectedPathsChanged(TreeView treeView,
- Sequence<Sequence<Integer>> previousSelectedPaths) {
- popup.close();
+ cancel();
}
}
private TreeView treeView = null;
- private Sequence<Integer> editPath = null;
+ private Sequence<Integer> path = null;
+
private Window popup = null;
+ private TextInput textInput = null;
private TreeViewHandler treeViewHandler = new TreeViewHandler();
public void edit(TreeView treeView, Sequence<Integer> path) {
- if (this.treeView != null) {
- throw new IllegalStateException("Currently editing.");
+ if (isEditing()) {
+ throw new IllegalStateException();
}
this.treeView = treeView;
- this.editPath = path;
+ this.path = path;
// Get the data being edited
List<?> treeData = treeView.getTreeData();
TreeNode nodeData = (TreeNode)Sequence.Tree.get(treeData, path);
- // Calculate the bounds of the renderer within the tree view
- Bounds rendererBounds = treeView.getNodeBounds(path);
+ // Get the node bounds
+ Bounds nodeBounds = treeView.getNodeBounds(path);
int nodeIndent = treeView.getNodeIndent(path.getLength());
- rendererBounds.x += nodeIndent;
- rendererBounds.width -= nodeIndent;
+ nodeBounds.x += nodeIndent;
+ nodeBounds.width -= nodeIndent;
- // Render the data, enabling us to query the renderer for layout info
+ // Render the node data
TreeViewNodeRenderer nodeRenderer = (TreeViewNodeRenderer)treeView.getNodeRenderer();
nodeRenderer.render(nodeData, treeView, false, false,
TreeView.NodeCheckState.UNCHECKED, false, false);
- nodeRenderer.setSize(rendererBounds.width, rendererBounds.height);
+ nodeRenderer.setSize(nodeBounds.width, nodeBounds.height);
- // Calculate the bounds of the text within the renderer
- Bounds rendererTextBounds = nodeRenderer.getTextBounds();
+ // Get the text bounds
+ Bounds textBounds = nodeRenderer.getTextBounds();
+
+ if (textBounds != null) {
+ textInput = new TextInput();
+ Insets padding = (Insets)textInput.getStyles().get("padding");
- if (rendererTextBounds != null) {
// Calculate the bounds of what we're editing
- Bounds editBounds = new Bounds(rendererBounds);
- editBounds.x += rendererTextBounds.x;
- editBounds.width -= rendererTextBounds.x;
+ Bounds editBounds = new Bounds(nodeBounds);
+ editBounds.x += textBounds.x - (padding.left + 1);
+ editBounds.width -= textBounds.x;
+ editBounds.width += (padding.left + 1);
// Scroll to make the text as visible as possible
treeView.scrollAreaToVisible(editBounds.x, editBounds.y,
- rendererTextBounds.width, editBounds.height);
+ textBounds.width, editBounds.height);
// Constrain the bounds by what is visible through Viewport ancestors
treeView.constrainToViewportBounds(editBounds);
- TextInput textInput = new TextInput();
textInput.setText(nodeData.getText());
textInput.setPreferredWidth(editBounds.width);
textInput.getComponentKeyListeners().add(textInputKeyHandler);
popup = new Window(textInput);
- Point displayCoordinates = treeView.mapPointToAncestor(treeView.getDisplay(), 0, 0);
- popup.setLocation(displayCoordinates.x + editBounds.x, displayCoordinates.y +
- editBounds.y + (editBounds.height - textInput.getPreferredHeight(-1)) / 2);
popup.getWindowStateListeners().add(popupStateHandler);
+
+ Point location = treeView.mapPointToAncestor(treeView.getDisplay(), 0, 0);
+ popup.setLocation(location.x + editBounds.x, location.y +
+ editBounds.y + (editBounds.height - textInput.getPreferredHeight(-1)) / 2);
popup.open(treeView.getWindow());
textInput.requestFocus();
}
}
+
+ public boolean isEditing() {
+ return (treeView != null);
+ }
+
+ @SuppressWarnings("unchecked")
+ public void save() {
+ if (!isEditing()) {
+ throw new IllegalStateException();
+ }
+
+ List<?> treeData = treeView.getTreeData();
+ TreeNode nodeData = (TreeNode)Sequence.Tree.get(treeData, path);
+
+ // Update the node data
+ String text = textInput.getText();
+ nodeData.setText(text);
+
+ // Notifying the parent will close the popup
+ int n = path.getLength();
+ if (n == 1) {
+ // Base case
+ int index = path.get(0);
+ ((List<TreeNode>)treeData).update(index, nodeData);
+ } else {
+ Sequence<Integer> parentPath = new ArrayList<Integer>(path, 0, n - 1);
+ TreeBranch parentData = (TreeBranch)Sequence.Tree.get(treeData, parentPath);
+ int index = path.get(n - 1);
+ parentData.update(index, nodeData);
+ }
+ }
+
+ public void cancel() {
+ if (!isEditing()) {
+ throw new IllegalStateException();
+ }
+
+ popup.close();
+ }
}