package com.idega.builder.presentation; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import javax.faces.component.UIComponent; import com.idega.builder.bean.AdvancedProperty; import com.idega.builder.business.BuilderConstants; import com.idega.builder.business.BuilderLogic; import com.idega.builder.business.ComponentPropertyComparator; import com.idega.builder.business.IBPropertyHandler; import com.idega.core.accesscontrol.business.AccessController; import com.idega.core.accesscontrol.business.StandardRoles; import com.idega.core.builder.business.ICBuilderConstants; import com.idega.core.component.business.ComponentProperty; import com.idega.idegaweb.IWBundle; import com.idega.idegaweb.IWResourceBundle; import com.idega.presentation.Block; import com.idega.presentation.IWContext; import com.idega.presentation.Image; import com.idega.presentation.Layer; import com.idega.presentation.PresentationObject; import com.idega.presentation.Span; import com.idega.presentation.text.Heading1; import com.idega.presentation.text.Heading3; import com.idega.presentation.text.ListItem; import com.idega.presentation.text.Lists; import com.idega.presentation.text.Text; import com.idega.presentation.ui.IFrame; import com.idega.util.CoreConstants; import com.idega.util.PresentationUtil; import com.idega.util.StringUtil; public class EditModuleBlock extends Block { private String groupPermissionsText = "group_permissions"; //private String rolePermissionsText = "role_permissions"; private String localizedText = "Sorry, there are no properties for this module."; private Map<String, List<ComponentProperty>> addedProperties = new HashMap<String, List<ComponentProperty>>(); @Override public void main(IWContext iwc) throws Exception { String instanceId = iwc.getParameter(ICBuilderConstants.IC_OBJECT_INSTANCE_ID_PARAMETER); String pageKey = iwc.getParameter(BuilderConstants.IB_PAGE_PARAMETER_FOR_EDIT_MODULE_BLOCK); if (instanceId == null) { return; } BuilderLogic builder = BuilderLogic.getInstance(); IWResourceBundle iwrb = getResourceBundle(iwc); String nullInString = "null"; if (pageKey == null || CoreConstants.EMPTY.equals(pageKey) || nullInString.equals(pageKey)) { pageKey = builder.getCurrentIBPage(iwc); } if (pageKey == null || CoreConstants.MINUS.equals(pageKey) || nullInString.equals(pageKey)) { logError("Page id is not defined for EditModuleBlock!"); add(new Heading1(iwrb.getLocalizedString("error_page_was_not_found", "Sorry, page was not found."))); add(PresentationUtil.getJavaScriptAction("MOOdalBox.addEventToCloseAction(function(){reloadPage();});")); return; } String name = null; iwc.getRequest().setAttribute(BuilderConstants.TRANSFORM_PAGE_TO_BUILDER_PAGE_ATTRIBUTE, Boolean.FALSE); UIComponent component = builder.findComponentInPage(iwc, pageKey, instanceId); iwc.getRequest().removeAttribute(BuilderConstants.TRANSFORM_PAGE_TO_BUILDER_PAGE_ATTRIBUTE); if (component instanceof PresentationObject) { name = ((PresentationObject) component).getBuilderName(iwc); } else { name = component.getClass().getSimpleName(); } localizedText = iwrb.getLocalizedString("no_properties_for_this_module", localizedText); List<ComponentProperty> properties = getPropertyListOrdered(iwc, instanceId); if (properties == null) { return; } Layer container = new Layer(); add(container); // Header Layer header = new Layer(); header.add(new Heading1(StringUtil.isEmpty(name) ? iwrb.getLocalizedString("unkown_module", "Unkown module") : name)); header.setId("editModuleHeader"); container.add(header); // Properties Layer propertiesContainer = new Layer(); addProperties(properties, propertiesContainer, iwrb, iwc, instanceId, pageKey); container.add(propertiesContainer); Layer script = new Layer(); script.add(new StringBuffer("<script type=\"text/javascript\">createTabsWithMootabs('").append(propertiesContainer.getId()).append("');</script>").toString()); container.add(script); } private List<ComponentProperty> getPropertyListOrdered(IWContext iwc, String instanceId) throws Exception { List<ComponentProperty> properties = IBPropertyHandler.getInstance().getComponentProperties(instanceId, iwc.getIWMainApplication(), iwc.getCurrentLocale()); if (properties == null) { return null; } try { Collections.sort(properties, ComponentPropertyComparator.getInstance()); } catch (Exception e) { e.printStackTrace(); return null; } return properties; } private void addProperties(List<ComponentProperty> properties, Layer container, IWResourceBundle iwrb, IWContext iwc, String instanceId, String pageKey) { if (properties == null) { return; } ComponentProperty property = null; List<ComponentProperty> simpleProperties = new ArrayList<ComponentProperty>(); List<ComponentProperty> advancedProperties = new ArrayList<ComponentProperty>(); List<String> addedPropertiesNames = new ArrayList<String>(); for (int i = 0; i < properties.size(); i++) { property = properties.get(i); if (!addedPropertiesNames.contains(property.getName())) { addedPropertiesNames.add(property.getName()); if (property.isSimpleProperty()) { simpleProperties.add(property); } else { advancedProperties.add(property); } } } Lists tabs = new Lists(); tabs.setStyleClass("mootabs_title"); container.add(tabs); if (simpleProperties.size() == 0 || advancedProperties.size() == 0) { List<ComponentProperty> jointList = new ArrayList<ComponentProperty>(simpleProperties); jointList.addAll(advancedProperties); String propertiesText = "module_properties"; addTab(tabs, propertiesText, iwrb.getLocalizedString(propertiesText, "Properties"), jointList); } else { String simplePropertiesTabKey = "simple_properties"; addTab(tabs, simplePropertiesTabKey, iwrb.getLocalizedString(simplePropertiesTabKey, "Simple Properties"), simpleProperties); String advancedPropertiesTabKey = "advanced_properties"; addTab(tabs, advancedPropertiesTabKey, iwrb.getLocalizedString(advancedPropertiesTabKey, "Advanced Properties"), advancedProperties); } boolean isBuilderUser = iwc.getAccessController().hasRole(StandardRoles.ROLE_KEY_BUILDER, iwc); if (isBuilderUser) { addTab(tabs, groupPermissionsText, iwrb.getLocalizedString(groupPermissionsText, "Group permissions"), null); // addTab(tabs, rolePermissionsText, iwrb.getLocalizedString(rolePermissionsText, "Role permissions"), null); // TODO: implement tab for roles } String key = null; Layer tabContentContainer = null; for (Iterator<String> keys = addedProperties.keySet().iterator(); keys.hasNext();) { key = keys.next(); tabContentContainer = new Layer(); container.add(tabContentContainer); tabContentContainer.setId(key); tabContentContainer.setStyleClass("mootabs_panel"); if (key.equals(groupPermissionsText)) { addGroupPermissionsWindow(iwc, tabContentContainer, instanceId); } /*else if (key.equals(rolePermissionsText)) { // TODO: implement tab for roles }*/ else { addPropertiesToContainer(addedProperties.get(key), tabContentContainer, instanceId, iwc, pageKey); } } } private void addGroupPermissionsWindow(IWContext iwc, Layer main, String instanceId) { List<AdvancedProperty> parameters = new ArrayList<AdvancedProperty>(); parameters.add(new AdvancedProperty(IBPermissionWindow._PARAMETERSTRING_IDENTIFIER, instanceId)); parameters.add(new AdvancedProperty(IBPermissionWindow._PARAMETERSTRING_PERMISSION_CATEGORY, String.valueOf(AccessController.CATEGORY_OBJECT_INSTANCE))); parameters.add(new AdvancedProperty(BuilderConstants.CURRENT_COMPONENT_IS_IN_FRAME, Boolean.TRUE.toString())); IFrame frame = new IFrame(groupPermissionsText, BuilderLogic.getInstance().getUriToObject(IBPermissionWindow.class, parameters)); frame.setStyleClass("groupPermissionFrameInNewBuilderStyle"); main.add(frame); } private void addTab(Lists tabs, String key, String text, List<ComponentProperty> properties) { ListItem tab = new ListItem(); tab.addText(text); tab.setMarkupAttribute("title", key); tabs.add(tab); addedProperties.put(key, properties); } private void addPropertiesToContainer(List<ComponentProperty> properties, Layer main, String instanceId, IWContext iwc, String pageKey) { // Main container Layer container = new Layer(); main.add(container); if (properties == null || properties.size() == 0) { container.add(new Heading3(localizedText)); return; } // Header Span header = new Span(); container.add(header); // Properties wrapper Layer propertiesWrapper = new Layer(); // Properties container Layer propertiesContainer = new Layer(); Random generator = new Random(); int random = generator.nextInt(Integer.MAX_VALUE); String propertiesContainerId = new StringBuffer("propertiesContainerId").append(random).toString(); propertiesContainer.setId(propertiesContainerId); header.setStyleClass("componentPropertiesListHeader"); header.setMarkupAttributeMultivalued("onclick", new StringBuffer("manageComponentPropertiesList('").append(propertiesContainerId).append("');").toString()); // Properties ComponentProperty property = null; Lists list = new Lists(); list.setListOrdered(true); ListItem item = null; String itemStyle = "moduleProperty"; String itemStyleSetProperty = "modulePropertyIsSet"; String removeStyleClass = "removeBuilderModulePropertyStyle"; String propertyId = null; Span propertyName = null; IWBundle bundle = getBundle(iwc); String imageUri = bundle.getVirtualPathWithFileNameString("remove.png"); String imageName = bundle.getResourceBundle(iwc).getLocalizedString("remove", "Remove"); Image remove = null; boolean isPropertySet = false; for (int i = 0; i < properties.size(); i++) { propertyId = new StringBuffer("property").append(generator.nextInt(Integer.MAX_VALUE)).toString(); property = properties.get(i); item = new ListItem(); item.setId(propertyId); isPropertySet = BuilderLogic.getInstance().isPropertySet(pageKey, instanceId, property.getName(), iwc.getIWMainApplication()); if (isPropertySet) { item.setStyleClass(itemStyleSetProperty); } else { item.setStyleClass(itemStyle); } propertyName = new Span(new Text(property.getDisplayName(iwc.getCurrentLocale()))); String methodName = property.getName(); propertyName.setMarkupAttributeMultivalued("onclick", new StringBuffer("getPropertyBox('").append(propertyId).append("', '").append(methodName).append("', '").append(instanceId).append("', ").append(needReloadPropertyBox(methodName, property.getClassName())).append(");").toString()); item.add(propertyName); if (isPropertySet) { remove = new Image(imageUri, imageName, 16, 16); remove.setStyleClass(removeStyleClass); remove.setOnClick(new StringBuffer("removeBuilderModuleProperty('").append(remove.getId()).append("', '").append(propertyId).append("', '").append(instanceId).append("', '").append(property.getName()).append("');").toString()); item.add(remove); } list.add(item); } propertiesContainer.add(list); propertiesWrapper.add(propertiesContainer); propertiesWrapper.setId(new StringBuffer(propertiesContainer.getId()).append("Wrapper").toString()); container.add(propertiesWrapper); } private boolean needReloadPropertyBox(String methodName, String propertyClassName) { String booleanClassName = boolean.class.getName(); boolean needReload = methodName.toLowerCase().indexOf(booleanClassName) != -1; if (!needReload && propertyClassName != null) { needReload = propertyClassName.indexOf(booleanClassName) != -1; } return needReload; } @Override public String getBundleIdentifier() { return BuilderConstants.IW_BUNDLE_IDENTIFIER; } }