3

現在、次のEclipseRCPコマンドに苦労しています。

  • org.eclipse.ui.edit.cut
  • org.eclipse.ui.edit.copy
  • org.eclipse.ui.edit.paste

handledツールバーのコマンドコントリビューションとして使用していますが、これらのコマンドの''状態が変更されても、UIElements(ツールバーアイテム)は更新されません。

テストでは、ポーリングメカニズムを使用して、現在フォーカスされている要素に応じてこれらのコマンドの状態が実際に変化することを確認しました。ハンドラーは同じままですが、ハンドラーの「処理済み」状態が適切に変化し、コマンド「処理済み」が発生することがわかりました。状態もきちんと変化します。

唯一の問題は、これらの状態の変化のいずれも通知を引き起こさないため(コマンドICommandListenerでもハンドラーでもIHandlerListener)、UIElementsが更新されないことです。

コマンドの状態を観察するためのテストコードは次のとおりです。

ICommandService commandService = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);

final String commandId="org.eclipse.ui.edit.copy";
Command command = commandService.getCommand(commandId);
command.addCommandListener(new ICommandListener() {

    public void commandChanged (CommandEvent commandEvent) {
        System.out.println(">> Command changed: " + commandId);
    }
});

私は何かが足りないのですか、それともこれはカット/コピー/貼り付けハンドラーの実装のバグですか?洞察はありますか?

編集: コマンドは常に有効になっており、ハンドラーが交換されることはありません。フォーカスがあるui要素に応じて、ハンドラーの' handled'状態(したがってコマンドの' '状態)のみが変更されます。handledただし、この状態が変化しても通知はありません。これにより、ツールバーボタンが常に有効になり、それらを押すと。が発生しorg.eclipse.core.commands.NotHandledException: There is no handler to execute for commandます。

4

3 に答える 3

1

切り取り/コピー/貼り付けコマンド用に登録されているハンドラはorg.eclipse.ui.internal.handlers.WidgetMethodHandler. このハンドラーは、指定されたメソッドが現在のディスプレイのフォーカス コントロールで宣言されているかどうかを確認します。実行されると、そのハンドラーはリフレクションを使用してメソッドを呼び出します。

WidgetMethodHandler からのスニペット:

 public final boolean isHandled() {
     return getMethodToExecute() != null;
 }

は、getMethodToExecute()を使用して現在のフォーカス コントロールを見つけ、Display.getCurrent().getFocusControl()指定されたトリガー メソッドが宣言されているかどうかを確認します。

org.eclipse.swt.widgets.Texthave cut()、メソッドなどのウィジェット。このようなウィジェットにフォーカスがある場合copy()paste()ハンドラーは に対して「true」を返しますisHandled()

ただし、このハンドラーは、現在のフォーカス コントロールが変更されたときに認識しないため (ディスプレイでこれを観察する方法さえないと思います)、動的な「isHandled」状態の変更について通知することはできません。

これにより、切り取り/コピー/貼り付けコマンドはポップアップ メニューには適していますが、ツールバーで使用すると、ハンドラーが通知を行わないと UI 要素を適切に更新できないため、非常に問題があります。

これにより、ツールバーでこれらのコマンドを使用しないか、ポーリング メカニズムを使用して UI 要素を更新する必要があります (これも問題があり、エラーが発生しやすくなります)。:-(

于 2009-06-08T09:10:37.797 に答える
-1

問題は、Eclipseが現在選択されている「何か」をクリップボードにコピーする方法を知っている必要があるため、テキスト以外のもののハンドラーを登録する必要があることです。それがハンドラーが行うことです。Eclipse wikiのこの記事では、ハンドラーを作成して登録する方法を紹介します。

于 2009-05-26T10:12:45.447 に答える
-1

私は間違っているかもしれませんが、問題の原因はハンドラーが常に有効になっていることです。

Platform Plug-in Developer Guide > Programmer's Guide > Plugging into the workbench > Basic workbench extension points using commands > Handlers を参照してください。

<activeWhen/>および プログラムのコア式 のplugin.xml式は、ハンドラのアクティブ化の範囲を決定するために使用されます。たとえば、特定のウィンドウ、特定Shellの 、アクティブ パーツ タイプ、アクティブ パーツなどです。

   <extension
         point="org.eclipse.ui.handlers">
      ...
      <handler
            class="org.eclipse.ui.examples.contributions.view.SwapInfoHandler"
            commandId="org.eclipse.ui.examples.contributions.view.swap">
         <activeWhen>
            <reference
                  definitionId="org.eclipse.ui.examples.contributions.view.inView">
            </reference>
         </activeWhen>
         <enabledWhen>
            <count
                  value="2">
            </count>
         </enabledWhen>
      </handler>
      ...
于 2009-06-08T01:49:36.853 に答える