Rentang

Jangkar

Rentang dibatasi oleh dua jangkar, jangkar awal dan jangkar akhir. Jangkar ada dalam slot imajiner di antara dua karakter. Jangkar awal berkaitan dengan teks yang mengikuti jangkar dan jangkar akhir berkaitan dengan teks yang mendahului jangkar. Jangkar awal dan akhir dapat ada di lokasi yang sama. Dalam hal ini, rentang memiliki panjang nol.

Misalnya, mulailah dengan teks berikut:

This is text.

Sekarang terapkan rentang ke teks ini dengan jangkar awal dan akhir pada posisi 0. Ini secara visual direpresentasikan sebagai:

<anchor></anchor>This is text.

Jangkar tidak mengambil ruang apa pun dalam teks itu sendiri. Ini adalah rentang panjang nol dan teksnya kosong.

Sekarang geser jangkar akhir +3 posisi. Ini secara visual direpresentasikan sebagai:

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

Jangkar awal diposisikan tepat sebelum karakter di posisi 0 dan jangkar akhir diposisikan tepat setelah karakter di posisi 3 karena jangkar akhir dipindahkan ke tempat 3 yang tepat. Rentang teks sekarang "Thi".

Selain itu, jangkar awal tidak dapat dibuat untuk mengikuti jangkar akhir dan jangkar akhir tidak dapat dibuat untuk mendahului jangkar mulai.

Gravitasi Jangkar

Setiap jangkar memiliki pengaturan gravitasi yang menentukan bagaimana jangkar merespons ketika teks dimasukkan ke dalam aliran teks pada posisi jangkar. Ketika penyisipan dilakukan pada posisi jangkar, penyesuaian harus dilakukan dalam posisi jangkar. Gravitasi menentukan bagaimana penyesuaian posisi jangkar ini dibuat.

Contohnya:

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

Jika kata "sangat " disisipkan pada posisi rentang, jangkar awal dapat diposisikan baik sebelum atau sesudah kata yang disisipkan:

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

-Atau-

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

Gravitasi jangkar menentukan bagaimana jangkar diposisikan ulang ketika penyisipan dibuat pada posisinya. Gravitasi dapat berupa mundur atau ke depan.

Jika jangkar memiliki gravitasi mundur, jangkar bergerak mundur, relatif terhadap titik penyisipan, pada penyisipan sehingga teks yang disisipkan mengikuti jangkar:

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

Jika jangkar memiliki gravitasi maju, jangkar bergerak maju (relatif terhadap titik penyisipan) pada penyisipan sehingga teks yang disisipkan mendahului jangkar:

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

Klon dan Pencadangan

Ada dua cara untuk membuat "salinan" objek rentang. Yang pertama adalah membuat klon rentang menggunakan ITfRange::Clone. Yang kedua adalah membuat cadangan rentang menggunakan ITfContext::CreateRangeBackup.

Kloning adalah salinan rentang yang tidak menyertakan data statis. Jangkar rentang disalin, tetapi kloning masih mencakup rentang teks dalam konteks. Kloning adalah objek rentang dalam segala hal. Ini berarti bahwa teks dan properti untuk rentang kloning bersifat dinamis dan akan berubah jika teks dan/atau properti rentang yang dicakup oleh kloning berubah.

Cadangan menyimpan teks dan properti rentang pada saat cadangan dibuat sebagai data statis. Cadangan juga mengkloning rentang asli sehingga perubahan pada ukuran dan posisi rentang asli dapat dilacak. Ini berarti bahwa teks dan properti untuk rentang yang dicadangkan bersifat statis dan tidak berubah jika teks dan/atau properti rentang yang dicakup oleh perubahan cadangan.

Misalnya, rentang berikut (pRange) dalam konteks:

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

Sekarang buat klon dan cadangan rentang ini:

ITfRange *pClone;
ITfRangeBackup *pBackup;

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

Sekarang, objek berisi yang berikut ini:

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

Sekarang ubah teks pRange:

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

Sekarang, objek berisi yang berikut ini:

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

Mengatur teks menyebabkan teks dalam konteks berubah. Ini juga menyebabkan jangkar akhir pRange dan pClone berubah. pClone sekarang berisi "kata lain" karena teks berubah dalam rentang dan perubahan ini dilacak oleh semua rentang. Ketika teks yang dicakup oleh pRange dan pClone berubah, teks pClone juga berubah.

Teks dalam pBackup tidak berubah dari pRange asli karena data (teks dan properti) dalam cadangan tidak terkait dengan konteks dan disimpan secara terpisah. Kloning yang terkandung dalam cadangan sebenarnya berubah, tetapi datanya statis.

Saat memulihkan cadangan, cadangan dapat diterapkan ke kloning dalam cadangan atau ke rentang yang berbeda sepenuhnya. Untuk menerapkan cadangan ke kloning dalam cadangan, teruskan NULL ke ITfRangeBackup::Restore seperti yang ditunjukkan dalam contoh kode berikut:

pBackup->Restore(ec, NULL);

Sekarang, objek berisi yang berikut ini:

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

Untuk memulihkan cadangan ke rentang yang berbeda, teruskan penunjuk ke objek rentang saat memanggil ITfRangeBackup::Restore. Teks dan properti yang dicadangkan akan diterapkan ke rentang baru. Misalnya, menggunakan contoh di atas sebelum panggilan Pemulihan , pRange akan dimodifikasi untuk menunjukkan hal ini:

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

Sekarang, objek berisi yang berikut ini:

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

Ketika jangkar akhir pRange digeser ke dua tempat kiri, jangkar akhir pClone tidak berubah.

Sekarang pulihkan cadangan menggunakan pRange dengan contoh kode berikut:

pBackup->Restore(ec, pRange);

Sekarang, objek berisi yang berikut ini:

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

Teks yang dicakup oleh pRange telah diganti dengan "teks", sebagian teks yang dicakup oleh pClone telah berubah, dan pBackup berubah agar sesuai dengan pRange.