操作體系

原文鏈接:
http://www.jetbrains.org/intellij/sdk/docs/basics/action_system.html

執(zhí)行和更新操作

操作體系允許插件向IDEA添加自己的菜單項(xiàng)和工具欄按鈕显沈。一個(gè)操作就是一個(gè)派生自AnAction類的類苍在,當(dāng)選擇菜單項(xiàng)或點(diǎn)擊工具欄按鈕時(shí),它的actionPerformed方法就會被調(diào)用擎值。例如后频,其中一個(gè)操作類就是負(fù)責(zé)文件|打開文件...菜單項(xiàng)和打開文件 工具欄按鈕的锥忿。

操作被組織成組患民,其又可以包含其他組录粱。 一組操作可以形成工具欄或菜單。
組的子組可以形成菜單的子菜單平委。

每個(gè)操作和操作組都有一個(gè)唯一的標(biāo)識符奈虾。標(biāo)準(zhǔn)IDEA操作的標(biāo)識符在IdeActions類中定義。

每個(gè)操作都可以包含在多個(gè)組中廉赔,因此一個(gè)操作會出現(xiàn)在IDEA用戶界面中的多個(gè)位置肉微。操作可以出現(xiàn)的位置由ActionPlaces接口中的常量定義。 操作出現(xiàn)的每個(gè)地方都會新建一個(gè)Presentation蜡塌。因此相同的操作在不同位置可以有不同的文本和圖標(biāo)碉纳。 操作的不同presentation可以通過復(fù)制AnAction.getTemplatePresentation()方法返回的presentation創(chuàng)建。

IDEA通過定期調(diào)用AnAction.update()方法更新操作的狀態(tài)馏艾。傳遞給此方法的AnActionEvent對象攜帶了操作當(dāng)前上下文的信息劳曹,特別是需要更新的指定presentation。

使用AnActionEvent.getData()方法可以獲取當(dāng)前IDE的信息琅摩,包括活動項(xiàng)目铁孵、所選文件、編輯器中的選擇等房资⊥扇埃可以傳遞給此方法的數(shù)據(jù)鍵在CommonDataKeys類中定義。

AnActionEvent實(shí)例也會傳遞給actionPerformed方法轰异。

注冊操作

目前有兩種注冊操作的方法:在plugin.xml文件的<actions>部分列出或通過Java代碼岖沛。

在plugin.xml文件中注冊操作

以下是在plugin.xml中注冊操作的方法,其演示了所有可以在<actions>部分使用的元素搭独,并描述了每個(gè)元素的含義宏胯。

