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