+ final Updater updater;
+ if (condition instanceof PropertyCondition) {
+ typeCombo.select(1);
+ updater = createPropertyConditionPanel(conditionComp, (PropertyCondition)condition);
+ } else if (condition instanceof RegionCondition) {
+ typeCombo.select(2);
+ updater = createRegionConditionPanel(conditionComp, (RegionCondition)condition);
+ } else if (condition instanceof RouteCondition) {
+ typeCombo.select(3);
+ updater = createRouteConditionPanel(conditionComp, (RouteCondition)condition);
+ } else if (condition instanceof AggregateCondition) {
+ AggregateCondition cond = (AggregateCondition) condition;
+ typeCombo.select(cond.type.equals(Type.CONJUNCTION) ? 4 : 5);
+ updater = createAggregateConditionPanel(conditionComp, cond);
+ } else {
+ ROW_LAYOUT.applyTo(conditionComp);
+ notCheck.setEnabled(false);
+ typeCombo.select(0);
+ updater = validate -> {};
+ }
+
+ typeCombo.addSelectionListener(new ConditionTypeSelectionListener(typeCombo, consumer, condition));
+
+ return validate -> {
+ updater.update(validate);
+ condition.isInverse = notCheck.getSelection();
+ };
+ }
+
+ private final class ConditionTypeSelectionListener extends SelectionAdapter {
+ private final Combo typeCombo;
+ private final Consumer<Condition> consumer;
+ private final Condition finalCondition;
+
+ private ConditionTypeSelectionListener(Combo typeCombo, Consumer<Condition> consumer, Condition finalCondition) {
+ this.typeCombo = typeCombo;
+ this.consumer = consumer;
+ this.finalCondition = finalCondition;
+ }
+
+ @Override
+ public void widgetSelected(SelectionEvent e) {
+ int index = typeCombo.getSelectionIndex();
+ Condition newCondition = finalCondition;
+ switch (index) {
+ case 0:
+ newCondition = null;
+ break;
+ case 1:
+ newCondition = createPropertyCondition("", null, null);
+ break;
+ case 2:
+ newCondition = createRegionCondition(null);
+ break;
+ case 3:
+ newCondition = createRouteCondition(null);
+ break;
+ case 4:
+ if (newCondition instanceof AggregateCondition)
+ ((AggregateCondition)newCondition).type = Type.CONJUNCTION;
+ else
+ newCondition = createAggregateCondition(null, new ArrayList<>(), true, false);
+ break;
+ case 5:
+ if (newCondition instanceof AggregateCondition)
+ ((AggregateCondition)newCondition).type = Type.DISJUNCTION;
+ else
+ newCondition = createAggregateCondition(null, new ArrayList<>(), false, false);
+ break;