Rejestrowanie akcji edytora

Środowisko edytora tekstu udostępnia wiele klas programów narzędziowych, które ułatwiają prezentowanie i aktualizowanie tekstu oraz kodu źródłowego. Teraz główny nacisk położony zostanie na środowisko robocze, w którym edytor jest tylko jednym z wielu elementów. W jaki sposób edytor wymienia dane z innymi funkcjami środowiska roboczego, takimi jak menu kontekstowe, paski menu i paski narzędzi?

Akcje paska menu edytora

Aby zrozumieć, w jaki sposób edytory rejestrują się w środowisku roboczym i udostępniają akcje na pasku menu środowiska roboczego, należy się zapoznać z sekcją dotyczącą edytorów org.eclipse.ui.editors. Tamte informacje nie będą tu powtarzane.  Pokazany jedynie zostanie kod w języku znaczników, w którym przykładowy edytor Java rejestruje swój edytor.

   <extension
      point="org.eclipse.ui.editors">
<editor 
         name="%javaEditorName"
         icon="icons/obj16/java.png"
         extensions="jav"
         contributorClass="org.eclipse.ui.examples.javaeditor.JavaActionContributor"
         class="org.eclipse.ui.examples.javaeditor.JavaEditor"
         id="org.eclipse.ui.JavaEditor">
   </editor>
 </extension>

Akcje paska menu środowiska roboczego są wnoszone przez klasę JavaActionContributor. Implementuje ona akcje, które są umieszczane w menu Edycja oraz na pasku narzędzi środowiska roboczego.

public JavaActionContributor() {
	super();
	fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$
	...
	fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$
	...
	fTogglePresentation= new PresentationAction();
}

Pierwsze dwie akcje zostały zdefiniowane jako akcje edytora tekstu z możliwością ponownego określania celu. Zasada jest podobna jak w przypadku akcji z możliwością ponownego określania celu udostępnianych przez środowisko robocze. Akcje edytora tekstu z możliwością ponownego określania celu reprezentują pozycje menu, którym element wnoszący akcje dynamicznie przypisuje odpowiednie akcje udostępniane przez aktywny edytor. Wraz ze zmianą aktywnego edytora zmienia się również akcja, do której jest przypisana akcja edytora tekstu z możliwością ponownego określania celu. Poniższy fragment kodu pokazuje, jak element wnoszący akcje edytora wyszukuje odpowiednią akcję, pytając edytor o akcję z określonym identyfikatorem:

protected final IAction getAction(ITextEditor editor, String actionId) {
return (editor == null ? null : editor.getAction(actionId));
} public void setActiveEditor(IEditorPart part) {
super.setActiveEditor(part);
ITextEditor editor= null;
if (part instanceof ITextEditor)
editor= (ITextEditor) part;
fContentAssistProposal.setAction(getAction(editor, "ContentAssistProposal"));
fContentAssistTip.setAction(getAction(editor, "ContentAssistTip"));
fTogglePresentation.setEditor(editor);
fTogglePresentation.update();
}

Identyfikator musi być taki sam jak ten, pod którym akcja została zarejestrowana w edytorze, jak w poniższym przykładzie dla edytora JavaTextEditor. Więcej informacji na ten temat zawiera następna sekcja.

protected void createActions() {
	super.createActions();
		
	IAction a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal.", this, ISourceViewer.CONTENTASSIST_PROPOSALS); //$NON-NLS-1$
	a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
	setAction("ContentAssistProposal", a); 
		
	a= new TextOperationAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip.", this, ISourceViewer.CONTENTASSIST_CONTEXT_INFORMATION);  //$NON-NLS-1$
	a.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_CONTEXT_INFORMATION);
	setAction("ContentAssistTip", a); 
}

Trzecia z udostępnionych akcji jest konkretną akcją dodaną do paska narzędzi środowiska roboczego. Ta akcja pozwala przełączać stan edytora między wyświetlaniem wyróżnionego zakresu (określonego przez widok schematu treści przykładowego edytora Java) a wyświetlaniem całego pliku. Ta akcja pojawia się tylko na pasku narzędzi.

Menu kontekstowe edytora

Menu kontekstowe edytora są tworzone i zarządzane w środowiskach AbstractTextEditor i TextEditor.

Do rejestrowania akcji w edytorze jest używana metoda createActions. Dotyczy to zarówno akcji odpowiednich dla menu kontekstowych edytora, jak i wszystkich akcji udostępnianych przez definicje rozszerzeń. W przykładowym edytorze Java są tworzone tylko akcje przypisywane do akcji z możliwością ponownego określania celu. Ale edytor ten dziedziczy również akcje utworzone przez edytor TextEditor i jego nadklasy. Akcje te mogą być używane w menu kontekstowych edytora.

