# Copyright (C) 2008, One Laptop Per Child
# Copyright (C) 2009 Simon Schampijer
#
# 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 GObject
from gi.repository import Gtk
from gi.repository import Gdk
from gettext import gettext as _

from sugar3.activity.widgets import EditToolbar as BaseEditToolbar
from sugar3.graphics import iconentry
from sugar3.graphics.toolbutton import ToolButton
from sugar3.graphics import style


class EditToolbar(BaseEditToolbar):
    def __init__(self, act):
        BaseEditToolbar.__init__(self)

        self._activity = act
        self._browser = None

        self.undo.connect('clicked', self.__undo_cb)
        self.redo.connect('clicked', self.__redo_cb)
        self.copy.connect('clicked', self.__copy_cb)
        self.paste.connect('clicked', self.__paste_cb)

        separator = Gtk.SeparatorToolItem()
        separator.set_draw(False)
        separator.set_expand(True)
        self.insert(separator, -1)
        separator.show()

        search_item = Gtk.ToolItem()
        self.search_entry = iconentry.IconEntry()
        self.search_entry.set_icon_from_name(iconentry.ICON_ENTRY_PRIMARY,
                                             'system-search')
        self.search_entry.add_clear_button()
        self.search_entry.connect('activate', self.__search_entry_activate_cb)
        self.search_entry.connect('changed', self.__search_entry_changed_cb)

        width = int(Gdk.Screen.width() / 3)
        self.search_entry.set_size_request(width, -1)

        search_item.add(self.search_entry)
        self.search_entry.show()

        self.insert(search_item, -1)
        search_item.show()

        self._prev = ToolButton('go-previous-paired')
        self._prev.set_tooltip(_('Previous'))
        self._prev.props.sensitive = False
        self._prev.connect('clicked', self.__find_previous_cb)
        self.insert(self._prev, -1)
        self._prev.show()

        self._next = ToolButton('go-next-paired')
        self._next.set_tooltip(_('Next'))
        self._next.props.sensitive = False
        self._next.connect('clicked', self.__find_next_cb)
        self.insert(self._next, -1)
        self._next.show()

        tabbed_view = self._activity.get_canvas()

        GObject.idle_add(lambda:
                self._connect_to_browser(tabbed_view.props.current_browser))

        tabbed_view.connect_after('switch-page', self.__switch_page_cb)

    def __switch_page_cb(self, tabbed_view, page, page_num):
        self._connect_to_browser(tabbed_view.props.current_browser)

    def _connect_to_browser(self, browser):
        if self._browser is not None:
            self._browser.disconnect(self._selection_changed_hid)

        self._browser = browser

        self._update_undoredo_buttons()
        self._update_copypaste_buttons()

        self._selection_changed_hid = self._browser.connect(
                'selection-changed', self._selection_changed_cb)

    def _selection_changed_cb(self, widget):
        self._update_undoredo_buttons()
        self._update_copypaste_buttons()

    def _update_undoredo_buttons(self):
        self.undo.set_sensitive(self._browser.can_undo())
        self.redo.set_sensitive(self._browser.can_redo())

    def _update_copypaste_buttons(self):
        self.copy.set_sensitive(self._browser.can_copy_clipboard())
        self.paste.set_sensitive(self._browser.can_paste_clipboard())

    def __undo_cb(self, button):
        self._browser.undo()
        self._update_undoredo_buttons()

    def __redo_cb(self, button):
        self._browser.redo()
        self._update_undoredo_buttons()

    def __copy_cb(self, button):
        self._browser.copy_clipboard()

    def __paste_cb(self, button):
        self._browser.paste_clipboard()

    def _find_and_mark_text(self, entry):
        search_text = entry.get_text()
        self._browser.unmark_text_matches()
        self._browser.mark_text_matches(search_text, case_sensitive=False,
                                        limit=0)
        self._browser.set_highlight_text_matches(True)
        found = self._browser.search_text(search_text, case_sensitive=False,
                                          forward=True, wrap=True)
        return found

    def __search_entry_activate_cb(self, entry):
        self._find_and_mark_text(entry)

    def __search_entry_changed_cb(self, entry):
        found = self._find_and_mark_text(entry)
        if not found:
            self._prev.props.sensitive = False
            self._next.props.sensitive = False
            entry.modify_text(Gtk.StateType.NORMAL,
                              style.COLOR_BUTTON_GREY.get_gdk_color())
        else:
            self._prev.props.sensitive = True
            self._next.props.sensitive = True
            entry.modify_text(Gtk.StateType.NORMAL,
                              style.COLOR_BLACK.get_gdk_color())

    def __find_previous_cb(self, button):
        search_text = self.search_entry.get_text()
        self._browser.search_text(search_text, case_sensitive=False,
                                  forward=False, wrap=True)

    def __find_next_cb(self, button):
        search_text = self.search_entry.get_text()
        self._browser.search_text(search_text, case_sensitive=False,
                                  forward=True, wrap=True)
