1 /* GIMP - The GNU Image Manipulation Program
2  * Copyright (C) 1995 Spencer Kimball and Peter Mattis
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 3 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
16  */
17 
18 #include "config.h"
19 
20 #include <gegl.h>
21 #include <gtk/gtk.h>
22 
23 #include "libgimpbase/gimpbase.h"
24 #include "libgimpconfig/gimpconfig.h"
25 #include "libgimpwidgets/gimpwidgets.h"
26 
27 #include "tools-types.h"
28 
29 #include "config/gimpconfig-utils.h"
30 
31 #include "core/gimp.h"
32 #include "core/gimpdatafactory.h"
33 #include "core/gimptoolinfo.h"
34 #include "core/gimpviewable.h"
35 
36 #include "text/gimptext.h"
37 
38 #include "widgets/gimpcolorpanel.h"
39 #include "widgets/gimpmenufactory.h"
40 #include "widgets/gimppropwidgets.h"
41 #include "widgets/gimptextbuffer.h"
42 #include "widgets/gimptexteditor.h"
43 #include "widgets/gimpviewablebox.h"
44 #include "widgets/gimpwidgets-utils.h"
45 
46 #include "gimptextoptions.h"
47 #include "gimptooloptions-gui.h"
48 
49 #include "gimp-intl.h"
50 
51 
52 enum
53 {
54   PROP_0,
55   PROP_FONT_SIZE,
56   PROP_UNIT,
57   PROP_ANTIALIAS,
58   PROP_HINT_STYLE,
59   PROP_LANGUAGE,
60   PROP_BASE_DIR,
61   PROP_JUSTIFICATION,
62   PROP_INDENTATION,
63   PROP_LINE_SPACING,
64   PROP_LETTER_SPACING,
65   PROP_BOX_MODE,
66 
67   PROP_USE_EDITOR,
68 
69   PROP_FONT_VIEW_TYPE,
70   PROP_FONT_VIEW_SIZE
71 };
72 
73 
74 static void  gimp_text_options_config_iface_init (GimpConfigInterface *config_iface);
75 
76 static void  gimp_text_options_finalize           (GObject         *object);
77 static void  gimp_text_options_set_property       (GObject         *object,
78                                                    guint            property_id,
79                                                    const GValue    *value,
80                                                    GParamSpec      *pspec);
81 static void  gimp_text_options_get_property       (GObject         *object,
82                                                    guint            property_id,
83                                                    GValue          *value,
84                                                    GParamSpec      *pspec);
85 
86 static void  gimp_text_options_reset              (GimpConfig      *config);
87 
88 static void  gimp_text_options_notify_font        (GimpContext     *context,
89                                                    GParamSpec      *pspec,
90                                                    GimpText        *text);
91 static void  gimp_text_options_notify_text_font   (GimpText        *text,
92                                                    GParamSpec      *pspec,
93                                                    GimpContext     *context);
94 static void  gimp_text_options_notify_color       (GimpContext     *context,
95                                                    GParamSpec      *pspec,
96                                                    GimpText        *text);
97 static void  gimp_text_options_notify_text_color  (GimpText        *text,
98                                                    GParamSpec      *pspec,
99                                                    GimpContext     *context);
100 
101 
102 G_DEFINE_TYPE_WITH_CODE (GimpTextOptions, gimp_text_options,
103                          GIMP_TYPE_TOOL_OPTIONS,
104                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG,
105                                                 gimp_text_options_config_iface_init))
106 
107 #define parent_class gimp_text_options_parent_class
108 
109 static GimpConfigInterface *parent_config_iface = NULL;
110 
111 
112 static void
gimp_text_options_class_init(GimpTextOptionsClass * klass)113 gimp_text_options_class_init (GimpTextOptionsClass *klass)
114 {
115   GObjectClass *object_class = G_OBJECT_CLASS (klass);
116 
117   object_class->finalize     = gimp_text_options_finalize;
118   object_class->set_property = gimp_text_options_set_property;
119   object_class->get_property = gimp_text_options_get_property;
120 
121   GIMP_CONFIG_PROP_UNIT (object_class, PROP_UNIT,
122                          "font-size-unit",
123                          _("Unit"),
124                          _("Font size unit"),
125                          TRUE, FALSE, GIMP_UNIT_PIXEL,
126                          GIMP_PARAM_STATIC_STRINGS);
127   GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_FONT_SIZE,
128                            "font-size",
129                            _("Font size"),
130                            _("Font size"),
131                            0.0, 8192.0, 62.0,
132                            GIMP_PARAM_STATIC_STRINGS);
133 
134   GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_ANTIALIAS,
135                             "antialias",
136                             _("Antialiasing"),
137                             NULL,
138                             TRUE,
139                             GIMP_PARAM_STATIC_STRINGS);
140 
141   GIMP_CONFIG_PROP_ENUM (object_class, PROP_HINT_STYLE,
142                          "hint-style",
143                          _("Hinting"),
144                          _("Hinting alters the font outline to "
145                            "produce a crisp bitmap at small "
146                            "sizes"),
147                          GIMP_TYPE_TEXT_HINT_STYLE,
148                          GIMP_TEXT_HINT_STYLE_MEDIUM,
149                          GIMP_PARAM_STATIC_STRINGS);
150 
151   GIMP_CONFIG_PROP_STRING (object_class, PROP_LANGUAGE,
152                            "language",
153                            _("Language"),
154                            _("The text language may have an effect "
155                              "on the way the text is rendered."),
156                            (const gchar *) gtk_get_default_language (),
157                            GIMP_PARAM_STATIC_STRINGS);
158 
159   GIMP_CONFIG_PROP_ENUM (object_class, PROP_BASE_DIR,
160                          "base-direction",
161                          NULL, NULL,
162                          GIMP_TYPE_TEXT_DIRECTION,
163                          GIMP_TEXT_DIRECTION_LTR,
164                          GIMP_PARAM_STATIC_STRINGS);
165 
166   GIMP_CONFIG_PROP_ENUM (object_class, PROP_JUSTIFICATION,
167                          "justify",
168                          _("Justify"),
169                          _("Text alignment"),
170                          GIMP_TYPE_TEXT_JUSTIFICATION,
171                          GIMP_TEXT_JUSTIFY_LEFT,
172                          GIMP_PARAM_STATIC_STRINGS);
173 
174   GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_INDENTATION,
175                            "indent",
176                            _("Indentation"),
177                            _("Indentation of the first line"),
178                            -8192.0, 8192.0, 0.0,
179                            GIMP_PARAM_STATIC_STRINGS |
180                            GIMP_CONFIG_PARAM_DEFAULTS);
181 
182   GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_LINE_SPACING,
183                            "line-spacing",
184                            _("Line spacing"),
185                            _("Adjust line spacing"),
186                            -8192.0, 8192.0, 0.0,
187                            GIMP_PARAM_STATIC_STRINGS |
188                            GIMP_CONFIG_PARAM_DEFAULTS);
189 
190   GIMP_CONFIG_PROP_DOUBLE (object_class, PROP_LETTER_SPACING,
191                            "letter-spacing",
192                            _("Letter spacing"),
193                            _("Adjust letter spacing"),
194                            -8192.0, 8192.0, 0.0,
195                            GIMP_PARAM_STATIC_STRINGS |
196                            GIMP_CONFIG_PARAM_DEFAULTS);
197 
198   GIMP_CONFIG_PROP_ENUM (object_class, PROP_BOX_MODE,
199                          "box-mode",
200                          _("Box"),
201                          _("Whether text flows into rectangular shape or "
202                            "moves into a new line when you press Enter"),
203                          GIMP_TYPE_TEXT_BOX_MODE,
204                          GIMP_TEXT_BOX_DYNAMIC,
205                          GIMP_PARAM_STATIC_STRINGS);
206 
207   GIMP_CONFIG_PROP_BOOLEAN (object_class, PROP_USE_EDITOR,
208                             "use-editor",
209                             _("Use editor"),
210                             _("Use an external editor window for text entry"),
211                             FALSE,
212                             GIMP_PARAM_STATIC_STRINGS);
213 
214   GIMP_CONFIG_PROP_ENUM (object_class, PROP_FONT_VIEW_TYPE,
215                          "font-view-type",
216                          NULL, NULL,
217                          GIMP_TYPE_VIEW_TYPE,
218                          GIMP_VIEW_TYPE_LIST,
219                          GIMP_PARAM_STATIC_STRINGS);
220   GIMP_CONFIG_PROP_INT (object_class, PROP_FONT_VIEW_SIZE,
221                         "font-view-size",
222                         NULL, NULL,
223                         GIMP_VIEW_SIZE_TINY,
224                         GIMP_VIEWABLE_MAX_BUTTON_SIZE,
225                         GIMP_VIEW_SIZE_SMALL,
226                         GIMP_PARAM_STATIC_STRINGS);
227 }
228 
229 static void
gimp_text_options_config_iface_init(GimpConfigInterface * config_iface)230 gimp_text_options_config_iface_init (GimpConfigInterface *config_iface)
231 {
232   parent_config_iface = g_type_interface_peek_parent (config_iface);
233 
234   config_iface->reset = gimp_text_options_reset;
235 }
236 
237 static void
gimp_text_options_init(GimpTextOptions * options)238 gimp_text_options_init (GimpTextOptions *options)
239 {
240   options->size_entry = NULL;
241 }
242 
243 static void
gimp_text_options_finalize(GObject * object)244 gimp_text_options_finalize (GObject *object)
245 {
246   GimpTextOptions *options = GIMP_TEXT_OPTIONS (object);
247 
248   g_clear_pointer (&options->language, g_free);
249 
250   G_OBJECT_CLASS (parent_class)->finalize (object);
251 }
252 
253 static void
gimp_text_options_get_property(GObject * object,guint property_id,GValue * value,GParamSpec * pspec)254 gimp_text_options_get_property (GObject    *object,
255                                 guint       property_id,
256                                 GValue     *value,
257                                 GParamSpec *pspec)
258 {
259   GimpTextOptions *options = GIMP_TEXT_OPTIONS (object);
260 
261   switch (property_id)
262     {
263     case PROP_FONT_SIZE:
264       g_value_set_double (value, options->font_size);
265       break;
266     case PROP_UNIT:
267       g_value_set_int (value, options->unit);
268       break;
269     case PROP_ANTIALIAS:
270       g_value_set_boolean (value, options->antialias);
271       break;
272     case PROP_HINT_STYLE:
273       g_value_set_enum (value, options->hint_style);
274       break;
275     case PROP_LANGUAGE:
276       g_value_set_string (value, options->language);
277       break;
278     case PROP_BASE_DIR:
279       g_value_set_enum (value, options->base_dir);
280       break;
281     case PROP_JUSTIFICATION:
282       g_value_set_enum (value, options->justify);
283       break;
284     case PROP_INDENTATION:
285       g_value_set_double (value, options->indent);
286       break;
287     case PROP_LINE_SPACING:
288       g_value_set_double (value, options->line_spacing);
289       break;
290     case PROP_LETTER_SPACING:
291       g_value_set_double (value, options->letter_spacing);
292       break;
293     case PROP_BOX_MODE:
294       g_value_set_enum (value, options->box_mode);
295       break;
296 
297     case PROP_USE_EDITOR:
298       g_value_set_boolean (value, options->use_editor);
299       break;
300 
301     case PROP_FONT_VIEW_TYPE:
302       g_value_set_enum (value, options->font_view_type);
303       break;
304     case PROP_FONT_VIEW_SIZE:
305       g_value_set_int (value, options->font_view_size);
306       break;
307 
308     default:
309       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
310       break;
311     }
312 }
313 
314 static void
gimp_text_options_set_property(GObject * object,guint property_id,const GValue * value,GParamSpec * pspec)315 gimp_text_options_set_property (GObject      *object,
316                                 guint         property_id,
317                                 const GValue *value,
318                                 GParamSpec   *pspec)
319 {
320   GimpTextOptions *options = GIMP_TEXT_OPTIONS (object);
321 
322   switch (property_id)
323     {
324     case PROP_FONT_SIZE:
325       options->font_size = g_value_get_double (value);
326       break;
327     case PROP_UNIT:
328       options->unit = g_value_get_int (value);
329       break;
330     case PROP_ANTIALIAS:
331       options->antialias = g_value_get_boolean (value);
332       break;
333     case PROP_HINT_STYLE:
334       options->hint_style = g_value_get_enum (value);
335       break;
336     case PROP_BASE_DIR:
337       options->base_dir = g_value_get_enum (value);
338       break;
339     case PROP_LANGUAGE:
340       g_free (options->language);
341       options->language = g_value_dup_string (value);
342       break;
343     case PROP_JUSTIFICATION:
344       options->justify = g_value_get_enum (value);
345       break;
346     case PROP_INDENTATION:
347       options->indent = g_value_get_double (value);
348       break;
349     case PROP_LINE_SPACING:
350       options->line_spacing = g_value_get_double (value);
351       break;
352     case PROP_LETTER_SPACING:
353       options->letter_spacing = g_value_get_double (value);
354       break;
355     case PROP_BOX_MODE:
356       options->box_mode = g_value_get_enum (value);
357       break;
358 
359     case PROP_USE_EDITOR:
360       options->use_editor = g_value_get_boolean (value);
361       break;
362 
363     case PROP_FONT_VIEW_TYPE:
364       options->font_view_type = g_value_get_enum (value);
365       break;
366     case PROP_FONT_VIEW_SIZE:
367       options->font_view_size = g_value_get_int (value);
368       break;
369 
370     default:
371       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
372       break;
373     }
374 }
375 
376 static void
gimp_text_options_reset(GimpConfig * config)377 gimp_text_options_reset (GimpConfig *config)
378 {
379   GObject *object = G_OBJECT (config);
380 
381   /*  implement reset() ourselves because the default impl would
382    *  reset *all* properties, including all rectangle properties
383    *  of the text box
384    */
385 
386   /* context */
387   gimp_config_reset_property (object, "font");
388   gimp_config_reset_property (object, "foreground");
389 
390   /* text options */
391   gimp_config_reset_property (object, "font-size");
392   gimp_config_reset_property (object, "font-size-unit");
393   gimp_config_reset_property (object, "antialias");
394   gimp_config_reset_property (object, "hint-style");
395   gimp_config_reset_property (object, "language");
396   gimp_config_reset_property (object, "base-direction");
397   gimp_config_reset_property (object, "justify");
398   gimp_config_reset_property (object, "indent");
399   gimp_config_reset_property (object, "line-spacing");
400   gimp_config_reset_property (object, "letter-spacing");
401   gimp_config_reset_property (object, "box-mode");
402   gimp_config_reset_property (object, "use-editor");
403 }
404 
405 static void
gimp_text_options_notify_font(GimpContext * context,GParamSpec * pspec,GimpText * text)406 gimp_text_options_notify_font (GimpContext *context,
407                                GParamSpec  *pspec,
408                                GimpText    *text)
409 {
410   g_signal_handlers_block_by_func (text,
411                                    gimp_text_options_notify_text_font,
412                                    context);
413 
414   g_object_set (text, "font", gimp_context_get_font_name (context), NULL);
415 
416   g_signal_handlers_unblock_by_func (text,
417                                      gimp_text_options_notify_text_font,
418                                      context);
419 }
420 
421 static void
gimp_text_options_notify_text_font(GimpText * text,GParamSpec * pspec,GimpContext * context)422 gimp_text_options_notify_text_font (GimpText    *text,
423                                     GParamSpec  *pspec,
424                                     GimpContext *context)
425 {
426   g_signal_handlers_block_by_func (context,
427                                    gimp_text_options_notify_font, text);
428 
429   gimp_context_set_font_name (context, text->font);
430 
431   g_signal_handlers_unblock_by_func (context,
432                                      gimp_text_options_notify_font, text);
433 }
434 
435 static void
gimp_text_options_notify_color(GimpContext * context,GParamSpec * pspec,GimpText * text)436 gimp_text_options_notify_color (GimpContext *context,
437                                 GParamSpec  *pspec,
438                                 GimpText    *text)
439 {
440   GimpRGB  color;
441 
442   gimp_context_get_foreground (context, &color);
443 
444   g_signal_handlers_block_by_func (text,
445                                    gimp_text_options_notify_text_color,
446                                    context);
447 
448   g_object_set (text, "color", &color, NULL);
449 
450   g_signal_handlers_unblock_by_func (text,
451                                      gimp_text_options_notify_text_color,
452                                      context);
453 }
454 
455 static void
gimp_text_options_notify_text_color(GimpText * text,GParamSpec * pspec,GimpContext * context)456 gimp_text_options_notify_text_color (GimpText    *text,
457                                      GParamSpec  *pspec,
458                                      GimpContext *context)
459 {
460   g_signal_handlers_block_by_func (context,
461                                    gimp_text_options_notify_color, text);
462 
463   gimp_context_set_foreground (context, &text->color);
464 
465   g_signal_handlers_unblock_by_func (context,
466                                      gimp_text_options_notify_color, text);
467 }
468 
469 /*  This function could live in gimptexttool.c also.
470  *  But it takes some bloat out of that file...
471  */
472 void
gimp_text_options_connect_text(GimpTextOptions * options,GimpText * text)473 gimp_text_options_connect_text (GimpTextOptions *options,
474                                 GimpText        *text)
475 {
476   GimpContext *context;
477   GimpRGB      color;
478 
479   g_return_if_fail (GIMP_IS_TEXT_OPTIONS (options));
480   g_return_if_fail (GIMP_IS_TEXT (text));
481 
482   context = GIMP_CONTEXT (options);
483 
484   gimp_context_get_foreground (context, &color);
485 
486   gimp_config_sync (G_OBJECT (options), G_OBJECT (text), 0);
487 
488   g_object_set (text,
489                 "color", &color,
490                 "font",  gimp_context_get_font_name (context),
491                 NULL);
492 
493   gimp_config_connect (G_OBJECT (options), G_OBJECT (text), NULL);
494 
495   g_signal_connect_object (options, "notify::font",
496                            G_CALLBACK (gimp_text_options_notify_font),
497                            text, 0);
498   g_signal_connect_object (text, "notify::font",
499                            G_CALLBACK (gimp_text_options_notify_text_font),
500                            options, 0);
501 
502   g_signal_connect_object (options, "notify::foreground",
503                            G_CALLBACK (gimp_text_options_notify_color),
504                            text, 0);
505   g_signal_connect_object (text, "notify::color",
506                            G_CALLBACK (gimp_text_options_notify_text_color),
507                            options, 0);
508 }
509 
510 GtkWidget *
gimp_text_options_gui(GimpToolOptions * tool_options)511 gimp_text_options_gui (GimpToolOptions *tool_options)
512 {
513   GObject         *config    = G_OBJECT (tool_options);
514   GimpTextOptions *options   = GIMP_TEXT_OPTIONS (tool_options);
515   GtkWidget       *main_vbox = gimp_tool_options_gui (tool_options);
516   GimpAsyncSet    *async_set;
517   GtkWidget       *options_vbox;
518   GtkWidget       *table;
519   GtkWidget       *vbox;
520   GtkWidget       *hbox;
521   GtkWidget       *button;
522   GtkWidget       *entry;
523   GtkWidget       *box;
524   GtkWidget       *spinbutton;
525   GtkWidget       *combo;
526   GtkSizeGroup    *size_group;
527   gint             row = 0;
528 
529   async_set =
530     gimp_data_factory_get_async_set (tool_options->tool_info->gimp->font_factory);
531 
532   box = gimp_busy_box_new (_("Loading fonts (this may take a while...)"));
533   gtk_container_set_border_width (GTK_CONTAINER (box), 8);
534   gtk_box_pack_start (GTK_BOX (main_vbox), box, FALSE, FALSE, 0);
535 
536   g_object_bind_property (async_set, "empty",
537                           box,       "visible",
538                           G_BINDING_SYNC_CREATE |
539                           G_BINDING_INVERT_BOOLEAN);
540 
541   options_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL,
542                               gtk_box_get_spacing (GTK_BOX (main_vbox)));
543   gtk_box_pack_start (GTK_BOX (main_vbox), options_vbox, FALSE, FALSE, 0);
544   gtk_widget_show (options_vbox);
545 
546   g_object_bind_property (async_set,    "empty",
547                           options_vbox, "sensitive",
548                           G_BINDING_SYNC_CREATE);
549 
550   hbox = gimp_prop_font_box_new (NULL, GIMP_CONTEXT (tool_options),
551                                  _("Font"), 2,
552                                  "font-view-type", "font-view-size");
553   gtk_box_pack_start (GTK_BOX (options_vbox), hbox, FALSE, FALSE, 0);
554   gtk_widget_show (hbox);
555 
556   table = gtk_table_new (1, 3, FALSE);
557   gtk_table_set_col_spacings (GTK_TABLE (table), 2);
558   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
559   gtk_box_pack_start (GTK_BOX (options_vbox), table, FALSE, FALSE, 0);
560   gtk_widget_show (table);
561 
562   entry = gimp_prop_size_entry_new (config,
563                                     "font-size", FALSE, "font-size-unit", "%p",
564                                     GIMP_SIZE_ENTRY_UPDATE_SIZE, 72.0);
565   gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
566                              _("Size:"), 0.0, 0.5,
567                              entry, 2, FALSE);
568 
569   options->size_entry = entry;
570 
571   vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
572   gtk_box_pack_start (GTK_BOX (options_vbox), vbox, FALSE, FALSE, 0);
573   gtk_widget_show (vbox);
574 
575   button = gimp_prop_check_button_new (config, "use-editor", NULL);
576   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
577   gtk_widget_show (button);
578 
579   button = gimp_prop_check_button_new (config, "antialias", NULL);
580   gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
581   gtk_widget_show (button);
582 
583   table = gtk_table_new (6, 3, FALSE);
584   gtk_table_set_col_spacings (GTK_TABLE (table), 2);
585   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
586   gtk_box_pack_start (GTK_BOX (options_vbox), table, FALSE, FALSE, 0);
587   gtk_widget_show (table);
588 
589   row = 0;
590 
591   size_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
592 
593   button = gimp_prop_enum_combo_box_new (config, "hint-style", -1, -1);
594   gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
595                              _("Hinting:"), 0.0, 0.5,
596                              button, 1, TRUE);
597   gtk_size_group_add_widget (size_group, button);
598 
599   button = gimp_prop_color_button_new (config, "foreground", _("Text Color"),
600                                        40, 24, GIMP_COLOR_AREA_FLAT);
601   gimp_color_panel_set_context (GIMP_COLOR_PANEL (button),
602                                 GIMP_CONTEXT (options));
603   gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
604                              _("Color:"), 0.0, 0.5,
605                              button, 1, TRUE);
606   gtk_size_group_add_widget (size_group, button);
607 
608   box = gimp_prop_enum_icon_box_new (config, "justify", "format-justify", 0, 0);
609   gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
610                              _("Justify:"), 0.0, 0.5,
611                              box, 2, TRUE);
612   gtk_size_group_add_widget (size_group, box);
613   g_object_unref (size_group);
614 
615   spinbutton = gimp_prop_spin_button_new (config, "indent", 1.0, 10.0, 1);
616   gtk_entry_set_width_chars (GTK_ENTRY (spinbutton), 5);
617   gimp_table_attach_icon (GTK_TABLE (table), row++,
618                           GIMP_ICON_FORMAT_INDENT_MORE,
619                           spinbutton, 1, TRUE);
620 
621   spinbutton = gimp_prop_spin_button_new (config, "line-spacing", 1.0, 10.0, 1);
622   gtk_entry_set_width_chars (GTK_ENTRY (spinbutton), 5);
623   gimp_table_attach_icon (GTK_TABLE (table), row++,
624                           GIMP_ICON_FORMAT_TEXT_SPACING_LINE,
625                           spinbutton, 1, TRUE);
626 
627   spinbutton = gimp_prop_spin_button_new (config,
628                                           "letter-spacing", 1.0, 10.0, 1);
629   gtk_entry_set_width_chars (GTK_ENTRY (spinbutton), 5);
630   gimp_table_attach_icon (GTK_TABLE (table), row++,
631                           GIMP_ICON_FORMAT_TEXT_SPACING_LETTER,
632                           spinbutton, 1, TRUE);
633 
634   combo = gimp_prop_enum_combo_box_new (config, "box-mode", 0, 0);
635   gimp_table_attach_aligned (GTK_TABLE (table), 0, row++,
636                              _("Box:"), 0.0, 0.5,
637                              combo, 1, TRUE);
638 
639   /*  Only add the language entry if the iso-codes package is available.  */
640 
641 #ifdef HAVE_ISO_CODES
642   {
643     GtkWidget *label;
644 
645     vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 2);
646     gtk_box_pack_start (GTK_BOX (options_vbox), vbox, FALSE, FALSE, 0);
647     gtk_widget_show (vbox);
648 
649     hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
650     gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
651     gtk_widget_show (hbox);
652 
653     label = gtk_label_new (_("Language:"));
654     gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
655     gtk_widget_show (label);
656 
657     entry = gimp_prop_language_entry_new (config, "language");
658     gtk_box_pack_start (GTK_BOX (vbox), entry, FALSE, FALSE, 0);
659     gtk_widget_show (entry);
660   }
661 #endif
662 
663   return main_vbox;
664 }
665 
666 static void
gimp_text_options_editor_dir_changed(GimpTextEditor * editor,GimpTextOptions * options)667 gimp_text_options_editor_dir_changed (GimpTextEditor  *editor,
668                                       GimpTextOptions *options)
669 {
670   g_object_set (options,
671                 "base-direction", editor->base_dir,
672                 NULL);
673 }
674 
675 static void
gimp_text_options_editor_notify_dir(GimpTextOptions * options,GParamSpec * pspec,GimpTextEditor * editor)676 gimp_text_options_editor_notify_dir (GimpTextOptions *options,
677                                      GParamSpec      *pspec,
678                                      GimpTextEditor  *editor)
679 {
680   GimpTextDirection  dir;
681 
682   g_object_get (options,
683                 "base-direction", &dir,
684                 NULL);
685 
686   gimp_text_editor_set_direction (editor, dir);
687 }
688 
689 static void
gimp_text_options_editor_notify_font(GimpTextOptions * options,GParamSpec * pspec,GimpTextEditor * editor)690 gimp_text_options_editor_notify_font (GimpTextOptions *options,
691                                       GParamSpec      *pspec,
692                                       GimpTextEditor  *editor)
693 {
694   const gchar *font_name;
695 
696   font_name = gimp_context_get_font_name (GIMP_CONTEXT (options));
697 
698   gimp_text_editor_set_font_name (editor, font_name);
699 }
700 
701 GtkWidget *
gimp_text_options_editor_new(GtkWindow * parent,Gimp * gimp,GimpTextOptions * options,GimpMenuFactory * menu_factory,const gchar * title,GimpText * text,GimpTextBuffer * text_buffer,gdouble xres,gdouble yres)702 gimp_text_options_editor_new (GtkWindow       *parent,
703                               Gimp            *gimp,
704                               GimpTextOptions *options,
705                               GimpMenuFactory *menu_factory,
706                               const gchar     *title,
707                               GimpText        *text,
708                               GimpTextBuffer  *text_buffer,
709                               gdouble          xres,
710                               gdouble          yres)
711 {
712   GtkWidget   *editor;
713   const gchar *font_name;
714 
715   g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
716   g_return_val_if_fail (GIMP_IS_TEXT_OPTIONS (options), NULL);
717   g_return_val_if_fail (GIMP_IS_MENU_FACTORY (menu_factory), NULL);
718   g_return_val_if_fail (title != NULL, NULL);
719   g_return_val_if_fail (GIMP_IS_TEXT (text), NULL);
720   g_return_val_if_fail (GIMP_IS_TEXT_BUFFER (text_buffer), NULL);
721 
722   editor = gimp_text_editor_new (title, parent, gimp, menu_factory,
723                                  text, text_buffer, xres, yres);
724 
725   font_name = gimp_context_get_font_name (GIMP_CONTEXT (options));
726 
727   gimp_text_editor_set_direction (GIMP_TEXT_EDITOR (editor),
728                                   options->base_dir);
729   gimp_text_editor_set_font_name (GIMP_TEXT_EDITOR (editor),
730                                   font_name);
731 
732   g_signal_connect_object (editor, "dir-changed",
733                            G_CALLBACK (gimp_text_options_editor_dir_changed),
734                            options, 0);
735   g_signal_connect_object (options, "notify::base-direction",
736                            G_CALLBACK (gimp_text_options_editor_notify_dir),
737                            editor, 0);
738   g_signal_connect_object (options, "notify::font",
739                            G_CALLBACK (gimp_text_options_editor_notify_font),
740                            editor, 0);
741 
742   return editor;
743 }
744