Библиотека сайта rus-linux.net
Программирование с использованием gtkmm 3. Поле ввода текста (TextView)
Оригинал: Programming with gtkmm 3Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Дата публикации: 15 Октября 2013 г.
Перевод: А.Панин
Дата перевода: 15 марта 2014 г.
Виджет поля ввода текста (TextView
) может использоваться для вывода и редактирования больших объемов отформатированного текста. По аналогии с виджетом древовидного представления данных он использует архитектуру модель/представление. В данном случае в роли модели представления данных выступает текстовый буфер (TextBuffer
).
11.1. Буфер
Класс Gtk::TextBuffer
реализует модель представления данных, хранящую данные для показа с помощью представленного классом Gtk::TextView
виджета поля ввода текста по аналогии с классом модели представления данных Gtk::TreeModel
, используемым виджетом древовидного представления данных на основе класса Gtk::TreeView
. Такая архитектура позволяет двум и более виджетам поля ввода текста делить один и тот же текстовый буфер, а также позволяет показывать содержимое одного и того же текстового буфера немного отличающимися способами. Вы также можете работать с несколькими текстовыми буферами и выбирать для показа один из них в любой момент времени с помощью виджета поля ввода текста.
Виджет поля ввода текста создает свой собственный стандартный текстовый буфер, к которому вы можете получить доступ с помощью метода get_buffer()
.
11.1.1. Итераторы
(в оригинале раздел отсутствует)
11.1.2. Тэги и форматирование
11.1.2.1. Тэги
Glib::RefPtr<Gtk::TextBuffer::Tag> refTagMatch = Gtk::TextBuffer::Tag::create(); refTagMatch->property_background() = "orange";
Вы можете задать имя тэга при использовании метода create()
, но это не обязательно.
Класс тэга Gtk::TextBuffer::Tag
также позволяет использовать ряд других свойств.
11.1.2.2. Таблица тэгов
Gtk::TextBuffer
использует таблицу тэгов на основе класса Gtk::TextBuffer::TagTable
, которая содержит все тэги, используемые в рамках данного текстового буфера. Два или более текстовых буферов могут делить одну и ту же таблицу тэгов. При создании тэгов вы должны добавлять их в таблицу тэгов. Примером может служить следующий код:
Glib::RefPtr<Gtk::TextBuffer::TagTable> refTagTable = Gtk::TextBuffer::TagTable::create(); refTagTable->add(refTagMatch); //Есть надежда, что следующая версия gtkmm будет предоставлять метод set_tag_table() //для использования таблицы тэгов после создания буфера. Glib::RefPtr<Gtk::TextBuffer> refBuffer = Gtk::TextBuffer::create(refTagTable);
Вы также можете использовать метод get_tag_table()
для получения и, возможно, для модификации стандартной таблицы тэгов текстового буфера вместо непосредственного создания нового буфера.
11.1.2.3. Применение тэгов
Gtk::TextBuffer::iterator
. Например, следующим образом:
refBuffer->apply_tag(refTagMatch, iterRangeStart, iterRangeStop);
Или же вы должны указать тэг перед первой операцией вставки текста в буфер: refBuffer->insert_with_tag(iter, "Произвольный текст", refTagMatch);
Вы можете применить более чем один тэг к одному и тому же тексту, использовав метод apply_tag()
более одного раза или использовав метод insert_with_tags()
. В тэгах могут использоваться различные значения одних и тех же параметров, при этом вы можете разрешить возникающие конфликты с помощью метода Gtk::TextBuffer::Tag::set_priority()
.
11.1.3. Метки
Gtk::TextBuffer::Mark
для сохранения позиции в тексте в подобных ситуациях. Например, метка может создаваться следующим образом:
Glib::RefPtr<Gtk::TextBuffer::Mark> refMark = refBuffer->create_mark(iter);
Впоследствии вы сможете использовать метод get_iter()
для создания итератора в новой позиции метки.
Существует два типа встроенных меток - insert
и select_bound
, доступ к которым вы можете получить с помощью методов объекта текстового буфера get_insert()
и get_selection_bound()
соответственно.
11.1.4. Представление
Как было упомянуто выше, каждый виджет поля ввода текста использует связанный текстовый буфер, причем один или более виджетов поля ввода текста могут делить между собой один и тот же текстовый буфер.
Как и в случае с виджетом древовидного представления данных, вам, скорее всего, придется помещать ваш виджет поля ввода текста в окно прокрутки для того, чтобы у пользователя была возможность просматривать весь текст и перемещаться по всему пространству с текстом с помощью полос прокрутки.
11.1.4.1. Стандартное форматирование
Класс виджета поля ввода текста поддерживает различные методы, которые позволяют вам изменить способ вывода содержимого буфера в данном конкретном представлении. Некоторые из этих методов могут быть перекрыты с помощью экземпляров класса Gtk::TextTag
(тэгов) на уровне буфера в том случае, если они описывают одни и те же свойства. Примерами могут служить методы set_left_margin()
, set_right_margin()
, set_indent()
, и.т.д.
11.1.4.2. Прокрутка текста
Класс Gtk::TextView
реализует различные методы прокрутки текста scroll_to_*()
. Эти методы позволяют вам быть уверенными в том, что определенная часть текстового буфера является видимой. К примеру, функция поиска строки в тексте из вашего приложения может использовать метод Gtk::TextView::scroll_to_iter()
для показа найденной строки.
11.2. Виджеты и якоря
Gtk::Button
, в текстовое поле. Каждый из таких дочерних виджетов требует наличия якоря (ChildAnchor
). Якоря ассоциируются с итераторами. К примеру, для создания якоря в определенной позиции следует использовать метод Gtk::TextBuffer::create_child_anchor()
:
Glib::RefPtr<Gtk::TextChildAnchor> refAnchor = refBuffer->create_child_anchor(iter);
Gtk::TextView::add_child_at_anchor()
:
m_TextView.add_child_at_anchor(m_Button, refAnchor);
11.3. Примеры
11.3.1. Простой пример
Рисунок 11-1: Поле ввода текста (TextView)
Файл: examplewindow.h
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: examlewindow.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: main.cc
(Для использования совместно с gtkmm 3, а не с gtkmm 2)
Следующий раздел : 12. Меню и панели инструментов.