最近做了一个任务,要求把一个grahpical editor里的palette里的内容重新刷新一下,要求是在不关闭editor里前提之下。
一开始还在怀疑这个能否实现不,不过后来看了看代码,发现这是完全可行的,且看我细细道来:
先看GraphicalEditorWithFlyoutPalette里的splitter这个成员,它把整个editor分成了两个部分一个就是大的用于GEF画图的那部份;另外一部分很明显就是palette啦!说这么多,看看它的createControl方法就全明白啦:
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
其中的setExternalviewer就是放的palette的viewer,说到viewer我的第一个联想就是SWT里的viewer其实不是这样的,这里的viewer其实与一个基于GEF的Graphcial Viewer;也就是说,我们在一个graphical editor里看到的palette是通过drawer2D画上去了,和我们平时GEF里的图形没什么两样。
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
![](http://www.blogjava.net/images/blogjava_net/alanyzhang/palette_root_he.jpg)
一看palette entry的文档就明白了,其实它就是 palette的模型。
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
模型的修改必定会被通知到 edit part 里,它再根据具体的情况对viewer进行更新,见下:
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
明白了!?说了那么多其实只要一名句话啦:修改一下palette root里palette entry的内容GEF 就会自动的将palette里的表现更新了。在Dengues的项目里,我在GEFComponentEditor.java里加入以下方法,便可以了:
/**
* Reset the content of the palette root will cause palette viewer be refreshed.
*
* yzhang Comment method "refreshPalette".
*/
public void refreshPalette() {
List<PaletteContainer> containers = new ArrayList<PaletteContainer>(root.getChildren());
for (PaletteContainer element : containers) {
if (element instanceof PaletteGroup) {
continue;
}
root.remove(element);
}
CompEditorPaletteFactory.create(factory, root);
}
* Reset the content of the palette root will cause palette viewer be refreshed.
*
* yzhang Comment method "refreshPalette".
*/
public void refreshPalette() {
List<PaletteContainer> containers = new ArrayList<PaletteContainer>(root.getChildren());
for (PaletteContainer element : containers) {
if (element instanceof PaletteGroup) {
continue;
}
root.remove(element);
}
CompEditorPaletteFactory.create(factory, root);
}
关于这个方法是如何调用的,这就涉及到另外一个话题了,见《如何解决插件之间循环依赖的问题》。
K字好累。Han hanhan .....