Blame tests/test-widget.py

Packit a7d494
#!/usr/bin/env python
Packit a7d494
# -*- Mode: Python; py-indent-offset: 4 -*-
Packit a7d494
# vim: tabstop=4 shiftwidth=4 expandtab
Packit a7d494
Packit a7d494
# WARNING: test-widget.c is more complete and is better maintained.
Packit a7d494
Packit a7d494
import os, os.path
Packit a7d494
import sys
Packit a7d494
Packit a7d494
import gi
Packit a7d494
from gi.repository import Gio, GObject, Pango, Gtk, GdkPixbuf, Gdk, GtkSource
Packit a7d494
Packit a7d494
ui_description = """
Packit a7d494
<ui>
Packit a7d494
  <menubar name=\"MainMenu\">
Packit a7d494
    <menu action=\"FileMenu\">
Packit a7d494
      <menuitem action=\"Open\"/>
Packit a7d494
      <menuitem action=\"Print\"/>
Packit a7d494
      <menuitem action=\"Find\"/>
Packit a7d494
      <menuitem action=\"Replace\"/>
Packit a7d494
      <separator/>
Packit a7d494
      <menuitem action=\"Quit\"/>
Packit a7d494
    </menu>
Packit a7d494
    <menu action=\"ViewMenu\">
Packit a7d494
      <menuitem action=\"NewView\"/>
Packit a7d494
      <separator/>
Packit a7d494
      <menuitem action=\"HlSyntax\"/>
Packit a7d494
      <menuitem action=\"HlBracket\"/>
Packit a7d494
      <menuitem action=\"ShowNumbers\"/>
Packit a7d494
      <menuitem action=\"ShowMarks\"/>
Packit a7d494
      <menuitem action=\"ShowMargin\"/>
Packit a7d494
      <menuitem action=\"HlLine\"/>
Packit a7d494
      <menuitem action=\"DrawSpaces\"/>
Packit a7d494
      <menuitem action=\"WrapLines\"/>
Packit a7d494
      <separator/>
Packit a7d494
      <menuitem action=\"AutoIndent\"/>
Packit a7d494
      <menuitem action=\"InsertSpaces\"/>
Packit a7d494
      <separator/>
Packit a7d494
      <menu action=\"TabWidth\">
Packit a7d494
        <menuitem action=\"TabWidth4\"/>
Packit a7d494
        <menuitem action=\"TabWidth6\"/>
Packit a7d494
        <menuitem action=\"TabWidth8\"/>
Packit a7d494
        <menuitem action=\"TabWidth10\"/>
Packit a7d494
        <menuitem action=\"TabWidth12\"/>
Packit a7d494
      </menu>
Packit a7d494
      <menu action=\"IndentWidth\">
Packit a7d494
        <menuitem action=\"IndentWidthUnset\"/>
Packit a7d494
        <menuitem action=\"IndentWidth4\"/>
Packit a7d494
        <menuitem action=\"IndentWidth6\"/>
Packit a7d494
        <menuitem action=\"IndentWidth8\"/>
Packit a7d494
        <menuitem action=\"IndentWidth10\"/>
Packit a7d494
        <menuitem action=\"IndentWidth12\"/>
Packit a7d494
      </menu>
Packit a7d494
      <separator/>
Packit a7d494
      <menu action=\"SmartHomeEnd\">
Packit a7d494
        <menuitem action=\"SmartHomeEndDisabled\"/>
Packit a7d494
        <menuitem action=\"SmartHomeEndBefore\"/>
Packit a7d494
        <menuitem action=\"SmartHomeEndAfter\"/>
Packit a7d494
        <menuitem action=\"SmartHomeEndAlways\"/>
Packit a7d494
      </menu>
Packit a7d494
      <separator/>
Packit a7d494
      <menuitem action=\"ForwardString\"/>
Packit a7d494
      <menuitem action=\"BackwardString\"/>
Packit a7d494
    </menu>
Packit a7d494
    <menu action=\"HelpMenu\">
Packit a7d494
      <menuitem action=\"About\"/>
Packit a7d494
    </menu>
Packit a7d494
  </menubar>
Packit a7d494
</ui>
Packit a7d494
"""
Packit a7d494
Packit a7d494
class AboutDialog(Gtk.AboutDialog):
Packit a7d494
Packit a7d494
    def __init__(self, parent):
