# -*- coding: utf-8 -*-
#
#  windowactivatable.py - Multi Edit
#
#  Copyright (C) 2014 - 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 Street, Fifth Floor,
#  Boston, MA 02110-1301, USA.

from gi.repository import GLib, GObject, Gio, Gedit

from .viewactivatable import MultiEditViewActivatable

from gpdefs import *


class MultiEditWindowActivatable(GObject.Object, Gedit.WindowActivatable):

    window = GObject.Property(type=Gedit.Window)

    def do_activate(self):
        action = Gio.SimpleAction.new_stateful("multiedit", None, GLib.Variant.new_boolean(False))
        action.connect('activate', self.activate_toggle)
        action.connect('change-state', self.multi_edit_mode)
        self.window.add_action(action)

        self.window.multiedit_window_activatable = self

    def do_deactivate(self):
        self.window.remove_action("multiedit")
        delattr(self.window, 'multiedit_window_activatable')

    def do_update_state(self):
        view = self.get_view_activatable(self.window.get_active_view())
        self.get_action().set_state(GLib.Variant.new_boolean(view != None and view.enabled()))

    def get_view_activatable(self, view):
        if not hasattr(view, "multiedit_view_activatable"):
            return None
        return view.multiedit_view_activatable

    def get_action(self):
        return self.window.lookup_action("multiedit")

    def on_multi_edit_toggled(self, viewactivatable):
        if viewactivatable.view == self.window.get_active_view():
            self.get_action().set_state(GLib.Variant.new_boolean(viewactivatable.enabled()))

    def activate_toggle(self, action, parameter):
        state = action.get_state()
        action.change_state(GLib.Variant.new_boolean(not state.get_boolean()))

    def multi_edit_mode(self, action, state):
        view = self.window.get_active_view()
        helper = self.get_view_activatable(view)

        active = state.get_boolean()

        if helper != None:
            helper.toggle_multi_edit(active)

        action.set_state(GLib.Variant.new_boolean(active))

# ex:ts=4:et:
