1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 /***
19 * <p>Title: WSMO Studio</p>
20 * <p>Description: Semantic Web Service Editor</p>
21 * <p>Copyright: Copyright (c) 2004-2006</p>
22 * <p>Company: Ontotext Lab. / SIRMA </p>
23 */
24
25 package org.wsmostudio.ui.views.navigator;
26
27 import java.util.*;
28
29 import org.eclipse.jface.action.*;
30 import org.eclipse.jface.dialogs.MessageDialog;
31 import org.eclipse.jface.viewers.*;
32 import org.eclipse.swt.SWT;
33 import org.eclipse.swt.dnd.*;
34 import org.eclipse.swt.events.*;
35 import org.eclipse.swt.widgets.Composite;
36 import org.eclipse.swt.widgets.Menu;
37 import org.eclipse.ui.*;
38 import org.eclipse.ui.part.IPage;
39 import org.eclipse.ui.part.ViewPart;
40 import org.eclipse.ui.views.properties.*;
41 import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage;
42 import org.omwg.ontology.Ontology;
43 import org.wsmo.common.Entity;
44 import org.wsmostudio.ui.GUIHelper;
45 import org.wsmostudio.ui.Utils;
46 import org.wsmostudio.ui.WsmoUIPlugin;
47 import org.wsmostudio.ui.dnd.Clipboard;
48 import org.wsmostudio.ui.dnd.WSMOTransfer;
49 import org.wsmostudio.ui.editors.extension.ExtensionManager;
50 import org.wsmostudio.ui.editors.model.ObservableModel;
51 import org.wsmostudio.ui.views.navigator.actions.*;
52 import org.wsmostudio.ui.views.properties.WSMOPropertiesSource;
53
54 /***
55 * A primary viewer component (<i>WSMO Navigator</i>) of the WSMO Studio.
56 * It outlines the content of the opened WSMO-API objects in the workbench
57 * in a tree-styled view. It is a part of the WSMO perspective.
58 * From this viewer, different more specialized editors can be opened for
59 * the content of the visualized object.
60 *
61 * @author not attributable
62 * @version $Revision: 1389 $ $Date: 2007-12-04 17:25:33 +0200 $
63 */
64
65 public class WSMONavigator extends ViewPart
66 implements ISelectionProvider, Observer {
67
68 protected TreeViewer treeViewer;
69 private WSMONavigatorUpdater uiUpdater;
70 private Set<ISelectionChangedListener> selListeners;
71
72 private WSMOPropertiesSource propsSrc;
73 private ContentExtensionManager extensionManager;
74 private ActionRegistry actionRegistry;
75
76
77 public WSMONavigator() {
78 super();
79 uiUpdater = new WSMONavigatorUpdater(this);
80 uiUpdater.registerInOpenedEditors();
81 PlatformUI.getWorkbench()
82 .getActiveWorkbenchWindow()
83 .getPartService()
84 .addPartListener(uiUpdater);
85 actionRegistry = new ActionRegistry(this);
86 }
87
88 public void createPartControl(Composite parent) {
89 treeViewer = new TreeViewer(parent);
90 extensionManager = new ContentExtensionManager();
91 treeViewer.setContentProvider(new NavigatorContentProvider(extensionManager));
92 treeViewer.setLabelProvider(new NavigatorLabelProvider(extensionManager));
93
94 setWsmoInput(findActiveInput());
95 treeViewer.getTree().addMouseListener(new MouseAdapter() {
96 public void mouseDoubleClick(MouseEvent e) {
97 processDoubleClick(e);
98 }
99 });
100 createContextMenu();
101 selListeners = new HashSet<ISelectionChangedListener>();
102 getViewSite().setSelectionProvider(this);
103
104
105 treeViewer.addSelectionChangedListener(
106 new ISelectionChangedListener() {
107 public void selectionChanged(SelectionChangedEvent event) {
108 propsViewRefresh();
109 }
110 });
111 treeViewer.getTree().addKeyListener(new KeyAdapter() {
112 public void keyReleased(KeyEvent e) {
113 if (e.keyCode == SWT.F5) {
114 treeViewer.refresh();
115 }
116 }
117 });
118 initDNDSource();
119 initDNDTarget();
120
121 new ToolTipProvider(treeViewer.getTree());
122 }
123
124 private void initDNDSource() {
125
126 DragSource source = new DragSource(treeViewer.getTree(), DND.DROP_LINK);
127 Transfer[] types = new Transfer[] {WSMOTransfer.getInstance()};
128 source.setTransfer(types);
129
130 source.addDragListener(new DragSourceListener() {
131 public void dragStart(DragSourceEvent event) {
132 IStructuredSelection sel = (IStructuredSelection)treeViewer.getSelection();
133 if (sel == null
134 || sel.isEmpty()) {
135 event.doit = false;
136 }
137 List<Entity> selection = new LinkedList<Entity>();
138 for(Iterator<?> it = sel.iterator(); it.hasNext();) {
139 Object selObj = it.next();
140 if (selObj instanceof Entity) {
141 selection.add((Entity)selObj);
142 }
143 }
144 Clipboard.getInstance().setContent(selection);
145 }
146 public void dragSetData(DragSourceEvent event) {
147 if (WSMOTransfer.getInstance().isSupportedType(event.dataType)) {
148 event.data = Clipboard.getInstance().getContent();
149 }
150 }
151 public void dragFinished(DragSourceEvent event) {
152 Clipboard.getInstance().clear();
153 }
154 });
155
156 }
157
158 private void initDNDTarget() {
159
160 DropTarget target = new DropTarget(this.treeViewer.getTree(),
161 DND.DROP_LINK | DND.DROP_DEFAULT | DND.DROP_COPY);
162
163 final FileTransfer fileTransfer = FileTransfer.getInstance();
164 final WSMOTransfer wsmoTransfer = WSMOTransfer.getInstance();
165 target.setTransfer(new Transfer[] {fileTransfer, wsmoTransfer});
166 target.addDropListener(new NavigatorDNDTargetAdapter(this, fileTransfer, wsmoTransfer));
167 }
168
169 public static void propsViewRefresh() {
170
171 IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
172 if (activePage == null) {
173 return;
174 }
175 IViewReference[] references = activePage.getViewReferences();
176 for (IViewReference viewRef : references) {
177 if (viewRef.getId().equals("org.eclipse.ui.views.PropertySheet")) {
178 IViewPart part = viewRef.getView(true);
179 if (part == null) {
180 return;
181 }
182
183 IPage currentPropsPage = ((PropertySheet)part).getCurrentPage();
184 if (currentPropsPage == null) {
185 return;
186 }
187 if (currentPropsPage instanceof PropertySheetPage) {
188 ((PropertySheetPage)currentPropsPage).refresh();
189 }
190 else if (currentPropsPage instanceof TabbedPropertySheetPage) {
191 ((TabbedPropertySheetPage)currentPropsPage).refresh();
192 }
193 break;
194 }
195 }
196 }
197
198 public void notifyActiveFiltersChange() {
199 extensionManager.updateFilters();
200 treeViewer.refresh(true);
201 }
202
203 void setWsmoInput(IEditorInput newInput) {
204 IEditorInput oldInput = (IEditorInput)treeViewer.getInput();
205 if (oldInput == null) {
206 if (newInput == null) {
207 return;
208 }
209 }
210 else if (false == oldInput.equals(newInput)) {
211 if (oldInput.getAdapter(Observable.class) != null) {
212 ((Observable)oldInput.getAdapter(Observable.class)).deleteObserver(this);
213 uiUpdater.saveExpansionInfo(oldInput);
214 }
215 }
216 else {
217 return;
218 }
219
220 treeViewer.setInput(newInput);
221 if (newInput != null
222 && newInput.getAdapter(Observable.class) != null) {
223 ((Observable)newInput.getAdapter(Observable.class)).deleteObserver(this);
224 uiUpdater.applyExpansionInfo(newInput);
225 }
226 }
227
228 public IEditorInput getWsmoInput() {
229 if (this.treeViewer == null) {
230 return null;
231 }
232 return (IEditorInput)this.treeViewer.getInput();
233 }
234
235 public void update(Observable o, Object target) {
236 if (false == o.equals(getWsmoInput().getAdapter(Observable.class))) {
237 return;
238 }
239 treeViewer.refresh(true);
240 }
241
242 public void setFocus() {
243 treeViewer.getControl().setFocus();
244 }
245
246 public void processDoubleClick(MouseEvent e) {
247 ISelection selection = treeViewer.getSelection();
248 if (false == selection instanceof IStructuredSelection) {
249 return;
250 }
251 Object target = ((IStructuredSelection)selection).getFirstElement();
252 if (hasRegisteredEditor(target)) {
253 new EditAction(this).run();
254 }
255 IAction editAction = actionRegistry.getCustomEditAction(target);
256 if(editAction != null) {
257 editAction.run();
258 }
259 }
260
261 private void createContextMenu() {
262 MenuManager menuMgr = new MenuManager();
263 menuMgr.setRemoveAllWhenShown(true);
264 menuMgr.addMenuListener(new IMenuListener() {
265 public void menuAboutToShow(IMenuManager mgr) {
266 fillContextMenu(mgr);
267 }
268 });
269
270
271 Menu contextMenu = menuMgr.createContextMenu(treeViewer.getControl());
272 treeViewer.getControl().setMenu(contextMenu);
273 }
274
275 private void fillContextMenu(IMenuManager mgr) {
276
277 if (false == GUIHelper.containsCursor(treeViewer.getTree())) {
278 return;
279 }
280 IStructuredSelection sSel = (IStructuredSelection)treeViewer.getSelection();
281 final Object target = sSel.getFirstElement();
282 if (target == null) {
283 return;
284 }
285
286 actionRegistry.initAddActions(mgr, target);
287 if (mgr.getItems().length > 0) {
288 mgr.add(new Separator());
289 }
290 addEditMenu(mgr, target);
291 initEditWithMenu(mgr, target);
292 if (mgr.getItems().length > 0) {
293 mgr.add(new Separator());
294 }
295 if (target instanceof Ontology) {
296 OpenTypeAction openTypeAction = new OpenTypeAction("Find Entity ...",
297 this.getTree(),
298 (Ontology)target);
299 openTypeAction.setUIModel(
300 (ObservableModel)getWsmoInput().getAdapter(ObservableModel.class));
301 mgr.add(openTypeAction);
302 mgr.add(new Separator());
303 }
304 actionRegistry.initRemoveActions(mgr, target);
305 if (mgr.getItems().length > 0) {
306 mgr.add(new Separator());
307 }
308 if (((ITreeContentProvider)treeViewer.getContentProvider()).hasChildren(target)) {
309 mgr.add(new Action("Expand Subtree") {
310 public void run() {
311 treeViewer.expandToLevel(target, TreeViewer.ALL_LEVELS);
312 treeViewer.getTree().showSelection();
313 }
314 });
315 mgr.add(new Separator());
316 }
317 actionRegistry.initMiscActions(mgr, target);
318 }
319
320 private void addEditMenu(IMenuManager mManager, final Object object) {
321 if (hasRegisteredEditor(object)) {
322 EditAction action = new EditAction(this);
323 action.setText("Edit");
324 mManager.add(action);
325 }
326 }
327
328 private boolean hasRegisteredEditor(Object target) {
329 final ExtensionManager manager = WsmoUIPlugin.getDefault().getExtensionManager();
330 LinkedList<String> allEditors = manager.findEditorsForObject(target);
331 return allEditors != null
332 && allEditors.size() > 0;
333 }
334
335 private void initEditWithMenu(IMenuManager mManager, final Object object) {
336 final ExtensionManager manager = WsmoUIPlugin.getDefault().getExtensionManager();
337 LinkedList<String> allEditors = manager.findEditorsForObject(object);
338 if (allEditors == null
339 || allEditors.size() < 2) {
340 return;
341 }
342 mManager.add(new Separator());
343 MenuManager subMenu = new MenuManager("Edit With ...");
344 mManager.add(subMenu);
345 String preferredEditor = manager.findPreferredEditor(object);
346
347 for (Iterator<String> it = allEditors.iterator(); it.hasNext();) {
348 final String edID = it.next();
349 final String editorDescr = manager.getEditorDescription(edID);
350 Action action = new Action((editorDescr != null) ? editorDescr : edID) {
351 public void run() {
352 manager.setPreferredEditor(object, edID);
353 new EditAction(WSMONavigator.this).run();
354 }
355 };
356 action.setChecked(edID.equals(preferredEditor));
357 subMenu.add(action);
358 }
359 }
360
361 public void dispose() {
362 uiUpdater.unregisterFromOpenedEditors();
363 PlatformUI.getWorkbench()
364 .getActiveWorkbenchWindow()
365 .getPartService()
366 .removePartListener(uiUpdater);
367 treeViewer = null;
368 }
369
370 @SuppressWarnings("unchecked")
371 public Object getAdapter(Class adapter) {
372 if (adapter == IPropertySource.class) {
373 if (treeViewer.getTree().getSelectionCount() == 0) {
374 return null;
375 }
376 Object selection = ((IStructuredSelection)treeViewer.getSelection()).getFirstElement();
377 if (false == selection instanceof Entity) {
378 return null;
379 }
380 if (propsSrc == null) {
381 propsSrc = new WSMOPropertiesSource((Entity)selection);
382 }
383 else {
384 propsSrc.setData((Entity)selection);
385 }
386 return propsSrc;
387 }
388 return null;
389 }
390
391 public boolean ensureEditorForEntityIsClosed(Entity entity) {
392 return ensureEditorForEntityIsClosed(entity, true);
393 }
394 public boolean ensureEditorForEntityIsClosed(Entity entity, boolean showConfirm) {
395
396 IWorkbenchPage page = PlatformUI.getWorkbench()
397 .getActiveWorkbenchWindow()
398 .getActivePage();
399 if (page == null) {
400 return true;
401 }
402 Set<IEditorInput> inputs = Utils.findInputsForEntity(entity);
403
404 if (inputs == null
405 || inputs.size() == 0) {
406 return true;
407 }
408 if (showConfirm
409 && false == MessageDialog.openConfirm(getSite().getShell(),
410 "Editor Closing",
411 "The selected entity is currently opened in an editor."
412 +"\nDo you want to proceed with closing the editor?")) {
413 return false;
414 }
415 for(IEditorInput input : inputs) {
416 IEditorPart editor = page.findEditor(input);
417 page.closeEditor(editor, false);
418 }
419 return true;
420 }
421
422 public void fireEntityChanged(Entity entity) {
423 Set<ObservableModel> models = Utils.findModelsForEntity(entity);
424 for(ObservableModel model : models) {
425 model.notifyObservers(entity);
426 }
427 }
428
429
430 public void addSelectionChangedListener(ISelectionChangedListener listener) {
431 selListeners.add(listener);
432 }
433
434 public ISelection getSelection() {
435 return new StructuredSelection(this);
436 }
437
438 public void removeSelectionChangedListener(ISelectionChangedListener listener) {
439 selListeners.remove(listener);
440 }
441
442 public void setSelection(ISelection selection) {
443 }
444
445 private IEditorInput findActiveInput() {
446 IWorkbenchPage page = PlatformUI.getWorkbench()
447 .getActiveWorkbenchWindow()
448 .getActivePage();
449 if (page == null) {
450 return null;
451 }
452
453 IEditorPart editor = page.getActiveEditor();
454 if (editor != null) {
455 IEditorInput input = editor.getEditorInput();
456 if (input.getAdapter(Entity.class) != null) {
457 return input;
458 }
459 }
460 return null;
461 }
462
463 public TreeViewer getTree() {
464 return treeViewer;
465 }
466
467 public void selectionChanged(SelectionChangedEvent event) {
468 }
469 }
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579