MultiPageEditorPart 的addPage方法
public int addPage(Control control)
{
int i = getPageCount();
addPage(i, control);
return i;
}
public void addPage(int i, IEditorPart ieditorpart, IEditorInput ieditorinput)
throws PartInitException
{
IEditorSite ieditorsite = createSite(ieditorpart);
ieditorpart.init(ieditorsite, ieditorinput);
Composite composite = new Composite(getContainer(), getOrientation(ieditorpart));
composite.setLayout(new FillLayout());
ieditorpart.createPartControl(composite);
ieditorpart.addPropertyListener(new IPropertyListener() {
public void propertyChanged(Object obj, int j)
{
handlePropertyChange(j);
}
}
);
CTabItem ctabitem = createItem(i, composite);
ctabitem.setData(ieditorpart);
nestedEditors.add(ieditorpart);
}
那么有辦法把一個EditorPart 加入Composite再放到Page里面呢?
public void addHtmlPage(IEditorPart ieditorpart, IEditorInput ieditorinput) throws PartInitException {
final SashForm sashForm = new SashForm(getContainer(), SWT.NONE);
final Composite pageContainer = new Composite(sashForm, SWT.NONE);
sashForm.setSashWidth(1);
final Composite resultContainer = new Composite(sashForm, SWT.NONE);
resultContainer.setLayout(new FillLayout());
sashForm.setWeights(new int[] {1, 1 });
createAnalyzePage(resultContainer);
IEditorSite ieditorsite = createSite(ieditorpart);
ieditorpart.init(ieditorsite, ieditorinput);
pageContainer.setLayout(new FillLayout());
ieditorpart.createPartControl(pageContainer);
ieditorpart.addPropertyListener(new IPropertyListener() {
public void propertyChanged(Object obj, int j) {
handlePropertyChange(j);
}
});
int index = addPage(sashForm);
setPageText(index, "html");
}
視乎這樣就可以了,但是問題出現了.缺少了父類
nestedEditors.add(ieditorpart);對editor生命周期的管理.導致屬性編輯器出問題.怎么解決呢?
private CTabFolder container;
private ArrayList nestedEditors;
MultiPageEditorPart 聲明的都是私有的屬性,按照面向對象的設計是不能被繼承者訪問的.
那怎么辦呢?這時候就該使用錘子了."Reflect"
CTabFolder container = (CTabFolder) getParentFileValue(MultiPageEditorPart.class,(MultiPageEditorPart)this, "container");
CTabItem ctabitem = new CTabItem(container, 0, i);
ctabitem.setControl(composite);
ctabitem.setData(ieditorpart);
ArrayList nestedEditors = (ArrayList) getParentFileValue(MultiPageEditorPart.class,(MultiPageEditorPart)this, "nestedEditors");
nestedEditors.add(ieditorpart);
public static Object getParentFileValue(Class parentClassType,Object object, String filedName) {
Field fild = null;
Object fildValue = null;
try {
fild = parentClassType.getDeclaredField(filedName);
fild.setAccessible(true);// 設置安全檢查,訪問私有成員變量必須
fildValue = fild.get(object);
} catch (NoSuchFieldException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
return fildValue;
}
呵呵,問題解決了.