scintilla: Update scintilla with changeset 3662:1d1c06df8a2f using gtk+3
[anjuta-extras.git] / plugins / scintilla / style-editor.c
blobff54584d39dfdbbf069419a3e8e6971ce3f92d24
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 <stdlib.h>
25 #include <gtk/gtk.h>
26 #include <gdk/gdk.h>
27 #include <gdk/gdkkeysyms.h>
29 #include <libanjuta/anjuta-utils.h>
30 #include <libanjuta/anjuta-debug.h>
32 #include "text_editor.h"
33 #include "style-editor.h"
35 #define string_assign(dest, src) g_free ((*dest)); (*dest) = g_strdup ((src));
36 #define GLADE_FILE PACKAGE_DATA_DIR"/glade/anjuta-editor-scintilla.ui"
38 gchar *hilite_style[] = {
39 "Normal <Default>", "style.anjuta.normal",
40 "White space", "style.anjuta.whitespace",
41 "Comments", "style.anjuta.comment",
42 "Numbers", "style.anjuta.number",
43 "Operators","style.anjuta.operator",
44 "Keywords", "style.anjuta.keyword",
45 "System Keywords", "style.anjuta.syskeyword",
46 "Local Keywords", "style.anjuta.localkeyword",
47 "Additional Keywords", "style.anjuta.extrakeyword",
48 "Characters", "style.anjuta.char",
49 "Strings", "style.anjuta.string",
50 "Raw Strings", "style.anjuta.raws",
51 "Regular Expression", "style.anjuta.regex",
52 "Unclosed Strings", "style.anjuta.unclosed",
53 "Preprocessor Directives", "style.anjuta.preprocessor",
54 "Errors", "style.anjuta.error",
55 "Identifiers (Not C Style)", "style.anjuta.identifier",
56 "Definitions (Not C Style)", "style.anjuta.definition",
57 "Functions (Not C Style)", "style.anjuta.function",
58 "Attribute (Not C Style)", "style.anjuta.attribute",
59 "Matched Braces", "style.anjuta.matchbrace",
60 "Incomplete Brace", "style.anjuta.singlebrace",
61 "Control Characters", "style.anjuta.controlchar",
62 "Line Numbers", "style.anjuta.linenumber",
63 "Indentation Guides", "style.anjuta.indentguide",
64 NULL, NULL
67 typedef struct _StyleData StyleData;
69 struct _StyleData
71 gchar *item;
72 gchar *font;
73 gint size;
74 gboolean bold, italics, underlined;
75 gchar *fore, *back;
76 gboolean eolfilled;
78 gboolean font_use_default;
79 gboolean attrib_use_default;
80 gboolean fore_use_default;
81 gboolean back_use_default;
84 struct _StyleEditorPriv
86 /* Widgets */
87 GtkWidget *dialog;
88 GtkWidget *hilite_item_combobox;
89 GtkWidget *font_picker;
90 GtkWidget *font_bold_check;
91 GtkWidget *font_italics_check;
92 GtkWidget *font_underlined_check;
93 GtkWidget *fore_colorpicker;
94 GtkWidget *back_colorpicker;
95 GtkWidget *font_use_default_check;
96 GtkWidget *font_attrib_use_default_check;
97 GtkWidget *fore_color_use_default_check;
98 GtkWidget *back_color_use_default_check;
99 GtkWidget *caret_fore_color;
100 GtkWidget *selection_fore_color;
101 GtkWidget *selection_back_color;
102 GtkWidget *calltip_back_color;
104 /* Data */
105 StyleData *default_style;
106 StyleData *current_style;
109 static gchar *
110 style_data_get_string (StyleData * sdata)
112 gchar *tmp, *str;
114 g_return_val_if_fail (sdata != NULL, NULL);
116 str = NULL;
117 if ((sdata->font) && strlen (sdata->font) && sdata->font_use_default == FALSE)
119 str = g_strconcat ("font:", sdata->font, NULL);
121 if (sdata->size > 0 && sdata->font_use_default == FALSE)
123 tmp = str;
124 if (tmp)
126 str =
127 g_strdup_printf ("%s,size:%d", tmp,
128 sdata->size);
129 g_free (tmp);
131 else
132 str = g_strdup_printf ("size:%d", sdata->size);
135 if (sdata->attrib_use_default == FALSE)
137 if (sdata->bold)
139 tmp = str;
140 if (tmp)
142 str = g_strconcat (tmp, ",bold", NULL);
143 g_free (tmp);
145 else
146 str = g_strdup ("bold");
148 else
150 tmp = str;
151 if (tmp)
153 str = g_strconcat (tmp, ",notbold", NULL);
154 g_free (tmp);
156 else
157 str = g_strdup ("notbold");
159 if (sdata->italics)
161 tmp = str;
162 if (tmp)
164 str = g_strconcat (tmp, ",italics", NULL);
165 g_free (tmp);
167 else
168 str = g_strdup ("italics");
170 else
172 tmp = str;
173 if (tmp)
175 str = g_strconcat (tmp, ",notitalics", NULL);
176 g_free (tmp);
178 else
179 str = g_strdup ("notitalics");
181 if (sdata->underlined)
183 tmp = str;
184 if (tmp)
186 str = g_strconcat (tmp, ",underlined", NULL);
187 g_free (tmp);
189 else
190 str = g_strdup ("underlined");
192 else
194 tmp = str;
195 if (tmp)
197 str =
198 g_strconcat (tmp, ",notunderlined",
199 NULL);
200 g_free (tmp);
202 else
203 str = g_strdup ("notunderlined");
205 if (sdata->eolfilled)
207 tmp = str;
208 if (tmp)
210 str = g_strconcat (tmp, ",eolfilled", NULL);
211 g_free (tmp);
213 else
214 str = g_strdup ("eolfilled");
216 else
218 tmp = str;
219 if (tmp)
221 str =
222 g_strconcat (tmp, ",noteolfilled",
223 NULL);
224 g_free (tmp);
226 else
227 str = g_strdup ("noteolfilled");
230 if (sdata->fore_use_default == FALSE)
232 tmp = str;
233 if (tmp)
235 str = g_strconcat (tmp, ",fore:", sdata->fore, NULL);
236 g_free (tmp);
238 else
239 str = g_strconcat ("fore:", sdata->fore, NULL);
241 if (sdata->back_use_default == FALSE)
243 tmp = str;
244 if (tmp)
246 str = g_strconcat (tmp, ",back:", sdata->back, NULL);
247 g_free (tmp);
249 else
250 str = g_strconcat ("back:", sdata->back, NULL);
252 if (str == NULL)
253 str = g_strdup ("");
254 return str;
257 static void
258 style_data_set_font (StyleData * sdata, const gchar *font)
260 PangoFontDescription *desc;
261 const gchar *font_family;
263 g_return_if_fail (sdata);
265 desc = pango_font_description_from_string (font);
266 font_family = pango_font_description_get_family(desc);
267 string_assign (&sdata->font, font_family);
269 /* Change to lower case */
270 if (sdata->font)
272 gchar *s = sdata->font;
273 while(*s)
275 *s = tolower(*s);
276 s++;
279 pango_font_description_free (desc);
282 static void
283 style_data_set_font_size_from_pango (StyleData * sdata, const gchar *font)
285 PangoFontDescription *desc;
287 g_return_if_fail (sdata);
289 desc = pango_font_description_from_string (font);
290 sdata->size = pango_font_description_get_size (desc) / PANGO_SCALE;
291 pango_font_description_free (desc);
294 static void
295 style_data_set_fore (StyleData * sdata, const gchar *fore)
297 g_return_if_fail (sdata);
298 string_assign (&sdata->fore, fore);
301 static void
302 style_data_set_back (StyleData * sdata, const gchar *back)
304 g_return_if_fail (sdata);
305 string_assign (&sdata->back, back);
308 static void
309 style_data_set_item (StyleData * sdata, const gchar *item)
311 g_return_if_fail (sdata);
312 string_assign (&sdata->item, item);
315 static StyleData *
316 style_data_new (void)
318 StyleData *sdata;
319 sdata = g_new0 (StyleData, 1);
321 sdata->font = g_strdup ("");
322 sdata->size = 12;
323 sdata->font_use_default = TRUE;
324 sdata->attrib_use_default = TRUE;
325 sdata->fore_use_default = TRUE;
326 sdata->back_use_default = TRUE;
327 style_data_set_fore (sdata, "#000000"); /* Black */
328 style_data_set_back (sdata, "#FFFFFF"); /* White */
329 return sdata;
332 static void
333 style_data_destroy (StyleData * sdata)
335 if (!sdata)
336 return;
337 if (sdata->item)
338 g_free (sdata->item);
339 if (sdata->font)
340 g_free (sdata->font);
341 if (sdata->fore)
342 g_free (sdata->fore);
343 if (sdata->back)
344 g_free (sdata->back);
345 g_free (sdata);
348 static StyleData *
349 style_data_new_parse (gchar * style_string)
351 gchar *val, *opt;
352 StyleData *style_data;
354 style_data = style_data_new ();
355 if (!style_data)
356 return NULL;
358 val = (style_string != NULL)? g_strdup (style_string) : NULL;
359 opt = val;
360 while (opt)
362 gchar *cpComma, *colon;
364 cpComma = strchr (opt, ',');
365 if (cpComma)
366 *cpComma = '\0';
367 colon = strchr (opt, ':');
368 if (colon)
369 *colon++ = '\0';
370 if (0 == strcmp (opt, "italics"))
372 style_data->italics = TRUE;
373 style_data->attrib_use_default = FALSE;
375 if (0 == strcmp (opt, "notitalics"))
377 style_data->italics = FALSE;
378 style_data->attrib_use_default = FALSE;
380 if (0 == strcmp (opt, "bold"))
382 style_data->bold = TRUE;
383 style_data->attrib_use_default = FALSE;
385 if (0 == strcmp (opt, "notbold"))
387 style_data->bold = FALSE;
388 style_data->attrib_use_default = FALSE;
390 if (0 == strcmp (opt, "font"))
392 style_data_set_font (style_data, colon);
393 style_data->font_use_default = FALSE;
395 if (0 == strcmp (opt, "fore"))
397 style_data_set_fore (style_data, colon);
398 style_data->fore_use_default = FALSE;
400 if (0 == strcmp (opt, "back"))
402 style_data_set_back (style_data, colon);
403 style_data->back_use_default = FALSE;
405 if (0 == strcmp (opt, "size"))
407 style_data->size = atoi (colon);
408 style_data->font_use_default = FALSE;
410 if (0 == strcmp (opt, "eolfilled"))
411 style_data->eolfilled = TRUE;
412 if (0 == strcmp (opt, "noteolfilled"))
413 style_data->eolfilled = FALSE;
414 if (0 == strcmp (opt, "underlined"))
416 style_data->underlined = TRUE;
417 style_data->attrib_use_default = FALSE;
419 if (0 == strcmp (opt, "notunderlined"))
421 style_data->underlined = FALSE;
422 style_data->fore_use_default = FALSE;
424 if (cpComma)
425 opt = cpComma + 1;
426 else
427 opt = NULL;
429 if (val)
430 g_free (val);
431 return style_data;
434 static void
435 on_use_default_font_toggled (GtkToggleButton * tb, gpointer data)
437 StyleEditor *p;
438 gchar* font_name;
439 gboolean state;
441 g_return_if_fail (data);
442 p = data;
444 gtk_widget_set_sensitive (p->priv->font_picker, TRUE);
445 state = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb));
446 if (state)
448 font_name = g_strdup_printf ("%s %d",
449 p->priv->default_style->font,
450 p->priv->default_style->size);
452 else
454 if (p->priv->current_style->font &&
455 strlen (p->priv->current_style->font))
457 font_name = g_strdup_printf ("%s %d",
458 p->priv->current_style->font,
459 p->priv->current_style->size);
461 else
463 font_name = g_strdup_printf ("%s %d",
464 p->priv->default_style->font,
465 p->priv->default_style->size);
468 gtk_widget_set_sensitive (p->priv->font_picker, !state);
469 gtk_font_button_set_font_name (GTK_FONT_BUTTON (p->priv->font_picker),
470 font_name);
471 g_free(font_name);
474 static void
475 on_use_default_attrib_toggled (GtkToggleButton * tb, gpointer data)
477 StyleEditor *p;
479 g_return_if_fail (data);
480 p = data;
481 gtk_widget_set_sensitive (p->priv->font_bold_check, TRUE);
482 gtk_widget_set_sensitive (p->priv->font_italics_check, TRUE);
483 gtk_widget_set_sensitive (p->priv->font_underlined_check, TRUE);
484 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb)))
486 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
487 (p->priv->font_bold_check),
488 p->priv->default_style->bold);
489 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
490 (p->priv->font_italics_check),
491 p->priv->default_style->italics);
492 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
493 (p->priv->
494 font_underlined_check),
495 p->priv->default_style->underlined);
496 gtk_widget_set_sensitive (p->priv->font_bold_check, FALSE);
497 gtk_widget_set_sensitive (p->priv->font_italics_check,
498 FALSE);
499 gtk_widget_set_sensitive (p->priv->font_underlined_check,
500 FALSE);
502 else
504 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
505 (p->priv->font_bold_check),
506 p->priv->current_style->bold);
507 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
508 (p->priv->font_italics_check),
509 p->priv->current_style->italics);
510 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
511 (p->priv->
512 font_underlined_check),
513 p->priv->current_style->underlined);
517 static void
518 on_use_default_fore_toggled (GtkToggleButton * tb, gpointer data)
520 StyleEditor *p;
521 GdkColor color;
523 g_return_if_fail (data);
524 p = data;
526 gtk_widget_set_sensitive (p->priv->fore_colorpicker, TRUE);
527 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb)))
529 gdk_color_parse (p->priv->default_style->fore, &color);
530 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->fore_colorpicker),
531 &color);
532 gtk_widget_set_sensitive (p->priv->fore_colorpicker, FALSE);
534 else
536 gdk_color_parse (p->priv->current_style->fore, &color);
537 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->fore_colorpicker),
538 &color);
542 static void
543 on_use_default_back_toggled (GtkToggleButton * tb, gpointer data)
545 StyleEditor *p;
546 GdkColor color;
548 g_return_if_fail (data);
549 p = data;
550 gtk_widget_set_sensitive (p->priv->back_colorpicker, TRUE);
551 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (tb)))
553 gdk_color_parse (p->priv->current_style->back, &color);
554 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->back_colorpicker),
555 &color);
556 gtk_widget_set_sensitive (p->priv->back_colorpicker, FALSE);
558 else
560 gdk_color_parse (p->priv->default_style->back, &color);
561 gtk_color_button_set_color (GTK_COLOR_BUTTON (p->priv->back_colorpicker),
562 &color);
566 static void
567 on_hilite_style_entry_changed (GtkComboBox * combobox, gpointer user_data)
569 StyleEditor *p;
570 const gchar *style_item;
572 g_return_if_fail (user_data);
573 p = user_data;
575 style_item = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (combobox));
576 if (!style_item || strlen (style_item) <= 0)
577 return;
578 if (p->priv->current_style)
580 GdkColor color;
581 gchar *str;
582 const gchar *font;
584 font = gtk_font_button_get_font_name (GTK_FONT_BUTTON
585 (p->priv->font_picker));
586 if (font)
588 style_data_set_font (p->priv->current_style, font);
589 style_data_set_font_size_from_pango (p->priv->current_style, font);
591 else
593 style_data_set_font (p->priv->current_style,
594 p->priv->default_style->font);
595 p->priv->current_style->size = p->priv->default_style->size;
598 p->priv->current_style->bold =
599 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
600 (p->priv->font_bold_check));
601 p->priv->current_style->italics =
602 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
603 (p->priv->font_italics_check));
604 p->priv->current_style->underlined =
605 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
606 (p->priv->font_underlined_check));
607 p->priv->current_style->eolfilled =
608 (strcmp (style_item, hilite_style[1]) == 0);
610 gtk_color_button_get_color (GTK_COLOR_BUTTON (p->priv->fore_colorpicker),
611 &color);
612 str = anjuta_util_string_from_color (color.red,
613 color.green,
614 color.blue);
615 style_data_set_fore (p->priv->current_style, str);
616 g_free (str);
618 gtk_color_button_get_color (GTK_COLOR_BUTTON (p->priv->back_colorpicker),
619 &color);
620 str = anjuta_util_string_from_color (color.red,
621 color.green,
622 color.blue);
623 style_data_set_back (p->priv->current_style, str);
624 g_free (str);
626 p->priv->current_style->font_use_default =
627 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
628 (p->priv->font_use_default_check));
629 p->priv->current_style->attrib_use_default =
630 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
631 (p->priv->font_attrib_use_default_check));
632 p->priv->current_style->fore_use_default =
633 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
634 (p->priv->fore_color_use_default_check));
635 p->priv->current_style->back_use_default =
636 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON
637 (p->priv->back_color_use_default_check));
639 p->priv->current_style =
640 g_object_get_data (G_OBJECT (p->priv->dialog),
641 style_item);
643 g_return_if_fail (p->priv->current_style);
645 /* We need to first toggle then set active to work properly */
646 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
647 (p->priv->font_use_default_check));
648 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
649 (p->priv->font_use_default_check),
650 p->priv->current_style->font_use_default);
652 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
653 (p->priv->font_attrib_use_default_check));
654 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
655 (p->priv->font_attrib_use_default_check),
656 p->priv->current_style->attrib_use_default);
658 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
659 (p->priv->fore_color_use_default_check));
660 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
661 (p->priv->fore_color_use_default_check),
662 p->priv->current_style->fore_use_default);
664 gtk_toggle_button_toggled (GTK_TOGGLE_BUTTON
665 (p->priv->back_color_use_default_check));
666 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON
667 (p->priv->back_color_use_default_check),
668 p->priv->current_style->back_use_default);
671 static void
672 sync_from_props (StyleEditor *se)
674 gint i;
675 gchar *str;
677 g_return_if_fail (se);
678 /* Never hurts to use g_object_*_data as temp hash buffer */
679 for (i = 0;; i += 2)
681 StyleData *sdata;
683 if (hilite_style[i] == NULL)
684 break;
685 str = sci_prop_get_expanded (se->props, hilite_style[i + 1]);
686 sdata = style_data_new_parse (str);
687 /* DEBUG_PRINT ("Parsing %s => %s", hilite_style[i + 1], str); */
688 if (str)
689 g_free (str);
691 style_data_set_item (sdata, hilite_style[i]);
692 g_object_set_data_full (G_OBJECT (se->priv->dialog),
693 hilite_style[i], sdata,
694 (GDestroyNotify)style_data_destroy);
696 se->priv->default_style =
697 g_object_get_data (G_OBJECT (se->priv->dialog),
698 hilite_style[0]);
699 se->priv->current_style = NULL;
701 on_hilite_style_entry_changed (GTK_COMBO_BOX (se->priv->hilite_item_combobox), se);
703 str = sci_prop_get (se->props, CARET_FORE_COLOR);
704 if(str)
706 GdkColor color;
708 gdk_color_parse (str, &color);
709 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->caret_fore_color),
710 &color);
711 g_free (str);
713 else
715 GdkColor color;
717 gdk_color_parse ("#000000", &color);
718 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->caret_fore_color),
719 &color);
722 str = sci_prop_get (se->props, CALLTIP_BACK_COLOR);
723 if(str)
725 GdkColor color;
727 gdk_color_parse (str, &color);
728 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->calltip_back_color),
729 &color);
730 g_free (str);
732 else
734 GdkColor color;
736 gdk_color_parse ("#E6D6B6", &color);
737 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->calltip_back_color),
738 &color);
741 str = sci_prop_get (se->props, SELECTION_FORE_COLOR);
742 if(str)
744 GdkColor color;
746 gdk_color_parse (str, &color);
747 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_fore_color),
748 &color);
749 g_free (str);
751 else
753 GdkColor color;
755 gdk_color_parse ("#FFFFFF", &color);
756 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_fore_color),
757 &color);
760 str = sci_prop_get (se->props, SELECTION_BACK_COLOR);
761 if(str)
763 GdkColor color;
765 gdk_color_parse (str, &color);
766 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_back_color),
767 &color);
768 g_free (str);
770 else
772 GdkColor color;
774 gdk_color_parse ("#000000", &color);
775 gtk_color_button_set_color (GTK_COLOR_BUTTON (se->priv->selection_back_color),
776 &color);
780 static void
781 set_one_color (PropsID props, gchar *key, GtkWidget *picker)
783 GdkColor color;
784 gchar *str;
785 gtk_color_button_get_color (GTK_COLOR_BUTTON (picker), &color);
786 str = anjuta_util_string_from_color (color.red,
787 color.green,
788 color.blue);
789 if(str)
791 sci_prop_set_with_key (props, key, str);
792 g_free (str);
796 static void
797 sync_to_props (StyleEditor *se)
799 gint i;
800 gchar *str;
802 g_return_if_fail (se);
803 /* Sync the current item */
804 on_hilite_style_entry_changed (GTK_COMBO_BOX (se->priv->hilite_item_combobox), se);
806 /* Transfer to props */
807 for (i = 0;; i += 2)
809 StyleData *sdata;
811 if (hilite_style[i] == NULL)
812 break;
813 sdata =
814 g_object_get_data (G_OBJECT (se->priv->dialog),
815 hilite_style[i]);
816 str = style_data_get_string (sdata);
817 if (str)
819 sci_prop_set_with_key (se->props, hilite_style[i + 1], str);
820 g_free (str);
823 set_one_color (se->props, CARET_FORE_COLOR,
824 se->priv->caret_fore_color);
826 set_one_color (se->props, CALLTIP_BACK_COLOR,
827 se->priv->calltip_back_color);
829 set_one_color (se->props, SELECTION_FORE_COLOR,
830 se->priv->selection_fore_color);
832 set_one_color (se->props, SELECTION_BACK_COLOR,
833 se->priv->selection_back_color);
836 static void
837 apply_styles (StyleEditor *se)
839 FILE *ofile;
840 gchar *filename;
842 sync_to_props (se);
843 filename = anjuta_util_get_user_config_file_path ("scintilla","editor-style.properties",NULL);
844 ofile = fopen (filename, "w");
845 if (!ofile) {
846 DEBUG_PRINT ("Could not open %s for writing", filename);
847 } else {
848 style_editor_save (se, ofile);
849 fclose (ofile);
850 g_free (filename);
852 g_settings_set_int (se->settings, DISABLE_SYNTAX_HILIGHTING, 1);
853 g_settings_set_int (se->settings, DISABLE_SYNTAX_HILIGHTING, 0);
856 static void
857 on_response (GtkWidget *dialog, gint res, StyleEditor *se)
859 g_return_if_fail (se);
861 switch (res)
863 case GTK_RESPONSE_APPLY:
864 apply_styles (se);
865 return;
866 case GTK_RESPONSE_OK:
867 apply_styles (se);
868 case GTK_RESPONSE_CANCEL:
869 style_editor_hide (se);
870 return;
874 static void
875 on_delete_event (GtkWidget *dialog, GdkEvent *event, StyleEditor *se)
877 g_return_if_fail (se);
878 style_editor_hide (se);
881 static void
882 create_style_editor_gui (StyleEditor * se)
884 GtkBuilder *bxml = gtk_builder_new ();
885 GtkWidget *pref_dialog;
886 gint i;
887 GError* error = NULL;
889 g_return_if_fail (se);
890 g_return_if_fail (se->priv->dialog == NULL);
892 if (!gtk_builder_add_from_file (bxml, GLADE_FILE, &error))
894 g_warning ("Couldn't load builder file: %s", error->message);
895 g_error_free (error);
898 se->priv->dialog = GTK_WIDGET (gtk_builder_get_object (bxml, "style_editor_dialog"));
899 gtk_widget_show (se->priv->dialog);
900 se->priv->font_picker = GTK_WIDGET (gtk_builder_get_object (bxml, "font"));
901 se->priv->hilite_item_combobox = GTK_WIDGET (gtk_builder_get_object (bxml, "comboBox"));
902 se->priv->font_bold_check = GTK_WIDGET (gtk_builder_get_object (bxml, "bold"));
903 se->priv->font_italics_check = GTK_WIDGET (gtk_builder_get_object (bxml, "italic"));
904 se->priv->font_underlined_check = GTK_WIDGET (gtk_builder_get_object (bxml, "underlined"));
905 se->priv->fore_colorpicker = GTK_WIDGET (gtk_builder_get_object (bxml, "fore_color"));
906 se->priv->back_colorpicker = GTK_WIDGET (gtk_builder_get_object (bxml, "back_color"));
907 se->priv->font_use_default_check = GTK_WIDGET (gtk_builder_get_object (bxml, "font_default"));
908 se->priv->font_attrib_use_default_check = GTK_WIDGET (gtk_builder_get_object (bxml, "attributes_default"));
909 se->priv->fore_color_use_default_check = GTK_WIDGET (gtk_builder_get_object (bxml, "fore_default"));
910 se->priv->back_color_use_default_check = GTK_WIDGET (gtk_builder_get_object (bxml, "back_default"));
911 se->priv->caret_fore_color = GTK_WIDGET (gtk_builder_get_object (bxml, "caret"));
912 se->priv->calltip_back_color = GTK_WIDGET (gtk_builder_get_object (bxml, "calltip"));
913 se->priv->selection_fore_color = GTK_WIDGET (gtk_builder_get_object (bxml, "selection_fore"));
914 se->priv->selection_back_color = GTK_WIDGET (gtk_builder_get_object (bxml, "selection_back"));
916 for (i = 0;; i += 2)
918 if (hilite_style[i] == NULL)
919 break;
920 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (se->priv->hilite_item_combobox), hilite_style[i]);
924 pref_dialog = anjuta_preferences_get_dialog (se->prefs);
925 gtk_window_set_transient_for (GTK_WINDOW (se->priv->dialog),
926 GTK_WINDOW (pref_dialog));
928 g_signal_connect (se->priv->hilite_item_combobox, "changed", G_CALLBACK (on_hilite_style_entry_changed),
929 se);
930 g_signal_connect (G_OBJECT (se->priv->font_use_default_check),
931 "toggled", G_CALLBACK (on_use_default_font_toggled),
932 se);
933 g_signal_connect (G_OBJECT (se->priv->font_attrib_use_default_check),
934 "toggled", G_CALLBACK (on_use_default_attrib_toggled),
935 se);
936 g_signal_connect (G_OBJECT (se->priv->fore_color_use_default_check),
937 "toggled", G_CALLBACK (on_use_default_fore_toggled),
938 se);
939 g_signal_connect (G_OBJECT (se->priv->back_color_use_default_check),
940 "toggled", G_CALLBACK (on_use_default_back_toggled),
941 se);
942 g_signal_connect (G_OBJECT (se->priv->dialog),
943 "delete_event", G_CALLBACK (on_delete_event),
944 se);
945 g_signal_connect (G_OBJECT (se->priv->dialog),
946 "response", G_CALLBACK (on_response),
947 se);
948 g_object_unref (bxml);
951 StyleEditor *
952 style_editor_new (AnjutaPreferences *prefs, GSettings *settings)
954 StyleEditor *se;
955 se = g_new0 (StyleEditor, 1);
956 se->priv = g_new0 (StyleEditorPriv, 1);
957 se->props = text_editor_get_props ();
958 se->priv->dialog = NULL;
959 se->prefs = prefs;
960 se->settings = g_object_ref (settings);
961 return se;
964 void style_editor_destroy (StyleEditor *se)
966 g_return_if_fail (se);
967 if (se->priv->dialog)
968 gtk_widget_destroy (se->priv->dialog);
969 g_free (se->priv);
970 g_object_unref (se->settings);
971 g_free (se);
974 void style_editor_show (StyleEditor *se)
976 g_return_if_fail (se);
977 if (se->priv->dialog)
978 return;
979 create_style_editor_gui (se);
980 sync_from_props (se);
983 void style_editor_hide (StyleEditor *se)
985 g_return_if_fail (se);
986 g_return_if_fail (se->priv->dialog);
987 gtk_widget_destroy (se->priv->dialog);
988 se->priv->dialog = NULL;
991 void
992 style_editor_save (StyleEditor *se, FILE *fp)
994 gint i;
995 gchar *str;
997 for (i = 0;; i += 2)
999 if (hilite_style[i] == NULL)
1000 break;
1001 str = sci_prop_get (se->props, hilite_style[i + 1]);
1002 if (str)
1004 fprintf (fp, "%s=%s\n", hilite_style[i + 1], str);
1005 g_free (str);
1007 /* else
1008 fprintf (fp, "%s=\n", hilite_style[i + 1]); */
1010 str = sci_prop_get (se->props, CARET_FORE_COLOR);
1011 if(str)
1013 fprintf (fp, "%s=%s\n", CARET_FORE_COLOR, str);
1014 g_free (str);
1017 str = sci_prop_get (se->props, CALLTIP_BACK_COLOR);
1018 if(str)
1020 fprintf (fp, "%s=%s\n", CALLTIP_BACK_COLOR, str);
1021 g_free (str);
1024 str = sci_prop_get (se->props, SELECTION_FORE_COLOR);
1025 if(str)
1027 fprintf (fp, "%s=%s\n", SELECTION_FORE_COLOR, str);
1028 g_free (str);
1031 str = sci_prop_get (se->props, SELECTION_BACK_COLOR);
1032 if(str)
1034 fprintf (fp, "%s=%s\n", SELECTION_BACK_COLOR, str);
1035 g_free (str);