/* * The contents of this file are subject to the GNU Lesser General Public * License Version 2.1 (the "License"); you may not use this file * except in compliance with the License. You may obtain a copy of * the License at http://www.gnu.org/copyleft/lesser.html * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * Developer: * Todd Ditchendorf, todd@ditchnet.org * */ /** * @author Todd Ditchendorf * @version 0.8 * @since 0.8 */ package org.ditchnet.jsp.taglib.tabs.handler; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import org.ditchnet.jsp.util.JspResponseWriter; import org.ditchnet.xml.Xhtml; import com.frameworkset.common.ecs.Script; import com.frameworkset.common.tag.BaseBodyTag; /** * @author Todd Ditchendorf * @since 0.8 * * JSP Tag that renders a collection of tabs. */ public final class TabContainerTag extends BaseBodyTag { public static final String COOKIE_PREFIX = "org.ditchnet.jsp.tabs"; private String id; private String skin; private List children; private String selectedTabPaneId; private String urlSelectedTabPaneId; // private int selectedIndex = -1; private String selectedIndex = null; // private int cookieSelectedIndex = -1; private String cookieSelectedIndex ; private String jsTabListener; JspResponseWriter out ; private boolean enablecookie = false; public void setId(final String id) { this.id = id; } public String getId() { return id; } public void setSkin(final String skin) { this.skin = skin.toLowerCase(); } public String getSkin() { if (null == skin || 0 == skin.length()) { skin = "default"; } return skin; } public void setSelectedTabPaneId(final String selectedTabPaneId) { this.selectedTabPaneId = selectedTabPaneId; } public String getSelectedTabPaneId() { return selectedTabPaneId; } void setSelectedIndex(final String selectedIndex) { this.selectedIndex = selectedIndex; } String getSelectedIndex() { return selectedIndex; } private void setCookieSelectedIndex(final String selectedIndex) { this.cookieSelectedIndex = selectedIndex; } private String getCookieSelectedIndex() { return cookieSelectedIndex; } private void setUrlSelectedTabPaneId(final String selectedId) { this.urlSelectedTabPaneId = selectedId; } private String getUrlSelectedTabPaneId() { return urlSelectedTabPaneId; } public void setJsTabListener(final String jsTabListener) { this.jsTabListener = jsTabListener; } public String getJsTabListener() { return jsTabListener; } List getChildren() { if (null == children) { children = new ArrayList(); } return children; } int getChildCount() { return getChildren().size(); } void addChild(final TabPane child) { getChildren().add(child); } public int doEndTag()throws JspException { return super.doEndTag(); } @Override public void doFinally() { children = null; selectedTabPaneId = null; urlSelectedTabPaneId = null; selectedIndex = null; cookieSelectedIndex = null; jsTabListener = null; this.enablecookie = false; // this.accesscontrol = null; // this.request = null; // this.response = null; // this.out = null; try { if(out != null) { out.close(); this.out = null; } } catch (Exception e) { } if(bodyContent != null) bodyContent.clearBody(); super.doFinally(); } // protected AccessControl accesscontrol; public void setPageContext(PageContext pageContext) { // System.out.println("setPageContext(PageContext pageContext)"); super.setPageContext(pageContext); // accesscontrol = AccessControl.getInstance(); // // accesscontrol.checkAccess(super.request,super.response,false); } public int doStartTag() throws JspException { //response.setHeader("Pragma", "no-cache"); int ret = super.doStartTag(); this.children = null; //consumeCookie(); return ret; } private boolean existSelectIndex() { /** * 容器已经处理空的情况 */ if(selectedIndex == null || selectedIndex.equals("")) return false; for(int i =0 ; i < this.children.size(); i ++) { TabPane pane = (TabPane)this.children.get(i); if(pane.getId().equals(this.selectedIndex)) return true; } return false; } public int doAfterBody() throws JspException{ if(children == null || children.size() == 0) { return SKIP_BODY; } // try { // getPreviousOut().clearBuffer(); // } catch (IOException e1) { // // TODO Auto-generated catch block // e1.printStackTrace(); // } // consumeCookie(); //consumeQueryStringParam(); // StringWriter discardResult = new StringWriter(); // StringWriter evalResult = new StringWriter(); out = new JspResponseWriter(); out.startElement(Xhtml.Tag.DIV); out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_SKIN_CLASS_NAME+getSkin()); out.startElement(Xhtml.Tag.DIV); out.attribute(Xhtml.Attr.ID,id); // out.attribute(Xhtml.Attr.ENABLECOOKIE,this.enablecookie + ""); out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_CONTAINER_CLASS_NAME); out.startElement(Xhtml.Tag.DIV); out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_WRAP_CLASS_NAME); //getJspBody().invoke(evalResult); String evalResult = bodyContent.getString(); bodyContent.clearBody(); // evalResult.getBuffer().delete(0,evalResult.getBuffer().length()); //determineSelectedIndex(); // children = null; // getJspBody().invoke(evalResult); int i = 0; for (Iterator iter = children.iterator(); iter.hasNext();) { TabPane tabPane = (TabPane)iter.next(); out.startElement(Xhtml.Tag.DIV); out.attribute(Xhtml.Attr.ID,tabPane.getId()+TabConstants.TAB_ID_SUFFIX); out.attribute(Xhtml.Attr.NAME,tabPane.getId()+TabConstants.TAB_ID_SUFFIX); if (null != getJsTabListener() && getJsTabListener().length() > 0) { out.attribute(Xhtml.Attr.ONCLICK, "org.ditchnet.jsp.TabUtils.tabClicked(event," + this.enablecookie +");" + getJsTabListener().trim() + "(new org.ditchnet.jsp.TabEvent(this));"); } else { out.attribute(Xhtml.Attr.ONCLICK, "org.ditchnet.jsp.TabUtils.tabClicked(event," + this.enablecookie +");"); } if (tabPane.getId().equals(getSelectedIndex())) { out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_CLASS_NAME + " " + TabConstants.FOCUSED_CLASS_NAME); } else { out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_CLASS_NAME + " " + TabConstants.UNFOCUSED_CLASS_NAME); } out.startElement(Xhtml.Tag.SPAN); out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_BG_LEFT_CLASS_NAME); out.text(" "); out.endElement(Xhtml.Tag.SPAN); out.startElement(Xhtml.Tag.A); out.attribute(Xhtml.Attr.ID,tabPane.getId()+TabConstants.TAB_A_ID_SUFFIX); out.attribute(Xhtml.Attr.HREF,getTabUrl(tabPane) + TabLinkTag.QUESTION_MARK + TabLinkTag.PARAM_NAME_TAB_PANE_ID + TabLinkTag.EQUALS + tabPane.getId()); if (null != getJsTabListener() && getJsTabListener().length() > 0) { out.attribute(Xhtml.Attr.ONCLICK, getJsTabListener().trim() + ";return false;"); } else { out.attribute(Xhtml.Attr.ONCLICK,"return false;"); } // out.attribute(Xhtml.Attr.ONCLICK,"return false;"); if (null != tabPane.getTabTitle() && 0 < tabPane.getTabTitle().length()) { out.text(tabPane.getTabTitle()); } out.text(" "); out.endElement(Xhtml.Tag.A); out.endElement(Xhtml.Tag.DIV); i++; } out.startElement(Xhtml.Tag.BR); out.attribute(Xhtml.Attr.CLASS,TabConstants.CLEAR_CLASS_NAME); out.endElement(Xhtml.Tag.BR); out.endElement(Xhtml.Tag.DIV); out.comment(TabConstants.TAB_WRAP_CLASS_NAME); out.startElement(Xhtml.Tag.DIV); out.attribute(Xhtml.Attr.CLASS,TabConstants.TAB_PANE_WRAP_CLASS_NAME); // out.text(evalResult.getBuffer().toString()); out.text(evalResult); out.endElement(Xhtml.Tag.DIV); out.comment(TabConstants.TAB_PANE_WRAP_CLASS_NAME); out.endElement(Xhtml.Tag.DIV); out.comment(TabConstants.TAB_CONTAINER_CLASS_NAME); out.endElement(Xhtml.Tag.DIV); out.comment(TabConstants.TAB_SKIN_CLASS_NAME+getSkin()); if(!existSelectIndex()) { TabPane pane = (TabPane)this.children.get(0); this.selectedIndex = pane.getId(); Script scr = new Script(); scr.setLanguage("javascript"); scr.setTagText("org.ditchnet.jsp.TabUtils.doclickevt(document.getElementById('" + pane.getId() +TabConstants.TAB_ID_SUFFIX + "'));"); // scr.setTagText("document.getElementById('" + pane.getId() +TabConstants.TAB_ID_SUFFIX + "').click();"); out.text(scr.toString()); } try { // this.getPreviousOut().print(out.getBuffer()); // bodyContent.getEnclosingWriter().print(out.getBuffer()); String ret = out.getBuffer().toString(); out = null; bodyContent.getEnclosingWriter().print(ret); // JspWriter out_ = this.getJspWriter(); // out_.print(ret); // out_.flush(); } catch (IOException e) { } return SKIP_BODY; } void determineSelectedIndex() { //check url first TabPane child; for (int i = 0; i < getChildCount(); i++) { child = (TabPane)getChildren().get(i); if (child.getId().equals(getUrlSelectedTabPaneId())) { // setSelectedIndex(child.getId()); setSelectedIndex(child.getId()); return; } } //then check cookie if(this.enablecookie) { if (getCookieSelectedIndex() != null && !getCookieSelectedIndex().equals("")) { setSelectedIndex(cookieSelectedIndex); return; } } //then check jsp tag attr // for (int i = 0; i < getChildCount(); i++) { // child = (TabPane)getChildren().get(i); // if (child.getId().equals(getSelectedTabPaneId())) { if(this.getSelectedTabPaneId() != null && !getSelectedTabPaneId().equals("")) setSelectedIndex(getSelectedTabPaneId()); else { this.setSelectedIndex(((TabPane)getChildren().get(0)).getId()); } return; // } // } } private String getTabUrl(final TabPane tabPane) { HttpServletRequest request = this.getHttpServletRequest(); // HttpSession session = request.getSession(false); return request.getRequestURL().toString(); } void consumeQueryStringParam() { HttpServletRequest request = this.getHttpServletRequest(); // HttpSession session = request.getSession(false); String tabPaneIdParamValue = request.getParameter( TabLinkTag.PARAM_NAME_TAB_PANE_ID ); if (null == tabPaneIdParamValue || 0 == tabPaneIdParamValue.length()) { return; } setUrlSelectedTabPaneId( tabPaneIdParamValue ); } void consumeCookie() { Cookie[] cookies = getPageCookies(); Cookie cookie; String prefix,value; for (int i = 0; i < cookies.length; i++) { cookie = cookies[i]; if (isDitchnetTabCookie(cookie)) { int index = cookie.getName().indexOf(":")+1; if (isCookieForThisContainer(cookie,index)) { try { // setCookieSelectedIndex( // Integer.parseInt(cookie.getValue())); setCookieSelectedIndex( cookie.getValue()); } catch (NumberFormatException e) { } } } } } private Cookie[] getPageCookies() { HttpServletRequest request = this.getHttpServletRequest(); // HttpSession session = request.getSession(false); Cookie[] cookies = request.getCookies(); if (null == cookies) { cookies = new Cookie[0]; } return cookies; } private boolean isDitchnetTabCookie(final Cookie cookie) { return 0 == cookie.getName().indexOf(COOKIE_PREFIX) ; } private boolean isCookieForThisContainer(final Cookie cookie, final int index) { return cookie.getName().substring(index).equals(getId()); } public boolean isEnablecookie() { return enablecookie; } public void setEnablecookie(boolean enablecookie) { this.enablecookie = enablecookie; } }