<!-- Actions -->
<actions>
  <!-- <action>定義要注冊的操作
       "id"屬性指定操作的唯一標(biāo)識符
       "class"屬性指定操作實(shí)現(xiàn)類的完全限定名
       "text"屬性指定操作的文本(工具欄按鈕提示或菜單項(xiàng)文本)
       "use-shortcut-of"屬性(可選)指定此操作將要使用的快捷鍵的操作的ID
       "description"屬性(可選)指定焦點(diǎn)在操作上時(shí)顯示在狀態(tài)欄的描述
       "icon" 屬性(可選)指定顯示在工具欄按鈕或菜單項(xiàng)旁邊的圖標(biāo)-->
  <action id="VssIntegration.GarbageCollection" class="com.foo.impl.CollectGarbage" text="Collect _Garbage" description="Run garbage collector" icon="icons/garbage.png">
    <!-- <add-to-group>節(jié)點(diǎn)指定此操作要添加到的組甥厦,一個(gè)操作可以添加到多個(gè)組
         "group-id"屬性指定此操作要添加到的組的ID档桃,這個(gè)組必須被DefaultActionGroup類的實(shí)例實(shí)現(xiàn)
         "anchor"屬性指定操作相對于組里其它操作的位置贡茅,它的只可以為"first",吃靠、"last",镊尺、"before"和"after"
         如果"anchor"的值設(shè)置為"before"和"after"烙样,"relative-to-action"屬性是必須的开仰,
         它指定當(dāng)前操作要插入在那個(gè)操作之前或之后 -->
    <add-to-group group-id="ToolsMenu" relative-to-action="GenerateJavadoc" anchor="after"/>
      <!-- <keyboard-shortcut>節(jié)點(diǎn)指定操作的快捷鍵播赁,一個(gè)操作可以有多個(gè)快捷鍵
           "first-keystroke"屬性指定操作的首選快捷鍵颂郎,鍵位由常規(guī)Swing規(guī)則指定
           "second-keystroke"屬性(可選)指定操作的備選快捷鍵
           "keymap"屬性指定快捷方式所屬的鍵位映射方案,標(biāo)準(zhǔn)鍵位映射方案的ID
           在com.intellij.openapi.keymap.KeymapManager類中的常量定義 -->
      <keyboard-shortcut first-keystroke="control alt G" second-keystroke="C" keymap="$default"/>
      <!-- <mouse-shortcut>節(jié)點(diǎn)指定操作的鼠標(biāo)快捷方式容为,一個(gè)操作可以有多個(gè)鼠標(biāo)快捷方式
           "keystroke"屬性指定操作的點(diǎn)擊方式
           它可以定義為以空格分隔的單詞序列: 
           鼠標(biāo)按鈕:"button1", "button2", "button3" 
           鍵位修飾:"shift", "control", "meta", "alt", "altGraph"
           如果操作需要鍵位雙擊激活使用"doubleClick" 
           "keymap"屬性指定快捷方式所屬的鍵位映射方案乓序,標(biāo)準(zhǔn)鍵位映射方案的ID
           在com.intellij.openapi.keymap.KeymapManager類中的常量定義 -->
    <mouse-shortcut keystroke="control button3 doubleClick" keymap="$default"/>
  </action>
  <!-- <group>定義一個(gè)操作組寺酪,其中定義的<action>、<group>和<separator>元素會自動包括在組里
       "id"屬性指定操作組的唯一標(biāo)識符
       "class"屬性(可選)指定實(shí)現(xiàn)操作組類的完全限定名
       如果未指定替劈,則默認(rèn)使用com.intellij.openapi.actionSystem.DefaultActionGroup
       "text"屬性(可選)指定操作組的文本(顯示子菜單的菜單項(xiàng)的文本)
       "description"屬性(可選)指定焦點(diǎn)在操作組上時(shí)顯示在狀態(tài)欄的描述
       "icon"屬性(可選)指定顯示在工具欄按鈕或操作組旁邊的圖標(biāo)
       "popup"屬性(可選)指定如何在菜單中顯示操作組
       如果值為"true"寄雀,操作顯示在子菜單中
       如果值為"false",操作顯示在由分隔符定界的同一菜單上 -->
  <group class="com.foo.impl.MyActionGroup" id="TestActionGroup" text="Test Group" description="Group with test actions" icon="icons/testgroup.png" popup="true">
    <action id="VssIntegration.TestAction" class="com.foo.impl.TestAction" text="My Test Action" description="My test action"/>
    <!-- <separator>元素定義操作之間的分隔符
         它也可以有<add-to-group>子元素 -->
    <separator/>
    <group id="TestActionSubGroup"/>
    <!-- <reference>元素允許添加現(xiàn)存的操作
         "ref"屬性指定操作的ID -->
    <reference ref="EditorCopy"/>
    <add-to-group group-id="MainMenu" relative-to-action="HelpMenu" anchor="before"/>
  </group>
</actions>

從代碼中注冊操作

從代碼中注冊操作陨献,有兩個(gè)步驟:

  • 首先盒犹,必須往ActionManager類的registerAction方法傳入一個(gè)派生自AnAction類的實(shí)例,將操作與ID關(guān)聯(lián)眨业;
  • 然后急膀,操作需要添加進(jìn)一個(gè)或多個(gè)組。要通過ID獲取一個(gè)操作組的實(shí)例龄捡,需要調(diào)用 ActionManager.getAction()并將返回值轉(zhuǎn)換為DefaultActionGroup類卓嫂。

你可以使用以下方法創(chuàng)建一個(gè)在IDEA啟動時(shí)注冊操作的插件。

在IDEA啟動時(shí)注冊操作

  • 新建一個(gè)實(shí)現(xiàn)ApplicationComponent接口的類聘殖;
  • 在這個(gè)類中重寫getComponentName晨雳、initComponentdisposeComponent方法;
  • plugin.xml文件的<application-components>部分注冊這個(gè)類奸腺。

要闡明以上過程餐禁,查看以下實(shí)例Java類MyPluginRegistration,它注冊了一個(gè)由TextBoxes類定義的操作并將其添加到主菜單的Window菜單組:

public class MyPluginRegistration implements ApplicationComponent {
  // 返回組件名稱(唯一字符串)
  @NotNull public String getComponentName() {
    return "MyPlugin";
  }


