KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > ditchnet > jsp > taglib > tabs > handler > TabContainerTag


1 /*
2  * The contents of this file are subject to the GNU Lesser General Public
3  * License Version 2.1 (the "License"); you may not use this file
4  * except in compliance with the License. You may obtain a copy of
5  * the License at http://www.gnu.org/copyleft/lesser.html
6  *
7  * Software distributed under the License is distributed on an "AS
8  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
9  * implied. See the License for the specific language governing
10  * rights and limitations under the License.
11  *
12  * Developer:
13  * Todd Ditchendorf, todd@ditchnet.org
14  *
15  */

16
17 /**
18  * @author Todd Ditchendorf
19  * @version 0.8
20  * @since 0.8
21  */

22 package org.ditchnet.jsp.taglib.tabs.handler;
23
24 import java.io.StringWriter JavaDoc;
25 import java.io.IOException JavaDoc;
26 import java.util.List JavaDoc;
27 import java.util.ArrayList JavaDoc;
28 import java.util.Iterator JavaDoc;
29 import javax.servlet.http.Cookie JavaDoc;
30 import javax.servlet.http.HttpServletRequest JavaDoc;
31 import javax.servlet.jsp.JspWriter JavaDoc;
32 import javax.servlet.jsp.JspContext JavaDoc;
33 import javax.servlet.jsp.PageContext JavaDoc;
34 import javax.servlet.jsp.JspException JavaDoc;
35 import javax.servlet.jsp.tagext.JspFragment JavaDoc;
36 import javax.servlet.jsp.tagext.SimpleTagSupport JavaDoc;
37 import org.ditchnet.jsp.util.JspResponseWriter;
38 import org.ditchnet.xml.Xhtml;
39
40
41 /**
42  * @author Todd Ditchendorf
43  * @since 0.8
44  *
45  * JSP Tag that renders a collection of tabs.
46  */

47 public final class TabContainerTag extends SimpleTagSupport JavaDoc {
48     
49     public static final String JavaDoc COOKIE_PREFIX = "org.ditchnet.jsp.tabs";
50
51     private String JavaDoc id;
52     private String JavaDoc skin;
53     private List JavaDoc children;
54     private String JavaDoc selectedTabPaneId;
55     private String JavaDoc urlSelectedTabPaneId;
56     private int selectedIndex = 0;
57     private int cookieSelectedIndex = -1;
58     private String JavaDoc jsTabListener;
59     private JspResponseWriter out = new JspResponseWriter();
60     
61     public void setId(final String JavaDoc id) {
62         this.id = id;
63     }
64     
65     public String JavaDoc getId() {
66         return id;
67     }
68     
69     public void setSkin(final String JavaDoc skin) {
70         this.skin = skin.toLowerCase();
71     }
72     
73     public String JavaDoc getSkin() {
74         if (null == skin || 0 == skin.length()) {
75             skin = "default";
76         }
77         return skin;
78     }
79     
80     public void setSelectedTabPaneId(final String JavaDoc selectedTabPaneId) {
81         this.selectedTabPaneId = selectedTabPaneId;
82     }
83     
84     public String JavaDoc 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 JavaDoc selectedId) {
105         this.urlSelectedTabPaneId = selectedId;
106     }
107     
108     private String JavaDoc getUrlSelectedTabPaneId() {
109         return urlSelectedTabPaneId;
110     }
111     
112     public void setJsTabListener(final String JavaDoc jsTabListener) {
113         this.jsTabListener = jsTabListener;
114     }
115     
116     public String JavaDoc getJsTabListener() {
117         return jsTabListener;
118     }
119     
120     List JavaDoc getChildren() {
121         if (null == children) {
122             children = new ArrayList JavaDoc();
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 JavaDoc, IOException JavaDoc {
136         consumeCookie();
137         consumeQueryStringParam();
138                 
139         StringWriter JavaDoc discardResult = new StringWriter JavaDoc();
140         StringWriter JavaDoc evalResult = new StringWriter JavaDoc();
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 JavaDoc 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         //check url first
217
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         //then check cookie
226
if (getCookieSelectedIndex() > -1) {
227             setSelectedIndex(cookieSelectedIndex+1);
228             return;
229         }
230         //then check jsp tag attr
231
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 JavaDoc getTabUrl(final TabPaneTag tabPane) {
241         HttpServletRequest JavaDoc request = getRequest();
242         return request.getRequestURL().toString();
243     }
244     
245     private void consumeQueryStringParam() {
246         String JavaDoc 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 JavaDoc[] cookies = getPageCookies();
257         Cookie JavaDoc cookie;
258         String JavaDoc 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 JavaDoc e) { }
268                 }
269             }
270         }
271     }
272     
273     private HttpServletRequest JavaDoc getRequest() {
274         PageContext JavaDoc pageContext = (PageContext JavaDoc)getJspContext();
275         HttpServletRequest JavaDoc request =
276             (HttpServletRequest JavaDoc)pageContext.getRequest();
277         return request;
278     }
279     
280     private Cookie JavaDoc[] getPageCookies() {
281         Cookie JavaDoc[] cookies = getRequest().getCookies();
282         if (null == cookies) {
283             cookies = new Cookie JavaDoc[0];
284         }
285         return cookies;
286     }
287     
288     private boolean isDitchnetTabCookie(final Cookie JavaDoc cookie) {
289         return 0 == cookie.getName().indexOf(COOKIE_PREFIX) ;
290     }
291     
292     private boolean isCookieForThisContainer(final Cookie JavaDoc cookie,
293                                              final int index) {
294         return cookie.getName().substring(index).equals(getId());
295     }
296     
297 }
298
Popular Tags