2014-03-26 37 views
1

我想在eclipse大綱視圖中顯示包含在我的GEF編輯器中的圖形的縮略圖,但在大綱中顯示「輪廓不可用」。這是我創建的ContentOutlinePage:從GEF編輯器創建縮略大綱視圖

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); 
    } 

我缺少的東西?

回答

1

重寫方法getControl()解決了這個問題:

private SashForm sash; 

... 

@Override 
public Control getControl() { 
    return sash; 
} 

其中窗框是SashForm傳遞到LightweightSystem在createControl()。