12

これは一般的な質問ですが、現在の問題はメニューの処理に関するものです。

コントリビューション メニュー アクションを備えた通常のプラグインでは、plugin.xml 構成で ActionSet などを構成します。これは明らかに理にかなっています。

私は RCP アプリケーション (実際には RAP) に取り組んでおり、plugin.xml を介してすべてを構成する価値があるかどうか疑問に思っています。私のプラグインは他の未知のプラグインとやり取りする必要がないので、理論的には私が制御できます。メニューとアクションをプログラムで追加できます。

サブメニューを含むメニューを構成しようとしています。ActionSet を定義し、1 つを別の内部にリンクしようとしましたが、成功しませんでした。ユーザーの役割によっては、一部の項目を無効にする必要があります。

数分ですべてをコーディングできたと思いますが、それが日食の「精神」に適合するかどうかはわかりません。

そこにはどのような意見がありますか?アプリケーションはかなり大きくなるので、最初からアプローチを正しく行いたいと思います。おそらく、誰かがネストされたメニューを構成するための例を教えてくれるでしょう:-)

4

4 に答える 4

25

私の意見では、plugin.xml の実装が最適です。

この方法を使用する主な理由は 2 つあります。

  • Java コードを書かなくても、メニューやボタンを簡単に再構成および再編成できます。
  • メニュー ツリーの非常に明確な階層表示。

メニューとサブメニューを実装するコード スニペットを次に示します。この例では、メイン メニューに追加されます。

これを plugin.xml に貼り付けることができます:

<extension
         name="Main Menu Contributions"
         point="org.eclipse.ui.menus">
 <menuContribution
        allPopups="false"
        locationURI="menu:org.eclipse.ui.main.menu">
     <menu
           id="fileMenu"
           label="File">
        <command
              commandId="org.eclipse.ui.file.exit"
              label="Exit"
              style="push">
        </command>
     </menu>
     <menu
           label="Edit">
        <command
              commandId="org.eclipse.ui.edit.selectAll"
              label="Select All"
              style="push">
        </command>
        <menu
              label="Submenu">
           <command
                 commandId="org.eclipse.ui.edit.selectAll"
                 label="Select All Submenu"
                 style="push">
           </command>
           <command
                 commandId="org.eclipse.ui.edit.delete"
                 label="Delete submenu"
                 style="push">
           </command>
        </menu>
     </menu>
  </menuContribution>
</extension>

メニューをアクティブ化/非アクティブ化するには、Core Expressions を使用してコマンド ハンドラーを有効/無効にする必要があります。コマンドにアクティブなハンドラーがアタッチされていない場合、コマンドは無効になります。したがって、そのコマンドを呼び出すメニュー項目も無効になります。

次のコード スニペットは、ビューのツールバーにボタンを作成し、変数の値に応じて有効/無効にする方法を示しています。このコードを機能させるには、このコードのいくつかを変更する必要があることに注意してください。変更のほとんどは、参照名とクラスの実装に関するものです。

ツールバーにボタンを作成します (plugin.xml):

   <extension
         name="View Toolbar Contributions"
         point="org.eclipse.ui.menus">
      <menuContribution
            allPopups="false"
            locationURI="toolbar:myapp.views.MyView">
       <command
             commandId="myapp.commands.PauseSound"
             icon=""
             label="Pause Playback Sound"
             style="push"
             tooltip="Pause">
       </command>
     </menuContribution>
</extension>

コマンド (plugin.xml) を作成します。

<extension
         id="myapp.commands.PauseSound"
         name="Pause sound command"
         point="org.eclipse.ui.commands">
      <command
            id="myapp.commands.PauseSound"
            name="Pause Sound">
      </command>
</extension> 

コマンド ハンドラー (plugin.xml) を作成します。

<extension
         point="org.eclipse.ui.handlers">
      <handler
            commandId="myapp.commands.PauseSound">
         <activeWhen>
            <with
                  variable="myapp.commands.sourceprovider.active">
               <or>
                  <equals
                        value="PLAYING">
                  </equals>
                  <equals
                        value="PAUSED">
                  </equals>
               </or>
            </with>
         </activeWhen>
         <class
               class="myapp.rcp.commands.toolbar.PausePlayback">
         </class>
      </handler>
</extension> 

