001: /**
002: * Copyright 2006 Webmedia Group Ltd.
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: **/package org.araneaframework.jsp.tag.uilib.tree;
016:
017: import java.io.Writer;
018: import org.araneaframework.OutputData;
019: import org.araneaframework.jsp.UiEvent;
020: import org.araneaframework.jsp.tag.uilib.BaseWidgetTag;
021: import org.araneaframework.jsp.util.JspUtil;
022: import org.araneaframework.jsp.util.JspWidgetCallUtil;
023: import org.araneaframework.uilib.tree.TreeContext;
024: import org.araneaframework.uilib.tree.TreeNodeContext;
025: import org.araneaframework.uilib.tree.TreeRenderer;
026: import org.araneaframework.uilib.tree.TreeWidget;
027:
028: /**
029: * Tree widget tag. Uses {@link StandardTreeRenderer} for rendering the tree in HTML.
030: * @author Alar Kvell (alar@araneaframework.org)
031: * @since 1.0.7
032: *
033: * @jsp.tag
034: * name = "tree"
035: * body-content = "JSP"
036: * description = "Tree widget tag. Provides a renderer with HTML unordered
037: list <code><ul></code> and list item <code><li></code>
038: tags."
039: */
040: public class TreeTag extends BaseWidgetTag {
041:
042: public int doStartTag(Writer out) throws Exception {
043: super .doStartTag(out);
044:
045: OutputData output = getOutputData();
046:
047: ((TreeWidget) widget)
048: .setRenderer(buildTreeRenderer((TreeContext) widget));
049:
050: try {
051: hideGlobalContextEntries(pageContext);
052: out.flush();
053: widget._getWidget().render(output);
054: } finally {
055: restoreGlobalContextEntries(pageContext);
056: }
057:
058: return EVAL_PAGE;
059: }
060:
061: /**
062: * Builds a {@link TreeRenderer} that is used to render current
063: * {@link TreeWidget}. Usually overridden.
064: */
065: protected TreeRenderer buildTreeRenderer(TreeContext treeWidget) {
066: if (treeWidget.getRenderer() != null)
067: return treeWidget.getRenderer();
068: return new StandardTreeRenderer(treeWidget);
069: }
070:
071: /**
072: * Standard implementation of tree widget renderer that uses HTML unordered
073: * list <code><ul></code> and list item <code><li></code>
074: * tags.
075: */
076: public static class StandardTreeRenderer implements TreeRenderer {
077:
078: protected TreeContext tree;
079:
080: public StandardTreeRenderer(TreeContext tree) {
081: this .tree = tree;
082: }
083:
084: protected TreeContext getTree() {
085: return tree;
086: }
087:
088: public void renderTreeStart(Writer out, TreeNodeContext node)
089: throws Exception {
090: JspUtil.writeOpenStartTag(out, "ul");
091: JspUtil.writeAttribute(out, "id", node.getFullId());
092: JspUtil.writeAttribute(out, "class", "aranea-tree");
093: if (!getTree().useSynchronizedActions()) {
094: JspUtil.writeAttribute(out, "arn-tree-sync", "false");
095: }
096: JspUtil.writeCloseStartTag_SS(out);
097: }
098:
099: public void renderTreeEnd(Writer out, TreeNodeContext node)
100: throws Exception {
101: JspUtil.writeEndTag(out, "ul");
102: }
103:
104: public void renderToggleLink(Writer out, TreeNodeContext node)
105: throws Exception {
106: JspUtil.writeOpenStartTag(out, "a");
107: JspUtil.writeAttribute(out, "href", "#");
108: if (getTree().useActions()) {
109: JspUtil.writeAttribute(out, "onclick",
110: "return AraneaTree.toggleNode(this);");
111: } else {
112: UiEvent event = new UiEvent("toggle", node.getFullId(),
113: null);
114: JspUtil.writeEventAttributes(out, event);
115: JspWidgetCallUtil.writeSubmitScriptForEvent(out,
116: "onclick");
117: }
118: JspUtil.writeCloseStartTag_SS(out);
119: out.write(node.isCollapsed() ? "+" : "-");
120: JspUtil.writeEndTag_SS(out, "a");
121: }
122:
123: public void renderChildrenStart(Writer out, TreeNodeContext node)
124: throws Exception {
125: JspUtil.writeStartTag(out, "ul");
126: }
127:
128: public void renderChildrenEnd(Writer out, TreeNodeContext node)
129: throws Exception {
130: JspUtil.writeEndTag(out, "ul");
131: }
132:
133: public void renderChildStart(Writer out, TreeNodeContext node,
134: TreeNodeContext childNode) throws Exception {
135: JspUtil.writeOpenStartTag(out, "li");
136: JspUtil.writeAttribute(out, "id", childNode.getFullId());
137: JspUtil.writeAttribute(out, "class", "aranea-tree-node");
138: JspUtil.writeCloseStartTag(out);
139: }
140:
141: public void renderChildEnd(Writer out, TreeNodeContext node,
142: TreeNodeContext childNode) throws Exception {
143: JspUtil.writeEndTag(out, "li");
144: }
145:
146: public void renderDisplayPrefix(Writer out,
147: TreeNodeContext node, boolean current) throws Exception {
148: }
149:
150: }
151:
152: }
|