1 /*
2 * Xiphos Bible Study Tool
3 * navbar_verse_editor.c - navigation bar for versekey modules in the editor
4 *
5 * Copyright (C) 2000-2020 Xiphos Developer Team
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Library General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
20 */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <gtk/gtk.h>
27 #ifndef USE_GTKBUILDER
28 #include <glade/glade-xml.h>
29 #endif
30
31 #ifdef USE_WEBKIT_EDITOR
32 #include "editor/webkit_editor.h"
33 #else
34 #include "editor/slib-editor.h"
35 #endif
36
37 #include "gui/navbar_versekey_editor.h"
38 #include "gui/bibletext_dialog.h"
39 #include "gui/tabbed_browser.h"
40 #include "gui/utilities.h"
41
42 #include "main/navbar_versekey.h"
43 #include "main/settings.h"
44 #include "main/sword.h"
45 #include "main/tab_history.h"
46
47 #include "gui/debug_glib_null.h"
48
49 /******************************************************************************
50 * Name
51 * on_verse_button_up_clicked
52 *
53 * Synopsis
54 * #include "gui/navbar_versekey.h"
55 *
56 * void on_verse_button_up_clicked(GtkButton * button, gpointer user_data)
57 *
58 * Description
59 *
60 *
61 * Return value
62 * void
63 */
64
on_verse_up_button_release_event(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)65 static gboolean on_verse_up_button_release_event(GtkWidget *widget,
66 GdkEventButton *event,
67 EDITOR *editor)
68 {
69 main_navbar_versekey_spin_verse(editor->navbar, 0);
70 return FALSE;
71 }
72
73 /******************************************************************************
74 * Name
75 * on_verse_button_down_clicked
76 *
77 * Synopsis
78 * #include "gui/navbar_versekey.h"
79 *
80 * void on_verse_button_down_clicked(GtkButton * button, gpointer user_data)
81 *
82 * Description
83 *
84 *
85 * Return value
86 * void
87 */
88
on_verse_down_button_release_event(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)89 static gboolean on_verse_down_button_release_event(GtkWidget *widget,
90 GdkEventButton *event,
91 EDITOR *editor)
92 {
93 main_navbar_versekey_spin_verse(editor->navbar, 1);
94 return FALSE;
95 }
96
97 /******************************************************************************
98 * Name
99 * on_chapter_button_up_clicked
100 *
101 * Synopsis
102 * #include "gui/navbar_versekey.h"
103 *
104 * void on_chapter_button_up_clicked(GtkButton * button, gpointer user_data)
105 *
106 * Description
107 *
108 *
109 * Return value
110 * void
111 */
112
on_chapter_up_button_release_event(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)113 static gboolean on_chapter_up_button_release_event(GtkWidget *widget,
114 GdkEventButton *event,
115 EDITOR *editor)
116 {
117 main_navbar_versekey_spin_chapter(editor->navbar, 0);
118 return FALSE;
119 }
120
121 /******************************************************************************
122 * Name
123 * on_chapter_button_down_clicked
124 *
125 * Synopsis
126 * #include "gui/navbar_versekey.h"
127 *
128 * void on_chapter_button_down_clicked(GtkButton * button, gpointer user_data)
129 *
130 * Description
131 *
132 *
133 * Return value
134 * void
135 */
136
on_chapter_down_button_release_event(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)137 static gboolean on_chapter_down_button_release_event(GtkWidget *widget,
138 GdkEventButton *event,
139 EDITOR *editor)
140 {
141 main_navbar_versekey_spin_chapter(editor->navbar, 1);
142 return FALSE;
143 }
144
145 /******************************************************************************
146 * Name
147 * on_book_button_up_clicked
148 *
149 * Synopsis
150 * #include "gui/navbar_versekey.h"
151 *
152 * void on_book_button_up_clicked(GtkButton * button, gpointer user_data)
153 *
154 * Description
155 *
156 *
157 * Return value
158 * void
159 */
160
on_book_up_button_release_event(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)161 static gboolean on_book_up_button_release_event(GtkWidget *widget,
162 GdkEventButton *event,
163 EDITOR *editor)
164 {
165 main_navbar_versekey_spin_book(editor->navbar, 0);
166 return FALSE;
167 }
168
169 /******************************************************************************
170 * Name
171 * on_book_button_down_clicked
172 *
173 * Synopsis
174 * #include "gui/navbar_versekey.h"
175 *
176 * void on_book_button_down_clicked(GtkButton * button, gpointer user_data)
177 *
178 * Description
179 *
180 *
181 * Return value
182 * void
183 */
184
on_book_down_button_release_event(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)185 static gboolean on_book_down_button_release_event(GtkWidget *widget,
186 GdkEventButton *event,
187 EDITOR *editor)
188 {
189 main_navbar_versekey_spin_book(editor->navbar, 1);
190 return FALSE;
191 }
192
193 /******************************************************************************
194 * Name
195 * menu_deactivate_callback
196 *
197 * Synopsis
198 * #include "gui/navbar_versekey.h"
199 *
200 * void menu_deactivate_callback (GtkWidget *widget, gpointer user_data)
201 *
202 * Description
203 * return toogle button to normal
204 *
205 * Return value
206 * void
207 */
208
menu_deactivate_callback(GtkWidget * widget,gpointer user_data)209 static void menu_deactivate_callback(GtkWidget *widget,
210 gpointer user_data)
211 {
212 GtkWidget *menu_button;
213
214 menu_button = GTK_WIDGET(user_data);
215
216 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menu_button),
217 FALSE);
218 }
219
220 /******************************************************************************
221 * Name
222 * menu_position_under
223 *
224 * Synopsis
225 * #include "gui/navbar_versekey.h"
226 *
227 * void menu_position_under(GtkMenu * menu, int * x, int * y,
228 * gboolean * push_in, gpointer user_data)
229 *
230 * Description
231 * position drop down menu under toogle button
232 *
233 *
234 * Return value
235 * void
236 */
237
menu_position_under(GtkMenu * menu,int * x,int * y,gboolean * push_in,gpointer user_data)238 static void menu_position_under(GtkMenu *menu, int *x, int *y,
239 gboolean *push_in, gpointer user_data)
240 {
241 GtkWidget *widget;
242 GtkAllocation allocation;
243
244 g_return_if_fail(GTK_IS_BUTTON(user_data));
245 #if GTK_CHECK_VERSION(2, 20, 0)
246 g_return_if_fail(gtk_widget_get_window(user_data));
247 #else
248 g_return_if_fail(GTK_WIDGET_NO_WINDOW(user_data));
249 #endif
250
251 widget = GTK_WIDGET(user_data);
252
253 gdk_window_get_origin(gtk_widget_get_window(widget), x, y);
254 gtk_widget_get_allocation(widget, &allocation);
255 *x += allocation.x;
256 *y += allocation.y + allocation.height;
257
258 *push_in = FALSE;
259 }
260
261 /******************************************************************************
262 * Name
263 * select_button_press_callback
264 *
265 * Synopsis
266 * #include "gui/navbar_versekey.h"
267 *
268 * gboolean select_button_press_callback (GtkWidget *widget,
269 * GdkEventButton *event,
270 * gpointer user_data)
271 *
272 * Description
273 * make the tooglebutton act like a gtk optionmenu by dropping a popup
274 * under the button
275 *
276 * Return value
277 * gboolean
278 */
279
select_book_button_press_callback(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)280 static gboolean select_book_button_press_callback(GtkWidget *widget,
281 GdkEventButton *event,
282 EDITOR *editor)
283 {
284 GtkWidget *menu;
285
286 menu =
287 main_versekey_drop_down_book_menu(editor->navbar, NB_EDITOR,
288 NULL, editor);
289 if (!menu)
290 return 0;
291 g_signal_connect(menu, "deactivate",
292 G_CALLBACK(menu_deactivate_callback), widget);
293 if ((event->type == GDK_BUTTON_PRESS) && event->button == 1) {
294 gtk_widget_grab_focus(widget);
295 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
296 TRUE);
297 #if GTK_CHECK_VERSION(3, 22, 0)
298 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
299
300 #else
301 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
302 menu_position_under, widget, event->button,
303 event->time);
304 #endif
305 return TRUE;
306 }
307 return FALSE;
308 }
309
310 /******************************************************************************
311 * Name
312 * select_button_press_callback
313 *
314 * Synopsis
315 * #include "gui/navbar_versekey.h"
316 *
317 * gboolean select_button_press_callback (GtkWidget *widget,
318 * GdkEventButton *event,
319 * gpointer user_data)
320 *
321 * Description
322 * make the tooglebutton act like a gtk optionmenu by dropping a popup
323 * under the button
324 *
325 * Return value
326 * gboolean
327 */
328
select_chapter_button_press_callback(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)329 static gboolean select_chapter_button_press_callback(GtkWidget *widget,
330 GdkEventButton *event,
331 EDITOR *editor)
332 {
333 GtkWidget *menu;
334
335 menu =
336 main_versekey_drop_down_chapter_menu(editor->navbar, NB_EDITOR,
337 NULL, editor);
338 if (!menu)
339 return 0;
340 g_signal_connect(menu, "deactivate",
341 G_CALLBACK(menu_deactivate_callback), widget);
342 if ((event->type == GDK_BUTTON_PRESS) && event->button == 1) {
343 gtk_widget_grab_focus(widget);
344 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
345 TRUE);
346 #if GTK_CHECK_VERSION(3, 22, 0)
347 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
348 #else
349 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
350 menu_position_under, widget, event->button,
351 event->time);
352 #endif
353 return TRUE;
354 }
355 return FALSE;
356 }
357
358 /******************************************************************************
359 * Name
360 * select_button_press_callback
361 *
362 * Synopsis
363 * #include "gui/navbar_versekey.h"
364 *
365 * gboolean select_button_press_callback (GtkWidget *widget,
366 * GdkEventButton *event,
367 * gpointer user_data)
368 *
369 * Description
370 * make the tooglebutton act like a gtk optionmenu by dropping a popup
371 * under the button
372 *
373 * Return value
374 * gboolean
375 */
376
select_verse_button_press_callback(GtkWidget * widget,GdkEventButton * event,EDITOR * editor)377 static gboolean select_verse_button_press_callback(GtkWidget *widget,
378 GdkEventButton *event,
379 EDITOR *editor)
380 {
381 GtkWidget *menu;
382
383 menu =
384 main_versekey_drop_down_verse_menu(editor->navbar, NB_EDITOR,
385 NULL, editor);
386 if (!menu)
387 return 0;
388 g_signal_connect(menu, "deactivate",
389 G_CALLBACK(menu_deactivate_callback), widget);
390 if ((event->type == GDK_BUTTON_PRESS) && event->button == 1) {
391 gtk_widget_grab_focus(widget);
392 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
393 TRUE);
394 #if GTK_CHECK_VERSION(3, 22, 0)
395 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
396 #else
397 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
398 menu_position_under, widget, event->button,
399 event->time);
400 #endif
401 return TRUE;
402 }
403 return FALSE;
404 }
405
406 /******************************************************************************
407 * Name
408 * on_entry_activate
409 *
410 * Synopsis
411 * #include "bibletext_dialog.h"
412 *
413 * void on_entry_activate(GtkEntry * entry, DIALOG_DATA * c)
414 *
415 * Description
416 * go to verse in free form entry if user hit <enter>
417 *
418 * Return value
419 * void
420 */
421
on_entry_activate(GtkEntry * entry,EDITOR * editor)422 static void on_entry_activate(GtkEntry *entry, EDITOR *editor)
423 {
424 const gchar *buf = gtk_entry_get_text(entry);
425 if (buf == NULL)
426 return;
427 /* handle potential subsection anchor */
428 if ((settings.special_anchor = strchr(buf, '#')) || /* thml */
429 (settings.special_anchor = strchr(buf, '!'))) /* osisref */
430 *settings.special_anchor = '\0';
431 const gchar *gkey =
432 main_get_valid_key(settings.MainWindowModule, (gchar *)buf);
433
434 // we got a valid key. but was it really a valid key within v11n?
435 // for future use in determining whether to show normal navbar content.
436 editor->navbar.valid_key =
437 main_is_Bible_key(settings.MainWindowModule, gkey);
438
439 if (settings.special_anchor)
440 *settings.special_anchor = '#'; /* put it back. */
441 if (gkey == NULL)
442 return;
443 gchar *url = g_strdup_printf("sword:///%s%s", gkey,
444 (settings.special_anchor ? settings.special_anchor : ""));
445
446 editor->navbar.module_name =
447 g_string_assign(editor->navbar.module_name,
448 settings.MainWindowModule);
449 main_navbar_versekey_set(editor->navbar, gkey);
450
451 editor_load_note(editor, NULL, gkey);
452
453 if (url)
454 g_free(url);
455 if (gkey)
456 g_free((gchar *)gkey);
457 }
458
459 /******************************************************************************
460 * Name
461 * on_button_verse_menu_verse_scroll_event
462 *
463 * Synopsis
464 * #include "gui/navbar_versekey.h"
465 *
466 * gboolean on_button_verse_menu_verse_scroll_event(GtkWidget * widget,
467 * GdkEvent * event,
468 * gpointer user_data)
469 *
470 * Description
471 *
472 *
473 * Return value
474 * gboolean
475 */
476
on_button_verse_menu_verse_scroll_event(GtkWidget * widget,GdkEvent * event,EDITOR * editor)477 static gboolean on_button_verse_menu_verse_scroll_event(GtkWidget *widget,
478 GdkEvent *event,
479 EDITOR *editor)
480 {
481 XI_message(("%s", "on_button_verse_menu_verse_scroll_event"));
482 main_navbar_versekey_spin_verse(editor->navbar,
483 event->scroll.direction);
484 return FALSE;
485 }
486
487 /******************************************************************************
488 * Name
489 * on_button_verse_menu_chapter_scroll_event
490 *
491 * Synopsis
492 * #include "gui/navbar_versekey.h"
493 *
494 * gboolean on_button_verse_menu_chapter_scroll_event(GtkWidget * widget,
495 * GdkEvent * event,
496 * gpointer user_data)
497 *
498 * Description
499 *
500 *
501 * Return value
502 * gboolean
503 */
504
on_button_verse_menu_chapter_scroll_event(GtkWidget * widget,GdkEvent * event,EDITOR * editor)505 static gboolean on_button_verse_menu_chapter_scroll_event(GtkWidget *widget,
506 GdkEvent *event,
507 EDITOR *editor)
508 {
509 main_navbar_versekey_spin_chapter(editor->navbar,
510 event->scroll.direction);
511 return FALSE;
512 }
513
514 /******************************************************************************
515 * Name
516 * on_button_verse_menu_book_scroll_event
517 *
518 * Synopsis
519 * #include "gui/navbar_versekey.h"
520 *
521 * gboolean on_button_verse_menu_book_scroll_event(GtkWidget * widget,
522 * GdkEvent * event,
523 * gpointer user_data)
524 *
525 * Description
526 *
527 *
528 * Return value
529 * gboolean
530 */
531
on_button_verse_menu_book_scroll_event(GtkWidget * widget,GdkEvent * event,EDITOR * editor)532 static gboolean on_button_verse_menu_book_scroll_event(GtkWidget *widget,
533 GdkEvent *event,
534 EDITOR *editor)
535 {
536 main_navbar_versekey_spin_book(editor->navbar,
537 event->scroll.direction);
538 return FALSE;
539 }
540
541 /******************************************************************************
542 * Name
543 * on_up_leave_notify_event
544 *
545 * Synopsis
546 * #include "gui/navbar_versekey.h"
547 *
548 * gboolean on_up_leave_notify_event(GtkWidget * widget, GdkEventCrossing * event,
549 gpointer user_data)
550 *
551 * Description
552 * mimic a button by hiding/showing arrow pixmaps when mouse leaves spin
553 * buttons
554 *
555 * Return value
556 * gboolean
557 */
558
on_book_up_leave_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)559 static gboolean on_book_up_leave_notify_event(GtkWidget *widget,
560 GdkEventCrossing *event,
561 EDITOR *editor)
562 {
563 gtk_widget_hide(editor->navbar.arrow_book_up_box);
564 gtk_widget_show(editor->navbar.arrow_book_up);
565 return FALSE;
566 }
567
on_chapter_up_leave_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)568 static gboolean on_chapter_up_leave_notify_event(GtkWidget *widget,
569 GdkEventCrossing *event,
570 EDITOR *editor)
571 {
572 gtk_widget_hide(editor->navbar.arrow_chapter_up_box);
573 gtk_widget_show(editor->navbar.arrow_chapter_up);
574 return FALSE;
575 }
576
on_verse_up_leave_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)577 static gboolean on_verse_up_leave_notify_event(GtkWidget *widget,
578 GdkEventCrossing *event,
579 EDITOR *editor)
580 {
581 gtk_widget_hide(editor->navbar.arrow_verse_up_box);
582 gtk_widget_show(editor->navbar.arrow_verse_up);
583 return FALSE;
584 }
585
586 /******************************************************************************
587 * Name
588 * on_down_leave_notify_event
589 *
590 * Synopsis
591 * #include "gui/navbar_versekey.h"
592 *
593 * gboolean on_down_leave_notify_event(GtkWidget * widget, GdkEventCrossing * event,
594 gpointer user_data)
595 *
596 * Description
597 * mimic a button by hiding/showing arrow pixmaps when mouse leaves spin
598 * buttons
599 *
600 * Return value
601 * gboolean
602 */
603
on_book_down_leave_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)604 static gboolean on_book_down_leave_notify_event(GtkWidget *widget,
605 GdkEventCrossing *event,
606 EDITOR *editor)
607 {
608
609 gtk_widget_hide(editor->navbar.arrow_book_down_box);
610 gtk_widget_show(editor->navbar.arrow_book_down);
611 return FALSE;
612 }
613
on_chapter_down_leave_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)614 static gboolean on_chapter_down_leave_notify_event(GtkWidget *widget,
615 GdkEventCrossing *event,
616 EDITOR *editor)
617 {
618 gtk_widget_hide(editor->navbar.arrow_chapter_down_box);
619 gtk_widget_show(editor->navbar.arrow_chapter_down);
620 return FALSE;
621 }
622
on_verse_down_leave_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)623 static gboolean on_verse_down_leave_notify_event(GtkWidget *widget,
624 GdkEventCrossing *event,
625 EDITOR *editor)
626 {
627 gtk_widget_hide(editor->navbar.arrow_verse_down_box);
628 gtk_widget_show(editor->navbar.arrow_verse_down);
629 return FALSE;
630 }
631
632 /******************************************************************************
633 * Name
634 * on_up_enter_notify_event
635 *
636 * Synopsis
637 * #include "gui/navbar_versekey.h"
638 *
639 * gboolean on_up_enter_notify_event(GtkWidget * widget, GdkEventCrossing * event,
640 * gpointer user_data)
641 *
642 * Description
643 * mimic a button by hiding/showing arrow pixmaps when mouse enters spin
644 * buttons
645 *
646 * Return value
647 * gboolean
648 */
649
on_book_up_enter_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)650 static gboolean on_book_up_enter_notify_event(GtkWidget *widget,
651 GdkEventCrossing *event,
652 EDITOR *editor)
653 {
654 gtk_widget_hide(editor->navbar.arrow_book_up);
655 gtk_widget_show(editor->navbar.arrow_book_up_box);
656 return FALSE;
657 }
658
on_chapter_up_enter_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)659 static gboolean on_chapter_up_enter_notify_event(GtkWidget *widget,
660 GdkEventCrossing *event,
661 EDITOR *editor)
662 {
663 gtk_widget_hide(editor->navbar.arrow_chapter_up);
664 gtk_widget_show(editor->navbar.arrow_chapter_up_box);
665 return FALSE;
666 }
667
on_verse_up_enter_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)668 static gboolean on_verse_up_enter_notify_event(GtkWidget *widget,
669 GdkEventCrossing *event,
670 EDITOR *editor)
671 {
672 gtk_widget_hide(editor->navbar.arrow_verse_up);
673 gtk_widget_show(editor->navbar.arrow_verse_up_box);
674 return FALSE;
675 }
676
677 /******************************************************************************
678 * Name
679 * on_down_enter_notify_event
680 *
681 * Synopsis
682 * #include "gui/navbar_versekey.h"
683 *
684 * gboolean on_down_enter_notify_event(GtkWidget * widget, GdkEventCrossing * event,
685 gpointer user_data)
686 *
687 * Description
688 * mimic a button by hiding/showing arrow pixmaps when mouse enters spin
689 * buttons
690 *
691 * Return value
692 * gboolean
693 */
694
on_book_down_enter_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)695 static gboolean on_book_down_enter_notify_event(GtkWidget *widget,
696 GdkEventCrossing *event,
697 EDITOR *editor)
698 {
699 gtk_widget_hide(editor->navbar.arrow_book_down);
700 gtk_widget_show(editor->navbar.arrow_book_down_box);
701 return FALSE;
702 }
703
on_chapter_down_enter_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)704 static gboolean on_chapter_down_enter_notify_event(GtkWidget *widget,
705 GdkEventCrossing *event,
706 EDITOR *editor)
707 {
708 gtk_widget_hide(editor->navbar.arrow_chapter_down);
709 gtk_widget_show(editor->navbar.arrow_chapter_down_box);
710 return FALSE;
711 }
712
on_verse_down_enter_notify_event(GtkWidget * widget,GdkEventCrossing * event,EDITOR * editor)713 static gboolean on_verse_down_enter_notify_event(GtkWidget *widget,
714 GdkEventCrossing *event,
715 EDITOR *editor)
716 {
717 gtk_widget_hide(editor->navbar.arrow_verse_down);
718 gtk_widget_show(editor->navbar.arrow_verse_down_box);
719 return FALSE;
720 }
721
722 /******************************************************************************
723 * Name
724 * _sync_toggled
725 *
726 * Synopsis
727 * #include ""
728 *
729 * void _sync_toggled(GtkToggleButton * button, EDITOR * e)
730 *
731 * Description
732 *
733 *
734 * Return value
735 * void
736 */
737
_sync_toggled(GtkToggleButton * button,EDITOR * e)738 static void _sync_toggled(GtkToggleButton *button, EDITOR *e)
739 {
740 if (gtk_toggle_button_get_active(button)) {
741 e->sync = TRUE;
742 editor_sync_with_main(); //sync_with_main(c);
743 } else
744 e->sync = FALSE;
745 }
746
_connect_signals(NAVBAR_VERSEKEY navbar,EDITOR * editor)747 static void _connect_signals(NAVBAR_VERSEKEY navbar, EDITOR *editor)
748 {
749 g_signal_connect((gpointer)navbar.lookup_entry,
750 "activate", G_CALLBACK(on_entry_activate),
751 editor);
752 g_signal_connect((gpointer)editor->navbar.button_sync,
753 "clicked", G_CALLBACK(_sync_toggled), editor);
754 g_signal_connect((gpointer)navbar.button_book_up,
755 "button_release_event",
756 G_CALLBACK(on_book_up_button_release_event),
757 editor);
758 g_signal_connect((gpointer)navbar.button_book_down,
759 "button_release_event",
760 G_CALLBACK(on_book_down_button_release_event),
761 editor);
762 g_signal_connect((gpointer)navbar.button_chapter_up,
763 "button_release_event",
764 G_CALLBACK(on_chapter_up_button_release_event),
765 editor);
766 g_signal_connect((gpointer)navbar.button_chapter_down,
767 "button_release_event",
768 G_CALLBACK(on_chapter_down_button_release_event),
769 editor);
770 g_signal_connect((gpointer)navbar.button_verse_up,
771 "button_release_event",
772 G_CALLBACK(on_verse_up_button_release_event),
773 editor);
774 g_signal_connect((gpointer)navbar.button_verse_down,
775 "button_release_event",
776 G_CALLBACK(on_verse_down_button_release_event),
777 editor);
778
779 /* */
780 g_signal_connect((gpointer)navbar.button_book_up,
781 "enter_notify_event",
782 G_CALLBACK(on_book_up_enter_notify_event),
783 editor);
784 g_signal_connect((gpointer)navbar.button_book_up,
785 "leave_notify_event",
786 G_CALLBACK(on_book_up_leave_notify_event),
787 editor);
788
789 g_signal_connect((gpointer)navbar.button_book_down,
790 "enter_notify_event",
791 G_CALLBACK(on_book_down_enter_notify_event),
792 editor);
793 g_signal_connect((gpointer)navbar.button_book_down,
794 "leave_notify_event",
795 G_CALLBACK(on_book_down_leave_notify_event),
796 editor);
797
798 /* */
799 g_signal_connect((gpointer)navbar.button_chapter_up,
800 "enter_notify_event",
801 G_CALLBACK(on_chapter_up_enter_notify_event),
802 editor);
803 g_signal_connect((gpointer)navbar.button_chapter_up,
804 "leave_notify_event",
805 G_CALLBACK(on_chapter_up_leave_notify_event),
806 editor);
807
808 g_signal_connect((gpointer)navbar.button_chapter_down,
809 "enter_notify_event",
810 G_CALLBACK(on_chapter_down_enter_notify_event),
811 editor);
812 g_signal_connect((gpointer)navbar.button_chapter_down,
813 "leave_notify_event",
814 G_CALLBACK(on_chapter_down_leave_notify_event),
815 editor);
816
817 /* */
818 g_signal_connect((gpointer)navbar.button_verse_up,
819 "enter_notify_event",
820 G_CALLBACK(on_verse_up_enter_notify_event),
821 editor);
822 g_signal_connect((gpointer)navbar.button_verse_up,
823 "leave_notify_event",
824 G_CALLBACK(on_verse_up_leave_notify_event),
825 editor);
826
827 g_signal_connect((gpointer)navbar.button_verse_down,
828 "enter_notify_event",
829 G_CALLBACK(on_verse_down_enter_notify_event),
830 editor);
831 g_signal_connect((gpointer)navbar.button_verse_down,
832 "leave_notify_event",
833 G_CALLBACK(on_verse_down_leave_notify_event),
834 editor);
835
836 /*
837 g_signal_connect((gpointer) navbar.button_book_up,
838 "clicked", G_CALLBACK(on_book_button_up_clicked),
839 editor);
840 g_signal_connect((gpointer) navbar.button_book_down,
841 "clicked", G_CALLBACK(on_book_button_down_clicked),
842 editor);
843 g_signal_connect((gpointer) navbar.button_chapter_up,
844 "clicked", G_CALLBACK(on_chapter_button_up_clicked),
845 editor);
846 g_signal_connect((gpointer) navbar.button_chapter_down,
847 "clicked", G_CALLBACK(on_chapter_button_down_clicked),
848 editor);
849 g_signal_connect((gpointer) navbar.button_verse_up,
850 "clicked", G_CALLBACK(on_verse_button_up_clicked),
851 editor);
852 g_signal_connect((gpointer) navbar.button_verse_down,
853 "clicked", G_CALLBACK(on_verse_button_down_clicked),
854 editor);
855 */
856 g_signal_connect((gpointer)navbar.button_book_menu,
857 "button_press_event",
858 G_CALLBACK(select_book_button_press_callback),
859 editor);
860 g_signal_connect((gpointer)navbar.button_chapter_menu,
861 "button_press_event",
862 G_CALLBACK(select_chapter_button_press_callback),
863 editor);
864 g_signal_connect((gpointer)navbar.button_verse_menu,
865 "button_press_event",
866 G_CALLBACK(select_verse_button_press_callback),
867 editor);
868 #if !GTK_CHECK_VERSION(3, 4, 0)
869 g_signal_connect((gpointer)navbar.button_verse_menu,
870 "scroll_event",
871 G_CALLBACK(on_button_verse_menu_verse_scroll_event),
872 editor);
873 g_signal_connect((gpointer)navbar.button_chapter_menu,
874 "scroll_event",
875 G_CALLBACK(on_button_verse_menu_chapter_scroll_event),
876 editor);
877 g_signal_connect((gpointer)navbar.button_book_menu,
878 "scroll_event",
879 G_CALLBACK(on_button_verse_menu_book_scroll_event), editor);
880 #endif
881 }
882
883 /******************************************************************************
884 * Name
885 *
886 *
887 * Synopsis
888 * #include "gui/navbar_versekey_editor.h"
889 *
890 * GtkWidget *
891 *
892 * Description
893 * create a new Bible navigation toolbar and return it
894 *
895 * Return value
896 * GtkWidget *
897 */
898
gui_navbar_versekey_editor_new(EDITOR * editor)899 GtkWidget *gui_navbar_versekey_editor_new(EDITOR *editor)
900 {
901 #ifdef USE_GTKBUILDER
902 GtkBuilder *gxml;
903 #else
904 GladeXML *gxml;
905 #endif
906 #if GTK_CHECK_VERSION(3, 4, 0)
907 GtkWidget *eventbox;
908 #endif
909
910 gchar *glade_file =
911 gui_general_user_file("navbar_versekey" UI_SUFFIX, FALSE);
912 g_return_val_if_fail((glade_file != NULL), NULL);
913 XI_message(("%s", glade_file));
914
915 /* build the widget */
916 #ifdef USE_GTKBUILDER
917 gxml = gtk_builder_new();
918 gtk_builder_add_from_file(gxml, glade_file, NULL);
919 #else
920 gxml = glade_xml_new(glade_file, "navbar", NULL);
921 #endif
922 editor->navbar.dialog = TRUE;
923 editor->navbar.module_name =
924 g_string_new(settings.MainWindowModule);
925 editor->navbar.key = g_string_new(settings.currentverse);
926
927 editor->navbar.navbar = UI_GET_ITEM(gxml, "navbar");
928 editor->navbar.button_history_back =
929 UI_GET_ITEM(gxml, "button_history_back");
930 editor->navbar.button_history_next =
931 UI_GET_ITEM(gxml, "button_history_foward");
932 editor->navbar.button_history_menu =
933 UI_GET_ITEM(gxml, "togglebutton_history_list");
934
935 editor->navbar.button_sync =
936 UI_GET_ITEM(gxml, "togglebutton_sync");
937 gtk_widget_show(editor->navbar.button_sync);
938 gtk_widget_set_tooltip_text(editor->navbar.button_sync,
939 _("Synchronize this window's scrolling with the main window"));
940 editor->navbar.button_book_up = UI_GET_ITEM(gxml, "eventbox9");
941 editor->navbar.button_book_down = UI_GET_ITEM(gxml, "eventbox6");
942 editor->navbar.button_chapter_up = UI_GET_ITEM(gxml, "eventbox8");
943 editor->navbar.button_chapter_down =
944 UI_GET_ITEM(gxml, "eventbox4");
945 editor->navbar.button_verse_up = UI_GET_ITEM(gxml, "eventbox7");
946 editor->navbar.button_verse_down = UI_GET_ITEM(gxml, "eventbox1");
947
948 editor->navbar.arrow_book_up_box = UI_GET_ITEM(gxml, "image13");
949 editor->navbar.arrow_book_up = UI_GET_ITEM(gxml, "image12");
950 editor->navbar.arrow_book_down_box = UI_GET_ITEM(gxml, "image15");
951 editor->navbar.arrow_book_down = UI_GET_ITEM(gxml, "image14");
952 editor->navbar.arrow_chapter_up_box = UI_GET_ITEM(gxml, "image9");
953 editor->navbar.arrow_chapter_up = UI_GET_ITEM(gxml, "image8");
954 editor->navbar.arrow_chapter_down_box =
955 UI_GET_ITEM(gxml, "image11");
956 editor->navbar.arrow_chapter_down = UI_GET_ITEM(gxml, "image10");
957 editor->navbar.arrow_verse_up_box = UI_GET_ITEM(gxml, "image7");
958 editor->navbar.arrow_verse_up = UI_GET_ITEM(gxml, "image6");
959 editor->navbar.arrow_verse_down_box = UI_GET_ITEM(gxml, "image16");
960 editor->navbar.arrow_verse_down = UI_GET_ITEM(gxml, "image5");
961
962 editor->navbar.button_book_menu =
963 UI_GET_ITEM(gxml, "togglebutton_book");
964 editor->navbar.button_chapter_menu =
965 UI_GET_ITEM(gxml, "togglebutton_chapter");
966 editor->navbar.button_verse_menu =
967 UI_GET_ITEM(gxml, "togglebutton_verse");
968 editor->navbar.lookup_entry = UI_GET_ITEM(gxml, "entry_lookup");
969 editor->navbar.label_book_menu = UI_GET_ITEM(gxml, "label_book");
970 editor->navbar.label_chapter_menu =
971 UI_GET_ITEM(gxml, "label_chapter");
972 editor->navbar.label_verse_menu = UI_GET_ITEM(gxml, "label_verse");
973
974 #if GTK_CHECK_VERSION(3, 4, 0)
975 eventbox = UI_GET_ITEM(gxml, "eventbox_book");
976 g_signal_connect((gpointer)eventbox, "scroll_event",
977 G_CALLBACK(on_button_verse_menu_book_scroll_event), editor);
978
979 eventbox = UI_GET_ITEM(gxml, "eventbox_chapter");
980 g_signal_connect((gpointer)eventbox, "scroll_event",
981 G_CALLBACK(on_button_verse_menu_chapter_scroll_event),
982 editor);
983
984 eventbox = UI_GET_ITEM(gxml, "eventbox_verse");
985 g_signal_connect((gpointer)eventbox, "scroll_event",
986 G_CALLBACK(on_button_verse_menu_verse_scroll_event),
987 editor);
988 #endif
989 _connect_signals(editor->navbar, editor);
990
991 return editor->navbar.navbar;
992 }
993