| /* |
| * Copyright (c) 2005, 2006 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial implementation |
| * |
| */ |
| package org.eclipse.epf.diagramming.part; |
| |
| import java.io.File; |
| import java.util.Iterator; |
| |
| import org.eclipse.core.resources.IFile; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.draw2d.DelegatingLayout; |
| import org.eclipse.draw2d.FreeformLayer; |
| import org.eclipse.draw2d.LayeredPane; |
| import org.eclipse.emf.ecore.resource.Resource; |
| import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider; |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.epf.common.CommonPlugin; |
| import org.eclipse.epf.diagramming.base.bridge.BridgeHelper; |
| import org.eclipse.epf.diagramming.base.bridge.DiagramAdapter; |
| import org.eclipse.epf.diagramming.base.parts.DiagramEditorInput; |
| import org.eclipse.epf.diagramming.base.parts.DiagramFileEditorInputProxy; |
| import org.eclipse.epf.diagramming.base.parts.IDiagramFileEditorInputProxy; |
| import org.eclipse.epf.diagramming.base.persistence.DiagramService; |
| import org.eclipse.epf.diagramming.base.persistence.ISaveEventDispatcher; |
| import org.eclipse.epf.diagramming.base.persistence.ISaveInfo; |
| import org.eclipse.epf.diagramming.base.persistence.SaveEventDispatcher; |
| import org.eclipse.epf.diagramming.edit.parts.UMLEditPartFactory; |
| import org.eclipse.epf.library.LibraryServiceUtil; |
| import org.eclipse.epf.library.edit.TngAdapterFactory; |
| import org.eclipse.epf.library.edit.command.IActionManager; |
| import org.eclipse.epf.services.ILibraryPersister; |
| import org.eclipse.epf.uma.MethodElement; |
| import org.eclipse.gef.LayerConstants; |
| import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramRootEditPart; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.document.StorageDiagramDocumentProvider; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.ide.editor.FileDiagramEditor; |
| import org.eclipse.gmf.runtime.notation.View; |
| import org.eclipse.jface.viewers.ILabelProvider; |
| import org.eclipse.osgi.util.NLS; |
| import org.eclipse.swt.graphics.Image; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.ide.IGotoMarker; |
| |
| /** |
| * @generated |
| */ |
| public class DiagramEditor extends FileDiagramEditor implements IGotoMarker { |
| |
| private ISaveEventDispatcher dispatcher; |
| |
| /** |
| * @generated |
| */ |
| public static final String ID = "org.eclipse.epf.diagramming.part.DiagramEditorID"; //$NON-NLS-1$ |
| |
| private long fModificationStamp; |
| |
| /** |
| * @generated |
| */ |
| public DiagramEditor() { |
| super(true); |
| } |
| |
| /** |
| * @generated |
| */ |
| protected String getEditingDomainID() { |
| return "org.eclipse.epf.diagramming.EditingDomain"; //$NON-NLS-1$ |
| } |
| |
| /** |
| * @generated |
| */ |
| protected TransactionalEditingDomain createEditingDomain() { |
| TransactionalEditingDomain domain = super.createEditingDomain(); |
| domain.setID(getEditingDomainID()); |
| return domain; |
| } |
| |
| /** |
| * @generated |
| */ |
| protected void setDocumentProvider(IEditorInput input) { |
| if (input.getAdapter(IFile.class) != null) { |
| setDocumentProvider(new UMLDocumentProvider()); |
| } else { |
| setDocumentProvider(new StorageDiagramDocumentProvider()); |
| } |
| } |
| |
| /** |
| * @generated |
| */ |
| protected void configureGraphicalViewer() { |
| super.configureGraphicalViewer(); |
| DiagramRootEditPart root = (DiagramRootEditPart) getDiagramGraphicalViewer() |
| .getRootEditPart(); |
| LayeredPane printableLayers = (LayeredPane) root |
| .getLayer(LayerConstants.PRINTABLE_LAYERS); |
| FreeformLayer extLabelsLayer = new FreeformLayer(); |
| extLabelsLayer.setLayoutManager(new DelegatingLayout()); |
| printableLayers.addLayerAfter(extLabelsLayer, |
| UMLEditPartFactory.EXTERNAL_NODE_LABELS_LAYER, |
| LayerConstants.PRIMARY_LAYER); |
| LayeredPane scalableLayers = (LayeredPane) root |
| .getLayer(LayerConstants.SCALABLE_LAYERS); |
| FreeformLayer scaledFeedbackLayer = new FreeformLayer(); |
| scaledFeedbackLayer.setEnabled(false); |
| scalableLayers.addLayerAfter(scaledFeedbackLayer, |
| LayerConstants.SCALED_FEEDBACK_LAYER, |
| DiagramRootEditPart.DECORATION_UNPRINTABLE_LAYER); |
| } |
| |
| /** |
| * (non-Javadoc) |
| * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor#doSetInput(org.eclipse.ui.IEditorInput, boolean) |
| * @custom |
| */ |
| public void doSetInput(IEditorInput input, boolean releaseEditorContents) |
| throws CoreException { |
| if (input instanceof IDiagramFileEditorInputProxy) { |
| ((IDiagramFileEditorInputProxy) input) |
| .setTransactionalEditingDomain(createEditingDomain()); |
| } |
| super.doSetInput(input, releaseEditorContents); |
| initializeTitle(input); |
| // for save event dispatcher |
| if (dispatcher == null) { |
| dispatcher = new SaveEventDispatcher() { |
| public void updateTimeStamp(ISaveInfo info) { |
| fModificationStamp = info.getTimeStamp(); |
| } |
| }; |
| DiagramService.eInstance().addDispatchers(dispatcher); |
| } |
| } |
| |
| /** |
| * Initializes the editor's title based on the given editor input. |
| * |
| * @param input the editor input to be used |
| * @custom |
| */ |
| private void initializeTitle(IEditorInput input) { |
| |
| String title = ""; //$NON-NLS-1$ |
| if (input != null) { |
| DiagramFileEditorInputProxy fileInput = (DiagramFileEditorInputProxy) input; |
| DiagramEditorInput diagramInput = fileInput.getDiagramEditorInput(); |
| MethodElement inputElement = diagramInput.getMethodElement(); |
| if (inputElement != null) { |
| title = inputElement.getName(); |
| ILabelProvider labelProvider = new AdapterFactoryLabelProvider( |
| TngAdapterFactory.INSTANCE |
| .getNavigatorView_ComposedAdapterFactory()); |
| Image titleImage = labelProvider.getImage(inputElement); |
| setTitleImage(titleImage); |
| } |
| } |
| setPartName(title); |
| firePropertyChange(PROP_DIRTY); |
| } |
| |
| /** |
| * (non-Javadoc) |
| * @see org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor#sanityCheckState(org.eclipse.ui.IEditorInput) |
| * @custom |
| */ |
| protected void sanityCheckState(IEditorInput input) { |
| IDocumentProvider p = getDocumentProvider(); |
| if (p == null) |
| return; |
| |
| long stamp = p.getModificationStamp(input); |
| if (stamp != fModificationStamp) { |
| fModificationStamp = stamp; |
| if (!p.isSynchronized(input)) |
| handleEditorInputChanged(); |
| } |
| updateState(getEditorInput()); |
| } |
| |
| /** |
| * |
| * @custom |
| */ |
| public void dispose() { |
| // if changes discarded, reverse to saved |
| // |
| reverseToSaved(); |
| |
| if (dispatcher != null) { |
| DiagramService.eInstance().removeDispatchers(dispatcher); |
| } |
| super.dispose(); |
| } |
| |
| private DiagramAdapter getDiagramAdapter() { |
| return (DiagramAdapter) BridgeHelper |
| .getNodeAdapter(((View) getDiagramEditPart().getModel()) |
| .getElement()); |
| } |
| |
| private void reverseToSaved() { |
| DiagramAdapter adapter = getDiagramAdapter(); |
| IActionManager actionMgr = adapter.getActionManager(); |
| boolean dirty = actionMgr.isSaveNeeded(); |
| if (dirty) { |
| actionMgr.undoAll(); |
| } |
| |
| // save the undone changes only if the resource has been changed outside this editor |
| // |
| boolean saveNeeded = dirty |
| && getLastModified() > adapter.getUmaLastModified(); |
| MethodElement me; |
| if (saveNeeded && (me = getMethodElementFromInput()) != null) { |
| ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil |
| .getCurrentPersister().getFailSafePersister(); |
| try { |
| persister.save(me.eResource()); |
| persister.commit(); |
| } catch (Exception e) { |
| CommonPlugin.getDefault().getLogger().logError(e); |
| try { |
| persister.rollback(); |
| } catch (Exception ex) { |
| //TODO: reload library needed |
| // ViewHelper.reloadCurrentLibrary(getSite().getShell(), null); |
| ex.printStackTrace(); |
| } |
| } |
| } |
| } |
| |
| private MethodElement getMethodElementFromInput() { |
| IEditorInput input = getEditorInput(); |
| if (input instanceof DiagramFileEditorInputProxy) { |
| return ((DiagramFileEditorInputProxy) input) |
| .getDiagramEditorInput().getMethodElement(); |
| } |
| return null; |
| } |
| |
| private long getLastModified() { |
| Resource resource = getMethodElementFromInput().eResource(); |
| if (resource != null && resource.getURI().isFile()) { |
| File file = new File(resource.getURI().toFileString()); |
| return file.lastModified(); |
| } |
| return -1; |
| } |
| |
| public void doSave(IProgressMonitor progressMonitor) { |
| IActionManager actionMgr = getDiagramAdapter().getActionManager(); |
| if (actionMgr.isSaveNeeded()) { |
| try { |
| progressMonitor.beginTask("Saving", IProgressMonitor.UNKNOWN); //$NON-NLS-1$ |
| ILibraryPersister.FailSafeMethodLibraryPersister persister = LibraryServiceUtil |
| .getCurrentPersister().getFailSafePersister(); |
| try { |
| for (Iterator iter = actionMgr.getModifiedResources() |
| .iterator(); iter.hasNext();) { |
| Resource resource = (Resource) iter.next(); |
| progressMonitor.setTaskName(NLS.bind("Saving {0}", |
| resource.getURI().isFile() ? resource.getURI() |
| .toFileString() : "")); |
| persister.save(resource); |
| } |
| persister.commit(); |
| actionMgr.saveIsDone(); |
| } catch (Exception e) { |
| CommonPlugin.getDefault().getLogger().logError(e); |
| try { |
| persister.rollback(); |
| } catch (Exception ex) { |
| CommonPlugin.getDefault().getLogger().logError(ex); |
| // ViewHelper |
| // .reloadCurrentLibaryOnRollbackError(getSite() |
| // .getShell()); |
| return; |
| } |
| CommonPlugin.getDefault().getMsgDialog().displayWarning( |
| getSite().getShell().getText(), |
| "IUPD0001W: Saving diagram failed", e.getMessage(), |
| e); |
| return; |
| } |
| |
| } finally { |
| progressMonitor.done(); |
| } |
| |
| } |
| |
| super.doSave(progressMonitor); |
| } |
| } |