`
bencode
  • 浏览: 107486 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

代码摘录: 关于 WorkbenchLabelProvider 以及 BaseWorkbenchContentProvi

阅读更多
java 代码
 
  1. // 在这里找 package org.eclipse.ui.model;  
  2. public class WorkbenchLabelProvider extends LabelProvider implements  
  3.         IColorProvider, IFontProvider {   // 嘿,  啥都有了  
  4.     
  5.     ...  
  6.   
  7.     public final String getText(Object element) {  
  8.         //query the element for its label  
  9.         IWorkbenchAdapter adapter = getAdapter(element);    // 需要一个 IWorkbenchAdapter 呀  
  10.         if (adapter == null) {  
  11.             return "";  
  12.         }  
  13.         String label = adapter.getLabel(element);  
  14.   
  15.         //return the decorated label  
  16.         return decorateText(label, element);  
  17.     }  
  18.   
  19.     protected IWorkbenchAdapter getAdapter(Object element) {  
  20.         if (!(element instanceof IAdaptable)) {   // 这里的实现为何是这样? 我们的Model一定要实现IAdaptable? 虽然这样,但我觉得侵入了Model,不好, 虽然这里可能引入是UI Model,但这却增加了复杂性。  
  21. 我觉得这一步实现不好[还好它是方法是保护的,竟味着我们可以在子类中重写它,见下面]。  
  22.             return null;  
  23.         }  
  24.         return (IWorkbenchAdapter) ((IAdaptable) element)  
  25.                 .getAdapter(IWorkbenchAdapter.class);  
  26.     }  
  27.   
  28.      
  29.   
  30.     ...  
  31. }  


下面看看 IWorkbenchAdapter, 其实不用看也应该想得到里面有啥(上面有调用过)

java 代码
 
  1. // package org.eclipse.ui.model;  
  2. public interface IWorkbenchAdapter {  
  3.     public Object[] getChildren(Object o);  
  4.   
  5.     public ImageDescriptor getImageDescriptor(Object object);  
  6.   
  7.     public String getLabel(Object o);  
  8.   
  9.     public Object getParent(Object o);  
  10. }  

WorkbenchLabelProvider 当然还有其他方法:getImage 等,与getText()类似

java 代码
 
  1. // 还是在这里 package org.eclipse.ui.model;  
  2. public class BaseWorkbenchContentProvider implements ITreeContentProvider {  
  3.     ...  
  4.     public Object[] getChildren(Object element) {    // 哈,与上面的getText一样,如法炮制  
  5.         IWorkbenchAdapter adapter = getAdapter(element);  
  6.         if (adapter != null) {  
  7.             return adapter.getChildren(element);  
  8.         }  
  9.         return new Object[0];  
  10.     }  
  11.   
  12.     public Object[] getElements(Object element) {  
  13.         return getChildren(element);  
  14.     }  
  15.     ...  
  16.   
  17. }  


上面注释是我不解的地方,

其实...

java 代码
 
  1. Platform.getAdapterManager(). registerAdapters(adapterFactory, ...);  
  2.   
  3. // package org.eclipse.core.runtime;  
  4. public interface IAdapterFactory {  
  5.   
  6.     public Object getAdapter(Object adaptableObject, Class adapterType);  
  7.   
  8.     public Class[] getAdapterList();  
  9. }  


通过上面。我们可以把“扩展”动态地“插入”

然后可以通过 I
AdapterManager#getAdapter(Object adaptable, Class adapterType) 取得需要的东西。

又一个间接层,

这个机制是好的,具有扩展性,而又不具有浸入性。
可是
WorkbenchLabelProvider 和 BaseWorkbenchContentProvider的getAdapter()方法在发现 Model 没有实现IAdaptable的时,直接返回null,而不再问问 AdapterManager, 如果问一下,那么将会灵活得多(竟味着功能够动态地插入).

所以:

我写下如下代码:

java 代码
 
  1. public MyWorkbenchLabelProvider extends  WorkbenchLabelProvider {  
  2.     protected IWorkbenchAdapter getAdapter(Object element) {  
  3.         IWorkbenchAdapter adapter = super.etAdapter(element);  
  4.         if (adapter == null) {  
  5.            adapter = (IWorkbenchAdapter ) Platform.getAdapterManager().getAdapter(element, IWorkbenchAdapter.class);  
  6.         }  
  7.         return adapter;  
  8.     }  
  9. }  


当然, BaseWorkbenchContentProvider也应该这样。

我觉得所有使用IAdaptable机制的,应该都要这样做.

而且 AdapterManager 似乎做得有点不够,看其代码:

java 代码
 
  1. // package org.eclipse.core.internal.runtime。AdapterManager  
  2.   
  3.     public Object getAdapter(Object adaptable, Class adapterType) {  
  4.         IAdapterFactory factory = (IAdapterFactory) getFactories(adaptable.getClass()).get(adapterType.getName());  
  5.         Object result = null;  
  6.         if (factory != null)  
  7.             result = factory.getAdapter(adaptable, adapterType);  
  8.         if (result == null && adapterType.isInstance(adaptable))  
  9.             return adaptable;  
  10.         return result;  
  11.     }  


最好的是。先看看这个类是否已经实现了 IAdaptable, 如果是,先问一下嘛,然后再去 Factory 里看看。
分享到:
评论
4 楼 bencode 2007-01-31  
引用
Lavi     2007-01-12 16:05
Eclipse 3.3M4里面,WorkbenchLabelProvider类的getAdapter方法已经变成了:


代码
protected final IWorkbenchAdapter getAdapter(Object o) {  
        return (IWorkbenchAdapter)Util.getAdapter(o, IWorkbenchAdapter.class);  
    }[ 


这样model就不用实现IAdaptable了,注册一个AdapterFactory就可以解决问题。不太清楚这个变化是从哪个版本引入的。


Eclipse 3.3M4里有更改的话, 那就没问题了.
嘿, 我也是开发过程中看代码才知道的.
3 楼 Lavi 2007-01-12  
Eclipse 3.3M4里面,WorkbenchLabelProvider类的getAdapter方法已经变成了:
protected final IWorkbenchAdapter getAdapter(Object o) {
        return (IWorkbenchAdapter)Util.getAdapter(o, IWorkbenchAdapter.class);
    }[

这样model就不用实现IAdaptable了,注册一个AdapterFactory就可以解决问题。不太清楚这个变化是从哪个版本引入的。
2 楼 bencode 2006-12-17  
我刚刚搬到这里,所以不知道,嘿,现在全Code起来了,谢谢!
1 楼 lighter 2006-12-17  
代码code起来啊,好看一些

相关推荐

Global site tag (gtag.js) - Google Analytics