2010-11-04 10 views
5

Ésta es una pregunta específicamente sobre el desarrollo de plugins para la plataforma Eclipse:¿Cómo hago una extensión del complemento Eclipse que muestra diferentes elementos del menú contextual cuando el usuario hace clic en un marcador?

Quiero añadir un elemento de menú al menú por defecto que aparece al hacer clic derecho en una especie de IMarker (todos los marcadores serían un buen comienzo).

que han tenido cierto éxito con la implementación de IMarkerResolution y refiriéndose a ella en mi plugin.xml

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

pero en lugar de acceder a mi código a través de la funcionalidad solución rápida eclipse, quiero añadir mi propio texto del menú en vez de 'soluciones rápidas' y no tiene que mostrar la acción junto con las opciones de solución rápida. Ser capaz de ejecutar una acción haciendo doble clic en un marcador también sería muy útil.

Estoy usando eclipse 3.5.2 para mi proyecto actual.

¡Gracias de antemano!

actualización he resuelto esto:

<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, "")); 
     } 
    }; 
} 
} 

Respuesta

4

usted debe tomar el tutorial en http://www.eclipse.org/articles/article.php?file=Article-action-contribution/index.html. Es un buen artículo sobre cosas básicas de UI.

La siguiente le permiten definir una acción del menú emergente si hace clic en la regla:

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

problema y Todo lo que no tengo tiempo actualmente es que no sólo se muestra para los marcadores, pero todas las cosas en regla.

Explicación: En el menú de eclipse, las contribuciones mismas son puntos de extensión. Por lo tanto, si hace clic con el botón derecho para ver el menú emergente, el sistema verificará todos los implementadores del punto de extensión y verificará si son aplicables para el objeto o vista dados.

Algunos consejos para la futura

Desde la plataforma Eclipse está lejos de ser fácil de usar documentado una, cazar puntos de extensión adecuados es la más compleja en lo que he experimentado. Siempre comienzo desde las soluciones existentes en la plataforma misma. Por lo tanto, instale JADclipse, y comience a buscar los textos que se muestran. Por ejemplo, busque el texto "Solución rápida" en la carpeta de complementos. Encontrará un archivo de propiedad. Usted ve la clave de la propiedad, luego busca la clase o el plugin.xml en el que se encuentra. Luego verá un ejemplo viviente de su problema. Esto siempre funciona, e incluso mejor que Google :)

+0

Gracias por su ayuda, estaba dando vueltas en círculos en Google por un tiempo allí – Matt

+3

Hola, quizás útil en este contexto también es Plugin Spy (Ctrl + Alt + F1) o Complemento Menú Espía (Ctrl + Alt + F2). Al utilizar el complemento de espionaje, puede encontrar las clases y los complementos de contribución a la vista o el editor que tiene el foco. Cuando utiliza el menú del complemento, el cursor del mouse se convierte en una lupa que puede hacer clic en los menús y las contribuciones de la acción para ver más información (incluidos ID o URI de ubicación) sobre ellos. – zardosht

+2

para mí el Plug-in Selection Spy se abre con Alt + Shift + F1? – eactor

Cuestiones relacionadas