Packit a7d494
        Gtk.AboutDialog.__init__(self)
Packit a7d494
        self.set_name('GtkSourceView Test')
Packit a7d494
        self.set_copyright('Copyright (c) 2010 Ignacio Casal Quinteiro')
Packit a7d494
        self.set_website_label('https://wiki.gnome.org/Projects/GtkSourceView')
Packit a7d494
        self.set_authors(['Ignacio Casal Quinteiro', 'Paolo Borelli'])
Packit a7d494
        self.set_transient_for(parent)
Packit a7d494
        self.connect("response", lambda d, r: d.destroy())
Packit a7d494
Packit a7d494
class SearchDialog(Gtk.Dialog):
Packit a7d494
Packit a7d494
    def __init__(self, parent, replace, what, replacement):
Packit a7d494
        if replace:
Packit a7d494
            title = "Replace"
Packit a7d494
        else:
Packit a7d494
            title = "Find"
Packit a7d494
Packit a7d494
        Gtk.Dialog.__init__(self, title, parent, Gtk.DialogFlags.MODAL,
Packit a7d494
                            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Packit a7d494
                             Gtk.STOCK_OK, Gtk.ResponseType.OK))
Packit a7d494
Packit a7d494
        self._search_widget = Gtk.Entry()
Packit a7d494
        if what:
Packit a7d494
            self._search_widget.set_text(what)
Packit a7d494
        self._search_widget.set_activates_default(True)
Packit a7d494
        self._search_widget.show()
Packit a7d494
        print(self.get_content_area())
Packit a7d494
        self.get_content_area().pack_start(self._search_widget, True, True, 0)
Packit a7d494
Packit a7d494
        if replace:
Packit a7d494
            self._replace_widget = Gtk.Entry()
Packit a7d494
            if replacement:
Packit a7d494
                self._replace_widget.set_text(replacement)
Packit a7d494
            self._replace_widget.set_activates_default(True)
Packit a7d494
            self._replace_widget.show()
Packit a7d494
            self.get_content_area().pack_start(self._replace_widget, True, True, 0)
Packit a7d494
Packit a7d494
        self._case_sensitive = Gtk.CheckButton.new_with_label("Case sensitive")
Packit a7d494
        self._case_sensitive.show()
Packit a7d494
        self.get_content_area().pack_start(self._case_sensitive, False, False, 0)
Packit a7d494
Packit a7d494
    def run_search(self):
Packit a7d494
        while True:
Packit a7d494
            if self.run() != Gtk.ResponseType.OK:
Packit a7d494
                self.hide()
Packit a7d494
                return False
Packit a7d494
Packit a7d494
            if self._search_widget.get_text() != "":
Packit a7d494
                break
Packit a7d494
Packit a7d494
        self.hide()
Packit a7d494
        return True
Packit a7d494
Packit a7d494
    def is_case_sensitive(self):
Packit a7d494
        return self._case_sensitive.get_active()
Packit a7d494
Packit a7d494
    def get_search_text(self):
Packit a7d494
        return self._search_widget.get_text()
Packit a7d494
Packit a7d494
    def get_replace_text(self):
Packit a7d494
        return self._replace_widget.get_text()
Packit a7d494
Packit a7d494
class Window(Gtk.Window):
Packit a7d494
Packit a7d494
    def __init__(self):
Packit a7d494
        Gtk.Window.__init__(self)
Packit a7d494
Packit a7d494
        self.MARK_TYPE_1 = "one"
Packit a7d494
        self.MARK_TYPE_2 = "two"
Packit a7d494
Packit a7d494
        self.set_title('GtkSourceView Demo')
Packit a7d494
        self.set_icon_name('text-editor')
Packit a7d494
        self.set_default_size(500, 500)
Packit a7d494
        self.connect_after('destroy', _quit)
Packit a7d494
Packit a7d494
        self._vbox = Gtk.VBox()
Packit a7d494
        self.add(self._vbox)
Packit a7d494
Packit a7d494
        sw = Gtk.ScrolledWindow(hadjustment=None,
Packit a7d494
                                vadjustment=None)
