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

Last change on this file since 1921 was 1921, checked in by pharms, 9 years ago
  • extension with further smell detections
  • may not fully work. But Hudson is more happy because compile errors should be gone
File size: 13.7 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]);
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        Menu menu = tree.getMenu();
200       
201        if (menu == null) {
202            menu = new Menu(tree);
203            tree.setMenu(menu);
204        }
205       
206        final Menu finalMenu = menu;
207       
208        menu.addMenuListener(new MenuAdapter() {
209            public void menuShown(MenuEvent e) {
210                MenuItem[] items = finalMenu.getItems();
211                for (int i = 0; i < items.length; i++) {
212                    if (menuItemText.equals(items[i].getText())) {
213                        items[i].dispose();
214                    }
215                }
216               
217                if (selectedItemDataType.isInstance(tree.getSelection()[0].getData())) {
218                    MenuItem newItem = new MenuItem(finalMenu, SWT.NONE);
219                    newItem.setText(menuItemText);
220                    newItem.addSelectionListener(menuItemSelectionAdapter);
221                }
222            }
223        });
224    }
225   
226    /**
227     *
228     */
229    static void addInvolvedTargets(Tree guiElementsTree, ITask task) {
230        List<IEventTarget> targets = new ArrayList<IEventTarget>();
231        getInvolvedTargets(task, targets);
232        addInvolvedTargets(guiElementsTree, targets);
233    }
234   
235    /**
236     *
237     */
238    static void getInvolvedTargets(ITask task, List<IEventTarget> involvedTargets) {
239        if (task instanceof IStructuringTemporalRelationship) {
240            for (ITask child : ((IStructuringTemporalRelationship) task).getChildren()) {
241                getInvolvedTargets(child, involvedTargets);
242            }
243        }
244        else if (task instanceof IMarkingTemporalRelationship) {
245            getInvolvedTargets
246                (((IMarkingTemporalRelationship) task).getMarkedTask(), involvedTargets);
247        }
248        else {
249            involvedTargets.add
250                (((IEventTaskInstance) task.getInstances().iterator().next()).getEvent().getTarget());
251        }
252    }
253
254    /**
255     *
256     */
257    static void addInvolvedTargets(Tree guiElementsTree, List<IEventTarget> targets) {
258        for (IEventTarget target : targets) {
259            List<IEventTarget> pathToIntegrate = new LinkedList<IEventTarget>();
260
261            while (target != null) {
262                pathToIntegrate.add(0, target);
263
264                if (target instanceof IGUIElement) {
265                    target = ((IGUIElement) target).getParent();
266                }
267                else {
268                    target = null;
269                }
270            }
271
272            TreeItem parent = null;
273
274            while (pathToIntegrate.size() > 0) {
275                TreeItem[] children;
276
277                if (parent == null) {
278                    children = guiElementsTree.getItems();
279                }
280                else {
281                    children = parent.getItems();
282                }
283
284                TreeItem childItem = null;
285
286                if (children != null) {
287                    for (TreeItem child : children) {
288                        if (pathToIntegrate.get(0).equals(child.getData())) {
289                            childItem = child;
290                        }
291                    }
292                }
293
294                if (childItem == null) {
295                    if (parent == null) {
296                        childItem = new TreeItem(guiElementsTree, SWT.NONE);
297                    }
298                    else {
299                        childItem = new TreeItem(parent, SWT.NONE);
300                    }
301
302                    childItem.setText(pathToIntegrate.get(0).toString());
303                    childItem.setData(pathToIntegrate.get(0));
304                }
305
306                pathToIntegrate.remove(0);
307                parent = childItem;
308            }
309        }
310       
311        expandAll(guiElementsTree, true);
312        updateColumnWidths(guiElementsTree);
313    }
314
315    /**
316     *
317     */
318    static void addInvolvedTargetsHighlighting(final Tree tasks, final Tree involvedTargetsTree) {
319        tasks.addSelectionListener(new SelectionAdapter() {
320            @Override
321            public void widgetSelected(SelectionEvent e) {
322                TreeItem[] selectedItems = tasks.getSelection();
323                if ((selectedItems.length == 1) &&
324                    (selectedItems[0].getData() instanceof ITask))
325                {
326                    highlightInvolvedTargets
327                        ((ITask) selectedItems[0].getData(), involvedTargetsTree);
328                }
329            }
330        });
331
332    }
333
334    /**
335     *
336     */
337    static void highlightInvolvedTargets(ITask task, Tree involvedTargetsTree) {
338        List<IEventTarget> targets = new ArrayList<IEventTarget>();
339        getInvolvedTargets(task, targets);
340       
341        List<TreeItem> itemsToSelect = new LinkedList<TreeItem>();
342        List<TreeItem> candidateItems = new LinkedList<TreeItem>();
343       
344        for (TreeItem item : involvedTargetsTree.getItems()) {
345            candidateItems.add(item);
346        }
347       
348        while (candidateItems.size() > 0) {
349            TreeItem candidate = candidateItems.remove(0);
350           
351            if (targets.contains(candidate.getData())) {
352                itemsToSelect.add(candidate);
353            }
354           
355            for (TreeItem child : candidate.getItems()) {
356                candidateItems.add(child);
357            }
358        }
359       
360        involvedTargetsTree.setSelection
361            (itemsToSelect.toArray(new TreeItem[itemsToSelect.size()]));
362    }
363
364    /**
365     *
366     */
367    static void addExpansionListener(Tree tree, Listener listener) {
368        Listener[] listeners = tree.getListeners(SWT.Expand);
369       
370        for (Listener existingListener : listeners) {
371            if ((existingListener == listener) || (existingListener.equals(listener))) {
372                return;
373            }
374        }
375       
376        tree.addListener(SWT.Expand, listener);
377    }
378   
379    /**
380     * expands all nodes in a tree
381     */
382    static void expandAll(Tree tree, boolean expanded) {
383        for (TreeItem item : tree.getItems()) {
384            expandAll(item, expanded, Integer.MAX_VALUE);
385        }
386    }
387
388    /**
389     * expands all nodes in a tree up to a specific number of children
390     */
391    static void expandAll(TreeItem item, boolean expanded, int maxChildrenToExpand) {
392        if (item.getItems().length < maxChildrenToExpand) {
393            Listener[] listeners = item.getParent().getListeners(SWT.Expand);
394            if (listeners != null) {
395                for (Listener listener : listeners) {
396                    Event event = new Event();
397                    event.type = SWT.Expand;
398                    event.item = item;
399                    listener.handleEvent(event);
400                }
401            }
402           
403            item.setExpanded(expanded);
404
405            for (TreeItem childItem : item.getItems()) {
406                expandAll(childItem, expanded, maxChildrenToExpand);
407            }
408        }
409    }
410
411    /**
412     *
413     */
414    private VisualizationUtils() {
415        // prevent instantiation
416    }
417}
Note: See TracBrowser for help on using the repository browser.