Akcje o zmiennym celu definiowane w zbiorze akcji

Zbiór akcji narzędzia readme definiuje także akcje o zmiennym celu.  Akcja pozostaje widoczna tak długo, jak długo widoczny jest zbiór akcji, ale jest włączona tylko wtedy, gdy implementujący akcję widok lub edytor jest aktywny.  Akcje o zmiennym celu definiowane przy użyciu zbiorów akcji są przeważnie tworzone w kodzie znaczników zbioru akcji, a nie w kodzie programu.  Poniższy fragment pochodzi z definicji zbioru akcji narzędzia 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>
...

Akcje o zmiennym celu określa się przy użyciu atrybutu retarget="true".  Powoduje to utworzenie klasy RetargetAction w zbiorze akcji.  Należy zwrócić uwagę, że akcje o zmiennym celu nie określają klasy implementującej (class), ponieważ to do każdego widoku lub edytora w module dodatkowym należy skonfigurowanie procedury obsługi, która zaimplementuje każdą akcję.  Natomiast gdy atrybut allowLabelUpdate ma wartość true, zostanie utworzone wystąpienie klasy LabelRetargetAction.

Akcje o zmiennym celu będą widoczne w menu okna, gdy będzie widoczny zbiór akcji narzędzia readme.  Będą one jednak włączone tylko wtedy, gdy edytor lub widok schematu narzędzia readme będzie aktywny.

Menu edytora plików Readme z dwoma zaciemnionymi pozycjami i jedną aktywną

 

Co musi zrobić edytor lub widok?  I w tym wypadku kod po stronie klienta jest podobny do kodu rejestrowania procedury obsługi dla akcji o zmiennym celu środowiska roboczego lub edytora.  Identyfikator akcji określony w kodzie znaczników musi być używany podczas rejestrowania globalnej procedury obsługi akcji.

W przypadku edytora zajmuje się tym klasa ReadmeEditorActionBarContributor. Najpierw definiuje ona procedury obsługi dla akcji.

   public ReadmeEditorActionBarContributor() {
	...
	handler4 = new EditorAction(MessageUtil.getString("Editor_Action4")); 
	handler5 = new EditorAction(MessageUtil.getString("Editor_Action5")); 
	handler5.setToolTipText(MessageUtil.getString("Readme_Editor_Action5"));
	...
}

Procedury obsługi są rejestrowane jednocześnie z procedurami obsługi dla akcji o zmiennym celu edytora.

public void init(IActionBars bars, IWorkbenchPage page) {
	...
	bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_RETARGET4, handler4);
	bars.setGlobalActionHandler(IReadmeConstants.ACTION_SET_LABELRETARGET5, handler5);
	...
}

Należy pamiętać, że dostarczyciele paska akcji są współużytkowani przez różne instancje tego samego edytora.  Oznacza to, że procedury obsługi muszą być powiadamiane, gdy zmieni się aktywny edytor dla klasy ReadmeEditorActionBarContributor.

public void setActiveEditor(IEditorPart editor) {
	...
	handler4.setActiveEditor(editor);
	handler5.setActiveEditor(editor);
	...
}

To tyle, jeśli chodzi o edytor.  Po aktywowaniu edytora te akcje powinny być włączone.

Menu edytora plików Readme z włączonymi akcjami 

Warto zauważyć, że etykieta pierwszej akcji o zmiennym celu ("Editor Action 4") nie została użyta, ponieważ w kodzie znaczników XML zbioru akcji nie określono atrybutu allowLabelUpdate.

Klasa ReadmeContentOutlinePage definiuje swoje procedury obsługi w tym samym miejscu, w którym definiowała procedury obsługi dla akcji o zmiennym celu edytora:

    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);  
}

Akcja o zmienionej etykiecie tej klasy powinna być widoczna, gdy aktywny będzie widok schematu treści.

Menu edytora plików Readme z akcją o zmienionej nazwie