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

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

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

    posts - 1,  comments - 25,  trackbacks - 0

    上一篇文章我們知道了Eclipse彈出菜單的基本用法。其實Eclipse的彈出菜單可以用來做很多文章,簡單一點的根據文件類別,我們可以進行不同的文件操作,比如Ant的build.xml我們可以用來build,Java文件我們可以用Java Editor打開,這些基于文件類型的操作我們都可以很容易的實現。但是還有一種情況,如果文件類型一樣,我們想進行不同的操作,該怎么實現呢?實際上這樣的應用很多,比如同樣是Java文件,含有main方法的Java文件有Run和Debug的選項,其它的都沒有。還有現在的框架都是基于XML文件進行配置的,如果一個項目使用了多個框架,我們怎么根據不同的XML文件進行框架的區分呢?答案就是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文件它的右鍵彈出菜單包含一個額外的選項“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 >

    我們需要檢測在當前情況下是否需要顯示這個菜單項,使用擴展點 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正好對應test的property。

    至于檢測的邏輯我們在advancedpopupmenus.popup.actions.VisablePropertyTester中實現,這個類必須繼承自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。

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

    < 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 >

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

    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
    ;
        }
    }

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

    posted on 2008-08-12 15:26 Daniel 閱讀(1089) 評論(0)  編輯  收藏 所屬分類: Eclipse的相關
    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章分類

    文章檔案

    相冊

    搜索

    •  

    最新評論

    主站蜘蛛池模板: 男女猛烈xx00免费视频试看| 嫩草在线视频www免费观看| 亚洲国产成人久久精品软件| 一区二区三区免费在线观看| 日本免费xxxx色视频| 免费在线观看a级毛片| 亚洲福利在线视频| 国产精品无码亚洲一区二区三区| a级毛片毛片免费观看永久| 成年女人午夜毛片免费看| 国产综合精品久久亚洲| 亚洲伊人色欲综合网| 亚洲国产欧美日韩精品一区二区三区| 手机在线看永久av片免费| 国产偷v国产偷v亚洲高清| 亚洲av成人一区二区三区观看在线| 91视频免费观看高清观看完整| 久久久久亚洲AV无码专区网站| 国产A∨免费精品视频| 免费观看国产精品| 亚洲一区二区三区丝袜| 亚洲欧洲免费视频| 国产亚洲自拍一区| 99精品一区二区免费视频| 亚洲精品国产精品乱码不卡√| 中文字幕无码免费久久| 国产亚洲美日韩AV中文字幕无码成人| 中文字幕一区二区三区免费视频| 四虎影院永久免费观看| 99在线免费观看| 亚洲欧洲校园自拍都市| 2019中文字幕免费电影在线播放| 亚洲欧洲无码AV电影在线观看 | 59pao成国产成视频永久免费| 亚洲另类春色校园小说| 2020因为爱你带字幕免费观看全集| 亚洲va乱码一区二区三区| **实干一级毛片aa免费| 色偷偷尼玛图亚洲综合| 亚洲精品国产精品乱码在线观看| 永久免费av无码网站韩国毛片|