Zakresy
Kotwice
Zakres jest rozdzielany dwoma kotwicami , kotwicą początkową i kotwicą końcową. Kotwica istnieje w wyimaginowanym miejscu między dwoma znakami. Kotwica początkowa odnosi się do tekstu, który następuje po kotwicy, a kotwica końcowa odnosi się do tekstu poprzedzającego kotwicę. W tej samej lokalizacji mogą istnieć kotwice początkowe i końcowe. W tym przypadku zakres ma zerową długość.
Na przykład zacznij od następującego tekstu:
This is text.
Teraz zastosuj zakres do tego tekstu z kotwicami początkowymi i końcowymi na pozycji 0. Jest ona wizualnie reprezentowana jako:
<anchor></anchor>This is text.
Kotwice nie zajmują żadnego miejsca w samym tekście. Jest to zakres o zerowej długości, a jego tekst jest pusty.
Teraz przesuń kotwicę końcową +3 pozycje. Jest ona wizualnie reprezentowana jako:
<anchor>Thi</anchor>s is text.
Kotwica początkowa jest umieszczona tuż przed znakiem w pozycji 0, a kotwica końcowa jest umieszczona tuż po znaku w pozycji 3, ponieważ kotwica końcowa została przeniesiona do odpowiednich 3 miejsc. Zakres tekstu to teraz "Thi".
Ponadto nie można wykonać kotwicy początkowej, aby podążać za kotwicą końcową, a kotwica końcowa nie może poprzedzać kotwicy początkowej.
Zakotwiczenie grawitacji
Każda kotwica ma ustawienie grawitacji, które określa, jak kotwica reaguje, gdy tekst jest wstawiany do strumienia tekstowego na pozycji zakotwiczenia. Gdy wstawienie jest wykonywane na pozycji kotwicy, należy wprowadzić korektę w pozycji kotwicy. Grawitacja określa sposób wprowadzania tego ustawienia położenia zakotwiczenia.
Na przykład:
It is <anchor></anchor>cold today.
Jeśli wyraz "bardzo" jest wstawiany w pozycji zakresu, kotwica początkowa może być umieszczona przed wstawionym słowem lub po nim:
It is <anchor>very </anchor>cold today.
-Lub-
It is very <anchor></anchor>cold today.
Grawitacja zakotwiczenia określa, w jaki sposób kotwica jest zmieniana, gdy wstawienie jest wykonywane na jego pozycji. Grawitacja może być do tyłu lub do przodu.
Jeśli zakotwiczenie ma grawitację wsteczną, kotwica przesuwa się do tyłu względem punktu wstawiania, tak aby wstawiony tekst był zgodny z kotwicą:
It is <anchor>very </anchor>cold today.
Jeśli kotwica ma grawitację do przodu, kotwica przesuwa się do przodu (względem punktu wstawiania) podczas wstawiania, tak aby wstawiony tekst poprzedzał kotwicę:
It is very <anchor></anchor>cold today.
Klony i kopie zapasowe
Istnieją dwa sposoby tworzenia "kopii" obiektu zakresu. Pierwszym z nich jest utworzenie klonowania zakresu przy użyciu ITfRange::Clone. Drugim jest utworzenie kopii zapasowej zakresu przy użyciu ITfContext::CreateRangeBackup.
Klon to kopia zakresu, który nie zawiera danych statycznych. Kotwice zakresu są kopiowane, ale klon nadal obejmuje zakres tekstu w kontekście. Klon jest obiektem zakresu we wszystkich aspektach. Oznacza to, że tekst i właściwości sklonowanego zakresu są dynamiczne i zmienią się, jeśli tekst i/lub właściwości zakresu objętego zmianami klonowania.
Kopia zapasowa przechowuje tekst i właściwości zakresu w czasie tworzenia kopii zapasowej jako dane statyczne. Kopia zapasowa klonuje również oryginalny zakres, aby można było śledzić zmiany rozmiaru i położenia oryginalnego zakresu. Oznacza to, że tekst i właściwości dla zakresu kopii zapasowej są statyczne i nie zmieniają się, jeśli tekst i/lub właściwości zakresu objętego zmianami kopii zapasowej.
Na przykład następujący zakres (pRange) w kontekście:
"This is some <pRange>text</pRange>."
Teraz utwórz klon i kopię zapasową tego zakresu:
ITfRange *pClone;
ITfRangeBackup *pBackup;
pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);
Teraz obiekty zawierają następujące elementy:
pRange = "text"
pClone = "text"
pBackup = "text"
Teraz zmień tekst elementu pRange:
WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));
Teraz obiekty zawierają następujące elementy:
Context = "This is some other words."
pRange = "other words"
pClone = "other words"
pBackup = "text"
Ustawienie tekstu spowodowało zmianę tekstu w kontekście. Spowodowało to również zmianę kotwicy końcowej pRange i pClone. PClone zawiera teraz "inne słowa", ponieważ tekst zmienił się w zakresie i te zmiany są śledzone przez wszystkie zakresy. Po zmianie tekstu objętego zarówno pRange, jak i pClone tekst pClone również uległ zmianie.
Tekst w pliku pBackup nie został zmieniony z oryginalnego elementu pRange, ponieważ dane (tekst i właściwości) w kopii zapasowej nie są powiązane z kontekstem i są przechowywane oddzielnie. Klon zawarty w kopii zapasowej rzeczywiście się zmienia, ale dane są statyczne.
Podczas przywracania kopii zapasowej można zastosować kopię zapasową do klonu w ramach kopii zapasowej lub do innego zakresu. Aby zastosować kopię zapasową do klonu w ramach kopii zapasowej, przekaż NULL do ITfRangeBackup::Restore, jak pokazano w poniższym przykładzie kodu:
pBackup->Restore(ec, NULL);
Teraz obiekty zawierają następujące elementy:
Context = "This is some text."
pRange = "text"
pClone = "text"
pBackup = "text"
Aby przywrócić kopię zapasową do innego zakresu, przekaż wskaźnik do obiektu zakresu podczas wywoływania ITfRangeBackup::Restore. Kopia zapasowa tekstu i właściwości zostaną zastosowane do nowego zakresu. Na przykład przy użyciu powyższego przykładu przed wywołaniem Restore element pRange zostanie zmodyfikowany w celu zademonstrowania tego:
LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);
Teraz obiekty zawierają następujące elementy:
Context = "This is some other words."
pRange = "other wor"
pClone = "other words"
pBackup = "text"
Gdy kotwica końcowa pRange została przesunięta do lewej dwóch miejsc, kotwica końcowa pClone nie uległa zmianie.
Teraz przywróć kopię zapasową przy użyciu narzędzia pRange przy użyciu następującego przykładu kodu:
pBackup->Restore(ec, pRange);
Teraz obiekty zawierają następujące elementy:
Context = "This is some textds."
pRange = "text"
pClone = "textds"
pBackup = "text"
Tekst objęty elementem pRange został zastąpiony ciągiem "text", część tekstu objętego ciągiem pClone została zmieniona, a zmiany pBackup w celu dopasowania elementu pRange.