001: /***************************************************************
002: * This file is part of the [fleXive](R) project.
003: *
004: * Copyright (c) 1999-2007
005: * UCS - unique computing solutions gmbh (http://www.ucs.at)
006: * All rights reserved
007: *
008: * The [fleXive](R) project is free software; you can redistribute
009: * it and/or modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation;
011: * either version 2 of the License, or (at your option) any
012: * later version.
013: *
014: * The GNU General Public License can be found at
015: * http://www.gnu.org/copyleft/gpl.html.
016: * A copy is found in the textfile GPL.txt and important notices to the
017: * license from the author are found in LICENSE.txt distributed with
018: * these libraries.
019: *
020: * This library is distributed in the hope that it will be useful,
021: * but WITHOUT ANY WARRANTY; without even the implied warranty of
022: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023: * GNU General Public License for more details.
024: *
025: * For further information about UCS - unique computing solutions gmbh,
026: * please see the company website: http://www.ucs.at
027: *
028: * For further information about [fleXive](R), please see the
029: * project website: http://www.flexive.org
030: *
031: *
032: * This copyright notice MUST APPEAR in all copies of the file!
033: ***************************************************************/package com.flexive.faces.components;
034:
035: import static com.flexive.faces.FxJsfComponentUtils.getStringValue;
036: import com.flexive.faces.FxJsfUtils;
037: import com.flexive.faces.javascript.tree.TreeNodeWriter;
038: import com.flexive.faces.javascript.tree.TreeNodeWriter.Node;
039: import org.apache.commons.lang.StringUtils;
040:
041: import javax.faces.component.UIOutput;
042: import javax.faces.context.FacesContext;
043: import java.io.IOException;
044: import java.util.ArrayList;
045: import java.util.List;
046:
047: /**
048: * Tree node component. Specifies a node in a Tree. Must be nested in
049: * a fxTree component. May include nested nodes in its body.
050: *
051: * @author Daniel Lichtenberger (daniel.lichtenberger@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
052: * @version $Rev: 1 $
053: */
054: public class TreeNode extends UIOutput {
055: private String title = null;
056: private String icon = null;
057: private String titleClass = null;
058: private String link = null;
059:
060: /**
061: * Default constructor.
062: */
063: public TreeNode() {
064: setRendererType(null);
065: }
066:
067: /**
068: * {@inheritDoc}
069: */
070: @Override
071: public boolean getRendersChildren() {
072: return false;
073: }
074:
075: /**
076: * Write all tree nodes, including optional child nodes, to the
077: * given tree writer.
078: *
079: * @param writer the tree node writer
080: * @throws IOException if the tree could not be written to the output writer
081: */
082: public void writeTreeNodes(TreeNodeWriter writer)
083: throws IOException {
084: List<TreeNode> childNodes = getNodeChildren();
085: final String linkUrl = StringUtils.isNotBlank(link) ? FxJsfUtils
086: .getRequest().getContextPath()
087: + link
088: : null;
089: if (childNodes.size() == 0) {
090: writer.writeNode(new Node(getId(), getTitle(),
091: titleClass != null ? titleClass
092: : Node.TITLE_CLASS_LEAF, icon, linkUrl));
093: } else {
094: writer.startNode(new Node(getId(), getTitle(),
095: titleClass != null ? titleClass
096: : Node.TITLE_CLASS_NODE, icon, linkUrl));
097: writer.startChildren();
098: for (TreeNode child : childNodes) {
099: child.writeTreeNodes(writer);
100: }
101: writer.closeChildren();
102: writer.closeNode();
103: }
104: }
105:
106: private List<TreeNode> getNodeChildren() {
107: List<TreeNode> result = new ArrayList<TreeNode>();
108: for (Object child : getChildren()) {
109: if (child instanceof TreeNode) {
110: TreeNode node = (TreeNode) child;
111: result.add(node);
112: }
113: }
114: return result;
115: }
116:
117: public void setIcon(String icon) {
118: this .icon = icon;
119: }
120:
121: public String getTitle() {
122: if (title == null) {
123: title = getStringValue(this , "title");
124: }
125: return title;
126: }
127:
128: public void setTitle(String title) {
129: this .title = title;
130: }
131:
132: public void setTitleClass(String titleClass) {
133: this .titleClass = titleClass;
134: }
135:
136: public void setLink(String link) {
137: this .link = link;
138: }
139:
140: public String getIcon() {
141: if (icon == null) {
142: icon = getStringValue(this , "icon");
143: }
144: return icon;
145: }
146:
147: public String getLink() {
148: if (link == null) {
149: link = getStringValue(this , "link");
150: }
151: return link;
152: }
153:
154: public String getTitleClass() {
155: if (titleClass == null) {
156: titleClass = getStringValue(this , "titleClass");
157: }
158: return titleClass;
159: }
160:
161: /**
162: * {@inheritDoc}
163: */
164: @Override
165: public Object saveState(FacesContext facesContext) {
166: Object[] state = new Object[5];
167: state[0] = super .saveState(facesContext);
168: state[1] = icon;
169: state[2] = link;
170: state[3] = title;
171: state[4] = titleClass;
172: return state;
173: }
174:
175: /**
176: * {@inheritDoc}
177: */
178: @Override
179: public void restoreState(FacesContext facesContext, Object o) {
180: Object[] state = (Object[]) o;
181: super .restoreState(facesContext, state[0]);
182: icon = (String) state[1];
183: link = (String) state[2];
184: title = (String) state[3];
185: titleClass = (String) state[4];
186: }
187: }
|