GEF理解系列七(2)

二、放置EditManager

在GEF的EditPart里,有一个方法可以用来处理此事:performRequest();
那我们就把我们的EditManager放在这吧。如下:

      @Override

      public void performRequest(Request req) {

            if (req.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {

                  HelloWorldDirectEditManager manager = new HelloWorldDirectEditManager(

                              this, TextCellEditor.class,

                              new HelloWorldCellEditorLocator((HelloWorldModel) getModel()));

                  manager.show();

            }else{

                  super.performRequest(req);

            }

      }

OK,现在我们再试一下:

directEdit1

图一

不过编辑完退出后,发现模型图上的文本内容并没有改变:为什么?你告诉我为什么?。。。知道了吧,还是刷新问题。这个简单,已经做了老多次了。修改HelloWorldModel,如下: 4、最后一个需要修改的类就是Policy类:HelloWorldDirectEditPolicy。修改控件类型,如下:

      public static final String P_TEXT = "p_text";

      public void setText(String text) {

            String old = this.text;

            this.text = text;

            firePropertyChange(P_TEXT, old, text);

      }

修改HelloWorldEditPart的propertyChange()方法如下:

      public void propertyChange(PropertyChangeEvent evt) {

            if (evt.getPropertyName().equals(HelloWorldModel.P_CONSTRAINT)) {

                  refreshVisuals();

            } else if (evt.getPropertyName().equals(HelloWorldModel.P_SOURCE)) {

                  refreshSourceConnections();

            } else if (evt.getPropertyName().equals(HelloWorldModel.P_TARGET)) {

                  refreshTargetConnections();

            }else if(evt.getPropertyName().equals(HelloWorldModel.P_TEXT)){

                  ((Label)getFigure()).setText(((HelloWorldModel)getModel()).getText());

            }

      }


这下再编辑修改就可以了。

补充:

在Policy里有一个方法:showCurrentEditValue()。这个方法在编辑控件出现后会被调用。你可以在这个方法里做一些事情。

performRequest()方法:并不是每种请求都是发送到Policy上。有一些请求也发送到performRequest方法上。一般来说它用来处理一些并不需要立即修改model的请求,比如说显示直接编辑控件 、双击事件等等。修改模型的时候还得需要Policy和Command的参与。

CompoundComand:还有一种命令是CompoundCommand命令。可以把一系列命令放到一个CompoundCommand对象里,然后返回这个对象。这样就相当于放在其中的一系列命令都被执行了。通常会有一些使用的场景。

三、ComboboxCellEditor

我们再试一种CellEditor。把上面的TextCellEditor改为ComboboxCellEditor。

这里我们有几个地方需要修改:

1.HelloWorldDirectEditManager类里:增加一个参数在构造函数里,用来初始化Combo的元素,最终修改如下:

public class HelloWorldDirectEditManager extends DirectEditManager {


      private String[] items;


      public HelloWorldDirectEditManager(GraphicalEditPart source,

                  Class editorType, CellEditorLocator locator, String[] items) {

            super(source, editorType, locator);

            this.items = items;

      }


      @Override

      protected void initCellEditor() {

            CCombo text = (CCombo) getCellEditor().getControl();

            HelloWorldModel model = (HelloWorldModel) getEditPart().getModel();

            text.setText(model.getText());

      }


      @Override

      protected CellEditor createCellEditorOn(Composite composite) {

            try {

                  Constructor constructor = ComboBoxCellEditor.class

                              .getConstructor(new Class[] { Composite.class,

                                          String[].class });

                  return (CellEditor) constructor.newInstance(new Object[] {

                              composite, items });

            } catch (Exception e) {

                  return null;

            }

      }


      @Override

      protected boolean isDirty() {

            return !((CCombo) getCellEditor().getControl()).getText().equals(

                        ((HelloWorldModel) getEditPart().getModel()).getText());

      }

}



后面两个追加的重写方法有点奇怪是吧?我也不知道为什么我需要重写这两个方法。

没有重写上面第一个方法时,编辑控件根本不出来。这是因为缺省的它会查询CellEditor中是否有一个带Composite对象参数的构造方法,如果没有,则返回null。所以如果不重写,总是返回null,因为ComboboxCellEditor没有这类的构造方法。

重写第二个方法是因为如果不重写,它总是认为isDirty()是false,所以在commit()方法里,就直接跳出了。

不知道是不是我有哪个地方理解不对造成这样的结果。不过暂时我们先这样用着。

2.HelloWorldEditPart。显然是需要修改performRequest()方法,就是修改编辑器类的类型,再在editManager里追加一个参数,如下:

      @Override

      public void performRequest(Request req) {

            if (req.getType().equals(RequestConstants.REQ_DIRECT_EDIT)) {

                  HelloWorldDirectEditManager manager = new HelloWorldDirectEditManager(

                              this, ComboBoxCellEditor.class,

                              new HelloWorldCellEditorLocator((HelloWorldModel) getModel()),new String[]{"name1","name2"});

                  manager.show();

            }else{

                  super.performRequest(req);

            }

      }

3、修改HelloWorldCellEditorLocator类。有一点我们需要注意的是:ComboboxCellEditor里的控件是CCombo。所以不要弄错了。一开始我就写成了Combo。所以结果总是异常。这个类修改如下,其实就是把控件类型修改一下:

 

public class HelloWorldCellEditorLocator implements CellEditorLocator {

 

      private HelloWorldModel model;

 

      public HelloWorldCellEditorLocator(HelloWorldModel model) {

            super();

            this.model = model;

      }

 

      public void relocate(CellEditor celleditor) {

            CCombo text = (CCombo) celleditor.getControl();

            Rectangle constraints = model.getConstraints();

            text.setBounds(constraints.x, constraints.y, constraints.width,

                        constraints.height);

      }

}



public class HelloWorldDirectEditPolicy extends DirectEditPolicy {

 

      @Override

      protected Command getDirectEditCommand(DirectEditRequest request) {

            CCombo text = (CCombo) request.getCellEditor().getControl();

            DirectEditHelloWorldCommand command = new DirectEditHelloWorldCommand(

                        (HelloWorldModel) getHost().getModel(), text.getText().trim());

            return command;

      }

 

      @Override

      protected void showCurrentEditValue(DirectEditRequest request) {

      }

}

 最后我们的效果如下:

combo1combo2

             图:修改时                                                                                   修改后

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值