Partilhar via


Gamas

Âncoras

Um intervalo é delimitado por duas âncoras , uma âncora inicial e uma âncora final. Existe uma âncora num espaço imaginário entre duas personagens. A âncora inicial refere-se ao texto que segue a âncora e a âncora final refere-se ao texto que precede a âncora. As âncoras inicial e final podem existir no mesmo local. Neste caso, o intervalo tem comprimento zero.

Por exemplo, comece com o seguinte texto:

This is text.

Agora, aplique um intervalo a este texto com as âncoras inicial e final na posição 0. É representado visualmente como:

<anchor></anchor>This is text.

As âncoras não ocupam espaço dentro do próprio texto. Este é um intervalo de comprimento zero e seu texto está vazio.

Agora mude a âncora final +3 posições. É representado visualmente como:

<anchor>Thi</anchor>s is text.

A âncora inicial é posicionada imediatamente antes do caractere na posição 0 e a âncora final é posicionada logo após o caractere na posição 3 porque a âncora final se moveu para os 3 lugares certos. O intervalo de texto é agora "Thi".

Além disso, a âncora inicial não pode ser feita para seguir a âncora final e a âncora final não pode ser feita para preceder a âncora inicial.

Gravidade da âncora

Cada âncora tem uma configuração de de gravidade que determina como a âncora responde quando o texto é inserido no fluxo de texto na posição da âncora. Quando é feita uma inserção na posição de uma âncora, deve ser feito um ajuste na posição da âncora. A gravidade determina como é feito este ajuste da posição da âncora.

Por exemplo:

It is <anchor></anchor>cold today.

Se a palavra "muito" for inserida na posição do intervalo, a âncora inicial pode ser posicionada antes ou depois da palavra inserida:

It is <anchor>very </anchor>cold today.

- Ou -

It is very <anchor></anchor>cold today.

A gravidade da âncora especifica como a âncora é reposicionada quando uma inserção é feita em sua posição. A gravidade pode ser para trás ou para a frente.

Se a âncora tiver gravidade para trás, a âncora se move para trás, em relação ao ponto de inserção, na inserção de modo que o texto inserido siga a âncora:

It is <anchor>very </anchor>cold today.

Se a âncora tiver gravidade para a frente, a âncora avança (em relação ao ponto de inserção) na inserção de modo que o texto inserido precede a âncora:

It is very <anchor></anchor>cold today.

Clones e backups

Há duas maneiras de fazer uma "cópia" de um objeto de intervalo. A primeira é fazer um clone do intervalo usando ITfRange::Clone. O segundo é fazer um backup do intervalo usando ITfContext::CreateRangeBackup.

Um clone é uma cópia de um intervalo que não inclui dados estáticos. As âncoras do intervalo são copiadas, mas o clone ainda cobre um intervalo de texto dentro do contexto. Um clone é um objeto de intervalo em todos os aspetos. Isso significa que o texto e as propriedades de um intervalo clonado são dinâmicos e serão alterados se o texto e/ou as propriedades do intervalo coberto pelo clone forem alterados.

Um backup armazena o texto e as propriedades de um intervalo no momento em que o backup é feito como dados estáticos. Um backup também clona o intervalo original para que as alterações no tamanho e na posição do intervalo original possam ser rastreadas. Isso significa que o texto e as propriedades de um intervalo de backup são estáticos e não são alterados se o texto e/ou as propriedades do intervalo coberto pelo backup forem alterados.

Por exemplo, o seguinte intervalo (pRange) dentro do contexto:

"This is some <pRange>text</pRange>."

Agora faça um clone e um backup deste intervalo:

ITfRange *pClone;
ITfRangeBackup *pBackup;

pRange->Clone(&pClone);
pContext->CreateRangeBackup(ec, pRange, &pBackup);

Agora, os objetos contêm o seguinte:

pRange  = "text"
pClone  = "text"
pBackup = "text"

Agora altere o texto do pRange:

WCHAR wsz[] = L"other words";
pRange->SetText(ec, 0, wsz, lstrlenW(wsz));

Agora, os objetos contêm o seguinte:

Context = "This is some other words."
pRange  = "other words"
pClone  = "other words"
pBackup = "text"

A definição do texto fez com que o texto dentro do contexto fosse alterado. Isso também fez com que a âncora final do pRange e do pClone mudasse. O pClone agora contém "outras palavras" porque o texto foi alterado dentro do intervalo e essas alterações são controladas por todos os intervalos. Quando o texto coberto por pRange e pClone mudou, o texto de pClone também mudou.

O texto no pBackup não foi alterado do pRange original porque os dados (texto e propriedades) no backup não estão relacionados ao contexto e são armazenados separadamente. O clone contido no backup realmente muda, mas os dados são estáticos.

Ao restaurar um backup, o backup pode ser aplicado ao clone dentro do backup ou a um intervalo totalmente diferente. Para aplicar o backup ao clone dentro do backup, passe NULL para ITfRangeBackup::Restore conforme mostrado no exemplo de código a seguir:

pBackup->Restore(ec, NULL);

Agora, os objetos contêm o seguinte:

Context = "This is some text."
pRange  = "text"
pClone  = "text"
pBackup = "text"

Para restaurar o backup para um intervalo diferente, passe um ponteiro para o objeto range ao chamar ITfRangeBackup::Restore. O texto e as propriedades do backup serão aplicados ao novo intervalo. Por exemplo, usando o exemplo acima antes da chamada Restore, o pRange será modificado para demonstrar isso:

LONG lShifted;
pRange->ShiftEnd(ec, -2, &lShifted, NULL);

Agora, os objetos contêm o seguinte:

Context = "This is some other words."
pRange  = "other wor"
pClone  = "other words"
pBackup = "text"

Quando a âncora final do pRange foi deslocada para os dois lugares à esquerda, a âncora final do pClone não mudou.

Agora restaure o backup usando pRange com o seguinte exemplo de código:

pBackup->Restore(ec, pRange);

Agora, os objetos contêm o seguinte:

Context = "This is some textds."
pRange  = "text"
pClone  = "textds"
pBackup = "text"

O texto coberto pelo pRange foi substituído por "text", uma parte do texto coberto pelo pClone foi alterada e o pBackup foi alterado para corresponder ao pRange.