Support individual files and folders in log output.
[anjuta-git-plugin.git] / plugins / editor / style-editor.c
blobe3e2eb6223678bf2abc01e00857205031aeda180
1 /*
2 style-editor.c
3 Copyright (C) 2000 Naba Kumar <gnome.org>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #ifdef HAVE_CONFIG_H
20 # include <config.h>
21 #endif
23 #include <ctype.h>
24 #include <gnome.h>
25 #include <glade/glade.h>
27 #include <libanjuta/anjuta-utils.h>
28 #include <libanjuta/anjuta-debug.h>
30 #include "text_editor.h"
31 #include "style-editor.h"
33 #define string_assign(dest, src) g_free ((*dest)); (*dest) = g_strdup ((src));
34 #define GLADE_FILE PACKAGE_DATA_DIR"/glade/anjuta-editor-scintilla.glade"
36 gchar *hilite_style[] = {
37 "Normal <Default>", "style.*.32",
38 "Comments", "style.default.comment",
39 "Numbers", "style.default.number",
40 "Keywords", "style.default.keyword",
41 "System Keywords", "style.default.syskeyword",
42 "Local Keywords", "style.default.localkeyword",
43 "Double Quoted Strings", "style.default.doublequote",
44 "Single Quoted Strings", "style.default.singlequote",
45 "Unclosed Strings", "style.default.unclosedstring",
46 "Operators","style.default.operator",
47 "Preprocessor Directives", "style.default.preprocessor",
48 "Identifiers (Not C Style)", "style.default.identifier",
49 "Definitions (Not C Style)", "style.default.definition",
50 "Functions (Not C Style)", "style.default.function",
51 "Matched Braces", "style.*.34",
52 "Incomplete Brace", "style.*.35",
53 "Control Characters", "style.*.36",
54 "Line Numbers", "style.*.33",
55 "Indentation Guides", "style.*.37",
56 NULL, NULL
59 typedef struct _StyleData StyleData;
61 struct _StyleData
63 gchar *item;
64 gchar *font;
65 gint size;
66 gboolean bold, italics, underlined;
67 gchar *fore, *back;
68 gboolean eolfilled;
70 gboolean font_use_default;
71 gboolean attrib_use_default;
72 gboolean fore_use_default;
73 gboolean back_use_default;
76 struct _StyleEditorPriv
78 /* Widgets */
79 GtkWidget *dialog;
80 GtkWidget *hilite_item_combo;
81 GtkWidget *font_picker;
82 GtkWidget *font_bold_check;
83 GtkWidget *font_italics_check;
84 GtkWidget *font_underlined_check;
85 GtkWidget *fore_colorpicker;
86 GtkWidget *back_colorpicker;
87 GtkWidget *font_use_default_check;
88 GtkWidget *font_attrib_use_default_check;
89 GtkWidget *fore_color_use_default_check;
90 GtkWidget *back_color_use_default_check;
91 GtkWidget *caret_fore_color;
92 GtkWidget *selection_fore_color;
93 GtkWidget *selection_back_color;
94 GtkWidget *calltip_back_color;
96 /* Data */
97 StyleData *default_style;
98 StyleData *current_style;
101 static gchar *
102 style_data_get_string (StyleData * sdata)
104 gchar *tmp, *str;
106 g_return_val_if_fail (sdata != NULL, NULL);
108 str = NULL;
109 if ((sdata->font) && strlen (sdata->font) && sdata->font_use_default == FALSE)
111 str = g_strconcat ("font:", sdata->font, NULL);
113 if (sdata->size > 0 && sdata->font_use_default == FALSE)
115 tmp = str;
116 if (tmp)
118 str =
119 g_strdup_printf ("%s,size:%d", tmp,
120 sdata->size);
121 g_free (tmp);
123 else
124 str = g_strdup_printf ("size:%d", sdata->size);
127 if (sdata->attrib_use_default == FALSE)
129 if (sdata->bold)
131 tmp = str;
132 if (tmp)
134 str = g_strconcat (tmp, ",bold", NULL);
135 g_free (tmp);
137 else
138 str = g_strdup ("bold");
140 else
142 tmp = str;
143 if (tmp)
145 str = g_strconcat (tmp, ",notbold", NULL);
146 g_free (tmp);
148 else
149 str = g_strdup ("notbold");
151 if (sdata->italics)
153 tmp = str;
154 if (tmp)
156 str = g_strconcat (tmp, ",italics", NULL);
157 g_free (tmp);
159 else
160 str = g_strdup ("italics");
162 else
164 tmp = str;
165 if (tmp)
167 str = g_strconcat (tmp, ",notitalics", NULL);
168 g_free (tmp);
170 else
171 str = g_strdup ("notitalics");
173 if (sdata->underlined)
175 tmp = str;
176 if (tmp)
178 str = g_strconcat (tmp, ",underlined", NULL);
179 g_free (tmp);
181 else
182 str = g_strdup ("underlined");
184 else
186 tmp = str;
187 if (tmp)
189 str =
190 g_strconcat (tmp, ",notunderlined",
191 NULL);
192 g_free (tmp);
194 else
195 str = g_strdup ("notunderlined");
197 if (sdata->eolfilled)
199 tmp = str;
200 if (tmp)
202 str = g_strconcat (tmp, ",eolfilled", NULL);
203 g_free (tmp);
205 else
206 str = g_strdup ("eolfilled");
208 else
210 tmp = str;
211 if (tmp)
213 str =
214 g_strconcat (tmp, ",noteolfilled",
215 NULL);
216 g_free (tmp);
218 else
219 str = g_strdup ("noteolfilled");
222 if (sdata->fore_use_default == FALSE)
224 tmp = str;
225 if (tmp)
227 str = g_strconcat (tmp, ",fore:", sdata->fore, NULL);
228 g_free (tmp);
230 else
231 str = g_strconcat ("fore:", sdata->fore, NULL);
233 if (sdata->back_use_default == FALSE)
235 tmp = str;
236 if (tmp)
238 str = g_strconcat (tmp, ",back:", sdata->back, NULL);
239 g_free (tmp);
241 else
242 str = g_strconcat ("back:", sdata->back, NULL);
244 if (str == NULL)
245 str = g_strdup ("");
246 return str;
249 static void
250 style_data_set_font (StyleData * sdata, const gchar *font)
252 PangoFontDescription *desc;
253 const gchar *font_family;
255 g_return_if_fail (sdata);
257 desc = pango_font_description_from_string (font);
258 font_family = pango_font_description_get_family(desc);
259 string_assign (&sdata->font, font_family);
261 /* Change to lower case */
262 if (sdata->font)
264 gchar *s = sdata->font;
265 while(*s)
267 *s = tolower(*s);
268 s++;
271 pango_font_description_free (desc);
274 static void
275 style_data_set_font_size_from_pango (StyleData * sdata, const gchar *font)
277 PangoFontDescription *desc;
279 g_return_if_fail (sdata);
281 desc = pango_font_description_from_string (font);
282 sdata->size = pango_font_description_get_size (desc) / PANGO_SCALE;
283 pango_font_description_free (desc);
286 static void
287 style_data_set_fore (StyleData * sdata, const gchar *fore)
289 g_return_if_fail (sdata);
290 string_assign (&sdata->fore, fore);
293 static void
294 style_data_set_back (StyleData * sdata, const gchar *back)
296 g_return_if_fail (sdata);
297 string_assign (&sdata->back, back);
300 static void
301 style_data_set_item (StyleData * sdata, const gchar *item)
303 g_return_if_fail (sdata);
304 string_assign (&sdata->item, item);
307 static StyleData *
308 style_data_new (void)
310 StyleData *sdata;
311 sdata = g_new0 (StyleData, 1);
313 sdata->font = g_strdup ("");
314 sdata->size = 12;
315 sdata->font_use_default = TRUE;
316 sdata->attrib_use_default = TRUE;
317 sdata->fore_use_default = TRUE;
318 sdata->back_use_default = TRUE;
319 style_data_set_fore (sdata, "#000000"); /* Black */
320 style_data_set_back (sdata, "#FFFFFF"); /* White */
321 return sdata;
324 static void
325 style_data_destroy (StyleData * sdata)
327 if (!sdata)
328 return;
329 if (sdata->item)
330 g_free (sdata->item);
331 if (sdata->font)
332 g_free (sdata->font);
333 if (sdata->fore)
334 g_free (sdata->fore);
335 if (sdata->back)
336 g_free (sdata->back);
337 g_free (sdata);
340 static StyleData *
341 style_data_new_parse (gchar * style_string)
343 gchar *val, *opt;
344 StyleData *style_data;
346 style_data = style_data_new ();
347 if (!style_data)
348 return NULL;
350 val = (style_string != NULL)? g_strdup (style_string) : NULL;
351 opt = val;
352 while (opt)
354 gchar *cpComma, *colon;
356 cpComma = strchr (opt, ',');
357 if (cpComma)
358 *cpComma = '\0';
359 colon = strchr (opt, ':');
360 if (colon)
361 *colon++ = '\0';
362 if (0 == strcmp (opt, "italics"))
364 style_data->italics = TRUE;
365 style_data->attrib_use_default = FALSE;
367 if (0 == strcmp (opt, "notitalics"))
369 style_data->italics = FALSE;
370 style_data->attrib_use_default = FALSE;
372 if (0 == strcmp (opt, "bold"))
374 style_data->bold = TRUE;
375 style_data->attrib_use_default = FALSE;
377 if (0 == strcmp (opt, "notbold"))
379 style_data->bold = FALSE;
380 style_data->attrib_use_default = FALSE;
382 if (0 == strcmp (opt, "font"))
384 style_data_set_font (style_data, colon);
385 style_data->font_use_default = FALSE;
387 if (0 == strcmp (opt, "fore"))
389 style_data_set_fore (style_data, colon);
390 style_data->fore_use_default = FALSE;
392 if (0 == strcmp (opt, "back"))
394 style_data_set_back (style_data, colon);
395 style_data->back_use_default = FALSE;
397 if (0 == strcmp (opt, "size"))
399 style_data->size = atoi (colon);
400 style_data->font_use_default = FALSE;
402 if (0 == strcmp (opt, "eolfilled"))
403 style_data->eolfilled = TRUE;
404 if (0 == strcmp (opt, "noteolfilled"))
405 style_data->eolfilled = FALSE;
406 if (0 == strcmp (opt, "underlined"))
408 style_data->underlined = TRUE;
409 style_data->attrib_use_default = FALSE;
411 if (0 == strcmp (opt, "notunderlined"))
413 style_data->underlined = FALSE;
414 style_data->fore_use_default = FALSE;
416 if (cpComma)
417 opt = cpComma + 1;
418 else
419 opt = NULL;
421 if (val)
422 g_free (val);
423 return style_data;
426 static void
427 on_use_default_font_toggled (GtkToggleButton * tb, gpointer data)
429 StyleEditor *p;
430 gchar* font_name;
431 gboolean state;
433 g_return_if_fail (data);
434 p = data;
436 gtk_widget_set_sensitive (p->priv->font_picker, TRUE);
437 state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb));
438 if (state)
440 font_name = g_strdup_printf ("%s %d",
441 p->priv->default_style->font,
442 p->priv->default_style->size);
444 else
446 if (p->priv->current_style->font &&
447 strlen (p->priv->current_style->font))
449 font_name = g_strdup_printf ("%s %d",
450 p->priv->current_style->font,
451 p->priv->current_style->size);
453 else
455 font_name = g_strdup_printf ("%s %d",
456 p->priv->default_style->font,
457 p->priv->default_style->size);
460 gtk_widget_set_sensitive (p->priv->font_picker, !state);
461 gtk_font_button_set_font_name (GTK_FONT_BUTTON (p->priv->font_picker),
462 font_name);
463 g_free(font_name);
466 static void
467 on_use_default_attrib_toggled (GtkToggleButton * tb, gpointer data)
469 StyleEditor *p;
471 g_return_if_fail (data);
472 p = data;
473 gtk_widget_set_sensitive (p->priv->font_bold_check, TRUE);
474 gtk_widget_set_sensitive (p->priv->font_italics_check, TRUE);
475 gtk_widget_set_sensitive (p->priv->font_underlined_check, TRUE);
476 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb)))
478 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
479 (p->priv->font_bold_check),
480 p->priv->default_style->bold);
481 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
482 (p->priv->font_italics_check),
483 p->priv->default_style->italics);
484 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
485 (p->priv->
486 font_underlined_check),
487 p->priv->default_style->underlined);
488 gtk_widget_set_sensitive (p->priv->font_bold_check, FALSE);
489 gtk_widget_set_sensitive (p->priv->font_italics_check,
490 FALSE);
491 gtk_widget_set_sensitive (p->priv->font_underlined_check,
492 FALSE);
494 else
496 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
497 (p->priv->font_bold_check),
498 p->priv->current_style->bold);
499 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
500 (p->priv->font_italics_check),
501 p->priv->current_style->italics);
502 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
503 (p->priv->
504 font_underlined_check),
505 p->priv->current_style->underlined);
509 static void
510 on_use_default_fore_toggled (GtkToggleButton * tb, gpointer data)
512 StyleEditor *p;
513 GdkColor color;
515 g_return_if_fail (data);
516 p = data;
518 gtk_widget_set_sensitive (p->priv->fore_colorpicker, TRUE);
519 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb)))
521 gdk_color_parse (p->priv->default_style->fore, &color);
522 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->fore_colorpicker),
523 &color);
524 gtk_widget_set_sensitive (p->priv->fore_colorpicker, FALSE);
526 else
528 gdk_color_parse (p->priv->current_style->fore, &color);
529 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->fore_colorpicker),
530 &color);
534 static void
535 on_use_default_back_toggled (GtkToggleButton * tb, gpointer data)
537 StyleEditor *p;
538 GdkColor color;
540 g_return_if_fail (data);
541 p = data;
542 gtk_widget_set_sensitive (p->priv->back_colorpicker, TRUE);
543 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb)))
545 gdk_color_parse (p->priv->current_style->back, &color);
546 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->back_colorpicker),
547 &color);
548 gtk_widget_set_sensitive (p->priv->back_colorpicker, FALSE);
550 else
552 gdk_color_parse (p->priv->default_style->back, &color);
553 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->back_colorpicker),
554 &color);
558 static void
559 on_hilite_style_entry_changed (GtkEditable * editable, gpointer user_data)
561 StyleEditor *p;
562 const gchar *style_item;
564 g_return_if_fail (user_data);
565 p = user_data;
567 style_item = gtk_entry_get_text (GTK_ENTRY (editable));
568 if (!style_item || strlen (style_item) <= 0)
569 return;
570 if (p->priv->current_style)
572 GdkColor color;
573 gchar *str;
574 const gchar *font;
576 font = gtk_font_button_get_font_name (GTK_FONT_BUTTON
577 (p->priv->font_picker));
578 if (font)
580 style_data_set_font (p->priv->current_style, font);
581 style_data_set_font_size_from_pango (p->priv->current_style, font);
583 else
585 style_data_set_font (p->priv->current_style,
586 p->priv->default_style->font);
587 p->priv->current_style->size = p->priv->default_style->size;
590 p->priv->current_style->bold =
591 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
592 (p->priv->font_bold_check));
593 p->priv->current_style->italics =
594 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
595 (p->priv->font_italics_check));
596 p->priv->current_style->underlined =
597 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
598 (p->priv->font_underlined_check));
599 p->priv->current_style->eolfilled =
600 (strcmp (style_item, hilite_style[1]) == 0);
602 gtk_color_button_get_color (GTK_COLOR_BUTTON (p->priv->fore_colorpicker),
603 &color);
604 str = anjuta_util_string_from_color (color.red,
605 color.green,
606 color.blue);
607 style_data_set_fore (p->priv->current_style, str);
608 g_free (str);
610 gtk_color_button_get_color (GTK_COLOR_BUTTON (p->priv->back_colorpicker),
611 &color);
612 str = anjuta_util_string_from_color (color.red,
613 color.green,
614 color.blue);
615 style_data_set_back (p->priv->current_style, str);
616 g_free (str);
618 p->priv->current_style->font_use_default =
619 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
620 (p->priv->font_use_default_check));
621 p->priv->current_style->attrib_use_default =
622 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
623 (p->priv->font_attrib_use_default_check));
624 p->priv->current_style->fore_use_default =
625 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
626 (p->priv->fore_color_use_default_check));
627 p->priv->current_style->back_use_default =
628 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
629 (p->priv->back_color_use_default_check));
631 p->priv->current_style =
632 g_object_get_data (G_OBJECT (p->priv->dialog),
633 style_item);
635 g_return_if_fail (p->priv->current_style);
637 /* We need to first toggle then set active to work properly */
638 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
639 (p->priv->font_use_default_check));
640 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
641 (p->priv->font_use_default_check),
642 p->priv->current_style->font_use_default);
644 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
645 (p->priv->font_attrib_use_default_check));
646 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
647 (p->priv->font_attrib_use_default_check),
648 p->priv->current_style->attrib_use_default);
650 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
651 (p->priv->fore_color_use_default_check));
652 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
653 (p->priv->fore_color_use_default_check),
654 p->priv->current_style->fore_use_default);
656 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
657 (p->priv->back_color_use_default_check));
658 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
659 (p->priv->back_color_use_default_check),
660 p->priv->current_style->back_use_default);
663 static void
664 sync_from_props (StyleEditor *se)
666 gint i;
667 gchar *str;
669 g_return_if_fail (se);
670 /* Never hurts to use g_object_*_data as temp hash buffer */
671 for (i = 0;; i += 2)
673 StyleData *sdata;
675 if (hilite_style[i] == NULL)
676 break;
677 str = sci_prop_get_expanded (se->props, hilite_style[i + 1]);
678 sdata = style_data_new_parse (str);
679 /* DEBUG_PRINT ("Parsing %s => %s", hilite_style[i + 1], str); */
680 if (str)
681 g_free (str);
683 style_data_set_item (sdata, hilite_style[i]);
684 g_object_set_data_full (G_OBJECT (se->priv->dialog),
685 hilite_style[i], sdata,
686 (GtkDestroyNotify)style_data_destroy);
688 se->priv->default_style =
689 gtk_object_get_data (GTK_OBJECT (se->priv->dialog),
690 hilite_style[0]);
691 se->priv->current_style = NULL;
693 on_hilite_style_entry_changed (GTK_EDITABLE (GTK_COMBO
694 (se->priv->hilite_item_combo)->entry), se);
696 str = sci_prop_get (se->props, CARET_FORE_COLOR);
697 if(str)
699 GdkColor color;
701 gdk_color_parse (str, &color);
702 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->caret_fore_color),
703 &color);
704 g_free (str);
706 else
708 GdkColor color;
710 gdk_color_parse ("#000000", &color);
711 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->caret_fore_color),
712 &color);
715 str = sci_prop_get (se->props, CALLTIP_BACK_COLOR);
716 if(str)
718 GdkColor color;
720 gdk_color_parse (str, &color);
721 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->calltip_back_color),
722 &color);
723 g_free (str);
725 else
727 GdkColor color;
729 gdk_color_parse ("#E6D6B6", &color);
730 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->calltip_back_color),
731 &color);
734 str = sci_prop_get (se->props, SELECTION_FORE_COLOR);
735 if(str)
737 GdkColor color;
739 gdk_color_parse (str, &color);
740 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_fore_color),
741 &color);
742 g_free (str);
744 else
746 GdkColor color;
748 gdk_color_parse ("#FFFFFF", &color);
749 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_fore_color),
750 &color);
753 str = sci_prop_get (se->props, SELECTION_BACK_COLOR);
754 if(str)
756 GdkColor color;
758 gdk_color_parse (str, &color);
759 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_back_color),
760 &color);
761 g_free (str);
763 else
765 GdkColor color;
767 gdk_color_parse ("#000000", &color);
768 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_back_color),
769 &color);
773 static void
774 set_one_color (PropsID props, gchar *key, GtkWidget *picker)
776 GdkColor color;
777 gchar *str;
778 gtk_color_button_get_color (GTK_COLOR_BUTTON (picker), &color);
779 str = anjuta_util_string_from_color (color.red,
780 color.green,
781 color.blue);
782 if(str)
784 sci_prop_set_with_key (props, key, str);
785 g_free (str);
789 static void
790 sync_to_props (StyleEditor *se)
792 gint i;
793 gchar *str;
795 g_return_if_fail (se);
796 /* Sync the current item */
797 on_hilite_style_entry_changed (GTK_EDITABLE (GTK_COMBO
798 (se->priv->hilite_item_combo)->entry), se);
800 /* Transfer to props */
801 for (i = 0;; i += 2)
803 StyleData *sdata;
805 if (hilite_style[i] == NULL)
806 break;
807 sdata =
808 gtk_object_get_data (GTK_OBJECT (se->priv->dialog),
809 hilite_style[i]);
810 str = style_data_get_string (sdata);
811 if (str)
813 sci_prop_set_with_key (se->props, hilite_style[i + 1], str);
814 g_free (str);
817 set_one_color (se->props, CARET_FORE_COLOR,
818 se->priv->caret_fore_color);
820 set_one_color (se->props, CALLTIP_BACK_COLOR,
821 se->priv->calltip_back_color);
823 set_one_color (se->props, SELECTION_FORE_COLOR,
824 se->priv->selection_fore_color);
826 set_one_color (se->props, SELECTION_BACK_COLOR,
827 se->priv->selection_back_color);
830 static void
831 apply_styles (StyleEditor *se)
833 FILE *ofile;
834 gchar *filename;
836 sync_to_props (se);
837 filename = anjuta_util_get_user_config_file_path ("scintilla","editor-style.properties",NULL);
838 ofile = fopen (filename, "w");
839 if (!ofile) {
840 DEBUG_PRINT ("Could not open %s for writing", filename);
841 } else {
842 style_editor_save (se, ofile);
843 fclose (ofile);
844 g_free (filename);
846 anjuta_preferences_set_int (se->prefs, DISABLE_SYNTAX_HILIGHTING, 1);
847 anjuta_preferences_set_int (se->prefs, DISABLE_SYNTAX_HILIGHTING, 0);
850 static void
851 on_response (GtkWidget *dialog, gint res, StyleEditor *se)
853 g_return_if_fail (se);
855 switch (res)
857 case GTK_RESPONSE_APPLY:
858 apply_styles (se);
859 return;
860 case GTK_RESPONSE_OK:
861 apply_styles (se);
862 case GTK_RESPONSE_CANCEL:
863 style_editor_hide (se);
864 return;
868 static void
869 on_delete_event (GtkWidget *dialog, GdkEvent *event, StyleEditor *se)
871 g_return_if_fail (se);
872 style_editor_hide (se);
875 static void
876 create_style_editor_gui (StyleEditor * se)
878 GladeXML *gxml;
879 GtkWidget *pref_dialog;
880 GList *list = NULL;
881 gint i;
883 g_return_if_fail (se);
884 g_return_if_fail (se->priv->dialog == NULL);
886 gxml = glade_xml_new (GLADE_FILE, "style_editor_dialog", NULL);
887 se->priv->dialog = glade_xml_get_widget (gxml, "style_editor_dialog");
888 gtk_widget_show (se->priv->dialog);
889 se->priv->font_picker = glade_xml_get_widget (gxml, "font");
890 se->priv->hilite_item_combo = glade_xml_get_widget (gxml, "combo");
891 se->priv->font_bold_check = glade_xml_get_widget (gxml, "bold");
892 se->priv->font_italics_check = glade_xml_get_widget (gxml, "italic");
893 se->priv->font_underlined_check = glade_xml_get_widget (gxml, "underlined");
894 se->priv->fore_colorpicker = glade_xml_get_widget (gxml, "fore_color");
895 se->priv->back_colorpicker = glade_xml_get_widget (gxml, "back_color");
896 se->priv->font_use_default_check = glade_xml_get_widget (gxml, "font_default");
897 se->priv->font_attrib_use_default_check = glade_xml_get_widget (gxml, "attributes_default");
898 se->priv->fore_color_use_default_check = glade_xml_get_widget (gxml, "fore_default");
899 se->priv->back_color_use_default_check = glade_xml_get_widget (gxml, "back_default");
900 se->priv->caret_fore_color = glade_xml_get_widget (gxml, "caret");
901 se->priv->calltip_back_color = glade_xml_get_widget (gxml, "calltip");
902 se->priv->selection_fore_color = glade_xml_get_widget (gxml, "selection_fore");
903 se->priv->selection_back_color = glade_xml_get_widget (gxml, "selection_back");
905 for (i = 0;; i += 2)
907 if (hilite_style[i] == NULL)
908 break;
909 list = g_list_append (list, hilite_style[i]);
911 gtk_combo_set_popdown_strings (GTK_COMBO (se->priv->hilite_item_combo), list);
912 g_list_free (list);
914 pref_dialog = anjuta_preferences_get_dialog (se->prefs);
915 gtk_window_set_transient_for (GTK_WINDOW (se->priv->dialog),
916 GTK_WINDOW (pref_dialog));
918 g_signal_connect (G_OBJECT (GTK_COMBO(se->priv->hilite_item_combo)->entry),
919 "changed", G_CALLBACK (on_hilite_style_entry_changed),
920 se);
921 g_signal_connect (G_OBJECT (se->priv->font_use_default_check),
922 "toggled", G_CALLBACK (on_use_default_font_toggled),
923 se);
924 g_signal_connect (G_OBJECT (se->priv->font_attrib_use_default_check),
925 "toggled", G_CALLBACK (on_use_default_attrib_toggled),
926 se);
927 g_signal_connect (G_OBJECT (se->priv->fore_color_use_default_check),
928 "toggled", G_CALLBACK (on_use_default_fore_toggled),
929 se);
930 g_signal_connect (G_OBJECT (se->priv->back_color_use_default_check),
931 "toggled", G_CALLBACK (on_use_default_back_toggled),
932 se);
933 g_signal_connect (G_OBJECT (se->priv->dialog),
934 "delete_event", G_CALLBACK (on_delete_event),
935 se);
936 g_signal_connect (G_OBJECT (se->priv->dialog),
937 "response", G_CALLBACK (on_response),
938 se);
939 g_object_unref (gxml);
942 StyleEditor *
943 style_editor_new (AnjutaPreferences *prefs)
945 StyleEditor *se;
946 se = g_new0 (StyleEditor, 1);
947 se->priv = g_new0 (StyleEditorPriv, 1);
948 se->props = text_editor_get_props ();
949 se->priv->dialog = NULL;
950 se->prefs = prefs;
951 return se;
954 void style_editor_destroy (StyleEditor *se)
956 g_return_if_fail (se);
957 if (se->priv->dialog)
958 gtk_widget_destroy (se->priv->dialog);
959 g_free (se->priv);
960 g_free (se);
963 void style_editor_show (StyleEditor *se)
965 g_return_if_fail (se);
966 if (se->priv->dialog)
967 return;
968 create_style_editor_gui (se);
969 sync_from_props (se);
972 void style_editor_hide (StyleEditor *se)
974 g_return_if_fail (se);
975 g_return_if_fail (se->priv->dialog);
976 gtk_widget_destroy (se->priv->dialog);
977 se->priv->dialog = NULL;
980 void
981 style_editor_save (StyleEditor *se, FILE *fp)
983 gint i;
984 gchar *str;
986 for (i = 0;; i += 2)
988 if (hilite_style[i] == NULL)
989 break;
990 str = sci_prop_get (se->props, hilite_style[i + 1]);
991 if (str)
993 fprintf (fp, "%s=%s\n", hilite_style[i + 1], str);
994 g_free (str);
996 /* else
997 fprintf (fp, "%s=\n", hilite_style[i + 1]); */
999 str = sci_prop_get (se->props, CARET_FORE_COLOR);
1000 if(str)
1002 fprintf (fp, "%s=%s\n", CARET_FORE_COLOR, str);
1003 g_free (str);
1006 str = sci_prop_get (se->props, CALLTIP_BACK_COLOR);
1007 if(str)
1009 fprintf (fp, "%s=%s\n", CALLTIP_BACK_COLOR, str);
1010 g_free (str);
1013 str = sci_prop_get (se->props, SELECTION_FORE_COLOR);
1014 if(str)
1016 fprintf (fp, "%s=%s\n", SELECTION_FORE_COLOR, str);
1017 g_free (str);
1020 str = sci_prop_get (se->props, SELECTION_BACK_COLOR);
1021 if(str)
1023 fprintf (fp, "%s=%s\n", SELECTION_BACK_COLOR, str);
1024 g_free (str);