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

Last change on this file since 2146 was 2146, checked in by pharms, 7 years ago
  • refactored GUI model so that hierarchical event target structures can also be used and created by plugins not being strictly for GUIs
  • Property svn:mime-type set to text/plain
File size: 7.4 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 org.eclipse.swt.SWT;
18import org.eclipse.swt.events.SelectionAdapter;
19import org.eclipse.swt.events.SelectionEvent;
20import org.eclipse.swt.layout.GridData;
21import org.eclipse.swt.layout.GridLayout;
22import org.eclipse.swt.widgets.Button;
23import org.eclipse.swt.widgets.Dialog;
24import org.eclipse.swt.widgets.Display;
25import org.eclipse.swt.widgets.MessageBox;
26import org.eclipse.swt.widgets.Shell;
27import org.eclipse.swt.widgets.Tree;
28import org.eclipse.swt.widgets.TreeItem;
29
30import de.ugoe.cs.autoquest.eventcore.IHierarchicalEventTarget;
31import de.ugoe.cs.autoquest.eventcore.IHierarchicalEventTargetModel;
32import de.ugoe.cs.autoquest.eventcore.guimodel.GUIModel;
33import de.ugoe.cs.autoquest.eventcore.guimodel.IGUIElement;
34import de.ugoe.cs.util.console.Console;
35
36import org.eclipse.swt.widgets.Label;
37
38public class ShowGuiModelDialog<T extends IHierarchicalEventTarget> extends Dialog {
39
40    protected Shell shell;
41    private Tree targetTree;
42
43    protected IHierarchicalEventTargetModel<T> model;
44
45    public ShowGuiModelDialog(Shell parent, int style, IHierarchicalEventTargetModel<T> model, String modelName) {
46        super(parent, style);
47        setText("GUI Model " + modelName);
48        this.model = model;
49    }
50
51    public void open() {
52        createContents();
53        shell.open();
54        shell.layout();
55        Display display = getParent().getDisplay();
56        while (!shell.isDisposed()) {
57            if (!display.readAndDispatch()) {
58                display.sleep();
59            }
60        }
61    }
62
63    private void createContents() {
64        shell = new Shell(getParent(), SWT.SHELL_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
65        shell.setSize(450, 300);
66        shell.setText(getText());
67
68        shell.setLayout(new GridLayout(4, false));
69
70        targetTree = new Tree(shell, SWT.BORDER | SWT.MULTI);
71        targetTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 4, 1));
72
73        buildTargetTree();
74
75        Button btnExpandAll = new Button(shell, SWT.NONE);
76        btnExpandAll.addSelectionListener(new SelectionAdapter() {
77            @Override
78            public void widgetSelected(SelectionEvent e) {
79                expandAll(targetTree, true);
80            }
81        });
82        btnExpandAll.setText("Expand all");
83
84        Button btnCollapseAll = new Button(shell, SWT.NONE);
85        btnCollapseAll.addSelectionListener(new SelectionAdapter() {
86            @Override
87            public void widgetSelected(SelectionEvent e) {
88                expandAll(targetTree, false);
89            }
90        });
91        btnCollapseAll.setText("Collapse all");
92       
93        if (model instanceof GUIModel) {
94            Button btnCondense = new Button(shell, SWT.NONE);
95            btnCondense.addSelectionListener(new SelectionAdapter() {
96                @Override
97                public void widgetSelected(SelectionEvent e) {
98                    ((GUIModel) model).condenseModel();
99                    targetTree.removeAll();
100                    buildTargetTree();
101                }
102            });
103            btnCondense.setText("Condense");
104
105            Button btnMerge = new Button(shell, SWT.NONE);
106            btnMerge.addSelectionListener(new SelectionAdapter() {
107                @Override
108                public void widgetSelected(SelectionEvent e) {
109                    mergeSelectedNode(targetTree);
110                }
111            });
112            btnMerge.setText("Merge nodes");
113        }
114       
115        //new Label(shell, SWT.NONE);
116        new Label(shell, SWT.NONE);
117        new Label(shell, SWT.NONE);
118        new Label(shell, SWT.NONE);
119
120    }
121
122    private void buildTargetTree() {
123        IHierarchicalEventTargetModel.Traverser<T> traverser =  model.getTraverser();
124       
125        IHierarchicalEventTarget root = traverser.firstChild();
126       
127        while (root != null) {
128            TreeItem child = new TreeItem(targetTree, SWT.NULL);
129            child.setText(root.toString());
130            child.setData(root);
131            buildTargetTree(child, traverser);
132            root = traverser.nextSibling();
133        }
134    }
135
136    private void buildTargetTree(TreeItem                                   currentParent,
137                                 IHierarchicalEventTargetModel.Traverser<T> traverser)
138    {
139        if (traverser.hasFirstChild()) {
140            T childElement = traverser.firstChild();
141       
142            while (childElement != null) {
143                TreeItem child = new TreeItem(currentParent, SWT.NULL);
144                child.setText(childElement.toString());
145                child.setData(childElement);
146                buildTargetTree(child, traverser);
147                childElement = traverser.nextSibling();
148            }
149       
150            traverser.parent();
151        }
152    }
153
154    private void expandAll(Tree tree, boolean expanded) {
155        for (TreeItem item : tree.getItems()) {
156            expandAll(item, expanded);
157        }
158    }
159
160    private void expandAll(TreeItem item, boolean expanded) {
161        item.setExpanded(expanded);
162        for (TreeItem childItem : item.getItems()) {
163            expandAll(childItem, expanded);
164        }
165    }
166   
167    @SuppressWarnings("unchecked")
168    private void mergeSelectedNode(Tree tree) {
169        TreeItem[] selectedNodes = tree.getSelection();
170        if( selectedNodes.length<2 ) {
171            MessageBox messageBox = new MessageBox(shell, SWT.ERROR);
172            messageBox.setMessage("Must select at least two nodes to merge!");
173            messageBox.setText("Error");
174            messageBox.open();
175            return;
176        }
177       
178        TreeItem firstParent = selectedNodes[0].getParentItem();
179        for( int i=1 ; i<selectedNodes.length ; i++ ) {
180            if( firstParent!=selectedNodes[i].getParentItem() ) {
181                MessageBox messageBox = new MessageBox(shell, SWT.ERROR);
182                messageBox.setMessage("All selected nodes must have the same parent!");
183                messageBox.setText("Error");
184                messageBox.open();
185                return;
186            }
187        }
188       
189        try {
190            // try to merge the elements
191            IGUIElement firstElement = (IGUIElement) selectedNodes[0].getData();
192            for( int i=1 ; i<selectedNodes.length ; i++ ) {
193                ((GUIModel) model).mergeEventTargets
194                    (firstElement, (IGUIElement) selectedNodes[i].getData());
195            }
196        }
197        catch( IllegalArgumentException e) {
198            Console.logException(e);
199        }
200       
201        // update visualization of the model
202        if (firstParent != null) {
203            firstParent.removeAll();
204            buildTargetTree(firstParent, model.getTraverser((T) firstParent.getData()));
205            firstParent.setExpanded(true);
206        }
207        else {
208            targetTree.removeAll();
209            buildTargetTree();
210        }
211    }
212
213}
Note: See TracBrowser for help on using the repository browser.