Question

I am trying to display a miniature view of the graph contained in my GEF editor in the eclipse outline view, but in the outline it says "An outline is not available". This is the ContentOutlinePage I created:

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

In my GEF editor, I added the following lines:

@Override
  public Object getAdapter(Class type) {
    ...
    if(type == IContentOutlinePage.class) {
      return new OverviewContentPage(getGraphicalViewer());
    }
    return super.getAdapter(type);
  }

Am I missing something?

Was it helpful?

Solution

Overriding the method getControl() solves the problem:

private SashForm sash;

...

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

where sash is the SashForm passed to the LightweightSystem in createControl().

OTHER TIPS

I extended outline page provided by gef org.eclipse.gef.ui.parts.ContentOutlinePage in this way:

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

}

And I return my outline page when it is requested in the 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);
}

GraphicalEditor outline

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top