/*
* Copyright (C) 2003-2007 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.ecm.webui.component.admin.nodetype;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeIterator;
import javax.jcr.nodetype.NodeTypeManager;
import org.apache.commons.lang.StringUtils;
import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction;
import org.exoplatform.ecm.webui.utils.Utils;
import org.exoplatform.services.jcr.RepositoryService;
import org.exoplatform.web.application.ApplicationMessage;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIApplication;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.event.Event;
import org.exoplatform.webui.event.EventListener;
import org.exoplatform.webui.form.UIFormInputInfo;
import org.exoplatform.webui.form.UIFormInputSet;
import org.exoplatform.webui.form.UIFormTableInputSet;
import org.exoplatform.webui.form.input.UICheckBoxInput;
/**
* Created by The eXo Platform SARL
* Author : Dang Van Minh
* minh.dang@exoplatform.com
* Sep 22, 2006
* 2:20:31 PM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "classpath:groovy/ecm/webui/form/UIFormInputSetWithAction.gtmpl",
events = {
@EventConfig(listeners = UINodeTypeOptionList.AddTypeActionListener.class)
}
)
public class UINodeTypeOptionList extends UIFormInputSetWithAction {
final static String TABLE_NAME = "UINodeTypeOptionList";
final static String[] TABLE_COLUMNS = {"label", "input"};
public UINodeTypeOptionList(String name) throws Exception {
super(name) ;
setComponentConfig(getClass(), null) ;
}
public void processRender(WebuiRequestContext context) throws Exception {
super.processRender(context) ;
}
private boolean getCheckedValue(String values, String name) {
String[] selectNodes = values.split(",") ;
for(int i = 0 ; i < selectNodes.length ; i ++ ) {
if(selectNodes[i].equals(name)) return true ;
}
return false ;
}
public void update(String values) throws Exception {
UIFormTableInputSet uiTableInputSet = createUIComponent(UIFormTableInputSet.class, null, null) ;
NodeTypeManager ntManager = getApplicationComponent(RepositoryService.class)
.getCurrentRepository().getNodeTypeManager() ;
NodeTypeIterator nodeTypeIter = ntManager.getAllNodeTypes() ;
List<NodeType> nodeTypeList = new ArrayList<NodeType>() ;
while(nodeTypeIter.hasNext()) {
NodeType nt = nodeTypeIter.nextNodeType() ;
nodeTypeList.add(nt) ;
}
Collections.sort(nodeTypeList, new Utils.NodeTypeNameComparator()) ;
UIFormInputSet uiInputSet ;
uiTableInputSet.setName(TABLE_NAME);
uiTableInputSet.setColumns(TABLE_COLUMNS);
for(NodeType nt : nodeTypeList) {
String ntName = nt.getName() ;
uiInputSet = new UIFormInputSet(ntName) ;
UIFormInputInfo uiInfo = new UIFormInputInfo("label", null, ntName);
uiInputSet.addChild(uiInfo);
UICheckBoxInput uiCheckbox = new UICheckBoxInput(ntName, ntName, null);
if(values != null) {
if(getCheckedValue(values, ntName)) uiCheckbox.setChecked(true) ;
} else {
uiCheckbox.setChecked(false);
}
uiInputSet.addChild(uiCheckbox);
uiTableInputSet.addChild(uiInputSet);
}
addUIFormInput(uiTableInputSet) ;
}
private void setFieldValues(String fieldName, List<String> selectedNodes) throws Exception {
StringBuffer strNodeList = null ;
UINodeTypeForm uiNodeTypeForm = getParent() ;
if(uiNodeTypeForm == null) return;
if(selectedNodes != null && selectedNodes.size() > 0) {
for (int i = 0; i < selectedNodes.size(); i++) {
if (strNodeList == null)
strNodeList = new StringBuffer(selectedNodes.get(i));
else
strNodeList.append(",").append(selectedNodes.get(i));
}
}
if(strNodeList == null)
uiNodeTypeForm.getUIStringInput(fieldName).setValue(StringUtils.EMPTY) ;
else
uiNodeTypeForm.getUIStringInput(fieldName).setValue(strNodeList.toString()) ;
if(fieldName.equals(UINodeTypeForm.SUPER_TYPE)) {
for(UIComponent uiComp : uiNodeTypeForm.getChildren()) {
UIFormInputSetWithAction tab = uiNodeTypeForm.getChildById(uiComp.getId()) ;
if(tab.getId().equals(UINodeTypeForm.NODETYPE_DEFINITION)) uiNodeTypeForm.setSelectedTab(tab.getId()) ;
}
uiNodeTypeForm.removeChildById(UINodeTypeForm.SUPER_TYPE_TAB) ;
} else if(fieldName.equals(UIChildNodeDefinitionForm.REQUIRED_PRIMARY_TYPE)) {
for(UIComponent uiComp : uiNodeTypeForm.getChildren()) {
UIFormInputSetWithAction tab = uiNodeTypeForm.getChildById(uiComp.getId()) ;
if(tab.getId().equals(UINodeTypeForm.CHILDNODE_DEFINITION)) {
uiNodeTypeForm.setSelectedTab(tab.getId()) ;
}
}
uiNodeTypeForm.removeChildById(UINodeTypeForm.REQUIRED_PRIMARY_TYPE_TAB) ;
} else if(fieldName.equals(UIChildNodeDefinitionForm.DEFAULT_PRIMARY_TYPE)) {
for(UIComponent uiComp : uiNodeTypeForm.getChildren()) {
UIFormInputSetWithAction tab = uiNodeTypeForm.getChildById(uiComp.getId()) ;
if(tab.getId().equals(UINodeTypeForm.CHILDNODE_DEFINITION)) {
uiNodeTypeForm.setSelectedTab(tab.getId()) ;
}
}
uiNodeTypeForm.removeChildById(UINodeTypeForm.DEFAULT_PRIMARY_TYPE_TAB) ;
}
}
static public class AddTypeActionListener extends EventListener<UINodeTypeForm> {
public void execute(Event<UINodeTypeForm> event) throws Exception {
UINodeTypeForm uiForm= event.getSource() ;
UINodeTypeOptionList uiOptionList = uiForm.getChild(UINodeTypeOptionList.class) ;
UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ;
String fieldName = event.getRequestContext().getRequestParameter(OBJECTID) ;
List<String> selectedNodes = new ArrayList<String>() ;
UINodeTypeManager uiManager = uiForm.getAncestorOfType(UINodeTypeManager.class) ;
List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>();
uiForm.findComponentOfType(listCheckbox, UICheckBoxInput.class);
int count = 0 ;
for(int i = 0; i < listCheckbox.size(); i ++) {
if(listCheckbox.get(i).isChecked()) {
selectedNodes.add(listCheckbox.get(i).getName()) ;
count ++ ;
}
}
if(fieldName.equals(UIChildNodeDefinitionForm.DEFAULT_PRIMARY_TYPE) && count > 1) {
uiApp.addMessage(new ApplicationMessage("UINodeTypeForm.msg.values-error", null)) ;
uiForm.setTabRender(UINodeTypeForm.DEFAULT_PRIMARY_TYPE_TAB) ;
return ;
}
uiOptionList.setFieldValues(fieldName, selectedNodes) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ;
}
}
static public class CancelTabActionListener extends EventListener<UINodeTypeForm> {
public void execute(Event<UINodeTypeForm> event) throws Exception {
UINodeTypeForm uiForm= event.getSource() ;
String tabName = event.getRequestContext().getRequestParameter(OBJECTID) ;
if(tabName.equals(UINodeTypeForm.SUPER_TYPE_TAB)) {
uiForm.removeChildById(tabName) ;
uiForm.setSelectedTab(UINodeTypeForm.NODETYPE_DEFINITION) ;
} else if(tabName.equals(UINodeTypeForm.DEFAULT_PRIMARY_TYPE_TAB) ||
tabName.equals(UINodeTypeForm.REQUIRED_PRIMARY_TYPE_TAB)) {
uiForm.removeChildById(tabName) ;
uiForm.setSelectedTab(UINodeTypeForm.CHILDNODE_DEFINITION) ;
}
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()) ;
}
}
}