Как реализовать мягкую обертку длинных строк в редакторе?

#design-patterns #word-wrap #text-editor #glib

Вопрос:

Мне необходимо реализовать мягкое (визуальное) разбиение длинных строк в моем специальном текстовом редакторе. У меня возникли проблемы с принятием решения о:

  • Как следует (и если следует) хранить информацию о (только визуальных) точках останова каждой длинной строки?
  • Как следует (и если…) хранить информацию о положении курсора в логической длинной строке?
  • При прокрутке, откуда можно получить информацию о том, что первая строка на экране на самом деле является, например, 2-й частью длинной строки, уже частично прокрученной за пределами окна просмотра?

В основном я ищу что-то, возможно, близкое к шаблону дизайна и/или чьему-то опытному совету.

Текущая структура буфера выглядит следующим образом:

 typedef struct 
{
    off_t curs1;                /* pos. of the cursor from beginning of file. */
    off_t curs2;                /* pos. from end of file */
    GPtrArray *b1;              /* all data up to curs1 */
    GPtrArray *b2;              /* all data from end of file down to curs2 */
} edit_buf_t;
 

Массивы указателей содержат куски 65535 байтов, поэтому, например, чтобы получить байт раньше curs1 , можно было бы:

 /* Size of the buffer in bits and max value */
#define EDIT_BF_SZ_BITS 16
#define EDIT_BF_SZ (((off_t) 1) << EDIT_BF_SZ_BITS)

/* Buffer size mask of all bits set */
#define EDIT_BF_SZ_MASK (EDIT_BF_SZ - 1)

b = g_ptr_array_index (buf->b1, byte_index >> EDIT_BF_SZ_BITS);
return (char *) b   (byte_index amp; EDIT_BF_SZ_MASK);