Exemplo n.º 1
0
    def do_activate(self):
        AddiksHintsApp.get().register_view(self)

        document = self.view.get_buffer()

        window = AddiksHintsApp.get().get_window_by_view(self.view)

        document = self.view.get_buffer()
        location = document.get_location()
        if location != None:
            tab = window.window.get_tab_from_location(location)

            viewFrame = tab.get_children()[0]

            scrolledWindow = viewFrame.get_child()

            self.__drawArea = scrolledWindow
            self.__drawArea.set_property("app-paintable", True)
            self.__drawArea.connect("size-allocate", self.on_drawingarea_size_allocate)
            self.__drawArea.connect_after("draw", self.on_drawingarea_draw)

        self.view.connect("query_tooltip", self._on_query_tooltip)
        self.view.set_has_tooltip(True)

        if document != None:
            document.connect("loaded", self.update_hints_threaded)
            document.connect("saved", self.update_hints_threaded)
Exemplo n.º 2
0
    def do_activate(self):
        AddiksHintsApp.get().register_window(self)

        plugin_path = os.path.dirname(__file__)

        if "get_ui_manager" in dir(self.window):# build menu for gedit 3.10 (global menu per window)
            self._ui_manager = self.window.get_ui_manager()
            actions = [
                ['RepairFileAction',  "Try to repair the file",  "<Ctrl><Alt>R",   self.on_repair_file],
            ]

            self._actions = Gtk.ActionGroup("AddiksHintsMenuActions")
            for actionName, title, shortcut, callback in actions:
                self._actions.add_actions([(actionName, Gtk.STOCK_INFO, title, shortcut, "", callback),])

            with open(plugin_path + "/menubar.xml") as menubarXmlFile:
                menubarXml = menubarXmlFile.read()

                self._ui_manager.insert_action_group(self._actions)
                self._ui_merge_id = self._ui_manager.add_ui_from_string(menubarXml)
                self._ui_manager.ensure_update()
Exemplo n.º 3
0
 def do_deactivate(self):
     AddiksHintsApp.get().unregister_view(self)
Exemplo n.º 4
0
    def update_hints(self, document=None, foo=None):
        if document == None:
            document = self.view.get_buffer()

        for tagKey in self.__tags:
            document.remove_tag(self.__tags[tagKey],  document.get_start_iter(), document.get_end_iter())

        self.view.addiks_hints = []

        if document.get_location() != None:
            filePath = document.get_location().get_path()

            content = document.get_text(document.get_start_iter(), document.get_end_iter(), False)

            hintLines = []
            for lineBegin, lineEnd, columnBegin, columnEnd, message, color, priority in AddiksHintsApp.get().get_hints_by_file(filePath, content):
                tag = self.get_hint_tag(color)

                lineBegin = int(lineBegin)
                lineEnd = int(lineEnd)
                columnBegin = int(columnBegin)
                columnEnd = int(columnEnd)

                self.view.addiks_hints.append([lineBegin, lineEnd, columnBegin, columnEnd, message, color, priority])

                #continue
                beginIter = document.get_end_iter().copy()
                beginIter.set_line(lineBegin)

                if beginIter.get_chars_in_line() > columnBegin:
                    beginIter.set_line_offset(columnBegin)
                else:
                    beginIter.forward_to_line_end()

                endIter = beginIter.copy()
                endIter.set_line(lineEnd)

                if endIter.get_chars_in_line() > columnEnd:
                    endIter.set_line_offset(columnEnd)
                else:
                    endIter.forward_to_line_end()

                document.apply_tag(tag, beginIter, endIter)
                for line in range(lineBegin, lineEnd):
                    hintLines.append(line)

        if self.__drawArea != None:
            self.__drawArea.queue_draw()
