Sung in Blog

                     一些技術(shù)文章 & 一些生活雜碎
          編寫Eclipse插件的方法很簡單,你只需要編寫一個(gè)應(yīng)用程序,并把它"添加"到Eclipse上。但是與編寫音樂類似,在能夠創(chuàng)作一部著作之前,首先必須學(xué)習(xí)大量的相關(guān)知識(shí)。
            
            本文將討論少許幾個(gè)簡單的GUI元素:
            
            · 工具條按鈕
            
            · 菜單項(xiàng)
            
            · 對話框
            
            為了使用這些元素,我們將稍微修改已有的插件,順便編寫一個(gè)可供使用的工具類。
            
            擴(kuò)展點(diǎn)(Extension Points)
            
            我們不能隨意地向Eclipse用戶界面的任何地方添加窗口小部件,只能在特殊的、指定的、有記載的位置添加。這些位置被稱為擴(kuò)展點(diǎn)(extension points)。在基本的Eclipse安裝中存在數(shù)以百計(jì)可供使用的擴(kuò)展點(diǎn)。插件自身也可以發(fā)布新的擴(kuò)展點(diǎn)。
            
           

            
          圖1:擴(kuò)展頁

            
            現(xiàn)在請點(diǎn)擊"添加"(ADD)按鈕,出現(xiàn)了圖2所示的列表。
            
           

            
          圖2:新增擴(kuò)展向?qū)В瑪U(kuò)展列表

            
            上下滾動(dòng)這個(gè)列表可以看到很多可供使用的擴(kuò)展點(diǎn)。你可能注意到了有兩種類型的擴(kuò)展點(diǎn):帶有擴(kuò)展模板的(用加號(hào)標(biāo)識(shí))和不帶擴(kuò)展模板的。大多數(shù)經(jīng)常用到的擴(kuò)展點(diǎn)都帶有用于輔助開發(fā)擴(kuò)展的模板。圖2中選擇的擴(kuò)展點(diǎn)Action Set,帶有一個(gè)叫做"Hello World"操作集的模板。當(dāng)你選擇某個(gè)模板的時(shí)候,會(huì)出現(xiàn)簡短的描述。"下一個(gè)"頁面將詢問模板使用的參數(shù)。
            
            現(xiàn)在請關(guān)閉向?qū)Р⒎祷氐?擴(kuò)展"屬性頁。選擇"Invokatron編輯器"。在這個(gè)屬性頁中,你可能注意到了我們在向?qū)е袨镮nvokatron編輯器輸入的信息。正常的擴(kuò)展需要一個(gè)唯一的標(biāo)識(shí)符(ID字段)、一個(gè)供顯示的名稱(Name字段)和它所屬的擴(kuò)展點(diǎn)(Point字段)。從模板中建立的擴(kuò)展(例如Invokatron編輯器)需要更多的參數(shù)。沒有模板的擴(kuò)展點(diǎn)也需要更多的信息,但是這些信息只能在文本編輯器中輸入。
            
            添加工具條按鈕
            
            現(xiàn)在我們已經(jīng)了解了擴(kuò)展點(diǎn)是什么,讓我們來添加一個(gè)擴(kuò)展吧。我們首先添加的是一個(gè)工具條按鈕。這個(gè)按鈕將調(diào)用我們前面建立的新的Invokatron向?qū)А?BR>  
            添加工具條按鈕有三個(gè)步驟:
            
            1.聲明一個(gè)新擴(kuò)展。
            
            2.用特定的標(biāo)記來擴(kuò)充該聲明。
            
            3.編寫操作委托類
            
            1.聲明一個(gè)新擴(kuò)展
            
            我們已經(jīng)知道怎樣實(shí)現(xiàn)這個(gè)步驟了。簡單地返回到擴(kuò)展點(diǎn)下的plugin.xml編輯器。點(diǎn)擊"添加"。工具條按鈕在org.eclipse.ui.actionSets擴(kuò)展點(diǎn)下面。不要使用模板,直接點(diǎn)擊"完成"。輸入下面一些內(nèi)容:
            
            · Id: NewInvokatronAction
            
            · Name: New Invokatron Document Action
            
            · Point: (使用默認(rèn)值:org.eclipse.ui.actionSets)
            
            返回plugin.xml屬性頁,Eclipse給這個(gè)文件添加了新的代碼片斷。
            
            2.用特定的標(biāo)記來擴(kuò)充該聲明
            
            這個(gè)新擴(kuò)展幾乎毫無內(nèi)容。我們在下面添加一些標(biāo)記(tag)。你知道可以使用哪些標(biāo)記嗎?你可以右鍵點(diǎn)擊"所有擴(kuò)展"樹中的元素,選擇"新增"菜單,會(huì)得到一個(gè)列表。你也可以查看Eclipse文檔。
            
            現(xiàn)在我們看到自己可以在<extension>標(biāo)記內(nèi)部添加一個(gè)<actionSet>標(biāo)記。它可以包含零個(gè)或多個(gè)<menu>標(biāo)記,后面跟著零個(gè)或多個(gè)<action>標(biāo)記,還可以選擇使用<description>標(biāo)記。但是其中最重要的標(biāo)記是<action>。它可以同時(shí)描述工具條按鈕和菜單項(xiàng)。>BR>下面是我們將添加的工具條按鈕的XML代碼片斷。其中的新代碼是黑體的。我們在后面會(huì)剖析這段代碼。
            
            <extension id="NewInvokatronAction"
            name="New Invokatron Document Action"
            point="org.eclipse.ui.actionSets">
            <actionSet id="invokatron.actionSet"
            label="Invokatron Actions"
            visible="true">
            <action id="invokatron.wizard.RunWizardAction"
            toolbarPath="org.eclipse.ui.workbench.file/new.ext"
            icon="icons/InvokatronIcon16.gif"
            tooltip="Starts the New Invokatron Document Wizard."
            class="invokatron.wizard.RunWizardAction">
            </action>
            </actionSet>
            </extension>
            
            所有這些操作都可以在plugin.xml編輯器中用圖形化的方式來完成,但是我們查看XML以明確字段的完整文本內(nèi)容。此處的<actionSet>標(biāo)記只含有一個(gè)操作(action)。操作表現(xiàn)為菜單中的項(xiàng)或工具條中的按鈕的對象。操作的屬性實(shí)在太多了,你可以在在線文檔中查閱。其中最有趣的一些屬性是:
            
            · id:操作的唯一標(biāo)識(shí)符。可以用于在運(yùn)行時(shí)引用操作。
            
            · toolbarPath:放置工具條按鈕的位置。
            
            · icon:工具條按鈕或菜單項(xiàng)左側(cè)顯示的圖標(biāo)。它是一個(gè)與開發(fā)目錄關(guān)聯(lián)的16×16的GIF文件。請把 圖片存放到Invokatron\icons文件夾中。這個(gè)文件夾已經(jīng)被包含到二進(jìn)制建立路徑中,因此該圖標(biāo)將放入插件的文檔目錄中。
            
            · tooltip:當(dāng)鼠標(biāo)停留在工具條按鈕上的時(shí)候出現(xiàn)的文本內(nèi)容。
            
            · class:這些操作的完整的合格的類名稱。
            
            關(guān)于工具條路徑
            
            工具條路徑(toolbar path)指出了添加工具條按鈕的位置。由于任何人都可以建立工具條,而且有時(shí)候一個(gè)按鈕可以包含子選項(xiàng),因此我們用分層的標(biāo)識(shí)符列表來訪問這個(gè)位置。下面是經(jīng)常用到的工具條列表和它們的路徑:
            
            · 文件: org.eclipse.ui.workbench.file 帶有一些公共的分組標(biāo)志(你可以添加按鈕的更多的位置):
            
            o "新建"區(qū):new.ext
            o "保存"區(qū):save.ext
            o "打印"區(qū):print.ext
            o "建立"區(qū):build.ext
            
            · 導(dǎo)航: org.eclipse.ui.workbench.navigate
            
            · 載入: org.eclipse.debug.ui.launchActionSet
            
            · 編輯器表示:org.eclipse.ui.edit.text.actionSet.presentation
            
            · 搜索: org.eclipse.search.searchActionSet
            
            · Java元素建立:org.eclipse.jdt.ui.JavaElementCreationActionSet
            
            · 組: Team
            
            · CVS: CVS
            
            如果你提供的工具條ID不帶有標(biāo)志ID,你的按鈕就會(huì)被添加到緊挨著這個(gè)工具條的一個(gè)新工具條之上。接著這個(gè)新工具條就可以被添加到Eclipse GUI上了。有時(shí)候你會(huì)看到使用工具條路徑"正常的(Normal)"的插件。這是舊的名稱轉(zhuǎn)換。在Eclipse 3中這樣使用的時(shí)候會(huì)建立一個(gè)叫作"Normal"的新工具條。如果你建立一個(gè)新工具條ID,你的工具條會(huì)被添加到"文件"工具條后面。
            
            請注意"文件"工具條的"新建"組標(biāo)志。這是我們添加自己的按鈕的地方。由于標(biāo)志ID是new.ext,完整的路徑就是:
            
            org.eclipse.ui.workbench.file/new.ext
            
            3.編寫操作委托類
            
            最后一步是編寫少量的用于實(shí)現(xiàn)操作的Java。這個(gè)類稱為操作委托。
            
            package invokatron.wizard;
            
            public class RunWizardAction extends Action
            implements IWorkbenchWindowActionDelegate {
            /** 操作被建立的時(shí)候調(diào)用*/
            public void init(IWorkbenchWindow window) {}
            
            /** 操作被刪除的時(shí)候調(diào)用*/
            public void dispose() {}
            
            /** 操作被執(zhí)行的時(shí)候調(diào)用 */
            public void run(IAction action) {
            InvokatronWizard wizard= new InvokatronWizard();
            Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
            WizardDialog dialog= new WizardDialog(shell, wizard);
            dialog.create();
            dialog.open();
            }
            
            /** 編輯器中的對象被選中或取消選擇的時(shí)候調(diào)用*/
            public void selectionChanged(IAction action, ISelection selection) {}
            }
            
            添加菜單項(xiàng)
            
            你也許猜到了添加菜單項(xiàng)與添加工具條按鈕的過程幾乎相同。你也必須聲明一個(gè)擴(kuò)展(同種類型的)、用特定的標(biāo)記(相同的標(biāo)記)來擴(kuò)充它,并編寫操作類(相同的類)。其主要的不同點(diǎn)是擴(kuò)展的聲明。下面是菜單項(xiàng)的擴(kuò)展XML代碼(沒有相應(yīng)的工具條按鈕):
            
            <extension id="NewInvokatronAction"
            name="New Invokatron Document Action"
            point="org.eclipse.ui.actionSets">
            <actionSet id="invokatron.actionSet"
            label="Invokatron Actions"
            visible="true">
            <action id="invokatron.wizard.RunWizardAction"
            label="New Invokatron"
            menubarPath="file/new.ext"
            icon="icons/InvokatronIcon16.gif"
            tooltip="Starts the New Invokatron Document Wizard."
            class="invokatron.wizard.RunWizardAction">
            </action>
            </actionSet>
            </extension>
            
            標(biāo)簽(label)屬性包含了顯示在菜單項(xiàng)上的文本內(nèi)容。鍵盤快捷鍵用"&"符號(hào)表示,在XML中是&。下面是一個(gè)組合了菜單項(xiàng)和工具條按鈕的例子:
            
            <extension id="NewInvokatronAction"
            name="New Invokatron Document Action"
            point="org.eclipse.ui.actionSets">
            <actionSet id="invokatron.actionSet"
            label="Invokatron Actions"
            visible="true">
            <action id="invokatron.wizard.RunWizardAction"
            label="New Invokatron"
            menubarPath="file/new.ext"
            toolbarPath="org.eclipse.ui.workbench.file/new.ext"
            icon="icons/invokatronPicture.gif"
            tooltip="Starts the New Invokatron Document Wizard."
            class="invokatron.wizard.RunWizardAction">
            </action>
            </actionSet>
            </extension>
            
            菜單與工具條只有稍微的不同。工具條只有一個(gè)"層次",而菜單有完整的層次。這也是用操作來聲明菜單這種方法可行的原因。菜單都列舉在<actionSet>標(biāo)記之中,在<action>標(biāo)記之上。它們的語法如下:
            
            <menu id="unique.ID"
            <!-- New menu at the top-level. The menubarPath
            for actions inside this menu is: Special -->
            path="Special"
            label="This is a parent menu item.">
            <!-- Optional, the menubarPath for actions after
            this separator is: Special/BelowBar -->
            <separator name="BelowBar">
            </menu>
            
            關(guān)于菜單條路徑
            
            菜單條路徑(menubar path)指出了添加菜單項(xiàng)的位置。我們使用分層的標(biāo)識(shí)符列表來訪問這個(gè)位置。下面是經(jīng)常使用的菜單條列表以及它們的路徑和公共組標(biāo)志:
            
            · 文件:file
            
            o "開始" 區(qū):fileStart
            
            o "新建"菜單內(nèi)部的"附加"組標(biāo)志: new/additions
            
            o "新建"區(qū),在"新建"菜單下面:new.ext
            
            o "關(guān)閉" 區(qū):close.ext
            
            o "保存" 區(qū):save.ext
            
            o "打印" 區(qū):print.ext
            
            o "打開" 區(qū):open.ext
            
            o "導(dǎo)入" 區(qū):import.ext
            
            o "附加" 區(qū):additions
            
            o "最近的文檔" 區(qū):mru
            
            o "結(jié)束" 區(qū):fileEnd
            
            · 編輯: edit
            
            o "開始" 區(qū):editStart
            
            o "撤銷" 區(qū):undo.ext
            
            o "剪切" 區(qū):cut.ext
            
            o "查找" 區(qū):find.ext
            
            o "添加" 區(qū):add.ext
            
            o "結(jié)束" 區(qū)(有時(shí)不是結(jié)束):fileEnd
            
            o "附加" 區(qū):additions
            
            · 源: org.eclipse.jdt.ui.source.menu
            
            · 重構(gòu): org.eclipse.jdt.ui.refactoring.menu
            
            · 導(dǎo)航: navigate
            
            o "開始"區(qū):navStart
            
            o "Go To"菜單中的"附加"組標(biāo)志: goTo/additions
            
            o "打開"區(qū)(有四個(gè)):open.ext, open.ext2, open.ext3, and open.ext4
            
            o "顯示"區(qū)(有四個(gè)):show.ext, show.ext2, show.ext3, and show.ext4
            
            o "附加"區(qū):additions
            
            o "結(jié)束"區(qū):navEnd
            
            · 搜索: org.eclipse.search.menu
            
            · 項(xiàng)目: project
            
            o "開始"區(qū):projStart
            
            o "打開"區(qū):open.ext
            
            o "建立"區(qū):build.ext
            
            o "附加"區(qū):additions
            
            o "結(jié)束"區(qū):projEnd
            
            · 載入: launch
            
            · 運(yùn)行: org.eclipse.ui.run
            
            · "附加"組標(biāo)志:additions
            
            · 窗口: window
            
            o "附加"區(qū):additions
            
            o "結(jié)束"區(qū):additionsend
            
            · 幫助: help
            
            o "開始"區(qū):helpStart
            
            o "主要組"區(qū):group.main.ext
            
            o "教程組"區(qū):group.tutorials
            
            o "工具組"區(qū):group.tools
            
            o "更新組"區(qū):group.updates
            
            o "結(jié)束"區(qū)(有時(shí)候不是結(jié)束): helpEnd
            
            o "附加"區(qū):additions
            
            o "關(guān)于組"區(qū):group.about.ext
            
            如果你提供的菜單條ID不帶有標(biāo)志ID,那么你的菜單項(xiàng)將出現(xiàn)在這個(gè)菜單條的后面。如果你建立了一個(gè)新菜單條ID,你的菜單條就被添加到"項(xiàng)目"和"運(yùn)行"菜單之間。
            
            Eclipse開發(fā)者提示:請讓工具條和菜單條ID、標(biāo)志位置保持一致性。
            
            請注意"文件"菜單的"新建"組標(biāo)志。這是我們添加自己的菜單的位置。由于它的標(biāo)志ID是new.ext,所以完整的路徑是:file/new.ext
            
            結(jié)果
            
            操作集合中還有其它一些特性可供使用,包括快捷鍵、狀態(tài)按鈕、浮動(dòng)圖標(biāo)、幫助內(nèi)容和窗體工具條等等。操作集合只是記載的數(shù)十個(gè)擴(kuò)展點(diǎn)中的一種類型的擴(kuò)展。因此我們看到的只是冰山一角。但是至少它使我們理解了擴(kuò)展點(diǎn)是如何工作的。我們看到的這些過程都是很好的。
            
            在講解向?qū)ё远x之前,我們看一下圖3所顯示的新工具條按鈕和菜單項(xiàng):
            
           

            
          圖3:新的菜單項(xiàng)和工具條按鈕

            
            標(biāo)準(zhǔn)對話框
            
            Eclipse提供了所有的標(biāo)準(zhǔn)對話框和建立自定義對話框的簡單途徑。大多數(shù)標(biāo)準(zhǔn)對話框都是由org.eclipse.jface.dialogs.MessageDialog類提供的。這個(gè)類含有很多用于建立標(biāo)準(zhǔn)對話框的靜態(tài)方法。下面表格列舉了我們可以使用的標(biāo)準(zhǔn)對話框。
            
           

            有人可能認(rèn)為使用標(biāo)準(zhǔn)對話框的時(shí)候,JOptionPane類比MessageDialog提供了更大的靈活性。但是歸根結(jié)底,在MessageDialog的構(gòu)造函數(shù)和自定義對話框的幫助下,你幾乎可以實(shí)現(xiàn)所有的事務(wù)。MessageDialog中缺少而JOptionPane擁有的唯一的特性是在HTML中直接進(jìn)行消息格式化。但是使用自定義對話框的時(shí)候是可以實(shí)現(xiàn)這種功能的。
            
            對話框輔助類
            
            現(xiàn)在我們知道了可供選擇的類型了,讓我們來建立Invokatron需要的對話框吧。有兩個(gè)地方需要對話框:
            
            · 代碼生成過程的確認(rèn)信息,是否覆蓋前面的代碼。
            
            · 輸入一個(gè)值的對話框(與JOptionPane.showInputDialog()類似)。
            
            這個(gè)類中的第一個(gè)方法是用于確認(rèn)代碼覆蓋的:
            
            public static boolean openOverwriteDialog(Shell parent) {
            return MessageDialog.openConfirm(parent,
            "Confirmation",
            "You are about to overwrite your class. " +
            "Are you sure you want to continue?");
            }
            
            上面的代碼非常簡單,我們僅僅建立了一個(gè)常規(guī)的確認(rèn)對話框。輸入對話框有點(diǎn)麻煩:MessageDialog沒有輸入字段。我們只能建立一個(gè)新對話框類,可以是Dialog的子類。我們也可以建立MessageDialog的子類并重載它的createCustomArea()方法,添加輸入字段。但是我們還有更簡單的方法。
            
            我們將使用InputDialog類:
            
            public static String openInputDialog(
            Shell parent,
            String title,
            String question,
            String initialValue) {
            
            InputDialog dlg = new InputDialog(
            parent,
            title,
            question,
            initialValue,
            null); //這是一個(gè)可供選擇的有效的類
            dlg.open();
            
            if(dlg.getReturnCode()!=Window.OK) //點(diǎn)擊"確認(rèn)"了嗎?
            return null;
            
            return dlg.getValue();
            }
            
            我們的對話框輔助類完成了。你可以在圖4中看到這些對話框。
            

            
          圖4:對話框

            
            Eclipse交響樂
            
            Eclipse與音樂類似;一旦你學(xué)會(huì)了如何使用那些可供使用的樂器,你就能編寫自己的交響樂了。在本文中我們簡短地了解了兩類工具:擴(kuò)展點(diǎn)和對話框。
          posted on 2005-11-02 15:35 Sung 閱讀(1421) 評論(0)  編輯  收藏 所屬分類: Eclipse
          主站蜘蛛池模板: 页游| 德令哈市| 桂东县| 四会市| 揭西县| 和静县| 武清区| 嘉义市| 麦盖提县| 香格里拉县| 怀安县| 镇巴县| 邻水| 内丘县| 武威市| 依安县| 怀柔区| 常宁市| 和平区| 商丘市| 海晏县| 新化县| 页游| 冀州市| 新邵县| 昭通市| 紫云| 凤台县| 濮阳县| 金堂县| 绥江县| 岐山县| 腾冲县| 禄劝| 黄陵县| 宣威市| 通城县| 商丘市| 阿鲁科尔沁旗| 临清市| 右玉县|