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