188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea# Classes responsible for drawing signs in the Vim user interface.
388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaimport vim
588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaclass VimSign(object):
788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  SIGN_TEXT_BREAKPOINT_RESOLVED = "B>"
888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  SIGN_TEXT_BREAKPOINT_UNRESOLVED = "b>"
988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  SIGN_TEXT_PC = "->"
1088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  SIGN_HIGHLIGHT_COLOUR_PC = 'darkblue'
1188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
1288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  # unique sign id (for ':[sign/highlight] define)
1388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  sign_id = 1
1488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
1588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  # unique name id (for ':sign place')
1688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  name_id = 1
1788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
1888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  # Map of {(sign_text, highlight_colour) --> sign_name}
1988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  defined_signs = {}
2088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
2188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  def __init__(self, sign_text, buffer, line_number, highlight_colour=None):
2288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    """ Define the sign and highlight (if applicable) and show the sign. """
2388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
2488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    # Get the sign name, either by defining it, or looking it up in the map of defined signs
2588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    key = (sign_text, highlight_colour)
2688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    if not key in VimSign.defined_signs:
2788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea      name = self.define(sign_text, highlight_colour)
2888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    else:
2988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea      name = VimSign.defined_signs[key]
3088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
3188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    self.show(name, buffer.number, line_number)
3288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    pass
3388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
3488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  def define(self, sign_text, highlight_colour):
3588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    """ Defines sign and highlight (if highlight_colour is not None). """
3688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    sign_name = "sign%d" % VimSign.name_id
3788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    if highlight_colour is None:
3888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea      vim.command("sign define %s text=%s" % (sign_name, sign_text))
3988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    else:
4088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea      self.highlight_name = "highlight%d" % VimSign.name_id
4188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea      vim.command("highlight %s ctermbg=%s guibg=%s" % (self.highlight_name,
4288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                                        highlight_colour,
4388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                                        highlight_colour))
4488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea      vim.command("sign define %s text=%s linehl=%s texthl=%s" % (sign_name,
4588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                                                  sign_text,
4688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                                                  self.highlight_name,
4788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                                                  self.highlight_name))
4888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    VimSign.defined_signs[(sign_text, highlight_colour)] = sign_name
4988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    VimSign.name_id += 1
5088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    return sign_name
5188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
5288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
5388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  def show(self, name, buffer_number, line_number):
5488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    self.id = VimSign.sign_id
5588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    VimSign.sign_id += 1
5688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    vim.command("sign place %d name=%s line=%d buffer=%s" % (self.id, name, line_number, buffer_number))
5788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    pass
5888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
5988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  def hide(self):
6088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    vim.command("sign unplace %d" % self.id)
6188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    pass
6288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
6388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaclass BreakpointSign(VimSign):
6488cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  def __init__(self, buffer, line_number, is_resolved):
6588cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    txt = VimSign.SIGN_TEXT_BREAKPOINT_RESOLVED if is_resolved else VimSign.SIGN_TEXT_BREAKPOINT_UNRESOLVED
6688cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    super(BreakpointSign, self).__init__(txt, buffer, line_number)
6788cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea
6888cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Maleaclass PCSign(VimSign):
6988cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea  def __init__(self, buffer, line_number, is_selected_thread):
7088cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea    super(PCSign, self).__init__(VimSign.SIGN_TEXT_PC,
7188cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                 buffer,
7288cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                 line_number,
7388cd3fd2f91506c5a9efd660fc0fe92f09b08117Daniel Malea                                 VimSign.SIGN_HIGHLIGHT_COLOUR_PC if is_selected_thread else None)
74