package com.idega.builder.presentation; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.ejb.FinderException; import com.idega.builder.business.BuilderConstants; import com.idega.builder.business.ICObjectComparator; import com.idega.core.accesscontrol.business.StandardRoles; import com.idega.core.component.data.ICObject; import com.idega.core.component.data.ICObjectBMPBean; import com.idega.core.component.data.ICObjectHome; import com.idega.data.IDOLookup; import com.idega.data.IDOLookupException; 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.Span; import com.idega.presentation.text.Heading3; import com.idega.presentation.text.ListItem; import com.idega.presentation.text.Lists; import com.idega.presentation.text.Text; public class AddModuleBlock extends Block { private Map<String, List<ICObject>> addedTabs = new HashMap<String, List<ICObject>>(); private String localizedText = "Sorry, there are no components available."; private boolean isBuilderUser(IWContext iwc) { if (iwc.hasRole(StandardRoles.ROLE_KEY_BUILDER)) { return true; } if (iwc.hasRole(StandardRoles.ROLE_KEY_EDITOR)) { return true; } return iwc.hasRole(StandardRoles.ROLE_KEY_AUTHOR); } @Override public String getBundleIdentifier() { return BuilderConstants.IW_BUNDLE_IDENTIFIER; } @Override public void main(IWContext iwc) throws Exception { IWResourceBundle iwrb = getResourceBundle(iwc); boolean isBuilderUser = isBuilderUser(iwc); localizedText = iwrb.getLocalizedString("no_components_available", localizedText); Collection<ICObject> allComoponents = getAllComponents(); Layer container = new Layer(); container.setStyleClass("addModuleContainer"); add(container); // Header /*Layer header = new Layer(); String regionName = iwc.getParameter(BuilderConstants.REGION_NAME); StringBuffer label = new StringBuffer(iwrb.getLocalizedString(BuilderConstants.ADD_MODULE_TO_REGION_LOCALIZATION_KEY, BuilderConstants.ADD_MODULE_TO_REGION_LOCALIZATION_VALUE)); if (regionName != null && !(CoreConstants.EMPTY.equals(regionName))) { label.append(CoreConstants.SPACE).append(iwrb.getLocalizedString("to", "to")).append(CoreConstants.SPACE).append(iwrb.getLocalizedString("region", "region")); label.append(CoreConstants.SPACE).append(regionName); } header.add(new Heading1(label.toString())); header.setStyleClass("addModuleToBuilderPage"); container.add(header);*/ Lists titles = new Lists(); titles.setStyleClass("mootabs_title"); List<ICObject> widgets = getConcreteComponents(iwc, allComoponents, true, false, false); if (widgets != null && widgets.size() > 0) { addComponentsTitles(titles, widgets, "widgetsTab", iwrb.getLocalizedString("widget_modules", "Widgets")); } List<ICObject> blocks = getConcreteComponents(iwc, allComoponents, false, true, false); if (blocks != null && blocks.size() > 0) { addComponentsTitles(titles, blocks, "blocksTab", iwrb.getLocalizedString("blocks_header", "Blocks")); } List<ICObject> builderComponents = null; if (isBuilderUser) { builderComponents = getConcreteComponents(iwc, allComoponents, false, false, true); if (builderComponents != null && builderComponents.size() > 0) { addComponentsTitles(titles, builderComponents, "builderTab", iwrb.getLocalizedString("builder_modules", "Builder")); } } if (addedTabs.size() == 0) { container.add(new Heading3(localizedText)); return; } container.add(titles); String key = null; for (Iterator<String> keys = addedTabs.keySet().iterator(); keys.hasNext();) { key = keys.next(); Layer componentsListContainer = new Layer(); componentsListContainer.setStyleClass("mootabs_panel"); componentsListContainer.setId(key); addListToWindow(iwc, addedTabs.get(key), componentsListContainer); container.add(componentsListContainer); } Layer script = new Layer(); script.add(new StringBuffer("<script type=\"text/javascript\">createTabsWithMootabs('").append(container.getId()).append("'); closeAllLoadingMessages();</script>").toString()); container.add(script); } private void addComponentsTitles(Lists titles, List<ICObject> components, String tabText, String text) { ListItem tab = new ListItem(); tab.setMarkupAttribute("title", tabText); tab.addText(text); titles.add(tab); addedTabs.put(tabText, components); } private void addListToWindow(IWContext iwc, List<ICObject> objects, Layer container) { if (objects == null || objects.size() == 0) { container.add(localizedText); return; } Lists items = new Lists(); String itemStyleClass = "modulesListItemStyle"; ListItem item = new ListItem(); String actionDefinition = "onclick"; ICObject object = null; for (int i = 0; i < objects.size(); i++) { object = objects.get(i); String iconURI = object.getIconURI(); //IWBundle iwb = object.getBundle(iwc.getIWMainApplication()); //IWResourceBundle iwrb = iwb.getResourceBundle(iwc); item = new ListItem(); item.setStyleClass(itemStyleClass); item.attributes.put(actionDefinition, new StringBuffer("addSelectedModule(").append(object.getID()).append(", '").append(object.getClassName()).append("');").toString()); items.add(item); if (iconURI != null) { Image image = new Image(iconURI); image.setAlt(object.getName()); item.add(image); } Span span = new Span(); span.setStyleClass("objectName"); //span.add(new Text(iwrb.getLocalizedString("iw.component." + object.getClassName(), object.getName()))); span.add(new Text(object.getName())); item.add(span); span = new Span(); span.setStyleClass("objectDescription"); //span.add(new Text(iwrb.getLocalizedString("iw.component.description." + object.getName(), "Descripition for item " + object.getName()))); span.add(new Text("Descripition for item " + object.getName())); item.add(span); } container.add(items); } private List<ICObject> getConcreteComponents(IWContext iwc, Collection<ICObject> allComponents, boolean findWidgets, boolean findBlocks, boolean findBuilder) { List<ICObject> components = new ArrayList<ICObject>(); List<String> namesList = new ArrayList<String>(); if (allComponents == null) { return components; } ICObject object = null; // Find "widget" type modules if (findWidgets) { for (Iterator<ICObject> it = allComponents.iterator(); it.hasNext(); ) { object = it.next(); if (object.isWidget()) { addComponent(components, object, namesList); } } return getSortedComponents(components); } // Find "block" type modules if (findBlocks) { for (Iterator<ICObject> it = allComponents.iterator(); it.hasNext(); ) { object = it.next(); if (object.isBlock()) { if (!components.contains(object)) { addComponent(components, object, namesList); } } } return getSortedComponents(components); } // Find all other Builder/Development modules List<String> componentTypes = Arrays.asList(new String[] {ICObjectBMPBean.COMPONENT_TYPE_ELEMENT, ICObjectBMPBean.COMPONENT_TYPE_BLOCK, ICObjectBMPBean.COMPONENT_TYPE_JSFUICOMPONENT}); for (Iterator<ICObject> it = allComponents.iterator(); it.hasNext(); ) { object = it.next(); if (!object.isBlock() && !object.isWidget()) { if (componentTypes.contains(object.getObjectType())) { addComponent(components, object, namesList); } } } return getSortedComponents(components); } private List<ICObject> getSortedComponents(List<ICObject> components) { if (components == null) { return null; } ICObjectComparator comparator = new ICObjectComparator(); Collections.sort(components, comparator); return components; } private void addComponent(List<ICObject> components, ICObject component, List<String> namesList) { if (component == null || components == null || namesList == null) { return; } if (namesList.contains(component.getClassName())) { return; } namesList.add(component.getClassName()); components.add(component); } private Collection<ICObject> getAllComponents() { ICObjectHome icoHome = null; try { icoHome = (ICObjectHome) IDOLookup.getHome(ICObject.class); } catch (IDOLookupException e) { e.printStackTrace(); } if (icoHome == null) { return null; } try { return icoHome.findAll(); } catch (FinderException e) { e.printStackTrace(); } return null; } }