Packit a7d494
        sw.set_shadow_type(Gtk.ShadowType.IN)
Packit a7d494
Packit a7d494
        self._buf = GtkSource.Buffer()
Packit a7d494
        self._view = GtkSource.View.new_with_buffer(self._buf)
Packit a7d494
        self.insert_menu()
Packit a7d494
Packit a7d494
        mgr = GtkSource.StyleSchemeManager.get_default()
Packit a7d494
        style_scheme = mgr.get_scheme('classic')
Packit a7d494
        if style_scheme:
Packit a7d494
            self._buf.set_style_scheme(style_scheme)
Packit a7d494
Packit a7d494
        self._vbox.pack_start(sw, True, True, 0)
Packit a7d494
        sw.add(self._view)
Packit a7d494
Packit a7d494
        self._pos_label = Gtk.Label()
Packit a7d494
        self._vbox.pack_end(self._pos_label, False, False, 0)
Packit a7d494
Packit a7d494
        self.add_source_mark_pixbufs()
Packit a7d494
Packit a7d494
        self._buf.connect("mark-set", self.move_cursor_cb, None)
Packit a7d494
        self._view.connect("line-mark-activated", self.line_mark_activated, None)
Packit a7d494
        self._buf.connect("bracket-matched", self.bracket_matched, None);
Packit a7d494
Packit a7d494
    def insert_menu(self):
Packit a7d494
        action_group = Gtk.ActionGroup("GtkSourceViewActions")
Packit a7d494
        action_group.add_actions([("FileMenu", None, "_File", None, None, None),
Packit a7d494
                                  ("Open", Gtk.STOCK_OPEN, "_Open", "<control>O",
Packit a7d494
                                   "Open a file", self.open_file_cb),
Packit a7d494
                                  ("Print", Gtk.STOCK_PRINT, "_Print", "<control>P",
Packit a7d494
                                   "Print the current file", self.print_file_cb),
Packit a7d494
                                  ("Find", Gtk.STOCK_FIND, "_Find", "<control>F",
Packit a7d494
                                   "Find", self.find_cb),
Packit a7d494
                                  ("Replace", Gtk.STOCK_FIND_AND_REPLACE, "Search and _Replace", "<control>R",
Packit a7d494
                                   "Search and replace", self.replace_cb),
Packit a7d494
                                  ("Quit", Gtk.STOCK_QUIT, "_Quit", "<control>Q",
Packit a7d494
                                   "Exit the application", self.quit_cb),
Packit a7d494
                                  ("ViewMenu", None, "_View", None, None, None),
Packit a7d494
                                  ("NewView", Gtk.STOCK_NEW, "_New View", None,
Packit a7d494
                                   "Create a new view of the file", self.new_view_cb),
Packit a7d494
                                  ("TabWidth", None, "_Tab Width", None, None, None),
Packit a7d494
                                  ("IndentWidth", None, "I_ndent Width", None, None, None),
Packit a7d494
                                  ("SmartHomeEnd", None, "_Smart Home/End", None, None, None),
Packit a7d494
                                  ("ForwardString", None, "_Forward to string toggle", "<control>S",
Packit a7d494
                                   "Forward to the start or end of the next string", self.forward_string_cb),
Packit a7d494
                                  ("BackwardString", None, "_Backward to string toggle", "<control><shift>S",
Packit a7d494
                                   "Backward to the start or end of the next string", self.backward_string_cb),
Packit a7d494
                                  ("HelpMenu", None, "_Help", None, None, None),
Packit a7d494
                                  ("About", Gtk.STOCK_ABOUT, "_About...", None,
Packit a7d494
                                   "About GtkSourceView Test Widget", self.about_cb)])
