Registrere handlinger for redigeringsprogrammer

Rammeverket for tekstredigeringsprogrammer inneholder en rekke funksjonsklasser som gjør det enklere å presentere og oppdatere tekst og kildekode. Vi skal nå se nærmere på arbeidsbenken som redigeringsprogrammet er en del av. Hvordan fungerer redigeringsprogrammet med andre funksjoner i arbeidsbenken, for eksempel hurtigmenyer, menylinjer og verktøylinjer?

Handlinger på redigeringsprogrammets menylinje

Du finner informasjon om hvordan redigeringsprogrammer registreres med arbeidsbenken og oppgir handlinger for menylinjen i arbeidsbenken, under org.eclipse.ui.editors.  Vi skal ikke gjenta denne informasjonen her.  Nedenfor ser du imidlertid hvordan kodetypen ser ut for et Java-eksempelredigeringsprogram som registrerer redigeringsprogrammet.

<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>

Handlinger på menylinjen i arbeidsbenken oppgis av JavaActionContributor, som implementerer  handlinger som er plassert på arbeidsbenkens Rediger-meny og på verktøylinjen.

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 to første handlingene er definert som målskiftende (retargetable) handlinger for tekstredigeringsprogrammer. Prinsippet er omtrent det samme som for målskiftende handlinger som oppgis av arbeidsbenken. Slike handlinger representerer menypunkter der bidragsyteren til handlingen dynamisk oppretter en binding til tilsvarende handlinger fra det aktive redigeringsprogrammet. Når det aktive redigeringsprogrammet endres, endres også handlingen som den målskiftende handlingen for tekstredigeringsprogrammer er bundet til. Snutten nedenfor viser at bidragsyteren til en redigeringsprogramhandling finner den tilsvarende handlingen ved å be redigeringsprogrammet om å oppgi en handling med en gitt 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();
}

IDen må være lik den IDen som handlingen er registrert med for redigeringsprogrammet, som her for JavaTextEditor. (Se også neste avsnitt):

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

Den tredje handlingen i bidragsyteren er en konkret handling som legges til på verktøylinjen i arbeidsbenken.  Handlingen endrer tilstanden i redigeringsprogrammet ved å veksle mellom å vise det uthevede området (som definert i innholdsdisposisjonen i Java-eksempelet), og hele filen. Denne handlingen vises bare på verktøylinjen.

Hurtigmenyer for redigeringsprogrammer

Hurtigmenyene for redigeringsprogrammer opprettes og håndteres i rammeverkene AbstractTextEditor og TextEditor .

Metoden createActions brukes for å registrere handlinger med redigeringsprogrammet.  Dette er handlinger som er egnet for hurtigmenyer for redigeringsprogrammet eller handlinger som oppgis i utvidelsesdefinisjoner. I Java-eksempelredigeringsprogrammet blir det bare opprettet handlinger som bindes til målskiftende handlinger. Java-eksempelredigeringsprogrammet arver også handlingene som opprettes av TextEditor og superklasser. Disse handlingene kan brukes i hurtigmenyene for redigeringsprogrammet.

TextEditor-metoden editorContextMenuAboutToShow brukes i et rammeverk slik at redigeringsprogrammer kan legge til handlinger på hurtigmenyen for redigeringsområdet. Ved å bruke menybanen kan du angi nøyaktig hvor handlingen skal vises. Gyldige menybaner for hurtigmenyen for redigeringsprogrammet defineres i implementeringen av denne metoden, i AbstractTextEditor.

Du kan velge mellom flere metoder når du skal legge til en handling på denne menyen. Du kan for eksempel legge til en handling bare ved å oppgi IDen den er registrert med i redigeringsprogrammet.  For JavaTextEditor legges for eksempel handlingen for hjelp med innhold til på menyen når denne metoden kalles. Det vises ingen handlinger på menyen når det ikke er registrert noen handling for denne bruker-IDen.

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

Superklassen TextEditor legger til handlinger på en annen måte, her plasseres en handlingen ved å oppgi en menygruppe på hurtigmenyen.  Handlingene (Forskyv til venstre og Forskyv til høyre) vises da på hurtigmenyen i gruppen som er definert av 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);
}

Hurtigmeny for redigeringsprogram

Metoden rulerContextMenuAboutToShow brukes på samme måte før hurtigmenyen for linjalen vises. Implementeringen av denne metoden i AbstractTextEditor definerer gruppene som elementer kan tilføyes i, på menyen.

Meny-IDer

Hurtigmenyene for redigeringsprogrammet og linjalen kan tilordnes IDer slik at andre plugin-moduler kan bidra til disse menyene gjennom utvidelsene. Opprettelsen av meny-IDer er blitt mer fleksibelt enn det var i den opprinnelige versjonen av plattformen. Det kan imidlertid være at rammeverket kjører i kompatibilitetsmodus for å være kompatibelt med plugin-moduler som er utviklet for den opprinnelige versjonen. Bruk AbstractTextEditor.setCompatibilityMode() hvis du vil styre denne virkemåten.  Standardinnstillingen er "true".

Meny-IDer som er kompatible med 1.0

Hvis kompatibilitetsmodusen er "true", kan IDene for hurtigmenyene for redigeringsprogrammet og linjalen angis ved hjelp av protokollen AbstractTextEditor.  Metodene setEditorContextMenuId og setRulerContextMenuId kan brukes til dette formålet.  Det kan være nyttig å tilbakestille IDer hvis du ikke ønsker å arve menyer som ble oppgitt for superklassemenyer. JavaTextEditor i eksempelet nedenfor tilbakestiller for eksempel IDene for hurtigmenyen til Java-spesifikke menyer for å unngå at generisk tekstinnhold skal arves fra andre plugin-moduler.

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

Hvis det ikke er angitt noen ID noe sted i hierarkiet, brukes standard-IDene som er definert av AbstractTextEditor.

Meny-IDer som ikke er kompatible med 1.0

Hurtigmeny-IDen for redigeringsprogrammet er alltid <editor id>.EditorContext, der <editor id> er IDen til redigeringsprogrammet. IDen til redigeringsprogrammet defineres i XML-deklarasjonen for redigeringsprogrammet. Hurtigmeny-IDen for linjalen er alltid <editor id>.RulerContext.