Eclipse GEF常用技巧
时间:2011-09-09
1、大纲视图右键菜单项受editpart的createEditPolicies()方法影响。例如 :虽然右键菜单提供了删除选项,但只要相关的treeeditpart没有install ComponentEditPolicy,那么当鼠标打开该节点的右键菜单时,是不会看到“删除”项的。
2、和1类似,有时候某些作为容器元素的对象不希望被用户选中,也是通过修改policy来实现的。具体如下:
editpart实现
public class BoardPart extends ContainerPart {
protected void createEditPolicies() {
super.createEditPolicies();
installEditPolicy(EditPolicy.LAYOUT_ROLE, new BoardLayoutEditPolicy());
}
}
policy实现
public class BoardLayoutEditPolicy extends XYLayoutEditPolicy {
...
protected Command createChangeConstraintCommand(EditPart child,
Object constraint) {
return null;
}
...
}
从上面的代码可以看出,只要createChangeConstraintCommand()返回null,那么容器元素就不会被选中。
Eclipse GEF常用技巧(2)
时间:2011-09-09
3、如果一个或多个图元的属性校验出错,希望自动选中,那么考虑对界面元素进行校验,然后使用下面的方法:
/**
* 选中未做关联的显示框
* @param errorEls 错误显示框ArrayList
*/
private void selectErrors(ArrayList<ElementView> errorEls) {
EditPartViewer viewer = getGraphicalViewer();
viewer.deselectAll(); //去掉所有选择项
EditPart last = null;
for(ElementView element:errorEls) {
EditPart editpart = (EditPart) viewer.getEditPartRegistry().get(element);
viewer.appendSelection(editpart); //添加选择元素
last = editpart;
}
viewer.reveal(last); //将最后选中元素放到窗口可视区域
}
4、退出编辑器时提示保存
根据国际惯例,编辑器退出却未保存时,一般都会弹出对话框提示用户选择是否关闭编辑器。这时我首先想到的是覆盖父类的dispose()方法,判断未保存就返回而不退出。可实践证明,eclipse RCP并不支持这样做。经过一番探索得知,需要实现ISaveablePart2接口,在promptToSaveOnClose()添加处理。代码如下:
@Override
public int promptToSaveOnClose() {
if(this.isDirty && !UIHelper.comfirm("关闭提示", title + "还未保存,确定退出?"))
return ISaveablePart2.CANCEL;
else
return ISaveablePart2.NO;
}
5、鼠标拖动自动调用选择工具
处理此问题要从画布元素的editpart类入手。第一步修改createFigure()方法:
protected IFigure createFigure() {
...
fig.setOpaque(true);
return fig;
}
Eclipse GEF常用技巧(3)
时间:2011-09-09
第二步覆盖getDragTracker()方法:
public DragTracker getDragTracker(Request request) {
if (request instanceof SelectionRequest &&
((SelectionRequest) request).getLastButtonPressed() == 3)
{
return new DeselectAllTracker(this);
}
return new MarqueeDragTracker();
}
两个方法配合使用,否则无法达到目的。
6、如何通过editpart修改editor保存状态(不通过setDirty()实现)
由于editpart类是拿不到editor引用的,故想通过调用editor.setDirty()是不可能的。在我的项目中,拖动一个图元是可以触发修改标记,但是拖动连线后editor就不能自动设为修改状态。通过一番研究发现,可以在editpart类中增加如下方法来实现:
public void commit() {
getViewer().getEditDomain().getCommandStack().execute(new Command(){});
}
|