Gef中MultiPageEditorPart中属性页和Outline的使用

当使用Eclipse的多页签Editor时,如果按照单个Editor的Property页和Outline的设计,会出现两个Editor使用同一个CommandStack和多页签的Outline不能切换的问题,经过试验以两个页签为例使用下面的解决方案:建立在于MultPageEditorPart级别的IPropertySheetPage和IContentOutlinePage然后通过获取MultiPageEditorPart的pageChange(int index)方法来动态的设置相应的Property和Outline。具体是先步骤:
1.建立MultiPageEditorPart的子类FormEditor,主要实现CreatePages方法,在这个方法里边具体是的实现相应两个子Editor的初始化工作,并且使用阿addPage(Editor,EditorInput)方法把它们加入到MultiPageEditorPart中
2.实现相应的getAdapter(Class)方法,当传入的Class是IPropertySheetPage和IContentOutlinePage的时候,初始化相应的MultiPageEditorPart级别的PropertySheetPage和ContentOutlinePage,这两个类的实现代码如下:


import java.util.HashMap;
import java.util.Map;

import org.eclipse.jface.viewers.ISelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.SubActionBars;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.views.properties.IPropertySheetPage;
import org.eclipse.ui.views.properties.PropertySheetPage;

/**
* @author kang.ao
*
*
*/
public class FormPropertySheetPage extends PropertySheetPage implements IPropertySheetPage {
private PageBook pagebook;
private Map recMap = new HashMap();
private PropertySheetPage defaultPage;
private IActionBars actionBars;
private IPropertySheetPage currentPage;
private boolean disposed = false;

class PageRec {
IPropertySheetPage page;
SubActionBars bars;
void setBarsActive(boolean active) {
if (active)
bars.activate();
else
bars.deactivate();
}
}

public FormPropertySheetPage() {
defaultPage = new PropertySheetPage();
}

public void createControl(Composite parent) {
pagebook = new PageBook(parent, SWT.NULL);
defaultPage.createControl(pagebook);
if (currentPage != null)
setPageActive(currentPage);
}
private PageRec createPageRec(IPropertySheetPage page) {
if (actionBars == null)
return null;
PageRec rec = new PageRec();
rec.page = page;

rec.bars = new SubActionBars(actionBars);
getPageControl(page);

page.setActionBars(rec.bars);
recMap.put(page, rec);
return rec;
}
public void dispose() {
updateActionBars();

if (pagebook != null && !pagebook.isDisposed())
pagebook.dispose();
pagebook = null;
disposed = true;
super.dispose();
}

public boolean isDisposed() {
return disposed;
}

public Control getControl() {
return pagebook;
}
private Control getPageControl(IPropertySheetPage page) {
Control control = page.getControl();
if (control == null || control.isDisposed()) {
// first time
page.createControl(pagebook);
control = page.getControl();
}
return control;
}
public void selectionChanged(IWorkbenchPart part, ISelection sel) {
if (currentPage != null)
currentPage.selectionChanged(part, sel);
}
public void setActionBars(IActionBars bars) {
this.actionBars = bars;

createPageRec(defaultPage);

if (currentPage != null) {
PageRec rec = createPageRec(currentPage);
setPageActive(rec);
updateActionBars();
}
}
public void setDefaultPageActive() {
setPageActive(defaultPage);
}
public void setFocus() {
if (currentPage != null)
currentPage.setFocus();
}
private void setPageActive(PageRec pageRec) {
IPropertySheetPage page = pageRec.page;
Control control = getPageControl(page);
pagebook.showPage(control);
pageRec.setBarsActive(true);
}
public void setPageActive(IPropertySheetPage page) {
IPropertySheetPage oldPage = currentPage;
this.currentPage = page;
if (pagebook == null) {
return;
}
if (oldPage != null) {
PageRec oldRec = (PageRec) recMap.get(oldPage);
if (oldRec != null) {
oldRec.setBarsActive(false);
}
}
PageRec rec = (PageRec) recMap.get(page);
if (rec == null) {
rec = createPageRec(page);
}
if (rec != null) {
setPageActive(rec);
updateActionBars();
}
}
private void updateActionBars() {
actionBars.updateActionBars();
}

}

OutlinePage:

/*
* 创建日期 Oct 31, 2005
*
*/
package com.kenoah.kde.formdesignerX;

import org.eclipse.gef.EditPartViewer;
import org.eclipse.gef.ui.parts.ContentOutlinePage;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.part.IPageSite;
import org.eclipse.ui.part.PageBook;
import org.eclipse.ui.views.contentoutline.IContentOutlinePage;

import com.kenoah.kde.formdesignerX.utils.FormdesignerImages;

