[导入]Editor中嵌入Editor


作者: liugang594  链接:http://liugang594.javaeye.com/blog/208495  发表时间: 2008年06月27日

声明:本文系JavaEye网站发布的原创博客文章,未经作者书面许可,严禁任何网站转载本文,否则必将追究法律责任!

Editor中嵌入Editor

                                                            ---Eclipse系列(刘刚)

一、背景

有时按照功能的需要,我们希望能在自己的Editor中嵌入其他已经存在的Editor,比如JavaEditor,比如XMLEditor,以方便的使用这些Editor已经有的一些方便特性。

二、思路

   粗看来,好像无计可施,实际不然。如果你曾经实现过自己的MultiEditor,并且在其他的某一页中是直接引用的其他的Editor,那么你肯定记得:在MultiEditoraddPage()系列方法中,有一个方法是:

public int addPage(IEditorPart editor, IEditorInput input)

这个方法表明,可以直接把一个Editor做为一个page加到MultiEditor中去。所以我们的实现可以参考MultiEditor

我们可以找到MultiEditor中,addPage(editor,input)部分的源码:

 

     public void addPage(int index, IEditorPart editor, IEditorInput input)

              throws PartInitException {

          IEditorSite site = createSite(editor);

          // call init first so that if an exception is thrown, we have created no

          // new widgets

          editor.init(site, input);

          Composite parent2 = new Composite(getContainer(),

                   getOrientation(editor));

          parent2.setLayout(new FillLayout());

          editor.createPartControl(parent2);

          ……

     }

 

看上部分代码,我们可以知道:要把一个editor A作为某个editor B的一部分加进去,我们首先需要有一个A的对象,然后这个A对象要调用init(site,input)方法,最后要创建一个面板,调用A对象的createPartControl(parent)方法,以在这个面板上画出A的界面。

 

三、实现

有了以上思路,下面我们就可以在自己的editor中嵌入其他的editor了。首先我们要定义一个自己的editor,这里省略过程。然后我定义了一个名为ComboEditorEditor。我要在这其中嵌入JavaEditorTextEditor

我一开始设想代码如下(在createPartControl()方法里):

 

     public void createPartControl(Composite parent) {

          try {

              parent.setLayout(new GridLayout());

              // TODO Auto-generated method stub

              TextEditor textEditor = new TextEditor();

              textEditor.init(site, input);

              Composite parent2 = new Composite(parent,

                        textEditor.getOrientation());

              parent2.setLayout(new FillLayout());

              parent2.setLayoutData(new GridData(GridData.FILL_BOTH));

              textEditor.createPartControl(parent2);

 

              CompilationUnitEditor javaEditor = new CompilationUnitEditor();

              javaEditor.init(site, input);

              Composite parent3 = new Composite(parent,

                        javaEditor.getOrientation());

              parent3.setLayout(new FillLayout());

              parent3.setLayoutData(new GridData(GridData.FILL_BOTH));

              javaEditor.createPartControl(parent3);

             

          } catch (PartInitException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

          }

     }

其中,init(site,input)方法如下:

 

     private IEditorSite site;

     private IEditorInput input;

     @Override

     public void init(IEditorSite site, IEditorInput input)

              throws PartInitException {

          this.site = site;

          this.input = input;

          setSite(site);

          setInput(input);

     }

 

需要注意的是:我们在init(site,input)方法中,需要显式的调用setSite(site)setInput(input),否则在打开editor的时候,总是会有site不对或者是input为空的错误。

 

四、测试

最后我们可以试一下效果:

Figure 1

 

五、后记

 

如果需要实现dirty功能,我们需要监听每一个editor的变化。可以实现如下:

            首先增加监听:

                             textEditor.addPropertyListener(this);

              javaEditor.addPropertyListener(this);

            这里,我们让我们的editor实现IPropertyListener接口。

然后就是实现接口的方法,如下:

                 public void propertyChanged(Object source, int propId) {

               firePropertyChange(propId);

     }

最后实现isDirty()方法:

            private List<IEditorPart> nestedEditors = new

ArrayList<IEditorPart>();

    

     public boolean isDirty() {

          // use nestedEditors to avoid SWT requests; see bug 12996

          for (IEditorPart part:nestedEditors) {

              if (part.isDirty()) {

                   return true;

              }

          }

          return false;

}

 

其中nestedEditors中保存了所有的内嵌的editor


本文的讨论也很精彩,浏览讨论>>


JavaEye推荐




文章来源:http://liugang594.javaeye.com/blog/208495

posted on 2008-07-14 17:48  刘刚  阅读(342)  评论(0编辑  收藏  举报

导航