aboutsummaryrefslogtreecommitdiff
path: root/src/idocalendarmenuitem.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/idocalendarmenuitem.c')
-rw-r--r--src/idocalendarmenuitem.c181
1 files changed, 158 insertions, 23 deletions
diff --git a/src/idocalendarmenuitem.c b/src/idocalendarmenuitem.c
index fca4bb6..806c863 100644
--- a/src/idocalendarmenuitem.c
+++ b/src/idocalendarmenuitem.c
@@ -26,8 +26,13 @@
#include <gdk/gdkkeysyms.h>
#include "idocalendarmenuitem.h"
+#if GTK_CHECK_VERSION (3, 0, 0)
+static void ido_calendar_menu_item_select (GtkMenuItem *item);
+static void ido_calendar_menu_item_deselect (GtkMenuItem *item);
+#else
static void ido_calendar_menu_item_select (GtkItem *item);
static void ido_calendar_menu_item_deselect (GtkItem *item);
+#endif
static gboolean ido_calendar_menu_item_button_release (GtkWidget *widget,
GdkEventButton *event);
static gboolean ido_calendar_menu_item_button_press (GtkWidget *widget,
@@ -42,7 +47,12 @@ static void calendar_realized_cb (GtkWidget *widg
static void calendar_move_focus_cb (GtkWidget *widget,
GtkDirectionType direction,
IdoCalendarMenuItem *item);
-
+static void calendar_month_changed_cb (GtkWidget *widget,
+ gpointer user_data);
+static void calendar_day_selected_double_click_cb (GtkWidget *widget,
+ gpointer user_data);
+static void calendar_day_selected_cb (GtkWidget *widget,
+ gpointer user_data);
struct _IdoCalendarMenuItemPrivate
{
GtkWidget *box;
@@ -60,34 +70,51 @@ ido_calendar_menu_item_class_init (IdoCalendarMenuItemClass *klass)
GObjectClass *gobject_class;
GtkWidgetClass *widget_class;
GtkMenuItemClass *menu_item_class;
+#if ! GTK_CHECK_VERSION (3, 0, 0)
GtkItemClass *item_class;
+#endif
gobject_class = G_OBJECT_CLASS (klass);
widget_class = GTK_WIDGET_CLASS (klass);
menu_item_class = GTK_MENU_ITEM_CLASS (klass);
+#if ! GTK_CHECK_VERSION (3, 0, 0)
item_class = GTK_ITEM_CLASS (klass);
+#endif
widget_class->button_release_event = ido_calendar_menu_item_button_release;
widget_class->button_press_event = ido_calendar_menu_item_button_press;
+#if GTK_CHECK_VERSION (3, 0, 0)
+ menu_item_class->select = ido_calendar_menu_item_select;
+ menu_item_class->deselect = ido_calendar_menu_item_deselect;
+#else
item_class->select = ido_calendar_menu_item_select;
item_class->deselect = ido_calendar_menu_item_deselect;
+#endif
menu_item_class->hide_on_activate = TRUE;
g_type_class_add_private (gobject_class, sizeof (IdoCalendarMenuItemPrivate));
+
+ g_signal_new("month-changed", G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+
+ g_signal_new("day-selected", G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+ g_signal_new("day-selected-double-click", G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_LAST, 0, NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
}
static void
ido_calendar_menu_item_init (IdoCalendarMenuItem *item)
{
IdoCalendarMenuItemPrivate *priv;
- GtkBorder border;
-
- border.left = 4;
- border.right = 4;
- border.top = 2;
- border.bottom = 2;
priv = item->priv = IDO_CALENDAR_MENU_ITEM_GET_PRIVATE (item);
@@ -124,7 +151,7 @@ ido_calendar_menu_item_send_focus_change (GtkWidget *widget,
gtk_widget_grab_focus (widget);
event->focus_change.type = GDK_FOCUS_CHANGE;
- event->focus_change.window = g_object_ref (widget->window);
+ event->focus_change.window = g_object_ref (gtk_widget_get_window (widget));
event->focus_change.in = in;
gtk_widget_event (widget, event);
@@ -149,9 +176,9 @@ ido_calendar_menu_item_key_press (GtkWidget *widget,
gtk_widget_event (calendar,
((GdkEvent *)(void*)(event)));
- if (calendar->window != NULL)
+ if (gtk_widget_get_window (calendar) != NULL)
{
- gdk_window_raise (calendar->window);
+ gdk_window_raise (gtk_widget_get_window (calendar));
}
if (!gtk_widget_has_focus (calendar))
@@ -159,7 +186,7 @@ ido_calendar_menu_item_key_press (GtkWidget *widget,
gtk_widget_grab_focus (calendar);
}
- return event->keyval != GDK_Return;
+ return event->keyval != GDK_KEY_Return;
}
return FALSE;
@@ -173,9 +200,9 @@ ido_calendar_menu_item_button_press (GtkWidget *widget,
if (event->button == 1)
{
- if (calendar->window != NULL)
+ if (gtk_widget_get_window (calendar) != NULL)
{
- gdk_window_raise (calendar->window);
+ gdk_window_raise (gtk_widget_get_window (calendar));
}
if (!gtk_widget_has_focus (calendar))
@@ -183,9 +210,6 @@ ido_calendar_menu_item_button_press (GtkWidget *widget,
gtk_widget_grab_focus (calendar);
}
- gtk_widget_event (calendar,
- ((GdkEvent *)(void*)(event)));
-
return TRUE;
}
@@ -198,14 +222,15 @@ ido_calendar_menu_item_button_release (GtkWidget *widget,
{
GtkWidget *calendar = IDO_CALENDAR_MENU_ITEM (widget)->priv->calendar;
- gtk_widget_event (calendar,
- ((GdkEvent *)(void*)(event)));
-
return TRUE;
}
static void
+#if GTK_CHECK_VERSION (3, 0, 0)
+ido_calendar_menu_item_select (GtkMenuItem *item)
+#else
ido_calendar_menu_item_select (GtkItem *item)
+#endif
{
IDO_CALENDAR_MENU_ITEM (item)->priv->selected = TRUE;
@@ -213,7 +238,11 @@ ido_calendar_menu_item_select (GtkItem *item)
}
static void
+#if GTK_CHECK_VERSION (3, 0, 0)
+ido_calendar_menu_item_deselect (GtkMenuItem *item)
+#else
ido_calendar_menu_item_deselect (GtkItem *item)
+#endif
{
IDO_CALENDAR_MENU_ITEM (item)->priv->selected = FALSE;
@@ -225,16 +254,29 @@ static void
calendar_realized_cb (GtkWidget *widget,
IdoCalendarMenuItem *item)
{
- if (widget->window != NULL)
+ if (gtk_widget_get_window (widget) != NULL)
{
- gdk_window_raise (widget->window);
+ gdk_window_raise (gtk_widget_get_window (widget));
}
- g_signal_connect (GTK_WIDGET (item)->parent,
+ g_signal_connect (gtk_widget_get_parent (GTK_WIDGET (item)),
"key-press-event",
G_CALLBACK (ido_calendar_menu_item_key_press),
item);
-
+
+ g_signal_connect (item->priv->calendar,
+ "month-changed",
+ G_CALLBACK (calendar_month_changed_cb),
+ item);
+ g_signal_connect (item->priv->calendar,
+ "day-selected",
+ G_CALLBACK (calendar_day_selected_cb),
+ item);
+ g_signal_connect (item->priv->calendar,
+ "day-selected-double-click",
+ G_CALLBACK (calendar_day_selected_double_click_cb),
+ item);
+
ido_calendar_menu_item_send_focus_change (widget, TRUE);
}
@@ -250,6 +292,32 @@ calendar_move_focus_cb (GtkWidget *widget,
GTK_DIR_TAB_FORWARD);
}
+static void
+calendar_month_changed_cb (GtkWidget *widget,
+ gpointer user_data)
+{
+ IdoCalendarMenuItem *item = (IdoCalendarMenuItem *)user_data;
+ g_signal_emit_by_name (item, "month-changed", NULL);
+}
+
+static void
+calendar_day_selected_cb (GtkWidget *widget,
+ gpointer user_data)
+{
+ IdoCalendarMenuItem *item = (IdoCalendarMenuItem *)user_data;
+ g_signal_emit_by_name (item, "day-selected", NULL);
+}
+
+static void
+calendar_day_selected_double_click_cb (GtkWidget *widget,
+ gpointer user_data)
+{
+ IdoCalendarMenuItem *item = (IdoCalendarMenuItem *)user_data;
+ guint day, month, year;
+ gtk_calendar_get_date (GTK_CALENDAR (widget), &year, &month, &day);
+ g_signal_emit_by_name (item, "day-selected-double-click", NULL);
+}
+
/* Public API */
GtkWidget *
ido_calendar_menu_item_new (void)
@@ -264,3 +332,70 @@ ido_calendar_menu_item_get_calendar (IdoCalendarMenuItem *item)
return item->priv->calendar;
}
+
+gboolean
+ido_calendar_menu_item_mark_day (IdoCalendarMenuItem *menuitem, guint day)
+{
+ g_return_val_if_fail(IDO_IS_CALENDAR_MENU_ITEM(menuitem), FALSE);
+
+ gtk_calendar_mark_day(GTK_CALENDAR (menuitem->priv->calendar), day);
+ return TRUE;
+}
+
+gboolean
+ido_calendar_menu_item_unmark_day (IdoCalendarMenuItem *menuitem, guint day)
+{
+ g_return_val_if_fail(IDO_IS_CALENDAR_MENU_ITEM(menuitem), FALSE);
+
+ gtk_calendar_unmark_day(GTK_CALENDAR (menuitem->priv->calendar), day);
+ return TRUE;
+}
+
+void
+ido_calendar_menu_item_clear_marks (IdoCalendarMenuItem *menuitem)
+{
+ g_return_if_fail(IDO_IS_CALENDAR_MENU_ITEM(menuitem));
+
+ gtk_calendar_clear_marks(GTK_CALENDAR (menuitem->priv->calendar));
+}
+
+void
+ido_calendar_menu_item_set_display_options (IdoCalendarMenuItem *menuitem, GtkCalendarDisplayOptions flags)
+{
+ g_return_if_fail(IDO_IS_CALENDAR_MENU_ITEM(menuitem));
+
+ gtk_calendar_set_display_options (GTK_CALENDAR (menuitem->priv->calendar), flags);
+}
+
+GtkCalendarDisplayOptions
+ido_calendar_menu_item_get_display_options (IdoCalendarMenuItem *menuitem)
+{
+ g_return_val_if_fail(IDO_IS_CALENDAR_MENU_ITEM(menuitem), 0);
+
+ return gtk_calendar_get_display_options (GTK_CALENDAR (menuitem->priv->calendar));
+}
+
+void
+ido_calendar_menu_item_get_date (IdoCalendarMenuItem *menuitem,
+ guint *year,
+ guint *month,
+ guint *day) {
+
+ g_return_if_fail(IDO_IS_CALENDAR_MENU_ITEM(menuitem));
+ gtk_calendar_get_date (GTK_CALENDAR (menuitem->priv->calendar), year, month, day);
+}
+
+gboolean
+ido_calendar_menu_item_set_date (IdoCalendarMenuItem *menuitem,
+ guint year,
+ guint month,
+ guint day)
+{
+ g_return_val_if_fail(IDO_IS_CALENDAR_MENU_ITEM(menuitem), FALSE);
+ gtk_calendar_select_month (GTK_CALENDAR (menuitem->priv->calendar), month, year);
+ gtk_calendar_select_day (GTK_CALENDAR (menuitem->priv->calendar), day);
+ return TRUE;
+}
+
+
+