mp3splt-gtk
split_mode_window.c
Go to the documentation of this file.
1 /**********************************************************
2  *
3  * mp3splt-gtk -- utility based on mp3splt,
4  * for mp3/ogg splitting without decoding
5  *
6  * Copyright: (C) 2005-2012 Alexandru Munteanu
7  * Contact: io_fx@yahoo.fr
8  *
9  * http://mp3splt.sourceforge.net/
10  *
11  *********************************************************/
12 
13 /**********************************************************
14  *
15  * This program is free software; you can redistribute it and/or
16  * modify it under the terms of the GNU General Public License
17  * as published by the Free Software Foundation; either version 2
18  * of the License, or (at your option) any later version.
19  *
20  * This program is distributed in the hope that it will be useful,
21  * but WITHOUT ANY WARRANTY; without even the implied warranty of
22  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23  * GNU General Public License for more details.
24  *
25  * You should have received a copy of the GNU General Public License
26  * along with this program; if not, write to the Free Software
27  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
28  * USA.
29  *
30  *********************************************************/
31 
32 /*!********************************************************
33  * \file
34  * The batch processing tab
35  *
36  * this file is for the special split tab, where automatic
37  * split modes can be selected
38  *..*******************************************************/
39 
40 #include "split_mode_window.h"
41 
43 static gint get_selected_split_mode(GtkToggleButton *radio_b)
44 {
45  GSList *radio_button_list = gtk_radio_button_get_group(GTK_RADIO_BUTTON(radio_b));
46 
47  gint i = 0;
48  for(i = 0; i < NUMBER_OF_SPLIT_MODES;i++)
49  {
50  GtkToggleButton *test = (GtkToggleButton *) g_slist_nth_data(radio_button_list,i);
51  if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(test)))
52  {
53  return GPOINTER_TO_INT(g_object_get_data(G_OBJECT(test), "split_type_id"));
54  }
55  }
56 
57  return SELECTED_SPLIT_NORMAL;
58 }
59 
61 void select_split_mode(int split_mode, ui_state *ui)
62 {
63  GSList *split_mode_radio_button_list =
64  gtk_radio_button_get_group(GTK_RADIO_BUTTON(ui->gui->split_mode_radio_button));
65 
66  gint i = 0;
67  for(i = 0; i < NUMBER_OF_SPLIT_MODES;i++)
68  {
69  GtkToggleButton *test = (GtkToggleButton *) g_slist_nth_data(split_mode_radio_button_list, i);
70  int id = GPOINTER_TO_INT(g_object_get_data(G_OBJECT(test), "split_type_id"));
71  if (split_mode == id)
72  {
73  gtk_toggle_button_set_active(test, TRUE);
74  return;
75  }
76  }
77 }
78 
79 gint get_selected_split_mode_safe(ui_state *ui)
80 {
81  lock_mutex(&ui->variables_mutex);
82  gint selected_split_mode = ui->status->selected_split_mode;
83  unlock_mutex(&ui->variables_mutex);
84  return selected_split_mode;
85 }
86 
87 void set_selected_split_mode_safe(gint value, ui_state *ui)
88 {
89  lock_mutex(&ui->variables_mutex);
90  ui->status->selected_split_mode = value;
91  unlock_mutex(&ui->variables_mutex);
92 }
93 
94 static void deactivate_silence_parameters(gui_state *gui)
95 {
96  gtk_widget_set_sensitive(gui->all_spinner_silence_number_tracks, FALSE);
97  gtk_widget_set_sensitive(gui->all_spinner_silence_minimum, FALSE);
98  gtk_widget_set_sensitive(gui->all_spinner_track_minimum, FALSE);
99  gtk_widget_set_sensitive(gui->all_spinner_silence_offset, FALSE);
100  gtk_widget_set_sensitive(gui->all_spinner_silence_threshold, FALSE);
101  gtk_widget_set_sensitive(gui->all_silence_remove_silence, FALSE);
102  gtk_widget_set_sensitive(gui->all_threshold_label, FALSE);
103  gtk_widget_set_sensitive(gui->all_offset_label, FALSE);
104  gtk_widget_set_sensitive(gui->all_number_of_tracks_label, FALSE);
105  gtk_widget_set_sensitive(gui->all_min_silence_label, FALSE);
106  gtk_widget_set_sensitive(gui->all_min_track_label, FALSE);
107 }
108 
109 static void activate_silence_parameters(gui_state *gui)
110 {
111  gtk_widget_set_sensitive(gui->all_spinner_silence_number_tracks, TRUE);
112  gtk_widget_set_sensitive(gui->all_spinner_silence_minimum, TRUE);
113  gtk_widget_set_sensitive(gui->all_spinner_track_minimum, TRUE);
114  gtk_widget_set_sensitive(gui->all_spinner_silence_offset, TRUE);
115  gtk_widget_set_sensitive(gui->all_spinner_silence_threshold, TRUE);
116  gtk_widget_set_sensitive(gui->all_silence_remove_silence, TRUE);
117  gtk_widget_set_sensitive(gui->all_threshold_label, TRUE);
118  gtk_widget_set_sensitive(gui->all_offset_label, TRUE);
119  gtk_widget_set_sensitive(gui->all_number_of_tracks_label, TRUE);
120  gtk_widget_set_sensitive(gui->all_min_silence_label, TRUE);
121  gtk_widget_set_sensitive(gui->all_min_track_label, TRUE);
122 }
123 
124 static void deactivate_trim_parameters(gui_state *gui)
125 {
126  gtk_widget_set_sensitive(gui->all_spinner_trim_silence_threshold, FALSE);
127  gtk_widget_set_sensitive(gui->all_trim_threshold_label, FALSE);
128 }
129 
130 static void activate_trim_parameters(gui_state *gui)
131 {
132  gtk_widget_set_sensitive(gui->all_spinner_trim_silence_threshold, TRUE);
133  gtk_widget_set_sensitive(gui->all_trim_threshold_label, TRUE);
134 }
135 
137 static void split_mode_changed(GtkToggleButton *radio_b, ui_state *ui)
138 {
139  gint selected_split_mode = get_selected_split_mode(radio_b);
140  set_selected_split_mode_safe(selected_split_mode, ui);
141 
142  int enable_time = (selected_split_mode == SELECTED_SPLIT_TIME);
143  gtk_widget_set_sensitive(ui->gui->spinner_time, enable_time);
144  gtk_widget_set_sensitive(ui->gui->time_label, enable_time);
145  gtk_widget_set_sensitive(ui->gui->time_label_after, enable_time);
146 
147  int enable_split_equal_time = (selected_split_mode == SELECTED_SPLIT_EQUAL_TIME_TRACKS);
148  gtk_widget_set_sensitive(ui->gui->spinner_equal_tracks, enable_split_equal_time);
149  gtk_widget_set_sensitive(ui->gui->equal_tracks_label, enable_split_equal_time);
150  gtk_widget_set_sensitive(ui->gui->equal_tracks_label_after, enable_split_equal_time);
151 
152  if (selected_split_mode == SELECTED_SPLIT_SILENCE)
153  {
154  activate_silence_parameters(ui->gui);
155  }
156  else
157  {
158  deactivate_silence_parameters(ui->gui);
159  }
160 
161  if (selected_split_mode == SELECTED_SPLIT_TRIM_SILENCE)
162  {
163  activate_trim_parameters(ui->gui);
164  }
165  else
166  {
167  deactivate_trim_parameters(ui->gui);
168  }
169 
170  ui_save_preferences(NULL, ui);
171 }
172 
174 static void spinner_time_changed(GtkSpinButton *spinner, ui_state *ui)
175 {
176  ui_save_preferences(NULL, ui);
177 }
178 
180 static void spinner_equal_tracks_changed(GtkSpinButton *spinner, ui_state *ui)
181 {
182  ui_save_preferences(NULL, ui);
183 }
184 
186 static GtkWidget *create_split_mode(ui_state *ui)
187 {
188  GtkWidget *local_vbox = wh_vbox_new();
189  gtk_container_set_border_width(GTK_CONTAINER(local_vbox), 3);
190 
191  //normal split
192  GtkWidget *split_mode_radio_button =
193  gtk_radio_button_new_with_label(NULL, _("Use manual single file splitpoints"));
194  ui->gui->split_mode_radio_button = split_mode_radio_button;
195  gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
196  g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button),
197  "toggled", G_CALLBACK(split_mode_changed), ui);
198  g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
199  GINT_TO_POINTER(SELECTED_SPLIT_NORMAL));
200 
201  //time split
202  split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
203  (GTK_RADIO_BUTTON(split_mode_radio_button), _("Time"));
204  ui->gui->split_mode_radio_button = split_mode_radio_button;
205  gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
206  g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
207  G_CALLBACK(split_mode_changed), ui);
208  g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
209  GINT_TO_POINTER(SELECTED_SPLIT_TIME));
210 
211  //
212  GtkWidget *big_horiz_fake = wh_hbox_new();
213  gtk_box_pack_start(GTK_BOX(local_vbox), big_horiz_fake, FALSE, FALSE, 0);
214 
215  GtkWidget *horiz_fake = wh_hbox_new();
216  gtk_box_pack_start(GTK_BOX(big_horiz_fake), horiz_fake, FALSE, FALSE, 25);
217 
218  gint default_time = 60;
219 
220  GtkWidget *time_label = gtk_label_new(_("Split every"));
221  ui->gui->time_label = time_label;
222  gtk_box_pack_start(GTK_BOX(horiz_fake), time_label, FALSE, FALSE, 0);
223 
224  GtkAdjustment *adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 1, 2000, 1.0, 10.0, 0.0);
225  GtkWidget *spinner_time = gtk_spin_button_new(adj, 1, 0);
226  ui->gui->spinner_time = spinner_time;
227  gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_time, FALSE, FALSE, 6);
228  gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_time), default_time);
229  gtk_widget_set_sensitive(GTK_WIDGET(spinner_time), FALSE);
230  gtk_widget_set_sensitive(time_label, FALSE);
231  g_signal_connect(G_OBJECT(spinner_time), "value-changed", G_CALLBACK(spinner_time_changed), ui);
232 
233  GtkWidget *time_label_after = gtk_label_new(_("seconds."));
234  ui->gui->time_label_after = time_label_after;
235  gtk_box_pack_start(GTK_BOX(horiz_fake), time_label_after, FALSE, FALSE, 0);
236  gtk_widget_set_sensitive(time_label_after, FALSE);
237 
238  //split in equal length
239  split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
240  (GTK_RADIO_BUTTON(split_mode_radio_button), _("Equal time tracks"));
241  ui->gui->split_mode_radio_button = split_mode_radio_button;
242  gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
243  g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
244  G_CALLBACK(split_mode_changed), ui);
245  g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
246  GINT_TO_POINTER(SELECTED_SPLIT_EQUAL_TIME_TRACKS));
247 
248  //
249  big_horiz_fake = wh_hbox_new();
250  gtk_box_pack_start(GTK_BOX(local_vbox), big_horiz_fake, FALSE, FALSE, 0);
251 
252  horiz_fake = wh_hbox_new();
253  gtk_box_pack_start(GTK_BOX(big_horiz_fake), horiz_fake, FALSE, FALSE, 25);
254 
255  gint default_tracks = 10;
256 
257  GtkWidget *equal_tracks_label = gtk_label_new(_("Split in"));
258  ui->gui->equal_tracks_label = equal_tracks_label;
259  gtk_box_pack_start(GTK_BOX(horiz_fake), equal_tracks_label, FALSE, FALSE, 0);
260 
261  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 1, 2000, 1.0, 10.0, 0.0);
262  GtkWidget *spinner_equal_tracks = gtk_spin_button_new(adj, 1, 0);
263  ui->gui->spinner_equal_tracks = spinner_equal_tracks;
264  gtk_box_pack_start(GTK_BOX(horiz_fake), spinner_equal_tracks, FALSE, FALSE, 6);
265  gtk_spin_button_set_value(GTK_SPIN_BUTTON(spinner_equal_tracks), default_time);
266  gtk_widget_set_sensitive(GTK_WIDGET(spinner_equal_tracks), FALSE);
267  gtk_widget_set_sensitive(equal_tracks_label, FALSE);
268  g_signal_connect(G_OBJECT(spinner_equal_tracks), "value-changed",
269  G_CALLBACK(spinner_equal_tracks_changed), ui);
270 
271  GtkWidget *equal_tracks_label_after = gtk_label_new(_("equal tracks."));
272  ui->gui->equal_tracks_label_after = equal_tracks_label_after;
273  gtk_box_pack_start(GTK_BOX(horiz_fake), equal_tracks_label_after, FALSE, FALSE, 0);
274  gtk_widget_set_sensitive(equal_tracks_label_after, FALSE);
275 
276  //trim using silence detection
277  split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
278  (GTK_RADIO_BUTTON(split_mode_radio_button), _("Trim using silence detection"));
279  ui->gui->split_mode_radio_button = split_mode_radio_button;
280  gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
281  g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
282  G_CALLBACK(split_mode_changed), ui);
283  g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
284  GINT_TO_POINTER(SELECTED_SPLIT_TRIM_SILENCE));
285 
286  horiz_fake = wh_hbox_new();
287  gtk_box_pack_start(GTK_BOX(local_vbox), horiz_fake, FALSE, FALSE, 0);
288 
289  GtkWidget *param_vbox = wh_vbox_new();
290  gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25);
291 
292  horiz_fake = wh_hbox_new();
293  gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
294 
295  GtkWidget *all_trim_threshold_label = gtk_label_new(_("Threshold level (dB) : "));
296  ui->gui->all_trim_threshold_label = all_trim_threshold_label;
297  gtk_box_pack_start(GTK_BOX(horiz_fake), all_trim_threshold_label, FALSE, FALSE, 0);
298 
299  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -96.0, 0.0, 0.5, 10.0, 0.0);
300  GtkWidget *all_spinner_trim_silence_threshold = gtk_spin_button_new(adj, 0.5, 2);
301  ui->gui->all_spinner_trim_silence_threshold = all_spinner_trim_silence_threshold;
302  gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_trim_silence_threshold, FALSE, FALSE, 0);
303 
304  //silence split
305  split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
306  (GTK_RADIO_BUTTON(split_mode_radio_button), _("Silence - split with silence detection"));
307  ui->gui->split_mode_radio_button = split_mode_radio_button;
308  gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
309  g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
310  G_CALLBACK(split_mode_changed), ui);
311  g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
312  GINT_TO_POINTER(SELECTED_SPLIT_SILENCE));
313 
314  horiz_fake = wh_hbox_new();
315  gtk_box_pack_start(GTK_BOX(local_vbox), horiz_fake, FALSE, FALSE, 0);
316 
317  param_vbox = wh_vbox_new();
318  gtk_box_pack_start(GTK_BOX(horiz_fake), param_vbox, FALSE, FALSE, 25);
319 
320  horiz_fake = wh_hbox_new();
321  gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
322 
323  GtkWidget *all_threshold_label = gtk_label_new(_("Threshold level (dB) : "));
324  ui->gui->all_threshold_label = all_threshold_label;
325  gtk_box_pack_start(GTK_BOX(horiz_fake), all_threshold_label, FALSE, FALSE, 0);
326 
327  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -96.0, 0.0, 0.5, 10.0, 0.0);
328  GtkWidget *all_spinner_silence_threshold = gtk_spin_button_new(adj, 0.5, 2);
329  ui->gui->all_spinner_silence_threshold = all_spinner_silence_threshold;
330  gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_threshold, FALSE, FALSE, 0);
331 
332  horiz_fake = wh_hbox_new();
333  gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
334 
335  GtkWidget *all_offset_label = gtk_label_new(_("Cutpoint offset (0 is the begin of silence,and 1 the end) : "));
336  ui->gui->all_offset_label = all_offset_label;
337  gtk_box_pack_start(GTK_BOX(horiz_fake), all_offset_label, FALSE, FALSE, 0);
338 
339  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, -2, 2, 0.05, 10.0, 0.0);
340  GtkWidget *all_spinner_silence_offset = gtk_spin_button_new(adj, 0.05, 2);
341  ui->gui->all_spinner_silence_offset = all_spinner_silence_offset;
342  gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_offset, FALSE, FALSE, 0);
343 
344  horiz_fake = wh_hbox_new();
345  gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
346 
347  GtkWidget *all_number_of_tracks_label = gtk_label_new(_("Number of tracks (0 means all tracks) : "));
348  ui->gui->all_number_of_tracks_label = all_number_of_tracks_label;
349  gtk_box_pack_start(GTK_BOX(horiz_fake), all_number_of_tracks_label, FALSE, FALSE, 0);
350 
351  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 1, 10.0, 0.0);
352  GtkWidget *all_spinner_silence_number_tracks = gtk_spin_button_new(adj, 1, 0);
353  ui->gui->all_spinner_silence_number_tracks = all_spinner_silence_number_tracks;
354  gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_number_tracks, FALSE, FALSE, 0);
355 
356  horiz_fake = wh_hbox_new();
357  gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
358 
359  GtkWidget *all_min_silence_label = gtk_label_new(_("Minimum silence length (seconds) : "));
360  ui->gui->all_min_silence_label = all_min_silence_label;
361  gtk_box_pack_start(GTK_BOX(horiz_fake), all_min_silence_label, FALSE, FALSE, 0);
362 
363  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 0.5, 10.0, 0.0);
364  GtkWidget *all_spinner_silence_minimum = gtk_spin_button_new(adj, 1, 2);
365  ui->gui->all_spinner_silence_minimum = all_spinner_silence_minimum;
366  gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_silence_minimum, FALSE, FALSE, 0);
367 
368  horiz_fake = wh_hbox_new();
369  gtk_box_pack_start(GTK_BOX(param_vbox), horiz_fake, FALSE, FALSE, 0);
370 
371  GtkWidget *all_min_track_label = gtk_label_new(_("Minimum track length (seconds) : "));
372  ui->gui->all_min_track_label = all_min_track_label;
373  gtk_box_pack_start(GTK_BOX(horiz_fake), all_min_track_label, FALSE, FALSE, 0);
374 
375  adj = (GtkAdjustment *)gtk_adjustment_new(0.0, 0, 2000, 0.5, 10.0, 0.0);
376  GtkWidget *all_spinner_track_minimum = gtk_spin_button_new(adj, 1, 2);
377  ui->gui->all_spinner_track_minimum = all_spinner_track_minimum;
378  gtk_box_pack_start(GTK_BOX(horiz_fake), all_spinner_track_minimum, FALSE, FALSE, 0);
379 
380  GtkWidget *all_silence_remove_silence =
381  gtk_check_button_new_with_label(_("Remove silence between tracks"));
382  ui->gui->all_silence_remove_silence = all_silence_remove_silence;
383  gtk_box_pack_start(GTK_BOX(param_vbox), all_silence_remove_silence, FALSE, FALSE, 0);
384 
385  gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_number_tracks),
387  gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_minimum),
389  gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_offset),
391  gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_silence_threshold),
393  gtk_spin_button_set_value(GTK_SPIN_BUTTON(all_spinner_trim_silence_threshold),
395 
396  deactivate_silence_parameters(ui->gui);
397  deactivate_trim_parameters(ui->gui);
398 
399  //wrap split
400  split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
401  (GTK_RADIO_BUTTON(split_mode_radio_button),
402  _("Wrap - split files created with mp3wrap or albumwrap (mp3 only)"));
403  ui->gui->split_mode_radio_button = split_mode_radio_button;
404  gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
405  g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
406  G_CALLBACK(split_mode_changed), ui);
407  g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
408  GINT_TO_POINTER(SELECTED_SPLIT_WRAP));
409 
410  //error mode split
411  split_mode_radio_button = gtk_radio_button_new_with_label_from_widget
412  (GTK_RADIO_BUTTON(split_mode_radio_button), _("Error mode (mp3 only)"));
413  ui->gui->split_mode_radio_button = split_mode_radio_button;
414  gtk_box_pack_start(GTK_BOX(local_vbox), split_mode_radio_button, FALSE, FALSE, 2);
415  g_signal_connect(GTK_TOGGLE_BUTTON(split_mode_radio_button), "toggled",
416  G_CALLBACK(split_mode_changed), ui);
417  g_object_set_data(G_OBJECT(split_mode_radio_button), "split_type_id",
418  GINT_TO_POINTER(SELECTED_SPLIT_ERROR));
419 
420  select_split_mode(SELECTED_SPLIT_NORMAL, ui);
421 
422  GtkWidget *scrolled_window = wh_create_scrolled_window();
423  gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
424  GTK_WIDGET(local_vbox));
425 
426  return scrolled_window;
427 }
428 
430 static GtkWidget *create_single_multiple_split_modes(ui_state *ui)
431 {
432  GtkWidget *local_vbox = wh_vbox_new();
433  gtk_container_set_border_width(GTK_CONTAINER(local_vbox), 0);
434 
435  GtkWidget *multiple_files_hbox = wh_hbox_new();
436  gtk_box_pack_start(GTK_BOX(local_vbox), multiple_files_hbox, TRUE, TRUE, 0);
437 
438  GtkWidget *multiple_files_component = create_multiple_files_component(ui);
439  gtk_box_pack_start(GTK_BOX(multiple_files_hbox), multiple_files_component, TRUE, TRUE, 0);
440  ui->gui->multiple_files_component = multiple_files_component;
441 
442  GtkWidget *scrolled_window = wh_create_scrolled_window();
443  gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window),
444  GTK_WIDGET(local_vbox));
445 
446  return scrolled_window;
447 }
448 
451 {
452  GtkWidget *vbox = wh_vbox_new();;
453 
454 #if GTK_MAJOR_VERSION <= 2
455  GtkWidget *paned_widget = gtk_vpaned_new();
456 #else
457  GtkWidget *paned_widget = gtk_paned_new(GTK_ORIENTATION_VERTICAL);
458 #endif
459 
460  gtk_box_pack_start(GTK_BOX(vbox), paned_widget, TRUE, TRUE, 0);
461 
462  gtk_paned_add1(GTK_PANED(paned_widget), create_single_multiple_split_modes(ui));
463  gtk_paned_add2(GTK_PANED(paned_widget), create_split_mode(ui));
464 
465  gtk_paned_set_position(GTK_PANED(paned_widget), 150);
466 
467  return vbox;
468 }
469