1 /* 2 * Copyright 2011 kubtek <kubtek@mail.com> 3 * 4 * This file is part of StarDict. 5 * 6 * StarDict is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 3 of the License, or 9 * (at your option) any later version. 10 * 11 * StarDict is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with StarDict. If not, see <http://www.gnu.org/licenses/>. 18 */ 19 20 #ifndef __SD_MAINWIN_H__ 21 #define __SD_MAINWIN_H__ 22 23 #include <gtk/gtk.h> 24 #include <string> 25 26 #include "articleview.h" 27 #include "readword.h" 28 29 const guint MAX_HISTORY_WORD_ITEM_NUM=20; 30 const guint MAX_BACK_WORD_ITEM_NUM=10; 31 32 const int MIN_WINDOW_WIDTH=200; 33 const int MIN_WINDOW_HEIGHT=100; 34 35 enum TextWinQueryResult 36 { 37 TEXT_WIN_FOUND, 38 TEXT_WIN_NOT_FOUND, 39 TEXT_WIN_SHOW_FIRST, 40 TEXT_WIN_FUZZY_NOT_FOUND, 41 TEXT_WIN_PATTERN_NOT_FOUND, 42 TEXT_WIN_TIPS, // when the word entry is empty,it will show tip 43 TEXT_WIN_INFO, 44 TEXT_WIN_TREEDICT, 45 TEXT_WIN_NET_FOUND, 46 TEXT_WIN_NET_NOT_FOUND, 47 TEXT_WIN_NET_SHOW_FIRST, 48 }; 49 50 enum ListWinListWordType { 51 LIST_WIN_NORMAL_LIST, 52 LIST_WIN_FUZZY_LIST, 53 LIST_WIN_DATA_LIST, 54 LIST_WIN_PATTERN_LIST, 55 LIST_WIN_EMPTY 56 }; 57 58 struct BackListData { 59 gchar *word; 60 gdouble adjustment_value; 61 }; 62 63 class TopWin { 64 private: 65 gboolean enable_change_cb; 66 GList *BackList; 67 guint BackList_index; 68 GtkWidget *SearchMenu; 69 GtkWidget* WordCombo; 70 GtkWidget *back_button; 71 GtkWidget *forward_button; 72 73 static void GoCallback(GtkWidget *widget, TopWin *oTopWin); 74 static void BackCallback(GtkWidget *widget, TopWin *oTopWin); 75 static void ForwardCallback(GtkWidget *widget, TopWin *oTopWin); 76 static void MenuCallback(GtkWidget *widget, TopWin *oTopWin); 77 78 static void do_search_by_fuzzyquery (GtkWidget *item, TopWin *oTopWin); 79 static void do_search_by_patternmatch (GtkWidget *item, TopWin *oTopWin); 80 static void do_search_by_regularmatch (GtkWidget *item, TopWin *oTopWin); 81 static void do_search_by_fulltextsearch (GtkWidget *item, TopWin *oTopWin); 82 static void on_entry_icon_press(GtkEntry *entry, gint position, GdkEventButton *event, TopWin *oTopWin); 83 static void on_entry_changed(GtkEntry *entry, TopWin *oTopWin); 84 static void on_entry_activate(GtkEntry *entry, TopWin *oTopWin); 85 static void on_entry_populate_popup(GtkEntry *entry, GtkMenu *menu, TopWin *oTopWin); 86 87 static void on_clear_history_menu_item_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 88 89 static void on_main_menu_preferences_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 90 static void on_main_menu_dictmanage_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 91 static void on_main_menu_pluginmanage_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 92 static void on_main_menu_downloaddict_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 93 static void on_main_menu_newversion_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 94 static void on_main_menu_help_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 95 static void on_main_menu_about_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 96 static void on_main_menu_quit_activate(GtkMenuItem *menuitem, TopWin *oTopWin); 97 98 void LoadHistory(GtkListStore* list_store); 99 void SaveHistory(void); 100 public: 101 GtkWidget* MainMenu; 102 103 TopWin(); 104 ~TopWin(); 105 106 void Create(GtkWidget *vbox); 107 void Destroy(void); 108 void SetText(const gchar *word, bool notify=true); 109 //void SetText_without_notify(const gchar *word); 110 void clear_entry(); 111 void TextSelectAll(); 112 void InsertHisList(const gchar *word); 113 void InsertBackList(const gchar *word = NULL); 114 void do_back(); 115 void do_forward(); 116 void do_prev(); 117 void do_next(); 118 void do_menu(); 119 120 gboolean TextSelected(); has_focus()121 bool has_focus() { 122 return gtk_widget_has_focus(gtk_bin_get_child(GTK_BIN(WordCombo))); 123 } 124 static void ClipboardReceivedCallback(GtkClipboard *clipboard, const gchar *text, gpointer data); 125 set_position_in_text(gint pos)126 void set_position_in_text(gint pos) { 127 gtk_editable_set_position(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(WordCombo))), pos); 128 } select_region_in_text(gint beg,gint end)129 void select_region_in_text(gint beg, gint end) { 130 gtk_editable_select_region(GTK_EDITABLE(gtk_bin_get_child(GTK_BIN(WordCombo))), beg, end); 131 } get_text()132 const gchar *get_text() { 133 if (!WordCombo) 134 return ""; 135 return gtk_entry_get_text(GTK_ENTRY(gtk_bin_get_child(GTK_BIN(WordCombo)))); 136 } grab_focus()137 void grab_focus() { 138 gtk_widget_grab_focus(gtk_bin_get_child(GTK_BIN(WordCombo))); 139 } 140 }; 141 142 class ListWin { 143 private: 144 GtkListStore *list_model; 145 GtkTreeStore *tree_model; 146 bool nowIsList; 147 148 static gboolean on_button_press(GtkWidget * widget, GdkEventButton * event, ListWin *oListWin); 149 static void on_selection_changed(GtkTreeSelection *selection, ListWin *oListWin); 150 151 public: 152 ListWinListWordType list_word_type; 153 std::string fuzzyWord; 154 GtkTreeView *treeview_; 155 ListWin()156 ListWin() {} 157 void Create(GtkWidget *notebook); 158 void SetModel(bool isListModel); 159 void Destroy(); 160 void Clear(); 161 void ReScroll(); 162 void Prepend(const gchar *word); 163 void InsertLast(const gchar *word); 164 void SetTreeModel(std::vector<gchar *> *reslist, std::vector<InstantDictIndex> &dictmask); 165 void SetTreeModel(std::list<STARDICT::LookupResponse::WordTreeElement *> *wordtree); 166 void MergeFuzzyList(std::list<char *> *wordlist); 167 void MergeWordList(std::list<char *> *wordlist); treeview_has_focus()168 bool treeview_has_focus() const { 169 return gtk_widget_has_focus(GTK_WIDGET(treeview_)); 170 } 171 }; 172 173 class TreeWin { 174 public: 175 GtkWidget *treeview; 176 TreeWin()177 TreeWin() {} 178 bool Create(GtkWidget *notebook); 179 private: 180 static gboolean on_button_press(GtkWidget * widget, GdkEventButton * event, TreeWin *oTreeWin); 181 static void on_selection_changed(GtkTreeSelection *selection, TreeWin *oTreeWin); 182 }; 183 184 class ResultWin { 185 public: 186 GtkWidget *treeview; 187 void Create(GtkWidget *notebook); 188 void InsertLast(const gchar *word, const gchar *mark); 189 void Clear(); 190 private: 191 static void on_selection_changed(GtkTreeSelection *selection, ResultWin *oResultWin); 192 }; 193 194 class IndexWin { 195 public: 196 GtkWidget *notebook; 197 198 ListWin oListWin; 199 ResultWin oResultWin; 200 TreeWin oTreeWin; 201 202 IndexWin(); 203 bool Create(GtkWidget *hpaned); 204 private: 205 }; 206 207 class LeftWin { 208 public: 209 GtkWidget *vbox; 210 LeftWin(); 211 ~LeftWin(); 212 void Create(GtkWidget *hbox, bool has_treedict); 213 private: 214 GtkWidget *choosegroup_menu; 215 void UpdateChooseGroup(); 216 static void on_wazard_button_toggled(GtkToggleButton *button, LeftWin *oLeftWin); 217 static void on_appendix_button_toggled(GtkToggleButton *button, LeftWin *oLeftWin); 218 static void on_result_button_toggled(GtkToggleButton *button, LeftWin *oLeftWin); 219 static void on_translate_button_toggled(GtkToggleButton *button, LeftWin *oLeftWin); 220 static void PreviousCallback(GtkWidget *widget, LeftWin *oLeftWin); 221 static void NextCallback(GtkWidget *widget, LeftWin *oLeftWin); 222 static void on_choose_group_button_clicked(GtkWidget *widget, LeftWin *oLeftWin); 223 static void on_enable_netdict_menuitem_toggled(GtkCheckMenuItem *menuitem, LeftWin *oLeftWin); 224 static void on_choose_group_menuitem_toggled(GtkCheckMenuItem *menuitem, LeftWin *oLeftWin); 225 }; 226 227 class ToolWin { 228 private: 229 230 static void ShowListCallback(GtkWidget *widget, gpointer data); 231 static void HideListCallback(GtkWidget *widget, gpointer data); 232 static void CopyCallback(GtkWidget *widget, ToolWin *oToolWin); 233 static void PlayCallback(GtkWidget *widget, ToolWin *oToolWin); 234 static void SaveCallback(GtkWidget *widget, ToolWin *oToolWin); 235 static void SearchCallback(GtkWidget *widget, ToolWin *oToolWin); 236 static void on_pronounce_menu_item_activate(GtkMenuItem *menuitem, int engine_index); 237 public: 238 GtkWidget* ShowListButton; 239 GtkWidget* HideListButton; 240 GtkToolItem* PronounceWordMenuButton; 241 242 ToolWin(); 243 ~ToolWin(); 244 void Create(GtkWidget *vbox); 245 void UpdatePronounceMenu(); 246 void do_search(); 247 void do_save(); 248 }; 249 250 class TextWin : public sigc::trackable { 251 public: 252 std::string queryWord; 253 std::string pronounceWord; 254 ReadWordType readwordtype; 255 TextWinQueryResult query_result; 256 std::auto_ptr<ArticleView> view; 257 gboolean search_from_beginning; 258 std::string find_text; 259 GtkEntry *eSearch; 260 TextWin()261 TextWin() {} ~TextWin()262 ~TextWin() {} 263 264 void Create(GtkWidget *vbox); 265 void ShowTips(); 266 void ShowInfo(); 267 void ShowInitFailed(); 268 void Show(const gchar *str); 269 void Show(const gchar *orig_word, gchar ***Word, gchar ****WordData); 270 void ShowTreeDictData(gchar *data); 271 void Show(const struct STARDICT::LookupResponse::DictResponse *dict_response, STARDICT::LookupResponse::ListType list_type); 272 void Show(NetDictResponse *resp); 273 gboolean Find (const gchar *text, gboolean start); IsSearchPanelHasFocus()274 bool IsSearchPanelHasFocus() { return gtk_widget_has_focus(GTK_WIDGET(eSearch)); } 275 void set_bookname_style(BookNameStyle style); 276 277 void ShowSearchPanel(); 278 void HideSearchPanel(); 279 280 private: 281 GtkButton *btClose; 282 GtkButton *btFind; 283 GtkWidget *hbSearchPanel; 284 ReadWordType selection_readwordtype; 285 286 static void SelectionCallback(GtkWidget* widget,GtkSelectionData *selection_data, guint time, TextWin *oTextWin); 287 static gboolean on_button_press(GtkWidget * widget, GdkEventButton * event, TextWin *oTextWin); 288 static void on_query_menu_item_activate(GtkMenuItem *menuitem, TextWin *oTextWin); 289 static void on_pronounce_menu_item_activate(GtkMenuItem *menuitem, TextWin *oTextWin); 290 static void on_populate_popup(GtkTextView *textview, GtkMenu *menu, TextWin *oTextWin); 291 static bool find_first_tag(gchar *str, gchar * & beg, gchar * & end); 292 static void OnCloseSearchPanel(GtkWidget *widget, TextWin *oTextWin); 293 static gboolean OnSearchKeyPress(GtkWidget *widget, GdkEventKey *event, 294 TextWin *oTextWin); 295 static void OnFindSearchPanel(GtkWidget *widget, TextWin *oTextWin); 296 }; 297 298 class TransWin { 299 public: 300 TransWin(); 301 void Create(GtkWidget *notebook); IsInputViewHasFocus()302 bool IsInputViewHasFocus() { return gtk_widget_has_focus(GTK_WIDGET(input_textview)); } 303 private: 304 GtkWidget *input_textview; 305 GtkWidget *result_textview; 306 GtkWidget *engine_combobox; 307 GtkWidget *fromlang_combobox; 308 GtkWidget *tolang_combobox; 309 GtkWidget *trans_button; 310 GtkWidget *link_label; 311 std::string pronounceWord; 312 ReadWordType selection_readwordtype; 313 static void on_pronounce_menu_item_activate(GtkMenuItem *menuitem, TransWin *oTransWin); 314 static void on_populate_popup(GtkTextView *textview, GtkMenu *menu, TransWin *oTransWin); 315 static void on_translate_button_clicked(GtkWidget *widget, TransWin *oTransWin); 316 static void on_engine_combobox_changed(GtkWidget *widget, TransWin *oTransWin); 317 static void on_fromlang_combobox_changed(GtkWidget *widget, TransWin *oTransWin); 318 static void on_tolang_combobox_changed(GtkWidget *widget, TransWin *oTransWin); 319 static void on_link_eventbox_clicked(GtkWidget *widget, GdkEventButton *event, TransWin *oTransWin); 320 static void on_destroy(GtkWidget *object, TransWin* oTransWin); 321 void on_translate_error(const char * error_msg); 322 void on_translate_response(const char * text); 323 void SetLink(gint engine_index); 324 void SetLink(const char *linkname); 325 void SetEngine(gint index); 326 void SetFromLang(bool load, gint index); 327 void SetToLang(bool load, gint index); 328 }; 329 330 class MidWin { 331 public: 332 GtkWidget* hpaned; 333 GtkWidget* notebook; 334 335 LeftWin oLeftWin; 336 IndexWin oIndexWin; 337 ToolWin oToolWin; 338 TextWin oTextWin; 339 TransWin oTransWin; 340 MidWin()341 MidWin() {} 342 void Create(GtkWidget *vbox); 343 }; 344 345 class BottomWin { 346 private: 347 GtkWidget *movenews_event_box; 348 GtkWidget *news_label; 349 GtkWidget *link_hbox; 350 GtkWidget *link_label; 351 int news_timeout_id; 352 int link_timeout_id; 353 size_t news_move_index; 354 size_t link_index; 355 size_t news_move_len; 356 bool need_resume_news; 357 std::string news_text; 358 std::vector<std::pair<std::string, std::string> > linklist; 359 static void ScanCallback(GtkToggleButton *button, gpointer data); 360 static void AboutCallback(GtkButton *button, gpointer data); 361 static void QuitCallback(GtkButton *button, gpointer data); 362 static void InternetSearchCallback(GtkButton *button, BottomWin *oBottomWin); 363 static void NewVersionCallback(GtkButton *button, BottomWin *oBottomWin); 364 static void DictManageCallback(GtkButton *button, BottomWin *oBottomWin); 365 static void PreferenceCallback(GtkButton *button, BottomWin *oBottomWin); 366 static gboolean on_internetsearch_button_press(GtkWidget * widget, GdkEventButton * event , BottomWin *oBottomWin); 367 static void on_internetsearch_menu_item_activate(GtkMenuItem *menuitem, const gchar *website); 368 static gboolean move_news(gpointer data); 369 static gboolean change_link(gpointer data); 370 static void on_link_eventbox_clicked(GtkWidget *widget, GdkEventButton *event, BottomWin *oBottomWin); 371 static gboolean vEnterNotifyCallback (GtkWidget *widget, GdkEventCrossing *event, BottomWin *oBottomWin); 372 static gboolean vLeaveNotifyCallback (GtkWidget *widget, GdkEventCrossing *event, BottomWin *oBottomWin); 373 public: 374 GtkWidget* ScanSelectionCheckButton; 375 GtkWidget* SearchWebsiteMenu; 376 377 BottomWin(); 378 void Destroy(); 379 void Create(GtkWidget *vbox); 380 void set_news(const char *news, const char *links); 381 static void InternetSearch(const std::string& website); 382 }; 383 384 #endif 385