#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);