launchShortcutsを特定の条件下でのみ表示させる

org.eclipse.debug.ui.launchShortcuts の拡張ポイントを使うと、プロジェクトの 右クリック→Run AS にショートカットを表示させる事ができます。

↑は、AIR Application を追加してみた所。

この時のplugin.xmlは、こんな感じ。
  <extension
         point="org.eclipse.debug.ui.launchShortcuts">
      <shortcut
            class="net.sf.amateras.air.launch.LaunchAIRShortcut"
            icon="icons/air.gif"
            id="net.sf.amateras.air.launch.LaunchAIRShortcut"
            label="AIR Application"
            modes="run">
         <perspective id="net.sf.amateras.air.perspective"/>
      </shortcut>
   </extension>

でも、これだと全てのプロジェクトに表示されちゃいます。
たとえば、Flex関連のプロジェクト用にこのShortcutを追加したつもりでも、Javaプロジェクトなど...関係ない所に表示される。
はっきりいってそれは邪魔っ!

ということで、特定の状態のみshortcutを追加する方法をご紹介。

launchShortcutsのEclipseのドキュメントは http://publib.boulder.ibm.com/infocenter/rsmhelp/v7r0m0/index.jsp?topic=/org.eclipse.platform.doc.isv/reference/extension-points/org_eclipse_debug_ui_launchShortcuts.html に少しあったりします。

表示の判定は、shortcut/enablement で条件が書けるようになっています。

選択されたファイル名称が特定のもののみ表示させる方法

  <extension
         point="org.eclipse.debug.ui.launchShortcuts">
      <shortcut
         (省略)
        <contextualLaunch>
            <enablement>
               <with variable="selection">
                  <count value="1"/>
                  <iterate>
                     <instanceof value="org.eclipse.core.resources.IFile"/>
                     <test
                           value="*.mxml"
                           property="org.eclipse.debug.ui.matchesPattern"/>
                  </iterate>
               </with>
            </enablement>
        <contextualLaunch>
      </shortcut>
   </extension>

org.eclipse.debug.ui.matchesPatternってのを使えば、ファイル名でチェックできるみたい。
この場合、plugin.xmlを修正するだけですむのでラクチン。

選択されたものが特定のNatureの場合のみ表示させる方法

特定のNatureのときのみ表示させる方法が知りたくて調べていたのですが、
<test property=
"org.eclipse.jdt.launching.hasProjectNature" args=""/>
...という、hasProjectNatureというpropertyはどうやらJavaProjectである前提のような感じがします。
JavaProjectでない場合には、どう頑張っても表示されなかったので。。多分ですけども。

ということで、PropertyTestのクラスを作って設定します。

まずは、PropertyTestのクラスを作成します。

package net.sf.amateras.air.expressions;

import org.eclipse.core.expressions.PropertyTester;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;

public class NaturePropertyTester extends PropertyTester {

public boolean test(Object receiver, String property, Object[] args, Object expectedValue) {
    if (receiver instanceof IResource) {
        IProject project = ((IResource) receiver).getProject();
        try {
            return project.hasNature(expectedValue.toString());
        } catch (CoreException e) {
            return false;
        }
    }
    return false;
}
}

次に plugin.xmlに登録していきます。
まずは、org.eclipse.core.expressions.propertyTestersの拡張ポイントに登録

    <extension point="org.eclipse.core.expressions.propertyTesters">
      <propertyTester
        id="net.sf.amateras.NaturePropertyTester"
        namespace="net.sf.amateras"
        properties="hasNature"
        type="org.eclipse.core.resources.IResource"
        class="net.sf.amateras.air.expressions.NaturePropertyTester">
      </propertyTester>
   </extension>

そして、shortcutのenablement要素に設定。

   <extension
         point="org.eclipse.debug.ui.launchShortcuts">
      <shortcut
              (省略)>
         <contextualLaunch>
            <enablement>
               <with variable="selection">
                  <count value="1"/>
                  <iterate>
                  <or>
                    <test property="net.sf.amateras.hasNature" value="net.sf.amateras.air.AIRFlexProjectNature"/>
                    <test property="net.sf.amateras.hasNature" value="net.sf.amateras.air.AIRHTMLProjectNature"/>
                  </or>
                  </iterate>
               </with>
            </enablement>
         </contextualLaunch>
         <perspective id="net.sf.amateras.air.perspective"/>
      </shortcut>
   </extension>

上記の設定は、net.sf.amateras.air.AIRFlexProjectNatureもしくはnet.sf.amateras.air.AIRHTMLProjectNatureのプロジェクトであれば表示する設定になっています。

これで無事に表示できるはずっ!
Comments