Updated Spanish translation
[anjuta-git-plugin.git] / plugins / indent / indent-dialog.c
blobbc9a3605d57f3f2842063204da9a18b20f4ee95b
1 /*
2 * This program is free software; you can redistribute it and/or modify
3 * it under the terms of the GNU General Public License as published by
4 * the Free Software Foundation; either version 2 of the License, or
5 * (at your option) any later version.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU Library General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software
14 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15 */
17 #ifdef HAVE_CONFIG_H
18 # include <config.h>
19 #endif
21 #include <gnome.h>
22 #include <glade/glade.h>
24 #include "indent-util.h"
25 #include "indent-dialog.h"
28 #define PARAMETERS_ENTRY "indent_parameters_entry"
29 #define PREVIEW_BUTTON "indent_preview_button"
30 #define UPDATE_BUTTON "indent_update_button"
31 #define DELETE_BUTTON "indent_delete_button"
32 #define NEW_BUTTON "indent_new_button"
33 #define QUIT_BUTTON "indent_quit_button"
34 #define STYLE_COMBOBOX "indent_style_combobox"
35 #define PREVIEW_TEXTVIEW "indent_preview_textview"
36 #define DIALOG "indent_dialog"
37 #define STYLE_ENTRY "indent_style_entry"
40 void indent_widget_signal_connect(gchar *name_widget, gchar *signal,
41 gpointer func,IndentData *idt);
42 gchar *indent_spinbutton_get_value(gchar *name_widget, IndentData *idt);
43 void indent_init_items(gpointer key, gpointer data, IndentData *idt);
44 void indent_connect_items(gpointer key, gpointer data, IndentData *idt);
45 void indent_init_dialog(IndentData *idt);
46 void indent_init_connect(IndentData *idt);
47 gchar *indent_entry_get_chars(IndentData *idt);
48 void indent_entry_set_chars(gchar *text, IndentData *idt);
49 void indent_block_widget(gchar *name_widget, gpointer func, gboolean block,
50 IndentData *idt);
51 void on_indent_checkbutton_toggled(GtkToggleButton *button, IndentData *idt);
52 void on_indent_spinbutton_value_changed(GtkSpinButton *button, IndentData *idt);
53 void on_indent_parameters_entry_changed(GtkEditable *edit, IndentData *idt);
54 void on_indent_preview_button_clicked(GtkButton *button, IndentData *idt);
55 void on_indent_update_button_clicked(GtkButton *button, IndentData *idt);
56 void on_indent_new_button_clicked(GtkButton *button, IndentData *idt);
57 void on_indent_delete_button_clicked(GtkButton *button, IndentData *idt);
58 void on_indent_style_combobox_changed(GtkComboBox *combo, IndentData *idt);
59 void on_indent_quit_button_clicked(GtkButton *button, IndentData *idt);
60 void indent_set_style_combo(gint index, IndentData *idt);
61 void indent_exit(GtkWidget *widget, gpointer user_data);
62 void indent_display_buffer(gchar *buffer, IndentData *idt);
66 /*****************************************************************************/
67 void
68 pref_style_combo_changed(GtkComboBox *combo, IndentData *idt)
70 gchar *style_name;
71 gchar *options;
73 style_name = gtk_combo_box_get_active_text(combo);
74 options = indent_find_style(style_name, idt);
75 if (options)
76 gtk_entry_set_text(GTK_ENTRY(idt->pref_indent_options), options);
77 indent_save_active_style(style_name, options, idt);
80 void
81 pref_set_style_combo(IndentData *idt)
83 GList *list;
84 IndentStyle *ist;
86 list = idt->style_list;
87 while (list)
89 ist = list->data;
90 gtk_combo_box_append_text(GTK_COMBO_BOX(idt->pref_indent_combo), ist->name);
91 list = g_list_next(list);
93 gtk_combo_box_set_active(GTK_COMBO_BOX(idt->pref_indent_combo), idt->style_active);
96 /*****************************************************************************/
98 void
99 indent_widget_signal_connect(gchar *name_widget, gchar *signal, gpointer func,
100 IndentData *idt)
102 GtkWidget *widget;
104 widget = glade_xml_get_widget(idt->xml, name_widget);
105 g_signal_connect(widget, signal, G_CALLBACK (func), idt);
108 void
109 indent_toggle_button_set_active(gchar *name_widget, gboolean active, IndentData *idt)
111 GtkWidget *widget;
113 widget = glade_xml_get_widget(idt->xml, name_widget);
114 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (widget), active);
117 void
118 indent_widget_set_sensitive(gchar *name_widget, gboolean sensitive, IndentData *idt)
120 GtkWidget *widget;
122 widget = glade_xml_get_widget(idt->xml, name_widget);
123 gtk_widget_set_sensitive(widget, sensitive);
126 void
127 indent_spinbutton_set_value(gchar *name_widget, gchar *num, IndentData *idt)
129 GtkWidget *widget;
131 widget = glade_xml_get_widget(idt->xml, name_widget);
132 gtk_spin_button_set_value(GTK_SPIN_BUTTON (widget), g_strtod(num, NULL));
135 gchar *
136 indent_spinbutton_get_value(gchar *name_widget, IndentData *idt)
138 GtkWidget *widget;
139 gint value;
141 widget = glade_xml_get_widget(idt->xml, name_widget);
142 value = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON (widget));
143 return g_strdup_printf("%d", value);
146 void
147 indent_init_items(gpointer key, gpointer data, IndentData *idt)
149 OptionData *ptrdata;
151 ptrdata = data;
152 indent_toggle_button_set_active(ptrdata->checkbutton, FALSE, idt);
153 if (ptrdata->spinbutton)
154 indent_widget_set_sensitive(ptrdata->spinbutton, FALSE, idt);
157 void
158 indent_connect_items(gpointer key, gpointer data, IndentData *idt)
160 OptionData *ptrdata;
162 ptrdata = data;
163 indent_widget_signal_connect(ptrdata->checkbutton, "toggled",
164 GTK_SIGNAL_FUNC(on_indent_checkbutton_toggled),
165 idt);
167 if (ptrdata->spinbutton)
168 indent_widget_signal_connect(ptrdata->spinbutton, "value_changed",
169 GTK_SIGNAL_FUNC(on_indent_spinbutton_value_changed),
170 idt);
173 void
174 indent_init_dialog(IndentData *idt)
176 g_hash_table_foreach(idt->option_hash, (GHFunc) indent_init_items, idt);
179 void
180 indent_init_connect(IndentData *idt)
182 g_hash_table_foreach(idt->option_hash, (GHFunc) indent_connect_items, idt);
183 indent_widget_signal_connect(PARAMETERS_ENTRY, "changed",
184 G_CALLBACK (on_indent_parameters_entry_changed),
185 idt);
186 indent_widget_signal_connect(PREVIEW_BUTTON, "clicked",
187 G_CALLBACK (on_indent_preview_button_clicked),
188 idt);
189 indent_widget_signal_connect(UPDATE_BUTTON, "clicked",
190 G_CALLBACK (on_indent_update_button_clicked),
191 idt);
192 indent_widget_signal_connect(DELETE_BUTTON, "clicked",
193 G_CALLBACK (on_indent_delete_button_clicked),
194 idt);
195 indent_widget_signal_connect(NEW_BUTTON, "clicked",
196 G_CALLBACK (on_indent_new_button_clicked),
197 idt);
198 indent_widget_signal_connect(QUIT_BUTTON, "clicked",
199 G_CALLBACK (on_indent_quit_button_clicked),
200 idt);
201 indent_widget_signal_connect(STYLE_COMBOBOX, "changed",
202 G_CALLBACK (on_indent_style_combobox_changed),
203 idt);
206 gchar *
207 indent_entry_get_chars(IndentData *idt)
209 GtkWidget *widget;
211 widget = glade_xml_get_widget(idt->xml, PARAMETERS_ENTRY);
212 return gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
215 void
216 indent_entry_set_chars(gchar *text, IndentData *idt)
218 GtkWidget *widget;
220 widget = glade_xml_get_widget(idt->xml, PARAMETERS_ENTRY);
221 gtk_entry_set_text(GTK_ENTRY(widget), text);
224 void
225 indent_block_widget(gchar *name_widget, gpointer func, gboolean block, IndentData *idt)
227 GtkWidget *widget;
229 widget = glade_xml_get_widget(idt->xml, name_widget);
230 if (block)
231 g_signal_handlers_block_by_func (GTK_OBJECT (widget), func, NULL);
232 else
233 g_signal_handlers_unblock_by_func (GTK_OBJECT (widget), func, NULL);
237 void
238 on_indent_checkbutton_toggled(GtkToggleButton *button, IndentData *idt)
240 const gchar *checkname;
241 gboolean num;
242 CheckData *ptrcheck;
243 gchar *line;
244 gchar *option;
246 if (idt->checkbutton_blocked) return;
248 checkname = gtk_widget_get_name (GTK_WIDGET(button));
249 if ( (ptrcheck = g_hash_table_lookup(idt->check_hash, checkname)) == NULL)
250 return;
251 num = ptrcheck->spinbutton ? TRUE : FALSE;
252 line = indent_entry_get_chars(idt);
253 line = indent_delete_option(line, ptrcheck->option, num);
254 if (gtk_toggle_button_get_active(button))
256 option = g_strconcat("-", ptrcheck->option, NULL);
257 if (ptrcheck->spinbutton)
259 indent_widget_set_sensitive(ptrcheck->spinbutton, TRUE, idt);
260 option = g_strconcat(option,
261 indent_spinbutton_get_value(ptrcheck->spinbutton, idt),
262 NULL);
264 line = indent_insert_option(line, option);
265 g_free(option);
267 else
269 if (ptrcheck->spinbutton)
270 indent_widget_set_sensitive(ptrcheck->spinbutton, FALSE, idt);
271 if (ptrcheck->not_option)
273 option = g_strconcat("-n", ptrcheck->option, NULL);
274 line = indent_insert_option(line, option);
275 g_free(option);
278 indent_block_widget(PARAMETERS_ENTRY,
279 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed),
280 TRUE, idt);
281 indent_entry_set_chars(line, idt);
282 indent_block_widget(PARAMETERS_ENTRY,
283 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed),
284 FALSE, idt);
285 g_free(line);
288 void
289 on_indent_spinbutton_value_changed(GtkSpinButton *button, IndentData *idt)
291 const gchar *spinname;
292 gchar *line;
293 gchar *option;
295 if (idt->checkbutton_blocked) return;
297 spinname = gtk_widget_get_name (GTK_WIDGET(button));
298 if ( (option = g_hash_table_lookup(idt->spin_hash, spinname)) == NULL)
299 return;
300 line = indent_entry_get_chars(idt);
301 line = indent_delete_option(line, option, TRUE);
302 option = g_strconcat("-", option,
303 indent_spinbutton_get_value((gchar *)spinname, idt), NULL);
304 line = indent_insert_option(line, option);
305 g_free(option);
306 indent_block_widget(PARAMETERS_ENTRY,
307 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed),
308 TRUE, idt);
309 indent_entry_set_chars(line, idt);
310 indent_block_widget(PARAMETERS_ENTRY,
311 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed),
312 FALSE, idt);
313 g_free(line);
316 void
317 on_indent_parameters_entry_changed(GtkEditable *edit, IndentData *idt)
319 idt->checkbutton_blocked = TRUE;
320 indent_init_dialog(idt);
321 indent_anal_line_option(gtk_editable_get_chars(edit, 0, -1), idt);
322 idt->checkbutton_blocked = FALSE;
325 void
326 indent_display_buffer(gchar *buffer, IndentData *idt)
328 GtkWidget *widget;
329 GtkTextBuffer *text_buffer = NULL;
330 GtkTextTag *tag;
331 GtkTextIter start, end ;
333 widget = glade_xml_get_widget(idt->xml, PREVIEW_TEXTVIEW);
335 text_buffer = gtk_text_buffer_new(NULL);
336 tag = gtk_text_buffer_create_tag(text_buffer, "police",
337 "left_margin", 5,
338 "font", "Courier", NULL);
339 gtk_text_buffer_set_text(text_buffer, buffer, -1);
340 gtk_text_buffer_get_iter_at_offset(text_buffer, &start, 0);
341 gtk_text_buffer_get_iter_at_offset(text_buffer, &end, -1);
342 gtk_text_buffer_apply_tag(text_buffer, tag, &start, &end);
343 gtk_text_view_set_buffer(GTK_TEXT_VIEW(widget), text_buffer);
347 #define PREFS_GLADE PACKAGE_DATA_DIR"/glade/indent.glade"
349 GtkWidget *create_dialog(IndentData *idt)
351 idt->xml = glade_xml_new (PREFS_GLADE, DIALOG, NULL);
353 if (idt->xml == NULL)
355 g_warning("Unable to build user interface for Indent\n");
356 return NULL;
359 glade_xml_signal_autoconnect (idt->xml);
360 idt->dialog = glade_xml_get_widget (idt->xml, DIALOG);
362 indent_init_dialog(idt);
363 indent_init_connect(idt);
364 indent_set_style_combo(idt->style_active, idt);
366 g_signal_connect(GTK_OBJECT(idt->dialog), "delete_event",
367 (GtkSignalFunc)indent_exit,
368 NULL);
369 g_signal_connect(GTK_OBJECT(idt->dialog), "destroy",
370 (GtkSignalFunc)indent_exit,
371 NULL);
372 return idt->dialog;
376 void
377 indent_set_style_combo(gint index, IndentData *idt)
379 GtkWidget *widget;
380 GList *list;
381 IndentStyle *ist;
383 widget = glade_xml_get_widget(idt->xml, STYLE_COMBOBOX);
385 list = idt->style_list;
386 while (list)
388 ist = list->data;
389 gtk_combo_box_append_text(GTK_COMBO_BOX(widget), ist->name);
390 list = g_list_next(list);
392 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), index);
395 void
396 on_indent_style_combobox_changed(GtkComboBox *combo, IndentData *idt)
398 gchar *style_name;
399 gchar *options;
400 gchar *buffer = NULL;
402 style_name = gtk_combo_box_get_active_text(combo);
403 options = indent_find_style(style_name, idt);
404 if (options)
406 indent_entry_set_chars(options, idt);
407 if (indent_execute(options, idt) == 0)
409 buffer = indent_get_buffer();
410 indent_display_buffer(buffer, idt);
411 g_free(buffer);
413 else
415 GtkWidget *message = gtk_message_dialog_new(GTK_WINDOW(idt->dialog),
416 GTK_DIALOG_DESTROY_WITH_PARENT,
417 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
418 _("indent parameter not known !"));
419 gtk_dialog_run (GTK_DIALOG (message));
420 gtk_widget_destroy (message);
425 /*****************************************************************************/
427 void
428 on_indent_preview_button_clicked(GtkButton *button, IndentData *idt)
430 gchar *line_option;
431 gchar *buffer = NULL;
433 line_option = indent_entry_get_chars(idt);
434 if (indent_execute(line_option, idt) == 0)
436 buffer = indent_get_buffer();
437 indent_display_buffer(buffer, idt);
438 g_free(buffer);
440 else
442 GtkWidget *message = gtk_message_dialog_new(GTK_WINDOW(idt->dialog),
443 GTK_DIALOG_DESTROY_WITH_PARENT,
444 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
445 _("indent parameter not known !"));
446 gtk_dialog_run (GTK_DIALOG (message));
447 gtk_widget_destroy (message);
451 void
452 on_indent_new_button_clicked(GtkButton *button, IndentData *idt)
454 gchar *style_name;
455 GtkWidget *widget;
456 GtkWidget *message;
457 gint index;
459 widget = glade_xml_get_widget(idt->xml, STYLE_ENTRY);
460 style_name = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
461 style_name = g_strstrip(style_name);
462 if (strlen(style_name) < 1)
463 return;
464 widget = glade_xml_get_widget(idt->xml, STYLE_COMBOBOX);
465 if (indent_add_style(style_name, idt))
467 gtk_combo_box_append_text(GTK_COMBO_BOX(widget), style_name);
468 gtk_combo_box_append_text(GTK_COMBO_BOX(idt->pref_indent_combo), style_name);
470 index = indent_find_index(style_name, idt);
471 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), index);
472 gtk_combo_box_set_active(GTK_COMBO_BOX(idt->pref_indent_combo), index);
474 widget = glade_xml_get_widget(idt->xml, STYLE_ENTRY);
475 gtk_editable_delete_text(GTK_EDITABLE(widget), 0, -1);
476 indent_save_all_style(idt);
478 else
480 message = gtk_message_dialog_new(GTK_WINDOW(idt->dialog),
481 GTK_DIALOG_DESTROY_WITH_PARENT,
482 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
483 _("A Style has already this name !"));
484 gtk_dialog_run (GTK_DIALOG (message));
485 gtk_widget_destroy (message);
489 void
490 on_indent_update_button_clicked(GtkButton *button, IndentData *idt)
492 gchar *style_name;
493 gchar *options;
494 GtkWidget *widget;
495 GtkWidget *message;
497 widget = glade_xml_get_widget(idt->xml, STYLE_COMBOBOX);
498 style_name = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
499 widget = glade_xml_get_widget(idt->xml, PARAMETERS_ENTRY);
500 options = gtk_editable_get_chars(GTK_EDITABLE(widget), 0, -1);
502 if (indent_update_style(style_name, options, idt))
504 indent_save_style(style_name, options, idt);
505 gtk_entry_set_text(GTK_ENTRY(idt->pref_indent_options), options);
507 else
509 message = gtk_message_dialog_new(GTK_WINDOW(idt->dialog),
510 GTK_DIALOG_DESTROY_WITH_PARENT,
511 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
512 _("This Style is not modifiable !"));
513 gtk_dialog_run (GTK_DIALOG (message));
514 gtk_widget_destroy (message);
518 void
519 on_indent_delete_button_clicked(GtkButton *button, IndentData *idt)
521 GtkWidget *widget;
522 GtkWidget *message;
523 gint index;
524 gchar *style_name;
526 widget = glade_xml_get_widget(idt->xml, STYLE_COMBOBOX);
527 style_name = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
528 if (indent_remove_style(style_name, idt))
530 index = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
531 gtk_combo_box_remove_text(GTK_COMBO_BOX(widget), index);
532 gtk_combo_box_remove_text(GTK_COMBO_BOX(idt->pref_indent_combo), index);
534 gtk_combo_box_set_active(GTK_COMBO_BOX(widget), index - 1);
535 gtk_combo_box_set_active(GTK_COMBO_BOX(idt->pref_indent_combo), index - 1);
536 indent_save_all_style(idt);
538 else
540 message = gtk_message_dialog_new(GTK_WINDOW(idt->dialog),
541 GTK_DIALOG_DESTROY_WITH_PARENT,
542 GTK_MESSAGE_WARNING, GTK_BUTTONS_OK,
543 _("This Style is not modifiable !"));
544 gtk_dialog_run (GTK_DIALOG (message));
545 gtk_widget_destroy (message);
549 /*****************************************************************************/
551 void
552 on_indent_quit_button_clicked(GtkButton *button, IndentData *idt)
554 GtkWidget *widget;
555 gchar *style_name, *options;
556 gint index;
558 widget = glade_xml_get_widget(idt->xml, STYLE_COMBOBOX);
559 style_name = gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget));
560 options = indent_find_style(style_name, idt);
561 indent_save_active_style(style_name, options, idt);
563 index = gtk_combo_box_get_active(GTK_COMBO_BOX(widget));
564 gtk_combo_box_set_active(GTK_COMBO_BOX(idt->pref_indent_combo), index);
566 gtk_widget_hide(idt->dialog);
571 void
572 indent_exit(GtkWidget *widget, gpointer user_data)
574 gtk_widget_hide(widget);