二、放置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);
}
}
图一
不过编辑完退出后,发现模型图上的文本内容并没有改变:为什么?你告诉我为什么?。。。知道了吧,还是刷新问题。这个简单,已经做了老多次了。修改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) {
}
}
最后我们的效果如下:
图:修改时 修改后