- 浏览: 129798 次
- 性别:
- 来自: 上海
最新评论
-
一叶之源:
总结一下eclipse中的Job机制 -
xinxinlong:
lAnchor.getDy1() 是什么意思
操作excel--稍后整理 -
defrag_sly:
3.7是好用的,只是再mac下面不支持,mac不支持的效果还有 ...
swt下如何做出一个反向展开效果的tree -
defrag_sly:
eclipse3.7不好用了。谁知道给补充一下。
swt下如何做出一个反向展开效果的tree -
hamlzf:
好文!mark!
基于 OSGi 的面向服务的组件编程
最近有个调查将上图tab propertiesView的外观转移到editor中。根据这个要求作了一些调查,目标是也利用扩展点功能提供tab。
走过一些弯路,起初认为这个功能很简单,利用forms画一画就可以了,不过随着设计的深入,发现功能还是很复杂的。首先tab之间的切换,就是最大的问题。其次由于利用扩展点所以对tab的布局就有不确定性,如何处理,也是很大的难题。
随即放弃了自己作的念头。
那就看看怎么样能把eclipse的功能拿过来吧,即便是这样仍不放弃自己写些代码,如扩展点的定义,解析等等。开始以为eclipse中定义的扩展点,只会在propertiesview中显示。所以认为扩展点还是要自己定义的。只不过表示层使用eclipse。随着调查的深入,又一次感到eclipse代码本身的扩展性之高。。。。。赞一下。
第一个进入眼帘的是TabbedPropertyViewer于是想办法在editor中构筑tabbedpropertyviewer。弄了半天发现控制内容显示的contentprovider,控制tab切换的selectionchanged,读写eclipse扩展点配置的registry都被写在了TabbedPropertySheetPage内当作内部类处理了。这个时候抱怨了,觉得eclipse不够强大,tabbedpropertyviewer不能很好的重用。(其实这个方法是行得通的,只不过我认为自己需要写得代码量太大)。
看来为了多偷懒还得往上找,想到了重写TabbedPropertySheetPage,但是有个问题registry的控制可能不在我控制的范围,这个不担心重写点代码就可以了。这时我还是在思考解决方案的阶段还没写代码。我决定看看这个类的代码。找一个好的方式将registry注入进去。找了半天,发觉需要修改好多部分的代码,因为registry遍布全类。有的方法被private了。麻烦啊。这个时候发现还有一个类在这里起到控制作用。ITabbedPropertySheetPageContributor 开始并未觉得这个类有什么了不起。(错啊浪费了只少20分钟)。由于一心想扩展TabbedPropertySheetPage所以搜了一下哪里有引用,发现gmf包里有一个实现,properiesbrowser,这个类的参数是editor(ITabbedPropertySheetPageContributor)凭着对eclipse的敏感发觉这个ITabbedPropertySheetPageContributor东西有大问题。因为是editor将他实现了,事实也证明的确如此。
所以决定按照以下方法试一试。
在我的editorpart中createpartcontrol时直接实例化TabbedPropertySheetPage,让这个page在editor上面创建control。
tabbedPropertySheetPage = new TabbedPropertySheetPage(this); tabbedPropertySheetPage.createControl(parent);打开editor看一下发觉有戏。报了一个控指针。
在检查一下发觉在sheetpage中用的createcontrol方法内调用了一下getSite().我这里仅仅是利用了界面site这个东西根本没注入。没办法跟editor使用同一个site吧。但是pagesite与partsite又是不同的。所以只能实现一个pagesite然后用editor的site delegate一下。赫赫,这样再测试就看到界面了。
下面继续我也用editor来实现ITabbedPropertySheetPageContributor
public String getContributorId() { return "contributor.id"; }这里只需要返回一个特定的id便可。
写扩展点:
<extension point="org.eclipse.ui.views.properties.tabbed.propertyContributor"> <?gmfgen generated="true"?> <propertyContributor contributorId="contributor.id " labelProvider=" LabelProvider"> <propertyCategory category="Contributor"> </propertyCategory> </propertyContributor> </extension> <extension point="org.eclipse.ui.views.properties.tabbed.propertyTabs"> <?gmfgen generated="true"?> <propertyTabs contributorId=" contributor.id "> <propertyTab category="Contributor" id="property.tab.description" label="Description"> </propertyTab> <propertyTab category="Contributor" id="property.tab.description1" label="Description"> </propertyTab> <propertyTab category="Contributor" id="property.tab.description2" label="Description"> </propertyTab> </propertyTabs> </extension> <extension point="org.eclipse.ui.views.properties.tabbed.propertySections"> <propertySections contributorId=" contributor.id "> <propertySection class="Section" id="property.section" tab="property.tab.description" filter="Filter"> </propertySection> <propertySection class="Section" id="property.section1" tab="property.tab.description1" filter="Filter"> </propertySection> <propertySection class="Section" id="property.section2" tab="property.tab.description2" filter="Filter"> </propertySection> </propertySections> </extension>扩展点中定义的contributorId="contributor.id"一定要和上面的相同。
再测试一下。没看到页面。这里跟了一下代码,因为跟预期的不符。没跟出什么结果,所有结果跟我想象的一致。但是由于我是直接create的所以肯定错过了数据注入的过程。由于这里的注入是通过selectionchanged来激活的。所以我调用了一下。
tabbedPropertySheetPage.selectionChanged(this, this.getSite() .getWorkbenchWindow().getSelectionService().getSelection());再来测试一下,赫赫结果来了。搞定。
但是上面的方法仍然有许多需要改进的地方。最后的selectionchanged。当selection为空的时候会出错。这里要做一些非空处理,以及section中也要对input做非空处理。还有如果当前选择的对象与我们预期的不符也要做些特殊的处理。另外有一个让我比较担心的问题就是site的问题。毕竟是用editor的site做得代理如果在将来有什么变化。都是不可预期的,这个问题是我很担心的。当然这些都是需要进一步优化的点。不过显然我的解决方法足以说明eclipse是很强大的。
以上,欢迎大家进一步讨论。
例子代码:
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IActionBars; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchPartSite; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.part.EditorPart; import org.eclipse.ui.part.IPageSite; import org.eclipse.ui.views.properties.tabbed.ITabbedPropertySheetPageContributor; import org.eclipse.ui.views.properties.tabbed.TabbedPropertySheetPage; public class EditorPartWithTab extends EditorPart implements ITabbedPropertySheetPageContributor { private IEditorSite site; private TabbedPropertySheetPage tabbedPropertySheetPage; public EditorPartWithTab(IWorkbenchPartSite site) { } @Override public void doSave(IProgressMonitor arg0) { } @Override public void doSaveAs() { } @Override public void init(IEditorSite site, IEditorInput arg1) throws PartInitException { this.site = site; this.setSite(site); } @Override public boolean isDirty() { return false; } @Override public boolean isSaveAsAllowed() { return false; } @Override public void createPartControl(Composite parent) { tabbedPropertySheetPage = new TabbedPropertySheetPage(this); tabbedPropertySheetPage.init(new IPageSite() { public IActionBars getActionBars() { return site.getActionBars(); } public void registerContextMenu(String menuId, MenuManager menuManager, ISelectionProvider selectionProvider) { site .registerContextMenu(menuId, menuManager, selectionProvider); } public IWorkbenchPage getPage() { return site.getPage(); } public ISelectionProvider getSelectionProvider() { return site.getSelectionProvider(); } public Shell getShell() { return site.getShell(); } public IWorkbenchWindow getWorkbenchWindow() { return site.getWorkbenchWindow(); } public void setSelectionProvider(ISelectionProvider provider) { site.setSelectionProvider(provider); } public Object getAdapter(Class adapter) { return site.getAdapter(adapter); } public Object getService(Class api) { return site.getService(api); } public boolean hasService(Class api) { return site.hasService(api); } }); tabbedPropertySheetPage.createControl(parent); tabbedPropertySheetPage.selectionChanged(this, this.getSite() .getWorkbenchWindow().getSelectionService().getSelection()); } @Override public void setFocus() { tabbedPropertySheetPage.setFocus(); } public String getContributorId() { return "contributor.id"; } }
发表评论
-
TableEditor 让我郁闷的
2011-12-21 17:25 1403TableItem item = table.getIte ... -
eclipse search
2011-08-09 13:04 973http://www.ibm.com/developerwor ... -
eclipse 中关于字符串匹配的几个类
2009-12-17 12:07 1589在做检索功能时,必然会遇到字符串匹配的问题。eclipse与j ... -
eclipse Drag&Drop机制图解
2009-11-20 15:55 1154工作需要,debug了eclipse的drag&dro ... -
Drag & Drop eclipse Viewer to GMF Editor
2009-10-09 11:21 19381,添加Viewer的Drag support priva ... -
请问,eclipse e4 究竟是什么?愿能集思广益
2009-08-13 16:05 957请问,eclipse e4 究竟是什么?愿能集思广益 -
简单介绍eclipse中的重构
2009-08-13 11:28 2372Eclipse中提供了几个扩展点,方便扩展重构功能。 基本的重 ... -
swt下如何做出一个反向展开效果的tree
2009-08-10 10:59 1843如题,其实很简单,即在tree的构造方法里加入样式参数{SWT ... -
eclipse 开发中的快捷键
2009-05-19 12:15 937Alt+Shift+F1 eclipse 3.4下会打开一个p ... -
将gmfeditor结合到mutipage中
2009-05-04 16:26 1325http://www.eclipse.org/articles ... -
eclipse还有什么不能做???
2009-04-09 15:13 974http://www.vimeo.com/1195398?pg ... -
Eclipse中TextEditor常用扩展整理
2009-03-11 14:11 5486总结一下TextEditor,eclips ... -
eclipse中对redo与undo的支持
2009-03-10 16:14 4547大家在使用eclipse时,一定对ctrl+z和ctrl+r使 ... -
总结一下eclipse中的Job机制
2009-03-06 17:38 11640总结一下eclipse中Job,Job可以说是eclipse中 ... -
以GefTree为例解释一下如何结合使用gef+emf(2)
2009-03-05 14:24 3007创建gef框架。 按照基本习惯定义gef各部分包名: G ... -
以GefTree为例解释一下如何结合使用gef+emf(1)
2009-03-05 14:20 1528以GefTree为例解释一下如何结合使用gef+emf。 (1 ... -
gef写的tree例子--模型修改为emf
2009-03-04 16:11 2163模型部分已经修改为emf模型。 使用emf模型最大的好处是: ... -
用gef写的一个tree例子(无移动)
2009-02-26 18:06 1463又整理一下代码,增加了删除。 移动决定不做了,都是坐标之类的算 ... -
用gef写的一个tree例子(无移动,删除)
2009-02-26 11:16 1055计划 1、删除,移动做上去 2、将模型层提供为扩展点,( ... -
关于image,ImageDescriptor,imageRegistry
2009-02-20 17:31 5057相信不需要多说,大家都明白调用本地资源例如(icon)这类的资 ...
相关推荐
- **继承自`org.eclipse.ui.part.EditorPart`**:利用EditorPart提供的基本功能,如文件加载、保存、脏标记处理等。 - **实现图形渲染**:在Editor中集成GEF的Viewer组件,用于渲染图形模型。 - **处理用户交互**...
这个过程涉及到了将EditorPart整合到插件中的步骤,并需要在类中定义EditDomain。 除此之外,GEF指南还包括了创建MyEditorInput类的内容,这个类需要实现org.eclipse.ui.IEditorInput接口,以便可以作为编辑器输入...
通过对《Eclipse RCP应用系统开发方法与实践》源代码的深入学习,开发者不仅可以掌握Eclipse RCP的基本用法,还能了解到如何在实际项目中运用这些技术,解决复杂的桌面应用开发问题。通过实践,可以更好地理解和掌握...
4. **注入Spring Bean**:在RCP组件(如ViewPart或EditorPart)中,我们可以使用`@Autowired`注解或者通过ApplicationContext的getBean()方法获取Spring管理的bean,将其注入到RCP组件中。 5. **处理事件和命令**:...
3. ** Views **:显示特定信息或提供交互功能的组件,可以被添加到透视图中。 4. ** Editors **:用于编辑文件或数据,它们通常是全屏的,可以替代视图占据主窗口。 5. ** Actions **:操作或者菜单项,提供用户可...
在`gef.tutorial.step.ui`包中,将创建一个Eclipse的Editor插件,这个Editor将继承自`org.eclipse.ui.part.EditorPart`,以便实现图形的展示和交互功能。 ### 结语 通过本文的介绍,我们初步了解了GEF与RCP结合的...
- **实现SampleEditor类**:在代码示例中,`SampleEditor`继承自`EditorPart`,实现了编辑器的基本功能,包括初始化、保存等。 ##### 5.4 调用编辑器 - **调用流程**:介绍如何在应用中调用编辑器,通常涉及到编辑...
在这个过程中,`IWorkbenchPart`(包括`EditorPart`和`ViewPart`)是非常重要的组成部分,它们通常由`WorkbenchPage`进行统一管理和调度。 #### IWorkbenchPage与IWorkbenchPart的关系 `IWorkbenchPage`作为`...
代码镜像 Eclipse 您可以在看到 Eclipse RAP 演示 是在浏览器中提供代码编辑器的 JavaScript 组件。... 在 Eclipse 3.x EditorPart 中使用 codemirror。 这是一个带有 Eclipse RCP 的关于 codemirror Json 模式的
Eclipse RCP(Rich Client Platform)是一个开源框架,用于构建功能丰富的桌面应用程序。它提供了构建专业级应用所需的基础架构,包括窗口系统、插件机制、工作台管理等。本示例是一个Eclipse RCP的实战演示,展示了...
Web Part 是ASP.NET 2.0框架中的一种创新特性,它为构建动态且可自定义的网页提供了强大的工具。Web Part 控件允许用户直接在浏览器中调整页面内容、外观和行为,实现了用户界面的个性化设置。用户可以自由地显示、...
在实际项目中,开发者通常会结合JFace库使用SWT,JFace提供了一些高级抽象和便利的功能,如数据绑定、视图和编辑器框架等,简化了SWT的使用。JFace的`ViewPart`和`EditorPart`类可以帮助构建Eclipse插件和RCP(Rich ...
Eclipse 插件开发是构建基于Eclipse平台的自定义工具和功能的重要方式。Eclipse作为一个开放源码的集成开发环境(IDE),以其强大的可扩展性而闻名,开发者可以通过编写插件来定制自己的开发环境,满足特定的需求。本...
下面我们将深入探讨这个项目的相关知识点,以及如何利用Eclipse RCP和EditorPart来实现这一功能。 首先,我们需要了解Eclipse RCP。Eclipse RCP 是一种强大的框架,用于构建桌面应用程序。它基于插件模型,允许...
通常情况下,GEF会集成到Editor中而非View中,这是因为Editor提供了文件保存机制,这对于图形编辑来说非常关键。 1. **创建Editor**: - 在`plugin.xml`的“extensions”页面中,添加一个新的编辑器。选择`org....
文档中指出,创建一个Editor是为了在图形界面中显示GEF图形,而这一部分通常是在Eclipse的EditorPart基础上扩展来的。作者还提到了模型、控制器和视图的放置位置,强调了Editor类应该放在gef.tutorial.step.ui包中,...
这通常涉及到编辑器部件(EditorPart)的继承以及图形编辑功能的实现。 - **GEF的基本结构**:一个典型的GEF项目包括三个核心组成部分:模型(Model)、控制器(Controller)和视图(View)。文档提到了这些组成部分...
根据给定的信息,本文将详细解释“GEF-whole-upload”这一主题,主要涉及GEF的基本结构及其在RCP项目中的应用。 ### GEF的基本结构理解 #### GEF简介 GEF (Graphical Editing Framework) 是Eclipse平台提供的一个...