#    Pluma snippets plugin
#    Copyright (C) 2005-2006  Jesse van den Kieboom <jesse@icecrew.nl>
#    Copyright (C) 2012-2021 MATE Developers
#
#    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

import re
import os
import gettext

from gi.repository import GObject, Gtk, Pluma

from .Document import Document
from .Library import Library

class WindowHelper:
    def __init__(self, plugin):
        self.plugin = plugin
        self.current_controller = None
        self.current_language = None
        self.signal_ids = {}

    def run(self, window):
        self.window = window

        self.insert_menu()

        self.accel_group = Library().get_accel_group(None)

        window.add_accel_group(self.accel_group)
        window.connect('tab-added', self.on_tab_added)

        # Add controllers to all the current views
        for view in self.window.get_views():
            if isinstance(view, Pluma.View) and not self.has_controller(view):
                view._snippet_controller = Document(self, view)

        self.update()

    def stop(self):
        self.window.remove_accel_group(self.accel_group)
        self.accel_group = None

        self.remove_menu()

        # Iterate over all the tabs and remove every controller
        for view in self.window.get_views():
            if isinstance(view, Pluma.View) and self.has_controller(view):
                view._snippet_controller.stop()
                view._snippet_controller = None

        self.window = None
        self.plugin = None

    def insert_menu(self):
        manager = self.window.get_ui_manager()

        self.action_group = Gtk.ActionGroup("PlumaSnippetPluginActions")
        self.action_group.set_translation_domain('pluma')
        self.action_group.add_actions([('ManageSnippets', None,
                _('Manage _Snippets...'), \
                None, _('Manage snippets'), \
                self.on_action_snippets_activate)])

        self.merge_id = manager.new_merge_id()
        manager.insert_action_group(self.action_group, -1)
        manager.add_ui(self.merge_id, '/MenuBar/ToolsMenu/ToolsOps_5', \
                'ManageSnippets', 'ManageSnippets', Gtk.UIManagerItemType.MENUITEM, False)

    def remove_menu(self):
        manager = self.window.get_ui_manager()
        manager.remove_ui(self.merge_id)
        manager.remove_action_group(self.action_group)
        self.action_group = None

    def find_snippet(self, snippets, tag):
        result = []

        for snippet in snippets:
            if Snippet(snippet)['tag'] == tag:
                result.append(snippet)

        return result

    def has_controller(self, view):
        return hasattr(view, '_snippet_controller') and view._snippet_controller

    def update_language(self):
        if not self.window:
            return

        if self.current_language:
            accel_group = Library().get_accel_group( \
                    self.current_language)
            self.window.remove_accel_group(accel_group)

        if self.current_controller:
            self.current_language = self.current_controller.language_id

            if self.current_language != None:
                accel_group = Library().get_accel_group( \
                        self.current_language)
                self.window.add_accel_group(accel_group)
        else:
            self.current_language = None

    def language_changed(self, controller):
        if controller == self.current_controller:
            self.update_language()

    def update(self):
        view = self.window.get_active_view()

        if not view or not self.has_controller(view):
            return

        controller = view._snippet_controller

        if controller != self.current_controller:
            self.current_controller = controller
            self.update_language()

    # Callbacks

    def on_tab_added(self, window, tab):
        # Create a new controller for this tab if it has a standard pluma view
        view = tab.get_view()

        if isinstance(view, Pluma.View) and not self.has_controller(view):
            view._snippet_controller = Document(self, view)

        self.update()

    def on_action_snippets_activate(self, item):
        self.plugin.create_configure_dialog()

    def accelerator_activated(self, keyval, mod):
        return self.current_controller.accelerator_activate(keyval, mod)

# ex:ts=4:et:
