org.eclipse.ui.popupMenus

O ponto de extensão org.eclipse.ui.popupMenus permite a um plug-in contribuir para os menus emergentes de outras vistas e editores.

Pode contribuir com uma acção para um menu emergente específico pelo respectivo ID (viewerContribution) ou associando-o a determinado tipo de objecto (objectContribution). 

A ferramenta readme define ambos. Vamos abordar o contributo do objecto primeiro.   

<extension point = "org.eclipse.ui.popupMenus">
     <objectContribution
   id="org.eclipse.ui.examples.readmetool"
        objectClass="org.eclipse.core.resources.IFile"
	    nameFilter="*.readme">
	    <action id="org.eclipse.ui.examples.readmetool.action1"
	       label="%PopupMenus.action"
	       icon="icons/ctool16/openbrwsr.png"
	      menubarPath="additions"
	       helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
	       class="org.eclipse.ui.examples.readmetool.PopupMenuActionDelegate"	
           definitionId="org.eclipse.ui.examples.readmetool.action1"
	       enablesFor="1">
	   </action>
	 </objectContribution>
 	 ...

Contributo de objectos

A acção "Mostrar Acção Readme" é contributo da classe de objectos IFile. Significa isto que qualquer vista que contenha objectos IFile mostrará o contributo se estiverem seleccionados objectos IFile. Vemos que os critérios de selecção estão ainda mais limitados por um filtro de nomes (nameFilter="*.readme") e para selecções únicas (enablesFor="1"). Como vimos antes, o registo deste menu não executa código algum do nosso plug-in até que a opção de menu seja realmente seleccionada.

Quando a opção de menu for seleccionada, a área de trabalho executará a classe especificada.   Dado que o menu emergente é declarado como objectContribution, a classe facultada deve implementar IObjectActionDelegate

A acção é implementada em PopupMenuActionDelegate.  

public void run(IAction action) {
      MessageDialog.openInformation(
         this.part.getSite().getShell(),
         "Exemplo Readme ",
         "Acção de Menu Emergente executada");
   }

Podemos ver o contributo do menu emergente quando seleccionamos um ficheiro readme no navegador de recursos.

Contributo de visualizador

Um contributo de visualizador utiliza-se para contribuir para o menu emergente de uma vista ou um editor específico através do respectivo ID. De seguida é apresentado o contributo de visualizador da ferramenta readme:

      ...
      <viewerContribution
        id="org.eclipse.ui.examples.readmetool2"
        targetID="org.eclipse.ui.examples.readmetool.outline">
	    <action id="org.eclipse.ui.examples.readmetool.action1"
	       label="%PopupMenus.action"
	       icon="icons/ctool16/openbrwsr.png"
	      menubarPath="additions"
	       helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context"
           definitionId="org.eclipse.ui.examples.readmetool.action1"
	       class="org.eclipse.ui.examples.readmetool.ViewActionDelegate">	
	   </action>
       </viewerContribution>
</extension>
Nota:  O termo viewerContribution é algo enganador, já que não tem nada a ver com visualizadores JFace. Um termo melhor seria popupMenuContribution (contributo de menu emergente).

Quando a extensão for viewerContribution, a classe facultada deve implementar a interface IEditorActionDelegate ou IViewActionDelegate, consoante a acção for contributo para menu emergente de editor ou de vista.  

O targetID (ID destino) especifica a vista cujo menu emergente será alterado.  Neste caso, adicionamos uma acção a uma das vistas da ferramenta readme, o destacador.  A própria acção é semelhante a outras que já vimos.  Especificamos id, definitionId, etiqueta e ícone da acção e o caminho dentro da janela emergente para o nosso contributo. A acção será mostrada somente no menu emergente da vista de destaque do readme.

Nota: o definitionId permite que a acção seja ligada a um comando criado pela extensão org.eclipse.ui.commands, que pode ser utilizada para associações de teclas. Consulte Comandos.

As interfaces que devem contribuir com um viewerContribution para o ponto de extensão popupMenus são as mesmas que as necessárias pelos pontos de extensão viewActions e editorActions. Se quiser contribuir com a mesma acção para o menu emergente e o menu local de uma vista ou um editor, poderá usar a mesma classe para ambas as extensões.