diff options
author | Dan Vrátil <dvratil@redhat.com> | 2011-05-16 22:10:00 +0800 |
---|---|---|
committer | Rodrigo Moya <rodrigo@gnome-db.org> | 2011-06-30 00:42:16 +0800 |
commit | f09486d7376bf2008d022458ad42f450a8c77ff5 (patch) | |
tree | 215d0dd582fbda64a175b3c3e8c428cac32c03b1 /calendar/gui/dialogs | |
parent | fb38e4a4ba22026cd4524ca6bb3c35bb2cdba0ef (diff) | |
download | gsoc2013-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.am | 4 | ||||
-rw-r--r-- | calendar/gui/dialogs/goto-dialog.c | 285 | ||||
-rw-r--r-- | calendar/gui/dialogs/goto-dialog.h | 34 | ||||
-rw-r--r-- | calendar/gui/dialogs/goto-dialog.ui | 180 |
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> |