aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/gui/dialogs
diff options
context:
space:
mode:
authorDan Vrátil <dvratil@redhat.com>2011-05-16 22:10:00 +0800
committerRodrigo Moya <rodrigo@gnome-db.org>2011-06-30 00:42:16 +0800
commitf09486d7376bf2008d022458ad42f450a8c77ff5 (patch)
tree215d0dd582fbda64a175b3c3e8c428cac32c03b1 /calendar/gui/dialogs
parentfb38e4a4ba22026cd4524ca6bb3c35bb2cdba0ef (diff)
downloadgsoc2013-evolution-f09486d7376bf2008d022458ad42f450a8c77ff5.tar.gz
gsoc2013-evolution-f09486d7376bf2008d022458ad42f450a8c77ff5.tar.zst
gsoc2013-evolution-f09486d7376bf2008d022458ad42f450a8c77ff5.zip
Bug #649392 - Improve calendar's "Goto" dialog and move it to dialogs
Diffstat (limited to 'calendar/gui/dialogs')
-rw-r--r--calendar/gui/dialogs/Makefile.am4
-rw-r--r--calendar/gui/dialogs/goto-dialog.c285
-rw-r--r--calendar/gui/dialogs/goto-dialog.h34
-rw-r--r--calendar/gui/dialogs/goto-dialog.ui180
4 files changed, 503 insertions, 0 deletions
diff --git a/calendar/gui/dialogs/Makefile.am b/calendar/gui/dialogs/Makefile.am
index 38e0c47e62..684550990b 100644
--- a/calendar/gui/dialogs/Makefile.am
+++ b/calendar/gui/dialogs/Makefile.am
@@ -36,6 +36,7 @@ ecalendarinclude_HEADERS = \
e-send-options-utils.h \
event-editor.h \
event-page.h \
+ goto-dialog.h \
memo-editor.h \
memo-page.h \
recurrence-page.h \
@@ -85,6 +86,8 @@ libcal_dialogs_la_SOURCES = \
event-editor.h \
event-page.c \
event-page.h \
+ goto-dialog.c \
+ goto-dialog.h \
memo-editor.c \
memo-editor.h \
memo-page.c \
@@ -113,6 +116,7 @@ ui_DATA = \
alarm-list-dialog.ui \
e-delegate-dialog.ui \
event-page.ui \
+ goto-dialog.ui \
memo-page.ui \
recurrence-page.ui \
schedule-page.ui \
diff --git a/calendar/gui/dialogs/goto-dialog.c b/calendar/gui/dialogs/goto-dialog.c
new file mode 100644
index 0000000000..282d5547ff
--- /dev/null
+++ b/calendar/gui/dialogs/goto-dialog.c
@@ -0,0 +1,285 @@
+/*
+ * Go to date dialog for Evolution
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ * Federico Mena <federico@ximian.com>
+ * JP Rosevear <jpr@ximian.com>
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ * Copyright (C) 1998 Red Hat, Inc.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <gtk/gtk.h>
+
+#include "goto-dialog.h"
+
+#include "e-util/e-util.h"
+#include "e-util/e-util-private.h"
+#include "calendar/gui/calendar-config.h"
+#include "calendar/gui/tag-calendar.h"
+
+typedef struct
+{
+ GtkBuilder *builder;
+ GtkWidget *dialog;
+
+ GtkWidget *month_combobox;
+ GtkWidget *year;
+ ECalendar *ecal;
+ GtkWidget *vbox;
+
+ GnomeCalendar *gcal;
+ gint year_val;
+ gint month_val;
+ gint day_val;
+
+} GoToDialog;
+
+static GoToDialog *dlg = NULL;
+
+/* Callback used when the year adjustment is changed */
+static void
+year_changed (GtkAdjustment *adj, gpointer data)
+{
+ GoToDialog *dlg = data;
+
+ dlg->year_val = gtk_spin_button_get_value_as_int (GTK_SPIN_BUTTON (dlg->year));
+ e_calendar_item_set_first_month (dlg->ecal->calitem, dlg->year_val, dlg->month_val);
+}
+
+/* Callback used when a month button is toggled */
+static void
+month_changed (GtkToggleButton *toggle, gpointer data)
+{
+ GoToDialog *dlg = data;
+
+ dlg->month_val = gtk_combo_box_get_active (GTK_COMBO_BOX (dlg->month_combobox));
+
+ e_calendar_item_set_first_month (dlg->ecal->calitem, dlg->year_val, dlg->month_val);
+}
+
+static void
+ecal_date_range_changed (ECalendarItem *calitem, gpointer user_data)
+{
+ GoToDialog *dlg = user_data;
+ ECalModel *model;
+ ECal *client;
+
+ model = gnome_calendar_get_model (dlg->gcal);
+ client = e_cal_model_get_default_client (model);
+ if (client)
+ tag_calendar_by_client (dlg->ecal, client);
+}
+
+/* Event handler for day groups in the month item. A button press makes
+ * the calendar jump to the selected day and destroys the Go-to dialog box. */
+static void
+ecal_event (ECalendarItem *calitem, gpointer user_data)
+{
+ GoToDialog *dlg = user_data;
+ GDate start_date, end_date;
+ ECalModel *model;
+ struct icaltimetype tt = icaltime_null_time ();
+ icaltimezone *timezone;
+ time_t et;
+
+ model = gnome_calendar_get_model (dlg->gcal);
+ e_calendar_item_get_selection (calitem, &start_date, &end_date);
+ timezone = e_cal_model_get_timezone (model);
+
+ tt.year = g_date_get_year (&start_date);
+ tt.month = g_date_get_month (&start_date);
+ tt.day = g_date_get_day (&start_date);
+
+ et = icaltime_as_timet_with_zone (tt, timezone);
+
+ gnome_calendar_goto (dlg->gcal, et);
+
+ gtk_dialog_response (GTK_DIALOG (dlg->dialog), GTK_RESPONSE_NONE);
+}
+
+/* Returns the current time, for the ECalendarItem. */
+static struct tm
+get_current_time (ECalendarItem *calitem, gpointer data)
+{
+ icaltimezone *zone;
+ struct tm tmp_tm = { 0 };
+ struct icaltimetype tt;
+
+ /* Get the current timezone. */
+ zone = calendar_config_get_icaltimezone ();
+
+ tt = icaltime_from_timet_with_zone (time (NULL), FALSE, zone);
+
+ /* Now copy it to the struct tm and return it. */
+ tmp_tm.tm_year = tt.year - 1900;
+ tmp_tm.tm_mon = tt.month - 1;
+ tmp_tm.tm_mday = tt.day;
+ tmp_tm.tm_hour = tt.hour;
+ tmp_tm.tm_min = tt.minute;
+ tmp_tm.tm_sec = tt.second;
+ tmp_tm.tm_isdst = -1;
+
+ return tmp_tm;
+}
+
+/* Creates the ecalendar */
+static void
+create_ecal (GoToDialog *dlg)
+{
+ ECalendarItem *calitem;
+
+ dlg->ecal = E_CALENDAR (e_calendar_new ());
+ calitem = dlg->ecal->calitem;
+
+ gnome_canvas_item_set (GNOME_CANVAS_ITEM (calitem),
+ "move_selection_when_moving", FALSE,
+ NULL);
+ e_calendar_item_set_display_popup (calitem, FALSE);
+ gtk_widget_show (GTK_WIDGET (dlg->ecal));
+ gtk_box_pack_start (GTK_BOX (dlg->vbox), GTK_WIDGET (dlg->ecal), TRUE, TRUE, 0);
+
+ e_calendar_item_set_first_month (calitem, dlg->year_val, dlg->month_val);
+ e_calendar_item_set_get_time_callback (calitem,
+ get_current_time,
+ dlg, NULL);
+
+ ecal_date_range_changed (calitem, dlg);
+}
+
+static void
+goto_today (GoToDialog *dlg)
+{
+ gnome_calendar_goto_today (dlg->gcal);
+}
+
+/* Gets the widgets from the XML file and returns if they are all available. */
+static gboolean
+get_widgets (GoToDialog *dlg)
+{
+ #define GW(name) e_builder_get_widget (dlg->builder, name)
+
+ dlg->dialog = GW ("goto-dialog");
+
+ dlg->month_combobox = GW ("month-combobox");
+ dlg->year = GW ("year");
+ dlg->vbox = GW ("vbox");
+
+ #undef GW
+
+ return (dlg->dialog
+ && dlg->month_combobox
+ && dlg->year
+ && dlg->vbox);
+}
+
+static void
+goto_dialog_init_widgets (GoToDialog *dlg)
+{
+ GtkAdjustment *adj;
+
+ g_signal_connect (
+ dlg->month_combobox, "changed",
+ G_CALLBACK (month_changed), dlg);
+
+ adj = gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (dlg->year));
+ g_signal_connect (
+ adj, "value_changed",
+ G_CALLBACK (year_changed), dlg);
+
+ g_signal_connect (
+ dlg->ecal->calitem, "date_range_changed",
+ G_CALLBACK (ecal_date_range_changed), dlg);
+ g_signal_connect (
+ dlg->ecal->calitem, "selection_changed",
+ G_CALLBACK (ecal_event), dlg);
+}
+
+/* Creates a "goto date" dialog and runs it */
+void
+goto_dialog (GtkWindow *parent, GnomeCalendar *gcal)
+{
+ ECalModel *model;
+ time_t start_time;
+ struct icaltimetype tt;
+ icaltimezone *timezone;
+ gint week_start_day;
+ gint b;
+
+ if (dlg) {
+ return;
+ }
+
+ dlg = g_new0 (GoToDialog, 1);
+
+ /* Load the content widgets */
+ dlg->builder = gtk_builder_new ();
+ e_load_ui_builder_definition (dlg->builder, "goto-dialog.ui");
+
+ if (!get_widgets (dlg)) {
+ g_message ("goto_dialog(): Could not find all widgets in the XML file!");
+ g_free (dlg);
+ return;
+ }
+ dlg->gcal = gcal;
+
+ model = gnome_calendar_get_model (gcal);
+ timezone = e_cal_model_get_timezone (model);
+ e_cal_model_get_time_range (model, &start_time, NULL);
+ tt = icaltime_from_timet_with_zone (start_time, FALSE, timezone);
+ dlg->year_val = tt.year;
+ dlg->month_val = tt.month - 1;
+ dlg->day_val = tt.day;
+
+ gtk_combo_box_set_active (GTK_COMBO_BOX (dlg->month_combobox), dlg->month_val);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (dlg->year), dlg->year_val);
+
+ create_ecal (dlg);
+
+ goto_dialog_init_widgets (dlg);
+
+ gtk_window_set_transient_for (GTK_WINDOW (dlg->dialog), parent);
+
+ /* set initial selection to current day */
+
+ dlg->ecal->calitem->selection_set = TRUE;
+ dlg->ecal->calitem->selection_start_month_offset = 0;
+ dlg->ecal->calitem->selection_start_day = tt.day;
+ dlg->ecal->calitem->selection_end_month_offset = 0;
+ dlg->ecal->calitem->selection_end_day = tt.day;
+
+ /* Set week_start_day. Convert it to 0 (Mon) to 6 (Sun), which is what we use. */
+ week_start_day = e_cal_model_get_week_start_day (model);
+ dlg->ecal->calitem->week_start_day = (week_start_day + 6) % 7;
+
+ gnome_canvas_item_grab_focus (GNOME_CANVAS_ITEM (dlg->ecal->calitem));
+
+ b = gtk_dialog_run (GTK_DIALOG (dlg->dialog));
+ gtk_widget_destroy (dlg->dialog);
+
+ if (b == 0)
+ goto_today (dlg);
+
+ g_object_unref (dlg->builder);
+ g_free (dlg);
+ dlg = NULL;
+}
diff --git a/calendar/gui/dialogs/goto-dialog.h b/calendar/gui/dialogs/goto-dialog.h
new file mode 100644
index 0000000000..9cd416be80
--- /dev/null
+++ b/calendar/gui/dialogs/goto-dialog.h
@@ -0,0 +1,34 @@
+/*
+ * Evolution calendar - Go To Date dialog
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) version 3.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with the program; if not, see <http://www.gnu.org/licenses/>
+ *
+ *
+ * Authors:
+ * Federico Mena <federico@ximian.com>
+ * JP Rosevear <jpr@ximian.com>
+ *
+ * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
+ * Copyright (C) 1998 Red Hat, Inc.
+ *
+ */
+
+#ifndef GOTO_DIALOG_H
+#define GOTO_DIALOG_H
+
+#include "calendar/gui/gnome-cal.h"
+
+void goto_dialog (GtkWindow *parent, GnomeCalendar *gcal);
+
+#endif
diff --git a/calendar/gui/dialogs/goto-dialog.ui b/calendar/gui/dialogs/goto-dialog.ui
new file mode 100644
index 0000000000..4bcb1da863
--- /dev/null
+++ b/calendar/gui/dialogs/goto-dialog.ui
@@ -0,0 +1,180 @@
+<?xml version="1.0"?>
+<!--*- mode: xml -*-->
+<interface>
+ <object class="GtkAdjustment" id="adjustment1">
+ <property name="upper">2038</property>
+ <property name="lower">1969</property>
+ <property name="page_increment">5</property>
+ <property name="step_increment">1</property>
+ <property name="page_size">0</property>
+ <property name="value">1969</property>
+ </object>
+ <object class="GtkListStore" id="model1">
+ <columns>
+ <column type="gchararray"/>
+ </columns>
+ <data>
+ <row>
+ <col id="0" translatable="yes">January</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">February</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">March</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">April</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">May</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">June</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">July</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">August</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">September</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">October</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">November</col>
+ </row>
+ <row>
+ <col id="0" translatable="yes">December</col>
+ </row>
+ </data>
+ </object>
+ <object class="GtkDialog" id="goto-dialog">
+ <property name="title" translatable="yes">Select Date</property>
+ <property name="type">GTK_WINDOW_TOPLEVEL</property>
+ <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
+ <property name="modal">False</property>
+ <property name="resizable">True</property>
+ <property name="destroy_with_parent">False</property>
+ <property name="decorated">True</property>
+ <property name="skip_taskbar_hint">False</property>
+ <property name="skip_pager_hint">False</property>
+ <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
+ <property name="gravity">GDK_GRAVITY_NORTH_WEST</property>
+ <property name="focus_on_map">True</property>
+ <property name="urgency_hint">False</property>
+ <property name="border_width">12</property>
+ <child internal-child="vbox">
+ <object class="GtkVBox" id="dialog-vbox1">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">8</property>
+ <child internal-child="action_area">
+ <object class="GtkHButtonBox" id="dialog-action_area1">
+ <property name="visible">True</property>
+ <property name="layout_style">GTK_BUTTONBOX_END</property>
+ <child>
+ <object class="GtkButton" id="button4">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label" translatable="yes">Select _Today</property>
+ <property name="use_underline">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </object>
+ </child>
+ <child>
+ <object class="GtkButton" id="button5">
+ <property name="visible">True</property>
+ <property name="can_default">True</property>
+ <property name="can_focus">True</property>
+ <property name="label">gtk-cancel</property>
+ <property name="use_stock">True</property>
+ <property name="relief">GTK_RELIEF_NORMAL</property>
+ <property name="focus_on_click">True</property>
+ </object>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="pack_type">GTK_PACK_END</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkVBox" id="vbox">
+ <property name="visible">True</property>
+ <property name="homogeneous">False</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkHBox" id="hbox12">
+ <property name="visible">True</property>
+ <property name="homogeneous">True</property>
+ <property name="spacing">4</property>
+ <child>
+ <object class="GtkComboBox" id="month-combobox">
+ <property name="visible">True</property>
+ <property name="add_tearoffs">False</property>
+ <property name="focus_on_click">True</property>
+ <property name="model">model1</property>
+ <child>
+ <object class="GtkCellRendererText" id="renderer1"/>
+ <attributes>
+ <attribute name="text">0</attribute>
+ </attributes>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkSpinButton" id="year">
+ <property name="visible">True</property>
+ <property name="can_focus">True</property>
+ <property name="climb_rate">1</property>
+ <property name="digits">0</property>
+ <property name="numeric">True</property>
+ <property name="update_policy">GTK_UPDATE_IF_VALID</property>
+ <property name="snap_to_ticks">False</property>
+ <property name="wrap">False</property>
+ <property name="adjustment">adjustment1</property>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ <child>
+ <placeholder/>
+ </child>
+ </object>
+ <packing>
+ <property name="padding">0</property>
+ <property name="expand">True</property>
+ <property name="fill">True</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ <action-widgets>
+ <action-widget response="0">button4</action-widget>
+ <action-widget response="-6">button5</action-widget>
+ </action-widgets>
+ </object>
+</interface>