Η ενδιάμεση μνήμη

Gtk::TextBuffer είναι ένα πρότυπο που περιέχει τα δεδομένα για την Gtk::TextView, όπως η Gtk::TreeModel χρησιμοποιείται από Gtk::TreeView. Αυτό επιτρέπει δύο ή περισσότερες Gtk::TextViews να μοιραστούν την ίδια TextBuffer και επιτρέπει αυτά τα TextBuffers να εμφανίζονται ελαφρά διαφορετικά. Ή μπορείτε να διατηρήσετε αρκετές Gtk::TextBuffers και να επιλέξετε να εμφανίσετε κάθε μια σε διαφορετικούς χρόνους στο ίδιο γραφικό συστατικό Gtk::TextView.

Η TextView δημιουργεί τη δική της προεπιλογή TextBuffer, που μπορείτε να προσπελάσετε μέσα από τη μέθοδο get_buffer().

Reference

12.1.1. Επαναλήπτες

A Gtk::TextBuffer::iterator and a Gtk::TextBuffer::const_iterator represent a position between two characters in the text buffer. Whenever the buffer is modified in a way that affects the number of characters in the buffer, all outstanding iterators become invalid. Because of this, iterators can't be used to preserve positions across buffer modifications. To preserve a position, use Gtk::TextBuffer::Mark.

Reference

12.1.2. Ετικέτες και μορφοποίηση

12.1.2.1. Ετικέτες

Για να ορίσετε ότι κάποιο κείμενο στην ενδιάμεση μνήμη πρέπει να έχει ειδική μορφοποίηση, πρέπει να ορίσετε μια ετικέτα που θα κρατήσει αυτήν την πληροφορία μορφοποίησης και έπειτα θα εφαρμόσει αυτήν την ετικέτα στην περιοχή του κειμένου. Για παράδειγμα, για τον ορισμό της ετικέτας και των ιδιοτήτων της:

auto refTagMatch = Gtk::TextBuffer::Tag::create();
refTagMatch->property_background() = "orange";

Μπορείτε να ορίσετε ένα όνομα για την Tag, όταν χρησιμοποιείτε τη μέθοδο create(), αλλά δεν είναι απαραίτητο.

Η κλάση Tag έχει πολλές άλλες ιδιότητες.

Reference

12.1.2.2. TagTable

Κάθε Gtk::TextBuffer χρησιμοποιεί μια Gtk::TextBuffer::TagTable, που περιέχει τις Tags για αυτή την ενδιάμεση μνήμη. 2 ή περισσότερες TextBuffers μοιράζονται την ίδια TagTable. Όταν δημιουργείτε Tags θα πρέπει να τις προσθέσετε στη TagTable. Για παράδειγμα:

auto 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.
auto refBuffer = Gtk::TextBuffer::create(refTagTable);

Μπορείτε επίσης να χρησιμοποιήσετε την get_tag_table() για να πάρετε και ίσως να τροποποιήσετε στη TextBuffer, την προεπιλεγμένη TagTable αντί για δημιουργία μιας σαφώς.

Reference

12.1.2.3. Εφαρμογή ετικετών

Αν έχετε δημιουργήσει μια Tag και την προσθέσατε στην TagTable, μπορεί να εφαρμόσετε αυτήν την ετικέτα σε μέρος της TextBuffer έτσι ώστε κάποιο κείμενο να εμφανίζεται με αυτήν τη μορφοποίηση. Ορίζετε την αρχή και το τέλος της περιοχής του κειμένου ορίζοντας Gtk::TextBuffer::iterators. Για παράδειγμα:

refBuffer->apply_tag(refTagMatch, iterRangeStart, iterRangeStop);

Or you could specify the tag when first inserting the text:

refBuffer->insert_with_tag(iter, "Some text", refTagMatch);

Μπορείτε να εφαρμόσετε περισσότερες από μία Tag στο ίδιο κείμενο, χρησιμοποιώντας την apply_tag() περισσότερο από μια φορά, ή χρησιμοποιώντας την insert_with_tags(). Οι Tags μπορεί να ορίζουν διαφορετικές τιμές για τις ίδιες ιδιότητες, αλλά μπορείτε να επιλύσετε αυτές τις συγκρούσεις χρησιμοποιώντας Tag::set_priority().

12.1.3. Σημάδια

Οι επαναλήπτες TextBuffer είναι γενικά άκυροι όταν το κείμενο αλλάζει, αλλά μπορείτε να χρησιμοποιήσετε μια Gtk::TextBuffer::Mark για να θυμάται μια θέση σε αυτές τις καταστάσεις. Για παράδειγμα,

auto refMark = refBuffer->create_mark(iter);

Μπορείτε έπειτα να χρησιμοποιήσετε τη μέθοδο get_iter() αργότερα για να δημιουργήσετε έναν επαναλήπτη για τη νέα θέση της Mark.

Υπάρχουν δύο ενσωματωμένες Marks - insert και select_bound, που μπορείτε να προσπελάσετε στην TextBuffer με τις μεθόδους get_insert() και get_selection_bound().

Reference

12.1.4. Η προβολή

Όπως αναφέρθηκε παραπάνω, κάθε TextView έχει μια TextBuffer και μία ή περισσότερες TextView μπορούν να μοιραστούν την ίδια TextBuffer.

Όπως η TreeView, θα πρέπει προφανώς να βάλετε την TextView σας μέσα σε μια ScrolledWindow για να επιτρέψετε στον χρήστη να δει και να μετακινήσει ολόγυρα όλη την περιοχή κειμένου με γραμμές κύλισης.

Reference

12.1.4.1. Προεπιλεγμένη μορφοποίηση

Η TextView έχει ποικίλες μεθόδους που επιτρέπουν την αλλαγή της παρουσίασης της ενδιάμεσης μνήμης για αυτήν τη συγκεκριμένη προβολή. Μερικές από αυτές μπορεί να αντικατασταθούν από τις Gtk::TextTags στην ενδιάμεση μνήμη, αν ορίζουν τα ίδια πράγματα. Για παράδειγμα, set_left_margin(), set_right_margin(), set_indent(), κλπ.

12.1.4.2. Κύλιση

Gtk::TextView has various scroll_to() methods. These allow you to ensure that a particular part of the text buffer is visible. For instance, your application's Find feature might use Gtk::TextView::scroll_to() to show the found text.