Acções redestináveis

É comum que as vistas e editores de um plug-in implementem acções que sejam semanticamente semelhantes a acções de área de trabalho existentes como, por exemplo, cortar/copiar/colar para a área de transição, renovação de vistas ou propriedades.  O menu emergente de vistas e editores pode ficar cheio de volumes se cada vista ou editor tiver de definir acções únicas para estas operações e incluí-las nos seus menus.  

Para obviar a este problema, a área de trabalho define acções redestináveis (também chamadas globais) que podem ser tratadas por qualquer vista ou editor.  Quando uma vista ou um editor está activo(a), a respectiva rotina de tratamento é executada quando o utilizador escolher a acção no menu ou na barra de ferramentas da área de trabalho.  Isto permite a vistas e editores partilharem espaço de menu de área de trabalho para acções semanticamente semelhantes.

As IWorkbenchActionConstants documentam todas as acções de área de trabalho e categorizam as acções redestináveis como globais.  Por exemplo, segue-se a definição da acção Properties.

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

A tabela seguinte resume algumas das acções redestináveis mais comuns que são implementadas por vistas e editores:

  Menu Ficheiro Menu Editar Menu Navegar Menu Projecto
vistas mover
rename
renovar
propriedades
  ir para
ir para o recurso
sincronizar com editor
retroceder
avançar
para cima
seguinte
anterior
abrir
fechar
construir
reconstruir
editores reverter
imprimir
localizar    
vistas e editores   cortar
copiar
colar
eliminar
seleccionar todos
anular
repetir
   

As acções redestináveis são criadas com RetargetAction. A porção de código seguinte é oriunda de WorkbenchActionBuilder.

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

O método createGlobalAction mostra-nos exactamente 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 acção redestinável, a área de trabalho atribui o ID da acção e a etiqueta predefinida.  Repare que há dois estilos de acções redestináveis.   RetargetAction permite simplesmente a uma vista ou um editor reimplementar uma acção.   LabelRetargetAction também permite a vistas e editores repor a etiqueta da acção.    Isto é útil para tornar mais específica a etiqueta do menu como, por exemplo, reetiquetar uma acção Anular como Anular Introdução.  

Agora sabemos como as acções redestináveis são definidas pela área de trabalho.  Veremos a seguir como a vista ou o editor pode facultar uma implementação para uma acção redestinável.   Tal realiza-se ao definir uma rotina de tratamento de acção global.