/* * This library is part of OpenCms - * the Open Source Content Management System * * Copyright (c) Alkacon Software GmbH (http://www.alkacon.com) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * For further information about Alkacon Software GmbH, please see the * company website: http://www.alkacon.com * * For further information about OpenCms, please see the * project website: http://www.opencms.org * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package org.opencms.workplace.tools; import org.opencms.i18n.CmsEncoder; import org.opencms.jsp.CmsJspActionElement; import org.opencms.main.OpenCms; import org.opencms.security.CmsRoleViolationException; import org.opencms.util.CmsRequestUtil; import org.opencms.util.CmsStringUtil; import org.opencms.workplace.CmsDialog; import org.opencms.workplace.CmsWorkplace; import org.opencms.workplace.CmsWorkplaceSettings; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; /** * Helper class that encapsulates all the code for the "new" * style of the administration dialogs.<p> * * @since 6.0.0 */ public class CmsToolDialog extends CmsWorkplace { /** Request parameter name for the base tool path in the navigation, should be a parent tool of path. */ public static final String PARAM_BASE = "base"; /** Request parameter name for the force flag. */ public static final String PARAM_FORCE = "force"; /** Request parameter name for the tool path, should be an accessible tool under the given root. */ public static final String PARAM_PATH = "path"; /** Request parameter name for the root tool path. */ public static final String PARAM_ROOT = "root"; /** Request parameter name for the style type. */ public static final String PARAM_STYLE = "style"; /** Request parameter value for the 'new' dialog style. */ public static final String STYLE_NEW = "new"; /** Base parameter value. */ private String m_paramBase; /** Force parameter value. */ private String m_paramForce; /** Path parameter value. */ private String m_paramPath; /** Root parameter value. */ private String m_paramRoot; /** Style parameter value. */ private String m_paramStyle; /** * Default Constructor.<p> * * @param jsp the jsp action element */ public CmsToolDialog(CmsJspActionElement jsp) { super(jsp); } /** * Builds the standard javascript for submitting the dialog.<p> * * Should only be used by the <code>{@link CmsDialog#dialogScriptSubmit()}</code> method.<p> * * @return the standard javascript for submitting the dialog */ public String dialogScriptSubmit() { StringBuffer html = new StringBuffer(512); html.append("function submitAction(actionValue, theForm, formName) {\n"); html.append("\tif (theForm == null) {\n"); html.append("\t\ttheForm = document.forms[formName];\n"); html.append("\t}\n"); html.append("\ttry {\n"); html.append("\t\ttheForm.").append(CmsDialog.PARAM_FRAMENAME).append(".value = window.name;\n"); html.append("\t} catch (e) {}\n"); html.append("\tif (actionValue == '" + CmsDialog.DIALOG_OK + "') {\n"); html.append("\t\tloadingOn();\n"); html.append("\t\treturn true;\n"); html.append("\t}\n"); html.append("\ttheForm." + CmsDialog.PARAM_ACTION + ".value = actionValue;\n"); html.append("\tsubmitForm(theForm);\n"); html.append("\treturn true;\n"); html.append("}\n"); return html.toString(); } /** * Generates the standard new style dialog title row, and tool grouping.<p> * * It is called by the <code>{@link org.opencms.workplace.CmsDialog#dialog(int, String)}</code> method.<p> * * @return a dialog window start / end segment */ public String dialogTitle() { StringBuffer html = new StringBuffer(512); String toolPath = getCurrentToolPath(); String parentPath = getParentPath(); String rootKey = getToolManager().getCurrentRoot(this).getKey(); CmsTool parentTool = getToolManager().resolveAdminTool(rootKey, parentPath); String upLevelLink = CmsToolManager.linkForToolPath( getJsp(), parentPath, parentTool.getHandler().getParameters(this)); upLevelLink = CmsRequestUtil.appendParameter(upLevelLink, PARAM_FORCE, Boolean.TRUE.toString()); String parentName = getToolManager().resolveAdminTool(rootKey, parentPath).getHandler().getName(); html.append(getToolManager().generateNavBar(toolPath, this)); // build title html.append("<div class='screenTitle'>\n"); html.append("\t<table width='100%' cellspacing='0'>\n"); html.append("\t\t<tr>\n"); html.append("\t\t\t<td>\n"); html.append(CmsEncoder.decode(CmsToolMacroResolver.resolveMacros(getAdminTool().getHandler().getName(), this))); html.append("\n\t\t\t</td>"); // uplevel button only if needed if (!getParentPath().equals(toolPath)) { html.append("\t\t\t<td class='uplevel'>\n\t\t\t\t"); html.append(A_CmsHtmlIconButton.defaultButtonHtml( CmsHtmlIconButtonStyleEnum.SMALL_ICON_TEXT, "id-up-level", Messages.get().getBundle(getLocale()).key(Messages.GUI_ADMIN_VIEW_UPLEVEL_0), parentName, true, "admin/images/up.png", null, "openPage('" + upLevelLink + "');")); html.append("\n\t\t\t</td>\n"); } html.append("\t\t</tr>\n"); html.append("\t</table>\n"); html.append("</div>\n"); return CmsToolMacroResolver.resolveMacros(html.toString(), this); } /** * Returns the admin tool.<p> * * @return the admin tool */ public CmsTool getAdminTool() { return getToolManager().getCurrentTool(this); } /** * Returns the current tool path.<p> * * @return the current tool path */ public String getCurrentToolPath() { return getToolManager().getCurrentToolPath(this); } /** * Returns the value for the base parameter.<p> * * @return the value for the base parameter */ public String getParamBase() { return m_paramBase; } /** * Returns the value for the force parameter.<p> * * @return the value for the force parameter */ public String getParamForce() { return m_paramForce; } /** * Returns the path parameter value.<p> * * @return the path parameter value */ public String getParamPath() { return m_paramPath; } /** * Returns the root parameter value.<p> * * @return the root parameter value */ public String getParamRoot() { return m_paramRoot; } /** * Returns the style parameter value.<p> * * @return the style parameter value */ public String getParamStyle() { return m_paramStyle; } /** * Returns the path to the parent tool.<p> * * @return tha path to the parent tool */ public String getParentPath() { return getToolManager().getParent(this, getCurrentToolPath()); } /** * Returns the tool manager.<p> * * @return the tool manager */ public CmsToolManager getToolManager() { return OpenCms.getWorkplaceManager().getToolManager(); } /** * Builds an block area for icons.<p> * * @param segment the HTML segment (START / END) * @param headline the headline String for the block * @return block area start / end segment * * @see CmsDialog#dialogBlock(int, String, boolean) */ public String iconsBlockArea(int segment, String headline) { StringBuffer result = new StringBuffer(512); if (segment == HTML_START) { result.append("<!-- icons block area start -->\n"); result.append("<div class=\"dialogcontent\" unselectable=\"on\">"); result.append("<fieldset class=\"dialogblock\">\n"); result.append("<legend>"); result.append("<span class=\"textbold"); result.append("\" unselectable=\"on\">"); result.append(headline); result.append("</span></legend>\n"); result.append("\t\t<table class='toolsArea' width='100%' cellspacing='0' cellpadding='0' border='0'>\n"); result.append("\t\t\t<tr><td>\n"); } else { result.append("\t\t\t</td></tr>\n"); result.append("\t\t</table>\n"); result.append("</fieldset></div>\n"); result.append("<p> </p>\n"); result.append("<!-- icons block area end -->\n"); } return result.toString(); } /** * Builds the end HTML for a block area with border in the dialog content area.<p> * * @return block area end segment * * @see CmsDialog#dialogBlockEnd() */ public String iconsBlockAreaEnd() { return iconsBlockArea(HTML_END, null); } /** * Builds the start HTML for a block area with border and optional subheadline in the dialog content area.<p> * * @param headline the headline String for the block * * @return block area start segment * * @see CmsDialog#dialogBlockStart(String) */ public String iconsBlockAreaStart(String headline) { return iconsBlockArea(HTML_START, headline); } /** * Initializes the admin tool main view.<p> * * @return the new modified parameters array * * @throws CmsRoleViolationException in case the dialog is opened by a user without the necessary privileges */ public Map initAdminTool() throws CmsRoleViolationException { Map params = new HashMap(getParameterMap()); // initialize getToolManager().initParams(this); // adjust parameters if called as default if (!useNewStyle()) { params.put(PARAM_STYLE, new String[] {CmsToolDialog.STYLE_NEW}); setParamStyle(CmsToolDialog.STYLE_NEW); } try { // a dialog just to access the close link parameter CmsDialog wp = (CmsDialog)this; // set close link if (CmsStringUtil.isEmptyOrWhitespaceOnly(wp.getParamCloseLink())) { if (!getToolManager().getBaseToolPath(this).equals(getToolManager().getCurrentToolPath(this))) { Map args = getToolManager().resolveAdminTool(getParamRoot(), getParentPath()).getHandler().getParameters( wp); wp.setParamCloseLink(CmsToolManager.linkForToolPath(getJsp(), getParentPath(), args)); params.put(CmsDialog.PARAM_CLOSELINK, new String[] {wp.getParamCloseLink()}); } } } catch (Exception e) { // ignore } if (!getToolManager().getCurrentTool(this).getHandler().isEnabled(this)) { throw new CmsRoleViolationException(Messages.get().container(Messages.ERR_ADMIN_INSUFFICIENT_RIGHTS_0)); } return params; } /** * @see org.opencms.workplace.CmsWorkplace#pageBody(int, java.lang.String, java.lang.String) */ public String pageBody(int segment, String className, String parameters) { if (!useNewStyle()) { return super.pageBody(segment, className, parameters); } else { Map data = CmsStringUtil.extendAttribute(parameters, "onLoad", "bodyLoad();"); String onLoad = (String)data.get("value"); String myPars = (String)data.get("text"); data = CmsStringUtil.extendAttribute(myPars, "onUnload", "bodyUnload();"); String onUnload = (String)data.get("value"); myPars = (String)data.get("text"); if (segment == HTML_START) { StringBuffer html = new StringBuffer(512); html.append("</head>\n"); html.append("<body onLoad="); html.append(onLoad); html.append(" onUnload="); html.append(onUnload); html.append(CmsStringUtil.isNotEmpty(className) ? " class='" + className + "'" : ""); html.append(CmsStringUtil.isNotEmpty(myPars) ? " " + myPars : ""); html.append(">\n"); html.append("\t<table border='0' cellspacing='0' cellpadding='0' id='loaderContainer' onClick='return false;'>\n"); html.append("\t\t<tr><td id='loaderContainerH'><div id='loader'>\n"); html.append("\t\t\t<table border='0' cellpadding='0' cellspacing='0' width='100%'><tr><td>\n"); html.append("\t\t\t\t<p><img src='"); html.append(getSkinUri()); html.append("commons/wait.gif"); html.append("' height='32' width='32' alt=''/>\n"); html.append("\t\t\t\t<strong>"); html.append(Messages.get().getBundle(getLocale()).key(Messages.GUI_ADMIN_VIEW_LOADING_0)); html.append("</strong></p>\n"); html.append("\t\t\t</td></tr></table>\n"); html.append("\t\t</div></td></tr>\n"); html.append("\t</table>\n"); html.append("\t<table width='100%' cellspacing='0' cellpadding='0' border='0'><tr><td id='screenH'>\n"); return html.toString(); } else { StringBuffer html = new StringBuffer(128); html.append("\t</td></tr></table>\n"); html.append("</body>"); return html.toString(); } } } /** * @see org.opencms.workplace.CmsWorkplace#pageHtmlStyle(int, java.lang.String, java.lang.String) */ public String pageHtmlStyle(int segment, String title, String stylesheet) { if (!useNewStyle() || (segment != HTML_START)) { return super.pageHtmlStyle(segment, title, stylesheet); } StringBuffer html = new StringBuffer(512); html.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n"); html.append("<html>\n"); html.append("<head>\n"); html.append("<meta http-equiv='Content-Type' content='text/html; charset="); html.append(getEncoding()); html.append("' >\n"); if (title != null) { html.append("<title>"); html.append(title); html.append("</title>\n"); } else { // the title tag is required for valid HTML html.append("<title></title>\n"); } html.append("<link rel='stylesheet' type='text/css' href='"); html.append(getStyleUri(getJsp())); html.append("new_admin.css'>\n"); html.append("<script type='text/javascript' src='"); html.append(getSkinUri()); html.append("admin/javascript/general.js'></script>\n"); html.append("<script type='text/javascript' src='"); html.append(getResourceUri()); html.append("editors/xmlcontent/help.js'></script>\n\n"); html.append("<script type='text/javascript'>\n"); html.append("\tfunction bodyLoad() {\n"); html.append("\t\tsetContext(\""); html.append(CmsStringUtil.escapeJavaScript(resolveMacros(getAdminTool().getHandler().getHelpText()))); html.append("\");\n"); html.append("\t\tsetActiveItemByName(\""); html.append(getCurrentToolPath()); html.append("\");\n"); html.append("\t\tloadingOff();\n"); html.append("\t\ttry {\n"); html.append("\t\t\tdocument.getElementById('loaderContainerH').height = wHeight();\n"); html.append("\t\t} catch (e) {}\n"); html.append("\t}\n"); html.append("\tfunction bodyUnload() {\n"); html.append("\t\tloadingOn();\n"); html.append("\t}\n"); html.append("</script>\n"); return html.toString(); } /** * Sets the value of the base parameter.<p> * * @param paramBase the value of the base parameter to set */ public void setParamBase(String paramBase) { m_paramBase = paramBase; } /** * Sets the value of the force parameter.<p> * * @param paramForce the value of the force parameter to set */ public void setParamForce(String paramForce) { m_paramForce = paramForce; } /** * Sets the path parameter value.<p> * * @param paramPath the path parameter value to set */ public void setParamPath(String paramPath) { m_paramPath = paramPath; } /** * Sets the root parameter value.<p> * * @param paramRoot the root parameter value to set */ public void setParamRoot(String paramRoot) { m_paramRoot = paramRoot; } /** * Sets the style parameter value.<p> * * @param paramStyle the style parameter value to set */ public void setParamStyle(String paramStyle) { m_paramStyle = paramStyle; } /** * Tests if we are working with the new administration dialog style.<p> * * The default is the new style, this parameter is not intended for external use.<p> * * @return <code>true</code> if using the new style */ public boolean useNewStyle() { return (getParamStyle() != null) && getParamStyle().equals(CmsToolDialog.STYLE_NEW); } /** * @see org.opencms.workplace.CmsWorkplace#initWorkplaceRequestValues(org.opencms.workplace.CmsWorkplaceSettings, javax.servlet.http.HttpServletRequest) */ protected void initWorkplaceRequestValues(CmsWorkplaceSettings settings, HttpServletRequest request) { fillParamValues(request); } }