# Gedit snippets plugin # Copyright (C) 2005-2006 Jesse van den Kieboom # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA from gi.repository import Gtk, Gedit, GObject from .snippet import Snippet from .library import Library from .shareddata import SharedData from .signals import Signals class Message(Gedit.Message): view = GObject.Property(type=Gedit.View) iter = GObject.Property(type=Gtk.TextIter) class Activate(Message): trigger = GObject.Property(type=str) class ParseAndActivate(Message): snippet = GObject.Property(type=str) class WindowActivatable(GObject.Object, Gedit.WindowActivatable, Signals): __gtype_name__ = "GeditSnippetsWindowActivatable" window = GObject.Property(type=Gedit.Window) def __init__(self): GObject.Object.__init__(self) Signals.__init__(self) self.current_language_accel_group = None def do_activate(self): self.register_messages() library = Library() library.add_accelerator_callback(self.accelerator_activated) self.accel_group = Library().get_accel_group(None) if self.accel_group: self.window.add_accel_group(self.accel_group) self.connect_signal(self.window, 'active-tab-changed', self.on_active_tab_changed) self.do_update_state() SharedData().register_window(self) def do_deactivate(self): if self.accel_group: self.window.remove_accel_group(self.accel_group) self.accel_group = None self.unregister_messages() library = Library() library.remove_accelerator_callback(self.accelerator_activated) self.disconnect_signals(self.window) SharedData().unregister_window(self) def do_update_state(self): controller = SharedData().get_active_controller(self.window) self.update_language(controller) def register_messages(self): bus = self.window.get_message_bus() bus.register(Activate, '/plugins/snippets', 'activate') bus.register(ParseAndActivate, '/plugins/snippets', 'parse-and-activate') self.signal_ids = set() sid = bus.connect('/plugins/snippets', 'activate', self.on_message_activate, None) self.signal_ids.add(sid) sid = bus.connect('/plugins/snippets', 'parse-and-activate', self.on_message_parse_and_activate, None) self.signal_ids.add(sid) def unregister_messages(self): bus = self.window.get_message_bus() for sid in self.signal_ids: bus.disconnect(sid) self.signal_ids = set() bus.unregister_all('/plugins/snippets') def on_message_activate(self, bus, message, userdata): view = message.props.view if not view: view = self.window.get_active_view() controller = SharedData().get_controller(view) if not controller: return iter = message.props.iter if not iter: iter = view.get_buffer().get_iter_at_mark(view.get_buffer().get_insert()) controller.run_snippet_trigger(message.props.trigger, (iter, iter)) def on_message_parse_and_activate(self, bus, message, userdata): view = message.props.view if not view: view = self.window.get_active_view() controller = SharedData().get_controller(view) if not controller: return iter = message.props.iter if not iter: iter = view.get_buffer().get_iter_at_mark(view.get_buffer().get_insert()) controller.parse_and_run_snippet(message.props.snippet, iter) def find_snippet(self, snippets, tag): result = [] for snippet in snippets: if Snippet(snippet)['tag'] == tag: result.append(snippet) return result def update_language(self, controller): if not self.window: return if controller: langid = controller.language_id else: langid = None if langid != None: accelgroup = Library().get_accel_group(langid) else: accelgroup = None if accelgroup != self.current_language_accel_group: if self.current_language_accel_group: self.window.remove_accel_group(self.current_language_accel_group) if accelgroup: self.window.add_accel_group(accelgroup) self.current_language_accel_group = accelgroup def on_active_tab_changed(self, window, tab): self.update_language(SharedData().get_controller(tab.get_view())) def accelerator_activated(self, group, obj, keyval, mod): if obj == self.window: controller = SharedData().get_active_controller(self.window) if controller: return controller.accelerator_activate(keyval, mod) else: return False # ex:ts=4:et: