`
youngerbaby
  • 浏览: 115025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Eclipse Multipage Page编辑器同步实践——OutlinePage

阅读更多

最近做个IDE的项目,要将文本编辑器和机遇gef的图形编辑器集成为Multipage编辑器,单独两个编辑器各自运行都是没有问题的,可是集成为一个Multipage编辑器就需要考虑很多编辑器之间同步的问题,要考虑的主要有:

1. Outline切换

2. 属性页切换

3. 文本/图形修改同步

4. ActionBar Contributor切换

 

本文主要讨论如何对OutlinePage进行同步,做到切换页面时outlinePage同步切换。

基本想法是这样的:(代码逻辑参考了一个叫StrutsIDE的开源插件)

通常outlinepage实例是通过getAdater方法返回的,在multipage编辑器中也是一样的,只是在切换不同tab的时候outlinepage也需要变化,因此,在MultipageEditor的pageChange方法中加入outlinepage切换代码。更具体一点的做法就是自己写一个外壳OutlinePage,当切换Multipage不同的编辑器时嵌入不同的outlinePage。请看定制的Outlinepage代码:

public class MultiPageEditorOutlinePage extends Page implements IContentOutlinePage {
	
	private IContentOutlinePage activePage;
	
	private IEditorPart activeEditor;
	
	private Composite control;
	
	/**
	 * Set the active editor.
	 * This outline page shows the outline which is provided by given editor.
	 * 
	 * @param editor the active editor
	 */
	public void setActiveEditor(IEditorPart editor){
		if(activePage!=null && activePage.getControl() != null){
			activePage.getControl().dispose();
		}
		this.activeEditor = editor;
		activePage = (IContentOutlinePage)editor.getAdapter(IContentOutlinePage.class);
		if(control!=null){
			if(activePage!=null){
				initActivePage();
				activePage.createControl(control);
				getSite().getActionBars().updateActionBars();
				control.layout();
			}
		}
	}
	
	public void createControl(Composite parent) {
		control = new Composite(parent, SWT.NULL);
		control.setLayout(new FillLayout());
		if(activePage!=null){
			initActivePage();
			activePage.createControl(control);
		}
	}
	
	/**
	 * Initializes the active outline page.
	 */
	private void initActivePage(){
		getSite().getActionBars().getToolBarManager().removeAll();
		getSite().getActionBars().getMenuManager().removeAll();
		
		if(activePage instanceof IPageBookViewPage){
			IPageBookViewPage pageBook = (IPageBookViewPage)activePage;
			if(pageBook.getSite()==null){
				try {
					pageBook.init(getSite());
				} catch(PartInitException ex){
					ex.printStackTrace();
				}
			}
		}
	}

	public Control getControl() {
		/*if(activePage!=null){
			activePage.getControl();
		}*/
		return control;
	}

	public void setFocus() {
		if(activePage!=null){
			activePage.setFocus();
		}
	}

	public void addSelectionChangedListener(ISelectionChangedListener listener) {
		if(activePage != null) {
			activePage.addSelectionChangedListener(listener);
		}
	}

	public ISelection getSelection() {
		if(activePage!=null){
			return activePage.getSelection();
		}
		return null;
	}

	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
		if(activePage != null) {
			activePage.removeSelectionChangedListener(listener);
		}
	}

	public void setSelection(ISelection selection) {
		if(activePage!=null){
			activePage.setSelection(selection);
		}
	}

	public IContentOutlinePage getActivePage() {
		return activePage;
	}

	public IEditorPart getActiveEditor() {
		return activeEditor;
	}
	
}

KULMultiPageEditorOutlinePage集成Page,实现IContentOutlinePage接口,其中

 

public void setActiveEditor(IEditorPart editor){
....
}

方法就是供外部调用切换OutlinePage的主要接口,做的就是拿到当前编辑器的实例,调用当前编辑器的getAdator方法拿到outlinepage实例,在创建当前编辑器的outlinepage控件。上面的方法在MultipageEditor的pageChange方法中调用:

protected void pageChange(int newPageIndex) {
		if(isDirty()){
			if(newPageIndex==DIAGRAM_PAGE){
				diagramEditor.flushCommandStack();
			    syncEditors(XML_PAGE);
			} else if(newPageIndex==XML_PAGE){
				syncEditors(DIAGRAM_PAGE);
			}
		}
		super.pageChange(newPageIndex);
		// enable or disable preview view when page change
		handlePageChange(newPageIndex);
		
		outlinePage.setActiveEditor(getEditor(newPageIndex));
		propertySheetPage.setActiveEditor(getEditor(newPageIndex));
	}

 请看

outlinePage.setActiveEditor(getEditor(newPageIndex));

这句代码,就是告诉MultipageOutlinePage这个外壳,更换里面的内容。

通过以上方法,基本上可以做到切换不同编辑器outlinepage的同步变化,当然也有一点小问题,比如选中编辑器中的某个模型,outlinepage中对应的元素默认不会被选中,反过来倒是可以,等等。还需要进一步调试。

 

分享到:
评论
3 楼 endison1111 2014-11-04  
碰到了同样的问题,使用多页面MultiPage后,切换标签outline无法正常切换,明天试下你的方法,应该有帮助,谢谢。
2 楼 坏孩子 2010-11-12  
切换标签页的时候编辑器历史弄过吗(后退前进那个)?我也在做,不过一直有bug
1 楼 xiaobadi 2010-11-12  
你好,我现在要做一个插件,比如我有个类叫做A..每新建一个类都会自动继承这个A类,应该怎么写啊??

相关推荐

    ashiva-multi-page-editor:Ashiva MultiPage编辑器在多个网页中查找并替换文本。 Ashiva应用程序

    Ashiva MultiPage编辑器 Ashiva MultiPage Editor是一个独立的单一文件应用程序,可使用Ashiva WebRig在任何站点的多个网页上查找和替换文本。 MultiPage编辑器使用什么技术? 单一文件应用程序包含以下技术: PHP...

    vue-multipage vue 模块化开发打包

    Webpack 是一个模块打包器,它能够将JavaScript、CSS、图片等资源进行模块化处理,然后根据配置将它们打包成一个或多个可部署的静态文件。在Vue-multipage 的场景下,Webpack 被用来处理每个页面的独立模块,确保每...

    脚手架-ncpub-multipage-demo.zip

    【标题】"脚手架-ncpub-multipage-demo.zip" 涵盖的是一个用于NCC(NC Cloud)开发的前端脚手架项目。这个压缩包提供的是一种基础框架,旨在简化开发流程,提高开发效率,尤其对于在Visual Studio Code环境中进行NCC...

    treeview,toolbar,TabStrip,MultiPage控件

    它通常包含多个页面(Page),每个页面有自己的控件和功能。用户可以通过选择不同的页签来切换内容。这种控件在有限的空间内展示多个相关但独立的部分特别有效。可能的扩展功能包括自定义页签样式、页签切换事件等。...

    PyPI 官网下载 | streamlit-multipage-0.0.9.tar.gz

    **PyPI 官网下载 | streamlit-multipage-0.0.9.tar.gz** PyPI(Python Package Index)是Python编程语言的官方软件仓库,它提供了大量的第三方库,供开发者下载和使用。这个资源“streamlit-multipage-0.0.9.tar.gz...

    VSCREEN_MultiPage.c

    需要在LCDConfig中将VSize设置成两倍,这样利用emwin的虚拟屏可实现两个窗体之间的跟随切换

    PDF Multi Page Import(AI).jsx

    ai插件,一键导入pdf文件(多页),不用一页一页导入。实测ai cs6,ai 2019版本都可以用。

    multipage

    $ pip install git+https://github.com/abey79/multipage.git#egg=multipage 检查安装是否成功: $ vpype --help Usage: vpype [OPTIONS] COMMAND1 [ARGS]... [COMMAND2 [ARGS]...]... Options: -v, --verbose -...

    Multi-Page TIFF Editor2.9.7.751 英文特别版 全能.rar

    **多页TIFF编辑器2.9.7.751英文特别版全面解析** 多页TIFF编辑器是一款专业且功能强大的图像处理工具,专为处理多页TIFF(Tagged Image File Format)文件而设计。这个版本是2.9.7.751的英文特别版,提供了一系列...

    vue-multipage-cli:简单的多页面CLI,用于搭建Vue.js项目

    vue-multipage-cli Simple Multiple-page CLI for scaffolding Vue.js projects. 基本使用方法 使用方法与vue官方的vue-cli基本是一样的,只是因为是多页面应用程序,所以目前这个版本 html页面和js入口文件还需要...

    vue-multipage:vue 多页面架子

    vue-multipage Depend on vue-template version: 1.2.3 Build Setup # install dependencies npm install # serve with hot reload at localhost:8080 npm run dev # build for production with minification npm ...

    multipage-vue:使用Webpack和Vue创建包含共享组件的多页网站

    1. **Entry配置**:定义多个入口点,例如`entry: { page1: './src/page1/main.js', page2: './src/page2/main.js' }`。 2. **Output配置**:指定输出文件路径和命名规则,例如`output: { filename: '[name].bundle....

    HDI-Silverlight-2b2-MultiPage-Part2-SRC-CSharp.zip

    《深入探索Silverlight多页应用开发——C#源码解析》 Silverlight,作为微软推出的一种富互联网应用程序(RIA)平台,曾广泛应用于构建交互性强、用户体验优良的Web应用程序。本压缩包“HDI-Silverlight-2b2-...

    jQuery-Mobile-List-View-Multipage:使用 jQuery mobile 的移动应用程序的简单多页模板

    <div data-role="page" id="page1"> <!-- 页面1的内容 --> <div data-role="page" id="page2"> <!-- 页面2的内容 --> ``` ### 5. List View 结合多页面 在多页面模板中,我们可以利用 List View 显示数据,并...

    vue-cli-multipage:vue-cli-multipage多页面脚手架

    vue-cli-multipage2.0 主要功能 支持字体图标,css分离打包 各入口文件分离打包,第三方库模块打包,公共组件分离打包 支持vue-router路由按需加载 可自定义页面入口模块名 整合了UI框架,vant 基于webpack4 热更新 ...

    jsreport-multipage-export:将多个HTML导出到单个PDF

    jsreport-multipage-export 您可以将多个HTML导出为单个PDF 这段代码基于 您可以查看他们的文档以了解如何设计HTML和传递参数 港口 服务器正在端口8010上运行,您可以在配置中对其进行更改 退出开始 安装套件 npm ...

    webpack-multipage-example

    1. **入口(Entry)**:在配置文件中,你需要定义每个页面的入口文件,例如 `entry: { page1: './src/page1.js', page2: './src/page2.js' }`。这告诉 Webpack 从哪些文件开始构建。 2. **输出(Output)**:指定打包后...

    vuemultipagecli简单的多页CLI用于Vuejs构建的脚手架

    `vue-multipage-cli` 是一个专门为Vue.js设计的命令行工具(CLI),它简化了多页面应用程序(Multipage Application,MPA)的构建过程。MPA与单页应用(SPA)不同,每个页面都有独立的HTML、CSS和JavaScript,适合...

    Jekyll-Multipage:Jekyll 插件可将帖子拆分到多个页面,具有广泛的配置选项

    它是一个 Jekyll 生成器插件,可将帖子(或页面)拆分到多个子页面,并具有广泛的配置选项。它的要求是什么? 您只需要 Ruby,当然还有 。它有什么作用? 此插件可让您将帖子指定为multipage ,这意味着这些帖子将...

Global site tag (gtag.js) - Google Analytics