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    }