0

各ページにコピーと貼り付けの削除アクションと f3 ナビゲーション アクションがある複数ページのエディターがあります。コンテキストを作成し、アクションをアクティブ化および非アクティブ化します

以下は、plugin.xml がどのように見えるかです。

<extension
         point="org.eclipse.ui.bindings">
      <key
            commandId="com.sap.adt.wda.controller.ui.navigate"
            contextId="com.sap.adt.wda.controller.ui.contextTabScope"
            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
            sequence="F3">
      </key>

</extension>
   <extension
         point="org.eclipse.ui.contexts">
      <context
            description="%context_navigateToController_ymsg"
            id="com.sap.adt.wda.controller.ui.contextTabScope"
            name="%context_navigateToController_yins"
            parentId="org.eclipse.ui.contexts.window">
      </context>
   </extension>

これは、コンテキストのアクティブ化と非アクティブ化によって行われます。以下はコードスニペットです。

private void activateHandlers() {
        IContextService contextService = (IContextService) (PlatformUI.getWorkbench().getService(IContextService.class));
        if (contextService != null) {
            activation = contextService.activateContext(IControllerConstants.CONTEXT_TAB_ECLIPSE_CONTEXT_ID);
        }
        IEditorSite site = getEditor().getEditorSite();
        IHandlerService service = (IHandlerService) site.getService(IHandlerService.class);

        IHandlerActivation navigateHandlerActivation = service.activateHandler(NavigationHandler.COMMAND_ID, new NavigationHandler());
        activatedHandlers = new ArrayList<IHandlerActivation>();
        activatedHandlers.add(navigateHandlerActivation);
    }


    public void deactivateHandlers() {
        IContextService contextService = (IContextService) (PlatformUI.getWorkbench().getService(IContextService.class));
        contextService.deactivateContext(activation);
        IHandlerService service = (IHandlerService) getEditor().getEditorSite().getService(IHandlerService.class);
        if (activatedHandlers != null) {
            service.deactivateHandlers(activatedHandlers);
            activatedHandlers = null;
        }
    }

これらの 2 つのメソッドは、ページがアクティブになるとコンテキストをアクティブにし、ページがアクティブでないときに非アクティブにするために、ページ変更からそれぞれ呼び出されます。

問題は、エディターを切り替えると pagechange が呼び出されないため、開いている別のエディターと競合することです!! これを実装する最良の方法を教えてください。

4

1 に答える 1

1

エディターの sourceViewer にフォーカス リスナーを追加します。

    focusListener = new FocusListener() {

        @Override
        public void focusLost(FocusEvent e) {
            deactivateHandlers();
        }

        @Override
        public void focusGained(FocusEvent arg0) {
            activateHandlers();
        }
    };

   sourceViewer.getTextWidget().addFocusListener(focusListener);

すべてのページの切り替え時に、focusLost と focusGained が呼び出されます。activateHandlers() と activateHandlers() をオーバーライドして、エディターの各部分のそれぞれのハンドラーを有効または無効にします

于 2013-09-04T07:13:21.090 に答える