KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > nightlabs > editor2d > AbstractEditor


1 /**
2  * <p> Project: com.nightlabs.editor2d </p>
3  * <p> Copyright: Copyright (c) 2004 </p>
4  * <p> Company: NightLabs GmbH (Germany) </p>
5  * <p> Creation Date: 28.02.2005 </p>
6  * <p> Author: Daniel Mazurek </p>
7 **/

8 package com.nightlabs.editor2d;
9
10 import java.beans.PropertyChangeEvent JavaDoc;
11 import java.beans.PropertyChangeListener JavaDoc;
12 import java.io.File JavaDoc;
13 import java.io.FileInputStream JavaDoc;
14 import java.io.FileNotFoundException JavaDoc;
15 import java.io.FileOutputStream JavaDoc;
16 import java.io.InputStream JavaDoc;
17 import java.lang.reflect.InvocationTargetException JavaDoc;
18 import java.util.ArrayList JavaDoc;
19 import java.util.EventObject JavaDoc;
20 import java.util.HashMap JavaDoc;
21 import java.util.Iterator JavaDoc;
22 import java.util.List JavaDoc;
23 import java.util.Map JavaDoc;
24
25 import org.apache.log4j.Logger;
26 import org.eclipse.core.runtime.IProgressMonitor;
27 import org.eclipse.core.runtime.NullProgressMonitor;
28 import org.eclipse.draw2d.FigureCanvas;
29 import org.eclipse.draw2d.J2DGraphics;
30 import org.eclipse.draw2d.PositionConstants;
31 import org.eclipse.gef.ContextMenuProvider;
32 import org.eclipse.gef.DefaultEditDomain;
33 import org.eclipse.gef.EditPartFactory;
34 import org.eclipse.gef.EditPartViewer;
35 import org.eclipse.gef.GraphicalViewer;
36 import org.eclipse.gef.KeyHandler;
37 import org.eclipse.gef.KeyStroke;
38 import org.eclipse.gef.SnapToGeometry;
39 import org.eclipse.gef.SnapToGrid;
40 import org.eclipse.gef.dnd.TemplateTransferDragSourceListener;
41 import org.eclipse.gef.dnd.TemplateTransferDropTargetListener;
42 import org.eclipse.gef.editparts.J2DScalableFreeformRootEditPart;
43 import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
44 import org.eclipse.gef.editparts.ZoomManager;
45 import org.eclipse.gef.palette.PaletteRoot;
46 import org.eclipse.gef.requests.CreationFactory;
47 import org.eclipse.gef.requests.SimpleFactory;
48 import org.eclipse.gef.rulers.RulerProvider;
49 import org.eclipse.gef.ui.actions.ActionRegistry;
50 import org.eclipse.gef.ui.actions.AlignmentAction;
51 import org.eclipse.gef.ui.actions.CopyTemplateAction;
52 import org.eclipse.gef.ui.actions.DirectEditAction;
53 import org.eclipse.gef.ui.actions.GEFActionConstants;
54 import org.eclipse.gef.ui.actions.MatchHeightAction;
55 import org.eclipse.gef.ui.actions.MatchWidthAction;
56 import org.eclipse.gef.ui.actions.ToggleGridAction;
57 import org.eclipse.gef.ui.actions.ToggleRulerVisibilityAction;
58 import org.eclipse.gef.ui.actions.ToggleSnapToGeometryAction;
59 import org.eclipse.gef.ui.actions.ZoomInAction;
60 import org.eclipse.gef.ui.actions.ZoomOutAction;
61 import org.eclipse.gef.ui.palette.PaletteViewer;
62 import org.eclipse.gef.ui.palette.PaletteViewerProvider;
63 import org.eclipse.gef.ui.palette.FlyoutPaletteComposite.FlyoutPreferences;
64 import org.eclipse.gef.ui.parts.GraphicalViewerKeyHandler;
65 import org.eclipse.gef.ui.parts.J2DGraphicalEditorWithFlyoutPalette;
66 import org.eclipse.gef.ui.parts.ScrollingGraphicalViewer;
67 import org.eclipse.gef.ui.parts.SelectionSynchronizer;
68 import org.eclipse.gef.ui.parts.TreeViewer;
69 import org.eclipse.gef.ui.properties.UndoablePropertySheetEntry;
70 import org.eclipse.gef.ui.rulers.RulerComposite;
71 import org.eclipse.jface.action.IAction;
72 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
73 import org.eclipse.jface.operation.IRunnableWithProgress;
74 import org.eclipse.jface.util.TransferDropTargetListener;
75 import org.eclipse.swt.SWT;
76 import org.eclipse.swt.widgets.Composite;
77 import org.eclipse.swt.widgets.Control;
78 import org.eclipse.swt.widgets.Event;
79 import org.eclipse.swt.widgets.FileDialog;
80 import org.eclipse.swt.widgets.Listener;
81 import org.eclipse.ui.IEditorInput;
82 import org.eclipse.ui.IEditorPart;
83 import org.eclipse.ui.IWorkbenchPart;
84 import org.eclipse.ui.actions.ActionFactory;
85 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
86 import org.eclipse.ui.views.properties.PropertySheetPage;
87 import org.holongate.j2d.J2DRegistry;
88
89 import com.nightlabs.editor2d.actions.EditShapeAction;
90 import com.nightlabs.editor2d.actions.EditorPasteTemplateAction;
91 import com.nightlabs.editor2d.actions.NormalSelectionAction;
92 import com.nightlabs.editor2d.actions.ResetRotationCenterAction;
93 import com.nightlabs.editor2d.actions.RotateAction;
94 import com.nightlabs.editor2d.actions.ShowDefaultRenderAction;
95 import com.nightlabs.editor2d.actions.ZoomAllAction;
96 import com.nightlabs.editor2d.actions.ZoomSelectionAction;
97 import com.nightlabs.editor2d.filter.FilterManager;
98 import com.nightlabs.editor2d.properties.EditorPropertyPage;
99 import com.nightlabs.editor2d.render.RenderModeManager;
100 import com.nightlabs.editor2d.rulers.EditorRulerProvider;
101 import com.nightlabs.editor2d.ui.outline.EditorOutlinePage;
102 import com.nightlabs.io.AbstractIOFilterWithProgress;
103 import com.nightlabs.io.IOFilter;
104 import com.nightlabs.io.IOFilterWithProgress;
105 import com.nightlabs.io.WriteException;
106 import com.nightlabs.rcp.io.FileEditorInput;
107 import com.nightlabs.rcp.language.LanguageManager;
108 import com.nightlabs.rcp.util.RCPUtil;
109 import com.nightlabs.util.FontUtil;
110
111
112 public abstract class AbstractEditor
113 extends J2DGraphicalEditorWithFlyoutPalette
114 {
115     public static final Logger LOGGER = Logger.getLogger(Editor.class);
116
117     protected boolean savePreviouslyNeeded = false;
118     protected RulerComposite rulerComp;
119     
120     protected TreeViewer treeViewer;
121     protected EditorOutlinePage outlinePage;
122     protected boolean editorSaving = false;
123     
124     protected static final String JavaDoc PALETTE_DOCK_LOCATION = "Dock location"; //$NON-NLS-1$
125
protected static final String JavaDoc PALETTE_SIZE = "Palette Size"; //$NON-NLS-1$
126
protected static final String JavaDoc PALETTE_STATE = "Palette state"; //$NON-NLS-1$
127
protected static final int DEFAULT_PALETTE_SIZE = 130;
128     
129     static {
130       EditorPlugin.getDefault().getPreferenceStore().setDefault(
131           PALETTE_SIZE, DEFAULT_PALETTE_SIZE);
132     }
133     
134     protected void closeEditor(boolean save)
135     {
136       getSite().getPage().closeEditor(AbstractEditor.this, save);
137       System.gc();
138     }
139     
140     public Object JavaDoc getModel() {
141       return getMultiLayerDrawComponent();
142     }
143     
144     protected MultiLayerDrawComponent mldc = null;
145     public MultiLayerDrawComponent getMultiLayerDrawComponent()
146     {
147       if (mldc == null) {
148         mldc = createMultiLayerDrawComponent();
149       }
150       
151       return mldc;
152     }
153   
154     public abstract MultiLayerDrawComponent createMultiLayerDrawComponent();
155         
156     public abstract EditPartFactory getEditPartFactory();
157         
158     public abstract EditPartFactory getOutlineEditPartFactory();
159     
160     /* (non-Javadoc)
161      * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPaletteRoot()
162      */

163     public abstract PaletteRoot getPaletteRoot();
164     
165     public abstract ContextMenuProvider getContextMenuProvider();
166     
167     /**
168      * SubClasses of this Editor should register here IOFilters for Input/Outputs
169      * which they want to support
170      * @see EditorIOFilterMan.addIOFIlter(Class IOFilterClass)
171      */

172     public abstract void registerIOFilters();
173     
174     /** Cache save-request status. */
175     protected boolean saveAlreadyRequested;
176     /** KeyHandler with common bindings for both the Outline View and the Editor. */
177     protected KeyHandler sharedKeyHandler;
178
179 // protected RenderModeManager renderMan;
180
public RenderModeManager getRenderModeManager() {
181       return getMultiLayerDrawComponent().getRenderModeManager();
182     }
183     
184     protected FilterManager filterMan;
185     public FilterManager getFilterManager() {
186       return filterMan;
187     }
188         
189     protected EditorIOFilterMan ioFilterMan;
190     public EditorIOFilterMan getIOFilterMan() {
191       return ioFilterMan;
192     }
193     
194     protected LanguageManager langMan;
195     public LanguageManager getLanguageManager()
196     {
197         if (langMan == null)
198             langMan = new LanguageManager();
199         
200         return langMan;
201     }
202     
203     /** Create a new Editor instance. This is called by the Workspace. */
204     public AbstractEditor()
205     {
206       setEditDomain(new DefaultEditDomain(this));
207       FontUtil.initSystemFonts();
208       
209 // renderMan = new RenderModeManager();
210
// registerRenderer();
211

212       ioFilterMan = new EditorIOFilterMan();
213       registerIOFilters();
214       
215       filterMan = new FilterManager();
216       
217       // WORKAROUND: Holongate Draw2D-PreferencePage does not store values
218
Map JavaDoc hints = new HashMap JavaDoc();
219       hints.put(J2DGraphics.KEY_USE_JAVA2D, Boolean.TRUE);
220       J2DRegistry.setHints(hints);
221     }
222
223     /**
224      * Subclasses should register in this Method custom renderers
225      * in the RenderModeManager
226      */

227     public abstract void registerRenderer();
228                       
229     protected MultiLayerDrawComponent load(IOFilter ioFilter, InputStream JavaDoc input)
230     {
231       if (ioFilter != null)
232       {
233         try {
234             MultiLayerDrawComponent mldc = (MultiLayerDrawComponent) ioFilter.read(input);
235             mldc.setRenderModeManager(getRenderModeManager());
236           return mldc;
237         }
238         catch (Exception JavaDoc e) {
239             throw new RuntimeException JavaDoc("There occured an Error while reading with IOFilter "+ioFilter+" from InpuStream "+input, e);
240         }
241       }
242       return null;
243     }
244     
245     protected MultiLayerDrawComponent load(FileEditorInput fileInput, IProgressMonitor monitor)
246     {
247         IOFilter ioFilter = getIOFilterMan().getIOFilter(fileInput.getFile());
248         if (ioFilter != null)
249         {
250             try {
251                 if (ioFilter instanceof IOFilterWithProgress) {
252                     IOFilterWithProgress progressFilter = (IOFilterWithProgress) ioFilter;
253                     progressFilter.addPropertyChangeListener(progressListener);
254                     monitor.beginTask(EditorPlugin.getResourceString("resource.load") +" "+ fileInput.getName(), progressFilter.getTotalWork());
255                     mldc = load(ioFilter, new FileInputStream JavaDoc(fileInput.getFile()));
256                 }
257                 else
258                     monitor.beginTask(EditorPlugin.getResourceString("resource.load") +" "+ fileInput.getName(), 2);
259                     mldc = load(ioFilter, new FileInputStream JavaDoc(fileInput.getFile()));
260                 } catch (FileNotFoundException JavaDoc e) {
261                     throw new RuntimeException JavaDoc(e);
262                 }
263         }
264         return null;
265     }
266         
267     protected void load(FileEditorInput fileInput)
268     {
269         final FileEditorInput input = fileInput;
270         IRunnableWithProgress runnable = new IRunnableWithProgress()
271         {
272                 public void run(IProgressMonitor monitor)
273                 throws InvocationTargetException JavaDoc, InterruptedException JavaDoc
274                 {
275           try {
276             load(input, monitor);
277           }
278           catch (Exception JavaDoc e) {
279             throw new RuntimeException JavaDoc(e);
280           }
281                 }
282             };
283             
284       try {
285         getProgressMonitor().run(false, false, runnable);
286         setPartName(input.getName());
287       }
288       catch (Exception JavaDoc e) {
289         throw new RuntimeException JavaDoc(e);
290       }
291     }
292
293     
294     protected ScalableFreeformRootEditPart rootEditPart;
295     public ScalableFreeformRootEditPart getRootEditPart()
296     {
297       if (rootEditPart == null)
298         rootEditPart = new J2DScalableFreeformRootEditPart();
299       
300       return rootEditPart;
301     }
302     protected ViewerManager viewerManager;
303     protected void configureGraphicalViewer()
304     {
305       super.configureGraphicalViewer();
306       ScrollingGraphicalViewer viewer = (ScrollingGraphicalViewer)getGraphicalViewer();
307             
308       List JavaDoc zoomLevels = new ArrayList JavaDoc(3);
309       zoomLevels.add(ZoomManager.FIT_ALL);
310       zoomLevels.add(ZoomManager.FIT_WIDTH);
311       zoomLevels.add(ZoomManager.FIT_HEIGHT);
312       getRootEditPart().getZoomManager().setZoomLevelContributions(zoomLevels);
313
314       viewer.setRootEditPart(getRootEditPart());
315
316       viewer.setEditPartFactory(getEditPartFactory());
317       ContextMenuProvider provider = getContextMenuProvider();
318       viewer.setContextMenu(provider);
319       // TODO: ContextMenu ID Problem
320
getSite().registerContextMenu("com.nightlabs.editor2d.contextmenu", //$NON-NLS-1$
321
provider, viewer);
322       viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer)
323           .setParent(getCommonKeyHandler()));
324       
325       loadProperties();
326
327       // Actions
328
IAction showRulers = new ToggleRulerVisibilityAction(getGraphicalViewer());
329       getActionRegistry().registerAction(showRulers);
330       
331       IAction snapAction = new ToggleSnapToGeometryAction(getGraphicalViewer());
332       getActionRegistry().registerAction(snapAction);
333
334       IAction showGrid = new ToggleGridAction(getGraphicalViewer());
335       getActionRegistry().registerAction(showGrid);
336       
337       Listener JavaDoc listener = new Listener JavaDoc() {
338         public void handleEvent(Event JavaDoc event) {
339           handleActivationChanged(event);
340         }
341       };
342       getGraphicalControl().addListener(SWT.Activate, listener);
343       getGraphicalControl().addListener(SWT.Deactivate, listener);
344       
345       viewerManager = new ViewerManager(viewer, getEditorSite().getActionBars().getStatusLineManager());
346     }
347       
348     /* (non-Javadoc)
349      * @see org.eclipse.gef.ui.parts.GraphicalEditor#commandStackChanged(java.util.EventObject)
350      */

