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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Eclipse 插件开发 —— 深入理解查找(Search)功能及其扩展点

發布時間:2023/12/13 综合教程 42 生活家
生活随笔 收集整理的這篇文章主要介紹了 Eclipse 插件开发 —— 深入理解查找(Search)功能及其扩展点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引言

查找功能是計算機語言開發環境 / 平臺的一個非常重要的特性。Eclipse 也不例外,它提供了豐富的查找功能(用戶可以輸入正則表達式或任意字符串,指定查找范圍和匹配選項等等),并且提供了簡單易用的接口方便開發人員擴展。Eclipse 的查找功能是基于 MVC 設計模式架構的,因此如果讀者先前對 MVC 模式了解的話,有助于讀者理解 Eclipse 的查找框架。在 Eclipse 的開發平臺中,通過快捷鍵 CTRL+H 或者 Search 菜單可以激活其查找功能,如圖 1 為 Eclipse3.4 插件開發版本按下快捷鍵時彈出的查找對話框(Search Dialog)。

圖 1. Eclipse3.4 版本的查找對話框

如圖 2 為 IBM RSA7.5.2 版本按下快捷鍵時彈出的查找對話框,提供了多大八種查找功能。


圖 2. IBM RSA7.5.2 版本的查找對話框

總體而言,Eclipse 中的查找功能由三部分組成:查找對話框、查找頁面和查找結果集視圖;下面分別就這三部分進行具體描述。

查找對話框是 Eclipse 查找功能的入口,Eclipse 中所有的查找功能都可以在該對話框中找到,如圖 1 和圖 2 顯示了 Eclipse 和 IBM RSA 中的查找對話框。查找對話框中包含了當前 Eclipse 開發平臺提供的所有查找頁面,如果用戶頁面覺得頁面太多,可以通過“Customize …”按鈕定制,只顯示使用頻率較高的查找頁面,隱藏其它頁面。雖然我們不能對這些頁面排序,然而,Eclipse 提供了相應的擴展點(Extension point)讓開發人員定制其查找頁面的位置(通過 tabPosition 屬性可以指定,下一節會進行詳細介紹)。

查找頁面是查找功能的入口,提供了查找模式和條件等內容的輸入界面 GUI。在 Eclipse 中,為了保持查找功能的一致性,當我們的插件需要提供查找功能,通常會為其創建一個查找頁面,并放在查找對話框里面。每一個查找功能對應有一個查找頁面,用于接收用戶進行查找的內容,范圍等輸入條件。如圖 3 為 Clear Case 插件的查找頁面。


圖 3. Eclipse 中 ClearCase 的查找頁面

作為一個完整的查找框架,還需要提供一個顯示查找到結果集的界面。在 Eclipse 中,這個界面叫做查找結果集視圖,它提供了豐富的工具欄和菜單,諸如上 / 下一個匹配項、重新查找、展開和收縮結果集等操作,并且可以根據查找結果的類型用相應的編輯器打開。Eclipse 中,所有的查找功能共用一個視圖,該視圖提供兩種顯示方式:表格(TableViewer)和樹狀結構(TreeViewer)。查找結果視圖的標題為“Search”,如圖 4 所示為作者使用 Eclipse 自帶的文件查找搜索“*”的結果集視圖。


圖 4. Eclipse 中顯示查找結果的視圖

Eclipse 查找功能的擴展點

由上一節我們可知,Eclipse 的查找功能主要是由三部分組成:查找對話框、查找頁面和查找結果集視圖,至此,我們對 Eclipse 的查找功能有了感觀的認識,本小節將從 Eclipse 提供的擴展點,函數,接口和類等方面詳細說明 Eclipse 的查找功能。

查找對話框 / 查找頁面的擴展點

如果我們想要插入一個查找頁面到查找對話框中,那么需要添加擴展點 org.eclipse.search. searchPages。

該擴展點允許其他插件為特定的查找功能注冊屬于自己的查找頁面。下面說明需要注意的擴展點的一些屬性:

id – 查找頁面的唯一標志。
label – 顯示在查找對話框中頁面的標題。
class –創建查找頁面顯示的 control 的類,該類通常繼承抽象類 org.eclipse. jface.dialogs. DialogPage,并且實現接口 org.eclipse.search.ui. ISearchPage。
sizeHint – 暗示該查找頁面激活時的大小,其輸入格式為"width, height", 如"50, 60"。
tabPosition – 整形數字,表示該查找頁面在查找對話框中顯示的位置,查找對話框中包含一個 TabFolder,TabFolder 包含了若干個頁面,如果該元素沒有指定,那么 Eclipse 將按照這些頁面標題的字母順序進行排列。數字越小,其對應的頁面越靠前。
enabled – 如果該屬性沒有指定或者為 false,那么當用戶通過 CTRL+H,或者 search 菜單激活查找對話框時,該頁面不會自動顯示,用戶可以通過“Customize” 按鈕手動顯示該頁面。
canSearchEnclosingProjects 和 showScopeSection – 如果這兩個屬性都設置為 true,那么 Eclipse 會自動添加一個 Scope 到你的查找頁面的最下面,如圖 5 所示為 File 查找的 Scope 域,不需要用戶單獨創建該區域。


圖 5. 文件查找頁面的 Scope 區域

為了更好地說明如何使用該擴展點,舉一個例子說明,如下為 org.eclipse.search 插件中的文件查找頁面實現的擴展點代碼,位于 plugin.xml 文件中。

 <extension point="org.eclipse.search.searchPages"> 
    <page 
        id="org.eclipse.search.internal.ui.text.TextSearchPage"
    label="%fileSearch"
    icon="$nl$/icons/full/elcl16/tsearch_obj.gif"
    sizeHint="250,160"
    tabPosition="1"
    extensions="*:1"
    showScopeSection="true"        
    canSearchEnclosingProjects="true"
    class="org.eclipse.search.internal.ui.text.TextSearchPage"> 
 </page> 
 </extension> 

查找結果視圖(Search Result View)的擴展點

對 org.eclipse.search.searchPages 擴展后,當我們按下查找(Search)按鈕后,Eclipse 的查找框架會激活查找結果集視圖,那么如何讓我們自己設計的界面顯示在查找結果集視圖中呢?答案很明顯,通過添加 org.eclipse.search.seacrhResultViewPages 擴展點,填充相應的擴展點屬性,便可以激活我們自己設計的界面,并用該界面顯示查找到的匹配結果集。下面講解擴展點 seacrhResultViewPages 中比較重要的一些屬性。

searchResultClass – 用于表示查找結果集的類,需要實現接口 ISearchResult,由于實現該接口需要實現較多的方法,因此 Eclipse 提供了一個抽象類,用于表示文本查找的結果集,該抽象類(類名為 AbstractTextSearchResult)實現了 ISearchResult 的大部分接口,如果我們實現的查找功能是文本查找,那么就可以繼承該類,同時實現少量的方法即可,該類需要和類 AbstractTextSearchViewPage 同時使用
class - 用于顯示查找結果的頁面類,需要實現接口 org.eclipse.search.ui. ISearchResultPage,由于實現該接口需要實現較多的方法,因此 Eclipse 提供一個抽象類(類名為 AbstractTextSearchViewPage)實現了該接口,該類主要用于顯示文本查找的結果集。如果我們實現的查找功能是文本查找,那么只需繼承該類并實現少量的方法即可。AbstractTextSearchViewPage 和 AbstractTextSearchResult 通常一起使用,當然還需要用到 Match 類和 MatchEvent 等類,下小節將會詳細說明。

為了更好地說明如何使用該擴展點,舉一個例子說明,如下為 org.eclipse.search 插件中的文件查找結果集視圖實現的擴展點代碼,位于 plugin.xml 文件中。

 <extension 
    id="FileSearchPage"
    point="org.eclipse.search.searchResultViewPages"> 
    <viewPage 
    id="org.eclipse.search.text.FileSearchResultPage"
 searchResultClass="org.eclipse.search.internal.ui.text.FileSearchResult"
    helpContextId="org.eclipse.search.file_search_result_page"
    class="org.eclipse.search.internal.ui.text.FileSearchPage"> 
 </viewPage> 
 </extension> 

