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