PHP-GTK2 Newsletter
PHP-GTK2 Tips & Techniques
FREE Newsletter
by kksou
Sample Code 152: How to highlight matching brackets in GtkTextView - Part 1? |
|
Written by kksou
|
|
Friday, 26 January 2007 |
|
Problem You want to highlight enclosing curly brackets in a GtkTextView as shown below:

Solution
Sample Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| <?php $window = new GtkWindow(); $window->set_size_request(400, 240); $window->connect_simple('destroy', array('Gtk','main_quit')); $window->add($vbox = new GtkVBox());
// display title
$title = new GtkLabel("Highlight matching curly bracket - Part 1\n"); $title->modify_font(new PangoFontDescription("Times New Roman Italic 10")); $title->modify_fg(Gtk::STATE_NORMAL, GdkColor::parse("#0000ff")); $title->set_size_request(-1, 20); $title->set_justify(Gtk::JUSTIFY_CENTER); $alignment = new GtkAlignment(0.5, 0.5, 0, 0); $alignment->add($title); $vbox->pack_start($alignment);
// Setup TextView
$buffer = new GtkTextBuffer(); $buffer->set_text('if ($i==1) { test(); } else { test2(); }'); $view = new GtkTextView(); $view->set_buffer($buffer); $view->modify_font(new PangoFontDescription("Arial 10")); $view->set_wrap_mode(Gtk::WRAP_WORD);
$hbox = new GtkHBox(); $hbox->pack_start($button = new GtkButton('Find enclosing bracket'), 0); $vbox->pack_start($hbox, 0); $button->connect('clicked', 'on_button', $buffer); // note 1
$scrolled_win = new GtkScrolledWindow(); $scrolled_win->set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); $vbox->pack_start($scrolled_win); $scrolled_win->add($view);
// Setup highlight tag
$tag_table = $buffer->get_tag_table(); $tag['highlight'] = new GtkTextTag(); // note 2
$tag['highlight']->set_property('background', "#ffff00"); // note 2
$tag_table->add($tag['highlight']);
$window->show_all(); Gtk::main();
function find_left_bracket($iter, $buffer) { global $tag; $iter2 = $iter->copy();
$match_start = $iter->copy(); $match_end = $iter->copy();
// check left { first
$found = $iter->backward_search('{', 0, $match_start, $match_end, null); if (!$found) return null;
$buffer->apply_tag($tag['highlight'], $match_start, $match_end); // note 6
return array($match_start, $match_end); }
function find_right_bracket($iter, $buffer) { global $tag; $iter2 = $iter->copy();
|
- Note that this is only 70% of the sample code. You have to be a registered member to see the entire sample code. Please login or register.
- Registration is free and immediate.
- Have some doubt about the registration? Please read this forum article.
Explanation
- Set up the "Highlight Bracket" button.
- Set up highlight tag. Please refer to How to apply styles to GtkTextView using GtkTextTag - Part 1? for details.
- Get current cursor position.
- Find left bracket.
- Find right bracket.
- Highlight the left bracket.
- Highlight the right bracket.
Note
There are a couple of things we need to improve:
- Pressing the button when the cursor is at "else" should not highlight anything.
- When the user moves the cursor (by mouse or keyboard), the highlight should disappear.
We will fix these in the next two articles.
Related Links
User reviews There are no user reviews yet. Note: You have to be a registered member to leave a comment. Free registration here. |
|