123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267 |
- 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;
- import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
- import com.itmill.toolkit.terminal.gwt.client.Paintable;
- import com.itmill.toolkit.terminal.gwt.client.UIDL;
-
- /**
- * TODO todo dump GWT's Tree implementation and use Toolkit 4 style
- * DOM structure
- *
- */
- public class ITree extends Tree implements Paintable {
-
- public static final String CLASSNAME = "i-tree";
-
- Set selectedIds = new HashSet();
- ApplicationConnection client;
- String paintableId;
- private boolean selectable;
- private boolean multiselect;
-
- private HashMap keyToNode = new HashMap();
-
- /**
- * 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
- if (client.updateComponent(this, uidl, true))
- return;
-
- this.client = client;
-
- if(uidl.hasAttribute("partialUpdate")) {
- handleUpdate(uidl);
- return;
- }
-
- 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);
- }
- String selectMode = uidl.getStringAttribute("selectmode");
- selectable = selectMode != null;
- multiselect = "multi".equals(selectMode);
-
- addTreeListener(new TreeListener() {
-
- public void onTreeItemStateChanged(TreeItem item) {
- if (item instanceof TreeNode) {
- TreeNode tn = (TreeNode) item;
- if(item.getState()) {
- if(!tn.isChildrenLoaded()) {
- String key = tn.key;
- ITree.this.client.updateVariable(paintableId, "expand", new String[] {key}, true);
- }
- } else {
- // TODO collapse
- }
- }
- }
-
- public void onTreeItemSelected(TreeItem item) {
- TreeNode n = ((TreeNode) item);
- if (!selectable) return;
- String key = n.key;
- if (key != null) {
- if(selectedIds.contains(key) && multiselect) {
- selectedIds.remove(key);
- n.setISelected(false);
- } else {
- if (!multiselect)
- selectedIds.clear();
- selectedIds.add(key);
- n.setISelected(true);
- }
- ITree.this.client.updateVariable(ITree.this.paintableId, "selected", selectedIds.toArray(), true);
- }
- }
-
- });
-
- selectedIds = uidl.getStringArrayVariableAsSet("selected");
-
- }
-
- private void handleUpdate(UIDL uidl) {
- TreeNode rootNode = (TreeNode) keyToNode.get(uidl.getStringAttribute("rootKey"));
- if(rootNode != null) {
- rootNode.renderChildNodes(uidl.getChildIterator());
- }
-
- }
-
- private class TreeNode extends TreeItem implements IActionOwner {
-
- String key;
-
- boolean isLeaf = false;
-
- private String[] actionKeys = null;
-
- private boolean childrenLoaded;
-
- public TreeNode() {
- super();
- attachContextMenuEvent(getElement());
- }
-
-
- public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
- this.setText(uidl.getStringAttribute("caption"));
- key = uidl.getStringAttribute("key");
-
- keyToNode.put(key, this);
-
- if(uidl.hasAttribute("al"))
- actionKeys = uidl.getStringArrayAttribute("al");
-
- if(uidl.getTag().equals("node")) {
- isLeaf = false;
- if(uidl.getChidlCount() == 0) {
- TreeNode childTree = new TreeNode();
- childTree.setText("Loading...");
- childrenLoaded = false;
- this.addItem(childTree);
- } else {
- renderChildNodes(uidl.getChildIterator());
- }
- } else {
- isLeaf = true;
- }
-
- if(uidl.getBooleanAttribute("expanded") && !getState()) {
- setState(true);
- }
-
- setSelected(uidl.getBooleanAttribute("selected"));
-
- }
-
- private void renderChildNodes(Iterator i) {
- removeItems();
- while (i.hasNext()) {
- UIDL childUidl = (UIDL)i.next();
- if("actions".equals(childUidl.getTag())) {
- updateActionMap(childUidl);
- continue;
- }
- TreeNode childTree = new TreeNode();
- this.addItem(childTree);
- childTree.updateFromUIDL(childUidl, client);
- }
- childrenLoaded = true;
- }
-
- public boolean isChildrenLoaded() {
- return childrenLoaded;
- }
-
- 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;
- }
-
- /**
- * Adds/removes IT Mill Toolkit spesific style name.
- * (GWT treenode does not support multiselects)
- *
- * @param selected
- */
- public void setISelected(boolean selected) {
- setStyleName(getElement(), "i-tree-node-selected", selected);
- }
-
- public void showContextMenu(Event event) {
- if(actionKeys != null) {
- int left = DOM.eventGetClientX(event);
- int top = DOM.eventGetClientY(event);
- client.getContextMenu().showAt(this, left, top);
- }
- DOM.eventCancelBubble(event, true);
- }
-
- 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;
- };
- }-*/;
-
- }
- }
|