A platformszöveg-keretrendszer megad egy dokumentummodellt a szöveghez, és egy megjelenítőt biztosít, amely a modell segítségével megjeleníti a szöveget. Először a Java szerkesztő példát tekintjük meg valamint azt, hogy hogyan használja a modellt. A szerkesztőkiterjesztés bejegyzésének alap mechanizmusaival nem foglalkozunk, mivel ezt már áttekintettük az org.eclipse.ui.editors szakaszban. Ehelyett azt tekintjük át, hogy a szerkesztőosztály hogyan valósítható meg a példában.
A munkaterületen a szerkesztő jellemzően akkor kerül megnyitásra, ha a felhasználó kiválaszt egy tartományelemet (mint például egy archív fájlban tárolt fájl vagy elem) és megnyitja ezt. A szerkesztő létrehozáskor hozzá van rendelve egy szerkesztőkimenethez (IEditorInput), amely leírja a szerkesztendő objektumot.
A Java szerkesztő példa akkor nyílik meg, amikor a felhasználó megnyit egy "*.jav" kiterjesztésű fájlt. Ebben az esetben a szerkesztő bemenete egy IFileEditorInput. A platform szöveg keretrendszer a szerkesztő bementről keveset tételez fel. Egy IDocument nevű megjelenítési modellt használ a bemenethez, így ez hatékonyan jelenítheti meg és kezelheti a szöveget.
Ez azt jelenti, hogy kell lennie egy leképezési módnak a várt tartománymodellről (a szerkesztőbemenet) a megjelenítési modellre. Ez a leképezés egy IDocumentProvider elemben van megadva. Egy adott szerkesztőbemenettel a dokumentumszerkesztő visszaad egy megfelelő IDocument dokumentumokat.
A Java szerkesztő példa örökli az org.eclipse.ui.editors bedolgozó által megadott TextFileDocumentProvider elemet. A org.eclipse.ui.editors.documentProviders kiterjesztés a szerkesztő bemeneti típusok (vagy fájlkiterjesztések) és a dokumentumszolgáltatók közt ad meg leképezéseket. A szerkesztő bedolgozó az alábbi módon adja meg a dokumentumszolgáltatót:
<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>
Ez a kiterjesztési pont lehetővé teszi a bedolgozók számára, hogy bejegyezzék a dokumentumszolgáltatókat és hozzárendeljék őket egy fájlkiterjesztéshez vagy egy szerkesztő bementi osztályhoz. Mivel a Java szerkesztő példa nem ad meg saját dokumentumszolgáltató-kiterjesztést, örökli az összes bemeneti típushoz megadott általános dokumentumszolgáltatót, amelyek IStorageEditorInput bemenetek. Amikor a felhasználó megnyit egy fájlt szerkesztésre, a platform kezeli a megfelelő dokumentumszolgáltató-példány létrehozásának részleteit. Ha egy adott dokumentumszolgáltató van bejegyezve a fájlkiterjesztéshez, akkor ezt használja a rendszer. Ha nincs egy adott dokumentumszolgáltató megadva a fájlkiterjesztéshez, akkor a rendszer szerkesztő bementi típusát használja a megfelelő szolgáltató megkereséséhez.
Az általános platform dokumentumszolgáltató használatával a Java szerkesztő példa kihasználhatja a dokumentumszolgáltató minden előnyét, mint például a fájlpufferelés és egyéb optimalizálások.
Mivel a Java szerkesztő a platform szöveg-dokumentumszolgáltatót használja, hogyan biztosítható speciális viselkedés a Java fájlok kezeléséhez?
A org.eclipse.core.filebuffers.documentSetup kiterjesztés megadja a fájlkiterjesztések és az IDocumentSetupParticipant közötti leképezést. A beállítás résztvevő beállítja a dokumentumot a speciális jellemzőkkel, ha biztosítva lett a szerkesztőhöz.
<extension id="ExampleJavaDocumentSetupParticipant" name="%documentSetupParticipantName" point="org.eclipse.core.filebuffers.documentSetup"> <participant extensions="jav" class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant"> </participant> </extension>
Ez a kiterjesztésdefiníció adja meg a példának a lehetőséget a dokumentum Java specifikus feladatokhoz beállításához. Mit csinál a JavaDocumentSetupParticipant? Megtekintjük a setup metódus egyszerűsített változatát.
public void setup(IDocument document) { ... IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES); partitioner.connect(document); ... }
A beállításkód beállít egy particionáló nevű objektumot.
A particionáló (IDocumentPartitioner) felelős a dokumentum átfedés nélküli részekre osztásáért, amelyeket partícióknak hívunk. A partíciók (az ITypedRegion reprezentálja őket) hasznosak a dokumentum különböző szakaszainak különböző kezeléséhez a funkciókat illetőleg, mint például a szintaxis kiemelés vagy formázás.
A Java szerkesztő példában a dokumentum olyan partíciókra van osztva, amelyek javadoc megjegyzéseket, többsoros megjegyzéseket és minden egyebet ábrázolnak. Minden rész hozzá van rendelve egy tartalomtípushoz és ennek pozíciójához a dokumentumban. A pozíciók frissítésre kerülnek, amikor a felhasználó szerkeszti a szöveget.
Minden szerkesztő meghatározza a dokumentumparticionáló megfelelő megvalósítását. Támogatást az org.eclipse.jface.text.rules biztosít a szabályalapú dokumentumelemzéshez. A szabályalapú elemző segítségével a szerkesztő használhatja a keretrendszer által biztosított FastPartitioner elemet.
IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
RuleBasedPartitionScannera szabály alapú elemzők szülőosztálya. Az alosztályok felelősek a szabályok felsorolásáért és megvalósításáért, amelyeket a dokumentum elemzésekor jelsorok megkülönböztetéséhez kell használni, mint például a sorhatárolók, szóközszerű karakterek és általános minták. A példa JavaPartitionScanner elem szabályokat határoz meg a sormegjegyzések karakterkonstansok, többsoros megjegyzések és szavak megkülönböztetéséhez. Ez az elemző konstruktorában történik:
public JavaPartitionScanner() { super(); IToken javaDoc= new Token(JAVA_DOC); IToken comment= new Token(JAVA_MULTILINE_COMMENT); List rules= new ArrayList(); // Szabály hozzáadása a sormegjegyzésekhez. rules.add(new EndOfLineRule("//", Token.UNDEFINED)); // Szabály hozzáadása a karaktersorozatokhoz és karakterkonstansokhoz. rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); // Szabály létrehozása. rules.add(new WordPredicateRule(comment)); // Szabályok hozzáadása a többsoros megjegyzésekhez és javadoc dokumentumokhoz. 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); }
A szabályok megadásával és a rendelkezés álló szabálytípusokkal kapcsolatos további információkért tekintse meg az org.eclipse.jface.text.rules elemben lévő osztályokat. Az elemzőket újból megtekintjük a szintaxisszínezés áttekintésekor.