GMF树形布局 3 展开/折叠时更换Node图标

不问归期 提交于 2020-04-07 12:39:49

前一篇博客实现了展开/折叠,但是如果当节点折叠时图标可以发生变化,例如变成加号,那就直观了。这篇博客解决这个问题。

具体步骤如下:

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、最终效果如下图:


最终代码在这里

双子座@开源中国


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!