2010-11-04 25 views
5

Ceci est une question spécifiquement sur le développement d'un plugin pour la plate-forme Eclipse:Comment créer une extension de plugin Eclipse qui affiche différents éléments de menu contextuel lorsque l'utilisateur clique sur un marqueur?

Je veux ajouter un élément de menu dans le menu par défaut qui apparaît quand un clic droit sur une sorte de IMarker (tous les marqueurs seraient un bon début).

J'ai eu un certain succès avec la mise en œuvre IMarkerResolution et faisant référence dans mon plugin.xml

<extension point="org.eclipse.ui.ide.markerResolution"> 
<markerResolutionGenerator 
    markerType="my.stuff.mymarker" 
    class="my.stuff.MyResolutionGenerator"> 
</markerResolutionGenerator> 
</extension> 

mais au lieu d'accéder à mon code par l'éclipse fonctionnalité de solution rapide, je veux ajouter mon propre texte de menu au lieu de "solutions rapides" et ne pas avoir à afficher l'action à côté des options de réparation rapide. Etre capable d'exécuter une action en (double) cliquant sur un marqueur serait également très utile. J'utilise eclipse 3.5.2 pour mon projet actuel. J'utilise eclipse 3.5.2.

Merci d'avance!

Mise à jour J'ai résolu ceci:

<extension point="org.eclipse.ui.menus"> 
<menuContribution 
    class="my.stuff.MarkerContributionFactory" 
    locationURI="popup:#AbstractTextEditorRulerContext?after=additions"> 
    <dynamic 
     class="my.stuff.MarkerMenuContribution" 
     id="my.stuff.MarkerMenuContribution"> 
    </dynamic> 
</menuContribution> 
</extension> 

public class MarkerContributionFactory extends ExtensionContributionFactory{ 

@Override 
public void createContributionItems(IServiceLocator serviceLocator, IContributionRoot additions){ 
    ITextEditor editor = (ITextEditor) 
     PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart(); 

    additions.addContributionItem(new MarkerMenuContribution(editor), null); 
} 
} 

public class MarkerMenuContribution extends ContributionItem{ 

private ITextEditor editor; 
private IVerticalRulerInfo rulerInfo; 
private List<IMarker> markers; 

public MarkerMenuContribution(ITextEditor editor){ 
    this.editor = editor; 
    this.rulerInfo = getRulerInfo(); 
    this.markers = getMarkers(); 
} 

private IVerticalRulerInfo getRulerInfo(){ 
    return (IVerticalRulerInfo) editor.getAdapter(IVerticalRulerInfo.class); 
} 

private List<IMarker> getMarkers(){ 
    List<IMarker> clickedOnMarkers = new ArrayList<IMarker>(); 
    for (IMarker marker : getAllMarkers()){ 
     if (markerHasBeenClicked(marker)){ 
      clickedOnMarkers.add(marker); 
     } 
    } 

    return clickedOnMarkers; 
} 

//Determine whether the marker has been clicked using the ruler's mouse listener 
private boolean markerHasBeenClicked(IMarker marker){ 
    return (marker.getAttribute(IMarker.LINE_NUMBER, 0)) == (rulerInfo.getLineOfLastMouseButtonActivity() + 1); 
} 

//Get all My Markers for this source file 
private IMarker[] getAllMarkers(){ 
    return ((FileEditorInput) editor.getEditorInput()).getFile() 
     .findMarkers("defined.in.plugin.xml.mymarker", true, IResource.DEPTH_ZERO); 
} 

@Override 
//Create a menu item for each marker on the line clicked on 
public void fill(Menu menu, int index){ 
    for (final IMarker marker : markers){ 
     MenuItem menuItem = new MenuItem(menu, SWT.CHECK, index); 
     menuItem.setText(marker.getAttribute(IMarker.MESSAGE, "")); 
     menuItem.addSelectionListener(createDynamicSelectionListener(marker)); 
    } 
} 

//Action to be performed when clicking on the menu item is defined here 
private SelectionAdapter createDynamicSelectionListener(final IMarker marker){ 
    return new SelectionAdapter(){ 
     public void widgetSelected(SelectionEvent e){ 
      System.out.println(marker.getAttribute(IMarker.MESSAGE, "")); 
     } 
    }; 
} 
} 

Répondre

4

vous devriez prendre le tutoriel à http://www.eclipse.org/articles/article.php?file=Article-action-contribution/index.html. C'est un bon article sur les choses de l'interface utilisateur de base.

ci-dessous vous permettent de définir une action de menu contextuel si vous cliquez sur la règle:

<extension 
     point="org.eclipse.ui.popupMenus"> 
     <viewerContribution 
      targetID="#CompilationUnitRulerContext" 
      id="Q4098270.contribution1"> 
        <menu 
       label="New Submenu" 
       path="additions" 
       id="Q4098270.menu1"> 
      <separator 
        name="group1"> 
      </separator> 
     </menu> 
     <action 
       label="New Action" 
       class="q4098270.popup.actions.NewAction" 
       menubarPath="Q4098270.menu1/group1" 
       id="Q4098270.newAction"> 
     </action> 
     </viewerContribution> 
    </extension> 

problème et todo que j'ai actuellement pas de temps pour que ce ne soit pas affiché uniquement pour les marqueurs, mais toutes choses sur règle.

Explication: Dans le menu Éclipse, les contributions sont elles-mêmes des points d'extension. Donc, si vous faites un clic droit pour voir le menu contextuel, le système vérifie tous les implémenteurs du point d'extension et vérifie ceux qui s'appliquent à l'objet ou à la vue.

Quelques conseils pour l'avenir

Depuis la plate-forme Eclipse est loin d'être facile à utiliser documenté un, la chasse des points d'extension appropriés est le plus complexe pour autant que je connaisse. Je commence toujours à partir de solutions existantes dans la plate-forme elle-même. Alors installez JADclipse, et commencez à chercher les textes affichés. Par exemple, recherchez le texte "Quick fix" dans le dossier plugins. Vous trouverez un fichier de propriétés. Vous voyez la clé de la propriété, puis recherchez la classe ou plugin.xml dans laquelle il se trouve. Ensuite, vous verrez un exemple vivant de votre problème. Cela fonctionne toujours, et même mieux que Google :)

+0

Merci pour votre aide, je tournais en rond sur google depuis un moment là – Matt

+3

Salut, peut-être utile dans ce contexte est également Plugin Spy (Ctrl + Alt + F1) ou Plugin Menu Spy (Ctrl + Alt + F2). En utilisant le plugin spy, vous pouvez trouver les classes et les plugins contributeurs dans la vue ou l'éditeur qui a le focus. Lorsque vous utilisez le menu plugin espionner votre curseur de souris se transforme en une loupe que vous pouvez cliquer sur les menus et les contributions d'action pour voir plus d'informations (y compris les ID ou URI d'emplacement) à leur sujet. – zardosht

+2

pour moi le Spy de sélection de plug-in s'ouvre avec Alt + Maj + F1? – eactor