Top / Eclipse / プラグイン開発のTIPS集 / org.eclipse.ui.menusにvisibleWhenで条件指定する

Eclipseのメニューバーやポップアップメニューは org.eclipse.ui.menus 拡張ポイントで制御することができますが、ある条件下でのみポップアップメニューを表示するとかの表示制御は下記のように、visibleWhen タグで行うことができます。

<extension point="org.eclipse.ui.menus">
  <menuContribution locationURI="popup:org.eclipse.ui.popup.any">
    <menu id="nu.mine.kino.plugin.newaction.menus.sampleMenu" 
      label="トップのメニュー">
      <command commandId="nu.mine.kino.plugin.samples.rcp.command" 
        style="push">
      </command>
      <command 
        commandId="nu.mine.kino.plugin.newaction.commands.sampleCommand" 
        style="push">
      </command>
      <visibleWhen>
        <with variable="activeMenuSelection">
          <iterate ifEmpty="false"> <-ifEmptyは、Selectionがなかった時の判定。
            <adapt type="org.eclipse.jdt.core.IJavaElement">
            </adapt>
          </iterate>
        </with>
      </visibleWhen>
    </menu>
  </menuContribution>
</extension>

このようにmenuやcommandに対して

<visibleWhen>
  <with variable="activeMenuSelection">
    <iterate ifEmpty="false">
      <adapt type="org.eclipse.jdt.core.IJavaElement">
      </adapt>
    </iterate>
  </with>
</visibleWhen>

という条件を設定できるって事ですね。

色々な条件指定

選択しているオブジェクトの種類で制御

<visibleWhen>
  <with variable="activeMenuSelection">
    <iterate ifEmpty="false"> <-ifEmptyは、Selectionがなかった時の判定。
      <adapt type="org.eclipse.jdt.core.IJavaElement">
      </adapt>
    </iterate>
  </with>
</visibleWhen>

複雑な条件。

capture01.png
<visibleWhen checkEnabled="false">
  <with variable="activeMenuSelection"> <!-- 選択したオブジェクトが  -->
  <!-- (1),(2),(3)どれかを満たせばOK -->
  <or>

    <iterate ifEmpty="false" >
      <adapt type="org.eclipse.jface.text.ITextSelection" />   (1)
    </iterate> //エディタなどで、テキストを選んだら

    <and>
      <count value="1" /> 選択したオブジェクトが一つ且つ、
      <iterate ifEmpty="false" >
        <adapt type="org.eclipse.jdt.core.ICompilationUnit" />  (2)
      </iterate>  選択されたモノの、Collection の中身がICompilationUnit ならば
    </and>

    <and>
      <count value="1" /> 選択したオブジェクトが一つ且つ、
      <iterate ifEmpty="false" >
        <adapt type="org.eclipse.core.resources.IResource" />   (3)
      </iterate>   選択されたモノの、Collection の中身がIResourceならば
    </and>

  </or>
  </with>
</visibleWhen>

あるビューがアクティブになった場合に表示

<extension point="org.eclipse.core.expressions.definitions">
  <definition id="nu.mine.kino.plugin.samples.rcp.view3.isActive">
    <with variable="activePartId">
      <equals value="nu.mine.kino.plugin.samples.rcp.view3"></equals>
    </with>
  </definition>
</extension>
<visibleWhen>
  <reference 
     definitionId="nu.mine.kino.plugin.samples.rcp.view3.isActive">
  </reference>
</visibleWhen>

variableで指定できるパラメタ

<with variable="activeMenuSelection">

この変数に設定できる項目は org.eclipse.ui.ISources に定義されているようです。

package org.eclipse.ui;

import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.ui.part.IShowInSource;

public interface ISources {
  public static final String ACTIVE_CONTEXT_NAME = "activeContexts";
  public static final String ACTIVE_ACTION_SETS_NAME = "activeActionSets";
  public static final String ACTIVE_SHELL_NAME = "activeShell";
  public static final String ACTIVE_WORKBENCH_WINDOW_SHELL_NAME = "activeWorkbenchWindowShell";
  public static final String ACTIVE_WORKBENCH_WINDOW_NAME = "activeWorkbenchWindow";
  public static final String ACTIVE_WORKBENCH_WINDOW_IS_COOLBAR_VISIBLE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
      + ".isCoolbarVisible";
  public static final String ACTIVE_WORKBENCH_WINDOW_IS_PERSPECTIVEBAR_VISIBLE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
      + ".isPerspectiveBarVisible";
  public static final String ACTIVE_WORKBENCH_WINDOW_ACTIVE_PERSPECTIVE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
  + ".activePerspective";
  public static final String ACTIVE_EDITOR_NAME = "activeEditor";
  public static final String ACTIVE_EDITOR_ID_NAME = "activeEditorId";
  public static final String ACTIVE_MENU_EDITOR_INPUT_NAME = "activeMenuEditorInput"; 
  public static final String ACTIVE_FOCUS_CONTROL_NAME = "activeFocusControl";
  public static final String ACTIVE_FOCUS_CONTROL_ID_NAME = "activeFocusControlId";
}

