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