package ilarkesto.ui.action; import ilarkesto.base.Iconized; import ilarkesto.base.ToStringComparator; import ilarkesto.di.BeanProvider; import ilarkesto.form.Form; import ilarkesto.form.MultiCheckboxFormField; import ilarkesto.id.CountingIdGenerator; import ilarkesto.id.IdGenerator; import ilarkesto.ui.Option; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; public final class MultiOptionAction<T> extends AAction { private MultiCheckboxFormField<Option<T>> groupOptionsField; private MultiCheckboxFormField<Option<T>> optionsField; @Override protected void assertPermissions() {} @Override protected void performAction() throws InterruptedException { setAutoShowInfoDone(false); List<Option<T>> groupOptions = new ArrayList<Option<T>>(); List<Option<T>> singleOptions = new ArrayList<Option<T>>(); for (Option<T> option : getOptions()) { if (option.isGroup()) { groupOptions.add(option); } else { singleOptions.add(option); } } Collections.sort(groupOptions, ToStringComparator.INSTANCE_IGNORECASE); Collections.sort(singleOptions, ToStringComparator.INSTANCE_IGNORECASE); getUi().getUserMessageService().info(message); Form form = autowire(new Form()); form.setStringKeyPrefix(getStringKeyPrefix()); if (!groupOptions.isEmpty()) { groupOptionsField = form.addMultiCheckbox("groupOptions"); groupOptionsField.setSelectableItems(groupOptions); groupOptionsField.setValue(getSelectedOptions()); groupOptionsField.setItemTooltipProvider(new Option.OptionTooltipStringProvider<T>()); } optionsField = form.addMultiCheckbox("options"); optionsField.setSelectableItems(singleOptions); optionsField.setValue(getSelectedOptions()); optionsField.setItemTooltipProvider(new Option.OptionTooltipStringProvider<T>()); form.addSubmitButton("select"); form.addAbortSubmitButton(); showFormDialog(form); selectedOptions = optionsField.getValue(); if (groupOptionsField != null) selectedOptions.addAll(groupOptionsField.getValue()); } public void addOption(Option<T> option) { if (options == null) options = new ArrayList<Option<T>>(); options.add(option); } // --- helper --- public Option<T> getOption(String key) { if (Option.KEY_CANCEL.equals(key)) return null; for (Option<T> option : options) { if (option.getKey().equals(key)) return option; } return null; } private IdGenerator payloadIdGenerator; public void addPayloads(Collection<T> payloads) { if (payloadIdGenerator == null) payloadIdGenerator = new CountingIdGenerator("p"); for (T o : payloads) { String icon = o instanceof Iconized ? ((Iconized) o).getIcon() : "item"; addOption(new Option<T>(payloadIdGenerator.generateId(), o.toString(), icon, o)); } } public Set<T> getSelectedPayloads() { Set<T> payloads = new HashSet<T>(selectedOptions.size()); for (Option<T> option : selectedOptions) { payloads.add(option.getPayload()); } return payloads; } public static <T> Set<Option<T>> showDialog(BeanProvider beanProvider, ActionPerformer actionPerformer, AAction waitingAction, String message, boolean horizontal, Collection<Option<T>> options) { MultiOptionAction<T> action = beanProvider.autowire(new MultiOptionAction()); action.setOptions(options); action.setMessage(message); actionPerformer.performSubAction(action, waitingAction); return action.getSelectedOptions(); } public static <T> Set<T> showDialog(BeanProvider beanProvider, ActionPerformer actionPerformer, AAction waitingAction, String message, Collection<T> payloads) { MultiOptionAction<T> action = beanProvider.autowire(new MultiOptionAction()); action.addPayloads(payloads); action.setMessage(message); actionPerformer.performSubAction(action, waitingAction); return action.getSelectedPayloads(); } public Set<Option<T>> getSelectedOptions() { return selectedOptions; } // --- dependencies --- private Set<Option<T>> selectedOptions; public void setSelectedOptions(Set<Option<T>> selectedOptions) { this.selectedOptions = selectedOptions; } private Collection<Option<T>> options = new ArrayList<Option<T>>(); public final Collection<Option<T>> getOptions() { return options; } public final void setOptions(Collection<Option<T>> options) { this.options = options; } private String message; public final String getMessage() { return message; } public final void setMessage(String message) { this.message = message; } }