解決Eclipse RCP開發中Run As菜單項只出現一次的問題

症狀:

運行RCP application後,在Project Explorer裏面右鍵某個項目,可以看到context menu裏面有Run As這麼個選項,可是當第二次右鍵同一個項目時,Run As卻消失了,不管你有沒有真正地Run這個application,Run As都只會在context menu中出現一次。


調查:

在org.eclipse.debug.ui這個插件的extension point中有這麼一段邏輯

<extension  point="org.eclipse.ui.popupMenus">
  ...
  <objectContribution 
      objectClass="java.lang.Object"
      id="org.eclipse.debug.ui.contextualLaunch.run">
      <action 
         label="%RunContextMenu.label"
         style="pulldown"
         class="org.eclipse.debug.internal.ui.actions.RunContextualLaunchAction"
         menubarPath="additions"
         enablesFor="+"
         id="org.eclipse.debug.ui.contextualLaunch.run.submenu">
      </action>
      <enablement>
         <or>
            <and>
              <not><with variable="org.eclipse.core.runtime.Platform">
                 <test property="org.eclipse.core.runtime.bundleState" args="org.eclipse.debug.core" value="ACTIVE"/>
              </with></not>
              <adapt type="org.eclipse.core.resources.IResource"/>
            <and>
              <with variable="org.eclipse.core.runtime.Platform">
                 <test property="org.eclipse.core.runtime.bundleState" args="org.eclipse.debug.core" value="ACTIVE"/>
              </with>
              <test property="org.eclipse.debug.core.launchable" value="run"/>
            </and>
         </or>
      </enablement>
   </objectContribution>
   ...
</extension>
仔細分析這段邏輯,可以看出,org.eclipse.core.runtime.bundleState這個屬性是否爲ACTIVE,即這個plugin是否已經被load,會對Run As這個context menu是否enable有不同的影響。

在bundleState沒有ACTIVE的情況下,只要是可適應(adaptable to)org.eclipse.core.resources.IResource的都會顯示出來;在bundleState ACTIVE的情況下,會通過執行org.eclipse.debug.core.launchable這個測試屬性來判斷。org.eclipse.debug.core.launchable定義於org.eclipse.debug.core,在org.eclipse.debug.internal.core.LaunchablePropertyTester 中執行一個測試方法。這個方法會檢測是否有 run 這個launch mode存在,並且選中的這個項目或者文件是否有org.eclipse.debug.ui.actions.ILaunchable這個adaptor。


解決方法:

把ILaunchable這個adaptor加到相應的文件或者項目中去

即,在plugin.xml中加上這麼一段

<extension point="org.eclipse.core.runtime.adapters">
  <factory class="org.eclipse.core.runtime.IAdaptable"
           adaptableType="org.eclipse.core.resources.IResource">
     <adapter type="org.eclipse.debug.ui.actions.ILaunchable"/>
  </factory>
</extension>









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章