import gtk import gobject class MessageArea(gtk.HBox): __gsignals__ = { "response" : ( gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_INT,) ), "close" : ( gobject.SIGNAL_RUN_LAST | gobject.SIGNAL_ACTION, gobject.TYPE_NONE, () ) } def __init__(self): gtk.HBox.__init__(self) self.contents = None self.changing_style = False self.main_hbox = gtk.HBox(False, 16) # FIXME: use style properties self.main_hbox.show() self.main_hbox.set_border_width(8) # FIXME: use style properties self.action_area = gtk.VBox(True, 3) # FIXME: use style properties */ self.action_area.show() self.main_hbox.pack_end(self.action_area, False, True) self.pack_start(self.main_hbox, True, True) self.set_app_paintable(True) self.connect("expose-event", self.paint_message_area) self.connect("size-allocate", self.on_size_allocate) # Note that we connect to style-set on one of the internal # widgets, not on the message area itself, since gtk does # not deliver any further style-set signals for a widget on # which the style has been forced with gtk_widget_set_style() self.main_hbox.connect("style-set", self.style_set) def on_size_allocate(self, widget, rectangle): # force a _complete_ redraw here or else in certain cases after resizing # some border lines are left painted on top of the main content area. self.queue_draw() def style_set (self, widget, prev_style): if self.changing_style: return # This is a hack needed to use the tooltip background color window = gtk.Window(gtk.WINDOW_POPUP) window.set_name ("gtk-tooltip") window.ensure_style() style = window.get_style() self.changing_style = True self.set_style(style) self.changing_style = False window.destroy() self.queue_draw() def paint_message_area(self, widget, event): a = widget.get_allocation() x = a.x + 1 y = a.y + 1 width = a.width - 2 height = a.height - 2 widget.style.paint_flat_box(widget.window, gtk.STATE_NORMAL, gtk.SHADOW_OUT, None, widget, "tooltip", x, y, width, height) return False def action_widget_activated (self, widget): resp = self.get_response_data(widget) if resp is None: resp = gtk.RESPONSE_NONE self.response(resp) def get_response_data(self, widget): return widget.get_data("gedit-message-area-response-data") def set_response_data(self, widget, new_id): widget.set_data("gedit-message-area-response-data", new_id) def add_action_widget (self, child, response_id): self.set_response_data (child, response_id); try: signal = child.get_activate_signal() except ValueError: signal = None if isinstance(child, gtk.Button): child.connect("clicked", self.action_widget_activated) elif signal: child.connect(signal, self.action_widget_activated) else: pass #g_warning ("Only 'activatable' widgets can be packed into the action area of a GeditMessageArea"); if response_id != gtk.RESPONSE_HELP: self.action_area.pack_end(child, False, False) else: self.action_area.pack_start(child, False, False) def add_button (self, text, response_id): button = gtk.Button(stock=text) button.set_flags(gtk.CAN_DEFAULT) button.show() self.add_action_widget(button, response_id) return button def add_buttons(self, *buttons): for text, response_id in buttons: self.add_button(text, response_id) def set_response_sensitive(self, response_id, setting): children = self.action_area.get_children() for child in children: rd = self.get_response_data(child) if rd == response_id: child.set_sensitive(setting) def set_default_response (self, response_id): children = self.action_area.get_children() for child in children: rd = self.get_response_data(child) if rd == response_id: child.grab_default() def response (self, response_id): self.emit("response", response_id) def add_stock_button_with_text (self, text, stock_id, response_id): button = gtk.Button(text, use_underline=True) button.set_image(gtk.image_new_from_stock(stock_id,gtk.ICON_SIZE_BUTTON)) button.set_flags(gtk.CAN_DEFAULT) button.show() self.add_action_widget(button, response_id) def set_contents(self, contents): self.contents = contents; self.main_hbox.pack_start(self.contents, True, True) def set_text_and_icon(self, icon_stock_id, primary_text, secondary_text): hbox_content = gtk.HBox(False, 8) hbox_content.show() image = gtk.image_new_from_stock(icon_stock_id, gtk.ICON_SIZE_DIALOG) image.show() hbox_content.pack_start(image, False, False) image.set_alignment(0.5, 0.5) vbox = gtk.VBox(False, 6) vbox.show() hbox_content.pack_start(vbox, True, True) primary_markup = "%s" % primary_text primary_label = gtk.Label(primary_markup) primary_label.set_use_markup(True) primary_label.set_line_wrap(True) primary_label.set_alignment(0, 0.5) primary_label.set_flags(gtk.CAN_FOCUS) primary_label.set_selectable(True) primary_label.show() vbox.pack_start(primary_label, True, True) if secondary_text: secondary_markup = "%s" % secondary_text secondary_label = gtk.Label(secondary_markup) secondary_label.set_flags(gtk.CAN_FOCUS) secondary_label.set_use_markup(True) secondary_label.set_line_wrap(True) secondary_label.set_selectable(True) secondary_label.set_alignment(0, 0.5) secondary_label.show() vbox.pack_start(secondary_label, True, True) self.set_contents(hbox_content); gtk.binding_entry_add_signal (MessageArea, gtk.gdk.keyval_from_name("Escape"), 0, "close");