1 16 17 22 package org.ditchnet.jsp.taglib.tabs.handler; 23 24 import java.io.StringWriter ; 25 import java.io.IOException ; 26 import java.util.List ; 27 import java.util.ArrayList ; 28 import java.util.Iterator ; 29 import javax.servlet.http.Cookie ; 30 import javax.servlet.http.HttpServletRequest ; 31 import javax.servlet.jsp.JspWriter ; 32 import javax.servlet.jsp.JspContext ; 33 import javax.servlet.jsp.PageContext ; 34 import javax.servlet.jsp.JspException ; 35 import javax.servlet.jsp.tagext.JspFragment ; 36 import javax.servlet.jsp.tagext.SimpleTagSupport ; 37 import org.ditchnet.jsp.util.JspResponseWriter; 38 import org.ditchnet.xml.Xhtml; 39 40 41 47 public final class TabContainerTag extends SimpleTagSupport { 48 49 public static final String COOKIE_PREFIX = "org.ditchnet.jsp.tabs"; 50 51 private String id; 52 private String skin; 53 private List children; 54 private String selectedTabPaneId; 55 private String urlSelectedTabPaneId; 56 private int selectedIndex = 0; 57 private int cookieSelectedIndex = -1; 58 private String jsTabListener; 59 private JspResponseWriter out = new JspResponseWriter(); 60 61 public void setId(final String id) { 62 this.id = id; 63 } 64 65 public String getId() { 66 return id; 67 } 68 69 public void setSkin(final String skin) { 70 this.skin = skin.toLowerCase(); 71 } 72 73 public String getSkin() { 74 if (null == skin || 0 == skin.length()) { 75 skin = "default"; 76 } 77 return skin; 78 } 79 80 public void setSelectedTabPaneId(final String selectedTabPaneId) { 81 this.selectedTabPaneId = selectedTabPaneId; 82 } 83 84 public String getSelectedTabPaneId() { 85 return selectedTabPaneId; 86 } 87 88 void setSelectedIndex(final int selectedIndex) { 89 this.selectedIndex = selectedIndex - 1; 90 } 91 92 int getSelectedIndex() { 93 return selectedIndex; 94 } 95 96 private void setCookieSelectedIndex(final int selectedIndex) { 97 this.cookieSelectedIndex = selectedIndex; 98 } 99 100 private int getCookieSelectedIndex() { 101 return cookieSelectedIndex; 102 } 103 104 private void setUrlSelectedTabPaneId(final String selectedId) { 105 this.urlSelectedTabPaneId = selectedId; 106 } 107 108 private String getUrlSelectedTabPaneId() { 109 return urlSelectedTabPaneId; 110 } 111 112 public void setJsTabListener(final String jsTabListener) { 113 this.jsTabListener = jsTabListener; 114 } 115 116 public String getJsTabListener() { 117 return jsTabListener; 118 } 119 120 List getChildren() { 121 if (null == children) { 122 children = new ArrayList (); 123 } 124 return children; 125 } 126 127 int getChildCount() { 128 return getChildren().size(); 129 } 130 131 void addChild(final TabPaneTag child) { 132 getChildren().add(child); 133 } 134 135 public void doTag() throws JspException , IOException { 136 consumeCookie(); 137 consumeQueryStringParam(); 138 139 StringWriter discardResult = new StringWriter (); 140 StringWriter evalResult = new StringWriter (); 141 142 out.startElement(Xhtml.Tag.DIV); 143 out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_SKIN_CLASS_NAME+getSkin()); 144 out.startElement(Xhtml.Tag.DIV); 145 out.attribute(Xhtml.Attr.ID,id); 146 out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_CONTAINER_CLASS_NAME); 147 out.startElement(Xhtml.Tag.DIV); 148 out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_WRAP_CLASS_NAME); 149 150 getJspBody().invoke(evalResult); 151 evalResult.getBuffer().delete(0,evalResult.getBuffer().length()); 152 determineSelectedIndex(); 153 children = null; 154 getJspBody().invoke(evalResult); 155 156 int i = 0; 157 for (Iterator iter = children.iterator(); iter.hasNext();) { 158 TabPaneTag tabPane = (TabPaneTag)iter.next(); 159 out.startElement(Xhtml.Tag.DIV); 160 out.attribute(Xhtml.Attr.ID,tabPane.getId()+TabConstants.TAB_ID_SUFFIX); 161 if (null != getJsTabListener() && getJsTabListener().length() > 0) { 162 out.attribute(Xhtml.Attr.ONCLICK, 163 "org.ditchnet.jsp.TabUtils.tabClicked(event);" + 164 getJsTabListener().trim() + "(new org.ditchnet.jsp.TabEvent(this));"); 165 } else { 166 out.attribute(Xhtml.Attr.ONCLICK, 167 "org.ditchnet.jsp.TabUtils.tabClicked(event);"); 168 } 169 if (i == getSelectedIndex()) { 170 out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_CLASS_NAME + " " + 171 TabConstants.FOCUSED_CLASS_NAME); 172 } else { 173 out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_CLASS_NAME + " " + 174 TabConstants.UNFOCUSED_CLASS_NAME); 175 } 176 out.startElement(Xhtml.Tag.SPAN); 177 out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_BG_LEFT_CLASS_NAME); 178 out.text(" "); 179 out.endElement(Xhtml.Tag.SPAN); 180 out.startElement(Xhtml.Tag.A); 181 out.attribute(Xhtml.Attr.HREF,getTabUrl(tabPane) + 182 TabLinkTag.QUESTION_MARK + 183 TabLinkTag.PARAM_NAME_TAB_PANE_ID + 184 TabLinkTag.EQUALS + 185 tabPane.getId()); 186 out.attribute(Xhtml.Attr.ONCLICK,"return false;"); 187 188 if (null != tabPane.getTabTitle() && 189 0 < tabPane.getTabTitle().length()) { 190 out.text(tabPane.getTabTitle()); 191 } 192 out.text(" "); 193 out.endElement(Xhtml.Tag.A); 194 out.endElement(Xhtml.Tag.DIV); 195 i++; 196 } 197 out.startElement(Xhtml.Tag.BR); 198 out.attribute(Xhtml.Attr.CLASS,TabConstants.CLEAR_CLASS_NAME); 199 out.endElement(Xhtml.Tag.BR); 200 out.endElement(Xhtml.Tag.DIV); 201 out.comment(TabConstants.TAB_WRAP_CLASS_NAME); 202 out.startElement(Xhtml.Tag.DIV); 203 out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_PANE_WRAP_CLASS_NAME); 204 out.text(evalResult.getBuffer().toString()); 205 out.endElement(Xhtml.Tag.DIV); 206 out.comment(TabConstants.TAB_PANE_WRAP_CLASS_NAME); 207 out.endElement(Xhtml.Tag.DIV); 208 out.comment(TabConstants.TAB_CONTAINER_CLASS_NAME); 209 out.endElement(Xhtml.Tag.DIV); 210 out.comment(TabConstants.TAB_SKIN_CLASS_NAME+getSkin()); 211 212 getJspContext().getOut().print(out.getBuffer()); 213 } 214 215 private void determineSelectedIndex() { 216 TabPaneTag child; 218 for (int i = 0; i < getChildCount(); i++) { 219 child = (TabPaneTag)getChildren().get(i); 220 if (child.getId().equals(getUrlSelectedTabPaneId())) { 221 setSelectedIndex(i+1); 222 return; 223 } 224 } 225 if (getCookieSelectedIndex() > -1) { 227 setSelectedIndex(cookieSelectedIndex+1); 228 return; 229 } 230 for (int i = 0; i < getChildCount(); i++) { 232 child = (TabPaneTag)getChildren().get(i); 233 if (child.getId().equals(getSelectedTabPaneId())) { 234 setSelectedIndex(i+1); 235 return; 236 } 237 } 238 } 239 240 private String getTabUrl(final TabPaneTag tabPane) { 241 HttpServletRequest request = getRequest(); 242 return request.getRequestURL().toString(); 243 } 244 245 private void consumeQueryStringParam() { 246 String tabPaneIdParamValue = getRequest().getParameter( 247 TabLinkTag.PARAM_NAME_TAB_PANE_ID ); 248 if (null == tabPaneIdParamValue 249 || 0 == tabPaneIdParamValue.length()) { 250 return; 251 } 252 setUrlSelectedTabPaneId( tabPaneIdParamValue ); 253 } 254 255 private void consumeCookie() { 256 Cookie [] cookies = getPageCookies(); 257 Cookie cookie; 258 String prefix,value; 259 for (int i = 0; i < cookies.length; i++) { 260 cookie = cookies[i]; 261 if (isDitchnetTabCookie(cookie)) { 262 int index = cookie.getName().indexOf(":")+1; 263 if (isCookieForThisContainer(cookie,index)) { 264 try { 265 setCookieSelectedIndex( 266 Integer.parseInt(cookie.getValue())); 267 } catch (NumberFormatException e) { } 268 } 269 } 270 } 271 } 272 273 private HttpServletRequest getRequest() { 274 PageContext pageContext = (PageContext )getJspContext(); 275 HttpServletRequest request = 276 (HttpServletRequest )pageContext.getRequest(); 277 return request; 278 } 279 280 private Cookie [] getPageCookies() { 281 Cookie [] cookies = getRequest().getCookies(); 282 if (null == cookies) { 283 cookies = new Cookie [0]; 284 } 285 return cookies; 286 } 287 288 private boolean isDitchnetTabCookie(final Cookie cookie) { 289 return 0 == cookie.getName().indexOf(COOKIE_PREFIX) ; 290 } 291 292 private boolean isCookieForThisContainer(final Cookie cookie, 293 final int index) { 294 return cookie.getName().substring(index).equals(getId()); 295 } 296 297 } 298 | Popular Tags |