O conjunto de acções da ferramenta readme também define acções redestináveis. a acção fica visível enquanto o conjunto de acções readme estiver visível, mas só fica activa quando uma vista ou um editor que implemente a acção ficar activo(a). Ao utilizar conjuntos de acções para definir acções redestináveis, as acções são criadas na marcação do conjunto de acções e não no código. O seguinte é oriundo da definição do conjunto de acções da ferramenta readme:
<extension point = "org.eclipse.ui.actionSets"> <actionSet id="org_eclipse_ui_examples_readmetool_actionSet" label="%ActionSet.name" visible="true"> ... <action id="org_eclipse_ui_examples_readmetool_readmeRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRetargetAction.label" tooltip="%ReadmeRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true"> </action> <action id="org_eclipse_ui_examples_readmetool_readmeRelabelRetargetAction" menubarPath="window/org_eclipse_ui_examples_readmetool/slot1" toolbarPath="readme" label="%ReadmeRelabelRetargetAction.label" tooltip="%ReadmeRelabelRetargetAction.tooltip" helpContextId="org.eclipse.ui.examples.readmetool.open_browser_action_context" icon="icons/ctool16/openbrwsr.png" retarget="true" allowLabelUpdate="true"> </action> ...
As acções redestináveis são especificadas com o atributo retarget="true". Isto causará a criação de uma RetargetAction no conjunto de acções. Repare que as acções redestináveis não especificam uma classe de implementação dado que compete a cada vista ou editor no plug-in configurar uma rotina de tratamento que implemente cada acção. Se allowLabelUpdate for verdadeiro (true) será criada LabelRetargetAction .
As acções redestináveis ficarão visíveis no menu da janela quando o conjunto de acções readme fica visível. Todavia, não ficarão visíveis se o editor ou a vista de destaque da ferramenta readme não estiver activa(o).
Qual a relação do editor e da vista? Mais uma vez, o lado do cliente é semelhante ao registo de uma rotina de tratamento para a área de trabalho ou uma acção redestinável do editor. O ID da acção especificado na marcação deve ser usado quando se regista uma rotina de tratamento de acção global.
O ReadmeEditorActionBarContributor encarrega-se disto para o editor. Primeiro, define as rotinas de tratamento para as acções.
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Acção_Editor4")); handler5 = new EditorAction(MessageUtil.getString("Acção_Editor5")); handler5.setToolTipText(MessageUtil.getString("Acção_Editor_Readme5")); ... }
As rotinas de tratamento são registadas ao mesmo tempo que as rotinas de tratamento para as acções redestináveis do editor o foram.
public void init(IActionBars bars, IWorkbenchPage page) { ... bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4); bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5); ... }
Lembre-se que os contribuintes de barras de acções são partilhados entre diferentes instâncias do mesmo editor. Significa isto que as rotinas de tratamento devem ser notificadas se o editor activo do ReadmeEditorActionBarContributor for alterado.
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
E já está no que respeita ao editor. Devemos ver estas acções activadas quando o editor o for também.
Repare que a etiqueta para a primeira acção redestinável ("Acção de Editor 4") não foi usada dado que a marcação XML do conjunto de acções não definiu allowLabelUpdate.
A ReadmeContentOutlinePage define as suas rotinas de tratamento no mesmo lugar que definiu rotinas de tratamento para as acções redestináveis do editor:
public void createControl(Composite parent) { ... action = new OutlineAction(MessageUtil.getString("Acção_Destaque4")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_RETARGET4, action); action = new OutlineAction(MessageUtil.getString("Acção_Destaque5")); action.setToolTipText(MessageUtil.getString("Acção_Destaque_Readme5")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_LABELRETARGET5, action); }
Devemos ver a sua acção reetiquetada quando o destacador de conteúdos estiver activo.