Via innehållshjälpen kan du avsluta sammanhangskänsligt innehåll på användarens begäran. Denna funktion implementeras av plattformens textramverk i org.eclipse.jface.text.contentassist. Popupfönster (förklaringar) används för att föreslå möjliga textval för att avsluta en fras. Användaren kan välja dessa alternativ för infogning i texten. Innehållshjälpen stöder även sammanhangskänsliga popupfönster för att ge användaren information om den aktuella positionen i dokumentet.
Implementering av innehållshjälp är valfri. Som standard installerar inte SourceViewerConfiguration innehållshjälp eftersom den inte känner till dokumentmodellen som används för en viss redigerare och har inget allmänt beteende för innehållshjälp.
För att implementera innehållshjälp måste din redigerares källkodvisningsprogram konfigureras så att innehållshjälp definieras. Det görs i exemplet med Java- redigeraren inuti 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; }
Innehållshjälpens beteende definieras i gränssnittet IContentAssistant. Konfiguration av innehållshjälp görs ungefär på samma sätt som konfiguration av syntaxmarkeringar. Hjälpen ska konfigureras med olika strategier för frasfullbordan för olika dokumentinnehållstyper. Strategier för fullbordan implementeras med hjälp av IContentAssistProcessor. En processor föreslår fullbordan och beräknar sammanhangsinformation för en offset inom en viss innehållstyp.
Alla innehållstyper behöver inte innehållshjälp. I exemplet med Java-redigeraren, tillhandahålls innehållshjälpprocessorer för standardinnehållstypen och javadoc, men inte för flerradskommentarer. Låt oss titta på var och en av dessa processorer.
JavaCompletionProcessor är ganska enkel. Den kan bara föreslå nyckelord som kandidater för fullbordan. Nyckelorden definieras i fältet fgProposals
och dessa nyckelord föreslås alltid som kandidater:
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; }
Fullbordan kan aktiveras av användaren eller automatiskt när tecknet "(" eller "." anges:
public char[] getCompletionProposalAutoActivationCharacters() { return new char[] { '.', '(' }; }
Förutom att föreslå fullbordan, definierar JavaCompletionProcessor sammanhangsinformation som kan begäras av användaren. Sammanhangsinformation innefattar en beskrivning av de informationsstycken som finns tillgängliga för givet sammanhang och det detaljerade informationsmeddelandet.
I exemplet med Java-redigeraren är informationen egentligen inte sammanhangsberoende. En vektor som innehåller fem liknande sammanhangsinformationsobjekt beräknas för aktuellt offset när användaren begär sammanhangsinfo. Alla dessa objekt definierar ett sammanhang som innehåller fem tecken framför offsetet och fem efter det. Om något av dessa fem förslag väljs, visas detaljerad information i närheten av markören som stannar kvar så länge markören befinner sig inom sammanhanget med fem tecken runt offsetet.
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; }
Den här sammanhangsinformationen visas automatiskt när tecknet "#" anges:
public char[] getContextInformationAutoActivationCharacters() { return new char[] { '#' }; }
Innehållshjälpens utseende och beteende kan konfigureras med hjälp av IContentAssistant. Du kan t.ex. konfigurera tidsgräns för automatisk aktivering och popupfönsters orientering och färg.
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; }
En tgärd måste ha skapats och konfigurerats för att användare ska kunna anropa innehållshjälpen. Det görs vanligen i underklassimplementeringen 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); ... }Det tillhandahållande insticksprogrammet för åtgärdsfältet för redigeraren måste utökas för att åtgärden ska visas i huvudmenyn:
... 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); } ...