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