Struktura textových editorů poskytuje mnoho obslužných tříd, které pomáhají při prezentaci a aktualizaci textu a zdrojového kódu. Nyní obrátíme pozornost k pracovní ploše, v níž je editor jednou částí. Jak editor zajišťuje interakci s ostatními funkcemi pracovní plochy, například kontextovými nabídkami, pruhy nabídek a panely nástrojů?
Chcete-li porozumět způsobu, jakým se textové editory registrují v pracovní ploše a jak poskytují akce pro pruh nabídky pracovní plochy, podívejte se na oddíl diskutující org.eclipse.ui.editors. Tyto informace zde nebudeme znovu rozebírat. Jenom se rychle podíváme na markup, kde ukázkový editor jazyka Java registruje svůj editor.
<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>
Akcemi pruhu nabídky pracovní plochy přispívá JavaActionContributor. Implementuje akce, které se umístí do nabídky Upravit pracovní plochy a na panel nástrojů pracovní plochy.
public JavaActionContributor() { super(); fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$ ... fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$ ... fTogglePresentation= new PresentationAction(); }
První dvě akce jsou definovány jako přecílitelné akce textového editoru. Princip je podobný přecílitelným akcím, které poskytuje pracovní plocha. Přecílitelné akce textového editoru představují položky nabídek, které přispěvatel akce dynamicky váže s příslušnými akcemi poskytovanými aktivním editorem. Když se aktivní editor změní, akce, s níž je svázána přecílitelná akce textového editoru, se rovněž změní. Následující úsek ukazuje, že přispěvatel akce editoru nalezne odpovídající akci tak, že se editoru dotáže na akci s daným ID:
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();
}
ID musí být shodné s tím, pod kterým je akce u editoru registrována, jak zde ukazujeme pro editor JavaTextEditor. (Viz také následující oddíl.):
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); }
Třetí akcí v přispěvateli je konkrétní akce přidaná na panel nástrojů pracovní plochy. Přepíná stav editoru mezi zobrazováním zvýrazněného úseku (jak nařizuje prohlížeč osnovy obsahu ukázky jazyka Java) a zobrazováním celého souboru. Tato akce se zobrazuje pouze na panelu nástrojů.
Metoda createActions se používá pro registraci akcí v editoru. To zahrnuje akce vhodné pro kontextové nabídky editoru, nebo jakékoliv akce vložené v definicích rozšíření. V ukázkovém editoru jazyka Java se vytváří pouze akce, které se sváží s přecílitelnými akcemi. Ukázkový editor jazyka Java nicméně také dědí akce vytvořené třídou TextEditor a jejími supertřídami. Tyto akce lze použít v kontextových nabídkách editoru.
Metodu editorContextMenuAboutToShow třídy TextEditor používá infrastruktura k tomu, aby editory mohly přidávat akce do kontextové nabídky pro editační plochu. Chcete-li přesně rozhodnout, kde se má vaše akce objevit, můžete použít cestu nabídky. Platné cesty nabídek uvnitř kontextové nabídky editoru jsou definovány v implementaci této metody ve třídě AbstractTextEditor.
Existuje několik způsobů, jak do této nabídky přidat akci. Prvním z nich je přidání akce pouze pomocí ID, pod kterým je u editoru registrována. JavaTextEditor například do nabídky přidává své akce pro obsahovou asistenci, když se tato metoda zavolá. Akce se v nabídce nezobrazí, když pod použitým ID není žádná akce registrována.
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
Supertřída TextEditor přidává akce druhým způsobem - uvedením skupiny nabídek v kontextové nabídce pro umístění akce. V tomto případě se akce (Posunout vlevo, Posunout vpravo) zobrazí v kontextové nabídce ve skupině definované třídou 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); }
Metoda rulerContextMenuAboutToShow se používá stejným způsobem před zobrazením kontextové nabídky pravítka. Implementace této metody ve třídě AbstractTextEditor definuje skupiny, ve kterých lze položky do nabídky přidávat.
Kontextovým nabídkám editoru a pravítka lze přiřadit ID, takže ostatní moduly plug-in mohou ve svých rozšířeních do těchto nabídek přispívat. Schéma pro zřizování ID nabídek je oproti původní verzi platformy tvárnější. Vývojové prostředí může nicméně běžet v režimu kompatibility, aby zůstalo kompatibilní s moduly plug-in vyvinutými pro původní verzi. K řízení tohoto chování můžete použít AbstractTextEditor.setCompatibilityMode(). Výchozí nastavení je true.
Když je režim kompatibility nastaven na hodnotu true, ID kontextových nabídek editoru a pravítka lze nastavit pomocí protokolu třídy AbstractTextEditor. K tomu účelu lze použít metody setEditorContextMenuId a setRulerContextMenuId. Opětovné nastavení ID může být užitečné, pokud chcete zabránit dědění nabídek, které byly vloženy do nabídek supertřídy. JavaTextEditor v ukázce například opětovně nastavuje svá ID kontextových nabídek, aby byly specifické pro jazyk Java, a zabránilo se tak dědění obecných textových příspěvků od jiných modulů plug-in.
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
Není-li nikde v konkrétní hierarchii nastaveno žádné ID, použijí se výchozí ID definovaná třídou AbstractTextEditor.
ID kontextové nabídky editoru má vždy tvar <ID editoru>.EditorContext
,
kde <ID editoru>
je ID editoru. ID editoru je definováno v XML deklaraci
editoru. ID kontextové nabídky pravítka má vždy tvar <ID editoru>.RulerContext
.