package ilarkesto.ui.action; import ilarkesto.base.Iconized; import ilarkesto.di.BeanProvider; import ilarkesto.id.CountingIdGenerator; import ilarkesto.id.IdGenerator; import ilarkesto.ui.Option; import java.util.ArrayList; import java.util.Collection; public final class OptionAction<T> extends AAction { @Override protected void assertPermissions() {} @Override protected void performAction() throws InterruptedException { setAutoShowInfoDone(false); showDialog(getOptions(), getMessage()); if (selectedOption == null) throw new ActionAbortedException(); } public void addOption(Option<T> option) { if (options == null) options = new ArrayList<Option<T>>(); options.add(option); } public Option<T> getSelectedOption() { return selectedOption; } // --- helper --- public boolean isOption(String key) { return key.equals(selectedOption.getKey()); } 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)); } horizontal = false; } public T getSelectedPayload() { return getSelectedOption().getPayload(); } public static <T> T showDialog(BeanProvider beanProvider, ActionPerformer actionPerformer, AAction waitingAction, String message, Collection<T> payloads) { OptionAction<T> action = beanProvider.autowire(new OptionAction()); action.setHorizontal(false); action.addPayloads(payloads); action.setMessage(message); actionPerformer.performSubAction(action, waitingAction); Option<T> option = action.getSelectedOption(); return option == null ? null : option.getPayload(); } // --- dependencies --- private Option<T> selectedOption; public final void setSelectedOptionKey(String option) { this.selectedOption = getOption(option); } 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; } private boolean horizontal = true; public boolean isHorizontal() { return horizontal; } public void setHorizontal(boolean horizontal) { this.horizontal = horizontal; } }