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

Last change on this file since 846 was 846, checked in by sherbold, 12 years ago
  • added interface to the GUIModel to merge nodes from the outside
  • added functionality to the SWT GUI to merge nodes of the GUI model manually
  • Property svn:mime-type set to text/plain
File size: 5.7 KB
Line 
1
2package de.ugoe.cs.quest.ui.swt;
3
4import java.util.List;
5
6import org.eclipse.swt.SWT;
7import org.eclipse.swt.events.SelectionAdapter;
8import org.eclipse.swt.events.SelectionEvent;
9import org.eclipse.swt.layout.GridData;
10import org.eclipse.swt.layout.GridLayout;
11import org.eclipse.swt.widgets.Button;
12import org.eclipse.swt.widgets.Dialog;
13import org.eclipse.swt.widgets.Display;
14import org.eclipse.swt.widgets.MessageBox;
15import org.eclipse.swt.widgets.Shell;
16import org.eclipse.swt.widgets.Tree;
17import org.eclipse.swt.widgets.TreeItem;
18
19import de.ugoe.cs.quest.eventcore.guimodel.GUIModel;
20import de.ugoe.cs.quest.eventcore.guimodel.IGUIElement;
21import de.ugoe.cs.util.console.Console;
22
23import org.eclipse.swt.widgets.Label;
24
25/**
26 * <p>
27 * TODO comment
28 * </p>
29 *
30 * @version $Revision: $ $Date: Aug 28, 2012$
31 * @author 2012, last modified by $Author: sherbold$
32 */
33public class ShowGuiModelDialog extends Dialog {
34
35    protected Shell shell;
36    private Tree guiTree;
37
38    protected GUIModel model;
39
40    /**
41     * Create the dialog.
42     *
43     * @param parent
44     * @param style
45     */
46    public ShowGuiModelDialog(Shell parent, int style, GUIModel model, String modelName) {
47        super(parent, style);
48        setText("GUI Model " + modelName);
49        this.model = model;
50    }
51
52    /**
53     * Open the dialog.
54     *
55     * @return the result
56     */
57    public void open() {
58        createContents();
59        shell.open();
60        shell.layout();
61        Display display = getParent().getDisplay();
62        while (!shell.isDisposed()) {
63            if (!display.readAndDispatch()) {
64                display.sleep();
65            }
66        }
67    }
68
69    /**
70     * Create contents of the dialog.
71     */
72    private void createContents() {
73        shell = new Shell(getParent(), SWT.SHELL_TRIM | SWT.BORDER | SWT.APPLICATION_MODAL);
74        shell.setSize(450, 300);
75        shell.setText(getText());
76
77        shell.setLayout(new GridLayout(3, false));
78
79        guiTree = new Tree(shell, SWT.BORDER | SWT.MULTI);
80        guiTree.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1));
81
82        buildGuiTree();
83
84        Button btnExpandAll = new Button(shell, SWT.NONE);
85        btnExpandAll.addSelectionListener(new SelectionAdapter() {
86            @Override
87            public void widgetSelected(SelectionEvent e) {
88                expandAll(guiTree, true);
89            }
90        });
91        btnExpandAll.setText("Expand all");
92
93        Button btnCollapseAll = new Button(shell, SWT.NONE);
94        btnCollapseAll.addSelectionListener(new SelectionAdapter() {
95            @Override
96            public void widgetSelected(SelectionEvent e) {
97                expandAll(guiTree, false);
98            }
99        });
100        btnCollapseAll.setText("Collapse all");
101       
102        Button btnMerge = new Button(shell, SWT.NONE);
103        btnMerge.addSelectionListener(new SelectionAdapter() {
104            @Override
105            public void widgetSelected(SelectionEvent e) {
106                mergeSelectedNode(guiTree);
107            }
108        });
109        btnMerge.setText("Merge");
110       
111        //new Label(shell, SWT.NONE);
112        new Label(shell, SWT.NONE);
113        new Label(shell, SWT.NONE);
114        new Label(shell, SWT.NONE);
115
116    }
117
118    private void buildGuiTree() {
119        for (IGUIElement element : model.getRootElements()) {
120            TreeItem child = new TreeItem(guiTree, SWT.NULL);
121            child.setText(element.toString());
122            child.setData(element);
123            buildGuiTree(child, model.getChildren(element));
124        }
125    }
126
127    private void buildGuiTree(TreeItem currentParent, List<IGUIElement> elements) {
128        for (IGUIElement element : elements) {
129            TreeItem child = new TreeItem(currentParent, SWT.NULL);
130            child.setText(element.toString());
131            child.setData(element);
132            buildGuiTree(child, model.getChildren(element));
133        }
134    }
135
136    private void expandAll(Tree tree, boolean expanded) {
137        for (TreeItem item : tree.getItems()) {
138            expandAll(item, expanded);
139        }
140    }
141
142    private void expandAll(TreeItem item, boolean expanded) {
143        item.setExpanded(expanded);
144        for (TreeItem childItem : item.getItems()) {
145            expandAll(childItem, expanded);
146        }
147    }
148   
149    private void mergeSelectedNode(Tree tree) {
150        TreeItem[] selectedNodes = tree.getSelection();
151        if( selectedNodes.length<2 ) {
152            MessageBox messageBox = new MessageBox(shell, SWT.ERROR);
153            messageBox.setMessage("Must select at least two nodes to merge!");
154            messageBox.setText("Error");
155            messageBox.open();
156            return;
157        }
158       
159        TreeItem firstParent = selectedNodes[0].getParentItem();
160        for( int i=1 ; i<selectedNodes.length ; i++ ) {
161            if( firstParent!=selectedNodes[i].getParentItem() ) {
162                MessageBox messageBox = new MessageBox(shell, SWT.ERROR);
163                messageBox.setMessage("All selected nodes must have the same parent!");
164                messageBox.setText("Error");
165                messageBox.open();
166                return;
167            }
168        }
169       
170        try {
171            // try to merge the elements
172            IGUIElement firstElement = (IGUIElement) selectedNodes[0].getData();
173            for( int i=1 ; i<selectedNodes.length ; i++ ) {
174                model.mergeGUIElements(firstElement, (IGUIElement) selectedNodes[i].getData());
175            }
176        } catch( IllegalArgumentException e) {
177            Console.logException(e);
178        }
179       
180        // update visualization of the model
181        firstParent.removeAll();
182        buildGuiTree(firstParent, model.getChildren((IGUIElement) firstParent.getData()));
183        firstParent.setExpanded(true);
184    }
185
186}
Note: See TracBrowser for help on using the repository browser.