001 package org.apache.myfaces.tobago.example.demo;
002
003 /*
004 * Licensed to the Apache Software Foundation (ASF) under one or more
005 * contributor license agreements. See the NOTICE file distributed with
006 * this work for additional information regarding copyright ownership.
007 * The ASF licenses this file to You under the Apache License, Version 2.0
008 * (the "License"); you may not use this file except in compliance with
009 * the License. You may obtain a copy of the License at
010 *
011 * http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019
020 import org.apache.commons.logging.Log;
021 import org.apache.commons.logging.LogFactory;
022 import org.apache.myfaces.tobago.context.ResourceManagerUtil;
023 import org.apache.myfaces.tobago.example.demo.jsp.JspFormatter;
024 import org.apache.myfaces.tobago.model.TreeState;
025
026 import javax.faces.context.ExternalContext;
027 import javax.faces.context.FacesContext;
028 import javax.servlet.http.HttpServletResponse;
029 import javax.swing.tree.DefaultMutableTreeNode;
030 import java.io.IOException;
031 import java.io.InputStream;
032 import java.io.InputStreamReader;
033 import java.io.PrintWriter;
034 import java.util.Enumeration;
035
036 /*
037 * User: lofwyr
038 * Date: 09.01.2007
039 * Time: 10:41:49
040 */
041 public class Navigation {
042
043 private static final Log LOG = LogFactory.getLog(Navigation.class);
044
045 private DefaultMutableTreeNode tree;
046
047 private TreeState state;
048
049 public Navigation() {
050
051 tree = new DefaultMutableTreeNode(new Node("Root", null));
052
053 DefaultMutableTreeNode overview = new DefaultMutableTreeNode(new Node("overview", "overview/intro"));
054 // overview.add(new DefaultMutableTreeNode(new Node("intro", "overview/intro")));
055 overview.add(new DefaultMutableTreeNode(new Node("basic", "overview/basic")));
056 overview.add(new DefaultMutableTreeNode(new Node("sheet", "overview/sheet")));
057 overview.add(new DefaultMutableTreeNode(new Node("tree", "overview/tree")));
058 overview.add(new DefaultMutableTreeNode(new Node("tab", "overview/tab")));
059 overview.add(new DefaultMutableTreeNode(new Node("toolbar", "overview/toolbar")));
060 overview.add(new DefaultMutableTreeNode(new Node("validation", "overview/validation")));
061 overview.add(new DefaultMutableTreeNode(new Node("form", "overview/form")));
062 overview.add(new DefaultMutableTreeNode(new Node("themes", "overview/themes")));
063 overview.add(new DefaultMutableTreeNode(new Node("browser", "overview/browser")));
064 overview.add(new DefaultMutableTreeNode(new Node("locale", "overview/locale")));
065 overview.add(new DefaultMutableTreeNode(new Node("layout", "overview/layout")));
066 tree.add(overview);
067
068 DefaultMutableTreeNode bestPractice = new DefaultMutableTreeNode(new Node("bestPractice", "best-practice/intro"));
069 bestPractice.add(new DefaultMutableTreeNode(new Node("error", "best-practice/error")));
070 bestPractice.add(new DefaultMutableTreeNode(new Node("theme", "best-practice/theme")));
071 bestPractice.add(new DefaultMutableTreeNode(new Node("transition", "best-practice/transition")));
072 bestPractice.add(new DefaultMutableTreeNode(new Node("nonFacesResponse", "best-practice/non-faces-response")));
073 bestPractice.add(new DefaultMutableTreeNode(new Node("forEach", "best-practice/for-each")));
074 tree.add(bestPractice);
075
076 DefaultMutableTreeNode reference = new DefaultMutableTreeNode(new Node("reference_intro", "reference/intro"));
077 reference.add(new DefaultMutableTreeNode(new Node("reference_command", "reference/command")));
078 reference.add(new DefaultMutableTreeNode(new Node("reference_container", "reference/container")));
079 reference.add(new DefaultMutableTreeNode(new Node("reference_input", "reference/input")));
080 reference.add(new DefaultMutableTreeNode(new Node("reference_menu", "reference/menu")));
081 reference.add(new DefaultMutableTreeNode(new Node("reference_output", "reference/output")));
082 reference.add(new DefaultMutableTreeNode(new Node("reference_object", "reference/object")));
083 reference.add(new DefaultMutableTreeNode(new Node("reference_popup", "reference/popup")));
084 reference.add(new DefaultMutableTreeNode(new Node("reference_progress", "reference/progress")));
085 reference.add(new DefaultMutableTreeNode(new Node("reference_select", "reference/select")));
086 reference.add(new DefaultMutableTreeNode(new Node("reference_sheet", "reference/sheet")));
087 reference.add(new DefaultMutableTreeNode(new Node("reference_tab", "reference/tab")));
088 reference.add(new DefaultMutableTreeNode(new Node("reference_time", "reference/time")));
089 reference.add(new DefaultMutableTreeNode(new Node("reference_tool", "reference/tool")));
090 reference.add(new DefaultMutableTreeNode(new Node("reference_partial", "reference/partial")));
091 reference.add(new DefaultMutableTreeNode(new Node("reference_upload", "reference/upload")));
092 tree.add(reference);
093
094 state = new TreeState();
095 state.expand(tree, 1);
096 state.expand(overview, 1);
097 state.expand(bestPractice, 1);
098 state.setMarker(overview);
099 }
100
101 public String navigate() {
102 Node selected = (Node) state.getMarker().getUserObject();
103 return selected.getOutcome();
104 }
105
106 public void updateMarker(String viewId) {
107 Enumeration enumeration = tree.depthFirstEnumeration();
108 while (enumeration.hasMoreElements()) {
109 DefaultMutableTreeNode maybeMarker = ((DefaultMutableTreeNode) enumeration.nextElement());
110 Node node = (Node) maybeMarker.getUserObject();
111 if (node.getOutcome() != null && viewId.contains(node.getOutcome())) {
112 state.setMarker(maybeMarker);
113 break;
114 }
115 }
116 }
117
118 public DefaultMutableTreeNode getTree() {
119 return tree;
120 }
121
122 public void setTree(DefaultMutableTreeNode tree) {
123 this.tree = tree;
124 }
125
126 public TreeState getState() {
127 return state;
128 }
129
130 public void setState(TreeState state) {
131 this.state = state;
132 }
133
134 public String gotoFirst() {
135 DefaultMutableTreeNode first = tree.getNextNode();
136 state.setMarker(first);
137 return ((Node) first.getUserObject()).getOutcome();
138 }
139
140 public String gotoPrevious() {
141 DefaultMutableTreeNode previousNode = state.getMarker().getPreviousNode();
142 if (previousNode != null) {
143 state.setMarker(previousNode);
144 return ((Node) previousNode.getUserObject()).getOutcome();
145 }
146 return null;
147 }
148
149 public String gotoNext() {
150 DefaultMutableTreeNode nextNode = state.getMarker().getNextNode();
151 if (nextNode != null) {
152 state.setMarker(nextNode);
153 return ((Node) nextNode.getUserObject()).getOutcome();
154 }
155 return null;
156 }
157
158 public boolean isFirst() {
159 return state.getMarker().getPreviousNode().isRoot();
160 }
161
162 public boolean isLast() {
163 return state.getMarker().getNextNode() == null;
164 }
165
166 public String viewSource() {
167 FacesContext facesContext = FacesContext.getCurrentInstance();
168 ExternalContext externalContext = facesContext.getExternalContext();
169 String viewId = facesContext.getViewRoot().getViewId();
170 HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();
171 response.setContentType("text/html;charset=UTF-8");
172
173 try {
174 InputStream resourceAsStream = externalContext.getResourceAsStream(viewId);
175 InputStreamReader reader = new InputStreamReader(resourceAsStream);
176 JspFormatter.writeJsp(reader, new PrintWriter(response.getOutputStream()));
177 } catch (IOException e) {
178 LOG.error("", e);
179 return "error";
180 }
181
182 facesContext.responseComplete();
183 return null;
184 }
185
186 public static class Node {
187
188 private String title;
189 private String id;
190 private String outcome;
191
192
193 public Node(String key, String outcome) {
194 this.title = ResourceManagerUtil.getProperty(
195 FacesContext.getCurrentInstance(), "overview", key);
196 this.id = key;
197 this.outcome = outcome;
198 }
199
200 public String getTitle() {
201 return title;
202 }
203
204 public void setTitle(String title) {
205 this.title = title;
206 }
207
208 public String getId() {
209 return id;
210 }
211
212 public void setId(String id) {
213 this.id = id;
214 }
215
216 public String getOutcome() {
217 return outcome;
218 }
219
220 public void setOutcome(String outcome) {
221 this.outcome = outcome;
222 }
223 }
224 }