diff options
-rw-r--r-- | widgets/text/e-entry.c | 15 | ||||
-rw-r--r-- | widgets/text/e-text.c | 107 | ||||
-rw-r--r-- | widgets/text/e-text.h | 2 |
3 files changed, 124 insertions, 0 deletions
diff --git a/widgets/text/e-entry.c b/widgets/text/e-entry.c index b46ed1e6c5..a55f35b90c 100644 --- a/widgets/text/e-entry.c +++ b/widgets/text/e-entry.c @@ -99,6 +99,7 @@ enum { ARG_ALLOW_NEWLINES, ARG_DRAW_BORDERS, ARG_DRAW_BACKGROUND, + ARG_DRAW_BUTTON, ARG_CURSOR_POS }; @@ -289,6 +290,7 @@ e_entry_init (GtkObject *object) "anchor", GTK_ANCHOR_NW, "draw_borders", TRUE, "draw_background", TRUE, + "draw_button", FALSE, "max_lines", 1, "editable", TRUE, "allow_newlines", FALSE, @@ -931,6 +933,12 @@ et_get_arg (GtkObject *o, GtkArg *arg, guint arg_id) NULL); break; + case ARG_DRAW_BUTTON: + gtk_object_get (item, + "draw_button", >K_VALUE_BOOL (*arg), + NULL); + break; + case ARG_CURSOR_POS: gtk_object_get (item, "cursor_pos", >K_VALUE_INT (*arg), @@ -1112,6 +1120,11 @@ et_set_arg (GtkObject *o, GtkArg *arg, guint arg_id) gtk_object_set (item, "draw_background", GTK_VALUE_BOOL (*arg), NULL); break; + + case ARG_DRAW_BUTTON: + gtk_object_set (item, "draw_button", + GTK_VALUE_BOOL (*arg), NULL); + break; } } @@ -1231,6 +1244,8 @@ e_entry_class_init (GtkObjectClass *object_class) GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BORDERS); gtk_object_add_arg_type ("EEntry::draw_background", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BACKGROUND); + gtk_object_add_arg_type ("EEntry::draw_button", + GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BUTTON); gtk_object_add_arg_type ("EEntry::cursor_pos", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_CURSOR_POS); } diff --git a/widgets/text/e-text.c b/widgets/text/e-text.c index 8d17c4b004..c6259fc3e0 100644 --- a/widgets/text/e-text.c +++ b/widgets/text/e-text.c @@ -99,6 +99,7 @@ enum { ARG_DRAW_BORDERS, ARG_ALLOW_NEWLINES, ARG_DRAW_BACKGROUND, + ARG_DRAW_BUTTON, ARG_CURSOR_POS }; @@ -326,6 +327,8 @@ e_text_class_init (ETextClass *klass) GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_ALLOW_NEWLINES); gtk_object_add_arg_type ("EText::draw_background", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BACKGROUND); + gtk_object_add_arg_type ("EText::draw_button", + GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_DRAW_BUTTON); gtk_object_add_arg_type ("EText::cursor_pos", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_CURSOR_POS); @@ -429,6 +432,7 @@ e_text_init (EText *text) text->tpl_timeout = 0; text->draw_background = FALSE; + text->draw_button = FALSE; text->bold = FALSE; text->strikeout = FALSE; @@ -1491,6 +1495,13 @@ e_text_set_arg (GtkObject *object, GtkArg *arg, guint arg_id) } break; + case ARG_DRAW_BUTTON: + if (text->draw_button != GTK_VALUE_BOOL (*arg)){ + text->draw_button = GTK_VALUE_BOOL (*arg); + text->needs_redraw = 1; + } + break; + case ARG_ALLOW_NEWLINES: text->allow_newlines = GTK_VALUE_BOOL (*arg); _get_tep(text); @@ -1662,6 +1673,10 @@ e_text_get_arg (GtkObject *object, GtkArg *arg, guint arg_id) GTK_VALUE_BOOL (*arg) = text->draw_background; break; + case ARG_DRAW_BUTTON: + GTK_VALUE_BOOL (*arg) = text->draw_button; + break; + case ARG_ALLOW_NEWLINES: GTK_VALUE_BOOL (*arg) = text->allow_newlines; break; @@ -2042,6 +2057,98 @@ e_text_draw (GnomeCanvasItem *item, GdkDrawable *drawable, thisheight - widget->style->klass->ythickness * 2); } } + if (text->draw_button) { + GtkWidget *widget; + int xoff = item->x1 - x; + int yoff = item->y1 - y; + + widget = GTK_WIDGET (item->canvas); + + xoff -= widget->allocation.x; + yoff -= widget->allocation.y; + + widget = widget->parent; + + while (widget && !GTK_IS_BUTTON(widget)) { + if (!GTK_WIDGET_NO_WINDOW (widget)) { + widget = NULL; + break; + } + widget = widget->parent; + } + if (widget) { + GtkButton *button = GTK_BUTTON (widget); + GtkShadowType shadow_type; + int thisx, thisy, thisheight, thiswidth; + int default_spacing; + GdkRectangle area; + area.x = 0; + area.y = 0; + area.width = width; + area.height = height; + +#define DEFAULT_SPACING 7 + + default_spacing = gtk_style_get_prop_experimental (widget->style, + "GtkButton::default_spacing", + DEFAULT_SPACING); + + thisx = 0; + thisy = 0; + thiswidth = widget->allocation.width - GTK_CONTAINER (widget)->border_width * 2; + thisheight = widget->allocation.height - GTK_CONTAINER (widget)->border_width * 2; + + if (GTK_WIDGET_HAS_DEFAULT (widget) && + GTK_BUTTON (widget)->relief == GTK_RELIEF_NORMAL) + { + gtk_paint_box (widget->style, drawable, + GTK_STATE_NORMAL, GTK_SHADOW_IN, + &area, widget, "buttondefault", + thisx + xoff, thisy + yoff, thiswidth, thisheight); + } + + if (GTK_WIDGET_CAN_DEFAULT (widget)) { + thisx += widget->style->klass->xthickness; + thisy += widget->style->klass->ythickness; + thiswidth -= 2 * thisx + default_spacing; + thisheight -= 2 * thisy + default_spacing; + thisx += (1 + default_spacing) / 2; + thisy += (1 + default_spacing) / 2; + } + + if (GTK_WIDGET_HAS_FOCUS (widget)) { + thisx += 1; + thisy += 1; + thiswidth -= 2; + thisheight -= 2; + } + + if (GTK_WIDGET_STATE (widget) == GTK_STATE_ACTIVE) + shadow_type = GTK_SHADOW_IN; + else + shadow_type = GTK_SHADOW_OUT; + + if ((button->relief != GTK_RELIEF_NONE) || + ((GTK_WIDGET_STATE(widget) != GTK_STATE_NORMAL) && + (GTK_WIDGET_STATE(widget) != GTK_STATE_INSENSITIVE))) + gtk_paint_box (widget->style, drawable, + GTK_WIDGET_STATE (widget), + shadow_type, &area, widget, "button", + thisx + xoff, thisy + yoff, thiswidth, thisheight); + + if (GTK_WIDGET_HAS_FOCUS (widget)) { + thisx -= 1; + thisy -= 1; + thiswidth += 2; + thisheight += 2; + + gtk_paint_focus (widget->style, widget->window, + &area, widget, "button", + thisx + xoff, thisy + yoff, thiswidth - 1, thisheight - 1); + } + } + } + if (!text->text || !text->font) return; diff --git a/widgets/text/e-text.h b/widgets/text/e-text.h index 9a5b997bba..573a2d9b70 100644 --- a/widgets/text/e-text.h +++ b/widgets/text/e-text.h @@ -75,6 +75,7 @@ BEGIN_GNOME_DECLS * max_lines int RW Number of lines possible when doing line wrap. * draw_borders boolean RW Whether to draw borders. * draw_background boolean RW Whether to draw the background. + * draw_button boolean RW This makes EText handle being the child of a button properly and highlighting as it should. */ #define E_TYPE_TEXT (e_text_get_type ()) @@ -190,6 +191,7 @@ struct _EText { guint default_cursor_shown : 1; /* Is the default cursor currently shown? */ guint draw_borders : 1; /* Draw borders? */ guint draw_background : 1; /* Draw background? */ + guint draw_button : 1; /* Draw button? */ guint line_wrap : 1; /* Do line wrap */ |