351     public void commandStackChanged(EventObject JavaDoc event)
352     {
353       if (isDirty()){
354         if (!savePreviouslyNeeded()) {
355           setSavePreviouslyNeeded(true);
356           firePropertyChange(IEditorPart.PROP_DIRTY);
357         }
358       }
359       else {
360         setSavePreviouslyNeeded(false);
361         firePropertyChange(IEditorPart.PROP_DIRTY);
362       }
363       super.commandStackChanged(event);
364     }
365
366     /* (non-Javadoc)
367      * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#createPaletteViewerProvider()
368      */

369     protected PaletteViewerProvider createPaletteViewerProvider() {
370       return new PaletteViewerProvider(getEditDomain()) {
371         protected void configurePaletteViewer(PaletteViewer viewer) {
372           super.configurePaletteViewer(viewer);
373           // create a drag source listener for this palette viewer
374
// together with an appropriate transfer drop target listener, this will enable
375
// model element creation by dragging a CombinatedTemplateCreationEntries
376
// from the palette into the editor
377
// @see ShapesEditor#createTransferDropTargetListener()
378
viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer));
379         }
380       };
381     }
382
383     public Object JavaDoc getAdapter(Class JavaDoc type)
384     {
385       if (type == IContentOutlinePage.class) {
386           treeViewer = new TreeViewer();
387         outlinePage = new EditorOutlinePage(this, treeViewer);
388         return outlinePage;
389       }
390       if (type == ZoomManager.class)
391         return getGraphicalViewer().getProperty(ZoomManager.class.toString());
392         
393         if (type == org.eclipse.ui.views.properties.IPropertySheetPage.class) {
394 // PropertySheetPage page = new EditorPropertyPage(getLanguageManager());
395
PropertySheetPage page = new EditorPropertyPage();
396             page.setRootEntry(new UndoablePropertySheetEntry(getCommandStack()));
397             return page;
398         }
399         
400       return super.getAdapter(type);
401     }
402     
403     protected Control getGraphicalControl() {
404       return rulerComp;
405     }
406       
407     /**
408      * Create a transfer drop target listener. When using a CombinedTemplateCreationEntry
409      * tool in the palette, this will enable model element creation by dragging from the palette.
410      * @see #createPaletteViewerProvider()
411      */

