Registrera redigeringsåtgärder

I ramverket för textredigeraren finns många hjälpklasser för visning och uppdatering av text och källkod. Nu ska vi beskriva arbetsmiljön i vilken redigeraren utgör en del. Hur interagerar redigeraren med andra arbetsmiljösfunktioner som t.ex. sammanhangsmenyer, menyfält och verktygsfält?

Åtgärder i redigerarens menyfält

Under avsnittet om org.eclipse.ui.editors beskrivs hur redigerare registrerar sig själva i arbetsmiljön och tillför åtgärder i arbetsmiljöns menyfält. Den informationen tas inte upp här.  Vi ska bara ta en snabb titt på kodstycket där Java-redigeraren i exemplet registreras automatiskt.

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

Åtgärder i arbetsmiljöns menyfält läggs till med hjälp av JavaActionContributor. Den implementerar åtgärder som placeras i arbetsmiljöns Redigera-meny och verktygsfält.

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 två första åtgärderna definieras som textredigerarens omdirigeringsbara åtgärder. Principen liknar den för omdirigeringsbara åtgärder i arbetsmiljön. Textredigerarens omdirigerbara åtgärder representerar menyposter som dynamiskt binds till motsvarande åtgärder i aktiv redigerare. När den aktiva redigeraren förändras, ändras även åtgärden till vilken textredigerarens omdirigerbara åtgärd är bunden. Följande kodstycke visar att redigerarens åtgärdsbidragare hittar den motsvarande åtgärd genom att fråga redigeraren efter en åtgärd med ett givet 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 som anges här för JavaTextEditor måste vara identiskt med det ID som användes då åtgärden registrerades med redigeraren. (Se även nästa 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 åtgärden i bidragaren är en konkret åtgärd som lagts till i arbetsmiljöns verktygsfält. Den växlar status för redigeraren mellan dels att visa det markerade området (som anges av Java-exemplets innehållskontur) och dels hela filen. Den här åtgärden visas endast i verktygsfältet.

Sammanhangsmenyer i redigeraren

Redigerarens sammanhangsmenyer skapas och hanteras i ramverken AbstractTextEditor och TextEditor .

Metoden createActions används för att registrera åtgärder med redigeraren. Detta innefattar åtgärder som är lämpliga för redigerarens sammanhangsmenyer eller åtgärder som lagts till i tilläggsdefinitioner. I exemplet med Java-redigeraren skapas endast de åtgärder som binds till de omdirigerbara åtgärderna. Men i exemplet med Java-redigeraren ärvs även åtgärderna som skapas av TextEditor och dess superklasser. Dessa åtgärder kan användas i redigerarens sammanhangsmenyer.

TextEditor-metoden editorContextMenuAboutToShow används i ramverket för att tillåta redigerare att lägga till åtgärder i sammanhangsmenyn för redigeringsområdet. Du kan använda en menysökväg för att exakt bestämma var din åtgärd ska visas . Giltiga menysökvägar i redigerarens sammanhangsmeny definieras i implementeringen av denna metod i AbstractTextEditor.

Det finns flera sätt att lägga till en åtgärd i denna meny. Det första är att lägga till en åtgärd med hjälp av bara det ID under vilket den registrerades med redigeraren. JavaTextEditor lägger t.ex. sina åtgärder för sammanhangsberoende hjälp i menyn när denna metod anropas. Om ingen åtgärd är registrerad under aktuellt ID visas inga åtgärder i menyn.

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

Superklassen TextEditor lägger till åtgärder på ett annat sätt, nämligen genom att ange en menygrupp i sammanhangsmenyn för placering av åtgärden. I detta fall visas inte åtgärderna (Skift vänster, Skift höger) i sammanhangsmenyn i gruppen som definierats 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);
}

Sammanhangsmeny i redigeraren

Metoden rulerContextMenuAboutToShow används på samma sätt innan regelns sammanhangsmeny visas. Genom implementering av denna metod i AbstractTextEditor definieras grupper i vilka poster kan läggas till i menyn.

Meny-ID

Redigerarens och regelns sammanhangsmenyer kan tilldelas ID så att man via andra insticksprograms tillägg kan lägga till objekt i dessa menyer. Schemat för etablering av meny-ID är mer flexibel sedan plattformens originalversion. Ramverket kan dock köras i ett kompatibilitetsläge för att bibehålla kompabilitet med insticksprogram som utvecklats för originalversionen.  Du kan använda AbstractTextEditor.setCompatibilityMode() till att styra den här funktionen.  Standardinställningen är true.

1.0 kompatibla meny-ID

När kompatibilitetsläget är satt till true, kan ID för redigerarens och regelns sammanhangsmeny anges med hjälp av protokollet AbstractTextEditor.  Metoderna setEditorContextMenuId och setRulerContextMenuId kan användas för det här ändamålet.  Om du inte vill ärva menyer som lagts till i superklasser kan du återställa ID:erna. JavaTextEditor i exemplet återställer t.ex. sina sammanhansmenys-ID så att de blir Java-specifika för att hindra att allmänna texttillägg från andra insticksprogram ärvs.

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

Om inget ID anges någonstans i den konkreta hierarkin, används standard-ID som definierats av AbstractTextEditor.

1.0 icke-kompatibla meny-ID

ID för redigerarens sammanhangsmeny är alltid <editor id>.EditorContext, där <editor id> är redigerarens ID. ID för en redigerare definieras i redigerarens xml-deklaration. ID för regelns sammanhangsmeny är alltid <editor id>.RulerContext.