现在的位置: 首页 > 综合 > 正文

关联ViewPart和EditorPart

2013年02月08日 ⁄ 综合 ⁄ 共 2701字 ⁄ 字号 评论关闭
今天学习了EditorPart和ViewPart的关联行为.

达到的目标是当打开/激活一个Editor的时候, 在与这个Editor相关的View中显示相关的内容. 比如你打开一个Java文件, Outline里面显示这个Java文件的结构.

实际上很简单, 当然前提是如果你不想重写的话. 重写就比较麻烦, 这个不是今天我想说得问题.

实现一个View继承于ContentOutline. 这个类是org.eclipse.ui.views下面的, 必须要引入这个Plug-in.
然后重写createDefaultPage(PageBook book)这个方法.

public class MyView extends ContentOutline {
    
protected IPage createDefaultPage(PageBook book) {
        IPage page 
= super.createDefaultPage(book);
        
if (page instanceof MessagePage) {
           
//没有内容的时候显示的信息
           ((MessagePage)page).setMessage("Your Message.");
        }

        
return page;
    }

}

实际上我们可以看一下ContentOutline里面的这个方法

    protected IPage createDefaultPage(PageBook book)
    
{
        MessagePage page 
= new MessagePage();
        initPage(page);
        page.createControl(book);
        page.setMessage(defaultText);
        
return page;
    }

MessagePage里面只有一个Label显示信息, 注意看一下自己的Eclipse的Outline就可以知道.
这个页面是当选择的Editor没有需要MyView显示的内容或者没有Editor被选择的时候显示用.
当然你也可以自定义一个其他风格的页面.

那么我们如何知道Editor需要在这个View里面显示什么呢?
看一下EditorPart里面有个getAdapter(Class)方法, 就是他了.
ContentOutline是一个PartListener, 他会监听到所有的WorkbenchPart的打开, 激活, 关闭等等事件. 于是所有EditorPart打开/激活/关闭都可以知道, 而ContentOutline是只监听EditorPart的, ViewPart的这些事件他并不关心. 其实是没有处理, 忽略了.
在这些事件被ContentOutline监听到的时候, 他会调用EditorPart的getAdapter(Class)方法, 参数是IContentOutlinePage.class, 你所要做的事情就是重写EditorPart的getAdapter(Class)方法如下

public class MyEditor extends EditorPart {
    
private IContentOutlinePage page = null;

    
public Object getAdapter(Class adapterClass) {
        
if (IContentOutlinePage.class == adapterClass) {
            
if (page == null{
                page 
= new YourContentOutlinePage();
            }

            
return page;
        }
 else {
            
return super.getAdapter(adapterClass);
        }

    }

}

好了, 现在你打开/激活MyEditor的实例的时候, MyView里面会出来YourContentOutlinePage了.
当然这个在RCP时候可以这样使用, 但是在做Plug-In的时候就大可不必了, 因为Outline已经存在了. 只要写好MyEditor就行了.
至于YourContentOutlinePage怎么写, 大家看看IContentOutlinePage/IPage的定义就知道, 这里不多说了.

那么说说其他相关的事情, 为什么是IContentOutlinePage.class, 而不是其他呢?
看看下面的代码, 是从ContentOutline里面摘出来的

    protected org.eclipse.ui.part.PageBookView.PageRec doCreatePage(IWorkbenchPart part)
    
{
        Object obj 
= part.getAdapter(org.eclipse.ui.views.contentoutline.IContentOutlinePage.class);
        
if(obj instanceof IContentOutlinePage)
        
{
            IContentOutlinePage page 
= (IContentOutlinePage)obj;
            
if(page instanceof IPageBookViewPage)
                initPage((IPageBookViewPage)page);
            page.createControl(getPageBook());
            
return new org.eclipse.ui.part.PageBookView.PageRec(part, page);
        }
 else
        
{
            
return null;
        }

    }

看看红色的一段吧, 就是这个原因.
因此如果你有2个类似Outline的View, 而针对一个Editor需要显示不同的内容, 那么, 重写这个, 稍稍改一下, 一切不难实现.

抱歉!评论已关闭.