<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Live a simple life

    沉默(zhu_xing@live.cn)
    隨筆 - 48, 文章 - 0, 評論 - 132, 引用 - 0
    數據加載中……

    【Eclipse插件開發】基于WTP開發自定義的JSP編輯器(二):基于WTP StructuredTextEditor創建自己的JSPEditor

            在本小節中,無論如何先把自己的編輯器給搞出來,為我們后面對wtp提供的JSP編輯器進行定制。
            
            【開發環境準備】
            1、Eclipse 3.2 + WTP 1.5
            2、對應的GEF(3.2.1)、EMF(2.2.1)系列插件
            3、將必要插件導入到工作區,導入插件列表如下:
                    
                    
             因為我們暫時只是閱讀并不打算修改wtp源碼,所以就先以二進制方式導入,以上導入的6個插件以后要和我們常打交道~_~。

             說明:
            Eclipse 3.3、3.4也可以,wtp 2.0版本也可以,只要是有對應版本的gef和emf與之配套

            【JFace Text Framework & Eclipse Editor Framework】
            我們知道Eclipse為我們提供了一個文本編輯器框架,個人覺得最核心的角色是:IEditorPart、IDocumentProvider和SourceViewerConfiguration。
            
             【角色介紹】
            1、org.eclipse.ui.IEditorPart
                IWorkbenchPart的一種擴展實現(另一種是IViewPart),編輯器的真正主體,需要和IEditorSite、IWorkbenchPage等協作。Eclipse為我們準備了默認的文本編輯器實現(AbstractTextEditor),繼承體系如下:
                
                 上圖中的StructuredTextEditor就是我們wtp提供的JSP編輯器實現,看得出來是一種文本編輯器實現。
                
                   和IEditorPart密切相關的是如何定制和本編輯器類型相關的工作臺工具欄和菜單:一個是org.eclipse.ui.IEditorActionBarContributor接口,和編輯器擴展點org.eclipse.ui.editors配合使用;另一個是org.eclipse.ui.editorActions擴展點。WTP提供了相應的IEditorActionBarContributor實現:
                
                    ISourceViewerActionBarContributor類型及其子類型都是由WTP提供,有興趣可以看一下。

                    注意點:IEditorActionBarContributor實現是和編輯器類型綁定的,在多個編輯器實例間共享。

            2、org.eclipse.ui.texteditor.IDocumentProvider
                  核心作用就是提供JFace Text Framework中org.eclipse.jface.text.IDocument實現。
                   
                    上圖中的StructuredModelDocumentProvider和StorageModelModelProvider就是WTP提供的兩個IDocumentProvider實現。

                    文本編輯器公共父類中提供了配置IDocumentProvider實現的方法:org.eclipse.ui.texteditor.AbstractDecoratedTextEditor.setDocumentProvider(IEditorInput)。
                    
            3、org.eclipse.jface.text.source.SourceViewerConfiguration:這是JFace Text Framework提供的一個重要概念,用來對SourceViewer(一般是用來顯示編輯source code,全名為org.eclipse.jface.text.source.SourceViewer)進行配置。可以配置的內容包括:自動提示策略、自動編輯器策略等等。SourceViewer中提供了對應的配置行為接口:SourceViewer.configure(SourceViewerConfiguration configuration),這個配置過程一般發生在IEditorPart.createPartControl過程中,因為source viewer實例的創建包含在IEditorPart.createPartControl過程中。
                
                上圖中的StructuredTextViewer就是WTP提供的編輯器各種頁面資源代碼(包括jsp、html等)所使用的SourceViewer實現。如果我們進行定制,那么就給StructuredTextViewer配置一個我們自己的SourceViewerConfiguration ^_^

                
                上圖中的StructuredTextViewerConfigurationJSP就是WTP針對JSP文件類型提供的SourceViewerConfiguration實現。

                
                【角色之間的關系】
                  1、org.eclipse.ui.editors擴展和IEditorPart之間的關系
                        一個org.eclipse.ui.editors擴展會指定一個對應的IEditorPart實現,一個IEditorPart實現可以被用在多個org.eclipse.ui.editors擴展中,也就是說IEditorPart相對于org.eclipse.ui.editors擴展是1:N的關系。

                        例如WTP提供的StructuredTextEditor是一個文本類型editor part實現,其在org.eclipse.jst.jsp.ui、org.eclipse.wst.html.ui等多個插件中被注冊,它被WTP用來編輯jsp、html等多種資源。例如:   
    <!-- 摘自org.eclipse.jst.jsp.ui插件plugin.xml -->
    <editor
                
    name="%JSP_Source_Page_Editor.name"
                icon
    ="$nl$/icons//full/obj16/sourceEditor.gif"
                extensions
    ="jsp, jsf, jspf, jspx, tag, tagf"
                contributorClass
    ="org.eclipse.jst.jsp.ui.internal.editor.ActionContributorJSP"
                class
    ="org.eclipse.wst.sse.ui.StructuredTextEditor"
                symbolicFontName
    ="org.eclipse.wst.sse.ui.textfont"
                id
    ="org.eclipse.jst.jsp.core.jspsource.source">
                
    <contentTypeBinding
                    
    contentTypeId="org.eclipse.jst.jsp.core.jspsource" />
            
    </editor>

    <!-- 摘自org.eclipse.wst.html.ui插件plugin.xml -->
    <editor
                
    name="%HTML_Source_Page_Editor.name"
                icon
    ="$nl$/icons/full/obj16/sourceEditor.gif"
                contributorClass
    ="org.eclipse.wst.html.ui.internal.edit.ui.ActionContributorHTML"
                class
    ="org.eclipse.wst.sse.ui.StructuredTextEditor"
                symbolicFontName
    ="org.eclipse.wst.sse.ui.textfont"
                id
    ="org.eclipse.wst.html.core.htmlsource.source">
                
    <contentTypeBinding
                    
    contentTypeId="org.eclipse.wst.html.core.htmlsource" />
            
    </editor>
                        

                  2、IEditorPart和IEditorActionBarContributor之間的關系
                        上面已經說過,多個IEditorPart實例共享同一個IEditorActionBarContributor實例。結合具體場景講,例如用同一種類型的JSP編輯器打開了10個JSP文件,每次都會產生一個新的該類型IEditorPart實例,但是對應的是同一個IEditorActionBarContributor實例。
                        一個IEditorPart實現可以被注冊多次(上面第一個點說過),每次可以配置不同類型的IEditorActionBarContributor實現。    
    <!-- 摘自org.eclipse.jst.jsp.ui插件plugin.xml -->
    <editor
                
    name="%JSP_Source_Page_Editor.name"
                icon
    ="$nl$/icons//full/obj16/sourceEditor.gif"
                extensions
    ="jsp, jsf, jspf, jspx, tag, tagf"
                contributorClass
    ="org.eclipse.jst.jsp.ui.internal.editor.ActionContributorJSP"
                class
    ="org.eclipse.wst.sse.ui.StructuredTextEditor"
                symbolicFontName
    ="org.eclipse.wst.sse.ui.textfont"
                id
    ="org.eclipse.jst.jsp.core.jspsource.source">
                
    <contentTypeBinding
                    
    contentTypeId="org.eclipse.jst.jsp.core.jspsource" />
            
    </editor>
    <!-- 摘自org.eclipse.wst.html.ui插件plugin.xml -->
    <editor
                
    name="%HTML_Source_Page_Editor.name"
                icon
    ="$nl$/icons/full/obj16/sourceEditor.gif"
                contributorClass
    ="org.eclipse.wst.html.ui.internal.edit.ui.ActionContributorHTML"
                class
    ="org.eclipse.wst.sse.ui.StructuredTextEditor"
                symbolicFontName
    ="org.eclipse.wst.sse.ui.textfont"
                id
    ="org.eclipse.wst.html.core.htmlsource.source">
                
    <contentTypeBinding
                    
    contentTypeId="org.eclipse.wst.html.core.htmlsource" />
            
    </editor>

                        上面可以看出來,當StructuredTextEditor被配置用來綁定jsp文件類型的時候,給它配置的是ActionContributorJSP,當StructuredTextEditor被配置用來綁定html文件類型的時候,給它配置的是ActionContributorHTML。那就是說,當我們用StructuredTextEditor分別開發jsp和html的時候,工作臺工具欄和菜單欄可能會有所不同^_^

                  3、SourceViewer和SourceViewerConfiguration 之間的關系
                        SourceViewer的很多行為是由SourceViewerConfiguration制定的,前者承擔的可以認為是source viewer的核心行為,例如綁定document、annotation model等等,后者可以認為是前者對應的服務接口,提供額外服務。對于同一個SourceViewer實例,可以用不同類型SourceViewerConfiguration進行配置,以達到定制的效果,外在行為則看起來就會有所不同。
                        上面說過,WTP在編輯jsp、html等頁面資源類型的時候其實對應都是StructuredTextEditor,但是使用過的就會知道,自動提示等等行為還是有所不同的。StructuredTextEditor持有的是同種類型的SourceViewer實現:org.eclipse.wst.sse.ui.internal.StructuredTextViewer,但是,如果給StructuredTextViewer配置不同的SourceViewerConfiguration,則就可以定制其行為了^_^。    當用StructuredTextEditor打開jsp文件時,在StructuredTextEditor.createPartControl過程中給其配置StructuredTextViewerConfigurationJSP,當用StructuredTextEditor打開html文件時,在StructuredTextEditor.createPartControl過程中給其配置StructuredTextViewerConfigurationHTML...

        【WTP StructuredTextEditor分析】
          其實上面已經分析了建立一個編輯器擴展所依賴的關鍵角色,那么我們看一下WTP提供的用來編輯jsp、html等多種頁面資源的StructuredTextEditor是如何配置起來的。
           IEditorPart:StructuredTextEditor
           IEditorActionBarContributor:提供了ActionContributorJSP等多種實現,通過org.eclipse.ui.editors擴展來和StructuredTextEditor集成
            

            IDocumentProvider:提供了StructuredModelDocumentProvider和StorageModelModelProvider兩種實現,通過StructuredTextEditor.setDocumentProvider(IEditorInput)完成
            
            ISourceViewer:StructuredTextViewer
            SourceViewerConfiguration:提供StructuredTextViewerConfigurationJSP、StructuredTextViewerConfigurationHTML等多種實現,在StructuredTextEditor.createPartControl過程中對StructuredTextViewer進行配置。
            

        【基于WTP創建自定義的JSP編輯器擴展】

                到這里,有關eclipse文本編輯器框架中各個角色以及它們之間的關系都基本上已經清楚了。那我們看一下如何基于WTP創建自定義的JSP編輯器擴展:
                1、IEditorPart角色:創建一個自定義IEditorPart實現,直接繼承自WTP的StructuredTextEditor,暫定名字為JSPEditor。因為我們后面要在createPartControl中對WTP的StrcuturedTextViewer進行config。
                2、IEditorActionBarContributor角色:目前我們不打算提供定制工作臺菜單欄和工具欄,所以直接復用ActionContributorJSP
                3、IDocumentProvider角色:直接復用WTP已有的,我們不打算提供我們自定義的IDocument實現,我們只是定制編輯器外在的行為^_^
                4、ISourceViewer角色:直接復用WTP提供的StrcuturedTextViewer     
                5、SourceViewerConfiguration角色:因為是我們要定制WTP的StrcuturedTextViewer,例如后門定制自動提示等等,所以我們提供一個SourceViewerConfiguration,繼承自StructuredTextViewerConfigurationJSP,暫定名為JSPStructuredTextViewerConfiguration。

                【主要代碼】
                  首先創建一個插件工程,我這邊叫做jspeditor,依賴如下插件:
                     org.eclipse.ui,
                     org.eclipse.core.runtime,
                     org.eclipse.wst.sse.ui,
                     org.eclipse.jface.text,
                     org.eclipse.ui.workbench.texteditor,
                     org.eclipse.jst.jsp.ui
                
                    接著創建我們自己的SourceViewerConfiguration:
    //JSPStructuredTextViewerConfiguration.java
    package jspeditor.configuration;

    import org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP;

    /**
     * 自定義StructuredTextViewerConfiguration,基于WTP jst提供的StructuredTextViewerConfigurationJSP,
     * 后面會提供自定義的自動提示策略等擴展。
     *
     * 
    @author zhuxing (mailto:zhu_xing@live.cn)
     
    */
    /*
     * 修改歷史
     * $Log$ 
     
    */
    public class JSPStructuredTextViewerConfiguration extends
            StructuredTextViewerConfigurationJSP {
        
    }
            暫時還是個空殼子^_^, 后面會往里填充東西的。

            再者,創建我們的IEditorPart主體類,并覆寫createPartControl過程,用我們自己的JSPStructuredTextViewerConfiguration配置WTP的SourceViewer(StructuredTextViewer):
     1 package jspeditor;
     2 
     3 import jspeditor.configuration.JSPStructuredTextViewerConfiguration;
     4 
     5 import org.eclipse.jface.text.source.SourceViewerConfiguration;
     6 import org.eclipse.swt.widgets.Composite;
     7 import org.eclipse.ui.texteditor.IDocumentProvider;
     8 import org.eclipse.wst.sse.ui.StructuredTextEditor;
     9 
    10 /**
    11  * 基于WTP的自定義JSP編輯器。
    12  *
    13  * @author zhuxing (mailto:zhu_xing@live.cn)
    14  */
    15 /*
    16  * 修改歷史
    17  * $Log$ 
    18  */
    19 public class JSPEditor extends StructuredTextEditor {
    20     
    21     /* (non-Javadoc)
    22      * @see org.eclipse.wst.sse.ui.StructuredTextEditor#createPartControl(org.eclipse.swt.widgets.Composite)
    23      */
    24     public void createPartControl(Composite parent) {
    25         super.createPartControl(parent);
    26         
    27         //用自定義的source viewer configuration配置WTP提供的SourceViewer實現(StrcuturedTextViewer)
    28         SourceViewerConfiguration configuration = new JSPStructuredTextViewerConfiguration();
    29         this.setSourceViewerConfiguration(configuration);
    30     }
    31     
    32     /* 
    33      * 保持WTP原有實現
    34      * 
    35      * @see org.eclipse.ui.texteditor.AbstractDecoratedTextEditor#getDocumentProvider()
    36      */
    37     public IDocumentProvider getDocumentProvider() {
    38         // TODO Auto-generated method stub
    39         return super.getDocumentProvider();
    40     }
    41     
    42     /* (non-Javadoc)
    43      * @see org.eclipse.wst.sse.ui.StructuredTextEditor#setSourceViewerConfiguration(org.eclipse.jface.text.source.SourceViewerConfiguration)
    44      */
    45     protected void setSourceViewerConfiguration(SourceViewerConfiguration configuration) {
    46         // TODO Auto-generated method stub
    47         super.setSourceViewerConfiguration(configuration);
    48     }
    49     
    50 }

                最后,查看org.eclipse.ui.eidtors擴展點契約,提供擴展:
    <extension
             
    point="org.eclipse.ui.editors">
          
    <editor
                
    class="jspeditor.JSPEditor"
                contributorClass
    ="org.eclipse.jst.jsp.ui.internal.editor.ActionContributorJSP"
                default
    ="true"
                extensions
    ="jsp, jsf, jspf, jspx, tag, tagf"
                icon
    ="icons/jsp_editor.JPG"
                id
    ="jspeditor.editor"
                name
    ="自定義WTP JSP編輯器">
             
    <contentTypeBinding contentTypeId="org.eclipse.jst.jsp.core.jspsource"/>
          
    </editor>
       
    </extension>

                我做的編輯器圖標^_^:
                
                
                【效果預覽】
                    
                  

                ^_^,我們第一步完成了。
                
                以后的幾個小節,我們需要先停一下了,好好地分析一下WTP的數據模型,這是基礎中的基礎!!!

                
                【源碼下載】
                下載鏈接:基于WTP自定義JSP編輯器源碼

    本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!

    posted on 2008-09-05 18:07 zhuxing 閱讀(8433) 評論(5)  編輯  收藏 所屬分類: Eclipse Plug-in & OSGIWTP(Web Tools Platform)

    評論

    # re: 【Eclipse插件開發】基于WTP開發自定義的JSP編輯器(二)   回復  更多評論   

    非常期待之后的內容
    2008-09-07 11:28 | srdrm

    # re: 【Eclipse插件開發】基于WTP開發自定義的JSP編輯器(二)   回復  更多評論   

    哥們,拜托你以后別在首頁上發表這么多亂七八糟的東西,看標題貌似你很深研究似的,害我們白白點進來。
    2008-09-08 17:33 | syied

    # re: 【Eclipse插件開發】基于WTP開發自定義的JSP編輯器(二)   回復  更多評論   

    @srdrm
    你要的內容補充完了
    2008-09-16 17:58 | zhuxing

    # re: 【Eclipse插件開發】基于WTP開發自定義的JSP編輯器(二):基于WTP StructuredTextEditor創建自己的JSPEditor  回復  更多評論   

    基于WTP開發自定義的JSP編輯器 一 呢?
    2008-09-25 19:34 | sclsch

    # re: 【Eclipse插件開發】基于WTP開發自定義的JSP編輯器(二):基于WTP StructuredTextEditor創建自己的JSPEditor  回復  更多評論   

    學習中,關注一下~
    2010-08-29 13:37 | 季義欽
    主站蜘蛛池模板: 免费高清av一区二区三区| 8888四色奇米在线观看免费看| 少妇高潮太爽了在线观看免费| 久久亚洲精品人成综合网| 永久免费A∨片在线观看| 久久久久亚洲AV无码专区网站| 国产午夜亚洲精品不卡电影| 国产成人涩涩涩视频在线观看免费| 亚洲日本VA午夜在线影院| 在线播放高清国语自产拍免费| 精品亚洲国产成人| 日本一区二区三区免费高清| 亚洲乱码在线卡一卡二卡新区| 国产va免费精品观看精品| 亚洲国产日韩综合久久精品| 最近最新中文字幕完整版免费高清 | 国产国拍精品亚洲AV片| 二区久久国产乱子伦免费精品| 亚洲啪啪综合AV一区| 午夜免费福利视频| 亚洲天堂福利视频| 免费看又爽又黄禁片视频1000| 国产尤物在线视精品在亚洲| 亚洲中文久久精品无码| 91成人在线免费观看| 伊人久久五月丁香综合中文亚洲| 小小影视日本动漫观看免费| 四虎一区二区成人免费影院网址| 伊人久久亚洲综合| 6080午夜一级毛片免费看6080夜福利 | 羞羞视频免费网站在线看| 国产精品亚洲精品日韩已满| 67pao强力打造国产免费| 日韩国产欧美亚洲v片| 亚洲一区二区女搞男| 在线免费观看你懂的| 亚洲大码熟女在线观看| 亚洲日韩激情无码一区| 麻豆高清免费国产一区| 久久精品国产亚洲av瑜伽| 亚洲AV无码成人网站久久精品大 |