Packit a7d494
Packit a7d494
        action_group.add_toggle_actions([("HlSyntax", None, "Highlight _Syntax", None,
Packit a7d494
                                          "Toggle syntax highlighting", self.hl_syntax_toggled_cb),
Packit a7d494
                                         ("HlBracket", None, "Highlight Matching _Bracket", None,
Packit a7d494
                                          "Toggle highlighting of matching bracket", self.hl_bracket_toggled_cb),
Packit a7d494
                                         ("ShowNumbers", None, "Show _Line Numbers", None,
Packit a7d494
                                          "Toggle visibility of line numbers in the left margin", self.numbers_toggled_cb),
Packit a7d494
                                         ("ShowMarks", None, "Show Line _Marks", None,
Packit a7d494
                                          "Toggle visibility of marks in the left margin", self.marks_toggled_cb),
Packit a7d494
                                         ("ShowMargin", None, "Show Right M_argin", None,
Packit a7d494
                                          "Toggle visibility of right margin indicator", self.margin_toggled_cb),
Packit a7d494
                                         ("HlLine", None, "_Highlight Current Line", None,
Packit a7d494
                                          "Toggle highlighting of current line", self.hl_line_toggled_cb),
Packit a7d494
                                         ("DrawSpaces", None, "_Draw Spaces", None,
Packit a7d494
                                          "Draw Spaces", self.draw_spaces_toggled_cb),
Packit a7d494
                                         ("WrapLines", None, "_Wrap Lines", None,
Packit a7d494
                                          "Toggle line wrapping", self.wrap_lines_toggled_cb),
Packit a7d494
                                         ("AutoIndent", None, "Enable _Auto Indent", None,
Packit a7d494
                                          "Toggle automatic auto indentation of text", self.auto_indent_toggled_cb),
Packit a7d494
                                         ("InsertSpaces", None, "Insert _Spaces Instead of Tabs", None,
Packit a7d494
                                          "Whether to insert space characters when inserting tabulations",
Packit a7d494
                                          self.insert_spaces_toggled_cb)])
Packit a7d494
Packit a7d494
        action_group.add_radio_actions([("TabWidth4", None, "4", None,
Packit a7d494
                                         "Set tabulation width to 4 spaces", 4),
Packit a7d494
                                        ("TabWidth6", None, "6", None,
Packit a7d494
                                         "Set tabulation width to 6 spaces", 6),
Packit a7d494
                                        ("TabWidth8", None, "8", None,
Packit a7d494
                                         "Set tabulation width to 8 spaces", 8),
Packit a7d494
                                        ("TabWidth10", None, "10", None,
Packit a7d494
                                         "Set tabulation width to 10 spaces", 10),
Packit a7d494
                                        ("TabWidth12", None, "12", None,
Packit a7d494
                                         "Set tabulation width to 12 spaces", 12)],
Packit a7d494
                                        -1, self.tabs_toggled_cb)
Packit a7d494
Packit a7d494
        action_group.add_radio_actions([("IndentWidthUnset", None, "Use Tab Width", None,
Packit a7d494
                                         "Set indent width same as tab width", -1),
Packit a7d494
                                        ("IndentWidth4", None, "4", None,
Packit a7d494
                                         "Set indent width to 4 spaces", 4),
Packit a7d494
                                        ("IndentWidth6", None, "6", None,
Packit a7d494
                                         "Set indent width to 6 spaces", 6),
Packit a7d494
                                        ("IndentWidth8", None, "8", None,
Packit a7d494
                                         "Set indent width to 8 spaces", 8),
Packit a7d494
                                        ("IndentWidth10", None, "10", None,
Packit a7d494
                                         "Set indent width to 10 spaces", 10),
Packit a7d494
                                        ("IndentWidth12", None, "12", None,
Packit a7d494
                                         "Set indent width to 12 spaces", 12)],
Packit a7d494
                                        -1, self.indent_toggled_cb)
Packit a7d494
Packit a7d494
        action_group.add_radio_actions([("SmartHomeEndDisabled", None, "Disabled", None,
Packit a7d494
                                         "Smart Home/End disabled", GtkSource.SmartHomeEndType.DISABLED),
Packit a7d494
                                        ("SmartHomeEndBefore", None, "Before", None,
Packit a7d494
                                         "Smart Home/End before", GtkSource.SmartHomeEndType.BEFORE),
Packit a7d494
                                        ("SmartHomeEndAfter", None, "After", None,
Packit a7d494
                                         "Smart Home/End after", GtkSource.SmartHomeEndType.AFTER),
Packit a7d494
                                        ("SmartHomeEndAlways", None, "Always", None,
Packit a7d494
                                         "Smart Home/End always", GtkSource.SmartHomeEndType.ALWAYS)],
Packit a7d494
                                        -1, self.smart_home_end_toggled_cb)
