`
defrag_sly
  • 浏览: 129798 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何把propertiesView的tab功能移植到EditorPart中

阅读更多


最近有个调查将上图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";
	}

}


  • 大小: 22.6 KB
  • 大小: 14.2 KB
2
0
分享到:
评论

相关推荐

    GEF中文教程(以hello world为例)

    - **继承自`org.eclipse.ui.part.EditorPart`**:利用EditorPart提供的基本功能,如文件加载、保存、脏标记处理等。 - **实现图形渲染**:在Editor中集成GEF的Viewer组件,用于渲染图形模型。 - **处理用户交互**...

    GEF开发指南

    这个过程涉及到了将EditorPart整合到插件中的步骤,并需要在类中定义EditDomain。 除此之外,GEF指南还包括了创建MyEditorInput类的内容,这个类需要实现org.eclipse.ui.IEditorInput接口,以便可以作为编辑器输入...

    eclipse rcp应用系统开发方法与实践(1)

    通过对《Eclipse RCP应用系统开发方法与实践》源代码的深入学习,开发者不仅可以掌握Eclipse RCP的基本用法,还能了解到如何在实际项目中运用这些技术,解决复杂的桌面应用开发问题。通过实践,可以更好地理解和掌握...

    rcp与spring集成的一个简单例子

    4. **注入Spring Bean**:在RCP组件(如ViewPart或EditorPart)中,我们可以使用`@Autowired`注解或者通过ApplicationContext的getBean()方法获取Spring管理的bean,将其注入到RCP组件中。 5. **处理事件和命令**:...

    一个简单的Eclipse RCP 源码示例

    3. ** Views **:显示特定信息或提供交互功能的组件,可以被添加到透视图中。 4. ** Editors **:用于编辑文件或数据,它们通常是全屏的,可以替代视图占据主窗口。 5. ** Actions **:操作或者菜单项,提供用户可...

    gef简单入门

    在`gef.tutorial.step.ui`包中,将创建一个Eclipse的Editor插件,这个Editor将继承自`org.eclipse.ui.part.EditorPart`,以便实现图形的展示和交互功能。 ### 结语 通过本文的介绍,我们初步了解了GEF与RCP结合的...

    RCP_Plug-in开发自学教程(6-10章)

    - **实现SampleEditor类**:在代码示例中,`SampleEditor`继承自`EditorPart`,实现了编辑器的基本功能,包括初始化、保存等。 ##### 5.4 调用编辑器 - **调用流程**:介绍如何在应用中调用编辑器,通常涉及到编辑...

    eclipse插件开发-编辑器详解

    在这个过程中,`IWorkbenchPart`(包括`EditorPart`和`ViewPart`)是非常重要的组成部分,它们通常由`WorkbenchPage`进行统一管理和调度。 #### IWorkbenchPage与IWorkbenchPart的关系 `IWorkbenchPage`作为`...

    CodeMirror-Eclipse:CodeMirror-Eclipse

    代码镜像 Eclipse 您可以在看到 Eclipse RAP 演示 是在浏览器中提供代码编辑器的 JavaScript 组件。... 在 Eclipse 3.x EditorPart 中使用 codemirror。 这是一个带有 Eclipse RCP 的关于 codemirror Json 模式的

    eclipse rcp demo例子 view editor 图表

    Eclipse RCP(Rich Client Platform)是一个开源框架,用于构建功能丰富的桌面应用程序。它提供了构建专业级应用所需的基础架构,包括窗口系统、插件机制、工作台管理等。本示例是一个Eclipse RCP的实战演示,展示了...

    Web Part 控件的应用

    Web Part 是ASP.NET 2.0框架中的一种创新特性,它为构建动态且可自定义的网页提供了强大的工具。Web Part 控件允许用户直接在浏览器中调整页面内容、外观和行为,实现了用户界面的个性化设置。用户可以自由地显示、...

    java程序设计之swt教程

    在实际项目中,开发者通常会结合JFace库使用SWT,JFace提供了一些高级抽象和便利的功能,如数据绑定、视图和编辑器框架等,简化了SWT的使用。JFace的`ViewPart`和`EditorPart`类可以帮助构建Eclipse插件和RCP(Rich ...

    eclipse插件开发指南

    Eclipse 插件开发是构建基于Eclipse平台的自定义工具和功能的重要方式。Eclipse作为一个开放源码的集成开发环境(IDE),以其强大的可扩展性而闻名,开发者可以通过编写插件来定制自己的开发环境,满足特定的需求。本...

    POJOEditor RCP-开源

    下面我们将深入探讨这个项目的相关知识点,以及如何利用Eclipse RCP和EditorPart来实现这一功能。 首先,我们需要了解Eclipse RCP。Eclipse RCP 是一种强大的框架,用于构建桌面应用程序。它基于插件模型,允许...

    GEF快速入门教程和EMF教程

    通常情况下,GEF会集成到Editor中而非View中,这是因为Editor提供了文件保存机制,这对于图形编辑来说非常关键。 1. **创建Editor**: - 在`plugin.xml`的“extensions”页面中,添加一个新的编辑器。选择`org....

    gef版本的helloworld

    文档中指出,创建一个Editor是为了在图形界面中显示GEF图形,而这一部分通常是在Eclipse的EditorPart基础上扩展来的。作者还提到了模型、控制器和视图的放置位置,强调了Editor类应该放在gef.tutorial.step.ui包中,...

    GEF开发指南---插件开发

    这通常涉及到编辑器部件(EditorPart)的继承以及图形编辑功能的实现。 - **GEF的基本结构**:一个典型的GEF项目包括三个核心组成部分:模型(Model)、控制器(Controller)和视图(View)。文档提到了这些组成部分...

    GEF-whole-upload

    根据给定的信息,本文将详细解释“GEF-whole-upload”这一主题,主要涉及GEF的基本结构及其在RCP项目中的应用。 ### GEF的基本结构理解 #### GEF简介 GEF (Graphical Editing Framework) 是Eclipse平台提供的一个...

Global site tag (gtag.js) - Google Analytics