ちなみに全体はこんな感じ。関係ないところは省いてます。

package org.eclipse.ui;

import org.eclipse.core.expressions.IEvaluationContext;
import org.eclipse.ui.part.IShowInSource;

  public interface ISources {
  /**
   * The variable name for the active contexts. This is for use with the
   * <code>ISourceProvider</code> and <code>IEvaluationContext</code>.
   * @since 3.2
   */
  public static final String ACTIVE_CONTEXT_NAME = "activeContexts"; //$NON-NLS-1$

  /**
   * The variable name for the active action sets. This is for use with the
   * {@link ISourceProvider} and {@link IEvaluationContext}.
   * @since 3.2
   */
  public static final String ACTIVE_ACTION_SETS_NAME = "activeActionSets"; //$NON-NLS-1$

  /**
   * The variable name for the active shell. This is for use with the
   * <code>ISourceProvider</code> and <code>IEvaluationContext</code>.
   */
  public static final String ACTIVE_SHELL_NAME = "activeShell"; //$NON-NLS-1$

  /**
   * The variable name for the active workbench window shell. This is for use
   * with the <code>ISourceProvider</code> and
   * <code>IEvaluationContext</code>.
   * @since 3.2
   */
  public static final String ACTIVE_WORKBENCH_WINDOW_SHELL_NAME = "activeWorkbenchWindowShell"; //$NON-NLS-1$

  /**
   * The variable name for the active workbench window. This is for use with
   * the <code>ISourceProvider</code> and <code>IEvaluationContext</code>.
   */
  public static final String ACTIVE_WORKBENCH_WINDOW_NAME = "activeWorkbenchWindow"; //$NON-NLS-1$
  
  
  /**
   * The variable name for the coolbar visibility state of the active
   * workbench window. This is for use with the <code>ISourceProvider</code>
   * and <code>IEvaluationContext</code>.
   * 
   * @since 3.3
   */
  public static final String ACTIVE_WORKBENCH_WINDOW_IS_COOLBAR_VISIBLE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
      + ".isCoolbarVisible"; //$NON-NLS-1$
  
  /**
   * The variable name for the perspective bar visibility state of the active
   * workbench window. This is for use with the <code>ISourceProvider</code>
   * and <code>IEvaluationContext</code>.
   * 
   * @since 3.3
   */
  public static final String ACTIVE_WORKBENCH_WINDOW_IS_PERSPECTIVEBAR_VISIBLE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
      + ".isPerspectiveBarVisible"; //$NON-NLS-1$
  
  /**
   * The variable name for the current perspective of the active workbench
   * window. This is for use with the <code>ISourceProvider</code> and
   * <code>IEvaluationContext</code>.
   * 
   * @since 3.4
   */
  public static final String ACTIVE_WORKBENCH_WINDOW_ACTIVE_PERSPECTIVE_NAME = ACTIVE_WORKBENCH_WINDOW_NAME
  + ".activePerspective"; //$NON-NLS-1$

  /**
   * The variable name for the active editor part. This is for use with the
   * <code>ISourceProvider</code> and <code>IEvaluationContext</code>.
   * @since 3.2
   */
  public static final String ACTIVE_EDITOR_NAME = "activeEditor"; //$NON-NLS-1$

  /**
   * The variable name for the active editor identifier. This is for use with
   * the <code>ISourceProvider</code> and <code>IEvaluationContext</code>.
   * 
   * @since 3.2
   */
  public static final String ACTIVE_EDITOR_ID_NAME = "activeEditorId"; //$NON-NLS-1$

  
  /**
   * The variable name for the <b>local</b> editor input which is sometimes
   * available while a context menu is visible.
   * 
   * @since 3.3
   */
  public static final String ACTIVE_MENU_EDITOR_INPUT_NAME = "activeMenuEditorInput";  //$NON-NLS-1$

  /**
   * The variable name for the active focus Control, when provided by the
   * IFocusService.
   * 
   * @since 3.3
   */
  public static final String ACTIVE_FOCUS_CONTROL_NAME = "activeFocusControl"; //$NON-NLS-1$

  /**
   * The variable name for the active focus Control id, when provided by the
   * IFocusService.
   * 
   * @since 3.3
   */
  public static final String ACTIVE_FOCUS_CONTROL_ID_NAME = "activeFocusControlId"; //$NON-NLS-1$
}

これらが全て、この箇所の変数として有効なのかはまだよく分かりませんが。。


この記事は

選択肢 投票
おもしろかった 10  
そうでもない 0  

Top / Eclipse / プラグイン開発のTIPS集 / org.eclipse.ui.menusにvisibleWhenで条件指定する

現在のアクセス:10873


添付ファイル: filecapture01.png 1411件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-01-13 (水) 17:55:43 (3020d)