快速业务通道

[Eclipse]GEF入门系列(十、表格的一个实现) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

[Eclipse]GEF入门系列(十、表格的一个实现)

时间:2011-04-19 cnblogs bjzhanghao

在目前的GEF版本(3.1M6)里,可用的LayoutManager还不是很多,在新闻组里经常会看 到要求增加更多布局的帖子,有人也提供了自己的实现,例如这个GridLayout,相当于SWT中 GridLayout的Draw2D实现,等等。虽然可以肯定GEF的未来版本里会增加更多的布局供开发者 使用(可能需要很长时间),然而目前要用GEF实现表格的操作还没有很直接的办法,这里说 说我的做法,仅供参考。

实现表格的方法决定于模型的设计,初看来我们似乎应该有这些类:表格(Table)、行 (Row)、列(Column)和单元格(Cell),每个模型对象对应一个EditPart,以及一个 Figure,TablePart应该包含RowPart和ColumnPart,问题是RowFigure和ColumnFigure会产生 交叉,想象一下你的表格该使用什么样的布局才能容纳它们?使用这样的模型并非不能实现 (例如使用StackLayout),但我认为这样的模型需要做的额外工作会很多,所以我使用基于 列的模型。

在我的表格模型里,只有三种对象:Table、Column和Cell,但Column有一个子类 HeaderColumn表示第一列,同时Cell有一个子类HeaderCell表示位于第一列里的单元格,后 面这两个类的作用主要是模拟实现对行的操作--把对行的操作都转换为对HeaderCell的操作 。例如,创建一个新行转换为在第一列中增加一个新的单元格,当然在这同时我们要让程序 给其余每一列同样增加一个单元格。

[Eclipse]GEF入门系列(十、表格的一个实现) - 编程入门网

图1 表格编辑器

现在的问题就是怎样让用户察觉不到我们是在对单元格而不是对行操作。需要修改的地方 有这么几处:一是创建新行或改变行位置时显示与行宽一致的插入提示线,二是在用户点击 位于第一列中的单元格(HeaderCell)时显示为整个行被选中,三是允许用户通过鼠标拖动 改变行高度,最后是在改变行所在位置或大小的时候显示正确的回显(Feedback)图形。下 面依次介绍它们的实现方法。

调整插入线的宽度

在我们的调色板里有一个Row工具项,代表表格中的一个行,它的作用是创建新的行。注 意这个工具项的名字虽然叫Row,实际上用它创建的是一个HeaderCell对象,创建它的代码如 下:

tool = new CombinedTemplateCreationEntry("Row", "Create a new Row", HeaderCell.class, new SimpleFactory(HeaderCell.class), CbmPlugin.getImageDescriptor(IConstants.IMG_ROW), null);

创建新行的方式是从调色板里拖动它到想要的位置。在拖动过程中,随着鼠标所在位置的 变化,编辑器应该能显示一条直线,用来表示如果此时放开鼠标新行将插入的位置。由于这 个工具代表的是一个单元格,所以缺省情况下GEF会显示一条与单元格长度相同的插入线,为 了让用户感觉到是在插入行,我们必须改变插入线的宽度。具体的方法是在 HeaderColumnPart的负责Layout的那个EditPolicy(继承FlowLayoutEditPolicy)中覆盖 showLayoutTargetFeedback()方法,修改后的代码如下:

protected void showLayoutTargetFeedback(Request request) {    super.showLayoutTargetFeedback(request);    // Expand feedback line''s width    Diagram diagram = (Diagram) getHost().getParent().getModel();    Column column = (Column) getHost().getModel();    Point p2 = getLineFeedback().getPoints().getPoint(1);    p2.x = p2.x + (diagram.getColumns().size() - 1) * (column.getWidth() + IConstants.COLUMN_SPACING);    getLineFeedback().setPoint(p2, 1); }

[Eclipse]GEF入门系列(十、表格的一个实现)(2)

时间:2011-04-19 cnblogs bjzhanghao

其中p2代表插入线中右边的那个点,我们将它的横坐标加上一

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号