Het teksteditorframework biedt veel handige utility-klassen voor het opmaken en bijwerken van tekst en broncode. In dit document richten we onze aandacht op de workbench, waarvan de editor slechts een deel uitmaakt. Hoe verloopt de interactieve samenwerking tussen de editor en andere workbenchfeatures, zoals voorgrondmenu's, menubalken en werkbalken?
Om te begrijpen hoe editors zich bij de workbench registreren en acties aanleveren voor de menubalk van de workbench, raadpleegt u de sectie org.eclipse.ui.editors. De informatie in die sectie wordt in dit document niet opnieuw behandeld. Wel ziet u hier de markup waarmee de editor door de Java-voorbeeldeditor wordt geregistreerd.
<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>
Workbenchmenubalkacties worden aangeleverd door de JavaActionContributor. Hiermee implementeert u acties van het menu Bewerken en de werkbalk van de workbench.
public JavaActionContributor() { super(); fContentAssistProposal= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistProposal."); //$NON-NLS-1$ ... fContentAssistTip= new RetargetTextEditorAction(JavaEditorMessages.getResourceBundle(), "ContentAssistTip."); //$NON-NLS-1$ ... fTogglePresentation= new PresentationAction(); }
De eerste twee acties zijn gedefinieerd als herbruikbare teksteditoracties. Het principe is vergelijkbaar met de herbruikbare acties die door de workbench worden aangeleverd. Herbruikbare teksteditoracties vertegenwoordigen menu-items die door de actiecontributor dynamisch worden gebonden aan overeenkomende acties die door de actieve editor worden aangeleverd. Wanneer de actieve editor wordt gewijzigd, wordt de actie waaraan een herbruikbare teksteditoractie gebonden is ook gewijzigd. In de volgende snippet kunt u zien dat de editoractiecontributor de bijbehorende actie bepaalt door de editor te vragen om een actie met een bepaald 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();
}
Het ID moet gelijk zijn aan het ID waaronder de actie is geregistreerd bij de editor, zoals hier voor de JavaTextEditor. (Zie ook de volgende sectie.):
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); }
De derde actie in de contributor is een concrete actie die aan de werkbalk van de workbench is toegevoegd. Hiermee wordt in de editor geschakeld tussen weergave van het geselecteerde bereik (dat is opgegeven in het inhoudsoverzicht voor het Java-voorbeeld) en weergave van het hele bestand. Deze actie wordt alleen afgebeeld alleen op de werkbalk.
De methode createActions wordt gebruikt om acties te registreren bij de editor. Hieronder vallen ook acties voor de editorvoorgrondmenu's of acties die worden aangeleverd in extensiedefinities. In de Java-voorbeeldeditor worden alleen de acties gemaakt die aan de herbruikbare acties worden gebonden. In de Java-voorbeeldeditor worden echter ook de door TextEditor en de bijbehorende superklassen gemaakte acties overgenomen. Deze acties kunnen worden gebruikt in de voorgrondmenu's van de editor.
De methode TextEditor editorContextMenuAboutToShow wordt gebruikt in het framework om acties toe te voegen aan het voorgrondmenu voor het bewerkingsgebied van de editor. U kunt een menupad gebruiken om op te geven waar uw actie wordt afgebeeld. Geldige menupaden in het voorgrondmenu van de editor worden gedefinieerd in de implementatie van deze methode in AbstractTextEditor.
U kunt op meerdere manieren een actie aan dit menu toevoegen. Ten eerste kunt u een actie toevoegen met alleen het ID waaronder de actie is geregistreerd bij de editor. Zo worden bijvoorbeeld de acties voor contenthulp van de JavaTextEditor aan het menu toegevoegd wanneer deze methode wordt aangeroepen. Acties verschijnen alleen in het menu als deze onder het gebruikte ID zijn geregistreerd.
public void editorContextMenuAboutToShow(MenuManager menu) { super.editorContextMenuAboutToShow(menu); addAction(menu, "ContentAssistProposal"); addAction(menu, "ContentAssistTip"); }
Ten tweede kunt u acties toevoegen met de superklasse TextEditor, door een menugroep op te geven in het voorgrondmenu waarin de actie moet worden opgenomen. In dit geval verschijnen de acties (Shift links, Shift rechts) in het voorgrondmenu in de groep die wordt gedefinieerd door 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); }
De methode rulerContextMenuAboutToShow wordt op dezelfde manier gebruikt voordat het voorgrondmenu van de liniaal wordt afgebeeld. De implementatie van deze methode in AbstractTextEditor definieert de groepen waarin items kunnen worden toegevoegd aan het menu.
De voorgrondmenu's voor de editor en de liniaal kunnen worden toegewezen aan ID's zodat andere plugins bijdragen voor deze menu's kunnen aanleveren in hun extensies. Het toewijzingsschema voor menu-ID's is nu flexibeler dan in de oorspronkelijke versie van het platform. Het framework kan echter worden uitgevoerd in een werkstand die compatibel is met plugins die voor de oorspronkelijke versie zijn ontwikkeld. U kunt AbstractTextEditor.setCompatibilityMode() gebruiken om dit gedragspatroon aan te sturen. De standaardinstelling is true (ingeschakeld).
Wanneer de compatibiliteitswerkstand ingeschakeld (true) is, kunnen de ID's van de voorgrondmenu's van de editor en de liniaal worden ingesteld met het protocol AbstractTextEditor. De methoden setEditorContextMenuId en setRulerContextMenuId kunnen voor dit doel worden gebruikt. Het kan handig zijn om ID's opnieuw in te stellen als u wilt voorkomen dat er menu's van superklassen worden overgenomen. Zo worden de ID's van de voorgrondmenu's door de JavaTextEditor in het voorbeeld ingesteld op Java-specifieke ID's om te voorkomen dat er algemene tekstbijdragen worden overgenomen van andere plugins.
protected void initializeEditor() { super.initializeEditor(); JavaEditorEnvironment.connect(this); setSourceViewerConfiguration(new JavaSourceViewerConfiguration()); setEditorContextMenuId("#JavaEditorContext"); setRulerContextMenuId("#JavaRulerContext"); }
Als nergens in de concrete hiėrarchie een ID is ingesteld, worden de standaard-ID's van AbstractTextEditor gebruikt.
Het editorvoorgrondmenu-ID is altijd <editor-ID>.EditorContext
,
waarbij <editor-ID>
het ID van de editor is. Het ID van een editor
wordt gedefinieerd in de XML-declaratie van de editor. Het voorgrondmenu-ID voor de
liniaal is altijd <editor-ID>.RulerContext
.