posts - 1,  comments - 25,  trackbacks - 0

          上一篇文章我們知道了Eclipse彈出菜單的基本用法。其實(shí)Eclipse的彈出菜單可以用來做很多文章,簡單一點(diǎn)的根據(jù)文件類別,我們可以進(jìn)行不同的文件操作,比如Ant的build.xml我們可以用來build,Java文件我們可以用Java Editor打開,這些基于文件類型的操作我們都可以很容易的實(shí)現(xiàn)。但是還有一種情況,如果文件類型一樣,我們想進(jìn)行不同的操作,該怎么實(shí)現(xiàn)呢?實(shí)際上這樣的應(yīng)用很多,比如同樣是Java文件,含有main方法的Java文件有Run和Debug的選項(xiàng),其它的都沒有。還有現(xiàn)在的框架都是基于XML文件進(jìn)行配置的,如果一個(gè)項(xiàng)目使用了多個(gè)框架,我們?cè)趺锤鶕?jù)不同的XML文件進(jìn)行框架的區(qū)分呢?答案就是enablement的test。

          <!ELEMENT test EMPTY>
          <!ATTLIST test
          property CDATA #REQUIRED
          args     CDATA #IMPLIED
          value    CDATA #IMPLIED>

          This element is used to evaluate the property state of the object in focus. The set of testable properties can be extended using the propery tester extension point. The test expression returns EvaluationResult.NOT_LOADED if teh property tester doing the actual testing isn't loaded yet.

          • property - the name of an object's property to test.
          • args - additional arguments passed to the property tester. Multiple arguments are seperated by commas. Each individual argument is converted into a Java base type using the same rules as defined for the value attribute of the test expression.
          • value - the expected value of the property. Can be omitted if the property is a boolean property. The test expression is supposed to return EvaluationResult.TRUE if the property matches the value and EvaluationResult.FALSE otherwise. The value attribute is converted into a Java base type using the following rules:
            • the string "true" is converted into Boolean.TRUE
            • the string "false" is converted into Boolean.FALSE
            • if the string contains a dot then the interpreter tries to convert the value into a Float object. If this fails the string is treated as a java.lang.String
            • if the string only consists of numbers then the interpreter converts the value in an Integer object.
            • in all other cases the string is treated as a java.lang.String
            • the conversion of the string into a Boolean, Float, or Integer can be suppressed by surrounding the string with single quotes. For example, the attribute value="'true'" is converted into the string "true"


          比如我們要讓含有main方法的Java文件它的右鍵彈出菜單包含一個(gè)額外的選項(xiàng)“This is main class”,需要編寫如下的Plugin.xml:

          < plugin >
             
          < extension
                   
          point ="org.eclipse.ui.popupMenus" >

                
          < objectContribution
                  
          id ="Advanced.PopupMenus"

                  objectClass
          ="java.lang.Object" >
               
          < action  id ="Advanced.PopupMenus.Action"
                  label
          ="AdvancedPopupMenus"
                  style
          ="pulldown"
                  menubarPath
          ="additions"
                  class
          ="advancedpopupmenus.popup.actions.AdvancedPopupMenusAction"  
                  enablesFor
          ="+" >

               
          </ action >
               
          < enablement >
                    
          < test  property ="advancedpopupmenus.popup.visable" />
               
          </ enablement >   
               
          </ objectContribution >

             
          </ extension >
             
          < extension  point ="org.eclipse.core.expressions.propertyTesters" >
             
          < propertyTester
             
          namespace ="advancedpopupmenus.popup"

             properties
          ="visable"
             type
          ="java.lang.Object"
             class
          ="advancedpopupmenus.popup.actions.VisablePropertyTester"
             id
          ="advancedpopupmenus.popup.propertyTesters.visable" >   
             
          </ propertyTester >
                
             
          </ extension >

          </ plugin >

          我們需要檢測在當(dāng)前情況下是否需要顯示這個(gè)菜單項(xiàng),使用擴(kuò)展點(diǎn) org.eclipse.core.expressions.propertyTesters
          <!ELEMENT propertyTester EMPTY>
          <!ATTLIST propertyTester
          id         CDATA #REQUIRED
          type       CDATA #REQUIRED
          namespace  CDATA #REQUIRED
          properties CDATA #REQUIRED
          class      CDATA #REQUIRED>

          id - unique identifier for the property tester
          type - the type to be extended by this property tester
          namespace - a unique id determining the name space the properties are added to
          properties - a comma separated list of properties provided by this property tester
          class - the name of the class that implements the testing methods. The class must be public and extend org.eclipse.core.expressions.PropertyTester with a public 0-argument constructor. 

          這里只須注意
          propertyTester的namespace和properties正好對(duì)應(yīng)test的property。

          至于檢測的邏輯我們?cè)赼dvancedpopupmenus.popup.actions.VisablePropertyTester中實(shí)現(xiàn),這個(gè)類必須繼承自org.eclipse.core.expressions.PropertyTester

          package  advancedpopupmenus.popup.actions;

          import
           org.eclipse.core.expressions.PropertyTester;
          import
           org.eclipse.jdt.core.IMethod;
          import
           org.eclipse.jdt.core.IType;
          import
           org.eclipse.jdt.core.JavaModelException;
          import
           org.eclipse.jdt.internal.core.CompilationUnit;

          public   class  VisablePropertyTester  extends
           PropertyTester
          {
              
          public   boolean
           test( Object receiver, String property, Object[] args,
                      Object expectedValue )
              {
                  
          if  (  ! ( receiver  instanceof
           CompilationUnit ) )
                      
          return   false
          ;
                  CompilationUnit unit 
          =
           (CompilationUnit) receiver;
                  
          try

                  {
                      IType[] types 
          =  unit.getTypes( );
                      
          if  ( types  ==   null
           )
                          
          return   false
          ;
                      
          for  (  int  i  =   0 ; i  <  types.length; i ++
           )
                      {
                          IMethod[] methods 
          =
           types[i].getMethods( );
                          
          if  ( methods  ==   null
           )
                              
          return   false
          ;
                          
          for  (  int  j  =   0 ; j  <  methods.length; j ++
           )
                          {
                              
          if
           ( methods[j].isMainMethod( ) )
                                  
          return   true
          ;
                          }
                      }
                  }
                  
          catch
           ( JavaModelException e )
                  {
                      e.printStackTrace( );
                  }
                  
          return   false
          ;
              }
          }

          我們只要判斷接受的Java文件中是否含有main方法,如果有,則返回True,沒有則返回False。

          如果我們是要接受一個(gè)Web開發(fā)的配置文件,我們可以這樣寫:

          < plugin >
             
          < extension
                   
          point ="org.eclipse.ui.popupMenus" >

                
          < objectContribution
                  
          id ="Advanced.PopupMenus"

                  objectClass
          ="org.eclipse.core.resources.IFile"
                  nameFilter
          ="*.xml" >    
                  
          < action  id ="Advanced.PopupMenus.Action"

                     label
          ="This is web xml"
                     style
          ="pulldown"
                     menubarPath
          ="additions"
                     class
          ="advancedpopupmenus.popup.actions.AdvancedPopupMenusAction"     
                     enablesFor
          ="+" >

                  
          </ action >
                  
          < enablement >
                       
          < test  property ="advancedpopupmenus.popup.visable" />
                  
          </ enablement >   
               
          </ objectContribution >

             
          </ extension >
             
          < extension  point ="org.eclipse.core.expressions.propertyTesters" >
                
          < propertyTester
                      
          namespace ="advancedpopupmenus.popup"

                      properties
          ="visable"
                      type
          ="org.eclipse.core.resources.IFile"
                      class
          ="advancedpopupmenus.popup.actions.VisablePropertyTester"
                      id
          ="advancedpopupmenus.popup.propertyTesters.visable" >         
                
          </ propertyTester >
                
             
          </ extension >

          </ plugin >

          注意和上一個(gè)例子不同的地方,objectClass,nameFileter和type(在上一個(gè)例子中,我們也可以使用objectClass="org.eclipse.core.resources.IFile" nameFilter ="*.java" ),相應(yīng)的我們的VisablePropertyTester類也要做一些改動(dòng):

          package  advancedpopupmenus.popup.actions;

          import
           javax.xml.parsers.DocumentBuilder;
          import
           javax.xml.parsers.DocumentBuilderFactory;
          import
           org.eclipse.core.expressions.PropertyTester;
          import
           org.eclipse.core.resources.IFile;
          import
           org.w3c.dom.Document;
          import
           org.w3c.dom.DocumentType;

          public   class  VisablePropertyTester  extends
           PropertyTester
          {
              
          public   boolean
           test( Object receiver, String property, Object[] args,
                      Object expectedValue )
              {
                  
          if  (  ! ( receiver  instanceof
           IFile ) )
                      
          return   false
          ;
                  IFile xml 
          =
           (IFile) receiver;
                  
          try

                  {
                      DocumentBuilderFactory dbf 
          =  DocumentBuilderFactory.newInstance( );
                      DocumentBuilder db 
          =
           dbf.newDocumentBuilder( );
                      Document doc 
          =
           db.parse( xml.getContents( ) );
                      DocumentType type 
          =
           doc.getDoctype( );
                      
          if (type.getSystemId( ).equalsIgnoreCase(  " http://java.sun.com/j2ee/dtds/web-app_2_2.dtd "  )) return   true
          ;
                  }
                  
          catch
           ( Exception e )
                  {
                      e.printStackTrace( );
                  }        
                  
          return   false
          ;
              }
          }

          這樣根據(jù)不同的xml SystemID,我們就能夠知道到底這是哪一種框架的配置文件了。

          posted on 2008-08-12 15:26 Daniel 閱讀(1090) 評(píng)論(0)  編輯  收藏 所屬分類: Eclipse的相關(guān)
          <2025年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章分類

          文章檔案

          相冊(cè)

          搜索

          •  

          最新評(píng)論

          主站蜘蛛池模板: 专栏| 措美县| 四川省| 广东省| 平凉市| 锦州市| 平山县| 富宁县| 竹山县| 济南市| 吴桥县| 上饶市| 威宁| 长乐市| 宜都市| 蒙城县| 黄陵县| 海南省| 阳西县| 寿宁县| 平定县| 舟曲县| 安丘市| 浦江县| 东港市| 黄龙县| 顺昌县| 大埔区| 年辖:市辖区| 邢台县| 胶州市| 庄浪县| 晋城| 咸宁市| 凉城县| 革吉县| 大连市| 瑞金市| 通山县| 仁寿县| 米脂县|