]> source.dussan.org Git - vaadin-framework.git/commitdiff
actions for tree
authorMatti Tahvonen <matti.tahvonen@itmill.com>
Mon, 13 Aug 2007 10:53:26 +0000 (10:53 +0000)
committerMatti Tahvonen <matti.tahvonen@itmill.com>
Mon, 13 Aug 2007 10:53:26 +0000 (10:53 +0000)
svn changeset:1988/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/ui/ITree.java
src/com/itmill/toolkit/ui/Tree.java

index 00cedbec0476ded684e7262a2dbf21136b7e4b75..cbf5bba8eb02e5930d37b85e8cdfc60826a5a46c 100644 (file)
@@ -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;
+                       };
+               }-*/;
+
                
        }
 }
index a4440c2cbcb3158f18382197053203fe40da3a1c..0d43a34acb19f2e59e35f56deffa5cd0dd3ec15c 100644 (file)
@@ -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");