`
bencode
  • 浏览: 109660 次
  • 性别: 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起来啊,好看一些

相关推荐

    2023年基金四季报摘录:百亿基金经理如何看市场焦点?.pdf

    2023年基金四季报摘录:百亿基金经理如何看市场焦点?

    摘录:Ext Js 简单入门(淡入淡出、波纹效果)

    在"摘录:Ext Js 简单入门(淡入淡出、波纹效果)"这篇博文中,作者主要介绍了如何利用Ext Js实现两种常见的视觉效果:淡入淡出和波纹效果。下面将详细探讨这两个主题。 **淡入淡出效果** 在网页设计中,淡入淡出效果...

    摘录::cyclone:安全,高性能,用户友好和轻量级的Haskell标准库

    通过使用Cyclone,Haskell开发者能够享受到更加可靠的编程环境,同时提高代码的执行效率和可维护性。如果你是Haskell开发者,了解并尝试Cyclone Prelude将有助于提升你的开发实践,并可能开启新的编程视角。

    VB.NET常用技巧代码(自己摘录)

    在VB.NET编程中,有很多实用的技巧可以帮助我们提高效率并简化代码。以下是一些关键知识点,结合提供的代码片段进行详细解释: 1. **焦点切换计算**: 在这个例子中,`TextBox1_TextChanged`事件处理程序展示了...

    简易的VB短信发送代码,支持PDU编码,AT测试终端

     其它代码释义摘录:  看是否是AT命令或者其响应  a. 如果是AT开头或者有A/且A/之后是回车换行,则表示ATE1  如果不是以上或者以以上字符串开头,回车换行之后以"+"开头,或者"OK"、"ERROR"  则表示是AT...

    CSS语法手册(CSS手册)(20211001023802).pdf

    根据提供的内容和描述,这里是一份CSS语法手册的内容摘录。本手册包含了一系列的CSS属性及其用法,下面将详细解释这些知识点。 ### CSS属性详解 #### 1. font-family `font-family` 属性用于定义元素文本的字体...

    VB异步执行线程的实例源代码

    这是一个还在讨论中的源代码,VB高手们有不同的意见,摘录:  A:晕,这最终还是调用了老汉多线程……那和线程也没什么区别吧……你应该再试一试线程池……  B:不完全是,因为纤程要先ConvertThreadToFiber,...

    IT助手主要用于代码、资料管理及备忘录和FAQ管理

    代码管理: 摘录常见常用好用,自己测试过新技术的可用代码。 资料管理: 摘录未知的,难度高的,重要的,新生代的技术说明资料。 备 忘 录: 记录日常工作中碰到的日常事情。比如要解决的问题。 FAQ : 记录日常...

    Web服务的测试模型与代码摘录[1]

    WEB模型Web服务的测试模型与代码摘录[1]软件测试测试WebServices的有效性、性能、可伸缩性、可靠性以及安全性时所面临的主要挑战是WebServices的分布性。为了使完整的WebServices能够实现预期的功能,就要求客户端和...

    Hexos:基于[hexo](https:hexo.iozh-cn)的框架

    文章摘录: Ver: Git部署: Ver: 提要: 版本: 搜索数据生成: 版本: 搜索数据生成: 版本: 站点地图: 版本: JSON内容数据: 版本: Restful API: 版本: PullRequests进行中,补丁存在。 外部链接...

    webservice摘录webservice摘录

    webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录webservice摘录质

    软件之道摘录(编程之道、代码大全、人月神话)

    通过以上分析可以看出,《编程之道》、《代码大全》以及《人月神话》这三部经典著作为软件开发者提供了宝贵的经验和指导原则。无论是个人技能的提升还是团队协作的优化,这些原则都能够帮助开发者更好地应对软件开发...

    概念图——摘录之星

    摘录之星的特点包括: 摘录,一步到位:按下一个热键(Ctrl+S,可重新定义)就自动完成内容的命名、保存、归并目录等诸多事项,并且自动记忆其它重要参考信息,如页面网址、摘录时间、应用程序名等。 摘录,一键通:...

    JavaScript实现url地址自动检测并添加URL链接示例代码

    背景:写一个简单的聊天系统,发出Htpp的Url实现跳转... 摘录: URL地址自动添加的实现 URL地址自动添加的实现其实就是那么点内容:检测与替换。 检测 “检测”就是检测文字(字符串)内部是否有符合http地址的内容,显

    两个枚举系统服务的例子,VB源码实现

    内容索引:VB源码,其它类别,服务 VB编写的枚举Windows系统服务的例子,压缩包内包括两个例子,一个是枚举本地计算机的服务,另一个则是枚举网络内指定计算的服务,并对枚举到服务进行分类索引,部分代码摘录: ...

    discord-send-embed-code-to-webhook:用来轻松发送代码摘录以使用Webhooks调和的软件包。 最初由KyStolos制造

    可自定义的atom软件包,用于使用webhooks轻松地将嵌入消息中的代码摘录发送给Discord。 最初由KyStolos制造。 注意:此软件包需要安装Discord.js,hastebin-gen和Node。 首先,请确保已安装Node(如果在终端中键入...

    C++学习摘录

    理解何时和如何抛出异常,以及如何有效地捕获和处理异常,对于编写健壮的代码至关重要。 20章:STL(标准模板库)与算法 STL是C++标准库的一部分,包含容器(如vector、list、set)、迭代器、算法和函数对象等组件...

    CS_MiniPortfolio:我已经实施的几个计算机科学项目(代码摘录)

    我已经致力于通过Eclipse IDE实施的几个计算机科学项目(代码摘录)。 I)第一个项目PK(PARKEI的缩写)是一种使用面向对象编程原理设计的游乐园系统。 这是我的计算机编程实验室课程中的一个单独项目。 它包括...

    bootstrapjava源码-ProjetHesi_Sample:源代码摘录,该项目用于向学生进行计算机的生物识别分发。用Java开发的项目

    源代码摘录,该项目用于向学生进行计算机的生物识别分发。 用Java开发的项目(Spring,Hibernate,Mysql,Spring MVC,thymeleaf,Bootstrap等)。 此摘录显示了对学生名单的咨询,以及一名新学生的加入。

    android 电子书阅读器源代码

    这款源代码的核心是构建一个高效、用户友好的电子书阅读环境,支持多种格式的电子书籍,并具备了书签、摘录以及屏幕取词等高级特性。 1. **Android工程结构**:此项目是一个标准的Android Studio工程,包含多个模块...

Global site tag (gtag.js) - Google Analytics