# Python imports

# Lib imports

# Application imports



class ReplaceMixin:
    def replace(self, widget):
        replace_text = self._replace_entry.get_text()
        if self.find_text and replace_text:
            self._buffer.begin_user_action()

            iter       = self._buffer.get_start_iter()
            search_tag = self._tag_table.lookup(self.search_tag)

            iter.forward_to_tag_toggle(search_tag)
            self._do_replace(iter, replace_text)
            self._active_src_view.scroll_to_iter( iter, 0.0, True, 0.0, 0.0 )

            self._buffer.end_user_action()

    def replace_all(self, widget):
        replace_text = self._replace_entry.get_text()
        if self.find_text:
            self._buffer.begin_user_action()

            mark       = self._buffer.get_insert()
            iter       = self._buffer.get_start_iter()
            search_tag = self._tag_table.lookup(self.search_tag)

            while iter.forward_to_tag_toggle(search_tag):
                self._do_replace(iter, replace_text)
                iter = self._buffer.get_start_iter()

            self._buffer.end_user_action()


    def _do_replace(self, iter, text):
        start, end = self.get_start_end(iter)
        self.replace_in_buffer(start, end, text)

    def replace_in_buffer(self, start, end, text):
        pos_mark = self._buffer.create_mark("find-replace", end, True)
        self._buffer.delete(start, end)
        replace_iter = self._buffer.get_iter_at_mark(pos_mark)
        self._buffer.insert(replace_iter, text)

    def get_start_end(self, iter):
        start = iter.copy()
        end   = None

        while True:
            iter.forward_char()
            tags  = iter.get_tags()
            valid = False
            for tag in tags:
                if tag.props.name and self.search_tag in tag.props.name:
                    valid = True
                    break

            if valid:
                continue

            end = iter.copy()
            break

        return start, end

    # NOTE: Below, lovingly taken from Hamad Al Marri's Gamma text editor.
    # Link: https://gitlab.com/hamadmarri/gamma-text-editor
    def is_whole_word(self, match_start, match_end):
    	is_prev_a_char = True
    	is_next_a_char = True

    	prev_iter = match_start.copy()
    	next_iter = match_end.copy()
    	if not prev_iter.backward_char():
    		is_prev_a_char = False
    	else:
    		c = prev_iter.get_char()
    		is_prev_a_char = (c.isalpha() or c.isdigit())

    	if not next_iter:
    		is_next_a_char = False
    	else:
    		c = next_iter.get_char()
    		is_next_a_char = (c.isalpha() or c.isdigit())

    	is_word = (not is_prev_a_char and not is_next_a_char)

    	# Note: Both must be false to be a word...
    	return is_word