1 /*
2  * AiksaurusGTK - A GTK interface to the Aiksaurus library
3  * Copyright (C) 2001 by Jared Davis
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
18  * 02111-1307, USA.
19  */
20 
21 #include "Toolbar.h"
22 #include "AiksaurusGTK_picbutton.h"
23 #include "DialogMediator.h"
24 #include <gdk/gdkkeysyms.h>
25 
26 namespace AiksaurusGTK_impl
27 {
28 
Toolbar(DialogMediator & mediator,GtkWidget * window)29     Toolbar::Toolbar(DialogMediator& mediator, GtkWidget* window) throw(std::bad_alloc)
30         : d_mediator(mediator),
31           d_searchbar_words(12),
32           d_ishistorymove(false),
33           d_searchhack(false),
34           d_window_ptr(window)
35     {
36         d_toolbar_ptr = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,	0);
37 
38         // Create back button and menu
39         d_backbutton_box_ptr = gtk_box_new(GTK_ORIENTATION_HORIZONTAL,	0);
40         d_backbutton_ptr = new AiksaurusGTK_picbutton(d_window_ptr, "go-previous");
41         d_backbutton_ptr->addMenu(d_history.list_back(), G_CALLBACK(_backMenuClicked), this);
42         d_backbutton_ptr->limitVisibleOptions(10);
43         _setTooltip(d_backbutton_ptr->getButton(), "Back");
44 
45         // Create forward button and menu
46         d_forwardbutton_ptr = new AiksaurusGTK_picbutton(d_window_ptr, "go-next");
47         d_forwardbutton_ptr->addMenu(d_history.list_forward(),
48                                      G_CALLBACK(_forwardMenuClicked), this);
49         d_forwardbutton_ptr->limitVisibleOptions(10);
50         _setTooltip(d_forwardbutton_ptr->getButton(), "Forward");
51 
52 
53         // Create search dropdown bar.
54         d_searchbar_label_ptr = gtk_label_new("  Look up:");
55         d_searchbar_ptr = gtk_combo_box_text_new_with_entry();
56         _setTooltip(GTK_WIDGET(gtk_bin_get_child(GTK_BIN(d_searchbar_ptr))), "Enter word to look up");
57 
58         // Create search button
59         d_searchbutton_ptr = new AiksaurusGTK_picbutton(d_window_ptr, "go-jump");
60         _setTooltip(d_searchbutton_ptr->getButton(), "Find Synonyms");
61 
62 
63         // Add all widgets to the toolbar layout box.
64         gtk_box_pack_start(GTK_BOX(d_backbutton_box_ptr), d_backbutton_ptr->getButton(), 0, 0, 0);
65         gtk_box_pack_start(GTK_BOX(d_backbutton_box_ptr), d_backbutton_ptr->getMenuButton(), 0, 0, 0);
66         gtk_box_pack_start(GTK_BOX(d_toolbar_ptr), d_backbutton_box_ptr, 0, 0, 4);
67         gtk_box_pack_start(GTK_BOX(d_toolbar_ptr), d_forwardbutton_ptr->getButton(), 0, 0, 0);
68         gtk_box_pack_start(GTK_BOX(d_toolbar_ptr), d_forwardbutton_ptr->getMenuButton(), 0, 0, 0);
69         gtk_box_pack_start(GTK_BOX(d_toolbar_ptr), d_searchbar_label_ptr, 0, 0, 5);
70         gtk_box_pack_start(GTK_BOX(d_toolbar_ptr), d_searchbar_ptr, 1, 1, 5);
71         gtk_box_pack_start(GTK_BOX(d_toolbar_ptr), d_searchbutton_ptr->getButton(), 0, 0, 4);
72 
73         // Connect all relevant signals.
74         g_signal_connect(G_OBJECT(d_backbutton_ptr->getButton()), "clicked",
75                            G_CALLBACK(_backClicked), this);
76         g_signal_connect(G_OBJECT(d_forwardbutton_ptr->getButton()), "clicked",
77                            G_CALLBACK(_forwardClicked), this);
78         g_signal_connect(G_OBJECT(d_searchbutton_ptr->getButton()), "clicked",
79                            G_CALLBACK(_searchClicked), this);
80         g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(d_searchbar_ptr))), "activate",
81                            G_CALLBACK(_searchBarActivate), this);
82         g_signal_connect(G_OBJECT(GTK_COMBO_BOX(d_searchbar_ptr)), "popdown",
83                            G_CALLBACK(_searchBarHide), this);
84         g_signal_connect(G_OBJECT(gtk_bin_get_child(GTK_BIN(d_searchbar_ptr))), "changed",
85                            G_CALLBACK(_searchBarChanged), this);
86 
87         _updateNavigation();
88     }
89 
~Toolbar()90     Toolbar::~Toolbar() throw()
91     {
92 
93     }
94 
_updateNavigation()95     void Toolbar::_updateNavigation() throw(std::bad_alloc)
96     {
97         if (d_history.size_back())
98             d_backbutton_ptr->enable();
99         else
100             d_backbutton_ptr->disable();
101 
102         if (d_history.size_forward())
103             d_forwardbutton_ptr->enable();
104         else
105             d_forwardbutton_ptr->disable();
106 
107         _setTooltip(d_backbutton_ptr->getButton(), d_history.tip_back());
108         _setTooltip(d_forwardbutton_ptr->getButton(), d_history.tip_forward());
109 
110         d_backbutton_ptr->updateMenuOptions();
111         d_forwardbutton_ptr->updateMenuOptions();
112     }
113 
search(const char * str)114     void Toolbar::search(const char* str) throw(std::bad_alloc)
115     {
116         if (!d_ishistorymove)
117             d_history.search(str);
118 		GtkComboBoxText *combo = GTK_COMBO_BOX_TEXT(d_searchbar_ptr);
119 
120         _updateNavigation();
121 
122         d_searchbar_words.addItem(str);
123 		gtk_combo_box_text_remove_all(combo);
124 		const GList *ptr = d_searchbar_words.list();
125 		for (; ptr; ptr = ptr->next)
126 			gtk_combo_box_text_append_text(combo, reinterpret_cast<const char*>(ptr->data));
127     }
128 
_setTooltip(GtkWidget * w,const char * str)129     void Toolbar::_setTooltip(GtkWidget* w, const char* str) throw()
130     {
131         gtk_widget_set_tooltip_text(w,	str);
132     }
133 
focus()134     void Toolbar::focus() throw()
135     {
136         gtk_window_set_focus(GTK_WINDOW(d_window_ptr), gtk_bin_get_child(GTK_BIN(d_searchbar_ptr)));
137     }
138 
getText() const139     const char* Toolbar::getText() const throw()
140     {
141         return gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(d_searchbar_ptr))));
142     }
143 
getToolbar()144     GtkWidget* Toolbar::getToolbar() throw()
145     {
146         return d_toolbar_ptr;
147     }
148 
149 
150 
_backClicked(GtkWidget *,gpointer data)151     void Toolbar::_backClicked(GtkWidget*, gpointer data) throw()
152     {
153         Toolbar* tb = static_cast<Toolbar*>(data);
154         tb->d_history.move_back();
155         tb->d_ishistorymove = true;
156         tb->d_mediator.eventSearch( tb->d_history.current() );
157         tb->d_ishistorymove = false;
158     }
159 
_backMenuClicked(GList * element,gpointer data)160     void Toolbar::_backMenuClicked(GList* element, gpointer data) throw()
161     {
162         Toolbar* tb = static_cast<Toolbar*>(data);
163         tb->d_history.move_back_to(element);
164         tb->d_ishistorymove = true;
165         tb->d_mediator.eventSearch( tb->d_history.current() );
166         tb->d_ishistorymove = false;
167     }
168 
_forwardClicked(GtkWidget *,gpointer data)169     void Toolbar::_forwardClicked(GtkWidget*, gpointer data) throw()
170     {
171         Toolbar* tb = static_cast<Toolbar*>(data);
172         tb->d_history.move_forward();
173         tb->d_ishistorymove = true;
174         tb->d_mediator.eventSearch( tb->d_history.current() );
175         tb->d_ishistorymove = false;
176     }
177 
_forwardMenuClicked(GList * element,gpointer data)178     void Toolbar::_forwardMenuClicked(GList* element, gpointer data) throw()
179     {
180         Toolbar* tb = static_cast<Toolbar*>(data);
181         tb->d_history.move_forward_to(element);
182         tb->d_ishistorymove = true;
183         tb->d_mediator.eventSearch( tb->d_history.current() );
184         tb->d_ishistorymove = false;
185     }
186 
_searchBarChanged(GtkWidget *,gpointer data)187     void Toolbar::_searchBarChanged(GtkWidget*, gpointer data) throw()
188     {
189         Toolbar* tb = static_cast<Toolbar*>(data);
190 		bool popup_visible;
191 		g_object_get (tb->d_searchbar_ptr, "popup-shown", &popup_visible, NULL);
192 
193         if (popup_visible)
194             tb->d_searchhack = true;
195     }
196 
_searchBarHide(GtkWidget *,gpointer data)197     void Toolbar::_searchBarHide(GtkWidget*, gpointer data) throw()
198     {
199         Toolbar* tb = static_cast<Toolbar*>(data);
200 
201         if (tb->d_searchhack)
202             tb->d_mediator.eventSearch( tb->getText() );
203 
204         tb->d_searchhack = false;
205     }
206 
_searchBarActivate(GtkWidget * w,gpointer data)207     void Toolbar::_searchBarActivate(GtkWidget* w, gpointer data) throw()
208     {
209       _searchClicked(w, data);
210     }
211 
_searchClicked(GtkWidget *,gpointer data)212     void Toolbar::_searchClicked(GtkWidget*, gpointer data) throw()
213     {
214         Toolbar* tb = static_cast<Toolbar*>(data);
215         tb->d_mediator.eventSearch( tb->getText() );
216     }
217 
218 }
219