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