Packit a7d494
Packit a7d494
        self._ui_manager = Gtk.UIManager()
Packit a7d494
        self._ui_manager.insert_action_group(action_group, 0)
Packit a7d494
Packit a7d494
        try:
Packit a7d494
            self._ui_manager.add_ui_from_string(ui_description)
Packit a7d494
        except:
Packit a7d494
            return
Packit a7d494
Packit a7d494
        menu = self._ui_manager.get_widget("/MainMenu")
Packit a7d494
        self._vbox.pack_start(menu, False, False, 0)
Packit a7d494
Packit a7d494
        accel_group = self._ui_manager.get_accel_group()
Packit a7d494
        self.add_accel_group (accel_group)
Packit a7d494
Packit a7d494
        # Add default values
Packit a7d494
        action_group.get_action("HlSyntax").set_active(True)
Packit a7d494
        action_group.get_action("HlBracket").set_active(True)
Packit a7d494
        action_group.get_action("ShowNumbers").set_active(True)
Packit a7d494
        action_group.get_action("ShowMarks").set_active(True)
Packit a7d494
        action_group.get_action("ShowMargin").set_active(True)
Packit a7d494
        action_group.get_action("AutoIndent").set_active(True)
Packit a7d494
        action_group.get_action("TabWidth8").set_active(True)
Packit a7d494
        action_group.get_action("IndentWidthUnset").set_active(True)
Packit a7d494
Packit a7d494
    def add_source_mark_pixbufs(self):
Packit a7d494
        attrs = GtkSource.MarkAttributes ();
Packit a7d494
        color = Gdk.RGBA();
Packit a7d494
        parsed = color.parse("lightgreen")
Packit a7d494
        if parsed:
Packit a7d494
            attrs.set_background(color)
Packit a7d494
        attrs.set_stock_id(Gtk.STOCK_YES)
Packit a7d494
        attrs.connect("query-tooltip-markup", self.mark_tooltip_func)
Packit a7d494
        self._view.set_mark_attributes (self.MARK_TYPE_1, attrs, 1)
Packit a7d494
Packit a7d494
        attrs = GtkSource.MarkAttributes ();
Packit a7d494
        color = Gdk.RGBA();
Packit a7d494
        parsed = color.parse("pink")
Packit a7d494
        if parsed:
Packit a7d494
            attrs.set_background(color)
Packit a7d494
        attrs.set_stock_id(Gtk.STOCK_NO)
Packit a7d494
        attrs.connect("query-tooltip-markup", self.mark_tooltip_func)
Packit a7d494
        self._view.set_mark_attributes (self.MARK_TYPE_2, attrs, 2)
Packit a7d494
Packit a7d494
    def remove_all_marks(self):
Packit a7d494
        start, end = self._buf.get_bounds()
Packit a7d494
        self._buf.remove_source_marks(start, end, None)
Packit a7d494
Packit a7d494
    def mark_tooltip_func(self, attrs, mark):
Packit a7d494
        i = self._buf.get_iter_at_mark(mark)
Packit a7d494
        line = i.get_line() + 1
Packit a7d494
        column = i.get_line_offset()
Packit a7d494
Packit a7d494
        if mark.get_category() == self.MARK_TYPE_1:
Packit a7d494
            return "Line: %d, Column: %d" % (line, column)
Packit a7d494
        else:
Packit a7d494
            return "Line: %d\nColumn: %d" % (line, column)
Packit a7d494
Packit a7d494
    def update_cursor_position(self):
Packit a7d494
        i = self._buf.get_iter_at_mark(self._buf.get_insert())
Packit a7d494
        chars = i.get_offset()
Packit a7d494
        row = i.get_line() + 1
Packit a7d494
        col = self._view.get_visual_column(i) + 1
Packit a7d494
Packit a7d494
        classes = self._buf.get_context_classes_at_iter(i)
Packit a7d494
Packit a7d494
        classes_str = ""
Packit a7d494
Packit a7d494
        i = 0
Packit a7d494
        for c in classes:
