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