Plages
Une plage est délimitée par deux ancres, une ancre de début et une ancre de fin. Une ancre existe dans un emplacement imaginaire entre deux caractères. L’ancre de début est liée au texte qui suit l’ancre et l’ancre de fin est liée au texte qui précède l’ancre. Les ancres de début et de fin peuvent exister au même emplacement. Dans ce cas, la plage a une longueur nulle.
Par exemple, commencez par le texte suivant :
This is text.
Appliquez maintenant une plage à ce texte avec les ancres de début et de fin à la position 0. Elle est représentée visuellement comme suit :
<anchor></anchor>This is text.
Les ancres n’occupent pas d’espace dans le texte lui-même. Il s’agit d’une plage de longueur nulle et son texte est vide.
Maintenant, déplacez l’ancre d’extrémité +3 positions. Elle est représentée visuellement comme suit :
<anchor>Thi</anchor>s is text.
L’ancre de début est positionnée juste avant le caractère à la position 0 et l’ancre de fin est positionnée juste après le caractère à la position 3, car l’ancre de fin s’est déplacée vers les 3 emplacements à droite. La plage de texte est maintenant « Thi ».
En outre, l’ancre de début ne peut pas être faite pour suivre l’ancre de fin et l’ancre de fin ne peut pas être faite pour précéder l’ancre de début.
Chaque ancre a un paramètre de gravité qui détermine la façon dont l’ancre répond lorsque du texte est inséré dans le flux de texte à la position d’ancrage. Lorsqu’une insertion est effectuée à la position d’une ancre, un ajustement doit être effectué à la position de l’ancre. La gravité détermine comment cet ajustement de position d’ancrage est effectué.
Exemple :
It is <anchor></anchor>cold today.
Si le mot « very » est inséré à la position de plage, l’ancre de début peut être positionnée avant ou après le mot inséré :
It is <anchor>very </anchor>cold today.
- Ou -
It is very <anchor></anchor>cold today.
La gravité de l’ancre spécifie comment l’ancre est repositionnée lorsqu’une insertion est effectuée à sa position. La gravité peut être vers l’arrière ou vers l’avant.
Si l’ancre a une gravité vers l’arrière, l’ancre se déplace vers l’arrière, par rapport au point d’insertion, de sorte que le texte inséré suit l’ancre :
It is <anchor>very </anchor>cold today.
Si l’ancre a une gravité vers l’avant, l’ancre avance (par rapport au point d’insertion) lors de l’insertion de sorte que le texte inséré précède l’ancre :
It is very <anchor></anchor>cold today.
Il existe deux façons de créer une « copie » d’un objet de plage. La première consiste à créer un clone de la plage à l’aide de ITfRange::Clone. La deuxième consiste à effectuer une sauvegarde de la plage à l’aide de ITfContext::CreateRangeBackup.
Un clone est une copie d’une plage qui n’inclut pas de données statiques. Les ancres de la plage sont copiées, mais le clone couvre toujours une plage de texte dans le contexte. Un clone est un objet de plage à tous les égards. Cela signifie que le texte et les propriétés d’une plage cloné sont dynamiques et changent si le texte et/ou les propriétés de la plage couverte par le clone changent.
Une sauvegarde stocke le texte et les propriétés d’une plage au moment où la sauvegarde est effectuée en tant que données statiques. Une sauvegarde clone également la plage d’origine afin que les modifications apportées à la taille et à la position de la plage d’origine puissent être suivies. Cela signifie que le texte et les propriétés d’une plage sauvegardée sont statiques et ne changent pas si le texte et/ou les propriétés de la plage couverte par la sauvegarde changent.
Par exemple, la plage suivante (pRange) dans le contexte :
"This is some <pRange>text</pRange>."
À présent, effectuez un clone et une sauvegarde de cette plage :
ITfRange *pClone;
ITfRangeBackup *pBackup;
pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);
À présent, les objets contiennent les éléments suivants :
pRange = "text"
pClone = "text"
pBackup = "text"
Modifiez maintenant le texte de pRange :
WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));
À présent, les objets contiennent les éléments suivants :
Context = "This is some other words."
pRange = "other words"
pClone = "other words"
pBackup = "text"
La définition du texte a entraîné la modification du texte dans le contexte. Cela a également provoqué la modification de l’ancre de fin de pRange et pClone. pClone contient désormais « autres mots », car le texte a changé dans la plage et ces modifications sont suivies par toutes les plages. Lorsque le texte couvert par pRange et pClone a changé, le texte de pClone a également changé.
Le texte dans pBackup n’a pas changé par rapport au pRange d’origine, car les données (texte et propriétés) de la sauvegarde ne sont pas liées au contexte et sont stockées séparément. Le clone contenu dans la sauvegarde change en fait, mais les données sont statiques.
Lors de la restauration d’une sauvegarde, la sauvegarde peut être appliquée au clone au sein de la sauvegarde ou à une plage entièrement différente. Pour appliquer la sauvegarde au clone dans la sauvegarde, transmettez NULL à ITfRangeBackup::Restore , comme indiqué dans l’exemple de code suivant :
pBackup->Restore(ec, NULL);
À présent, les objets contiennent les éléments suivants :
Context = "This is some text."
pRange = "text"
pClone = "text"
pBackup = "text"
Pour restaurer la sauvegarde dans une autre plage, passez un pointeur vers l’objet de plage lors de l’appel de ITfRangeBackup::Restore. Le texte et les propriétés sauvegardés seront appliqués à la nouvelle plage. Par exemple, à l’aide de l’exemple ci-dessus avant l’appel De restauration , pRange sera modifié pour illustrer ceci :
LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);
À présent, les objets contiennent les éléments suivants :
Context = "This is some other words."
pRange = "other wor"
pClone = "other words"
pBackup = "text"
Lorsque l’ancre de fin de pRange a été décalée vers les deux emplacements gauches, l’ancre de fin de pClone n’a pas changé.
Restaurez maintenant la sauvegarde à l’aide de pRange avec l’exemple de code suivant :
pBackup->Restore(ec, pRange);
À présent, les objets contiennent les éléments suivants :
Context = "This is some textds."
pRange = "text"
pClone = "textds"
pBackup = "text"
Le texte couvert par pRange a été remplacé par « text », une partie du texte couvert par pClone a été modifiée et pBackup change pour correspondre à pRange.