KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tonbeller > wcf > tabbed > TabbedHandler


1 /*
2  * ====================================================================
3  * This software is subject to the terms of the Common Public License
4  * Agreement, available at the following URL:
5  * http://www.opensource.org/licenses/cpl.html .
6  * Copyright (C) 2003-2004 TONBELLER AG.
7  * All Rights Reserved.
8  * You must accept the terms of that agreement to use this software.
9  * ====================================================================
10  *
11  *
12  */

13 package com.tonbeller.wcf.tabbed;
14
15 import java.util.ArrayList JavaDoc;
16 import java.util.Iterator JavaDoc;
17 import java.util.List JavaDoc;
18
19 import javax.servlet.http.HttpSession JavaDoc;
20
21 import org.apache.log4j.Logger;
22 import org.w3c.dom.Element JavaDoc;
23 import org.w3c.dom.NodeList JavaDoc;
24
25 import com.tonbeller.wcf.controller.Controller;
26 import com.tonbeller.wcf.controller.Dispatcher;
27 import com.tonbeller.wcf.controller.DispatcherSupport;
28 import com.tonbeller.wcf.controller.RequestContext;
29 import com.tonbeller.wcf.controller.RequestListener;
30 import com.tonbeller.wcf.form.NodeHandler;
31 import com.tonbeller.wcf.form.XmlComponent;
32 import com.tonbeller.wcf.ui.XoplonCtrl;
33 import com.tonbeller.wcf.utils.DomUtils;
34
35 /**
36  * A <code>NodeHandler</code> that is associated with a &lt;tabbed&gt; element
37  * and manages visibility of its &lt;panel&gt; children.
38  *
39  * @author av
40  */

41 public class TabbedHandler implements NodeHandler, RequestListener {
42   private NodeList JavaDoc panels;
43   private Dispatcher dispatcher = new DispatcherSupport();
44   private static Logger logger = Logger.getLogger(TabbedHandler.class);
45   private Controller controller;
46   private XmlComponent xmlComponent;
47   private ArrayList JavaDoc panelChangeListeners = new ArrayList JavaDoc();
48   // null == all panels are hidden, none can be displayed
49
private Element JavaDoc currentPanel = null;
50   private Element JavaDoc tabbed = null;
51
52   public void initialize(RequestContext context, XmlComponent comp, Element JavaDoc tabbed) {
53     this.xmlComponent = comp;
54     this.tabbed = tabbed;
55     this.controller = Controller.instance(context.getSession());
56     controller.addRequestListener(dispatcher);
57     panels = tabbed.getElementsByTagName("xpanel");
58     for (int i = 0; i < panels.getLength(); i++) {
59       Element JavaDoc panel = (Element JavaDoc) panels.item(i);
60       RequestListener rl = new TabbedPanelListener(panel);
61       String JavaDoc id = panel.getAttribute("id");
62       dispatcher.addRequestListener(id, null, rl);
63
64       // hide tabs that the user is not allowed to see
65
String JavaDoc role = panel.getAttribute("role");
66       if (role.length() > 0 && !context.isUserInRole(role))
67         XoplonCtrl.setHidden(panel, true);
68       if ("true".equals(panel.getAttribute("current")))
69         currentPanel = panel;
70     }
71   }
72
73   public void destroy(HttpSession JavaDoc session) {
74     dispatcher.clear();
75     controller.removeRequestListener(dispatcher);
76     controller = null;
77   }
78
79   public void request(RequestContext context) throws Exception JavaDoc {
80     dispatcher.request(context);
81   }
82
83   /** does nothing */
84   public void render(RequestContext context) throws Exception JavaDoc {
85   }
86
87   public void addPanelChangedListener(PanelChangeListener l) {
88     panelChangeListeners.add(l);
89   }
90
91   public void removePanelChangedListener(PanelChangeListener l) {
92     panelChangeListeners.remove(l);
93   }
94
95   protected void fireChanged(Element JavaDoc currentPanel) {
96     if (panelChangeListeners.size() > 0) {
97       PanelChangeEvent event = new PanelChangeEvent(this, currentPanel);
98       List JavaDoc copy = (List JavaDoc) panelChangeListeners.clone();
99       for (Iterator JavaDoc it = copy.iterator(); it.hasNext();)
100         ((PanelChangeListener) it.next()).panelChanged(event);
101     }
102   }
103
104   /**
105    * sets the current panel. If the panel is hidden, the hidden attribute is
106    * removed (the panel will be visible). Fires a PanelChangeEvent.
107    *
108    * @param context
109    * @param currentId
110    */

111   public void setCurrentPanel(RequestContext context, Element JavaDoc newCurrentPanel) {
112     if (!xmlComponent.validate(context))
113       return;
114     internalSetCurrent(newCurrentPanel);
115     // allow the panel hander to update model values
116
fireChanged(currentPanel);
117     // and now display the updated model values
118
xmlComponent.revert(context);
119   }
120
121   private void internalSetCurrent(Element JavaDoc newCurrentPanel) {
122     // remove current attribute
123
if (currentPanel != null) {
124       DomUtils.removeAttribute(currentPanel, "current");
125       currentPanel.setAttribute("children-hidden", "true");
126     }
127     // set current attribute
128
currentPanel = newCurrentPanel;
129     if (currentPanel != null) {
130       currentPanel.setAttribute("current", "true");
131       DomUtils.removeAttribute(currentPanel, "children-hidden");
132       // current panel must be visible
133
XoplonCtrl.setHidden(currentPanel, false);
134     }
135   }
136
137   /**
138    * hides or unhides the panel with panelId. If the current
139    * panel gets hidden, the first non-hidden panel will become
140    * the current panel.
141    * <p />
142    * If the panel contains a <code>role</code> attribute, the call
143    * is ignored unless the current user is a member of that role.
144    *
145    * @param context
146    * @param panelId
147    */

148   public void setHidden(RequestContext context, Element JavaDoc panel, boolean hidden) {
149     String JavaDoc role = panel.getAttribute("role");
150     if (!context.isUserInRole(role))
151       return;
152     
153     XoplonCtrl.setHidden(panel, hidden);
154     if (hidden && panel.equals(currentPanel)) {
155       // dont fire events yet
156
internalSetCurrent(null);
157       panels = tabbed.getElementsByTagName("xpanel");
158       for (int i = 0; i < panels.getLength(); i++) {
159         Element JavaDoc e = (Element JavaDoc) panels.item(i);
160         if (!XoplonCtrl.isHidden(e)) {
161           // found new current, fire events now
162
setCurrentPanel(context, e);
163           break;
164         }
165       }
166     } else if (!hidden && currentPanel == null) {
167       // all panels have been hidden, show this one
168
setCurrentPanel(context, panel);
169     }
170   }
171
172   class TabbedPanelListener implements RequestListener {
173     private Element JavaDoc panel;
174
175     TabbedPanelListener(Element JavaDoc panel) {
176       this.panel = panel;
177     }
178
179     public void request(RequestContext context) throws Exception JavaDoc {
180       setCurrentPanel(context, panel);
181     }
182   }
183
184   /**
185    * returns the NodeHandler for the panel or null if there was no NodeHandler.
186    * NodeHandlers are registered via the <code>handler</code> attribute in the
187    * XML file describing the form.
188    *
189    * @param panelId
190    * id attribute of the panel element
191    * @return the node handler or null
192    */

193   public NodeHandler getPanelHandler(String JavaDoc panelId) {
194     return xmlComponent.getHandler(panelId);
195   }
196
197 }
Popular Tags