From ba429d344132c088177e853cce8ff7181570b221 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Wed, 10 Apr 2024 19:42:51 +0200 Subject: Adding upstream version 44.2. Signed-off-by: Daniel Baumann --- plugins/snippets/snippets/windowactivatable.py | 186 +++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 plugins/snippets/snippets/windowactivatable.py (limited to 'plugins/snippets/snippets/windowactivatable.py') 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 +# +# 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: -- cgit v1.2.3