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

Last change on this file since 1495 was 1495, checked in by pharms, 10 years ago
  • state of the HCSE 2014 Paper. An appropriate tag will follow.
File size: 13.5 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            int contextValue = Integer.MIN_VALUE;
119           
120            if (parent.getData() instanceof ITask) {
121                contextValue = taskInfo.getMeasureValue(metrics[i], (ITask) parent.getData());
122            }
123           
124            if (contextValue > Integer.MIN_VALUE) {
125                values[i + 1] = metrics[i].formatValue(contextValue) + "(" +
126                    metrics[i].formatValue(taskInfo.getMeasureValue(metrics[i])) + ")";
127            }
128            else {
129                values[i + 1] = metrics[i].formatValue(taskInfo.getMeasureValue(metrics[i]));
130            }
131        }
132       
133        values[values.length - 1] = Integer.toString(task.getId());
134       
135        TreeItem item;
136        if (parent instanceof TreeItem) {
137            item = new TreeItem((TreeItem) parent, SWT.NULL);
138        }
139        else {
140            item = new TreeItem((Tree) parent, SWT.NULL);
141        }
142        item.setText(values);
143        item.setData(task);
144       
145        if (createChildren) {
146            // simulate a child
147            if ((task instanceof IStructuringTemporalRelationship) ||
148                (task instanceof IMarkingTemporalRelationship))
149            {
150                new TreeItem(item, SWT.NULL);
151            }
152        }
153    }
154
155    /**
156     *
157     */
158    static Tree createTargetsTree(Composite  parent, String name) {
159        Tree tree = new Tree(parent, SWT.BORDER | SWT.MULTI);
160        tree.setHeaderVisible(true);
161       
162        TreeColumn guiElementColumn = new TreeColumn(tree, SWT.NONE);
163        guiElementColumn.setText(name);
164        guiElementColumn.setAlignment(SWT.LEFT);
165       
166        return tree;
167    }
168
169    /**
170     *
171     */
172    static void updateColumnWidths(Tree tree) {
173        TreeColumn firstColumn = tree.getColumn(0);
174        firstColumn.pack();
175       
176        if (tree.getColumnCount() > 1) {
177            int availableWidth = tree.getBounds().width - firstColumn.getWidth();
178            int effectiveWidth = 0;
179            for (int i = 1; i < tree.getColumnCount(); i++) {
180                TreeColumn column = tree.getColumn(i);
181                column.pack();
182                effectiveWidth += column.getWidth();
183            }
184           
185            if (effectiveWidth < availableWidth) {
186                firstColumn.setWidth(firstColumn.getWidth() + availableWidth - effectiveWidth - 20);
187            }
188        }
189    }
190
191    /**
192     *
193     */
194    static void addItemSpecificContextMenu(final Tree             tree,
195                                           final Class<?>         selectedItemDataType,
196                                           final String           menuItemText,
197                                           final SelectionAdapter menuItemSelectionAdapter)
198    {
199        final Menu menu = new Menu(tree);
200        tree.setMenu(menu);
201        menu.addMenuListener(new MenuAdapter() {
202            public void menuShown(MenuEvent e) {
203                MenuItem[] items = menu.getItems();
204                for (int i = 0; i < items.length; i++) {
205                    items[i].dispose();
206                }
207               
208                if (selectedItemDataType.isInstance(tree.getSelection()[0].getData())) {
209                    MenuItem newItem = new MenuItem(menu, SWT.NONE);
210                    newItem.setText(menuItemText);
211                    newItem.addSelectionListener(menuItemSelectionAdapter);
212                }
213            }
214        });
215    }
216   
217    /**
218     *
219     */
220    static void addInvolvedTargets(Tree guiElementsTree, ITask task) {
221        List<IEventTarget> targets = new ArrayList<IEventTarget>();
222        getInvolvedTargets(task, targets);
223        addInvolvedTargets(guiElementsTree, targets);
224    }
225   
226    /**
227     *
228     */
229    static void getInvolvedTargets(ITask task, List<IEventTarget> involvedTargets) {
230        if (task instanceof IStructuringTemporalRelationship) {
231            for (ITask child : ((IStructuringTemporalRelationship) task).getChildren()) {
232                getInvolvedTargets(child, involvedTargets);
233            }
234        }
235        else if (task instanceof IMarkingTemporalRelationship) {
236            getInvolvedTargets
237                (((IMarkingTemporalRelationship) task).getMarkedTask(), involvedTargets);
238        }
239        else {
240            involvedTargets.add
241                (((IEventTaskInstance) task.getInstances().iterator().next()).getEvent().getTarget());
242        }
243    }
244
245    /**
246     *
247     */
248    static void addInvolvedTargets(Tree guiElementsTree, List<IEventTarget> targets) {
249        for (IEventTarget target : targets) {
250            List<IEventTarget> pathToIntegrate = new LinkedList<IEventTarget>();
251
252            while (target != null) {
253                pathToIntegrate.add(0, target);
254
255                if (target instanceof IGUIElement) {
256                    target = ((IGUIElement) target).getParent();
257                }
258                else {
259                    target = null;
260                }
261            }
262
263            TreeItem parent = null;
264
265            while (pathToIntegrate.size() > 0) {
266                TreeItem[] children;
267
268                if (parent == null) {
269                    children = guiElementsTree.getItems();
270                }
271                else {
272                    children = parent.getItems();
273                }
274
275                TreeItem childItem = null;
276
277                if (children != null) {
278                    for (TreeItem child : children) {
279                        if (pathToIntegrate.get(0).equals(child.getData())) {
280                            childItem = child;
281                        }
282                    }
283                }
284
285                if (childItem == null) {
286                    if (parent == null) {
287                        childItem = new TreeItem(guiElementsTree, SWT.NONE);
288                    }
289                    else {
290                        childItem = new TreeItem(parent, SWT.NONE);
291                    }
292
293                    childItem.setText(pathToIntegrate.get(0).toString());
294                    childItem.setData(pathToIntegrate.get(0));
295                }
296
297                pathToIntegrate.remove(0);
298                parent = childItem;
299            }
300        }
301       
302        expandAll(guiElementsTree, true);
303        updateColumnWidths(guiElementsTree);
304    }
305
306    /**
307     *
308     */
309    static void addInvolvedTargetsHighlighting(final Tree tasks, final Tree involvedTargetsTree) {
310        tasks.addSelectionListener(new SelectionAdapter() {
311            @Override
312            public void widgetSelected(SelectionEvent e) {
313                TreeItem[] selectedItems = tasks.getSelection();
314                if ((selectedItems.length == 1) &&
315                    (selectedItems[0].getData() instanceof ITask))
316                {
317                    highlightInvolvedTargets
318                        ((ITask) selectedItems[0].getData(), involvedTargetsTree);
319                }
320            }
321        });
322
323    }
324
325    /**
326     *
327     */
328    static void highlightInvolvedTargets(ITask task, Tree involvedTargetsTree) {
329        List<IEventTarget> targets = new ArrayList<IEventTarget>();
330        getInvolvedTargets(task, targets);
331       
332        List<TreeItem> itemsToSelect = new LinkedList<TreeItem>();
333        List<TreeItem> candidateItems = new LinkedList<TreeItem>();
334       
335        for (TreeItem item : involvedTargetsTree.getItems()) {
336            candidateItems.add(item);
337        }
338       
339        while (candidateItems.size() > 0) {
340            TreeItem candidate = candidateItems.remove(0);
341           
342            if (targets.contains(candidate.getData())) {
343                itemsToSelect.add(candidate);
344            }
345           
346            for (TreeItem child : candidate.getItems()) {
347                candidateItems.add(child);
348            }
349        }
350       
351        involvedTargetsTree.setSelection
352            (itemsToSelect.toArray(new TreeItem[itemsToSelect.size()]));
353    }
354
355    /**
356     *
357     */
358    static void addExpansionListener(Tree tree, Listener listener) {
359        Listener[] listeners = tree.getListeners(SWT.Expand);
360       
361        for (Listener existingListener : listeners) {
362            if ((existingListener == listener) || (existingListener.equals(listener))) {
363                return;
364            }
365        }
366       
367        tree.addListener(SWT.Expand, listener);
368    }
369   
370    /**
371     * expands all nodes in a tree
372     */
373    static void expandAll(Tree tree, boolean expanded) {
374        for (TreeItem item : tree.getItems()) {
375            expandAll(item, expanded, Integer.MAX_VALUE);
376        }
377    }
378
379    /**
380     * expands all nodes in a tree up to a specific number of children
381     */
382    static void expandAll(TreeItem item, boolean expanded, int maxChildrenToExpand) {
383        if (item.getItems().length < maxChildrenToExpand) {
384            Listener[] listeners = item.getParent().getListeners(SWT.Expand);
385            if (listeners != null) {
386                for (Listener listener : listeners) {
387                    Event event = new Event();
388                    event.type = SWT.Expand;
389                    event.item = item;
390                    listener.handleEvent(event);
391                }
392            }
393           
394            item.setExpanded(expanded);
395
396            for (TreeItem childItem : item.getItems()) {
397                expandAll(childItem, expanded, maxChildrenToExpand);
398            }
399        }
400    }
401
402    /**
403     *
404     */
405    private VisualizationUtils() {
406        // prevent instantiation
407    }
408}
Note: See TracBrowser for help on using the repository browser.