Exemplo n.º 5
0
    def on_repair_file(self, action, data=None, cycleLimit=5):

        view = self.window.get_active_view()

        document = view.get_buffer()

        patternStrings = [
            'Expected (\d+) space after ([A-Z_]+) keyword; (\d+) found',
            'Expected (\d+) space after closing parenthesis; found (\d+)',
            'Expected (\d+) space after (opening|closing) brace; (\d+) found',
            'Expected (\d+) spaces before opening brace; (\d+) found',
            'Expected (\d+) newline at end of file; (\d+) found',
            'Expected (\d+) newline after (opening|closing) brace; (\d+) found',
            '[A-Za-z ]+ indented incorrectly; expected( at least)? (\d+) spaces, found (\d+)',
            'Incorrect spacing between default value and equals sign for argument "$([a-zA-Z_]+)"; expected (\d+) but found (\d+)',
            'Incorrect spacing between argument "$([a-zA-Z_]+)" and equals sign; expected (\d+) but found (\d+)',
            'There must be one blank line after the last ([A-Z_]+) statement; (\d+) found;'
        ]

        patterns = {}
        for patternString in patternStrings:
            patterns[patternString] = re.compile(patternString)

        results = {}

        contentChanged = False

        for lineBegin, lineEnd, columnBegin, columnEnd, message, color, priority in reversed(view.addiks_hints):

            if lineBegin > document.get_line_count():
                lineBegin = document.get_line_count()
            elif lineBegin < 0:
                lineBegin = 0

            if lineEnd > document.get_line_count():
                lineEnd = document.get_line_count()
            elif lineEnd < 0:
                lineEnd = 0

            textIter = document.get_iter_at_line_offset(lineBegin, 0)
            textIter.forward_to_line_end()

            if columnBegin > textIter.get_line_offset():
                columnBegin = textIter.get_line_offset()-1
            if columnBegin < 0:
                columnBegin = 0

            textIter = document.get_iter_at_line_offset(lineEnd, 0)
            textIter.forward_to_line_end()

            if columnEnd > textIter.get_line_offset():
                columnEnd = textIter.get_line_offset()-1
            if columnEnd < 0:
                columnEnd = 0

            textIterLineBegin = document.get_iter_at_line_offset(lineBegin, 0)
            textIterBegin     = document.get_iter_at_line_offset(lineBegin, columnBegin)
            textIterEnd       = document.get_iter_at_line_offset(lineEnd, columnEnd)

            textIterLineBegin.forward_word_end()
            textIterLineBegin.backward_word_start()
            indentionChars = "".ljust(textIterLineBegin.get_line_offset(), " ")

            for patternKey in patterns:
                pattern = patterns[patternKey]
                results[patternKey] = pattern.match(message)

            if message == 'Opening brace of a class must be on the line after the definition':
                textIterBegin, textIterEnd = textIterBegin.forward_search("{", Gtk.TextSearchFlags.VISIBLE_ONLY)
                document.insert(textIterBegin, "\n", 1)
                contentChanged = True

            elif message == 'Opening brace should be on a new line':
                textIterBegin, textIterEnd = textIterBegin.forward_search("{", Gtk.TextSearchFlags.VISIBLE_ONLY)
                contentChanged = True
                document.insert(textIterBegin, "\n"+indentionChars, 1+len(indentionChars))

            elif results['Expected (\d+) space after ([A-Z_]+) keyword; (\d+) found'] != None:
                expected, token, actual = results['Expected (\d+) space after ([A-Z_]+) keyword; (\d+) found'].group(1, 2, 3)
                expected, actual = [int(expected), int(actual)]
                textIterBegin, textIterEnd = textIterBegin.forward_search(token, Gtk.TextSearchFlags.CASE_INSENSITIVE)
                contentChanged = True
                if expected > actual:
                    document.insert(textIterEnd, ''.ljust(expected - actual), expected - actual)
                else:
                    textIterNext = textIterEnd.copy()
                    textIterNext.forward_chars(actual - expected)
                    document.delete(textIterEnd, textIterNext)

            elif results['[A-Za-z ]+ indented incorrectly; expected( at least)? (\d+) spaces, found (\d+)'] != None:
                expected, actual = results['[A-Za-z ]+ indented incorrectly; expected( at least)? (\d+) spaces, found (\d+)'].group(2, 3)
                expected, actual = [int(expected), int(actual)]
                textIterBegin.set_line_offset(0)
                contentChanged = True
                if expected > actual:
                    document.insert(textIterBegin, ''.ljust(expected - actual), expected - actual)
                else:
                    textIterNext = textIterBegin.copy()
                    textIterNext.forward_chars(actual - expected)
                    document.delete(textIterBegin, textIterNext)

            elif results['Expected (\d+) space after (opening|closing) brace; (\d+) found'] != None:
                expected, actual, braceType = results['Expected (\d+) space after (opening|closing) brace; (\d+) found'].group(1, 3, 2)
                expected, actual = [int(expected), int(actual)]

                if braceType == 'closing':
                    textIterBegin, textIterEnd = textIterBegin.backward_search("}", Gtk.TextSearchFlags.VISIBLE_ONLY)
                    if expected > actual:
                        contentChanged = True
                        document.insert(textIterEnd, ''.ljust(expected - actual), expected - actual)
                    else:
                        textIterNext = textIterEnd.copy()
                        textIterNext.forward_chars(actual - expected)
                        contentChanged = True
                        document.delete(textIterEnd, textIterNext)

                else:
                    pass # TODO: implement

            elif results['Expected (\d+) newline at end of file; (\d+) found'] != None:
                expected, actual = results['Expected (\d+) newline at end of file; (\d+) found'].group(1, 2)
                expected = int(expected)
                actual   = int(actual)

            elif results['Expected (\d+) newline after (opening|closing) brace; (\d+) found'] != None:
                expected, actual, braceType = results['Expected (\d+) newline after (opening|closing) brace; (\d+) found'].group(1, 3, 2)
                expected, actual = [int(expected), int(actual)]

                if braceType == "opening":
                    textIterEnd
                    if expected > actual:
                        contentChanged = True
                        document.insert(textIterEnd, ''.ljust(expected - actual, "\n"), len(expected - actual))

                    elif expected < actual:
                        textIterNext = textIterEnd.copy()
                        textIterNext.forward_chars(actual - expected)
                        contentChanged = True
                        document.delete(textIterEnd, textIterNext)
                else:
                    pass # TODO: implement

            elif results['Expected (\d+) space after closing parenthesis; found (\d+)'] != None:
                expected, actual = results['Expected (\d+) space after closing parenthesis; found (\d+)'].group(1, 2)
                expected, actual = [int(expected), int(actual)]

                if expected > actual:
                    contentChanged = True
                    document.insert(textIterEnd, ''.ljust(expected - actual), expected - actual)
                else:
                    textIterNext = textIterEnd.copy()
                    textIterNext.forward_chars(actual - expected)
                    contentChanged = True
                    document.delete(textIterEnd, textIterNext)

            elif results['Incorrect spacing between default value and equals sign for argument "$([a-zA-Z_]+)"; expected (\d+) but found (\d+)'] != None:
                variable, expected, actual = results['Incorrect spacing between default value and equals sign for argument "($[a-zA-Z_]+)"; expected (\d+) but found (\d+)'].group(1, 2)
                expected, actual = [int(expected), int(actual)]

            elif results['Incorrect spacing between argument "$([a-zA-Z_]+)" and equals sign; expected (\d+) but found (\d+)'] != None:
                variable, expected, actual = results['Incorrect spacing between argument "($[a-zA-Z_]+)" and equals sign; expected (\d+) but found (\d+)'].group(1, 2)
                expected, actual = [int(expected), int(actual)]

            elif results['Expected (\d+) spaces before opening brace; (\d+) found'] != None:
                expected, actual = results['Expected (\d+) spaces before opening brace; (\d+) found'].group(1, 2)
                expected, actual = [int(expected), int(actual)]

            elif results['There must be one blank line after the last ([A-Z_]+) statement; (\d+) found;'] != None:
                keyword, actual = results['There must be one blank line after the last ([A-Z_]+) statement; (\d+) found;'].group(1, 2)
                actual   = int(actual)

            elif message == 'The closing brace for the class must go on the next line after the body':
                pass # remove all empty lines just before line-begin

            elif message == 'Usage of ELSE IF is discouraged; use ELSEIF instead':
                contentChanged = True
                textIterNext = textIterBegin.copy()
                textIterNext.forward_chars(len("else if"))
                document.delete(textIterBegin, textIterNext)
                document.insert(textIterBegin, "elseif", len("elseif"))

            elif message == 'The static declaration must come after the visibility declaration':
                contentChanged = True
                textIterNext = textIterBegin.copy()
                textIterNext.forward_chars(len("static "))
                document.delete(textIterBegin, textIterNext)
                textIterDeclBegin, textIterDeclEnd = textIterBegin.forward_search(" ", Gtk.TextSearchFlags.CASE_INSENSITIVE)
                document.insert(textIterDeclEnd, "static ", len("static "))

            elif message == 'Whitespace found at end of line':

                textIter = document.get_iter_at_line_offset(lineBegin, 0)
                textIter.forward_to_line_end()

                textIterPrev = textIter.copy()
                textIterPrev.backward_char()

                while document.get_text(textIterPrev, textIter, False) == " ":
                    contentChanged = True
                    document.delete(textIterPrev, textIter)

                    textIter = document.get_iter_at_line_offset(lineBegin, 0)
                    textIter.forward_to_line_end()

                    textIterPrev = textIter.copy()
                    textIterPrev.backward_char()

            else:
                print([lineBegin, lineEnd, columnBegin, columnEnd, message])

        AddiksHintsApp.get().get_plugin_view_by_view(view).update_hints()