Dokumentumok és partíciók

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.

Dokumentumszolgáltatók és dokumentumok

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.

Dokumentumbeállítás

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.

Partíciók

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.

Szabály alapú dokumentumparticionálás

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.