zoukankan      html  css  js  c++  java
  • RCP:给GEF编辑器添加网格和标尺。

    网格和标尺效果如上图所示。

    添加网格比较简单,也可以自己实现,主要思路是为编辑器添加一个GridLayer。但是还是建议参考eclipse自己的GEF样例来实现。

    需要注意两个部分:

    1、重写org.eclipse.gef.ui.parts.GraphicalEditor.configureGraphicalViewer(),加入以下部分

                getGraphicalViewer().setProperty(
                        SnapToGrid.PROPERTY_GRID_ENABLED,
                        true);
                // We keep grid visibility and enablement in sync
                getGraphicalViewer().setProperty(
                        SnapToGrid.PROPERTY_GRID_VISIBLE,
                        true);


    2、重写节点的EditPart的getAdapter方法

    if (key == SnapToHelper.class) {
                List snapStrategies = new ArrayList();
                Boolean val = (Boolean) getViewer().getProperty(
                        RulerProvider.PROPERTY_RULER_VISIBILITY);
                if (val != null && val.booleanValue())
                    snapStrategies.add(new SnapToGuides(this));
                val = (Boolean) getViewer().getProperty(
                        SnapToGrid.PROPERTY_GRID_ENABLED);
                if (val != null && val.booleanValue())
                    snapStrategies.add(new SnapToGrid(this));
                int size = snapStrategies.size();
                if (size == 0)
                    return null;
                SnapToHelper delegates[] = new SnapToHelper[size];
                for (int i = 0; i < size; i++)
                    delegates[i] = (SnapToHelper) snapStrategies.get(i);
                return new CompoundSnapToHelper(delegates);
            }

    以上即可完成添加网格。

    如果要添加标尺呢?GEF提供了RulerComposite,可以方便的完成这个操作。

    我们可以注意到,早前的那张图里,标尺是占据着整个编辑器的外层的,于是我们可以想到,只要替换编辑器的Parent Compostie为RulerComposite即可完成。

    所以,同样是重写createGraphicalViewer方法,加入一下代码:

            rulerComp = new RulerComposite(parent, SWT.NONE);
            super.createGraphicalViewer(rulerComp);
            rulerComp
                    .setGraphicalViewer((ScrollingGraphicalViewer) getGraphicalViewer());

    但是,这样还不能算是结束,还需要重写getGraphicalControl方法

        protected Control getGraphicalControl() {
            // return getGraphicalViewer().getControl();
            return rulerComp;
        }

    //事实上,这一步并不是必要的,如果你把rulerComposite作为GraphicalViewer的Control,那么,这一步就是多余的。

    完成了以上,就完成了网格和标尺的添加。

    当然,你可能会注意到你的网格和图中的田字型网格并不一致,这是因为我重写了RootEditPart并且提供了自己的GridLayer。

  • 相关阅读:
    为什么需要域驱动设计(DDD)?
    什么是无所不在的语言?
    什么是耦合?
    什么是 Spring Cloud?
    你更倾向用那种事务管理类型?
    您对微服务有何了解?
    微服务架构有哪些优势?
    微服务架构如何运作?
    @Qualifier 注解 ?
    JdbcTemplate ?
  • 原文地址:https://www.cnblogs.com/anrainie/p/4159236.html
Copyright © 2011-2022 走看看