Index: addon-cms/src/main/java/org/onehippo/forge/selection/frontend/plugin/DynamicMultiSelectPlugin.java
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- addon-cms/src/main/java/org/onehippo/forge/selection/frontend/plugin/DynamicMultiSelectPlugin.java (revision 869)
+++ addon-cms/src/main/java/org/onehippo/forge/selection/frontend/plugin/DynamicMultiSelectPlugin.java (revision )
@@ -66,16 +66,13 @@
import org.slf4j.LoggerFactory;
/**
- * A dynamic multiselect plugin, which is backed by a ValueListProvider service
- * that provides a ValueList object.
+ * A dynamic multiselect plugin, which is backed by a ValueListProvider service that provides a ValueList object.
*
- * The default DocumentValueListProvider reads a document of the type
- * 'selection:valuelist', which contains key label pairs used to display values
- * and labels in the dropdown.
+ * The default DocumentValueListProvider reads a document of the type 'selection:valuelist', which contains key label
+ * pairs used to display values and labels in the dropdown.
*
- * The plugin configuration must then be provided with a source
- * property, which can either be a valid UUID of a handle or the path to the
- * document based on the JCR root.
+ * The plugin configuration must then be provided with a source
property, which can either be a valid UUID
+ * of a handle or the path to the document based on the JCR root.
*/
public class DynamicMultiSelectPlugin extends RenderPlugin {
@@ -116,7 +113,7 @@
// required
Label required = new Label("required", "*");
- if (helper.getField() != null && !helper.getField().isMandatory()) {
+ if (helper.getField() != null && !helper.getField().getValidators().contains("required")) {
required.setVisible(false);
}
add(required);
@@ -144,9 +141,9 @@
final JcrMultiPropertyValueModel model = new JcrMultiPropertyValueModel(getPropertyModel().getItemModel());
final IPluginConfig options = config.getPluginConfig(CONFIG_VALUELIST_OPTIONS);
- if(options == null) {
+ if (options == null) {
throw new WicketRuntimeException("Configuration node '" + CONFIG_VALUELIST_OPTIONS
- + "' not found in plugin configuration. " + config.toString());
+ + "' not found in plugin configuration. " + config.toString());
}
final Locale locale = SelectionUtils.getLocale(SelectionUtils.getNode(model));
@@ -155,7 +152,7 @@
sortHelper.sort(valueList, options);
ArrayList keys = new ArrayList(valueList.size());
- for(org.onehippo.forge.selection.frontend.model.ListItem item : valueList) {
+ for (org.onehippo.forge.selection.frontend.model.ListItem item : valueList) {
keys.add(item.getKey());
}
final IModel choicesModel = new Model>(keys);
@@ -163,164 +160,206 @@
Fragment modeFragment;
final String mode = config.getString(ITemplateEngine.MODE);
if ("edit".equals(mode)) {
+ modeFragment = populateEditMode(config, model, valueList, choicesModel);
+ } else if ("compare".equals(mode)) {
+ modeFragment = populateCompareMode(context, config, model, valueList);
+ } else {
+ modeFragment = populateViewMode(model, valueList);
+
+ }
+ add(modeFragment);
+ }
+
+ private Fragment populateViewMode(final JcrMultiPropertyValueModel model, final ValueList valueList) {
+ final Fragment modeFragment;// show view list
+ modeFragment = new Fragment("mode", "view", this);
+ modeFragment.add(new ListView("viewitems", model.getObject(), valueList));
+
+ // hide dummy fragment
+ final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
+ final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
+ unselectFragment.add(unselectLink);
+ unselectFragment.setVisibilityAllowed(false);
+ add(unselectFragment);
+ return modeFragment;
+ }
+
+ private Fragment populateCompareMode(final IPluginContext context, final IPluginConfig config,
+ final JcrMultiPropertyValueModel model, final ValueList valueList) {
+ final Fragment modeFragment;
+ modeFragment = new Fragment("mode", "view", this);
+
+ IModelReference compareToRef = context.getService(config.getString("model.compareTo"),
+ IModelReference.class);
+ if (compareToRef != null) {
+ JcrNodeModel baseNodeModel = (JcrNodeModel) compareToRef.getModel();
+ if (baseNodeModel != null && baseNodeModel.getNode() != null) {
+ IFieldDescriptor field = helper.getField();
+ JcrMultiPropertyValueModel baseModel = new JcrMultiPropertyValueModel(new JcrItemModel(
+ baseNodeModel.getItemModel().getPath() + "/" + field.getPath()));
+
+ List baseOptions = baseModel.getObject();
+ List currentOptions = model.getObject();
+ List> changes = LCS.getChangeSet(baseOptions.toArray(new String[baseOptions.size()]),
+ currentOptions.toArray(new String[currentOptions.size()]));
+
+ // show view list
+ modeFragment.add(new CompareView("viewitems", changes, valueList));
+ } else {
+ modeFragment.add(new ListView("viewitems", model.getObject(), valueList));
+ }
+ } else {
+ modeFragment.add(new ListView("viewitems", model.getObject(), valueList));
+ }
+
+ // hide dummy fragment
+ final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
+ final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
+ unselectFragment.add(unselectLink);
+ unselectFragment.setVisibilityAllowed(false);
+ add(unselectFragment);
+ return modeFragment;
+ }
+
+ private Fragment populateEditMode(final IPluginConfig config, final JcrMultiPropertyValueModel model,
+ final ValueList valueList, final IModel choicesModel) {
+ final Fragment modeFragment;
- modeFragment = new Fragment("mode", "edit", this);
+ modeFragment = new Fragment("mode", "edit", this);
- Fragment typeFragment;
- final String type = config.getString(CONFIG_TYPE);
- if (CONFIG_CHECKBOXES.equals(type)) {
+ Fragment typeFragment;
+ final String type = config.getString(CONFIG_TYPE);
+ if (CONFIG_CHECKBOXES.equals(type)) {
+ typeFragment = addCheckboxes(model, valueList, choicesModel);
+ } else if (CONFIG_PALETTE.equals(type)) {
+ typeFragment = addPalette(config, model, valueList, choicesModel);
+ } else {
+ typeFragment = addList(config, model, valueList, choicesModel);
+ }
+ modeFragment.add(typeFragment);
+ return modeFragment;
+ }
- typeFragment = new Fragment("type", "edit-checkboxes", this);
+ private Fragment addList(final IPluginConfig config, final JcrMultiPropertyValueModel model,
+ final ValueList valueList, final IModel choicesModel) {
+ final Fragment typeFragment;
+ typeFragment = new Fragment("type", "edit-select", this);
- CheckBoxMultipleChoice checkboxes = new CheckBoxMultipleChoice("checkboxes", model, choicesModel, new ValueListItemRenderer(valueList));
+ ListMultipleChoice multiselect = new ListMultipleChoice("multiselect", model, choicesModel,
+ new ValueListItemRenderer(valueList));
- // trigger setObject on selection changed
+ // trigger setObject on selection changed
- checkboxes.add(new AjaxFormChoiceComponentUpdatingBehavior() {
+ multiselect.add(new OnChangeAjaxBehavior() {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- @Override
- protected void onUpdate(AjaxRequestTarget target) {
- }
- });
+ @Override
+ protected void onUpdate(AjaxRequestTarget target) {
+ }
+ });
- typeFragment.add(checkboxes);
+ // set (configured) max rows
+ final String maxRows = config.getString(CONFIG_SELECT_MAX_ROWS, "8");
+ try {
+ multiselect.setMaxRows(Integer.valueOf(maxRows));
+ } catch (NumberFormatException nfe) {
+ log.warn("The configured value '" + maxRows + "' for " + CONFIG_SELECT_MAX_ROWS
+ + " is not a valid number. Defaulting to 8.");
+ multiselect.setMaxRows(8);
+ }
- // hide unselect fragment
+ typeFragment.add(multiselect);
+
- final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
+ final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
- final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
+ final AjaxLink unselectLink = new UnselectLink("unselect-link", multiselect, model);
- unselectFragment.add(unselectLink);
+ unselectFragment.add(unselectLink);
- unselectFragment.setVisibilityAllowed(false);
- add(unselectFragment);
+ add(unselectFragment);
- } else if (CONFIG_PALETTE.equals(type)) {
+ return typeFragment;
+ }
+ private Fragment addPalette(final IPluginConfig config, final JcrMultiPropertyValueModel model,
+ final ValueList valueList, final IModel choicesModel) {
+ final Fragment typeFragment;
- typeFragment = new Fragment("type", "edit-palette", this);
+ typeFragment = new Fragment("type", "edit-palette", this);
- // set (configured) max rows
- int rows = 10;
- final String maxRows = config.getString(CONFIG_PALETTE_MAX_ROWS, "10");
- try {
- rows = Integer.valueOf(maxRows);
- } catch (NumberFormatException nfe) {
- log.warn("The configured value '" + maxRows + "' for " + CONFIG_PALETTE_MAX_ROWS
- + " is not a valid number. Defaulting to 10.");
- }
+ // set (configured) max rows
+ int rows = 10;
+ final String maxRows = config.getString(CONFIG_PALETTE_MAX_ROWS, "10");
+ try {
+ rows = Integer.valueOf(maxRows);
+ } catch (NumberFormatException nfe) {
+ log.warn("The configured value '" + maxRows + "' for " + CONFIG_PALETTE_MAX_ROWS
+ + " is not a valid number. Defaulting to 10.");
+ }
- // set (configured) allow order value
- final boolean allowOrder = config.getBoolean(CONFIG_PALETTE_ALLOW_ORDER);
+ // set (configured) allow order value
+ final boolean allowOrder = config.getBoolean(CONFIG_PALETTE_ALLOW_ORDER);
- final Palette palette = new Palette("palette", model, choicesModel, new ValueListItemRenderer(valueList), rows, allowOrder) {
+ final Palette palette = new Palette("palette", model, choicesModel,
+ new ValueListItemRenderer(valueList), rows, allowOrder) {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- // FIXME: workaround for WICKET-2843
- @Override
- public Collection getModelCollection() {
- return new ArrayList(super.getModelCollection());
- }
+ // FIXME: workaround for WICKET-2843
+ @Override
+ public Collection getModelCollection() {
+ return new ArrayList(super.getModelCollection());
+ }
- // trigger setObject on selection changed
- @Override
- protected Recorder newRecorderComponent() {
- Recorder recorder = super.newRecorderComponent();
- recorder.add(new AjaxFormComponentUpdatingBehavior("onchange") {
+ // trigger setObject on selection changed
+ @Override
+ protected Recorder newRecorderComponent() {
+ Recorder recorder = super.newRecorderComponent();
+ recorder.add(new AjaxFormComponentUpdatingBehavior("onchange") {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- @Override
- protected void onUpdate(AjaxRequestTarget target) {
- }
+ @Override
+ protected void onUpdate(AjaxRequestTarget target) {
+ }
- });
- return recorder;
- }
- };
+ });
+ return recorder;
+ }
+ };
- typeFragment.add(palette);
+ typeFragment.add(palette);
- // hide unselect fragment
- final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
- final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
- unselectFragment.add(unselectLink);
- unselectFragment.setVisibilityAllowed(false);
- add(unselectFragment);
+ // hide unselect fragment
+ final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
+ final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
+ unselectFragment.add(unselectLink);
+ unselectFragment.setVisibilityAllowed(false);
+ add(unselectFragment);
- } else {
- typeFragment = new Fragment("type", "edit-select", this);
+ return typeFragment;
+ }
- ListMultipleChoice multiselect = new ListMultipleChoice("multiselect", model, choicesModel, new ValueListItemRenderer(valueList));
+ private Fragment addCheckboxes(final JcrMultiPropertyValueModel model, final ValueList valueList,
+ final IModel choicesModel) {
+ final Fragment typeFragment;
+ typeFragment = new Fragment("type", "edit-checkboxes", this);
+ CheckBoxMultipleChoice checkboxes = new CheckBoxMultipleChoice("checkboxes", model, choicesModel,
+ new ValueListItemRenderer(valueList));
+
- // trigger setObject on selection changed
+ // trigger setObject on selection changed
- multiselect.add(new OnChangeAjaxBehavior() {
+ checkboxes.add(new AjaxFormChoiceComponentUpdatingBehavior() {
- private static final long serialVersionUID = 1L;
+ private static final long serialVersionUID = 1L;
- @Override
- protected void onUpdate(AjaxRequestTarget target) {
- }
- });
+ @Override
+ protected void onUpdate(AjaxRequestTarget target) {
+ }
+ });
- // set (configured) max rows
- final String maxRows = config.getString(CONFIG_SELECT_MAX_ROWS, "8");
- try {
- multiselect.setMaxRows(Integer.valueOf(maxRows));
- } catch (NumberFormatException nfe) {
- log.warn("The configured value '" + maxRows + "' for " + CONFIG_SELECT_MAX_ROWS
- + " is not a valid number. Defaulting to 8.");
- multiselect.setMaxRows(8);
- }
+ typeFragment.add(checkboxes);
- typeFragment.add(multiselect);
-
+ // hide unselect fragment
- final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
+ final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
- final AjaxLink unselectLink = new UnselectLink("unselect-link", multiselect, model);
- unselectFragment.add(unselectLink);
- add(unselectFragment);
- }
- modeFragment.add(typeFragment);
- } else if ("compare".equals(mode)) {
- modeFragment = new Fragment("mode", "view", this);
-
- IModelReference compareToRef = context.getService(config.getString("model.compareTo"),
- IModelReference.class);
- if (compareToRef != null) {
- JcrNodeModel baseNodeModel = (JcrNodeModel) compareToRef.getModel();
- if (baseNodeModel != null && baseNodeModel.getNode() != null) {
- IFieldDescriptor field = helper.getField();
- JcrMultiPropertyValueModel baseModel = new JcrMultiPropertyValueModel(new JcrItemModel(
- baseNodeModel.getItemModel().getPath() + "/" + field.getPath()));
-
- List baseOptions = baseModel.getObject();
- List currentOptions = model.getObject();
- List> changes = LCS.getChangeSet(baseOptions.toArray(new String[baseOptions.size()]),
- currentOptions.toArray(new String[currentOptions.size()]));
-
- // show view list
- modeFragment.add(new CompareView("viewitems", changes, valueList));
- } else {
- modeFragment.add(new ListView("viewitems", model.getObject(), valueList));
- }
- } else {
- modeFragment.add(new ListView("viewitems", model.getObject(), valueList));
- }
-
- // hide dummy fragment
- final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
- final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
- unselectFragment.add(unselectLink);
- unselectFragment.setVisibilityAllowed(false);
- add(unselectFragment);
+ final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
+ unselectFragment.add(unselectLink);
+ unselectFragment.setVisibilityAllowed(false);
+ add(unselectFragment);
- } else {
- // show view list
- modeFragment = new Fragment("mode", "view", this);
- modeFragment.add(new ListView("viewitems", model.getObject(), valueList));
-
- // hide dummy fragment
- final Fragment unselectFragment = new Fragment("unselectlink", "edit-unselectlink", this);
- final AjaxLink unselectLink = new UnselectLink("unselect-link", null, null);
- unselectFragment.add(unselectLink);
- unselectFragment.setVisibilityAllowed(false);
- add(unselectFragment);
- }
- add(modeFragment);
+ return typeFragment;
}
@Override
@@ -397,7 +436,7 @@
super(id);
// get the choice labels by the actual values/keys
- for(Object item : actualValues) {
+ for (Object item : actualValues) {
this.models.add(new Model(choices.getLabel(item)));
}
}