1 8 package com.nightlabs.editor2d; 9 10 import java.beans.PropertyChangeEvent ; 11 import java.beans.PropertyChangeListener ; 12 import java.io.File ; 13 import java.io.FileInputStream ; 14 import java.io.FileNotFoundException ; 15 import java.io.FileOutputStream ; 16 import java.io.InputStream ; 17 import java.lang.reflect.InvocationTargetException ; 18 import java.util.ArrayList ; 19 import java.util.EventObject ; 20 import java.util.HashMap ; 21 import java.util.Iterator ; 22 import java.util.List ; 23 import java.util.Map ; 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 PALETTE_DOCK_LOCATION = "Dock location"; protected static final String PALETTE_SIZE = "Palette Size"; protected static final String PALETTE_STATE = "Palette state"; 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 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 163 public abstract PaletteRoot getPaletteRoot(); 164 165 public abstract ContextMenuProvider getContextMenuProvider(); 166 167 172 public abstract void registerIOFilters(); 173 174 175 protected boolean saveAlreadyRequested; 176 177 protected KeyHandler sharedKeyHandler; 178 179 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 204 public AbstractEditor() 205 { 206 setEditDomain(new DefaultEditDomain(this)); 207 FontUtil.initSystemFonts(); 208 209 212 ioFilterMan = new EditorIOFilterMan(); 213 registerIOFilters(); 214 215 filterMan = new FilterManager(); 216 217 Map hints = new HashMap (); 219 hints.put(J2DGraphics.KEY_USE_JAVA2D, Boolean.TRUE); 220 J2DRegistry.setHints(hints); 221 } 222 223 227 public abstract void registerRenderer(); 228 229 protected MultiLayerDrawComponent load(IOFilter ioFilter, InputStream 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 e) { 239 throw new RuntimeException ("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 (fileInput.getFile())); 256 } 257 else 258 monitor.beginTask(EditorPlugin.getResourceString("resource.load") +" "+ fileInput.getName(), 2); 259 mldc = load(ioFilter, new FileInputStream (fileInput.getFile())); 260 } catch (FileNotFoundException e) { 261 throw new RuntimeException (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 , InterruptedException 274 { 275 try { 276 load(input, monitor); 277 } 278 catch (Exception e) { 279 throw new RuntimeException (e); 280 } 281 } 282 }; 283 284 try { 285 getProgressMonitor().run(false, false, runnable); 286 setPartName(input.getName()); 287 } 288 catch (Exception e) { 289 throw new RuntimeException (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 zoomLevels = new ArrayList (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 getSite().registerContextMenu("com.nightlabs.editor2d.contextmenu", provider, viewer); 322 viewer.setKeyHandler(new GraphicalViewerKeyHandler(viewer) 323 .setParent(getCommonKeyHandler())); 324 325 loadProperties(); 326 327 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 listener = new Listener () { 338 public void handleEvent(Event 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 351 public void commandStackChanged(EventObject 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 369 protected PaletteViewerProvider createPaletteViewerProvider() { 370 return new PaletteViewerProvider(getEditDomain()) { 371 protected void configurePaletteViewer(PaletteViewer viewer) { 372 super.configurePaletteViewer(viewer); 373 viewer.addDragSourceListener(new TemplateTransferDragSourceListener(viewer)); 379 } 380 }; 381 } 382 383 public Object getAdapter(Class 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(); 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 412 protected TransferDropTargetListener createTransferDropTargetListener() { 413 return new TemplateTransferDropTargetListener(getGraphicalViewer()) { 414 protected CreationFactory getFactory(Object template) { 415 return new SimpleFactory((Class ) 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 file = input.getFile(); 430 String 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 (e); 451 452 454 } 460 } 461 462 465 public void doSaveAs() 466 { 467 performSaveAs(); 468 } 469 470 474 public KeyHandler getCommonKeyHandler() 475 { 476 if (sharedKeyHandler == null) { 477 sharedKeyHandler = new KeyHandler(); 478 479 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 493 protected FlyoutPreferences getPalettePreferences() { 494 return EditorPaletteFactory.createPalettePreferences(); 495 } 496 497 protected void handleActivationChanged(Event 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 514 protected void initializeGraphicalViewer() 515 { 516 GraphicalViewer graphicalViewer = getGraphicalViewer(); 517 graphicalViewer.setContents(getModel()); graphicalViewer.addDropTargetListener(createTransferDropTargetListener()); 520 521 configureFilterManager(); 522 } 523 524 protected void configureFilterManager() 525 { 526 Map class2DrawComponents = getMultiLayerDrawComponent().getClass2DrawComponents(); 527 for (Iterator it = class2DrawComponents.keySet().iterator(); it.hasNext(); ) { 528 Class c = (Class ) it.next(); 529 String className = c.getName(); 530 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 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 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 action = new ZoomInAction(getRootEditPart().getZoomManager()); 590 registry.registerAction(action); 591 getSite().getKeyBindingService().registerAction(action); 592 593 action = new ZoomOutAction(getRootEditPart().getZoomManager()); 595 registry.registerAction(action); 596 getSite().getKeyBindingService().registerAction(action); 597 598 action = new ZoomAllAction(getRootEditPart().getZoomManager()); 600 registry.registerAction(action); 601 602 action = new ZoomSelectionAction(this); 604 registry.registerAction(action); 605 getSelectionActions().add(action.getId()); 606 607 action = new EditShapeAction(this); 609 registry.registerAction(action); 610 getSelectionActions().add(action.getId()); 611 612 action = new RotateAction(this); 614 registry.registerAction(action); 615 getSelectionActions().add(action.getId()); 616 617 action = new NormalSelectionAction(this); 619 registry.registerAction(action); 620 getSelectionActions().add(action.getId()); 621 622 action = new ResetRotationCenterAction(this); 624 registry.registerAction(action); 625 getSelectionActions().add(action.getId()); 626 627 action = new ShowDefaultRenderAction(this); 629 registry.registerAction(action); 630 631 } 632 633 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 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 (getMultiLayerDrawComponent().isRulersEnabled())); 672 673 getGraphicalViewer().setProperty(SnapToGeometry.PROPERTY_SNAP_ENABLED, 675 new Boolean (getMultiLayerDrawComponent().isSnapToGeometry())); 676 677 getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_ENABLED, 679 new Boolean (getMultiLayerDrawComponent().isGridEnabled())); 680 getGraphicalViewer().setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE, 682 new Boolean (getMultiLayerDrawComponent().isGridEnabled())); 683 684 ZoomManager manager = (ZoomManager)getGraphicalViewer() 686 .getProperty(ZoomManager.class.toString()); 687 if (manager != null) 688 manager.setZoom(getMultiLayerDrawComponent().getZoom()); 689 } 691 692 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 )getGraphicalViewer() 706 .getProperty(RulerProvider.PROPERTY_RULER_VISIBILITY)).booleanValue()); 707 getMultiLayerDrawComponent().setGridEnabled(((Boolean )getGraphicalViewer() 708 .getProperty(SnapToGrid.PROPERTY_GRID_ENABLED)).booleanValue()); 709 getMultiLayerDrawComponent().setSnapToGeometry(((Boolean )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 741 protected boolean performSaveAs() 742 { 743 FileDialog dialog = new FileDialog(getSite().getWorkbenchWindow().getShell(), SWT.SAVE); 744 String inputFileName = getEditorInput().getName(); 745 dialog.setFileName(inputFileName); 746 String [] fileExtensions = getIOFilterMan().getAvailableFileExtensionsAsStrings(); 747 if (fileExtensions != null) 748 dialog.setFilterExtensions(fileExtensions); 749 750 String fullPath = dialog.open(); 751 if (fullPath == null) 753 return false; 754 755 final File file = new File (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 e) { 773 e.printStackTrace(); 774 } 775 776 return true; 777 } 778 779 protected PropertyChangeListener progressListener = new PropertyChangeListener () 789 { 790 public void propertyChange(PropertyChangeEvent evt) 791 { 792 Object newValue = evt.getNewValue(); 793 if (newValue.equals(AbstractIOFilterWithProgress.PROGRESS_CHANGED)) { 794 int work = ((Integer )newValue).intValue(); 795 getProgressMonitor().getProgressMonitor().internalWorked(work); 796 } 797 else if (newValue.equals(AbstractIOFilterWithProgress.SUBTASK_FINISHED)) { 798 String subTaskName = (String ) newValue; 799 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 821 protected void save(File f) 822 { 823 final File file = f; 824 IRunnableWithProgress runnable = new IRunnableWithProgress() 825 { 826 public void run(IProgressMonitor monitor) 827 throws InvocationTargetException , InterruptedException 828 { 829 saveProperties(); 830 try { 831 save(file, monitor); 832 } 833 catch (Exception e) { 834 throw new RuntimeException (e); 835 } 836 } 837 }; 838 839 try { 840 getProgressMonitor().run(false, false, runnable); 841 setPartName(file.getName()); 842 } 843 catch (Exception e) { 844 throw new RuntimeException (e); 845 } 846 } 847 848 854 protected void save(File file, IProgressMonitor progressMonitor) 855 throws WriteException 856 { 857 if (null == progressMonitor) 858 progressMonitor = new NullProgressMonitor(); 859 860 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 file, IOFilter ioFilter, IProgressMonitor monitor) 878 throws WriteException 879 { 880 try { 881 String fileName = file.getCanonicalPath(); 882 LOGGER.info("Save File "+fileName); 883 FileOutputStream fos = new FileOutputStream (fileName); 884 ioFilter.write(getMultiLayerDrawComponent(), fos); 885 } catch (Exception 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 load(fileInput); 901 } 902 } 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 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 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 |