/*
* (C) Copyright 2006-2008 Nuxeo SAS (http://nuxeo.com/) and contributors.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser General Public License
* (LGPL) version 2.1 which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/lgpl.html
*
* This library 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
* Lesser General Public License for more details.
*
* Contributors:
* <a href="mailto:at@nuxeo.com">Anahide Tchertchian</a>
*
* $Id: SuggestionActionsBean.java 59340 2008-12-12 14:07:40Z cbaican $
*/
package org.nuxeo.ecm.platform.ui.web.util;
import static org.jboss.seam.ScopeType.EVENT;
import java.io.Serializable;
import javax.faces.component.EditableValueHolder;
import javax.faces.component.UIComponent;
import javax.faces.component.ValueHolder;
import javax.faces.event.ActionEvent;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.web.RequestParameter;
import org.nuxeo.ecm.platform.ui.web.component.list.UIEditableList;
/**
* Suggestion actions helpers
*
* @author Anahide Tchertchian
* @since 5.2M4
*/
@Name("suggestionActions")
@Scope(EVENT)
public class SuggestionActionsBean implements Serializable {
private static final long serialVersionUID = 1L;
private static final Log log = LogFactory.getLog(SuggestionActionsBean.class);
/**
* Id of the input selector
* <p>
* Component must be an instance of {@link ValueHolder}
*/
@RequestParameter
protected String suggestionInputSelectorId;
/**
* Id of the editable list component where selection ids are put.
* <p>
* Component must be an instance of {@link UIEditableList}
*/
@RequestParameter
protected String suggestionSelectionListId;
/**
* Id of the output component where single selection is displayed
* <p>
* Component must be an instance of {@link ValueHolder}
*/
@RequestParameter
protected String suggestionSelectionOutputId;
/**
* Id if the hidden component where single selection id is put
* <p>
* Component must be an instance of {@link EditableValueHolder}
*/
@RequestParameter
protected String suggestionSelectionHiddenId;
/**
* Id of the delete component displayed next to single selection
* <p>
* Component must be an instance of {@link UIComponent}
*/
@RequestParameter
protected String suggestionSelectionDeleteId;
protected String selectedValue;
public String getSelectedValue() {
return selectedValue;
}
public void setSelectedValue(String selectedValue) {
this.selectedValue = selectedValue;
}
/**
* Gets the base naming container from anchor.
* <p>
* Gets out of suggestion box as it's a naming container and we can't get
* components out of it with a relative path => take above first found
* container.
*
* @deprecated: use {@link ComponentUtils#getBase(UIComponent)} instead
*/
@Deprecated
protected UIComponent getBase(UIComponent anchor) {
return ComponentUtils.getBase(anchor);
}
/**
* Adds selection from selector as a list element
* <p>
* Must pass request parameter "suggestionSelectionListId" holding the
* binding to model. Selection will be retrieved using the
* {@link #getSelectedValue()} method.
*/
public void addBoundSelectionToList(ActionEvent event) {
UIComponent component = event.getComponent();
if (component == null) {
return;
}
UIComponent base = ComponentUtils.getBase(component);
UIEditableList list = ComponentUtils.getComponent(base,
suggestionSelectionListId, UIEditableList.class);
if (list != null) {
// add selected value to the list
String selectedValue = getSelectedValue();
if (!StringUtils.isBlank(selectedValue)) {
list.addValue(selectedValue);
}
}
}
/**
* Adds selection from selector as a list element
* <p>
* Must pass request parameters "suggestionInputSelectorId" holding the
* value to pass to the binding component, "suggestionSelectionListId"
* holding the binding to model.
*
* @deprecated use {@link #addBoundSelectionToList(ActionEvent)} which
* retrieves selected value from bound method instead of
* retrieving suggestion input.
*/
@Deprecated
public void addSelectionToList(ActionEvent event) {
UIComponent component = event.getComponent();
if (component == null) {
return;
}
UIComponent base = ComponentUtils.getBase(component);
ValueHolder selector = ComponentUtils.getComponent(base,
suggestionInputSelectorId, ValueHolder.class);
UIEditableList list = ComponentUtils.getComponent(base,
suggestionSelectionListId, UIEditableList.class);
if (selector != null && list != null) {
// add selected value to the list
list.addValue(selector.getValue());
}
}
/**
* Adds selection from selector as single element
* <p>
* Must pass request parameters "suggestionSelectionOutputId" holding the
* value to show, and "suggestionSelectionHiddenId" holding the binding to
* model. Selection will be retrieved using the {@link #getSelectedValue()}
* method. Since 5.5, only one of these two parameters is required.
* <p>
* Additional optional request parameter "suggestionSelectionDeleteId" can
* be used to show an area where the "clear" button is shown.
*/
public void addSingleBoundSelection(ActionEvent event) {
UIComponent component = event.getComponent();
if (component == null) {
return;
}
UIComponent base = ComponentUtils.getBase(component);
EditableValueHolder hiddenSelector = null;
if (suggestionSelectionHiddenId != null) {
hiddenSelector = ComponentUtils.getComponent(base,
suggestionSelectionHiddenId, EditableValueHolder.class);
}
ValueHolder output = null;
if (suggestionSelectionOutputId != null) {
output = ComponentUtils.getComponent(base,
suggestionSelectionOutputId, ValueHolder.class);
}
if (output != null || hiddenSelector != null) {
String selectedValue = getSelectedValue();
if (output != null) {
output.setValue(selectedValue);
}
if (hiddenSelector != null) {
hiddenSelector.setSubmittedValue(selectedValue);
}
// display delete component if needed
if (suggestionSelectionDeleteId != null) {
UIComponent deleteComponent = ComponentUtils.getComponent(base,
suggestionSelectionDeleteId, UIComponent.class);
if (deleteComponent != null) {
deleteComponent.setRendered(true);
}
}
}
}
/**
* Adds selection from selector as single element
* <p>
* Must pass request parameters "suggestionInputSelectorId" holding the
* value to pass to the binding component, "suggestionSelectionOutputId"
* holding the value to show, and "suggestionSelectionHiddenId" holding the
* binding to model.
* <p>
* Additional optional request parameter "suggestionSelectionDeleteId" can
* be used to show an area where the "clear" button is shown. *
*
* @deprecated use {@link #addBoundSelectionToList(ActionEvent)} which
* retrieves selected value from bound method instead of
* retrieving suggestion input.
*/
@Deprecated
public void addSingleSelection(ActionEvent event) {
UIComponent component = event.getComponent();
if (component == null) {
return;
}
UIComponent base = ComponentUtils.getBase(component);
ValueHolder selector = ComponentUtils.getComponent(base,
suggestionInputSelectorId, ValueHolder.class);
EditableValueHolder hiddenSelector = ComponentUtils.getComponent(base,
suggestionSelectionHiddenId, EditableValueHolder.class);
ValueHolder output = ComponentUtils.getComponent(base,
suggestionSelectionOutputId, ValueHolder.class);
if (selector != null && hiddenSelector != null && output != null) {
String selection = (String) selector.getValue();
output.setValue(selection);
hiddenSelector.setSubmittedValue(selection);
// display delete component if needed
if (suggestionSelectionDeleteId != null) {
UIComponent deleteComponent = ComponentUtils.getComponent(base,
suggestionSelectionDeleteId, UIComponent.class);
if (deleteComponent != null) {
deleteComponent.setRendered(true);
}
}
}
}
/**
* Clears single selection.
* <p>
* Must pass request parameters "suggestionSelectionOutputId" holding the
* value to show, and "suggestionSelectionHiddenId" holding the binding to
* model. Since 5.5, only one of these two parameters is required.
* <p>
* Additional optional request parameter "suggestionSelectionDeleteId" can
* be used to hide an area where the "clear" button is shown.
*/
public void clearSingleSelection(ActionEvent event) {
UIComponent component = event.getComponent();
if (component == null) {
return;
}
UIComponent base = component;
EditableValueHolder hiddenSelector = null;
if (suggestionSelectionHiddenId != null) {
hiddenSelector = ComponentUtils.getComponent(base,
suggestionSelectionHiddenId, EditableValueHolder.class);
}
ValueHolder output = null;
if (suggestionSelectionOutputId != null) {
output = ComponentUtils.getComponent(base,
suggestionSelectionOutputId, ValueHolder.class);
}
if (output != null || hiddenSelector != null) {
if (output != null) {
output.setValue("");
}
if (hiddenSelector != null) {
hiddenSelector.setSubmittedValue("");
}
// hide delete component if needed
if (suggestionSelectionDeleteId != null) {
UIComponent deleteComponent = ComponentUtils.getComponent(base,
suggestionSelectionDeleteId, UIComponent.class);
if (deleteComponent != null) {
deleteComponent.setRendered(false);
}
}
}
}
}