aboutsummaryrefslogtreecommitdiffstats
path: root/calendar/prop.c
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@nuclecu.unam.mx>1998-08-25 03:59:25 +0800
committerArturo Espinosa <unammx@src.gnome.org>1998-08-25 03:59:25 +0800
commit4d075f28b587361a5014edd4946f30d9ae113e9f (patch)
treec73583c453f4981d652e010f2c620e2997934e4f /calendar/prop.c
parentabdba7c651a0a04809c8a8a20c72188fbd62d2b9 (diff)
downloadgsoc2013-evolution-4d075f28b587361a5014edd4946f30d9ae113e9f.tar.gz
gsoc2013-evolution-4d075f28b587361a5014edd4946f30d9ae113e9f.tar.zst
gsoc2013-evolution-4d075f28b587361a5014edd4946f30d9ae113e9f.zip
Changed the Properties menu item to Preferences. These are global
1998-08-24 Federico Mena Quintero <federico@nuclecu.unam.mx> * main.c: Changed the Properties menu item to Preferences. These are global application preferences, not a single calendar's properties. * prop.c (prop_apply): Save the week_starts_on_monday flag to the configuration file. (properties): Added a check button for weeks starting on Monday. (properties): Beautified the Preferences dialog. * month-view.c (month_view_init): * goto.c (create_days): Set the month item to start weeks on Monday if appropriate. * main.c (init_calendar): A boolean is not an hour, so don't range_check_hour() on it. (init_calendar): Added a global week_starts_on_monday flag. * main.h: Added global week_starts_on_monday flag. svn path=/trunk/; revision=336
Diffstat (limited to 'calendar/prop.c')
-rw-r--r--calendar/prop.c321
1 files changed, 219 insertions, 102 deletions
diff --git a/calendar/prop.c b/calendar/prop.c
index 58abe2f8db..c339230a1a 100644
--- a/calendar/prop.c
+++ b/calendar/prop.c
@@ -2,153 +2,270 @@
* Calendar properties dialog box
* (C) 1998 the Free Software Foundation
*
- * Author: Miguel de Icaza <miguel@kernel.org>
+ * Authors: Miguel de Icaza <miguel@kernel.org>
+ * Federico Mena <federico@nuclecu.unam.mx>
*/
#include <config.h>
+#include <langinfo.h>
#include <gnome.h>
#include "gnome-cal.h"
#include "main.h"
-static GtkWidget *prop_win, *r1;
-static GtkObject *sa, *ea;
+static GtkWidget *prop_win; /* The preferences dialog */
+static GtkWidget *time_format_12; /* Radio button for 12-hour format */
+static GtkWidget *time_format_24; /* Radio button for 24-hour format */
+static GtkWidget *start_on_sunday; /* Check button for weeks starting on Sunday */
+static GtkWidget *start_on_monday; /* Check button for weeks starting on Monday */
+static GtkWidget *start_omenu; /* Option menu for start of day */
+static GtkWidget *end_omenu; /* Option menu for end of day */
+static GtkWidget *start_items[24]; /* Menu items for start of day menu */
+static GtkWidget *end_items[24]; /* Menu items for end of day menu */
+/* Callback used when the property box is closed -- just sets the prop_win variable to null. */
+static int
+prop_cancel (void)
+{
+ prop_win = NULL;
+ return FALSE;
+}
+
+/* Returns the index of the active item in a menu */
+static int
+get_active_index (GtkWidget *menu)
+{
+ GtkWidget *active;
+
+ active = gtk_menu_get_active (GTK_MENU (menu));
+ return GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (active)));
+}
+
+/* Callback used when the Apply button is clicked. */
static void
-start_changed (GtkAdjustment *sa, GtkAdjustment *ea)
+prop_apply (GtkWidget *w, int page)
{
- if (sa->value > 23.0){
- sa->value = 23.0;
- ea->value = 24.0;
- gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
- gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
- } else if (sa->value >= ea->value){
- ea->value = sa->value + 1.0;
- gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
- }
- gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
+ if (page != -1)
+ return;
+
+ /* Day begin/end */
+
+ day_begin = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
+ day_end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
+ gnome_config_set_int ("/calendar/Calendar/Day start", day_begin);
+ gnome_config_set_int ("/calendar/Calendar/Day end", day_end);
+
+ /* Time format */
+
+ am_pm_flag = GTK_TOGGLE_BUTTON (time_format_12)->active;
+ gnome_config_set_bool ("/calendar/Calendar/AM PM flag", am_pm_flag);
+
+ /* Week start */
+
+ week_starts_on_monday = GTK_TOGGLE_BUTTON (start_on_monday)->active;
+ gnome_config_set_bool ("/calendar/Calendar/Week starts on Monday", week_starts_on_monday);
+
+ gnome_config_sync ();
+ time_format_changed ();
}
+/* Notifies the property box that the data has changed */
static void
-end_changed (GtkAdjustment *ea, GtkAdjustment *sa)
+toggled (GtkWidget *widget, gpointer data)
{
- if (ea->value < 1.0){
- ea->value = 1.0;
- sa->value = 0.0;
- gtk_signal_emit_by_name (GTK_OBJECT (ea), "value_changed");
- gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
- } else if (ea->value < sa->value){
- sa->value = ea->value - 1.0;
- gtk_signal_emit_by_name (GTK_OBJECT (sa), "value_changed");
- }
gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
}
-/* justifies the text */
+/* Builds and returns a two-element radio button group surrounded by a frame. The radio buttons are
+ * stored in the specified variables, and the first radio button's state is set according to the
+ * specified flag value. The buttons are connected to the toggled() function to update the property
+ * box's dirty state.
+ */
static GtkWidget *
-align (GtkWidget *w, float side)
+build_two_radio_group (char *title,
+ char *radio_1_title, GtkWidget **radio_1_widget,
+ char *radio_2_title, GtkWidget **radio_2_widget,
+ int radio_1_value)
{
- GtkWidget *a;
+ GtkWidget *frame;
+ GtkWidget *vbox;
- a = gtk_alignment_new (side, 0.5, 1.0, 1.0);
- gtk_container_add (GTK_CONTAINER (a), w);
+ frame = gtk_frame_new (title);
- return a;
-}
+ vbox = gtk_vbox_new (TRUE, 0);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
-static int
-prop_cancel (void)
-{
- prop_win = 0;
- return FALSE;
+ *radio_1_widget = gtk_radio_button_new_with_label (NULL, radio_1_title);
+ gtk_box_pack_start (GTK_BOX (vbox), *radio_1_widget, FALSE, FALSE, 0);
+
+ *radio_2_widget = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (*radio_1_widget),
+ radio_2_title);
+ gtk_box_pack_start (GTK_BOX (vbox), *radio_2_widget, FALSE, FALSE, 0);
+
+ gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (*radio_1_widget), radio_1_value);
+
+ gtk_signal_connect (GTK_OBJECT (*radio_1_widget), "toggled",
+ (GtkSignalFunc) toggled,
+ NULL);
+
+ return frame;
}
+/* Callback invoked when a menu item from the start/end time option menus is selected. It adjusts
+ * the other menu to the proper time, if needed.
+ */
static void
-prop_apply (GtkWidget *w, int page)
+hour_activated (GtkWidget *widget, gpointer data)
{
- if (page != -1)
- return;
-
- day_begin = GTK_ADJUSTMENT (sa)->value;
- day_end = GTK_ADJUSTMENT (ea)->value;
- gnome_config_set_int ("/calendar/Calendar/Day start", day_begin);
- gnome_config_set_int ("/calendar/Calendar/Day end", day_end);
+ int start, end;
- am_pm_flag = (GTK_TOGGLE_BUTTON (r1)->active) == 0;
- gnome_config_set_bool ("/calendar/Calendar/AM PM flag", am_pm_flag);
+ if (data == start_omenu) {
+ /* Adjust the end menu */
- gnome_config_sync ();
+ start = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
+ end = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (end_omenu)));
+
+ if (end < start)
+ gtk_option_menu_set_history (GTK_OPTION_MENU (end_omenu), start);
+ } else if (data == end_omenu) {
+ /* Adjust the start menu */
- day_range_changed ();
+ end = GPOINTER_TO_INT (gtk_object_get_user_data (GTK_OBJECT (widget)));
+ start = get_active_index (gtk_option_menu_get_menu (GTK_OPTION_MENU (start_omenu)));
+
+ if (start > end)
+ gtk_option_menu_set_history (GTK_OPTION_MENU (start_omenu), end);
+ } else
+ g_assert_not_reached ();
}
-static void
-toggled ()
+/* Builds an option menu of 24 hours */
+static GtkWidget *
+build_hours_menu (GtkWidget **items, int active)
{
- gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win));
+ GtkWidget *omenu;
+ GtkWidget *menu;
+ int i;
+ char buf[100];
+ struct tm tm;
+
+ omenu = gtk_option_menu_new ();
+ menu = gtk_menu_new ();
+
+ memset (&tm, 0, sizeof (tm));
+
+ for (i = 0; i < 24; i++) {
+ tm.tm_hour = i;
+ strftime (buf, 100, "%I:%M %p", &tm);
+
+ items[i] = gtk_menu_item_new_with_label (buf);
+ gtk_object_set_user_data (GTK_OBJECT (items[i]), GINT_TO_POINTER (i));
+ gtk_signal_connect (GTK_OBJECT (items[i]), "activate",
+ (GtkSignalFunc) hour_activated,
+ omenu);
+
+ gtk_menu_append (GTK_MENU (menu), items[i]);
+ gtk_widget_show (items[i]);
+ }
+
+ gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu);
+ gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), active);
+ return omenu;
}
+/* Creates and displays the preferences dialog for the whole application */
void
properties (void)
{
- GtkWidget *t, *l, *ds, *de;
- GtkWidget *r2;
+ GtkWidget *hbox;
+ GtkWidget *vbox;
+ GtkWidget *frame;
+ GtkWidget *hbox2;
+ GtkWidget *hbox3;
+ GtkWidget *w;
if (prop_win)
return;
+
+ /* Main window and hbox for property page */
prop_win = gnome_property_box_new ();
+ gtk_window_set_title (GTK_WINDOW (prop_win), _("Preferences"));
- t = gtk_table_new (0, 0, 0);
- gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), t,
- gtk_label_new (_("Calendar global parameters")));
-
- l = gtk_label_new (_("Day start:"));
- gtk_table_attach (GTK_TABLE (t), l,
- 0, 1, 0, 1, 0, 0, 0, 0);
- sa = gtk_adjustment_new (day_begin, 0.0, 25.00, 1.0, 1.0, 1.0);
- ds = gtk_hscale_new (GTK_ADJUSTMENT (sa));
- gtk_scale_set_digits (GTK_SCALE (ds), 0);
- gtk_table_attach (GTK_TABLE (t), ds,
- 1, 2, 0, 1, GTK_FILL | GTK_EXPAND, 0, 0, 0);
-
- l = gtk_label_new (_("Day end:"));
- gtk_table_attach (GTK_TABLE (t), l,
- 0, 1, 1, 2, 0, 0, 0, 0);
- ea = gtk_adjustment_new (day_end, 0.0, 25.00, 1.0, 1.0, 1.0);
- de = gtk_hscale_new (GTK_ADJUSTMENT (ea));
- gtk_scale_set_digits (GTK_SCALE (de), 0);
- gtk_table_attach (GTK_TABLE (t), de,
- 1, 2, 1, 2, GTK_FILL | GTK_EXPAND, 0, 0, 0);
-
- gtk_signal_connect (sa, "value_changed",
- GTK_SIGNAL_FUNC (start_changed), ea);
- gtk_signal_connect (ea, "value_changed",
- GTK_SIGNAL_FUNC (end_changed), sa);
-
- /* Nice spacing :-) */
- gtk_table_attach (GTK_TABLE (t), gtk_label_new (""),
- 0, 1, 2, 3, 0, 0, 0, 0);
-
- r1 = gtk_radio_button_new_with_label (NULL, _("24 hour format"));
- r2 = gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (r1),
- _("12 hour format"));
- if (am_pm_flag)
- gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (r2), 1);
-
- gtk_signal_connect (GTK_OBJECT (r1), "toggled",
- GTK_SIGNAL_FUNC (toggled), NULL);
-
- gtk_table_attach (GTK_TABLE (t), align (r1, 0.0), 0, 2, 3, 4, GTK_FILL | GTK_EXPAND, 0, 0, 0);
- gtk_table_attach (GTK_TABLE (t), align (r2, 0.0), 0, 2, 4, 5, GTK_FILL | GTK_EXPAND, 0, 0, 0);
+ hbox = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_container_border_width (GTK_CONTAINER (hbox), GNOME_PAD_SMALL);
+ gnome_property_box_append_page (GNOME_PROPERTY_BOX (prop_win), hbox,
+ gtk_label_new (_("Time display")));
- gtk_signal_connect (GTK_OBJECT (prop_win), "destroy",
- GTK_SIGNAL_FUNC (prop_cancel), NULL);
+ /* Time format */
+
+ vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_box_pack_start (GTK_BOX (hbox), vbox, FALSE, FALSE, 0);
+
+ w = build_two_radio_group (_("Time format"),
+ _("12-hour (AM/PM)"), &time_format_12,
+ _("24-hour"), &time_format_24,
+ am_pm_flag);
+ gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
+
+ /* Weeks start on */
+
+ w = build_two_radio_group (_("Weeks start on"),
+ _("Sunday"), &start_on_sunday,
+ _("Monday"), &start_on_monday,
+ !week_starts_on_monday);
+ gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
+
+ /* Day range */
+
+ frame = gtk_frame_new (_("Day range"));
+ gtk_box_pack_start (GTK_BOX (hbox), frame, TRUE, TRUE, 0);
+
+ vbox = gtk_vbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_container_border_width (GTK_CONTAINER (vbox), GNOME_PAD_SMALL);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
+
+ w = gtk_label_new (_("Please select the start and end hours you want\n"
+ "to be displayed in the day view and week view.\n"
+ "Times outside this range will not be displayed\n"
+ "by default."));
+ gtk_label_set_justify (GTK_LABEL (w), GTK_JUSTIFY_LEFT);
+ gtk_misc_set_alignment (GTK_MISC (w), 0.0, 0.0);
+ gtk_box_pack_start (GTK_BOX (vbox), w, FALSE, FALSE, 0);
+
+ hbox2 = gtk_hbox_new (FALSE, GNOME_PAD);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox2, FALSE, FALSE, 0);
+
+ /* Day start */
+
+ hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
+
+ w = gtk_label_new (_("Day start:"));
+ gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
+
+ start_omenu = build_hours_menu (start_items, day_begin);
+ gtk_box_pack_start (GTK_BOX (hbox3), start_omenu, FALSE, FALSE, 0);
+
+ /* Day end */
+
+ hbox3 = gtk_hbox_new (FALSE, GNOME_PAD_SMALL);
+ gtk_box_pack_start (GTK_BOX (hbox2), hbox3, FALSE, FALSE, 0);
+
+ w = gtk_label_new (_("Day end:"));
+ gtk_box_pack_start (GTK_BOX (hbox3), w, FALSE, FALSE, 0);
+
+ end_omenu = build_hours_menu (end_items, day_end);
+ gtk_box_pack_start (GTK_BOX (hbox3), end_omenu, FALSE, FALSE, 0);
+
+ /* Done! */
+ gtk_signal_connect (GTK_OBJECT (prop_win), "destroy",
+ (GtkSignalFunc) prop_cancel, NULL);
+
gtk_signal_connect (GTK_OBJECT (prop_win), "delete_event",
- GTK_SIGNAL_FUNC (prop_cancel), NULL);
-
+ (GtkSignalFunc) prop_cancel, NULL);
+
gtk_signal_connect (GTK_OBJECT (prop_win), "apply",
- GTK_SIGNAL_FUNC (prop_apply), NULL);
-
+ (GtkSignalFunc) prop_apply, NULL);
+
gtk_widget_show_all (prop_win);
}
-