| /***************************************************************************** |
| * Copyright (c) 2011 CEA LIST. |
| * |
| * 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: |
| * |
| * CEA LIST - Initial API and implementation |
| * |
| *****************************************************************************/ |
| package org.eclipse.papyrus.sysml.diagram.blockdefinition.part; |
| |
| import java.util.EventObject; |
| import java.util.Set; |
| |
| import org.eclipse.core.commands.operations.IUndoContext; |
| import org.eclipse.core.resources.IMarker; |
| import org.eclipse.core.runtime.IProgressMonitor; |
| import org.eclipse.core.runtime.NullProgressMonitor; |
| import org.eclipse.emf.transaction.TransactionalEditingDomain; |
| import org.eclipse.gef.GraphicalViewer; |
| import org.eclipse.gef.KeyHandler; |
| import org.eclipse.gef.Tool; |
| import org.eclipse.gef.commands.CommandStackListener; |
| import org.eclipse.gef.palette.PaletteRoot; |
| import org.eclipse.gef.ui.palette.PaletteViewer; |
| import org.eclipse.gef.ui.palette.PaletteViewerProvider; |
| import org.eclipse.gmf.runtime.common.core.service.IProviderChangeListener; |
| import org.eclipse.gmf.runtime.common.core.service.ProviderChangeEvent; |
| import org.eclipse.gmf.runtime.common.ui.services.marker.MarkerNavigationService; |
| import org.eclipse.gmf.runtime.diagram.core.preferences.PreferencesHint; |
| import org.eclipse.gmf.runtime.diagram.ui.actions.ActionIds; |
| import org.eclipse.gmf.runtime.diagram.ui.internal.parts.PaletteToolTransferDragSourceListener; |
| import org.eclipse.gmf.runtime.diagram.ui.providers.DiagramContextMenuProvider; |
| import org.eclipse.gmf.runtime.diagram.ui.resources.editor.document.IDocumentProvider; |
| import org.eclipse.gmf.runtime.notation.Diagram; |
| import org.eclipse.jface.util.LocalSelectionTransfer; |
| import org.eclipse.jface.viewers.ISelection; |
| import org.eclipse.papyrus.commands.util.OperationHistoryDirtyState; |
| import org.eclipse.papyrus.infra.core.services.ServiceException; |
| import org.eclipse.papyrus.infra.core.services.ServicesRegistry; |
| import org.eclipse.papyrus.infra.gmfdiag.common.GmfMultiDiagramDocumentProvider; |
| import org.eclipse.papyrus.infra.gmfdiag.common.service.palette.PapyrusPaletteContextMenuProvider; |
| import org.eclipse.papyrus.infra.gmfdiag.common.service.palette.PapyrusPaletteService; |
| import org.eclipse.papyrus.infra.gmfdiag.common.service.palette.PapyrusPaletteViewer; |
| import org.eclipse.papyrus.infra.ui.editor.IMultiDiagramEditor; |
| import org.eclipse.papyrus.sysml.diagram.blockdefinition.Activator; |
| import org.eclipse.papyrus.sysml.diagram.blockdefinition.utils.FixPortsLocationOnOpening; |
| import org.eclipse.papyrus.uml.diagram.common.listeners.DropTargetListener; |
| import org.eclipse.papyrus.uml.diagram.common.part.UmlGmfDiagramEditor; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.dnd.TransferData; |
| import org.eclipse.swt.events.KeyEvent; |
| import org.eclipse.swt.events.MouseEvent; |
| import org.eclipse.swt.events.MouseListener; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.ui.IEditorInput; |
| import org.eclipse.ui.IEditorPart; |
| import org.eclipse.ui.IWorkbenchPart; |
| import org.eclipse.ui.ide.IGotoMarker; |
| import org.eclipse.ui.part.ShowInContext; |
| |
| /** |
| * @generated |
| */ |
| public class BlockDefinitionDiagramEditor extends UmlGmfDiagramEditor implements IProviderChangeListener, IGotoMarker { |
| |
| /** |
| * @generated |
| */ |
| public static final String ID = "org.eclipse.papyrus.sysml.diagram.blockdefinition.part.BlockDefinitionDiagramEditorID"; //$NON-NLS-1$ |
| |
| /** |
| * @generated |
| */ |
| private KeyHandler paletteKeyHandler = null; |
| |
| /** |
| * @generated |
| */ |
| private MouseListener paletteMouseListener = null; |
| |
| /** |
| * @generated |
| */ |
| private OperationHistoryDirtyState dirtyState; |
| |
| /** |
| * @generated |
| */ |
| private TransactionalEditingDomain editingDomain; |
| |
| /** |
| * @generated |
| */ |
| private IDocumentProvider documentProvider; |
| |
| /** |
| * @generated |
| */ |
| public BlockDefinitionDiagramEditor(ServicesRegistry servicesRegistry, Diagram diagram) throws ServiceException { |
| super(servicesRegistry, diagram); |
| |
| // Fix Port locations (implementations before 0.8.1 were erroneous see https://bugs.eclipse.org/bugs/show_bug.cgi?id=354815) |
| (new FixPortsLocationOnOpening()).fix(diagram); |
| |
| // adds a listener to the palette service, which reacts to palette customizations |
| PapyrusPaletteService.getInstance().addProviderChangeListener(this); |
| |
| // Share the same editing provider |
| editingDomain = servicesRegistry.getService(TransactionalEditingDomain.class); |
| documentProvider = new GmfMultiDiagramDocumentProvider(editingDomain); |
| |
| // overrides editing domain created by super constructor |
| setDocumentProvider(documentProvider); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected PaletteRoot createPaletteRoot(PaletteRoot existingPaletteRoot) { |
| PaletteRoot paletteRoot; |
| if (existingPaletteRoot == null) { |
| paletteRoot = PapyrusPaletteService.getInstance().createPalette(this, getDefaultPaletteContent()); |
| } else { |
| PapyrusPaletteService.getInstance().updatePalette(existingPaletteRoot, this, getDefaultPaletteContent()); |
| paletteRoot = existingPaletteRoot; |
| } |
| applyCustomizationsToPalette(paletteRoot); |
| return paletteRoot; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected PreferencesHint getPreferencesHint() { |
| return Activator.DIAGRAM_PREFERENCES_HINT; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public String getContributorId() { |
| return Activator.PLUGIN_ID; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected final IDocumentProvider getDocumentProvider(IEditorInput input) { |
| return documentProvider; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public TransactionalEditingDomain getEditingDomain() { |
| return editingDomain; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected final void setDocumentProvider(IEditorInput input) { |
| // Already set in the constructor |
| } |
| |
| /** |
| * @generated |
| */ |
| public void gotoMarker(IMarker marker) { |
| MarkerNavigationService.getInstance().gotoMarker(this, marker); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public boolean isSaveAsAllowed() { |
| return true; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public void doSaveAs() { |
| performSaveAs(new NullProgressMonitor()); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected void performSaveAs(IProgressMonitor progressMonitor) { |
| // Nothing |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public ShowInContext getShowInContext() { |
| return new ShowInContext(getEditorInput(), getGraphicalViewer().getSelection()); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected void configureGraphicalViewer() { |
| super.configureGraphicalViewer(); |
| |
| // Replace diagram contextual menu removing default |
| // delete from model action. |
| DiagramContextMenuProvider provider = (DiagramContextMenuProvider) getDiagramGraphicalViewer().getContextMenu(); |
| Set<String> menuExclusions = provider.getExclusionSet(); |
| menuExclusions.add(ActionIds.ACTION_DELETE_FROM_MODEL); |
| provider.setExclusionSet(menuExclusions); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected TransactionalEditingDomain createEditingDomain() { |
| // Already configured |
| return editingDomain; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected void configureDiagramEditDomain() { |
| super.configureDiagramEditDomain(); |
| getDiagramEditDomain().getDiagramCommandStack().addCommandStackListener(new CommandStackListener() { |
| |
| public void commandStackChanged(EventObject event) { |
| firePropertyChange(IEditorPart.PROP_DIRTY); |
| } |
| }); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public void doSave(IProgressMonitor progressMonitor) { |
| // The saving of the resource is done by the CoreMultiDiagramEditor |
| getDirtyState().saved(); |
| } |
| |
| /** |
| * @generated |
| */ |
| protected OperationHistoryDirtyState getDirtyState() { |
| if (dirtyState == null) { |
| dirtyState = OperationHistoryDirtyState.newInstance(getUndoContext(), getOperationHistory()); |
| } |
| return dirtyState; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected void setUndoContext(IUndoContext context) { |
| if (dirtyState != null) { |
| dirtyState.dispose(); |
| dirtyState = null; |
| } |
| |
| super.setUndoContext(context); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public boolean isDirty() { |
| return getDirtyState().isDirty(); |
| } |
| |
| /** |
| * @generated |
| */ |
| public void providerChanged(ProviderChangeEvent event) { |
| // update the palette if the palette service has changed |
| if (PapyrusPaletteService.getInstance().equals(event.getSource())) { |
| PapyrusPaletteService.getInstance().updatePalette(getPaletteViewer().getPaletteRoot(), this, getDefaultPaletteContent()); |
| } |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public void dispose() { |
| // remove palette service listener |
| // remove preference listener |
| PapyrusPaletteService.getInstance().removeProviderChangeListener(this); |
| |
| if (dirtyState != null) { |
| dirtyState.dispose(); |
| dirtyState = null; |
| } |
| |
| super.dispose(); |
| } |
| |
| /** |
| * @generated |
| */ |
| protected PaletteViewer getPaletteViewer() { |
| return getEditDomain().getPaletteViewer(); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected PaletteViewer constructPaletteViewer() { |
| return new PapyrusPaletteViewer(); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected PaletteViewerProvider createPaletteViewerProvider() { |
| getEditDomain().setPaletteRoot(createPaletteRoot(null)); |
| return new PaletteViewerProvider(getEditDomain()) { |
| |
| /** |
| * Override to provide the additional behavior for the tools. Will intialize with a |
| * PaletteEditPartFactory that has a TrackDragger that understand how to handle the |
| * mouseDoubleClick event for shape creation tools. Also will initialize the palette |
| * with a defaultTool that is the SelectToolEx that undestands how to handle the enter |
| * key which will result in the creation of the shape also. |
| */ |
| @Override |
| protected void configurePaletteViewer(PaletteViewer viewer) { |
| super.configurePaletteViewer(viewer); |
| |
| // customize menu... |
| viewer.setContextMenu(new PapyrusPaletteContextMenuProvider(viewer)); |
| |
| viewer.getKeyHandler().setParent(getPaletteKeyHandler()); |
| viewer.getControl().addMouseListener(getPaletteMouseListener()); |
| |
| // Add a transfer drag target listener that is supported on |
| // palette template entries whose template is a creation tool. |
| // This will enable drag and drop of the palette shape creation |
| // tools. |
| viewer.addDragSourceListener(new PaletteToolTransferDragSourceListener(viewer)); |
| viewer.setCustomizer(createPaletteCustomizer()); |
| } |
| |
| @Override |
| public PaletteViewer createPaletteViewer(Composite parent) { |
| PaletteViewer pViewer = constructPaletteViewer(); |
| pViewer.createControl(parent); |
| configurePaletteViewer(pViewer); |
| hookPaletteViewer(pViewer); |
| return pViewer; |
| } |
| |
| /** |
| * @return Palette Key Handler for the palette |
| */ |
| private KeyHandler getPaletteKeyHandler() { |
| |
| if (paletteKeyHandler == null) { |
| |
| paletteKeyHandler = new KeyHandler() { |
| |
| /** |
| * Processes a <i>key released </i> event. This method is called by the Tool |
| * whenever a key is released, and the Tool is in the proper state. Override |
| * to support pressing the enter key to create a shape or connection |
| * (between two selected shapes) |
| * |
| * @param event |
| * the KeyEvent |
| * @return <code>true</code> if KeyEvent was handled in some way |
| */ |
| @Override |
| public boolean keyReleased(KeyEvent event) { |
| |
| if (event.keyCode == SWT.Selection) { |
| |
| Tool tool = getPaletteViewer().getActiveTool().createTool(); |
| |
| if (toolSupportsAccessibility(tool)) { |
| |
| tool.keyUp(event, getDiagramGraphicalViewer()); |
| |
| // deactivate current selection |
| getPaletteViewer().setActiveTool(null); |
| |
| return true; |
| } |
| |
| } |
| return super.keyReleased(event); |
| } |
| |
| }; |
| |
| } |
| return paletteKeyHandler; |
| } |
| |
| /** |
| * @return Palette Mouse listener for the palette |
| */ |
| private MouseListener getPaletteMouseListener() { |
| |
| if (paletteMouseListener == null) { |
| |
| paletteMouseListener = new MouseListener() { |
| |
| /** |
| * Flag to indicate that the current active tool should be cleared after a |
| * mouse double-click event. |
| */ |
| private boolean clearActiveTool = false; |
| |
| /** |
| * Override to support double-clicking a palette tool entry to create a |
| * shape or connection (between two selected shapes). |
| * |
| * @see MouseListener#mouseDoubleClick(MouseEvent) |
| */ |
| public void mouseDoubleClick(MouseEvent e) { |
| Tool tool = getPaletteViewer().getActiveTool().createTool(); |
| |
| if (toolSupportsAccessibility(tool)) { |
| |
| tool.setViewer(getDiagramGraphicalViewer()); |
| tool.setEditDomain(getDiagramGraphicalViewer().getEditDomain()); |
| tool.mouseDoubleClick(e, getDiagramGraphicalViewer()); |
| |
| // Current active tool should be deactivated, |
| // but if it is down here it will get |
| // reactivated deep in GEF palette code after |
| // receiving mouse up events. |
| clearActiveTool = true; |
| } |
| } |
| |
| public void mouseDown(MouseEvent e) { |
| // do nothing |
| } |
| |
| public void mouseUp(MouseEvent e) { |
| // Deactivate current active tool here if a |
| // double-click was handled. |
| if (clearActiveTool) { |
| getPaletteViewer().setActiveTool(null); |
| clearActiveTool = false; |
| } |
| |
| } |
| }; |
| |
| } |
| return paletteMouseListener; |
| } |
| |
| }; |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public GraphicalViewer getGraphicalViewer() { |
| return super.getGraphicalViewer(); |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| protected void initializeGraphicalViewer() { |
| super.initializeGraphicalViewer(); |
| |
| // Enable Drop |
| getDiagramGraphicalViewer().addDropTargetListener(new DropTargetListener(getDiagramGraphicalViewer(), LocalSelectionTransfer.getTransfer()) { |
| |
| @Override |
| protected Object getJavaObject(TransferData data) { |
| return LocalSelectionTransfer.getTransfer().nativeToJava(data); |
| } |
| |
| @Override |
| protected TransactionalEditingDomain getTransactionalEditingDomain() { |
| return getEditingDomain(); |
| } |
| }); |
| |
| } |
| |
| /** |
| * @generated |
| */ |
| @Override |
| public void selectionChanged(IWorkbenchPart part, ISelection selection) { |
| if (getSite().getPage().getActiveEditor() instanceof IMultiDiagramEditor) { |
| IMultiDiagramEditor editor = (IMultiDiagramEditor) getSite().getPage().getActiveEditor(); |
| // If not the active editor, ignore selection changed. |
| if (this.equals(editor.getActiveEditor())) { |
| updateActions(getSelectionActions()); |
| super.selectionChanged(part, selection); |
| } else { |
| super.selectionChanged(part, selection); |
| } |
| } else { |
| super.selectionChanged(part, selection); |
| } |
| // from |
| // org.eclipse.gmf.runtime.diagram.ui.resources.editor.parts.DiagramDocumentEditor.selectionChanged(IWorkbenchPart, |
| // ISelection) |
| if (part == this) { |
| rebuildStatusLine(); |
| } |
| } |
| } |