Έγγραφα και διαμερίσματα

Το πλαίσιο του κειμένου πλατφόρμας ορίζει ένα μοντέλο εγγράφου για κείμενο και παρέχει μια προβολή που εμφανίζει κείμενο χρησιμοποιώντας αυτό το μοντέλο. Αρχικά θα εξετάσουμε το παράδειγμα λειτουργίας επεξεργασίας Java και τον τρόπο με τον οποίο χρησιμοποιεί αυτό το μοντέλο.  Δε θα εστιάσουμε στη βασική μηχανική της καταχώρησης μιας επέκτασης λειτουργίας επεξεργασίας, εφόσον το έχουμε ήδη αναλύσει στην ενότητα org.eclipse.ui.editors.  Αντίθετα, θα κοιτάξουμε τα χαρακτηριστικά του τρόπου υλοποίησης της κλάσης λειτουργίας επεξεργασίας στο παράδειγμα.

Παροχείς εγγράφων και έγγραφα

Στον πάγκο εργασίας, μια λειτουργία επεξεργασίας ανοίγει συνήθως όταν ο χρήστης επιλέγει να ανοίξει ένα στοιχείο τομέα (όπως ένα αρχείο ή ένα στοιχείο αποθηκευμένο σε αρχείο αποθήκευσης).  Όταν δημιουργηθεί η λειτουργία επεξεργασίας, γίνεται αντιστοίχιση με τα δεδομένα εισόδου μιας λειτουργίας επεξεργασίας (IEditorInput), τα οποία περιγράφουν το αντικείμενο που τροποποιείται.

Το παράδειγμα της λειτουργίας επεξεργασίας Java ανοίγει όταν ο χρήστης ανοίξει ένα αρχείο με την επέκταση "*.jav".  Σε αυτή την περίπτωση, τα δεδομένα εισόδου στη λειτουργία επεξεργασίας έχουν τη μορφή IFileEditorInput.  Το πλαίσιο κειμένου πλατφόρμας γνωρίζει πολύ λίγα πράγματα σχετικά με τα δεδομένα εισόδου της λειτουργίας επεξεργασίας.  Λειτουργεί με ένα μοντέλο παρουσίασης, που ονομάζεται IDocument, για τα δεδομένα εισόδου, έτσι ώστε να μπορεί να εμφανίζει και να διαχειρίζεται αποτελεσματικά ένα κείμενο.

Αυτό σημαίνει πως πρέπει να υπάρχει τρόπος αντιστοίχισης ενός αναμενόμενου μοντέλου τομέα (τα δεδομένα εισόδου της λειτουργίας επεξεργασίας) με το μοντέλο παρουσίασης.  Η αντιστοίχιση ορίζεται σε μια κλάση IDocumentProvider.  Εφόσον δοθούν δεδομένα εισόδου λειτουργίας επεξεργασίας, ο παροχέας εγγράφων επιστρέφει ένα κατάλληλο IDocument.

Στο παράδειγμα Java γίνεται μεταβίβαση της κλάσης TextFileDocumentProvider που ορίζεται από την πρόσθετη λειτουργία org.eclipse.ui.editors. Η επέκταση org.eclipse.ui.editors.documentProviders χρησιμοποιείται για τον ορισμό αντιστοιχίσεων ανάμεσα σε είδη δεδομένων εισόδου λειτουργίας επεξεργασίας (ή επεκτάσεις αρχείων) και παροχείς εγγράφων. Η πρόσθετη λειτουργία των λειτουργιών επεξεργασίας ορίζει τον παροχέα εγγράφων με τον εξής τρόπο:

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

Αυτό το σημείο επέκτασης επιτρέπει στις πρόσθετες λειτουργίες να καταχωρούν παροχείς εγγράφων και να τους αντιστοιχίζουν είτε με επέκταση αρχείου είτε με μια κλάση δεδομένων εισόδου λειτουργίας επεξεργασίας. Εφόσον το παράδειγμα της λειτουργίας επεξεργασίας Java δεν ορίζει τη δική του επέκταση παροχέα εγγράφων, μεταβιβάζεται σε αυτό ο γενικός παροχέας εγγράφων που έχει προσδιορισθεί για όλα τα είδη δεδομένων εισόδου που ανήκουν στην κλάση IStorageEditorInput. Όταν ο χρήστης ανοίγει ένα αρχείο για τροποποίηση, η πλατφόρμα διαχειρίζεται τις λεπτομέρειες για τη δημιουργία της κατάλληλης χρήσης παροχέα εγγράφων. Αν ένας συγκεκριμένος παροχέας εγγράφων έχει καταχωρηθεί για την επέκταση αρχείου, θα χρησιμοποιηθεί αυτός. Αν δεν υπάρχει συγκεκριμένος παροχέας εγγράφων για την επέκταση αρχείου, τότε θα χρησιμοποιηθεί το είδος δεδομένων εισόδου της λειτουργίας επεξεργασίας για την εύρεση του κατάλληλου παροχέα.

Χρησιμοποιώντας τον γενικό παροχέα εγγράφων πλατφόρμας, το παράδειγμα λειτουργίας επεξεργασίας Java μπορεί να επωφεληθεί από όλες τις λειτουργίες του παροχέα εγγράφων, όπως τη δημιουργία ενδιάμεσης μνήμης αρχείου και άλλες βελτιστοποιήσεις.

