source: trunk/autoquest-ui-swt/src/main/java/de/ugoe/cs/autoquest/ui/swt/VisualizationUtils.java @ 2033

Last change on this file since 2033 was 2033, checked in by pharms, 9 years ago
  • added support for plotting action instances covered by sequences
File size: 13.3 KB
Line 
1//   Copyright 2012 Georg-August-Universität Göttingen, Germany
2//
3//   Licensed under the Apache License, Version 2.0 (the "License");
4//   you may not use this file except in compliance with the License.
5//   You may obtain a copy of the License at
6//
7//       http://www.apache.org/licenses/LICENSE-2.0
8//
9//   Unless required by applicable law or agreed to in writing, software
10//   distributed under the License is distributed on an "AS IS" BASIS,
11//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12//   See the License for the specific language governing permissions and
13//   limitations under the License.
14
15package de.ugoe.cs.autoquest.ui.swt;
16
17import java.util.ArrayList;
18import java.util.LinkedList;
19import java.util.List;
20
21import org.eclipse.swt.SWT;
22import org.eclipse.swt.events.MenuAdapter;
23import org.eclipse.swt.events.MenuEvent;
24import org.eclipse.swt.events.SelectionAdapter;
25import org.eclipse.swt.events.SelectionEvent;
26import org.eclipse.swt.layout.GridData;
27import org.eclipse.swt.widgets.Composite;
28import org.eclipse.swt.widgets.Event;
29import org.eclipse.swt.widgets.Listener;
30import org.eclipse.swt.widgets.Menu;
31import org.eclipse.swt.widgets.MenuItem;
32import org.eclipse.swt.widgets.Tree;
33import org.eclipse.swt.widgets.TreeColumn;
34import org.eclipse.swt.widgets.TreeItem;
35import org.eclipse.swt.widgets.Widget;
36
37import de.ugoe.cs.autoquest.eventcore.IEventTarget;
38import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
39import de.ugoe.cs.autoquest.tasktrees.treeifc.IEventTaskInstance;
40import de.ugoe.cs.autoquest.tasktrees.treeifc.IMarkingTemporalRelationship;
41import de.ugoe.cs.autoquest.tasktrees.treeifc.IStructuringTemporalRelationship;
42import de.ugoe.cs.autoquest.tasktrees.treeifc.ITask;
43import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskInfo;
44import de.ugoe.cs.autoquest.tasktrees.treeifc.ITaskModel;
45import de.ugoe.cs.autoquest.tasktrees.treeifc.TaskMetric;
46
47/**
48 * <p>
49 * TODO comment
50 * </p>
51 *
52 * @author Patrick Harms
53 */
54class VisualizationUtils {
55   
56    /**
57     *
58     */
59    static Tree createTaskDetailsTree(Composite  parent,
60                                      String     firstColumnHeader,
61                                      ITaskModel taskModel)
62    {
63        final Tree tree = new Tree(parent, SWT.BORDER | SWT.SINGLE | SWT.VIRTUAL);
64        tree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
65        tree.setHeaderVisible(true);
66       
67        TreeColumn taskColumn = new TreeColumn(tree, SWT.NONE);
68        taskColumn.setText(firstColumnHeader);
69        taskColumn.setAlignment(SWT.LEFT);
70       
71        TaskMetric[] metrics = taskModel.getAllMetrics();
72       
73        for (TaskMetric metric : metrics) {
74            TreeColumn metricColumn = new TreeColumn(tree, SWT.WRAP);
75            metricColumn.setText(metric.getName().replace(' ', '\n'));
76            metricColumn.setToolTipText(metric.getDescription());
77            metricColumn.setAlignment(SWT.CENTER);
78        }
79
80        // update the columns widths on expansion and collapse
81        if (tree.getListeners(SWT.Expand).length == 0) {
82            tree.addListener(SWT.Expand, new Listener() {
83               public void handleEvent(final Event event) {
84                   ((TreeItem) event.item).setExpanded(true);
85                   updateColumnWidths(tree);
86               }
87           });
88        }
89
90        if (tree.getListeners(SWT.Collapse).length == 0) {
91            tree.addListener(SWT.Collapse, new Listener() {
92               public void handleEvent(final Event event) {
93                   ((TreeItem) event.item).setExpanded(false);
94                   updateColumnWidths(tree);
95               }
96           });
97        }
98
99        return tree;
100    }
101
102    /**
103     * convenience method to create a tree item for a task
104     */
105    static void createTreeItemFor(ITask      task,
106                                  Widget     parent,
107                                  ITaskModel taskModel,
108                                  boolean    createChildren)
109    {
110        ITaskInfo taskInfo = taskModel.getTaskInfo(task);
111       
112        TaskMetric[] metrics = taskModel.getAllMetrics();
113        String[] values = new String[metrics.length + 2];
114       
115        values[0] = task.toString();
116       
117        for (int i = 0; i < metrics.length; i++) {
118            values[i + 1] = metrics[i].formatValue(taskInfo.getMeasureValue(metrics[i]));
119        }
120       
121        values[values.length - 1] = Integer.toString(task.getId());
122       
123        TreeItem item;
124        if (parent instanceof TreeItem) {
125            item = new TreeItem((TreeItem) parent, SWT.NULL);
126        }
127        else {
128            item = new TreeItem((Tree) parent, SWT.NULL);
129        }
130        item.setText(values);
131        item.setData(task);
132       
133        if (createChildren) {
134            // simulate a child
135            if ((task instanceof IStructuringTemporalRelationship) ||
136                (task instanceof IMarkingTemporalRelationship))
137            {
138                new TreeItem(item, SWT.NULL);
139            }
140        }
141    }
142
143    /**
144     *
145     */
146    static Tree createTargetsTree(Composite  parent, String name) {
147        Tree tree = new Tree(parent, SWT.BORDER | SWT.MULTI);
148        tree.setHeaderVisible(true);
149       
150        TreeColumn guiElementColumn = new TreeColumn(tree, SWT.NONE);
151        guiElementColumn.setText(name);
152        guiElementColumn.setAlignment(SWT.LEFT);
153       
154        return tree;
155    }
156
157    /**
158     *
159     */
160    static void updateColumnWidths(Tree tree) {
161        TreeColumn firstColumn = tree.getColumn(0);
162        firstColumn.pack();
163       
164        if (tree.getColumnCount() > 1) {
165            int availableWidth = tree.getBounds().width - firstColumn.getWidth();
166            int effectiveWidth = 0;
167            for (int i = 1; i < tree.getColumnCount(); i++) {
168                TreeColumn column = tree.getColumn(i);
169                column.pack();
170                effectiveWidth += column.getWidth();
171            }
172           
173            if (effectiveWidth < availableWidth) {
174                firstColumn.setWidth(firstColumn.getWidth() + availableWidth - effectiveWidth - 20);
175            }
176        }
177    }
178
179    /**
180     *
181     */
182    static void addItemSpecificContextMenu(final Tree             tree,
183                                           final Class<?>         selectedItemDataType,
184                                           final String           menuItemText,
185                                           final SelectionAdapter menuItemSelectionAdapter)
186    {
187        Menu menu = tree.getMenu();
188       
189        if (menu == null) {
190            menu = new Menu(tree);
191            tree.setMenu(menu);
192        }
193       
194        final Menu finalMenu = menu;
195       
196        menu.addMenuListener(new MenuAdapter() {
197            public void menuShown(MenuEvent e) {
198                MenuItem[] items = finalMenu.getItems();
199                for (int i = 0; i < items.length; i++) {
200                    if (menuItemText.equals(items[i].getText())) {
201                        items[i].dispose();
202                    }
203                }
204               
205                if (selectedItemDataType.isInstance(tree.getSelection()[0].getData())) {
206                    MenuItem newItem = new MenuItem(finalMenu, SWT.NONE);
207                    newItem.setText(menuItemText);
208                    newItem.addSelectionListener(menuItemSelectionAdapter);
209                }
210            }
211        });
212    }
213   
214    /**
215     *
216     */
217    static void addInvolvedTargets(Tree guiElementsTree, ITask task) {
218        List<IEventTarget> targets = new ArrayList<IEventTarget>();
219        getInvolvedTargets(task, targets);
220        addInvolvedTargets(guiElementsTree, targets);
221    }
222   
223    /**
224     *
225     */
226    static void getInvolvedTargets(ITask task, List<IEventTarget> involvedTargets) {
227        if (task instanceof IStructuringTemporalRelationship) {
228            for (ITask child : ((IStructuringTemporalRelationship) task).getChildren()) {
229                getInvolvedTargets(child, involvedTargets);
230            }
231        }
232        else if (task instanceof IMarkingTemporalRelationship) {
233            getInvolvedTargets
234                (((IMarkingTemporalRelationship) task).getMarkedTask(), involvedTargets);
235        }
236        else {
237            involvedTargets.add
238                (((IEventTaskInstance) task.getInstances().iterator().next()).getEvent().getTarget());
239        }
240    }
241
242    /**
243     *
244     */
245    static void addInvolvedTargets(Tree guiElementsTree, List<IEventTarget> targets) {
246        for (IEventTarget target : targets) {
247            List<IEventTarget> pathToIntegrate = new LinkedList<IEventTarget>();
248
249            while (target != null) {
250                pathToIntegrate.add(0, target);
251
252                if (target instanceof IGUIElement) {
253                    target = ((IGUIElement) target).getParent();
254                }
255                else {
256                    target = null;
257                }
258            }
259
260            TreeItem parent = null;
261
262            while (pathToIntegrate.size() > 0) {
263                TreeItem[] children;
264
265                if (parent == null) {
266                    children = guiElementsTree.getItems();
267                }
268                else {
269                    children = parent.getItems();
270                }
271
272                TreeItem childItem = null;
273
274                if (children != null) {
275                    for (TreeItem child : children) {
276                        if (pathToIntegrate.get(0).equals(child.getData())) {
277                            childItem = child;
278                        }
279                    }
280                }
281
282                if (childItem == null) {
283                    if (parent == null) {
284                        childItem = new TreeItem(guiElementsTree, SWT.NONE);
285                    }
286                    else {
287                        childItem = new TreeItem(parent, SWT.NONE);
288                    }
289
290                    childItem.setText(pathToIntegrate.get(0).toString());
291                    childItem.setData(pathToIntegrate.get(0));
292                }
293
294                pathToIntegrate.remove(0);
295                parent = childItem;
296            }
297        }
298       
299        expandAll(guiElementsTree, true);
300        updateColumnWidths(guiElementsTree);
301    }
302
303    /**
304     *
305     */
306    static void addInvolvedTargetsHighlighting(final Tree tasks, final Tree involvedTargetsTree) {
307        tasks.addSelectionListener(new SelectionAdapter() {
308            @Override
309            public void widgetSelected(SelectionEvent e) {
310                TreeItem[] selectedItems = tasks.getSelection();
311                if ((selectedItems.length == 1) &&
312                    (selectedItems[0].getData() instanceof ITask))
313                {
314                    highlightInvolvedTargets
315                        ((ITask) selectedItems[0].getData(), involvedTargetsTree);
316                }
317            }
318        });
319
320    }
321
322    /**
323     *
324     */
325    static void highlightInvolvedTargets(ITask task, Tree involvedTargetsTree) {
326        List<IEventTarget> targets = new ArrayList<IEventTarget>();
327        getInvolvedTargets(task, targets);
328       
329        List<TreeItem> itemsToSelect = new LinkedList<TreeItem>();
330        List<TreeItem> candidateItems = new LinkedList<TreeItem>();
331       
332        for (TreeItem item : involvedTargetsTree.getItems()) {
333            candidateItems.add(item);
334        }
335       
336        while (candidateItems.size() > 0) {
337            TreeItem candidate = candidateItems.remove(0);
338           
339            if (targets.contains(candidate.getData())) {
340                itemsToSelect.add(candidate);
341            }
342           
343            for (TreeItem child : candidate.getItems()) {
344                candidateItems.add(child);
345            }
346        }
347       
348        involvedTargetsTree.setSelection
349            (itemsToSelect.toArray(new TreeItem[itemsToSelect.size()]));
350    }
351
352    /**
353     *
354     */
355    static void addExpansionListener(Tree tree, Listener listener) {
356        Listener[] listeners = tree.getListeners(SWT.Expand);
357       
358        for (Listener existingListener : listeners) {
359            if ((existingListener == listener) || (existingListener.equals(listener))) {
360                return;
361            }
362        }
363       
364        tree.addListener(SWT.Expand, listener);
365    }
366   
367    /**
368     * expands all nodes in a tree
369     */
370    static void expandAll(Tree tree, boolean expanded) {
371        for (TreeItem item : tree.getItems()) {
372            expandAll(item, expanded, Integer.MAX_VALUE);
373        }
374    }
375
376    /**
377     * expands all nodes in a tree up to a specific number of children
378     */
379    static void expandAll(TreeItem item, boolean expanded, int maxChildrenToExpand) {
380        if (item.getItems().length < maxChildrenToExpand) {
381            Listener[] listeners = item.getParent().getListeners(SWT.Expand);
382            if (listeners != null) {
383                for (Listener listener : listeners) {
384                    Event event = new Event();
385                    event.type = SWT.Expand;
386                    event.item = item;
387                    listener.handleEvent(event);
388                }
389            }
390           
391            item.setExpanded(expanded);
392
393            for (TreeItem childItem : item.getItems()) {
394                expandAll(childItem, expanded, maxChildrenToExpand);
395            }
396        }
397    }
398
399    /**
400     *
401     */
402    private VisualizationUtils() {
403        // prevent instantiation
404    }
405}
Note: See TracBrowser for help on using the repository browser.