package com.frameworkset.common.tag.contextmenu; import java.util.Iterator; import java.util.List; import java.util.Set; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.jsp.JspException; import bboss.org.apache.velocity.Template; import bboss.org.apache.velocity.VelocityContext; import bboss.org.apache.velocity.exception.MethodInvocationException; import bboss.org.apache.velocity.exception.ParseErrorException; import bboss.org.apache.velocity.exception.ResourceNotFoundException; import com.frameworkset.common.tag.BaseTag; import com.frameworkset.common.tag.pager.config.PageConfig; import com.frameworkset.util.VelocityUtil; /** * * <p>Title: com.frameworkset.common.tag.contextmenu.ContextMenuTag.java</p> * * <p>Description: </p> * * <p>Copyright: Copyright (c) 2007</p> * * <p>Company: chinacreator</p> * @Date 2006-9-15 * @author biaoping.yin * @version 1.0 */ public class ContextMenuTag extends BaseTag { private static final String menuScript = "contextmenu/popmenu.vm"; private static final String parentmenuScript = "contextmenu/parentpopmenu.vm"; private String parent_indent ; /** * 是否jquery装载,true-是,false-不是 默认值:false; 为false时,标签库将自动为页面引入以下样式和脚本,否则不导入 true时,上述样式和脚本将通过外部导入 */ protected boolean jquery = false; // protected boolean istreemenu = false; //private boolean flag = true; /** * contextmenu缓冲的key */ private String context = null; /** * contextmenu对象缓冲的范围: * request 缺省值 * session * pageContext */ private String scope = "request"; /** * */ private static final long serialVersionUID = 1L; public int doEndTag() throws JspException { HttpServletRequest request = getHttpServletRequest(); // HttpSession session = request.getSession(false) ; parent_indent = request.getParameter("node_parent_indent"); if(!isEnablecontextmenu()) return EVAL_PAGE; ContextMenu contextMenu = getContextMenu(); if(contextMenu == null) { return EVAL_PAGE; } StringBuilder buffer = new StringBuilder(); StringBuilder scriptbuffer = new StringBuilder(); String popscript = ""; if(parent_indent == null || parent_indent.equals("")) { // String enablecontextmenu_flag = (String)request.getAttribute(PageConfig.popscript_set_flag); // if(enablecontextmenu_flag != null && enablecontextmenu_flag.equals("true"))//启用右键菜单,如果脚本还没有有输出,则输出并设置属性为true,否则不做处理 // { // // } // else // { if(!this.isJquery()) { popscript = PageConfig.getPopScript(request, enablecontextmenu); } // buffer.append(popscript); // } contextMenu.mergeContextMenus(); Set contextmenus = contextMenu.getContextmenus(); buildMenus(buffer,scriptbuffer,contextmenus); } else { Set contextmenus = contextMenu.getNodeContextmenus(); buildMenus(buffer,scriptbuffer,contextmenus); } try { Template template = null; if(parent_indent == null || parent_indent.equals("")) { template = VelocityUtil.getTemplate(menuScript); VelocityContext context = new VelocityContext(); context.put("contextpath",request.getContextPath()); context.put("popscript",popscript); context.put("initscript",scriptbuffer.toString()); context.put("menus",buffer.toString()); template.merge(context,out); } else { template = VelocityUtil.getTemplate(parentmenuScript); VelocityContext context = new VelocityContext(); context.put("contextpath",request.getContextPath()); context.put("initscript",scriptbuffer.toString()); context.put("menus",buffer.toString()); template.merge(context,out); } jquery = false; this.parent_indent = null; } catch (ResourceNotFoundException e) { this.parent_indent = null; e.printStackTrace(); } catch (ParseErrorException e) { this.parent_indent = null; e.printStackTrace(); } catch (MethodInvocationException e) { this.parent_indent = null; e.printStackTrace(); } catch (Exception e) { this.parent_indent = null; e.printStackTrace(); } // System.out.println("************************************************"); //reset(contextMenu); return super.doEndTag(); } private void buildMenus(StringBuilder buffer,StringBuilder scriptbuffer,Set contextmenus) { for(Iterator it = contextmenus.iterator(); it.hasNext(); ) { Menu menu = (Menu)it.next(); buildMenu(buffer,scriptbuffer,menu,true); } // if( parent_indent != null) // { // scriptbuffer.append(" $.parser.parse();"); // } } // /** // * 构建右键菜单 // * @param menuid // * @param buffer // * @param menu // */ // private void buildMenu(String menuid,StringBuilder buffer,Menu menu) // { // // buffer.append(" var menu_"+menuid+" = new Menu();\n "); // buffer.append("menu_"+menuid+".BuildMenu(\""+menu.getIdentity()+"\");\n"); // menu.setJsObjectId("menu_"+menuid); // List contextmenuitems = menu.getContextMenuItems(); // //根据不同的类型构建菜单 peng.yang // for(int i = 0; i < contextmenuitems.size(); i ++){ // Menu.ContextMenuItem contextMenuItem = (Menu.ContextMenuItem)contextmenuitems.get(i); // if(contextMenuItem.isSeperate()){ // buffer.append(menu.getJsObjectId()+".AddSeparator();\n"); // }else if (contextMenuItem == Menu.MENU_OPEN) { // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"打开\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); // }else if (contextMenuItem == Menu.MENU_EXPAND) { // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"展开/折叠\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); // } // else{ // if(contextMenuItem.getSubMenu()!=null) // { //// String submenuid = "menu_"+menuid + i ; //// contextMenuItem.getSubMenu().setJsObjectId(submenuid); // // buildMenu(menuid + i,buffer,contextMenuItem.getSubMenu()); // // } // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\""+contextMenuItem.getName()+"\",") // .append("\""+contextMenuItem.getLink()+"\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("\""+contextMenuItem.getTarget()+"\","); // if(contextMenuItem.getSubMenu()!=null) // { //// String submenuid = "menu_"+menuid + i ; //// contextMenuItem.getSubMenu().setJsObjectId(submenuid); // buffer.append(contextMenuItem.getSubMenu().getJsObjectId()).append(",").append(contextMenuItem.isDisabled()).append("));\n"); //// buildMenu(menuid + i,buffer,contextMenuItem.getSubMenu()); // // } // else // { // buffer.append("null,").append(contextMenuItem.isDisabled()).append("").append("));\n"); // } //// buffer.append("));\n"); // } // } // // // // } // // /** // * 构建父框的右键菜单 // * @param menuid // * @param buffer // * @param menu // */ // private void buildParentMenu(String menuid,StringBuilder buffer,Menu menu) // { // // buffer.append(" var menu_"+menuid+" = new Menu();\n "); // buffer.append("menu_"+menuid+".BuildMenu(\""+menu.getIdentity()+"\");\n"); // //buffer.append("menuobjects.push('").append(menu.getIdentity()).append("');\n"); // menu.setJsObjectId("menu_"+menuid); // List contextmenuitems = menu.getContextMenuItems(); // //根据不同的类型构建菜单 peng.yang // for(int i = 0; i < contextmenuitems.size(); i ++){ // Menu.ContextMenuItem contextMenuItem = (Menu.ContextMenuItem)contextmenuitems.get(i); // if(contextMenuItem.isSeperate()){ // buffer.append(menu.getJsObjectId()+".AddSeparator();\n"); // }else if (contextMenuItem == Menu.MENU_OPEN) { // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"打开\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); // }else if (contextMenuItem == Menu.MENU_EXPAND) { // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"展开/折叠\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); // } // else{ // // if(contextMenuItem.getSubMenu()!=null) // { //// String submenuid = "menu_"+menuid + i ; //// contextMenuItem.getSubMenu().setJsObjectId(submenuid); //// buffer.append(contextMenuItem.getSubMenu().getJsObjectId()).append("));\n"); // buildParentMenu(menuid + i,buffer,contextMenuItem.getSubMenu()); // // } // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\""+contextMenuItem.getName()+"\",") // .append("\""+contextMenuItem.getLink()+"\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("\""+contextMenuItem.getTarget()+"\","); // if(contextMenuItem.getSubMenu()!=null) // { //// String submenuid = "menu_"+menuid + i ; //// contextMenuItem.getSubMenu().setJsObjectId(submenuid); // buffer.append(contextMenuItem.getSubMenu().getJsObjectId()).append(",").append(contextMenuItem.isDisabled()).append("));\n"); //// buildParentMenu(menuid + i,buffer,contextMenuItem.getSubMenu()); // // } // else // { // buffer.append("null").append(",").append(contextMenuItem.isDisabled()).append("));\n"); // } //// buffer.append("));\n"); // } // } // // // // } /** * 构建右键菜单 * @param menuid * @param buffer * @param menu */ private void buildMenu(StringBuilder buffer,StringBuilder scriptbuffer,Menu menu,boolean isroot) { /** * <div> <span>Sub</span> <div style="width:80px;"> <div onclick="javascript:alert('sub21')">sub21</div> <div>sub22</div> <div>sub23</div> </div> </div> */ if(isroot) { String menuid = "_menu_" + menu.getIdentity(); scriptbuffer.append("addMenu(\"").append(menuid).append("\",\"").append(menu.getIdentity()).append("\");"); buffer.append("<div id=\"_parent_").append(menuid).append("\" style=\"display:none;\" >"); buffer.append("<div id=\"").append(menuid).append("\" style=\"width:120px;\">"); // buffer.append("<div id=\"").append(menuid).append("\" class=\"easyui-menu\" style=\"width:120px;\">"); } else { buffer.append("<div style=\"width:150px;\">"); } List contextmenuitems = menu.getContextMenuItems(); //根据不同的类型构建菜单 peng.yang for(int i = 0; i < contextmenuitems.size(); i ++){ Menu.ContextMenuItem contextMenuItem = (Menu.ContextMenuItem)contextmenuitems.get(i); if(contextMenuItem.isSeperate()){ buffer.append("<div class=\"menu-sep\"></div>"); }else if (contextMenuItem == Menu.MENU_OPEN) { if(!contextMenuItem.isDisabled()) { buffer.append("<div onclick=\"javascript:expandNode('"+menu.getIdentity()+"');\">").append("打开").append("</div>"); } else { // buffer.append("<div class=\"menu-shadow\" onclick=\"javascript:expandNode('"+menu.getIdentity()+"');\">").append("打开").append("</div>"); } // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"打开\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); }else if (contextMenuItem == Menu.MENU_EXPAND) { if(!contextMenuItem.isDisabled()) { buffer.append("<div icon=\"").append(Menu.icon_add).append("\" onclick=\"javascript:expandNode('"+menu.getIdentity()+"');\">").append("展开/折叠").append("</div>"); } else { // buffer.append("<div icon=\"").append(Menu.icon_add).append("\" class=\"menu-shadow\" onclick=\"javascript:expandNode('"+menu.getIdentity()+"');\">").append("展开/折叠").append("</div>"); } // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"展开/折叠\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); } else{ buffer.append("<div " ); if(!contextMenuItem.isDisabled()) { if(contextMenuItem.getLink() != null) { if(contextMenuItem.getLink().startsWith("javascript:")) { buffer.append("onclick=\"").append(contextMenuItem.getLink()).append("\" "); } else { String target = contextMenuItem.getTarget(); if(target != null || target.equals("")) { target = "_self"; } buffer.append("onclick=\"javascript:openUrl('").append(contextMenuItem.getLink()).append("','").append(target).append("');\" "); } } } else { if(contextMenuItem.getDisableMsg() == null) { buffer.append("onclick=\"javascript:$.messager.alert('提示','操作无效,请确认拥有[").append(contextMenuItem.getName()).append("]的权限,请联系管理员.','warning');\" "); } else { buffer.append("onclick=\"javascript:$.messager.alert('提示','").append(contextMenuItem.getDisableMsg()).append("','warning');\" "); } } String icon = contextMenuItem.getIcon(); if(icon != null && !icon.equals("")) { if(icon.startsWith("icon-")) buffer.append(" icon=\"").append(icon).append("\" "); else { // buffer.append(" icon=\"").append(Menu.icon_ok).append("\" "); buffer.append(" style=\"background:url('").append(icon).append("') no-repeat; \""); } } // if(!contextMenuItem.isDisabled()) { String clazz = contextMenuItem.getClazz() ; if(clazz != null && !clazz.equals("")) { buffer.append(" class=\"").append(clazz).append("\" "); } } // else // { // buffer.append(" class=\"menu-shadow\" "); // } buffer.append(">"); if(contextMenuItem.getSubMenu()!=null) { // String submenuid = "menu_"+menuid + i ; // contextMenuItem.getSubMenu().setJsObjectId(submenuid); buffer.append("<span>").append(contextMenuItem.getName()).append("</span>"); buildMenu(buffer,scriptbuffer,contextMenuItem.getSubMenu(),false); } else { buffer.append(contextMenuItem.getName()); } buffer.append("</div>"); // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\""+contextMenuItem.getName()+"\",") // .append("\""+contextMenuItem.getLink()+"\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("\""+contextMenuItem.getTarget()+"\","); // if(contextMenuItem.getSubMenu()!=null) // { //// String submenuid = "menu_"+menuid + i ; //// contextMenuItem.getSubMenu().setJsObjectId(submenuid); // buffer.append(contextMenuItem.getSubMenu().getJsObjectId()).append(",").append(contextMenuItem.isDisabled()).append("));\n"); //// buildMenu(menuid + i,buffer,contextMenuItem.getSubMenu()); // // } // else // { // buffer.append("null,").append(contextMenuItem.isDisabled()).append("").append("));\n"); // } // buffer.append("));\n"); } } buffer.append("</div>"); if(isroot) buffer.append("</div>"); // return menuid; } // /** // * 构建父框的右键菜单 // * @param menuid // * @param buffer // * @param menu // */ // private void buildParentMenu(String menuid,StringBuilder buffer,Menu menu) // { // // buffer.append(" var menu_"+menuid+" = new Menu();\n "); // buffer.append("menu_"+menuid+".BuildMenu(\""+menu.getIdentity()+"\");\n"); // //buffer.append("menuobjects.push('").append(menu.getIdentity()).append("');\n"); // menu.setJsObjectId("menu_"+menuid); // List contextmenuitems = menu.getContextMenuItems(); // //根据不同的类型构建菜单 peng.yang // for(int i = 0; i < contextmenuitems.size(); i ++){ // Menu.ContextMenuItem contextMenuItem = (Menu.ContextMenuItem)contextmenuitems.get(i); // if(contextMenuItem.isSeperate()){ // buffer.append(menu.getJsObjectId()+".AddSeparator();\n"); // }else if (contextMenuItem == Menu.MENU_OPEN) { // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"打开\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); // }else if (contextMenuItem == Menu.MENU_EXPAND) { // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\"展开/折叠\",") // .append("\"javascript:expandNode('"+menu.getIdentity()+"');\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("null,null,").append(contextMenuItem.isDisabled()).append("));\n"); // } // else{ // // if(contextMenuItem.getSubMenu()!=null) // { //// String submenuid = "menu_"+menuid + i ; //// contextMenuItem.getSubMenu().setJsObjectId(submenuid); //// buffer.append(contextMenuItem.getSubMenu().getJsObjectId()).append("));\n"); // buildParentMenu(menuid + i,buffer,contextMenuItem.getSubMenu()); // // } // buffer.append(menu.getJsObjectId()+".Add(new MenuItem(\""+contextMenuItem.getName()+"\",") // .append("\""+contextMenuItem.getLink()+"\",") // .append("\""+contextMenuItem.getIcon()+"\",") // .append("\""+contextMenuItem.getTarget()+"\","); // if(contextMenuItem.getSubMenu()!=null) // { //// String submenuid = "menu_"+menuid + i ; //// contextMenuItem.getSubMenu().setJsObjectId(submenuid); // buffer.append(contextMenuItem.getSubMenu().getJsObjectId()).append(",").append(contextMenuItem.isDisabled()).append("));\n"); //// buildParentMenu(menuid + i,buffer,contextMenuItem.getSubMenu()); // // } // else // { // buffer.append("null").append(",").append(contextMenuItem.isDisabled()).append("));\n"); // } //// buffer.append("));\n"); // } // } // // // // } public String getContext() { return context; } public void setContext(String context) { this.context = context; } public ContextMenu getContextMenu() { HttpServletRequest request = getHttpServletRequest(); HttpSession session = request.getSession(false) ; if(this.context == null || this.context.trim().equals("")) return null; if(scope == null || scope.equals("request")) { ContextMenu menu = (ContextMenu)request.getAttribute(context); return menu; } else if(session != null && scope.equals("session")) { ContextMenu menu = (ContextMenu)session.getAttribute(context); return menu; } else if(scope.equals("pageContext")) { ContextMenu menu = (ContextMenu)pageContext.getAttribute(context); return menu; } else return null; } public String getScope() { return scope; } public void setScope(String scope) { this.scope = scope; } private void reset(ContextMenu menu) { // TODO Auto-generated method stub menu.getContextmenus().clear(); // menuScript = "contextmenu/popmenu.vm"; //flag = true; context = null; jquery = false; scope = "request"; } public boolean isJquery() { return jquery; } public void setJquery(boolean jquery) { this.jquery = jquery; } @Override public void doFinally() { context = null; jquery = false; this.parent_indent = null; scope = "request"; super.doFinally(); } }