Eclipse RCP:View 与 Editor 交互

parts 之间有三种交互方式:

(1)使用 selection
IWorkbenchSite 允许 view 和 editor 调用其 setSelectionProvider 方法发布 其selection,其他 view 和 editor 可以通过 ISelectionService.addSelectionListener(ISelectionListener) 注册监听selection,然后做出交互。

例如,ContactView 将 TreeViewer 发布为 SelectionProvider,AddContactAction将自己注册为 SelectionListener,当 TreeViewer 发生 selection 事件时通知AddContactAction 进行处理。

org.eclipsercp.hyperbola/ContactsView

public void createPartControl(Composite parent) {
 
      treeViewer= new TreeViewer(parent, SWT.BORDER | SWT.MULTI
                        |SWT.V_SCROLL);
        getSite().setSelectionProvider(treeViewer);
        ……
}
org.eclipsercp.hyperbola/AddContactAction
public AddContactAction(IWorkbenchWindow window) {
        this.window = window;
        setId(ID);
        setActionDefinitionId(ID);
        setText("&AddContact..." );
        setToolTipText("Adda contact to your contacts list." );
        setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugi n(
                        Application.PLUGIN_ID,IImageKeys.ADD_CONTACT));
        window.getSelectionService().addSelectionListener(this);
}

public void dispose() {
        window.getSelectionService().removeSelectionListener(this);
}

public void selectionChanged (IWorkbenchPart part, ISelectionincoming) {
        //Selection containing elements
        if(incoming instanceof IStructuredSelection) {
                selection= (IStructuredSelection) incoming;
                setEnabled(selection.size()== 1
                                &&selection.getFirstElement() instanceof RosterGroup);
        }else {
                //Other selections, for example containing text or of otherkinds.
                setEnabled(false);
        }
}


(2)Part listeners
使用 IPartService 注册 IPartListener,当 part 发生打开、关闭和隐藏等事件时通知IPartListener。

例如,当打开一个 chat editor 后,高亮选中 contact view 中的相应联系人,就可以使用此种方式。

创建 IPartListener

org.eclipsercp.hyperbola/ContactsView
private IPartListener partListener = new IPartListener() {
public void partOpened(IWorkbenchPart part) {
        trackOpenChatEditors(part);
}

public void partClosed(IWorkbenchPart part) {
        trackOpenChatEditors(part);
}

private void trackOpenChatEditors(IWorkbenchPart part) {
        if(! (part instanceof ChatEditor))
            return;
        ChatEditoreditor = (ChatEditor) part;
        ChatEditorInputinput = (ChatEditorInput) editor.getEditorInput();
        Stringparticipant = input.getParticipant();
        if(openEditors.contains(participant)) {
            openEditors.remove(participant);
        }else {
            openEditors.add(participant);
        }
        treeViewer.refresh(true);
}
...
};

注册 IPartListener

org.eclipsercp.hyperbola/ContactsView
public void createPartControl(Composite parent) {
...
getSite().getWorkbenchWindow().
            getPartService().addPartListener(partListener);
}

public void dispose() {
getSite().getWorkbenchWindow().
            getPartService().removePartListener(partListener);
}

ContactView 的 LabelProvider 根据 openEditors 来修改联系人的字体或者颜色:

org.eclipsercp.hyperbola/ContactsView
private class ContactsDecorator implements ILabelDecorator,IFontDecorator {
        ...
        publicFont decorateFont(Object element) {
            if(element instanceof RosterEntry) {
                RosterEntryentry = (RosterEntry)element;
                if(ContactsView.this.openEditors.contains(entry.getUser()))
                    returnJFaceResources.getFontRegistry().
                            getBold(JFaceResources.DEFAULT_FONT);
            }
            returnnull ;
        }
}

public void createPartControl(Composite parent) {
        treeViewer= new TreeViewer(parent, SWT.BORDER | SWT.MULTI
                |SWT.V_SCROLL);
        getSite().setSelectionProvider(treeViewer);
        HyperbolaLabelProviderhyperbolaLabelProvider = new
                HyperbolaLabelProvider();
        DecoratingLabelProviderdecorator = new
                DecoratingLabelProvider(hyperbolaLabelProvider,
                newContactsDecorator());
        treeViewer.setLabelProvider(decorator);
        ...
}
}

(3)直接交互

可以在 view 或者 editor 中调用其他 view、editor 的引用,也可以使用 IWorkbenchPage来打开关闭其他 view 或 editor 。但这种做法增加了 view、editor 的耦合。

参考:
《Eclipse Rich Client Platform Designing, Coding, and Packaging JavaApplications》:chapter16

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值