1 | /*
|
---|
2 | * Copyright (C) 2008 Carlos Garcia Campos <carlosgc@gnome.org>
|
---|
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 2, or (at your option)
|
---|
7 | * 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, write to the Free Software
|
---|
16 | * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
|
---|
17 | */
|
---|
18 |
|
---|
19 | #include <string.h>
|
---|
20 |
|
---|
21 | #include "text.h"
|
---|
22 | #include "utils.h"
|
---|
23 |
|
---|
24 | enum {
|
---|
25 | TEXT_X1_COLUMN,
|
---|
26 | TEXT_Y1_COLUMN,
|
---|
27 | TEXT_X2_COLUMN,
|
---|
28 | TEXT_Y2_COLUMN,
|
---|
29 | TEXT_OFFSET_COLUMN,
|
---|
30 | TEXT_OFFPTR_COLUMN,
|
---|
31 | N_COLUMNS
|
---|
32 | };
|
---|
33 |
|
---|
34 | typedef struct {
|
---|
35 | PopplerDocument *doc;
|
---|
36 |
|
---|
37 | GtkWidget *timer_label;
|
---|
38 | GtkTextBuffer *buffer;
|
---|
39 | GtkWidget *treeview;
|
---|
40 | GtkListStore *model;
|
---|
41 | GtkWidget *area_x1;
|
---|
42 | GtkWidget *area_y1;
|
---|
43 | GtkWidget *area_x2;
|
---|
44 | GtkWidget *area_y2;
|
---|
45 |
|
---|
46 | /* Text attributes */
|
---|
47 | GList *text_attrs;
|
---|
48 | GtkWidget *font_name;
|
---|
49 | GtkWidget *font_size;
|
---|
50 | GtkWidget *is_underlined;
|
---|
51 | GtkWidget *text_color;
|
---|
52 |
|
---|
53 | gint page;
|
---|
54 | PopplerRectangle area;
|
---|
55 | } PgdTextDemo;
|
---|
56 |
|
---|
57 | static void
|
---|
58 | pgd_text_free (PgdTextDemo *demo)
|
---|
59 | {
|
---|
60 | if (!demo)
|
---|
61 | return;
|
---|
62 |
|
---|
63 | if (demo->doc) {
|
---|
64 | g_object_unref (demo->doc);
|
---|
65 | demo->doc = NULL;
|
---|
66 | }
|
---|
67 |
|
---|
68 | if (demo->buffer) {
|
---|
69 | g_object_unref (demo->buffer);
|
---|
70 | demo->buffer = NULL;
|
---|
71 | }
|
---|
72 |
|
---|
73 | if (demo->text_attrs) {
|
---|
74 | poppler_page_free_text_attributes (demo->text_attrs);
|
---|
75 | demo->text_attrs = NULL;
|
---|
76 | }
|
---|
77 |
|
---|
78 | if (demo->model) {
|
---|
79 | g_object_unref (demo->model);
|
---|
80 | demo->model = NULL;
|
---|
81 | }
|
---|
82 |
|
---|
83 | g_free (demo);
|
---|
84 | }
|
---|
85 |
|
---|
86 | static void
|
---|
87 | pgd_text_get_text (GtkWidget *button,
|
---|
88 | PgdTextDemo *demo)
|
---|
89 | {
|
---|
90 | PopplerPage *page;
|
---|
91 | PopplerRectangle *recs = NULL;
|
---|
92 | guint n_recs;
|
---|
93 | gchar *text;
|
---|
94 | GTimer *timer;
|
---|
95 | gint i;
|
---|
96 |
|
---|
97 | page = poppler_document_get_page (demo->doc, demo->page);
|
---|
98 | if (!page)
|
---|
99 | return;
|
---|
100 |
|
---|
101 | gtk_list_store_clear (demo->model);
|
---|
102 | if (demo->text_attrs)
|
---|
103 | poppler_page_free_text_attributes (demo->text_attrs);
|
---|
104 | demo->text_attrs = NULL;
|
---|
105 |
|
---|
106 | timer = g_timer_new ();
|
---|
107 | text = poppler_page_get_text_for_area (page, &demo->area);
|
---|
108 | g_timer_stop (timer);
|
---|
109 |
|
---|
110 | if (text) {
|
---|
111 | gchar *str;
|
---|
112 | gdouble text_elapsed, layout_elapsed;
|
---|
113 |
|
---|
114 | text_elapsed = g_timer_elapsed (timer, NULL);
|
---|
115 |
|
---|
116 | g_timer_start (timer);
|
---|
117 | poppler_page_get_text_layout_for_area (page, &demo->area, &recs, &n_recs);
|
---|
118 | g_timer_stop (timer);
|
---|
119 |
|
---|
120 | layout_elapsed = g_timer_elapsed (timer, NULL);
|
---|
121 |
|
---|
122 | g_timer_start (timer);
|
---|
123 | demo->text_attrs = poppler_page_get_text_attributes_for_area (page, &demo->area);
|
---|
124 | g_timer_stop (timer);
|
---|
125 |
|
---|
126 | str = g_strdup_printf ("<i>got %ld chars in %.4f seconds, %u layout units in %.4f seconds, text attrs in %.4f seconds</i>",
|
---|
127 | g_utf8_strlen(text, -1), text_elapsed, n_recs, layout_elapsed, g_timer_elapsed (timer, NULL));
|
---|
128 | gtk_label_set_markup (GTK_LABEL (demo->timer_label), str);
|
---|
129 | g_free (str);
|
---|
130 | } else {
|
---|
131 | gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No text found</i>");
|
---|
132 | n_recs = 0;
|
---|
133 | }
|
---|
134 |
|
---|
135 | g_timer_destroy (timer);
|
---|
136 | g_object_unref (page);
|
---|
137 |
|
---|
138 | if (text) {
|
---|
139 | gtk_text_buffer_set_text (demo->buffer, text, strlen (text));
|
---|
140 | g_free (text);
|
---|
141 | }
|
---|
142 |
|
---|
143 | for (i = 0; i < n_recs; i++) {
|
---|
144 | GtkTreeIter iter;
|
---|
145 | gchar *x1, *y1, *x2, *y2;
|
---|
146 | gchar *offset;
|
---|
147 |
|
---|
148 | x1 = g_strdup_printf ("%.2f", recs[i].x1);
|
---|
149 | y1 = g_strdup_printf ("%.2f", recs[i].y1);
|
---|
150 | x2 = g_strdup_printf ("%.2f", recs[i].x2);
|
---|
151 | y2 = g_strdup_printf ("%.2f", recs[i].y2);
|
---|
152 |
|
---|
153 | offset = g_strdup_printf ("%d", i);
|
---|
154 |
|
---|
155 | gtk_list_store_append (demo->model, &iter);
|
---|
156 | gtk_list_store_set (demo->model, &iter,
|
---|
157 | TEXT_X1_COLUMN, x1,
|
---|
158 | TEXT_Y1_COLUMN, y1,
|
---|
159 | TEXT_X2_COLUMN, x2,
|
---|
160 | TEXT_Y2_COLUMN, y2,
|
---|
161 | TEXT_OFFSET_COLUMN, offset,
|
---|
162 | TEXT_OFFPTR_COLUMN, GINT_TO_POINTER (i),
|
---|
163 | -1);
|
---|
164 |
|
---|
165 | g_free (x1);
|
---|
166 | g_free (y1);
|
---|
167 | g_free (x2);
|
---|
168 | g_free (y2);
|
---|
169 | g_free (offset);
|
---|
170 | }
|
---|
171 |
|
---|
172 | g_free (recs);
|
---|
173 | }
|
---|
174 |
|
---|
175 | static void
|
---|
176 | pgd_text_set_text_attrs_for_offset (PgdTextDemo *demo,
|
---|
177 | gint offset)
|
---|
178 | {
|
---|
179 | GList *l;
|
---|
180 |
|
---|
181 | for (l = demo->text_attrs; l; l = g_list_next (l)) {
|
---|
182 | PopplerTextAttributes *attrs = (PopplerTextAttributes *)l->data;
|
---|
183 |
|
---|
184 | if (offset >= attrs->start_index && offset <= attrs->end_index) {
|
---|
185 | gchar *str;
|
---|
186 | GdkPixbuf *pixbuf;
|
---|
187 |
|
---|
188 | gtk_label_set_text (GTK_LABEL (demo->font_name), attrs->font_name);
|
---|
189 |
|
---|
190 | str = g_strdup_printf ("%.2f", attrs->font_size);
|
---|
191 | gtk_label_set_text (GTK_LABEL (demo->font_size), str);
|
---|
192 | g_free (str);
|
---|
193 |
|
---|
194 | gtk_label_set_text (GTK_LABEL (demo->is_underlined), attrs->is_underlined ? "Yes" : "No");
|
---|
195 |
|
---|
196 | pixbuf = pgd_pixbuf_new_for_color (&(attrs->color));
|
---|
197 | gtk_image_set_from_pixbuf (GTK_IMAGE (demo->text_color), pixbuf);
|
---|
198 | g_object_unref (pixbuf);
|
---|
199 | }
|
---|
200 | }
|
---|
201 | }
|
---|
202 |
|
---|
203 | static void
|
---|
204 | pgd_text_selection_changed (GtkTreeSelection *treeselection,
|
---|
205 | PgdTextDemo *demo)
|
---|
206 | {
|
---|
207 | GtkTreeModel *model;
|
---|
208 | GtkTreeIter iter;
|
---|
209 |
|
---|
210 | if (gtk_tree_selection_get_selected (treeselection, &model, &iter)) {
|
---|
211 | gpointer offset;
|
---|
212 | GtkTextIter begin_iter, end_iter;
|
---|
213 |
|
---|
214 | gtk_tree_model_get (model, &iter,
|
---|
215 | TEXT_OFFPTR_COLUMN, &offset,
|
---|
216 | -1);
|
---|
217 |
|
---|
218 | gtk_text_buffer_get_iter_at_offset (demo->buffer, &begin_iter, GPOINTER_TO_INT (offset));
|
---|
219 | end_iter = begin_iter;
|
---|
220 | gtk_text_iter_forward_char (&end_iter);
|
---|
221 | gtk_text_buffer_select_range (demo->buffer, &begin_iter, &end_iter);
|
---|
222 |
|
---|
223 | pgd_text_set_text_attrs_for_offset (demo, GPOINTER_TO_INT (offset));
|
---|
224 | }
|
---|
225 | }
|
---|
226 |
|
---|
227 | static void
|
---|
228 | pgd_text_buffer_selection_changed (GtkTextBuffer *buffer,
|
---|
229 | GParamSpec *pspec,
|
---|
230 | GtkWidget *textview)
|
---|
231 | {
|
---|
232 | gtk_widget_set_has_tooltip (textview, gtk_text_buffer_get_has_selection (buffer));
|
---|
233 | }
|
---|
234 |
|
---|
235 | static gboolean
|
---|
236 | pgd_text_view_query_tooltip (GtkTextView *textview,
|
---|
237 | gint x,
|
---|
238 | gint y,
|
---|
239 | gboolean keyboard_tip,
|
---|
240 | GtkTooltip *tooltip,
|
---|
241 | PgdTextDemo *demo)
|
---|
242 | {
|
---|
243 | GtkTreeModel *model;
|
---|
244 | GtkTreeIter iter;
|
---|
245 | GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (demo->treeview));
|
---|
246 |
|
---|
247 | if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
|
---|
248 | PopplerPage *page;
|
---|
249 | gchar *x1, *y1, *x2, *y2;
|
---|
250 | PopplerRectangle rect;
|
---|
251 | gchar *text;
|
---|
252 |
|
---|
253 | gtk_tree_model_get (model, &iter,
|
---|
254 | TEXT_X1_COLUMN, &x1,
|
---|
255 | TEXT_Y1_COLUMN, &y1,
|
---|
256 | TEXT_X2_COLUMN, &x2,
|
---|
257 | TEXT_Y2_COLUMN, &y2,
|
---|
258 | -1);
|
---|
259 |
|
---|
260 | rect.x1 = g_strtod (x1, NULL);
|
---|
261 | rect.y1 = g_strtod (y1, NULL);
|
---|
262 | rect.x2 = g_strtod (x2, NULL);
|
---|
263 | rect.y2 = g_strtod (y2, NULL);
|
---|
264 |
|
---|
265 | g_free (x1);
|
---|
266 | g_free (y1);
|
---|
267 | g_free (x2);
|
---|
268 | g_free (y2);
|
---|
269 |
|
---|
270 | page = poppler_document_get_page (demo->doc, demo->page);
|
---|
271 | text = poppler_page_get_selected_text (page, POPPLER_SELECTION_GLYPH, &rect);
|
---|
272 | gtk_tooltip_set_text (tooltip, text);
|
---|
273 | g_free (text);
|
---|
274 | g_object_unref (page);
|
---|
275 | return TRUE;
|
---|
276 | } else {
|
---|
277 | return FALSE;
|
---|
278 | }
|
---|
279 | }
|
---|
280 |
|
---|
281 | static void
|
---|
282 | pgd_text_area_selector_setup (PgdTextDemo *demo)
|
---|
283 | {
|
---|
284 | PopplerPage *page;
|
---|
285 | gdouble width, height;
|
---|
286 |
|
---|
287 | page = poppler_document_get_page (demo->doc, demo->page);
|
---|
288 | if (!page)
|
---|
289 | return;
|
---|
290 |
|
---|
291 | poppler_page_get_size (page, &width, &height);
|
---|
292 |
|
---|
293 | gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->area_x1), -10, width - 10);
|
---|
294 | gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->area_y1), -10, height - 10);
|
---|
295 | gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->area_x2), 0, width + 10);
|
---|
296 | gtk_spin_button_set_range (GTK_SPIN_BUTTON (demo->area_y2), 0, height + 10);
|
---|
297 |
|
---|
298 | gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->area_x1), 0);
|
---|
299 | gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->area_y1), 0);
|
---|
300 | gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->area_x2), width);
|
---|
301 | gtk_spin_button_set_value (GTK_SPIN_BUTTON (demo->area_y2), height);
|
---|
302 |
|
---|
303 | g_object_unref (page);
|
---|
304 | }
|
---|
305 |
|
---|
306 | static void
|
---|
307 | pgd_text_area_selector_value_changed (GtkSpinButton *spinbutton,
|
---|
308 | PgdTextDemo *demo)
|
---|
309 | {
|
---|
310 | demo->area.x1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->area_x1));
|
---|
311 | demo->area.y1 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->area_y1));
|
---|
312 | demo->area.x2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->area_x2));
|
---|
313 | demo->area.y2 = gtk_spin_button_get_value (GTK_SPIN_BUTTON (demo->area_y2));
|
---|
314 | }
|
---|
315 |
|
---|
316 | static void
|
---|
317 | pgd_text_page_selector_value_changed (GtkSpinButton *spinbutton,
|
---|
318 | PgdTextDemo *demo)
|
---|
319 | {
|
---|
320 | demo->page = (gint)gtk_spin_button_get_value (spinbutton) - 1;
|
---|
321 | }
|
---|
322 |
|
---|
323 | GtkWidget *
|
---|
324 | pgd_text_create_widget (PopplerDocument *document)
|
---|
325 | {
|
---|
326 | PgdTextDemo *demo;
|
---|
327 | GtkWidget *label;
|
---|
328 | GtkWidget *vbox, *vbox2;
|
---|
329 | GtkWidget *hbox, *page_selector, *area_hbox;
|
---|
330 | GtkWidget *button;
|
---|
331 | GtkWidget *swindow, *textview, *treeview;
|
---|
332 | GtkTreeSelection *selection;
|
---|
333 | GtkWidget *frame, *alignment, *table;
|
---|
334 | GtkWidget *hpaned;
|
---|
335 | GtkCellRenderer *renderer;
|
---|
336 | gchar *str;
|
---|
337 | gint n_pages;
|
---|
338 | gint row = 0;
|
---|
339 |
|
---|
340 | demo = g_new0 (PgdTextDemo, 1);
|
---|
341 |
|
---|
342 | demo->doc = g_object_ref (document);
|
---|
343 |
|
---|
344 | n_pages = poppler_document_get_n_pages (document);
|
---|
345 |
|
---|
346 | vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
---|
347 | vbox2 = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
|
---|
348 |
|
---|
349 | hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
---|
350 |
|
---|
351 | label = gtk_label_new ("Page:");
|
---|
352 | gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
|
---|
353 | gtk_widget_show (label);
|
---|
354 |
|
---|
355 | page_selector = gtk_spin_button_new_with_range (1, n_pages, 1);
|
---|
356 | g_signal_connect (G_OBJECT (page_selector), "value-changed",
|
---|
357 | G_CALLBACK (pgd_text_page_selector_value_changed),
|
---|
358 | (gpointer)demo);
|
---|
359 | gtk_box_pack_start (GTK_BOX (hbox), page_selector, FALSE, TRUE, 0);
|
---|
360 | gtk_widget_show (page_selector);
|
---|
361 |
|
---|
362 | str = g_strdup_printf ("of %d", n_pages);
|
---|
363 | label = gtk_label_new (str);
|
---|
364 | gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, TRUE, 0);
|
---|
365 | gtk_widget_show (label);
|
---|
366 | g_free (str);
|
---|
367 |
|
---|
368 | gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
|
---|
369 | gtk_widget_show (hbox);
|
---|
370 |
|
---|
371 | hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
|
---|
372 |
|
---|
373 | area_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
---|
374 | label = gtk_label_new ("X1:");
|
---|
375 | gtk_box_pack_start (GTK_BOX (area_hbox), label, TRUE, TRUE, 0);
|
---|
376 | gtk_widget_show (label);
|
---|
377 |
|
---|
378 | demo->area_x1 = gtk_spin_button_new_with_range (0, 0, 0.01);
|
---|
379 | g_signal_connect (demo->area_x1, "value-changed",
|
---|
380 | G_CALLBACK (pgd_text_area_selector_value_changed),
|
---|
381 | demo);
|
---|
382 | gtk_box_pack_start (GTK_BOX (area_hbox), demo->area_x1, TRUE, TRUE, 0);
|
---|
383 | gtk_widget_show (demo->area_x1);
|
---|
384 |
|
---|
385 | gtk_box_pack_start (GTK_BOX (hbox), area_hbox, FALSE, TRUE, 0);
|
---|
386 | gtk_widget_show (area_hbox);
|
---|
387 |
|
---|
388 | area_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
---|
389 | label = gtk_label_new ("Y1:");
|
---|
390 | gtk_box_pack_start (GTK_BOX (area_hbox), label, TRUE, TRUE, 0);
|
---|
391 | gtk_widget_show (label);
|
---|
392 |
|
---|
393 | demo->area_y1 = gtk_spin_button_new_with_range (0, 0, 0.01);
|
---|
394 | g_signal_connect (demo->area_y1, "value-changed",
|
---|
395 | G_CALLBACK (pgd_text_area_selector_value_changed),
|
---|
396 | demo);
|
---|
397 | gtk_box_pack_start (GTK_BOX (area_hbox), demo->area_y1, TRUE, TRUE, 0);
|
---|
398 | gtk_widget_show (demo->area_y1);
|
---|
399 |
|
---|
400 | gtk_box_pack_start (GTK_BOX (hbox), area_hbox, FALSE, TRUE, 0);
|
---|
401 | gtk_widget_show (area_hbox);
|
---|
402 |
|
---|
403 | area_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
---|
404 | label = gtk_label_new ("X2:");
|
---|
405 | gtk_box_pack_start (GTK_BOX (area_hbox), label, TRUE, TRUE, 0);
|
---|
406 | gtk_widget_show (label);
|
---|
407 |
|
---|
408 | demo->area_x2 = gtk_spin_button_new_with_range (0, 0, 0.01);
|
---|
409 | g_signal_connect (demo->area_x2, "value-changed",
|
---|
410 | G_CALLBACK (pgd_text_area_selector_value_changed),
|
---|
411 | demo);
|
---|
412 | gtk_box_pack_start (GTK_BOX (area_hbox), demo->area_x2, TRUE, TRUE, 0);
|
---|
413 | gtk_widget_show (demo->area_x2);
|
---|
414 |
|
---|
415 | gtk_box_pack_start (GTK_BOX (hbox), area_hbox, FALSE, TRUE, 0);
|
---|
416 | gtk_widget_show (area_hbox);
|
---|
417 |
|
---|
418 | area_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
|
---|
419 | label = gtk_label_new ("Y2:");
|
---|
420 | gtk_box_pack_start (GTK_BOX (area_hbox), label, TRUE, TRUE, 0);
|
---|
421 | gtk_widget_show (label);
|
---|
422 |
|
---|
423 | demo->area_y2 = gtk_spin_button_new_with_range (0, 0, 0.01);
|
---|
424 | g_signal_connect (demo->area_y2, "value-changed",
|
---|
425 | G_CALLBACK (pgd_text_area_selector_value_changed),
|
---|
426 | demo);
|
---|
427 | gtk_box_pack_start (GTK_BOX (area_hbox), demo->area_y2, TRUE, TRUE, 0);
|
---|
428 | gtk_widget_show (demo->area_y2);
|
---|
429 |
|
---|
430 | gtk_box_pack_start (GTK_BOX (hbox), area_hbox, FALSE, TRUE, 0);
|
---|
431 | gtk_widget_show (area_hbox);
|
---|
432 |
|
---|
433 | pgd_text_area_selector_setup (demo);
|
---|
434 |
|
---|
435 | button = gtk_button_new_with_label ("Get Text");
|
---|
436 | g_signal_connect (G_OBJECT (button), "clicked",
|
---|
437 | G_CALLBACK (pgd_text_get_text),
|
---|
438 | (gpointer)demo);
|
---|
439 | gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
|
---|
440 | gtk_widget_show (button);
|
---|
441 |
|
---|
442 | gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
|
---|
443 | gtk_widget_show (hbox);
|
---|
444 |
|
---|
445 | demo->timer_label = gtk_label_new (NULL);
|
---|
446 | gtk_label_set_markup (GTK_LABEL (demo->timer_label), "<i>No text found</i>");
|
---|
447 | g_object_set (G_OBJECT (demo->timer_label), "xalign", 1.0, NULL);
|
---|
448 | gtk_box_pack_start (GTK_BOX (vbox), demo->timer_label, FALSE, TRUE, 0);
|
---|
449 | gtk_widget_show (demo->timer_label);
|
---|
450 |
|
---|
451 | hpaned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
|
---|
452 | gtk_paned_set_position (GTK_PANED (hpaned), 300);
|
---|
453 |
|
---|
454 | swindow = gtk_scrolled_window_new (NULL, NULL);
|
---|
455 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
|
---|
456 | GTK_POLICY_AUTOMATIC,
|
---|
457 | GTK_POLICY_AUTOMATIC);
|
---|
458 |
|
---|
459 | demo->model = gtk_list_store_new (N_COLUMNS,
|
---|
460 | G_TYPE_STRING,
|
---|
461 | G_TYPE_STRING, G_TYPE_STRING,
|
---|
462 | G_TYPE_STRING, G_TYPE_STRING,
|
---|
463 | G_TYPE_POINTER);
|
---|
464 | treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (demo->model));
|
---|
465 | demo->treeview = treeview;
|
---|
466 |
|
---|
467 | renderer = gtk_cell_renderer_text_new ();
|
---|
468 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
|
---|
469 | TEXT_X1_COLUMN, "X1",
|
---|
470 | renderer,
|
---|
471 | "text", TEXT_X1_COLUMN,
|
---|
472 | NULL);
|
---|
473 | renderer = gtk_cell_renderer_text_new ();
|
---|
474 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
|
---|
475 | TEXT_Y1_COLUMN, "Y1",
|
---|
476 | renderer,
|
---|
477 | "text", TEXT_Y1_COLUMN,
|
---|
478 | NULL);
|
---|
479 | renderer = gtk_cell_renderer_text_new ();
|
---|
480 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
|
---|
481 | TEXT_X2_COLUMN, "X2",
|
---|
482 | renderer,
|
---|
483 | "text", TEXT_X2_COLUMN,
|
---|
484 | NULL);
|
---|
485 | renderer = gtk_cell_renderer_text_new ();
|
---|
486 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
|
---|
487 | TEXT_Y2_COLUMN, "Y2",
|
---|
488 | renderer,
|
---|
489 | "text", TEXT_Y2_COLUMN,
|
---|
490 | NULL);
|
---|
491 |
|
---|
492 | renderer = gtk_cell_renderer_text_new ();
|
---|
493 | gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
|
---|
494 | TEXT_OFFSET_COLUMN, "Offset",
|
---|
495 | renderer,
|
---|
496 | "text", TEXT_OFFSET_COLUMN,
|
---|
497 | NULL);
|
---|
498 |
|
---|
499 | selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
|
---|
500 | g_signal_connect (selection, "changed",
|
---|
501 | G_CALLBACK (pgd_text_selection_changed),
|
---|
502 | (gpointer) demo);
|
---|
503 |
|
---|
504 | gtk_container_add (GTK_CONTAINER (swindow), treeview);
|
---|
505 | gtk_widget_show (treeview);
|
---|
506 |
|
---|
507 | gtk_box_pack_start (GTK_BOX (vbox2), swindow, TRUE, TRUE, 0);
|
---|
508 | gtk_widget_show (swindow);
|
---|
509 |
|
---|
510 | /* Text attributes */
|
---|
511 | frame = gtk_frame_new (NULL);
|
---|
512 | gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_NONE);
|
---|
513 | label = gtk_label_new (NULL);
|
---|
514 | gtk_label_set_markup (GTK_LABEL (label), "<b>Text Attributes</b>");
|
---|
515 | gtk_frame_set_label_widget (GTK_FRAME (frame), label);
|
---|
516 | gtk_widget_show (label);
|
---|
517 |
|
---|
518 | alignment = gtk_alignment_new (0.5, 0.5, 1, 1);
|
---|
519 | gtk_alignment_set_padding (GTK_ALIGNMENT (alignment), 5, 5, 12, 5);
|
---|
520 | gtk_container_add (GTK_CONTAINER (frame), alignment);
|
---|
521 | gtk_widget_show (alignment);
|
---|
522 |
|
---|
523 | table = gtk_grid_new ();
|
---|
524 | gtk_grid_set_column_spacing (GTK_GRID (table), 6);
|
---|
525 | gtk_grid_set_row_spacing (GTK_GRID (table), 6);
|
---|
526 |
|
---|
527 | demo->font_name = gtk_label_new (NULL);
|
---|
528 | pgd_table_add_property_with_custom_widget (GTK_GRID (table), "<b>Font Name:</b>", demo->font_name, &row);
|
---|
529 | demo->font_size = gtk_label_new (NULL);
|
---|
530 | pgd_table_add_property_with_custom_widget (GTK_GRID (table), "<b>Font Size:</b>", demo->font_size, &row);
|
---|
531 | demo->is_underlined = gtk_label_new (NULL);
|
---|
532 | pgd_table_add_property_with_custom_widget (GTK_GRID (table), "<b>Underlined:</b>", demo->is_underlined, &row);
|
---|
533 | demo->text_color = gtk_image_new ();
|
---|
534 | pgd_table_add_property_with_custom_widget (GTK_GRID (table), "<b>Color:</b>", demo->text_color, &row);
|
---|
535 |
|
---|
536 | gtk_container_add (GTK_CONTAINER (alignment), table);
|
---|
537 | gtk_widget_show (table);
|
---|
538 |
|
---|
539 | gtk_box_pack_start (GTK_BOX (vbox2), frame, FALSE, FALSE, 12);
|
---|
540 | gtk_widget_show (frame);
|
---|
541 | gtk_paned_add1 (GTK_PANED (hpaned), vbox2);
|
---|
542 | gtk_widget_show (vbox2);
|
---|
543 |
|
---|
544 | swindow = gtk_scrolled_window_new (NULL, NULL);
|
---|
545 | gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
|
---|
546 | GTK_POLICY_AUTOMATIC,
|
---|
547 | GTK_POLICY_AUTOMATIC);
|
---|
548 |
|
---|
549 | demo->buffer = gtk_text_buffer_new (NULL);
|
---|
550 | textview = gtk_text_view_new_with_buffer (demo->buffer);
|
---|
551 | g_signal_connect (textview, "query-tooltip",
|
---|
552 | G_CALLBACK (pgd_text_view_query_tooltip),
|
---|
553 | demo);
|
---|
554 | g_signal_connect (demo->buffer, "notify::has-selection",
|
---|
555 | G_CALLBACK (pgd_text_buffer_selection_changed),
|
---|
556 | textview);
|
---|
557 |
|
---|
558 | gtk_container_add (GTK_CONTAINER (swindow), textview);
|
---|
559 | gtk_widget_show (textview);
|
---|
560 |
|
---|
561 | gtk_paned_add2 (GTK_PANED (hpaned), swindow);
|
---|
562 | gtk_widget_show (swindow);
|
---|
563 |
|
---|
564 | gtk_box_pack_start (GTK_BOX (vbox), hpaned, TRUE, TRUE, 0);
|
---|
565 | gtk_widget_show (hpaned);
|
---|
566 |
|
---|
567 | g_object_weak_ref (G_OBJECT (vbox),
|
---|
568 | (GWeakNotify)pgd_text_free,
|
---|
569 | demo);
|
---|
570 |
|
---|
571 | return vbox;
|
---|
572 | }
|
---|