/** * */ package org.korsakow.ide.ui.controller; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.dsrg.soenea.domain.MapperException; import org.korsakow.domain.mapper.input.KeywordInputMapper; import org.korsakow.domain.mapper.input.SnuInputMapper; import org.korsakow.ide.Application; import org.korsakow.ide.lang.LanguageBundle; import org.korsakow.ide.resources.PredicateType; import org.korsakow.ide.resources.TriggerType; import org.korsakow.ide.rules.RuleType; import org.korsakow.ide.ui.controller.eventeditor.EditorConfigurer; import org.korsakow.ide.ui.controller.eventeditor.IntegerRangeConfig; import org.korsakow.ide.ui.controller.eventeditor.KeywordsConfig; import org.korsakow.ide.ui.controller.eventeditor.MediaConfig; import org.korsakow.ide.ui.controller.eventeditor.NoArgPredicateConfigurer; import org.korsakow.ide.ui.controller.eventeditor.NoArgRuleConfigurer; import org.korsakow.ide.ui.controller.eventeditor.PercentConfig; import org.korsakow.ide.ui.controller.eventeditor.PredicateConfigurer; import org.korsakow.ide.ui.controller.eventeditor.RuleConfigurer; import org.korsakow.ide.ui.controller.eventeditor.SnusConfig; import org.korsakow.ide.ui.model.PredicateModel; import org.korsakow.ide.ui.resources.EventEditor; import org.korsakow.ide.util.ResourceManager; import org.korsakow.ide.util.UIResourceManager; import org.korsakow.ide.util.Util; import org.korsakow.services.plugin.predicate.IPredicateTypeInfo; import org.korsakow.services.plugin.predicate.PredicateTypeInfoFactory; public class EventEditorController { private static Map<TriggerType, Collection<PredicateType>> when2if = new HashMap<TriggerType, Collection<PredicateType>>(); private static Map<TriggerType, Collection<RuleType>> when2then = new HashMap<TriggerType, Collection<RuleType>>(); private static Map<PredicateType, EditorConfigurer> ifArgConfigs = new HashMap<PredicateType, EditorConfigurer>(); private static Map<RuleType, EditorConfigurer> thenArgConfigs = new HashMap<RuleType, EditorConfigurer>(); static { try { Properties eventProperties = new Properties(); eventProperties.load(ResourceManager.getResourceStream(UIResourceManager.UIRESOURCE_BASE_PATH + "eventmappings.properties")); for (Object key : eventProperties.keySet()) { String value = eventProperties.getProperty(key.toString()); TriggerType triggerType = TriggerType.forId(key.toString()); Collection<RuleType> rules = new ArrayList<RuleType>(); String[] values = value.split(","); for (String ruleId : values) { ruleId = ruleId.trim(); RuleType ruleType = RuleType.forId(ruleId); rules.add(ruleType); } when2then.put(triggerType, rules); } } catch (IllegalArgumentException e) { // from XXXType.forId Application.getInstance().showUnhandledErrorDialog("Error loading event mapping", e); System.exit(1); // unrecoverable, should never happen... } catch (IOException e) { Application.getInstance().showUnhandledErrorDialog("Error loading event mapping", e); System.exit(1); // unrecoverable, should never happen... } Collection<PredicateType> commonWhen2If = Util.list(PredicateType.class, PredicateType.True, PredicateType.False, PredicateType.KeywordInHistory, PredicateType.SnuInHistory, PredicateType.PercentOfSnusInHistory, PredicateType.NumberOfSnusInHistory ); for (TriggerType trigger : TriggerType.values()) when2if.put(trigger, commonWhen2If); ifArgConfigs.put(PredicateType.KeywordInHistory, new PredicateConfigurer(new KeywordsConfig())); ifArgConfigs.put(PredicateType.SnuInHistory, new PredicateConfigurer(new SnusConfig())); ifArgConfigs.put(PredicateType.PercentOfSnusInHistory, new PredicateConfigurer(new PercentConfig(0, 1, 100, true, LanguageBundle.getString("predicate.arg.percent.label")))); ifArgConfigs.put(PredicateType.NumberOfSnusInHistory, new PredicateConfigurer(new IntegerRangeConfig(0, 100, true, LanguageBundle.getString("predicate.arg.number.label")))); thenArgConfigs.put(RuleType.PlayMedia, new RuleConfigurer((new MediaConfig()))); thenArgConfigs.put(RuleType.PrePlayMedia, new RuleConfigurer((new MediaConfig()))); thenArgConfigs.put(RuleType.PostPlayMedia, new RuleConfigurer((new MediaConfig()))); thenArgConfigs.put(RuleType.SetSnuLives, new RuleConfigurer(new IntegerRangeConfig(0, 5, true, LanguageBundle.getString("predicate.arg.number.label")))); } private final EventEditor editor; public EventEditorController(EventEditor editor) { this.editor = editor; editor.addWhenChangeListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onWhenChange(); } }); editor.addIfChangeListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onIfChange(); } }); editor.addThenChangeListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onThenChange(); } }); editor.addAddIfButtonActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onAddIf(); } }); editor.addDeleteIfButtonActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { onDeleteIf(); } }); } private Collection<PredicateType> getIfChoices(TriggerType triggerType) { Collection<PredicateType> choices = when2if.get(triggerType); try { if ( KeywordInputMapper.findAll().isEmpty() ) choices.remove(PredicateType.KeywordInHistory); if ( SnuInputMapper.findAll().isEmpty() ) choices.remove(PredicateType.SnuInHistory); } catch ( MapperException e ) { Application.getInstance().showUnhandledErrorDialog( e ); } return choices; } private void onWhenChange() { editor.setIfChoices(getIfChoices(editor.getWhen())); if (!when2then.containsKey(editor.getWhen())) { return; } editor.setThenChoices(when2then.get(editor.getWhen())); onThenChange(); onIfChange(); } private void onIfChange() { PredicateType pred = editor.getIf(); if (ifArgConfigs.containsKey(pred)) ifArgConfigs.get(pred).configure(editor); else { NoArgPredicateConfigurer.Configure(editor); } } private void onThenChange() { RuleType type = editor.getThen(); if (thenArgConfigs.containsKey(type)) thenArgConfigs.get(type).configure(editor); else { NoArgRuleConfigurer.Configure(editor); } } private void onAddIf() { PredicateType type = editor.getIf(); IPredicateTypeInfo typeInfo = PredicateTypeInfoFactory.getFactory().getTypeInfo(type.getId()); PredicateModel model = new PredicateModel(type); if (!typeInfo.getArguments().isEmpty()) model.addProperty(typeInfo.getArguments().iterator().next().getName(), editor.getIfArg()); editor.getIfListModel().addElement(model); } private void onDeleteIf() { editor.removeSelectedIf(); } }