1
package net.launchpad.vide.flowchart.diagram.navigator;
3
import java.util.ArrayList;
4
import java.util.Collection;
5
import java.util.Collections;
6
import java.util.HashMap;
7
import java.util.LinkedList;
9
import net.launchpad.vide.flowchart.diagram.edit.parts.FunctionalCommandEditPart;
10
import net.launchpad.vide.flowchart.diagram.edit.parts.FunctionalCommandOutputEditPart;
11
import net.launchpad.vide.flowchart.diagram.edit.parts.ProgramEditPart;
12
import net.launchpad.vide.flowchart.diagram.part.FlowchartVisualIDRegistry;
13
import net.launchpad.vide.flowchart.diagram.part.Messages;
15
import org.eclipse.core.resources.IFile;
16
import org.eclipse.emf.common.util.URI;
17
import org.eclipse.emf.ecore.EObject;
18
import org.eclipse.emf.ecore.resource.Resource;
19
import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
20
import org.eclipse.emf.transaction.TransactionalEditingDomain;
21
import org.eclipse.emf.workspace.util.WorkspaceSynchronizer;
22
import org.eclipse.gmf.runtime.emf.core.GMFEditingDomainFactory;
23
import org.eclipse.gmf.runtime.notation.Diagram;
24
import org.eclipse.gmf.runtime.notation.Edge;
25
import org.eclipse.gmf.runtime.notation.Node;
26
import org.eclipse.gmf.runtime.notation.View;
27
import org.eclipse.jface.viewers.Viewer;
28
import org.eclipse.ui.IMemento;
29
import org.eclipse.ui.navigator.ICommonContentExtensionSite;
30
import org.eclipse.ui.navigator.ICommonContentProvider;
35
public class FlowchartNavigatorContentProvider implements
36
ICommonContentProvider {
41
private static final Object[] EMPTY_ARRAY = new Object[0];
46
private Viewer myViewer;
51
private AdapterFactoryEditingDomain myEditingDomain;
56
private WorkspaceSynchronizer myWorkspaceSynchronizer;
61
private Runnable myViewerRefreshRunnable;
66
@SuppressWarnings({ "unchecked", "serial", "rawtypes" })
67
public FlowchartNavigatorContentProvider() {
68
TransactionalEditingDomain editingDomain = GMFEditingDomainFactory.INSTANCE
69
.createEditingDomain();
70
myEditingDomain = (AdapterFactoryEditingDomain) editingDomain;
71
myEditingDomain.setResourceToReadOnlyMap(new HashMap() {
72
public Object get(Object key) {
73
if (!containsKey(key)) {
74
put(key, Boolean.TRUE);
76
return super.get(key);
79
myViewerRefreshRunnable = new Runnable() {
81
if (myViewer != null) {
86
myWorkspaceSynchronizer = new WorkspaceSynchronizer(editingDomain,
87
new WorkspaceSynchronizer.Delegate() {
88
public void dispose() {
91
public boolean handleResourceChanged(final Resource resource) {
97
public boolean handleResourceDeleted(Resource resource) {
103
public boolean handleResourceMoved(Resource resource,
105
unloadAllResources();
115
public void dispose() {
116
myWorkspaceSynchronizer.dispose();
117
myWorkspaceSynchronizer = null;
118
myViewerRefreshRunnable = null;
120
unloadAllResources();
121
((TransactionalEditingDomain) myEditingDomain).dispose();
122
myEditingDomain = null;
128
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
135
void unloadAllResources() {
136
for (Resource nextResource : myEditingDomain.getResourceSet()
138
nextResource.unload();
145
void asyncRefresh() {
146
if (myViewer != null && !myViewer.getControl().isDisposed()) {
147
myViewer.getControl().getDisplay()
148
.asyncExec(myViewerRefreshRunnable);
155
public Object[] getElements(Object inputElement) {
156
return getChildren(inputElement);
162
public void restoreState(IMemento aMemento) {
168
public void saveState(IMemento aMemento) {
174
public void init(ICommonContentExtensionSite aConfig) {
180
public Object[] getChildren(Object parentElement) {
181
if (parentElement instanceof IFile) {
182
IFile file = (IFile) parentElement;
183
URI fileURI = URI.createPlatformResourceURI(file.getFullPath()
185
Resource resource = myEditingDomain.getResourceSet().getResource(
187
ArrayList<FlowchartNavigatorItem> result = new ArrayList<FlowchartNavigatorItem>();
188
ArrayList<View> topViews = new ArrayList<View>(resource
189
.getContents().size());
190
for (EObject o : resource.getContents()) {
191
if (o instanceof View) {
192
topViews.add((View) o);
195
result.addAll(createNavigatorItems(
196
selectViewsByType(topViews, ProgramEditPart.MODEL_ID),
198
return result.toArray();
201
if (parentElement instanceof FlowchartNavigatorGroup) {
202
FlowchartNavigatorGroup group = (FlowchartNavigatorGroup) parentElement;
203
return group.getChildren();
206
if (parentElement instanceof FlowchartNavigatorItem) {
207
FlowchartNavigatorItem navigatorItem = (FlowchartNavigatorItem) parentElement;
208
if (navigatorItem.isLeaf() || !isOwnView(navigatorItem.getView())) {
211
return getViewChildren(navigatorItem.getView(), parentElement);
220
private Object[] getViewChildren(View view, Object parentElement) {
221
switch (FlowchartVisualIDRegistry.getVisualID(view)) {
223
case FunctionalCommandOutputEditPart.VISUAL_ID: {
224
LinkedList<FlowchartAbstractNavigatorItem> result = new LinkedList<FlowchartAbstractNavigatorItem>();
225
Edge sv = (Edge) view;
226
FlowchartNavigatorGroup target = new FlowchartNavigatorGroup(
227
Messages.NavigatorGroupName_FunctionalCommandOutput_4001_target,
228
"icons/linkTargetNavigatorGroup.gif", parentElement); //$NON-NLS-1$
229
FlowchartNavigatorGroup source = new FlowchartNavigatorGroup(
230
Messages.NavigatorGroupName_FunctionalCommandOutput_4001_source,
231
"icons/linkSourceNavigatorGroup.gif", parentElement); //$NON-NLS-1$
232
Collection<View> connectedViews;
233
connectedViews = getLinksTargetByType(Collections.singleton(sv),
234
FlowchartVisualIDRegistry
235
.getType(FunctionalCommandEditPart.VISUAL_ID));
236
target.addChildren(createNavigatorItems(connectedViews, target,
238
connectedViews = getLinksSourceByType(Collections.singleton(sv),
239
FlowchartVisualIDRegistry
240
.getType(FunctionalCommandEditPart.VISUAL_ID));
241
source.addChildren(createNavigatorItems(connectedViews, source,
243
if (!target.isEmpty()) {
246
if (!source.isEmpty()) {
249
return result.toArray();
252
case ProgramEditPart.VISUAL_ID: {
253
LinkedList<FlowchartAbstractNavigatorItem> result = new LinkedList<FlowchartAbstractNavigatorItem>();
254
Diagram sv = (Diagram) view;
255
FlowchartNavigatorGroup links = new FlowchartNavigatorGroup(
256
Messages.NavigatorGroupName_Program_1000_links,
257
"icons/linksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
258
Collection<View> connectedViews;
259
connectedViews = getChildrenByType(Collections.singleton(sv),
260
FlowchartVisualIDRegistry
261
.getType(FunctionalCommandEditPart.VISUAL_ID));
262
result.addAll(createNavigatorItems(connectedViews, parentElement,
264
connectedViews = getDiagramLinksByType(Collections.singleton(sv),
265
FlowchartVisualIDRegistry
266
.getType(FunctionalCommandOutputEditPart.VISUAL_ID));
267
links.addChildren(createNavigatorItems(connectedViews, links, false));
268
if (!links.isEmpty()) {
271
return result.toArray();
274
case FunctionalCommandEditPart.VISUAL_ID: {
275
LinkedList<FlowchartAbstractNavigatorItem> result = new LinkedList<FlowchartAbstractNavigatorItem>();
276
Node sv = (Node) view;
277
FlowchartNavigatorGroup incominglinks = new FlowchartNavigatorGroup(
278
Messages.NavigatorGroupName_FunctionalCommand_2001_incominglinks,
279
"icons/incomingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
280
FlowchartNavigatorGroup outgoinglinks = new FlowchartNavigatorGroup(
281
Messages.NavigatorGroupName_FunctionalCommand_2001_outgoinglinks,
282
"icons/outgoingLinksNavigatorGroup.gif", parentElement); //$NON-NLS-1$
283
Collection<View> connectedViews;
284
connectedViews = getIncomingLinksByType(Collections.singleton(sv),
285
FlowchartVisualIDRegistry
286
.getType(FunctionalCommandOutputEditPart.VISUAL_ID));
287
incominglinks.addChildren(createNavigatorItems(connectedViews,
288
incominglinks, true));
289
connectedViews = getOutgoingLinksByType(Collections.singleton(sv),
290
FlowchartVisualIDRegistry
291
.getType(FunctionalCommandOutputEditPart.VISUAL_ID));
292
outgoinglinks.addChildren(createNavigatorItems(connectedViews,
293
outgoinglinks, true));
294
if (!incominglinks.isEmpty()) {
295
result.add(incominglinks);
297
if (!outgoinglinks.isEmpty()) {
298
result.add(outgoinglinks);
300
return result.toArray();
309
private Collection<View> getLinksSourceByType(Collection<Edge> edges,
311
LinkedList<View> result = new LinkedList<View>();
312
for (Edge nextEdge : edges) {
313
View nextEdgeSource = nextEdge.getSource();
314
if (type.equals(nextEdgeSource.getType())
315
&& isOwnView(nextEdgeSource)) {
316
result.add(nextEdgeSource);
325
private Collection<View> getLinksTargetByType(Collection<Edge> edges,
327
LinkedList<View> result = new LinkedList<View>();
328
for (Edge nextEdge : edges) {
329
View nextEdgeTarget = nextEdge.getTarget();
330
if (type.equals(nextEdgeTarget.getType())
331
&& isOwnView(nextEdgeTarget)) {
332
result.add(nextEdgeTarget);
341
private Collection<View> getOutgoingLinksByType(
342
Collection<? extends View> nodes, String type) {
343
LinkedList<View> result = new LinkedList<View>();
344
for (View nextNode : nodes) {
345
result.addAll(selectViewsByType(nextNode.getSourceEdges(), type));
353
private Collection<View> getIncomingLinksByType(
354
Collection<? extends View> nodes, String type) {
355
LinkedList<View> result = new LinkedList<View>();
356
for (View nextNode : nodes) {
357
result.addAll(selectViewsByType(nextNode.getTargetEdges(), type));
365
private Collection<View> getChildrenByType(
366
Collection<? extends View> nodes, String type) {
367
LinkedList<View> result = new LinkedList<View>();
368
for (View nextNode : nodes) {
369
result.addAll(selectViewsByType(nextNode.getChildren(), type));
377
private Collection<View> getDiagramLinksByType(
378
Collection<Diagram> diagrams, String type) {
379
ArrayList<View> result = new ArrayList<View>();
380
for (Diagram nextDiagram : diagrams) {
381
result.addAll(selectViewsByType(nextDiagram.getEdges(), type));
386
// TODO refactor as static method
390
private Collection<View> selectViewsByType(Collection<View> views,
392
ArrayList<View> result = new ArrayList<View>();
393
for (View nextView : views) {
394
if (type.equals(nextView.getType()) && isOwnView(nextView)) {
395
result.add(nextView);
404
private boolean isOwnView(View view) {
405
return ProgramEditPart.MODEL_ID.equals(FlowchartVisualIDRegistry
412
private Collection<FlowchartNavigatorItem> createNavigatorItems(
413
Collection<View> views, Object parent, boolean isLeafs) {
414
ArrayList<FlowchartNavigatorItem> result = new ArrayList<FlowchartNavigatorItem>(
416
for (View nextView : views) {
417
result.add(new FlowchartNavigatorItem(nextView, parent, isLeafs));
425
public Object getParent(Object element) {
426
if (element instanceof FlowchartAbstractNavigatorItem) {
427
FlowchartAbstractNavigatorItem abstractNavigatorItem = (FlowchartAbstractNavigatorItem) element;
428
return abstractNavigatorItem.getParent();
436
public boolean hasChildren(Object element) {
437
return element instanceof IFile || getChildren(element).length > 0;