1 /*
2 |  Copyright (C) 2002 Corey Donohoe <atmos at atmos.org>
3 |  Copyright (C) 2002-2005 Jorg Schuler <jcsjcs at users sourceforge net>
4 |  Part of the gtkpod project.
5 |
6 |  URL: http://www.gtkpod.org/
7 |  URL: http://gtkpod.sourceforge.net/
8 |
9 |  This program is free software; you can redistribute it and/or modify
10 |  it under the terms of the GNU General Public License as published by
11 |  the Free Software Foundation; either version 2 of the License, or
12 |  (at your option) any later version.
13 |
14 |  This program is distributed in the hope that it will be useful,
15 |  but WITHOUT ANY WARRANTY; without even the implied warranty of
16 |  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 |  GNU General Public License for more details.
18 |
19 |  You should have received a copy of the GNU General Public License
20 |  along with this program; if not, write to the Free Software
21 |  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 |
23 |  iTunes and iPod are trademarks of Apple
24 |
25 |  This product is not supported/written/published by Apple!
26 |
27 |  $Id$
28 */
29 
30 #include <stdio.h>
31 #include <string.h>
32 #include "charset.h"
33 #include "display_itdb.h"
34 #include "info.h"
35 #include "fileselection.h"
36 #include "sha1.h"
37 /*#include "md5.h"*/
38 #include "misc.h"
39 #include "misc_track.h"
40 #include "prefs.h"
41 #include "sort_window.h"
42 #include "repository.h"
43 #include "display_coverart.h"
44 
45 GladeXML *prefs_window_xml;
46 GladeXML *sort_window_xml;
47 
48 static GtkWidget *sort_window = NULL;
49 
50 /* New prefs temp handling */
51 static TempPrefs *sort_temp_prefs;
52 static TempLists *sort_temp_lists;
53 
54 static const GtkFileChooserAction path_type[] =
55 {
56     GTK_FILE_CHOOSER_ACTION_OPEN,  /* select file */
57     GTK_FILE_CHOOSER_ACTION_OPEN,
58     GTK_FILE_CHOOSER_ACTION_OPEN,
59     GTK_FILE_CHOOSER_ACTION_OPEN,
60     GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER, /* select folder */
61     GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
62     GTK_FILE_CHOOSER_ACTION_OPEN,
63     GTK_FILE_CHOOSER_ACTION_OPEN,
64     GTK_FILE_CHOOSER_ACTION_OPEN,
65     GTK_FILE_CHOOSER_ACTION_OPEN,
66     GTK_FILE_CHOOSER_ACTION_OPEN,
67     -1
68 };
69 
70 enum {
71     TRACK_COLUMNS_TEXT,
72     TRACK_COLUMNS_INT,
73     TRACK_N_COLUMNS
74 };
75 
76 typedef enum {
77     HIDE,
78     SHOW
79 } TrackColumnsType;
80 
81 /* ------------------------------------------------------------ *\
82  *                                                              *
83  * Sort-Prefs Window                                            *
84  *                                                              *
85 \* ------------------------------------------------------------ */
86 
87 /* the following checkboxes exist */
88 static const gint sort_ign_fields[] = {
89     T_TITLE, T_ARTIST,
90     T_ALBUM, T_COMPOSER,
91     -1
92 };
93 
94 /* Copy the current ignore fields and ignore strings into scfg */
sort_window_read_sort_ign()95 static void sort_window_read_sort_ign ()
96 {
97     gint i;
98     GtkTextView *tv;
99     GtkTextBuffer *tb;
100     GList *sort_ign_strings;
101     GList *current;
102     gchar *buf;
103 
104 
105     /* read sort field states */
106     for (i=0; sort_ign_fields[i] != -1; ++i)
107     {
108 	buf = g_strdup_printf ("sort_ign_field_%d",
109 				      sort_ign_fields[i]);
110 	GtkWidget *w = gtkpod_xml_get_widget (sort_window_xml, buf);
111 	g_return_if_fail (w);
112 	prefs_set_int( buf,
113 	     gtk_toggle_button_get_active (
114 		GTK_TOGGLE_BUTTON (w)));
115 	g_free (buf);
116     }
117 
118     /* Read sort ignore strings */
119     tv = GTK_TEXT_VIEW (gtkpod_xml_get_widget (sort_window_xml,
120 					      "sort_ign_strings"));
121     g_return_if_fail (tv);
122     tb = gtk_text_view_get_buffer (tv);
123     g_return_if_fail (tb);
124 
125     sort_ign_strings = get_list_from_buffer(tb);
126     current = sort_ign_strings;
127 
128     /* Add a trailing whitespace to strings */
129     while (current)
130     {
131 	g_strstrip(current->data);
132 
133         if (strlen(current->data) != 0)
134 	{
135 	    buf = g_strdup_printf("%s ",(gchar *) current->data);
136 	    g_free(current->data);
137 	    current->data = buf;
138 	}
139 
140 	current = g_list_next(current);
141     }
142 
143     temp_list_add(sort_temp_lists, "sort_ign_string_", sort_ign_strings);
144 }
145 
146 /**
147  * sort_window_create
148  * Create, Initialize, and Show the sorting preferences window
149  * allocate a static sort struct for temporary variables
150  */
sort_window_create(void)151 void sort_window_create (void)
152 {
153     if (sort_window)
154     {
155 		/* sort options already open --> simply raise to the top */
156 		gdk_window_raise(sort_window->window);
157     }
158     else
159     {
160 		GList *sort_ign_strings;
161 		GList *current;  /* current sort ignore item */
162 		GtkWidget *w;
163 		GtkTextView *tv;
164 		GtkTextBuffer *tb;
165 		gint i;
166 		GtkTextIter ti;
167 		gchar *str;
168 		GtkTooltips *tooltips;
169 		gint *tm_listed_order, tm_list_pos;
170 
171 		sort_temp_prefs = temp_prefs_create();
172 		sort_temp_lists = temp_lists_create();
173 
174 		sort_window_xml = gtkpod_xml_new (xml_file, "sort_window");
175 		glade_xml_signal_autoconnect (sort_window_xml);
176 
177 		sort_window = gtkpod_xml_get_widget (sort_window_xml, "sort_window");
178 
179 		/* label the ignore-field checkbox-labels */
180 		for (i=0; sort_ign_fields[i] != -1; ++i)
181 		{
182 			gchar *buf = g_strdup_printf ("sort_ign_field_%d",
183 						  sort_ign_fields[i]);
184 			GtkWidget *w = gtkpod_xml_get_widget (sort_window_xml, buf);
185 			g_return_if_fail (w);
186 			gtk_button_set_label (
187 			GTK_BUTTON (w),
188 			gettext (get_t_string (sort_ign_fields[i])));
189 			gtk_toggle_button_set_active (
190 			GTK_TOGGLE_BUTTON (w),
191 			prefs_get_int (buf));
192 			g_free (buf);
193 		}
194 		/* set the ignore strings */
195 		tv = GTK_TEXT_VIEW (gtkpod_xml_get_widget (sort_window_xml,
196 							  "sort_ign_strings"));
197 		tb = gtk_text_view_get_buffer (tv);
198 		if (!tb)
199 		{   /* text buffer doesn't exist yet */
200 			tb = gtk_text_buffer_new (NULL);
201 			gtk_text_view_set_buffer(tv, tb);
202 			gtk_text_view_set_editable(tv, FALSE);
203 			gtk_text_view_set_cursor_visible(tv, FALSE);
204 		}
205 
206 		sort_ign_strings = prefs_get_list("sort_ign_string_");
207 		current = sort_ign_strings;
208 		while (current)
209 		{
210 			str = (gchar *)current->data;
211 			current = g_list_next(current);
212 
213 			/* append new text to the end */
214 			gtk_text_buffer_get_end_iter (tb, &ti);
215 			gtk_text_buffer_insert (tb, &ti, str, -1);
216 			/* append newline */
217 			gtk_text_buffer_get_end_iter (tb, &ti);
218 			gtk_text_buffer_insert (tb, &ti, "\n", -1);
219 		}
220 
221 		prefs_free_list(sort_ign_strings);
222 
223 		sort_window_read_sort_ign ();
224 
225 		/* Set Sort-Column-Combo */
226 		/* create the list in the order of the columns displayed */
227 		tm_store_col_order ();
228 
229 		/* Here we store the order of TM_Items in the
230 		 * GtkComboBox */
231 		tm_listed_order = g_new (gint, TM_NUM_COLUMNS);
232 		tm_list_pos = 1;
233 
234 		w = gtkpod_xml_get_widget (sort_window_xml, "sort_combo");
235 		gtk_combo_box_remove_text (GTK_COMBO_BOX (w), 0);
236 
237 		gtk_combo_box_append_text (GTK_COMBO_BOX (w), _("No sorting"));
238 
239 		for (i = 0; i < TM_NUM_COLUMNS; ++i)
240 		{   /* first the visible columns */
241 			TM_item col = prefs_get_int_index("col_order", i);
242 			if (col != -1)
243 			{
244 				if (prefs_get_int_index("col_visible", col))
245 				{
246 					gtk_combo_box_append_text (GTK_COMBO_BOX (w), gettext (get_tm_string (col)));
247 					tm_listed_order[col] = tm_list_pos;
248 					++tm_list_pos;
249 				}
250 			}
251 		}
252 
253 		for (i=0; i<TM_NUM_COLUMNS; ++i)
254 		{   /* now the hidden colums */
255 			TM_item col = prefs_get_int_index("col_order", i);
256 			if (col != -1)
257 			{
258 				if (!prefs_get_int_index("col_visible", col))
259 				{
260 					gtk_combo_box_append_text (GTK_COMBO_BOX (w), gettext (get_tm_string (col)));
261 					tm_listed_order[col] = tm_list_pos;
262 					++tm_list_pos;
263 				}
264 			}
265 		}
266 
267 		/* associate tm_listed_order with sort_window */
268 		g_object_set_data (G_OBJECT (sort_window), "tm_listed_order", tm_listed_order);
269 
270 		tooltips = gtk_tooltips_new ();
271 		gtk_tooltips_set_tip (tooltips, w, _("You can also use the table headers, but this allows you to sort according to a column that is not displayed."), NULL);
272 
273 		sort_window_update ();
274 
275 		sort_window_show_hide_tooltips ();
276 	    gtk_window_set_transient_for (GTK_WINDOW (sort_window), GTK_WINDOW (gtkpod_window));
277 		gtk_widget_show (sort_window);
278     }
279 }
280 
281 
282 
283 /* Update sort_window's settings (except for ignore list and ignore
284  * fields) */
sort_window_update(void)285 void sort_window_update (void)
286 {
287     if (sort_window)
288     {
289 	/*	gchar *str; */
290 		GtkWidget *w = NULL;
291 		gint *tm_listed_order;
292 		gint sortorder;
293 		TM_item sortcol;
294 
295 		switch (prefs_get_int("pm_sort"))
296 		{
297 		case SORT_ASCENDING:
298 			w = gtkpod_xml_get_widget (sort_window_xml, "pm_ascend");
299 			break;
300 		case SORT_DESCENDING:
301 			w = gtkpod_xml_get_widget (sort_window_xml, "pm_descend");
302 			break;
303 		case SORT_NONE:
304 			w = gtkpod_xml_get_widget (sort_window_xml, "pm_none");
305 			break;
306 		}
307 		if (w)
308 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
309 
310 		w = NULL;
311 		switch (prefs_get_int("st_sort"))
312 		{
313 		case SORT_ASCENDING:
314 			w = gtkpod_xml_get_widget (sort_window_xml, "st_ascend");
315 			break;
316 		case SORT_DESCENDING:
317 			w = gtkpod_xml_get_widget (sort_window_xml, "st_descend");
318 			break;
319 		case SORT_NONE:
320 			w = gtkpod_xml_get_widget (sort_window_xml, "st_none");
321 			break;
322 		}
323 		if (w)
324 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
325 
326 		switch (prefs_get_int("tm_sort"))
327 		{
328 		case SORT_ASCENDING:
329 			w = gtkpod_xml_get_widget (sort_window_xml, "tm_ascend");
330 			break;
331 		case SORT_DESCENDING:
332 			w = gtkpod_xml_get_widget (sort_window_xml, "tm_descend");
333 			break;
334 		case SORT_NONE:
335 			w = gtkpod_xml_get_widget (sort_window_xml, "tm_none");
336 			break;
337 		}
338 		if (w)
339 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w), TRUE);
340 
341 		w = gtkpod_xml_get_widget (sort_window_xml, "tm_autostore");
342 		if (w)
343 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
344 						 prefs_get_int("tm_autostore"));
345 
346 		if((w = gtkpod_xml_get_widget (sort_window_xml, "cfg_case_sensitive")))
347 		{
348 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w),
349 						 prefs_get_int("case_sensitive"));
350 		}
351 		/* set standard entry in combo */
352 	/*	str = gettext (get_tm_string (prefs_get_int("tm_sortcol")));
353 		w = gtkpod_xml_get_widget (sort_window_xml, "sort_combo");
354 		gtk_entry_set_text (GTK_ENTRY (GTK_COMBO (w)->entry), str); */
355 		w = gtkpod_xml_get_widget (sort_window_xml, "sort_combo");
356 		tm_listed_order = g_object_get_data (G_OBJECT (sort_window), "tm_listed_order");
357 		g_return_if_fail (tm_listed_order);
358 		sortcol = prefs_get_int ("tm_sortcol");
359 		sortorder = prefs_get_int ("tm_sort");
360 		if ((sortcol >= 0) && (sortcol < TM_NUM_COLUMNS) && (sortorder != SORT_NONE))
361 		{
362 		    gtk_combo_box_set_active (GTK_COMBO_BOX(w), tm_listed_order[sortcol]);
363 		}
364 		else
365 		{
366 		    gtk_combo_box_set_active (GTK_COMBO_BOX(w), 0);
367 		}
368     }
369 }
370 
371 
372 /* turn the sort window insensitive (if it's open) */
sort_window_block(void)373 void sort_window_block (void)
374 {
375     if (sort_window)
376 	gtk_widget_set_sensitive (sort_window, FALSE);
377 }
378 
379 /* turn the sort window sensitive (if it's open) */
sort_window_release(void)380 void sort_window_release (void)
381 {
382     if (sort_window)
383 	gtk_widget_set_sensitive (sort_window, TRUE);
384 }
385 
386 
387 /* make the tooltips visible or hide it depending on the value set in
388  * the prefs (tooltips_prefs) */
sort_window_show_hide_tooltips(void)389 void sort_window_show_hide_tooltips (void)
390 {
391     if (sort_window)
392     {
393 		GtkTooltips *tt;
394 		GtkTooltipsData *tooltips_data;
395 
396 		tooltips_data = gtk_tooltips_data_get (gtkpod_xml_get_widget (sort_window_xml, "sort_combo"));
397 		tt = tooltips_data->tooltips;
398 
399 		if (tt)
400 		{
401 			if (prefs_get_int("display_tooltips_prefs"))
402 			gtk_tooltips_enable (tt);
403 			else
404 			gtk_tooltips_disable (tt);
405 		}
406 		else
407 		{
408 			g_warning ("***tt is NULL***");
409 		}
410     }
411 }
412 
413 
414 /* get the sort_column selected in the combo */
sort_window_get_sort_col(void)415 static TM_item sort_window_get_sort_col (void)
416 {
417     GtkWidget *w;
418     TM_item sortcol;
419     gint item;
420     gint *tm_listed_order;
421 
422     g_return_val_if_fail (sort_window, -1);
423     tm_listed_order = g_object_get_data (G_OBJECT (sort_window), "tm_listed_order");
424 
425     w = gtkpod_xml_get_widget (sort_window_xml, "sort_combo");
426     item = gtk_combo_box_get_active (GTK_COMBO_BOX (w));
427 
428     if ((item<=0) || (item >TM_NUM_COLUMNS))
429     {   /* either an error or no entry is active or "No sorting" is
430 	   selected (0). In all these cases we return -1 ("No
431 	   sorting") */
432 	sortcol = -1;
433     }
434     else
435     {
436 	gint i;
437 	sortcol = -1;
438 	for (i=0; i<TM_NUM_COLUMNS; ++i)
439 	{
440 	    if (tm_listed_order[i] == item)
441 	    {
442 		sortcol = i;
443 		break;
444 	    }
445 	}
446     }
447 
448     return sortcol;
449 }
450 
451 
452 /* Prepare keys to be copied to prefs table */
sort_window_set()453 static void sort_window_set ()
454 {
455     gint val; /* A value from temp prefs */
456     TM_item sortcol_new;
457     TM_item sortcol_old;
458 
459     sortcol_old = prefs_get_int("tm_sortcol");
460     sortcol_new = sort_window_get_sort_col();
461     if (sortcol_new != -1)
462     {
463 	prefs_set_int ("tm_sortcol", sortcol_new);
464 	if (prefs_get_int ("tm_sort") == SORT_NONE)
465 	{
466 	    if (temp_prefs_get_int_value (sort_temp_prefs, "tm_sort", &val))
467 	    {
468 		prefs_set_int ("tm_sort", val);
469 	    }
470 	    else
471 	    {
472 		prefs_set_int ("tm_sort", GTK_SORT_ASCENDING);
473 	    }
474 	}
475     }
476     else
477     {
478 	if (prefs_get_int ("tm_sort") == SORT_NONE)
479 	{  /* no change */
480 	    sortcol_new = sortcol_old;
481 	}
482 	else
483 	{
484 	    prefs_set_int ("tm_sort", SORT_NONE);
485 	}
486     }
487 
488     /* update compare string keys */
489     compare_string_fuzzy_generate_keys ();
490 
491     /* if case sensitive has changed, rebuild sortkeys */
492     if (temp_prefs_get_int_value(sort_temp_prefs, "case_sensitive", &val))
493     {
494 	st_rebuild_sortkeys ();
495 	temp_prefs_remove_key (sort_temp_prefs, "case_sensitive");
496     }
497     /* if sort type has changed, initialize display */
498     if (temp_prefs_get_int_value(sort_temp_prefs, "pm_sort", &val))
499     {
500 	pm_sort (val);
501 	temp_prefs_remove_key (sort_temp_prefs, "pm_sort");
502     }
503     if (temp_prefs_get_int_value(sort_temp_prefs, "st_sort", &val))
504     {
505 	st_sort (val);
506 	temp_prefs_remove_key (sort_temp_prefs, "st_sort");
507     }
508     if (temp_prefs_get_int_value(sort_temp_prefs, "tm_sort", NULL) ||
509 	(sortcol_old != sortcol_new))
510     {
511 	tm_sort_counter (-1);
512 	tm_sort (prefs_get_int("tm_sortcol"), prefs_get_int("tm_sort"));
513 	temp_prefs_remove_key (sort_temp_prefs, "tm_sort");
514     }
515     /* if auto sort was changed to TRUE, store order */
516     if (!temp_prefs_get_int(sort_temp_prefs, "tm_autostore"))
517     {
518 	tm_rows_reordered ();
519 	temp_prefs_remove_key (sort_temp_prefs, "tm_autostore");
520     }
521 
522     sort_window_update ();
523 }
524 
525 
526 /* -----------------------------------------------------------------
527 
528    Callbacks
529 
530    ----------------------------------------------------------------- */
531 
532 G_MODULE_EXPORT void
on_st_ascend_toggled(GtkToggleButton * togglebutton,gpointer user_data)533 on_st_ascend_toggled                   (GtkToggleButton *togglebutton,
534 					gpointer         user_data)
535 {
536     if (gtk_toggle_button_get_active(togglebutton))
537 	sort_window_set_st_sort (SORT_ASCENDING);
538 }
539 
540 
541 G_MODULE_EXPORT void
on_st_descend_toggled(GtkToggleButton * togglebutton,gpointer user_data)542 on_st_descend_toggled                  (GtkToggleButton *togglebutton,
543 					gpointer         user_data)
544 {
545     if (gtk_toggle_button_get_active(togglebutton))
546 	sort_window_set_st_sort (SORT_DESCENDING);
547 }
548 
549 
550 G_MODULE_EXPORT void
on_st_none_toggled(GtkToggleButton * togglebutton,gpointer user_data)551 on_st_none_toggled                     (GtkToggleButton *togglebutton,
552 					gpointer         user_data)
553 {
554     if (gtk_toggle_button_get_active(togglebutton))
555 	sort_window_set_st_sort (SORT_NONE);
556 }
557 
558 
559 G_MODULE_EXPORT void
on_pm_ascend_toggled(GtkToggleButton * togglebutton,gpointer user_data)560 on_pm_ascend_toggled                   (GtkToggleButton *togglebutton,
561 					gpointer         user_data)
562 {
563     if (gtk_toggle_button_get_active(togglebutton))
564 	sort_window_set_pm_sort (SORT_ASCENDING);
565 }
566 
567 
568 G_MODULE_EXPORT void
on_pm_descend_toggled(GtkToggleButton * togglebutton,gpointer user_data)569 on_pm_descend_toggled                  (GtkToggleButton *togglebutton,
570 					gpointer         user_data)
571 {
572     if (gtk_toggle_button_get_active(togglebutton))
573 	sort_window_set_pm_sort (SORT_DESCENDING);
574 }
575 
576 
577 G_MODULE_EXPORT void
on_pm_none_toggled(GtkToggleButton * togglebutton,gpointer user_data)578 on_pm_none_toggled                     (GtkToggleButton *togglebutton,
579 					gpointer         user_data)
580 {
581     if (gtk_toggle_button_get_active(togglebutton))
582 	sort_window_set_pm_sort (SORT_NONE);
583 }
584 
585 
586 G_MODULE_EXPORT void
on_tm_ascend_toggled(GtkToggleButton * togglebutton,gpointer user_data)587 on_tm_ascend_toggled                   (GtkToggleButton *togglebutton,
588 					gpointer         user_data)
589 {
590     if (gtk_toggle_button_get_active(togglebutton))
591 	sort_window_set_tm_sort (SORT_ASCENDING);
592 }
593 
594 
595 G_MODULE_EXPORT void
on_tm_descend_toggled(GtkToggleButton * togglebutton,gpointer user_data)596 on_tm_descend_toggled                  (GtkToggleButton *togglebutton,
597 					gpointer         user_data)
598 {
599     if (gtk_toggle_button_get_active(togglebutton))
600 	sort_window_set_tm_sort (SORT_DESCENDING);
601 }
602 
603 
604 G_MODULE_EXPORT void
on_tm_none_toggled(GtkToggleButton * togglebutton,gpointer user_data)605 on_tm_none_toggled                     (GtkToggleButton *togglebutton,
606 					gpointer         user_data)
607 {
608     if (gtk_toggle_button_get_active(togglebutton))
609 	sort_window_set_tm_sort (SORT_NONE);
610 }
611 
612 G_MODULE_EXPORT void
on_tm_autostore_toggled(GtkToggleButton * togglebutton,gpointer user_data)613 on_tm_autostore_toggled                (GtkToggleButton *togglebutton,
614 					gpointer         user_data)
615 {
616     sort_window_set_tm_autostore (gtk_toggle_button_get_active(togglebutton));
617 }
618 
619 
620 G_MODULE_EXPORT void
on_sort_case_sensitive_toggled(GtkToggleButton * togglebutton,gpointer user_data)621 on_sort_case_sensitive_toggled         (GtkToggleButton *togglebutton,
622 					gpointer         user_data)
623 {
624     sort_window_set_case_sensitive(
625 	gtk_toggle_button_get_active(togglebutton));
626 }
627 
628 
629 G_MODULE_EXPORT void
on_sort_apply_clicked(GtkButton * button,gpointer user_data)630 on_sort_apply_clicked                  (GtkButton       *button,
631 					gpointer         user_data)
632 {
633     sort_window_apply ();
634 }
635 
636 
637 G_MODULE_EXPORT void
on_sort_cancel_clicked(GtkButton * button,gpointer user_data)638 on_sort_cancel_clicked                 (GtkButton       *button,
639 					gpointer         user_data)
640 {
641     sort_window_cancel ();
642 }
643 
644 
645 G_MODULE_EXPORT void
on_sort_ok_clicked(GtkButton * button,gpointer user_data)646 on_sort_ok_clicked                     (GtkButton       *button,
647 					gpointer         user_data)
648 {
649     sort_window_ok ();
650 }
651 
652 
653 G_MODULE_EXPORT gboolean
on_sort_window_delete_event(GtkWidget * widget,GdkEvent * event,gpointer user_data)654 on_sort_window_delete_event            (GtkWidget       *widget,
655 					GdkEvent        *event,
656 					gpointer         user_data)
657 {
658     sort_window_delete ();
659     return FALSE;
660 }
661 
662 
663 
664 /**
665  * sort_window_cancel
666  * UI has requested sort prefs changes be ignored -- write back the
667  * original values
668  */
sort_window_cancel(void)669 void sort_window_cancel (void)
670 {
671     /* close the window */
672     if(sort_window)
673 	gtk_widget_destroy(sort_window);
674     sort_window = NULL;
675 }
676 
677 /* when window is deleted, we keep the currently applied prefs */
sort_window_delete(void)678 void sort_window_delete(void)
679 {
680     temp_prefs_destroy(sort_temp_prefs);
681     sort_temp_prefs = NULL;
682     temp_lists_destroy(sort_temp_lists);
683     sort_temp_lists = NULL;
684 
685     /* close the window */
686     if(sort_window)
687     {
688 	gint *tm_listed_order;
689 	tm_listed_order = g_object_get_data (G_OBJECT (sort_window), "tm_listed_order");
690 	g_warn_if_fail (tm_listed_order);
691 	g_free (tm_listed_order);
692 	gtk_widget_destroy(sort_window);
693     }
694     sort_window = NULL;
695 }
696 
697 /* apply the current settings and close the window */
sort_window_ok(void)698 void sort_window_ok (void)
699 {
700     /* update the sort ignore strings */
701     sort_window_read_sort_ign ();
702 
703     temp_prefs_apply(sort_temp_prefs);
704     temp_lists_apply(sort_temp_lists);
705 
706     /* save current settings */
707     sort_window_set ();
708 
709     /* close the window */
710     if(sort_window)
711 	gtk_widget_destroy(sort_window);
712     sort_window = NULL;
713 }
714 
715 
716 /* apply the current settings, don't close the window */
sort_window_apply(void)717 void sort_window_apply (void)
718 {
719     /* update the sort ignore strings */
720     sort_window_read_sort_ign ();
721 
722     temp_prefs_apply(sort_temp_prefs);
723     temp_lists_apply(sort_temp_lists);
724 
725     /* save current settings */
726     sort_window_set ();
727 }
728 
sort_window_set_tm_autostore(gboolean val)729 void sort_window_set_tm_autostore (gboolean val)
730 {
731     temp_prefs_set_int(sort_temp_prefs, "tm_autostore", val);
732 }
733 
sort_window_set_pm_sort(gint val)734 void sort_window_set_pm_sort (gint val)
735 {
736     temp_prefs_set_int(sort_temp_prefs, "pm_sort", val);
737 }
738 
sort_window_set_st_sort(gint val)739 void sort_window_set_st_sort (gint val)
740 {
741     temp_prefs_set_int(sort_temp_prefs, "st_sort", val);
742 }
743 
sort_window_set_tm_sort(gint val)744 void sort_window_set_tm_sort (gint val)
745 {
746     temp_prefs_set_int(sort_temp_prefs, "tm_sort", val);
747 }
748 
sort_window_set_case_sensitive(gboolean val)749 void sort_window_set_case_sensitive (gboolean val)
750 {
751     temp_prefs_set_int(sort_temp_prefs, "case_sensitive",
752 		       val);
753 }
754