/*
* 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.explorer.search;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.Session;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.PropertyDefinition;
import org.exoplatform.ecm.webui.component.explorer.UIJCRExplorer;
import org.exoplatform.services.cms.BasePath;
import org.exoplatform.services.cms.impl.DMSConfiguration;
import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.webui.config.annotation.ComponentConfig;
import org.exoplatform.webui.config.annotation.EventConfig;
import org.exoplatform.webui.core.UIPopupComponent;
import org.exoplatform.webui.core.UIPopupContainer;
import org.exoplatform.webui.core.lifecycle.UIFormLifecycle;
import org.exoplatform.webui.core.model.SelectItemOption;
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.UIFormRadioBoxInput;
import org.exoplatform.webui.form.UIFormSelectBox;
/**
* Created by The eXo Platform SARL
* Author : Tran The Trong
* trong.tran@exoplatform.com
* May 6, 2007
* 10:18:56 AM
*/
@ComponentConfig(
lifecycle = UIFormLifecycle.class,
template = "system:/groovy/webui/form/UIForm.gtmpl",
events = {
@EventConfig(phase=Phase.DECODE, listeners = UISelectPropertyForm.CancelActionListener.class),
@EventConfig(listeners = UISelectPropertyForm.AddActionListener.class),
@EventConfig(listeners = UISelectPropertyForm.ChangeMetadataTypeActionListener.class)
}
)
public class UISelectPropertyForm extends UIForm implements UIPopupComponent {
private static final Log LOG = ExoLogger.getLogger(UISelectPropertyForm.class.getName());
final static public String METADATA_TYPE= "metadataType" ;
final static public String PROPERTY = "property" ;
private String fieldName_ = null ;
private List<SelectItemOption<String>> properties_ = new ArrayList<SelectItemOption<String>>() ;
public UISelectPropertyForm() throws Exception {
setActions(new String[] {"Add", "Cancel"}) ;
}
public String getLabel(ResourceBundle res, String id) {
try {
return super.getLabel(res, id) ;
} catch (Exception ex) {
return id ;
}
}
public void activate() {
try {
List<SelectItemOption<String>> options = new ArrayList<SelectItemOption<String>>() ;
NodeHierarchyCreator nodeHierarchyCreator = getApplicationComponent(NodeHierarchyCreator.class) ;
UIFormSelectBox uiSelect = new UIFormSelectBox(METADATA_TYPE, METADATA_TYPE, options) ;
uiSelect.setOnChange("ChangeMetadataType") ;
addUIFormInput(uiSelect) ;
String metadataPath = nodeHierarchyCreator.getJcrPath(BasePath.METADATA_PATH) ;
UIJCRExplorer uiExplorer = getAncestorOfType(UIJCRExplorer.class) ;
DMSConfiguration dmsConfiguration = getApplicationComponent(DMSConfiguration.class);
String workspaceName = dmsConfiguration.getConfig().getSystemWorkspace();
Session session = uiExplorer.getSystemProvider().getSession(workspaceName, uiExplorer.getRepository());
Node homeNode = (Node) session.getItem(metadataPath) ;
NodeIterator nodeIter = homeNode.getNodes() ;
Node meta = nodeIter.nextNode() ;
renderProperties(meta.getName()) ;
options.add(new SelectItemOption<String>(meta.getName(), meta.getName())) ;
while(nodeIter.hasNext()) {
meta = nodeIter.nextNode() ;
options.add(new SelectItemOption<String>(meta.getName(), meta.getName())) ;
}
addUIFormInput(new UIFormRadioBoxInput(PROPERTY, null, properties_).
setAlign(UIFormRadioBoxInput.VERTICAL_ALIGN)) ;
} catch (Exception e) {
if (LOG.isErrorEnabled()) {
LOG.error("Unexpected error!", e.getMessage());
}
}
}
public void deActivate() {}
public void setFieldName(String fieldName) { fieldName_ = fieldName ; }
public void renderProperties(String metadata) throws Exception {
properties_.clear() ;
UIJCRExplorer uiExpolrer = getAncestorOfType(UIJCRExplorer.class) ;
NodeTypeManager ntManager = uiExpolrer.getSession().getWorkspace().getNodeTypeManager() ;
NodeType nt = ntManager.getNodeType(metadata) ;
PropertyDefinition[] properties = nt.getPropertyDefinitions() ;
for(PropertyDefinition property : properties) {
String name = property.getName() ;
if(!name.equals("exo:internalUse")) properties_.add(new SelectItemOption<String>(name, name)) ;
}
}
static public class CancelActionListener extends EventListener<UISelectPropertyForm> {
public void execute(Event<UISelectPropertyForm> event) throws Exception {
UISearchContainer uiSearchContainer = event.getSource().getAncestorOfType(UISearchContainer.class) ;
UIPopupContainer uiPopup = uiSearchContainer.getChild(UIPopupContainer.class) ;
uiPopup.deActivate() ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiPopup) ;
}
}
static public class AddActionListener extends EventListener<UISelectPropertyForm> {
public void execute(Event<UISelectPropertyForm> event) throws Exception {
UISelectPropertyForm uiForm = event.getSource() ;
String property = uiForm.<UIFormRadioBoxInput>getUIInput(PROPERTY).getValue();
UIPopupContainer UIPopupContainer = uiForm.getAncestorOfType(UIPopupContainer.class);
UISearchContainer uiSearchContainer = UIPopupContainer.getParent() ;
UIConstraintsForm uiConstraintsForm =
uiSearchContainer.findFirstComponentOfType(UIConstraintsForm.class) ;
/* Set value for textbox */
uiConstraintsForm.getUIStringInput(uiForm.fieldName_).setValue(property) ;
/* Set value of checkbox is checked when choose value of property */
if (uiForm.fieldName_.equals(UIConstraintsForm.PROPERTY1)) {
uiConstraintsForm.getUICheckBoxInput(UIConstraintsForm.EXACTLY_PROPERTY).setChecked(true);
} else if (uiForm.fieldName_.equals(UIConstraintsForm.PROPERTY2)) {
uiConstraintsForm.getUICheckBoxInput(UIConstraintsForm.CONTAIN_PROPERTY).setChecked(true);
} else if (uiForm.fieldName_.equals(UIConstraintsForm.PROPERTY3)) {
uiConstraintsForm.getUICheckBoxInput(UIConstraintsForm.NOT_CONTAIN_PROPERTY).setChecked(true);
}
UIPopupContainer.deActivate() ;
event.getRequestContext().addUIComponentToUpdateByAjax(UIPopupContainer) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiConstraintsForm) ;
}
}
static public class ChangeMetadataTypeActionListener extends EventListener<UISelectPropertyForm> {
public void execute(Event<UISelectPropertyForm> event) throws Exception {
UISelectPropertyForm uiForm = event.getSource() ;
uiForm.renderProperties(uiForm.getUIFormSelectBox(METADATA_TYPE).getValue()) ;
event.getRequestContext().addUIComponentToUpdateByAjax(uiForm) ;
}
}
}