/
GEFSpyView.java
180 lines (161 loc) · 5.26 KB
/
GEFSpyView.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
/*******************************************************************************
* Copyright (c) 2017 Red Hat, Inc and others.
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Red Hat, Inc - initial API and implementation
*******************************************************************************/
package org.eclipse.reddeer.gef.spy.view;
import java.util.List;
import org.eclipse.draw2d.IFigure;
import org.eclipse.gef.EditPart;
import org.eclipse.gef.GraphicalEditPart;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.Separator;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.TreeNode;
import org.eclipse.jface.viewers.TreeNodeContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.part.ViewPart;
import org.eclipse.reddeer.gef.handler.EditPartHandler;
import org.eclipse.reddeer.gef.lookup.ViewerLookup;
import org.eclipse.reddeer.gef.spy.TreeNodeExt;
import org.eclipse.reddeer.workbench.core.lookup.EditorPartLookup;
/**
* GEFSpy View.
*
* @author apodhrad
*
*/
public class GEFSpyView extends ViewPart {
private TreeViewer treeViewer;
@Override
public void createPartControl(Composite parent) {
treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
treeViewer.setContentProvider(new TreeNodeContentProvider());
treeViewer.setLabelProvider(new GEFSpyViewLabelProvider());
refresh(treeViewer);
hookRefreshAction();
hookSelectAction();
}
/**
* Gets tree viewer.
*
* @return tree viewer
*/
public TreeViewer getTreeViewer() {
return treeViewer;
}
/**
* Refreshes a given tree viewer with all edit parts (or figures) if a GEF editor is available. Otherwise, it throws
* a warning about that.
*
* @param treeViewer
* Tree viewer
*/
protected void refresh(TreeViewer treeViewer) {
EditPart editPart = null;
try {
IEditorPart editorPart = EditorPartLookup.getInstance().getEditor();
editPart = ViewerLookup.getInstance().findGraphicalViewer(editorPart).getContents();
} catch (Exception ex) {
treeViewer.setInput(new TreeNode[] {});
MessageDialog.openWarning(treeViewer.getControl().getShell(), "GEF View", "No GEF editor was detected.");
return;
}
treeViewer.setInput(createTree(editPart));
treeViewer.refresh();
}
/**
* Creates a tree for a given edit part.
*
* @param editPart
* Edit part
* @return Root node of created tree
*/
protected TreeNode[] createTree(EditPart editPart) {
TreeNodeExt root = new TreeNodeExt(editPart);
createTree(root);
return new TreeNode[] { root };
}
/**
* Creates a tree for a given tree node according to its value (edit part/figure).
*
* @param node
* Tree node
*/
protected void createTree(TreeNodeExt node) {
Object obj = node.getValue();
if (obj instanceof EditPart) {
EditPart editPart = (EditPart) obj;
List<Object> children = editPart.getChildren();
for (Object child : children) {
TreeNodeExt newNode = new TreeNodeExt(child);
createTree(newNode);
node.addChild(newNode);
}
if (editPart instanceof GraphicalEditPart) {
IFigure figure = ((GraphicalEditPart) editPart).getFigure();
TreeNodeExt newNode = new TreeNodeExt(figure);
createTree(newNode);
node.addChild(newNode);
}
}
if (obj instanceof IFigure) {
IFigure figure = (IFigure) obj;
List<Object> children = figure.getChildren();
for (Object child : children) {
TreeNodeExt newNode = new TreeNodeExt(child);
createTree(newNode);
node.addChild(newNode);
}
}
}
private void hookRefreshAction() {
Action refreshAction = new Action() {
public void run() {
refresh(treeViewer);
}
};
refreshAction.setText("Refresh");
refreshAction.setToolTipText("Refresh");
refreshAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages()
.getImageDescriptor(ISharedImages.IMG_ELCL_SYNCED));
IActionBars bars = getViewSite().getActionBars();
bars.getToolBarManager().add(refreshAction);
bars.getToolBarManager().add(new Separator());
}
private void hookSelectAction() {
treeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
ISelection selection = event.getSelection();
Object obj = ((IStructuredSelection) selection).getFirstElement();
if (obj instanceof TreeNode) {
Object treeObject = ((TreeNode) obj).getValue();
if (treeObject instanceof EditPart && ((EditPart) treeObject).isSelectable()) {
EditPartHandler.getInstance().select((EditPart) treeObject);
}
}
}
});
}
@Override
public void setFocus() {
// we don't need any focus
}
}