1 /*
2 * Xiphos Bible Study Tool
3 * navbar_verse.c - navigation bar for versekey modules
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 #include "editor/slib-editor.h"
32
33 #include "gui/navbar_versekey.h"
34 #include "gui/bibletext_dialog.h"
35 #include "gui/tabbed_browser.h"
36 #include "gui/utilities.h"
37
38 #include "main/module_dialogs.h"
39 #include "main/navbar_versekey.h"
40 #include "main/settings.h"
41 #include "main/sword.h"
42 #include "main/tab_history.h"
43 #include "main/url.hh"
44
45 #include "gui/debug_glib_null.h"
46
47 NAVBAR_VERSEKEY navbar_versekey;
48
49 extern PASSAGE_TAB_INFO *cur_passage_tab;
50
51 /******************************************************************************
52 * Name
53 * menu_deactivate_callback
54 *
55 * Synopsis
56 * #include "gui/navbar_versekey.h"
57 *
58 * void menu_deactivate_callback (GtkWidget *widget, gpointer user_data)
59 *
60 * Description
61 * return toggle button to normal
62 *
63 * Return value
64 * void
65 */
66
menu_deactivate_callback(GtkWidget * widget,gpointer user_data)67 static void menu_deactivate_callback(GtkWidget *widget,
68 gpointer user_data)
69 {
70 GtkWidget *menu_button;
71
72 menu_button = GTK_WIDGET(user_data);
73
74 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menu_button),
75 FALSE);
76 }
77
78 /******************************************************************************
79 * Name
80 * menu_position_under
81 *
82 * Synopsis
83 * #include "gui/navbar_versekey.h"
84 *
85 * void menu_position_under(GtkMenu * menu, int * x, int * y,
86 * gboolean * push_in, gpointer user_data)
87 *
88 * Description
89 * position drop down menu under toogle button
90 *
91 *
92 * Return value
93 * void
94 */
95
menu_position_under(GtkMenu * menu,int * x,int * y,gboolean * push_in,gpointer user_data)96 static void menu_position_under(GtkMenu *menu, int *x, int *y,
97 gboolean *push_in, gpointer user_data)
98 {
99 GtkWidget *widget;
100 GtkAllocation allocation;
101
102 g_return_if_fail(GTK_IS_BUTTON(user_data));
103 #if GTK_CHECK_VERSION(2, 20, 0)
104 g_return_if_fail(gtk_widget_get_window(user_data));
105 #else
106 g_return_if_fail(GTK_WIDGET_NO_WINDOW(user_data));
107 #endif
108 widget = GTK_WIDGET(user_data);
109
110 gdk_window_get_origin(gtk_widget_get_window(widget), x, y);
111 gtk_widget_get_allocation(widget, &allocation);
112 *x += allocation.x;
113 *y += allocation.y + allocation.height;
114
115 *push_in = FALSE;
116 }
117
118 /******************************************************************************
119 * Name
120 * select_button_press_callback
121 *
122 * Synopsis
123 * #include "gui/navbar_versekey.h"
124 *
125 * gboolean select_button_press_callback (GtkWidget *widget,
126 * GdkEventButton *event,
127 * gpointer user_data)
128 *
129 * Description
130 * make the tooglebutton act like a gtk optionmenu by dropping a popup
131 * under the button
132 *
133 * Return value
134 * gboolean
135 */
136
select_button_press_callback(GtkWidget * widget,GdkEventButton * event,gpointer user_data)137 static gboolean select_button_press_callback(GtkWidget *widget,
138 GdkEventButton *event,
139 gpointer user_data)
140 {
141 GtkWidget *menu;
142
143 menu = main_versekey_drop_down_new(cur_passage_tab);
144 if (!menu)
145 return 0;
146 g_signal_connect(menu, "deactivate",
147 G_CALLBACK(menu_deactivate_callback), widget);
148 if ((event->type == GDK_BUTTON_PRESS) && event->button == 1) {
149 gtk_widget_grab_focus(widget);
150 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
151 TRUE);
152 #if GTK_CHECK_VERSION(3, 22, 0)
153 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
154 #else
155 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
156 menu_position_under, widget, event->button,
157 event->time);
158 #endif
159 return TRUE;
160 }
161 return FALSE;
162 }
163
164 /******************************************************************************
165 * Name
166 * select_button_press_callback
167 *
168 * Synopsis
169 * #include "gui/navbar_versekey.h"
170 *
171 * gboolean select_button_press_callback (GtkWidget *widget,
172 * GdkEventButton *event,
173 * gpointer user_data)
174 *
175 * Description
176 * make the tooglebutton act like a gtk optionmenu by dropping a popup
177 * under the button
178 *
179 * Return value
180 * gboolean
181 */
182
select_book_button_press_callback(GtkWidget * widget,GdkEventButton * event,gpointer user_data)183 static gboolean select_book_button_press_callback(GtkWidget *widget,
184 GdkEventButton *event,
185 gpointer user_data)
186 {
187 GtkWidget *menu;
188
189 GTimeVal start_time;
190 GTimeVal end_time;
191 #ifdef WIN32
192 glong time_diff;
193 guint32 time_add;
194 #endif
195
196 g_get_current_time(&start_time);
197 // XI_message(("Start time is: %d sec %d mil", start_time.tv_sec, start_time.tv_usec));
198
199 menu = main_versekey_drop_down_book_menu(navbar_versekey, NB_MAIN,
200 NULL, NULL);
201
202 g_get_current_time(&end_time);
203 // XI_message(("End time is: %d sec %d mil", end_time.tv_sec, end_time.tv_usec));
204 #ifdef WIN32
205 time_diff =
206 ((end_time.tv_sec - start_time.tv_sec) * 1000000) +
207 (end_time.tv_usec - start_time.tv_usec);
208 //if (time_diff > 10000)
209 time_add = (guint32)(time_diff / 1000);
210 #endif
211 if (!menu)
212 return 0;
213 g_signal_connect(menu, "deactivate",
214 G_CALLBACK(menu_deactivate_callback), widget);
215 if ((event->type == GDK_BUTTON_PRESS) && event->button == 1) {
216 gtk_widget_grab_focus(widget);
217 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
218 TRUE);
219 #if GTK_CHECK_VERSION(3, 22, 0)
220 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
221 #else
222 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
223 menu_position_under, widget, event->button,
224 #ifdef WIN32
225 event->time + time_add);
226 #else
227 event->time);
228 #endif
229 #endif
230 return TRUE;
231 }
232 return FALSE;
233 }
234
235 /******************************************************************************
236 * Name
237 * select_button_press_callback
238 *
239 * Synopsis
240 * #include "gui/navbar_versekey.h"
241 *
242 * gboolean select_button_press_callback (GtkWidget *widget,
243 * GdkEventButton *event,
244 * gpointer user_data)
245 *
246 * Description
247 * make the tooglebutton act like a gtk optionmenu by dropping a popup
248 * under the button
249 *
250 * Return value
251 * gboolean
252 */
253
select_chapter_button_press_callback(GtkWidget * widget,GdkEventButton * event,gpointer user_data)254 static gboolean select_chapter_button_press_callback(GtkWidget *widget,
255 GdkEventButton *
256 event,
257 gpointer user_data)
258 {
259 GtkWidget *menu;
260
261 menu = main_versekey_drop_down_chapter_menu(navbar_versekey, NB_MAIN,
262 NULL, NULL);
263 if (!menu)
264 return 0;
265 g_signal_connect(menu, "deactivate",
266 G_CALLBACK(menu_deactivate_callback), widget);
267 if ((event->type == GDK_BUTTON_PRESS) && event->button == 1) {
268 gtk_widget_grab_focus(widget);
269 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
270 TRUE);
271 #if GTK_CHECK_VERSION(3, 22, 0)
272 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
273 #else
274 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
275 menu_position_under, widget, event->button,
276 event->time);
277 #endif
278 return TRUE;
279 }
280 return FALSE;
281 }
282
283 /******************************************************************************
284 * Name
285 * select_button_press_callback
286 *
287 * Synopsis
288 * #include "gui/navbar_versekey.h"
289 *
290 * gboolean select_button_press_callback (GtkWidget *widget,
291 * GdkEventButton *event,
292 * gpointer user_data)
293 *
294 * Description
295 * make the tooglebutton act like a gtk optionmenu by dropping a popup
296 * under the button
297 *
298 * Return value
299 * gboolean
300 */
301
select_verse_button_press_callback(GtkWidget * widget,GdkEventButton * event,gpointer user_data)302 static gboolean select_verse_button_press_callback(GtkWidget *widget,
303 GdkEventButton *event,
304 gpointer user_data)
305 {
306 GtkWidget *menu;
307
308 menu = main_versekey_drop_down_verse_menu(navbar_versekey, NB_MAIN,
309 NULL, NULL);
310 if (!menu)
311 return 0;
312 g_signal_connect(menu, "deactivate",
313 G_CALLBACK(menu_deactivate_callback), widget);
314 if ((event->type == GDK_BUTTON_PRESS) && event->button == 1) {
315 gtk_widget_grab_focus(widget);
316 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(widget),
317 TRUE);
318 #if GTK_CHECK_VERSION(3, 22, 0)
319 gtk_menu_popup_at_widget(GTK_MENU(menu), widget, GDK_GRAVITY_SOUTH_WEST, GDK_GRAVITY_NORTH_WEST, NULL);
320 #else
321 gtk_menu_popup(GTK_MENU(menu), NULL, NULL,
322 menu_position_under, widget, event->button,
323 event->time);
324 #endif
325 return TRUE;
326 }
327 return FALSE;
328 }
329
330 /******************************************************************************
331 * Name
332 * on_button_history_next_clicked
333 *
334 * Synopsis
335 * #include "gui/navbar_versekey.h"
336 *
337 * void on_button_history_next_clicked(GtkButton * button, gpointer user_data)
338 *
339 * Description
340 *
341 *
342 * Return value
343 * void
344 */
345
on_button_history_next_clicked(GtkButton * button,gpointer user_data)346 static void on_button_history_next_clicked(GtkButton *button, gpointer user_data)
347 {
348 main_navigate_tab_history(1);
349 }
350
351 /******************************************************************************
352 * Name
353 * on_button_history_back_clicked
354 *
355 * Synopsis
356 * #include "gui/navbar_versekey.h"
357 *
358 * void on_button_history_back_clicked(GtkButton * button, gpointer user_data)
359 *
360 * Description
361 *
362 *
363 * Return value
364 * void
365 */
366
on_button_history_back_clicked(GtkButton * button,gpointer user_data)367 static void on_button_history_back_clicked(GtkButton *button, gpointer user_data)
368 {
369 main_navigate_tab_history(0);
370 }
371
372 /******************************************************************************
373 * Name
374 * on_entry_activate
375 *
376 * Synopsis
377 * #include "bibletext_dialog.h"
378 *
379 * void on_entry_activate(GtkEntry * entry, DIALOG_DATA * c)
380 *
381 * Description
382 * go to verse in free form entry if user hit <enter>
383 *
384 * Return value
385 * void
386 */
387
on_entry_activate(GtkEntry * entry,gpointer user_data)388 static void on_entry_activate(GtkEntry *entry, gpointer user_data)
389 {
390 char *rawtext;
391 const gchar *gkey, *buf = gtk_entry_get_text(entry);
392
393 if (buf == NULL)
394 return;
395 /* handle potential subsection anchor */
396 if ((settings.special_anchor = strchr(buf, '#')) || /* thml */
397 (settings.special_anchor = strchr(buf, '!'))) /* osisref */
398 *settings.special_anchor = '\0';
399
400 rawtext =
401 main_get_raw_text(navbar_versekey.module_name->str,
402 (gchar *)buf);
403 if (!rawtext || (rawtext && (strlen(rawtext) < 2))) {
404 gtk_entry_set_text(entry, navbar_versekey.key->str);
405 g_free(rawtext);
406 return;
407 }
408
409 gkey =
410 main_get_valid_key(settings.MainWindowModule, (gchar *)buf);
411
412 // we got a valid key. but was it really a valid key within v11n?
413 // for future use in determining whether to show normal navbar content.
414 navbar_versekey.valid_key =
415 main_is_Bible_key(settings.MainWindowModule, gkey);
416
417 if (settings.special_anchor)
418 *settings.special_anchor = '#'; /* put it back. */
419 if (gkey == NULL)
420 return;
421
422 gchar *url = g_strdup_printf("sword:///%s%s", gkey,
423 (settings.special_anchor ? settings.special_anchor : ""));
424
425 navbar_versekey.module_name =
426 g_string_assign(navbar_versekey.module_name,
427 settings.MainWindowModule);
428 main_navbar_versekey_set(navbar_versekey, gkey);
429 main_url_handler(url, TRUE);
430 if (url)
431 g_free(url);
432 if (gkey)
433 g_free((gchar *)gkey);
434 }
435
436 /******************************************************************************
437 * Name
438 * on_button_verse_menu_verse_scroll_event
439 *
440 * Synopsis
441 * #include "gui/navbar_versekey.h"
442 *
443 * gboolean on_button_verse_menu_verse_scroll_event(GtkWidget * widget,
444 * GdkEvent * event,
445 * gpointer user_data)
446 *
447 * Description
448 *
449 *
450 * Return value
451 * gboolean
452 */
453
on_button_verse_menu_verse_scroll_event(GtkWidget * widget,GdkEvent * event,gpointer user_data)454 static gboolean on_button_verse_menu_verse_scroll_event(GtkWidget *widget,
455 GdkEvent *event,
456 gpointer user_data)
457 {
458 main_navbar_versekey_spin_verse(navbar_versekey,
459 event->scroll.direction);
460 return FALSE;
461 }
462
463 /******************************************************************************
464 * Name
465 * on_button_verse_menu_chapter_scroll_event
466 *
467 * Synopsis
468 * #include "gui/navbar_versekey.h"
469 *
470 * gboolean on_button_verse_menu_chapter_scroll_event(GtkWidget * widget,
471 * GdkEvent * event,
472 * gpointer user_data)
473 *
474 * Description
475 *
476 *
477 * Return value
478 * gboolean
479 */
480
on_button_verse_menu_chapter_scroll_event(GtkWidget * widget,GdkEvent * event,gpointer user_data)481 static gboolean on_button_verse_menu_chapter_scroll_event(GtkWidget *widget,
482 GdkEvent *event,
483 gpointer user_data)
484 {
485 main_navbar_versekey_spin_chapter(navbar_versekey,
486 event->scroll.direction);
487 return FALSE;
488 }
489
490 /******************************************************************************
491 * Name
492 * on_button_verse_menu_book_scroll_event
493 *
494 * Synopsis
495 * #include "gui/navbar_versekey.h"
496 *
497 * gboolean on_button_verse_menu_book_scroll_event(GtkWidget * widget,
498 * GdkEvent * event,
499 * gpointer user_data)
500 *
501 * Description
502 *
503 *
504 * Return value
505 * gboolean
506 */
507
on_button_verse_menu_book_scroll_event(GtkWidget * widget,GdkEvent * event,gpointer user_data)508 static gboolean on_button_verse_menu_book_scroll_event(GtkWidget *widget,
509 GdkEvent *event,
510 gpointer user_data)
511 {
512 main_navbar_versekey_spin_book(navbar_versekey,
513 event->scroll.direction);
514 return FALSE;
515 }
516
517 /******************************************************************************
518 * Name
519 * on_up_eventbox_button_release_event
520 *
521 * Synopsis
522 * #include "gui/navbar_versekey.h"
523 *
524 * gboolean on_up_eventbox_button_release_event (GtkWidget * widget,
525 * GdkEventButton * event,
526 * gpointer user_data)
527 *
528 * Description
529 *
530 *
531 * Return value
532 * gboolean
533 */
534
on_up_eventbox_button_release_event(GtkWidget * widget,GdkEventButton * event,gpointer user_data)535 static gboolean on_up_eventbox_button_release_event(GtkWidget *widget,
536 GdkEventButton *event,
537 gpointer user_data)
538 {
539 switch (GPOINTER_TO_INT(user_data)) {
540 case BOOK_BUTTON:
541 main_navbar_versekey_spin_book(navbar_versekey, 0);
542 break;
543 case CHAPTER_BUTTON:
544 main_navbar_versekey_spin_chapter(navbar_versekey, 0);
545 break;
546 case VERSE_BUTTON:
547 main_navbar_versekey_spin_verse(navbar_versekey, 0);
548 break;
549 }
550 return FALSE;
551 }
552
553 /******************************************************************************
554 * Name
555 * on_down_eventbox_button_release_event
556 *
557 * Synopsis
558 * #include "gui/navbar_versekey.h"
559 *
560 * gboolean on_down_eventbox_button_release_event(GtkWidget * widget,
561 * GdkEventButton * event,
562 * gpointer user_data)
563 *
564 * Description
565 *
566 *
567 * Return value
568 * gboolean
569 */
570
on_down_eventbox_button_release_event(GtkWidget * widget,GdkEventButton * event,gpointer user_data)571 static gboolean on_down_eventbox_button_release_event(GtkWidget *widget,
572 GdkEventButton *event,
573 gpointer user_data)
574 {
575 switch (GPOINTER_TO_INT(user_data)) {
576 case BOOK_BUTTON:
577 main_navbar_versekey_spin_book(navbar_versekey, 1);
578 break;
579 case CHAPTER_BUTTON:
580 main_navbar_versekey_spin_chapter(navbar_versekey, 1);
581 break;
582 case VERSE_BUTTON:
583 main_navbar_versekey_spin_verse(navbar_versekey, 1);
584 break;
585 }
586 return FALSE;
587 }
588
589 /******************************************************************************
590 * Name
591 * access_on_up_eventbox_button_release_event
592 *
593 * Synopsis
594 * #include "gui/navbar_versekey.h"
595 *
596 * gboolean on_up_eventbox_button_release_event(gpointer element)
597 *
598 * Description
599 * access to internal static method from main_window.c
600 *
601 * Return value
602 * gboolean
603 */
604
access_on_up_eventbox_button_release_event(gint element)605 gboolean access_on_up_eventbox_button_release_event(gint element)
606 {
607 return on_up_eventbox_button_release_event(NULL, NULL, GINT_TO_POINTER(element));
608 }
609
610 /******************************************************************************
611 * Name
612 * access_on_down_eventbox_button_release_event
613 *
614 * Synopsis
615 * #include "gui/navbar_versekey.h"
616 *
617 * gboolean on_down_eventbox_button_release_event(gpointer element)
618 *
619 * Description
620 * access to internal static method from main_window.c
621 *
622 * Return value
623 * gboolean
624 */
625
access_on_down_eventbox_button_release_event(gint element)626 gboolean access_on_down_eventbox_button_release_event(gint element)
627 {
628 return on_down_eventbox_button_release_event(NULL, NULL, GINT_TO_POINTER(element));
629 }
630
631 /******************************************************************************
632 * Name
633 * _connect_signals
634 *
635 * Synopsis
636 * #include "gui/navbar_versekey.h"
637 *
638 * void _connect_signals(NAVBAR_VERSEKEY navbar)
639 *
640 * Description
641 *
642 *
643 * Return value
644 * void
645 */
646
_connect_signals(NAVBAR_VERSEKEY navbar)647 static void _connect_signals(NAVBAR_VERSEKEY navbar)
648 {
649
650 g_signal_connect((gpointer)navbar.lookup_entry,
651 "activate", G_CALLBACK(on_entry_activate), NULL);
652 g_signal_connect((gpointer)navbar.button_book_up,
653 "button_release_event",
654 G_CALLBACK(on_up_eventbox_button_release_event),
655 GINT_TO_POINTER(BOOK_BUTTON));
656 g_signal_connect((gpointer)navbar.button_book_down,
657 "button_release_event",
658 G_CALLBACK(on_down_eventbox_button_release_event),
659 GINT_TO_POINTER(BOOK_BUTTON));
660 g_signal_connect((gpointer)navbar.button_chapter_up,
661 "button_release_event",
662 G_CALLBACK(on_up_eventbox_button_release_event),
663 GINT_TO_POINTER(CHAPTER_BUTTON));
664 g_signal_connect((gpointer)navbar.button_chapter_down,
665 "button_release_event",
666 G_CALLBACK(on_down_eventbox_button_release_event),
667 GINT_TO_POINTER(CHAPTER_BUTTON));
668 g_signal_connect((gpointer)navbar.button_verse_up,
669 "button_release_event",
670 G_CALLBACK(on_up_eventbox_button_release_event),
671 GINT_TO_POINTER(VERSE_BUTTON));
672 g_signal_connect((gpointer)navbar.button_verse_down,
673 "button_release_event",
674 G_CALLBACK(on_down_eventbox_button_release_event),
675 GINT_TO_POINTER(VERSE_BUTTON));
676
677 g_signal_connect((gpointer)navbar.button_history_back,
678 "clicked",
679 G_CALLBACK(on_button_history_back_clicked), NULL);
680 g_signal_connect((gpointer)navbar.button_history_next, "clicked",
681 G_CALLBACK(on_button_history_next_clicked), NULL);
682 g_signal_connect((gpointer)navbar.button_history_menu,
683 "button_press_event",
684 G_CALLBACK(select_button_press_callback), NULL);
685 g_signal_connect((gpointer)navbar.button_book_menu,
686 "button_press_event",
687 G_CALLBACK(select_book_button_press_callback),
688 NULL);
689 g_signal_connect((gpointer)navbar.button_chapter_menu,
690 "button_press_event",
691 G_CALLBACK(select_chapter_button_press_callback),
692 NULL);
693 g_signal_connect((gpointer)navbar.button_verse_menu,
694 "button_press_event",
695 G_CALLBACK(select_verse_button_press_callback),
696 NULL);
697 #if !GTK_CHECK_VERSION(3, 4, 0)
698 g_signal_connect((gpointer)navbar.button_verse_menu,
699 "scroll_event",
700 G_CALLBACK(on_button_verse_menu_verse_scroll_event), NULL);
701 g_signal_connect((gpointer)navbar.button_chapter_menu,
702 "scroll_event",
703 G_CALLBACK(on_button_verse_menu_chapter_scroll_event),
704 NULL);
705 g_signal_connect((gpointer)navbar.button_book_menu,
706 "scroll_event",
707 G_CALLBACK(on_button_verse_menu_book_scroll_event), NULL);
708 #endif
709 }
710
711 /******************************************************************************
712 * Name
713 * gui_navbar_versekey_new
714 *
715 * Synopsis
716 * #include "gui/navbar_versekey.h"
717 *
718 * GtkWidget *gui_navbar_book_new(void)
719 *
720 * Description
721 * create a new Bible navigation toolbar and return it
722 *
723 * Return value
724 * GtkWidget *
725 */
726
gui_navbar_versekey_new(void)727 GtkWidget *gui_navbar_versekey_new(void)
728 {
729
730 #ifdef USE_GTKBUILDER
731 GtkBuilder *gxml;
732 #else
733 GladeXML *gxml;
734 #endif
735 #if GTK_CHECK_VERSION(3, 4, 0)
736 GtkWidget *eventbox;
737 #endif
738
739 gchar *glade_file =
740 gui_general_user_file("navbar_versekey" UI_SUFFIX, FALSE);
741 g_return_val_if_fail((glade_file != NULL), NULL);
742 XI_message(("%s", glade_file));
743
744 /* build the widget */
745 #ifdef USE_GTKBUILDER
746 gxml = gtk_builder_new();
747 gtk_builder_add_from_file(gxml, glade_file, NULL);
748 #else
749 gxml = glade_xml_new(glade_file, "navbar", NULL);
750 #endif
751 navbar_versekey.dialog = FALSE;
752 navbar_versekey.module_name =
753 g_string_new(settings.MainWindowModule);
754 navbar_versekey.key = g_string_new(settings.currentverse);
755
756 navbar_versekey.navbar = UI_GET_ITEM(gxml, "navbar");
757
758 navbar_versekey.button_history_back =
759 UI_GET_ITEM(gxml, "button_history_back");
760 navbar_versekey.button_history_next =
761 UI_GET_ITEM(gxml, "button_history_foward");
762 navbar_versekey.button_history_menu =
763 UI_GET_ITEM(gxml, "togglebutton_history_list");
764
765 navbar_versekey.button_book_up = UI_GET_ITEM(gxml, "eventbox9");
766 navbar_versekey.button_book_down = UI_GET_ITEM(gxml, "eventbox6");
767 navbar_versekey.button_chapter_up = UI_GET_ITEM(gxml, "eventbox8");
768 navbar_versekey.button_chapter_down =
769 UI_GET_ITEM(gxml, "eventbox4");
770 navbar_versekey.button_verse_up = UI_GET_ITEM(gxml, "eventbox7");
771 navbar_versekey.button_verse_down = UI_GET_ITEM(gxml, "eventbox1");
772
773 navbar_versekey.arrow_book_up = UI_GET_ITEM(gxml, "image12");
774 navbar_versekey.arrow_book_down = UI_GET_ITEM(gxml, "image14");
775 navbar_versekey.arrow_chapter_up = UI_GET_ITEM(gxml, "image8");
776 navbar_versekey.arrow_chapter_down = UI_GET_ITEM(gxml, "image10");
777 navbar_versekey.arrow_verse_up = UI_GET_ITEM(gxml, "image6");
778 navbar_versekey.arrow_verse_down = UI_GET_ITEM(gxml, "image5");
779
780 navbar_versekey.button_book_menu =
781 UI_GET_ITEM(gxml, "togglebutton_book");
782 navbar_versekey.button_chapter_menu =
783 UI_GET_ITEM(gxml, "togglebutton_chapter");
784 navbar_versekey.button_verse_menu =
785 UI_GET_ITEM(gxml, "togglebutton_verse");
786 navbar_versekey.lookup_entry = UI_GET_ITEM(gxml, "entry_lookup");
787 navbar_versekey.label_book_menu = UI_GET_ITEM(gxml, "label_book");
788 navbar_versekey.label_chapter_menu =
789 UI_GET_ITEM(gxml, "label_chapter");
790 navbar_versekey.label_verse_menu =
791 UI_GET_ITEM(gxml, "label_verse");
792 #if GTK_CHECK_VERSION(3, 4, 0)
793 eventbox = UI_GET_ITEM(gxml, "eventbox_book");
794 g_signal_connect((gpointer)eventbox, "scroll_event",
795 G_CALLBACK(on_button_verse_menu_book_scroll_event), NULL);
796
797 eventbox = UI_GET_ITEM(gxml, "eventbox_chapter");
798 g_signal_connect((gpointer)eventbox, "scroll_event",
799 G_CALLBACK(on_button_verse_menu_chapter_scroll_event),
800 NULL);
801
802 eventbox = UI_GET_ITEM(gxml, "eventbox_verse");
803 g_signal_connect((gpointer)eventbox, "scroll_event",
804 G_CALLBACK(on_button_verse_menu_verse_scroll_event), NULL);
805 #endif
806 _connect_signals(navbar_versekey);
807
808 return navbar_versekey.navbar;
809 }
810