412     protected TransferDropTargetListener createTransferDropTargetListener() {
413       return new TemplateTransferDropTargetListener(getGraphicalViewer()) {
414         protected CreationFactory getFactory(Object JavaDoc template) {
415           return new SimpleFactory((Class JavaDoc) template);
416         }
417       };
418     }
419
420     public void doSave(IProgressMonitor monitor)
421     {
422       try {
423         FileEditorInput input = (FileEditorInput) getEditorInput();
424         if (!input.isSaved()) {
425             doSaveAs();
426             return;
427         }
428         
429         File JavaDoc file = input.getFile();
430         String JavaDoc inputName = input.getName();
431         LOGGER.debug("inputName = "+inputName);
432         
433         if (file.exists()
434             || org.eclipse.jface.dialogs.MessageDialogWithToggle.openConfirm(getSite().getShell(),
435                 EditorPlugin.getResourceString("resource_create_file"),
436                 EditorPlugin.getResourceString("resource_file_not_exists_1")
437                 + " "
438                 + file.getName()
439                 + " "
440                 + EditorPlugin.getResourceString("resource_file_not_exists_2")))
441         {
442           editorSaving = true;
443           saveProperties();
444           save(file, monitor);
445           getCommandStack().markSaveLocation();
446         }
447       }
448       catch (WriteException e)
449       {
450         throw new RuntimeException JavaDoc(e);
451         
452 // RCPUtil.showErrorDialog(EditorPlugin.getResourceString("error_during_save"));
453

454 // ErrorDialog.openError(
455
// getSite().getShell(),
456
// EditorPlugin.getResourceString("error_during_save"),
457
// EditorPlugin.getResourceString("error_during_save_message"),
458
// e.getStatus());
459
}
460     }
461
462     /* (non-Javadoc)
463      * @see org.eclipse.ui.ISaveablePart#doSaveAs()
464      */

