Ações Reatingíveis

É comum para as exibições e editores de um plug-in implementar ações semanticamente semelhantes a ações existentes do workbench, como recortar/copiar/colar da área de transferência, atualizar visualização ou propriedades.  O menu pop-up das exibições e editores poderá tornar-se bem confuso se cada visualização ou editor tiver que definir ações exclusivas para essas operações e incluí-las em seus menus. 

Para resolver esse problema, o workbench define ações reatingíveis (também chamadas de globais) que podem ser manipuladas por qualquer visualização ou editor.  Quando uma visualização ou editor estiver ativo, sua rotina de tratamento será executada quando o usuário escolher a ação no menu ou na barra de ferramentas do workbench.  Isso permite que as exibições e editores compartilhem o espaço de menu do workbench para ações semanticamente semelhantes.

IWorkbenchActionConstants documenta todas as ações do workbench e indica as ações reatingíveis como globais.  Por exemplo, a seguir, está a definição da ação Properties.

public static final String PROPERTIES = "properties"; // Ação global. 

A tabela a seguir resume algumas das ações reatingíveis mais comuns que foram implementadas pelas exibições e editores:

  Menu Arquivo Menu Editar Menu Navegar Menu Projeto
exibições mover
renomear
atualizar
propriedades
  entrar
ir para recurso
sincronizar com editor
voltar
avançar
para cima
próximo
anterior
abrir
fechar
compilar
recompilar
editores reverter
imprimir
localizar    
exibições e editores   recortar
copiar
colar
excluir
selecionar tudo
desfazer
refazer
   

As ações reatingíveis são criadas utilizando RetargetAction.  O fragmento a seguir é de WorkbenchActionBuilder.

 propertiesAction = createGlobalAction(IWorkbenchActionConstants.PROPERTIES, "file", false); 

O método createGlobalAction nos mostra exatamente como criar uma RetargetAction.

private RetargetAction createGlobalAction(String id, String actionDefPrefix, boolean labelRetarget) {
	RetargetAction action;
	if (labelRetarget) {
		action = new LabelRetargetAction(id, WorkbenchMessages.getString("Workbench." + id));
	}
	else {
		action = new RetargetAction(id, WorkbenchMessages.getString("Workbench." + id));
	}
	...
	return action;
}

Ao criar uma ação reatingível, o workbench atribui o ID para a ação e o rótulo padrão.  Observe que há dois estilos de ações reatingíveis.  RetargetAction simplesmente permite que uma visualização ou editor implementem novamente a ação.  LabelRetargetAction também permite que as exibições e editores reinicializem o rótulo da ação.   Isso é útil para tornar o rótulo do menu mais específico, como rotular novamente uma ação Desfazer como Desfazer Digitação.  

Agora sabemos como as ações reatingíveis são definidas pelo workbench.  Em seguida, veremos como sua visualização ou editor pode fornecer uma implementação para uma ação reatingível.  Isso é feito definindo-se uma rotina de tratamento de ação global.