El búfer
Gtk::TextBuffer es el modelo que contiene los datos del Gtk::TextView, al igual que el Gtk::TreeModel usado por Gtk::TreeView. Esto permite a dos o más Gtk::TreeView compartir el mismo TextBuffer, y permite mostrar esos búferes de texto de una manera ligeramente diferente. O bien, puede mantener varios Gtk::TextBuffer y elegir mostrar cada uno en distintas ocasiones en el mismo widget GtK::TextView.
El TextView crea su propio TextBuffer predeterminado, al que puede acceder mediante el método get_buffer().
- 11.1.1. Iteradores
- 11.1.2. Etiquetas y formateado
- 11.1.3. Marcas
- 11.1.4. La vista
11.1.2. Etiquetas y formateado
- 11.1.2.1. Etiquetas
- 11.1.2.2. TagTable
- 11.1.2.3. Aplicar etiquetas
11.1.2.1. Etiquetas
Para especificar que algún texto en el búfer deba tener un formato especial, defina una etiqueta que contenta esa información de formato, y luego aplíquela a la región de texto. Por ejemplo, para definir la etiqueta y sus propiedades:
Glib::RefPtr<Gtk::TextBuffer::Tag> refTagMatch = Gtk::TextBuffer::Tag::create(); refTagMatch->property_background() = "orange";
Puede especificar un nombre para la clase Tag cuando use el método create(), pero no es necesario.
La clase Tag tiene muchas otras propiedades.
11.1.2.2. TagTable
Cada Gtk::TextBuffer usa una Gtk::TextBuffer::TagTable, que contiene las Tag para ese búfer. Dos o más TextBuffer pueden compartir la misma TagTable. Cuando cree las Tag, añádalas a la TagTable. Por ejemplo:
Glib::RefPtr<Gtk::TextBuffer::TagTable> refTagTable =
Gtk::TextBuffer::TagTable::create();
refTagTable->add(refTagMatch);
//Hopefully a future version of gtkmm will have a set_tag_table() method,
//for use after creation of the buffer.
Glib::RefPtr<Gtk::TextBuffer> refBuffer =
Gtk::TextBuffer::create(refTagTable);
También puede usar get_tag_table() para obtener, y tal vez modificar, la TagTable predeterminada del TextBuffer en lugar de crear una explícitamente.
11.1.2.3. Aplicar etiquetas
Si ha creado una Tag y la ha añadido a la TagTable, podrá aplicarle esa etiqueta a parte del TextBuffer, para que una parte del texto se muestre con ese formato. Puede definir el inicio y el fin del rango de texto especificando Gtk::TextBuffer::iterator. Por ejemplo:
refBuffer->apply_tag(refTagMatch, iterRangeStart, iterRangeStop);
O puede especificar la etiqueta cuando inserta el texto por primera vez: refBuffer->insert_with_tag(iter, "Some text", refTagMatch);
Puede aplicar más de una Tag al mismo texto, usando apply_tag() más de una vez, o usando insert_with_tags(). Las Tag podrían especificar valores diferentes para las mismas propiedades, pero puede resolver estos conflictos usando Tag::set_priority().
11.1.3. Marcas
Generalmente se invalidan los iteradores del TextBuffer cuando el texto cambia, pero puede usar una Gtk::TextBuffer::Mark para recordar una posición en estas situaciones. Por ejemplo,
Glib::RefPtr<Gtk::TextBuffer::Mark> refMark = refBuffer->create_mark(iter);
Puede entonces usar el método get_iter() más tarde para crear un iterador para la posición nueva de la Mark.
Hay dos clases Mark incorporadas: insert y select_bound, a las que puede acceder con los métodos get_insert() y get_selection_bound() del TextBuffer.
11.1.4. La vista
Como se mencionó anteriormente, cada TextView tiene un TextBuffer, y uno o más TextView pueden compartir el mismo TextBuffer.
Al igual que con el TreeView, probablemente deba poner su TextView dentro de una ScrolledWindow para permitirle al usuario ver y mover toda el área de texto con barras de desplazamiento.
- 11.1.4.1. Formato predeterminado
- 11.1.4.2. Desplazamiento
11.1.4.1. Formato predeterminado
Los TextView tienen varios métodos que le permiten cambiar la presentación del búfer de esta vista particular. Algunos de estos pueden anularse por los Gtk::TextTag en el búfer, si especifican las mismas cosas. Por ejemplo, set_left_margin(), set_right_margin(), set_indent(), etc.
11.1.4.2. Desplazamiento
Gtk::TextView tiene varios métodos scroll_to_*(). Estos le permiten asegurarse de que una parte particular del búfer de texto es visible. Por ejemplo, la característica «Encontrar» de su aplicación podría usar Gtk::TextView::scroll_to_iter() para mostrar el texto encontrado.