blob: 926cc29a7fcac37f2b850560bb562a3ad625b518 [file] [log] [blame]
Daniel Maleaac4ce0c2013-02-11 17:18:14 +00001
2# Classes responsible for drawing signs in the Vim user interface.
3
4import vim
5
6class VimSign(object):
7 SIGN_TEXT_BREAKPOINT_RESOLVED = "B>"
8 SIGN_TEXT_BREAKPOINT_UNRESOLVED = "b>"
9 SIGN_TEXT_PC = "->"
10 SIGN_HIGHLIGHT_COLOUR_PC = 'darkblue'
11
12 # unique sign id (for ':[sign/highlight] define)
13 sign_id = 1
14
15 # unique name id (for ':sign place')
16 name_id = 1
17
18 # Map of {(sign_text, highlight_colour) --> sign_name}
19 defined_signs = {}
20
21 def __init__(self, sign_text, buffer, line_number, highlight_colour=None):
22 """ Define the sign and highlight (if applicable) and show the sign. """
23
24 # Get the sign name, either by defining it, or looking it up in the map of defined signs
25 key = (sign_text, highlight_colour)
26 if not key in VimSign.defined_signs:
27 name = self.define(sign_text, highlight_colour)
28 else:
29 name = VimSign.defined_signs[key]
30
31 self.show(name, buffer.number, line_number)
32 pass
33
34 def define(self, sign_text, highlight_colour):
35 """ Defines sign and highlight (if highlight_colour is not None). """
36 sign_name = "sign%d" % VimSign.name_id
37 if highlight_colour is None:
38 vim.command("sign define %s text=%s" % (sign_name, sign_text))
39 else:
40 self.highlight_name = "highlight%d" % VimSign.name_id
41 vim.command("highlight %s ctermbg=%s guibg=%s" % (self.highlight_name,
42 highlight_colour,
43 highlight_colour))
44 vim.command("sign define %s text=%s linehl=%s texthl=%s" % (sign_name,
45 sign_text,
46 self.highlight_name,
47 self.highlight_name))
48 VimSign.defined_signs[(sign_text, highlight_colour)] = sign_name
49 VimSign.name_id += 1
50 return sign_name
51
52
53 def show(self, name, buffer_number, line_number):
54 self.id = VimSign.sign_id
55 VimSign.sign_id += 1
56 vim.command("sign place %d name=%s line=%d buffer=%s" % (self.id, name, line_number, buffer_number))
57 pass
58
59 def hide(self):
60 vim.command("sign unplace %d" % self.id)
61 pass
62
63class BreakpointSign(VimSign):
64 def __init__(self, buffer, line_number, is_resolved):
65 txt = VimSign.SIGN_TEXT_BREAKPOINT_RESOLVED if is_resolved else VimSign.SIGN_TEXT_BREAKPOINT_UNRESOLVED
66 super(BreakpointSign, self).__init__(txt, buffer, line_number)
67
68class PCSign(VimSign):
69 def __init__(self, buffer, line_number, is_selected_thread):
70 super(PCSign, self).__init__(VimSign.SIGN_TEXT_PC,
71 buffer,
72 line_number,
73 VimSign.SIGN_HIGHLIGHT_COLOUR_PC if is_selected_thread else None)