diff options
-rw-r--r-- | widgets/text/e-completion-view.c | 140 | ||||
-rw-r--r-- | widgets/text/e-completion-view.h | 2 | ||||
-rw-r--r-- | widgets/text/e-entry.c | 10 |
3 files changed, 148 insertions, 4 deletions
diff --git a/widgets/text/e-completion-view.c b/widgets/text/e-completion-view.c index 50f1c6b469..aac38ccec9 100644 --- a/widgets/text/e-completion-view.c +++ b/widgets/text/e-completion-view.c @@ -67,6 +67,131 @@ e_completion_view_local_key_press_handler (GtkWidget *w, GdkEventKey *ev) return e_completion_view_key_press_handler (w, ev, w); } +static void +e_completion_view_paint (GtkWidget *widget, GdkRectangle *area) +{ + gint i; + + g_return_if_fail (widget != NULL); + g_return_if_fail (E_IS_COMPLETION_VIEW (widget)); + g_return_if_fail (area != NULL); + + if (!GTK_WIDGET_DRAWABLE (widget)) + return; + + for (i = 0; i < E_COMPLETION_VIEW (widget)->border_width; ++i) { + + gdk_draw_rectangle (widget->window, + widget->style->black_gc, + FALSE, i, i, + widget->allocation.width-1-i, + widget->allocation.height-1-i); + + } + +} + +static void +e_completion_view_draw (GtkWidget *widget, GdkRectangle *area) +{ + GtkBin *bin; + GdkRectangle child_area; + + g_return_if_fail (widget != NULL); + g_return_if_fail (E_IS_COMPLETION_VIEW (widget)); + g_return_if_fail (area != NULL); + + if (GTK_WIDGET_DRAWABLE (widget)) { + bin = GTK_BIN (widget); + + e_completion_view_paint (widget, area); + + if (bin->child && gtk_widget_intersect (bin->child, area, &child_area)) + gtk_widget_draw (bin->child, &child_area); + } +} + +static gint +e_completion_view_expose_event (GtkWidget *widget, GdkEventExpose *event) +{ + GtkBin *bin; + GdkEventExpose child_event; + + g_return_val_if_fail (widget != NULL, FALSE); + g_return_val_if_fail (E_IS_COMPLETION_VIEW (widget), FALSE); + g_return_val_if_fail (event != NULL, FALSE); + + if (GTK_WIDGET_DRAWABLE (widget)) { + bin = GTK_BIN (widget); + + e_completion_view_paint (widget, &event->area); + + child_event = *event; + if (bin->child && + GTK_WIDGET_NO_WINDOW (bin->child) && + gtk_widget_intersect (bin->child, &event->area, &child_event.area)) + gtk_widget_event (bin->child, (GdkEvent*) &child_event); + } + + return FALSE; +} + +static void +e_completion_view_size_request (GtkWidget *widget, GtkRequisition *requisition) +{ + GtkBin *bin; + + g_return_if_fail (widget != NULL); + g_return_if_fail (E_IS_COMPLETION_VIEW (widget)); + g_return_if_fail (requisition != NULL); + + bin = GTK_BIN (widget); + + requisition->width = 2 * E_COMPLETION_VIEW (widget)->border_width; + requisition->height = 2 * E_COMPLETION_VIEW (widget)->border_width; + + if (bin->child && GTK_WIDGET_VISIBLE (bin->child)) { + GtkRequisition child_requisition; + + gtk_widget_size_request (bin->child, &child_requisition); + + requisition->width += child_requisition.width; + requisition->height += child_requisition.height; + } +} + +static void +e_completion_view_size_allocate (GtkWidget *widget, GtkAllocation *allocation) +{ + GtkBin *bin; + GtkAllocation child_allocation; + + g_return_if_fail (widget != NULL); + g_return_if_fail (E_IS_COMPLETION_VIEW (widget)); + g_return_if_fail (allocation != NULL); + + bin = GTK_BIN (widget); + widget->allocation = *allocation; + + child_allocation.x = E_COMPLETION_VIEW (widget)->border_width; + child_allocation.width = MAX(0, (gint)allocation->width - child_allocation.x * 2); + + child_allocation.y = E_COMPLETION_VIEW (widget)->border_width; + child_allocation.height = MAX (0, (gint)allocation->height - child_allocation.y * 2); + + if (GTK_WIDGET_REALIZED (widget)) { + gdk_window_move_resize (widget->window, + allocation->x, + allocation->y, + allocation->width, + allocation->height); + } + + if (bin->child) { + gtk_widget_size_allocate (bin->child, &child_allocation); + } +} + GtkType e_completion_view_get_type (void) { @@ -152,11 +277,16 @@ e_completion_view_class_init (ECompletionViewClass *klass) object_class->destroy = e_completion_view_destroy; widget_class->key_press_event = e_completion_view_local_key_press_handler; + widget_class->draw = e_completion_view_draw; + widget_class->expose_event = e_completion_view_expose_event; + widget_class->size_request = e_completion_view_size_request; + widget_class->size_allocate = e_completion_view_size_allocate; } static void e_completion_view_init (ECompletionView *completion) { + completion->border_width = 2; } static void @@ -558,14 +688,20 @@ e_completion_view_construct (ECompletionView *cv, ECompletion *completion) cv->table = e_table_scrolled_new (cv->model, NULL, simple_spec, NULL); + e_scroll_frame_set_shadow_type (E_SCROLL_FRAME (cv->table), GTK_SHADOW_NONE); + e_scroll_frame_set_scrollbar_spacing (E_SCROLL_FRAME (cv->table), 0); e_scroll_frame_set_policy (E_SCROLL_FRAME (cv->table), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); +#if 0 frame = gtk_frame_new (NULL); gtk_container_add (GTK_CONTAINER (cv), frame); gtk_container_add (GTK_CONTAINER (frame), cv->table); gtk_widget_show_all (frame); - +#else + gtk_container_add (GTK_CONTAINER (cv), cv->table); + gtk_widget_show_all (cv->table); +#endif gtk_signal_connect (GTK_OBJECT (e_completion_view_table (cv)), "click", GTK_SIGNAL_FUNC (table_click_cb), @@ -677,7 +813,7 @@ e_completion_view_set_width (ECompletionView *cv, gint width) lines = MIN (lines, drop_room); /* We reduce the total height by a bit; in practice, this seems to work out well. */ - gtk_widget_set_usize (w, width, (gint) floor (line_height * lines * 0.97)); + gtk_widget_set_usize (w, width, (gint) floor (line_height * (0.5 + (float)lines) * 0.97)); } void diff --git a/widgets/text/e-completion-view.h b/widgets/text/e-completion-view.h index fc3a2598bf..ee18420fef 100644 --- a/widgets/text/e-completion-view.h +++ b/widgets/text/e-completion-view.h @@ -70,6 +70,8 @@ struct _ECompletionView { gboolean editable; gint selection; + + gint border_width; }; struct _ECompletionViewClass { diff --git a/widgets/text/e-entry.c b/widgets/text/e-entry.c index 022efa15f7..7d87b76587 100644 --- a/widgets/text/e-entry.c +++ b/widgets/text/e-entry.c @@ -49,6 +49,8 @@ #include "e-text.h" #include "e-entry.h" +#define MOVE_RIGHT_AND_UP 0 + #define EVIL_POINTER_WARPING_HACK #ifdef EVIL_POINTER_WARPING_HACK @@ -150,7 +152,7 @@ canvas_size_allocate (GtkWidget *widget, GtkAllocation *alloc, "clip_height", (double) (alloc->height), NULL); - if (entry->priv->draw_borders) { + if (!entry->priv->draw_borders) { xthick = 0; ythick = 0; } else { @@ -472,13 +474,17 @@ e_entry_show_popup (EEntry *entry, gboolean visible) x = xo + dim->x; y = yo + dim->height + dim->y; +#if MOVE_RIGHT_AND_UP /* Put our popup slightly to the right and up, to try to give a visual cue that this popup is tied to this entry. Otherwise one-row popups can sort of "blend" with an entry directly below. */ fudge = MAX (dim->height/10, 3); /* just in case we are using a really big font, etc. */ x += 2*fudge; y -= fudge; - +#else + fudge = 1; + y -= fudge; +#endif gtk_widget_set_uposition (pop, x, y); e_completion_view_set_width (E_COMPLETION_VIEW (entry->priv->completion_view), dim->width); |