把GEF editor集成到Multi-page editor中
Posted on 2008-01-07 12:10 鬼谷子 閱讀(992) 評論(0) 編輯 收藏 所屬分類: GEF&EMF&GMF轉自:http://superinfinite.spaces.live.com/blog/cns!59C5F00DCFF3DBDB!221.entry
由于一個需求是要在GEF的一個畫布外,再提供一個view顯示JSP的流程(其實這個功能沒大必要,但實現起來卻不容易)。
不管怎么說,還是要照著需求去做滴。
其實,在看了需求后,我就意識到了可能要做成一個Multi-page。 由于時間不多,沒來的及仔細考慮,
一開始還是做成普通的GEF編輯器,在把application flow基本上搞定之后,再次回到這個問題上。
沒辦法,繼續看別人的代碼(反編譯的),myeclipse中的web-designer,就象dreamweaver一樣有3種視圖,雖然這是我以后要做的,但卻沒有采用它的做法。
記的struts-box的struts-config editor有個visualizer的頁面(真巧,和我現在寫的plugin名字一樣),它是一個GraphicalViewer ,做法其實挺簡單的。
構建一個Multi-page editor的框架。
把一個視圖作為一個page放到這個Multi-page editor中。
為這個page寫一個Section,
protected void createClient(Section section, FormToolkit toolkit) {
Composite container = toolkit.createComposite(section);
FillLayout layout = new FillLayout();
container.setLayout(layout);
GraphicalViewer viewer = ((VisualizerEditor)editor).createGraphicalViewer(container);
Composite container = toolkit.createComposite(section);
FillLayout layout = new FillLayout();
container.setLayout(layout);
GraphicalViewer viewer = ((VisualizerEditor)editor).createGraphicalViewer(container);
section.setClient(container);
}
這個viewer呢 ,當然是原來那個GEF editor中的viewer了。
這時候那個新建的Multi-page當然也要改了,addPage()就不說了,
以后是要用這個Multi-page editor打開的,所以原來那個GEF 的editor中的幾個方法是調用不到的。
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
super.init(site,input);
appFlowVisualEditor.init(site, input);
this.visualizer = appFlowVisualEditor.getVisualizer();
appFlowVisualEditor.setVisualizerEditor(this);
}
throws PartInitException {
super.init(site,input);
appFlowVisualEditor.init(site, input);
this.visualizer = appFlowVisualEditor.getVisualizer();
appFlowVisualEditor.setVisualizerEditor(this);
}
這是一個,其它的就缺什么補什么,debug的時候可以看出來的。
還有一點,就是如果沒在section中另外加listener 的話,你在page中編輯GEF的元素,編輯器是不會標志dirty的,所以在section中為CommandStack加一個listener:
viewer.getEditDomain().getCommandStack().addCommandStackEventListener(new CommandStackEventListener(){
public void stackChanged(CommandStackEvent arg0) {
markDirty();
}
});
markDirty();
}
});
在editor init()的時候 getCommandStack().addCommandStackListener(this) (editor實現CommandStackListener) Section中就不需要加了。
要覆蓋FormEditor的isDirty()方法
這樣編輯器會在你對GEF元素進行操作后會給title標上一個*號。今天試了一下,卻發現無論怎么保存,那個星號還在,仔細一看,原來忘加了個comit的方法:
private void commitFormPages(boolean b) {
IFormPage[] pages = getPages();
for (int i = 0; i < pages.length; i++) {
IFormPage page = pages[i];
IManagedForm mform = page.getManagedForm();
if (mform != null && mform.isDirty())
mform.commit(true);
}
IFormPage[] pages = getPages();
for (int i = 0; i < pages.length; i++) {
IFormPage page = pages[i];
IManagedForm mform = page.getManagedForm();
if (mform != null && mform.isDirty())
mform.commit(true);
}
}
protected IFormPage[] getPages() {
List formPages = new ArrayList();
for (int i = 0; i < pages.size(); i++) {
Object page = pages.get(i);
if (page instanceof IFormPage)
formPages.add(page);
}
return (IFormPage[]) formPages.toArray(new IFormPage[formPages.size()]);
}
protected IFormPage[] getPages() {
List formPages = new ArrayList();
for (int i = 0; i < pages.size(); i++) {
Object page = pages.get(i);
if (page instanceof IFormPage)
formPages.add(page);
}
return (IFormPage[]) formPages.toArray(new IFormPage[formPages.size()]);
}
呵呵,以后不會忘了吧。