Sisällönhallinnan aputoiminto

Sisällönhallinnan aputoiminnon avulla voi sisältöä täydentää käyttäjän pyynnöstä tilannekohtaisesti. Käyttöympäristön tekstikehys toteuttaa tätä toimintoa org.eclipse.jface.text.contentassist-paketissa.  ponnahdusikkunoissa (pikaohjeissa) ehdotetaan eri vaihtoehtoja ilmauksen täydentämiseksi. Käyttäjä voi valita vaihtoehdoista sen, joka lisätään tekstiin. Sisällönhallinnan aputoiminto myös tukee tilannekohtaisia pikaohjeita, jotka tarjoavat käyttäjälle asiakirjan kulloiseenkin kohtaan liittyvää tietoa. 

Sisällönhallinnan aputoiminnon toteutus ei ole pakollista. Oletusarvon mukaan SourceViewerConfiguration ei asenna sisällönhallinnan aputoimintoa, koska se ei tunne muokkausohjelman käyttämää asiakirjamallia eikä sillä ole ole toimintoa sisällönhallinnan aputoimintoa varten. 

Jotta muokkausohjelma voi toteuttaa sisällönhallinnan aputoiminnon, sen lähdekoodin katseluohjelman kokoonpanon pitää olla määritetty siten, että se määrittää sisällönhallinnan aputoiminnon. Java-esimerkkimuokkausohjelmassa tämä tehdään JavaSourceViewerConfiguration-luokassa.

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

Sisällönhallinnan aputoiminnon toiminta on määritetty IContentAssistant-rajapinnassa.  Se määritetään kutakuinkin samalla tavalla kuin syntaksin korostus. Sisällönhallinnan aputoiminnolle pitää määrittää kunkin asiakirjan sisältötyypin mukainen merkkijonon täydentämisen kategoria. Täydentämisstrategiat toteutetaan   IContentAssistProcessor-rajapinnan avulla. Käsittelytoiminto ehdottaa mahdollisia täydennyksiä ja laskee kontekstitietoja sisältölajin sisällä tapahtuvaa siirtymää varten.

Sisällönhallinnan aputoiminnon käsittelytoiminnot

Kaikissa sisältölajeissa ei tarvita sisällönhallinnan aputoimintoa. Java-esimerkkimuokkausohjelmassa sisällönhallinnan aputoiminnon käsittelytoiminnot on osoitettu oletussisältölajille ja Javadocille, mutta ei monirivisille kommenteille. Seuraavassa perehdytään käsittelytoimintoihin.

JavaCompletionProcessor on melko yksinkertainen. Se ainoastaan ehdottaa avainsanoja täydennystä varten. Avainsanat on määritetty kentässä fgProposals ja niitä ehdotetaan aina täydennysvaihtoehtoina:

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

Avainsanojen sisällönhallinnan aputoiminto

Täydennyksen voi liipaista käyttäjän pyyntö tai liipaisu voi tapahtua automaattisesti, kun kirjoitetaan merkit "(" tai ".":

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

Täydennysehdotusten antamisen lisäksi JavaCompletionProcessor määrittää kontekstitiedot, joita käyttäjä voi pyytää. Kontekstitiedot sisältävät kyseisessä kontekstissa käytettävissä olevien tietojen kuvauksen ja yksityiskohtaisen tiedotesanoman.  

Java-esimerkkimuokkausohjelmassa tieto ei varsinaisesti ole tilannekohtaista. Kun käyttäjä pyytää kontekstitietoja, ohjelma laskee siirtymälle taulukon, joka sisältää viisi samanlaista kontekstitieto-objektia. Kaikki objektit määrittävät kontekstin, johon kuuluu viisi siirtymää edeltävää ja sitä seuraavaa merkkiä. Jos jokin näistä viidestä ehdotuksesta valitaan, kohdistimen lähellä näkyvät sitä koskevat yksityiskohtaiset tiedot niin pitkään kuin kohdistin on siirtymän ja sitä edeltävien ja seuraavien viiden merkin sisällä.

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

Java- sisällönhallinnan aputoiminto

 

Nämä kontekstitiedot näkyvät automaattisesti silloin, kun tekstiin lisätään merkit "#":

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

Sisällönhallinnan aputoiminnon kokoonpano

Sisällönhallinnan aputoiminnon ulkoasun ja toiminnan voi määrittää IContentAssistant-rajapinnan avulla. Sillä voidaan esimerkiksi määrittää automaattisen aktivoinnin aikakatkaisu ja pikaohjeiden suunta ja väri.

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

Luo sisällönhallinnan aputoiminto ja kytke se näppäinsidonnan avulla

Jotta käyttäjät voisivat kutsua sisällönhallinnan aputoiminnon, on luotava toiminto ja määritettävä sen kokoonpano. Kyseinen toimi tehdään tavallisesti luokan AbstractTextEditor.createActions() aliluokan toteutuksessa:

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);
	...
}
Muokkausohjelman toimintopalkin lisäysluokka on laajennettava, jotta toiminto näkyisi päävalikossa:
...
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);
}
...