Этот вопрос, вероятно, заставит меня показаться довольно невежественным. Это потому, что я.
Я просто думаю: если бы я был гипотетически заинтересован в разработке собственного элемента управления графическим интерфейсом текстового редактора, виджета или того, что вы хотите называть (а я не такой), как бы я вообще это сделал?
Для новичка, такого как я, возникнет соблазн хранить содержимое текстового редактора в виде строки, что кажется довольно дорогостоящим (не то чтобы я слишком хорошо знаком с тем, как строковые реализации различаются между одним языком / платформой и другим. ; но я знаю, что в .NET, например, они неизменяемы, поэтому частые манипуляции, такие как то, что вам нужно поддерживать в текстовом редакторе, были бы чрезвычайно расточительными, создавая один экземпляр строки за другим в очень быстрой последовательности).
Предположительно вместо этого используется некоторая изменяемая структура данных, содержащая текст; но выяснение того, как может выглядеть эта структура, кажется мне немного сложной задачей. Произвольный доступ был бы хорош (я бы подумал, в конце концов, разве вы не хотите, чтобы пользователь мог прыгать в любое место текста?), Но тогда я задаюсь вопросом о стоимости о, скажем, перехода к чему-то в середине огромного документа и немедленного начала ввода. Опять же, подход для новичков (скажем, вы храните текст как массив символов с изменяемым размером) приведет к очень плохой производительности, я думаю, поскольку с каждым символом, вводимым пользователем, будет огромный объем данных для «сдвига» над.
Итак, если бы мне пришлось гадать, я бы предположил, что текстовые редакторы используют какую-то структуру, которая разбивает текст на более мелкие части (может быть, строки?), Которые индивидуально составляют массивы символов с произвольным доступом и которые сами по себе являются случайными доступны как отдельные фрагменты. Даже это кажется, что это должно быть довольно чудовищное упрощение, хотя, если оно хотя бы отдаленно близко к началу.
Конечно, я также понимаю, что не может быть «стандартного» способа реализации текстовых редакторов; возможно, это сильно различается от одного редактора к другому. Но я подумал, поскольку это явно проблема, которую решали много-много раз, возможно, с годами всплыл относительно общий подход.
В любом случае, мне просто интересно узнать, есть ли у кого-нибудь какие-то знания по этой теме. Как я уже сказал, я определенно не собираюсь писать собственный текстовый редактор; Мне просто интересно.