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

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

阅读更多

在MultipageEditor应用中属性页(PropertyPage)的同步和OutlinePage的同步比较相似,也是在MultipageEditor的getAdaptor方法返回一个外壳PropertySheetPage,在pageChange的时候切换不同的PropertyPage,源代码:

public class KULMultiPagePropertySheetPage extends PropertySheetPage implements
		IPropertySheetPage {
	// Current active property page
	private IPropertySheetPage activePage;
	// instance of KULEditor PropertyPage;
	private IPropertySheetPage textPropertyPage;
	// instance of KULDiagramEditor PropertyPage
	private IPropertySheetPage diagramPropertyPage;
	// The Multipage property page control
	private Composite control;
	// The control contains KULEditor property page
	private Composite textControl;
	// The control contains KULDiagramEditor property page
	private Composite diagramControl;
	// The active editor flag, diagram editor 0, text editor 1
	private int activeEditor = -1;
	/**
	 * Set the active editor.
	 * This property page shows the property which is provided by given editor.
	 * 
	 * @param editor the active editor
	 */
	public void setActiveEditor(IEditorPart editor){
		
		createPropertyPageForEditor(editor);
	
		if(control!=null){
			if(activePage!=null){
				initActivePage();
				if(this.activeEditor == 0) {
					this.createDiagramControl(control);
					if(this.diagramControl != null)
						((StackLayout)control.getLayout()).topControl = this.diagramControl;
				}
				else if(this.activeEditor == 1) {
					this.createTextControl(control);
					if(this.textControl != null)
						((StackLayout)control.getLayout()).topControl = this.textControl;
				}
				activePage.setActionBars(getSite().getActionBars());
				getSite().getActionBars().updateActionBars();
				control.layout();
			}
		}
	}
	/**
	 * Create the property page and init related attribute
	 * @param editor
	 */
	private void createPropertyPageForEditor(IEditorPart editor) {
		if(editor instanceof KULDiagramEditor) {
			createDiagramPropertyPage(editor);
			activePage = diagramPropertyPage;
			this.activeEditor = 0;
		} 
		else if(editor instanceof KULEditor) {
			createTextPropertyPage(editor);
			activePage = textPropertyPage;
			this.activeEditor = 1;
		}
	}

	private void createTextPropertyPage(IEditorPart editor) {
		if(textPropertyPage == null) {
			textPropertyPage = (IPropertySheetPage)editor.getAdapter(IPropertySheetPage.class);
		}
	}

	private void createDiagramPropertyPage(IEditorPart editor) {
		if(diagramPropertyPage == null) {
			diagramPropertyPage = (IPropertySheetPage)editor.getAdapter(IPropertySheetPage.class);
		}
	}
	
	public void createControl(Composite parent) {
		control = new Composite(parent, SWT.NULL);
		control.setLayout(new StackLayout());
		// if the active page is not null, init the property control	
		if(activePage == null){
			IEditorPart editor = null;
			try {
				editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
			} catch(Exception ex) {
				System.err.println("Error when fetch the active ecitor");
			}
			if(editor instanceof KULMultiPageEditor) {
				// create the property page
				createPropertyPageForEditor(((KULMultiPageEditor)editor).getKulActiveEditor());
			}
			
		} 
		if(activePage != null) {
			initActivePage();
			if(this.activeEditor == 0) {
				createDiagramControl(control);
				if(this.diagramControl != null)
					((StackLayout)control.getLayout()).topControl = this.diagramControl;
			} else if(this.activeEditor == 1) {
				createTextControl(control);
				if(this.textControl != null)
					((StackLayout)control.getLayout()).topControl = this.textControl;
			}
			control.layout();
		}
		
	}
	private void createDiagramControl(Composite parent) {
		if(this.activeEditor == 0 && this.diagramPropertyPage != null && (this.diagramControl==null || this.diagramControl.isDisposed())) {
			diagramControl = new Composite(parent, SWT.NULL);
			diagramControl.setLayout(new FillLayout());
			diagramPropertyPage.createControl(diagramControl);
		}
	}
	private void createTextControl(Composite parent) {
		if(this.activeEditor == 1 && this.textPropertyPage != null && (this.textControl==null || this.textControl.isDisposed())) {
			textControl = new Composite(parent, SWT.NULL);
			textControl.setLayout(new FillLayout());
			textPropertyPage.createControl(textControl);
		}
	}
	/**
	 * Initializes the active property 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){
				}
			}
		}
	}
	
	@Override
	public Control getControl() {
		if(control != null)
			return control;
		return super.getControl();
	}

	@Override
	public void setFocus() {
		if(activePage!=null /*&& !((Page) activePage).getControl().isDisposed()*/){
			activePage.setFocus();
		}
	}

	@Override
	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
		if(activePage!=null /*&& !((Page) activePage).getControl().isDisposed()*/){
			activePage.selectionChanged(part, selection);
		}

	}

	@Override
	public void dispose() {
		if(this.diagramPropertyPage != null) {
			this.diagramPropertyPage.dispose();
			if(this.diagramControl != null && !this.diagramControl.isDisposed()) {
				this.diagramControl.dispose();
			}
		}
		this.diagramPropertyPage = null;
		this.diagramControl = null;
		
		if(this.textPropertyPage != null) {
			this.textPropertyPage.dispose();
			if(this.textControl != null && !this.textControl.isDisposed()) {
				this.textControl.dispose();
			}
		}
		this.textControl = null;
		this.textPropertyPage = null;
		
		if(this.control != null && !this.control.isDisposed()) {
			this.control.dispose();
		}
		this.control = null;
		this.activePage = null;
		
		super.dispose();
		
	}

	@Override
	public void makeContributions(IMenuManager menuManager,
			IToolBarManager toolBarManager, IStatusLineManager statusLineManager) {
		if(activePage != null /*&& !((Page) activePage).getControl().isDisposed()*/) {
			((Page) activePage).makeContributions(menuManager, toolBarManager, statusLineManager);
		}
	}

	/*
	 * Override the method to make sure that the calling of makeContributions method of active page
	 * @see org.eclipse.ui.views.properties.PropertySheetPage#setActionBars(org.eclipse.ui.IActionBars)
	 */
	public void setActionBars(IActionBars actionBars) {
		if(activePage != null /*&& !((Page) activePage).getControl().isDisposed()*/) {
			((Page) activePage).setActionBars(actionBars);
		}
	}

	@Override
	public IPageSite getSite() {
		return super.getSite();
	}
	
}
 

不多说了,原理就是不同的Tab对应的PropertyPage编辑器可以用Stacklayout组织起来,当切换不同的tab时把对应的PropertyPage放到StackLayout的最上边就好了

((StackLayout)control.getLayout()).topControl=activeEditor
 

 

分享到:
评论

相关推荐

    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