eclipse插件开发(四) 流程图绘制插件(雏形)

1.新建一个Plug-in Project, 名为FlowPlugin, Templates选择Multi-page editor, 后缀指定为flow

2.分为2个页签: 源码和设计, 源码使用XMLEditor作为EditorPart(XMLEditor可以使用向导生成后复制过来),

private XMLEditor srcEditor;

void createSrcPage() {
    try {
      srcEditor = new XMLEditor();

      int index = addPage(srcEditor, getEditorInput());
      setPageText(index, " 源 码 ");
    } catch (PartInitException e) {
      ErrorDialog.openError(
          getSite().getShell(),
          "Error creating nested text editor",
          null,
          e.getStatus());
    }
  }

设计使用GraphicalEditorWithFlyoutPalette作为EditorPart(这是内置好的画板工具栏)

private GraphicalEditorWithFlyoutPalette designEditor;
void createDesignPage() {
    try {
      designEditor = new FlowDiagramEditor();
      IPath path = ((IFileEditorInput) getEditorInput()).getFile().getProjectRelativePath();
      IEditorInput input = new FlowDiagramEditorInput(path);
      int index = addPage(designEditor, input);
      setPageText(index, " 设 计 ");
      setPartName(getEditorInput().getName()); // 设置标题
    } catch (PartInitException e) {
      ErrorDialog.openError(
          getSite().getShell(),
          "Error creating nested text editor",
          null,
          e.getStatus());
    }
  }

3.自定义FlowDiagramEditor继承GraphicalEditorWithFlyoutPalette添加我们的模型组件工具箱

import flowplugin.Activator;
import flowplugin.factory.EditPartFactory;
import flowplugin.model.HelloModel;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.gef.DefaultEditDomain;
import org.eclipse.gef.GraphicalViewer;
import org.eclipse.gef.SnapToGrid;
import org.eclipse.gef.palette.CreationToolEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteGroup;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.gef.requests.SimpleFactory;
import org.eclipse.gef.ui.parts.GraphicalEditorWithFlyoutPalette;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.plugin.AbstractUIPlugin;

public class FlowDiagramEditor extends GraphicalEditorWithFlyoutPalette {
//1.添加ID,与扩展点ID保持一致,因此为了避免出错,建议ID统一为全类名
  public static final String ID = "flowplugin.editors.FlowDiagramEditor";
  // 2.视图
  GraphicalViewer viewer;

  public FlowDiagramEditor() {
    setEditDomain(new DefaultEditDomain(this));
  }

  /**
   * 1.首先配置视图
   * 
   */
  @Override
  protected void configureGraphicalViewer() {
    super.configureGraphicalViewer();

    // 1.1 获取视图
    viewer = getGraphicalViewer();
    viewer.setProperty(SnapToGrid.PROPERTY_GRID_ENABLED, true); // 启用网格
    viewer.setProperty(SnapToGrid.PROPERTY_GRID_VISIBLE, true); // 显示网格

    // 1.2 设置EditPartFactory
    viewer.setEditPartFactory(new EditPartFactory());
  }