Eclipse 主菜單的查找(Search)菜單中加入你的菜單項

對一些重要的查找功能,我們希望提供多種途徑激活這些功能。如添加一個菜單項到查找(Search)主菜單中,如圖 6 所示為文件查找的菜單項。


圖 6. Eclipse 自帶文件查找的菜單

那么如何添加我們自己的菜單項到 Eclipse 的查找主菜單中呢?答案是:添加 org.eclipse.ui. actionSets 擴展點,然后創建一個 action, 并且 action 的 menuBarPath 設置為 org.eclipse.search. menu/dialogGroup。

為了更好地說明如何使用該擴展點,舉一個例子說明,如下為創建一個”Am Search …”菜單項到 Search 主菜單中實現的擴展點代碼,位于 plugin.xml 文件中。

 <extension 
   point="org.eclipse.ui.actionSets"> 
   <actionSet 
         id="org.eclipse.am.ui.workbenchActionSet"
         label="%actionSet.am.label"
         visible="true"> 
         <action 
            class="org.eclipse.am.ui.handlers.ESearchHandler"
            definitionId=" org.eclipse.am.ui.commands.ESearch"
            icon="icons/Search.gif"
            id=" org.eclipse.am.ui.commands.BGSearch"
            label="AM Search …"
            menubarPath="org.eclipse.search.menu/dialogGroup"
           > 
         </action> 
      </actionSet> 
 </extension> 

相關的函數、接口和類

對查找結果集排序

通常我們以表格(TableViewer)和樹狀結構(TreeViewer)顯示匹配的結果集,因此,自然涉及到對結果集排序的問題。在 Eclipse3.0 版本之前,如果需要對查找結果集視圖中的 TableViewer 或 TreeViewer 進行排序,則需要使用擴展點 org.eclipse.search.searchResultSorters。但是,3.0 以后的版本不需要添加該擴展點,可以直接寫代碼對 TableViewer 或 TreeViewer 排序,只需繼承 org.eclipse.jface.viewers.ViewerSorter。下面給出了一個簡單的排序類代碼。如果想讓下面代碼工作,則需要設置該類為 TableViewer 的 Sorter,通過調用函數 setSorter 方法實現。

 public class ESearchResultSorter  extends ViewerSorter { 
        
        private int columnIndex = -1        
        private int dir = SWT.DOWN; 
       
        public BGSearchResultSorter(int columnIndex, int dir) { 
            super(); 
            this. columnIndex = columnIndex; 
            this.dir = dir; 
        } 
        public int compare(Viewer viewer, Object e1, Object e2) { 
            int returnValue = 0; 
             If(0 == columnIndex){ 
            returnValue = StringUtil.getCollator().compare(e1,e2); 
          } 
            if (this.dir == SWT.DOWN) { 
                returnValue = returnValue * -1; 
            } 
            return returnValue; 
        }        
 } 

Match 和 SearchResultEvent 類

Eclipse 針對文本查找,除了提供前面講到的 AbstractTextSearchViewPage 和 AbstractTextSearchResult 類外,還提供了配套的類 Match,MatchEvent 和 RemoveAllEvent(均繼承類 SearchResultEvent),從而實現文本查找功能。如果我們也需要開發基于文本查找的功能,那么完全可以繼承或使用這些類,否則,為了與 Eclipse 的查找框架保持一致和加強我們插件的可擴展性,建議大家也創建類似的類,并實現相應的功能。下面分別就這些類進行說明。

1. org.eclipse.search.ui.text.Match 類

該類用于表示查找過程中匹配的對象,是 Eclipse 為文本查找定義的 Match 類,該類包含匹配的元素(文件或資源等等),查找字符串在該元素中的起始偏移量(offset)和匹配長度,如果我們的查找功能是基于文本的,那么可以繼承該類,否則,我們可以自己定義 Match 類(不用繼承該類)。

2. org.eclipse.search.ui.SearchResultEvent 類

該類保存了提供給事件(Event)接收者需要的對象,例如,如果該事件為增加一個 Match 類對象,那么通過這個事件可以獲取該對象。基于文本查找的兩個時間 MatchEvent 和 RemoveAllEvent 均繼承該類,其中 MatchEvent 類用于增加或刪除 Match 對象,RemoveAllEvent 為刪除所有 Match 對象。

因此,我們在開發查找功能時需要繼承該類 SearchResultEvent,提供我們的查找功能與該事件相關的對象,由 org.eclipse.search.ui.ISearchResult 激活該事件。一般而言,繼承類會提供事件的類型(如增加,刪除匹配項等),匹配的結果集(如包含 Match 的集合(Collection)),可以參考 MatchEvent 和 RemoveAllEvent 類。

3. org.eclipse.search.ui.ISearchResult 接口

該接口用于表示查找結果集。前面講到的 org.eclipse.search.searchPages 擴展點的屬性 searchResultClass 對應的類需要實現該接口。Eclipse 提供的表示文本查找結果集的抽象類 org.eclipse.search.ui.text.AbstractTextSearchResult 實現了該接口。如果我們實現基于文本查找的功能,那么可以繼承該類,實現少量的方法即可。一般而言,在實現該接口的繼承類中會描述匹配結果集的結構,例如,包括了 Match 集合和 org.eclipse.search.ui.ISearchResultListener(下面將會講到)集合等。

4. org.eclipse.search.ui.ISearchResultListener 接口

該接口表示查找結果集發生變化的事件接口。當結果集發生變化時,通知事件監聽者(這里為查找結果集視圖)作出相應的行為。該接口中提供了一個方法 searchResultChanged,其參數為 SearchResultEvent。

就實現而言,我們可以讓查找結果集視圖實現該接口,并調用模型(Model,我們這里表現為 ISearchResult)中的方法注冊 / 注銷該事件(繼承方式),另外,我們也可以在查找結果集視圖的構造函數中定義匿名類,實現該接口中的方法,同時調用模型中的方法注冊 / 注銷該匿名類事件(組合方式)。從大部分的實現方法來看,我們會使用后者(組合方式),因為該接口中只有一個方法,并且使用匿名類也更加靈活。Eclipse 針對文本查找的結果集視圖抽象類 org.eclipse.search.ui.text.AbstractTextSearchViewPage 也是采用匿名類的方式。

5. org.eclipse.search.ui.NewSearchUI 類

該類提供了訪問 Eclipse 查找 GUI 的入口方法,它采用 Facade 設計模式。下面就該類中的一些重要函數進行說明。

調用下面這個方法表示在當前的 Page 里激活查找結果集視圖(search result view)。

     activateSearchResultView() 

調用下面這個方法表示發送‘ cancel ’命令到后臺運行的 query。

	 cancelQuery(ISearchQuery query) 

調用下面這個方法表示獲取當前的查找結果集視圖。

	 getSearchResultView() 

調用下面這個方法表示打開查找對話框,并激活由 pageId 指定的查找頁。

	 openSearchDialog(IWorkbenchWindow window, String pageId) 

調用下面這些方法表示運行指定的 query,可以在前臺或者后臺運行,此時 Eclipse 會啟動一個 job 運行。

 runQueryInBackground(ISearchQuery query) 
 runQueryInBackground(ISearchQuery query, ISearchResultViewPart view) 
 runQueryInForeground(IRunnableContext context, ISearchQuery query) 
 runQueryInForeground(IRunnableContext context, ISearchQuery query, 
                                        ISearchResultViewPart view) 

編程實踐

通過前兩節的講述,相信大家對 Eclipse 的查找框架已經很清楚了,下面將給出一個例子說明如何使用這些擴展點,如何實現接口和繼承類,如何讓我們的查找功能在 Eclipse 的查找框架下工作。

首先,如圖 7 給出了 Eclipse 查找框架的流程,本文將按照這個流程圖中的步驟及其各個步驟涉及到的方法,接口和類,給出它們的代碼框架,讀者想要讓其運行,必須實現相應的方法,接口和類。


圖 7. Eclipse 查找框架的流程