465     public void doSaveAs()
466     {
467       performSaveAs();
468     }
469
470     /**
471      * Returns the KeyHandler with common bindings for both the Outline and Graphical Views.
472      * For example, delete is a common action.
473      */

474     public KeyHandler getCommonKeyHandler()
475     {
476       if (sharedKeyHandler == null) {
477         sharedKeyHandler = new KeyHandler();
478
479         // Add key and action pairs to sharedKeyHandler
480
sharedKeyHandler.put(
481             KeyStroke.getPressed(SWT.DEL, 127, 0),
482             getActionRegistry().getAction(ActionFactory.DELETE.getId()));
483         sharedKeyHandler.put(
484             KeyStroke.getPressed(SWT.F2, 0),
485             getActionRegistry().getAction(GEFActionConstants.DIRECT_EDIT));
486       }
487       return sharedKeyHandler;
488     }
489
490     /* (non-Javadoc)
491      * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#getPalettePreferences()
492      */

493     protected FlyoutPreferences getPalettePreferences() {
494       return EditorPaletteFactory.createPalettePreferences();
495     }
496     
497     protected void handleActivationChanged(Event JavaDoc event)
498     {
499       IAction copy = null;
500       if (event.type == SWT.Deactivate)
501         copy = getActionRegistry().getAction(ActionFactory.COPY.getId());
502       if (getEditorSite().getActionBars().getGlobalActionHandler(ActionFactory.COPY.getId())
503           != copy) {
504         getEditorSite().getActionBars().setGlobalActionHandler(
505             ActionFactory.COPY.getId(), copy);
506         getEditorSite().getActionBars().updateActionBars();
507       }
508     }
509     
510     /**
511      * Set up the editor's inital content (after creation).
512      * @see org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette#initializeGraphicalViewer()
513      */