/**
* @author kang.ao
*
*
*/
public class FormContentOutline extends ContentOutlinePage implements IContentOutlinePage {

private PageBook pagebook;
private IContentOutlinePage currentPage;
private boolean disposed;
private IAction showOutlineAction, showOverviewAction;
public static final int ID_OUTLINE = 0;
public static final int ID_OVERVIEW = 1;

public FormContentOutline(EditPartViewer viewer) {
super(viewer);
}
/**
* @see org.eclipse.ui.part.IPage#createControl(Composite)
*/
public void createControl(Composite parent) {
pagebook = new PageBook(parent, SWT.NONE);
configureOutlineViewer();
if (currentPage != null)
setPageActive(currentPage);
showPage(ID_OUTLINE);
}

private void configureOutlineViewer() {
IToolBarManager tbm = getSite().getActionBars().getToolBarManager();
showOutlineAction = new Action() {
public void run() {
showPage(ID_OUTLINE);
}
};
showOutlineAction.setImageDescriptor(FormdesignerImages.getImageDescriptor(FormdesignerImages.OUTLINE));
tbm.add(showOutlineAction);
showOverviewAction = new Action() {
public void run() {
showPage(ID_OVERVIEW);
}
};
showOverviewAction.setImageDescriptor(FormdesignerImages
.getImageDescriptor(FormdesignerImages.OVERVIEW));
tbm.add(showOverviewAction);
}
protected void showPage(int id_outline2) {
if(currentPage instanceof IOutlinePageShowPage){
((IOutlinePageShowPage)currentPage).showPage(id_outline2);
if(id_outline2==ID_OVERVIEW){
showOutlineAction.setChecked(false);
showOverviewAction.setChecked(true);
}else{
showOutlineAction.setChecked(true);
showOverviewAction.setChecked(false);
}
}

}
private int getCurrentPageId(){
if(showOverviewAction!=null && showOutlineAction!=null){
if(showOverviewAction.isChecked())
return ID_OVERVIEW;
if(showOutlineAction.isChecked()){
return ID_OUTLINE;
}
}
return ID_OUTLINE;
}
/**
* @see org.eclipse.ui.part.IPage#dispose()
*/
public void dispose() {
if (pagebook != null && !pagebook.isDisposed())
pagebook.dispose();
pagebook = null;
disposed = true;
}

public boolean isDisposed() {
return disposed;
}

/**
* @see org.eclipse.ui.part.IPage#getControl()
*/
public Control getControl() {
return pagebook;
}

/**
* @see org.eclipse.ui.part.IPage#setActionBars(IActionBars)
*/
public void setActionBars(IActionBars actionBars) {
}

/**
* @see org.eclipse.ui.part.IPage#setFocus()
*/
public void setFocus() {
if (currentPage != null)
currentPage.setFocus();
}

/**
* @see org.eclipse.jface.viewers.ISelectionProvider#addSelectionChangedListener(ISelectionChangedListener)
*/
public void addSelectionChangedListener(ISelectionChangedListener listener) {
if (currentPage != null)
currentPage.addSelectionChangedListener(listener);
}

/**
* @see org.eclipse.jface.viewers.ISelectionProvider#getSelection()
*/
public ISelection getSelection() {
return (currentPage != null) ? currentPage.getSelection() : null;
}

/**
* @see org.eclipse.jface.viewers.ISelectionProvider#removeSelectionChangedListener(ISelectionChangedListener)
*/
public void removeSelectionChangedListener(ISelectionChangedListener listener) {
if (currentPage != null)
currentPage.removeSelectionChangedListener(listener);
}

/**
* @see org.eclipse.jface.viewers.ISelectionProvider#setSelection(ISelection)
*/
public void setSelection(ISelection selection) {
if (currentPage != null)
currentPage.setSelection(selection);
}

public void setPageActive(IContentOutlinePage page) {
this.currentPage = page;
if (pagebook == null) {
return;
}
if(getSite()!=null){
if(page instanceof ContentOutlinePage){
((ContentOutlinePage)page).init(getSite());
}
Control control = page.getControl();
if (control == null || control.isDisposed()) {
page.createControl(pagebook);
control = page.getControl();

}
pagebook.showPage(control);
showPage(getCurrentPageId());
}
}

public void init(IPageSite pageSite) {
super.init(pageSite);
}
}

在MultiPageEditorPart的 protected void pageChange(int newPageIndex);方法中进行更新当前的激活Editor的PropertySheetPage和OutlinePage,方法如下:
更新PropertySheet:

void updatePropertySheet(IEditorPageBase part) {
if (part != null) {
IPropertySheetPage propertySheetPage = part.getPropertySheetPage();
if (propertySheetPage != null) {
propertySheet.setPageActive(propertySheetPage);
} else {
propertySheet.setDefaultPageActive();
}
}
}

更新OutlinePage:

void updateOutline(IEditorPageBase part) {
IContentOutlinePage page = null;
if (part != null) {
page = ((IEditorPageBase) part).getOutlinePage();
if (page != null && contentOutline!=null)
contentOutline.setPageActive(page);
}
}

具体的子Editor中的获得PropertySheet和OutlinePage的方法可以参照Gef例子中的编写,在子Editor中初始化Outline的时候由于同一使用MultiPageEditorPart中的OutlinePage的Action,所以在子Editor的OutlinePage中不能去设定Action按钮,具体的参照FormContentOutline的Action的初始化,这点是与gef例子中给的不同的!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值