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

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

一个问题:为什么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);
}

转载于:https://www.cnblogs.com/liyuhui20093357/p/3753079.html

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

  1. 为什么我直接在servlet里面直接输出message不乱码,而跳转到web页面就出现乱码,而且存到数据库的也是乱码,我尝试了网上的各种方法,还是不成功。。

    为什么我直接在servlet里面直接输出message不乱码,而跳转到web页面就出现乱码,而且存到数据库的也是乱码,我尝试了网上的各种方法,还是不成功.. public class HandleRe ...

  2. 局域网-无法访问网上邻居解决方法

    局域网-无法访问网上邻居解决方法在局域网内安装了WindowsXP的电脑不能与安装了Windows98的电脑互相访问,安装了WindowsXP的电脑与安装了WindowsXP的电脑也不能互相通信.在工 ...

  3. RedisDesktopManager死活连接不上,网上的各种方法都失败了,可能于网络策略配置有关!!!

    RedisDesktopManager死活连接不上,网上的各种方法都失败了,可能于网络策略配置有关!!! ** PS:如果你尝试了网上其他的方法都失败了,那请试一下这个方法** 在保证redis端口能 ...

  4. 【Java从零到架构师第③季】【26】SpringMVC-反射获取方法参数名_SpringMVC是如何获取方法的参数名的

    持续学习&持续更新中- 守破离 [Java从零到架构师第③季][26]SpringMVC-反射获取方法参数名_SpringMVC是如何获取方法的参数名的 利用反射获取方法的参数名 直接编译 修 ...

  5. ipv4改完保存不成功_win7系统没法保存修改后IP地址的解决方法

    很多小伙伴都遇到过win7系统没法保存修改后IP地址的困惑吧,一些朋友看过网上零散的win7系统没法保存修改后IP地址的处理方法,并没有完完全全明白win7系统没法保存修改后IP地址是如何解决的,今天 ...

  6. 电脑DNS修改后被重新还原的解决方法

    电脑DNS修改后被重新还原的解决方法 最近要连公司内网,老是连上之后却不能上网,很苦恼找不到原因,最后在网上搜索到可能存在的原因...具体啥我也说不清楚. 但是有解决方案就行了. 比如是这样的,选择自 ...

  7. DOM中setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式。

    setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式. <html> <head> <script type="text/javascript ...

  8. 子报表修改后需要重新导入,0.00显示.00的调整方法

    水晶报表笔记:     子报表修改后需要重新导入     0.00显示.00的调整方法:数字格式的内容,右键,设置对象格式, 自定义,前导值 勾上,默认值,选择0 转载于:https://www.cn ...

  9. ListView与.FindControl()方法的简单练习 #2 -- ItemUpdting事件中抓取「修改后」的值

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/24/listview_itemupdating_findcontrol_201 ...

最新文章

  1. Asp.Net 学习资源列表
  2. 街电与搜电网络营销外包合并,怪兽充电终上市共享充电市场将迎来新变化
  3. IAR 不能使用go to 的解决方法
  4. 面试软件设计人员的方法,附面试题。我的面试注重实效
  5. java并发编程实战-第三章-对象的共享
  6. Ubuntu设置root登录
  7. N进制的规范十进制表示(洛谷P2084题题解,Java语言描述)
  8. 【Python】Numpy中伪随机数的简单使用
  9. react native开发的新闻客户端
  10. gromacs manual_GROMACS蛋白配体分子动力学模拟结果分析简要笔记
  11. cad四级计算机考试,国家CAD等级考试介绍
  12. gooflow学习笔记
  13. c语言mooc gps数据处理的数据_利用智能手机GPS测量地球半径
  14. IE8中怎样使用脚本隐藏弹出窗口的地址栏
  15. win10的系统mysql服务器地址,win10注册mysql服务器地址
  16. 虚拟主机3种方式nginx/apache+跨域知识点整理
  17. C++ 输入输出(cin cout)加速/效率优化
  18. 读《当我跑步时,我在想什么》有感
  19. 基于motion视频捕捉软件的树莓派视频拍照系统(图像变化识别+拍照+邮件)
  20. 自制电脑usb红外遥控键盘

热门文章

  1. 在生成.net core 3.0程序时不包含nuget库
  2. C# MVC 用户登录状态判断
  3. 浙大1002Fire Net心得
  4. QTP报错“缺少对象WScript”
  5. 解题报告: LeetCode Max Points on a Line
  6. python操作Excel文件
  7. CSS3实现静态和动态效果
  8. [React] 尚硅谷 -- 学习笔记(一)
  9. Python for循环语句总结
  10. 相机标定(3) opencv中solvePnPRansac()和solvePnP()计算外参数