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;
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
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);
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);
}
}
}
- 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();
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;
+ };
+ }-*/;
+
}
}
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;
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(
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
}
}
+
// 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");