514     protected void initializeGraphicalViewer()
515     {
516       GraphicalViewer graphicalViewer = getGraphicalViewer();
517       graphicalViewer.setContents(getModel()); // set the contents of this editor
518
// listen for dropped parts
519
graphicalViewer.addDropTargetListener(createTransferDropTargetListener());
520       
521       configureFilterManager();
522     }
523
524     protected void configureFilterManager()
525     {
526         Map JavaDoc class2DrawComponents = getMultiLayerDrawComponent().getClass2DrawComponents();
527         for (Iterator JavaDoc it = class2DrawComponents.keySet().iterator(); it.hasNext(); ) {
528             Class JavaDoc c = (Class JavaDoc) it.next();
529             String JavaDoc className = c.getName();
530 // treeViewer.setProperty(className, c);
531
getFilterManager().addFilter(c);
532             
533             LOGGER.debug("className = "+className+" in FilterManager registered!");
534         }
535     }
536     
537     protected void createActions()
538     {
539       super.createActions();
540       ActionRegistry registry = getActionRegistry();
541       IAction action;
542       
543       action = new CopyTemplateAction(this);
544       registry.registerAction(action);
545
546       // Match Actions
547
action = new MatchWidthAction(this);
548       registry.registerAction(action);
549       getSelectionActions().add(action.getId());
550       
551       action = new MatchHeightAction(this);
552       registry.registerAction(action);
553       getSelectionActions().add(action.getId());
554       
555       action = new EditorPasteTemplateAction(this);
556       registry.registerAction(action);
557       getSelectionActions().add(action.getId());
558
559       action = new DirectEditAction((IWorkbenchPart)this);
560       registry.registerAction(action);
561       getSelectionActions().add(action.getId());
562
563       // Alignment Actions
564
action = new AlignmentAction((IWorkbenchPart)this, PositionConstants.LEFT);
565       registry.registerAction(action);
566       getSelectionActions().add(action.getId());
567
568       action = new AlignmentAction((IWorkbenchPart)this, PositionConstants.RIGHT);
569       registry.registerAction(action);
570       getSelectionActions().add(action.getId());
571
572       action = new AlignmentAction((IWorkbenchPart)this, PositionConstants.TOP);
573       registry.registerAction(action);
574       getSelectionActions().add(action.getId());
575
576       action = new AlignmentAction((IWorkbenchPart)this, PositionConstants.BOTTOM);
577       registry.registerAction(action);
578       getSelectionActions().add(action.getId());
579
580       action = new AlignmentAction((IWorkbenchPart)this, PositionConstants.CENTER);
581       registry.registerAction(action);
582       getSelectionActions().add(action.getId());
583
584       action = new AlignmentAction((IWorkbenchPart)this, PositionConstants.MIDDLE);
585       registry.registerAction(action);
586       getSelectionActions().add(action.getId());
587       
588       // ZoomIn
589
action = new ZoomInAction(getRootEditPart().getZoomManager());
590       registry.registerAction(action);
591       getSite().getKeyBindingService().registerAction(action);
592
593       // ZoomOut
594
action = new ZoomOutAction(getRootEditPart().getZoomManager());
595       registry.registerAction(action);
596       getSite().getKeyBindingService().registerAction(action);
597
598       // Zoom All
599
action = new ZoomAllAction(getRootEditPart().getZoomManager());
600       registry.registerAction(action);
601       
602       // Zoom Selection
603
action = new ZoomSelectionAction(this);
604       registry.registerAction(action);
605       getSelectionActions().add(action.getId());
606             
607       // Edit Shape Action
608
action = new EditShapeAction(this);
609       registry.registerAction(action);
610       getSelectionActions().add(action.getId());
611       
612       // Rotate Action
613
action = new RotateAction(this);
614       registry.registerAction(action);
615       getSelectionActions().add(action.getId());
616       
617       // Normal Selection Action
618
action = new NormalSelectionAction(this);
619       registry.registerAction(action);
620       getSelectionActions().add(action.getId());
621       
622       // Reset Rotation Center Action
623
action = new ResetRotationCenterAction(this);
624       registry.registerAction(action);
625       getSelectionActions().add(action.getId());
626       
627       // Show Default View (Renderer) Action
628
action = new ShowDefaultRenderAction(this);
629       registry.registerAction(action);
630            
631     }
632     
633     /* (non-Javadoc)
634      * @see org.eclipse.gef.ui.parts.GraphicalEditor#createGraphicalViewer(org.eclipse.swt.widgets.Composite)
635      */

