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(){});
}