Metoda editorContextMenuAboutToShow edytora TextEditor jest używana w środowisku w celu umożliwienia edytorom dodawania akcji do menu kontekstowego obszaru edycji.  Aby dokładnie określić miejsce wyświetlania akcji, można użyć ścieżki menu. Prawidłowe ścieżki menu w ramach menu kontekstowego edytora są definiowane w trakcie implementowania tej metody w klasie AbstractTextEditor.

Akcje można dodawać do tego menu na kilka sposobów. Pierwszym sposobem jest dodanie akcji przy użyciu jedynie identyfikatora, pod którym jest ona zarejestrowana w edytorze. Na przykład edytor JavaTextEditor dodaje do menu swoje akcje dla asystenta treści, gdy ta metoda jest wywoływana. Jeśli pod podanym identyfikatorem nie będzie zarejestrowana żadna akcja, akcje nie zostaną wyświetlone w menu.

public void editorContextMenuAboutToShow(MenuManager menu) {
	super.editorContextMenuAboutToShow(menu);
	addAction(menu, "ContentAssistProposal"); 
	addAction(menu, "ContentAssistTip"); 
}

Drugim sposobem jest dodanie akcji przez nadklasę TextEditor, która określa w menu kontekstowym grupę menu dla danej akcji. W tym przypadku akcje (Przesuń w lewo, Przesuń w prawo) zostaną wyświetlone w menu kontekstowym w grupie zdefiniowanej przez klasę AbstractTextEditor.

protected void editorContextMenuAboutToShow(IMenuManager menu) {
	super.editorContextMenuAboutToShow(menu);
	addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_RIGHT);
	addAction(menu, ITextEditorActionConstants.GROUP_EDIT, ITextEditorActionConstants.SHIFT_LEFT);
}

Menu kontekstowe edytora

Metoda rulerContextMenuAboutToShow jest używana w taki sam sposób przed wyświetleniem menu kontekstowego linijki. Implementacja tej metody w klasie AbstractTextEditor definiuje grupy, do których można dodawać elementy menu.

Identyfikatory menu

Menu kontekstowe edytora oraz menu kontekstowe linijki mogą mieć przypisane identyfikatory, dzięki którym inne moduły dodatkowe mogą korzystać z tych menu w swoich rozszerzeniach. Od czasu powstania oryginalnej wersji platformy schemat ustanawiania identyfikatorów menu stał się bardziej elastyczny. Środowisko jednak może być uruchamiane w trybie zgodności, aby zachować zgodność z modułami dodatkowymi opracowanymi na potrzeby oryginalnej wersji. Aby sterować jego zachowaniem, można się posłużyć metodą AbstractTextEditor.setCompatibilityMode(). Domyślnie ustawienie to ma wartość true.

Identyfikatory menu zgodne z wersją 1.0

Jeśli ustawienie trybu zgodności ma wartość true, to identyfikatory menu kontekstowych edytora i linijki mogą zostać ustawione przy użyciu protokołu klasy AbstractTextEditor. W tym celu można skorzystać z metod setEditorContextMenuId i setRulerContextMenuId. Zresetowanie identyfikatorów może pomóc w zapobiegnięciu dziedziczeniu menu, które zostały wniesione do menu nadklasy. W poniższym przykładzie edytor JavaTextEditor resetuje identyfikatory menu kontekstowego, aby były zgodne z językiem Java, co pozwoli zapobiec dziedziczeniu jakichkolwiek ogólnych elementów tekstowych wnoszonych z innych modułów dodatkowych.

protected void initializeEditor() {
	super.initializeEditor();
	JavaEditorEnvironment.connect(this);
	setSourceViewerConfiguration(new JavaSourceViewerConfiguration());
	setEditorContextMenuId("#JavaEditorContext"); 
	setRulerContextMenuId("#JavaRulerContext"); 
}

Jeśli nigdzie w konkretnej hierarchii nie zostaną ustawione żadne identyfikatory, używane będą identyfikatory domyślne zdefiniowane przez edytor AbstractTextEditor.

Identyfikatory menu niezgodne z wersją 1.0

Identyfikator menu kontekstowego edytora zawsze ma postać <identyfikator edytora>.EditorContext, gdzie <identyfikator edytora> jest identyfikatorem danego edytora. Identyfikator edytora jest definiowany w deklaracji xml edytora. Identyfikator menu kontekstowego linijki zawsze ma postać <identyfikator edytora>.RulerContext.