開始階段(彈出查找對話框)

當用戶按下 Ctrl + H 鍵,或者通過 Eclipse 的 Search 菜單選擇相應的查找項(如果我們定義了自己的 Action 在 Search 菜單中),Eclipse 將會彈出查找對話框。

如果只需要 Crtl+H 激活查找對話框,那么添加 searchPages 擴展點,并填寫相應的屬性,而不需要其他額外的代碼,在查找對話框中就會有我們的查找頁(還記得前面講的 searchPages 擴展點的 enable 屬性嗎,如果該屬性設為 true,那么擴展的查找頁將會出現在對話框中,否則將被隱藏,需要通過“Customize …”按鈕激活)。

如果需要在 search 菜單中定義自己的菜單,那么首先添加 actionSets 擴展點,如下所示。

 <extension 
      point="org.eclipse.ui.actionSets"> 
      <actionSet 
         id="com.ibm.bg.ui.workbenchActionSet"
         label="Example"
         visible="true"> 
         <action 
            class="com.ibm.bg.ui.handlers.ESearchHandler"
            definitionId="com.ibm.bg.ui.commands.ESearch"
            icon="icons/lookup_criteria.gif"
            id="com.ibm.bg.ui.commands.ESearch"
            label="E Search"
            menubarPath="org.eclipse.search.menu/dialogGroup"
           > 
        </action> 
      </actionSet> 
 </extension> 

然后再事件處理中通過 NewSearchUI 提供的 openSearchDialog 函數打開對話框,此時需要提供查找頁的 ID,這里我們定義為 ESearchPage,后面將會講到。

 public class ESearchHandler implements IWorkbenchWindowActionDelegate { 
    private IWorkbenchWindow fWindow; 
    public void init(IWorkbenchWindow window) { 
        fWindow = window; 
    } 
    public void run(IAction action) { 
        if (fWindow == null || fWindow.getActivePage() == null) { 
            Activator.beep(); 
            return; 
        } 
        NewSearchUI.openSearchDialog(fWindow, ESearchPage.ID); 
    } 
 } 

用戶輸入(查找頁面)

所有查找功能的輸入都是在查找頁面進行的,因此,我們需要使用 searchPages 擴展點,提供自己的查找頁面,從而在該頁面內定制我們的 GUI(如何擺放 Widget,如何布局等等)。以下是擴展點的實現。

 <extension 
      point="org.eclipse.search.searchPages"> 
      <page 
         class="org.eclipse.book.example.pages.ESearchPage"
         enabled="true"
         id="org.eclipse.book.example.pages.ESearchPage"
         label="Search Example"> 
 </page> 
 </extension> 

下面分析 ESearchPage 的代碼,該類繼承 DialogPage,并且實現 ISearchPage 接口。該類中,我們需要重載 createControl 方法,用于創建 Widgets,布局我們的查找頁面。通常,我們需要把當前用戶的輸入和選擇保存到 DialogSetting 中,如果查找頁面需要輸入文本,那么我們可以定制歷史輸入的個數,該值通常為 20(Eclipse 文件查找)。需要注意:在 createControl 方法中,我們必須調用方法 setControl 來設置查找頁面的上層控件,否則的話,查找頁面會創建失敗(后面會給出失敗的原因)。下面給出了該類的一些關鍵代碼為參考之用。

 public class ESearchPage extends DialogPage implements ISearchPage { 

    private ISearchPageContainer fContainer; 
    // 定義頁面需要的 control 

    public ESearchPage() { 
            } 

    @Override 
    public void createControl(Composite parent) { 
        // 創建顯示在查找頁面的 control 
        ……
        setControl(parent); 
        ……
    } 
    public boolean performAction() { 
        NewSearchUI.activateSearchResultView(); 
        NewSearchUI.runQueryInBackground(getSearchQuery()); 
        return true; 
    } 
    public ISearchQuery getSearchQuery() { 
        return new ESearchQuery(this.fPattern.getText().trim()); 
    } 
    protected ISearchPageContainer getContainer() { 
        return this.fContainer; 
    } 
    public void setContainer(ISearchPageContainer container) { 
        this.fContainer = container; 
    } 
 } 

前面講到,如果不在 createControl 方法中調用 Setting 方法,那么查找頁面的 widgets 將會創建失敗,為什么呢?如果你單步跟蹤調試,會發現類 org.eclipse.search.internal.ui.SearchDialog 中包含調用我們創建的查找頁面代碼,如下所示,從代碼中可以看出,如果沒有調用 setControl 方法,那么 page.getControl() 將返回 Null 值,故創建失敗,Eclipse 將提示“The creation of the page '…' failed.”錯誤信息。

 private Control createPageControl(Composite parent, 
                           final SearchPageDescriptor descriptor) { 
    ……
    ISearchPage page= descriptor.getPage(); 
    if (page == null || page.getControl() == null) { 
        Composite container= new Composite(parent, SWT.NONE); 
        Label label= new Label(container, SWT.WRAP); 
        label.setText(Messages.format(SearchMessages. 
 SearchDialog_error_pageCreationFailed, descriptor.getLabel())); 
            container.setLayout(new GridLayout()); 
            label.setLayoutData(new GridData()); 
        return container; 
    } 
 } 

查找入口(啟動 Job)

當我們點擊查找對話框中“Search”按鈕,這時候會調用 ESearchPage 類中的 performAction() 方法。該方法將啟動 Job 執行 Query(實現了 ISearchQuery 的類),我們可以選擇在前臺還是后臺運行(具體方法,可以參考上一節中 NewSearchUI 提供的靜態方法)。一般而言,performAction 方法首先調用函數 activateSearchResultView() 激活查找結果視圖,然后調用函數 runQueryInBackground() 運行指定的 Query。

