Наши партнеры

UnixForum





Библиотека сайта 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)
Поле ввода текста (TextView)

Исходный код

Файл: examplewindow.h (Для использования совместно с gtkmm 3, а не с gtkmm 2)

Файл: examlewindow.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)

Файл: main.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)


Следующий раздел : 12. Меню и панели инструментов.