636     protected void createGraphicalViewer(Composite parent)
637     {
638       rulerComp = new RulerComposite(parent, SWT.NONE);
639       super.createGraphicalViewer(rulerComp);
640       rulerComp.setGraphicalViewer((ScrollingGraphicalViewer) getGraphicalViewer());
641     }
642     
643     public FigureCanvas getEditor(){
644       return (FigureCanvas)getGraphicalViewer().getControl();
645     }
646     
647     public boolean isDirty() {
648       return isSaveOnCloseNeeded();
649     }
650
651     public boolean isSaveOnCloseNeeded() {
652       return getCommandStack().isDirty();
653     }
654     
655     protected void loadProperties()
656     {
657       // Ruler properties
658
EditorRuler ruler = getMultiLayerDrawComponent().getLeftRuler();
659       RulerProvider provider = null;
660       if (ruler != null) {
661         provider = new EditorRulerProvider(ruler);
662       }
663       getGraphicalViewer().setProperty(RulerProvider.PROPERTY_VERTICAL_RULER, provider);
664       ruler = getMultiLayerDrawComponent().getTopRuler();
665       provider = null;
666       if (ruler != null) {
667         provider = new EditorRulerProvider(ruler);
668       }
669       getGraphicalViewer().setProperty(RulerProvider.PROPERTY_HORIZONTAL_RULER, provider);
670       getGraphicalViewer().setProperty(RulerProvider.PROPERTY_RULER_VISIBILITY,
671           new Boolean JavaDoc(getMultiLayerDrawComponent().isRulersEnabled()));
672       
673       // Snap to Geometry property
674
getGraphicalViewer().setProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED,
675           new Boolean JavaDoc(getMultiLayerDrawComponent().isSnapToGeometry()));
676       
677       // Grid properties
678
getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_ENABLED,
679           new Boolean JavaDoc(getMultiLayerDrawComponent().isGridEnabled()));
680       // We keep grid visibility and enablement in sync
681
getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE,
682           new Boolean JavaDoc(getMultiLayerDrawComponent().isGridEnabled()));
683       
684       // Zoom
685
ZoomManager manager = (ZoomManager)getGraphicalViewer()
686           .getProperty(ZoomManager.class.toString());
687       if (manager != null)
688         manager.setZoom(getMultiLayerDrawComponent().getZoom());
689 // manager.setZoomAsText(ZoomManager.FIT_ALL);
690
}
691     
692     /* (non-Javadoc)
693      * @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
694      */

