blob: 4e2432ae66f343fb8d1513f784a953e21082a0bc [file] [log] [blame]
/******************************************************************************
* Copyright (c) 2002, 2008 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 API and implementation
****************************************************************************/
package org.eclipse.gmf.runtime.diagram.ui.util;
import java.util.Iterator;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.draw2d.FigureCanvas;
import org.eclipse.draw2d.RangeModel;
import org.eclipse.draw2d.geometry.Point;
import org.eclipse.gef.EditPart;
import org.eclipse.gmf.runtime.common.ui.services.editor.EditorService;
import org.eclipse.gmf.runtime.diagram.ui.parts.DiagramEditor;
import org.eclipse.gmf.runtime.diagram.ui.parts.IDiagramGraphicalViewer;
import org.eclipse.gmf.runtime.notation.Diagram;
import org.eclipse.gmf.runtime.notation.View;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
/**
* Helper for selecting an element on a diagram. Works for closed diagrams
* when you open the diagram first. You can use View's getDiagram()
* to determine the diagram to open. getDiagram() returns itself if the
* View is a Diagram.
*
* @author wdiu, Wayne Diu
*/
public class SelectInDiagramHelper {
/**
* Do not instantiate this helper class
*/
private SelectInDiagramHelper() {
//do not instantiate
}
/**
* Activate the diagram if it's already open.
* If not, return null.
*
* @param diagram Diagram to activate
* @return DiagramEditor of the activated diagram. null if it was not open
* and could not be activated.
*/
public static DiagramEditor activateDiagram(Diagram diagram) {
List editors = EditorService.getInstance().getRegisteredEditorParts();
Iterator it = editors.iterator();
while (it.hasNext()) {
Object obj = it.next();
if (obj instanceof DiagramEditor) {
DiagramEditor diagramEditor = ((DiagramEditor) obj);
if (diagramEditor.getDiagram().equals(diagram)) {
//it's already open, just activate
PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().activate(diagramEditor);
return diagramEditor;
}
}
}
return null;
}
/**
* Select the View element from the DiagramEditor.
*
* The DiagramEditor for the view must be the active editor for this
* workbench, otherwise it does not make sense to call this method.
*
* Call activateDiagram to set the active DiagramEditor or open it
* manually.
*
* @param view View to select
*/
public static void selectElement(View view) {
IEditorPart editorPart = PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getActivePage().getActiveEditor();
//DiagramEditor should be activated
Assert.isTrue(editorPart instanceof DiagramEditor);
DiagramEditor diagramEditor = (DiagramEditor) editorPart;
//activated DiagramEditor must be the one that corresponds to
//this view's diagram
Assert.isTrue(diagramEditor.getDiagram().equals(view.getDiagram()));
//diagramEditor instanceof IDiagramWorkbenchPart
IDiagramGraphicalViewer viewer = diagramEditor
.getDiagramGraphicalViewer();
Assert.isNotNull(viewer);
//find the edit part
Object obj = viewer.getEditPartRegistry().get(view);
if (obj instanceof EditPart) {
viewer.select((EditPart) obj);
} else {
//could not activate the edit part from the registry
Assert.isTrue(false);
}
}
/**
* This api will expose the diagram at the location given in absolute co-ordinates.
* @param canvas
* @param location
*/
public static void exposeLocation(FigureCanvas canvas,Point location){
location = location.getCopy();
int padding = 50;
if (location.x >= 0){
location.x += padding;
}else{
location.x -= padding;
}
if (location.y >= 0){
location.y += padding;
}else{
location.y -= padding;
}
int viewPortXLocation = canvas.getBounds().x;
int viewPortXExtent = canvas.getBounds().x+canvas.getBounds().width;
int viewPortYLocation = canvas.getBounds().y;
int viewPortYExtent = canvas.getBounds().y+canvas.getBounds().height;
int deltaX = 0;
int deltaY = 0;
if (location.x < viewPortXLocation){
deltaX = location.x - viewPortXLocation;
}else if (location.x > viewPortXExtent){
deltaX = location.x - viewPortXExtent;
}
if (location.y < viewPortYLocation){
deltaY = location.y - viewPortYLocation;
} else if (location.y > viewPortYExtent){
deltaY = location.y - viewPortYExtent;
}
RangeModel hRange = canvas.getViewport().getHorizontalRangeModel();
RangeModel vRange = canvas.getViewport().getVerticalRangeModel();
if ((deltaX != 0) || (deltaY != 0)){
canvas.getViewport().setIgnoreScroll(true);
int x = hRange.getValue() + deltaX;
int y = vRange.getValue() + deltaY;
canvas.scrollSmoothTo(x,y);
canvas.getViewport().setIgnoreScroll(false);
}
}
}