summaryrefslogtreecommitdiff
path: root/gtk/gtkcalendar.c
diff options
context:
space:
mode:
authorMathias Hasselmann <hasselmm@src.gnome.org>2007-12-28 09:36:06 +0000
committerMathias Hasselmann <hasselmm@src.gnome.org>2007-12-28 09:36:06 +0000
commitdbac73cfb1eac11754a0acd76583c870dea9ca7a (patch)
tree624a955470018b9aec0d522dcf86cd536a10c090 /gtk/gtkcalendar.c
parentf35439bfacf90900e2c24f7ae3da173183c79d34 (diff)
downloadgtk+-dbac73cfb1eac11754a0acd76583c870dea9ca7a.tar.gz
Implement GtkTooltip API for calendar details. (#339540)
* gtk/gtkcalendar.c: Add gtk_calendar_query_tooltip and chain it up. Remember detail overflows in calendar_paint_day to show the tooltip only when neccessary. svn path=/trunk/; revision=19263
Diffstat (limited to 'gtk/gtkcalendar.c')
-rw-r--r--gtk/gtkcalendar.c66
1 files changed, 64 insertions, 2 deletions
diff --git a/gtk/gtkcalendar.c b/gtk/gtkcalendar.c
index 63cfc8c191..59452bbabd 100644
--- a/gtk/gtkcalendar.c
+++ b/gtk/gtkcalendar.c
@@ -54,6 +54,7 @@
#include "gtkintl.h"
#include "gtkmain.h"
#include "gtkmarshalers.h"
+#include "gtktooltip.h"
#include "gtkprivate.h"
#include "gdk/gdkkeysyms.h"
#include "gtkalias.h"
@@ -292,6 +293,7 @@ struct _GtkCalendarPrivate
/* Size requistion for details provided by the hook. */
gint detail_height_rows;
gint detail_width_chars;
+ gint detail_overflow[6];
};
#define GTK_CALENDAR_GET_PRIVATE(widget) (GTK_CALENDAR (widget)->priv)
@@ -337,6 +339,11 @@ static void gtk_calendar_state_changed (GtkWidget *widget,
GtkStateType previous_state);
static void gtk_calendar_style_set (GtkWidget *widget,
GtkStyle *previous_style);
+static gboolean gtk_calendar_query_tooltip (GtkWidget *widget,
+ gint x,
+ gint y,
+ gboolean keyboard_mode,
+ GtkTooltip *tooltip);
static void gtk_calendar_drag_data_get (GtkWidget *widget,
GdkDragContext *context,
@@ -416,6 +423,7 @@ gtk_calendar_class_init (GtkCalendarClass *class)
widget_class->state_changed = gtk_calendar_state_changed;
widget_class->grab_notify = gtk_calendar_grab_notify;
widget_class->focus_out_event = gtk_calendar_focus_out;
+ widget_class->query_tooltip = gtk_calendar_query_tooltip;
widget_class->drag_data_get = gtk_calendar_drag_data_get;
widget_class->drag_motion = gtk_calendar_drag_motion;
@@ -1644,6 +1652,50 @@ gtk_calendar_get_detail (GtkCalendar *calendar,
priv->detail_func_user_data);
}
+static gboolean
+gtk_calendar_query_tooltip (GtkWidget *widget,
+ gint x,
+ gint y,
+ gboolean keyboard_mode,
+ GtkTooltip *tooltip)
+{
+ GtkCalendarPrivate *priv = GTK_CALENDAR_GET_PRIVATE (widget);
+ GtkCalendar *calendar = GTK_CALENDAR (widget);
+ const gchar *detail = NULL;
+ GdkRectangle day_rect;
+
+ if (priv->main_win)
+ {
+ gint x0, y0, row, col;
+
+ gdk_window_get_position (priv->main_win, &x0, &y0);
+ col = calendar_column_from_x (calendar, x - x0);
+ row = calendar_row_from_y (calendar, y - y0);
+
+ if (priv->detail_overflow[row] & (1 << col))
+ {
+ detail = gtk_calendar_get_detail (calendar, row, col);
+ calendar_day_rectangle (calendar, row, col, &day_rect);
+
+ day_rect.x += x0;
+ day_rect.y += y0;
+ }
+ }
+
+ if (detail)
+ {
+ gtk_tooltip_set_tip_area (tooltip, &day_rect);
+ gtk_tooltip_set_markup (tooltip, detail);
+
+ return TRUE;
+ }
+
+ if (GTK_WIDGET_CLASS (gtk_calendar_parent_class)->query_tooltip)
+ return GTK_WIDGET_CLASS (gtk_calendar_parent_class)->query_tooltip (widget, x, y, keyboard_mode, tooltip);
+
+ return FALSE;
+}
+
/****************************************
* Size Request and Allocate *
@@ -2336,6 +2388,7 @@ calendar_paint_day (GtkCalendar *calendar,
PangoLayout *layout;
PangoRectangle logical_rect;
+ gboolean overflow = FALSE;
g_return_if_fail (row < 6);
g_return_if_fail (col < 7);
@@ -2457,8 +2510,12 @@ calendar_paint_day (GtkCalendar *calendar,
n_lines = pango_layout_get_line_count (layout);
- if (priv->detail_height_rows)
- n_lines = MIN (n_lines, priv->detail_height_rows);
+ if (priv->detail_height_rows &&
+ n_lines > priv->detail_height_rows)
+ {
+ n_lines = priv->detail_height_rows;
+ overflow = TRUE;
+ }
for (i = 0; i < n_lines; ++i)
{
@@ -2493,6 +2550,11 @@ calendar_paint_day (GtkCalendar *calendar,
day_rect.width, day_rect.height);
}
+ if (overflow)
+ priv->detail_overflow[row] |= (1 << col);
+ else
+ priv->detail_overflow[row] &= ~(1 << col);
+
g_object_unref (layout);
cairo_destroy (cr);
}