695     public boolean isSaveAsAllowed() {
696       return true;
697     }
698
699     protected boolean savePreviouslyNeeded() {
700       return savePreviouslyNeeded;
701     }
702     
703     protected void saveProperties()
704     {
705       getMultiLayerDrawComponent().setRulersEnabled(((Boolean JavaDoc)getGraphicalViewer()
706           .getProperty(RulerProvider.PROPERTY_RULER_VISIBILITY)).booleanValue());
707       getMultiLayerDrawComponent().setGridEnabled(((Boolean JavaDoc)getGraphicalViewer()
708           .getProperty(SnapToGrid.PROPERTY_GRID_ENABLED)).booleanValue());
709       getMultiLayerDrawComponent().setSnapToGeometry(((Boolean JavaDoc)getGraphicalViewer()
710           .getProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED)).booleanValue());
711       ZoomManager manager = (ZoomManager)getGraphicalViewer()
712           .getProperty(ZoomManager.class.toString());
713       if (manager != null)
714         getMultiLayerDrawComponent().setZoom(manager.getZoom());
715     }
716     
717     protected void setSavePreviouslyNeeded(boolean value) {
718       savePreviouslyNeeded = value;
719     }
720     
721 // protected void superSetInput(IEditorInput input)
722
// {
723
// // The workspace never changes for an editor. So, removing and re-adding the
724
// // resourceListener is not necessary. But it is being done here for the sake
725
// // of proper implementation. Plus, the resourceListener needs to be added
726
// // to the workspace the first time around.
727
// if(getEditorInput() != null) {
728
// IFile file = ((FileEditorInput)getEditorInput()).getFile();
729
// file.getWorkspace().removeResourceChangeListener(resourceListener);
730
// }
731
//
732
// super.setInput(input);
733
//
734
// if(getEditorInput() != null && getEditorInput() instanceof FileEditorInput) {
735
// IFile file = ((FileEditorInput)getEditorInput()).getFile();
736
// file.getWorkspace().addResourceChangeListener(resourceListener);
737
// setTitle(file.getName());
738
// }
739
// }
740

741     protected boolean performSaveAs()
742     {
743       FileDialog dialog = new FileDialog(getSite().getWorkbenchWindow().getShell(), SWT.SAVE);
744       String JavaDoc inputFileName = getEditorInput().getName();
745       dialog.setFileName(inputFileName);
746       String JavaDoc[] fileExtensions = getIOFilterMan().getAvailableFileExtensionsAsStrings();
747       if (fileExtensions != null)
748         dialog.setFilterExtensions(fileExtensions);
749       
750       String JavaDoc fullPath = dialog.open();
751       // Cancel pressed
752
if (fullPath == null)
753         return false;
754             
755       final File JavaDoc file = new File JavaDoc(fullPath);
756       
757       if (!file.exists())
758       {
759         save(file);
760       }
761       else
762       {
763         int returnVal = RCPUtil.showConfirmOverwriteDialog(file.getName());
764         if (returnVal == SWT.OK)
765             save(file);
766         else
767             return false;
768       }
769       try {
770         getCommandStack().markSaveLocation();
771       }
772       catch (Exception JavaDoc e) {
773         e.printStackTrace();
774       }
775       
776       return true;
777     }
778     
779 // protected PropertyChangeListener progressListener = new PropertyChangeListener(){
780
// public void propertyChange(PropertyChangeEvent evt) {
781
// Object newValue = evt.getNewValue();
782
// if (newValue instanceof Integer) {
783
// int work = ((Integer)newValue).intValue();
784
// getProgressMonitor().getProgressMonitor().internalWorked(work);
785
// }
786
// }
787
//};
788
protected PropertyChangeListener JavaDoc progressListener = new PropertyChangeListener JavaDoc()
789     {
790         public void propertyChange(PropertyChangeEvent JavaDoc evt)
791         {
792             Object JavaDoc newValue = evt.getNewValue();
793             if (newValue.equals(AbstractIOFilterWithProgress.PROGRESS_CHANGED)) {
794                 int work = ((Integer JavaDoc)newValue).intValue();
795                 getProgressMonitor().getProgressMonitor().internalWorked(work);
796             }
797             else if (newValue.equals(AbstractIOFilterWithProgress.SUBTASK_FINISHED)) {
798                 String JavaDoc subTaskName = (String JavaDoc) newValue;
799                 // TODO: Listener must get to the subTask2Work-Map of the IOFilterWithProgress
800
// to begin the new SubTask progressMonitor.beginTask(subTaskName, subTaskName.work)
801
getProgressMonitor().getProgressMonitor().subTask(subTaskName);
802             }
803         }
804     };
805     
806     protected ProgressMonitorDialog progressMonitor;
807     protected ProgressMonitorDialog getProgressMonitor()
808     {
809         if (progressMonitor == null) {
810             progressMonitor = new ProgressMonitorDialog(getSite().getWorkbenchWindow().getShell());
811         }
812         return progressMonitor;
813     }
814 // protected IOFilterProgressDialog progressMonitor;
815
// protected ProgressMonitorDialog getProgressMonitor(IOFilter ioFilter)
816
// {
817
// progressMonitor = new IOFilterProgressDialog(getSite().getWorkbenchWindow().getShell(), ioFilter);
818
// return progressMonitor;
819
// }
820

