talons

Fork of Claws Mail https://www.claws-mail
Log | Files | Refs | README | LICENSE

prefs_summaries.c (35835B)


      1 /*
      2  * Claws Mail -- a GTK based, lightweight, and fast e-mail client
      3  * Copyright (C) 2005-2024 the Claws Mail Team and Colin Leroy
      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
     16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
     17  */
     18 
     19 #include "defs.h"
     20 
     21 #include <stdio.h>
     22 #include <stdlib.h>
     23 
     24 #include <glib.h>
     25 #include <glib/gi18n.h>
     26 #include <gtk/gtk.h>
     27 #include <gdk/gdkkeysyms.h>
     28 
     29 #include "foldersel.h"
     30 #include "prefs_common.h"
     31 #include "prefs_gtk.h"
     32 #include "prefs_summary_open.h"
     33 #include "prefs_summary_column.h"
     34 #include "prefs_folder_column.h"
     35 
     36 #include "gtk/menu.h"
     37 #include "gtk/gtkutils.h"
     38 #include "gtk/prefswindow.h"
     39 #include "gtk/combobox.h"
     40 
     41 #include "manage_window.h"
     42 
     43 typedef struct _SummariesPage
     44 {
     45 	PrefsPage page;
     46 
     47 	GtkWidget *window;
     48 
     49 	GtkWidget *checkbtn_useaddrbook;
     50 	GtkWidget *checkbtn_show_tooltips;
     51 	GtkWidget *checkbtn_threadsubj;
     52 	GtkWidget *button_datefmt;
     53 	GtkWidget *entry_datefmt;
     54 
     55 	GtkWidget *checkbtn_startup_folder;
     56 	GtkWidget *startup_folder_entry;
     57 	GtkWidget *startup_folder_select;
     58 	GtkWidget *checkbtn_always_show_msg;
     59 	GtkWidget *checkbtn_show_on_folder_open;
     60 	GtkWidget *checkbtn_show_on_search_results;
     61 	GtkWidget *checkbtn_show_on_prevnext;
     62 	GtkWidget *checkbtn_show_on_deletemove;
     63 	GtkWidget *checkbtn_show_on_directional;
     64 	GtkWidget *checkbtn_mark_as_read_on_newwin;
     65 	GtkWidget *spinbtn_mark_as_read_delay;
     66 	GtkWidget *checkbtn_immedexec;
     67 	GtkWidget *checkbtn_ask_mark_all_read;
     68   	GtkWidget *optmenu_sort_key;
     69   	GtkWidget *optmenu_sort_type;
     70 	GtkWidget *optmenu_summaryfromshow;
     71 	GtkWidget *optmenu_nextunreadmsgdialog;
     72 	GtkWidget *checkbtn_folder_default_thread;
     73 	GtkWidget *checkbtn_folder_default_thread_collapsed;
     74 	GtkWidget *checkbtn_folder_default_hide_read_threads;
     75 	GtkWidget *checkbtn_folder_default_hide_read_msgs;
     76 	GtkWidget *checkbtn_folder_default_hide_del_msgs;
     77 	GtkWidget *checkbtn_summary_col_lock;
     78 
     79 } SummariesPage;
     80 
     81 enum {
     82 	DATEFMT_FMT,
     83 	DATEFMT_TXT,
     84 	N_DATEFMT_COLUMNS
     85 };
     86 
     87 static void date_format_ok_btn_clicked		(GtkButton	*button,
     88 						 GtkWidget     **widget);
     89 static void date_format_cancel_btn_clicked	(GtkButton	*button,
     90 						 GtkWidget     **widget);
     91 static gboolean date_format_on_delete		(GtkWidget	*dialogwidget,
     92 						 GdkEventAny	*event,
     93 						 GtkWidget     **widget);
     94 static void date_format_entry_on_change		(GtkEditable	*editable,
     95 						 GtkLabel	*example);
     96 static void date_format_select_row	        (GtkTreeView *list_view,
     97 						 GtkTreePath *path,
     98 						 GtkTreeViewColumn *column,
     99 						 GtkWidget *date_format);
    100 static void mark_as_read_toggled		(GtkToggleButton *button,
    101 						 GtkWidget *spinbtn);
    102 static void always_show_msg_toggled		(GtkToggleButton *button,
    103 						 gpointer user_data);
    104 
    105 static void startup_folder_toggled(GtkToggleButton *toggle_btn, GtkWidget *widget)
    106 {
    107 	gboolean is_active;
    108 
    109 	is_active = gtk_toggle_button_get_active(toggle_btn);
    110 	gtk_widget_set_sensitive(widget, !is_active);
    111 }
    112 
    113 static void foldersel_cb(GtkWidget *widget, gpointer data)
    114 {
    115 	GtkWidget *entry = (GtkWidget *) data;
    116 	FolderItem *item;
    117 	gchar *item_id;
    118 	gint newpos = 0;
    119 
    120 	item = foldersel_folder_sel(NULL, FOLDER_SEL_ALL, NULL, FALSE, NULL);
    121 	if (item && (item_id = folder_item_get_identifier(item)) != NULL) {
    122 		gtk_editable_delete_text(GTK_EDITABLE(entry), 0, -1);
    123 		gtk_editable_insert_text(GTK_EDITABLE(entry), item_id, strlen(item_id), &newpos);
    124 		g_free(item_id);
    125 	}
    126 }
    127 
    128 static GtkWidget *date_format_create(GtkButton *button, void *data)
    129 {
    130 	static GtkWidget *datefmt_win = NULL;
    131 
    132 	GtkWidget *vbox1;
    133 	GtkWidget *scrolledwindow1;
    134 	GtkWidget *datefmt_list_view;
    135 	GtkWidget *table;
    136 	GtkWidget *label1;
    137 	GtkWidget *label2;
    138 	GtkWidget *label3;
    139 	GtkWidget *confirm_area;
    140 	GtkWidget *ok_btn;
    141 	GtkWidget *cancel_btn;
    142 	GtkWidget *datefmt_entry;
    143 	GtkListStore *store;
    144 
    145 	struct {
    146 		gchar *fmt;
    147 		gchar *txt;
    148 	} time_format[] = {
    149 		{ "%a", NULL },
    150 		{ "%A", NULL },
    151 		{ "%b", NULL },
    152 		{ "%B", NULL },
    153 		{ "%c", NULL },
    154 		{ "%C", NULL },
    155 		{ "%d", NULL },
    156 		{ "%H", NULL },
    157 		{ "%I", NULL },
    158 		{ "%j", NULL },
    159 		{ "%m", NULL },
    160 		{ "%M", NULL },
    161 		{ "%p", NULL },
    162 		{ "%S", NULL },
    163 		{ "%w", NULL },
    164 		{ "%x", NULL },
    165 		{ "%y", NULL },
    166 		{ "%Y", NULL },
    167 		{ "%Z", NULL }
    168 	};
    169 
    170 	gint i;
    171 	const gint TIME_FORMAT_ELEMS =
    172 		sizeof time_format / sizeof time_format[0];
    173 
    174 	GtkCellRenderer *renderer;
    175 	GtkTreeViewColumn *column;
    176 	GtkTreeSelection *selection;
    177 
    178 	time_format[0].txt  = _("the abbreviated weekday name");
    179 	time_format[1].txt  = _("the full weekday name");
    180 	time_format[2].txt  = _("the abbreviated month name");
    181 	time_format[3].txt  = _("the full month name");
    182 	time_format[4].txt  = _("the preferred date and time for the current locale");
    183 	time_format[5].txt  = _("the century number (year/100)");
    184 	time_format[6].txt  = _("the day of the month as a decimal number");
    185 	time_format[7].txt  = _("the hour as a decimal number using a 24-hour clock");
    186 	time_format[8].txt  = _("the hour as a decimal number using a 12-hour clock");
    187 	time_format[9].txt  = _("the day of the year as a decimal number");
    188 	time_format[10].txt = _("the month as a decimal number");
    189 	time_format[11].txt = _("the minute as a decimal number");
    190 	time_format[12].txt = _("either AM or PM");
    191 	time_format[13].txt = _("the second as a decimal number");
    192 	time_format[14].txt = _("the day of the week as a decimal number");
    193 	time_format[15].txt = _("the preferred date for the current locale");
    194 	time_format[16].txt = _("the last two digits of a year");
    195 	time_format[17].txt = _("the year as a decimal number");
    196 	time_format[18].txt = _("the time zone or name or abbreviation");
    197 
    198 	if (datefmt_win) return datefmt_win;
    199 
    200 	store = gtk_list_store_new(N_DATEFMT_COLUMNS,
    201 				   G_TYPE_STRING,
    202 				   G_TYPE_STRING,
    203 				   -1);
    204 
    205 	for (i = 0; i < TIME_FORMAT_ELEMS; i++) {
    206 		GtkTreeIter iter;
    207 
    208 		gtk_list_store_append(store, &iter);
    209 		gtk_list_store_set(store, &iter,
    210 				   DATEFMT_FMT, time_format[i].fmt,
    211 				   DATEFMT_TXT, time_format[i].txt,
    212 				   -1);
    213 	}
    214 
    215 	datefmt_win = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "prefs_summaries");
    216 	gtk_container_set_border_width(GTK_CONTAINER(datefmt_win), 8);
    217 	gtk_window_set_title(GTK_WINDOW(datefmt_win), _("Date format"));
    218 	gtk_window_set_position(GTK_WINDOW(datefmt_win), GTK_WIN_POS_CENTER);
    219 	gtk_window_set_type_hint(GTK_WINDOW(datefmt_win), GDK_WINDOW_TYPE_HINT_DIALOG);
    220 	gtk_widget_set_size_request(datefmt_win, 440, 280);
    221 
    222 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
    223 	gtk_widget_show(vbox1);
    224 	gtk_container_add(GTK_CONTAINER(datefmt_win), vbox1);
    225 
    226 	scrolledwindow1 = gtk_scrolled_window_new(NULL, NULL);
    227 	gtk_scrolled_window_set_policy
    228 		(GTK_SCROLLED_WINDOW(scrolledwindow1),
    229 		 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
    230 	gtk_widget_show(scrolledwindow1);
    231 	gtk_box_pack_start(GTK_BOX(vbox1), scrolledwindow1, TRUE, TRUE, 0);
    232 
    233 	datefmt_list_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
    234 	g_object_unref(G_OBJECT(store));
    235 	gtk_widget_show(datefmt_list_view);
    236 	gtk_container_add(GTK_CONTAINER(scrolledwindow1), datefmt_list_view);
    237 
    238 	renderer = gtk_cell_renderer_text_new();
    239 	column = gtk_tree_view_column_new_with_attributes
    240 			(_("Specifier"), renderer, "text", DATEFMT_FMT,
    241 			 NULL);
    242 	gtk_tree_view_append_column(GTK_TREE_VIEW(datefmt_list_view), column);
    243 
    244 	renderer = gtk_cell_renderer_text_new();
    245 	column = gtk_tree_view_column_new_with_attributes
    246 			(_("Description"), renderer, "text", DATEFMT_TXT,
    247 			 NULL);
    248 	gtk_tree_view_append_column(GTK_TREE_VIEW(datefmt_list_view), column);
    249 
    250 	/* gtk_cmclist_set_column_width(GTK_CMCLIST(datefmt_clist), 0, 80); */
    251 	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(datefmt_list_view));
    252 	gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
    253 
    254 	g_signal_connect(G_OBJECT(datefmt_list_view), "row_activated",
    255 			 G_CALLBACK(date_format_select_row),
    256 			 datefmt_win);
    257 
    258 	table = gtk_grid_new();
    259 	gtk_widget_show(table);
    260 	gtk_box_pack_start(GTK_BOX(vbox1), table, FALSE, FALSE, 0);
    261 	gtk_grid_set_row_spacing(GTK_GRID(table), 4);
    262 	gtk_grid_set_column_spacing(GTK_GRID(table), 8);
    263 
    264 	label1 = gtk_label_new(_("Date format"));
    265 	gtk_widget_show(label1);
    266 	gtk_label_set_justify(GTK_LABEL(label1), GTK_JUSTIFY_LEFT);
    267 	gtk_label_set_xalign(GTK_LABEL(label1), 0.0);
    268 	gtk_grid_attach(GTK_GRID(table), label1, 0, 0, 1, 1);
    269 
    270 	datefmt_entry = gtk_entry_new();
    271 	gtk_entry_set_max_length(GTK_ENTRY(datefmt_entry), 256);
    272 	gtk_widget_show(datefmt_entry);
    273 	gtk_grid_attach(GTK_GRID(table), datefmt_entry, 1, 0, 1, 1);
    274 	gtk_widget_set_hexpand(datefmt_entry, TRUE);
    275 	gtk_widget_set_halign(datefmt_entry, GTK_ALIGN_FILL);
    276 
    277 	/* we need the "sample" entry box; add it as data so callbacks can
    278 	 * get the entry box */
    279 	g_object_set_data(G_OBJECT(datefmt_win), "datefmt_sample",
    280 			  datefmt_entry);
    281 
    282 	label2 = gtk_label_new(_("Example"));
    283 	gtk_widget_show(label2);
    284 	gtk_label_set_justify(GTK_LABEL(label2), GTK_JUSTIFY_LEFT);
    285 	gtk_label_set_xalign(GTK_LABEL(label2), 0.0);
    286 	gtk_grid_attach(GTK_GRID(table), label2, 0, 1, 1, 1);
    287 
    288 	label3 = gtk_label_new("");
    289 	gtk_widget_show(label3);
    290 	gtk_label_set_justify(GTK_LABEL(label3), GTK_JUSTIFY_LEFT);
    291 	gtk_label_set_xalign(GTK_LABEL(label3), 0.0);
    292 	gtk_grid_attach(GTK_GRID(table), label3, 1, 1, 1, 1);
    293 	gtk_widget_set_hexpand(label3, TRUE);
    294 	gtk_widget_set_halign(label3, GTK_ALIGN_FILL);
    295 
    296 	gtkut_stock_button_set_create(&confirm_area, &cancel_btn, NULL, _("_Cancel"),
    297 				      &ok_btn, NULL, _("_OK"), NULL, NULL, NULL);
    298 
    299 	gtk_box_pack_start(GTK_BOX(vbox1), confirm_area, FALSE, FALSE, 0);
    300 	gtk_widget_show(confirm_area);
    301 	gtk_widget_grab_default(ok_btn);
    302 
    303 	/* set the current format */
    304 	gtk_entry_set_text(GTK_ENTRY(datefmt_entry), prefs_common.date_format);
    305 	date_format_entry_on_change(GTK_EDITABLE(datefmt_entry),
    306 				    GTK_LABEL(label3));
    307 
    308 	g_signal_connect(G_OBJECT(ok_btn), "clicked",
    309 			 G_CALLBACK(date_format_ok_btn_clicked),
    310 			 &datefmt_win);
    311 	g_signal_connect(G_OBJECT(cancel_btn), "clicked",
    312 			 G_CALLBACK(date_format_cancel_btn_clicked),
    313 			 &datefmt_win);
    314 	g_signal_connect(G_OBJECT(datefmt_win), "delete_event",
    315 			 G_CALLBACK(date_format_on_delete),
    316 			 &datefmt_win);
    317 	g_signal_connect(G_OBJECT(datefmt_entry), "changed",
    318 			 G_CALLBACK(date_format_entry_on_change),
    319 			 label3);
    320 
    321 	gtk_widget_show(datefmt_win);
    322 	manage_window_set_transient(GTK_WINDOW(datefmt_win));
    323 	gtk_window_set_modal(GTK_WINDOW(datefmt_win), TRUE);
    324 
    325 	gtk_widget_grab_focus(ok_btn);
    326 
    327 	return datefmt_win;
    328 }
    329 
    330 static void prefs_summaries_create_widget(PrefsPage *_page, GtkWindow *window,
    331 			       	  gpointer data)
    332 {
    333 	SummariesPage *prefs_summaries = (SummariesPage *) _page;
    334 
    335 	GtkWidget *notebook;
    336 	GtkWidget *hbox0, *hbox1, *hbox2;
    337 	GtkWidget *vbox1, *vbox2, *vbox3, *vbox4;
    338 	GtkWidget *frame_new_folders;
    339 	GtkWidget *checkbtn_useaddrbook;
    340 	GtkWidget *checkbtn_show_tooltips;
    341 	GtkWidget *checkbtn_threadsubj;
    342 	GtkWidget *label_datefmt;
    343 	GtkWidget *button_datefmt;
    344 	GtkWidget *entry_datefmt;
    345 	GtkWidget *button_dispitem;
    346 	GtkWidget *checkbtn_startup_folder;
    347 	GtkWidget *startup_folder_entry;
    348 	GtkWidget *startup_folder_select;
    349 	GtkWidget *checkbtn_always_show_msg;
    350 	GtkWidget *checkbtn_show_on_folder_open;
    351 	GtkWidget *checkbtn_show_on_search_results;
    352 	GtkWidget *checkbtn_show_on_prevnext;
    353 	GtkWidget *checkbtn_show_on_deletemove;
    354 	GtkWidget *checkbtn_show_on_directional;
    355 	GtkWidget *spinbtn_mark_as_read_delay;
    356 	GtkAdjustment *spinbtn_mark_as_read_delay_adj;
    357 	GtkWidget *checkbtn_immedexec;
    358 	GtkWidget *checkbtn_ask_mark_all_read;
    359 	GtkWidget *label, *label_fill;
    360 	GtkListStore *menu;
    361 	GtkTreeIter iter;
    362  	GtkWidget *optmenu_summaryfromshow;
    363  	GtkWidget *optmenu_nextunreadmsgdialog;
    364 	GtkWidget *button_edit_actions;
    365 	GtkWidget *radio_mark_as_read_on_select;
    366 	GtkWidget *radio_mark_as_read_on_new_win;
    367 	GtkWidget *optmenu_sort_key;
    368 	GtkWidget *optmenu_sort_type;
    369 	GtkWidget *checkbtn_folder_default_thread;
    370 	GtkWidget *checkbtn_folder_default_thread_collapsed;
    371 	GtkWidget *checkbtn_folder_default_hide_read_threads;
    372 	GtkWidget *checkbtn_folder_default_hide_read_msgs;
    373 	GtkWidget *checkbtn_folder_default_hide_del_msgs;
    374 	GtkWidget *checkbtn_summary_col_lock;
    375 
    376 	notebook = gtk_notebook_new();
    377 	gtk_widget_show(notebook);
    378 
    379 	char path[PATH_MAX];
    380 	strlcpy(path, getenv("HOME"), sizeof(path));
    381 	strlcat(path, "/.local/share/talons/prefs_summaries.ui", sizeof(path));
    382 	GtkBuilder *builder = gtk_builder_new_from_file(path);
    383 
    384 	button_dispitem = GTK_WIDGET(gtk_builder_get_object(builder, "dispitem"));
    385 	g_signal_connect(G_OBJECT (button_dispitem), "clicked", G_CALLBACK(prefs_folder_column_open), NULL);
    386 
    387 	startup_folder_entry = GTK_WIDGET(gtk_builder_get_object(builder, "startup-folder-entry"));
    388 	startup_folder_select = GTK_WIDGET(gtk_builder_get_object(builder, "startup-folder-button"));
    389 	checkbtn_startup_folder = GTK_WIDGET(gtk_builder_get_object(builder, "startup-folder-checkbutton"));
    390 	g_signal_connect(startup_folder_select, "clicked", G_CALLBACK(foldersel_cb), startup_folder_entry);
    391 
    392 	GtkWidget *folderlist = GTK_WIDGET(gtk_builder_get_object(builder, "folder-list"));
    393 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), folderlist, gtk_label_new("Folder list"));
    394 	gtk_widget_show_all(folderlist);
    395 
    396 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
    397 	gtk_widget_show (vbox1);
    398 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
    399 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox1, gtk_label_new("Message list"));
    400 
    401 	hbox0 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    402 	gtk_widget_show (hbox0);
    403 	gtk_box_pack_start(GTK_BOX(vbox1), hbox0, FALSE, TRUE, 0);
    404 
    405 	label = gtk_label_new("Displayed columns");
    406 	gtk_widget_show(label);
    407 	gtk_box_pack_start(GTK_BOX(hbox0), label, FALSE, FALSE, 0);
    408 	button_dispitem = gtk_button_new_with_mnemonic("Edit");
    409 	gtk_widget_show (button_dispitem);
    410 	gtk_box_pack_start (GTK_BOX (hbox0), button_dispitem, FALSE, FALSE, 0);
    411 	g_signal_connect (G_OBJECT (button_dispitem), "clicked",
    412 			  G_CALLBACK (prefs_summary_column_open),
    413 			  NULL);
    414 
    415 	PACK_SPACER(hbox0, hbox1, 4);
    416 	PACK_CHECK_BUTTON(hbox0, checkbtn_summary_col_lock, _("Lock column headers"));
    417 
    418 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
    419 	gtk_widget_show (hbox1);
    420 	gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
    421 
    422 	label = gtk_label_new (_("Displayed in From column"));
    423 	gtk_widget_show (label);
    424 	gtk_box_pack_start(GTK_BOX(hbox1), label, FALSE, FALSE, 0);
    425 
    426 	optmenu_summaryfromshow = gtkut_sc_combobox_create(NULL, FALSE);
    427 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(
    428 				GTK_COMBO_BOX(optmenu_summaryfromshow)));
    429 	gtk_widget_show (optmenu_summaryfromshow);
    430 
    431 	COMBOBOX_ADD (menu, _("Name"), SHOW_NAME);
    432 	COMBOBOX_ADD (menu, _("Address"), SHOW_ADDR);
    433 	COMBOBOX_ADD (menu, _("Name and Address"), SHOW_BOTH);
    434 
    435 	gtk_box_pack_start(GTK_BOX(hbox1), optmenu_summaryfromshow, FALSE, FALSE, 0);
    436 	hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    437 	gtk_widget_show (hbox2);
    438 	gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, TRUE, 0);
    439 
    440 	label_datefmt = gtk_label_new (_("Date format"));
    441 	gtk_widget_show (label_datefmt);
    442 	gtk_box_pack_start (GTK_BOX (hbox2), label_datefmt, FALSE, FALSE, 0);
    443 
    444 	entry_datefmt = gtk_entry_new ();
    445 	gtk_widget_show (entry_datefmt);
    446 	gtk_box_pack_start (GTK_BOX (hbox2), entry_datefmt, FALSE, FALSE, 0);
    447 
    448 	button_datefmt = gtkut_stock_button("dialog-information", _("_Information"));
    449 
    450 	gtk_widget_show (button_datefmt);
    451 	gtk_box_pack_start (GTK_BOX (hbox2), button_datefmt, FALSE, FALSE, 0);
    452 	g_signal_connect (G_OBJECT (button_datefmt), "clicked",
    453 			  G_CALLBACK (date_format_create), NULL);
    454 
    455 	label_fill = gtk_label_new(" ");
    456 	gtk_box_pack_start(GTK_BOX(hbox2), label_fill, TRUE, FALSE, 0);
    457 
    458 	CLAWS_SET_TIP(button_datefmt,
    459 			     _("Date format help"));
    460 
    461 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
    462 	gtk_widget_show (hbox1);
    463 	gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, TRUE, 0);
    464 
    465 	button_edit_actions = gtk_button_new_with_label(_("Set message selection when entering a folder"));
    466 	gtk_widget_show (button_edit_actions);
    467 	gtk_box_pack_start (GTK_BOX (hbox1), button_edit_actions,
    468 			  FALSE, TRUE, 0);
    469 	g_signal_connect (G_OBJECT (button_edit_actions), "clicked",
    470 			  G_CALLBACK (prefs_summary_open_open),
    471 			  NULL);
    472 
    473 	/* Open message on select policy */
    474 	vbox4 = gtkut_get_options_frame(vbox1, NULL, _("Open message when selected"));
    475 
    476 	PACK_CHECK_BUTTON(vbox4, checkbtn_always_show_msg,
    477 			_("Always"));
    478 	PACK_CHECK_BUTTON(vbox4, checkbtn_show_on_folder_open,
    479 			_("When opening a folder"));
    480 	PACK_CHECK_BUTTON(vbox4, checkbtn_show_on_search_results,
    481 			_("When displaying search results"));
    482 	PACK_CHECK_BUTTON(vbox4, checkbtn_show_on_prevnext,
    483 			_("When selecting next or previous message using shortcuts"));
    484 	PACK_CHECK_BUTTON(vbox4, checkbtn_show_on_deletemove,
    485 			_("When deleting or moving messages"));
    486 	PACK_CHECK_BUTTON(vbox4, checkbtn_show_on_directional,
    487 			_("When using directional keys"));
    488 
    489 	vbox3 = gtkut_get_options_frame(vbox1, NULL, _("Mark message as read"));
    490 
    491 	radio_mark_as_read_on_select = gtk_radio_button_new_with_label(NULL,
    492 			_("when selected, after"));
    493 
    494 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    495 	gtk_box_pack_start (GTK_BOX (hbox1), radio_mark_as_read_on_select, FALSE, FALSE, 0);
    496 
    497 	spinbtn_mark_as_read_delay_adj = GTK_ADJUSTMENT(gtk_adjustment_new (0, 0, 60, 1, 10, 0));
    498 	spinbtn_mark_as_read_delay = gtk_spin_button_new
    499 			(GTK_ADJUSTMENT (spinbtn_mark_as_read_delay_adj), 1, 0);
    500 	gtk_box_pack_start (GTK_BOX (hbox1), spinbtn_mark_as_read_delay,
    501 			    FALSE, FALSE, 0);
    502 	gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbtn_mark_as_read_delay),
    503 				     TRUE);
    504 	gtk_box_pack_start (GTK_BOX (hbox1), gtk_label_new
    505 			(_("seconds")), FALSE, FALSE, 0);
    506 
    507 	gtk_box_pack_start (GTK_BOX (vbox3), hbox1, FALSE, FALSE, 0);
    508 
    509 	radio_mark_as_read_on_new_win = gtk_radio_button_new_with_label_from_widget(
    510 			GTK_RADIO_BUTTON(radio_mark_as_read_on_select),
    511 			_("only when opened in a new window, or replied to"));
    512 	gtk_box_pack_start (GTK_BOX (vbox3), radio_mark_as_read_on_new_win,
    513 			FALSE, FALSE, 0);
    514 	gtk_widget_show_all(vbox3);
    515 
    516 	/* Next Unread Message Dialog */
    517 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
    518 	gtk_widget_show (hbox1);
    519 	gtk_box_pack_start (GTK_BOX (vbox1), hbox1, FALSE, FALSE, 0);
    520 
    521 	label = gtk_label_new (_("Show \"no unread (or new) message\" dialog"));
    522 	gtk_widget_show (label);
    523 	gtk_box_pack_start(GTK_BOX(hbox1), label, FALSE, FALSE, 0);
    524 
    525 	optmenu_nextunreadmsgdialog = gtkut_sc_combobox_create(NULL, FALSE);
    526 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(
    527 				GTK_COMBO_BOX(optmenu_nextunreadmsgdialog)));
    528 	gtk_widget_show (optmenu_nextunreadmsgdialog);
    529 
    530 	COMBOBOX_ADD (menu, _("Always"), NEXTUNREADMSGDIALOG_ALWAYS);
    531 	COMBOBOX_ADD (menu, _("Assume 'Yes'"), NEXTUNREADMSGDIALOG_ASSUME_YES);
    532 	COMBOBOX_ADD (menu, _("Assume 'No'"), NEXTUNREADMSGDIALOG_ASSUME_NO);
    533 
    534 	gtk_box_pack_start(GTK_BOX(hbox1), optmenu_nextunreadmsgdialog, FALSE, FALSE, 0);
    535 
    536 	PACK_CHECK_BUTTON
    537 		(vbox1, checkbtn_useaddrbook,
    538 		 _("Display sender using address book"));
    539 
    540 	PACK_CHECK_BUTTON
    541 		(vbox1, checkbtn_threadsubj,
    542 		 _("Thread using subject in addition to standard headers"));
    543 
    544 	PACK_CHECK_BUTTON
    545 		(vbox1, checkbtn_immedexec,
    546 		 _("Execute immediately when moving or deleting messages"));
    547 	CLAWS_SET_TIP(checkbtn_immedexec,
    548 			     _("When unchecked moving, copying and deleting of messages"
    549 			       " is deferred until you use '/Tools/Execute'"));
    550 
    551 	PACK_CHECK_BUTTON
    552 		(vbox1, checkbtn_ask_mark_all_read,
    553 		 _("Confirm when marking all messages as read or unread"));
    554 
    555 	PACK_CHECK_BUTTON
    556 		(vbox1, checkbtn_show_tooltips,
    557 		 _("Show tooltips"));
    558 
    559 	hbox2 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8);
    560 	gtk_widget_show (hbox2);
    561 	gtk_box_pack_start (GTK_BOX (vbox1), hbox2, FALSE, FALSE, 0);
    562 
    563 	vbox1 = gtk_box_new(GTK_ORIENTATION_VERTICAL, VSPACING);
    564 	gtk_widget_show (vbox1);
    565 	gtk_container_set_border_width (GTK_CONTAINER (vbox1), VBOX_BORDER);
    566 	gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox1,
    567 				 gtk_label_new(_("Defaults")));
    568 
    569 	vbox2 = gtkut_get_options_frame(vbox1, &frame_new_folders, _("New folders"));
    570 
    571 	hbox1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
    572 	gtk_widget_show(hbox1);
    573 	gtk_box_pack_start(GTK_BOX (vbox2), hbox1, FALSE, FALSE, 0);
    574 
    575 	label = gtk_label_new(_("Sort by"));
    576 	gtk_widget_show(label);
    577 	gtk_box_pack_start(GTK_BOX(hbox1), label, FALSE, FALSE, 0);
    578 
    579 	optmenu_sort_key = gtkut_sc_combobox_create(NULL, FALSE);
    580 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu_sort_key)));
    581 	gtk_widget_show(optmenu_sort_key);
    582 
    583 	COMBOBOX_ADD(menu, _("Number"), SORT_BY_NUMBER);
    584 	COMBOBOX_ADD(menu, _("Size"), SORT_BY_SIZE);
    585 	COMBOBOX_ADD(menu, _("Date"), SORT_BY_DATE);
    586 	COMBOBOX_ADD(menu, _("Thread date"), SORT_BY_THREAD_DATE);
    587 	COMBOBOX_ADD(menu, _("From"), SORT_BY_FROM);
    588 	COMBOBOX_ADD(menu, _("To"), SORT_BY_TO);
    589 	COMBOBOX_ADD(menu, _("Subject"), SORT_BY_SUBJECT);
    590 	COMBOBOX_ADD(menu, _("Tag"), SORT_BY_TAGS);
    591 	COMBOBOX_ADD(menu, _("Mark"), SORT_BY_MARK);
    592 	COMBOBOX_ADD(menu, _("Status"), SORT_BY_STATUS);
    593 	COMBOBOX_ADD(menu, _("Attachment"), SORT_BY_MIME);
    594 	COMBOBOX_ADD(menu, _("Score"), SORT_BY_SCORE);
    595 	COMBOBOX_ADD(menu, _("Locked"), SORT_BY_LOCKED);
    596 	COMBOBOX_ADD(menu, _("Don't sort"), SORT_BY_NONE);
    597 
    598 	gtk_box_pack_start(GTK_BOX(hbox1), optmenu_sort_key, FALSE, FALSE, 0);
    599 
    600 	optmenu_sort_type = gtkut_sc_combobox_create(NULL, FALSE);
    601 	menu = GTK_LIST_STORE(gtk_combo_box_get_model(GTK_COMBO_BOX(optmenu_sort_type)));
    602 	gtk_widget_show(optmenu_sort_type);
    603 
    604 	COMBOBOX_ADD(menu, _("Ascending"), SORT_ASCENDING);
    605 	COMBOBOX_ADD(menu, _("Descending"), SORT_DESCENDING);
    606 
    607 	gtk_box_pack_start(GTK_BOX(hbox1), optmenu_sort_type, FALSE, FALSE, 0);
    608 
    609 	PACK_CHECK_BUTTON
    610 		(vbox2, checkbtn_folder_default_thread,
    611 		 _("Thread view"));
    612 	PACK_CHECK_BUTTON
    613 		(vbox2, checkbtn_folder_default_thread_collapsed,
    614 		 _("Collapse all threads"));
    615 	PACK_CHECK_BUTTON
    616 		(vbox2, checkbtn_folder_default_hide_read_threads,
    617 		 _("Hide read threads"));
    618 	PACK_CHECK_BUTTON
    619 		(vbox2, checkbtn_folder_default_hide_read_msgs,
    620 		 _("Hide read messages"));
    621 	PACK_CHECK_BUTTON
    622 		(vbox2, checkbtn_folder_default_hide_del_msgs,
    623 		 _("Hide deleted messages"));
    624 
    625 	prefs_summaries->checkbtn_useaddrbook = checkbtn_useaddrbook;
    626 	prefs_summaries->checkbtn_show_tooltips = checkbtn_show_tooltips;
    627 	prefs_summaries->checkbtn_threadsubj = checkbtn_threadsubj;
    628 	prefs_summaries->entry_datefmt = entry_datefmt;
    629 	prefs_summaries->checkbtn_startup_folder = checkbtn_startup_folder;
    630 	prefs_summaries->startup_folder_entry = startup_folder_entry;
    631 
    632 	prefs_summaries->checkbtn_always_show_msg = checkbtn_always_show_msg;
    633 	prefs_summaries->checkbtn_show_on_folder_open = checkbtn_show_on_folder_open;
    634 	prefs_summaries->checkbtn_show_on_search_results = checkbtn_show_on_search_results;
    635 	prefs_summaries->checkbtn_show_on_prevnext = checkbtn_show_on_prevnext;
    636 	prefs_summaries->checkbtn_show_on_deletemove = checkbtn_show_on_deletemove;
    637 	prefs_summaries->checkbtn_show_on_directional = checkbtn_show_on_directional;
    638 
    639 	prefs_summaries->checkbtn_mark_as_read_on_newwin = radio_mark_as_read_on_new_win;
    640 	prefs_summaries->spinbtn_mark_as_read_delay = spinbtn_mark_as_read_delay;
    641 	prefs_summaries->checkbtn_immedexec = checkbtn_immedexec;
    642 	prefs_summaries->checkbtn_ask_mark_all_read = checkbtn_ask_mark_all_read;
    643 	prefs_summaries->optmenu_sort_key = optmenu_sort_key;
    644 	prefs_summaries->optmenu_sort_type = optmenu_sort_type;
    645 	prefs_summaries->optmenu_nextunreadmsgdialog = optmenu_nextunreadmsgdialog;
    646 	prefs_summaries->optmenu_summaryfromshow = optmenu_summaryfromshow;
    647 
    648 	prefs_summaries->checkbtn_folder_default_thread = checkbtn_folder_default_thread;
    649 	prefs_summaries->checkbtn_folder_default_thread_collapsed = checkbtn_folder_default_thread_collapsed;
    650 	prefs_summaries->checkbtn_folder_default_hide_read_threads = checkbtn_folder_default_hide_read_threads;
    651 	prefs_summaries->checkbtn_folder_default_hide_read_msgs = checkbtn_folder_default_hide_read_msgs;
    652 	prefs_summaries->checkbtn_folder_default_hide_del_msgs = checkbtn_folder_default_hide_del_msgs;
    653 	prefs_summaries->checkbtn_summary_col_lock = checkbtn_summary_col_lock;
    654 
    655 	prefs_summaries->page.widget = vbox1;
    656 	g_signal_connect(G_OBJECT(checkbtn_always_show_msg), "toggled",
    657 			G_CALLBACK(always_show_msg_toggled), prefs_summaries);
    658 
    659 	g_signal_connect(G_OBJECT(radio_mark_as_read_on_select), "toggled",
    660 			 G_CALLBACK(mark_as_read_toggled),
    661 			 spinbtn_mark_as_read_delay);
    662 
    663 	prefs_summaries->window			= GTK_WIDGET(window);
    664 
    665 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_useaddrbook),
    666 			prefs_common.use_addr_book);
    667 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_show_tooltips),
    668 			prefs_common.show_tooltips);
    669 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_threadsubj),
    670 			prefs_common.thread_by_subject);
    671 	gtk_entry_set_text(GTK_ENTRY(entry_datefmt),
    672 			prefs_common.date_format?prefs_common.date_format:"");
    673 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_startup_folder),
    674 			prefs_common.goto_folder_on_startup);
    675 	gtk_entry_set_text(GTK_ENTRY(startup_folder_entry),
    676 			   prefs_common.startup_folder?prefs_common.startup_folder:"");
    677 
    678 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_always_show_msg),
    679 			prefs_common.always_show_msg);
    680 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_show_on_folder_open),
    681 			prefs_common.open_selected_on_folder_open);
    682 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_show_on_search_results),
    683 			prefs_common.open_selected_on_search_results);
    684 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_show_on_prevnext),
    685 			prefs_common.open_selected_on_prevnext);
    686 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_show_on_deletemove),
    687 			prefs_common.open_selected_on_deletemove);
    688 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_show_on_directional),
    689 			prefs_common.open_selected_on_directional);
    690 
    691 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_mark_as_read_on_new_win),
    692 			prefs_common.mark_as_read_on_new_window);
    693 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinbtn_mark_as_read_delay),
    694 			prefs_common.mark_as_read_delay);
    695 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_immedexec),
    696 			prefs_common.immediate_exec);
    697 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_ask_mark_all_read),
    698 			prefs_common.ask_mark_all_read);
    699 
    700 	combobox_select_by_data(GTK_COMBO_BOX(optmenu_sort_key),
    701 			prefs_common.default_sort_key);
    702 	combobox_select_by_data(GTK_COMBO_BOX(optmenu_sort_type),
    703 			prefs_common.default_sort_type);
    704 
    705 	combobox_select_by_data(GTK_COMBO_BOX(optmenu_nextunreadmsgdialog),
    706 			prefs_common.next_unread_msg_dialog);
    707 
    708 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_default_thread),
    709 			prefs_common.folder_default_thread);
    710 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_default_thread_collapsed),
    711 			prefs_common.folder_default_thread_collapsed);
    712 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_default_hide_read_threads),
    713 			prefs_common.folder_default_hide_read_threads);
    714 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_default_hide_read_msgs),
    715 			prefs_common.folder_default_hide_read_msgs);
    716 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_folder_default_hide_del_msgs),
    717 			prefs_common.folder_default_hide_del_msgs);
    718 	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbtn_summary_col_lock),
    719 			prefs_common.summary_col_lock);
    720 
    721 	gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), 0);
    722 
    723 	prefs_summaries->page.widget = notebook;
    724 }
    725 
    726 #define MESSAGECOUNT_NONE 0
    727 #define MESSAGECOUNT_UNREAD 1
    728 #define MESSAGECOUNT_ALL 2
    729 
    730 static void prefs_summaries_save(PrefsPage *_page)
    731 {
    732 	SummariesPage *page = (SummariesPage *) _page;
    733 
    734 	prefs_common.display_folder_unread = MESSAGECOUNT_NONE;
    735 
    736 	prefs_common.use_addr_book = gtk_toggle_button_get_active(
    737 			GTK_TOGGLE_BUTTON(page->checkbtn_useaddrbook));
    738 	prefs_common.show_tooltips = gtk_toggle_button_get_active(
    739 			GTK_TOGGLE_BUTTON(page->checkbtn_show_tooltips));
    740 	prefs_common.thread_by_subject = gtk_toggle_button_get_active(
    741 			GTK_TOGGLE_BUTTON(page->checkbtn_threadsubj));
    742 
    743 	free(prefs_common.date_format);
    744 	prefs_common.date_format = gtk_editable_get_chars(
    745 			GTK_EDITABLE(page->entry_datefmt), 0, -1);
    746 
    747 	prefs_common.goto_folder_on_startup = gtk_toggle_button_get_active(
    748 		GTK_TOGGLE_BUTTON(page->checkbtn_startup_folder));
    749 	prefs_common.startup_folder = gtk_editable_get_chars(
    750 			GTK_EDITABLE(page->startup_folder_entry), 0, -1);
    751 
    752 	prefs_common.always_show_msg = gtk_toggle_button_get_active(
    753 		GTK_TOGGLE_BUTTON(page->checkbtn_always_show_msg));
    754 	prefs_common.open_selected_on_folder_open = gtk_toggle_button_get_active(
    755 		GTK_TOGGLE_BUTTON(page->checkbtn_show_on_folder_open));
    756 	prefs_common.open_selected_on_search_results = gtk_toggle_button_get_active(
    757 		GTK_TOGGLE_BUTTON(page->checkbtn_show_on_search_results));
    758 	prefs_common.open_selected_on_prevnext = gtk_toggle_button_get_active(
    759 		GTK_TOGGLE_BUTTON(page->checkbtn_show_on_prevnext));
    760 	prefs_common.open_selected_on_deletemove = gtk_toggle_button_get_active(
    761 		GTK_TOGGLE_BUTTON(page->checkbtn_show_on_deletemove));
    762 	prefs_common.open_selected_on_directional = gtk_toggle_button_get_active(
    763 		GTK_TOGGLE_BUTTON(page->checkbtn_show_on_directional));
    764 
    765 	prefs_common.mark_as_read_on_new_window = gtk_toggle_button_get_active(
    766 		GTK_TOGGLE_BUTTON(page->checkbtn_mark_as_read_on_newwin));
    767 	prefs_common.immediate_exec = gtk_toggle_button_get_active(
    768 		GTK_TOGGLE_BUTTON(page->checkbtn_immedexec));
    769 	prefs_common.ask_mark_all_read = gtk_toggle_button_get_active(
    770 		GTK_TOGGLE_BUTTON(page->checkbtn_ask_mark_all_read));
    771 	prefs_common.mark_as_read_delay = gtk_spin_button_get_value_as_int(
    772 			GTK_SPIN_BUTTON(page->spinbtn_mark_as_read_delay));
    773 	prefs_common.summary_col_lock = gtk_toggle_button_get_active(
    774 		GTK_TOGGLE_BUTTON(page->checkbtn_summary_col_lock));
    775 
    776 	prefs_common.default_sort_key = combobox_get_active_data(
    777 			GTK_COMBO_BOX(page->optmenu_sort_key));
    778 	prefs_common.default_sort_type = combobox_get_active_data(
    779 			GTK_COMBO_BOX(page->optmenu_sort_type));
    780 	prefs_common.summary_from_show = combobox_get_active_data(
    781 			GTK_COMBO_BOX(page->optmenu_summaryfromshow));
    782 	prefs_common.next_unread_msg_dialog = combobox_get_active_data(
    783 			GTK_COMBO_BOX(page->optmenu_nextunreadmsgdialog));
    784 	prefs_common.folder_default_thread =  gtk_toggle_button_get_active(
    785 			GTK_TOGGLE_BUTTON(page->checkbtn_folder_default_thread));
    786 	prefs_common.folder_default_thread_collapsed =  gtk_toggle_button_get_active(
    787 			GTK_TOGGLE_BUTTON(page->checkbtn_folder_default_thread_collapsed));
    788 	prefs_common.folder_default_hide_read_threads =  gtk_toggle_button_get_active(
    789 			GTK_TOGGLE_BUTTON(page->checkbtn_folder_default_hide_read_threads));
    790 	prefs_common.folder_default_hide_read_msgs =  gtk_toggle_button_get_active(
    791 			GTK_TOGGLE_BUTTON(page->checkbtn_folder_default_hide_read_msgs));
    792 	prefs_common.folder_default_hide_del_msgs =  gtk_toggle_button_get_active(
    793 			GTK_TOGGLE_BUTTON(page->checkbtn_folder_default_hide_del_msgs));
    794 	prefs_common.folder_default_hide_del_msgs =  gtk_toggle_button_get_active(
    795 			GTK_TOGGLE_BUTTON(page->checkbtn_folder_default_hide_del_msgs));
    796 
    797 	main_window_reflect_prefs_all();
    798 }
    799 
    800 static void prefs_summaries_destroy_widget(PrefsPage *_page)
    801 {
    802 }
    803 
    804 SummariesPage *prefs_summaries;
    805 
    806 void prefs_summaries_init(void)
    807 {
    808 	SummariesPage *page;
    809 	static gchar *path[3];
    810 
    811 	path[0] = _("Display");
    812 	path[1] = _("Summaries");
    813 	path[2] = NULL;
    814 
    815 	page = g_new0(SummariesPage, 1);
    816 	page->page.path = path;
    817 	page->page.create_widget = prefs_summaries_create_widget;
    818 	page->page.destroy_widget = prefs_summaries_destroy_widget;
    819 	page->page.save_page = prefs_summaries_save;
    820 	page->page.weight = 140.0;
    821 	prefs_gtk_register_page((PrefsPage *) page);
    822 	prefs_summaries = page;
    823 }
    824 
    825 void prefs_summaries_done(void)
    826 {
    827 	prefs_gtk_unregister_page((PrefsPage *) prefs_summaries);
    828 	g_free(prefs_summaries);
    829 }
    830 
    831 static void date_format_ok_btn_clicked(GtkButton *button, GtkWidget **widget)
    832 {
    833 	GtkWidget *datefmt_sample = NULL;
    834 	gchar *text;
    835 
    836 	cm_return_if_fail(widget != NULL);
    837 	cm_return_if_fail(*widget != NULL);
    838 	cm_return_if_fail(prefs_summaries->entry_datefmt != NULL);
    839 
    840 	datefmt_sample = GTK_WIDGET(g_object_get_data
    841 				    (G_OBJECT(*widget), "datefmt_sample"));
    842 	cm_return_if_fail(datefmt_sample != NULL);
    843 
    844 	text = gtk_editable_get_chars(GTK_EDITABLE(datefmt_sample), 0, -1);
    845 	g_free(prefs_common.date_format);
    846 	prefs_common.date_format = text;
    847 	gtk_entry_set_text(GTK_ENTRY(prefs_summaries->entry_datefmt), text);
    848 
    849 	gtk_widget_destroy(*widget);
    850 	*widget = NULL;
    851 }
    852 
    853 static void date_format_cancel_btn_clicked(GtkButton *button,
    854 					   GtkWidget **widget)
    855 {
    856 	cm_return_if_fail(widget != NULL);
    857 	cm_return_if_fail(*widget != NULL);
    858 
    859 	gtk_widget_destroy(*widget);
    860 	*widget = NULL;
    861 }
    862 
    863 static gboolean date_format_on_delete(GtkWidget *dialogwidget,
    864 				      GdkEventAny *event, GtkWidget **widget)
    865 {
    866 	cm_return_val_if_fail(widget != NULL, FALSE);
    867 	cm_return_val_if_fail(*widget != NULL, FALSE);
    868 
    869 	*widget = NULL;
    870 	return FALSE;
    871 }
    872 
    873 static void date_format_entry_on_change(GtkEditable *editable,
    874 					GtkLabel *example)
    875 {
    876 	time_t cur_time;
    877 	struct tm *cal_time;
    878 	gchar buffer[100];
    879 	gchar *text;
    880 	struct tm lt;
    881 
    882 	cur_time = time(NULL);
    883 	cal_time = localtime_r(&cur_time, &lt);
    884 	buffer[0] = 0;
    885 	text = gtk_editable_get_chars(editable, 0, -1);
    886 	if (text)
    887 		fast_strftime(buffer, sizeof buffer, text, cal_time);
    888 
    889 	gtk_label_set_text(example, buffer);
    890 
    891 	g_free(text);
    892 }
    893 
    894 static void date_format_select_row(GtkTreeView *list_view,
    895 				   GtkTreePath *path,
    896 				   GtkTreeViewColumn *column,
    897 				   GtkWidget *date_format)
    898 {
    899 	gint cur_pos;
    900 	gchar *format;
    901 	const gchar *old_format;
    902 	gchar *new_format;
    903 	GtkWidget *datefmt_sample;
    904 	GtkTreeIter iter;
    905 	GtkTreeModel *model;
    906 
    907 	cm_return_if_fail(date_format != NULL);
    908 
    909 	/* only on double click */
    910 	datefmt_sample = GTK_WIDGET(g_object_get_data(G_OBJECT(date_format),
    911 						      "datefmt_sample"));
    912 
    913 	cm_return_if_fail(datefmt_sample != NULL);
    914 
    915 	model = gtk_tree_view_get_model(list_view);
    916 
    917 	/* get format from list */
    918 	if (!gtk_tree_model_get_iter(model, &iter, path))
    919 		return;
    920 
    921 	gtk_tree_model_get(model, &iter, DATEFMT_FMT, &format, -1);
    922 
    923 	cur_pos = gtk_editable_get_position(GTK_EDITABLE(datefmt_sample));
    924 	old_format = gtk_entry_get_text(GTK_ENTRY(datefmt_sample));
    925 
    926 	/* insert the format into the text entry */
    927 	new_format = g_malloc(strlen(old_format) + 3);
    928 
    929 	strncpy(new_format, old_format, cur_pos);
    930 	new_format[cur_pos] = '\0';
    931 	strcat(new_format, format);
    932 	g_free(format);
    933 	strcat(new_format, &old_format[cur_pos]);
    934 
    935 	gtk_entry_set_text(GTK_ENTRY(datefmt_sample), new_format);
    936 	gtk_editable_set_position(GTK_EDITABLE(datefmt_sample), cur_pos + 2);
    937 
    938 	g_free(new_format);
    939 }
    940 
    941 static void always_show_msg_toggled(GtkToggleButton *button,
    942 		gpointer user_data)
    943 {
    944 	const SummariesPage *prefs_summaries = (SummariesPage *)user_data;
    945 	gboolean state;
    946 
    947 	cm_return_if_fail(prefs_summaries != NULL);
    948 
    949 	state = gtk_toggle_button_get_active(button);
    950 
    951 	gtk_widget_set_sensitive(prefs_summaries->checkbtn_show_on_folder_open, !state);
    952 	gtk_widget_set_sensitive(prefs_summaries->checkbtn_show_on_search_results, !state);
    953 	gtk_widget_set_sensitive(prefs_summaries->checkbtn_show_on_prevnext, !state);
    954 	gtk_widget_set_sensitive(prefs_summaries->checkbtn_show_on_deletemove, !state);
    955 	gtk_widget_set_sensitive(prefs_summaries->checkbtn_show_on_directional, !state);
    956 }
    957 
    958 static void mark_as_read_toggled(GtkToggleButton *button, GtkWidget *spinbtn)
    959 {
    960        gtk_widget_set_sensitive(spinbtn,
    961                gtk_toggle_button_get_active(button));
    962 }
    963