/* * 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.editors; import org.opencms.file.CmsPropertyDefinition; import org.opencms.i18n.CmsMessages; import org.opencms.jsp.CmsJspActionElement; import org.opencms.main.CmsException; import org.opencms.main.CmsLog; import org.opencms.util.CmsStringUtil; import org.opencms.workplace.commons.CmsPropertyCustom; import org.opencms.workplace.explorer.CmsNewResourceXmlPage; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.PageContext; import org.apache.commons.logging.Log; /** * Provides methods for the special xmlpage property dialog.<p> * * This is a special dialog that is used for xmlpages in the workplace and the editors.<p> * Uses methods from the customized property dialog where possible.<p> * * The following files use this class: * <ul> * <li>/jsp/editors/dialogs/property.html * </ul> * <p> * * @since 6.0.0 */ public class CmsDialogProperty extends CmsPropertyCustom { /** The log object for this class. */ private static final Log LOG = CmsLog.getLog(CmsDialogProperty.class); /** Flag indicating if the template property was changed. */ private boolean m_templateChanged; /** * Public constructor with JSP action element.<p> * * @param jsp an initialized JSP action element */ public CmsDialogProperty(CmsJspActionElement jsp) { super(jsp); } /** * Public constructor with JSP variables.<p> * * @param context the JSP page context * @param req the JSP request * @param res the JSP response */ public CmsDialogProperty(PageContext context, HttpServletRequest req, HttpServletResponse res) { this(new CmsJspActionElement(context, req, res)); } /** * Creates the HTML String for the edit properties form.<p> * * @return the HTML output String for the edit properties form */ public String buildEditForm() { CmsMessages messages = Messages.get().getBundle(getLocale()); StringBuffer retValue = new StringBuffer(2048); // check if the properties are editable boolean editable = isEditable(); // create "disabled" attribute if properties are not editable String disabled = ""; if (!editable) { disabled = " disabled=\"disabled\""; } retValue.append("<table border=\"0\">\n"); retValue.append("<tr>\n"); retValue.append("\t<td class=\"textbold\">" + messages.key(Messages.GUI_INPUT_PROPERTY_0) + "</td>\n"); retValue.append("\t<td class=\"textbold\">" + messages.key(Messages.GUI_LABEL_VALUE_0) + "</td>\n"); retValue.append("\t<td class=\"textbold\" style=\"white-space: nowrap;\">" + messages.key(Messages.GUI_INPUT_USEDPROPERTY_0) + "</td>\n"); retValue.append("</tr>\n"); retValue.append("<tr><td><span style=\"height: 6px;\"></span></td></tr>\n"); // create template select box row retValue.append(buildTableRowStart(messages.key(Messages.GUI_INPUT_TEMPLATE_0))); retValue.append(buildSelectTemplates("name=\"" + CmsPropertyDefinition.PROPERTY_TEMPLATE + "\" class=\"maxwidth noborder\"" + disabled)); retValue.append("</td>\n"); retValue.append("\t<td class=\"textcenter\">"); retValue.append(" "); retValue.append(buildTableRowEnd()); // create the text property input rows retValue.append(buildTextInput(editable)); // show navigation properties if enabled in explorer type settings if (showNavigation()) { retValue.append(buildNavigationProperties(editable)); } retValue.append("</table>"); return retValue.toString(); } /** * Builds the html for the page template select box.<p> * * @param attributes optional attributes for the <select> tag * @return the html for the page template select box */ public String buildSelectTemplates(String attributes) { List options = new ArrayList(); List values = new ArrayList(); int selectedValue = -1; String currentTemplate = null; TreeMap templates = null; try { // read the current template currentTemplate = getCms().readPropertyObject( getParamResource(), CmsPropertyDefinition.PROPERTY_TEMPLATE, true).getValue(); // get all available templates templates = CmsNewResourceXmlPage.getTemplates(getCms(), getParamResource()); } catch (CmsException e) { // ignore this exception if (LOG.isInfoEnabled()) { LOG.info(Messages.get().getBundle().key(Messages.LOG_READ_TEMPLATE_FAILED_0), e); } } if (currentTemplate == null) { currentTemplate = ""; } if (templates == null) { // no valid template found, use only current one addCurrentTemplate(currentTemplate, options, values); } else { boolean found = false; // templates found, create option and value lists Iterator i = templates.entrySet().iterator(); int counter = 0; while (i.hasNext()) { Map.Entry entry = (Map.Entry)i.next(); String key = (String)entry.getKey(); String path = (String)entry.getValue(); if (currentTemplate.equals(path)) { // mark the currently selected template selectedValue = counter; found = true; } options.add(key); values.add(path); counter++; } if (!found) { // current template was not found among module templates, add current template as option addCurrentTemplate(currentTemplate, options, values); selectedValue = 0; } } String hiddenField = "<input type=\"hidden\" name=\"" + PREFIX_HIDDEN + CmsPropertyDefinition.PROPERTY_TEMPLATE + "\" value=\"" + currentTemplate + "\">"; return buildSelect(attributes, options, values, selectedValue, false) + hiddenField; } /** * Returns if the template property was changed.<p> * * @return true if the template property was changed, otherwise false */ public boolean hasTemplateChanged() { return m_templateChanged; } /** * Performs the editing of the resources properties.<p> * * @param request the HttpServletRequest * @return true, if the properties were successfully changed, otherwise false * @throws CmsException if editing is not successful */ protected boolean performEditOperation(HttpServletRequest request) throws CmsException { boolean useTempfileProject = Boolean.valueOf(getParamUsetempfileproject()).booleanValue(); try { if (useTempfileProject) { switchToTempProject(); } // write the common properties defined in the explorer type settings Iterator i = getExplorerTypeSettings().getProperties().iterator(); // iterate over the properties while (i.hasNext()) { String curProperty = (String)i.next(); String paramValue = request.getParameter(PREFIX_VALUE + curProperty); String oldValue = request.getParameter(PREFIX_HIDDEN + curProperty); writeProperty(curProperty, paramValue, oldValue); } // write special file properties String paramValue = null; String oldValue = null; // write the navigation properties if enabled if (showNavigation()) { // get the navigation enabled parameter paramValue = request.getParameter("enablenav"); if (Boolean.valueOf(paramValue).booleanValue()) { // navigation enabled, update params paramValue = request.getParameter("navpos"); if (!"-1".equals(paramValue)) { // update the property only when it is different from "-1" (meaning no change) oldValue = request.getParameter(PREFIX_HIDDEN + CmsPropertyDefinition.PROPERTY_NAVPOS); writeProperty(CmsPropertyDefinition.PROPERTY_NAVPOS, paramValue, oldValue); } paramValue = request.getParameter(PREFIX_VALUE + CmsPropertyDefinition.PROPERTY_NAVTEXT); oldValue = request.getParameter(PREFIX_HIDDEN + CmsPropertyDefinition.PROPERTY_NAVTEXT); writeProperty(CmsPropertyDefinition.PROPERTY_NAVTEXT, paramValue, oldValue); } else { // navigation disabled, delete property values writeProperty(CmsPropertyDefinition.PROPERTY_NAVPOS, null, null); writeProperty(CmsPropertyDefinition.PROPERTY_NAVTEXT, null, null); } } // get the template parameter paramValue = request.getParameter(CmsPropertyDefinition.PROPERTY_TEMPLATE); oldValue = request.getParameter(PREFIX_HIDDEN + CmsPropertyDefinition.PROPERTY_TEMPLATE); writeProperty(CmsPropertyDefinition.PROPERTY_TEMPLATE, paramValue, oldValue); if ((paramValue != null) && !paramValue.equals(oldValue)) { // template has changed, refresh editor window m_templateChanged = true; } } finally { if (useTempfileProject) { switchToCurrentProject(); } } return true; } /** * Adds the currently selected template value to the option and value list.<p> * * @param currentTemplate the currently selected template to add * @param options the option list * @param values the value list */ private void addCurrentTemplate(String currentTemplate, List options, List values) { CmsMessages messages = Messages.get().getBundle(getLocale()); // template was not found in regular template folders, add current template value if (CmsStringUtil.isEmpty(currentTemplate)) { // current template not available, add "please select" value options.add(0, "--- " + messages.key(Messages.GUI_PLEASE_SELECT_0) + " ---"); values.add(0, ""); } else { // current template was set to some value, add this value to the selection String name = null; try { // read the title of the current template name = getCms().readPropertyObject(currentTemplate, CmsPropertyDefinition.PROPERTY_TITLE, false).getValue(); } catch (CmsException e) { // ignore this exception - the title for this template was not readable if (LOG.isInfoEnabled()) { LOG.info(messages.key(Messages.LOG_READ_TITLE_PROP_FAILED_1, currentTemplate), e); } } if (name == null) { name = currentTemplate; } options.add(0, "* " + name); values.add(0, currentTemplate); } } }