posts - 12,  comments - 2,  trackbacks - 0
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,那么容器元素就不会被选中。
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;
    }
    第二步覆盖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(){});
}

posted on 2008-11-11 10:44 远帆 阅读(1521) 评论(0)  编辑  收藏 所属分类: Eclipse GEF

只有注册用户登录后才能发表评论。


网站导航: