前一篇博客实现了展开/折叠,但是如果当节点折叠时图标可以发生变化,例如变成加号,那就直观了。这篇博客解决这个问题。
具体步骤如下:
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()方法如下:
@Override
public void undo() {
super.undo();
topicModel.setExpanded(isExpanded);
((EditPart) this.topicEditPart.getChildren().get(0)).refresh();
}
@Override
public void redo() {
super.redo();
topicModel.setExpanded(!isExpanded);
((EditPart) this.topicEditPart.getChildren().get(0)).refresh();
}
6、最终效果如下图:
最终代码在这里
来源:oschina
链接:https://my.oschina.net/u/164134/blog/153406