前文中 http://winseclone.iteye.com/blog/1774307 介绍了使用Properties的方法。但是TableTree 形式的Properties视图,局限性比较大,不能很好的发挥。如下操作在Properties就很难实现:
-
调整属性,重要的常用的属性放置在前!
- 在属性上添加其他操作,如在Class对象上通过ctrl+<单击>能跳转到对应的class类,并用编辑器打开。
Tabbed Properties效果
Tabbed Properties与表格式Properties不同,采用的是通过表单形式来编辑属性。如下图所示:
图中主要分3部分:
1、最外面层是Contributor,由Label + TabContainer;
2、中间层是TabContainer,可以包括n个Tab,每个Tab则是一个SectionContainer;
3、内层是SectionContainer, 由n个Section组成。
每个层可以使用一个扩展点来实现。对应Tabbed提供的3个扩展点:
-
org.eclipse.ui.views.properties.tabbed.propertyContributor
-
org.eclipse.ui.views.properties.tabbed.propertyTabs
-
org.eclipse.ui.views.properties.tabbed.propertySections
这里,我们先按照步骤一步步的实现效果,然后再讲解3个扩展点常用的属性。
实现Tabbed Properties View
· 更新SampleView.java
1、实现ITabbedPropertySheetPageContributor接口
public String getContributorId() {
return SampleView.ID;
}
2 重写SampleView的getAdapter方法。修改默认的IPropertySheetPage.class适配对象
public Object getAdapter(Class adapter) {
if (adapter == IPropertySheetPage.class) {
return new TabbedPropertySheetPage(this);
}
return super.getAdapter(adapter);
}
· 实现ISection,定义控件以及布局
实现自定义的IFilter和Section
StringFilter
· 扩展点实现
添加tabbed的3个扩展点。
contributorId填写为对应SampleView的Id(即SampleView.ID的值)。具体Contributor,Tab,Section的属性配置按照层次关系填写即可。
<extension
point="org.eclipse.ui.views.properties.tabbed.propertyContributor">
<propertyContributor
contributorId="plugin.properties.views.SampleView"
labelProvider="org.eclipse.jface.viewers.LabelProvider">
<propertyCategory
category="Sample"></propertyCategory>
<propertyCategory
category="AdvancedCategory"></propertyCategory>
</propertyContributor>
</extension>
<extension
point="org.eclipse.ui.views.properties.tabbed.propertyTabs">
<propertyTabs
contributorId="plugin.properties.views.SampleView">
<propertyTab
category="AdvancedCategory"
id="plugin.properties.advancedTab"
label="Advanced">
</propertyTab>
<propertyTab
category="Sample"
id="plugin.properties.sampleTab"
label="Sample">
</propertyTab>
</propertyTabs>
</extension>
<extension
point="org.eclipse.ui.views.properties.tabbed.propertySections">
<propertySections
contributorId="plugin.properties.views.SampleView">
<propertySection
class="org.eclipse.ui.views.properties.tabbed.AdvancedPropertySection"
id="plugin.properties.advanceSection"
tab="plugin.properties.advancedTab">
<input
type="plugin.properties.views.StringWrapper">
</input>
</propertySection>
<propertySection
class="plugin.properties.section.StringTypeSection"
filter="plugin.properties.section.StringFilter"
id="plugin.properties.sampleSection"
tab="plugin.properties.sampleTab">
</propertySection>
</propertySections>
</extension>
另外,编写Tabbed Properties页签视图需要懂swt,以及FormLayout布局。
对于一个属性显示一行的TabbedProperties可以通过topcased插件来生成。这个插件还是不错的。但是如果复杂一点的就需要自己定义了。
扩展点含义
下面主要讲一下3个扩展点的常用属性,及其子节点
1、 org.eclipse.ui.views.properties.tabbed.propertyContributor
#propertyContributor节点的属性
-
contributorId Tabbed PropertySheetPage贡献者的ID,即选中元素所在View或Editor的ID。 同时View和Editor也需要实现ITabbedPropertySheetPageContributor 接口,这个接口只有一个方法,要求返回的值即该contributorId。
-
typeMapper - 实现类型的映射。TabbedPropertyRegistryClassSectionFilter.appliesToSelection(ISectionDescriptor, ISelection) 起到mappingFilter的作用。因为我们选择的元素并不一定是实现IPropertySource的元素(即能够给property view提供内容的元素),比如在GEF中,我们选择的finger实际上是选择了对应的EditPart,而实际上实现了IPropertySource一般的是model部分的元素,所以这时候我们要将Editpart映射到对应的model元素[r3]
-
labelProvider - 标题显示提供者Provider(ILabelProvider)
-
actionProvider - 没啥用。TabbedPropertySheetPage.validateRegistry(ISelection)中会调用registry.getActionProvider(),但在中间就返回了。
-
sectionDescriptorProvider - (应该是类似于propertySections扩展点的作用)
-
tabDescriptorProvider - (应该是类似于propertyTabs扩展点的作用)
通过Extensions标签页扩展点的“Show extension point description”查看该扩展点的详细描述。
#propertyContributor#propertyCategory属性
用于聚合多个tabs,将会在propertyTab标签中用到;
注意至少要定义一个category,来聚合tabs,否则,可能会显示property失败。
2、org.eclipse.ui.views.properties.tabbed.propertyTabs
#propertyTabs#propertyTab节点的属性
-
label - Tab显示的名称.
-
category - 对应上面的propertyCategory属性的category的值.
-
id - The unique id for the tab,将会用于propertySection标签。
3、org.eclipse.ui.views.properties.tabbed.propertySections
#propertySections#propertySection属性
-
tab - 该section需要放置到Tab,对应propertyTab扩展点的id属性值.
-
id - 表示该section的唯一ID.
-
class - section的实现类,用于描述这个section的控件和布局。
-
filter - 对象过滤,只有通过该filter的对象才会显示该section
如果没有选择fitler,则需要添加input子节点!
源码:
s1: 本文实现的例子
https://github.com/winse/hello/tree/8c8ae8a1a83c7cfe27287631e5b575d50f17d75c
s2: topcased相关源码
http://subversion.moskitt.org/gvcase-adaptations/topcased/branches/org.topcased.modeler/src/org/topcased/modeler/editor/properties/filters/DiagramElementFilter.java
http://gforge.enseeiht.fr/scm/viewvc.php/plugins/modeler/org.topcased.tabbedproperties/src/org/topcased/tabbedproperties/sections/?diff_format=s&root=topcased-mf
http://gforge.enseeiht.fr/scm/viewvc.php/*checkout*/plugins/modeler/org.topcased.modeler/plugin.xml?revision=1.127&root=topcased-mf
参考:
r1:最权威的tabbed_properties的使用说明
http://www.eclipse.org/articles/Article-Tabbed-Properties/tabbed_properties_view.html
r2:一个通用的页签式视图框架(可以了解一下,使用的不是Eclipse提供的扩展点)
http://www.ibm.com/developerworks/cn/opensource/os-cn-eclipse-tabview/index.html
r3:Eclipse Tabbed Properties View
http://hi.baidu.com/uvfluhpkkjfglor/item/5526fd459565ec14886d1071
- 大小: 7.1 KB
- 大小: 9.7 KB
- 大小: 43.7 KB
分享到:
相关推荐
第五次作业函数第一题--
本项目旨在利用深度学习方法实现作物病害的自动诊断。作物病害是农业生产中的重要问题,及时诊断和处理对于减少产量损失至关重要。 我们采用深度学习算法,通过分析作物的图像,实现对病害的自动识别和分类。项目使用的数据集包括公开的作物病害图像数据集,如ISIC等,并进行了预处理,包括图像增强、分割和特征提取等。 在运行环境方面,我们使用Python编程语言,基于TensorFlow、PyTorch等深度学习框架进行开发。为了提高计算效率,我们还使用了GPU加速计算。此外,我们还采用了Docker容器技术,确保实验结果的可重复性。 项目完成后,将实现对作物病害的快速、准确诊断,为农业生产提供有力支持,有助于减少产量损失。同时,项目成果也可应用于其他图像识别和分类任务。
机械设计CD驱动印刷设备step非常好的设计图纸100%好用.zip
python烟花代码
附件中是一个简单的烟花效果的代码示例: 在Python中,可以使用多种方式来模拟烟花效果,其中一种常用的方法是使用turtle模块,它提供了一个画布和一个小海龟,可以用来绘制各种图形。 这段代码首先导入了turtle模块和random模块,然后在屏幕上绘制了10次烟花爆炸的效果。每次爆炸都是由5个小圆组成,颜色随机选择,圆的大小也是随机的。 请注意,这段代码需要在支持turtle模块的Python环境中运行,并且需要有图形界面的支持。如果你在没有图形界面的环境中(比如某些服务器或者命令行界面),这段代码可能无法正常运行。
商业化产品经理,到底如何实现产品商业化?.docx
Panduit 工业以太网部件内部销售指南
在Java中,实现一个三维装箱(也称为三维背包问题)的算法通常涉及到组合优化和动态规划。这个问题是一个典型的优化问题,其中目标是在三个维度的限制下最大化价值的总和。下面是一个简单的Java代码示例,它使用动态规划来解决三维装箱问题。 请注意,这个代码只是一个简单的示例,它假设所有物品的第三个维度的大小都是1,并且没有给出如何回溯选择物品的完整逻辑。在实际应用中,三维装箱问题可能更加复杂,需要考虑所有三个维度的限制,并且可能需要更复杂的算法来解决。 此外,这个问题的解决方案可能需要根据具体问题的要求进行调整,例如物品是否可以分割、是否允许超过一个的物品等。如果你有特定的问题描述或者需要进一步的帮助,请提供更多的细节。
常用品牌EPLAN部件库
单片机开发的教程可以分为以下几个步骤: 1. 了解单片机基础知识:在学习单片机开发之前,需要了解单片机的相关知识,包括单片机的基本结构、指令系统、编程语言等。 2. 选择开发板:选择一款适合自己学习开发板的型号和厂商,通常需要关注开发板的性价比、开发环境是否友好等因素。 3. 学习开发环境:根据所选的开发板,学习相关的开发环境和使用方法,例如Keil、IAR等集成开发环境。 4. 掌握编程语言:单片机常用的编程语言包括C语言和汇编语言,根据实际情况选择其中一种进行学习。 5. 基础操作:熟悉单片机的引脚定义和IO口配置,了解单片机的启动代码,可以通过修改启动代码进行基本功能调试。 6. 综合实践:根据具体项目需求,进行单片机开发的综合实践。在实践中需要掌握如何编写程序、如何进行硬件调试、如何使用相关工具软件等技能。 下面是一个单片机开发的简单教程介绍: 首先,确定所使用的单片机型号和开发板类型。在这个阶段,需要查阅相关资料,了解开发板的规格书、芯片规格等基本资料。 其次,安装并配置开发环境。根据所选的开发板,安装相应的集成开发环境(IDE),并配置好开发环境。 接着,学习并掌
Q1.ipynb
(自适应手机端)IT网络建站公司pbootcms模板 互联网营销企业网站源码下载.zip
Bematech 激光扫描器用户手册
激励视频接入文档.pdf
java jdk1.8 202版本下载window linux打包
Lite Beam M5快速指南
互联网金融导论.docx
字节跳动青训营——抖音项目
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。