Packit a7d494
            if len(classes) != i + 1:
Packit a7d494
                classes_str += c + ", "
Packit a7d494
            else:
Packit a7d494
                classes_str += c
Packit a7d494
Packit a7d494
        msg = "char: %d, line: %d, column: %d, classes: %s" % (chars, row, col, classes_str)
Packit a7d494
        self._pos_label.set_text(msg)
Packit a7d494
Packit a7d494
    # Callbacks
Packit a7d494
    def open_file_cb(self, action, user_data=None):
Packit a7d494
        chooser = Gtk.FileChooserDialog("Open File...", None,
Packit a7d494
                                        Gtk.FileChooserAction.OPEN,
Packit a7d494
                                        (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Packit a7d494
                                         Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
Packit a7d494
Packit a7d494
        response = chooser.run()
Packit a7d494
Packit a7d494
        if response == Gtk.ResponseType.OK:
Packit a7d494
            filename = chooser.get_filename()
Packit a7d494
Packit a7d494
            if filename:
Packit a7d494
                self.open_file(filename)
Packit a7d494
Packit a7d494
        chooser.destroy()
Packit a7d494
Packit a7d494
    def print_file_cb(self, action, user_data=None):
Packit a7d494
        compositor = GtkSource.PrintCompositor.new_from_view (self._view)
Packit a7d494
        operation = Gtk.PrintOperation ()
Packit a7d494
        operation.set_job_name (os.path.basename(self._filepath))
Packit a7d494
        operation.set_show_progress (True)
Packit a7d494
Packit a7d494
        # we do blocking pagination
Packit a7d494
        operation.connect('paginate', self.paginate_cb, compositor)
Packit a7d494
        operation.connect('draw-page', self.draw_page_cb, compositor)
Packit a7d494
Packit a7d494
        operation.run (Gtk.PrintOperationAction.PRINT_DIALOG, None)
Packit a7d494
Packit a7d494
    def find_cb(self, action, user_data=None):
Packit a7d494
        dialog = SearchDialog(self, False, None, None)
Packit a7d494
Packit a7d494
        if dialog.is_case_sensitive:
Packit a7d494
            search_flags = GtkSource.SearchFlags.CASE_INSENSITIVE
Packit a7d494
        else:
Packit a7d494
            search_flags = 0
Packit a7d494
Packit a7d494
        if dialog.run_search():
Packit a7d494
            i = self._buf.get_iter_at_mark(self._buf.get_insert())
Packit a7d494
Packit a7d494
            searched, start, end = i.forward_search(dialog.get_search_text(),
Packit a7d494
                                                    search_flags, None)
Packit a7d494
            if searched:
Packit a7d494
                self._buf.select_range(start, end)
Packit a7d494
            else:
Packit a7d494
                end = i
Packit a7d494
                i = self._buf.get_start_iter()
Packit a7d494
Packit a7d494
                searched, start, end = i.forward_search(dialog.get_search_text(),
Packit a7d494
                                                        search_flags, end)
Packit a7d494
                if searched:
Packit a7d494
                    self._buf.select_range(start, end)
Packit a7d494
Packit a7d494
    def replace_cb(self, action, user_data=None):
Packit a7d494
        dialog = SearchDialog(self, False, None, None)
Packit a7d494
Packit a7d494
        if dialog.is_case_sensitive:
Packit a7d494
            search_flags = GtkSource.SearchFlags.CASE_INSENSITIVE
Packit a7d494
        else:
Packit a7d494
            search_flags = 0
Packit a7d494
Packit a7d494
        i = self._buf.get_start_iter()
Packit a7d494
Packit a7d494
        while True:
Packit a7d494
            searched, start, end = i.forward_search(dialog.get_search_text(),
Packit a7d494
                                                    search_flags, None)
Packit a7d494
Packit a7d494
            if not searched:
Packit a7d494
                break
Packit a7d494
Packit a7d494
            self._buf.delete(start, end)
Packit a7d494
            self._buf.insert(start, dialog.get_replace_text())
Packit a7d494
            i = start
Packit a7d494
Packit a7d494
    def quit_cb(self, action, user_data=None):
Packit a7d494
        _quit()
Packit a7d494
Packit a7d494
    def new_view_cb(self, action, user_data=None):
Packit a7d494
        window = Window()
Packit a7d494
        window.show_all()
Packit a7d494
Packit a7d494
    def hl_syntax_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._buf.set_highlight_syntax(action.get_active())
Packit a7d494
Packit a7d494
    def hl_bracket_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._buf.set_highlight_matching_brackets(action.get_active())
Packit a7d494
Packit a7d494
    def numbers_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._view.set_show_line_numbers(action.get_active())
Packit a7d494
Packit a7d494
    def marks_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._view.set_show_line_marks(action.get_active())
Packit a7d494
Packit a7d494
    def margin_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._view.set_show_right_margin(action.get_active())
Packit a7d494
Packit a7d494
    def hl_line_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._view.set_highlight_current_line(action.get_active())
Packit a7d494
Packit a7d494
    def draw_spaces_toggled_cb(self, action, user_data=None):
Packit a7d494
Packit a7d494
        if (action.get_active()):
Packit a7d494
            draw_spaces = GtkSource.DrawSpacesFlags.ALL
Packit a7d494
        else:
Packit a7d494
            draw_spaces = 0
Packit a7d494
        self._view.set_draw_spaces(draw_spaces)
Packit a7d494
Packit a7d494
    def wrap_lines_toggled_cb(self, action, user_data=None):
Packit a7d494
Packit a7d494
        if (action.get_active()):
Packit a7d494
            wrap_mode = Gtk.WrapMode.WORD
Packit a7d494
        else:
Packit a7d494
            wrap_mode = Gtk.WrapMode.NONE
Packit a7d494
        self._view.set_wrap_mode(wrap_mode)
Packit a7d494
Packit a7d494
    def auto_indent_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._view.set_auto_indent(action.get_active())
Packit a7d494
Packit a7d494
    def insert_spaces_toggled_cb(self, action, user_data=None):
Packit a7d494
        self._view.set_insert_spaces_instead_of_tabs(action.get_active())
Packit a7d494
Packit a7d494
    def forward_string_cb(self, action, user_data=None):
Packit a7d494
        insert = self._buf.get_insert()
Packit a7d494
Packit a7d494
        it = self._buf.get_iter_at_mark(insert)
Packit a7d494
Packit a7d494
        if (self._buf.iter_forward_to_context_class_toggle(it, "string")):
Packit a7d494
            self._buf.place_cursor(it)
Packit a7d494
            self._view.scroll_mark_onscreen(insert)
Packit a7d494
Packit a7d494
    def backward_string_cb(self, action, user_data=None):
Packit a7d494
        insert = self._buf.get_insert()
Packit a7d494
Packit a7d494
        it = self._buf.get_iter_at_mark(insert)
Packit a7d494
Packit a7d494
        if (self._buf.iter_backward_to_context_class_toggle(it, "string")):
Packit a7d494
            self._buf.place_cursor(it)
Packit a7d494
            self._view.scroll_mark_onscreen(insert)
Packit a7d494
Packit a7d494
    def tabs_toggled_cb(self, action, current, user_data=None):
Packit a7d494
        self._view.set_tab_width(current.get_current_value())
Packit a7d494
Packit a7d494
    def indent_toggled_cb(self, action, current):
Packit a7d494
        self._view.set_indent_width(current.get_current_value())
Packit a7d494
Packit a7d494
    def smart_home_end_toggled_cb(self, action, current, user_data=None):
Packit a7d494
        self._view.set_smart_home_end(current.get_current_value())
Packit a7d494
Packit a7d494
    def about_cb(self, action, user_data=None):
Packit a7d494
        about = AboutDialog(self)
Packit a7d494
        about.show()
Packit a7d494
Packit a7d494
    def move_cursor_cb(self, buf, cursor_iter, mark, user_data):
Packit a7d494
        if mark != buf.get_insert():
Packit a7d494
            return
Packit a7d494
Packit a7d494
        self.update_cursor_position()
Packit a7d494
Packit a7d494
    def line_mark_activated(self, gutter, place, ev, user_data):
Packit a7d494
        if ev.button.button == 1:
Packit a7d494
            mark_type = self.MARK_TYPE_1
Packit a7d494
        else:
Packit a7d494
            mark_type = self.MARK_TYPE_2
Packit a7d494
Packit a7d494
        mark_list = self._buf.get_source_marks_at_line(place.get_line(), mark_type)
Packit a7d494
Packit a7d494
        if mark_list:
Packit a7d494
            self._buf.delete_mark(mark_list[0])
Packit a7d494
        else:
Packit a7d494
            self._buf.create_source_mark(None, mark_type, place)
Packit a7d494
Packit a7d494
    def bracket_matched(self, buf, place, state, user_data):
Packit a7d494
        # FIXME: figure out how to obtain the nick from the enum value
Packit a7d494
        # print "Bracket match state: '%s'\n" % nick
Packit a7d494
        if state == GtkSource.BracketMatchType.FOUND:
Packit a7d494
            bracket = place.get_char()
Packit a7d494
            row = place.get_line() + 1
Packit a7d494
            col = place.get_line_offset() + 1
Packit a7d494
            print("Matched bracket: '%c' at row: %i, col: %i" % (bracket, row, col))
Packit a7d494
Packit a7d494
    def open_file(self, filename):
Packit a7d494
        if os.path.isabs(filename):
Packit a7d494
            path = filename
Packit a7d494
        else:
Packit a7d494
            path = os.path.abspath(filename)
Packit a7d494
Packit a7d494
        self._filepath = path
Packit a7d494
Packit a7d494
        f = Gio.file_new_for_path(path)
Packit a7d494
Packit a7d494
        info = f.query_info("*", 0, None)
Packit a7d494
        content_type = info.get_content_type()
Packit a7d494
Packit a7d494
        mgr = GtkSource.LanguageManager.get_default()
Packit a7d494
        language = mgr.guess_language(filename, content_type)
Packit a7d494
Packit a7d494
        self.remove_all_marks()
Packit a7d494
        self._buf.set_language(language)
Packit a7d494
        self._buf.set_highlight_syntax(True)
Packit a7d494
Packit a7d494
        self._buf.begin_not_undoable_action()
Packit a7d494
Packit a7d494
       # stream = f.read(None)
Packit a7d494
       # chunk, r = stream.read(4096, None)
Packit a7d494
Packit a7d494
        #FIXME: Use Gio
Packit a7d494
        try:
Packit a7d494
            txt = open(path, 'r').read()
Packit a7d494
        except:
Packit a7d494
            return False
Packit a7d494
Packit a7d494
        self._buf.set_text(txt, -1)
Packit a7d494
Packit a7d494
        self._buf.end_not_undoable_action()
Packit a7d494
Packit a7d494
        self._buf.set_modified(False)
Packit a7d494
Packit a7d494
        i = self._buf.get_start_iter()
Packit a7d494
        self._buf.place_cursor(i)
Packit a7d494
        return True
Packit a7d494
Packit a7d494
    def paginate_cb(self, operation, context, compositor):
Packit a7d494
        print("Pagination progress: %.2f %%\n" % (compositor.get_pagination_progress () * 100.0))
Packit a7d494
        if compositor.paginate (context):
Packit a7d494
            print("Pagination progress: %.2f %%\n" % (compositor.get_pagination_progress () * 100.0))
Packit a7d494
            operation.set_n_pages (compositor.get_n_pages ())
Packit a7d494
            return True
Packit a7d494
        return False
Packit a7d494
Packit a7d494
    def draw_page_cb(self, operation, context, page_nr, compositor):
Packit a7d494
        compositor.draw_page (context, page_nr)
Packit a7d494
Packit a7d494
def _quit(*args):
Packit a7d494
    Gtk.main_quit()
Packit a7d494
Packit a7d494
def main(args = []):
Packit a7d494
    global window
Packit a7d494
Packit a7d494
    window = Window()
Packit a7d494
Packit a7d494
    if len(args) > 2:
Packit a7d494
        window.open_file(args[1])
Packit a7d494
    else:
Packit a7d494
        window.open_file(args[0])
Packit a7d494
Packit a7d494
    window.show_all()
Packit a7d494
    Gtk.main()
Packit a7d494
Packit a7d494
if __name__ == '__main__':
Packit a7d494
    main(sys.argv)
Packit a7d494