source: trunk/autoquest-core-tasktrees/src/main/java/de/ugoe/cs/autoquest/tasktrees/temporalrelation/TrackBarSelectionDetectionRule.java @ 986

Last change on this file since 986 was 986, checked in by pharms, 12 years ago
  • small bugfix
File size: 5.9 KB
Line 
1package de.ugoe.cs.autoquest.tasktrees.temporalrelation;
2
3import de.ugoe.cs.autoquest.eventcore.gui.ValueSelection;
4import de.ugoe.cs.autoquest.eventcore.guimodel.ITrackBar;
5import de.ugoe.cs.autoquest.tasktrees.nodeequality.NodeEquality;
6import de.ugoe.cs.autoquest.tasktrees.nodeequality.NodeEqualityRuleManager;
7import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTask;
8import de.ugoe.cs.autoquest.tasktrees.treeifc.IIteration;
9import de.ugoe.cs.autoquest.tasktrees.treeifc.ISelection;
10import de.ugoe.cs.autoquest.tasktrees.treeifc.ISequence;
11import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeBuilder;
12import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNode;
13import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskTreeNodeFactory;
14
15/**
16 * TODO comment
17 *
18 * @version $Revision: $ $Date: 28.04.2012$
19 * @author 2012, last modified by $Author: patrick$
20 */
21public class TrackBarSelectionDetectionRule implements TemporalRelationshipRule {
22
23    /** */
24    private NodeEqualityRuleManager nodeEqualityRuleManager;
25
26    /**
27     * TODO: comment
28     *
29     */
30    TrackBarSelectionDetectionRule(NodeEqualityRuleManager nodeEqualityRuleManager) {
31        super();
32        this.nodeEqualityRuleManager = nodeEqualityRuleManager;
33    }
34
35    /*
36     * (non-Javadoc)
37     *
38     * @see TemporalRelationshipRule#apply(TaskTreeNode, TaskTreeBuilder, TaskTreeNodeFactory)
39     */
40    @Override
41    public RuleApplicationResult apply(ITaskTreeNode        parent,
42                                       ITaskTreeBuilder     builder,
43                                       ITaskTreeNodeFactory nodeFactory,
44                                       boolean              finalize)
45    {
46        if (!(parent instanceof ISequence)) {
47            return null;
48        }
49
50        RuleApplicationResult result = new RuleApplicationResult();
51
52        int valueSelectionStartIndex = -1;
53        ITrackBar currentTrackBar = null;
54
55        int index = 0;
56        while (index < parent.getChildren().size()) {
57            ITaskTreeNode child = parent.getChildren().get(index);
58
59            if ((child instanceof IEventTask) &&
60                (((IEventTask) child).getEventTarget() instanceof ITrackBar) &&
61                (((IEventTask) child).getEventType() instanceof ValueSelection) &&
62                ((currentTrackBar == null) ||
63                 (currentTrackBar.equals((((IEventTask) child).getEventTarget())))))
64            {
65                if (valueSelectionStartIndex < 0) {
66                    // let the show begin
67                    valueSelectionStartIndex = index;
68                    currentTrackBar = (ITrackBar) ((IEventTask) child).getEventTarget();
69                }
70            }
71            else if (valueSelectionStartIndex >= 0) {
72                // current child is no more value selection. But the preceding tasks were.
73                // Therefore,
74                // create an iteration with the different selectable values as selection children
75                handleValueSelections(parent, currentTrackBar, valueSelectionStartIndex, index - 1,
76                                      builder, nodeFactory, result);
77
78                return result;
79            }
80
81            index++;
82        }
83
84        if (valueSelectionStartIndex >= 0) {
85            if (finalize) {
86                handleValueSelections(parent, currentTrackBar, valueSelectionStartIndex,
87                                      parent.getChildren().size() - 1, builder, nodeFactory, result);
88            }
89            else {
90                result.setRuleApplicationStatus(RuleApplicationStatus.RULE_APPLICATION_FEASIBLE);
91            }
92        }
93
94        return result;
95    }
96
97    /**
98     * TODO: comment
99     *
100     * @param valueSelectionStartIndex
101     * @param i
102     */
103    private void handleValueSelections(ITaskTreeNode         parent,
104                                       ITrackBar             trackbar,
105                                       int                   startIndex,
106                                       int                   endIndex,
107                                       ITaskTreeBuilder      builder,
108                                       ITaskTreeNodeFactory  nodeFactory,
109                                       RuleApplicationResult result)
110    {
111        IIteration iteration = nodeFactory.createNewIteration();
112        builder.setDescription(iteration, "value selection on " + trackbar.getStringIdentifier());
113        result.addNewlyCreatedParentNode(iteration);
114
115        ISelection selection = nodeFactory.createNewSelection();
116        result.addNewlyCreatedParentNode(selection);
117        builder.setChild(iteration, selection);
118
119        for (int i = endIndex - startIndex; i >= 0; i--) {
120            addChildIfNecessary(selection, parent.getChildren().get(startIndex), builder,
121                                nodeFactory, result);
122            builder.removeChild((ISequence) parent, startIndex);
123        }
124
125        builder.addChild((ISequence) parent, startIndex, iteration);
126
127        result.setRuleApplicationStatus(RuleApplicationStatus.RULE_APPLICATION_FINISHED);
128    }
129
130    /**
131     *
132     */
133    private void addChildIfNecessary(ISelection            parentSelection,
134                                     ITaskTreeNode         node,
135                                     ITaskTreeBuilder      builder,
136                                     ITaskTreeNodeFactory  nodeFactory,
137                                     RuleApplicationResult result)
138    {
139        for (int i = 0; i < parentSelection.getChildren().size(); i++) {
140            ITaskTreeNode child = parentSelection.getChildren().get(i);
141
142            // check, if the new node is a variant for the current event task
143            NodeEquality nodeEquality = nodeEqualityRuleManager.applyRules(child, node);
144            if (nodeEquality.isAtLeast(NodeEquality.SYNTACTICALLY_EQUAL)) {
145                return;
146            }
147        }
148
149        // if we did not return in the previous checks, then the node must be added
150        builder.addChild(parentSelection, node);
151    }
152
153}
Note: See TracBrowser for help on using the repository browser.