001: /*
002: * Copyright (C) 2004 TiongHiang Lee
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: * Email: thlee@onemindsoft.org
019: */
020:
021: package org.onemind.swingweb.client.gwt.ui;
022:
023: import java.util.List;
024: import org.onemind.swingweb.client.core.AbstractClient;
025: import org.onemind.swingweb.client.dom.DomNode;
026: import org.onemind.swingweb.client.gwt.widget.*;
027: import com.google.gwt.user.client.DOM;
028: import com.google.gwt.user.client.ui.*;
029:
030: public class TreeUIHandler extends ContainerUIHandler implements
031: ClickListener, DoubleClickListener, TreeListener {
032:
033: public TreeUIHandler(AbstractClient client) {
034: super (client);
035: }
036:
037: protected void selectTab(SourcesTabEvents sender, int tabIndex) {
038: // TODO Auto-generated method stub
039: }
040:
041: /**
042: * {@inheritDoc}
043: */
044: protected void registerListeners(Object com) {
045: ((org.onemind.swingweb.client.gwt.widget.Tree) com)
046: .addTreeListener(this );
047: ((org.onemind.swingweb.client.gwt.widget.Tree) com)
048: .addClickListener(this );
049: ((org.onemind.swingweb.client.gwt.widget.Tree) com)
050: .addDoubleClickListener(this );
051: }
052:
053: /**
054: * {@inheritDoc}
055: */
056: protected Object createComponentInstance(Object parent,
057: DomNode element) {
058: org.onemind.swingweb.client.gwt.widget.Tree t = new org.onemind.swingweb.client.gwt.widget.Tree();
059: return t;
060: }
061:
062: /**
063: * {@inheritDoc}
064: */
065: protected void handleChildren(AbstractClient rootHandler,
066: IContainer c, DomNode element) {
067: org.onemind.swingweb.client.gwt.widget.Tree tree = (org.onemind.swingweb.client.gwt.widget.Tree) c;
068: tree.clear(); //TODO: optimize this
069: String elementId = element.getAttribute("id");
070: handleTreeNodes(tree, element, elementId + "#");
071: }
072:
073: protected void handleTreeNodes(ITreeNode treeNode, DomNode element,
074: String idPrefix) {
075: List nodeList = getChildrenByTag(element, "treenode");
076: for (int n = 0; n < nodeList.size(); n++) {
077: DomNode treenodeNode = (DomNode) nodeList.get(n);
078: String nodeId = treenodeNode.getAttribute("id");
079: List elements = getChildrenByTag(treenodeNode, "element");
080: if (elements.size() > 0) {
081: DomNode elementNode = (DomNode) elements.get(0);
082: String pregenId = idPrefix + nodeId;
083: getClient().removeComponent(pregenId);
084: Widget content = (Widget) getClient().handle(this ,
085: elementNode, pregenId);
086: TreeNode tn = new TreeNode(pregenId, content);
087: treeNode.addNode(tn);
088: //handle subnodes
089: boolean expanded = "true".equalsIgnoreCase(treenodeNode
090: .getAttribute("expanded"));
091: boolean isLeaf = "true".equalsIgnoreCase(treenodeNode
092: .getAttribute("isLeaf"));
093: boolean isSelected = "true"
094: .equalsIgnoreCase(treenodeNode
095: .getAttribute("selected"));
096: handleTreeNodes(tn, treenodeNode, idPrefix);
097: if (expanded) {
098: tn.getItem().setState(true, false);
099: } else if (!isLeaf) {
100: tn.getItem().addItem("loading...");
101: }
102: if (isSelected) {
103: tn.getItem().getTree().setSelectedItem(
104: tn.getItem(), false);
105: }
106: } else {
107: throw new IllegalArgumentException(
108: "No widget found in the tree node");
109: }
110: }
111: }
112:
113: public void onTreeItemSelected(TreeItem item) {
114: // String swid = DOM.getAttribute(item.getElement(), "swid");
115: // org.onemind.swingweb.client.gwt.widget.Tree tree = (org.onemind.swingweb.client.gwt.widget.Tree) item.getTree().getParent();
116: // String action = (tree.isAppendSelection()) ? "addSelected" : "selected";
117: // postEvent(tree, swid, false);
118: // postEvent(tree, "-action", action, true);
119: }
120:
121: public void onTreeItemStateChanged(TreeItem item) {
122: //TODO: make use of handleEvent
123: String id = DOM.getAttribute(item.getElement(), "swid");
124: String[] parts = id.split("#");
125: String treeId = parts[0];
126: String path = parts[1];
127: org.onemind.swingweb.client.gwt.widget.Tree tree = (org.onemind.swingweb.client.gwt.widget.Tree) item
128: .getTree().getParent();
129: String action = item.getState() ? "expanded" : "collapsed";
130: postEvent(tree, path, false);
131: postEvent(tree, "-action", action, true);
132: }
133:
134: public void onClick(Widget sender) {
135: String id = DOM.getAttribute(sender.getElement(), "id");
136: String[] parts = id.split("#");
137: String treeId = parts[0];
138: String path = parts[1];
139: System.out.println("Tree id = " + treeId);
140: org.onemind.swingweb.client.gwt.widget.Tree tree = (org.onemind.swingweb.client.gwt.widget.Tree) getClient()
141: .getComponent(treeId);
142: String action = (tree.isAppendSelection()) ? "addSelected"
143: : "selected";
144: postEvent(tree, path, false);
145: postEvent(tree, "-action", action, true);
146: }
147:
148: public void onDoubleClick(Widget sender) {
149: String id = DOM.getAttribute(sender.getElement(), "id");
150: String[] parts = id.split("#");
151: String treeId = parts[0];
152: String path = parts[1];
153: org.onemind.swingweb.client.gwt.widget.Tree tree = (org.onemind.swingweb.client.gwt.widget.Tree) getClient()
154: .getComponent(treeId);
155: String action = (tree.isAppendSelection()) ? "addSelected-doubleclicked"
156: : "selected-doubleclicked";
157: postEvent(tree, path, false);
158: postEvent(tree, "-action", action, true);
159: }
160: }
|