blob: 1df0636b286c8903215206d0c72c9630944327b2 [file] [log] [blame]
/*****************************************************************************
* 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();
}
}
}