From: Matti Tahvonen Date: Mon, 13 Aug 2007 10:53:26 +0000 (+0000) Subject: actions for tree X-Git-Tag: 6.7.0.beta1~6116 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=857f5a3a3ceebb684a0fc4fdf9ea28c9843c7769;p=vaadin-framework.git actions for tree svn changeset:1988/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITree.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITree.java index 00cedbec04..cbf5bba8eb 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITree.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITree.java @@ -1,9 +1,13 @@ package com.itmill.toolkit.terminal.gwt.client.ui; +import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Set; +import com.google.gwt.user.client.DOM; +import com.google.gwt.user.client.Element; +import com.google.gwt.user.client.Event; import com.google.gwt.user.client.ui.Tree; import com.google.gwt.user.client.ui.TreeItem; import com.google.gwt.user.client.ui.TreeListener; @@ -17,14 +21,47 @@ public class ITree extends Tree implements Paintable { Set selectedIds = new HashSet(); ApplicationConnection client; - String id; + String paintableId; private boolean selectable; private boolean multiselect; + /** + * This map contains captions and icon urls for + * actions like: + * * "33_c" -> "Edit" + * * "33_i" -> "http://dom.com/edit.png" + */ + private HashMap actionMap = new HashMap(); + + public ITree() { super(); setStyleName(CLASSNAME); } + + private void updateActionMap(UIDL c) { + Iterator it = c.getChildIterator(); + while(it.hasNext()) { + UIDL action = (UIDL) it.next(); + String key = action.getStringAttribute("key"); + String caption = action.getStringAttribute("caption"); + actionMap.put(key + "_c", caption); + if(action.hasAttribute("icon")) { + // TODO need some uri handling ?? + actionMap.put(key + "_i", action.getStringAttribute("icon")); + } + } + + } + + public String getActionCaption(String actionKey) { + return (String) actionMap.get(actionKey + "_c"); + } + + public String getActionIcon(String actionKey) { + return (String) actionMap.get(actionKey + "_i"); + } + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { // Ensure correct implementation and let container manage caption @@ -32,11 +69,15 @@ public class ITree extends Tree implements Paintable { return; this.client = client; - this.id = uidl.getId(); + this.paintableId = uidl.getId(); clear(); for (Iterator i = uidl.getChildIterator(); i.hasNext();) { UIDL childUidl = (UIDL)i.next(); + if("actions".equals(childUidl.getTag())){ + updateActionMap(childUidl); + continue; + } TreeNode childTree = new TreeNode(); addItem(childTree); childTree.updateFromUIDL(childUidl, client); @@ -58,7 +99,7 @@ public class ITree extends Tree implements Paintable { if (!multiselect) selectedIds.clear(); if (selectedIds.contains(key)) selectedIds.remove(key); else selectedIds.add(key); - ITree.this.client.updateVariable(ITree.this.id, "selected", selectedIds.toArray(), true); + ITree.this.client.updateVariable(ITree.this.paintableId, "selected", selectedIds.toArray(), true); } } @@ -68,13 +109,25 @@ public class ITree extends Tree implements Paintable { } - private class TreeNode extends TreeItem { + private class TreeNode extends TreeItem implements IActionOwner { String key; + private String[] actionKeys = null; + + public TreeNode() { + super(); + attachContextMenuEvent(getElement()); + } + + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { this.setText(uidl.getStringAttribute("caption")); key = uidl.getStringAttribute("key"); + + if(uidl.hasAttribute("al")) + actionKeys = uidl.getStringArrayAttribute("al"); + for (Iterator i = uidl.getChildIterator(); i.hasNext();) { UIDL childUidl = (UIDL)i.next(); TreeNode childTree = new TreeNode(); @@ -84,7 +137,47 @@ public class ITree extends Tree implements Paintable { setState(uidl.getBooleanAttribute("expanded")); setSelected(uidl.getBooleanAttribute("selected")); } + + public IAction[] getActions() { + if(actionKeys == null) + return new IAction[] {}; + IAction[] actions = new IAction[actionKeys.length]; + for (int i = 0; i < actions.length; i++) { + String actionKey = actionKeys[i]; + ITreeAction a = new ITreeAction(this, String.valueOf(key), actionKey); + a.setCaption(getActionCaption(actionKey)); + actions[i] = a; + } + return actions; + } + + public ApplicationConnection getClient() { + return client; + } + + public String getPaintableId() { + return paintableId; + } + public void showContextMenu(Event event) { + client.console.log("Context menu"); + if(actionKeys != null) { + int left = DOM.eventGetClientX(event); + int top = DOM.eventGetClientY(event); + client.getContextMenu().showAt(this, left, top); + } + } + + private native void attachContextMenuEvent(Element el) /*-{ + var node = this; + el.oncontextmenu = function(e) { + if(!e) + e = $wnd.event; + node.@com.itmill.toolkit.terminal.gwt.client.ui.ITree.TreeNode::showContextMenu(Lcom/google/gwt/user/client/Event;)(e); + return false; + }; + }-*/; + } } diff --git a/src/com/itmill/toolkit/ui/Tree.java b/src/com/itmill/toolkit/ui/Tree.java index a4440c2cbc..0d43a34acb 100644 --- a/src/com/itmill/toolkit/ui/Tree.java +++ b/src/com/itmill/toolkit/ui/Tree.java @@ -29,6 +29,7 @@ package com.itmill.toolkit.ui; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; @@ -425,9 +426,10 @@ public class Tree extends Select implements Container.Hierarchical, expandedKeys.add(key); } + // Actions if (actionHandlers != null) { - target.startTag("al"); + ArrayList keys = new ArrayList(); for (Iterator ahi = actionHandlers.iterator(); ahi .hasNext();) { Action[] aa = ((Action.Handler) ahi.next()).getActions( @@ -436,10 +438,10 @@ public class Tree extends Select implements Container.Hierarchical, for (int ai = 0; ai < aa.length; ai++) { String akey = actionMapper.key(aa[ai]); actionSet.add(aa[ai]); - target.addSection("ak", akey); + keys.add(akey); } } - target.endTag("al"); + target.addAttribute("al", keys.toArray()); } // Adds the children if expanded, or close the tag @@ -455,10 +457,11 @@ public class Tree extends Select implements Container.Hierarchical, } } + // Actions if (!actionSet.isEmpty()) { - target.startTag("actions"); target.addVariable(this, "action", ""); + target.startTag("actions"); for (Iterator i = actionSet.iterator(); i.hasNext();) { Action a = (Action) i.next(); target.startTag("action");