Innholdshjelp

Med innholdshjelp får brukeren kontekstavhengig hjelp til å fullføre innhold når han eller hun ber om det.  Denne funksjonaliteten implementeres av tekstrammeverket for plattformen i org.eclipse.jface.text.contentassist.  Mulige tekstvalg for å fullføre et uttrykk vises i popup-vinduer (infofelt).  Brukeren kan velge å sette disse forslagene inn i teksten. Innholdshjelp støtter også kontekstavhengige infofelt som gir brukeren informasjon om den gjeldende posisjonen i dokumentet. 

Det er valgfritt å implementere innholdshjelp. Som standard installerer ikke SourceViewerConfiguration innholdshjelp siden den ikke vet hvilken dokumentmodell som brukes for et bestemt redigeringsprogram, og siden den ikke har noen generisk funksjon for innholdshjelp. 

Hvis du vil implementere innholdshjelp, må kildevisningsprogrammet for redigeringsprogrammet være konfigurert slik at det kan definere innholdshjelp. Dette gjøres i Java-redigeringsprogrameksempelet i JavaSourceViewerConfiguration.

public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {

	ContentAssistant assistant= new ContentAssistant();
	assistant.setContentAssistProcessor(new JavaCompletionProcessor(), IDocument.DEFAULT_CONTENT_TYPE);
	assistant.setContentAssistProcessor(new JavaDocCompletionProcessor(), JavaPartitionScanner.JAVA_DOC);

	...
	return assistant;
}

Funksjonen for innholdshjelp defineres i grensesnittet IContentAssistant.  Du definerer innholdshjelpen omtrent på samme måte som du definerer syntaksutheving.  Assistenten må konfigureres med ulike strategier for fullføring av uttrykk, for ulike typer dokumentinnhold. Fullføringsstrategiene implementeres ved hjelp av   IContentAssistProcessor.  Fullføringen foreslås av en prosessor som behandler kontekstinformasjon for en relativ posisjon i en bestemt innholdstype.

Prosessorer for innholdshjelp

Det er ikke alle innholdstyper som trenger innholdshjelp. I Java-eksempelredigeringsprogrammet finnes innholdshjelp for standardinnholdstypen og Javadoc, men ikke for kommentarer på flere linjer.  La oss se nærmere på hver av disse prosessorene.

JavaCompletionProcessor er ganske enkel. Den foreslår bare nøkkelord som mulige fullføringer. Nøkkelordene defineres i felt, fgProposals, og disse nøkkelordene blir alltid foreslått som mulige fullføringer:

public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer, int documentOffset) {
	ICompletionProposal[] result= new ICompletionProposal[fgProposals.length];
	for (int i= 0; i < fgProposals.length; i++) {
		IContextInformation info= new ContextInformation(fgProposals[i], MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.ContextInfo.pattern"), new Object[] { fgProposals[i] })); //$NON-NLS-1$
		result[i]= new CompletionProposal(fgProposals[i], documentOffset, 0, fgProposals[i].length(), null, fgProposals[i], info, MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.Proposal.hoverinfo.pattern"), new Object[] { fgProposals[i]})); //$NON-NLS-1$
	}
	return result;
}

Innholdshjelp med nøkkelord

Brukeren kan be om fullføring eller dette gjøres automatisk når brukeren oppgir tegnet "(" eller ".":

public char[] getCompletionProposalAutoActivationCharacters() {
	return new char[] { '.', '(' };
}

I tillegg til å foreslå fullføringer definerer JavaCompletionProcessor kontekstinformasjon som brukeren kan be om. Slik informasjon omfatter en beskrivelse av deler av informasjonen som er tilgjengelig i en gitt kontekst samt den detaljerte informasjonsmeldingen.  

I Java-redigeringsprogrameksempelet er ikke informasjonen egentlig kontekstavhengig.  En tabell som inneholder fem like objekter for kontekstinformasjon behandles for den gjeldende relative posisjonen når brukeren ber om kontekstinformasjon. Alle disse objektene definerer en kontekst som består av fem tegn foran og bak den relative posisjonen. Hvis ett av disse forslagene velges, vises detaljert informasjon der markøren står så lenge markøren er innenfor konteksten til de fem tegnene rundt den relative posisjonen.

public IContextInformation[] computeContextInformation(ITextViewer viewer, int documentOffset) {
	IContextInformation[] result= new IContextInformation[5];
	for (int i= 0; i < result.length; i++)
		result[i]= new ContextInformation(
			MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.display.pattern"), new Object[] { new Integer(i), new Integer(documentOffset) }),
			MessageFormat.format(JavaEditorMessages.getString("CompletionProcessor.ContextInfo.value.pattern"), new Object[] { new Integer(i), new Integer(documentOffset - 5), new Integer(documentOffset + 5)}));
	return result;
}

Innholdshjelp for Java

 

Kontekstinformasjonen vises automatisk når brukeren skriver inn tegnet "#":

public char[] getContextInformationAutoActivationCharacters() {
	return new char[] { '#' };
}

Konfigurasjon av innholdshjelp

Det er mulig å konfigurere utseende og funksjonen for innholdshjelpen ved hjelp av IContentAssistant.   Du kan for eksempel konfigurere automatisk aktivering av tidsavbrudd og angi hvilken retning og hva slags farge informasjonsfelt skal ha.

public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) {

	ContentAssistant assistant= new ContentAssistant();
	...
	assistant.enableAutoActivation(true);
	assistant.setAutoActivationDelay(500);
	assistant.setProposalPopupOrientation(IContentAssistant.PROPOSAL_OVERLAY);
	assistant.setContextInformationPopupOrientation(IContentAssistant.CONTEXT_INFO_ABOVE);
	assistant.setContextInformationPopupBackground(JavaEditorEnvironment.getJavaColorProvider().getColor(new RGB(150, 150, 0)));

	return assistant;
}

Opprett innholdshjelphandlingen og bind den til en tastkombinasjon

For å tillate at brukerne starter innholdshjelpen, må en handling opprettes og konfigureres. Dette gjøres vanligvis i subklasseimplementeringen av AbstractTextEditor.createActions():

protected void createActions() {
	...
	IAction action= new ContentAssistAction(aResourceBundle, "ContentAssistProposal.", this); //$NON-NLS-1$
	action.setActionDefinitionId(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
	setAction(actionId, action); //$NON-NLS-1$
	markAsStateDependentAction(actionId, true); //$NON-NLS-1$
	PlatformUI.getWorkbench().getHelpSystem().setHelp(action, helpContextId);
	...
}
Bidragsyteren for redigeringsprogrammets handlingslinje må utvides slik at handlingen vises i hovedmenyen:
...
private RetargetTextEditorAction fContentAssist;

public MyEditorActionContributor() {
	fContentAssist= new RetargetTextEditorAction();
	String commandId= ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS;
	fContentAssist.setActionDefinitionId(commandId);
}

public void contributeToMenu(IMenuManager menu) {
	IMenuManager editMenu= menu.findMenuUsingPath(M_EDIT);
	editMenu.appendToGroup(MB_ADDITIONS, fContentAssist);
}

public void setActiveEditor(IEditorPart part) {
	IAction editorAction= getAction(part, "ContentAssist");
	fContentAssist.setAction(editorAction);
}
...