mp3splt-gtk
preferences_tab.c
Go to the documentation of this file.
00001 /**********************************************************
00002  *
00003  * mp3splt-gtk -- utility based on mp3splt,
00004  *                for mp3/ogg splitting without decoding
00005  *
00006  * Copyright: (C) 2005-2011 Alexandru Munteanu
00007  * Contact: io_fx@yahoo.fr
00008  *
00009  * http://mp3splt.sourceforge.net/
00010  *
00011  *********************************************************/
00012 
00013 /**********************************************************
00014  *
00015  * This program is free software; you can redistribute it and/or
00016  * modify it under the terms of the GNU General Public License
00017  * as published by the Free Software Foundation; either version 2
00018  * of the License, or (at your option) any later version.
00019  *
00020  * This program is distributed in the hope that it will be useful,
00021  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00022  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00023  * GNU General Public License for more details.
00024  *
00025  * You should have received a copy of the GNU General Public License
00026  * along with this program; if not, write to the Free Software
00027  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
00028  * USA.
00029  *
00030  *********************************************************/
00031 
00032 /*!********************************************************
00033  * \file 
00034  * The preferences tab
00035  *
00036  * this file contains the code for the preferences tab where 
00037  * the preferences can be chosen.
00038  ********************************************************/
00039 
00040 #include <gtk/gtk.h>
00041 #include <glib/gi18n.h>
00042 #include <glib.h>
00043 #include <glib/gstdio.h>
00044 #include <string.h>
00045 
00046 #include <libmp3splt/mp3splt.h>
00047 
00048 #include "preferences_tab.h"
00049 #include "player.h"
00050 #include "util.h"
00051 #include "player_tab.h"
00052 #include "utilities.h"
00053 #include "main_win.h"
00054 #include "preferences_manager.h"
00055 #include "widgets_helper.h"
00056 #include "combo_helper.h"
00057 #include "radio_helper.h"
00058 #include "options_manager.h"
00059 #include "ui_manager.h"
00060 #include "widgets_helper.h"
00061 
00067 GString *outputdirname = NULL;
00068 
00070 GtkWidget *directory_entry = NULL;
00071 
00073 GtkWidget *output_entry = NULL;
00074 GtkWidget *output_label = NULL;
00075 
00077 GtkWidget *player_combo_box = NULL;
00078 
00080 GList *player_pref_list = NULL;
00081 GList *text_options_list = NULL;
00082 //selected player
00083 gint selected_player = PLAYER_GSTREAMER;
00084 
00086 GtkWidget *radio_button = NULL;
00087 
00089 GtkWidget *radio_output = NULL;
00090 
00092 GtkWidget *tags_radio = NULL;
00093 GtkWidget *tags_version_radio = NULL;
00094 
00095 //split options
00097 GtkWidget *frame_mode = NULL;
00099 GtkWidget *adjust_mode = NULL;
00100 // when ticked, name for split tag derived from filename
00101 GtkWidget *names_from_filename = NULL;
00102 
00103 GtkWidget *create_dirs_from_output_files = NULL;
00104 
00108 GtkWidget *spinner_adjust_gap = NULL;
00109 GtkWidget *gap_label = NULL;
00110 GtkWidget *spinner_adjust_offset = NULL;
00111 GtkWidget *offset_label = NULL;
00112 GtkWidget *spinner_adjust_threshold = NULL;
00113 GtkWidget *threshold_label = NULL;
00115 
00119 GtkWidget *replace_underscore_by_space_check_box = NULL;
00120 GtkComboBox *artist_text_properties_combo = NULL;
00121 GtkComboBox *album_text_properties_combo = NULL;
00122 GtkComboBox *title_text_properties_combo = NULL;
00123 GtkComboBox *comment_text_properties_combo = NULL;
00124 GtkComboBox *genre_combo = NULL;
00125 GtkWidget *comment_tag_entry = NULL;
00126 GtkWidget *regex_entry = NULL;
00127 GtkWidget *test_regex_fname_entry = NULL;
00128 GtkWidget *sample_result_label = NULL;
00129 
00130 GtkWidget *extract_tags_box = NULL;
00132 
00133 extern GtkWidget *player_box;
00134 extern GtkWidget *queue_files_button;
00135 extern splt_state *the_state;
00136 extern gint selected_split_mode;
00137 extern gint split_file_mode;
00138 extern GtkWidget *spinner_time;
00139 extern GtkWidget *spinner_equal_tracks;
00140 
00141 extern gint file_browsed;
00142 
00143 static GtkWidget *create_extract_tags_from_filename_options_box();
00144 static GtkWidget *create_test_regex_table();
00145 
00146 extern void clear_current_description(void);
00147 extern void copy_filename_to_current_description(const gchar *fname);
00148 
00149 extern ui_state *ui;
00150 
00155 GString *get_checked_language()
00156 {
00157   GSList *radio_button_list;
00158   radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_button));
00159   GtkWidget *our_button;
00160 
00161   //0 = german, 1 = french, 2 = english
00162   our_button = (GtkWidget *)g_slist_nth_data(radio_button_list, 0);
00163   if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(our_button)))
00164   {
00165     return g_string_new("de_DE");
00166   }
00167   else 
00168   {
00169     our_button = (GtkWidget *)g_slist_nth_data(radio_button_list, 1);
00170     if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(our_button)))
00171     {
00172       return g_string_new("fr_FR");
00173     }
00174   }
00175 
00176   return g_string_new("en");
00177 }
00178 
00180 gboolean get_checked_output_radio_box()
00181 {
00182   //get the radio buttons
00183   GSList *radio_button_list;
00184   radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_output));
00185   //we check which bubble is checked
00186   GtkToggleButton *test;
00187   gint i, selected = 0;
00188   //O = default output mode
00189   //1 = custom output mode
00190   for(i = 0; i<2;i++)
00191   {
00192     test = (GtkToggleButton *)g_slist_nth_data(radio_button_list,i);
00193     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(test)))
00194     {
00195       selected = i;
00196     }
00197   }
00198 
00199   return selected;
00200 }
00201 
00203 gint get_checked_tags_version_radio_box()
00204 {
00205   //get the radio buttons
00206   GSList *radio_button_list;
00207   radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(tags_version_radio));
00208 
00209   //we check which bubble is checked
00210   GtkToggleButton *test;
00211   gint i, selected = 0;
00212   //O = The same version as the original file
00213   //1 = ID3v1
00214   //2 = ID3v2
00215   //3 = ID3v1 & ID3v2
00216   for(i = 0; i<4;i++)
00217   {
00218     test = (GtkToggleButton *)g_slist_nth_data(radio_button_list,i);
00219     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(test)))
00220     {
00221       selected = i;
00222     }
00223   }
00224   
00225   return selected;
00226 }
00227 
00229 void outputdirectory_set(gchar *dirname)
00230 {
00231   if(dirname!=NULL)
00232     {
00233       // Free the old string before allocating memory for the new one
00234       if(outputdirname!=NULL)g_string_free(outputdirname,TRUE);
00235       outputdirname=g_string_new(dirname);
00236 
00237       // Update the text in the gui field displaying the output 
00238       // directory - if this field is already there and thus can 
00239       // be updated.
00240       if(directory_entry!=NULL)
00241         gtk_entry_set_text(GTK_ENTRY(directory_entry), dirname);
00242     }
00243 }
00244 
00251 gchar* outputdirectory_get()
00252 {
00253   if(outputdirname!=NULL)
00254     return(outputdirname->str);
00255   else
00256     return NULL;
00257 }
00258 
00259 void save_preferences(GtkWidget *widget, gpointer data)
00260 {
00261   gchar *filename = get_preferences_filename();
00262 
00263   GKeyFile *my_key_file = g_key_file_new();
00264   g_key_file_load_from_file(my_key_file, filename, G_KEY_FILE_KEEP_COMMENTS, NULL);
00265 
00266   //save_path
00267   g_key_file_set_string(my_key_file, "split", "save_path",
00268                         outputdirectory_get());
00269   //default_player
00270   g_key_file_set_integer(my_key_file, "player", "default_player", selected_player);
00271 
00272 #ifdef __WIN32__
00273   //language
00274   GString *selected_lang;
00275   selected_lang = (GString *)get_checked_language();
00276   g_key_file_set_string(my_key_file, "general", "language", selected_lang->str);
00277   g_string_free(selected_lang, TRUE);
00278   selected_lang = NULL;
00279 #endif
00280 
00281   //frame mode
00282   g_key_file_set_boolean(my_key_file, "split", "frame_mode",
00283       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(frame_mode)));
00284 
00285   //adjust mode
00286   g_key_file_set_boolean(my_key_file, "split", "adjust_mode",
00287       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(adjust_mode)));
00288 
00289   //adjust threshold
00290   g_key_file_set_integer(my_key_file, "split", "adjust_threshold",
00291       gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinner_adjust_threshold)) * 100);
00292   //adjust offset
00293   g_key_file_set_integer(my_key_file, "split", "adjust_offset",
00294       gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinner_adjust_offset)) * 100);
00295   //adjust gap
00296   g_key_file_set_integer(my_key_file, "split", "adjust_gap",
00297       gtk_spin_button_get_value(GTK_SPIN_BUTTON(spinner_adjust_gap)));
00298 
00299   g_key_file_set_boolean(my_key_file, "output", "splitpoint_names_from_filename",
00300       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(names_from_filename)));
00301 
00302   //output format
00303   g_key_file_set_string(my_key_file, "output", "output_format",
00304       gtk_entry_get_text(GTK_ENTRY(output_entry)));
00305   //default output format
00306   g_key_file_set_boolean(my_key_file, "output", "default_output_format",
00307       get_checked_output_radio_box());
00308   g_key_file_set_boolean(my_key_file, "output", "create_dirs_if_needed",
00309       gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(create_dirs_from_output_files)));
00310 
00311   //tags
00312   g_key_file_set_integer(my_key_file, "split", "tags", rh_get_active_value(tags_radio));
00313 
00314   //replace underscores by space
00315   g_key_file_set_boolean(my_key_file, "split", "replace_underscore_by_space",
00316   gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(replace_underscore_by_space_check_box)));
00317 
00318   //artist text properties
00319   g_key_file_set_integer(my_key_file, "split", "artist_text_properties",
00320       ch_get_active_value(artist_text_properties_combo));
00321   //album text properties
00322   g_key_file_set_integer(my_key_file, "split", "album_text_properties",
00323       ch_get_active_value(album_text_properties_combo));
00324   //title text properties
00325   g_key_file_set_integer(my_key_file, "split", "title_text_properties",
00326       ch_get_active_value(title_text_properties_combo));
00327   //comment text properties
00328   g_key_file_set_integer(my_key_file, "split", "comment_text_properties",
00329       ch_get_active_value(comment_text_properties_combo));
00330 
00331   //genre
00332   gchar *genre_value = ch_get_active_str_value(genre_combo);
00333   if (genre_value != NULL)
00334   {
00335     g_key_file_set_string(my_key_file, "split", "genre", genre_value);
00336   }
00337 
00338   const gchar *comment = gtk_entry_get_text(GTK_ENTRY(comment_tag_entry));
00339   if (comment != NULL)
00340   {
00341     g_key_file_set_string(my_key_file, "split", "default_comment_tag", comment);
00342   }
00343 
00344   const gchar *regex_text = gtk_entry_get_text(GTK_ENTRY(regex_entry));
00345   if (regex_text != NULL)
00346   {
00347     g_key_file_set_string(my_key_file, "split", "tags_from_filename_regex", regex_text);
00348   }
00349 
00350   const gchar *test_regex_fname = gtk_entry_get_text(GTK_ENTRY(test_regex_fname_entry));
00351   if (test_regex_fname_entry != NULL)
00352   {
00353     g_key_file_set_string(my_key_file, "split", "test_regex_fname", test_regex_fname);
00354   }
00355 
00356   //tags version
00357   g_key_file_set_integer(my_key_file, "split", "tags_version",
00358       get_checked_tags_version_radio_box());
00359 
00360   //type of split: split mode
00361   g_key_file_set_integer(my_key_file, "split", "split_mode",
00362       selected_split_mode);
00363   //time value
00364   g_key_file_set_integer(my_key_file, "split", "split_mode_time_value",
00365       gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner_time)));
00366   //type of split: file mode
00367   g_key_file_set_integer(my_key_file, "split", "file_mode",
00368       split_file_mode);
00369   //equal time tracks value
00370   g_key_file_set_integer(my_key_file, "split", "split_mode_equal_time_tracks",
00371       gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spinner_equal_tracks)));
00372 
00373   const ui_main_window *main_win = ui_get_main_window_infos(ui);
00374   g_key_file_set_integer(my_key_file, "gui", "root_x_position", 
00375       main_win->root_x_pos);
00376   g_key_file_set_integer(my_key_file, "gui", "root_y_position", 
00377       main_win->root_y_pos);
00378   g_key_file_set_integer(my_key_file, "gui", "width", 
00379       main_win->width);
00380   g_key_file_set_integer(my_key_file, "gui", "height", 
00381       main_win->height);
00382 
00383   const char *browser_directory = ui_get_browser_directory(ui);
00384   if (browser_directory != NULL)
00385   {
00386     g_key_file_set_string(my_key_file, "gui", "browser_directory", browser_directory);
00387   }
00388 
00389   gchar *key_data = g_key_file_to_data(my_key_file, NULL, NULL);
00390 
00391   //we write to the preference file
00392   FILE *preferences_file;
00393   preferences_file = (FILE *)g_fopen(filename,"w");
00394   g_fprintf(preferences_file,"%s", key_data);
00395   fclose(preferences_file);
00396   preferences_file = NULL;
00397 
00398   //we free memory
00399   g_free(key_data);
00400   g_key_file_free(my_key_file);
00401 
00402   if (filename)
00403   {
00404     g_free(filename);
00405     filename = NULL;
00406   }
00407 }
00408 
00410 GtkWidget *create_scrolled_window()
00411 {
00412   GtkWidget *scrolled_window;
00413   scrolled_window = gtk_scrolled_window_new (NULL, NULL);
00414   gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW(scrolled_window), GTK_SHADOW_NONE);
00415   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
00416                                   GTK_POLICY_AUTOMATIC,
00417                                   GTK_POLICY_AUTOMATIC);
00418   return scrolled_window;
00419 }
00420 
00422 void output_radio_box_event(GtkToggleButton *radio_b, gpointer data)
00423 {
00424   GtkWidget *output_label = (GtkWidget *)data;
00425 
00426   gint selected = get_checked_output_radio_box();
00427 
00428   //custom output mode
00429   if (selected == 0)
00430   {
00431     gtk_widget_set_sensitive(GTK_WIDGET(output_entry), TRUE);
00432     gtk_widget_set_sensitive(GTK_WIDGET(output_label), TRUE);
00433     mp3splt_set_int_option(the_state, SPLT_OPT_OUTPUT_FILENAMES,
00434         SPLT_OUTPUT_FORMAT);
00435   }
00436   else
00437   {
00438     gtk_widget_set_sensitive(GTK_WIDGET(output_entry), FALSE);
00439     gtk_widget_set_sensitive(GTK_WIDGET(output_label), FALSE);
00440     mp3splt_set_int_option(the_state, SPLT_OPT_OUTPUT_FILENAMES,
00441         SPLT_OUTPUT_DEFAULT);
00442   }
00443 
00444   save_preferences(NULL, NULL);
00445 }
00446 
00448 GtkWidget *create_language_box()
00449 {
00450   GtkWidget *radio_vbox = gtk_vbox_new (FALSE, 0);
00451 
00452   radio_button = gtk_radio_button_new_with_label(NULL, "English");
00453   g_signal_connect(GTK_TOGGLE_BUTTON(radio_button), "toggled",
00454       G_CALLBACK(save_preferences), NULL);
00455   gtk_box_pack_start(GTK_BOX(radio_vbox), radio_button, TRUE, TRUE, 0);
00456 
00457   radio_button = gtk_radio_button_new_with_label_from_widget
00458     (GTK_RADIO_BUTTON(radio_button), "Français");
00459   g_signal_connect(GTK_TOGGLE_BUTTON(radio_button), "toggled",
00460       G_CALLBACK(save_preferences), NULL);
00461   gtk_box_pack_start(GTK_BOX(radio_vbox), radio_button, TRUE, TRUE, 0);
00462 
00463   radio_button = gtk_radio_button_new_with_label_from_widget
00464     (GTK_RADIO_BUTTON(radio_button), "Deutsch");
00465   g_signal_connect(GTK_TOGGLE_BUTTON (radio_button), "toggled",
00466       G_CALLBACK(save_preferences), NULL);
00467   gtk_box_pack_start(GTK_BOX(radio_vbox), radio_button, TRUE, TRUE, 0);
00468 
00469   return wh_set_title_and_get_vbox(radio_vbox,
00470       _("<b>Choose language (requires restart)</b>"));
00471 }
00472 
00474 GtkWidget *create_pref_language_page()
00475 {
00476   GtkWidget *language_hbox = gtk_hbox_new(FALSE, 0);;
00477  
00478   //vertical box inside the scrolled window
00479   GtkWidget *language_inside_hbox = gtk_hbox_new(FALSE, 0);;
00480 
00481   //scrolled window
00482   GtkWidget *scrolled_window;
00483   scrolled_window = create_scrolled_window();
00484   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
00485                                         GTK_WIDGET(language_inside_hbox));
00486   gtk_box_pack_start(GTK_BOX(language_hbox), scrolled_window, TRUE, TRUE, 0);
00487  
00488   //vertical box inside the horizontal box from the scrolled window
00489   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);;
00490   gtk_box_pack_start(GTK_BOX(language_inside_hbox), vbox, TRUE, TRUE, 10);
00491 
00492   GtkWidget *lang_box = create_language_box();
00493   gtk_box_pack_start(GTK_BOX(vbox), lang_box, FALSE, FALSE, 10);
00494   
00495   return language_hbox;
00496 }
00497 
00499 void browse_dir_button_event(GtkWidget *widget, gpointer data)
00500 {
00501   // file chooser
00502   GtkWidget *dir_chooser;
00503 
00504   //creates and shows the dialog
00505   dir_chooser = gtk_file_chooser_dialog_new(_("Choose split directory"),
00506       NULL,
00507       GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
00508       GTK_STOCK_CANCEL,
00509       GTK_RESPONSE_CANCEL,
00510       GTK_STOCK_OPEN,
00511       GTK_RESPONSE_ACCEPT,
00512       NULL);
00513 
00514   wh_set_browser_directory_handler(ui, dir_chooser);
00515 
00516   if (gtk_dialog_run(GTK_DIALOG(dir_chooser)) == GTK_RESPONSE_ACCEPT)
00517   {
00518     gchar *filename =
00519       gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dir_chooser));
00520 
00521     outputdirectory_set(filename);
00522 
00523     g_free (filename);
00524     filename = NULL;
00525 
00526     save_preferences(NULL, NULL);
00527   }
00528 
00529   //destroys dialog
00530   gtk_widget_destroy(dir_chooser);
00531 }
00532 
00534 void disable_adjust_spinners()
00535 {
00536   gtk_widget_set_sensitive(spinner_adjust_threshold, FALSE);
00537   gtk_widget_set_sensitive(spinner_adjust_offset, FALSE);
00538   gtk_widget_set_sensitive(spinner_adjust_gap, FALSE);
00539   gtk_widget_set_sensitive(threshold_label, FALSE);
00540   gtk_widget_set_sensitive(offset_label, FALSE);
00541   gtk_widget_set_sensitive(gap_label, FALSE);
00542 }
00543 
00545 void enable_adjust_spinners()
00546 {
00547   gtk_widget_set_sensitive(spinner_adjust_threshold, TRUE);
00548   gtk_widget_set_sensitive(spinner_adjust_offset, TRUE);
00549   gtk_widget_set_sensitive(spinner_adjust_gap, TRUE);
00550   gtk_widget_set_sensitive(threshold_label, TRUE);
00551   gtk_widget_set_sensitive(offset_label, TRUE);
00552   gtk_widget_set_sensitive(gap_label, TRUE);
00553 }
00554 
00556 void adjust_event(GtkToggleButton *adjust_mode, gpointer user_data)
00557 {
00558   //if it is toggled
00559   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(adjust_mode)))
00560   {
00561     if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(frame_mode)))
00562     {
00563       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode),TRUE);
00564     }
00565     enable_adjust_spinners();
00566   }
00567   else
00568   {
00569     //disable spinners
00570     disable_adjust_spinners();
00571   }
00572 
00573   save_preferences(NULL, NULL);
00574 }
00575 
00577 void frame_event(GtkToggleButton *frame_mode, gpointer user_data)
00578 {
00579   if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(frame_mode)))
00580   {
00581     if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(adjust_mode)))
00582     {
00583       gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode),FALSE);
00584     }
00585   }
00586 
00587   save_preferences(NULL, NULL);
00588 }
00589 
00590 void splitpoints_from_filename_event(GtkToggleButton *frame_mode, gpointer user_data)
00591 {
00592   gint splitpoints_from_filename = FALSE;
00593 
00594   if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(names_from_filename)))
00595   {
00596     splitpoints_from_filename = FALSE;
00597   }
00598   else
00599   {
00600     splitpoints_from_filename = TRUE;
00601   }
00602 
00603   if (splitpoints_from_filename == TRUE && file_browsed == TRUE)
00604   {
00605     copy_filename_to_current_description(inputfilename_get());
00606   }
00607   else
00608   {
00609     clear_current_description();
00610   }
00611 
00612   save_preferences(NULL, NULL);
00613 }
00614 
00616 void set_default_prefs_event(GtkWidget *widget, gpointer data)
00617 {
00618   //set frame mode inactive
00619   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(frame_mode), FALSE);
00620   //set adjust mode inactive
00621   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(adjust_mode), FALSE);
00622   //set adjust mode preferences
00623   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_threshold),
00624                             SPLT_DEFAULT_PARAM_THRESHOLD);
00625   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_offset),
00626                             SPLT_DEFAULT_PARAM_OFFSET);
00627   gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_adjust_gap),
00628                             SPLT_DEFAULT_PARAM_GAP);
00629   gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(names_from_filename), FALSE);
00630 
00631   save_preferences(NULL, NULL);
00632 }
00633 
00635 void song_dir_button_event(GtkWidget *widget, gpointer data)
00636 {
00637     outputdirectory_set("");
00638     save_preferences(NULL, NULL);
00639 }
00640 
00642 GtkWidget *create_directory_box()
00643 {
00644   GtkWidget *dir_hbox = gtk_hbox_new(FALSE, 0);
00645   
00646   //directory entry
00647   directory_entry = gtk_entry_new();
00648   gtk_editable_set_editable(GTK_EDITABLE(directory_entry), FALSE);
00649   gtk_box_pack_start(GTK_BOX(dir_hbox), directory_entry, TRUE, TRUE, 0);
00650   // Put the right text into the text box containing the output directory
00651   // name if this name was provided on command line
00652   if(outputdirectory_get()!=NULL)
00653     gtk_entry_set_text(GTK_ENTRY(directory_entry), outputdirectory_get());
00654   
00655   //browse dir button
00656   GtkWidget *browse_dir_button = (GtkWidget *)
00657     create_cool_button(GTK_STOCK_DIRECTORY,_("Br_owse dir"), FALSE);
00658   g_signal_connect(G_OBJECT(browse_dir_button), "clicked",
00659       G_CALLBACK(browse_dir_button_event), NULL);
00660   gtk_box_pack_start(GTK_BOX(dir_hbox), browse_dir_button, FALSE, FALSE, 8);
00661   
00662   //to set the directory for split files to the current song
00663   //directory
00664   GtkWidget *song_dir_button = (GtkWidget *)
00665     create_cool_button(GTK_STOCK_CLEAR, _("_Song dir"), FALSE);
00666   g_signal_connect(G_OBJECT(song_dir_button), "clicked",
00667       G_CALLBACK(song_dir_button_event), NULL);
00668   gtk_box_pack_start(GTK_BOX(dir_hbox), song_dir_button, FALSE, FALSE, 0);
00669 
00670   return wh_set_title_and_get_vbox(dir_hbox, _("<b>Directory for split files</b>"));
00671 }
00672 
00674 GtkWidget *create_split_options_box()
00675 {
00676   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
00677 
00678   //names from filename
00679   names_from_filename = gtk_check_button_new_with_mnemonic(_("_Splitpoint name from filename (testing)"));
00680   gtk_box_pack_start(GTK_BOX(vbox), names_from_filename, FALSE, FALSE, 0);
00681   g_signal_connect(G_OBJECT(names_from_filename), "toggled",
00682       G_CALLBACK(splitpoints_from_filename_event), NULL);
00683 
00684   create_dirs_from_output_files =
00685     gtk_check_button_new_with_mnemonic(_("_Create directories from filenames "));
00686   gtk_box_pack_start(GTK_BOX(vbox), create_dirs_from_output_files, FALSE, FALSE, 0);
00687   g_signal_connect(G_OBJECT(create_dirs_from_output_files), "toggled",
00688       G_CALLBACK(save_preferences), NULL);
00689 
00690   //frame mode option
00691   frame_mode = gtk_check_button_new_with_mnemonic(_("F_rame mode (useful"
00692         " for mp3 VBR) (mp3 only)"));
00693   gtk_box_pack_start(GTK_BOX(vbox), frame_mode, FALSE, FALSE, 0);
00694   g_signal_connect(G_OBJECT(frame_mode), "toggled",
00695       G_CALLBACK(frame_event), NULL);
00696 
00697   //auto adjust option
00698   adjust_mode = gtk_check_button_new_with_mnemonic(_("_Auto-adjust mode (uses"
00699         " silence detection to auto-adjust splitpoints)"));
00700   gtk_box_pack_start(GTK_BOX(vbox), adjust_mode, FALSE, FALSE, 0);
00701   g_signal_connect(G_OBJECT(adjust_mode), "toggled",
00702       G_CALLBACK(adjust_event), NULL);
00703   
00704   //parameters for the adjust option
00705   GtkWidget *horiz_fake = gtk_hbox_new(FALSE,0);
00706   gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 0);
00707   
00708   GtkWidget *param_vbox = gtk_vbox_new(FALSE,0);
00709   gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25);
00710   
00711   //threshold level
00712   horiz_fake = gtk_hbox_new(FALSE,0);
00713   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00714   
00715   threshold_label = gtk_label_new(_("Threshold level (dB):"));
00716   gtk_box_pack_start(GTK_BOX(horiz_fake), threshold_label, FALSE, FALSE, 0);
00717   
00718   GtkAdjustment *adj = (GtkAdjustment *) gtk_adjustment_new(0.0, -96.0, 0.0,
00719       0.5, 10.0, 0.0);
00720   spinner_adjust_threshold = gtk_spin_button_new (adj, 0.5, 2);
00721   g_signal_connect(G_OBJECT(spinner_adjust_threshold), "value_changed",
00722       G_CALLBACK(save_preferences), NULL);
00723   gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_adjust_threshold,
00724                       FALSE, FALSE, 6);
00725   
00726   //offset level
00727   horiz_fake = gtk_hbox_new(FALSE,0);
00728   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00729   
00730   offset_label = gtk_label_new(_("Cutpoint offset (0 is the begin of silence "
00731         "and 1 the end):"));
00732   gtk_box_pack_start(GTK_BOX(horiz_fake), offset_label, FALSE, FALSE, 0);
00733   
00734   //adjustement for the offset spinner
00735   adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -2, 2, 0.05, 10.0, 0.0);
00736   //the offset spinner
00737   spinner_adjust_offset = gtk_spin_button_new (adj, 0.05, 2);
00738   g_signal_connect(G_OBJECT(spinner_adjust_offset), "value_changed",
00739       G_CALLBACK(save_preferences), NULL);
00740   gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_adjust_offset,
00741       FALSE, FALSE, 6);
00742   
00743   //gap level (seconds)
00744   horiz_fake = gtk_hbox_new(FALSE,0);
00745   gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
00746   
00747   gap_label = gtk_label_new(_("Gap level (seconds around splitpoint to "
00748         "search for silence):"));
00749   gtk_box_pack_start(GTK_BOX(horiz_fake), gap_label, FALSE, FALSE, 0);
00750   
00751   adj = (GtkAdjustment *) gtk_adjustment_new(0.0, 0, 2000, 1.0, 10.0, 0.0);
00752   spinner_adjust_gap = gtk_spin_button_new (adj, 1, 0);
00753   g_signal_connect(G_OBJECT(spinner_adjust_gap), "value_changed",
00754       G_CALLBACK(save_preferences), NULL);
00755   gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_adjust_gap, FALSE, FALSE, 6);
00756   
00757   disable_adjust_spinners();
00758  
00759   //set default preferences button
00760   //horizontal box fake for the gap level
00761   horiz_fake = gtk_hbox_new(FALSE,0);
00762   gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 0);
00763   
00764   GtkWidget *set_default_prefs_button =
00765     (GtkWidget *)create_cool_button(GTK_STOCK_PREFERENCES,
00766         _("Set _default split" " options"),FALSE); 
00767   g_signal_connect(G_OBJECT(set_default_prefs_button), "clicked",
00768       G_CALLBACK(set_default_prefs_event), NULL);
00769   gtk_box_pack_start (GTK_BOX (horiz_fake), set_default_prefs_button,
00770                       FALSE, FALSE, 5);
00771 
00772   return wh_set_title_and_get_vbox(vbox, _("<b>Split options</b>"));
00773 }
00774 
00776 GtkWidget *create_pref_splitpoints_page()
00777 {
00778   GtkWidget *general_hbox = gtk_hbox_new(FALSE,0);
00779   GtkWidget *inside_hbox = gtk_hbox_new(FALSE,0);
00780   
00781   GtkWidget *scrolled_window = create_scrolled_window();
00782   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
00783                                         GTK_WIDGET(inside_hbox));
00784   gtk_box_pack_start(GTK_BOX(general_hbox), scrolled_window, TRUE, TRUE, 0);
00785  
00786   //vertical box inside the horizontal box from the scrolled window
00787   GtkWidget *inside_vbox = gtk_vbox_new(FALSE, 0);;
00788   gtk_box_pack_start(GTK_BOX(inside_hbox), inside_vbox, TRUE, TRUE, 10);
00789  
00790   GtkWidget *dir_box = create_directory_box();
00791   gtk_box_pack_start(GTK_BOX(inside_vbox), dir_box, FALSE, FALSE, 10);
00792 
00793   GtkWidget *split_options_box = create_split_options_box();
00794   gtk_box_pack_start(GTK_BOX(inside_vbox), split_options_box, FALSE, FALSE, 2);
00795  
00796   return general_hbox;
00797 }
00798 
00800 void player_combo_box_event(GtkComboBox *widget, gpointer data)
00801 {
00802   disconnect_button_event(NULL, NULL);
00803 
00804   selected_player = ch_get_active_value(widget);
00805 
00806   if (selected_player == PLAYER_GSTREAMER)
00807   {
00808     hide_connect_button();
00809   }
00810   else
00811   {
00812     show_connect_button();
00813   }
00814   
00815   gtk_widget_show(player_box);
00816   gtk_widget_show(queue_files_button);
00817 
00818   save_preferences(NULL, NULL);
00819 }
00820 
00822 GtkWidget *create_player_options_box()
00823 {
00824   GtkWidget *horiz_fake = gtk_hbox_new(FALSE,0);
00825 
00826   GtkWidget *label = gtk_label_new(_("Choose a player:"));
00827   gtk_box_pack_start(GTK_BOX(horiz_fake), label, FALSE, FALSE, 0);
00828 
00829   player_combo_box = GTK_WIDGET(ch_new_combo());
00830 
00831 #ifndef NO_AUDACIOUS
00832   ch_append_to_combo(GTK_COMBO_BOX(player_combo_box), "Audacious", PLAYER_AUDACIOUS);
00833 #endif
00834   ch_append_to_combo(GTK_COMBO_BOX(player_combo_box), "SnackAmp", PLAYER_SNACKAMP);
00835 #ifndef NO_GSTREAMER
00836   ch_append_to_combo(GTK_COMBO_BOX(player_combo_box), "GStreamer", PLAYER_GSTREAMER);
00837 #endif
00838 
00839   g_signal_connect(G_OBJECT(player_combo_box), "changed",
00840       G_CALLBACK(player_combo_box_event), NULL);
00841 
00842   gtk_box_pack_start(GTK_BOX(horiz_fake), player_combo_box, FALSE, FALSE, 12);
00843  
00844   return wh_set_title_and_get_vbox(horiz_fake, _("<b>Player options</b>"));
00845 }
00846 
00848 GtkWidget *create_pref_player_page()
00849 {
00850   GtkWidget *player_hbox = gtk_hbox_new(FALSE, 0);;
00851 
00852   GtkWidget *inside_hbox = gtk_hbox_new(FALSE, 0);;
00853   
00854   GtkWidget *scrolled_window = create_scrolled_window();
00855   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
00856                                         GTK_WIDGET(inside_hbox));
00857   gtk_box_pack_start(GTK_BOX(player_hbox), scrolled_window, TRUE, TRUE, 0);
00858   
00859   //vertical box inside the horizontal box from the scrolled window
00860   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);;
00861   gtk_box_pack_start(GTK_BOX(inside_hbox), vbox, TRUE, TRUE, 10);
00862   
00863   //choose player combo box
00864   GtkWidget *player_options_box = create_player_options_box();
00865   gtk_box_pack_start(GTK_BOX(vbox), player_options_box, FALSE, FALSE, 10);
00866  
00867   return player_hbox;
00868 }
00869 
00871 gboolean output_entry_event(GtkWidget *widget, GdkEventKey *event,
00872     gpointer user_data)
00873 {
00874   //we check if the output format is correct
00875   const char *data = gtk_entry_get_text(GTK_ENTRY(output_entry));
00876   gint error = SPLT_OUTPUT_FORMAT_OK;
00877   mp3splt_set_oformat(the_state, data, &error);
00878   remove_status_message();
00879   print_status_bar_confirmation(error);
00880 
00881   save_preferences(NULL, NULL);
00882   
00883   return FALSE;
00884 }
00885 
00887 GtkWidget *create_output_filename_box()
00888 {
00889   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
00890 
00891   //default/custom radio buttons
00892   radio_output = gtk_radio_button_new_with_label(NULL, _("Default format"));
00893   gtk_box_pack_start(GTK_BOX(vbox), radio_output, FALSE, FALSE, 0);
00894 
00895   radio_output = gtk_radio_button_new_with_label_from_widget
00896     (GTK_RADIO_BUTTON(radio_output), _("Custom format"));
00897   gtk_box_pack_start(GTK_BOX(vbox), radio_output, FALSE, FALSE, 0);
00898 
00899   //output entry
00900   GtkWidget *horiz_fake = gtk_hbox_new(FALSE,0);
00901   gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 5);
00902 
00903   output_entry = gtk_entry_new();
00904   gtk_editable_set_editable(GTK_EDITABLE(output_entry), TRUE);
00905   g_signal_connect(G_OBJECT(output_entry), "key_release_event",
00906       G_CALLBACK(output_entry_event), NULL);
00907   gtk_entry_set_max_length(GTK_ENTRY(output_entry),244);
00908   gtk_box_pack_start(GTK_BOX(horiz_fake), output_entry, TRUE, TRUE, 0);
00909 
00910   //output label
00911   horiz_fake = gtk_hbox_new(FALSE,0);
00912   gtk_box_pack_start(GTK_BOX(vbox), horiz_fake, FALSE, FALSE, 5);
00913   output_label = gtk_label_new(_("    @f - file name\n"
00914         "    @a - artist name\n"
00915         "    @p - performer of each song (does not"
00916         " always exist)\n"
00917         "    @b - album title\n"
00918         "    @t - song title\n"
00919         "    @g - genre\n"
00920         "    @n - track number"));
00921   gtk_box_pack_start(GTK_BOX(horiz_fake), output_label, FALSE, FALSE, 0);
00922 
00923   g_signal_connect(GTK_TOGGLE_BUTTON(radio_output),
00924       "toggled", G_CALLBACK(output_radio_box_event), output_label);
00925 
00926   return wh_set_title_and_get_vbox(vbox, _("<b>Output filename format</b>"));
00927 }
00928 
00930 GtkWidget *create_pref_output_page()
00931 {
00932   GtkWidget *output_hbox = gtk_hbox_new(FALSE, 0);;
00933   GtkWidget *output_inside_hbox = gtk_hbox_new(FALSE, 0);;
00934   
00935   GtkWidget *scrolled_window = create_scrolled_window();
00936   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
00937                                         GTK_WIDGET(output_inside_hbox));
00938   gtk_box_pack_start(GTK_BOX(output_hbox), scrolled_window, TRUE, TRUE, 0);
00939  
00940   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);;
00941   gtk_box_pack_start(GTK_BOX(output_inside_hbox), vbox, TRUE, TRUE, 10);
00942 
00943   GtkWidget *output_fname_box = create_output_filename_box();
00944   gtk_box_pack_start(GTK_BOX(vbox), output_fname_box, FALSE, FALSE, 10);
00945 
00946   return output_hbox;
00947 }
00948 
00949 void change_tags_options(GtkToggleButton *button, gpointer data)
00950 {
00951   if (extract_tags_box != NULL)
00952   {
00953     if (rh_get_active_value(tags_radio) == TAGS_FROM_FILENAME)
00954     {
00955       gtk_widget_set_sensitive(extract_tags_box, SPLT_TRUE);
00956     }
00957     else
00958     {
00959       gtk_widget_set_sensitive(extract_tags_box, SPLT_FALSE);
00960     }
00961   }
00962 
00963   save_preferences(NULL, NULL);
00964 }
00965 
00967 GtkWidget *create_tags_options_box()
00968 {
00969   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
00970 
00971   tags_radio = rh_append_radio_to_vbox(tags_radio, _("Original file tags"),
00972       ORIGINAL_FILE_TAGS, change_tags_options, vbox);
00973 
00974   tags_radio = rh_append_radio_to_vbox(tags_radio, _("Default tags (cddb or cue tags)"),
00975       DEFAULT_TAGS, change_tags_options, vbox);
00976 
00977   tags_radio = rh_append_radio_to_vbox(tags_radio, _("No tags"),
00978       NO_TAGS, change_tags_options, vbox);
00979 
00980   tags_radio = rh_append_radio_to_vbox(tags_radio, _("Extract tags from filename"),
00981       TAGS_FROM_FILENAME, change_tags_options, vbox);
00982 
00983   extract_tags_box = create_extract_tags_from_filename_options_box();
00984   gtk_widget_set_sensitive(extract_tags_box, SPLT_FALSE);
00985   gtk_box_pack_start(GTK_BOX(vbox), extract_tags_box, FALSE, FALSE, 2);
00986 
00987   return wh_set_title_and_get_vbox(vbox, _("<b>Split files tags</b>"));
00988 }
00989 
00990 static GtkComboBox *create_genre_combo()
00991 {
00992   GtkComboBox *combo = ch_new_combo();
00993 
00994   int i = 0;
00995   for (i = 0;i < SPLT_ID3V1_NUMBER_OF_GENRES;i++)
00996   {
00997     ch_append_to_combo(combo, splt_id3v1_genres[i], 0);
00998   }
00999 
01000   g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(save_preferences), NULL);
01001 
01002   return combo;
01003 }
01004 
01005 static GtkComboBox *create_text_preferences_combo()
01006 {
01007   GtkComboBox *combo = ch_new_combo();
01008 
01009   ch_append_to_combo(combo, _("No change"), SPLT_NO_CONVERSION);
01010   ch_append_to_combo(combo, _("lowercase"), SPLT_TO_LOWERCASE);
01011   ch_append_to_combo(combo, _("UPPERCASE"), SPLT_TO_UPPERCASE);
01012   ch_append_to_combo(combo, _("First uppercase"), SPLT_TO_FIRST_UPPERCASE);
01013   ch_append_to_combo(combo, _("Word Uppercase"), SPLT_TO_WORD_FIRST_UPPERCASE);
01014 
01015   g_signal_connect(G_OBJECT(combo), "changed", G_CALLBACK(save_preferences), NULL);
01016 
01017   return combo;
01018 }
01019 
01020 void test_regex_event(GtkWidget *widget, gpointer data)
01021 {
01022   put_tags_from_filename_regex_options();
01023   const gchar *test_regex_filename = gtk_entry_get_text(GTK_ENTRY(test_regex_fname_entry));
01024   mp3splt_set_filename_to_split(the_state, test_regex_filename);
01025 
01026   gint error = SPLT_OK;
01027   splt_tags *tags = mp3splt_parse_filename_regex(the_state, &error);
01028   print_status_bar_confirmation(error);
01029 
01030   if (error >= 0)
01031   {
01032     GString *regex_result = g_string_new(NULL);
01033 
01034     g_string_append(regex_result, _("<artist>: "));
01035     if (tags->artist)
01036     {
01037       g_string_append(regex_result, tags->artist);
01038     }
01039     g_string_append(regex_result, "\n");
01040 
01041     g_string_append(regex_result, _("<album>: "));
01042     if (tags->album)
01043     {
01044       g_string_append(regex_result, tags->album);
01045     }
01046     g_string_append(regex_result, "\n");
01047 
01048 
01049     g_string_append(regex_result, _("<title>: "));
01050     if (tags->title)
01051     {
01052       g_string_append(regex_result, tags->title);
01053     }
01054     g_string_append(regex_result, "\n");
01055 
01056     g_string_append(regex_result, _("<genre>: "));
01057     if (tags->genre)
01058     {
01059       g_string_append(regex_result, tags->genre);
01060     }
01061     g_string_append(regex_result, "\n");
01062 
01063     g_string_append(regex_result, _("<comment>: "));
01064     if (tags->comment)
01065     {
01066       g_string_append(regex_result, tags->comment);
01067     }
01068     g_string_append(regex_result, "\n");
01069 
01070     g_string_append(regex_result, _("<year>: "));
01071     if (tags->year)
01072     {
01073       g_string_append(regex_result, tags->year);
01074     }
01075     g_string_append(regex_result, "\n");
01076 
01077     g_string_append(regex_result, _("<track>: "));
01078     if (tags->track >= 0)
01079     {
01080       g_string_append_printf(regex_result, "%d", tags->track);
01081     }
01082 
01083     gchar *regex_result_text = g_string_free(regex_result, FALSE);
01084     if (regex_result_text)
01085     {
01086       gtk_label_set_text(GTK_LABEL(sample_result_label), regex_result_text);
01087       g_free(regex_result_text);
01088     }
01089   }
01090   else
01091   {
01092     gtk_label_set_text(GTK_LABEL(sample_result_label), "");
01093   }
01094 
01095   mp3splt_free_one_tag(tags);
01096 }
01097 
01098 static GtkWidget *create_extract_tags_from_filename_options_box()
01099 {
01100   GtkWidget *table = wh_new_table();
01101 
01102   regex_entry = wh_new_entry(save_preferences);
01103   wh_add_in_table_with_label_expand(table, _("Regular expression:"), regex_entry);
01104 
01105   GtkWidget *regex_label = gtk_label_new(_(
01106         "Above enter PERL-like regular expression using named subgroups.\nFollowing names are recognized:\n"
01107         "    (?<artist>)   - artist name\n"
01108         "    (?<album>)    - album title\n"
01109         "    (?<title>)    - track title\n"
01110         "    (?<tracknum>) - current track number\n"
01111         //"    (?<tracks>)   - total number of tracks\n"
01112         "    (?<year>)     - year of emission\n"
01113         "    (?<genre>)    - genre\n"
01114         "    (?<comment>)  - comment"));
01115   gtk_misc_set_alignment(GTK_MISC(regex_label), 0.0, 0.5);
01116   wh_add_in_table(table, wh_put_in_new_hbox_with_margin_level(regex_label, 2));
01117 
01118   text_options_list =
01119     g_list_append(text_options_list, GINT_TO_POINTER(SPLT_NO_CONVERSION));
01120   text_options_list = 
01121     g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_LOWERCASE));
01122   text_options_list = 
01123     g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_UPPERCASE));
01124   text_options_list =
01125     g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_FIRST_UPPERCASE));
01126   text_options_list =
01127     g_list_append(text_options_list, GINT_TO_POINTER(SPLT_TO_WORD_FIRST_UPPERCASE));
01128 
01129   replace_underscore_by_space_check_box =
01130     gtk_check_button_new_with_mnemonic(_("_Replace underscores by spaces"));
01131   g_signal_connect(G_OBJECT(replace_underscore_by_space_check_box), "toggled",
01132       G_CALLBACK(save_preferences), NULL);
01133  
01134   wh_add_in_table(table, replace_underscore_by_space_check_box);
01135 
01136   artist_text_properties_combo = create_text_preferences_combo();
01137   wh_add_in_table_with_label(table, 
01138       _("Artist text properties:"), GTK_WIDGET(artist_text_properties_combo));
01139 
01140   album_text_properties_combo = create_text_preferences_combo();
01141   wh_add_in_table_with_label(table,
01142       _("Album text properties:"), GTK_WIDGET(album_text_properties_combo));
01143 
01144   title_text_properties_combo = create_text_preferences_combo();
01145   wh_add_in_table_with_label(table,
01146       _("Title text properties:"), GTK_WIDGET(title_text_properties_combo));
01147 
01148   comment_text_properties_combo = create_text_preferences_combo();
01149   wh_add_in_table_with_label(table,
01150       _("Comment text properties:"), GTK_WIDGET(comment_text_properties_combo));
01151 
01152   genre_combo = create_genre_combo();
01153   wh_add_in_table_with_label(table, _("Genre tag:"), GTK_WIDGET(genre_combo));
01154 
01155   comment_tag_entry = wh_new_entry(save_preferences);
01156   wh_add_in_table_with_label_expand(table, _("Comment tag:"), comment_tag_entry);
01157 
01158   GtkWidget *test_regex_expander = gtk_expander_new(_("Regular expression test"));
01159   gtk_container_add(GTK_CONTAINER(test_regex_expander), create_test_regex_table());
01160   wh_add_in_table(table, test_regex_expander);
01161 
01162   return wh_put_in_new_hbox_with_margin_level(GTK_WIDGET(table), 3);
01163 }
01164 
01165 static GtkWidget *create_test_regex_table()
01166 {
01167   GtkWidget *table = wh_new_table();
01168 
01169   GtkWidget *sample_test_hbox = gtk_hbox_new(FALSE, 0);
01170   test_regex_fname_entry = wh_new_entry(save_preferences);
01171   gtk_box_pack_start(GTK_BOX(sample_test_hbox), test_regex_fname_entry, TRUE, TRUE, 0);
01172 
01173   GtkWidget *test_regex_button = wh_new_button(_("_Test"));
01174   gtk_box_pack_start(GTK_BOX(sample_test_hbox), test_regex_button, FALSE, FALSE, 5);
01175   g_signal_connect(G_OBJECT(test_regex_button), "clicked",
01176       G_CALLBACK(test_regex_event), NULL);
01177 
01178   wh_add_in_table_with_label_expand(table, _("Sample filename:"), sample_test_hbox);
01179 
01180   sample_result_label = gtk_label_new("");
01181   gtk_misc_set_alignment(GTK_MISC(sample_result_label), 0.0, 0.5);
01182   wh_add_in_table_with_label_expand(table, _("Sample result:"), sample_result_label);
01183 
01184   return wh_put_in_new_hbox_with_margin_level(GTK_WIDGET(table), 3);
01185 }
01186 
01188 GtkWidget *create_tags_version_box()
01189 {
01190   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
01191 
01192   tags_version_radio = 
01193     gtk_radio_button_new_with_label(NULL, _("ID3v1 & ID3v2 tags"));
01194   gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0);
01195   g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 
01196       G_CALLBACK(save_preferences), NULL);
01197 
01198   tags_version_radio = 
01199     gtk_radio_button_new_with_label_from_widget
01200     (GTK_RADIO_BUTTON(tags_version_radio), _("ID3v2 tags"));
01201   gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0);
01202   g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 
01203       G_CALLBACK(save_preferences), NULL);
01204 
01205   tags_version_radio = gtk_radio_button_new_with_label_from_widget
01206     (GTK_RADIO_BUTTON(tags_version_radio), _("ID3v1 tags"));
01207   g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 
01208       G_CALLBACK(save_preferences), NULL);
01209   gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0);
01210 
01211   tags_version_radio = gtk_radio_button_new_with_label_from_widget
01212     (GTK_RADIO_BUTTON (tags_version_radio),_("Same tags version as the input file"));
01213   g_signal_connect(GTK_TOGGLE_BUTTON(tags_version_radio), "toggled", 
01214       G_CALLBACK(save_preferences), NULL);
01215   gtk_box_pack_start(GTK_BOX(vbox), tags_version_radio, FALSE, FALSE, 0);
01216 
01217   return wh_set_title_and_get_vbox(vbox, _("<b>Tags version (mp3 only)</b>"));
01218 }
01219 
01221 GtkWidget *create_pref_tags_page()
01222 {
01223   GtkWidget *outside_vbox = gtk_vbox_new(FALSE, 0);;
01224   GtkWidget *inside_hbox = gtk_hbox_new(FALSE, 0);
01225 
01226   GtkWidget *scrolled_window = create_scrolled_window();
01227   gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 
01228                                         GTK_WIDGET(inside_hbox));
01229   gtk_box_pack_start(GTK_BOX(outside_vbox), scrolled_window, TRUE, TRUE, 0);
01230 
01231   GtkWidget *vbox = gtk_vbox_new(FALSE, 0);;
01232   gtk_box_pack_start(GTK_BOX(inside_hbox), vbox, TRUE, TRUE, 10);
01233 
01234   GtkWidget *tags_version_box = create_tags_version_box();
01235   gtk_box_pack_start(GTK_BOX(vbox), tags_version_box, FALSE, FALSE, 10);
01236 
01237   GtkWidget *tags_opts_box = create_tags_options_box();
01238   gtk_box_pack_start(GTK_BOX(vbox), tags_opts_box, FALSE, FALSE, 0);
01239   
01240   return outside_vbox;
01241 }
01242 
01244 GtkWidget *create_choose_preferences()
01245 {
01246   //our preferences vbox
01247   GtkWidget *pref_vbox = gtk_vbox_new(FALSE, 0);
01248 
01249   GtkWidget *notebook = gtk_notebook_new();
01250   gtk_box_pack_start(GTK_BOX(pref_vbox), notebook, TRUE, TRUE, 0);
01251   
01252   gtk_notebook_popup_enable(GTK_NOTEBOOK(notebook));
01253   gtk_notebook_set_show_tabs(GTK_NOTEBOOK(notebook), TRUE);
01254   gtk_notebook_set_show_border(GTK_NOTEBOOK(notebook), FALSE);
01255   gtk_notebook_set_scrollable(GTK_NOTEBOOK(notebook), TRUE);
01256   
01257   /* split preferences */
01258   GtkWidget *splitpoints_prefs = (GtkWidget *)create_pref_splitpoints_page();
01259   GtkWidget *notebook_label = gtk_label_new(_("Split"));
01260   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), splitpoints_prefs,
01261                            (GtkWidget *)notebook_label);
01262 
01263   /* tags preferences */
01264   GtkWidget *tags_prefs = (GtkWidget *)create_pref_tags_page();
01265   notebook_label = gtk_label_new(_("Tags"));
01266   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), tags_prefs,
01267                            (GtkWidget *)notebook_label);
01268 
01269   /* output preferences */
01270   GtkWidget *output_prefs = (GtkWidget *)create_pref_output_page();
01271   notebook_label = gtk_label_new(_("Output"));
01272   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), output_prefs,
01273                            (GtkWidget *)notebook_label);
01274   
01275   /* player preferences */
01276   GtkWidget *player_prefs = (GtkWidget *)create_pref_player_page();
01277   notebook_label = gtk_label_new(_("Player"));
01278   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), player_prefs,
01279                            (GtkWidget *)notebook_label);
01280 
01281   /* language preferences page */
01282 #ifdef __WIN32__
01283   GtkWidget *language_prefs = (GtkWidget *)create_pref_language_page();
01284   notebook_label = gtk_label_new(_("Language"));
01285   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), language_prefs,
01286                            (GtkWidget *)notebook_label);
01287 #endif
01288   
01289   return pref_vbox;
01290 }