上面講到,在運行 Query 之前,通常會調用方法 NewSearchUI.activateSearchResultView() 激活查找結果視圖(需要使用 searchResultPages 擴展點),此時僅僅是當前查找功能的結果集界面顯示。查找結果視圖繼承 Page 類,并實現 ISearchResultPage 接口,下面分析該類中的一些關鍵代碼。通常我們會在構造函數中定義 ISearchResultListener,并提供相應的監聽方法。在 setInput 方法中,需要根據當前顯示在查找結果視圖中的匹配結果集合和新的匹配結果集合狀態和值,注冊或注銷該事件。所有的匹配結果集合均通過調用查找結果集視圖中 TableViewer 的內容提供者(Content Provider)逐個插入到 TableViewer 中。getLabel() 用于顯示在 TableViewer/TreeViewer 上面的一個 label 的內容,通常用于顯示查找到多少個匹配項。下面給出了部分關鍵代碼,讀者可以參考 AbstractTextSearchViewPage 類中的一些實現。

 public class ESearchResultPage extends Page implements ISearchResultPage{ 
    private TableViewer fTableViewer; 
    protected ESearchResult fInput; 
    protected ISearchResultViewPart fViewPart; 
    protected ISearchResultListener fListener; 
    protected String fId; 
    public ESearchResultPage() { 
        this.fListener = new ISearchResultListener() { 
            public void searchResultChanged(SearchResultEvent e) { 
                ESearchResultPage.this.handleSearchResultChanged(e); 
            } 
        }; 
    } 
    public void createControl(Composite parent) { 
        } 
    public String getLabel() { 
        ESearchResult result = getInput(); 
        if (result == null) 
            return ""; 
        return result.getLabel(); 
    } 
    public void setInput(ISearchResult search, Object uiState) { 
        ISearchResult oldSearch = (ISearchResult) this.fTableViewer.getInput(); 
        this.fTableViewer.setInput(null); 
        if (oldSearch != null) { 
            oldSearch.removeListener(this.fListener); 
        } 
        this.fInput = ((ESearchResult) search);        
        if ( fInput != null && fInput.getElements().size() > 0) { 
            search.addListener(this.fListener); 
            this.fTableViewer.setInput(search); 
            if (uiState instanceof ISelection) 
                this.fTableViewer.setSelection((ISelection) uiState, true); 
        } 

    } 

查找(執行 Query)

當調用 runQueryInBackground 或 runQueryInForeground 方法之后,Eclipse 查找框架會啟動一個 Job 運行我們定義的 Query,該類是 Eclipse 查找框架中最主要的一個類之一,它定義了如何進行查找,同時把查找匹配項添加到 ISearchResult,并且以友好的用戶體驗方式即 progressMonitor 顯示目前查找的進度。該類提供了很多方法,例如,是否可以重新運行,是否可以在后臺運行及顯示進度的對話框的標題等等,下面給出類 ESearchQuery 的部分關鍵代碼的實現。

 public class ESearchQuery implements ISearchQuery { 
    ESearchResult fSearchResult; 
    String fPattern; 

    public ESearchQuery(String pattern) { 
        this.fPattern = pattern; 
        this.fSearchResult = ESearchResult.createInstance(this); 
    } 
    public boolean canRerun() { 
        return true; 
    } 
    public boolean canRunInBackground() { 
        return true; 
    } 

    public String getLabel() { 
            return "Example Search"; 
    } 
    public ISearchResult getSearchResult() { 
        return fSearchResult; 
    } 
    public IStatus run(IProgressMonitor monitor) 
            throws OperationCanceledException { 
        try{ 
            // 表明查找開始
            monitor.beginTask(taskname, totalCount); 
        // 在指定的范圍逐個查找結果集,如果找到,添加到 ISearchResult 
        // 其流程大致如下
        For( … ){ 
            找到匹配項
            構造一個 Match 
            調用 ISearchResult 的函數添加該 Match 
            Monitor.work(1) 
        } 
        } catch (RuntimeException e) { 

        } finally { 
            if (monitor != null) 
                monitor.done(); 
        } 
    } 
 } 

從上面的描述可知,在類 ESearchQuery 會調用 ESearchResult 類中的方法添加查找的匹配項,接下來將講解查找結果類 ESearchResult。

EsearchResult 類實現 ISearchResult 接口,用于保存查找到的匹配項。該類除了要實現最重要的兩個方法,添加和刪除 ISearchResultListener 方法外,同時需要定義添加匹配的結果集,刪除結果集等方法。下面給出該類中的一些關鍵代碼,其中添加匹配的結果集的方法 addMatch,添加傳入的匹配項到匹配結果集合中,同時通知 ISearchResultListener 事件的監聽者。

 public class ESearchResult implements ISearchResult { 
    protected List<EMatch> elements; 
     ……
    public void addMatch(Match match) { 
        boolean hasAdded= false; 
        synchronized (elements) { 
            hasAdded= doAddMatch(match); 
        } 
        if (hasAdded) 
            fireSearchResultEvent(ESearchResultEvent.ADDED, match) 
    } 
    protected void fireSearchResultEvent(ESearchEventType eventType, 
            EMatch match) { 
        ESearchResultEvent event = new ESearchResultEvent(this, eventType); 
        event.setMatche(match); 

        for (Iterator<ISearchResultListener> e = this.searchResultsListeners 
                .iterator(); e.hasNext();) { 
            ISearchResultListener listener = (ISearchResultListener) e.next(); 
            listener.searchResultChanged(event); 
        } 
    } 

上面講到 ESearchResult 類包含了匹配項的集合,一般我們會定義一個用于保存匹配對象的類,如 Eclipse 中為文本查找的匹配項提供了 Match 類,該類定義了匹配項的偏移量,長度,匹配的對象等等,如果我們的匹配項具有這些特征,那么可以繼承該類,否則新建一個 Match 類即可。下面是一個簡單的匹配類的實現 EMatch 類。

 public class EMatch { 
    EDataObject fMatchElement; 
    
    public String getName(){ 
        return fMatchElement.getName(); 
    } 

    public EMatch(EDataObject matchElement) { 
        fMatchElement = matchElement; 
    } 

 } 

同時,在查找到匹配項,需要通知事件的監聽者當前事件的類型(通常有三種:增加了匹配項,刪除匹配項和清空匹配項),Eclipse 查找框架提供了 SearchResultEvent 基類,文本查找定義了兩個類:MatchEvent(包含增加和刪除匹配項類型事件),RemoveAllEvent(清空匹配項事件)。通常在我們開始查找之前,發送清空匹配項類型事件,讓查找結果集視圖清空上一次的匹配項,然后再查找的過程,如果查找到匹配項,則發送增加匹配項事件,使查找結果集視圖把該匹配項添加到界面上(TableViewer 或 TreeViewer)。這里不給出查找結果集事件的關鍵代碼,因為 MatchEvent 和 RemoveAllEvent 的源碼已經很清晰,讀者可以參考這兩個類的實現。

顯示查找結果集

前面在講激活查找結果集視圖的時候,已經說明在 Eclipse 的查找框架內,并不是通過 TableViewer 的 setInput 方法把匹配的結果集顯示在 Search 視圖中,而是通過 TableViewer 的 add 方法把匹配項添加到查找結果集視圖中。具體而言,Eclipse 查找框架會啟動一個 UIJob 定時地把查找到的匹配項添加到 Search 視圖中,這樣可以增強用戶體驗。以 AbstractTextSearchViewPage 中的 UpdateUIJob 為例,其間隔時間為 500 毫秒。通過調用 runBatchedUpdates 方法把當前查找到的匹配項添加到 Search 視圖中,以下是其中的一些關鍵代碼。

 private class UpdateUIJob extends UIJob {        
        public UpdateUIJob() { 
            super("updating");  //$NON-NLS-1$ 
            setSystem(true); 
        } 
        
        public IStatus runInUIThread(IProgressMonitor monitor) { 
            Control control= getControl(); 
            if (control == null || control.isDisposed()) { 
                // disposed the control while the UI was posted. 
                return Status.OK_STATUS; 
            } 
            runBatchedClear(); 
            runBatchedUpdates(); 
            if (hasMoreUpdates() || isQueryRunning()) { 
                schedule(500); 
            } else { 
                fIsUIUpdateScheduled= false; 
                updateBusyLabel(); 
                if (fScheduleEnsureSelection) { 
                    fScheduleEnsureSelection= false; 
                    AbstractSearchResult result = getInput(); 
                    if (result != null && fViewer.getSelection().isEmpty()) { 
                        navigateNext(true); 
                    } 
                } 
            } 
            fViewPart.updateLabel(); 
            return Status.OK_STATUS; 
        } 
            
    } 

下面我們分析一下 runBatchedUpdates 中的代碼,該函數會調用 elementsChanged 函數觸發 TableViewer 調用 add 方法,把相應的匹配項添加到 TableViewer 中,然后清除從需要更新的匹配項集合中刪除,如下為其關鍵代碼。

 private synchronized void runBatchedUpdates() { 
    elementsChanged(fBatchedUpdates.toArray()); 
    fBatchedUpdates.clear(); 
    
    updateBusyLabel(); 
 } 

前面講到,runBatchedUpdates 方法會將當前查找到的匹配項添加到 Search 視圖中,那么如何獲取當前查找到的匹配項呢?這就需要借助 ISearchResultListener,即當前查找到的匹配項通過我們定義的事件監聽函數獲取,如下為定義查找結果集發生變化的類及其監聽函數 handleSearchResultChanged 中的關鍵代碼。我們注意到,MatchEvent 中包含事件的類型和當前查找到的匹配項,如果當前事件為 REMOVED_ALL 類型,那么從查找結果視圖中清除所有的匹配項。

 fListener = new ISearchResultListener() { 
    public void searchResultChanged(SearchResultEvent e) { 
        handleSearchResultChanged(e); 
    } 
 }; 

 protected void handleSearchResultChanged(final SearchResultEvent e) { 
        if (e instanceof MatchEvent){ 
            MatchEvent event = (MatchEvent) e; 
            if(event.getKind() == MatchEvent.REMOVED_ALL){ 
                postClear();                
            } 
            else{ 
                postUpdate(((MatchEvent) e).getMatches()); 
            } 
        }        
 } 

由于增加 / 刪除匹配項設計 GUI 操作,因此我們需要啟動 UIJob 運行,因此,runBatchedUpdates 函數調用 postUpdate 函數啟動 Job,把匹配項顯示到查找結果視圖上。如下為 postUpdate 的一些關鍵代碼。

 private synchronized void postUpdate(Match[] matches) { 
    evaluateChangedElements(matches, fBatchedUpdates); 
    scheduleUIUpdate(); 
 } 

總結

至此為止,已經把 Eclipse 查找框架的流程及涉及到的類進行了詳細的說明,相信讀者已經有清晰的認識了,但是,由于 Eclipse 中的所有查找功能都共用一個視圖,導致這些查找功能不能同時使用,而且,有時候我們可能需要定義自己的查找結果集視圖,那么 Eclipse 查找框架中的有些類就不能使用了,如 ISearchQuery,此時,我們不能再給其查找框架了,但是,這個框架的思想我們可以借鑒,讀者有興趣的話,可以開發類似于 Eclipse 的查找框架,但是使用的是我們自己定義的查找結果集視圖。

下面給出如何使用自己的查找結果集視圖顯示匹配項的關鍵代碼,其大致思想是新建一個 Job,在 Job 運行時進行查找,并把查找的匹配項保存起來,待 Job 運行結束后,激活我們自定義的查找結果集視圖,最后把結果集填充到該視圖中。

提示:Eclipse 查找功能是一個非常典型的 MVC 模式,設計我們自己的查找框架(Search Framework)時,完全可以參考該模式,簡潔方便。

 public class SearchJob extends Job { 
    
    protected String fJobName; 
    protected String fTaskName; 

    protected IStatus run(IProgressMonitor monitor) { 
        // 查找代碼,保存查找到的匹配項
    } 


    protected void performJobDone() { 
        // 啟動 UI 線程,激活查找結果視圖,并填充匹配項到視圖中
    } 

    public SearchJob (String name) { 
        super(name); 
        fJobName = name; 

        this.addJobChangeListener(new JobChangeAdapter() { 
            @Override 
            public void done(IJobChangeEvent event) { 
                if (event.getResult().getSeverity() == IStatus.OK) { 
                    performJobDone(); 

                } 
            } 
        }); 
    } 

 } 

總結

以上是生活随笔為你收集整理的Eclipse 插件开发 —— 深入理解查找(Search)功能及其扩展点的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产手机在线精品 | 六月婷操 | 午夜体验区 | 午夜国产在线观看 | 日韩久久久久久久久久久久 | 日女人免费视频 | 国产一级淫片在线观看 | 五月激情婷婷丁香 | 国产高清在线免费观看 | 国产精品系列在线观看 | 中文字幕国产视频 | 国产一级二级av | 亚洲免费不卡 | 四虎在线视频 | 在线观看成人 | 黄av资源 | 国产精品 日韩精品 | 色噜噜日韩精品欧美一区二区 | 色吧av色av | 日本天天色 | 丁香六月激情 | 色综合久久中文字幕综合网 | 特级免费毛片 | 九色视频网址 | 欧美日韩精品免费观看 | 成人一级在线观看 | 亚洲国产精品日韩 | 91在线91拍拍在线91 | 久久黄色小说 | 国产三级香港三韩国三级 | 亚洲精品国产精品国自产在线 | 午夜久久视频 | 黄色大全免费网站 | 九九久久久久久久久激情 | 成人小视频在线观看免费 | 久久久久久久av | av高清不卡 | 国产精品久久片 | 五月婷久久 | 国产高清视频在线播放一区 | 在线播放日韩av | 久久av在线播放 | 免费日韩三级 | 射射射av| 国产自制av | 99r在线视频 | 国产在线污 | 国产精品美女www爽爽爽视频 | 久久99视频免费 | 天天操天天操天天操天天操天天操天天操 | 日本一区二区三区视频在线播放 | 日韩高清精品一区二区 | 亚洲不卡av一区二区三区 | 日韩在线观看a | 国产亚洲日 | 在线va视频 | 999电影免费在线观看2020 | 婷婷六月在线 | 精品国产福利在线 | 黄色大片网 | 成片人卡1卡2卡3手机免费看 | 亚洲国产美女精品久久久久∴ | 国产97在线看 | 久久久久久久久久久久久久电影 | 九九九热精品 | 国产剧情一区二区在线观看 | 日韩av成人在线观看 | 97精品国产97久久久久久粉红 | 最新91在线视频 | 成人午夜久久 | 欧美在线日韩在线 | 青青视频一区 | 欧美一区二区视频97 | 中文字幕日韩一区二区三区不卡 | 一区二区视频在线免费观看 | av解说在线| 成人av免费在线播放 | 操操操日日日干干干 | 四虎影视8848dvd | 午夜美女视频 | 国产日韩中文在线 | 久久天堂网站 | 国产精品高潮在线观看 | 免费 在线 中文 日本 | 亚洲国产成人精品在线 | 久久综合九色综合97婷婷女人 | 99久久婷婷国产一区二区三区 | 午夜国产福利在线 | 操操色| 日韩美一区二区三区 | 欧美日韩在线视频免费 | 天天干天天碰 | 91精品色 | 欧美日韩在线视频观看 | 日韩精品高清视频 | 99这里只有精品99 | 久久久久久久久久久免费视频 | 伊人激情网 | 在线中文字幕视频 | 91精品视频在线 | 国产麻豆果冻传媒在线观看 | 草久视频在线观看 | 婷婷综合亚洲 | 日韩大片在线播放 | 欧美一级免费黄色片 | 国产精品久久久久久久久久久免费 | 国产专区精品视频 | 久久国产精品一国产精品 | 日韩精品在线看 | 亚洲高清91 | 国产一级做a爱片久久毛片a | 精品美女久久久久久免费 | 国产精品对白一区二区三区 | 免费观看一级视频 | www.久久久.cum | 成人精品一区二区三区电影免费 | 黄色精品网站 | 天天干天天想 | 欧美精品中文 | 国产亚洲综合在线 | 嫩草av在线| 91成人精品国产刺激国语对白 | 国产精品久久久久久久久搜平片 | 免费一级特黄毛大片 | 99久免费精品视频在线观看 | 国产91在线观看 | 香蕉影视在线观看 | 超碰97.com | 国产黑丝一区二区三区 | 日韩黄在线观看 | 欧美国产精品久久久久久免费 | 日本性xxx | 色婷婷成人 | 国产午夜精品理论片在线 | 国产婷婷在线观看 | 亚洲精品字幕在线 | 精品国产aⅴ一区二区三区 在线直播av | 国产亚洲精品久久久久久久久久 | 91桃色国产在线播放 | 国产精品免费大片视频 | 国产成人精品综合久久久 | 亚洲无吗av | 超碰人人舔 | 激情丁香综合 | 久久久久99精品国产片 | 国产99re| 香蕉视频久久 | 精品uu| 日韩剧情 | 国产视频一区精品 | 国产精品96久久久久久吹潮 | 在线最新av| 韩国一区视频 | 日韩毛片在线免费观看 | 在线观av| 99r在线视频| 久久夜色精品国产欧美乱极品 | 天天射天天射天天射 | 丁香婷婷激情国产高清秒播 | 99久久精品免费视频 | 亚洲午夜av久久乱码 | 久久综合狠狠狠色97 | 四虎影视成人精品国库在线观看 | 久久欧美在线电影 | 黄色特级片 | 欧美视频xxx | 精品国产aⅴ麻豆 | 国产女教师精品久久av | 国产精品一二三 | 午夜美女福利 | 日日夜夜婷婷 | 在线中文日韩 | 91麻豆福利 | 国产中文字幕在线视频 | 久草在线这里只有精品 | 久久久久久久久久久网站 | 玖玖视频在线 | 九九导航 | 在线91播放 | 99久久精品国产亚洲 | 免费韩国av| 久青草影院 | 91成人免费在线视频 | 天堂视频中文在线 | 午夜久久久影院 | 日韩视频www | 99国内精品久久久久久久 | 91精品国产91久久久久福利 | 日本中出在线观看 | 日韩精品专区在线影院重磅 | 国产伦精品一区二区三区… | 欧美日韩免费在线视频 | 久久福利精品 | 亚洲欧美日韩精品一区二区 | 国产欧美在线一区 | 午夜精品一区二区三区在线 | 狠狠操导航 | 中文字幕久久精品亚洲乱码 | 五月激情天 | 色99视频| 在线免费观看视频你懂的 | 成人超碰在线 | 国产精品美女在线观看 | 91精品国产乱码 | 最近免费中文字幕大全高清10 | 日韩欧美网址 | 久久精品国产久精国产 | av丝袜在线 | 久章草在线观看 | 成人a毛片| 国产在线不卡 | 99久高清在线观看视频99精品热在线观看视频 | 一本一本久久aa综合精品 | 欧美成年人在线观看 | 91完整版观看 | 一区二区三区 亚洲 | 日韩特黄av | 激情婷婷久久 | 色九九视频 | 日韩一区二区三区不卡 | 日本韩国中文字幕 | 国产免费又粗又猛又爽 | 国产精品一区久久久久 | 免费日韩av片 | 精品视频不卡 | 亚洲国产字幕 | av中文字幕网站 | 九色91av | 久久精品久久久久久久 | 国产女教师精品久久av | 中国一级特黄毛片大片久久 | 在线免费观看一区二区三区 | 在线观看你懂的网站 | 狠狠五月天| 日韩大片在线播放 | 99精品久久99久久久久 | 久久精品免费电影 | 久久综合久久综合九色 | 国产精品门事件 | 免费男女羞羞的视频网站中文字幕 | 婷婷www| 99久久影院 | 国产成人高清在线 | 国产一级片久久 | 精品免费久久 | 日韩视频a | 国产高清在线a视频大全 | 日韩网站免费观看 | 国产伦理久久 | 99在线精品视频在线观看 | 91色在线观看 | 久久字幕 | 91麻豆精品国产自产在线游戏 | 亚洲视频网站在线观看 | 国产成人久久精品一区二区三区 | 久久精品免费 | 一区二区三区在线免费观看视频 | 黄色资源网站 | 成人av电影免费在线观看 | 高清av影院| 91视频免费网站 | 欧美久久影院 | 人人草在线观看 | 国产涩涩在线观看 | 国产日韩在线播放 | 欧美成人黄色片 | 99久久婷婷国产综合精品 | 高清av免费观看 | 中文字幕在线观看不卡 | 啪嗒啪嗒免费观看完整版 | 国产精品欧美在线 | 国产一性一爱一乱一交 | 精品久久久久久综合日本 | 91久久精品一区二区三区 | av在线一二三区 | 99精品亚洲 | 亚洲国产一区在线观看 | 激情欧美日韩一区二区 | 99精品国产99久久久久久97 | 香蕉视频一级 | 日本不卡123| 国产不卡在线观看视频 | 色综合久久综合中文综合网 | 激情影音先锋 | 视频在线观看亚洲 | av福利在线导航 | 国产精品久久久久久久久久久杏吧 | 免费看黄在线 | 欧美成人在线免费 | 青青河边草观看完整版高清 | 日韩欧美在线免费 | 免费在线观看视频一区 | 亚洲男男gaygay无套 | 精品视频在线视频 | 久久99国产精品久久99 | 亚洲国产剧情av | 成人精品电影 | 免费视频在线观看网站 | 在线播放视频一区 | 成人在线黄色电影 | 人人干人人超 | 天天夜夜狠狠操 | 久久久久久久久艹 | 国产在线精品区 | 国产一区二区播放 | 福利视频午夜 | 色婷婷激情电影 | 欧美日韩国产二区三区 | 黄色成人av | 国产91九色视频 | 亚洲精品视频一二三 | 国产精品欧美久久久久三级 | 狠狠色狠狠色综合日日小说 | 91黄色小网站 | 国产最新视频在线观看 | 成人综合婷婷国产精品久久免费 | 免费久久网站 | 丁香婷婷基地 | www在线观看国产 | 日日操日日操 | 日日干天天插 | 国产片免费在线观看视频 | 欧美成年黄网站色视频 | 黄色精品久久 | 99热精品免费观看 | 亚洲综合小说电影qvod | 五月视频 | 人人爱在线视频 | 在线观看成人毛片 | 国产精品不卡在线观看 | 亚洲激情在线观看 | 天天干天天做天天操 | 国产在线播放一区 | 日韩免费一区 | 狠狠干在线 | 国产精品久久电影观看 | 日韩高清免费电影 | 伊人久久电影网 | 日韩理论影院 | 成人久久久精品国产乱码一区二区 | 国产1级视频 | 天天草天天插 | 久久婷婷五月综合色丁香 | 狠狠干成人 | 天天射天天色天天干 | 国产91勾搭技师精品 | 亚洲国产中文字幕 | 亚洲国内精品视频 | 亚洲成人二区 | 久草在线看片 | 亚洲精品午夜久久久久久久久久久 | 亚洲日韩精品欧美一区二区 | 色资源二区在线视频 | 99久久精品无码一区二区毛片 | 亚洲五月花 | 五月婷婷色播 | 激情综合亚洲精品 | 99久久精品国产观看 | 欧美成人黄色片 | 美女黄频网站 | 亚洲综合网站在线观看 | 国产精品热 | 成年人视频在线免费观看 | 欧美日韩免费观看一区二区三区 | 成人久久久久久久久 | 91视频国产免费 | 国产高清亚洲 | 国产精品久久久一区二区三区网站 | av大全在线免费观看 | 色美女在线 | 亚洲人精品午夜 | 欧美亚洲成人xxx | 亚洲一级黄色大片 | 又粗又长又大又爽又黄少妇毛片 | 婷婷久操 | 日韩在线观看你懂的 | 中文字幕人成不卡一区 | 少妇bbbb| 91九色在线 | 亚洲精品国产精品乱码在线观看 | 国产极品尤物在线 | 黄色一级片视频 | 热久久99这里有精品 | 一区二区三区日韩在线 | 亚洲成人av在线 | 91中文字幕在线视频 | 精品成人免费 | 久久一及片| 成人午夜电影在线播放 | 亚洲一级二级 | 综合网中文字幕 | 在线影院 国内精品 | 色橹橹欧美在线观看视频高清 | 国产91探花 | www.色午夜 | 亚洲男模gay裸体gay | 在线观看视频色 | 国产精品av电影 | 欧美整片sss | 狠狠色狠狠色终合网 | 亚洲精品www | 99久久日韩精品免费热麻豆美女 | 免费看污的网站 | 国产天天爽 | 97成人精品 | 精品一区二区三区四区在线 | 日韩特级黄色片 | 精品国产日本 | 日韩精品中文字幕在线不卡尤物 | 国产精品久久久久久久久久久久冷 | 视频在线观看亚洲 | 天天操天 | 免费影视大全推荐 | 日韩视频www | 国产高清视频在线观看 | 国产精品美女在线观看 | 成年人在线视频观看 | 国产黄视频在线观看 | 亚洲欧美视频网站 | 69久久久 | 国产一级一片免费播放放 | 夜夜夜| 久久久久日本精品一区二区三区 | 蜜桃视频在线观看一区 | sm免费xx网站 | 欧美成人xxxx| 伊人资源视频在线 | 亚洲一区二区观看 | 久久婷综合 | 欧美国产视频在线 | 国产精品一区免费在线观看 | 日韩一区二区在线免费观看 | 国内精品小视频 | 99精品久久99久久久久 | 天天射网站| 亚洲精选在线观看 | 国产精品毛片一区 | 婷婷国产一区二区三区 | 亚洲成免费 | 日韩欧美一区二区三区在线 | 亚洲精品美女久久久久 | 国产精品久久久久久久久久久久午夜片 | 国产精品一区二区三区在线看 | 99久久婷婷国产一区二区三区 | 99久久婷婷 | 国产免费人成xvideos视频 | 在线免费视频 你懂得 | 国产精品女人网站 | 久久精品美女视频网站 | 国产69久久久欧美一级 | 91福利视频免费观看 | 久久精品99 | 成年人国产视频 | 99精品在线视频观看 | 在线免费黄网站 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 99在线国产 | 99r在线视频 | 久久五月婷婷丁香 | 日韩一区二区三区高清在线观看 | 最新中文字幕在线播放 | 麻豆传媒在线免费看 | 国产精品久久久久免费 | 国产精品专区在线 | 久久艹影院 | 激情久久婷婷 | 成人在线观看网址 | 一本大道久久精品懂色aⅴ 五月婷社区 | 日韩网站一区二区 | 国产又粗又硬又爽视频 | 国产日产在线观看 | 国产精品久久精品国产 | 青草视频在线看 | 成人黄色小说视频 | 天天曰天天 | 91在线观 | 狠狠夜夜| 日韩有码中文字幕在线 | 国产一级在线免费观看 | 日韩电影在线一区 | 国产 视频 久久 | 在线看岛国av | 激情电影影院 | 国产流白浆高潮在线观看 | 欧美午夜寂寞影院 | 五月天久久 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 色偷偷av男人天堂 | 9色在线视频 | 国产亚洲视频在线免费观看 | 国产精品久久一 | 深夜国产在线 | 国产亚洲精品美女久久 | 亚洲欧美日韩在线一区二区 | 一区二区影院 | 中文字幕在线观看视频一区 | 精品久久久久久久久久久久久 | 中文字幕av影院 | 久久久久伊人 | 在线日韩精品视频 | 免费能看的黄色片 | 色婷婷成人网 | 欧美另类交在线观看 | 2022久久国产露脸精品国产 | 久久不色| 99综合电影在线视频 | 日本中文字幕在线视频 | 97超碰人人网 | 91天天操 | 西西4444www大胆艺术 | 国产专区日韩专区 | 亚洲精品美女在线观看 | 欧美一级片免费 | 激情久久婷婷 | 亚洲精品久久久蜜桃直播 | 国产精品福利午夜在线观看 | 日日夜夜免费精品 | www·22com天天操 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 中国精品少妇 | 亚洲男人天堂2018 | 亚洲综合五月天 | 在线免费观看羞羞视频 | 婷婷 综合 色 | 一色av| 色狠狠狠 | 97人人模人人爽人人少妇 | 欧美日韩视频 | 天堂av观看 | 国产成人在线一区 | 久久特级毛片 | 婷婷国产一区二区三区 | 伊人黄色网 | 片网址| 人人草天天草 | 久久99视频免费观看 | 欧美午夜精品久久久久久浪潮 | 五月婷婷六月丁香 | 成人宗合网 | 国产手机av | 天堂网av在线 | 欧美激情精品久久 | 亚洲黄色一级大片 | 欧美色图东方 | 日本一区二区不卡高清 | 国产资源网站 | 欧美美女激情18p | 青青草国产精品 | 久草在线免费资源 | 亚洲aⅴ久久精品 | 成人国产一区 | 色停停五月天 | 五月花激情 | 亚洲激情校园春色 | 人人干人人干人人干 | 国产不卡在线视频 | 午夜99| 天天干 夜夜操 | 日韩欧美xxx | 免费在线观看一级片 | 国产精品s色 | 91福利社在线观看 | 外国av网| 婷婷六月天天 | 国产在线一线 | 国产精品夜夜夜一区二区三区尤 | 伊人网av | 天堂视频一区 | 奇米网在线观看 | 久久精品欧美视频 | 国产在线欧美日韩 | 亚洲精品国产麻豆 | 99久久夜色精品国产亚洲96 | 欧美日韩精| 一二三区视频在线 | 国产成人精品一区在线 | 成人免费看黄 | 狠狠干婷婷色 | 精品亚洲视频在线观看 | 免费成人短视频 | 精品一区二区在线观看 | 国产69久久久欧美一级 | 日韩二区三区 | 丁香六月婷婷 | 欧美日韩一区二区三区在线免费观看 | 99国产免费网址 | 狠狠狠干 | av中文字幕网 | 国产精品1区2区在线观看 | 亚洲一区二区精品 | 国产一级性生活 | 久久国产精品色婷婷 | 国产亚洲精品久久久久久久久久久久 | 不卡视频一区二区三区 | 天天色天天色 | 日韩中文字幕在线看 | 99精品国产99久久久久久福利 | 国产精品麻豆视频 | 九九热免费在线视频 | 久久综合色天天久久综合图片 | www.91av在线| 久久久久国产一区二区三区四区 | 欧美日韩国产在线观看 | 色久综合 | 香蕉91视频 | 欧美肥妇free | 久草男人天堂 | 午夜.dj高清免费观看视频 | 国产性天天综合网 | 日韩在线精品一区 | 综合色在线 | 99久久99久久 | 在线高清av | 亚洲欧洲av | 黄色在线视频网址 | 午夜av免费 | 国内精品久久影院 | 97涩涩视频 | 91天堂在线观看 | 天天操天天射天天操 | 成人全视频免费观看在线看 | 九九九电影免费看 | 黄色a在线 | 激情 婷婷 | 黄色成人在线 | 九九国产精品视频 | 久久综合给合久久狠狠色 | 亚洲精品成人av在线 | 亚洲欧美国产精品久久久久 | 色狠狠干 | 免费看网站在线 | 999一区二区三区 | 天天天在线综合网 | 天天躁日日躁狠狠 | 成人av播放 | 国产精品毛片网 | 国产中文字幕免费 | 超碰com| 久久男人中文字幕资源站 | 国产色爽 | 精品久久久久国产 | 在线观看日本高清mv视频 | 91精品国自产在线观看 | 天天操天天摸天天干 | 综合网av | www.夜夜爽| 亚洲国产精品电影 | 国产美女被啪进深处喷白浆视频 | 91九色最新 | 中文在线a∨在线 | 五月婷综合 | 麻豆精品视频在线观看免费 | www色网站 | 亚洲男男gaygay无套同网址 | 国产精品123 | 国产成人久久精品 | 国产免码va在线观看免费 | 99久久精品国产毛片 | 人人爽人人爽人人片av免 | 亚洲精品一区二区在线观看 | 国外av在线 | 在线a亚洲视频播放在线观看 | 午夜av日韩 | 日韩在线短视频 | 美女视频黄免费网站 | 亚洲精品视频免费在线 | 亚洲国产99 | 久草在线视频首页 | 久久久久99精品国产片 | 在线国产91| 91爱爱视频 | 国产精品一区专区欧美日韩 | 69精品久久久 | 日日摸日日碰 | 在线91网 | 波多野结衣电影久久 | 伊人久久国产 | 日本中文字幕网站 | 91超级碰碰 | 午夜手机电影 | 在线成人一区二区 | 欧美日韩不卡一区 | 婷婷色综合网 | 91精品国产99久久久久 | 91精品国自产在线偷拍蜜桃 | 日韩免费看视频 | 国产精品一区二区三区99 | 亚洲伊人天堂 | 国产精品亚洲综合久久 | 亚洲另类人人澡 | 人人干人人搞 | 国产成人精品一区二区在线观看 | www色网站| 久久精品女人毛片国产 | av久久久久久 | 成人h动漫在线看 | 又色又爽的网站 | 美女精品国产 | 91精品国产自产在线观看永久 | 精品亚洲免费 | 亚洲日韩中文字幕 | 美女黄频在线观看 | 亚洲激精日韩激精欧美精品 | 久久精品国产99国产 | 精品久久综合 | 国产精品网红直播 | 国内精品小视频 | 国内偷拍精品视频 | 一级片视频免费观看 | 中文字幕4 | 天天玩天天干天天操 | 午夜视频亚洲 | 国产高清免费视频 | 久久久精品一区二区 | 国产精品粉嫩 | 免费观看黄 | 国内精品视频在线 | 欧美一二三专区 | 天天射天天拍 | 亚洲视频在线免费观看 | 精品主播网红福利资源观看 | 九九99视频| 综合久久2023 | 日韩理论在线播放 | 欧美在线视频二区 | 久久免费一级片 | 高清国产在线一区 | 五月天激情综合 | 在线中文字幕一区二区 | a爱爱视频 | 国产成人精品a | 草在线| 天天在线视频色 | av黄色成人 | 97在线观看免费观看 | 91精品久久久久久久91蜜桃 | 日韩亚洲国产精品 | 国产精品久久久久久久久搜平片 | 色在线中文字幕 | 天天舔夜夜操 | 97在线观看免费视频 | 91av99| 久久免费视频在线观看 | 狠狠天天| 欧美视频18| 99视频黄 | 欧美日韩破处 | 欧美国产高清 | 亚州精品天堂中文字幕 | 在线视频免费观看 | 蜜臀精品久久久久久蜜臀 | 在线观看精品一区 | 日韩av一卡二卡三卡 | 狠狠色丁香 | 久久不射网站 | 日韩在线观看第一页 | 日本亚洲国产 | 特级西西444www大胆高清无视频 | 91色网址| 精品一区二三区 | 91av视屏 | 久久,天天综合 | 日韩免费不卡视频 | 最新久久免费视频 | 亚洲视频在线播放 | 99av在线视频| 中文字幕在线看人 | 97超视频 | 精品人人爽| www国产一区 | 视频在线观看91 | 亚洲高清精品在线 | 日日碰狠狠添天天爽超碰97久久 | 99riav1国产精品视频 | 成人国产精品 | 91av视频导航 | 亚洲欧洲日韩在线观看 | 去看片| 超碰九九| 超碰com| 一区二区精品 | 成人三级网站在线观看 | 亚洲精品乱码久久久久久写真 | 99久久日韩精品视频免费在线观看 | 亚洲精品国产第一综合99久久 | 久久久久久久久久久久久9999 | 91九色在线观看视频 | 日韩系列在线 | 青春草免费视频 | 经典三级一区 | 波多野结衣一区二区三区中文字幕 | 97精品国自产拍在线观看 | 日韩免费视频播放 | 国产永久免费 | 久久6精品| 黄色大全免费观看 | 欧洲视频一区 | 不卡视频在线 | 玖玖在线看 | 日韩一二区在线 | 免费看一及片 | 欧美国产日韩一区二区三区 | 国产精品久久影院 | 久久久国产精品网站 | 99色在线 | 成年人国产视频 | 日韩高清在线一区二区三区 | 亚洲情影院 | 99精品免费视频 | 日韩精品一区二区三区免费观看视频 | 欧美日韩裸体免费视频 | 日韩精品视频一二三 | 在线a亚洲视频播放在线观看 | 国产精品一区二区电影 | 久久国产亚洲精品 | 一级欧美黄 | 色在线网 | 2024av | 日韩精品最新在线观看 | av国产在线观看 | 成人一区二区三区在线 | 99精品视频在线播放观看 | 97天堂网| 国产精品一区二区三区在线播放 | 国产在线中文 | 欧美精品一区二区免费 | 久久人人艹| 国产成人久久精品亚洲 | 91丨九色丨勾搭 | 五月婷丁香 | 国产精品成人品 | 国产精品一区二区三区四区在线观看 | 国产又粗又猛又黄又爽的视频 | 丁香婷婷深情五月亚洲 | 欧美亚洲精品一区 | 一区在线观看 | 在线观看中文字幕亚洲 | 韩日在线一区 | 日韩欧美视频在线播放 | 日韩久久久久久久久久久久 | 日韩免费专区 | 国产最新精品视频 | 视频精品一区二区三区 | 国产精品99久久久久久有的能看 | 日韩电影久久久 | 欧美巨乳网 | a资源在线 | 欧美日韩亚洲第一页 | 91片网 | 国产综合精品一区二区三区 | www.久久视频 | 99激情网 | 99热最新在线 | 丁香婷婷深情五月亚洲 | 天天射综合网站 | 在线观看免费国产小视频 | 97视频在线观看视频免费视频 | 日韩成人精品一区二区 | 天天爱天天舔 | 国产在线精品二区 | 成人黄色一级视频 | 97国产超碰 | 91激情视频在线观看 | 久久综合视频网 | 国产91影院 | 国产精品久久久久久久久费观看 | 天天干天天插 | 四虎在线免费视频 | 亚洲成人精品久久久 | 久久人人爽av | 久久嗨 | 国产专区日韩专区 | 亚洲 欧美 综合 在线 精品 | 精品国产日本 | 夜夜摸夜夜爽 | 日韩欧美国产精品 | 免费在线国产 | 日韩在线激情 | 成人黄色在线 | 欧美成人理伦片 | 伊人成人精品 | 91精品国产91久久久久福利 | 在线观看欧美成人 | 色婷婷综合成人av | 99久久精品久久亚洲精品 | 九九热免费观看 | 99视频精品免费观看, | 在线国产99 | 五月婷婷激情网 | 成年人网站免费在线观看 | 日韩一二三在线 | 97超碰中文| 五月天国产 | 免费网站在线观看人 | 中文av免费| 99国产精品久久久久老师 | 激情视频网页 | 欧美吞精| 午夜骚影 | 日韩欧美极品 | av在线成人 | 精品亚洲在线 | 9久久精品 | 久久99精品久久只有精品 | 国产欧美在线一区二区三区 | 中文字幕亚洲精品日韩 | 96视频免费在线观看 | 欧美极品少妇xbxb性爽爽视频 | 国产精品久久久久久电影 | 国产精品一区二区av影院萌芽 | 午夜精品久久久久久久久久久久久久 | 特级西西444www高清大视频 | 日本大尺码专区mv | 国产乱码精品一区二区三区介绍 | 好看av在线 | 九九视频免费在线观看 | 超碰97公开 | 日韩区欠美精品av视频 | 经典三级一区 | 91激情视频在线播放 | 日本免费久久高清视频 | 久久综合久久综合久久综合 | 亚洲最大av网 | 日本在线中文在线 | 五月婷婷婷婷婷 | 国产一级二级三级在线观看 | 九九涩涩av台湾日本热热 | 免费国产在线视频 | 日韩三级成人 | 丁香六月在线 | 在线免费精品视频 | 日韩亚洲国产中文字幕 | av在线收看| 丁香5月婷婷久久 | 国产无限资源在线观看 | 婷婷久久网| av3级在线 | 亚洲最大在线视频 | 久久国产网 | 91成人免费电影 | 亚洲综合少妇 | 97自拍超碰 | 亚洲精品国产自产拍在线观看 | 中文字幕在线观看网站 | 国产精品嫩草在线 | 国产精品久久久久久久久岛 | 一区三区视频在线观看 | 国产在线超碰 | 久久人人爽人人人人片 | 国产在线精品福利 | 午夜精品久久久久久99热明星 | 五月天六月色 | 久久久国产一区二区 | 在线成人中文字幕 | 成人h动漫在线看 | 久久男人免费视频 | 波多野结衣一区 | 久久国产视频网站 | 九色91视频 | 黄网站色欧美视频 | 五月婷婷开心中文字幕 | 色偷偷中文字幕 | 91久久精品一区二区二区 | 国产精品视频全国免费观看 | 黄色的视频网站 | 在线免费视频一区 | 毛片网站在线观看 | 热久精品 | 在线观看一 | 天天爱天天干天天爽 | 国产视频一区二区三区在线 | 九九天堂| 97国产情侣爱久久免费观看 | 深爱激情五月综合 | 久久婷婷一区二区三区 | 亚洲午夜久久久综合37日本 | 亚洲成av人电影 | 在线免费色 | 91黄色免费看 | 免费精品在线观看 | 精品久久美女 | 黄色在线观看www | 黄色大片日本 | 在线观看不卡视频 | 久久99精品久久只有精品 | 久久精品美女视频 | 免费a网| 中午字幕在线 | 久久久久久免费 | 久久久久久久久久久网站 | 国产亚洲无 | 日韩亚洲在线观看 | 欧美日韩免费一区二区三区 | 欧美亚洲另类在线视频 | 日韩在线电影一区二区 | 国产不卡av在线 | 国产中文在线视频 | 国产亚洲午夜高清国产拍精品 |