def __init__(self, refresh=1, stop=1): self.nmap_highlight = NmapOutputHighlight() HIGVBox.__init__(self) # Creating widgets self.__create_widgets() # Setting scrolled window self.__set_scrolled_window() # Setting text view self.__set_text_view() # Setting buttons self.__set_buttons() # Getting text buffer self.text_buffer = self.text_view.get_buffer() self.refreshing = True self.thread = Thread() # Adding widgets to the VPaned self._pack_expand_fill(self.scrolled) self._pack_noexpand_nofill(self.hbox_buttons) self.nmap_output_file = None self.nmap_previous_output = '' self.brazil = True # We have to create a mark to follow changes in the view with left grav. self.mark = self.text_buffer.create_mark( 'start', self.text_buffer.get_start_iter(), True) self.__create_tags()
def __init__(self, nmap_output_view): HIGVBox.__init__(self) self.nmap_highlight = NmapOutputHighlight() self.vbox = self self.highlight_tab() self.__pack_widgets() self.vbox.show_all()
def __init__(self, nmap_output_view): HIGDialog.__init__(self, _("Nmap Output Properties"), buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)) self.nmap_highlight = NmapOutputHighlight() self.__create_widgets() self.__pack_widgets() self.highlight_tab() self.vbox.show_all()
def __init__ (self, refresh=1, stop=1): self.nmap_highlight = NmapOutputHighlight() HIGVBox.__init__ (self) # Creating widgets self.__create_widgets() # Setting scrolled window self.__set_scrolled_window() # Setting text view self.__set_text_view() # Setting buttons self.__set_buttons() # Getting text buffer self.text_buffer = self.text_view.get_buffer() self.refreshing = True self.thread = Thread() # Adding widgets to the VPaned self._pack_expand_fill(self.scrolled) self._pack_noexpand_nofill(self.hbox_buttons) self.nmap_output_file = None self.nmap_previous_output = '' self.brazil = True # We have to create a mark to follow changes in the view with left grav. self.mark = self.text_buffer.create_mark( 'start', self.text_buffer.get_start_iter(), True ) self.__create_tags()
class NmapOutputViewer (HIGVBox): def __init__ (self, refresh=1, stop=1): self.nmap_highlight = NmapOutputHighlight() HIGVBox.__init__ (self) # Creating widgets self.__create_widgets() # Setting scrolled window self.__set_scrolled_window() # Setting text view self.__set_text_view() # Setting buttons self.__set_buttons() # Getting text buffer self.text_buffer = self.text_view.get_buffer() self.refreshing = True self.thread = Thread() # Adding widgets to the VPaned self._pack_expand_fill(self.scrolled) self._pack_noexpand_nofill(self.hbox_buttons) self.nmap_output_file = None self.nmap_previous_output = '' self.brazil = True # We have to create a mark to follow changes in the view with left grav. self.mark = self.text_buffer.create_mark( 'start', self.text_buffer.get_start_iter(), True ) self.__create_tags() def __create_tags(self): tag_table = self.text_buffer.get_tag_table() properties = ["details", "date", "hostname", "ip", "port_list", "open_port", "closed_port", "filtered_port"] for name in properties: tag = tag_table.lookup(name) if tag: tag_table.remove(tag) for p in xrange(len(properties)): settings = self.nmap_highlight.__getattribute__(properties[p]) # Create a tag name tag = gtk.TextTag(properties[p]) if settings[0]: tag.set_property("weight", pango.WEIGHT_HEAVY) else: tag.set_property("weight", pango.WEIGHT_NORMAL) if settings[1]: tag.set_property("style", pango.STYLE_ITALIC) else: tag.set_property("style", pango.STYLE_NORMAL) if settings[2]: tag.set_property("underline", pango.UNDERLINE_SINGLE) else: tag.set_property("underline", pango.UNDERLINE_NONE) text_color = settings[3] highlight_color = settings[4] tag.set_property("foreground", gtk.color_selection_palette_to_string([gtk.gdk.Color(*text_color),])) tag.set_property("background", gtk.color_selection_palette_to_string([gtk.gdk.Color(*highlight_color),])) tag_table.add(tag) tag.set_priority(p) # brasil tags names = ('brasil1', 'brasil2', 'brasil3') prop = ('foreground', 'background', 'weight') values = (('#EAFF00', '#21C800', pango.WEIGHT_HEAVY), ('#0006FF', '#21C800', pango.WEIGHT_HEAVY), ('#FFFFFF', '#21C800', pango.WEIGHT_HEAVY)) for name in names: tag = tag_table.lookup(name) if tag: tag_table.remove(tag) for i in xrange(len(names)): tag = gtk.TextTag(names[i]) for tup in zip(prop, values[i]): tag.set_property(tup[0], tup[1]) tag_table.add(tag) self.txg_font = gtk.TextTag() self.txg_date = gtk.TextTag() self.txg_font.set_property("family", "Monospace") tag_table.add(self.txg_font) tag_table.add(self.txg_date) def __create_widgets (self): # Creating widgets self.scrolled = gtk.ScrolledWindow () self.text_view = gtk.TextView () self.btn_refresh = gtk.Button (stock=gtk.STOCK_REFRESH) self.check_enable_color = gtk.CheckButton(\ _("Enable Nmap output highlight")) self.btn_output_properties = HIGButton(stock=gtk.STOCK_PREFERENCES) self.hbox_buttons = gtk.HBox (spacing=5) def __set_scrolled_window(self): # By default the vertical scroller remains at bottom self._scroll_at_bottom = True # Seting scrolled window self.scrolled.set_border_width(5) self.scrolled.add(self.text_view) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) vadjust = self.scrolled.get_vadjustment() vadjust.connect('changed', self.__adjustment_update) vadjust.connect('value-changed', self.__adjustment_at_bottom) def __adjustment_at_bottom(self, adjustment): vadjust_end = adjustment.upper - adjustment.page_size self._scroll_at_bottom = adjustment.value == vadjust_end def __adjustment_update(self, adjustment): if self._scroll_at_bottom: adjustment.set_value(adjustment.upper - adjustment.page_size) def __set_text_view(self): self.text_view.set_wrap_mode(gtk.WRAP_WORD) self.text_view.set_editable(False) def __set_buttons (self): self.check_enable_color.set_active(self.nmap_highlight.enable) # Connecting events self.btn_refresh.connect('clicked', self.refresh_output) self.btn_output_properties.connect("clicked", self.show_output_properties) self.check_enable_color.connect("toggled", self.enable_color_highlight) # Setting hbox self.hbox_buttons.set_border_width(5) # Packing buttons self.hbox_buttons.pack_start(self.check_enable_color) self.hbox_buttons.pack_start(self.btn_output_properties) self.hbox_buttons.pack_start(self.btn_refresh) def enable_color_highlight(self, widget): if widget.get_active(): self.nmap_highlight.enable = 1 else: self.nmap_highlight.enable = 0 self.update_output_colors() def show_output_properties(self, widget): nmap_out_prop = NmapOutputProperties(self.text_view) nmap_out_prop.run() for prop in nmap_out_prop.property_names: widget = nmap_out_prop.property_names[prop][8] wid_props = [] if widget.bold: wid_props.append(1) else: wid_props.append(0) if widget.italic: wid_props.append(1) else: wid_props.append(0) if widget.underline: wid_props.append(1) else: wid_props.append(0) wid_props.append("(%s, %s, %s)" % (widget.text_color.red, widget.text_color.green, widget.text_color.blue)) wid_props.append("(%s, %s, %s)" % (widget.highlight_color.red, widget.highlight_color.green, widget.highlight_color.blue)) self.nmap_highlight.__setattr__(widget.property_name, wid_props) nmap_out_prop.destroy() self.nmap_highlight.save_changes() # TODO: Foreach in all tabs to update ? self.__create_tags() self.update_output_colors() def update_output_colors(self, dialog=None, response_id=None): self.text_buffer.move_mark(self.mark, self.text_buffer.get_start_iter()) buff = self.text_view.get_buffer() tag_table = buff.get_tag_table() # Get the not-parsed text start = self.text_buffer.get_iter_at_mark(self.mark) end = self.text_buffer.get_end_iter() self.text_buffer.remove_all_tags(start, end) self.text_buffer.apply_tag(self.txg_font, start, end) if not self.nmap_highlight.enable or start == end: return text = buff.get_text(start, end) # Get the line offset offset = start.get_line() if text: text = text.split("\n") properties = ["details", "date", "hostname", "ip", "port_list", "open_port", "closed_port", "filtered_port"] for pos in xrange(len(text)): if not text[pos]: continue for p in xrange(len(properties)): settings = self.nmap_highlight.__getattribute__(\ properties[p]) match = re.finditer(settings[5], text[pos]) for m in match: buff.apply_tag(tag_table.lookup(properties[p]), buff.get_iter_at_line_index(pos + offset, m.start()), buff.get_iter_at_line_index(pos + offset, m.end())) tag1 = tag_table.lookup('brasil1') tag2 = tag_table.lookup('brasil2') tag3 = tag_table.lookup('brasil3') match = re.finditer("Bra[sz]il", text[pos]) for m in match: buff.apply_tag(tag1, buff.get_iter_at_line_index(pos + offset, m.start()), buff.get_iter_at_line_index(pos + offset, m.end() - 5)) buff.apply_tag(tag2, buff.get_iter_at_line_index(pos + offset, m.start() + 1), buff.get_iter_at_line_index(pos + offset, m.end() -4)) buff.apply_tag(tag3, buff.get_iter_at_line_index(pos + offset, m.start() + 2), buff.get_iter_at_line_index(pos + offset, m.end() - 3)) buff.apply_tag(tag1, buff.get_iter_at_line_index(pos + offset, m.start() + 3), buff.get_iter_at_line_index(pos + offset, m.end() - 2)) buff.apply_tag(tag2, buff.get_iter_at_line_index(pos + offset, m.start() + 4), buff.get_iter_at_line_index(pos + offset, m.end() - 1)) buff.apply_tag(tag3, buff.get_iter_at_line_index(pos + offset, m.start() + 5), buff.get_iter_at_line_index(pos + offset, m.end())) else: self._brasil_log() match = re.finditer("BRT", text[pos]) for m in match: buff.apply_tag(tag1, buff.get_iter_at_line_index(pos + offset, m.start()), buff.get_iter_at_line_index(pos + offset, m.end() - 2)) buff.apply_tag(tag2, buff.get_iter_at_line_index(pos + offset, m.start() + 1), buff.get_iter_at_line_index(pos + offset, m.end() -1)) buff.apply_tag(tag3, buff.get_iter_at_line_index(pos + offset, m.start() + 2), buff.get_iter_at_line_index(pos + offset, m.end())) else: self._brasil_log() self.text_buffer.move_mark(self.mark, self.text_buffer.get_end_iter()) def _brasil_log(self): if self.brazil: log.info("Isto aqui, o o") log.info("E um pouquinho de Brasil, io io") log.info("Deste Brasil que canta e e feliz") log.info("Feliz, feliz") log.info("") log.info("E tambem um pouco de uma raca") log.info("Que nao tem medo de fumaca ai, ai") log.info("E nao se entrega, nao ") log.info("") log.info('Olha o jeito das "cadera" que ela sabe dar') log.info("Olha o tombo nos quadris que ela sabe dar") log.info("Olha o passe de batuque que ela sabe dar") log.info("Olha so o remelexo que ela sabe dar") log.info("") log.info("Morena boa me faz chorar") log.info("Poe a sandalia de prata") log.info("e vem pro samba sambar") self.brazil = False def show_nmap_output(self, file): self.nmap_output_file = file self.text_buffer.set_text("") self.refresh_output() def refresh_output(self, widget=None): log.debug("Refresh nmap output") if self.nmap_output_file is not None: nmap_of = open(self.nmap_output_file, "r") new_output = nmap_of.read() if self.nmap_previous_output != new_output: # Setting text and moving mark to the start # to update_colors correctly text_prev_len = len(self.nmap_previous_output) self.text_buffer.insert( self.text_buffer.get_end_iter(), enc(new_output[text_prev_len:])) self.nmap_previous_output = new_output self.update_output_colors() nmap_of.close()
class NmapOutputViewer(HIGVBox): def __init__(self, refresh=1, stop=1): self.nmap_highlight = NmapOutputHighlight() HIGVBox.__init__(self) # Creating widgets self.__create_widgets() # Setting scrolled window self.__set_scrolled_window() # Setting text view self.__set_text_view() # Setting buttons self.__set_buttons() # Getting text buffer self.text_buffer = self.text_view.get_buffer() self.refreshing = True self.thread = Thread() # Adding widgets to the VPaned self._pack_expand_fill(self.scrolled) self._pack_noexpand_nofill(self.hbox_buttons) self.nmap_output_file = None self.nmap_previous_output = '' self.brazil = True # We have to create a mark to follow changes in the view with left grav. self.mark = self.text_buffer.create_mark( 'start', self.text_buffer.get_start_iter(), True) self.__create_tags() def __create_tags(self): tag_table = self.text_buffer.get_tag_table() properties = [ "details", "date", "hostname", "ip", "port_list", "open_port", "closed_port", "filtered_port" ] for name in properties: tag = tag_table.lookup(name) if tag: tag_table.remove(tag) for p in xrange(len(properties)): settings = self.nmap_highlight.__getattribute__(properties[p]) # Create a tag name tag = gtk.TextTag(properties[p]) if settings[0]: tag.set_property("weight", pango.WEIGHT_HEAVY) else: tag.set_property("weight", pango.WEIGHT_NORMAL) if settings[1]: tag.set_property("style", pango.STYLE_ITALIC) else: tag.set_property("style", pango.STYLE_NORMAL) if settings[2]: tag.set_property("underline", pango.UNDERLINE_SINGLE) else: tag.set_property("underline", pango.UNDERLINE_NONE) text_color = settings[3] highlight_color = settings[4] tag.set_property( "foreground", gtk.color_selection_palette_to_string([ gtk.gdk.Color(*text_color), ])) tag.set_property( "background", gtk.color_selection_palette_to_string([ gtk.gdk.Color(*highlight_color), ])) tag_table.add(tag) tag.set_priority(p) # brasil tags names = ('brasil1', 'brasil2', 'brasil3') prop = ('foreground', 'background', 'weight') values = (('#EAFF00', '#21C800', pango.WEIGHT_HEAVY), ('#0006FF', '#21C800', pango.WEIGHT_HEAVY), ('#FFFFFF', '#21C800', pango.WEIGHT_HEAVY)) for name in names: tag = tag_table.lookup(name) if tag: tag_table.remove(tag) for i in xrange(len(names)): tag = gtk.TextTag(names[i]) for tup in zip(prop, values[i]): tag.set_property(tup[0], tup[1]) tag_table.add(tag) self.txg_font = gtk.TextTag() self.txg_date = gtk.TextTag() self.txg_font.set_property("family", "Monospace") tag_table.add(self.txg_font) tag_table.add(self.txg_date) def __create_widgets(self): # Creating widgets self.scrolled = gtk.ScrolledWindow() self.text_view = gtk.TextView() self.btn_refresh = gtk.Button(stock=gtk.STOCK_REFRESH) self.check_enable_color = gtk.CheckButton(\ _("Enable Nmap output highlight")) self.btn_output_properties = HIGButton(stock=gtk.STOCK_PREFERENCES) self.hbox_buttons = gtk.HBox(spacing=5) def __set_scrolled_window(self): # By default the vertical scroller remains at bottom self._scroll_at_bottom = True # Seting scrolled window self.scrolled.set_border_width(5) self.scrolled.add(self.text_view) self.scrolled.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) vadjust = self.scrolled.get_vadjustment() vadjust.connect('changed', self.__adjustment_update) vadjust.connect('value-changed', self.__adjustment_at_bottom) def __adjustment_at_bottom(self, adjustment): vadjust_end = adjustment.upper - adjustment.page_size self._scroll_at_bottom = adjustment.value == vadjust_end def __adjustment_update(self, adjustment): if self._scroll_at_bottom: adjustment.set_value(adjustment.upper - adjustment.page_size) def __set_text_view(self): self.text_view.set_wrap_mode(gtk.WRAP_WORD) self.text_view.set_editable(False) def __set_buttons(self): self.check_enable_color.set_active(self.nmap_highlight.enable) # Connecting events self.btn_refresh.connect('clicked', self.refresh_output) self.btn_output_properties.connect("clicked", self.show_output_properties) self.check_enable_color.connect("toggled", self.enable_color_highlight) # Setting hbox self.hbox_buttons.set_border_width(5) # Packing buttons self.hbox_buttons.pack_start(self.check_enable_color) self.hbox_buttons.pack_start(self.btn_output_properties) self.hbox_buttons.pack_start(self.btn_refresh) def enable_color_highlight(self, widget): if widget.get_active(): self.nmap_highlight.enable = 1 else: self.nmap_highlight.enable = 0 self.update_output_colors() def show_output_properties(self, widget): nmap_out_prop = NmapOutputProperties(self.text_view) nmap_out_prop.run() for prop in nmap_out_prop.property_names: widget = nmap_out_prop.property_names[prop][8] wid_props = [] if widget.bold: wid_props.append(1) else: wid_props.append(0) if widget.italic: wid_props.append(1) else: wid_props.append(0) if widget.underline: wid_props.append(1) else: wid_props.append(0) wid_props.append("(%s, %s, %s)" % (widget.text_color.red, widget.text_color.green, widget.text_color.blue)) wid_props.append( "(%s, %s, %s)" % (widget.highlight_color.red, widget.highlight_color.green, widget.highlight_color.blue)) self.nmap_highlight.__setattr__(widget.property_name, wid_props) nmap_out_prop.destroy() self.nmap_highlight.save_changes() # TODO: Foreach in all tabs to update ? self.__create_tags() self.update_output_colors() def update_output_colors(self, dialog=None, response_id=None): self.text_buffer.move_mark(self.mark, self.text_buffer.get_start_iter()) buff = self.text_view.get_buffer() tag_table = buff.get_tag_table() # Get the not-parsed text start = self.text_buffer.get_iter_at_mark(self.mark) end = self.text_buffer.get_end_iter() self.text_buffer.remove_all_tags(start, end) self.text_buffer.apply_tag(self.txg_font, start, end) if not self.nmap_highlight.enable or start == end: return text = buff.get_text(start, end) # Get the line offset offset = start.get_line() if text: text = text.split("\n") properties = [ "details", "date", "hostname", "ip", "port_list", "open_port", "closed_port", "filtered_port" ] for pos in xrange(len(text)): if not text[pos]: continue for p in xrange(len(properties)): settings = self.nmap_highlight.__getattribute__(\ properties[p]) match = re.finditer(settings[5], text[pos]) for m in match: buff.apply_tag( tag_table.lookup(properties[p]), buff.get_iter_at_line_index( pos + offset, m.start()), buff.get_iter_at_line_index(pos + offset, m.end())) tag1 = tag_table.lookup('brasil1') tag2 = tag_table.lookup('brasil2') tag3 = tag_table.lookup('brasil3') match = re.finditer("Bra[sz]il", text[pos]) for m in match: buff.apply_tag( tag1, buff.get_iter_at_line_index( pos + offset, m.start()), buff.get_iter_at_line_index( pos + offset, m.end() - 5)) buff.apply_tag( tag2, buff.get_iter_at_line_index( pos + offset, m.start() + 1), buff.get_iter_at_line_index( pos + offset, m.end() - 4)) buff.apply_tag( tag3, buff.get_iter_at_line_index( pos + offset, m.start() + 2), buff.get_iter_at_line_index( pos + offset, m.end() - 3)) buff.apply_tag( tag1, buff.get_iter_at_line_index( pos + offset, m.start() + 3), buff.get_iter_at_line_index( pos + offset, m.end() - 2)) buff.apply_tag( tag2, buff.get_iter_at_line_index( pos + offset, m.start() + 4), buff.get_iter_at_line_index( pos + offset, m.end() - 1)) buff.apply_tag( tag3, buff.get_iter_at_line_index( pos + offset, m.start() + 5), buff.get_iter_at_line_index(pos + offset, m.end())) else: self._brasil_log() match = re.finditer("BRT", text[pos]) for m in match: buff.apply_tag( tag1, buff.get_iter_at_line_index( pos + offset, m.start()), buff.get_iter_at_line_index( pos + offset, m.end() - 2)) buff.apply_tag( tag2, buff.get_iter_at_line_index( pos + offset, m.start() + 1), buff.get_iter_at_line_index( pos + offset, m.end() - 1)) buff.apply_tag( tag3, buff.get_iter_at_line_index( pos + offset, m.start() + 2), buff.get_iter_at_line_index(pos + offset, m.end())) else: self._brasil_log() self.text_buffer.move_mark(self.mark, self.text_buffer.get_end_iter()) def _brasil_log(self): if self.brazil: log.info("Isto aqui, o o") log.info("E um pouquinho de Brasil, io io") log.info("Deste Brasil que canta e e feliz") log.info("Feliz, feliz") log.info("") log.info("E tambem um pouco de uma raca") log.info("Que nao tem medo de fumaca ai, ai") log.info("E nao se entrega, nao ") log.info("") log.info('Olha o jeito das "cadera" que ela sabe dar') log.info("Olha o tombo nos quadris que ela sabe dar") log.info("Olha o passe de batuque que ela sabe dar") log.info("Olha so o remelexo que ela sabe dar") log.info("") log.info("Morena boa me faz chorar") log.info("Poe a sandalia de prata") log.info("e vem pro samba sambar") self.brazil = False def show_nmap_output(self, file): self.nmap_output_file = file self.text_buffer.set_text("") self.refresh_output() def refresh_output(self, widget=None): log.debug("Refresh nmap output") if self.nmap_output_file is not None: nmap_of = open(self.nmap_output_file, "r") new_output = nmap_of.read() if self.nmap_previous_output != new_output: # Setting text and moving mark to the start # to update_colors correctly text_prev_len = len(self.nmap_previous_output) self.text_buffer.insert(self.text_buffer.get_end_iter(), enc(new_output[text_prev_len:])) self.nmap_previous_output = new_output self.update_output_colors() nmap_of.close()
class NmapOutputProperties(HIGDialog): def __init__(self, nmap_output_view): HIGDialog.__init__(self, _("Nmap Output Properties"), buttons=(gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE)) self.nmap_highlight = NmapOutputHighlight() self.__create_widgets() self.__pack_widgets() self.highlight_tab() self.vbox.show_all() def __create_widgets(self): self.properties_notebook = HIGNotebook() def __pack_widgets(self): self.vbox.pack_start(self.properties_notebook) def highlight_tab(self): # Creating highlight tab main box self.highlight_main_vbox = HIGVBox() # Creating highlight tab main table self.highlight_main_table = HIGTable() self.highlight_main_table.set_border_width(6) ############# # Properties: self.property_names = {"details": [_("details"), "MAC Address:"], "port_list": [_("port listing title"), "PORT STATE SERVICE"], "open_port": [_("open port"), "22/tcp open ssh"], "closed_port": [_("closed port"), "70/tcp closed gopher"], "filtered_port": [_("filtered port"), "80/tcp filtered http"], "date": [_("date"), "2006-05-26 11:14 BRT"], "hostname": [_("hostname"), "scanme.nmap.org"], "ip": [_("ip"), "127.0.0.1"]} for p in self.property_names: settings = self.nmap_highlight.__getattribute__(p) self.property_names[p].append(settings[0]) self.property_names[p].append(settings[1]) self.property_names[p].append(settings[2]) self.property_names[p].append(gtk.gdk.Color(*settings[3])) self.property_names[p].append(gtk.gdk.Color(*settings[4])) self.property_names[p].append(settings[5]) # Creating properties and related widgets and attaching it to main table y1 = 0 y2 = 1 for p in self.property_names: hp = HighlightProperty(p, self.property_names[p]) self.highlight_main_table.attach(hp.property_name_label, 0, 1, y1, y2) self.highlight_main_table.attach(hp.example_label, 1, 2, y1, y2) self.highlight_main_table.attach(hp.bold_tg_button, 2, 3, y1, y2) self.highlight_main_table.attach(hp.italic_tg_button, 3, 4, y1, y2) self.highlight_main_table.attach(hp.underline_tg_button, 4, 5, y1, y2) self.highlight_main_table.attach(hp.text_color_button, 5, 6, y1, y2) self.highlight_main_table.attach(hp.highlight_color_button, 6, 7, y1, y2) # Setting example styles and colors hp.update_example() self.property_names[p].append(hp) y1 += 1 y2 += 1 # Packing main table into main vbox self.highlight_main_vbox.pack_start(self.highlight_main_table) # Adding color tab self.properties_notebook.append_page(self.highlight_main_vbox, gtk.Label(_("Highlight definitions")))