Het platformtekstframework bevat een documentmodel voor tekst en een viewer waarmee tekst volgens dit model wordt weergegeven. Aan de hand van het voorbeeld van de Java-editor wordt besproken hoe dit model wordt gebruikt. Hierbij wordt niet meer ingegaan op de basisprocedure voor het registreren van een editorextensie, omdat dit onderwerp al aan de orde is gekomen in de sectie over org.eclipse.ui.editors. In plaats daarvan vindt u hier een gedetailleerde beschrijving van de implementatie van de editorklasse in het voorbeeld.
In de workbench wordt een editor gewoonlijk geopend wanneer de gebruiker een domeinelement selecteert (bijvoorbeeld een bestand of een element dat in een archiefbestand is opgeslagen) en vervolgens opent. Wanneer de editor wordt gemaakt, wordt deze gekoppeld aan editorinvoer (IEditorInput), die fungeert als beschrijving van het object dat wordt bewerkt.
De Java-voorbeeldeditor wordt geopend wanneer de gebruiker een bestand met de extensie "*.jav" opent. In dit geval is de invoer voor de editor een IFileEditorInput. In het platformtekstframework wordt weinig informatie aangenomen over de editorinvoer zelf. Deze werkt met een presentatiemodel, een zogeheten IDocument, voor de invoer zodat tekst effectief kan worden weergegeven en bewerkt.
Hiertoe is een methode nodig om een verwacht domeinmodel (de editorinvoer) aan het presentatiemodel te koppelen. Deze koppeling wordt gedefinieerd in een IDocumentProvider. Bij bepaalde editorinvoer wordt door de documentprovider een toepasselijk IDocument geretourneerd.
In het Java-editorvoorbeeld wordt de TextFileDocumentProvider van de plugin org.eclipse.ui.editors overgenomen. De extensie org.eclipse.ui.editors.documentProviders wordt gebruikt om koppelingen tussen de editorinvoertypen (of bestandsextensies) en documentproviders tot stand te brengen. De documentprovider van de editorplugin is als volgt gedefinieerd:
<extension point="org.eclipse.ui.editors.documentProviders"> <provider class="org.eclipse.ui.editors.text.TextFileDocumentProvider" inputTypes="org.eclipse.ui.IStorageEditorInput" id="org.eclipse.ui.editors.text.StorageDocumentProvider"> </provider> </extension>
Met dit extensiepunt kunnen plugins documentproviders registreren en deze aan een bestandsextensie of een editorinvoerklasse koppelen. Omdat voor het Java-editorvoorbeeld geen afzonderlijke documentproviderextensie is gedefinieerd, wordt deze gekoppeld aan de generieke documentprovider die is opgegeven voor alle invoertypen met het kenmerk IStorageEditorInput. Wanneer de gebruiker een bestand voor bewerking opent, zorgt het platform ervoor dat de juiste documentproviderinstance wordt aangemaakt. Als voor de bestandsextensie een specifieke documentprovider is geregistreerd, wordt die provider gebruikt. Als voor de bestandsextensie geen specifieke documentprovider is opgegeven, wordt de juiste provider bepaald op basis van het editorinvoertype.
Door de generieke documentprovider van het platform te gebruiken, kunt u de Java-voorbeeldeditor laten profiteren van alle features van de documentprovider, zoals de bestandsbuffer en andere optimalisaties.
Hoe kan een aangepast gedrag voor de verwerking van Java-bestanden worden gedefinieerd als de Java-editor gebruikmaakt van de tekstdocumentprovider van het platform?
Met de extensie org.eclipse.core.filebuffers.documentSetup kunt u koppelingen tussen bestandsextensies en een IDocumentSetupParticipant definiëren. De instellingendeelnemer voorziet het document van aangepaste instellingen nadat het aan de editor is aangeleverd.
<extension id="ExampleJavaDocumentSetupParticipant" name="%documentSetupParticipantName" point="org.eclipse.core.filebuffers.documentSetup"> <participant extensions="jav" class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant"> </participant> </extension>
Dankzij deze extensiedefinitie kan het document worden ingesteld voor Java-specifieke taken. Maar hoe werkt JavaDocumentSetupParticipant nu precies? Zie de volgende vereenvoudigde versie van de methode setup.
public void setup(IDocument document) { ... IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES); partitioner.connect(document); ... }
De setup-code configureert een bepaald object, dat een partitioner wordt genoemd.
De partitioner (IDocumentPartitioner) zorgt ervoor dat het document wordt onderverdeeld in niet-overlappende regio's. Deze regio's noemen we partities. Partities (ITypedRegion) zijn nuttig om verschillende secties van het document op verschillende wijzen te verwerken met betrekking tot features als de accentuering of opmaak van syntaxis.
In het Java-editorvoorbeeld wordt het document onderverdeeld in partities voor Javadoc-commentaar, commentaar dat bestaat uit meerdere regels, en alle overige content. Elke regio wordt toegewezen aan een inhoudtype en de huidige positie in het document. De posities worden bijgewerkt als de gebruiker de tekst bewerkt.
De juiste implementatie voor een documentpartitioner moet per editor worden vastgesteld. org.eclipse.jface.text.rules biedt ondersteuning voor het scannen van documenten op basis van regels. Met een op regels gebaseerd scanprogramma kan een editor gebruikmaken van de FastPartitioner van het framework.
IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
RuleBasedPartitionScanner is de superklasse voor op regels gebaseerde scanprogramma's. Subklassen zijn verantwoordelijk voor het de enumeratie en implementatie van de regels die moeten worden gebruikt om tokens als regelscheidingstekens, witruimte en generieke patronen te onderscheiden bij het scannen van een document. In de JavaPartitionScanner van het voorbeeld zijn regels gedefinieerd voor het onderscheiden van één-regelig commentaar, tekenconstanten, Javadoc, meer-regelig commentaar en woorden. Deze worden gedefinieerd in de constructor van het scanprogramma:
public JavaPartitionScanner() { super(); IToken javaDoc= new Token(JAVA_DOC); IToken comment= new Token(JAVA_MULTILINE_COMMENT); List rules= new ArrayList(); // Regel toevoegen voor commentaar dat bestaat uit één regel. rules.add(new EndOfLineRule("//", Token.UNDEFINED)); // Regel toevoegen voor tekenreeksen en tekenconstanten. rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); // Regel toevoegen voor bijzondere woorden. rules.add(new WordPredicateRule(comment)); // Regels toevoegen voor Javadoc en commentaar dat bestaat uit meerdere regels. rules.add(new MultiLineRule("/**", "*/", javaDoc, (char) 0, true)); rules.add(new MultiLineRule("/*", "*/", comment, (char) 0, true)); IPredicateRule[] result= new IPredicateRule[rules.size()]; rules.toArray(result); setPredicateRules(result); }
Zie de klassen in org.eclipse.jface.text.rules voor meer informatie over het definiëren van regels en alle beschikbare soorten regels. Scanprogrammas komen opnieuw aan de orde in het onderwerp Syntaxiskleuren.