【问题标题】:Create miniature outline view from GEF editor从 GEF 编辑器创建微型大纲视图
【发布时间】:2020-01-17 14:06:16
【问题描述】:

我试图在 Eclipse 大纲视图中显示我的 GEF 编辑器中包含的图形的微型视图,但在大纲中显示“大纲不可用”。这是我创建的 ContentOutlinePage:

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

我错过了什么吗?

【问题讨论】:

    标签: eclipse-rcp eclipse-gef


    【解决方案1】:

    重写getControl()方法解决问题:

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

    其中 sash 是在 createControl() 中传递给 LightweightSystem 的 SashForm。

    【讨论】:

      【解决方案2】:

      我以这种方式扩展了gef org.eclipse.gef.ui.parts.ContentOutlinePage提供的大纲页面:

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

      当org.eclipse.gef.ui.parts.GraphicalEditor 提出请求时,我会返回大纲页面。

      @Override
      public Object getAdapter(Class type) {
          if (IContentOutlinePage.class.isAssignableFrom(adapter)) {
              GraphicalViewer graphicalViewer = getGraphicalViewer();
              return new GraphicalViewerOutlinePage(graphicalViewer);
          }
          return super.getAdapter(type);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        相关资源
        最近更新 更多