summaryrefslogtreecommitdiffstats
path: root/plugins/snippets/snippets/windowactivatable.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/snippets/snippets/windowactivatable.py')
-rw-r--r--plugins/snippets/snippets/windowactivatable.py186
1 files changed, 186 insertions, 0 deletions
diff --git a/plugins/snippets/snippets/windowactivatable.py b/plugins/snippets/snippets/windowactivatable.py
new file mode 100644
index 0000000..6729a69
--- /dev/null
+++ b/plugins/snippets/snippets/windowactivatable.py
@@ -0,0 +1,186 @@
+# Gedit snippets plugin
+# Copyright (C) 2005-2006 Jesse van den Kieboom <jesse@icecrew.nl>
+#
+# 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: