package org.jbpm.gd.common.editor;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.MarginBorder;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.parts.ScrollableThumbnail;
import org.eclipse.draw2d.parts.Thumbnail;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.editparts.ScalableFreeformRootEditPart;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.part.ViewPart;
public class BirdsEyeViewer extends ViewPart {
private ISelectionListener pageSelectionListener;
private Label label;
private Canvas canvas;
private LightweightSystem lws;
private Thumbnail thumbnail;
private IWorkbenchPart selectedPart;
public BirdsEyeViewer() {
}
private void hookPageSelectionListener() {
pageSelectionListener = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
pageSelectionChanged();
}
};
getSite().getPage().addPostSelectionListener(pageSelectionListener);
}
private void pageSelectionChanged() {
selectedPart = getSite().getPage().getActiveEditor();
if (selectedPart != null && selectedPart instanceof Editor) {
canvas.setVisible(true);
createOverview();
label.setVisible(false);
} else {
canvas.setVisible(false);
label.setVisible(true);
}
}
public void createPartControl(Composite parent) {
setPartName("Overview");
parent.setLayout(new FormLayout());
label = new Label(parent, SWT.NORMAL);
label.setText("No view available");
label.setLayoutData(getLayoutData());
canvas = new Canvas(parent, SWT.NONE);
canvas.setLayoutData(getLayoutData());
lws = new LightweightSystem(canvas);
hookPageSelectionListener();
pageSelectionChanged();
}
private FormData getLayoutData() {
FormData result = new FormData();
result.top = new FormAttachment(0, 0);
result.left = new FormAttachment(0, 0);
result.right = new FormAttachment(100, 0);
result.bottom = new FormAttachment(100, 0);
return result;
}
public void setFocus() {
}
private void createOverview() {
if (thumbnail != null) {
thumbnail.deactivate();
}
ScalableFreeformRootEditPart rootEditPart = getModelViewerRootEditPart();
thumbnail = new ScrollableThumbnail((Viewport)rootEditPart.getFigure());
thumbnail.setBorder(new MarginBorder(3));
thumbnail.setSource(rootEditPart.getLayer(LayerConstants.PRINTABLE_LAYERS));
lws.setContents(thumbnail);
}
private ScalableFreeformRootEditPart getModelViewerRootEditPart() {
return (ScalableFreeformRootEditPart)getModelViewer().getRootEditPart();
}
private GraphicalViewer getModelViewer() {
return ((Editor)selectedPart).getGraphicalViewer();
}
public void dispose() {
if (pageSelectionListener != null) {
getSite().getPage().removePostSelectionListener(pageSelectionListener);
}
if (null != thumbnail) {
thumbnail.deactivate();
}
super.dispose();
}
}