Intervalli
Ancoraggi
Un intervallo è delimitato da due ancoraggi, un ancoraggio iniziale e un ancoraggio di fine. Un ancoraggio esiste in uno slot immaginario tra due caratteri. L'ancoraggio iniziale è correlato al testo che segue l'ancoraggio e l'ancoraggio finale è correlato al testo che precede l'ancoraggio. Gli ancoraggi di inizio e di fine possono esistere nella stessa posizione. In questo caso, l'intervallo ha una lunghezza zero.
Ad esempio, iniziare con il testo seguente:
This is text.
Applicare ora un intervallo a questo testo con gli ancoraggi iniziale e finale nella posizione 0. Viene rappresentato visivamente come:
<anchor></anchor>This is text.
Gli ancoraggi non occupano spazio all'interno del testo stesso. Si tratta di un intervallo di lunghezza zero e il relativo testo è vuoto.
Spostare ora l'ancoraggio finale +3 posizioni. Viene rappresentato visivamente come:
<anchor>Thi</anchor>s is text.
L'ancoraggio iniziale viene posizionato appena prima del carattere nella posizione 0 e l'ancoraggio finale viene posizionato subito dopo il carattere nella posizione 3 perché l'ancoraggio finale è stato spostato a destra 3 posizioni. L'intervallo di testo è ora "Thi".
Non è inoltre possibile impostare l'ancoraggio iniziale per seguire l'ancoraggio finale e non è possibile impostare l'ancoraggio finale per precedere l'ancoraggio iniziale.
Gravità ancoraggio
Ogni ancoraggio ha un'impostazione di gravità che determina la risposta dell'ancoraggio quando il testo viene inserito nel flusso di testo nella posizione di ancoraggio. Quando un inserimento viene effettuato in corrispondenza della posizione di un ancoraggio, è necessario effettuare una regolazione nella posizione dell'ancoraggio. La gravità determina la modalità di regolazione della posizione di ancoraggio.
Ad esempio:
It is <anchor></anchor>cold today.
Se la parola "molto " viene inserita nella posizione dell'intervallo, l'ancoraggio iniziale può essere posizionato prima o dopo la parola inserita:
It is <anchor>very </anchor>cold today.
oppure
It is very <anchor></anchor>cold today.
La gravità di ancoraggio specifica il modo in cui l'ancoraggio viene riposizionato quando viene effettuato un inserimento nella posizione. La gravità può essere all'indietro o in avanti.
Se l'ancoraggio ha gravità all'indietro, l'ancoraggio si sposta all'indietro, rispetto al punto di inserimento, in modo che il testo inserito segua l'ancoraggio:
It is <anchor>very </anchor>cold today.
Se l'ancoraggio ha una gravità in avanti, l'ancoraggio si sposta in avanti (rispetto al punto di inserimento) all'inserimento in modo che il testo inserito precede l'ancoraggio:
It is very <anchor></anchor>cold today.
Cloni e backup
Esistono due modi per creare una "copia" di un oggetto intervallo. Il primo consiste nel creare un clone dell'intervallo usando ITfRange::Clone. Il secondo consiste nell'eseguire un backup dell'intervallo usando ITfContext::CreateRangeBackup.
Un clone è una copia di un intervallo che non include dati statici. Gli ancoraggi dell'intervallo vengono copiati, ma il clone copre ancora un intervallo di testo all'interno del contesto. Un clone è un oggetto range in tutti i punti di vista. Ciò significa che il testo e le proprietà di un intervallo clonato sono dinamici e cambieranno se il testo e/o le proprietà dell'intervallo coperto dalle modifiche del clone.
Un backup archivia il testo e le proprietà di un intervallo al momento in cui il backup viene eseguito come dati statici. Un backup clona anche l'intervallo originale in modo che sia possibile tenere traccia delle modifiche alle dimensioni e alla posizione dell'intervallo originale. Ciò significa che il testo e le proprietà per un intervallo di backup sono statici e non cambiano se il testo e/o le proprietà dell'intervallo coperto dalle modifiche del backup.
Ad esempio, l'intervallo seguente (pRange) all'interno del contesto:
"This is some <pRange>text</pRange>."
Creare ora un clone e un backup di questo intervallo:
ITfRange *pClone;
ITfRangeBackup *pBackup;
pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);
Gli oggetti contengono ora quanto segue:
pRange = "text"
pClone = "text"
pBackup = "text"
Modificare ora il testo di pRange:
WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));
Gli oggetti contengono ora quanto segue:
Context = "This is some other words."
pRange = "other words"
pClone = "other words"
pBackup = "text"
L'impostazione del testo ha causato la modifica del testo all'interno del contesto. Ha anche causato la modifica dell'ancoraggio finale di pRange e pClone. pClone ora contiene "altre parole" perché il testo è stato modificato all'interno dell'intervallo e queste modifiche vengono registrate da tutti gli intervalli. Quando il testo coperto da pRange e pClone è stato modificato, anche il testo di pClone è cambiato.
Il testo in pBackup non è stato modificato da pRange originale perché i dati (testo e proprietà) nel backup non sono correlati al contesto e vengono archiviati separatamente. Il clone contenuto nel backup cambia effettivamente, ma i dati sono statici.
Quando si ripristina un backup, il backup può essere applicato al clone all'interno del backup o a un intervallo diverso. Per applicare il backup al clone all'interno del backup, passare NULL a ITfRangeBackup::Restore come illustrato nell'esempio di codice seguente:
pBackup->Restore(ec, NULL);
Gli oggetti contengono ora quanto segue:
Context = "This is some text."
pRange = "text"
pClone = "text"
pBackup = "text"
Per ripristinare il backup in un intervallo diverso, passare un puntatore all'oggetto range quando si chiama ITfRangeBackup::Restore. Il testo e le proprietà di cui è stato eseguito il backup verranno applicate al nuovo intervallo. Ad esempio, usando l'esempio precedente prima della chiamata di ripristino , pRange verrà modificato per dimostrare quanto segue:
LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);
Gli oggetti contengono ora quanto segue:
Context = "This is some other words."
pRange = "other wor"
pClone = "other words"
pBackup = "text"
Quando l'ancoraggio finale di pRange è stato spostato a sinistra due posizioni, l'ancoraggio finale di pClone non è cambiato.
Ripristinare ora il backup usando pRange con l'esempio di codice seguente:
pBackup->Restore(ec, pRange);
Gli oggetti contengono ora quanto segue:
Context = "This is some textds."
pRange = "text"
pClone = "textds"
pBackup = "text"
Il testo coperto da pRange è stato sostituito con "text", una parte del testo coperto da pClone è stata modificata e le modifiche di pBackup in modo che corrispondano a pRange.