2 * MStarDict - International dictionary for Maemo.
3 * Copyright (C) 2010 Roman Moravcik
5 * base on code of stardict:
6 * Copyright (C) 2003-2007 Hu Zheng <huzheng_001@163.com>
8 * based on code of sdcv:
9 * Copyright (C) 2005-2006 Evgeniy <dushistov@mail.ru>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
37 #include <glib/gi18n.h>
38 #include <glib/gstdio.h>
41 #include <hildon/hildon.h>
50 #include "dictmngr.hpp"
51 #include "libwrapper.hpp"
52 #include "mstardict.hpp"
54 MStarDict *pMStarDict;
61 MStarDict::MStarDict()
65 results_widget = NULL;
67 results_view_scroll = NULL;
69 /* create list of ressults */
70 results_list = gtk_list_store_new(N_COLUMNS,
71 G_TYPE_STRING); /* DEF_COLUMN */
73 /* initialize configuration */
76 /* initialize stardict plugins */
77 std::list < std::string > plugin_order_list;
78 std::list < std::string > plugin_disable_list;
79 oStarDictPlugins = new StarDictPlugins("/usr/lib/mstardict/plugins",
83 /* initialize dict manager */
84 oDict = new DictMngr(this);
86 /* initialize stardict library */
87 oLibs = new Library(this);
90 MStarDict::~MStarDict()
92 /* destroy list of results */
93 g_object_unref(results_list);
95 /* deinitialize stardict library */
98 /* deinitialize dict manager */
101 /* deinitialize stardict plugins */
102 delete oStarDictPlugins;
104 /* deinitialize configuration */
109 MStarDict::onResultsViewSelectionChanged(GtkTreeSelection *selection,
110 MStarDict *mStarDict)
114 char *bookname, *def, *exp;
118 if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
119 /* unselect selected rows */
120 gtk_tree_selection_unselect_all(selection);
122 gtk_tree_model_get(model, &iter, DEF_COLUMN, &sWord, -1);
124 /* clear previous search results */
125 mStarDict->results.clear();
127 for (size_t iLib = 0; iLib < mStarDict->oLibs->query_dictmask.size(); iLib++) {
129 mStarDict->oLibs->BuildResultData(mStarDict->oLibs->query_dictmask, sWord,
130 mStarDict->oLibs->iCurrentIndex, iLib,
135 g_markup_printf_escaped
136 ("<span color=\"dimgray\" size=\"x-small\">%s</span>",
137 mStarDict->results[0].bookname.c_str());
139 g_markup_printf_escaped
140 ("<span color=\"darkred\" weight=\"heavy\" size=\"large\">%s</span>",
141 mStarDict->results[0].def.c_str());
142 exp = g_strdup(mStarDict->results[0].exp.c_str());
144 /* create translation window */
145 mStarDict->CreateTranslationWindow(bookname, def, exp);
152 /* grab focus to search entry */
153 mStarDict->GrabFocus();
159 MStarDict::onSearchEntryChanged(GtkEditable* editable,
160 MStarDict* mStarDict)
166 if (mStarDict->oLibs->query_dictmask.empty())
169 sWord = gtk_entry_get_text(GTK_ENTRY(editable));
170 if (strcmp(sWord, "") == 0) {
171 mStarDict->ShowNoResults(true);
173 mStarDict->ShowProgressIndicator(true);
174 mStarDict->ResultsUnselectAll(GTK_SELECTION_NONE);
176 switch (analyse_query(sWord, query)) {
178 bFound = mStarDict->oLibs->LookupWithFuzzy(query.c_str());
182 bFound = mStarDict->oLibs->LookupWithRule(query.c_str());
186 bFound = mStarDict->oLibs->LookupWithRegex(query.c_str());
190 bFound = mStarDict->oLibs->SimpleLookup(query.c_str(), mStarDict->oLibs->iCurrentIndex);
192 const gchar *sugWord = mStarDict->oLibs->GetSuggestWord(query.c_str(),
194 oLibs->iCurrentIndex,
196 oLibs->query_dictmask, 0);
198 gchar *sSugWord = g_strdup(sugWord);
200 mStarDict->oLibs->SimpleLookup(sSugWord, mStarDict->oLibs->iCurrentIndex);
204 mStarDict->oLibs->ListWords(mStarDict->oLibs->iCurrentIndex);
212 mStarDict->ShowNoResults(false);
214 mStarDict->ShowNoResults(true);
216 mStarDict->ResultsUnselectAll(GTK_SELECTION_SINGLE);
217 mStarDict->ShowProgressIndicator(false);
224 MStarDict::onDictionariesMenuItemClicked(GtkButton *button,
225 MStarDict *mStarDict)
227 mStarDict->oDict->CreateDictMngrDialog();
232 MStarDict::onQuitMenuItemClicked(GtkButton *button,
233 MStarDict *mStarDict)
240 MStarDict::onLookupProgressDialogResponse(GtkDialog *dialog,
249 MStarDict::onMainWindowKeyPressEvent(GtkWidget *window,
251 MStarDict *mStarDict)
253 if (event->type == GDK_KEY_PRESS && event->keyval == GDK_KP_Enter) {
254 mStarDict->SearchWord();
255 } else if (event->type == GDK_KEY_PRESS && event->keyval >= 0x21 && event->keyval <= 0x7E) {
256 mStarDict->GrabFocus();
262 MStarDict::CreateLookupProgressDialog(bool *cancel)
264 GtkWidget *dialog, *progress;
267 dialog = gtk_dialog_new();
268 gtk_window_set_title(GTK_WINDOW(dialog), _("Searching"));
269 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(main_window));
270 gtk_dialog_add_button(GTK_DIALOG(dialog), _("Cancel"), GTK_RESPONSE_OK);
272 g_signal_connect(dialog, "response", G_CALLBACK(onLookupProgressDialogResponse), cancel);
274 /* add progress bar */
275 progress = gtk_progress_bar_new();
276 gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), progress);
277 g_object_set_data(G_OBJECT(dialog), "progress_bar", progress);
280 gtk_widget_show_all(dialog);
282 while (gtk_events_pending())
283 gtk_main_iteration();
289 MStarDict::DestroyLookupProgressDialog(GtkWidget *dialog)
291 gtk_widget_destroy(GTK_WIDGET(dialog));
295 MStarDict::CreateTranslationWindow(const gchar *bookname,
299 GtkWidget *window, *alignment, *pannable, *vbox, *label;
301 window = hildon_stackable_window_new();
302 gtk_window_set_title(GTK_WINDOW(window), _("Translation"));
304 alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
305 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
306 HILDON_MARGIN_DEFAULT,
307 HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DOUBLE, HILDON_MARGIN_DEFAULT);
308 gtk_container_add(GTK_CONTAINER(window), alignment);
310 pannable = hildon_pannable_area_new();
311 g_object_set(G_OBJECT(pannable), "mov-mode", HILDON_MOVEMENT_MODE_BOTH, NULL);
312 gtk_container_add(GTK_CONTAINER(alignment), pannable);
314 vbox = gtk_vbox_new(FALSE, 0);
315 hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pannable), vbox);
317 label = gtk_label_new("Bookname");
318 gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
319 gtk_label_set_markup(GTK_LABEL(label), bookname);
320 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
322 label = gtk_label_new("Definition");
323 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
324 gtk_label_set_markup(GTK_LABEL(label), def);
325 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
327 label = gtk_label_new("Expresion");
328 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
329 gtk_label_set_markup(GTK_LABEL(label), exp);
330 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
332 gtk_widget_show_all(window);
336 MStarDict::CreateMainWindow()
338 HildonProgram *program = NULL;
339 GtkWidget *alignment, *vbox;
340 GtkCellRenderer *renderer;
341 GtkTreeSelection *selection;
344 program = hildon_program_get_instance();
345 g_set_application_name(_("MStardict"));
348 main_window = hildon_stackable_window_new();
349 hildon_program_add_window(program, HILDON_WINDOW(main_window));
352 alignment = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
353 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
354 HILDON_MARGIN_HALF, 0, HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DEFAULT);
355 gtk_container_add(GTK_CONTAINER(main_window), alignment);
358 vbox = gtk_vbox_new(FALSE, 0);
359 gtk_container_add(GTK_CONTAINER(alignment), vbox);
361 /* no_search_result label */
362 label_widget = gtk_label_new(_("No search result"));
363 hildon_helper_set_logical_color(label_widget, GTK_RC_FG,
364 GTK_STATE_NORMAL, "SecondaryTextColor");
365 hildon_helper_set_logical_font(label_widget, "LargeSystemFont");
366 gtk_box_pack_start(GTK_BOX(vbox), label_widget, TRUE, TRUE, 0);
368 /* alignment for pannable area */
369 results_widget = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
370 gtk_alignment_set_padding(GTK_ALIGNMENT(results_widget),
371 0, 0, HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DEFAULT);
372 gtk_box_pack_start(GTK_BOX(vbox), results_widget, TRUE, TRUE, 0);
374 /* pannable for tree view */
375 results_view_scroll = hildon_pannable_area_new();
376 gtk_container_add(GTK_CONTAINER(results_widget), results_view_scroll);
378 /* result tree view */
379 results_view = hildon_gtk_tree_view_new(HILDON_UI_MODE_EDIT);
380 gtk_tree_view_set_model(GTK_TREE_VIEW(results_view), GTK_TREE_MODEL(results_list));
381 gtk_container_add(GTK_CONTAINER(results_view_scroll), results_view);
383 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(results_view));
384 g_signal_connect(selection, "changed", G_CALLBACK(onResultsViewSelectionChanged), this);
387 renderer = gtk_cell_renderer_text_new();
388 gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW
389 (results_view), -1, "Def",
390 renderer, "text", DEF_COLUMN, NULL);
391 g_object_set(G_OBJECT(renderer),
393 "ellipsize", PANGO_ELLIPSIZE_END,
394 "ellipsize-set", TRUE,
398 search = hildon_entry_new(HILDON_SIZE_FINGER_HEIGHT);
399 gtk_box_pack_end(GTK_BOX(vbox), search, FALSE, TRUE, 0);
400 g_signal_connect(search, "changed", G_CALLBACK(onSearchEntryChanged), this);
403 g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
404 g_signal_connect(G_OBJECT(main_window), "key_press_event", G_CALLBACK(onMainWindowKeyPressEvent), this);
406 /* show all widget instead of alignment */
407 gtk_widget_show_all(GTK_WIDGET(main_window));
409 /* grab focus to search entry */
414 MStarDict::CreateMainMenu()
419 menu = HILDON_APP_MENU(hildon_app_menu_new());
420 hildon_window_set_app_menu(HILDON_WINDOW(main_window), menu);
422 /* dictionaries menu item */
423 item = hildon_gtk_button_new(HILDON_SIZE_AUTO);
424 gtk_button_set_label(GTK_BUTTON(item), _("Dictionaries"));
425 hildon_app_menu_append(menu, GTK_BUTTON(item));
426 g_signal_connect(item, "clicked", G_CALLBACK(onDictionariesMenuItemClicked), this);
429 item = hildon_gtk_button_new(HILDON_SIZE_AUTO);
430 gtk_button_set_label(GTK_BUTTON(item), _("Quit"));
431 hildon_app_menu_append(menu, GTK_BUTTON(item));
432 g_signal_connect(item, "clicked", G_CALLBACK(onQuitMenuItemClicked), this);
435 gtk_widget_show_all(GTK_WIDGET(menu));
439 MStarDict::SearchWord()
445 if (oLibs->query_dictmask.empty())
448 sWord = gtk_entry_get_text(GTK_ENTRY(search));
449 if (strcmp(sWord, "") == 0) {
453 ResultsUnselectAll(GTK_SELECTION_NONE);
455 switch (analyse_query(sWord, query)) {
457 bFound = oLibs->LookupData(query.c_str());
463 /* unselect selected rows */
464 ResultsUnselectAll(GTK_SELECTION_SINGLE);
467 ShowNoResults(false);
474 MStarDict::ResultsListClear()
476 gtk_list_store_clear(results_list);
480 MStarDict::ResultsListInsertLast(const gchar *word)
483 gtk_list_store_append(results_list, &iter);
484 gtk_list_store_set(results_list, &iter, DEF_COLUMN, word, -1);
488 MStarDict::ResultsReScroll()
490 hildon_pannable_area_scroll_to(HILDON_PANNABLE_AREA(results_view_scroll), -1, 0);
494 MStarDict::ResultsUnselectAll(GtkSelectionMode mode)
496 GtkTreeSelection *selection;
498 selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(results_view));
499 gtk_tree_selection_set_mode(selection, mode);
500 gtk_tree_selection_unselect_all(selection);
504 MStarDict::ShowNoResults(bool bNoResults)
507 gtk_label_set_text(GTK_LABEL(label_widget), _("No search result"));
508 gtk_widget_show(label_widget);
509 gtk_widget_hide(results_widget);
511 gtk_widget_hide(label_widget);
512 gtk_widget_show(results_widget);
517 MStarDict::ShowNoDictionary(bool bNoDictionary)
520 gtk_label_set_text(GTK_LABEL(label_widget), _("No loaded dictionary"));
521 gtk_widget_show(label_widget);
522 gtk_widget_hide(results_widget);
524 gtk_widget_hide(label_widget);
525 gtk_widget_show(results_widget);
530 MStarDict::ShowProgressIndicator(bool bShow)
533 hildon_gtk_window_set_progress_indicator(GTK_WINDOW(main_window), 1);
535 hildon_gtk_window_set_progress_indicator(GTK_WINDOW(main_window), 0);
539 MStarDict::GrabFocus()
541 gtk_widget_grab_focus(GTK_WIDGET(search));
548 /* initialize hildon */
549 hildon_gtk_init(&argc, &argv);
551 /* initialize localization */
552 setlocale(LC_ALL, "");
553 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
554 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
555 textdomain(GETTEXT_PACKAGE);
557 /* create main window */
559 pMStarDict = &mStarDict;
560 mStarDict.CreateMainWindow();
561 mStarDict.CreateMainMenu();
562 mStarDict.ShowNoResults(true);
564 /* load dictionaries */
565 mStarDict.oDict->LoadDictionaries();