Eclipse rcp 从GEF编辑器创建微型大纲视图
我试图在eclipseoutline视图中显示GEF编辑器中包含的图形的微型视图,但在outline视图中它表示“outline不可用”。这是我创建的ContentOutlinePage:Eclipse rcp 从GEF编辑器创建微型大纲视图,eclipse-rcp,eclipse-gef,Eclipse Rcp,Eclipse Gef,我试图在eclipseoutline视图中显示GEF编辑器中包含的图形的微型视图,但在outline视图中它表示“outline不可用”。这是我创建的ContentOutlinePage: import org.eclipse.draw2d.LightweightSystem; import org.eclipse.draw2d.Viewport; import org.eclipse.draw2d.parts.ScrollableThumbnail; import org.eclipse.ge
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.Viewport;
import org.eclipse.draw2d.parts.ScrollableThumbnail;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.LayerConstants;
import org.eclipse.gef.editparts.ScalableRootEditPart;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
public class OverviewContentPage extends ContentOutlinePage {
private ScrollableThumbnail thumbnail;
private DisposeListener disposeListener;
private GraphicalViewer viewer;
public OverviewContentPage(GraphicalViewer viewer) {
super(viewer);
this.viewer = viewer;
}
@Override
public void createControl(Composite parent) {
Canvas canvas = new Canvas(new SashForm(parent, SWT.VERTICAL), SWT.BORDER);
LightweightSystem lws = new LightweightSystem(canvas);
thumbnail = new ScrollableThumbnail(
(Viewport) ((ScalableRootEditPart) viewer.getRootEditPart()).getFigure());
thumbnail.setSource(((ScalableRootEditPart) viewer.getRootEditPart()).getLayer(LayerConstants.PRINTABLE_LAYERS));
lws.setContents(thumbnail);
disposeListener = new DisposeListener() {
@Override
public void widgetDisposed(DisposeEvent e) {
if (thumbnail != null) {
thumbnail.deactivate();
thumbnail = null;
}
}
};
viewer.getControl().addDisposeListener(disposeListener);
}
@Override
public void dispose() {
if(viewer != null) {
if (viewer.getControl() != null && !viewer.getControl().isDisposed())
viewer.getControl().removeDisposeListener(disposeListener);
super.dispose();
}
}
}
在我的GEF编辑器中,我添加了以下行:
@Override
public Object getAdapter(Class type) {
...
if(type == IContentOutlinePage.class) {
return new OverviewContentPage(getGraphicalViewer());
}
return super.getAdapter(type);
}
我遗漏了什么吗?重写getControl()方法可以解决问题:
private SashForm sash;
...
@Override
public Control getControl() {
return sash;
}
其中,sash是传递给createControl()中LightweightSystem的SashForm。I gef以这种方式提供的扩展大纲页面:
public class GraphicalViewerOutlinePage extends ContentOutlinePage {
private SashForm sashForm;
public GraphicalViewerOutlinePage(GraphicalViewer viewer) {
super(viewer);
}
@Override
public void createControl(Composite parent) {
sashForm = new SashForm(parent, SWT.VERTICAL);
Canvas canvas = new Canvas(sashForm, SWT.BORDER);
EditPartViewer viewer = getViewer();
RootEditPart rootEditPart = viewer.getRootEditPart();
if (rootEditPart instanceof GraphicalEditPart) {
GraphicalEditPart graphicalEditPart = (GraphicalEditPart) rootEditPart;
createThumbnail(canvas, graphicalEditPart);
}
}
private void createThumbnail(Canvas canvas, GraphicalEditPart graphicalEditPart) {
IFigure figure = graphicalEditPart.getFigure();
Thumbnail thumbnail = createThumbnail(figure);
LightweightSystem lws = new LightweightSystem(canvas);
lws.setContents(thumbnail);
if (graphicalEditPart instanceof LayerManager) {
LayerManager layerManager = (LayerManager) graphicalEditPart;
IFigure printableLayer = layerManager.getLayer(LayerConstants.PRINTABLE_LAYERS);
thumbnail.setSource(printableLayer);
} else {
thumbnail.setSource(figure);
}
canvas.addDisposeListener(e -> thumbnail.deactivate());
}
private Thumbnail createThumbnail(IFigure figure) {
Thumbnail thumbnail;
if (figure instanceof Viewport) {
Viewport viewport = (Viewport) figure;
thumbnail = new ScrollableThumbnail(viewport);
} else {
thumbnail = new Thumbnail(figure);
}
return thumbnail;
}
@Override
public Control getControl() {
return sashForm;
}
}
当我的大纲页面在中被请求时,我会返回它
@Override
public Object getAdapter(Class type) {
if (IContentOutlinePage.class.isAssignableFrom(adapter)) {
GraphicalViewer graphicalViewer = getGraphicalViewer();
return new GraphicalViewerOutlinePage(graphicalViewer);
}
return super.getAdapter(type);
}