O conjunto de ações da ferramenta Leia-me também define ações reatingíveis. A ação permanece visível enquanto o conjunto de ações de Leia-me estiver visível, mas só será ativada quando uma visualização ou editor que implementar a ação estiver ativo. Ao utilizar conjuntos de ações para definir ações reatingíveis, as ações serão criadas na marcação do conjunto de ações, em vez de no código. O seguinte exemplo é da definição do conjunto de ações da ferramenta Leia-me:
<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 ações reatingíveis são especificadas utilizando o atributo retarget="true". Isso fará com que uma RetargetAction seja criada no conjunto de ações. Observe que as ações reatingíveis não especificam uma classe de implementação, pois cabe a cada exibição ou editor no plug-in configurar uma rotina de tratamento que implemente cada ação. Se allowLabelUpdate for true, uma LabelRetargetAction será criada no lugar.
As ações reatingíveis ficarão visíveis no menu da janela quando o conjunto de ações de Leia-me estiver visível. No entanto, não serão ativadas se a exibição de outline ou o editor da ferramenta Leia-me não estiver ativo.
O que o editor e a exibição precisam fazer? Novamente, o lado do cliente é semelhante a registrar uma rotina de tratamento do workbench ou uma ação reatingível do editor. O ID da ação especificado na marcação deve ser utilizado ao registrar uma rotina de tratamento de ação global.
O ReadmeEditorActionBarContributor cuida disso para o editor. Primeiro, ele define as rotinas de tratamento das ações.
public ReadmeEditorActionBarContributor() { ... handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5")); ... }
As rotinas de tratamento são registradas ao mesmo tempo em que as rotinas de tratamento das ações reatingíveis do editor.
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 contribuidores da barra de ações são compartilhados entre instâncias diferentes do mesmo editor. Isso significa que as rotinas de tratamento deverão ser notificadas se o editor ativo do ReadmeEditorActionBarContributor for alterado.
public void setActiveEditor(IEditorPart editor) { ... handler4.setActiveEditor(editor); handler5.setActiveEditor(editor); ... }
Isso é tudo sobre o editor. Deveremos ver essas ações ativadas quando o editor estiver ativado.
Observe que o rótulo da primeira ação reatingível ("Editor Action 4") não foi utilizado, pois a marcação XML do conjunto de ações não definiu allowLabelUpdate.
A ReadmeContentOutlinePage define suas rotinas de tratamento no mesmo local em que definiu as rotinas de tratamento das ações reatingíveis do editor:
public void createControl(Composite parent) { ... action = new OutlineAction(MessageUtil.getString("Outline_Action4")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_RETARGET4, action); action = new OutlineAction(MessageUtil.getString("Outline_Action5")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action5")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.ACTION_SET_LABELRETARGET5, action); }
Deveremos ver sua ação com um novo rótulo quando o descritor de conteúdo estiver ativo.