eroself

          關于人生的程式,在這里譜寫......
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理

          把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);
           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);
           }
           
          這是一個,其它的就缺什么補什么,debug的時候可以看出來的。
           
          還有一點,就是如果沒在section中另外加listener 的話,你在page中編輯GEF的元素,編輯器是不會標志dirty的,所以在section中為CommandStack加一個listener:
          viewer.getEditDomain().getCommandStack().addCommandStackEventListener(new CommandStackEventListener(){
             public void stackChanged(CommandStackEvent arg0) {
              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);
            }
           }
           
           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()]);
           }
           
          呵呵,以后不會忘了吧。

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 襄城县| 台南市| 故城县| 龙海市| 金山区| 尼木县| 朝阳市| 蓬莱市| 囊谦县| 平凉市| 淅川县| 华容县| 浏阳市| 东方市| 文昌市| 美姑县| 博罗县| 广德县| 偏关县| 固安县| 瓮安县| 公安县| 建湖县| 陇西县| 龙山县| 浦城县| 金秀| 年辖:市辖区| 教育| 咸丰县| 海安县| 简阳市| 五常市| 宾阳县| 阳高县| 乌拉特中旗| 梁河县| 都安| 民和| 温州市| 泰宁县|