package er.extensions.components; import java.io.Serializable; import com.webobjects.appserver.WOContext; import com.webobjects.foundation.NSArray; import er.extensions.localization.ERXLocalizer; /** * A custom boolean selector (defaults to "Yes", "No", and "All") for use as, for instance, a boolean search filter. * * @author mschrag * @author ak * * @binding yesString the string to show for the "Yes" option * @binding noString the string to show for the "No" option * @binding noSelectionString the string to show for the "All" option * @binding selection the selected value */ public class ERXBooleanSelector extends ERXStatelessComponent { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; private final NSArray<Boolean> _options = new NSArray<>(new Boolean[] { Boolean.TRUE, Boolean.FALSE }); public static class BooleanProxy implements Serializable { /** * Do I need to update serialVersionUID? * See section 5.6 <cite>Type Changes Affecting Serialization</cite> on page 51 of the * <a href="http://java.sun.com/j2se/1.4/pdf/serial-spec.pdf">Java Object Serialization Spec</a> */ private static final long serialVersionUID = 1L; private final Boolean _value; BooleanProxy(Boolean value) { _value = value; } public Boolean value() { return _value; } @Override public String toString() { return _value != null ? _value.toString() : null; } @Override public int hashCode() { return _value == null ? 0 : _value.hashCode(); } @Override public boolean equals(Object other) { return other == _value || (other != null && ((BooleanProxy) other).value() == _value); } } private static final BooleanProxy TRUE = new BooleanProxy(Boolean.TRUE); private static final BooleanProxy FALSE = new BooleanProxy(Boolean.FALSE); private static final BooleanProxy NULL = new BooleanProxy(null); private final NSArray<BooleanProxy> _proxyOptions = new NSArray<>(new BooleanProxy[] { TRUE, FALSE }); private final NSArray<BooleanProxy> _proxyOptionsWithNull = new NSArray<>(new BooleanProxy[] { TRUE, FALSE, NULL}); public Boolean _option; public BooleanProxy _proxy; public ERXBooleanSelector(WOContext context) { super(context); } public String noSelectionString() { String noSelectionString = stringValueForBinding("noSelectionString"); if(noSelectionString != null) { noSelectionString = ERXLocalizer.currentLocalizer().localizedStringForKeyWithDefault(noSelectionString); } return noSelectionString; } public String displayString() { String displayString; if (_option == Boolean.TRUE || _proxy == TRUE) { displayString = ERXLocalizer.currentLocalizer().localizedStringForKeyWithDefault(stringValueForBinding("yesString", "Yes")); } else if (_option == Boolean.FALSE || _proxy == FALSE) { displayString = ERXLocalizer.currentLocalizer().localizedStringForKeyWithDefault(stringValueForBinding("noString", "No")); } else { displayString = noSelectionString(); } return displayString; } public String uiMode() { return stringValueForBinding("uiMode", "popup"); } public boolean isPopup() { return "popup".equals(uiMode()); } public boolean isCheckbox() { return "checkbox".equals(uiMode()); } public boolean isRadio() { return "radio".equals(uiMode()); } public Object proxySelection() { Boolean value = (Boolean) valueForBinding("selection"); if(value == null) return NULL; if(value) return TRUE; return FALSE; } public void setProxySelection(Object object) { setValueForBinding(((BooleanProxy)object).value(), "selection"); } public NSArray<BooleanProxy> proxyOptions() { if(noSelectionString() == null) { return _proxyOptions; } return _proxyOptionsWithNull; } public NSArray<Boolean> options() { return _options; } @Override public void reset() { _option = null; _proxy = null; super.reset(); } }