Eclipse Plugin Dev
Dengues Studio 开源 用代码说话
My Links
BlogJava
首页
新随笔
联系
聚合
管理
Blog Stats
Posts - 3
Stories - 0
Comments - 7
Trackbacks - 0
News
Dengues Studio 是以项目为支撑的学习与实践Eclipse插件开发的很好的开源项目,你有什么想法都可以通过这个项目表现出来。
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(1)
给我留言
查看公开留言
查看私人留言
我参与的团队
Dengues工作室(0/0)
随笔档案
2007年11月 (1)
2007年10月 (2)
搜索
最新评论
1. re: [DENGUES]怎样生成一个Eclipse的update website。
学习了,很好,欢迎交流
http://surenpi.com
--suren
2. re: [DENGUES]怎样生成一个Eclipse的update website。
把这个工程下的所有文件直接拷到要发布的网页服务器上,难道不是先把插件工程打包成jar包再放到网页上吗
--landi
3. re: [DENGUES]如何解决插件之间的循环依赖问题
好贴,值得收藏
--zDevil(Dengues Studio)
4. re: [DENGUES]如何解决插件之间的循环依赖问题
确实是经验之精华,顶.
--jackgogogo
5. re: [DENGUES]怎样生成一个Eclipse的update website。
不错哦
--欢乐猪
阅读排行榜
1. [DENGUES]怎样生成一个Eclipse的update website。(1635)
2. [DENGUES]如何解决插件之间的循环依赖问题(1630)
3. [DENGUES]动态的刷新Palette里的内容(1321)
评论排行榜
1. [DENGUES]怎样生成一个Eclipse的update website。(5)
2. [DENGUES]如何解决插件之间的循环依赖问题(2)
3. [DENGUES]动态的刷新Palette里的内容(0)
[DENGUES]动态的刷新Palette里的内容
最近做了一个任务,要求把一个grahpical editor里的palette里的内容重新刷新一下,要求是在不关闭editor里前提之下。
一开始还在怀疑这个能否实现不,不过后来看了看代码,发现这是完全可行的,且看我细细道来:
先看GraphicalEditorWithFlyoutPalette里的splitter这个成员,它把整个editor分成了两个部分一个就是大的用于GEF画图的那部份;另外一部分很明显就是palette啦!说这么多,看看它的createControl方法就全明白啦:
public
void
createPartControl(Composite parent)
{
splitter
=
new
FlyoutPaletteComposite(parent, SWT.NONE, getSite().getPage(),
getPaletteViewerProvider(), getPalettePreferences());
super
.createPartControl(splitter);
splitter.setGraphicalControl(getGraphicalControl());
if
(page
!=
null
)
{
splitter.setExternalViewer(page.getPaletteViewer());
page
=
null
;
}
}
其中的setExternalviewer就是放的palette的viewer,说到viewer我的第一个联想就是SWT里的viewer其实不是这样的,这里的viewer其实与一个基于GEF的Graphcial Viewer;也就是说,我们在一个graphical editor里看到的palette是通过drawer2D画上去了,和我们平时GEF里的图形没什么两样。
/** */
/**
* Returns the PaletteRoot for the palette viewer.
*
@return
the palette root
*/
protected
abstract
PaletteRoot getPaletteRoot();
再看这个getPaletteRoot方法它为palette viewer提供一个root,那这个root到底是什么呢?我们再继续往下看。沿着palette root的继承树往上找,最后发现了这个:
一看palette entry的文档就明白了,其实它就是 palette的模型。
/** */
/**
* Root class (statically) for the palette model.
*
*
@author
Pratik Shah
*/
public
class
PaletteEntry
{
当然如果它是GEF的模型,那么必然他就会有listeners一查代码,果真是这样的。
/** */
/**
* A listener can only be added once. Adding it more than once will do nothing.
*
@param
listener the PropertyChangeListener that is to be notified of changes
*
@see
java.beans.PropertyChangeSupport#addPropertyChangeListener(
* java.beans.PropertyChangeListener)
*/
public
void
addPropertyChangeListener(PropertyChangeListener listener)
{
listeners.removePropertyChangeListener(listener);
listeners.addPropertyChangeListener(listener);
}
那么这个add listener方法被谁用呢?想都不用想了,肯定是被它的edit part 喽,MVC嘛~~~不信看PaletteEditPart.java的activate方法:
/** */
/**
*
@see
org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate()
*/
public
void
activate()
{
super
.activate();
PaletteEntry model
=
(PaletteEntry)getModel();
model.addPropertyChangeListener(
this
);
traverseChildren(model,
true
);
}
模型的修改必定会被通知到 edit part 里,它再根据具体的情况对viewer进行更新,见下:
/** */
/**
*
@see
java.beans.PropertyChangeListener#propertyChange(PropertyChangeEvent)
*/
public
void
propertyChange(PropertyChangeEvent evt)
{
String property
=
evt.getPropertyName();
if
(property.equals(PaletteContainer.PROPERTY_CHILDREN))
{
traverseChildren((List)evt.getOldValue(),
false
);
refreshChildren();
traverseChildren((List)evt.getNewValue(),
true
);
}
else
if
(property.equals(PaletteEntry.PROPERTY_LABEL)
||
property.equals(PaletteEntry.PROPERTY_SMALL_ICON)
||
property.equals(PaletteEntry.PROPERTY_LARGE_ICON)
||
property.equals(PaletteEntry.PROPERTY_DESCRIPTION))
refreshVisuals();
}
明白了!?说了那么多其实只要一名句话啦:修改一下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);
}
关于这个方法是如何调用的,这就涉及到另外一个话题了,见《如何解决插件之间循环依赖的问题》。
K字好累。Han hanhan .....
posted on 2007-10-26 13:32
小张飞刀(Dengues Studio)
阅读(1321)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问