1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package pl.edu.agh.cast.editor;
19
20 import java.beans.PropertyChangeEvent;
21 import java.beans.PropertyChangeListener;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.LinkedList;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.UUID;
28
29 import org.apache.log4j.Logger;
30 import org.eclipse.core.runtime.IProgressMonitor;
31 import org.eclipse.draw2d.IFigure;
32 import org.eclipse.draw2d.Viewport;
33 import org.eclipse.gef.ContextMenuProvider;
34 import org.eclipse.gef.EditPart;
35 import org.eclipse.gef.EditPartFactory;
36 import org.eclipse.gef.GraphicalViewer;
37 import org.eclipse.gef.KeyHandler;
38 import org.eclipse.gef.KeyStroke;
39 import org.eclipse.gef.LayerConstants;
40 import org.eclipse.gef.MouseWheelHandler;
41 import org.eclipse.gef.commands.Command;
42 import org.eclipse.gef.commands.CommandStackEvent;
43 import org.eclipse.gef.commands.CommandStackEventListener;
44 import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
45 import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
46 import org.eclipse.gef.editparts.ZoomManager;
47 import org.eclipse.gef.palette.PaletteGroup;
48 import org.eclipse.gef.palette.PaletteRoot;
49 import org.eclipse.gef.palette.SelectionToolEntry;
50 import org.eclipse.gef.ui.actions.ActionRegistry;
51 import org.eclipse.gef.ui.actions.ZoomInAction;
52 import org.eclipse.gef.ui.actions.ZoomOutAction;
53 import org.eclipse.gef.ui.palette.PaletteViewer;
54 import org.eclipse.gef.ui.palette.PaletteViewerProvider;
55 import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
56 import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
57 import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
58 import org.eclipse.jface.action.IAction;
59 import org.eclipse.jface.commands.ActionHandler;
60 import org.eclipse.jface.viewers.StructuredSelection;
61 import org.eclipse.osgi.util.NLS;
62 import org.eclipse.swt.SWT;
63 import org.eclipse.ui.IEditorInput;
64 import org.eclipse.ui.IEditorPart;
65 import org.eclipse.ui.IEditorSite;
66 import org.eclipse.ui.IPartListener;
67 import org.eclipse.ui.ISaveablePart2;
68 import org.eclipse.ui.IWorkbenchPart;
69 import org.eclipse.ui.PartInitException;
70 import org.eclipse.ui.PlatformUI;
71 import org.eclipse.ui.actions.ActionFactory;
72 import org.eclipse.ui.handlers.IHandlerService;
73
74 import pl.edu.agh.cast.Activator;
75 import pl.edu.agh.cast.CoreServiceLocator;
76 import pl.edu.agh.cast.data.model.IDataSet;
77 import pl.edu.agh.cast.data.model.IElement;
78 import pl.edu.agh.cast.data.model.presentation.IPresentationDataSet;
79 import pl.edu.agh.cast.data.model.presentation.IPresentationElement;
80 import pl.edu.agh.cast.data.model.visual.IVisualDataSet;
81 import pl.edu.agh.cast.data.model.visual.IVisualElement;
82 import pl.edu.agh.cast.editor.action.FitZoomAction;
83 import pl.edu.agh.cast.editor.action.SaveAllAction;
84 import pl.edu.agh.cast.editor.input.DiagramEditorInput;
85 import pl.edu.agh.cast.editor.input.IDiagramEditorInput;
86 import pl.edu.agh.cast.editor.input.ModelEditorInput;
87 import pl.edu.agh.cast.editpart.ZoomableScalableFreeformRootEditPart;
88 import pl.edu.agh.cast.model.visual.IDiagram;
89 import pl.edu.agh.cast.ui.util.MsgBoxHelper;
90 import pl.edu.agh.cast.util.Messages;
91
92
93
94
95
96
97
98
99
100
101
102
103 public abstract class AbstractEditor<M extends IPresentationDataSet<? extends IPresentationElement<? extends IElement>>, V extends IVisualDataSet<? extends IVisualElement<? extends IPresentationElement<? extends IElement>>, M>, T extends IDiagram<M, V>>
104 extends GraphicalEditorWithFlyoutPalette implements PropertyChangeListener, CommandStackEventListener,
105 ISaveablePart2 {
106
107
108
109
110 protected static Logger log = Activator.getLogger();
111
112
113
114
115
116 private static IPartListener partActivationListener = new IPartListener() {
117
118 public void partActivated(IWorkbenchPart part) {
119
120 }
121
122 public void partBroughtToTop(IWorkbenchPart part) {
123
124 }
125
126 public void partClosed(IWorkbenchPart part) {
127
128 }
129
130 public void partDeactivated(IWorkbenchPart part) {
131
132 }
133
134 @SuppressWarnings("unchecked")
135 public void partOpened(IWorkbenchPart part) {
136 if (part instanceof AbstractEditor) {
137 AbstractEditor editor = (AbstractEditor)part;
138
139 ScalableFreeformRootEditPart rootEditPart = (ScalableFreeformRootEditPart)editor.getGraphicalViewer()
140 .getRootEditPart();
141
142 PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().activate(part);
143
144 rootEditPart.getZoomManager().setZoomAsText(ZoomManager.FIT_ALL);
145 double zoom = rootEditPart.getZoomManager().getZoom();
146
147
148
149
150
151 if (zoom > editor.getMaximumAllowedInitialZoom()) {
152 rootEditPart.getZoomManager().setZoom(editor.getMaximumAllowedInitialZoom());
153 }
154 if (zoom < editor.getMinimumAllowedInitialZoom()) {
155 rootEditPart.getZoomManager().setZoom(editor.getMinimumAllowedInitialZoom());
156 }
157 ((ExtendedZoomManager)rootEditPart.getZoomManager()).scaleZoomLevels(zoom);
158 }
159 }
160
161 };
162
163
164
165
166 protected abstract double getMinimumAllowedInitialZoom();
167
168
169
170
171 protected abstract double getMaximumAllowedInitialZoom();
172
173
174
175
176
177
178 @Override
179 protected void initializeGraphicalViewer() {
180 super.initializeGraphicalViewer();
181 getGraphicalViewer().setContents(getEditorInput());
182 getCommandStack().addCommandStackEventListener(this);
183
184 }
185
186
187
188
189
190
191 @SuppressWarnings("unchecked")
192 @Override
193 protected void setInput(IEditorInput input) {
194 DiagramEditorInput<M, V, T> diagramEditorInput = null;
195 if (input instanceof DiagramEditorInput) {
196 diagramEditorInput = (DiagramEditorInput<M, V, T>)input;
197 } else {
198 ModelEditorInput<M> modelInput = (ModelEditorInput<M>)input;
199 try {
200 diagramEditorInput = modelToDiagram(modelInput);
201 } catch (EditorException e) {
202 log.error("Cannot set editor input. Fatal EditorException occured!", e);
203 return;
204 }
205 }
206 super.setInput(diagramEditorInput);
207
208 }
209
210
211
212
213
214
215
216 @SuppressWarnings("unchecked")
217 protected void createActions() {
218 super.createActions();
219
220 ActionRegistry registry = getActionRegistry();
221 IAction action;
222
223 action = new SaveAllAction();
224 registry.registerAction(action);
225 getPropertyActions().add(action.getId());
226 }
227
228
229
230
231
232
233 @SuppressWarnings("unchecked")
234 public IDiagramEditorInput<M, V, T> getEditorInput() {
235 return (IDiagramEditorInput<M, V, T>)super.getEditorInput();
236 }
237
238
239
240
241
242
243 @Override
244 public void dispose() {
245
246
247
248
249
250 getCommandStack().removeCommandStackEventListener(this);
251 }
252
253
254
255
256
257
258
259
260
261 protected abstract DiagramEditorInput<M, V, T> modelToDiagram(
262 ModelEditorInput<? extends IDataSet<? extends IElement>> input) throws EditorException;
263
264
265
266
267
268
269 @Override
270 protected FlyoutPreferences getPalettePreferences() {
271 return new DefaultFlayoutPreferences();
272 }
273
274
275
276
277
278
279 @Override
280 protected void configureGraphicalViewer() {
281 super.configureGraphicalViewer();
282 GraphicalViewer viewer = getGraphicalViewer();
283
284
285
286 viewer.setRootEditPart(new ZoomableScalableFreeformRootEditPart());
287 viewer.setEditPartFactory(getEditPartsFactory());
288
289 KeyHandler keyHandler = new GraphicalViewerKeyHandler(viewer);
290 keyHandler.setParent(getCommonKeyHandler());
291 viewer.setKeyHandler(keyHandler);
292
293 setupZoom();
294
295 viewer.setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.MOD2), ExtendedMouseWheelScrollHandler
296 .getInstance());
297
298 registerContextMenu();
299
300
301 }
302
303 protected KeyHandler getCommonKeyHandler() {
304 KeyHandler sharedKeyHandler = new KeyHandler();
305
306 sharedKeyHandler.put(KeyStroke.getPressed((char)26, 'z', SWT.CTRL), getActionRegistry().getAction(
307 ActionFactory.UNDO.getId()));
308 sharedKeyHandler.put(KeyStroke.getPressed((char)25, 'y', SWT.CTRL), getActionRegistry().getAction(
309 ActionFactory.REDO.getId()));
310 sharedKeyHandler.put(KeyStroke.getPressed(SWT.DEL, 127, 0), getActionRegistry().getAction(
311 ActionFactory.DELETE.getId()));
312
313 return sharedKeyHandler;
314 }
315
316
317
318
319 private void setupZoom() {
320 GraphicalViewer viewer = getGraphicalViewer();
321 ScalableFreeformRootEditPart rootEditPart = (ScalableFreeformRootEditPart)viewer.getRootEditPart();
322
323
324 List<String> zoomLevels = new ArrayList<String>(3);
325 zoomLevels.add(ZoomManager.FIT_ALL);
326 zoomLevels.add(ZoomManager.FIT_WIDTH);
327 zoomLevels.add(ZoomManager.FIT_HEIGHT);
328 rootEditPart.getZoomManager().setZoomLevelContributions(zoomLevels);
329
330
331 IAction zoomIn = new ZoomInAction(rootEditPart.getZoomManager());
332 IAction zoomOut = new ZoomOutAction(rootEditPart.getZoomManager());
333 IAction fitZoom = new FitZoomAction(Messages.FitZoomAction_0, null, rootEditPart.getZoomManager());
334 getActionRegistry().registerAction(zoomIn);
335 getActionRegistry().registerAction(zoomOut);
336 getActionRegistry().registerAction(fitZoom);
337
338
339 IHandlerService service = (IHandlerService)getEditorSite().getService(IHandlerService.class);
340 service.activateHandler(zoomIn.getActionDefinitionId(), new ActionHandler(zoomIn));
341 service.activateHandler(zoomOut.getActionDefinitionId(), new ActionHandler(zoomOut));
342
343 viewer
344 .setProperty(MouseWheelHandler.KeyGenerator.getKey(SWT.MOD1), ExtendedMouseWheelZoomHandler
345 .getInstance());
346 }
347
348
349
350
351
352
353 public Viewport getEditorViewport() {
354 return (Viewport)((ScalableFreeformRootEditPart)getGraphicalViewer().getRootEditPart()).getFigure();
355 }
356
357
358
359
360
361
362 public IFigure getPrintableLayer() {
363 return ((ScalableFreeformRootEditPart)getGraphicalViewer().getRootEditPart())
364 .getLayer(LayerConstants.PRINTABLE_LAYERS);
365 }
366
367
368
369
370 protected final void registerContextMenu() {
371 GraphicalViewer viewer = getGraphicalViewer();
372 ContextMenuProvider cmProvider = getContextMenuProvider();
373 viewer.setContextMenu(cmProvider);
374 getSite().registerContextMenu(cmProvider, viewer);
375 }
376
377
378
379
380
381
382 protected abstract ContextMenuProvider getContextMenuProvider();
383
384
385
386
387
388
389 @Override
390 protected PaletteRoot getPaletteRoot() {
391
392 PaletteRoot root = new PaletteRoot();
393
394 PaletteGroup basic = new PaletteGroup(Messages.AbstractEditor_0);
395
396 SelectionToolEntry selectionToolEntry = new SelectionToolEntry();
397 basic.add(selectionToolEntry);
398
399
400
401
402
403
404
405
406
407
408
409 root.add(basic);
410
411 root.setDefaultEntry(selectionToolEntry);
412 return root;
413
414 }
415
416
417
418
419
420
421
422
423 @Override
424 public void doSave(IProgressMonitor monitor) {
425 doSaveWithoutMessageBox(monitor);
426
427 MsgBoxHelper.showInfoBox(PlatformUI.getWorkbench().getDisplay().getActiveShell(), Messages.AbstractEditor_1,
428 NLS.bind(Messages.AbstractEditor_2, getDiagram().getName()));
429
430 }
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449 @SuppressWarnings("unchecked")
450 public void doSaveWithoutMessageBox(IProgressMonitor monitor) {
451
452
453 Map<UUID, UUID> dataSetsIds = CoreServiceLocator.getPersistenceProvider().saveDataSets(
454 getDiagram().getDataSets());
455 if (dataSetsIds == null || dataSetsIds.size() != 2) {
456 throw new RuntimeException("An error occured during saving diagram");
457 }
458 log.info("Diagram saved in persistance manager");
459
460
461 M model = (M)CoreServiceLocator.getPersistenceProvider().getDataSet(
462 dataSetsIds.get(getDiagram().getModel().getId()));
463
464 if (model == null) {
465 throw new RuntimeException("An error occured during saving diagram");
466 }
467
468
469 setInput(new ModelEditorInput<M>(model));
470 firePropertyChange(IEditorPart.PROP_INPUT);
471 log.info("New editor input set");
472
473 getCommandStack().markSaveLocation();
474 firePropertyChange(IEditorPart.PROP_DIRTY);
475
476 log.info(String.format("Diagram %1$s successfully saved.", getDiagram().getName()));
477 }
478
479
480
481
482
483
484 public T getDiagram() {
485 DiagramEditorInput<M, V, T> input = (DiagramEditorInput<M, V, T>)getEditorInput();
486 return input.getDiagram();
487
488 }
489
490
491
492
493
494
495 @SuppressWarnings("unchecked")
496 @Override
497 public Object getAdapter(Class type) {
498 if (type == ZoomManager.class) {
499 return getGraphicalViewer().getProperty(ZoomManager.class.toString());
500 }
501
502 return super.getAdapter(type);
503 }
504
505
506
507
508
509
510 @Override
511 protected PaletteViewerProvider createPaletteViewerProvider() {
512 return new PaletteViewerProvider(getEditDomain()) {
513 @Override
514 protected void configurePaletteViewer(PaletteViewer viewer) {
515 super.configurePaletteViewer(viewer);
516 viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
517 }
518 };
519 }
520
521
522
523
524
525
526 @Override
527 public void init(IEditorSite site, IEditorInput input) throws PartInitException {
528 super.init(site, input);
529 site.getPage().addPartListener(partActivationListener);
530 }
531
532
533
534
535
536
537 @Override
538 public String getPartName() {
539 IDiagramEditorInput<M, V, T> input = getEditorInput();
540 if (input != null) {
541 return input.getDiagram().getName();
542 } else {
543 return "";
544 }
545 }
546
547
548
549
550
551
552 @Override
553 public String getTitle() {
554 return getPartName();
555 }
556
557
558
559
560
561
562 @Override
563 public String getTitleToolTip() {
564 IDiagramEditorInput<M, V, T> input = getEditorInput();
565
566
567
568
569
570
571 return NLS.bind(Messages.AbstractEditor_9, new Object[] { input.getDiagram().getName(), "---" });
572
573 }
574
575
576
577
578
579
580 public void propertyChange(PropertyChangeEvent evt) {
581
582
583
584
585
586
587
588 }
589
590
591
592
593
594
595
596 public void executeCommand(Command command) {
597 getCommandStack().execute(command);
598 }
599
600
601
602
603 public void refresh() {
604 getGraphicalViewer().setContents(getEditorInput());
605 }
606
607
608
609
610
611
612 public void stackChanged(CommandStackEvent event) {
613 firePropertyChange(IEditorPart.PROP_DIRTY);
614 }
615
616
617
618
619
620
621
622 public void selectElements(Collection<? extends IPresentationElement<? extends IElement>> elements) {
623 getGraphicalViewer().deselectAll();
624 List<EditPart> selection = new LinkedList<EditPart>();
625
626 for (IPresentationElement<? extends IElement> e : elements) {
627 EditPart editPart = (EditPart)getGraphicalViewer().getEditPartRegistry().get(e);
628 if (editPart != null) {
629 selection.add(editPart);
630 }
631 }
632 getGraphicalViewer().setSelection(new StructuredSelection(selection));
633 }
634
635
636
637
638
639
640 public int promptToSaveOnClose() {
641 return EditorSaverSupport.getInstance().promptToSaveOnClose(this);
642 }
643
644
645
646
647
648
649 public abstract EditPartFactory getEditPartsFactory();
650
651 }