src/mn-properties-dialog.gob (11680B) - raw
1 /* 2 * Mail Notification 3 * Copyright (C) 2003-2008 Jean-Yves Lefort <jylefort@brutele.be> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 %headertop{ 21 #include "mn-dialog.h" 22 %} 23 24 %privateheader{ 25 #include "mn-mailbox.h" 26 %} 27 28 %{ 29 #include <glib/gi18n.h> 30 #include <gtk/gtk.h> 31 #include "mn-conf.h" 32 #include "mn-util.h" 33 #include "mn-mailbox-view.h" 34 #include "mn-shell.h" 35 #include "mn-file-chooser-button.h" 36 #include "mn-sound-file-chooser-dialog.h" 37 #include "mn-test-mailbox.h" 38 #include "mn-non-linear-range.h" 39 40 static const MNNonLinearRangeBlock expiration_blocks[] = { 41 { MN_SECS(1), MN_SECS(10), MN_SECS(1) }, 42 { MN_SECS(15), MN_SECS(60), MN_SECS(5) }, 43 { MN_MINS(2), MN_MINS(10), MN_MINS(1) }, 44 { MN_MINS(15), MN_MINS(60), MN_MINS(5) } 45 }; 46 %} 47 48 class MN:Properties:Dialog from MN:Dialog 49 { 50 private GtkWidget *notebook; 51 52 /* general tab */ 53 private GtkWidget *play_sound_hbox; 54 private GtkWidget *play_sound_check; 55 private GtkWidget *play_sound_file_chooser_button; 56 private GtkWidget *scrolled; 57 private GtkWidget *list; 58 private GtkWidget *selected_label; 59 private GtkWidget *add; 60 private GtkWidget *remove; 61 private GtkWidget *properties; 62 63 /* status icon tab */ 64 private GtkWidget *icon_action_mail_reader_radio; 65 private GtkWidget *icon_action_open_latest_message_radio; 66 private GtkWidget *icon_action_consider_new_mail_as_read_radio; 67 private GtkWidget *icon_action_update_radio; 68 69 /* message popups tab */ 70 private GtkWidget *popups_enable_check; 71 private GtkWidget *popups_position_section_label; 72 private GtkWidget *popups_position_attached_radio; 73 private GtkWidget *popups_position_free_radio; 74 private GtkWidget *popups_expiration_section_label; 75 private GtkWidget *popups_expiration_default_radio; 76 private GtkWidget *popups_expiration_never_radio; 77 private GtkWidget *popups_expiration_after_radio; 78 private GtkWidget *popups_expiration_scale; 79 80 private MNMailbox *test_mailbox destroy { self_remove_test_mailbox(self); }; 81 82 init (self) 83 { 84 GtkTreeSelection *selection; 85 86 mn_container_create_interface(GTK_CONTAINER(self), 87 PKGDATADIR G_DIR_SEPARATOR_S "properties-dialog.glade", 88 "main_vbox", 89 "mn_properties_dialog_", 90 "notebook", &selfp->notebook, 91 "play_sound_hbox", &selfp->play_sound_hbox, 92 "play_sound_check", &selfp->play_sound_check, 93 "scrolled", &selfp->scrolled, 94 "selected_label", &selfp->selected_label, 95 "add", &selfp->add, 96 "remove", &selfp->remove, 97 "properties", &selfp->properties, 98 "icon_action_mail_reader_radio", &selfp->icon_action_mail_reader_radio, 99 "icon_action_open_latest_message_radio", &selfp->icon_action_open_latest_message_radio, 100 "icon_action_consider_new_mail_as_read_radio", &selfp->icon_action_consider_new_mail_as_read_radio, 101 "icon_action_update_radio", &selfp->icon_action_update_radio, 102 "popups_enable_check", &selfp->popups_enable_check, 103 "popups_position_section_label", &selfp->popups_position_section_label, 104 "popups_position_attached_radio", &selfp->popups_position_attached_radio, 105 "popups_position_free_radio", &selfp->popups_position_free_radio, 106 "popups_expiration_section_label", &selfp->popups_expiration_section_label, 107 "popups_expiration_default_radio", &selfp->popups_expiration_default_radio, 108 "popups_expiration_never_radio", &selfp->popups_expiration_never_radio, 109 "popups_expiration_after_radio", &selfp->popups_expiration_after_radio, 110 "popups_expiration_scale", &selfp->popups_expiration_scale, 111 NULL); 112 113 /* translators: header capitalization */ 114 gtk_window_set_title(GTK_WINDOW(self), _("Mail Notification Properties")); 115 116 gtk_dialog_add_buttons(GTK_DIALOG(self), 117 GTK_STOCK_HELP, GTK_RESPONSE_HELP, 118 GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE, 119 NULL); 120 121 selfp->play_sound_file_chooser_button = mn_file_chooser_button_new(self_play_sound_file_chooser_create_dialog_cb, NULL); 122 gtk_box_pack_start(GTK_BOX(selfp->play_sound_hbox), selfp->play_sound_file_chooser_button, TRUE, TRUE, 0); 123 gtk_widget_show(selfp->play_sound_file_chooser_button); 124 125 selfp->list = mn_mailbox_view_new(); 126 gtk_container_add(GTK_CONTAINER(selfp->scrolled), selfp->list); 127 gtk_widget_show(selfp->list); 128 129 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(selfp->list)); 130 g_object_connect(selection, 131 "swapped-signal::changed", self_update_selected_label, self, 132 "swapped-signal::changed", self_update_sensitivity, self, 133 NULL); 134 135 mn_setup_dnd(selfp->scrolled); 136 137 mn_non_linear_range_setup_static(GTK_RANGE(selfp->popups_expiration_scale), expiration_blocks, G_N_ELEMENTS(expiration_blocks)); 138 139 mn_conf_link_window(GTK_WINDOW(self), MN_CONF_PROPERTIES_DIALOG); 140 mn_conf_link_object(selfp->play_sound_check, MN_CONF_SOUNDS_NEW_MAIL_ENABLED, "active"); 141 mn_conf_link_object(selfp->play_sound_file_chooser_button, MN_CONF_SOUNDS_NEW_MAIL_FILE, "filename"); 142 mn_conf_link_object(selfp->popups_enable_check, MN_CONF_POPUPS_ENABLED, "active"); 143 mn_conf_link_non_linear_range(GTK_RANGE(selfp->popups_expiration_scale), MN_CONF_POPUPS_EXPIRATION_DELAY); 144 mn_conf_link_radio_group_to_enum(MN_TYPE_ACTION, 145 MN_CONF_CLICK_ACTION, 146 selfp->icon_action_mail_reader_radio, MN_ACTION_LAUNCH_MAIL_READER, 147 selfp->icon_action_open_latest_message_radio, MN_ACTION_OPEN_LATEST_MESSAGE, 148 selfp->icon_action_consider_new_mail_as_read_radio, MN_ACTION_CONSIDER_NEW_MAIL_AS_READ, 149 selfp->icon_action_update_radio, MN_ACTION_UPDATE_MAIL_STATUS, 150 NULL); 151 mn_conf_link_radio_group_to_enum(MN_TYPE_POPUP_POSITION, 152 MN_CONF_POPUPS_POSITION, 153 selfp->popups_position_attached_radio, MN_POPUP_POSITION_ATTACHED, 154 selfp->popups_position_free_radio, MN_POPUP_POSITION_FREE, 155 NULL); 156 mn_conf_link_radio_group_to_enum(MN_TYPE_EXPIRATION_ENABLED, 157 MN_CONF_POPUPS_EXPIRATION_ENABLED, 158 selfp->popups_expiration_default_radio, MN_EXPIRATION_ENABLED_DEFAULT, 159 selfp->popups_expiration_never_radio, MN_EXPIRATION_ENABLED_FALSE, 160 selfp->popups_expiration_after_radio, MN_EXPIRATION_ENABLED_TRUE, 161 NULL); 162 163 self_update_selected_label(self); 164 self_update_sensitivity(self); 165 166 /* 167 * HIG chapter 3: 168 * "When opening a dialog, provide initial keyboard focus to the 169 * component that you expect users to operate first. This focus is 170 * especially important for users who must use a keyboard to 171 * navigate your application." 172 */ 173 gtk_widget_grab_focus(selfp->add); 174 175 g_signal_connect(self, "response", G_CALLBACK(self_response_h), NULL); 176 } 177 178 private GtkFileChooserDialog * 179 play_sound_file_chooser_create_dialog_cb (gpointer data) 180 { 181 return GTK_FILE_CHOOSER_DIALOG(mn_sound_file_chooser_dialog_new()); 182 } 183 184 private void 185 remove_test_mailbox (self) 186 { 187 if (selfp->test_mailbox) 188 { 189 mn_mailboxes_remove(mn_shell->mailboxes, selfp->test_mailbox); 190 g_object_unref(selfp->test_mailbox); 191 selfp->test_mailbox = NULL; 192 } 193 } 194 195 private void 196 response_h (self, int response, gpointer user_data) 197 { 198 switch (response) 199 { 200 case GTK_RESPONSE_HELP: 201 { 202 int current_page; 203 static const char *sections[] = { 204 "properties-general", 205 "properties-status-icon", 206 "properties-message-popups" 207 }; 208 209 current_page = gtk_notebook_get_current_page(GTK_NOTEBOOK(selfp->notebook)); 210 g_assert(current_page >= 0 && current_page < G_N_ELEMENTS(sections)); 211 212 mn_show_help(GTK_WINDOW(self), sections[current_page]); 213 break; 214 } 215 216 case GTK_RESPONSE_CLOSE: 217 gtk_widget_destroy(GTK_WIDGET(self)); 218 break; 219 } 220 } 221 222 private void 223 update_selected_label (self) 224 { 225 GtkTreeSelection *selection; 226 int n_rows; 227 228 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(selfp->list)); 229 n_rows = gtk_tree_selection_count_selected_rows(selection); 230 231 if (n_rows == 0) 232 gtk_label_set_text(GTK_LABEL(selfp->selected_label), _("No mailbox selected.")); 233 else 234 { 235 char *str; 236 237 str = g_strdup_printf(ngettext("%i mailbox selected.", 238 "%i mailboxes selected.", 239 n_rows), n_rows); 240 gtk_label_set_text(GTK_LABEL(selfp->selected_label), str); 241 g_free(str); 242 } 243 } 244 245 private void 246 update_sensitivity (self) 247 { 248 gboolean play_sound_enabled; 249 GtkTreeSelection *selection; 250 gboolean has_selection; 251 gboolean popups_enabled; 252 gboolean popups_expiration_after_enabled; 253 254 play_sound_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(selfp->play_sound_check)); 255 256 gtk_widget_set_sensitive(selfp->play_sound_file_chooser_button, play_sound_enabled); 257 258 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(selfp->list)); 259 has_selection = gtk_tree_selection_count_selected_rows(selection) > 0; 260 261 gtk_widget_set_sensitive(selfp->remove, has_selection); 262 gtk_widget_set_sensitive(selfp->properties, has_selection); 263 264 popups_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(selfp->popups_enable_check)); 265 popups_expiration_after_enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(selfp->popups_expiration_after_radio)); 266 267 gtk_widget_set_sensitive(selfp->popups_position_section_label, popups_enabled); 268 gtk_widget_set_sensitive(selfp->popups_position_attached_radio, popups_enabled); 269 gtk_widget_set_sensitive(selfp->popups_position_free_radio, popups_enabled); 270 gtk_widget_set_sensitive(selfp->popups_expiration_section_label, popups_enabled); 271 gtk_widget_set_sensitive(selfp->popups_expiration_default_radio, popups_enabled); 272 gtk_widget_set_sensitive(selfp->popups_expiration_never_radio, popups_enabled); 273 gtk_widget_set_sensitive(selfp->popups_expiration_after_radio, popups_enabled); 274 gtk_widget_set_sensitive(selfp->popups_expiration_scale, popups_enabled && popups_expiration_after_enabled); 275 } 276 277 /* libglade callbacks */ 278 279 protected void 280 toggled_h (self, GtkToggleButton *button) 281 { 282 self_update_sensitivity(self); 283 } 284 285 protected void 286 add_clicked_h (self, GtkButton *button) 287 { 288 mn_mailbox_view_activate_add(MN_MAILBOX_VIEW(selfp->list)); 289 } 290 291 protected void 292 remove_clicked_h (self, GtkButton *button) 293 { 294 mn_mailbox_view_activate_remove(MN_MAILBOX_VIEW(selfp->list)); 295 } 296 297 protected void 298 properties_clicked_h (self, GtkButton *button) 299 { 300 mn_mailbox_view_activate_properties(MN_MAILBOX_VIEW(selfp->list)); 301 } 302 303 protected char * 304 popups_expiration_format_value_h (self, double arg, GtkScale *scale) 305 { 306 return mn_format_seconds(mn_non_linear_range_get_value(GTK_RANGE(scale))); 307 } 308 309 protected void 310 test_messages_toggled_h (self, GtkToggleButton *button) 311 { 312 if (gtk_toggle_button_get_active(button)) 313 { 314 if (! selfp->test_mailbox) 315 { 316 selfp->test_mailbox = mn_test_mailbox_new(); 317 mn_mailbox_seal(selfp->test_mailbox); 318 mn_mailboxes_add(mn_shell->mailboxes, selfp->test_mailbox); 319 } 320 } 321 else 322 self_remove_test_mailbox(self); 323 } 324 }