package org.exoplatform.wcm.webui.selector.content;
import java.util.ArrayList;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.exoplatform.services.cms.templates.TemplateService;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.core.UIPopupWindow;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.Event.Phase;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIForm;
import org.exoplatform.webui.form.input.UICheckBoxInput;
/**
* Author : TAN DUNG DANG
* dzungdev@gmail.com
* Feb 2, 2009
*/
@ComponentConfig (
lifecycle = UIFormLifecycle.class,
template = "system:/groovy/webui/form/UIForm.gtmpl",
events = {
@EventConfig(listeners = UIContentNodeTypeSelector.SaveActionListener.class),
@EventConfig(listeners = UIContentNodeTypeSelector.CancelActionListener.class, phase=Phase.DECODE)
}
)
public class UIContentNodeTypeSelector extends UIForm {
public final static String WEB_CONTENT_NODETYPE_POPUP = "WebContentNodeTypePopup";
/**
* Instantiates a new uIWCM node type select form.
*
* @throws Exception the exception
*/
public UIContentNodeTypeSelector() throws Exception {
}
/**
* Inits the.
*
* @throws Exception the exception
*/
public void init() throws Exception {
getChildren().clear();
TemplateService tempService = getApplicationComponent(TemplateService.class);
List<String> nodeTypes = tempService.getAllDocumentNodeTypes();
UICheckBoxInput uiCheckBox = null;
for(String nodeType : nodeTypes) {
uiCheckBox = new UICheckBoxInput(nodeType, nodeType, null);
if(propertiesSelected(nodeType)) uiCheckBox.setChecked(true);
else uiCheckBox.setChecked(false);
addUIFormInput(uiCheckBox);
}
}
public String getLabel(ResourceBundle res, String id) {
try {
return res.getString("UIContentNodeTypeSelector.label." + id) ;
} catch (MissingResourceException ex) {
return id + " ";
}
}
/**
* Properties selected.
*
* @param name the name
*
* @return true, if successful
*/
private boolean propertiesSelected(String name) {
UIPopupWindow uiPopupWindow = this.getParent();
UIContainer uiContainer = uiPopupWindow.getAncestorOfType(UIContainer.class);
UIContentSelector contentSelector = (UIContentSelector) uiContainer.findFirstComponentOfType(UIContentSelector.class);
UIContentSearchForm contentSearchForm = contentSelector.getChild(UIContentSearchForm.class);
String typeValues = contentSearchForm.getUIStringInput(UIContentSearchForm.DOC_TYPE).getValue() ;
if(typeValues == null) return false ;
if(typeValues.indexOf(",") > -1) {
String[] values = typeValues.split(",") ;
for(String value : values) {
if(value.equals(name)) return true ;
}
} else if(typeValues.equals(name)) {
return true ;
}
return false ;
}
/**
* Sets the node types.
*
* @param selectedNodeTypes the selected node types
* @param uiWCSearchForm the ui wc search form
*/
private void setNodeTypes(List<String> selectedNodeTypes, UIContentSearchForm uiWCSearchForm) {
StringBuffer strNodeTypes = new StringBuffer();
for (int i = 0; i < selectedNodeTypes.size(); i++) {
if (strNodeTypes.length() == 0)
strNodeTypes = new StringBuffer(selectedNodeTypes.get(i));
else
strNodeTypes.append(",").append(selectedNodeTypes.get(i));
}
uiWCSearchForm.getUIStringInput(UIContentSearchForm.DOC_TYPE).setValue(strNodeTypes.toString());
}
/**
* The listener interface for receiving saveAction events.
* The class that is interested in processing a saveAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addSaveActionListener</code> method. When
* the saveAction event occurs, that object's appropriate
* method is invoked.
*/
public static class SaveActionListener extends EventListener<UIContentNodeTypeSelector> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UIContentNodeTypeSelector> event) throws Exception {
UIContentNodeTypeSelector contentNodetypeSelector = event.getSource();
UIPopupWindow uiPopupWindow = contentNodetypeSelector.getParent();
UIContainer uiContainer = uiPopupWindow.getAncestorOfType(UIContainer.class);
UIContentSelector contentSelector = (UIContentSelector) uiContainer.findFirstComponentOfType(UIContentSelector.class);
List<String> selectedNodeTypes = new ArrayList<String>();
List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>();
contentNodetypeSelector.findComponentOfType(listCheckbox, UICheckBoxInput.class);
UIContentSearchForm contentSearchForm = contentSelector.getChild(UIContentSearchForm.class);
String nodeTypesValue = contentSearchForm.getUIStringInput(UIContentSearchForm.DOC_TYPE).getValue();
contentNodetypeSelector.makeSelectedNode(nodeTypesValue, selectedNodeTypes, listCheckbox);
contentNodetypeSelector.setNodeTypes(selectedNodeTypes, contentSearchForm);
contentSelector.setSelectedTab(contentSearchForm.getId());
uiPopupWindow.setRendered(false);
uiPopupWindow.setShow(false);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupWindow);
event.getRequestContext().addUIComponentToUpdateByAjax(contentSearchForm);
}
}
/**
* Make selected node.
*
* @param nodeTypesValue the node types value
* @param selectedNodeTypes the selected node types
* @param listCheckbox the list checkbox
*
* @throws Exception the exception
*/
private void makeSelectedNode(String nodeTypesValue,
List<String> selectedNodeTypes, List<UICheckBoxInput> listCheckbox) throws Exception {
if(nodeTypesValue != null && nodeTypesValue.length() > 0) {
String[] array = nodeTypesValue.split(",");
for(int i = 0; i < array.length; i ++) {
selectedNodeTypes.add(array[i].trim());
}
}
for(int i = 0; i < listCheckbox.size(); i ++) {
if(listCheckbox.get(i).isChecked()) {
if(!selectedNodeTypes.contains(listCheckbox.get(i).getName())) {
selectedNodeTypes.add(listCheckbox.get(i).getName());
}
} else if(selectedNodeTypes.contains(listCheckbox.get(i))) {
selectedNodeTypes.remove(listCheckbox.get(i).getName());
} else {
selectedNodeTypes.remove(listCheckbox.get(i).getName());
}
}
}
/**
* The listener interface for receiving cancelAction events.
* The class that is interested in processing a cancelAction
* event implements this interface, and the object created
* with that class is registered with a component using the
* component's <code>addCancelActionListener</code> method. When
* the cancelAction event occurs, that object's appropriate
* method is invoked.
*/
public static class CancelActionListener extends EventListener<UIContentNodeTypeSelector> {
/* (non-Javadoc)
* @see org.exoplatform.webui.event.EventListener#execute(org.exoplatform.webui.event.Event)
*/
public void execute(Event<UIContentNodeTypeSelector> event) throws Exception {
UIContentNodeTypeSelector contentNodetypeSelector = event.getSource();
UIPopupWindow uiPopupWindow = contentNodetypeSelector.getParent();
uiPopupWindow.setRendered(false);
uiPopupWindow.setShow(false);
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopupWindow);
}
}
}