/*************************************************************************** * Copyright 2001-2010 The eXo Platform SARL All rights reserved. * * Please look at license.txt in info directory for more license detail. * **************************************************************************/ package org.exoplatform.ecm.webui.component.admin.drives; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.exoplatform.ecm.webui.selector.ComponentSelector; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.core.UIPageIterator; 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.UIFormStringInput; import org.exoplatform.webui.form.input.UICheckBoxInput; /** * Created by The eXo Platform SARL * Author : Dang Van Minh * minh.dang@exoplatform.com * Apr 19, 2010 */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/groovy/webui/component/admin/drives/UINodeTypeSelector.gtmpl", events = { @EventConfig(listeners = UINodeTypeSelector.SearchNodeTypeActionListener.class), @EventConfig(listeners = UINodeTypeSelector.SaveActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeSelector.RefreshActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeSelector.SelectedAllNodeTypesActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeSelector.ShowPageActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeSelector.OnChangeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeSelector.CloseActionListener.class, phase = Phase.DECODE) } ) public class UINodeTypeSelector extends org.exoplatform.ecm.webui.nodetype.selector.UINodeTypeSelector implements ComponentSelector { private static final String ALL_DOCUMENT_TYPES = "ALL_DOCUMENT_TYPES"; public UINodeTypeSelector() throws Exception { } public static class SearchNodeTypeActionListener extends EventListener<UINodeTypeSelector> { public void execute(Event<UINodeTypeSelector> event) throws Exception { UINodeTypeSelector uiNodeTypeSelector = event.getSource(); UIFormStringInput uiInputNodeType = (UIFormStringInput)uiNodeTypeSelector.findComponentById("NodeTypeText"); String nodeTypeName = uiInputNodeType.getValue(); if (nodeTypeName == null || nodeTypeName.length() == 0) return; if (nodeTypeName.contains("*") && !nodeTypeName.contains(".*")) { nodeTypeName = nodeTypeName.replace("*", ".*"); } Pattern p = Pattern.compile(".*".concat(nodeTypeName.trim()).concat(".*"), Pattern.CASE_INSENSITIVE); if (uiNodeTypeSelector.getLSTNodetype() == null) uiNodeTypeSelector.setLSTNodetype(uiNodeTypeSelector.getAllNodeTypes()); List<NodeTypeBean> lstNodetype = new ArrayList<NodeTypeBean>(); for (NodeTypeBean nodeType : uiNodeTypeSelector.getLSTNodetype()) { if (p.matcher(nodeType.getName()).find()) { lstNodetype.add(nodeType); } } uiNodeTypeSelector.init(1, uiNodeTypeSelector.getSelectedNodetypes(), lstNodetype); UIPopupWindow uiPopup = event.getSource().getAncestorOfType(UIPopupWindow.class); uiPopup.setShowMask(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup); } } public static class OnChangeActionListener extends EventListener<UINodeTypeSelector> { private void updateCheckBox(List<String> selectedNodetypes, UICheckBoxInput uiCheckBox) { if (uiCheckBox.isChecked()) { if (!selectedNodetypes.contains(uiCheckBox.getName().toString())) selectedNodetypes.add(uiCheckBox.getName().toString()); } else { selectedNodetypes.remove(uiCheckBox.getName().toString()); } } public void execute(Event<UINodeTypeSelector> event) throws Exception { UINodeTypeSelector uiNodeTypeSelect = event.getSource(); List<String> selectedNodetypes = uiNodeTypeSelect.getSelectedNodetypes(); List<String> preSelectedNodetypes = new ArrayList<String>(); preSelectedNodetypes.addAll(selectedNodetypes); List<NodeTypeBean> lstNodeType = uiNodeTypeSelect.getNodeTypeList(); UICheckBoxInput uiCheckBox = (UICheckBoxInput)uiNodeTypeSelect.getChildById(ALL_DOCUMENT_TYPES); updateCheckBox(selectedNodetypes, uiCheckBox); for (NodeTypeBean nodetype : lstNodeType) { uiCheckBox = (UICheckBoxInput) uiNodeTypeSelect.getChildById(nodetype.getName()); updateCheckBox(selectedNodetypes, uiCheckBox); } // if at this times, check box 'ALL_DOCUMENT_TYPES' change if (selectedNodetypes.contains(ALL_DOCUMENT_TYPES) && !preSelectedNodetypes.contains(ALL_DOCUMENT_TYPES)) { for(String nodeTypeName : uiNodeTypeSelect.getDocumentNodetypes()) { ((UICheckBoxInput) uiNodeTypeSelect.getChildById(nodeTypeName)).setChecked(true); if (!selectedNodetypes.contains(nodeTypeName)) selectedNodetypes.add(nodeTypeName); } } else if (!selectedNodetypes.contains(ALL_DOCUMENT_TYPES) && preSelectedNodetypes.contains(ALL_DOCUMENT_TYPES)) { if (selectedNodetypes.containsAll(uiNodeTypeSelect.getDocumentNodetypes())) for (String nodeTypeName : uiNodeTypeSelect.getDocumentNodetypes()) { ((UICheckBoxInput) uiNodeTypeSelect.getChildById(nodeTypeName)).setChecked(false); selectedNodetypes.remove(nodeTypeName); } } UIPopupWindow uiPopup = event.getSource().getAncestorOfType(UIPopupWindow.class); uiPopup.setShowMask(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup); } } public static class SaveActionListener extends EventListener<UINodeTypeSelector> { public void execute(Event<UINodeTypeSelector> event) throws Exception { UINodeTypeSelector uiNodeTypeSelector = event.getSource(); String returnField = uiNodeTypeSelector.getReturnFieldName(); List<String> selectedNodetypes = uiNodeTypeSelector.getSelectedNodetypes(); if (selectedNodetypes.contains(UINodeTypeSelector.ALL_DOCUMENT_TYPES)) { selectedNodetypes.remove(UINodeTypeSelector.ALL_DOCUMENT_TYPES); for (String docNodeType : uiNodeTypeSelector.getDocumentNodetypes()) { if (!selectedNodetypes.contains(docNodeType) && ((UICheckBoxInput) uiNodeTypeSelector.findComponentById(docNodeType)).isChecked()) { selectedNodetypes.add(docNodeType); } } } StringBuffer sb = new StringBuffer(""); int index=0; for (String strNodeType : selectedNodetypes) { if (index == 0) { sb.append(strNodeType); } else { sb.append(",").append(strNodeType); } index++; } String nodeTypeString = sb.toString(); ((UISelectable)uiNodeTypeSelector.getSourceComponent()).doSelect(returnField, nodeTypeString); selectedNodetypes.clear(); UIPopupWindow uiPopup = uiNodeTypeSelector.getParent(); uiPopup.setShow(false); UIComponent component = uiNodeTypeSelector.getSourceComponent().getParent(); if (component != null) event.getRequestContext().addUIComponentToUpdateByAjax(component); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup); } } public static class RefreshActionListener extends EventListener<UINodeTypeSelector> { public void execute(Event<UINodeTypeSelector> event) throws Exception { UINodeTypeSelector uiNodeTypeSelector = event.getSource(); List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>(); uiNodeTypeSelector.findComponentOfType(listCheckbox, UICheckBoxInput.class); for (int i = 0; i < listCheckbox.size(); i++) { listCheckbox.get(i).setChecked(false); uiNodeTypeSelector.getSelectedNodetypes().clear(); } UIPopupWindow uiPopup = event.getSource().getAncestorOfType(UIPopupWindow.class); uiPopup.setShowMask(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup); } } public static class SelectedAllNodeTypesActionListener extends EventListener<UINodeTypeSelector> { public void execute(Event<UINodeTypeSelector> event) throws Exception { UINodeTypeSelector uiNodeTypeSelector = event.getSource(); String returnField = uiNodeTypeSelector.getReturnFieldName(); String value = "*"; ((UISelectable)uiNodeTypeSelector.getSourceComponent()).doSelect(returnField, value); UIPopupWindow uiPopup = uiNodeTypeSelector.getParent(); uiPopup.setShow(false); event.getRequestContext().addUIComponentToUpdateByAjax(uiNodeTypeSelector.getSourceComponent().getParent()); event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup); } } public static class ShowPageActionListener extends EventListener<UIPageIterator> { public void execute(Event<UIPageIterator> event) throws Exception { UINodeTypeSelector uiNodeTypeSelector = event.getSource().getAncestorOfType(UINodeTypeSelector.class); List<String> selectedNodetypes = uiNodeTypeSelector.getSelectedNodetypes(); List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>(); uiNodeTypeSelector.findComponentOfType(listCheckbox, UICheckBoxInput.class); for (UICheckBoxInput uiCheckBox : listCheckbox) { if (selectedNodetypes.contains(uiCheckBox.getValue().toString())) { uiCheckBox.setChecked(true); } else { uiCheckBox.setChecked(false); } } } } public static class CloseActionListener extends EventListener<UINodeTypeSelector> { public void execute(Event<UINodeTypeSelector> event) throws Exception { UINodeTypeSelector uiNodeTypeSelector = event.getSource(); UIPopupWindow uiPopup = uiNodeTypeSelector.getAncestorOfType(UIPopupWindow.class); uiPopup.setShow(false); uiPopup.setRendered(false); UIComponent component = uiNodeTypeSelector.getSourceComponent().getParent(); if (component != null) event.getRequestContext().addUIComponentToUpdateByAjax(component); } } }