# -*- coding: utf-8 -*-

from PyQt4.QtCore import QObject
from PyQt4.QtCore import SIGNAL

from ninja_ide.core.file_handling import nfile
from ninja_ide.core.file_handling import file_manager
from ninja_ide.gui.editor import checkers
from ninja_ide.gui.editor import helpers


class NEditable(QObject):
    """
    SIGNALS:
    @checkersUpdated()
    """

    def __init__(self, filepath=None, project=None):
        super(NEditable, self).__init__()
        self.__id = ''
        self.__editor = None
        #Create NFile
        self._nfile = None
        if filepath is None:
            #temp file
            self.__id = 'temp'
        else:
            self.__id = filepath
            self._nfile = nfile.NFile(filepath)
        self.text_modified = False
        self._has_checkers = False
        self._lang = 'python'

        #Project:
        self.project = project

        #Checkers:
        self.registered_checkers = []
        self._checkers_executed = 0

    def set_editor(self, editor):
        """Set the Editor (UI component) associated with this object."""
        self.__editor = editor
        content = self._nfile.read()
        self.__editor.setPlainText(content)
        encoding = file_manager.get_file_encoding(content)
        self.__editor.encoding = encoding

        #New file then try to add a coding line
        if not content:
            helpers.insert_coding_line(self.__editor)
        # If we have an editor, let's include the checkers:
        self.include_checkers()

    def save_content(self):
        """Save the content of the UI to a file."""
        content = self.__editor.get_text()
        self._nfile.save(content)

    def update_project(self, project):
        self.project = project

    @property
    def ID(self):
        return self.__id

    @property
    def display_name(self):
        return self._nfile.display_name

    @property
    def has_checkers(self):
        """Return True if checkers where installaed, False otherwise"""
        return self._has_checkers

    def include_checkers(self, lang='python'):
        """Initialize the Checkers, should be refreshed on checkers change."""
        self._lang = lang
        self.registered_checkers = sorted(checkers.get_checkers_for(lang),
            key=lambda x: x[2])
        self._has_checkers = len(self.registered_checkers) > 0
        for i, values in enumerate(self.registered_checkers):
            Checker, color, priority = values
            check = Checker(self.__editor)
            self.registered_checkers[i] = (check, color, priority)
            self.connect(check, SIGNAL("finished()"),
                self.show_checkers_notifications)

    def update_checkers_metadata(self, blockNumber, diference):
        """Update the lines in the checkers when the editor change."""
        for i, values in enumerate(self.registered_checkers):
            checker, color, priority = values
            if checker.checks:
                checker.checks = helpers.add_line_increment_for_dict(
                    checker.checks, blockNumber, diference)
        self.emit(SIGNAL("checkersUpdated()"))

    def run_checkers(self, content, path=None, encoding=None):
        for items in self.registered_checkers:
            checker = items[0]
            checker.run_checks()

    def show_checkers_notifications(self):
        """Show the notifications obtained for the proper checker."""
        if self._checkers_executed == len(self.registered_checkers):
            self._checkers_executed = 0
            self.emit(SIGNAL("checkersUpdated()"))
        else:
            self._checkers_executed += 1
Contents © 2013 NINJA-IDE - Powered by Nikola and Documentor