/* * $Id: IBPropertiesWindowSetter.java,v 1.30.2.1 2007/01/12 19:32:24 idegaweb Exp $ * * Copyright (C) 2001 Idega hf. All Rights Reserved. * * This software is the proprietary information of Idega hf. Use is subject to * license terms. * */ package com.idega.builder.presentation; import java.lang.reflect.Method; import com.idega.builder.business.BuilderLogic; import com.idega.builder.business.IBPropertyHandler; import com.idega.core.builder.presentation.ICPropertyHandler; import com.idega.core.component.business.ICObjectBusiness; import com.idega.idegaweb.IWMainApplication; import com.idega.presentation.IWContext; import com.idega.presentation.Page; import com.idega.presentation.PresentationObject; import com.idega.presentation.Script; import com.idega.presentation.Table; import com.idega.presentation.text.Text; import com.idega.presentation.ui.CheckBox; import com.idega.presentation.ui.Form; import com.idega.presentation.ui.Parameter; import com.idega.util.reflect.MethodFinder; /** * @author <a href="tryggvi@idega.is">Tryggvi Larusson</a> * @version 1.0 */ public class IBPropertiesWindowSetter extends Page { // Parameters used in the window public static final String IC_OBJECT_INSTANCE_ID_PARAMETER = IBPropertiesWindow.IC_OBJECT_INSTANCE_ID_PARAMETER; public static final String IB_PAGE_PARAMETER = IBPropertiesWindow.IB_PAGE_PARAMETER; final static String METHOD_ID_PARAMETER = IBPropertiesWindow.METHOD_ID_PARAMETER; final static String VALUE_SAVE_PARAMETER = IBPropertiesWindow.VALUE_SAVE_PARAMETER; final static String VALUE_PARAMETER = IBPropertiesWindow.VALUE_PARAMETER; final static String REMOVE_PARAMETER = "ib_remove_property"; final static String CHANGE_PROPERTY_PARAMETER = "ib_change_property"; final static String IS_CHANGING_PROPERTY_BOOLEAN_PARAMETER = "ib_is_changing"; final static String SAVE_PROPERTY_PARAMETER = "ib_save_prop"; // Javascript Functions names used in the window final static String CHANGE_PROPERTY_FUNCTION_NAME = "setProperty"; final static String UPDATE_PROPERTY_FUNCTION_NAME = "update"; public final static String MULTIVALUE_PROPERTY_CHANGE_FUNCTION_NAME = "multivalueChange"; private static final String BACKGROUND_COLOUR = "#FFFFFF"; private static final String HANDLER_PARAMETER = "handler_parameter"; public IBPropertiesWindowSetter() { setBackgroundColor(BACKGROUND_COLOUR); } public String getUsedICObjectInstanceID(IWContext iwc) { return iwc.getParameter(IC_OBJECT_INSTANCE_ID_PARAMETER); } private boolean isChangingProperty(IWContext iwc) { String sValue = iwc.getParameter(IS_CHANGING_PROPERTY_BOOLEAN_PARAMETER); if (sValue != null) { if (sValue.equals("Y")) { return true; } } return false; } public void main(IWContext iwc) throws Exception { boolean propertyChange = false; Script script = this.getAssociatedScript(); script.addFunction(CHANGE_PROPERTY_FUNCTION_NAME, "function " + CHANGE_PROPERTY_FUNCTION_NAME + "(method){var form = document.forms[0];form." + CHANGE_PROPERTY_PARAMETER + ".value=method;form." + IS_CHANGING_PROPERTY_BOOLEAN_PARAMETER + ".value='Y';" + UPDATE_PROPERTY_FUNCTION_NAME + "();}"); script.addFunction(UPDATE_PROPERTY_FUNCTION_NAME, "function " + UPDATE_PROPERTY_FUNCTION_NAME + "(){var form = document.forms[0];form.submit();}"); script.addFunction(MULTIVALUE_PROPERTY_CHANGE_FUNCTION_NAME, "function " + MULTIVALUE_PROPERTY_CHANGE_FUNCTION_NAME + "(){var form = document.forms[0];form." + SAVE_PROPERTY_PARAMETER + ".value='false';" + UPDATE_PROPERTY_FUNCTION_NAME + "();}"); String pageKey = BuilderLogic.getInstance().getCurrentIBPage(iwc); Form form = new Form(); add(form); form.maintainParameter(IC_OBJECT_INSTANCE_ID_PARAMETER); Parameter param1 = new Parameter(SAVE_PROPERTY_PARAMETER, "true"); form.add(param1); Parameter param = new Parameter(CHANGE_PROPERTY_PARAMETER); Parameter param3 = new Parameter(IS_CHANGING_PROPERTY_BOOLEAN_PARAMETER, "N"); form.add(param3); String newPropertyID = iwc.getParameter(CHANGE_PROPERTY_PARAMETER); if (newPropertyID != null) { param.setValue(newPropertyID); } else { param.setValue(""); } form.add(param); String changePropertyID = iwc.getParameter(CHANGE_PROPERTY_PARAMETER); if (changePropertyID != null) { Parameter param2 = new Parameter(METHOD_ID_PARAMETER, changePropertyID); form.add(param2); } else { String oldPropertyPar = iwc.getParameter(CHANGE_PROPERTY_PARAMETER); if (oldPropertyPar != null) { Parameter param2 = new Parameter(METHOD_ID_PARAMETER, oldPropertyPar); form.add(param2); } } boolean doSave = true; String sDoSave = iwc.getParameter(SAVE_PROPERTY_PARAMETER); if (sDoSave != null) { if (sDoSave.equalsIgnoreCase("false")) { doSave = false; } else { doSave = true; } } String ic_object_id = getUsedICObjectInstanceID(iwc); if (ic_object_id != null) { String propertyID = iwc.getParameter(METHOD_ID_PARAMETER); if (propertyID != null) { boolean remove = iwc.isParameterSet(REMOVE_PARAMETER); String values[] = parseValues(iwc); if (values == null) { doSave = false; } if (remove) { if (values != null) { propertyChange = true; removeProperty(iwc.getIWMainApplication(), propertyID, values, ic_object_id, pageKey); } } else { if (doSave) { propertyChange = setProperty(propertyID, values, ic_object_id, pageKey, iwc.getIWMainApplication()); ICPropertyHandler handler = (ICPropertyHandler) iwc.getSessionAttribute(HANDLER_PARAMETER); if (handler != null) { handler.onUpdate(values, iwc); iwc.removeSessionAttribute(HANDLER_PARAMETER); } } } } if (propertyChange) { doReload(); } else { if (newPropertyID != null) { String iICObjectInstanceID = this.getUsedICObjectInstanceID(iwc); Text description = new Text(IBPropertyHandler.getInstance().getMethodDescription( iICObjectInstanceID, newPropertyID, iwc)); description.setFontStyle("font-family:Arial,Helvetica,sans-serif;font-size:11pt;font-weight:bold;"); form.add(description); form.add(getPropertySetterBox(newPropertyID, iwc, null, ic_object_id)); form.add(getRemoveButton()); } } } } public void doReload() { setOnLoad("doReload()"); Script script = this.getAssociatedScript(); script.addFunction("doReload", "function doReload(form){document.forms[0].submit();}"); } public PresentationObject getRemoveButton() { Table t = new Table(2, 1); Text removeProperty = new Text("Remove Property"); removeProperty.setFontStyle("font-family:Arial,Helvetica,sans-serif;font-size:8pt;"); t.add(removeProperty, 1, 1); CheckBox button = new CheckBox(REMOVE_PARAMETER); t.add(button, 2, 1); return t; } public String[] parseValues(IWContext iwc) { String valueParams[] = iwc.getParameterValues(VALUE_PARAMETER); String values[] = null; boolean setProperty = false; if (valueParams != null) { values = new String[valueParams.length]; for (int i = 0; i < valueParams.length; i++) { values[i] = iwc.getParameter(valueParams[i]); if (values[i] != null && !values[i].equals("")) { setProperty = true; /** * @todo This is a shitty-mix solution for the * LocalizedPageNameHandler. Have to fix this later. * */ String langString = iwc.getParameter(valueParams[i] + "a"); if (langString != null) { values[i] = values[i] + ";" + langString; } } } } if (setProperty) { return values; } else { return null; } } public PresentationObject getPropertySetterBox(String methodIdentifier, IWContext iwc, String pageID, String icObjectInstanceID) throws Exception { if (pageID == null) { pageID = BuilderLogic.getInstance().getCurrentIBPage(iwc); } Table table = new Table(); int ypos = 1; Class ICObjectClass = null; int icObjectInstanceIDint = Integer.parseInt(icObjectInstanceID); if (icObjectInstanceIDint == -1) { ICObjectClass = com.idega.presentation.Page.class; } else { ICObjectClass = BuilderLogic.getInstance().getObjectClass(icObjectInstanceIDint); } String namePrefix = "ib_property_"; Method method = MethodFinder.getInstance().getMethod(methodIdentifier, ICObjectClass); Class parameters[] = method.getParameterTypes(); String selectedValues[] = parseValues(iwc); String paramDescriptions[] = IBPropertyHandler.getInstance().getPropertyDescriptions(iwc, icObjectInstanceID, methodIdentifier); boolean isChangingProperty = isChangingProperty(iwc); String realValues[] = BuilderLogic.getInstance().getPropertyValues(iwc.getIWMainApplication(), pageID, icObjectInstanceID, methodIdentifier, selectedValues, !isChangingProperty); for (int i = 0; i < parameters.length; i++) { Class parameterClass = parameters[i]; String sValue = ""; try { sValue = realValues[i]; } catch (ArrayIndexOutOfBoundsException e) { } catch (NullPointerException npe) { } String sName = namePrefix + i; String sParamDescription = paramDescriptions[i]; String handlerClass = IBPropertyHandler.getInstance().getMethodParameterProperty(iwc, icObjectInstanceID, methodIdentifier, i, IBPropertyHandler.METHOD_PARAMETER_PROPERTY_HANDLER_CLASS); // if // (handlerClass.equals("com.idega.builder.handler.LocalizedPageNameHandler")) // { // StringBuffer tmp = null; // if (sValue != null) // tmp = new StringBuffer(sValue); // else // tmp = new StringBuffer(""); // // tmp.append(";"); // String langValue = iwc.getParameter("ib_property_0a"); // if (langValue != null) // tmp.append(langValue); // // sValue = tmp.toString(); // } PresentationObject handlerBox = IBPropertyHandler.getInstance().getPropertySetterComponent(iwc, icObjectInstanceID, methodIdentifier, i, parameterClass, sName, sValue); ICPropertyHandler handler = null; if (handlerClass != null && !handlerClass.equals("")) { handler = IBPropertyHandler.getInstance().getPropertyHandler(handlerClass); if (handler != null) { iwc.setSessionAttribute(HANDLER_PARAMETER, handler); } } if (handler == null) { iwc.removeSessionAttribute(HANDLER_PARAMETER); } Parameter param = new Parameter(VALUE_PARAMETER, sName); if (sParamDescription != null) { Text tDescription = formatDescription(sParamDescription + ":"); tDescription.setFontStyle("font-family:Arial,Helvetica,sans-serif;font-size:8pt;"); table.add(tDescription, 1, ypos); } table.add(param, 2, ypos); // if // (handlerClass.equals("com.idega.builder.handler.LocalizedPageNameHandler")) // { // Parameter param2 = new Parameter(VALUE_PARAMETER, sName+"a"); // table.add(param2, 2, ypos); // } table.add(handlerBox, 2, ypos); ypos++; } table.setColumnVerticalAlignment(1, "top"); return table; } public Text formatDescription(String text) { return new Text(text); } public boolean setProperty(String key, String values[], String icObjectInstanceID, String pageKey, IWMainApplication iwma) { // invalidate cache for blocks PresentationObject obj = ICObjectBusiness.getInstance().getNewObjectInstance( Integer.parseInt(icObjectInstanceID)); /** @todo ensure the cache is invalidated for all states* */ if (obj instanceof com.idega.presentation.Block) { IWMainApplication.getIWCacheManager().invalidateCache(((com.idega.presentation.Block) obj).getCacheKey()); } return BuilderLogic.getInstance().setProperty(pageKey, icObjectInstanceID, key, values, iwma); } public void removeProperty(IWMainApplication iwma, String key, String values[], String icObjectInstanceID, String pageKey) { /** * @todo Change so that it removes properties of specific values for * multivalued properties */ // invalidate cache for blocks /** @todo ensure the cache is invalidated for all states* */ PresentationObject obj = ICObjectBusiness.getInstance().getNewObjectInstance( Integer.parseInt(icObjectInstanceID)); if (obj instanceof com.idega.presentation.Block) { IWMainApplication.getIWCacheManager().invalidateCache(((com.idega.presentation.Block) obj).getCacheKey()); } BuilderLogic.getInstance().removeProperty(iwma, pageKey, icObjectInstanceID, key, values); } }