  // 如果你在plugin.xml文件的<application-components>部分注冊了MyPluginRegistration類洋机,
  // 這個(gè)方法將在IDEA啟動時(shí)被調(diào)用
  public void initComponent() {
    ActionManager am = ActionManager.getInstance();
    TextBoxes action = new TextBoxes();

    // 將TextBoxes類的實(shí)例傳入ActionManager類的registerAction方法
    am.registerAction("MyPluginAction", action);

    // 獲取WindowMenu操作組的實(shí)例
    DefaultActionGroup windowM = (DefaultActionGroup) am.getAction("WindowMenu");

    // 添加一個(gè)分隔符和操作到主菜單的WindowMenu操作組
    windowM.addSeparator();
    windowM.add(action);
  }

  // Disposes system resources.
  public void disposeComponent() {
  }
}

注意:TextBoxes類的實(shí)現(xiàn)可以查看創(chuàng)建操作.

plugin.xml文件的<application-components>部分做以下更改確保你的插件在IDEA啟動時(shí)被初始化:

<application-components>
  <!-- 添加應(yīng)用組件 -->
  <component>
    <implementation-class>MypackageName.MyPluginRegistration</implementation-class>
  </component>
</application-components>

從操作中構(gòu)建UI

如果插件需要包括一個(gè)工具欄或彈出菜單坠宴,它是在自己的UI上從操作組中構(gòu)建的,可以使用ActionPopupMenuActionToolbar類實(shí)現(xiàn)绷旗。這些對象可以通過調(diào)用ActionManager.createActionPopupMenuActionManager.createActionToolbar方法創(chuàng)建喜鼓。要從這樣的對象上獲取Swing組件可以簡單調(diào)用getComponent()方法。

如果你對操作工具欄要附加到指定組件上(例如衔肢,工具窗口的面板)庄岖,你通常需要調(diào)用ActionToolbar.setTargetComponent() 方法,并將相關(guān)組件的實(shí)例作為參數(shù)傳入角骤。這樣可以確保工具欄按鈕的狀態(tài)依賴于相關(guān)組件而不是IDE框架內(nèi)當(dāng)前焦點(diǎn)位置的狀態(tài)隅忿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市邦尊,隨后出現(xiàn)的幾起案子背桐,更是在濱河造成了極大的恐慌,老刑警劉巖蝉揍,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件链峭,死亡現(xiàn)場離奇詭異,居然都是意外死亡又沾,警方通過查閱死者的電腦和手機(jī)弊仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門熙卡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人励饵,你說我怎么就攤上這事驳癌。” “怎么了役听?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵颓鲜,是天一觀的道長。 經(jīng)常有香客問我禾嫉,道長灾杰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任熙参,我火速辦了婚禮艳吠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘孽椰。我一直安慰自己昭娩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布黍匾。 她就那樣靜靜地躺著栏渺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪锐涯。 梳的紋絲不亂的頭發(fā)上磕诊,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音纹腌,去河邊找鬼霎终。 笑死,一個(gè)胖子當(dāng)著我的面吹牛升薯,可吹牛的內(nèi)容都是我干的莱褒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涎劈,長吁一口氣:“原來是場噩夢啊……” “哼广凸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蛛枚,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤谅海,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蹦浦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扭吁,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了智末。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡徒河,死狀恐怖系馆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情顽照,我是刑警寧澤由蘑,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站代兵,受9級特大地震影響尼酿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜植影,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一裳擎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧思币,春花似錦鹿响、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至博投,卻和暖如春绸贡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背毅哗。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工听怕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人黎做。 一個(gè)月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓叉跛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒸殿。 傳聞我的和親對象是個(gè)殘疾皇子筷厘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,116評論 25 707
  • Swift版本點(diǎn)擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,374評論 7 249
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫爬骤、插件充石、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 面對獨(dú)特的客戶需求,你發(fā)現(xiàn)了就出了一張牌霞玄,這就是商業(yè)模式骤铃。 實(shí)際上不止是一手牌拉岁,要不斷抓進(jìn)新的牌,這種模式才能玩得...
    馬唐閱讀 253評論 0 0
  • 我也伴著雨聲清醒了大半夜 從滂沱 到淅瀝 從淅瀝 到滂沱 天空之上 究竟堆積了多少不快的黑云 傾瀉而下 卻依舊未曾...
    沐瓔閱讀 246評論 0 4