1 
2 /*
3  *  Ump - Unnamed Math Program
4  *  Copyright (c) 2004-2006 by Mattias Hultgren <mattias_hultgren@tele2.se>
5  *
6  *  See main.cpp
7  */
8 
9 #include <gtk/gtk.h>
10 #include "math2.h"
11 #include "picture.h"
12 #include "picture2gtk.h"
13 #include "main.h"
14 #include "ump_prefwin.h"
15 #include "ump_picturewin.h"
16 
17 
18 GtkWidget *prefwin = 0;
19 GtkWidget *pref_format_spinner, *pref_format_trailing, *pref_format_type[3], *pref_snap_size;
20 GtkWidget *pref_general_language, *pref_general_start_window;
21 
22 struct UMP_prefwin_pref
23 {
24 	GtkWidget *notebook;
25 
26 	GtkWidget *general_translation_label, *general_start_window_label;
27 
28 	GtkWidget *format_max_decimals_label, *format_frame_decimals, *format_frame_fractions,
29 	          *format_frame_frac_show_as;
30 	GtkWidget *format_fraction_type[3];
31 
32 	GtkWidget *auto_add, *auto_remove, *auto_up, *auto_down, *auto_treeview;
33 	GtkTreeViewColumn *auto_column;
34 	GtkListStore *auto_list_store;
35 
36 	GtkWidget *snap_size_label, *snap_frame;
37 
38 	GtkWidget *button_ok_label;
39 }pref;
40 
41 enum { AUTO_COLUMN_PATH, AUTO_N_COLUMNS };
42 
43 
44 
prefwin_ok(void)45 void prefwin_ok(void)
46 {
47 	if( language_filename != gtk_entry_get_text(GTK_ENTRY(GTK_BIN(pref_general_language)->child)) )
48 		update_translation( gtk_entry_get_text(GTK_ENTRY(GTK_BIN(pref_general_language)->child)) );
49 
50 	format.set_max_decimals( gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(pref_format_spinner)) );
51 	format.set_mixed_limits( 1e-6, 1e9 );
52 
53 	format.show_trailingzeros =
54 	  ( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pref_format_trailing)) == TRUE );
55 
56 	for(int i=0;i<3;i++)
57 	{
58 		if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pref_format_type[i])) == TRUE)
59 			format.set_type( FormatType(i) );
60 
61 		if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(pref.format_fraction_type[i])) == TRUE)
62 			format.set_fraction_type( FormatFractionType(i) );
63 	}
64 
65 	switch(gtk_combo_box_get_active(GTK_COMBO_BOX(pref_general_start_window)))
66 	{
67 	case 0:
68 		default_start_window = "Simple";
69 		break;
70 	case 1:
71 		default_start_window = "Advanced";
72 		break;
73 	case 2:
74 		default_start_window = "Editor";
75 		break;
76 	case 3:
77 		default_start_window = "Graphtool";
78 		break;
79 	case 4:
80 		default_start_window = "MatrixEditor";
81 		break;
82 	}
83 	SNAP_SIZE = gtk_spin_button_get_value_as_int( GTK_SPIN_BUTTON(pref_snap_size) );
84 
85 	prefwin_close();
86 }
87 
language_changed(GtkComboBox * combobox)88 void language_changed(GtkComboBox *combobox)
89 {
90 	update_translation( gtk_entry_get_text(GTK_ENTRY(GTK_BIN(pref_general_language)->child)), false );
91 
92 	gtk_window_set_title(GTK_WINDOW(prefwin), _("Preferences") );
93 
94 	gtk_label_set_text_with_mnemonic( GTK_LABEL(pref.button_ok_label), button_ok );
95 
96 // translates general-page
97 	gtk_notebook_set_tab_label( GTK_NOTEBOOK(pref.notebook),
98 	                            gtk_notebook_get_nth_page(GTK_NOTEBOOK(pref.notebook), 0),
99 	                            gtk_label_new_with_mnemonic( _("_General") ) );
100 
101 	gtk_label_set_text_with_mnemonic(GTK_LABEL(pref.general_translation_label), _("_Translation: ") );
102 
103 	gtk_label_set_text_with_mnemonic( GTK_LABEL(pref.general_start_window_label), _("Start _window: ") );
104 
105 	{
106 		gint i = gtk_combo_box_get_active(GTK_COMBO_BOX(pref_general_start_window));
107 
108 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window),
109 		                           _("Simple calculator") );
110 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window),
111 		                           _("Advanced calculator") );
112 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window), _("UMP-editor") );
113 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window), _("Graph tools") );
114 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window), _("Matrix editor") );
115 
116 		for(int o=0;o<5;o++)  // removing the five first...
117 			gtk_combo_box_remove_text(GTK_COMBO_BOX(pref_general_start_window), 0);
118 
119 		gtk_combo_box_set_active( GTK_COMBO_BOX(pref_general_start_window), i );
120 	}
121 // general-page is now translated
122 
123 
124 // translates number-format-page
125 	gtk_notebook_set_tab_label( GTK_NOTEBOOK(pref.notebook),
126 	                            gtk_notebook_get_nth_page(GTK_NOTEBOOK(pref.notebook), 1),
127 	                            gtk_label_new_with_mnemonic( _("_Number format") ) );
128 
129 	gtk_frame_set_label( GTK_FRAME(pref.format_frame_decimals), _("Decimals") );
130 	gtk_button_set_label( GTK_BUTTON(pref_format_type[0]), _("No_rmal") );
131 	gtk_button_set_label( GTK_BUTTON(pref_format_type[1]), _("Mi_xed") );
132 	gtk_button_set_label( GTK_BUTTON(pref_format_type[2]), _("_Science") );
133 
134 	gtk_label_set_text_with_mnemonic( GTK_LABEL(pref.format_max_decimals_label),
135 	                                  _("Max _decimals: ") );
136 
137 	gtk_button_set_label( GTK_BUTTON(pref_format_trailing), _("Show trailing _zeros") );
138 
139 
140 	gtk_frame_set_label( GTK_FRAME(pref.format_frame_fractions), _("Fractions") );
141 
142 	gtk_frame_set_label( GTK_FRAME(pref.format_frame_frac_show_as), _("Show as...") );
143 
144 	gtk_button_set_label( GTK_BUTTON(pref.format_fraction_type[0]), _("fractions") );
145 	gtk_button_set_label( GTK_BUTTON(pref.format_fraction_type[1]), _("integer + fraction") );
146 	gtk_button_set_label( GTK_BUTTON(pref.format_fraction_type[2]), _("decimals") );
147 // number-format-page is now translated
148 
149 // autoloading page
150 	gtk_notebook_set_tab_label( GTK_NOTEBOOK(pref.notebook),
151 	                            gtk_notebook_get_nth_page(GTK_NOTEBOOK(pref.notebook), 2),
152 	                            gtk_label_new_with_mnemonic( _("_Autoloading") ) );
153 
154 	gtk_button_set_label( GTK_BUTTON(pref.auto_add), _("Add") );
155 	gtk_button_set_label( GTK_BUTTON(pref.auto_remove), _("Remove") );
156 	gtk_button_set_label( GTK_BUTTON(pref.auto_up), _("Move up") );
157 	gtk_button_set_label( GTK_BUTTON(pref.auto_down), _("Move down") );
158 
159 	gtk_tree_view_column_set_title( GTK_TREE_VIEW_COLUMN(pref.auto_column), _("Path") );
160 // autoloading page is now translated
161 
162 // snap page
163 	gtk_notebook_set_tab_label( GTK_NOTEBOOK(pref.notebook),
164 	                            gtk_notebook_get_nth_page(GTK_NOTEBOOK(pref.notebook), 3),
165 	                            gtk_label_new_with_mnemonic( _("_Snaping") ) );
166 
167 	gtk_frame_set_label( GTK_FRAME(pref.snap_frame), _("Snaping") );
168 	gtk_label_set_text_with_mnemonic( GTK_LABEL(pref.snap_size_label),
169 	                                  _("Snap size: ") );
170 // snap page is now translated
171 }
172 
prefwin_browse_button(GtkButton * button,gpointer user_data)173 void prefwin_browse_button(GtkButton *button,gpointer user_data)
174 {
175 	GtkWidget *file_chooser, *tmp=GTK_WIDGET(user_data);
176 
177 	if( tmp == pref_general_language )
178 	{
179 		file_chooser = gtk_file_chooser_dialog_new( dialog_title_open_file, GTK_WINDOW(prefwin),
180 		                                            GTK_FILE_CHOOSER_ACTION_OPEN,
181 		                                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
182 		                                            GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL );
183 
184 		gtk_file_chooser_set_filename( GTK_FILE_CHOOSER(file_chooser),
185 		                   gtk_entry_get_text(GTK_ENTRY(GTK_BIN(pref_general_language)->child)) );
186 	}
187 	else
188 		file_chooser = gtk_file_chooser_dialog_new( dialog_title_open_file, GTK_WINDOW(prefwin),
189 		                                            GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER,
190 		                                            GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
191 		                                            GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL );
192 
193 
194 
195 	if(gtk_dialog_run(GTK_DIALOG(file_chooser)) == GTK_RESPONSE_ACCEPT)
196 	{
197 		char *filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(file_chooser));
198 
199 		if( tmp == pref_general_language )
200 			gtk_entry_set_text( GTK_ENTRY(GTK_BIN(pref_general_language)->child), filename );
201 		else // autoloading -> add
202 		{
203 			utf8_string file(filename);
204 			GtkTreeIter iter;
205 
206 			math::autoload_directories.insert( file, 0 );
207 			gtk_list_store_prepend( pref.auto_list_store, &iter );
208 			gtk_list_store_set( pref.auto_list_store, &iter, AUTO_COLUMN_PATH, filename, -1 );
209 		}
210 		g_free(filename);
211 	}
212 
213 	gtk_widget_destroy(file_chooser);
214 }
215 
prefwin_auto_remove(GtkButton * button,gpointer user_data)216 void prefwin_auto_remove(GtkButton *button,gpointer user_data)
217 {
218 	GtkTreeSelection *sel;
219 	GtkTreeModel *model;
220 	GtkTreeIter iter;
221 	gchar *name;
222 
223 	sel = gtk_tree_view_get_selection( GTK_TREE_VIEW(pref.auto_treeview) );
224 
225 	if( gtk_tree_selection_get_selected( sel, &model, &iter ) )
226 	{
227 		gtk_tree_model_get( model, &iter, AUTO_COLUMN_PATH, &name, -1 );
228 
229 		for( int i=0; i<math::autoload_directories.get_size(); i++ )
230 		{
231 			if( *math::autoload_directories[i] == name )
232 			{
233 				math::autoload_directories.remove(i);
234 				break;
235 			}
236 		}
237 
238 		gtk_list_store_remove( pref.auto_list_store, &iter );
239 
240 		g_free( name );
241 	}
242 }
243 
prefwin_auto_swap(GtkButton * button,gpointer user_data)244 void prefwin_auto_swap(GtkButton *button,gpointer user_data)
245 {
246 	GtkTreeSelection *sel;
247 	GtkTreeModel *model;
248 	GtkTreeIter iter, iter2;
249 	gchar *name;
250 	int i;
251 
252 	sel = gtk_tree_view_get_selection( GTK_TREE_VIEW(pref.auto_treeview) );
253 
254 	if( gtk_tree_selection_get_selected( sel, &model, &iter ) )
255 	{
256 		gtk_tree_model_get( model, &iter, AUTO_COLUMN_PATH, &name, -1 );
257 
258 		for( i=0; i<math::autoload_directories.get_size(); i++ )
259 		{
260 			if( *math::autoload_directories[i] == name )
261 				break;
262 		}
263 
264 		if( GTK_WIDGET(user_data) == pref.auto_up )
265 		{
266 			if( i != 0 )
267 			{
268 				math::autoload_directories.swap( i, i-1 );
269 
270 				gtk_tree_model_get_iter_first( model, &iter2 );
271 				for( int a=0; a<(i-1); a++ )
272 				{
273 					if( gtk_tree_model_iter_next( model, &iter2 ) == FALSE )
274 						return;
275 				}
276 				gtk_list_store_swap( pref.auto_list_store, &iter, &iter2 );
277 			}
278 		}
279 		else
280 		{
281 			if( i != math::autoload_directories.get_size()-1 )
282 			{
283 				math::autoload_directories.swap( i, i+1 );
284 
285 				iter2 = iter;
286 				if( gtk_tree_model_iter_next( model, &iter2 ) == TRUE )
287 					gtk_list_store_swap( pref.auto_list_store, &iter, &iter2 );
288 			}
289 		}
290 
291 		g_free( name );
292 	}
293 }
294 
prefwin_show(GtkWindow * parent)295 void prefwin_show(GtkWindow *parent)
296 {
297 	if(prefwin == 0)
298 	{
299 		GtkWidget *vbox,*hbox,*apply,*box,*box2,*tmp,*table;
300 		GtkAdjustment *spinner_adj;
301 
302 		prefwin = gtk_window_new(GTK_WINDOW_TOPLEVEL);
303 
304 		gtk_window_set_title( GTK_WINDOW(prefwin), _("Preferences") );
305 		gtk_container_set_border_width( GTK_CONTAINER(prefwin), 5 );
306 
307 		g_signal_connect_swapped( GTK_OBJECT(prefwin), "delete-event", G_CALLBACK(prefwin_ok), NULL );
308 
309 		vbox = gtk_vbox_new( FALSE, 3 );
310 
311 		pref.notebook = gtk_notebook_new();
312 
313 // General page starts
314 		table = gtk_table_new( 2, 3, FALSE );
315 		gtk_table_set_row_spacings( GTK_TABLE(table), 3 );
316 		gtk_table_set_col_spacings( GTK_TABLE(table), 3 );
317 		gtk_container_set_border_width( GTK_CONTAINER(table), 5 );
318 
319 		pref.general_translation_label = gtk_label_new_with_mnemonic( _("_Translation: ") );
320 		gtk_table_attach( GTK_TABLE(table), pref.general_translation_label, 0, 1, 0, 1, GTK_FILL,
321 		                  GtkAttachOptions(0), 1, 1);
322 		gtk_misc_set_alignment( GTK_MISC(pref.general_translation_label), 0, 0.5 );
323 
324 		pref_general_language = gtk_combo_box_entry_new_text();
325 		gtk_label_set_mnemonic_widget( GTK_LABEL(pref.general_translation_label),
326 		                               pref_general_language );
327 		gtk_entry_set_max_length(GTK_ENTRY(GTK_BIN(pref_general_language)->child),200);
328 		gtk_combo_box_append_text(GTK_COMBO_BOX(pref_general_language), "English");
329 		gtk_combo_box_append_text(GTK_COMBO_BOX(pref_general_language), "Svenska");
330 		gtk_entry_set_text(GTK_ENTRY(GTK_BIN(pref_general_language)->child), language_filename.c_str());
331 		g_signal_connect( GTK_OBJECT(pref_general_language), "changed",
332 		                  G_CALLBACK(language_changed), 0 );
333 		gtk_table_attach( GTK_TABLE(table), pref_general_language, 1, 2, 0, 1,
334 		                  GtkAttachOptions(GTK_FILL | GTK_EXPAND), GtkAttachOptions(0), 1, 1 );
335 		{
336 			GtkWidget *tmpimg;
337 			tmpimg = gtk_image_new_from_stock( GTK_STOCK_OPEN, GTK_ICON_SIZE_BUTTON );
338 
339 			tmp = gtk_button_new();
340 			gtk_container_add(GTK_CONTAINER(tmp),tmpimg);
341 		}
342 		g_signal_connect( GTK_OBJECT(tmp), "clicked", G_CALLBACK(prefwin_browse_button),
343 		                  gpointer(pref_general_language) );
344 		gtk_table_attach( GTK_TABLE(table), tmp, 2, 3, 0, 1, GTK_FILL, GtkAttachOptions(0), 1, 1 );
345 
346 
347 		pref.general_start_window_label = gtk_label_new_with_mnemonic( _("Start _window: ") );
348 		gtk_table_attach( GTK_TABLE(table), pref.general_start_window_label, 0, 1, 1, 2, GTK_FILL,
349 		                  GtkAttachOptions(0), 1, 1 );
350 		gtk_misc_set_alignment(GTK_MISC (pref.general_start_window_label), 0, 0.5);
351 
352 		pref_general_start_window = gtk_combo_box_new_text();
353 		gtk_label_set_mnemonic_widget( GTK_LABEL(pref.general_start_window_label),
354 		                               pref_general_start_window );
355 		gtk_table_attach( GTK_TABLE(table), pref_general_start_window, 1, 3, 1, 2,
356 		                  GtkAttachOptions(GTK_FILL | GTK_EXPAND), GTK_FILL, 0, 0 );
357 
358 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window),
359 		                           _("Simple calculator") );
360 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window),
361 		                           _("Advanced calculator") );
362 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window), _("UMP-editor") );
363 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window), _("Graph tools") );
364 		gtk_combo_box_append_text( GTK_COMBO_BOX(pref_general_start_window), _("Matrix editor") );
365 		if(default_start_window == "Simple")
366 			gtk_combo_box_set_active( GTK_COMBO_BOX(pref_general_start_window), 0 );
367 		else if(default_start_window == "Editor")
368 			gtk_combo_box_set_active( GTK_COMBO_BOX(pref_general_start_window), 2 );
369 		else if(default_start_window == "Graphtool")
370 			gtk_combo_box_set_active( GTK_COMBO_BOX(pref_general_start_window), 3 );
371 		else if(default_start_window == "MatrixEditor")
372 			gtk_combo_box_set_active( GTK_COMBO_BOX(pref_general_start_window), 4 );
373 		else // "Advanced"
374 			gtk_combo_box_set_active( GTK_COMBO_BOX(pref_general_start_window), 1 );
375 
376 
377 		tmp = gtk_label_new_with_mnemonic( _("_General") );
378 		gtk_notebook_append_page(GTK_NOTEBOOK(pref.notebook),table,tmp);
379 // General page starts
380 
381 // Number format starts
382 		box2 = gtk_vbox_new( FALSE, 3 );
383 		gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
384 
385 
386 		{  // decimals frame
387 			pref.format_frame_decimals = gtk_frame_new( _("Decimals") );
388 			gtk_box_pack_start( GTK_BOX(box2), pref.format_frame_decimals, FALSE, FALSE, 0 );
389 			gtk_container_set_border_width( GTK_CONTAINER(pref.format_frame_decimals), 5 );
390 
391 
392 			box = gtk_vbox_new(FALSE,3);
393 			gtk_container_add( GTK_CONTAINER(pref.format_frame_decimals), box );
394 			gtk_container_set_border_width( GTK_CONTAINER(box), 5 );
395 
396 
397 			pref_format_type[0] = gtk_radio_button_new_with_mnemonic( 0, _("No_rmal") );
398 			pref_format_type[1] = gtk_radio_button_new_with_mnemonic_from_widget(
399 			  GTK_RADIO_BUTTON(pref_format_type[0]), _("Mi_xed") );
400 			pref_format_type[2] = gtk_radio_button_new_with_mnemonic_from_widget(
401 			  GTK_RADIO_BUTTON(pref_format_type[0]), _("_Science") );
402 
403 			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(pref_format_type[format.get_type()]),TRUE);
404 
405 			hbox = gtk_hbox_new(FALSE,3);
406 			for(int i=0;i<3;i++)
407 				gtk_box_pack_start(GTK_BOX(hbox), pref_format_type[i], FALSE, FALSE, 0);
408 			gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, FALSE, 0);
409 
410 			pref.format_max_decimals_label = gtk_label_new_with_mnemonic( _("Max _decimals: ") );
411 
412 			spinner_adj = (GtkAdjustment *) gtk_adjustment_new( gdouble(format.get_max_decimals()),
413 			                                                    0.0, 50.0, 1.0, 5.0, 5.0 );
414 			pref_format_spinner = gtk_spin_button_new( spinner_adj, 1.0, 0 );
415 			gtk_label_set_mnemonic_widget( GTK_LABEL(pref.format_max_decimals_label),
416 			                               pref_format_spinner );
417 
418 			hbox = gtk_hbox_new( FALSE, 3 );
419 			gtk_box_pack_start( GTK_BOX(hbox), pref.format_max_decimals_label, FALSE, FALSE, 0 );
420 			gtk_box_pack_start( GTK_BOX(hbox), pref_format_spinner, FALSE, FALSE, 0 );
421 
422 			gtk_box_pack_start( GTK_BOX(box), hbox, FALSE, FALSE, 2 );
423 
424 			pref_format_trailing = gtk_check_button_new_with_mnemonic( _("Show trailing _zeros") );
425 
426 			gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(pref_format_trailing),
427 			                              (format.show_trailingzeros) ? TRUE : FALSE );
428 
429 			gtk_box_pack_start(GTK_BOX(box), pref_format_trailing, FALSE, FALSE, 0);
430 		} // decimals frame
431 
432 		{  // fractions frame
433 			GtkWidget *hbox;
434 
435 			pref.format_frame_fractions = gtk_frame_new( _("Fractions") );
436 			gtk_box_pack_start( GTK_BOX(box2), pref.format_frame_fractions, FALSE, FALSE, 0 );
437 
438 			gtk_container_set_border_width(GTK_CONTAINER(pref.format_frame_fractions), 5);
439 
440 			pref.format_frame_frac_show_as = gtk_frame_new( _("Show as...") );
441 			gtk_frame_set_shadow_type( GTK_FRAME(pref.format_frame_frac_show_as), GTK_SHADOW_NONE );
442 			gtk_container_add( GTK_CONTAINER(pref.format_frame_fractions),
443 			pref.format_frame_frac_show_as );
444 			gtk_container_set_border_width(GTK_CONTAINER(pref.format_frame_frac_show_as), 3);
445 
446 			hbox = gtk_hbox_new( FALSE, 3 );
447 			gtk_container_add( GTK_CONTAINER(pref.format_frame_frac_show_as), hbox );
448 			gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
449 
450 
451 			pref.format_fraction_type[0] = gtk_radio_button_new_with_mnemonic( 0, _("fractions") );
452 			pref.format_fraction_type[1] = gtk_radio_button_new_with_mnemonic_from_widget(
453 			  GTK_RADIO_BUTTON(pref.format_fraction_type[0]), _("integer + fraction") );
454 			pref.format_fraction_type[2] = gtk_radio_button_new_with_mnemonic_from_widget(
455 			  GTK_RADIO_BUTTON(pref.format_fraction_type[0]), _("decimals") );
456 
457 			gtk_toggle_button_set_active(
458 			   GTK_TOGGLE_BUTTON(pref.format_fraction_type[format.get_fraction_type()]), TRUE );
459 
460 			for(int i=0;i<3;i++)
461 				gtk_box_pack_start(GTK_BOX(hbox), pref.format_fraction_type[i], FALSE, FALSE, 0);
462 
463 		} // fractions frame
464 
465 		tmp = gtk_label_new_with_mnemonic( _("_Number format") );
466 		gtk_notebook_append_page(GTK_NOTEBOOK(pref.notebook),box2,tmp);
467 // Number format ends
468 
469 // Autoload page starts
470 		table = gtk_table_new( 4, 2, FALSE );
471 		gtk_table_set_row_spacings( GTK_TABLE(table), 3 );
472 		gtk_table_set_col_spacings( GTK_TABLE(table), 3 );
473 		gtk_container_set_border_width(GTK_CONTAINER(table), 5);
474 
475 		{
476 			GtkTreeIter iter;
477 			GtkCellRenderer *renderer;
478 
479 			pref.auto_list_store = gtk_list_store_new( AUTO_N_COLUMNS, G_TYPE_STRING );
480 
481 			for( int i=0; i<math::autoload_directories.get_size(); i++ )
482 			{
483 				gtk_list_store_append( pref.auto_list_store, &iter );
484 				gtk_list_store_set( pref.auto_list_store, &iter, AUTO_COLUMN_PATH,
485 				                    math::autoload_directories[i]->c_str(), -1 );
486 			}
487 			pref.auto_treeview = gtk_tree_view_new_with_model( GTK_TREE_MODEL(pref.auto_list_store) );
488 			gtk_table_attach( GTK_TABLE(table), pref.auto_treeview, 0, 1, 0, 4,
489 			                  GtkAttachOptions(GTK_EXPAND | GTK_FILL),
490 			                  GtkAttachOptions(GTK_EXPAND | GTK_FILL), 0, 0 );
491 
492 			renderer = gtk_cell_renderer_text_new();
493 			pref.auto_column = gtk_tree_view_column_new_with_attributes( _("Path"), renderer, "text",
494 			                                                             AUTO_COLUMN_PATH, NULL );
495 			gtk_tree_view_append_column( GTK_TREE_VIEW(pref.auto_treeview), pref.auto_column );
496 		}
497 		pref.auto_add = gtk_button_new_with_mnemonic( _("Add") );
498 		g_signal_connect( GTK_OBJECT(pref.auto_add), "clicked", G_CALLBACK(prefwin_browse_button),
499 		                  gpointer(pref.auto_add) );
500 		gtk_table_attach( GTK_TABLE(table), pref.auto_add, 1, 2, 0, 1, GTK_FILL,
501 		                  GtkAttachOptions(0), 0, 0 );
502 
503 		pref.auto_remove = gtk_button_new_with_mnemonic( _("Remove") );
504 		g_signal_connect( GTK_OBJECT(pref.auto_remove), "clicked", G_CALLBACK(prefwin_auto_remove),
505 		                  0 );
506 		gtk_table_attach( GTK_TABLE(table), pref.auto_remove, 1, 2, 1, 2, GTK_FILL,
507 		                  GtkAttachOptions(0), 0, 0 );
508 
509 		pref.auto_up = gtk_button_new_with_mnemonic( _("Move up") );
510 		g_signal_connect( GTK_OBJECT(pref.auto_up), "clicked", G_CALLBACK(prefwin_auto_swap),
511 		                  gpointer(pref.auto_up) );
512 		gtk_table_attach( GTK_TABLE(table), pref.auto_up, 1, 2, 2, 3, GTK_FILL,
513 		                  GtkAttachOptions(0), 0, 0 );
514 
515 		pref.auto_down = gtk_button_new_with_mnemonic( _("Move down") );
516 		g_signal_connect( GTK_OBJECT(pref.auto_down), "clicked", G_CALLBACK(prefwin_auto_swap),
517 		                  gpointer(pref.auto_down) );
518 		gtk_table_attach( GTK_TABLE(table), pref.auto_down, 1, 2, 3, 4, GTK_FILL,
519 		                  GtkAttachOptions(0), 0, 0 );
520 
521 		tmp = gtk_label_new_with_mnemonic( _("_Autoloading") );
522 		gtk_notebook_append_page( GTK_NOTEBOOK(pref.notebook), table, tmp );
523 // Autoload page ends
524 // snaping starts
525 		box2 = gtk_vbox_new( FALSE, 3 );
526 		gtk_container_set_border_width(GTK_CONTAINER(box2), 5);
527 
528 
529 		pref.snap_frame = gtk_frame_new( _("Snaping") );
530 		gtk_box_pack_start( GTK_BOX(box2), pref.snap_frame, FALSE, FALSE, 0 );
531 		gtk_container_set_border_width( GTK_CONTAINER(pref.snap_frame), 5 );
532 
533 		box = gtk_vbox_new( FALSE, 3 );
534 		gtk_container_add( GTK_CONTAINER(pref.snap_frame), box );
535 		gtk_container_set_border_width( GTK_CONTAINER(box), 5 );
536 
537 		pref_snap_size = gtk_spin_button_new_with_range( 0.0, 100.0, 1.0 );
538 		gtk_spin_button_set_value( GTK_SPIN_BUTTON(pref_snap_size), gdouble(SNAP_SIZE) );
539 		pref.snap_size_label = gtk_label_new_with_mnemonic( _("Snap size: ") );
540 		gtk_label_set_mnemonic_widget( GTK_LABEL(pref.snap_size_label), pref_snap_size );
541 
542 
543 		hbox = gtk_hbox_new( FALSE, 3 );
544 		gtk_box_pack_start( GTK_BOX(hbox), pref.snap_size_label, FALSE, FALSE, 0 );
545 		gtk_box_pack_start( GTK_BOX(hbox), pref_snap_size, FALSE, FALSE, 0 );
546 
547 		gtk_box_pack_start( GTK_BOX(box), hbox, FALSE, FALSE, 2 );
548 
549 		tmp = gtk_label_new_with_mnemonic( _("_Snaping") );
550 		gtk_notebook_append_page( GTK_NOTEBOOK(pref.notebook), box2, tmp );
551 // snaping ends
552 		gtk_box_pack_start( GTK_BOX(vbox), pref.notebook, TRUE, TRUE, 0 );
553 		gtk_notebook_set_tab_pos( GTK_NOTEBOOK(pref.notebook), GTK_POS_LEFT );
554 
555 		{
556 			GtkWidget *tmpimg,*tmpbox;
557 			tmpimg = gtk_image_new_from_stock( GTK_STOCK_OK, GTK_ICON_SIZE_BUTTON );
558 
559 			pref.button_ok_label = gtk_label_new_with_mnemonic(button_ok);
560 
561 			tmpbox = gtk_hbox_new( FALSE, 0 );
562 			gtk_box_pack_start( GTK_BOX(tmpbox), tmpimg, FALSE, FALSE, 2 );
563 			gtk_box_pack_start( GTK_BOX(tmpbox), pref.button_ok_label, FALSE, FALSE, 2 );
564 			apply = gtk_button_new();
565 			gtk_container_add( GTK_CONTAINER(apply), tmpbox );
566 		}
567 		g_signal_connect_swapped( GTK_OBJECT(apply), "clicked", G_CALLBACK(prefwin_ok), NULL );
568 
569 		hbox = gtk_hbox_new(FALSE,0);
570 		gtk_box_pack_end(GTK_BOX(hbox), apply, FALSE, FALSE, 0);
571 
572 
573 		gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
574 
575 
576 		gtk_container_add(GTK_CONTAINER(prefwin), vbox);
577 
578 		gtk_window_set_modal(GTK_WINDOW(prefwin), TRUE);
579 		if(parent != 0)
580 			gtk_window_set_transient_for(GTK_WINDOW(prefwin), parent);
581 
582 		gtk_widget_show_all(prefwin);
583 	}
584 	else
585 		gtk_window_present(GTK_WINDOW(prefwin));
586 }
587 
588 
prefwin_close(void)589 void prefwin_close(void)
590 {
591 	gtk_widget_destroy(prefwin);
592 	prefwin = 0;
593 }
594