821     protected void save(File JavaDoc f)
822     {
823         final File JavaDoc file = f;
824         IRunnableWithProgress runnable = new IRunnableWithProgress()
825         {
826                 public void run(IProgressMonitor monitor)
827                 throws InvocationTargetException JavaDoc, InterruptedException JavaDoc
828                 {
829           saveProperties();
830           try {
831             save(file, monitor);
832           }
833           catch (Exception JavaDoc e) {
834             throw new RuntimeException JavaDoc(e);
835           }
836                 }
837             };
838             
839       try {
840         getProgressMonitor().run(false, false, runnable);
841         setPartName(file.getName());
842       }
843       catch (Exception JavaDoc e) {
844         throw new RuntimeException JavaDoc(e);
845       }
846     }
847                   
848     /**
849      * Saves the Mdoel under the specified path.
850      *
851      * @param file the file to save
852      * @param progressMonitor The ProgressMonitor to show the save Progress
853      */

854     protected void save(File JavaDoc file, IProgressMonitor progressMonitor)
855     throws WriteException
856     {
857       if (null == progressMonitor)
858           progressMonitor = new NullProgressMonitor();
859             
860       // use IOFilterMan
861
IOFilter ioFilter = getIOFilterMan().getIOFilter(file);
862       if (ioFilter != null)
863       {
864         if (ioFilter instanceof IOFilterWithProgress) {
865             IOFilterWithProgress progressFilter = (IOFilterWithProgress) ioFilter;
866             progressMonitor.beginTask(EditorPlugin.getResourceString("resource.save") +" "+ file.getName(), progressFilter.getTotalWork());
867             progressFilter.addPropertyChangeListener(progressListener);
868             saveFile(file, progressFilter, progressMonitor);
869         }
870         else {
871             progressMonitor.beginTask(EditorPlugin.getResourceString("resource.save") +" "+ file.getName(), 2);
872             saveFile(file, ioFilter, progressMonitor);
873         }
874       }
875     }
876     
877     protected void saveFile(File JavaDoc file, IOFilter ioFilter, IProgressMonitor monitor)
878     throws WriteException
879     {
880         try {
881         String JavaDoc fileName = file.getCanonicalPath();
882         LOGGER.info("Save File "+fileName);
883         FileOutputStream JavaDoc fos = new FileOutputStream JavaDoc(fileName);
884         ioFilter.write(getMultiLayerDrawComponent(), fos);
885         } catch (Exception JavaDoc e) {
886             throw new WriteException(file, "an error occured while writing", e);
887         }
888     }
889                                 
890     protected void setInput(IEditorInput input)
891     {
892       super.setInput(input);
893       if (input instanceof FileEditorInput) {
894         FileEditorInput fileInput = (FileEditorInput) input;
895         mldc = getMultiLayerDrawComponent();
896         if (!fileInput.isSaved()) {
897             createNewMultiLayerDrawComponent();
898         } else {
899 // mldc = load(fileInput);
900
load(fileInput);
901         }
902 // System.gc();
903
}
904       else
905         createNewMultiLayerDrawComponent();
906       
907       registerRenderer();
908       getMultiLayerDrawComponent().setLanguageId(getLanguageManager().getCurrentLanguageID());
909     }
910         
911     protected void createNewMultiLayerDrawComponent()
912     {
913         mldc = getMultiLayerDrawComponent();
914         loadAdditional();
915     }
916         
917     protected void loadAdditional() {
918       if (!editorSaving) {
919         if (getGraphicalViewer() != null) {
920           getGraphicalViewer().setContents(getMultiLayerDrawComponent());
921           loadProperties();
922         }
923       }
924     }
925                 
926     public EditPartViewer getEditPartViewer()
927     {
928       return (EditPartViewer) getGraphicalViewer();
929     }
930     
931     public void updateViewer()
932     {
933       getGraphicalViewer().getControl().redraw();
934     }
935     
936 // **************** BEGIN public Methods for EditorOutlinePage ********************
937
public GraphicalViewer getOutlineGraphicalViewer() {
938       return getGraphicalViewer();
939     }
940     
941     public SelectionSynchronizer getOutlineSelectionSynchronizer() {
942       return getSelectionSynchronizer();
943     }
944     
945     public DefaultEditDomain getOutlineEditDomain() {
946       return getEditDomain();
947     }
948     
949     public ActionRegistry getOutlineActionRegistry() {
950       return getActionRegistry();
951     }
952 // **************** END public Methods for EditorOutlinePage **********************
953

954   public void dispose()
955   {
956     super.dispose();
957     mldc = null;
958     if (outlinePage != null)
959       outlinePage.dispose();
960     outlinePage = null;
961     rootEditPart = null;
962     if (rulerComp != null)
963       rulerComp.dispose();
964     rulerComp = null;
965     treeViewer = null;
966     viewerManager = null;
967   }
968   
969 }
Popular Tags