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.
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.
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
,
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 /*****************************************************************************/
68 pref_style_combo_changed(GtkComboBox
*combo
, IndentData
*idt
)
73 style_name
= gtk_combo_box_get_active_text(combo
);
74 options
= indent_find_style(style_name
, idt
);
76 gtk_entry_set_text(GTK_ENTRY(idt
->pref_indent_options
), options
);
77 indent_save_active_style(style_name
, options
, idt
);
81 pref_set_style_combo(IndentData
*idt
)
86 list
= idt
->style_list
;
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 /*****************************************************************************/
99 indent_widget_signal_connect(gchar
*name_widget
, gchar
*signal
, gpointer func
,
104 widget
= glade_xml_get_widget(idt
->xml
, name_widget
);
105 g_signal_connect(widget
, signal
, G_CALLBACK (func
), idt
);
109 indent_toggle_button_set_active(gchar
*name_widget
, gboolean active
, IndentData
*idt
)
113 widget
= glade_xml_get_widget(idt
->xml
, name_widget
);
114 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (widget
), active
);
118 indent_widget_set_sensitive(gchar
*name_widget
, gboolean sensitive
, IndentData
*idt
)
122 widget
= glade_xml_get_widget(idt
->xml
, name_widget
);
123 gtk_widget_set_sensitive(widget
, sensitive
);
127 indent_spinbutton_set_value(gchar
*name_widget
, gchar
*num
, IndentData
*idt
)
131 widget
= glade_xml_get_widget(idt
->xml
, name_widget
);
132 gtk_spin_button_set_value(GTK_SPIN_BUTTON (widget
), g_strtod(num
, NULL
));
136 indent_spinbutton_get_value(gchar
*name_widget
, IndentData
*idt
)
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
);
147 indent_init_items(gpointer key
, gpointer data
, IndentData
*idt
)
152 indent_toggle_button_set_active(ptrdata
->checkbutton
, FALSE
, idt
);
153 if (ptrdata
->spinbutton
)
154 indent_widget_set_sensitive(ptrdata
->spinbutton
, FALSE
, idt
);
158 indent_connect_items(gpointer key
, gpointer data
, IndentData
*idt
)
163 indent_widget_signal_connect(ptrdata
->checkbutton
, "toggled",
164 GTK_SIGNAL_FUNC(on_indent_checkbutton_toggled
),
167 if (ptrdata
->spinbutton
)
168 indent_widget_signal_connect(ptrdata
->spinbutton
, "value_changed",
169 GTK_SIGNAL_FUNC(on_indent_spinbutton_value_changed
),
174 indent_init_dialog(IndentData
*idt
)
176 g_hash_table_foreach(idt
->option_hash
, (GHFunc
) indent_init_items
, idt
);
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
),
186 indent_widget_signal_connect(PREVIEW_BUTTON
, "clicked",
187 G_CALLBACK (on_indent_preview_button_clicked
),
189 indent_widget_signal_connect(UPDATE_BUTTON
, "clicked",
190 G_CALLBACK (on_indent_update_button_clicked
),
192 indent_widget_signal_connect(DELETE_BUTTON
, "clicked",
193 G_CALLBACK (on_indent_delete_button_clicked
),
195 indent_widget_signal_connect(NEW_BUTTON
, "clicked",
196 G_CALLBACK (on_indent_new_button_clicked
),
198 indent_widget_signal_connect(QUIT_BUTTON
, "clicked",
199 G_CALLBACK (on_indent_quit_button_clicked
),
201 indent_widget_signal_connect(STYLE_COMBOBOX
, "changed",
202 G_CALLBACK (on_indent_style_combobox_changed
),
207 indent_entry_get_chars(IndentData
*idt
)
211 widget
= glade_xml_get_widget(idt
->xml
, PARAMETERS_ENTRY
);
212 return gtk_editable_get_chars(GTK_EDITABLE(widget
), 0, -1);
216 indent_entry_set_chars(gchar
*text
, IndentData
*idt
)
220 widget
= glade_xml_get_widget(idt
->xml
, PARAMETERS_ENTRY
);
221 gtk_entry_set_text(GTK_ENTRY(widget
), text
);
225 indent_block_widget(gchar
*name_widget
, gpointer func
, gboolean block
, IndentData
*idt
)
229 widget
= glade_xml_get_widget(idt
->xml
, name_widget
);
231 g_signal_handlers_block_by_func (GTK_OBJECT (widget
), func
, NULL
);
233 g_signal_handlers_unblock_by_func (GTK_OBJECT (widget
), func
, NULL
);
238 on_indent_checkbutton_toggled(GtkToggleButton
*button
, IndentData
*idt
)
240 const gchar
*checkname
;
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
)
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
),
264 line
= indent_insert_option(line
, option
);
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
);
278 indent_block_widget(PARAMETERS_ENTRY
,
279 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed
),
281 indent_entry_set_chars(line
, idt
);
282 indent_block_widget(PARAMETERS_ENTRY
,
283 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed
),
289 on_indent_spinbutton_value_changed(GtkSpinButton
*button
, IndentData
*idt
)
291 const gchar
*spinname
;
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
)
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
);
306 indent_block_widget(PARAMETERS_ENTRY
,
307 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed
),
309 indent_entry_set_chars(line
, idt
);
310 indent_block_widget(PARAMETERS_ENTRY
,
311 GTK_SIGNAL_FUNC (on_indent_parameters_entry_changed
),
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
;
326 indent_display_buffer(gchar
*buffer
, IndentData
*idt
)
329 GtkTextBuffer
*text_buffer
= NULL
;
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",
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");
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
,
369 g_signal_connect(GTK_OBJECT(idt
->dialog
), "destroy",
370 (GtkSignalFunc
)indent_exit
,
377 indent_set_style_combo(gint index
, IndentData
*idt
)
383 widget
= glade_xml_get_widget(idt
->xml
, STYLE_COMBOBOX
);
385 list
= idt
->style_list
;
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
);
396 on_indent_style_combobox_changed(GtkComboBox
*combo
, IndentData
*idt
)
400 gchar
*buffer
= NULL
;
402 style_name
= gtk_combo_box_get_active_text(combo
);
403 options
= indent_find_style(style_name
, idt
);
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
);
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 /*****************************************************************************/
428 on_indent_preview_button_clicked(GtkButton
*button
, IndentData
*idt
)
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
);
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
);
452 on_indent_new_button_clicked(GtkButton
*button
, IndentData
*idt
)
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)
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
);
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
);
490 on_indent_update_button_clicked(GtkButton
*button
, IndentData
*idt
)
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
);
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
);
519 on_indent_delete_button_clicked(GtkButton
*button
, IndentData
*idt
)
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
);
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 /*****************************************************************************/
552 on_indent_quit_button_clicked(GtkButton
*button
, IndentData
*idt
)
555 gchar
*style_name
, *options
;
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
);
572 indent_exit(GtkWidget
*widget
, gpointer user_data
)
574 gtk_widget_hide(widget
);