在Eclipse中去掉多餘的UI組件的幾個方法

來源:互聯網
上載者:User

Eclipse的擴充機制是其一個重要特色,但隨著Eclipse功能越做越強,外掛程式越來越多,你會發現GUI上的表徵圖越來越多,Menu,toolbar,context menu都被佔滿了,其實很多item並不是我們需要的,但是contribute這些item的外掛程式我們是需要的,那怎麼去掉它們擴充的那些功能表項目呢?

1.在Plugin.xml中定製

這是最簡單的辦法,很多時候我們自己想寫代碼來去掉一些功能表項目,但效果並不好.所以能在Plugin.xml中定製的,我們就 盡量寫在plugin.xml裡面.下面舉一個右鍵菜單的例子:

擴充右鍵菜單需要擴充org.eclipse.ui.popupMenus擴充點,我們一般都在它下面new一個action,但這個action擴充之後不管在  任何介面都會出現,如果我們想在某些條件下隱藏掉它該怎麼辦?仔細觀察下org.eclipse.ui.popupMenus擴充點,其實我們還可以建立 objectContribution擴充

<extension point="org.eclipse.ui.popupMenus">
    <objectContribution
             id="my.example.objectContribution"
             nameFilter="*example*"
             objectClass="java.io.File">
          <action
                class="my.example.MyAction"
                id="my.example.MyAction"
                label="Exe"
                menubarPath="additional">
          </action>
       </objectContribution>
     </extension>

objectContribution裡面也包含一個action,但這個action在popupmenu裡出現是有條件的:我們給它定義了一個 nameFilter, 只有當selection()的path中包含了"example"才會顯示,否則這個action是不會出現在 popupmenu裡的.這裡的selection假設選中的是一個File,如果選中的是你自己寫的類,那namefilter會在你的類的 toString方法裡面找keyword.

2.使用Eclipse的Activities擴充

plugin.xml並不能解決所有問題,當我們實在沒有辦法在plugin.xml中限制某些extension的出現的時候,可以考慮使用 Eclipse的Activities.Activities的官方定義大家可以google一下eclipse的help.我個人的理解就是它可以和 perspective一樣控制UI的顯示,但是Perspective設計的太易於擴充了,假如Plugin A在perspective上擴充了一個UI,那麼Plugin B在每次進入這個perspective的時候就一定可以看得見它,而且在Eclipse的擴充機制下,Plugin B是沒有權利去刪了Plugin A的contribution的(Eclipse的ExtensionRegistry倒是提供了一個removeExtension方法,但啟動並執行時候會報錯).在這樣的情況下,Activities的價值就體現出來了,你只要給它一個Extension的id,它就可以幫你把這個Extension disable掉.例如:

<extension
          point="org.eclipse.ui.activities">
       <activity
             id="my.example.activity"
             name="WizardActivity">
       </activity>
       <activityPatternBinding
             activityId="my.example.activity"
             pattern="my\.example/mywizard">
       </activityPatternBinding>
  </extension>

比較重要的是activityPatternBinding中的pattern屬性,它是由plugin id + "/" + local-id組成.比如在外掛程式my.example中擴充了 org.eclipse.ui.newWizards,id是mywizard,那麼上面這個activityPatternBinding就會disable掉my.example的mywizard擴充,你在 GUI中就看不見這個 wizard了.pattern是支援Regex的,所以如果有"."的話需要用逸出字元\.注意,這裡的disable的意思並不是說我把 mywizard這個擴充刪掉了,而是屏蔽了它,mywizard仍然在 ExtensionRegistry中.

3.用代碼來動態控制UI

方法2隻是隱藏掉一些擴充,但是有一些需求並不是簡單的隱藏就可以了,我最近碰到的一個需求就是:有一個flag,只有當flag==1的時候擴充是可見的,否則是不可見的,需要disable這個擴充.這時就必須要加一些代碼才能實現了,還是以方法2中的mywizard為例:

IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport();
   IActivityManager activityManager = workbenchActivitySupport.getActivityManager();
   Set enabledActivityIds = new HashSet(activityManager.getEnabledActivityIds());
         if(flag==1)
   {
           if (enabledActivityIds.add("my.example.activity")) 
               workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);
   }
   else{
            if(enabledActivityIds.remove("my.example.activity"))
               workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);
   }

Activities可以是enable或者disable的,當你在plugin.xml中定義好了一個Activity,預設它是disable 的,就是說activityPatternBinding 匹配的擴充是會被disable的,但你也可以把Activities設成enable的(在 plugin.xml或者用代碼都可以設定),它匹配的擴充是可以正常使用的.

在上面的code sample中,我們通過activityManager.getEnabledActivityIds()得到所有enable的 Activities.如果flag==1,那my.example.activity 也應該被加入到enable Activities中,這樣mywizard就可以顯示在介面上,反之,就要在enable Activities中remove掉my.example.activity,它就變成

disable,會把mywizard隱藏.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.