Ved hjælp af Indholdsassistance kan du færdiggøre kontekstrelevant indhold på brugernes anmodning. Denne funktionalitet implementeres af platformstekststrukturen iorg.eclipse.jface.text.contentassist. Pop op-vinduer ('pop op-hjælp') bruges til at vise tekstforslag til færdiggørelse af et udtryk. Brugeren kan vælge mellem forslagene og indsætte dem i teksten. Indholdsassistance understøtter også kontekstrelevante pop op-vinduer med oplysninger, som giver brugerne de oplysninger, som vedrører den aktuelle markørplacering i dokumentet.
Det er valgfrit at implementere Indholdsassistance. Som standard installerer SourceViewerConfiguration ikke Indholdsassistance, fordi funktionen ikke kender den dokumentmodel, som bruges til en bestemt editor, og ikke har nogen generisk funktionsmåde til Indholdsassistance.
For at kunne implementere Indholdsassistance skal editorens kildefremvisningskonfiguration være konfigureret til at definere en Indholdsassistance. Det gøres i Java-editoreksemplet inde 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; }
Indholdsassistancens funktionsmåde defineres i grænsefladen IContentAssistant. Klargøring af Indholdsassistance minder om klargøring om syntaksfremhævning. Indholdsassistancen skal konfigureres med forskellige strategier for færdiggørelse af udtryk til forskellige dokumentindholdstyper. Klargøringsstrategier er implementeret ved hjælp af IContentAssistProcessor. En processor foreslår færdiggørelser og beregner kontekstoplysninger til en forskydning i en bestemt indholdstype.
Ikke alle indholdstyper kræver Indholdsassistance. I editoren til Java-eksemplet stilles der processorer til Indholdsassistance til rådighed for standardindholdstyper og Javadoc, men ikke for kommentarer på flere linjer. Lad os se på de enkelte processorer.
JavaCompletionProcessor er meget enkel. Den kan kun foreslå nøgleord til færdiggørelse af udtryk. Nøgleordene defineres i et felt,
fgProposals
, og følgende nøgleord foreslås altid:
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; }
Brugeren kan udløse færdiggørelsen, eller den kan udløses automatisk, når tegnet "(" eller "." indtastes:
public char[] getCompletionProposalAutoActivationCharacters() { return new char[] { '.', '(' }; }
Foruden forslag til færdiggørelse definerer JavaCompletionProcessor kontekstoplysninger, som brugeren kan anmode om. Kontekstoplysninger omfatter en beskrivelse af de informationer, som er tilgængelige i en given kontekst, og den detaljerede oplysende meddelelse.
I editoren til Java-eksemplet er oplysningerne egentlig ikke kontekstrelaterede. Der beregnes et array, som indeholder fem lignende kontekstoplysningsobjekter, til den aktuelle forskydning, når brugeren sender en anmodning om kontekstoplysninger. Alle disse kontekstoplysningsobjekter definerer en kontekst, der indeholder de fem tegn foran forskydningen og de fem tegn efter forskydningen. Hvis et af de fem forslag vælges, vises de detaljerede oplysninger nær markøren og bliver ved med at vises, så længe markøren er placeret i konteksten af de fem tegn omkring forskydningen.
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; }
Disse kontekstoplysninger vises automatisk, når tegnet "#" indtastes.
public char[] getContextInformationAutoActivationCharacters() { return new char[] { '#' }; }
Indholdsassistancens udseende og funktionsmåde kan konfigureres vha. IContentAssistant. Du kan f.eks. konfigurere udløb af tidsfrist for automatisk aktivering og retning og farve på pop op-vinduer med oplysninger.
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; }
Hvis brugere skal kunne aktivere indholdsassistance, skal en funktion oprettes og konfigureres. Det gøres normalt i underklasseimplementeringen af 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); ... }Bidragyderen til editorfunktionslinjen skal udvides, så funktionen vises på hovedmenuen:
... 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); } ...