reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
# Classes responsible for drawing signs in the Vim user interface.

import vim


class VimSign(object):
    SIGN_TEXT_BREAKPOINT_RESOLVED = "B>"
    SIGN_TEXT_BREAKPOINT_UNRESOLVED = "b>"
    SIGN_TEXT_PC = "->"
    SIGN_HIGHLIGHT_COLOUR_PC = 'darkblue'

    # unique sign id (for ':[sign/highlight] define)
    sign_id = 1

    # unique name id (for ':sign place')
    name_id = 1

    # Map of {(sign_text, highlight_colour) --> sign_name}
    defined_signs = {}

    def __init__(self, sign_text, buffer, line_number, highlight_colour=None):
        """ Define the sign and highlight (if applicable) and show the sign. """

        # Get the sign name, either by defining it, or looking it up in the map
        # of defined signs
        key = (sign_text, highlight_colour)
        if key not in VimSign.defined_signs:
            name = self.define(sign_text, highlight_colour)
        else:
            name = VimSign.defined_signs[key]

        self.show(name, buffer.number, line_number)
        pass

    def define(self, sign_text, highlight_colour):
        """ Defines sign and highlight (if highlight_colour is not None). """
        sign_name = "sign%d" % VimSign.name_id
        if highlight_colour is None:
            vim.command("sign define %s text=%s" % (sign_name, sign_text))
        else:
            self.highlight_name = "highlight%d" % VimSign.name_id
            vim.command(
                "highlight %s ctermbg=%s guibg=%s" %
                (self.highlight_name, highlight_colour, highlight_colour))
            vim.command(
                "sign define %s text=%s linehl=%s texthl=%s" %
                (sign_name, sign_text, self.highlight_name, self.highlight_name))
        VimSign.defined_signs[(sign_text, highlight_colour)] = sign_name
        VimSign.name_id += 1
        return sign_name

    def show(self, name, buffer_number, line_number):
        self.id = VimSign.sign_id
        VimSign.sign_id += 1
        vim.command("sign place %d name=%s line=%d buffer=%s" %
                    (self.id, name, line_number, buffer_number))
        pass

    def hide(self):
        vim.command("sign unplace %d" % self.id)
        pass


class BreakpointSign(VimSign):

    def __init__(self, buffer, line_number, is_resolved):
        txt = VimSign.SIGN_TEXT_BREAKPOINT_RESOLVED if is_resolved else VimSign.SIGN_TEXT_BREAKPOINT_UNRESOLVED
        super(BreakpointSign, self).__init__(txt, buffer, line_number)


class PCSign(VimSign):

    def __init__(self, buffer, line_number, is_selected_thread):
        super(
            PCSign,
            self).__init__(
            VimSign.SIGN_TEXT_PC,
            buffer,
            line_number,
            VimSign.SIGN_HIGHLIGHT_COLOUR_PC if is_selected_thread else None)