1 13 package com.tonbeller.wcf.tabbed; 14 15 import java.util.ArrayList ; 16 import java.util.Iterator ; 17 import java.util.List ; 18 19 import javax.servlet.http.HttpSession ; 20 21 import org.apache.log4j.Logger; 22 import org.w3c.dom.Element ; 23 import org.w3c.dom.NodeList ; 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 41 public class TabbedHandler implements NodeHandler, RequestListener { 42 private NodeList 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 panelChangeListeners = new ArrayList (); 48 private Element currentPanel = null; 50 private Element tabbed = null; 51 52 public void initialize(RequestContext context, XmlComponent comp, Element 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 panel = (Element ) panels.item(i); 60 RequestListener rl = new TabbedPanelListener(panel); 61 String id = panel.getAttribute("id"); 62 dispatcher.addRequestListener(id, null, rl); 63 64 String 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 session) { 74 dispatcher.clear(); 75 controller.removeRequestListener(dispatcher); 76 controller = null; 77 } 78 79 public void request(RequestContext context) throws Exception { 80 dispatcher.request(context); 81 } 82 83 84 public void render(RequestContext context) throws Exception { 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 currentPanel) { 96 if (panelChangeListeners.size() > 0) { 97 PanelChangeEvent event = new PanelChangeEvent(this, currentPanel); 98 List copy = (List ) panelChangeListeners.clone(); 99 for (Iterator it = copy.iterator(); it.hasNext();) 100 ((PanelChangeListener) it.next()).panelChanged(event); 101 } 102 } 103 104 111 public void setCurrentPanel(RequestContext context, Element newCurrentPanel) { 112 if (!xmlComponent.validate(context)) 113 return; 114 internalSetCurrent(newCurrentPanel); 115 fireChanged(currentPanel); 117 xmlComponent.revert(context); 119 } 120 121 private void internalSetCurrent(Element newCurrentPanel) { 122 if (currentPanel != null) { 124 DomUtils.removeAttribute(currentPanel, "current"); 125 currentPanel.setAttribute("children-hidden", "true"); 126 } 127 currentPanel = newCurrentPanel; 129 if (currentPanel != null) { 130 currentPanel.setAttribute("current", "true"); 131 DomUtils.removeAttribute(currentPanel, "children-hidden"); 132 XoplonCtrl.setHidden(currentPanel, false); 134 } 135 } 136 137 148 public void setHidden(RequestContext context, Element panel, boolean hidden) { 149 String role = panel.getAttribute("role"); 150 if (!context.isUserInRole(role)) 151 return; 152 153 XoplonCtrl.setHidden(panel, hidden); 154 if (hidden && panel.equals(currentPanel)) { 155 internalSetCurrent(null); 157 panels = tabbed.getElementsByTagName("xpanel"); 158 for (int i = 0; i < panels.getLength(); i++) { 159 Element e = (Element ) panels.item(i); 160 if (!XoplonCtrl.isHidden(e)) { 161 setCurrentPanel(context, e); 163 break; 164 } 165 } 166 } else if (!hidden && currentPanel == null) { 167 setCurrentPanel(context, panel); 169 } 170 } 171 172 class TabbedPanelListener implements RequestListener { 173 private Element panel; 174 175 TabbedPanelListener(Element panel) { 176 this.panel = panel; 177 } 178 179 public void request(RequestContext context) throws Exception { 180 setCurrentPanel(context, panel); 181 } 182 } 183 184 193 public NodeHandler getPanelHandler(String panelId) { 194 return xmlComponent.getHandler(panelId); 195 } 196 197 } | Popular Tags |