Jak wiadomo, narzędzie readme definiuje swój własny edytor, który wnosi akcje do paska menu środowiska roboczego, używając klasy ReadmeEditorActionBarContributor.
<extension point = "org.eclipse.ui.editors"> <editor id = "org.eclipse.ui.examples.readmetool.ReadmeEditor" name="%Editors.ReadmeEditor" icon="icons/obj16/editor.png" class="org.eclipse.ui.examples.readmetool.ReadmeEditor" extensions="readme" contributorClass="org.eclipse.ui.examples.readmetool.ReadmeEditorActionBarContributor"> </editor> </extension>
Warto przyjrzeć się bliżej temu, co dzieje się w klasie dostarczyciela.
public ReadmeEditorActionBarContributor() { ... action2 = new RetargetAction(IReadmeConstants.RETARGET2, MessageUtil.getString("Editor_Action2")); action2.setToolTipText(MessageUtil.getString("Readme_Editor_Action2")); action2.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_DISABLE); action2.setImageDescriptor(ReadmeImages.EDITOR_ACTION2_IMAGE_ENABLE); ... action3 = new LabelRetargetAction(IReadmeConstants.LABELRETARGET3, MessageUtil.getString("Editor_Action3")); action3.setDisabledImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_DISABLE); action3.setImageDescriptor(ReadmeImages.EDITOR_ACTION3_IMAGE_ENABLE); ... handler2 = new EditorAction(MessageUtil.getString("Editor_Action2")); ... handler3 = new EditorAction(MessageUtil.getString("Editor_Action3")); ...
Jednocześnie z dostarczycielem tworzone są dwie akcje o zmiennym celu (jedna, która umożliwia aktualizację etykiety, i druga o stałej etykiecie). Akcje są tworzone przy użyciu tych samych technik, których używa środowisko robocze. Tworzone są także dwie procedury obsługi, które będą używane, gdy edytor będzie aktywny.
Pytanie tylko, gdzie są rejestrowane procedury obsługi dla tych akcji? Ustawianie globalnych procedur obsługi przebiega nieco inaczej, gdy dany edytor definiuje akcje o zmiennym celu. Dlaczego? Ponieważ to dostarczyciel jest odpowiedzialny za śledzenie aktywnego widoku i podłączanie różnych procedur obsługi, gdy różne widoki i sam edytor stają się aktywne. Zajmuje się tym środowisko robocze, gdy ustawi się procedurę obsługi dla jednej z jego akcji globalnych. Oto w jaki sposób działa klasa ReadmeEditorActionBarContributor:
public void init(IActionBars bars, IWorkbenchPage page) { super.init(bars, page); bars.setGlobalActionHandler(IReadmeConstants.RETARGET2, handler2); bars.setGlobalActionHandler(IReadmeConstants.LABELRETARGET3, handler3); ...
Najpierw dostarczyciel rejestruje swoje procedury obsługi dla akcji o zmiennym celu. Zagwarantuje to, że akcje dostarczyciela będą uruchamiane, gdy sam edytor będzie aktywny. Następnym krokiem jest zarejestrowanie każdej akcji RetargetAction jako funkcji nasłuchiwania części na stronie.
... // Podłączanie akcji o zmiennym celu jako funkcji nasłuchiwania strony page.addPartListener(action2); page.addPartListener(action3); IWorkbenchPart activePart = page.getActivePart(); if (activePart != null) { action2.partActivated(activePart); action3.partActivated(activePart); } }
Dodanie każdej akcji RetargetAction jako funkcji nasłuchiwania strony oznacza, że akcja ta będzie powiadamiana o zmianach części aktywnej. Akcja może uzyskać poprawną globalną procedurę obsługi z nowo aktywowanej części. Szczegółowe informacje na ten temat można znaleźć w implementacji akcji RetargetAction . Należy zauważyć, że aby rozpocząć, akcja jest osadzana z częścią aktywną w danym momencie.
W momencie utylizowania dostarczyciela edytora powinien on odłączyć akcje o zmiennym celu jako funkcje nasłuchiwania strony.
public void dispose() { // Usuń akcje o zmiennym celu jako funkcje nasłuchiwania strony getPage().removePartListener(action2); getPage().removePartListener(action3); }
Należy pamiętać, że dostarczyciele paska akcji są współużytkowani przez różne instancje tej samej klasy edytora. Z tego powodu procedury obsługi muszą być powiadamiane, gdy zmieni się aktywny edytor, aby mogły podłączyć właściwą instancję edytora.
public void setActiveEditor(IEditorPart editor) { ... handler2.setActiveEditor(editor); handler3.setActiveEditor(editor); ... }
Na tym kończy się konfiguracja po stronie edytora. Po otwarciu edytora, gdy jest on aktywny, procedury obsługi (i ich etykiety) definiowane przez klasę ReadmeEditorActionBarContributor będą wyświetlane na pasku menu środowiska roboczego.
Teraz, gdy akcje wnoszone edytora są na miejscu, warto się zastanowić, co robi widok w celu zarejestrowania procedury obsługi. Kod po stronie klienta jest podobny do tego, który rejestruje procedurę obsługi dla akcji środowiska roboczego. Różnica polega na tym, że identyfikatorem akcji jest ten, który został zdefiniowany przez edytor modułu dodatkowego. Klasa ReadmeContentOutlinePage rejestruje procedurę obsługi dla tych akcji.
public void createControl(Composite parent) { super.createControl(parent); ... getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.RETARGET2, new OutlineAction(MessageUtil.getString("Outline_Action2"))); OutlineAction action = new OutlineAction(MessageUtil.getString("Outline_Action3")); action.setToolTipText(MessageUtil.getString("Readme_Outline_Action3")); getSite().getActionBars().setGlobalActionHandler( IReadmeConstants.LABELRETARGET3, action); ...
Należy zwrócić uwagę, że widok schematu ustawia tekst podpowiedzi i etykietę dla drugiej akcji, ponieważ umożliwia ona zmianę etykiety. Po aktywowaniu widoku schematu plików readme jego procedury obsługi (i ich etykiety) będą wyświetlane na pasku menu środowiska roboczego.
Należy zwrócić uwagę, że dla akcji o zmienionej etykiecie jest wyświetlana nowa etykieta.