前一篇博客实现了展开/折叠,但是如果当节点折叠时图标可以发生变化,例如变成加号,那就直观了。这篇博客解决这个问题。
具体步骤如下:
1、首先,将两个图标文件放在diagram工程下的icons\custom下,并刷新这个工程,如下图所示:
2、修改Topic节点图标的地方,在TopicNameEditPart中的getLabelIcon()方法中,需要将它修改。具体思路是:检查其父类即TopicEditPart所对应的的模型的isExpanded成员变量,如果是false,则返回加号图像,否则,返回Topic图像。
修改getLabelIcon()方法如下:
/** * @generated NOT */protected Image getLabelIcon() { EObject parserElement = getParserElement(); if (parserElement == null) { return null; } return this.createLabelIconImage();}
3、在TopicNameEditPart中添加createLabelIconImage()方法:
/** * 根据父模型,创建标签图标 */private Image createLabelIconImage() { Image labelIconImage = null; // 刚开始时,根据parentEditPart的模型中的属性,创建labelIconImage Topic parentModel = (Topic) ((View) this.getParent().getModel()) .getElement(); if (parentModel.isExpanded()) { ImageDescriptor descriptor = MindmapDiagramEditorPlugin .findImageDescriptor("icons/custom/Topic.gif"); labelIconImage = descriptor.createImage(); } else { ImageDescriptor descriptor = MindmapDiagramEditorPlugin .findImageDescriptor("icons/custom/plus.png"); labelIconImage = descriptor.createImage(); } return labelIconImage;}
4、此时运行,当展开或者折叠时图标不会马上改变,但是保存、关闭之后,再打开,图标是发生变化的。解决这个问题,需要在执行展开/折叠的命令中刷新一下节点的标签。
在ExpandOrCollapseCommand中doExecute()方法中this.doExpandOrCollapse()语句后边加上
((EditPart) this.topicEditPart.getChildren().get(0)).refresh();
5、如果这个时候再运行,执行展开或者折叠时,图标就会相应的发生变换了。但是,由于使用命令执行,当使用Redo/Undo时,图标还是不能发生改变。为了解决这个问题,想要重写ExpandOrCollapseCommand的redo()和undo()方法,但是,由于父类RecordingCommand将这两个方法设为final,不能重写。因而想到按照RecordingCommand写一个CustomRecordingCommand,在其中将这两个方法的final去掉。从网上找到了RecordingCommand的源码,按照上面将redo()和undo()方法的final去掉,然后修改ExpandOrCollapseCommand继承自CustomRecordingCommand,重写redo()和undo()方法如下:
@Overridepublic void undo() { super.undo(); topicModel.setExpanded(isExpanded); ((EditPart) this.topicEditPart.getChildren().get(0)).refresh();}@Overridepublic void redo() { super.redo(); topicModel.setExpanded(!isExpanded); ((EditPart) this.topicEditPart.getChildren().get(0)).refresh();}
6、最终效果如下图:
最终代码在