日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

编写Eclipse插件教程–第1部分

發布時間:2023/12/3 编程问答 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写Eclipse插件教程–第1部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Eclipse是三個最受歡迎的Java開發IDE之一。 其成功的原因之一是其可擴展性。 對于任何知道該怎么做并且已經做到的人來說,編寫eclipse插件都可以非常輕松快捷。

不幸的是,第一次在Eclipse中進行操作可能會非常耗時且令人沮喪。 Eclipse框架非常龐大,強大,有時甚至很復雜。 可能很難弄清楚哪些功能可用以及如何使用它們。

本教程介紹了自動化簡單的Java重構任務所需的所有Eclipse功能的基礎。 它顯示了如何在菜單中添加新項目以及如何分析,修改和格式化Java源代碼。 它還顯示了如何使用對話框與用戶進行交流。

它分為兩個部分。 這篇文章解釋了所有需要的理論。 在本部分的最后,您將已經對Eclipse框架有了足夠的了解,只需稍作搜索就可以完成該插件。 實際上,我們將創建一個插件,該插件將新項目添加到菜單中并收集執行重構所需的所有信息。

本教程的下一部分將展示如何創建對話框以及如何從插件修改Java源代碼。 它尚未發布。

樣本插件

我們創建具有兩個功能的示例插件:

  • 檢查非空參數–修改所選方法以檢查其參數是否不為null ,
  • 自定義生成toString –將toString方法添加到選定的類。
  • 這兩個功能都將在源菜單中添加一個新項。 僅當用戶選擇Java方法時,“檢查??非空參數”項才會啟用。 該功能顯示一個對話框,允許用戶選擇方法參數的子集。 然后修改選定的方法以檢查選定的參數是否為空:

    if (arg1==null || arg2==null || ... || argn==null)throw new IllegalStateException("The parameter may not be null.");

    僅當用戶選擇一個Java類時,才會啟用Custom generate toString項目。 它將顯示一個對話框及其所有屬性的列表。 用戶選擇屬于toString方法的屬性。 如果用戶選擇的屬性少于四個,則此功能將以下代碼添加到類中:

    @Override public String toString() {StringBuilder builder = new StringBuilder(this.getClass().getSimpleName());builder.append(" [ ");builder.append(b).append(", ").append(c).append(" ]");return builder.toString(); }

    如果用戶選擇了更多或更少的四個屬性,則該功能將以下代碼添加到類中:

    public String toString() {StringBuilder builder = new StringBuilder(this.getClass().getSimpleName());builder.append(" [ \n");builder.append(" a" + ": ").append(a).append("\n");builder.append(" b" + ": ").append(b).append("\n");builder.append(" c" + ": ").append(c).append("\n");builder.append(" d" + ": ").append(d).append("\n");builder.append(" ]");return builder.toString(); }

    就這些。 該插件在Github上可用。

    集成開發環境

    每個Eclipse版本都有多種風格。 最適合插件編寫者的版本稱為“ Eclipse for RCP and RAP Developers”。 RCP代表“富客戶端平臺”,它只是Eclipse平臺的另一個名稱。

    從下載頁面下載并安裝“用于RCP和RAP開發人員的Eclipse”。

    目標平臺

    首先要做的是配置目標平臺。 目標平臺是eclipse的另一個實例。 它表示您的插件將使用的最低配置。 您的插件將針對目標平臺進行編譯。 它也將安裝到其中并在您要對其進行測試時在其中運行。

    整個工作空間只能有一個活動目標平臺。 盡管這樣做更有意義,但它不是特定于項目的。

    最簡單的目標平臺

    最簡單的方法是開發與運行時相同的Eclipse版本。 這是默認選項。 在這種情況下,您要做的就是向其中添加eclipse SDK。

    安裝Eclipse SDK:

    • 轉到“幫助”->“安裝新軟件...”。
    • 選擇您的Eclipse更新站點,在本例中為“ Eclipse項目更新” http://download.eclipse.org/eclipse/updates/3. 更新網站。
    • 檢查Eclipse SDK和Eclipse Platform SDK。
    • 單擊下一步,接受許可并完成安裝。

    這就對了。 不需要任何其他操作,您就可以創建第一個插件項目了 。

    先進的目標平臺

    可以單獨下載和維護目標平臺。 如果要與較早的版本兼容,或者要對目標平臺配置有更大的控制權,請使用此選項。

    如果您不感興趣,請跳到下一章。

    創建目標平臺

    查找并下載您認為用戶將擁有的任何內容的SDK。 如果找不到SDK,也可以使用“常規”版本。 但是,如果下載SDK,則將提供源代碼和javadocs。

    例如,我們的插件需要Eclipse Indigo版本。 Eclipse Indigo的版本號是3.7,因此我們必須下載Eclipse 3.7 SDK 。 歸檔發行版頁面上提供了更早版本的Eclipse SDK的完整列表。

    我們的插件將僅取決于eclipse本身,因此我們要做的就是將下載的SDK解壓縮到某個地方。 如果需要其他插件,我們也必須搜尋并下載其SDK。 我們還將解壓縮它們并復制到與Eclipse SDK相同的目錄中。

    配置目標平臺

    現在,我們必須配置RCP Eclipse以使用準備好的目標平臺。

    定義并激活目標平臺:

    • 轉到“窗口”->“首選項”->“插件開發”->“目標平臺”。
    • 單擊添加。
    • 選擇“無:從空目標定義開始”,然后單擊下一步。
    • 填寫目標名稱。
    • 單擊添加,選擇目錄,瀏覽至解壓縮的Eclipse SDK并完成。
    • 將新的目標平臺檢查為“有效”。

    最后,轉到“插件開發”首選項頁面,然后選中“在Java搜索中包括來自目標的所有插件”。

    簡單的插件項目

    本章介紹如何創建一個簡單的插件項目以及如何對其進行調試。 簡單的插件沒有任何用處。 它只能顯示一條消息以證明其存在。

    在本章的最后,我們將刪除示例消息,最后得到一個空的插件框架。

    創建插件項目

    我們將使用Eclipse向導來生成插件。 從包資源管理器中調用向導:

    • 右鍵單擊包瀏覽器,
    • 選擇“新建”->“其他..”。
    • 選擇“插件項目”,然后單擊“下一步”。

    該向導有多個頁面。 在第一個上配置項目名稱和目標平臺。 您可以根據需要使用任何項目名稱,但是習慣上是以根java軟件包命名該項目。 例如,由于我們要將所有類都放入org.meri.eclipse.defensiveapitools包中,因此我們的項目名稱為org.meri.eclipse.defensiveapitools

    目標平臺字段包含您要開發的Eclipse版本。 如果有人要使用您的插件,則將要求他下載數量相等或更大的Eclipse。 一個舊的不兼容的Eclipse將拒絕加載它。 我們可以為當前的Eclipse開發很好,所以我們選擇3.7。

    點擊下一步'。

    第二頁包含基本項目信息。 隨意填寫ID,插件版本,名稱和提供程序。 第一個重要參數是執行環境。 該插件將僅在指定的Java上運行,或者永遠不在Java上運行。 在較早的JVM上運行的Eclipse只會忽略它。 我們選擇了J2SE-1.6。

    驗證:

    • 復選框“ Generate a activator,Java…”已選中,
    • 復選框“此插件將為用戶界面做出貢獻”已選中,
    • “是否要創建富客戶端平臺應用程序”的答案是否定的。

    點擊下一步'。

    選擇“ Hello,World Command”模板,然后單擊“ Finish”。 這將創建帶有示例菜單項的新插件。

    調試插件

    該插件僅在正在運行的Eclipse中起作用。 Eclipse支持手動和自動JUnit測試。 在這兩種情況下,都將在第一章中配置的目標平臺內安裝并運行該插件。

    本章僅顯示如何進行手動測試。 請參考其他資源,以學習如何為eclipse插件編寫junit測試。

    安裝并運行插件:

    • 右鍵點擊插件項目,
    • 單擊“調試為”->“ Eclipse應用程序”。

    系統將啟動新的Eclipse實例。 它的主菜單有一個新條目,稱為“樣本菜單”。

    現在,您有兩個正在運行的Eclipse實例。 一個用于開發,另一個用于測試。 測試蝕在開發人員內部運行。 所有調試工具均可用。 您可以放置??斷點,檢查變量等:

    • 在開發蝕中打開生成的SampleHandler類,
    • 將斷點放在execute方法中,
    • 回到日食,
    • 選擇“示例菜單”和“示例命令”

    執行將在新的斷點處停止。

    清潔插件

    我們已經看到該插件有效,因此我們可以從中刪除生成的示例菜單。

    刪除示例菜單項及其處理程序:

    • 打開plugin.xml文件,轉到擴展選項卡并刪除所有擴展。
    • 找到并刪除生成的SampleHandler類。

    plugin.xml中的plugin標簽現在應該為空。 打開plugin.xml文件,然后轉到plugin.xml選項卡:

    <?xml version="1.0" encoding="UTF-8"?> <?eclipse version="3.4"?> <plugin> </plugin>

    適配器圖案

    Eclipse是一個巨大的框架,您可以在其中安裝無限數量的插件。 這創建了一個龐大的功能和插件系統,它們必須相互配合。 為了使該系統保持解耦和盡可能擴展,Eclipse框架使用適配器設計模式 。 這種模式非常普遍,無論您要編寫哪種插件,您都可能會遇到它。

    此設計模式將一個類或接口轉換為另一個類或接口。 執行轉換的類稱為適配器。 該模式具有兩種不同的風格,并且eclipse框架都支持。 這兩種風格之間的區別在于誰創建了適配器。 它可以直接由要轉換的對象完成,也可以由獨立的適配器工廠完成。

    第一個子章節顯示了如何編寫適配器。 第二個子章節是關于能夠創建自己的適配器的對象,第三個子章節是關于獨立適配器工廠的。 最后一個子章節將所有內容放在一起,并說明如何轉換未知類型的對象。

    適配器

    適配器是將一種類型轉換為另一種類型的對象。 它必須表示其他類型,例如,如果將對象轉換為類,則必須擴展該類。 如果將它們轉換為接口,則必須實現該接口。

    通常,適配器會轉換具有所有必需功能但沒有正確API的對象。 否則,典型的適配器包含很少的邏輯。 它只包裝原始對象并將所有工作委托給它。

    以下適配器能夠將Minus接口的實現轉換為Plus接口:

    public class MinusToPlusAdapter implements Plus {private final Minus adaptee;public MinusToPlusAdapter(Minus minus) {super();this.adaptee = minus;}@Overridepublic int plus(int x, int y) {return adaptee.minus(x, -y);}}

    適應對象

    在此設計模式的簡單版本中,要轉換的對象創建了自己的適配器。

    我們將展示如何創建與Eclipse框架兼容的適應性對象。 該子章節的其余部分列出了此適配器樣式風格的優點和缺點。

    Eclipse實現

    自適應對象必須實現IAdaptable接口。 該接口只有一個方法getAdapter(Class type) 。 它返回一個適配器到請求的類型,或者返回null 。

    適應對象:

    public class MinusImpl implements Minus, IAdaptable {public int minus(int x, int y) {return x - y;}public Object getAdapter(Class type) {if (Plus.class.equals(type))return new MinusToPlusAdapter(this);return null;}}

    getAdapter方法可能會也可能不會調用全局適配器管理器來創建適配器。 一些Eclipse對象將其稱為,有些則沒有。

    何時使用

    自適應對象易于使用和調試。 該模式有助于保持類和接口層次結構的整潔。 它還提供了轉換類型和所需類型之間的一些解耦。

    在以下情況下使用它:

    • 轉換類型已經實現了太多接口。
    • 轉換后的類型必須與兩個不同的功能兼容,并且每個功能都需要它擴展另一個類。
    • 您希望將轉換后的類型和所需的接口/類分開。
    • 適配器需要訪問方法的私有字段。

    局限性

    僅依賴于此模式版本的插件是不可擴展的。 第三方插件將無法向其中添加新的適配器。

    第三方適配器

    此模式的第二個版本使用獨立的工廠來創建適配器。

    我們將展示如何在eclipse框架內調用適配器工廠。 該子章節的其余部分列出了此適配器樣式風格的優點和缺點。

    Eclipse實現

    適配器由適配器工廠創建。 為了實現它們的獨立性,適配器工廠被隱藏在全局適配器管理器的后面。 客戶端代碼從不直接與適配器工廠通信。

    適配器管理器公開一個getAdapter(Object obj, Class type)方法,該方法將調用委派給已安裝的適配器工廠。 此方法返回適配器或null 。

    使用適配器管理器創建適配器:

    (Plus) Platform.getAdapterManager().getAdapter(minus, Plus.class);

    適配器工廠可以通過編程方式或在plugin.xml中注冊到適配器管理器中。 由于我們的插件不需要執行此操作,因此我們將忽略該信息。 閱讀eclipse corner文章或Eclipse Adapters教程以獲取更多信息。

    注意:不允許適配器工廠調用已轉換對象的getAdapter(Class type)方法。 這將導致無限循環,因為getAdapter對象的getAdapter方法可能會調用適配器管理器。

    何時使用

    適配器工廠導致高度的去耦和可擴展性。 原始對象和所需類型的分離是絕對的。 它們之間沒有依賴性。 而是,獨立的適配器工廠取決于這兩者。

    向適配器管理器詢問適配器可以使您的功能擴展。 任何人都可以貢獻適配器以將其對象與您的插件集成。

    使用它來:

    • 使您的插件可由第三方插件編寫者擴展,
    • 集成兩個插件。

    局限性

    去耦具有更高的復雜性。 如果出現問題,可能很難找出故障適配器的來源。 同樣,找出可用的適配器比使用此模式的“可適配對象”版本要花費更多的時間。

    如果您希望其他人擴展您的插件,請說明需要哪些適配器。 還記錄您要添加到系統中的適配器工廠。 尋找xml文件中的所有信息可能非常耗時。

    調整對象

    使對象適應所需接口的最正確方法不假設對象使用的適配器模式版本。

    請遵循三個步驟以使對象適應所需的接口或類:

    • 如果對象實現或擴展了所需的接口,請使用該對象。
    • 如果對象可以適應自身,請使用對象提供的適配器。
    • 使用全局適配器管理器來適配對象。

    使對象適應類型的完整實現:

    public static Object getAdapter(Object obj, Class type) {// if the object implements or extends the desired interface, use itif (type.isInstance(obj))return obj;// if the object is able to adapt itself, let it do itif (obj instanceof IAdaptable) {IAdaptable adaptable = (IAdaptable) obj;Object adapter = adaptable.getAdapter(type);if (adapter != null)return adapter;}// delegate to the global adapter managerreturn Platform.getAdapterManager().getAdapter(obj, type); }

    抽象語法樹與Java模型

    Eclipse框架使用兩個不同的層次結構來表示Java源代碼。 第一個稱為Java模型,第二個稱為抽象語法樹。 這些層次結構大多數是獨立的,具有不同的用途和用法。

    Java模型層次結構是輕量級的,容錯的,快速重建的,并且其功能受到限制。 抽象語法樹提供了對Java源代碼的完全控制,但是重新創建的速度慢得多。 由于這些原因,Eclipse框架盡可能使用Java模型層次結構。 僅在必要時才使用抽象語法樹。

    第一個子章節顯示了如何在插件中啟用這些層次結構。 第二個子章節包含Java模型的概述,最后一個包含抽象語法樹的概述。

    插件依賴

    這兩個層次結構都屬于org.eclipse.jdt.core插件。 如果要使用它們,我們必須將jdt core插件添加到插件依賴項中:

    • 打開plugin.xml并轉到“依賴關系”標簽。
    • 單擊“必需的插件”部分中的“添加”按鈕。
    • 選擇org.eclipse.jdt.core插件。

    Eclipse將自動將插件依賴項添加到MANIFEST.MF文件的Require-Bundle部分。

    Java模型

    Java模型是一組表示Java方法,類,接口和其他元素的接口。 它是輕量級的,容錯的并且可以快速重新創建。

    Java模型層次結構提供有關Java代碼結構的基本信息。 它也可以對其進行簡單的更改。 例如,可以使用它來重命名或添加新的方法,類或接口。

    Java模型層次結構的主要缺點是它不包含有關基礎源代碼的完整信息。 例如,它不包含方法主體。 結果,不可能執行更復雜的源代碼更改。

    Java模型層次結構的根是IJavaElement接口。 擴展它的所有接口都屬于此層次結構。

    抽象語法樹

    抽象語法樹是代表Java方法,類,接口和其他元素的一組類。 它提供了有關Java代碼結構的完整信息,并且能夠對其進行任何更改。

    抽象語法樹層次結構的主要缺點是重新創建的速度比Java模型慢。 它的容錯能力也較差。

    抽象語法層次結構的根是ASTNode類。 擴展它的所有類都屬于此層次結構。

    用戶界面

    本章包含Eclipse用戶界面的快速概述。 在本文后面的內容中,我們將僅解釋UI那些部分的絕對基礎。

    第一個子章節是有關Eclipse UI最突出的部分:視圖和編輯器。 第二小節介紹選擇服務。

    零件,視圖和編輯器

    Eclipse用戶界面的兩個最重要的可視組件是視圖和編輯器。 編輯器和視圖都可以顯示任何內容并以任何形式呈現。 兩者都可以是可編輯的或只讀的,但是只有編輯器才能將內容保持在未保存的臟狀態。

    共同屬性

    編輯器和視圖都稱為部分。 Eclipse文檔使用單詞part作為“編輯器或視圖”的快捷方式。

    每個部分必須具有唯一的ID。 從技術上講,id是任意字符串。 但是,所有官方插件都遵循的約定是在ID前面加上插件名稱。 由于插件名稱通常等于插件根軟件包的名稱,因此約定可以保證ID的唯一性。

    每個部分都必須實現IWorkbenchPart接口。 該接口被擴展了兩次,分別是IWorkbenchPart2和IWorkbenchPart3接口。 您可以直接實現它們,也可以擴展名為WorkbenchPart的默認實現。

    所有零件均適用 。 IWorkbenchPart接口擴展了IAdaptable接口。 默認實現將getAdapter方法委托給全局適配器管理器。

    編者

    編輯器通常用于編輯或瀏覽文檔或輸入對象。 在編輯器中所做的更改不會立即存儲。 內容已更改的編輯器處于臟狀態,直到調用保存操作。 如果關閉編輯器而不保存,則所有未保存的更改都將丟失。 它的默認實現稱為EditorPart 。

    所有編輯器都顯示在頁面的同一區域中,無法最小化。 可能有多個相同類型的編輯器實例。

    編輯器工具欄與全局工具欄一起顯示,其菜單似乎是主菜單的一部分。

    使用IEditorInput接口的實例來標識由編輯器編輯的文檔或輸入對象。

    觀看次數

    視圖通常用于導航信息層次結構,打開編輯器或顯示在活動編輯器中打開的事物的其他信息。 在視圖中所做的修改將立即保存。 它的默認實現稱為ViewPart 。

    視圖可以移動到頁面的任何部分,并且可以最小化。 每個工作臺頁面通常只有一個給定視圖的實例。

    每個視圖都有其自己的本地工具欄和菜單。 還允許他們將按鈕貢獻給全局工具欄,并將菜單項貢獻給主菜單。

    選拔

    Eclipse選擇系統是相當標準的。 每個視圖和編輯器都會生成自己的選擇。 該框架還有一個全局選擇。 它通常包含對活動部分的選擇。

    如果插件需要知道選定的對象,無論它們來自何處,都必須使用全局選擇。 如果該插件僅希望將自己與少量視圖和編輯器集成在一起,則它可能僅聽取他們的選擇。

    本章介紹選擇后如何解釋。 Eclipse角落的文章描述了如何獲取當前選擇。

    選定對象

    當前選擇始終實現ISelection接口。 該界面極其簡約。 它的唯一方法是能夠判斷選擇是否為空。

    要獲取更多詳細信息,您必須將其轉換為其子類型之一。 我們的插件有兩個有趣的子類型:

    • ITextSelection –有關所選文本的信息。 如果未選擇任何文本,則包含光標位置。
    • IStructuredSelection –包含選定對象的列表。

    結構化選擇可以包含任何類型的對象。 將它們轉換為所需的類或接口的最佳方法是使用適配器模式 。 簡單的instanceof和cast可能還不夠。 蝕食的物體通常可以適應多種類型,但是它們僅實現或擴展了其中的一些類型。

    Eclipse菜單

    Eclipse菜單系統異常豐富且復雜。 至少有五種菜單類型。 外觀相同或相似的菜單可以通過多種方式調用。 為了使其更加有趣,Eclipse具有兩個不同的框架,它們能夠將新項目添加到所有這些菜單中。

    每個Eclipse菜單框架都有其自己的章節,而這兩個章節都緊隨其后。 本章僅包含各種菜單類型的概述,插件添加菜單項的菜單概述以及這兩個菜單框架的概述。

    菜單類型

    Eclipse有五種菜單類型:

    • 上下文菜單–鼠標右鍵單擊調用的菜單。 有時也稱為彈出菜單。
    • 主菜單–菜單始終在GUI頂部可見。
    • 主工具欄–主菜單下始終可見的工具欄。
    • 視圖菜單–視圖中可用的菜單。 單擊視圖中的白色向下箭頭以調用它。
    • 視圖工具欄–大多數視圖中都提供一個小工具欄。

    與視圖不同,編輯器沒有自己的菜單或工具欄。 它們始終有助于主菜單或主工具欄。

    源菜單

    “源”菜單包含諸如“組織導入”或“生成委托方法...”之類的項目,對于我們的兩個功能而言,這是合乎邏輯的地方。 它是由Java開發工具插件(JDT)貢獻的。

    該菜單位于主菜單或上下文菜單中。 這兩個位置僅在某些情況下顯示它。

    僅當活動視圖或編輯器支持時,主菜單才包含源菜單項。 以下列表包含導致源菜單出現的視圖和編輯器示例。 激活其中任何一個以在主菜單中查看它:

    • Java編輯器
    • 輸入層次結構視圖,
    • 包瀏覽器視圖,
    • 項目資源管理器視圖。

    如果至少一個選定的項目代表Java文件,類,包方法或其他Java項目,則上下文菜單包含源菜單項目。 當然,這包括Java源代碼編輯器中的文本選擇。 使用源子菜單激活上下文菜單:

    • 在編輯器中打開Java源文件,然后在內部右鍵單擊,
    • 在包資源管理器中選擇Java文件或類,然后單擊鼠標右鍵。

    也可以使用快捷方式“ Alt + Shift + S”來調用源菜單。

    菜單框架

    Eclipse有兩個不同的框架,它們可以將新項目添加到菜單中:

    • 行動框架,
    • 命令框架。

    操作框架較舊且已過時。 命令框架是更新,靈活的,并且有點復雜。 它是優越的,應該用于任何新功能。

    該命令框架與大多數菜單兼容,但并非與所有菜單兼容。 某些菜單尚未被重寫,因此您必須使用動作框架為其做出貢獻。 例如,主菜單中的源子菜單僅與動作框架兼容。

    某些菜單與兩個框架都不兼容。 快捷鍵CTRLS + ALT + S調用的源菜單就是這樣的菜單。 無法為此做出貢獻。

    注意:不可能對菜單有所貢獻。

    命令框架

    命令框架能夠將項目添加到大多數Eclipse菜單中。 它被設計為迷你模型視圖控制器,并將UI與要執行的動作分開。

    本章包含命令框架的基礎知識。 我們將解釋命令框架組件,并使用它們將新項目添加到源菜單中。 然后,我們將展示如何啟用和禁用菜單項。 僅當新菜單項在當前選擇中有用時,才會啟用它們。

    總覽

    菜單中的新增內容稱為菜單內容。 每個菜單項都需要知道在哪里繪制新項目,繪制哪些項目以及當有人單擊它們時會發生什么。

    大多數Eclipse菜單都分配了唯一的ID。 如果要為菜單添加內容,則必須找到該ID,從中組成所謂的位置URI,然后將其分配給菜單添加內容。

    除其他事項外,每個菜單項都可以在菜單中添加分隔符和命令 。 分隔符是不同菜單部分之間的灰色線。 放置在菜單中的命令表示可單擊的菜單項。 每個都有一個標簽,可能有一個圖標,并且可以啟用或禁用。

    但是,該命令無法執行操作。 僅僅是將GUI與實際操作分開的抽象事物。 實際工作是在命令處理程序中完成的。

    菜單編號

    菜單ID是分配給菜單或子菜單的任意字符串。 每個菜單可以具有多個ID。 查找Eclipse菜單的菜單ID會非常令人沮喪和困難。

    如果幸運的話,該ID將與Eclipse RCP中提供的Plugin Spy一起顯示。 它能夠顯示有關菜單項,UI元素和正在運行的Eclipse插件的信息。 如果您不走運,則必須自己找到ID。

    頂層

    如果您希望將一項添加到菜單或工具欄的頂層,那么事情就容易了。

    常規應用程序菜單列表:

    • Eclipse主菜單使用org.eclipse.ui.main.menu 。 ID僅指菜單的頂層,例如,該項目將與“文件”,“編輯”和“幫助”一起放置。
    • Eclipse工具欄使用org.eclipse.ui.main.toolbar 。
    • 上下文菜單使用org.eclipse.ui.popup.any id。

    如果您希望對某些視圖內的菜單或工具欄有所幫助,請使用視圖ID。 幸運的是,插件間諜可以幫助您找到視圖ID。 在RCP Eclipse中打開視圖,然后按“ Alt + Shift + F1”。 Plugin Spy將打開一個包含視圖信息的彈出窗口:

    帶有插件間諜的子菜單

    查找子菜單的ID可能會更加復雜,因為Plugin Spy可能無法找到它。

    使用“ Alt + Shift + F2”快捷方式啟動您要貢獻的插件間諜并打開菜單。 單擊任何菜單項,Plugin Spy將顯示有關它的各種信息。

    使用插件間諜獲取源菜單位置URI:

    • 在開發Eclipse中打開任何Java文件,
    • 按“ Alt + Shift + F2”,
    • 在Java文件中右鍵單擊
    • 將鼠標懸停在“源”菜單項上,
    • 點擊“清理...”項。

    Eclipse將顯示以下彈出窗口:

    如果彈出窗口包含位置URI,那么我們快到了。 復制并將其粘貼到某處。 警告:“插件間諜”彈出窗口在復制文本之前和之后都會添加新行,因此看起來好像沒有任何內容被復制。

    之間的部分:和? 是菜單ID。 例如,如果插件間諜顯示
    menu:org.eclipse.jdt.ui.source.menu?after=CleanUp
    menu:org.eclipse.jdt.ui.source.menu?after=CleanUp ,菜單ID為

    org.eclipse.jdt.ui.source.menu

    另一種方法

    如果Plugin Spy沒有顯示位置URI,則表明菜單項或菜單本身尚未重寫到命令框架中。 這是舊菜單項的Plugin Spy彈出窗口的樣子:

    最好的選擇是在Google周圍搜索并查看有助于該菜單的插件的plugin.xml。 可能有人遇到相同的問題并設法解決了。

    您可以從jdg2e上可用的舊菜單列表開始,但仍然不錯。 如果菜單已經存在于Eclipse 3.0中,則會在其中列出其菜單ID。 該表中沒有源菜單。

    但是,其父菜單的ID是#CompilationUnitEditorContext ,例如,如果您右鍵單擊任何java文件都可用的菜單。 這將是可以接受的二等獎。

    計劃B

    盡管使用命令框架對頂層菜單的貢獻很容易,但是未知的菜單ID使得對各種子菜單的貢獻變得困難甚至不可能。 如果找不到運氣,則必須使用舊的action框架 。

    位置URI

    位置URI字符串包含三部分:方案,菜單ID和位置修飾符:

    <scheme>:<menu-id>[?<placement-modifier>]

    Eclipse有三種方案:

    • menu –主應用程序菜單或視圖菜單,
    • toolbar –主應用程序工具欄或視圖工具欄,
    • popup –上下文菜單,例如,右鍵單擊所調用的任何菜單。

    位置修飾符是可選的。 它具有<placement>=<id> 。 放置部分在after或before 。 ID是分隔符名稱,菜單ID或項目ID。 請注意,如果菜單不包含指定的ID,它將忽略您的貢獻。

    按照約定,每個菜單都應聲明一個ID為'additions'的特殊項目。 在這里,菜單作者應該放置項目。 您不必尊重他們的意愿,某些菜單沒有此類項目。 即使特殊添加項在菜單中,您也可以將項目放置在任意位置。

    幾個例子:

    • menu:org.eclipse.ui.main.menu?after=file –將項目添加到主菜單中的File和Edit子菜單之間。
    • toolbar:org.eclipse.ui.main.toolbar –將項目添加到主工具欄。
    • menu:org.eclipse.ui.navigator.ProjectExplorer –將項目添加到項目瀏覽器視圖中可用的菜單。
    • toolbar:org.eclipse.ui.navigator.ProjectExplorer –將項目添加到項目瀏覽器視圖中可用的工具欄。
    • popup:org.eclipse.ui.popup.any –將項目添加到上下文菜單。

    將該項目放到源菜單中,而不用擔心確切的位置:

    popup:org.eclipse.jdt.ui.source.menu

    注意:我們在位置URI中省略了可選的確切位置,因為它可能很棘手。 如果您還希望指定確切的位置,則必須確保每次調用菜單時都存在選定的位置。 不幸的是,僅僅因為菜單項看起來相同,并不意味著它確實是同一菜單項。

    例如,如果我們將?after=CleanUp添加到上一個位置的末尾,則我們的菜單項將位于在Java編輯器中右鍵單擊調用的sources子菜單中的“ Clean Up…”項之后。 但是,在包資源管理器視圖中右鍵單擊所調用的源子菜單中,它是不可見的。

    命令

    命令是抽象的事物,代表一個動作并具有唯一的ID。 可以將其放置在菜單中,并且可以為其分配快捷方式。

    命令在plugin.xml文件中配置。 打開它并轉到擴展選項卡。 使用名為“所有擴展名”的左側部分:

    • 單擊“添加”,然后選擇org.eclipse.ui.commands擴展點。
    • 右鍵單擊新的擴展點,然后選擇“新建”->“命令”。
    • 填寫ID。 約定是將插件名稱用作命令ID的前綴。
    • 填寫姓名。

    我們創建了兩個命令。 一個名為“ Generate Custom toString”,另一個名為“ Check Non-Null Parameter”。 他們的ID是:

    • org.meri.eclipse.defensiveapitools.generatetostring
    • org.meri.eclipse.defensiveapitools.checknonnullparameter

    Eclipse自動生成相應的xml并將其放置到plugin.xml文件中。 轉到plugin.xml選項卡進行查看:

    <extension point="org.eclipse.ui.commands"><commandid="org.meri.eclipse.defensiveapitools.generatetostring"name="Generate Custom toString"></command><commandid="org.meri.eclipse.defensiveapitools.checknonnullparameter"name="Check Non-Null Parameter"></command> </extension>

    菜單貢獻

    菜單貢獻是菜單的補充。 它知道在何處繪制自身,并包含應繪制的項目列表。 放置在菜單項中的所有項目將按照其在該列表中的位置所定義的順序一起顯示。

    我們將配置一個新的菜單內容,并在其中添加兩個菜單項和兩個分隔符。 向其添加其他元素類型是類推。

    菜單貢獻

    菜單項在plugin.xml文件中配置。 打開它并轉到擴展選項卡。 使用名為“所有擴展名”的左側部分:

    • 單擊“添加”,然后選擇org.eclipse.ui.menus擴展點。
    • 右鍵單擊新的擴展點,然后選擇“新建”->“菜單貢獻”。
    • 填寫locationURI 。
    • 將allPopups設置為true 。

    Recall, that the source context menu location uri is:

    • popup:org.eclipse.jdt.ui.source.menu

    命令

    Add commands to the menu contribution:

    • Right click on the menu contribution and choose 'New' -> 'command'.
    • Click Browse and find previously created command.
    • Fill in label.

    Eclipse automatically generates corresponding xml and places it to the plugin.xml file. Go to the plugin.xml tab to see it:

    <extensionpoint="org.eclipse.ui.menus"><menuContributionallPopups="true"locationURI="popup:org.eclipse.jdt.ui.source.menu"><commandcommandId="org.meri.eclipse.defensiveapitools.generatetostring"label="Generate Custom toString"style="push"></command><commandcommandId="org.meri.eclipse.defensiveapitools.checknonnullparameter"label="Check Non-Null Parameter"style="push"></command></menuContribution> </extension>

    Test the menu. Run or debug the plugin and open any java file in the test Eclipse. Right click and choose the Source sub-menu. The menu contains two new items. As our commands have no handlers assigned, both items are disabled.

    Separator

    Add separator to the menu contribution:

    • Right click on the menu contribution and choose 'New' -> 'separator'.
    • Set visible to true .
    • Fill in name.

    The order of elements in the menu contribution defines the order of corresponding items in the menu. Drag and drop new separator to the place where you would like to see it.

    Eclipse automatically generates corresponding xml and places it to the plugin.xml file. Go to the plugin.xml tab to see it:

    <menuContributionallPopups="true"locationURI="popup:org.eclipse.jdt.ui.source.menu"><separatorname="org.meri.eclipse.defensiveapitools.begin"visible="true"></separator>... commands ...<separatorname="org.meri.eclipse.defensiveapitools.end"visible="true"></separator> </menuContribution>

    Test the menu again. Run or debug the plugin and open any java file in the test Eclipse. Right click and choose the Source sub-menu. Our menu items are surrounded by menu separators.

    Command Handler

    The command handler is the class that executes an action whenever users clicks on the menu item. Once we assign it to the command, the menu item created in previous chapter will be enabled.

    This section is divided into three part. First two sections show how to create and configure a dummy handler. Third section explains where the handler can get the information about currently selected items, active editor and other UI state.

    Simplest Command Handler

    A command handler must implement the IHandler2 interface. The easiest way to implement it is to extend the abstract AbstractHandler class. This class provides standard implementation of all necessary methods except the execute method.

    The execute method is called whenever user invoked the command. It has one parameter which contains information about the current state of the application. The execute method must return null .

    Our first command handler is very simple:

    public class GenerateToStringHandler extends AbstractHandler {@Overridepublic Object execute(ExecutionEvent event) throws ExecutionException {System.out.println("GenerateToStringHandler");// must return nullreturn null;}}

    Basic Configuration

    The only thing we have to configure is which commands should be handled by our handler.

    Note: It is also possible to assign multiple handlers to one command, but we will not do it. It is an advanced topic discussed in additional resources .

    As usually, command handlers are configured in plugin.xml file. Open it and go to extensions tab. Use the left part named 'All Extensions':

    • Click 'Add' and choose org.eclipse.ui.handlers extension point.
    • Right click on the new extension point and choose 'New' -> 'handler'.
    • Browse for the command id.
    • Browse for the class implementing the command handler.

    Eclipse automatically generates corresponding xml and places it to the plugin.xml file. Go to the plugin.xml tab to see it:

    <extensionpoint="org.eclipse.ui.handlers"><handlerclass="org.meri.eclipse.defensiveapitools.generatetostring.GenerateToStringHandler"commandId="org.meri.eclipse.defensiveapitools.generatetostring"></handler><handlerclass="org.meri.eclipse.defensiveapitools.checknonnullparameter.CheckNonNullParameterHandler"commandId="org.meri.eclipse.defensiveapitools.checknonnullparameter"></handler> </extension>

    Run or debug the plugin and open any java file in the test Eclipse. Right click and choose the Source sub-menu. The 'Generate Custom toString' menu item is enabled. If you click on it, the command handler will print 'GenerateToStringHandler' into console in RCP Eclipse.

    實作

    As we are going to invoke our feature from two different places, our command handler will delegate all real functionality to yet another class.

    That another class will need some information about the context surrounding the command. Namely, 'Generate Custom toString' needs to know which class was selected and 'Check Non-Null Parameters' needs to know which method was selected.

    Note: Eclipse generates mini-selection every time you place the cursor somewhere. You do not have to highlight the text inside editor.

    The execute method obtains an instance of ExecutionEvent as a parameter. The execution event has reference to application context which contains various information about the state of the eclipse.

    Use the HandlerUtil to get that information out of the execution event. Handler util is a static class and has a lot of getWHATEVER methods. We will need four of them:

    • getCurrentSelection – returns current selection,
    • getActivePartId – returns id of active view or editor,
    • getActiveEditorInput – returns object edited by the opened editor,
    • getActiveShell – returned object will be needed for our plugin dialog.
    private static final String JAVA_EDITOR_ID = "org.eclipse.jdt.ui.CompilationUnitEditor";public Object execute(ExecutionEvent event) throws ExecutionException {//this object is needed to render wizards, messages and so on Shell activeShell = HandlerUtil.getActiveShell(event);//get selected items or text ISelection currentSelection = HandlerUtil.getCurrentSelection(event);//identify active GUI partString activePartId = HandlerUtil.getActivePartId(event);if (JAVA_EDITOR_ID.equals(activePartId)) {//get edited fileIEditorInput input = HandlerUtil.getActiveEditorInput(event);//currentSelection contains text selection inside input file//... locate class selected in that file ...} else {//currentSelection contains all selected classes //... collect all selected classes ...}return null; }

    Enabling, Disabling and Visibility

    The menu item does not have to be visible and enabled all the time. Most commands are not universally usable.

    Both our features are going to be visible all the time. However, we will have them enabled only under some conditions. 'Check Non-Null Parameters' will be enabled:

    • inside java editor,
    • if the current selection contains only modifiable java methods.

    'Generate Custom toString' will be enabled:

    • inside java editor,
    • if the current selection contains only modifiable java classes or source files.

    First, shortest section shows where to configure visibility and enablement. Next one describes xml language used to define visibility and enable conditions. Third section uses that language to test active editor and fourth tests selected objects. Final two sections put everything together and show conditions needed for our plugin.

    Visible vs Hidden

    If you want to make the menu item invisible, use the visibleWhen tag on a command reference inside a menu contribution. If you want to make the item disabled, use the enabledWhen tag on the command handler. Both tags works exactly the same way.

    Open plugin.xml in an editor and go to the extensions tab. Right click either on the reference inside a menu contribution or command handler and choose either visibleWhen or enabledWhen .

    Expression Language

    If you right click on visibleWhen or enabledWhen tag, Eclipse will show a list of possible sub-tags. All those tags are part of xml boolean expression language and we will use them to define a condition. If the condition is satisfied, the menu item will be visible or enabled. If the condition is not satisfied, the menu item is either disabled or invisible.

    One warning: not each tag shown on the list is directly usable. In this case, Eclipse simply shows all tags that defines a condition.

    Usage of all listed tags is described on Eclipse help page . We will explain only five tags needed for our conditions:

    • or – logical or,
    • with – specify the object under condition,
    • iterate – iterator over a collection,
    • equals – compares object under condition with a value,
    • adapt – adapts object under condition to the specified one.

    Or
    The element or does logical or. Its child tags must represent conditions. If at least one of them returns true, the result is true.

    With
    The element with specifies the object under condition. This tag can access various variables that describe Eclipse state. Each variable has a name. All childs of the with tag will test their condition against the value of the specified variable.

    This tag has one mandatory property variable . Use it to specify the variable name. We will use two variables:

    • activeMenuSelection – collection of all objects selected by the user,
    • activePartId – the id of currently active GUI part (view, editor, preference page …).

    As any plugin can add its own variable, the complete list of all variables is impossible to find. The list of default variables is available on Eclipse wiki page .

    Iterate
    The element iterate is usable only inside the with tag and only if this tag specified a collection as the object under the test. Its child tags must represent conditions. Iterate iterates through all objects inside the collection and runs all child conditions on those objects.

    The iterate tag has two arguments: operator and ifempty . The first argument value can be either and or or . Selected operator will be applied to evaluated conditions results. If no operator is specified, the iterator uses and .

    The ifempty can be either true or false . This value will be returned if the collection under test is empty. If not specified then true is returned when the operator equals and and false is return if the operator equals or .

    Equals
    The element equals compares the object under test with its value argument. As the object under test may not be a string, the value argument is converted into the object. The exact conversion algorithm is described in Eclipse manual .

    Adapt
    The element adapt adapts the object under test to the interface or class specified in its type argument. It may have child tags that may process it further, but we will use it solely to check whether the object under test is adaptable to the desired interface.

    Test Current Editor

    If the menu was invoked from java editor, then id of the active part is the same as id of java editor. Therefore, we have to get java editor id and compare it to the value of activePartId expression variable.

    To get the id, open any java file in RCP eclipse and press ALT + SHIFT + F1. Plugin Spy will show popup with various information about active GUI part. According to this popup, the java editor id is org.eclipse.jdt.ui.CompilationUnitEditor .

    Combine the with and equals tags to compare the id:

    <with variable="activePartId"><equals value="org.eclipse.jdt.ui.CompilationUnitEditor" /> </with>

    Test Selected Objects

    Current selection can contain multiple items and all of them should represent something we can work with. The adapter pattern and java model hierarchy have been designed exactly for these kind of situation.

    Three interfaces from java model hierarchy are relevant to our features:

    • org.eclipse.jdt.core.IMethod – represents java methods,
    • org.eclipse.jdt.core.IType – represents java classes and interfaces,
    • org.eclipse.jdt.core.ICompilationUnit – represents java source file.

    Therefore, we will iterate over the activeMenuSelection variable and check whether each selected object is adaptable to one of needed types. If no item is selected, the condition should return false .

    A method is selected if it is possible to adapt all selected objects into the IMethod interface:

    <with variable="activeMenuSelection"><iterate ifEmpty="false" operator="and"><adapt type="org.eclipse.jdt.core.IMethod" /></iterate> </with>

    A java source file or a class is selected if it is possible to adapt all selected objects into either ICompilationUnit or IType interface:

    <with variable="activeMenuSelection"><iterate ifEmpty="false" operator="and"><or><adapt type="org.eclipse.jdt.core.IType" /><adapt type="org.eclipse.jdt.core.ICompilationUnit" /></or></iterate> </with>

    Note 1: Unfortunately, the xml expression language is not expressive enough to distinguish between classes and interfaces. An instance of IType interface represents class if its isClass method returns true , but xml language does not support method calls.

    Note 2: We are cheating little bit here. It is not possible to modify compiled java methods and classes inside jar packages, but they are adaptable to java model interfaces too. Those objects are modifiable only if the method getCompilationUnit does not return null . As with the previous note, this is not possible to check from the xml expression language. Fortunately, we are contributing to the source sub-menu which is available only on modifiable java elements, so we do not have to solve this problem.

    Note 3: In both cases, the correct solution would be to create own with variable and handle both problems in java. This is possible and easy, but out of scope of this article. If you wish to know how to do it, read the post on Lars Vogel blog.

    Check Non-Null Parameters Enablement

    To reiterate, the menu item 'Check Non-Null Parameters' will be enabled:

    • inside java editor,
    • if the current selection contains only modifiable java methods.

    Use or to combine conditions created in previous chapters. This is the final condition:

    <enabledWhen><or><with variable="activePartId"><equals value="org.eclipse.jdt.ui.CompilationUnitEditor" /></with><with variable="activeMenuSelection"><iterate ifEmpty="false" operator="and"><adapt type="org.eclipse.jdt.core.IMethod" /></iterate></with></or> </enabledWhen>

    Generate Custom toString Enablement

    Recall, that the menu item 'Generate Custom toString' will be enabled:

    • inside java editor,
    • whenever java class is selected,
    • whenever java file is selected.

    Use or to combine conditions created in previous chapters. This is the final condition:

    <enabledWhen><or><with variable="activePartId"><equals value="org.eclipse.jdt.ui.CompilationUnitEditor" /></with><with variable="activeMenuSelection"><iterate ifEmpty="false" operator="and"><or><adapt type="org.eclipse.jdt.core.IType" /><adapt type="org.eclipse.jdt.core.ICompilationUnit" /></or></iterate></with></or> </enabledWhen>

    Expression Language – Additional Resources

    The complete explanation on how those conditions work is out of scope of this post. If you wish to read more, the basic and short article is on eclipse-tips blog and a detailed one is on Lars Vogel blog.

    The detailed post explains also how to reuse conditions and how to create new with variable. It is definitely worth reading, especially if you plan to do something complicated.

    Command Framework – Additional Resources

    We simplified things a little in this chapter. The full functionality and possibilities of the command framework are out of scope of this article.

    If you wish to know more, good tutorials are available on Lars Vogel blog or in IBM library .

    The Actions Framework

    Theoretically speaking, the actions framework is old and has been deprecated. The newer commands framework should be used for most purposes. Unfortunately, not all menus have been rewritten yet.

    If the menu you are interested in has not been rewritten yet, you have to use the old actions framework to contribute to it.

    As most menus are already compatible with the new command framework, we will show only the part of actions framework that is able to contribute to the source sub-menu in main menu. If you wish to read more about the actions framework, the last sub-chapter links to more detailed articles.

    總覽

    Two most important elements in the actions framework are action and action delegate. An action is assigned to menu items and knows the menu where it should be drawn. Action delegate is a class that does all the work whenever a menu item is invoked.

    Each action delegate can be assigned to any number of actions. However, each action can have only one action delegate.

    Items and menus definitions are kept either inside an action set or inside something called a contribution. There is not much difference between them, both action set and contribution contain list of actions and sub-menus to be drawn within menu system.

    Eclipse framework has three types of actions contributions and each is able to specify a simple condition that must be satisfied to have a visible action:

    • viewerContribution – an action is available only inside specified view,
    • objectContribution – an action is available only if specified object type has been selected,
    • editorContribution – an action is available only inside editor menu or toolbar.

    Note: it is also possible to assign a condition to an action. Action conditions are powerful, but out of scope of this article.

    Both contribution and action set are placed directly inside an extension point. Each menu type has its own extension point:

    • org.eclipse.ui.actionSets – main menu or main toolbar,
    • org.eclipse.ui.popupMenus – context menu,
    • org.eclipse.ui.viewActions – local menu or toolbar in a view,
    • org.eclipse.ui.editorActions – local menu or toolbar in an editor (recall that the editors menu is shown inside the main menu/toolbar),
    • org.eclipse.ui.perspectiveExtensions – we will ignore that.

    So, we have to create action delegate class, identify the menu we want to contribute to and configure an action inside a action set.

    Implementing Action Delegate

    Action delegate implementation depends on where you want to place the associated action. Menus supply the action delegate with additional information that depends on the menu type. Therefore, each menu type requires it to implement different interface.

    共同

    Each action delegate must implement IActionDelegate interface. That interface was later extended with some lifecycle methods, so if you need to initialize your action delegate or know when it is disposed, implement also IActionDelegate2 interface.

    Which method is invoked when a menu item is clicked depends on implemented interfaces. An action delegate that does NOT implement IActionDelegate2 interface must place all the work inside the run method. However, an action delegate that implements the IActionDelegate2 interface must place all the work inside the runWithEvent . In this case, the run method is never called.

    Menu Types and Sub-Interfaces

    Which sub-interfaces of IActionDelegate interface you should use depends on where do you want to place the action. Some parent menus send additional information about active parts and the action delegate must be able to acquire it.

    List of eclipse menus and expected action delegate interfaces:

    • main menu or toolbar – IWorkbenchWindowActionDelegate ,
    • view menu or toolbar – IViewActionDelegate ,
    • view context menu – IViewActionDelegate or IObjectActionDelegate ,
    • editor menu or toolbar – IEditorActionDelegate ,
    • editor context menu – IObjectActionDelegate .

    Selection

    Parent menu uses the method selectionChanged to inform the action delegate about current selection changes. However, selection changes are sent to the action delegate only after it was invoked for the first time. All prior selection changes are ignored.

    The selectionChanged method is called for the first time right before the first call of run or runWithEvent method.

    實作

    We are ready to implement our action delegates. As it was with the command handler in command framework, our action delegate will only collect information about current editor and selected objects or text. The real work is delegated to yet another class.

    As we want to put our action to the main menu, we have to implement the IWorkbenchWindowActionDelegate interface. Main menu sends changes of current selection it to its action delegates, so all we have to do is to store it:

    private ISelection selection;public void selectionChanged(IAction action, ISelection selection) {this.selection = selection; }

    Getting current editor is little bit more complicated. Main menu does not inform its items about active UI parts. However, it sends them an instance of IWorkbenchWindow upon initialization. Fortunately, the workbench window object is aware of almost everything that is going on in the eclipse.

    The explanation of the workbench window object would take too much space and it is not that important. The important is, that it provides access to all kind of information about eclipse user interface.

    Use workbench window to get active editor and its id:

    private IWorkbenchWindow window;public void init(IWorkbenchWindow window) {this.window = window; }private String getActivePartId() {return window.getPartService().getActivePartReference().getId(); }private IEditorPart getActiveEditor() {return window.getActivePage().getActiveEditor(); }

    Finally, we are ready to implement the run method:

    public class GenerateToStringActionDelegate implements IWorkbenchWindowActionDelegate {private static final String JAVA_EDITOR_ID = "org.eclipse.jdt.ui.CompilationUnitEditor";public void run(IAction action) {//this object is needed to render wizards, messages and so on Shell activeShell = window.getShell();//get selected items or text ISelection currentSelection = selection;//identify active GUI partString activePartId = getActivePartId();//java editor must be handled differently than view selection if (JAVA_EDITOR_ID.equals(activePartId)) {//get edited fileIEditorInput input = getActiveEditor().getEditorInput();//currentSelection now contains text selection inside input file//... locate class selected in that file ...} else {//currentSelection now contains all classes inside //... collect all selected classes ...}System.out.println("GenerateToStringActionDelegate");}}

    MenubarPath and ToolbarPath

    Before you configure the action, you have to find the menu or toolbar path. It identifies a menu or toolbar where your action will be shown.

    Each menu or sub-menu has its name and menu or toolbar path navigates those names. It starts with the top level menu name and continues with all sub-menu names. The final part is optional and specifies a location in the final menu. If it is missing, the item is placed to the end of the specified menu.

    For example, the menu path #menuName/subMenuName/additions should be read as “place the item in the end of the additions group which is located inside the sub-menu subMenuName of the #menuName menu”.

    Or, the menu path #menuName/subMenuName/ should be read as “place the item in the end of the sub-menu subMenuName of the #menuName menu”.

    Important: Menu ids are the same as described in the command framework chapter . The id of the source menu id is org.eclipse.jdt.ui.source.menu . As the main source menu is a top level menu, menubarPath is:

    org.eclipse.jdt.ui.source.menu/

    Configuring an Action

    Action configuration is quite simple. Add an extension point, put either action set or contribution into it and place the action.

    Which one of five extension points should be used depends on the menu. We want to add an action to the main menu, so we have to use the action sets extension point.

    Open plugin.xml file and go to extensions tab. Use the left part named 'All Extensions'. First, configure an action set:

    • Click 'Add' and choose org.eclipse.ui.actionSets extension point.
    • Right click on the new extension point and choose 'New' -> 'actionSet'.
    • Fill in the action set id. The convention is to use plugin name as its prefix. Important: This field has some strange limitations. We could not really figure them out, so all we can say is that:
      • org.meri.eclipse.defensiveapitools.mainmenucontrib works

      In any case, if nothing shows up in the menu, try to change this id.

    • Fill in label. 可以是任何東西。
    • Set visible to true .

    Second, add actions to the action set:

    • Right click on the action set and choose 'New' -> 'action'.
    • Fill in the action id. The convention is to use plugin name as id prefix.
    • Fill in label. 可以是任何東西。
    • Fill in either menubarPath or toolbarPath.
    • Scroll down and browse for the action delegate in class field.

    Eclipse automatically generates corresponding xml and places it to the plugin.xml file. Go to the plugin.xml tab to see it:

    <extensionpoint="org.eclipse.ui.actionSets"><actionSetid="org.meri.eclipse.defensiveapitools.sourcemenu"label="Defensive API Tools "visible="true"><actionclass="org.meri.eclipse.defensiveapitools.generatetostring. GenerateToStringActionDelegate"id="org.meri.eclipse.defensiveapitools.generatecustomtostring"label="Generate Custom toString"menubarPath="org.eclipse.jdt.ui.source.menu/"style="push"></action><actionclass="org.meri.eclipse.defensiveapitools.checknonnullparameter. CheckNonNullParameterActionDelegate"id="org.meri.eclipse.defensiveapitools.checknonnullparameters"label="Check Non-Null Parameters"menubarPath="org.eclipse.jdt.ui.source.menu/"style="push"></action></actionSet> </extension>

    Run or debug the plugin and open any java file in the test Eclipse. Click on the Source main menu item. The menu contains two new items. Click on the Generate Custom toString' menu item, the action delegate will print 'GenerateToStringActionDelegate' into console in RCP Eclipse.

    其他資源

    Walkthrough of all types of actions contributions is available in an eclipse corner article . Easy to read FAQ article explains actions in the main menu.

    Actions framework supports also complicated conditions and filters to show actions only under some circumstances. If you have a reason to use that, the best starting point is in eclipse documentation .

    有用的資源

    Everything directly related to chapters in this post was already linked. We will add only a link on a very good series with various eclipse development tips .

    If you have a problem and can not find an answer, you can also ask questions on official freenode #eclipse IRC channel.

    To Be Continued

    Although we added only some new items into the menu so far, almost everything needed to finish the plugin is already there. If you do not insist on having the generated code formatted, you should be able to finish the generate toString feature just by browsing through java model hierarchy API.

    Next part of this tutorial will show how to finish both features, including the formatting of the generated code. It will also explain how to create and work with abstract syntax tree and how to create a dialog to communicate with user.

    Reference: Writing Eclipse Plugins Tutorial – Part 1 from our JCG partner Maria Jurcovicova at the This is Stuff blog.


    翻譯自: https://www.javacodegeeks.com/2012/05/writing-eclipse-plugins-tutorial-part-1.html

    總結

    以上是生活随笔為你收集整理的编写Eclipse插件教程–第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    zzijzzij日本成熟少妇 | 91免费观看| 亚洲人人爱 | 久草在线高清 | 香蕉久草 | 91九色国产蝌蚪 | 91在线影视 | 日韩在线播放av | 亚洲精品在线观看av | 可以免费看av | 国产.精品.日韩.另类.中文.在线.播放 | 在线免费亚洲 | 最新av网站在线观看 | 97视频资源 | 人人舔人人干 | 一区二区三区免费在线观看 | 久久精品4 | 亚洲精品欧洲精品 | 91九色网站 | 中文字幕亚洲精品日韩 | 91精品视频在线看 | 国产精品第一视频 | 日韩av黄 | 欧美激情第一区 | 欧美精品在线视频观看 | 久久激情小说 | 国产在线国偷精品产拍 | 国产综合小视频 | 天天综合网久久 | 91手机电影| 黄色软件在线看 | 精品国产乱码久久久久久天美 | 日日夜夜天天久久 | 欧美一区免费观看 | 日韩成人免费在线电影 | 午夜精品av在线 | 操高跟美女 | av天天澡天天爽天天av | 欧美成人理伦片 | 人人爽人人片 | 免费在线观看日韩欧美 | 日韩欧美在线免费观看 | 久久69精品久久久久久久电影好 | www色片| 亚洲欧美乱综合图片区小说区 | 视频在线播放国产 | 成人va视频 | 亚洲精品观看 | 天天弄天天干 | 美女视频一区 | 免费91在线 | 99视频久久 | 欧美一区二区在线免费看 | 五月激情姐姐 | 国产一区免费在线观看 | 久久综合九色欧美综合狠狠 | 欧美精品视| 亚洲一区久久久 | 亚洲专区欧美专区 | 精品国产免费观看 | 人人爱人人射 | 成人蜜桃视频 | 99爱视频在线观看 | 2022中文字幕在线观看 | 欧美激情第八页 | 99 色| 91人网站| 国产精品永久免费视频 | 国产精品久久久久久久av大片 | 一区二区观看 | 亚洲精品在线观看网站 | 成人网大片| 国产97色 | 久久字幕网 | av福利在线 | 免费在线观看成人av | 999久久久久久久久 69av视频在线观看 | 亚洲人成精品久久久久 | 探花视频在线版播放免费观看 | 国产高清中文字幕 | 在线免费观看涩涩 | 久久精品视频免费观看 | 国产精品久久久久久久久久久免费看 | 国产亚洲午夜高清国产拍精品 | www.色国产 | 国产专区免费 | 中文字幕不卡在线88 | 亚洲开心色 | 最新日韩在线观看视频 | 国产精品一区二区三区四 | 一级黄色在线视频 | 91.精品高清在线观看 | 午夜少妇一区二区三区 | 香蕉国产91 | 成人一级在线 | 天天操天天色天天射 | av大全在线 | 深爱激情综合 | 久久久久久毛片精品免费不卡 | 超碰人人乐 | 在线观看黄色av | 国产成人精品日本亚洲999 | 久久理伦片 | 91黄色影视 | 国产手机视频 | 激情图片qvod | 天天操天操 | 亚洲精品88欧美一区二区 | 欧美另类xxx | 狠狠躁夜夜躁人人爽超碰97香蕉 | 成人黄色av网站 | 久久免费看毛片 | 丁香激情网| 91av视频免费观看 | 免费在线观看成人 | 亚洲国产精品久久久久婷婷884 | 亚洲精品xxx | 成人免费xyz网站 | 亚洲综合国产精品 | 人人爽夜夜爽 | 国产日韩精品在线观看 | www.97视频| 成人福利在线播放 | 综合色爱| av888av.com | 在线观看精品视频 | 麻豆系列在线观看 | 国产成人精品一区二区三区免费 | 97国产精品视频 | 福利一区视频 | 亚洲黄电影 | 九九久久在线看 | 国产精品麻豆果冻传媒在线播放 | 亚洲 中文 在线 精品 | 黄色一级大片在线免费看产 | 亚洲人成网站精品片在线观看 | 在线播放日韩av | 特级毛片aaa| 国产精品久久久久久久久久新婚 | 永久黄网站色视频免费观看w | 99国产精品免费网站 | 久久精品专区 | 国产亚州av | 亚洲精选在线观看 | 久久久久国产免费免费 | 久久久免费看视频 | 在线视频一区观看 | 欧美成年黄网站色视频 | 日韩欧美精品在线观看视频 | 亚洲天天做| 99久久99精品| 一区二区三区免费播放 | 黄色三级免费 | av蜜桃在线 | 国产日韩高清在线 | 亚洲精品国产精品国产 | 狠狠地操 | 国产成人精品久久亚洲高清不卡 | 成人免费av电影 | 精品国产免费人成在线观看 | 欧美日韩在线观看不卡 | 国产精品麻豆果冻传媒在线播放 | 国产亚洲免费的视频看 | 97自拍超碰 | 欧美日韩视频在线观看免费 | 久久99这里只有精品 | 国产一区私人高清影院 | 精品一区二区三区电影 | 久久一级片 | 日韩在线视频精品 | 韩国av电影网 | 国产精品国产亚洲精品看不卡15 | 久草免费在线 | 色婷婷导航 | 亚洲国产欧洲综合997久久, | 国产精品视频永久免费播放 | 国产一区二区三区免费在线观看 | 在线看片一区 | 人人插人人射 | 最新久久免费视频 | 国产手机精品视频 | 在线观看一区视频 | 亚洲午夜不卡 | 国产精品一区二区无线 | 国产美女精品视频免费观看 | www.操.com| 亚洲日韩中文字幕在线播放 | 日韩免费一级电影 | 成人在线播放av | 亚洲狠狠婷婷综合久久久 | 欧美精品久久久久久久久老牛影院 | 欧美精品久久久久久久亚洲调教 | 99热这里只有精品免费 | 日韩欧美在线观看一区二区三区 | 精品一区二区免费视频 | 国产又粗又猛又爽又黄的视频免费 | 欧美成人在线免费 | 99精品亚洲| 这里只有精品视频在线 | 999色视频 | 成年人在线免费看片 | 6080yy精品一区二区三区 | 国产 欧美 日产久久 | av成年人电影 | 少妇bbb搡bbbb搡bbbb′ | 最新色站 | 天天色天天操天天爽 | 在线精品在线 | 欧美一区中文字幕 | 亚洲国产视频网站 | 中文字幕在线视频网站 | 天天色天天操天天爽 | 久久国际影院 | 91av视频在线观看免费 | 97免费在线观看视频 | 在线中文字幕网站 | 国产大片免费久久 | 在线日韩| 视频国产在线观看18 | 精品久久久久久久久久国产 | 日韩一级黄色片 | 国产精品乱码久久 | 欧美性直播| 亚洲人成影院在线 | 国产日本在线观看 | 国产精品96久久久久久吹潮 | 人人插人人插 | 国产福利精品在线观看 | 中国精品一区二区 | japanese黑人亚洲人4k | 精品国产乱码久久久久久天美 | 天天操天天操天天操天天 | 日韩视频一区二区 | 欧美成人精品三级在线观看播放 | 看片在线亚洲 | 少妇bbb搡bbbb搡bbbb| 欧美日韩国产二区 | 日韩精品在线视频免费观看 | 伊人激情综合 | 狠狠色噜噜狠狠 | 色婷婷狠狠五月综合天色拍 | 日日夜夜噜噜噜 | 日韩精品你懂的 | 日韩色视频在线观看 | 欧美超碰在线 | 精品国产伦一区二区三区观看说明 | 肉色欧美久久久久久久免费看 | 亚洲va综合va国产va中文 | 五月婷婷在线观看视频 | 在线观看视频亚洲 | 人人网av | 99久久综合国产精品二区 | 在线视频麻豆 | 韩国精品视频在线观看 | 一区二区三区日韩在线 | 麻豆影视网 | 精品国产成人在线 | 麻豆免费在线播放 | 91精品视频免费观看 | 91av色 | 91天堂影院 | 在线激情av电影 | 日韩va欧美va亚洲va久久 | 黄色一级免费网站 | 亚洲天天 | 在线综合色 | 青青草在久久免费久久免费 | 午夜精品久久久久久久99无限制 | 国产视频一区二区在线观看 | 亚洲精品一区二区18漫画 | www看片网站| 日本中文字幕影院 | 色婷婷精品大在线视频 | 天天曰夜夜爽 | 麻豆视频免费在线播放 | 国产精品视频你懂的 | 久久免费精品 | 在线观看中文字幕视频 | 久久国产精品精品国产色婷婷 | 欧美-第1页-屁屁影院 | 91精品国产99久久久久久红楼 | 亚洲欧美婷婷六月色综合 | 在线97| 日韩中文字幕免费视频 | 在线免费观看av网站 | 久亚洲精品 | 日韩精品一区二区三区不卡 | 亚洲免费在线播放视频 | 精品国产成人av | 日韩网| 91精品欧美| 99久久精品国 | 精品视频免费观看 | 久久不射电影院 | 国产原创av片 | 久久婷亚洲五月一区天天躁 | 日韩激情在线视频 | 人人艹视频 | 国产精品一区二区在线观看免费 | www.天堂av| 狠狠狠狠狠操 | 久久久久激情视频 | 免费一级日韩欧美性大片 | 人人网av| 国产精品手机播放 | 在线免费视频一区 | 中文字幕在线观看免费高清电影 | 在线视频电影 | 免费高清国产 | 狠狠黄 | 日韩精品久久久久久久电影竹菊 | 免费精品视频在线观看 | 超碰97中文 | 成人国产精品一区 | 成年性视频 | 国产精品成人免费一区久久羞羞 | 中文字幕av专区 | 亚洲最新av网站 | 国产成人福利在线观看 | 伊人婷婷色 | www.香蕉视频在线观看 | 色伊人网 | 日韩在线二区 | 97超碰免费在线观看 | 激情网婷婷 | 国产精品久久久久久久免费 | 韩国一区二区av | 91亚洲狠狠婷婷综合久久久 | 欧美日韩午夜爽爽 | 国产精品久久久久久久婷婷 | 国产手机视频精品 | 久久精品视频2 | 久久久久夜色 | 国内外成人免费在线视频 | 国产男男gay做爰 | 日韩欧美在线高清 | 色狠狠操 | 精品91久久久久 | 日韩在线观看你懂得 | 成人动漫一区二区三区 | 国产精品久久久久一区二区三区 | 三三级黄色片之日韩 | 超碰免费在线公开 | 日韩特级片 | 亚洲一区欧美激情 | 国产成人精品av在线 | 国产精品中文字幕在线 | 国产免费亚洲高清 | 午夜精品一区二区三区在线 | 黄色com | 免费中文字幕在线观看 | 亚洲 欧美 日韩 综合 | 99精品热视频 | 999国内精品永久免费视频 | 国产在线视频在线观看 | 国产精品久久一 | 欧美精品乱码久久久久久按摩 | 在线观看免费高清视频大全追剧 | 久久久久影视 | 91麻豆文化传媒在线观看 | 免费国产在线视频 | av中文字幕免费在线观看 | 久久久久久久久久久影视 | 精品国产伦一区二区三区观看说明 | 久99久精品视频免费观看 | 久久精品一二三区白丝高潮 | 欧美日韩在线视频一区二区 | 久久精品视频在线观看免费 | 国产精品女教师 | 国产精品黄色 | 国产高清成人 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 亚洲精品五月天 | 四虎www.| 人人狠狠综合久久亚洲婷 | 国产精品美女毛片真酒店 | 久久精品国产一区二区三区 | 五月婷婷伊人网 | 精品亚洲欧美无人区乱码 | 久草综合视频 | 麻豆久久一区二区 | 免费高清在线一区 | 一区二区视频播放 | 久久久久久高潮国产精品视 | 久久久免费播放 | 欧美地下肉体性派对 | 久久福利综合 | 久久免费av| 欧美日韩在线观看视频 | 国产香蕉久久精品综合网 | 免费久久99精品国产 | 亚洲美女免费精品视频在线观看 | 99精品国产一区二区三区麻豆 | 91av在线播放视频 | 久久久久久久国产精品 | 久久精品一区二区三区四区 | 欧美一级免费高清 | 国产视频网站在线观看 | 日韩欧美视频一区二区三区 | 欧美日韩中 | 91在线国内视频 | 一区二区三区在线免费观看视频 | 成人av在线影视 | 国产综合精品一区二区三区 | 天天草天天操 | 国产精品人人做人人爽人人添 | 成人在线免费av | 国产精品第一页在线观看 | 国产精品久久毛片 | 精品二区视频 | 欧美激情片在线观看 | 国产精品久久久久一区二区三区共 | 深夜免费福利 | 五月天综合网 | 天天摸天天操天天爽 | 久久久久久国产精品免费 | 亚洲国产网站 | 最新的av网站 | 日韩一级电影在线 | 亚洲午夜久久久久久久久 | 欧美日本国产在线观看 | 久久99亚洲精品久久 | 成人h在线观看 | 久久婷婷综合激情 | 日韩欧美在线中文字幕 | 国产精品自产拍在线观看桃花 | 色综合久久久久综合体桃花网 | 国产a免费 | 在线日韩视频 | 黄色特级片 | 日产乱码一二三区别免费 | 97电影手机 | 精品色999| 久久精品视频网站 | 中文字幕之中文字幕 | 一区二区在线电影 | 精品99免费视频 | 日韩欧美在线观看一区二区 | 久久观看| 免费观看视频黄 | 99在线播放 | 日韩精品一区二区三区三炮视频 | 97在线观看免费高清完整版在线观看 | 国产精品久久一卡二卡 | 成人观看 | 亚洲国产精品视频在线观看 | 色天天天 | www.天天色 | 国产精品亚洲综合久久 | 久久久久女教师免费一区 | 亚洲经典在线 | 中文字幕在线观看完整 | 麻豆91精品视频 | 欧美综合在线视频 | 国产精彩视频一区 | 免费高清国产 | 婷婷在线不卡 | 视频99爱| 日韩欧美视频免费在线观看 | 久久综合狠狠综合久久激情 | 玖玖玖影院 | 久久精品国产久精国产 | 中文在线免费一区三区 | 欧美日韩性视频 | 久草在线中文视频 | 国产精品毛片久久久久久 | 麻豆免费精品视频 | 碰超在线 | 久久久久久久久电影 | 国产精彩在线视频 | 精品亚洲视频在线观看 | 国产视频精选在线 | 欧美另类xxx | 99热精品免费观看 | 国产成人久久精品77777综合 | 黄色网大全 | 亚洲精品乱码白浆高清久久久久久 | 国产色久| 免费在线观看av片 | 伊人伊成久久人综合网站 | 亚洲涩涩网站 | 欧美一级片免费观看 | 特级西西444www大精品视频免费看 | 国产在线综合视频 | 亚洲精品久久久久中文字幕m男 | 在线小视频 | 黄色一级大片在线免费看产 | 久草在线视频资源 | 成人国产精品久久久 | 99色婷婷 | 国产免费大片 | aaa亚洲精品一二三区 | 日韩精品视频免费专区在线播放 | 丁香六月久久综合狠狠色 | 精品综合久久久 | 在线视频1卡二卡三卡 | 又黄又刺激视频 | 97成人精品区在线播放 | 久久久午夜影院 | 免费在线观看日韩欧美 | 人人爽人人干 | 九九九国产 | www.亚洲在线 | 久久久国产精品电影 | 国产精品久久久一区二区三区网站 | 91视频久久久 | 亚洲视频在线视频 | 国产在线精品区 | 青春草视频在线播放 | 色视频一区| 国产精品久久久久久久久久免费 | 免费性网站 | 欧美成人理伦片 | 欧美一级免费高清 | 精品国产亚洲一区二区麻豆 | 人人爽人人爽av | 久久婷婷色 | 亚洲一级黄色av | 日韩一区精品 | 亚洲色图激情文学 | 成年人免费在线 | 99电影456麻豆| 免费在线国产黄色 | 欧美国产日韩一区二区 | 天天爽夜夜爽人人爽一区二区 | 波多野结衣在线视频免费观看 | 午夜av免费在线观看 | 亚洲一二三区精品 | 一区二精品 | 日韩欧美视频一区二区三区 | 日韩在线影视 | 久久毛片高清国产 | 欧美久久久久久久久久 | 日本丰满少妇免费一区 | 精品国产网址 | 欧美aa一级 | 国产一区精品在线 | 欧美精品在线视频 | 亚洲精品一区二区在线观看 | 日韩精品视频在线观看免费 | 欧美性猛片, | av中文字幕免费在线观看 | 成人av电影免费在线观看 | 亚洲精品高清视频在线观看 | 国产精品一区二区精品视频免费看 | 色偷偷网站视频 | 91黄色免费网站 | 97国产情侣爱久久免费观看 | www.亚洲精品 | 高清不卡一区二区在线 | 免费精品视频在线 | 国产午夜剧场 | 国产精品一区二区免费视频 | 伊人五月 | 久久综合干| 91视频免费网站 | 黄色av成人在线 | 91福利国产在线观看 | 欧美激情综合五月色丁香 | 97网在线观看 | 日日色综合 | 国产成年免费视频 | 九九综合在线 | 日日爱视频 | 欧美va天堂在线电影 | 欧美国产不卡 | 国产五码一区 | 国内精品久久久久久久久久清纯 | 欧美日韩国产伦理 | 玖玖视频在线 | 久久国产精品网站 | 免费视频区 | 国产高清av免费在线观看 | 国产精品国产三级国产不产一地 | 成人av电影免费观看 | 久久国产精品一国产精品 | 欧美成人黄 | 日韩av中文字幕在线 | 九九精品视频在线看 | 日韩欧美高清免费 | 女人高潮特级毛片 | 亚洲黄色免费观看 | 91精选在线观看 | 国产精品18久久久久久久网站 | av在线电影网站 | 亚洲精品中文在线 | 超碰官网| 少妇av网 | av免费观看高清 | 亚洲精品视频国产 | 久久久999免费视频 日韩网站在线 | 欧美午夜寂寞影院 | 色在线视频网 | 免费在线观看日韩 | 色网站在线观看 | 黄色精品久久 | 亚洲高清视频在线观看免费 | 成人黄色电影在线播放 | 狠狠操狠狠插 | 99久久久国产精品美女 | 欧美巨乳波霸 | 久久伊99综合婷婷久久伊 | 看片网站黄 | 久久国产网站 | 免费看的黄色小视频 | 国产精品久久一区二区三区不卡 | 亚洲一区美女视频在线观看免费 | 一个色综合网站 | 成年人免费在线观看网站 | 国产一级二级视频 | 久久综合免费视频影院 | 日本成人中文字幕在线观看 | 三级av黄色 | 97在线免费视频 | 久久久国产99久久国产一 | 日韩 精品 一区 国产 麻豆 | 少妇18xxxx性xxxx片 | 国产永久免费观看 | 国产精品免费在线 | 亚洲一级片 | 天天看天天干天天操 | 日韩av成人在线观看 | 日日夜夜免费精品视频 | 久久免费福利视频 | 特级西西444www大精品视频免费看 | 国产九九在线 | 欧美日韩中文另类 | 欧美夫妻生活视频 | 久久99精品久久久久蜜臀 | 99久久激情| 丝袜av一区 | 在线观看中文字幕网站 | 最新不卡av | 超碰人人国产 | 久久久久久久久亚洲精品 | 国产精品久久久久久久久毛片 | 69av久久 | 一区二区三区高清在线 | 日本黄色a级大片 | 久久一区二区三区超碰国产精品 | 最近更新的中文字幕 | 久久草av | 国产一区二区三区高清播放 | 国产人免费人成免费视频 | 99精品在线免费 | 91麻豆精品国产91久久久无限制版 | 天天干天天干天天操 | 欧美激情视频一区二区三区免费 | 91av短视频 | 久久韩国免费视频 | 狠狠躁夜夜躁人人爽超碰91 | 深夜激情影院 | av片中文字幕 | 日韩在线观看三区 | 麻豆一精品传二传媒短视频 | 久久久久久久久久久久久久电影 | 国产又粗又猛又色又黄网站 | 婷婷国产在线观看 | 国产精品久久久久av福利动漫 | 中文字幕区 | 国产精品免费久久久 | 日韩女同一区二区三区在线观看 | 国产日韩在线视频 | 亚洲精品一区二区三区在线观看 | 国产精品白虎 | 中文字幕资源网 国产 | 欧美极度另类 | 波多野结衣精品 | 日韩免费av在线 | 国产精品福利在线观看 | 亚洲综合色激情五月 | 在线视频 你懂得 | 国产一级黄 | 国产精品第72页 | 日韩午夜视频在线观看 | 亚洲高清在线 | 久久综合狠狠综合久久综合88 | 欧美日韩不卡一区二区三区 | 欧美一级电影片 | 免费精品久久久 | 中文字幕一区二区在线播放 | 91精品国产91久久久久福利 | 九色91视频 | 人人爽人人片 | sesese图片 | 夜色资源网 | 欧美吞精| 欧美一进一出抽搐大尺度视频 | 99热官网 | 亚洲专区在线视频 | 久久人人爽人人爽人人片av软件 | 久久精品最新 | 香蕉久久国产 | 成人午夜在线电影 | 香蕉久久久久 | 亚洲国产午夜精品 | 日韩在线观看你懂的 | 久青草电影 | 天堂av网在线 | 精品福利视频在线 | 亚洲国产中文在线 | 在线观看中文av | 亚洲视频www | 日本中文字幕视频 | 久久国产经典视频 | 99在线播放 | 成 人 黄 色 视频免费播放 | 91探花视频 | 激情五月综合网 | 日三级在线| 欧美日韩视频免费看 | 夜夜躁狠狠燥 | 国内精品久久久精品电影院 | 中文字幕久久精品亚洲乱码 | 久久亚洲欧美日韩精品专区 | 国产精品 9999 | 日韩在线 一区二区 | 最近乱久中文字幕 | 四虎在线视频免费观看 | 私人av| 狠狠狠狠狠狠狠狠 | 中文字幕精品一区二区三区电影 | 91成人免费在线 | 久久只精品99品免费久23小说 | 黄色成人av网址 | 国产69精品久久99不卡的观看体验 | 激情久久伊人 | 91麻豆看国产在线紧急地址 | 91探花视频 | 国产精品成人久久久久 | 久久综合久久八八 | 超碰人人91 | 国产精品一区在线观看你懂的 | 成人国产电影在线观看 | 亚洲精品综合欧美二区变态 | 国产精品剧情在线亚洲 | 国产精品大片在线观看 | 久久久国产精品电影 | 日本成人中文字幕在线观看 | 色福利网站| 成人av电影在线 | 婷婷色中文字幕 | 精品国产一区二区三区日日嗨 | 九九爱免费视频在线观看 | 五月天综合婷婷 | 97精品视频在线 | 午夜性生活片 | 成人久久视频 | 亚洲在线免费视频 | 国产伦理一区 | 天堂av免费| 国产精品国产亚洲精品看不卡 | 夜夜躁狠狠躁日日躁视频黑人 | 国产精品一区一区三区 | 欧美日韩高清一区 | 高清av不卡 | 亚洲精品视频在线播放 | 国产永久免费 | 国产日本三级 | 国产999精品久久久久久 | 一区二区视频电影在线观看 | 免费成人av在线看 | 国产日韩欧美视频在线观看 | 99色网站 | 亚洲免费观看在线视频 | 欧美日韩不卡一区二区 | 国产精选在线 | 日韩一区二区免费视频 | 国产免费激情久久 | 亚洲黄污| 91九色在线视频 | 日韩网站在线看片你懂的 | 水蜜桃亚洲一二三四在线 | 久久精视频 | 久影院| 六月婷婷色 | 久久免费视屏 | www.com操| 成人va视频 | 久久久久久久久久电影 | 91福利小视频 | 免费看av在线 | 日本久久久久久 | 午夜丁香视频在线观看 | 国产系列精品av | 亚洲91中文字幕无线码三区 | 97在线视频免费观看 | 尤物九九久久国产精品的分类 | 不卡电影免费在线播放一区 | 久久www免费人成看片高清 | 国产69精品久久久久久久久久 | 欧美aaa视频 | 人人爽人人乐 | 最近中文字幕完整视频高清1 | 国产99一区二区 | 国产精品久久久久久一区二区 | 精品久久1| 久 久久影院 | 亚洲精品色 | 久久综合久久伊人 | 天天综合操 | 手机av资源| 亚洲三级毛片 | 欧美在线99 | 97精品国自产拍在线观看 | 午夜10000 | 欧美精品中文在线免费观看 | 天天夜夜狠狠操 | 亚洲国产日韩精品 | 日韩伦理片一区二区三区 | 狠狠地日| 99人久久精品视频最新地址 | 97视频在线播放 | 国产色妞影院wwwxxx | 97电影院网 | 九九精品毛片 | 在线观看aaa| 伊人伊成久久人综合网小说 | 西西人体www444 | 狠狠狠的干 | www黄色com| 在线观看不卡视频 | 国产免费久久 | 九九精品在线观看 | 天天操天天插 | 成人精品一区二区三区电影免费 | 久久噜噜少妇网站 | 亚洲综合在线视频 | 成年人黄色大片在线 | 精品一区二区三区久久久 | 九九热视频在线 | 国产精品久久久久久高潮 | 日本黄色免费看 | 五月天中文字幕mv在线 | 国产午夜一级毛片 | 涩涩伊人 | 99理论片| 亚洲人视频在线 | 偷拍精偷拍精品欧洲亚洲网站 | 色噜噜噜 | 色综合网在线 | 国产成人综合在线观看 | 国产天天综合 | 亚州av免费 | 免费网站在线观看人 | 欧美一级艳片视频免费观看 | 婷婷丁香社区 | 丁香网婷婷 | 国产色在线视频 | 超碰97国产精品人人cao | 夜夜爽天天爽 | 色婷婷在线视频 | 欧美乱淫视频 | 久久精品www人人爽人人 | 国产精品v欧美精品v日韩 | 久久精品人 | 免费看的视频 | 操碰av| 91中文字幕一区 | 国产亚洲欧美在线视频 | 亚洲区视频在线观看 | 国产高清视频免费在线观看 | 一级黄色片毛片 | av黄免费看| 国产精品一区二区av麻豆 | 黄色日本免费 | 亚洲视频99| 97国产在线播放 | 色综合 久久精品 | 久久精品视频播放 | 成人av高清在线 | 五月天色婷婷丁香 | 婷婷精品国产一区二区三区日韩 | 天天玩天天操天天射 | 日韩区欧美久久久无人区 | 96视频免费在线观看 | 99国内精品 | 国产精品女同一区二区三区久久夜 | 国产精品18p | 久久精品女人毛片国产 | 亚洲精品h | 国产视频久久久久 | 国产精品毛片一区二区在线 | 福利视频导航网址 | 久久久久国产精品免费网站 | 日韩成片 | 国产日韩欧美网站 | 波多野结衣在线视频免费观看 | 国产福利不卡视频 | 又黄又爽又色无遮挡免费 | av成人免费在线看 | 日韩免费一区二区 | 久久深夜 | 亚洲国产精品影院 | 天天草综合网 | 久久电影国产免费久久电影 | 日韩xxxbbb | 日韩欧美综合在线视频 | 久久美女高清视频 | 97电影在线 | 丝袜一区在线 | 国产成人亚洲在线观看 | 日日操夜 | 日b视频在线观看网址 | 日韩精品不卡在线 | 成年人免费在线 | 一本一道久久a久久综合蜜桃 | 中文字幕免费一区二区 | 国产精品一区二区三区在线看 | 中文字幕一区二区三区乱码在线 | 五月天天色 | 免费看一及片 | 日韩婷婷 | 久久久久久久久久久久久9999 | 亚洲高清免费在线 | 夜夜狠狠| 91在线你懂的 | 欧美国产日韩一区 | 国产午夜三级一区二区三 | www.久久久| 精品久久久久亚洲 | 奇米777777| 免费黄av| 国产精品12345| 国产一级黄色片免费看 | 91精品啪在线观看国产 | 日韩精品久久久久久久电影99爱 | 91精品免费看| 国产亚洲婷婷免费 | 中文字幕在线日 | 麻豆视频国产精品 | 国产中文字幕国产 | 99re国产| 国产精品免费久久久久 | 96亚洲精品久久久蜜桃 | 亚洲精品视频偷拍 | 色午夜 | 日韩欧三级 | 天天婷婷 | 亚洲91精品在线观看 | 精品久久久久国产免费第一页 | 亚洲污视频 | 麻豆久久一区二区 | 日韩高清网站 | 欧美日本三级 | 婷婷综合亚洲 | 国产婷婷一区二区 | 91精品视屏 | 国产福利av在线 | 久久精品一区二区三区四区 | 91精品国产自产老师啪 | 狠狠操电影网 | 欧美一区三区四区 | 91天堂在线观看 | 欧美一级免费在线 | 九九热1| 久久婷婷亚洲 | 正在播放日韩 | 日本aaa在线观看 | 国产成人一级 | 精品a视频 | 婷婷丁香激情五月 | www.操.com| 欧美另类v | 精品国产一区二区三区久久久 | 播五月婷婷 | 欧美日本啪啪无遮挡网站 | 久久公开免费视频 | 嫩草91影院| 国产精品视频地址 | 日韩精品中字 | 欧美日韩视频网站 | 午夜成人免费影院 | 免费在线观看黄网站 | 99久久精品一区二区成人 | 一性一交视频 | 人成在线免费视频 | 久草香蕉在线 | 久久亚洲私人国产精品 | 久久在现视频 | 一区二区成人国产精品 | 99久久精品免费一区 | 中文在线8新资源库 | 超碰国产在线播放 | 日韩欧美在线免费 | 黄色一级大片免费看 | 日韩精品1区2区 | 在线小视频 | 人人盈棋牌 | 91精品国产乱码久久 | 国产v欧美 | 亚洲一区 av | 久久久免费看片 | 又黄又爽的视频在线观看网站 | 91视频一8mav | 精品久久久久久一区二区里番 | 国语自产偷拍精品视频偷 | 色天天综合久久久久综合片 |