package org.eclipse.gmf.tooling.runtime.part; import java.util.Collections; import java.util.Map; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.geometry.Point; import org.eclipse.gef.EditPart; import org.eclipse.gmf.runtime.diagram.ui.editparts.DiagramEditPart; import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor; import org.eclipse.ui.AbstractSourceProvider; import org.eclipse.ui.ISources; import org.eclipse.ui.services.IEvaluationService; /** * @since 3.2 */ public class LastClickPositionProvider extends AbstractSourceProvider { public static String SOURCE_LAST_CLICK = LastClickPositionProvider.class.getName() + ".lastClickPosition"; private MouseListener myMouseListener; private IFigure myDiagramFigure; private DiagramEditor myDiagramEditor; private IEvaluationService myEvaluationService; private Point myLastClickedAt = new Point(0, 0); public LastClickPositionProvider(DiagramEditor diagramEditor) { myDiagramEditor = diagramEditor; EditPart diagramEditPart = myDiagramEditor.getDiagramGraphicalViewer().getContents(); if (diagramEditPart instanceof DiagramEditPart) { myDiagramFigure = ((DiagramEditPart) diagramEditPart).getFigure(); myMouseListener = new DiagramMouseListner(); myDiagramFigure.addMouseListener(myMouseListener); } } public void attachToService() { if (myEvaluationService == null) { myEvaluationService = (IEvaluationService) myDiagramEditor.getSite().getService(IEvaluationService.class); if (myEvaluationService != null) { myEvaluationService.addSourceProvider(this); } } } public void detachFromService() { if (myEvaluationService != null) { myEvaluationService.removeSourceProvider(this); myEvaluationService = null; } } public void fireLastClickedAt(int x, int y) { myLastClickedAt = new Point(x, y); fireSourceChanged(ISources.WORKBENCH, SOURCE_LAST_CLICK, myLastClickedAt); } public void dispose() { if (myMouseListener != null) { myDiagramFigure.removeMouseListener(myMouseListener); myDiagramFigure = null; } if (myMouseListener != null) { myMouseListener = null; } } public Map<?, ?> getCurrentState() { return Collections.singletonMap(SOURCE_LAST_CLICK, myLastClickedAt); } public String[] getProvidedSourceNames() { return new String[] { SOURCE_LAST_CLICK }; } private class DiagramMouseListner implements MouseListener { public void mouseReleased(MouseEvent me) { } public void mousePressed(MouseEvent me) { if (me.button == 3) { myLastClickedAt.setX(me.x); myLastClickedAt.setY(me.y); } } public void mouseDoubleClicked(MouseEvent me) { } } }