From 819bf188d82022c2b941ec8a22ae95306858509f Mon Sep 17 00:00:00 2001 From: Gavin Cornwell Date: Wed, 19 Apr 2006 13:13:34 +0000 Subject: [PATCH] - Added MimeTypeSelector component - Changed edit doc props page to use it - Changed checkbox generator to only apply boolean converter - Moved handling of multiple boolean values from the multi value converter to the boolean converter git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@2666 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../web/bean/generator/CheckboxGenerator.java | 25 ++----- .../generator/MimeTypeSelectorGenerator.java | 56 ++++++++++++++ .../web/ui/common/ComponentConstants.java | 1 + .../converter/BooleanLabelConverter.java | 24 ++++++ .../common/converter/MultiValueConverter.java | 14 +--- .../ui/repo/component/UIMimeTypeSelector.java | 75 +++++++++++++++++++ .../repo/component/property/UIProperty.java | 9 ++- .../component/property/UIPropertySheet.java | 4 +- .../web/ui/repo/tag/MimeTypeSelectorTag.java | 71 ++++++++++++++++++ source/web/WEB-INF/faces-config-beans.xml | 9 +++ source/web/WEB-INF/faces-config-repo.xml | 5 ++ source/web/WEB-INF/repo.tld | 48 ++++++++++++ .../jsp/dialog/edit-document-properties.jsp | 6 +- 13 files changed, 308 insertions(+), 39 deletions(-) create mode 100644 source/java/org/alfresco/web/bean/generator/MimeTypeSelectorGenerator.java create mode 100644 source/java/org/alfresco/web/ui/repo/component/UIMimeTypeSelector.java create mode 100644 source/java/org/alfresco/web/ui/repo/tag/MimeTypeSelectorTag.java diff --git a/source/java/org/alfresco/web/bean/generator/CheckboxGenerator.java b/source/java/org/alfresco/web/bean/generator/CheckboxGenerator.java index d69ce0684..28583dae4 100644 --- a/source/java/org/alfresco/web/bean/generator/CheckboxGenerator.java +++ b/source/java/org/alfresco/web/bean/generator/CheckboxGenerator.java @@ -1,13 +1,12 @@ package org.alfresco.web.bean.generator; import javax.faces.component.UIComponent; -import javax.faces.component.UISelectBoolean; import javax.faces.context.FacesContext; import org.alfresco.service.cmr.dictionary.PropertyDefinition; import org.alfresco.web.app.servlet.FacesHelper; import org.alfresco.web.ui.common.ComponentConstants; -import org.alfresco.web.ui.repo.RepoConstants; +import org.alfresco.web.ui.common.converter.BooleanLabelConverter; import org.alfresco.web.ui.repo.component.property.PropertySheetItem; import org.alfresco.web.ui.repo.component.property.UIPropertySheet; @@ -20,7 +19,7 @@ public class CheckboxGenerator extends BaseComponentGenerator { public UIComponent generate(FacesContext context, String id) { - UIComponent component = (UISelectBoolean)context.getApplication(). + UIComponent component = context.getApplication(). createComponent(ComponentConstants.JAVAX_FACES_SELECT_BOOLEAN); component.setRendererType(ComponentConstants.JAVAX_FACES_CHECKBOX); FacesHelper.setupComponentId(context, component, id); @@ -42,22 +41,10 @@ public class CheckboxGenerator extends BaseComponentGenerator { if (propertySheet.inEditMode() == false) { - if (propertyDef != null && propertyDef.isMultiValued()) - { - // if there isn't a custom converter and the property is - // multi-valued add the multi value converter as a default - createAndSetConverter(context, - RepoConstants.ALFRESCO_FACES_MULTIVALUE_CONVERTER, - component); - } - else - { - // if there isn't a custom converter and the property is - // not multi-valued add the boolean converter as a default - createAndSetConverter(context, - RepoConstants.ALFRESCO_FACES_BOOLEAN_CONVERTER, - component); - } + // if there isn't a custom converter add the boolean + // converter as a default + createAndSetConverter(context, BooleanLabelConverter.CONVERTER_ID, + component); } } } diff --git a/source/java/org/alfresco/web/bean/generator/MimeTypeSelectorGenerator.java b/source/java/org/alfresco/web/bean/generator/MimeTypeSelectorGenerator.java new file mode 100644 index 000000000..01f43dc03 --- /dev/null +++ b/source/java/org/alfresco/web/bean/generator/MimeTypeSelectorGenerator.java @@ -0,0 +1,56 @@ +package org.alfresco.web.bean.generator; + +import javax.faces.component.UIComponent; +import javax.faces.context.FacesContext; + +import org.alfresco.service.cmr.dictionary.PropertyDefinition; +import org.alfresco.web.app.servlet.FacesHelper; +import org.alfresco.web.ui.repo.component.UIMimeTypeSelector; +import org.alfresco.web.ui.repo.component.property.PropertySheetItem; +import org.alfresco.web.ui.repo.component.property.UIPropertySheet; +import org.alfresco.web.ui.repo.converter.MimeTypeConverter; + +/** + * Generates a MIME type selector component. + * + * @author gavinc + */ +public class MimeTypeSelectorGenerator extends BaseComponentGenerator +{ + public UIComponent generate(FacesContext context, String id) + { + UIComponent component = context.getApplication(). + createComponent(UIMimeTypeSelector.COMPONENT_TYPE); + FacesHelper.setupComponentId(context, component, id); + + return component; + } + + @Override + protected void setupConverter(FacesContext context, + UIPropertySheet propertySheet, PropertySheetItem property, + PropertyDefinition propertyDef, UIComponent component) + { + if (property.getConverter() != null) + { + // create and add the custom converter + createAndSetConverter(context, property.getConverter(), component); + } + else + { + // if there isn't a custom converter add the mime type + // converter as a default + createAndSetConverter(context, MimeTypeConverter.CONVERTER_ID, + component); + } + } + + @Override + protected void setupMandatoryValidation(FacesContext context, + UIPropertySheet propertySheet, PropertySheetItem item, + UIComponent component, boolean realTimeChecking) + { + // a mime type selector will always have one value or another + // so there is no need to create a mandatory validation rule. + } +} diff --git a/source/java/org/alfresco/web/ui/common/ComponentConstants.java b/source/java/org/alfresco/web/ui/common/ComponentConstants.java index 72222154b..062a8afc8 100644 --- a/source/java/org/alfresco/web/ui/common/ComponentConstants.java +++ b/source/java/org/alfresco/web/ui/common/ComponentConstants.java @@ -30,6 +30,7 @@ public final class ComponentConstants public static final String JAVAX_FACES_SELECT_BOOLEAN = "javax.faces.SelectBoolean"; public static final String JAVAX_FACES_GRAPHIC = "javax.faces.Graphic"; public static final String JAVAX_FACES_PARAMETER = "javax.faces.Parameter"; + public static final String JAVAX_FACES_MENU = "javax.faces.Menu"; /** * Private constructor diff --git a/source/java/org/alfresco/web/ui/common/converter/BooleanLabelConverter.java b/source/java/org/alfresco/web/ui/common/converter/BooleanLabelConverter.java index 99e3f7217..526aaffd2 100644 --- a/source/java/org/alfresco/web/ui/common/converter/BooleanLabelConverter.java +++ b/source/java/org/alfresco/web/ui/common/converter/BooleanLabelConverter.java @@ -16,6 +16,7 @@ */ package org.alfresco.web.ui.common.converter; +import java.util.Collection; import java.util.ResourceBundle; import javax.faces.component.UIComponent; @@ -63,6 +64,29 @@ public class BooleanLabelConverter implements Converter { result = ((Boolean)value).booleanValue() ? bundle.getString(MSG_YES) : bundle.getString(MSG_NO); } + else if (value instanceof Collection) + { + StringBuilder buffer = new StringBuilder(); + for (Object obj : (Collection)value) + { + if (buffer.length() != 0) + { + buffer.append(", "); + } + + if (obj instanceof Boolean) + { + buffer.append(((Boolean)obj).booleanValue() ? + bundle.getString(MSG_YES) : bundle.getString(MSG_NO)); + } + else + { + buffer.append(obj.toString()); + } + } + + result = buffer.toString(); + } return result; } diff --git a/source/java/org/alfresco/web/ui/common/converter/MultiValueConverter.java b/source/java/org/alfresco/web/ui/common/converter/MultiValueConverter.java index 35a297a4a..436de5cc0 100644 --- a/source/java/org/alfresco/web/ui/common/converter/MultiValueConverter.java +++ b/source/java/org/alfresco/web/ui/common/converter/MultiValueConverter.java @@ -26,9 +26,6 @@ import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; -import org.alfresco.web.app.Application; -import org.alfresco.web.ui.repo.RepoConstants; - /** * Converter class to convert a List of multiple values into a comma * separated list. @@ -76,16 +73,7 @@ public class MultiValueConverter implements Converter buffer.append(", "); } - if (obj instanceof Boolean) - { - Converter boolLabel = context.getApplication().createConverter( - RepoConstants.ALFRESCO_FACES_BOOLEAN_CONVERTER); - buffer.append(boolLabel.getAsString(context, component, obj)); - } - else - { - buffer.append(obj.toString()); - } + buffer.append(obj.toString()); } result = buffer.toString(); diff --git a/source/java/org/alfresco/web/ui/repo/component/UIMimeTypeSelector.java b/source/java/org/alfresco/web/ui/repo/component/UIMimeTypeSelector.java new file mode 100644 index 000000000..5eee0c3d2 --- /dev/null +++ b/source/java/org/alfresco/web/ui/repo/component/UIMimeTypeSelector.java @@ -0,0 +1,75 @@ +package org.alfresco.web.ui.repo.component; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.faces.component.UISelectItems; +import javax.faces.component.UISelectOne; +import javax.faces.context.FacesContext; +import javax.faces.model.SelectItem; + +import org.alfresco.service.ServiceRegistry; +import org.alfresco.service.cmr.repository.MimetypeService; +import org.alfresco.web.bean.repository.Repository; +import org.alfresco.web.data.IDataContainer; +import org.alfresco.web.data.QuickSort; + +/** + * Component that holds a list of MIME types configured in the repository. + * + * @author gavinc + */ +public class UIMimeTypeSelector extends UISelectOne +{ + public static final String COMPONENT_TYPE = "org.alfresco.faces.MimeTypeSelector"; + public static final String COMPONENT_FAMILY = "javax.faces.SelectOne"; + + @Override + @SuppressWarnings("unchecked") + public void encodeBegin(FacesContext context) throws IOException + { + // if the component does not have any children yet create the + // list of MIME types the user can choose from as a child + // SelectItems component. + if (getChildren().size() == 0) + { + UISelectItems items = (UISelectItems)context.getApplication(). + createComponent("javax.faces.SelectItems"); + items.setValue(createList()); + + // add the child component + getChildren().add(items); + } + + // do the default processing + super.encodeBegin(context); + } + + /** + * Creates the list of SelectItem components to represent the list + * of MIME types the user can select from + * + * @return List of SelectItem components + */ + protected List createList() + { + List items = new ArrayList(80); + ServiceRegistry registry = Repository.getServiceRegistry(FacesContext.getCurrentInstance()); + MimetypeService mimetypeService = registry.getMimetypeService(); + + // get the mime type display names + Map mimeTypes = mimetypeService.getDisplaysByMimetype(); + for (String mimeType : mimeTypes.keySet()) + { + items.add(new SelectItem(mimeType, mimeTypes.get(mimeType))); + } + + // make sure the list is sorted by the values + QuickSort sorter = new QuickSort(items, "label", true, IDataContainer.SORT_CASEINSENSITIVE); + sorter.sort(); + + return items; + } +} diff --git a/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java b/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java index 73bd78bc3..f844797c9 100644 --- a/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java +++ b/source/java/org/alfresco/web/ui/repo/component/property/UIProperty.java @@ -198,7 +198,14 @@ public class UIProperty extends PropertySheetItem */ private void generateControl(FacesContext context, UIPropertySheet propSheet, String propName) { - UIComponent control = FacesHelper.getComponentGenerator(context, RepoConstants.GENERATOR_TEXT_FIELD). + String componentGeneratorName = this.getComponentGenerator(); + + if (componentGeneratorName == null) + { + componentGeneratorName = RepoConstants.GENERATOR_TEXT_FIELD; + } + + UIComponent control = FacesHelper.getComponentGenerator(context, componentGeneratorName). generateAndAdd(context, propSheet, this); if (logger.isDebugEnabled()) diff --git a/source/java/org/alfresco/web/ui/repo/component/property/UIPropertySheet.java b/source/java/org/alfresco/web/ui/repo/component/property/UIPropertySheet.java index ebc62dc25..033b42d45 100644 --- a/source/java/org/alfresco/web/ui/repo/component/property/UIPropertySheet.java +++ b/source/java/org/alfresco/web/ui/repo/component/property/UIPropertySheet.java @@ -97,7 +97,7 @@ public class UIPropertySheet extends UIPanel implements NamingContainer @SuppressWarnings("unchecked") public void encodeBegin(FacesContext context) throws IOException { - int howManyKids = getChildren().size(); + int howManyChildren = getChildren().size(); Boolean externalConfig = (Boolean)getAttributes().get("externalConfig"); // generate a variable name to use if necessary @@ -109,7 +109,7 @@ public class UIPropertySheet extends UIPanel implements NamingContainer // force retrieval of node info Node node = getNode(); - if (howManyKids == 0) + if (howManyChildren == 0) { if (externalConfig != null && externalConfig.booleanValue()) { diff --git a/source/java/org/alfresco/web/ui/repo/tag/MimeTypeSelectorTag.java b/source/java/org/alfresco/web/ui/repo/tag/MimeTypeSelectorTag.java new file mode 100644 index 000000000..136788e5a --- /dev/null +++ b/source/java/org/alfresco/web/ui/repo/tag/MimeTypeSelectorTag.java @@ -0,0 +1,71 @@ +package org.alfresco.web.ui.repo.tag; + +import javax.faces.component.UIComponent; + +import org.alfresco.web.ui.common.ComponentConstants; +import org.alfresco.web.ui.common.tag.HtmlComponentTag; +import org.alfresco.web.ui.repo.component.UIMimeTypeSelector; + +/** + * Tag class for the MIME type selector component + * + * @author gavinc + */ +public class MimeTypeSelectorTag extends HtmlComponentTag +{ + /** The value */ + private String value; + + /** Whether the component is disabled */ + private String disabled; + + @Override + public String getComponentType() + { + return UIMimeTypeSelector.COMPONENT_TYPE; + } + + @Override + public String getRendererType() + { + return ComponentConstants.JAVAX_FACES_MENU; + } + + @Override + protected void setProperties(UIComponent component) + { + super.setProperties(component); + + setStringBindingProperty(component, "value", this.value); + setBooleanProperty(component, "disabled", this.disabled); + } + + @Override + public void release() + { + super.release(); + + this.value = null; + this.disabled = null; + } + + /** + * Set the value + * + * @param value the value + */ + public void setValue(String value) + { + this.value = value; + } + + /** + * Sets whether the component should be rendered in a disabled state + * + * @param disabled true to render the component in a disabled state + */ + public void setDisabled(String disabled) + { + this.disabled = disabled; + } +} diff --git a/source/web/WEB-INF/faces-config-beans.xml b/source/web/WEB-INF/faces-config-beans.xml index 49a735337..cbe8d7ef6 100644 --- a/source/web/WEB-INF/faces-config-beans.xml +++ b/source/web/WEB-INF/faces-config-beans.xml @@ -1447,6 +1447,15 @@ request + + + Bean that generates a mime type selector component + + MimeTypeSelectorGenerator + org.alfresco.web.bean.generator.MimeTypeSelectorGenerator + request + + Bean that generates an image picker component diff --git a/source/web/WEB-INF/faces-config-repo.xml b/source/web/WEB-INF/faces-config-repo.xml index 688595d6f..1fd9dece1 100644 --- a/source/web/WEB-INF/faces-config-repo.xml +++ b/source/web/WEB-INF/faces-config-repo.xml @@ -54,6 +54,11 @@ org.alfresco.web.ui.repo.component.UICategorySelector + + org.alfresco.faces.MimeTypeSelector + org.alfresco.web.ui.repo.component.UIMimeTypeSelector + + org.alfresco.faces.SimpleSearch org.alfresco.web.ui.repo.component.UISimpleSearch diff --git a/source/web/WEB-INF/repo.tld b/source/web/WEB-INF/repo.tld index b44dd4520..ac35d5197 100644 --- a/source/web/WEB-INF/repo.tld +++ b/source/web/WEB-INF/repo.tld @@ -713,6 +713,12 @@ false true + + + disabled + false + true + @@ -785,6 +791,48 @@ false true + + + disabled + false + true + + + + + mimeTypeSelector + org.alfresco.web.ui.repo.tag.MimeTypeSelectorTag + JSP + + + id + false + true + + + + binding + false + true + + + + rendered + false + true + + + + value + false + true + + + + disabled + false + true + diff --git a/source/web/jsp/dialog/edit-document-properties.jsp b/source/web/jsp/dialog/edit-document-properties.jsp index 67aabdc32..1020a6757 100644 --- a/source/web/jsp/dialog/edit-document-properties.jsp +++ b/source/web/jsp/dialog/edit-document-properties.jsp @@ -123,9 +123,7 @@ : - - -  * +  * @@ -175,7 +173,7 @@ - +