001: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
002: // Released under the terms of the GNU General Public License version 2 or later.
003: package fitnesse.wikitext.widgets;
004:
005: import java.util.LinkedList;
006: import java.util.List;
007:
008: import fitnesse.wikitext.WidgetBuilder;
009: import fitnesse.wikitext.WidgetVisitor;
010: import fitnesse.wikitext.WikiWidget;
011:
012: public abstract class ParentWidget extends WikiWidget {
013: protected LinkedList children = new LinkedList();
014: private int currentChild = 0;
015:
016: public ParentWidget(ParentWidget parent) {
017: super (parent);
018: }
019:
020: public void reset() {
021: children.clear();
022: currentChild = 0;
023: }
024:
025: public void addChild(WikiWidget widget) {
026: children.add(widget);
027: }
028:
029: public int numberOfChildren() {
030: return children.size();
031: }
032:
033: public List getChildren() {
034: return children;
035: }
036:
037: public WikiWidget nextChild() {
038: if (hasNextChild())
039: return (WikiWidget) children.get(currentChild++);
040: else
041: throw new ArrayIndexOutOfBoundsException(
042: "No next child exists");
043: }
044:
045: public boolean hasNextChild() {
046: return (currentChild < numberOfChildren());
047: }
048:
049: public String childHtml() throws Exception {
050: currentChild = 0;
051: StringBuffer html = new StringBuffer();
052: while (hasNextChild()) {
053: WikiWidget child = nextChild();
054: html.append(child.render());
055: }
056:
057: return html.toString();
058: }
059:
060: public String childWikiText() throws Exception {
061: currentChild = 0;
062: StringBuffer wikiText = new StringBuffer();
063: while (hasNextChild()) {
064: WikiWidget child = nextChild();
065: wikiText.append(child.asWikiText());
066: }
067:
068: return wikiText.toString();
069:
070: }
071:
072: public int defineLiteral(String literal) {
073: return parent.defineLiteral(literal);
074: }
075:
076: public String getLiteral(int literalNumber) {
077: return parent.getLiteral(literalNumber);
078: }
079:
080: public void addVariable(String key, String value) {
081: parent.addVariable(key, value);
082: }
083:
084: public String getVariable(String key) throws Exception {
085: return parent.getVariable(key);
086: }
087:
088: public void addChildWidgets(String value) throws Exception {
089: getBuilder().addChildWidgets(value, this );
090: }
091:
092: public WidgetBuilder getBuilder() {
093: return parent.getBuilder();
094: }
095:
096: public boolean doEscaping() {
097: return parent.doEscaping();
098: }
099:
100: public boolean preProcessingComplete() {
101: return (children.size() == 1 && (children.get(0) instanceof TextWidget));
102: }
103:
104: public void acceptVisitor(WidgetVisitor visitor) throws Exception {
105: visitor.visit(this );
106: currentChild = 0;
107: while (hasNextChild()) {
108: WikiWidget child = nextChild();
109: child.acceptVisitor(visitor);
110: }
111: }
112:
113: public String processLiterals(String value) throws Exception {
114: return new LiteralProcessingWidgetRoot(this , value).childHtml();
115: }
116:
117: public static WidgetBuilder preprocessingLiteralWidgetBuilder = new WidgetBuilder(
118: new Class[] { PreProcessorLiteralWidget.class });
119:
120: public static class LiteralProcessingWidgetRoot extends
121: ParentWidget {
122: public LiteralProcessingWidgetRoot(ParentWidget parent,
123: String content) throws Exception {
124: super (parent);
125: if (content != null)
126: addChildWidgets(content);
127: }
128:
129: public WidgetBuilder getBuilder() {
130: return preprocessingLiteralWidgetBuilder;
131: }
132:
133: public boolean doEscaping() {
134: return false;
135: }
136:
137: public String render() throws Exception {
138: return "";
139: }
140:
141: protected void addToParent() {
142: }
143: }
144: }
|