| Profil de Feeling路漫漫其修远兮,吾将上下而求索PhotosBlogListes | Aide |
|
16/06/2006 扩展Eclipse视图弹出菜单(二)上一篇文章我们知道了Eclipse弹出菜单的基本用法。其实Eclipse的弹出菜单可以用来做很多文章,简单一点的根据文件类别,我们可以进行不同的文件操作,比如Ant的build.xml我们可以用来build,Java文件我们可以用Java Editor打开,这些基于文件类型的操作我们都可以很容易的实现。但是还有一种情况,如果文件类型一样,我们想进行不同的操作,该怎么实现呢?实际上这样的应用很多,比如同样是Java文件,含有main方法的Java文件有Run和Debug的选项,其它的都没有。还有现在的框架都是基于XML文件进行配置的,如果一个项目使用了多个框架,我们怎么根据不同的XML文件进行框架的区分呢?答案就是enablement的test。 <!ELEMENT test EMPTY> 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.
<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>
id - unique identifier for the property tester 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; } }
<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,我们就能够知道到底这是哪一种框架的配置文件了。 Commentaires (1)Pour ajouter un commentaire, connectez-vous avec votre identifiant Windows Live ID (si vous utilisez Messenger ou Xbox LIVE, vous avez un identifiant Windows Live ID). Connectez-vous Vous n'avez pas d'identifiant Windows Live ID ? Inscrivez-vous
RétroliensL'URL de rétrolien de ce billet est : http://cnfree2000.spaces.live.com/blog/cns!6201144F025F9D77!736.trak Blogs Web qui font référence à ce billet
|
|
|