??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品天堂,在这里有精品,国产精品一卡 http://www.aygfsteel.com/alanyzhang/Dengues Studio
开?用代码说?/description>zh-cn Fri, 04 Jul 2025 06:15:41 GMT Fri, 04 Jul 2025 06:15:41 GMT 60 [DENGUES]如何解决插g之间的@环依赖问?/title> http://www.aygfsteel.com/alanyzhang/archive/2007/11/20/157530.html张飞刀(Dengues Studio) 张飞刀(Dengues Studio) Tue, 20 Nov 2007 05:19:00 GMT http://www.aygfsteel.com/alanyzhang/archive/2007/11/20/157530.html http://www.aygfsteel.com/alanyzhang/comments/157530.html http://www.aygfsteel.com/alanyzhang/archive/2007/11/20/157530.html#Feedback 2 http://www.aygfsteel.com/alanyzhang/comments/commentRss/157530.html http://www.aygfsteel.com/alanyzhang/services/trackbacks/157530.html 如果两个插g出现双向的独立性关联就形成了@环依赖,Dengues利用Eclipse扩展Ҏ式解册个问题?br />
首先来介l一下原理。Eclipse在启动的时候会所有的扩展点实现加载到一个注册表里面Q这里注册的东西可以是一个类Q就像是我们通过扩展点的方式实现一个Viewer一P我们不仅要写入相应的iconq要写入相关的指定的cR?br />
同样道理Q如果我们可以定义一个扩展点Q在Eclipse启动的时候把实现了这个扩展点的类加蝲C个核心插仉。如果别的插件如果要用这个类的话Q直接加入对之个核心插g的依赖不可以了从而回避了对这个插件直接的依赖见下图:
在图1里A插g要引用B插g里的c,同样B插g也有需求要引用A插g里的c,q样造成了插件的循环依赖。现在利用扩展点Q在AQB插g里实C个定义于Core插g里的扩展点,在Eclispe启动的时候,实现了此扩展点的cd可以被加载到Core插g里。通过Core的桥梁作用A、B插g便可以实现类的相互引用。这里A、B插g只是对Core有一个单向的依赖关系Q通过core插g的帮助A与之间可以怺调,避免了直接的调用所以也׃会Ş成@环依赖了?br />
一、扩展点的定义:
点击q入org.dengues.core插g的plugin.xml 文g,打开Extension Point标签Q点Add加入一个扩展点输入如下信息Q?br />
在Definition里加一个叫做Service的element,q加入两条use栏ؓreuqired的属性如下图所C:
其中serviceClass的Type要选成java,q且在Implements里定义一个接口,q个接口规定了这个扩展点在实现的时候指定的cR这里ؓIDenguesService。其实接口里什么也没方法也没有定义Q只是一个申明而已?br />
package org.dengues.core;
public interface IDenguesService {
String ID = " org.dengues.commons.denguesService " ; // $NON-NLS-1$
String SERVICE_CLASS = " serviceClass " ; // $NON-NLS-1$
String SERVICE_ID = " serviceID " ; // $NON-NLS-1$
}
二、实现扩展点。具体怎么用一个扩展点Q这里就不用多说了,只重点介l一下怎么实现IDenguesServicecR我们以Dengues里的org.dengues.design.core插gZ。在org.dengues.core里我们我Z个IDenguesService的子接口IDesignerCoreServiceQƈ写入我们要向其它plugin公开的方法?br />
public interface IDesignerCoreService extends IDenguesService {
public IComponentsFactory getComponentsFactory();
public IComponentFilesNaming getComponentFilesNaming();
public void initializeTemplates();
public ICodeGenerator getCodeGenerator(ICompProcess process);
public ICodeGenerator getCodeGenerator();
public IJavaETLProcessor getJavaProcessor(ICompProcess process);
public IJavaETLProcessor getJavaProcessor();
// public Action createStartHsqldbServer(String dbName);
public Action createStartHsqldbServer();
public boolean checkHsqldbConnection();
public void runSqlScript(IFile scriptFile);
public DatabaseContainer getHsqlDatabase() throws SQLException;
public Connection getCurrentConnection() throws SQLException, CoreException, ClassNotFoundException;
}
以上q些Ҏ是org.dengues.designer.coreq个插g惌对其它插件公开的方法了Q它的实现自然会被写入到q个插g里了。这D代码很多,我们׃列在q里了,如果有兴的朋友可以到我们Dengues的google svn去check out代码。写好对IDesignerCoreService的实C后,我们可以把它加入到事先我们定义好的扩展炚w了,见下图:
图中的DesignerCoreService是IDesingerCoreService的实现。好了,当Eclipse启动的时候它׃把这个类加蝲到注册表里了Q我们可以从q个注册里取到这个类了。那以后如果我们想从q个plugin里向外公开一些方法的话,可以通过向IDesignerCoreService写入相应的方法,在DesignerCoreService里写入相应的实现可以了?br />
三、从注册表里取出扩展点的cR?br />
在org.dengues.core里我们写了一个GlobalServiceFactory里面提供了相应的代码Q?br />
static {
IExtensionRegistry registry = Platform.getExtensionRegistry();
configurationElements = registry.getConfigurationElementsFor(IDenguesService.ID); // $NON-NLS-1$
}
/** */ /**
* Comment method "getService".Gets the specific IService.
*
* @param klass the Service type you want to get
* @return IService IService
*/
public IDenguesService getService(Class klass) {
IDenguesService service = services.get(klass);
if (service == null ) {
service = findService(klass);
if (service == null ) {
throw new RuntimeException( " GlobalServiceRegister.ServiceNotRegistered " + klass.getName()); // $NON-NLS-1$
}
services.put(klass, service);
}
return service;
}
如果我们要取刚才定义好的那个IDesignerCoreService的话Q我们可以按如下方式取到Q?br />
public IDesignerCoreService getDesignerCoreService() {
IDenguesService service = GlobalServiceFactory.getDefault().getService(IDesignerCoreService. class );
return (IDesignerCoreService) service;
}
其实D代码是写在org.dengues.core插g里的CorePlugin里的Q也是说在M一个插仉只要加入了对org.dengues.core的依赖都可以通过CorePlguin.getDefault().getDesignerCoreService()来得到IDesignerCoreService的实例了?br />
]]>[DENGUES]怎样生成一个Eclipse的update website?/title> http://www.aygfsteel.com/alanyzhang/archive/2007/10/30/156980.html张飞刀(Dengues Studio) 张飞刀(Dengues Studio) Tue, 30 Oct 2007 09:28:00 GMT http://www.aygfsteel.com/alanyzhang/archive/2007/10/30/156980.html http://www.aygfsteel.com/alanyzhang/comments/156980.html http://www.aygfsteel.com/alanyzhang/archive/2007/10/30/156980.html#Feedback 5 http://www.aygfsteel.com/alanyzhang/comments/commentRss/156980.html http://www.aygfsteel.com/alanyzhang/services/trackbacks/156980.html
Eclipse里有一功能就是通过update site直接插件从|上下蝲到自qIDE里,使用h方便省时Q^时只是这L别h的插Ӟ那如果自己开发了一个插Ӟ惌别h通过q种方式下蝲q用可以吗Q答案当然是肯定的?br />
首先要创Z个feature工程Q步骤如下:
1Q在New Project Wizard选择Feature ProjectQ点一下步?br />
2Q写入feature工程的名字比?org.dengues.feature
3Q在W二里保持ID为org.dengues.feature.名字改为Dengues Feature.
4)选中要关联的插gQ在q里我选择了所有的dengues目插gQ如下:
点击finishq样创建好了一个feature插g了。这里简单的介绍一下feature有什么用Qfeature可以把其它的一个或者多个插件组合到一P以便于用户对插g的加载,理Q命名就像是对一个单元进行操作一栗当然也包括可以方便用于发布到网上?br />
做好feature插g以后Q就是要往里面写入相应的信息喽Q里面包括版权,可访问网站什么的东东Q填好以后就可以q入下一步创Z个update site project了?br />
创徏的步骤很单就不再详细说明了,工程名就叫org.dengues.update吧?br />
创徏完成之后Q在site map里加入一个category,q将我们刚才做好的feature加到q个category里面。就成了下面的样子:
选中刚加入的feature选buildQ完成之后这个update site project的结构就变成了这栗?br />
把这个工E下的所有文件直接拷到要发布的网|务器上就要以了,q样你就以通过Eclipse讉Kq个|站来更C的插件了不信你试Q简单吧Q?br />
]]> [DENGUES]动态的hPalette里的内容 http://www.aygfsteel.com/alanyzhang/archive/2007/10/26/155368.html张飞刀(Dengues Studio) 张飞刀(Dengues Studio) Fri, 26 Oct 2007 05:32:00 GMT http://www.aygfsteel.com/alanyzhang/archive/2007/10/26/155368.html http://www.aygfsteel.com/alanyzhang/comments/155368.html http://www.aygfsteel.com/alanyzhang/archive/2007/10/26/155368.html#Feedback 0 http://www.aygfsteel.com/alanyzhang/comments/commentRss/155368.html http://www.aygfsteel.com/alanyzhang/services/trackbacks/155368.html
一开始还在怀疑这个能否实CQ不q后来看了看代码Q发现这是完全可行的Q且看我l细道来Q?br />
先看GraphicalEditorWithFlyoutPalette里的splitterq个成员Q它把整个editor分成了两个部分一个就是大的用于GEFd的那部䆾Q另外一部分很明昑ְ是palette啦!说这么多Q看看它的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的viewerQ说到viewer我的W一个联惛_是SWT里的viewer其实不是q样的,q里的viewer其实与一个基于GEF的Graphcial ViewerQ也是_我们在一个graphical editor里看到的palette是通过drawer2DMMQ和我们qxGEF里的囑Ş没什么两栗?br />
/** */ /**
* Returns the PaletteRoot for the palette viewer.
* @return the palette root
*/
protected abstract PaletteRoot getPaletteRoot();
再看q个getPaletteRootҎ它ؓpalette viewer提供一个root,那这个root到底是什么呢Q我们再l箋往下看。沿着palette root的承树往上找Q最后发Cq个Q?br />
一看palette entry的文档就明白了,其实它就?palette的模型?br />
/** */ /**
* Root class (statically) for the palette model.
*
* @author Pratik Shah
*/
public class PaletteEntry {
当然如果它是GEF的模型,那么必然他就会有listeners一查代码,果真是这L?br />
/** */ /**
* 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);
}
那么q个add listenerҎ被谁用呢Q想都不用想了,肯定是被它的edit part 喽,MVC嘛~~~不信看PaletteEditPart.java的activateҎQ?br />
/** */ /**
* @see org.eclipse.gef.editparts.AbstractGraphicalEditPart#activate()
*/
public void activate() {
super .activate();
PaletteEntry model = (PaletteEntry)getModel();
model.addPropertyChangeListener( this );
traverseChildren(model, true );
}
模型的修改必定会被通知?edit part 里,它再Ҏ具体的情况对viewerq行更新Q见下:
/** */ /**
* @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();
}
明白??说了那么多其实只要一名句话啦Q修改一下palette root里palette entry的内容GEF ׃自动的将palette里的表现更新了。在Dengues的项目里Q我在GEFComponentEditor.java里加入以下方法,便可以了Q?br />
/**
* 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);
}
关于q个Ҏ是如何调用的Q这涉及到另外一个话题了Q见《如何解x件之间@环依赖的问题》?br />
K字好累。Han hanhan .....
]]>
վ֩ģ壺
|
ɶ |
ٲ |
Զ |
|
|
ͬ |
|
괨 |
ʹ |
Ԫ |
|
|
|
|
Ϫ |
ɽ |
Ӫɽ |
ϳ |
|
ӥ̶ |
ͺ |
Ͷ |
¤ |
ɽ |
ϰ |
ƽ |
ϽϽ |
ɽ |
ᶫ |
|
|
|
ɽ |
|
|
|
ɽ |
|
|
|