Il framework del testo della piattaforma definisce un modello di documento per il testo e fornisce un visualizzatore che visualizza il testo servendosi di questo modello. Verrà illustrato come l'editor di esempio Java utilizza questo modello. Non verranno analizzati i meccanismi di base della registrazione di un estensione di un editor, dal momento che questo aspetto è stato già affrontato nella sezione relativa a org.eclipse.ui.editors. Verranno invece descritte le specifiche relative alle modalità di implementazione della classe dell'editor nell'esempio.
Nel workbench, un editor viene generalmente aperto quando l'utente seleziona un elemento di dominio (ad esempio un file o un elemento archiviato all'interno di un file di archivio) e lo apre. Quando viene creato, l'editor viene associato all'input di un editor (IEditorInput), che descrive l'oggetto sottoposto a modifica.
L'esempio di editor Java si apre quando l'utente apre un file con estensione "*.jav". In questo caso, l'input dell'editor è costituito da IFileEditorInput. Il framework del testo della piattaforma non utilizza tutto l'input dell'editor. Per l'input si serve di un modello di presentazione, denominato IDocument, che consente di visualizzare effettivamente e di modificare il testo.
Ciò significa che deve esistere un modo per eseguire l'associazione tra un modello di dominio previsto (l'input dell'editor) e il modello di presentazione. Tale associazione viene definita in un IDocumentProvider. Dato un input dell'editor, il fornitore di documenti restituisce un IDocument appropriato.
L'esempio dell'editor Java eredita il TextFileDocumentProvider definito dal plugin org.eclipse.ui.editors. L'estensioneorg.eclipse.ui.editors.documentProviders viene utilizzata per definire le mappature tra i tipi di input dell'editor (o estensioni file) e i fornitori dei documenti. Il plugin degli editor definisce il fornitore del documento come segue:
<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>
Il punto di estensione consente ai plugin di registrare i fornitori dei documenti e di associarli ad un'estensione file o ad una classe di input dell'editor. Poiché l'esempio di editor Java non definisce l'estensione del fornitore del documento, eredita il fornitore del documento generico specificato per tutti i tipi di input IStorageEditorInput. Quando l'utente apre un file per la modifica, la piattaforma gestisce i dettagli relativi alla creazione dell'istanza del fornitore di documenti. Se uno specifico fornitore di documenti viene registrato per l'estensione file, verrà utilizzato quel fornitore di documenti. Se non esiste alcun fornitore di documenti specifico per l'estensione file, il tipo di input dell'editor verrà utilizzato per individuare il fornitore appropriato.
Utilizzando il fornitore di documenti generico della piattaforma, l'esempio di editor Java può trarre vantaggio da tutte le funzioni del fornitore di documenti, quali il buffer dei file e altri tipi di ottimizzazione.
Poiché l'editor Java utilizza il fornitore di documenti di testo della piattaforma, in che modo può fornire un comportamento specifico per la gestione dei file Java?
L'estensione org.eclipse.core.filebuffers.documentSetup viene utilizzata per definire le mappature tra le estensioni e un IDocumentSetupParticipant. I partecipanti all'impostazione imposteranno il documento con le eventuali funzioni speciali, una volta fornite all'editor.
<extension id="ExampleJavaDocumentSetupParticipant" name="%documentSetupParticipantName" point="org.eclipse.core.filebuffers.documentSetup"> <participant extensions="jav" class="org.eclipse.ui.examples.javaeditor.JavaDocumentSetupParticipant"> </participant> </extension>
Questa definizione di estensione fornisce all'esempio una possibilità per impostare il documento per attività specifiche di Java. Quali sono le funzioni di JavaDocumentSetupParticipant? Viene visualizzata una versione semplificata del metodo setup.
public void setup(IDocument document) { ... IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES); partitioner.connect(document); ... }
Il codice di setup configura un oggetto chiamato strumento di suddivisione dei documenti.
Lo strumento di suddivisione dei documenti (IDocumentPartitioner) è responsabile della suddivisione del documento in porzioni che non si sovrappongono, denominate partizioni. Le partizioni (rappresentate da ITypedRegion) sono utili per il trattamento diversificato delle sezioni del documento che tenga conto di funzioni quali formattazione o evidenziazione della sintassi.
Nel caso dell'esempio dell'editor Java, il documento viene suddiviso in partizioni che rappresentano i commenti javadoc, i commenti su più righe e tutti gli altri elementi. A ciascuna regione viene assegnato un tipo di contenuto e la relativa posizione nel documento. Le posizioni vengono aggiornate in base alle modifiche apportate al testo dall'utente.
L'implementazione appropriata per lo strumento di suddivisione in partizioni dipende dal singolo editor. In org.eclipse.jface.text.rules viene fornito supporto per la scansione del documento basata su regole. L'utilizzo di una scansione basata su regole consente l'utilizzo da parte di un editor del FastPartitioner fornito dal framework.
IDocumentPartitioner partitioner= new FastPartitioner(JavaEditorExamplePlugin.getDefault().getJavaPartitionScanner(), JavaPartitionScanner.JAVA_PARTITION_TYPES);
RuleBasedPartitionScanner è la superclasse per gli scanner basati su regole. Le sottoclassi sono responsabili del conteggio e dell'implementazione delle regole da utilizzare per distinguere token quali i delimitatori di riga, lo spazio e modelli generici durante la scansione di un documento. Lo JavaPartitionScanner dell'esempio definisce regole per la distinzione dei commenti a riga singola, le costanti di caratteri, la javadoc, i commenti su più righe e le parole. Questa operazione viene eseguita nel costruttore dello scanner:
public JavaPartitionScanner() { super(); IToken javaDoc= new Token(JAVA_DOC); IToken comment= new Token(JAVA_MULTILINE_COMMENT); List rules= new ArrayList(); // Aggiungere una regola per i commenti a riga singola. rules.add(new EndOfLineRule("//", Token.UNDEFINED)); // Aggiungere una regola per stringhe e costanti di caratteri. rules.add(new SingleLineRule("\"", "\"", Token.UNDEFINED, '\\')); rules.add(new SingleLineRule("'", "'", Token.UNDEFINED, '\\')); // Aggiungere una speciale regola per la distinzione tra maiuscole e minuscole. rules.add(new WordPredicateRule(comment)); // Aggiungere regole per commenti multilinea e 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); }
Vedere le classi in org.eclipse.jface.text.rules per ulteriori dettagli sulla definizione di regole e sui tipi di regole disponibili. L'argomento degli scanner verrà ripreso quando verrà illustrata la colorazione della sintassi.