コマンド (plugin.xml) の状態変数を作成します。

   <extension
         point="org.eclipse.ui.services">
      <sourceProvider
            provider="myapp.commands.sourceprovider.CommandState">
         <variable
               name="myapp.commands.sourceprovider.active"
               priorityLevel="workbench">
         </variable>
      </sourceProvider>
   </extension>

変数の状態を変更するクラスを実装します。

public class CommandState extends AbstractSourceProvider {
    public final static String STATE = "myapp.commands.sourceprovider.active";
    public final static String STOPPED = "STOPPED";
    public final static String PLAYING = "PLAYING";
    public final static String PAUSED = "PAUSED";
    public final static String NOT_LOADED = "NOT_LOADED";

enum State {
        NOT_LOADED, PLAYING, PAUSED, STOPPED
    };
    private State curState = State.NOT_LOADED;

    @Override
    public void dispose() {
    }

    @Override
    public String[] getProvidedSourceNames() {
        return new String[] { STATE };
    }

    // You cannot return NULL
    @SuppressWarnings("unchecked")
    @Override
    public Map getCurrentState() {
        Map map = new HashMap(1);
        if (curState == State.PLAYING)
            map.put(STATE, PLAYING);
        else if (curState == State.STOPPED)
            map.put(STATE, STOPPED);
        else if (curState == State.PAUSED)
            map.put(STATE, PAUSED);

        return map;
    }

    public void setPlaying() {
        fireSourceChanged(ISources.WORKBENCH, STATE, PLAYING);
    }

    public void setPaused() {
        fireSourceChanged(ISources.WORKBENCH, STATE, PAUSED);
    }

    public void setStopped() {
        fireSourceChanged(ISources.WORKBENCH, STATE, STOPPED);
    }

    public void setNotLoaded() {
        fireSourceChanged(ISources.WORKBENCH, STATE, NOT_LOADED);
    }

}

これらの機能を実装する方法の詳細については、次の場所を参照してください。

于 2011-05-25T12:15:08.553 に答える
1

Eclipseの場合、Workbenchに貢献する方法は2つあります。アクションとコマンドです。

アクションよりも新しく高度なコマンドをお勧めします。ここで指定されているアクションの欠点(1):

  • UIと処理は常に結びついています。あなたがお互いを分離することができる方法はありません

  • アクションはワークベンチのさまざまな部分(ポップアップメニュー/ツールバー)に提供できますが、それらはすべて異なる拡張ポイントであるため、XMLを複数の場所に複製することになります。最悪の場合、すべての拡張ポイントが同じ構成を期待しているわけではありません。

  • 複数の場所でアクションを指定することは、メンテナンスの悪夢です。アクションのアイコンを変更する必要がある場合は、すべての場所で変更する必要があります。

  • plugin.xmlでアクションを複製する際の別の問題は、同じアクションの複数のインスタンスがメモリ内に作成されることです。

    (1)アクションとコマンド

于 2012-10-17T08:42:44.430 に答える
0

RCP アプリケーションを作成している場合は、ActionBarAdvisor にプレースホルダーを作成することをお勧めします。これでメニューとツールバーの基本構造を定義できますが、menuContributions を拡張し、コマンドを使用して実際のメニュー/ツール項目を提供できます。

于 2011-03-18T10:20:39.400 に答える
0

RCP でアクションを追加するには、ApplicationActinBarAcvisor を使用することもできます。上記のソリューションよりも簡単です。この場合、最初にアクションを IWorkbenchAction のオブジェクトとして宣言し、次にメソッド「protected void makeActions(IWorkbenchWindow window)」で次のことができます。登録します。最後のステップは、それをメニューに追加することです。次のコードはあなたを助けます。

1.最初にアクションを宣言します:-

private IWorkbenchAction newAction

2.アクションの登録:-

protected void makeActions(IWorkbenchWindow window) {
newAction = ActionFactory.NEW_WIZARD_DROP_DOWN.create(window);
    register(newAction);
    newAction.setText("New");

3.最後のステップは、メニューにアクションを追加することです:-

MenuManager filemenu = new MenuManager("&File", "file");
    filemenu.add(newAction);

次のように、ツールバーにアクションを追加することもできます。

protected void fillCoolBar(ICoolBarManager coolBar) {
    IToolBarManager toolbar = new ToolBarManager(coolBar.getStyle());
    coolBar.add(toolbar);
    toolbar.add(newAction);
于 2013-05-03T09:20:53.077 に答える