  /**
   * 3.配置调色板
   */
  @Override
  protected PaletteRoot getPaletteRoot() {
    // 在 Palette 中添加工具箱
    // 1.创建一个 Palette的root
    PaletteRoot root = new PaletteRoot();

    // 2.创建一个工具组用来放置常规Tool
    PaletteGroup toolGroup = new PaletteGroup("ToolGroup");

    // 3.创建一个GEF提供的Selection工具并将其放到ToolGroup中
    ToolEntry tool = new SelectionToolEntry();
    toolGroup.add(tool);
    root.setDefaultEntry(tool); // 设置该工具是缺省被选择的工具

    // 4.创建一个GEF提供的"Marquee多选"工具并将其放到toolGroup中
    tool = new MarqueeToolEntry();
    toolGroup.add(tool);

    // 5.创建一个Drawer(抽屉)放置绘图工具,该抽屉名称为"画图"
    PaletteDrawer drawer = new PaletteDrawer("画图");
    // 指定"创建HelloModel模型"工具所对应的图标
    ImageDescriptor imageDescriptor = AbstractUIPlugin
        .imageDescriptorFromPlugin(Activator.PLUGIN_ID, "/gar.ico");

    // 6.创建"创建HelloModel模型"工具
    CreationToolEntry creationEntry = new CreationToolEntry(
        "绘制HelloModel", // The character string displayed on a palette
        "创建HelloModel模型", // Tool 提示
        new SimpleFactory(HelloModel.class), // The factory which creates
        imageDescriptor, // The image of 16X16 displayed on a palette
        imageDescriptor);// The image of 24X24 displayed on a palette
    drawer.add(creationEntry); // (7)将其加到前面创建的抽屉中

    // 8.最后将创建的两组工具加到root上.
    root.add(toolGroup);
    root.add(drawer);

    return root;
  }

  @Override
  public void doSave(IProgressMonitor arg0) {
    // TODO Auto-generated method stub

  }

}

4.自定义FlowDiagramEditorInput继承IPathEditorInput, 来设置编辑器输入来源

import org.eclipse.core.runtime.IPath;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.ui.IPathEditorInput;
import org.eclipse.ui.IPersistableElement;

public class FlowDiagramEditorInput implements IPathEditorInput {

  private IPath path;

  public FlowDiagramEditorInput(IPath path) {
    this.path = path;
  }

  @Override
  public boolean exists() {
    // TODO Auto-generated method stub
    return false;
  }

  @Override
  public ImageDescriptor getImageDescriptor() {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public String getName() {
    // TODO Auto-generated method stub
    return path.toString();
  }

  @Override
  public IPersistableElement getPersistable() {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public String getToolTipText() {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public <T> T getAdapter(Class<T> arg0) {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public IPath getPath() {
    // TODO Auto-generated method stub
    return path;
  }

}

5.重写编辑器工程EditPartFactory,将我们的模型组件放入工厂中代管理

import flowplugin.control.ContentsEditPart;
import flowplugin.model.HelloModel;
import org.eclipse.gef.EditPart;

public class EditPartFactory implements org.eclipse.gef.EditPartFactory {

  @Override
  public EditPart createEditPart(EditPart context, Object model) {

    // 1.根据模型创建其对应的控制器
    EditPart part = getPartForElement(model);
    // 2.将模型存入到控制器中
    part.setModel(model);

    return part;
  }

  /**
   * Maps an object to an EditPart.
   * 
   * @throws RuntimeException if no match was found (programming error)
   */
  private EditPart getPartForElement(Object modelElement) {
    // 根据模型创建其对应的控制器
    if (modelElement instanceof HelloModel)
      return new ContentsEditPart();

    throw new RuntimeException(
        "Can't create part for model element: "
            + ((modelElement != null) ? modelElement.getClass().getName() : "null"));
  }
}

6.创建图形编辑器ContentsEditPart继承AbstractGraphicalEditPart, 可以将初始化图形添加到画面上

import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.Layer;
import org.eclipse.gef.editparts.AbstractGraphicalEditPart;

public class ContentsEditPart extends AbstractGraphicalEditPart {

  /**
   * 1.创建图形元素
   */
  @Override
  protected IFigure createFigure() {
    Layer figure = new Layer();
    return figure;
  }

  @Override
  protected void createEditPolicies() {
    // TODO Auto-generated method stub

  }

}

7.创建自定义模型HelloModel

public class HelloModel {

  /**
   * 1.展示的文本
   */
  private String text = "Hello World";

  public String getText() {
    return text;
  }

  public void setText(String text) {
    this.text = text;
  }

}

最终运行效果

源码 https://download.csdn.net/download/svygh123/12035876

发布了64 篇原创文章 · 获赞 34 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/svygh123/article/details/103576324