5.26在网上看到的方法,实现图形缩放、对齐、图形修改后进行dirty check。(未实验过)

时间:2022-02-26 21:54:54

目标:1. 使用ZoomManager来执行图形的缩放
2. 对图形进行对齐(Alignment)操作
3. 图形修改后进行dirty check(提示保存文档)

 

图形缩放
提供缩放能力的方法就是设置根图形的RootEditPart为ScalableRootEditPart。一般在Editor的configureGraphicalViewer()方法中设置RootEditPart。
ScalableRootEditPart提供了一个ZoomManager类用来管理图形的缩放操作。
通过该ZoomManager,我们可以创建出实现缩放的Actions(ZoomInActionZoomOutAction)。

一个问题:为什么ZoomInAction的注册工作放在configureGraphicalViewer()方法中而不是前面注册DirectEditAction时用到的createActions()方法?
因为createActions()方法是Editor的init()函数调用的,而configureGraphicalViewer()方法是Editor的createPartControl()方法调用的,创建EditorPart时init()函数先于createPartControl()函数被调用。由于我们创建ZoomInAction需要用到ScalableRootEditPart提供的ZoomManager,所以只能容忍这个不统一的地方了。

还可以用ZoomComboContributionItem实现缩放比例组合框。
值得注意的是ZoomComboContributionItem会在part激活时设置它所需要的ZoomManager,通过(ZoomManager)part.getAdapter(ZoomManager.class)这样的手段。所以所有需要使用该组合框的视图或编辑器都需要实现getAdapter方法,以返回正确的ZoomManager实例。
public Object getAdapter(Class type) {
    if (type == ZoomManager.class) {
        return ((ScalableRootEditPart) getGraphicalViewer().getRootEditPart()).getZoomManager();
    }
    return super.getAdapter(type);
}

图形对齐
GEF的图形对齐非常简单,直接使用AlignmentAction类即可。
protected void createActions() {
    super.createActions();
    ActionRegistry registry = getActionRegistry();
    IAction action = new AlignmentAction((IWorkbenchPart) this, PositionConstants.LEFT);
    registry.registerAction(action);
    getSelectionActions().add(action.getId());
    ......}
通过把action加入selection actions list使得该action可以响应选择改变(selection change)事件从而更新自己的状态。如果不加这句代码,左对齐工具按钮永远都是灰色的

Dirty Check:
由于所有的操作都是由CommandStack管理的,所以通过CommandStack的isDirty()方法就可以得知Editor是否有发生修改。

此外再让DiagramEditor重载以下两个方法
public void doSave(IProgressMonitor monitor) {
    getCommandStack().markSaveLocation();
}
public void commandStackChanged(EventObject event) {
    firePropertyChange(PROP_DIRTY);
    super.commandStackChanged(event);
}