Ρύθμιση εγγράφου

Εφόσον η λειτουργία επεξεργασίας Java χρησιμοποιεί τον παροχέα εγγράφων κειμένου πλατφόρμας, πώς είναι δυνατό να παρέχει ειδική συμπεριφορά για τη διαχείριση αρχείων Java;

Η επέκταση org.eclipse.core.filebuffers.documentSetup χρησιμοποιείται για τον ορισμό αντιστοιχίσεων ανάμεσα σε επεκτάσεις αρχείων και μια κλάση IDocumentSetupParticipant. Το συστατικό στοιχείο συμμετοχής ρυθμίσεων θα ρυθμίσει το έγγραφο με κάθε ειδική λειτουργία εφόσον παρέχεται στη λειτουργία επεξεργασίας.

<extension
	id="ExampleJavaDocumentSetupParticipant"
	name="%documentSetupParticipantName"
	point="org.eclipse.core.filebuffers.documentSetup">
	<participant
		extensions="jav"
		class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant">
	</participant>
</extension>   

Αυτός ο ορισμός επέκτασης δίνει στο παράδειγμα την ευκαιρία να ρυθμίσει το έγγραφο για ειδικές εργασίες Java. Τι κάνει λοιπόν το στοιχείο JavaDocumentSetupParticipant; Θα εξετάσουμε μια απλοποιημένη εκδοχή της μεθόδου ρύθμισης.

 	public void setup(IDocument document) {
		...
		IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
		partitioner.connect(document);
		...
	}

Ο κωδικός ρυθμίσεων ρυθμίζει ένα αντικείμενο που ονομάζεται λειτουργία διαμερισμού.

Διαμερίσματα

Η λειτουργία διαμερισμού (IDocumentPartitioner) ευθύνεται για το διαμερισμό του εγγράφου σε μη επικαλυπτόμενες περιοχές που ονομάζονται διαμερίσματα.  Τα διαμερίσματα (που αντιπροσωπεύονται από την κλάσηITypedRegion) είναι χρήσιμα για τον διαφορετικό χειρισμό των διαφόρων ενοτήτων του εγγράφου σύμφωνα με λειτουργίες όπως η επισήμανση σύνταξης ή η μορφοποίηση.

Στην περίπτωση του παραδείγματος λειτουργίας επεξεργασίας Java, το έγγραφο χωρίζεται σε διαμερίσματα που αντιπροσωπεύουν σχόλια javadoc, σχόλια πολλαπλών γραμμών και οτιδήποτε άλλο.  Για κάθε περιοχή αναλογεί ένα είδος περιεχομένου και μια θέση στο έγγραφο.  Οι θέσεις ενημερώνονται ενώσο ο χρήστης τροποποιεί το κείμενο.

Διαμερισμός εγγράφου βάσει κανόνων

Ο καθορισμός της κατάλληλης υλοποίησης για μια λειτουργία διαμερισμού εγγράφου εξαρτάται από την κάθε λειτουργία επεξεργασίας.  Για τη σάρωση εγγράφου βάσει κανόνων παρέχεται υποστήριξη στο πακέτο org.eclipse.jface.text.rules .  Η χρήση λειτουργίας σάρωσης βάσει κανόνων επιτρέπει σε μια λειτουργία επεξεργασίας να χρησιμοποιήσει την κλάση FastPartitioner που παρέχεται από το πλαίσιο.

IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);

Η RuleBasedPartitionScanner είναι η υπερκλάση για τις λειτουργίες σάρωσης βάσει κανόνων.  Οι υποκλάσεις ευθύνονται για την αρίθμηση και υλοποίηση των κανόνων που πρέπει να χρησιμοποιηθούν κατά τη σάρωση ενός εγγράφου για τον διαχωρισμό στοιχείων όπως οι οριοθέτες γραμμών, τα κενά διαστήματα και τα γενικά μοτίβα.   Η κλάση JavaPartitionScanner του παραδείγματος ορίζει κανόνες για τον διαχωρισμό σχολίων γραμμής, σταθερών χαρακτήρων, javadoc, σχολίων πολλαπλών γραμμών και λέξεων.  Αυτό γίνεται στη λειτουργία κατασκευής της λειτουργίας σάρωσης:

public JavaPartitionScanner() {
	super();
	IToken javaDoc= new Token(JAVA_DOC);
	IToken comment= new Token(JAVA_MULTILINE_COMMENT);

	List rules= new ArrayList();
	// Add rule for single line comments.
	rules.add(new EndOfLineRule("//", Token.UNDEFINED)); 

	// Add rule for strings and character constants.
	rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); 
	rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); 

	// Add special case word rule.
	rules.add(new WordPredicateRule(comment));

	// Add rules for multi-line comments and javadoc.
	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);
}

Ανατρέξτε στις κλάσεις του πακέτου org.eclipse.jface.text.rules για περισσότερες λεπτομέρειες σχετικά με τον ορισμό των κανόνων και των ειδών κανόνων που είναι διαθέσιμοι.  Θα επανέλθουμε στις λειτουργίες σάρωσης όταν θα εξετάσουμε τη λειτουργία χρωματισμός σύνταξης.