/* * Calendar properties dialog box * (C) 1998 the Free Software Foundation * * Authors: Miguel de Icaza * Federico Mena */ #include #include #include #include "gnome-cal.h" #include "main.h" 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 prop_apply (GtkWidget *w, int page) { 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 toggled (GtkWidget *widget, gpointer data) { gnome_property_box_changed (GNOME_PROPERTY_BOX (prop_win)); } /* 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 * 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 *frame; GtkWidget *vbox; frame = gtk_frame_new (title); vbox = gtk_vbox_new (TRUE, 0); gtk_container_add (GTK_CONTAINER (frame), vbox); *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 hour_activated (GtkWidget *widget, gpointer data) { int start, end; if (data == start_omenu) { /* Adjust the end menu */ 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 */ 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 (); } /* Builds an option menu of 24 hours */ static GtkWidget * build_hours_menu (GtkWidget **items, int active) { 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 *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")); 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"))); /* 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", (GtkSignalFunc) prop_cancel, NULL); gtk_signal_connect (GTK_OBJECT (prop_win), "apply", (GtkSignalFunc) prop_apply, NULL); gtk_widget_show_all (prop_win); }