Imported version 0.4-4
[mstardict] / src / mstardict.cpp
index 1ea7cb4..7880e65 100644 (file)
 #include "conf.hpp"
 #include "dictmngr.hpp"
 #include "libwrapper.hpp"
+#include "transwin.hpp"
 #include "mstardict.hpp"
 
+MStarDict *pMStarDict;
+
 enum {
     DEF_COLUMN,
     N_COLUMNS
@@ -58,7 +61,7 @@ enum {
 
 MStarDict::MStarDict()
 {
-    main_window = NULL;
+    window = NULL;
     label_widget = NULL;
     results_widget = NULL;
     results_view = NULL;
@@ -71,9 +74,19 @@ MStarDict::MStarDict()
     /* initialize configuration */
     oConf = new Conf();
 
+    /* initialize stardict plugins */
+    std::list < std::string > plugin_order_list;
+    std::list < std::string > plugin_disable_list;
+    oStarDictPlugins = new StarDictPlugins("/usr/lib/mstardict/plugins",
+                                          plugin_order_list,
+                                          plugin_disable_list);
+
     /* initialize dict manager */
     oDict = new DictMngr(this);
 
+    /* initialize translation window */
+    oTransWin = new TransWin(this);
+
     /* initialize stardict library */
     oLibs = new Library(this);
 }
@@ -86,9 +99,15 @@ MStarDict::~MStarDict()
     /* deinitialize stardict library */
     delete oLibs;
 
+    /* deinitialize translation window */
+    delete oTransWin;
+
     /* deinitialize dict manager */
     delete oDict;
 
+    /* deinitialize stardict plugins */
+    delete oStarDictPlugins;
+
     /* deinitialize configuration */
     delete oConf;
 }
@@ -99,46 +118,33 @@ MStarDict::onResultsViewSelectionChanged(GtkTreeSelection *selection,
 {
     GtkTreeModel *model;
     GtkTreeIter iter;
-    char *bookname, *def, *exp;
     const gchar *sWord;
     bool bFound = false;
 
     if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
+       GList *results = NULL;
+
        /* unselect selected rows */
        gtk_tree_selection_unselect_all(selection);
 
        gtk_tree_model_get(model, &iter, DEF_COLUMN, &sWord, -1);
 
-       /* clear previous search results */
-       mStarDict->results.clear();
-
        for (size_t iLib = 0; iLib < mStarDict->oLibs->query_dictmask.size(); iLib++) {
            bFound =
                mStarDict->oLibs->BuildResultData(mStarDict->oLibs->query_dictmask, sWord,
                                                  mStarDict->oLibs->iCurrentIndex, iLib,
-                                                 mStarDict->results);
+                                                 &results);
        }
 
-       bookname =
-           g_markup_printf_escaped
-           ("<span color=\"dimgray\" size=\"x-small\">%s</span>",
-            mStarDict->results[0].bookname.c_str());
-       def =
-           g_markup_printf_escaped
-           ("<span color=\"darkred\" weight=\"heavy\" size=\"large\">%s</span>",
-            mStarDict->results[0].def.c_str());
-       exp = g_strdup(mStarDict->results[0].exp.c_str());
-
        /* create translation window */
-       mStarDict->CreateTranslationWindow(bookname, def, exp);
+       mStarDict->oTransWin->CreateTransWindow(results);
 
-       g_free(bookname);
-       g_free(def);
-       g_free(exp);
+       /* free result data */
+       mStarDict->oLibs->FreeResultData(results);
     }
 
     /* grab focus to search entry */
-    gtk_widget_grab_focus(GTK_WIDGET(mStarDict->search));
+    mStarDict->GrabFocus();
 
     return true;
 }
@@ -209,10 +215,23 @@ MStarDict::onSearchEntryChanged(GtkEditable* editable,
 }
 
 gboolean
+MStarDict::onSearchClearClicked(GtkButton* button,
+                               MStarDict* mStarDict)
+{
+    gtk_entry_set_text(GTK_ENTRY(mStarDict->search_entry), "");
+    mStarDict->GrabFocus();
+    return true;
+}
+
+gboolean
 MStarDict::onDictionariesMenuItemClicked(GtkButton *button,
                                         MStarDict *mStarDict)
 {
     mStarDict->oDict->CreateDictMngrDialog();
+
+    /* trigger re-search */
+    mStarDict->onSearchEntryChanged(GTK_EDITABLE(mStarDict->search_entry), mStarDict);
+    mStarDict->GrabFocus();
     return true;
 }
 
@@ -240,6 +259,8 @@ MStarDict::onMainWindowKeyPressEvent(GtkWidget *window,
 {
     if (event->type == GDK_KEY_PRESS && event->keyval == GDK_KP_Enter) {
        mStarDict->SearchWord();
+    } else if (event->type == GDK_KEY_PRESS && event->keyval >= 0x21 && event->keyval <= 0x7E) {
+       mStarDict->GrabFocus();
     }
     return false;
 }
@@ -252,7 +273,7 @@ MStarDict::CreateLookupProgressDialog(bool *cancel)
     /* create dialog */
     dialog = gtk_dialog_new();
     gtk_window_set_title(GTK_WINDOW(dialog), _("Searching"));
-    gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(main_window));
+    gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(window));
     gtk_dialog_add_button(GTK_DIALOG(dialog), _("Cancel"), GTK_RESPONSE_OK);
 
     g_signal_connect(dialog, "response", G_CALLBACK(onLookupProgressDialogResponse), cancel);
@@ -260,7 +281,7 @@ MStarDict::CreateLookupProgressDialog(bool *cancel)
     /* add progress bar */
     progress = gtk_progress_bar_new();
     gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->vbox), progress);
-    g_object_set_data(G_OBJECT(dialog), "progress", progress);
+    g_object_set_data(G_OBJECT(dialog), "progress_bar", progress);
 
     /* show dialog */
     gtk_widget_show_all(dialog);
@@ -278,51 +299,10 @@ MStarDict::DestroyLookupProgressDialog(GtkWidget *dialog)
 }
 
 void
-MStarDict::CreateTranslationWindow(const gchar *bookname,
-                                  const gchar *def,
-                                  const gchar *exp)
-{
-    GtkWidget *window, *alignment, *pannable, *vbox, *label;
-
-    window = hildon_stackable_window_new();
-    gtk_window_set_title(GTK_WINDOW(window), _("Translation"));
-
-    alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
-    gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
-                             HILDON_MARGIN_DEFAULT,
-                             HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DOUBLE, HILDON_MARGIN_DEFAULT);
-    gtk_container_add(GTK_CONTAINER(window), alignment);
-
-    pannable = hildon_pannable_area_new();
-    g_object_set(G_OBJECT(pannable), "mov-mode", HILDON_MOVEMENT_MODE_BOTH, NULL);
-    gtk_container_add(GTK_CONTAINER(alignment), pannable);
-
-    vbox = gtk_vbox_new(FALSE, 0);
-    hildon_pannable_area_add_with_viewport(HILDON_PANNABLE_AREA(pannable), vbox);
-
-    label = gtk_label_new("Bookname");
-    gtk_misc_set_alignment(GTK_MISC(label), 1.0, 0.5);
-    gtk_label_set_markup(GTK_LABEL(label), bookname);
-    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-    label = gtk_label_new("Definition");
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
-    gtk_label_set_markup(GTK_LABEL(label), def);
-    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-    label = gtk_label_new("Expresion");
-    gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.0);
-    gtk_label_set_markup(GTK_LABEL(label), exp);
-    gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-    gtk_widget_show_all(window);
-}
-
-void
 MStarDict::CreateMainWindow()
 {
     HildonProgram *program = NULL;
-    GtkWidget *alignment, *vbox;
+    GtkWidget *alignment, *main_vbox, *search;
     GtkCellRenderer *renderer;
     GtkTreeSelection *selection;
 
@@ -331,31 +311,31 @@ MStarDict::CreateMainWindow()
     g_set_application_name(_("MStardict"));
 
     /* main window */
-    main_window = hildon_stackable_window_new();
-    hildon_program_add_window(program, HILDON_WINDOW(main_window));
+    window = hildon_stackable_window_new();
+    hildon_program_add_window(program, HILDON_WINDOW(window));
 
     /* aligment */
     alignment = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
     gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
                              HILDON_MARGIN_HALF, 0, HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DEFAULT);
-    gtk_container_add(GTK_CONTAINER(main_window), alignment);
+    gtk_container_add(GTK_CONTAINER(window), alignment);
 
     /* main vbox */
-    vbox = gtk_vbox_new(FALSE, 0);
-    gtk_container_add(GTK_CONTAINER(alignment), vbox);
+    main_vbox = gtk_vbox_new(FALSE, 0);
+    gtk_container_add(GTK_CONTAINER(alignment), main_vbox);
 
     /* no_search_result label */
     label_widget = gtk_label_new(_("No search result"));
     hildon_helper_set_logical_color(label_widget, GTK_RC_FG,
                                    GTK_STATE_NORMAL, "SecondaryTextColor");
     hildon_helper_set_logical_font(label_widget, "LargeSystemFont");
-    gtk_box_pack_start(GTK_BOX(vbox), label_widget, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(main_vbox), label_widget, TRUE, TRUE, 0);
 
     /* alignment for pannable area */
     results_widget = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
     gtk_alignment_set_padding(GTK_ALIGNMENT(results_widget),
                              0, 0, HILDON_MARGIN_DEFAULT, HILDON_MARGIN_DEFAULT);
-    gtk_box_pack_start(GTK_BOX(vbox), results_widget, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX(main_vbox), results_widget, TRUE, TRUE, 0);
 
     /* pannable for tree view */
     results_view_scroll = hildon_pannable_area_new();
@@ -374,24 +354,61 @@ MStarDict::CreateMainWindow()
     gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW
                                                (results_view), -1, "Def",
                                                renderer, "text", DEF_COLUMN, NULL);
-    g_object_set(G_OBJECT(renderer), "xpad", 10, NULL);
+    g_object_set(G_OBJECT(renderer),
+                "xpad", 10,
+                "ellipsize", PANGO_ELLIPSIZE_END,
+                "ellipsize-set", TRUE,
+                NULL);
 
-    /* search entry */
-    search = hildon_entry_new(HILDON_SIZE_FINGER_HEIGHT);
-    gtk_box_pack_end(GTK_BOX(vbox), search, FALSE, TRUE, 0);
-    g_signal_connect(search, "changed", G_CALLBACK(onSearchEntryChanged), this);
+    /* create search bar */
+    search = CreateSearchBar();
+    gtk_box_pack_end(GTK_BOX(main_vbox), search, FALSE, TRUE, 0);
 
     /* window signals */
-    g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
-    g_signal_connect(G_OBJECT(main_window), "key_press_event", G_CALLBACK(onMainWindowKeyPressEvent), this);
+    g_signal_connect(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), NULL);
+    g_signal_connect(G_OBJECT(window), "key_press_event", G_CALLBACK(onMainWindowKeyPressEvent), this);
 
     /* show all widget instead of alignment */
-    gtk_widget_show_all(GTK_WIDGET(main_window));
+    gtk_widget_show_all(GTK_WIDGET(window));
 
     /* grab focus to search entry */
-    gtk_widget_grab_focus(GTK_WIDGET(search));
+    GrabFocus();
+}
+
+GtkWidget *
+MStarDict::CreateSearchBar()
+{
+    GtkWidget *hbox, *entry, *button;
+    GtkEntryCompletion *completion;
+
+    /* search hbox */
+    hbox = gtk_hbox_new(FALSE, HILDON_MARGIN_DEFAULT);
+
+    /* search entry */
+    entry = hildon_entry_new(HILDON_SIZE_FINGER_HEIGHT);
+    hildon_gtk_entry_set_input_mode(GTK_ENTRY(entry), HILDON_GTK_INPUT_MODE_FULL);
+    gtk_box_pack_start(GTK_BOX(hbox), entry, TRUE, TRUE, 0);
+
+    completion = gtk_entry_completion_new();
+    gtk_entry_completion_set_inline_completion(completion, TRUE);
+    gtk_entry_completion_set_popup_completion(completion, FALSE);
+    gtk_entry_set_completion(GTK_ENTRY(entry), completion);
+
+    /* clear button */
+    button = GTK_WIDGET(gtk_tool_button_new(gtk_image_new_from_icon_name("general_delete",
+                                                                        (GtkIconSize)HILDON_ICON_PIXEL_SIZE_FINGER),
+                                           "Clear"));
+    gtk_box_pack_end(GTK_BOX (hbox), button, FALSE, TRUE, 0);
+
+    /* search signals */
+    g_signal_connect(entry, "changed", G_CALLBACK(onSearchEntryChanged), this);
+    g_signal_connect(button, "clicked", G_CALLBACK(onSearchClearClicked), this);
+
+    search_entry = entry;
+    return hbox;
 }
 
+
 void
 MStarDict::CreateMainMenu()
 {
@@ -399,7 +416,7 @@ MStarDict::CreateMainMenu()
     GtkWidget *item;
 
     menu = HILDON_APP_MENU(hildon_app_menu_new());
-    hildon_window_set_app_menu(HILDON_WINDOW(main_window), menu);
+    hildon_window_set_app_menu(HILDON_WINDOW(window), menu);
 
     /* dictionaries menu item */
     item = hildon_gtk_button_new(HILDON_SIZE_AUTO);
@@ -427,7 +444,7 @@ MStarDict::SearchWord()
     if (oLibs->query_dictmask.empty())
        return;
 
-    sWord = gtk_entry_get_text(GTK_ENTRY(search));
+    sWord = gtk_entry_get_text(GTK_ENTRY(search_entry));
     if (strcmp(sWord, "") == 0) {
        ShowNoResults(true);
     } else {
@@ -437,6 +454,11 @@ MStarDict::SearchWord()
        switch (analyse_query(sWord, query)) {
        case qtDATA:
            bFound = oLibs->LookupData(query.c_str());
+
+           if (bFound)
+               ShowNoResults(false);
+           else
+               ShowNoResults(true);
            break;
        default:
            /* nothing */ ;
@@ -444,11 +466,6 @@ MStarDict::SearchWord()
 
        /* unselect selected rows */
        ResultsUnselectAll(GTK_SELECTION_SINGLE);
-
-       if (bFound)
-           ShowNoResults(false);
-       else
-           ShowNoResults(true);
     }
 }
 
@@ -512,9 +529,15 @@ void
 MStarDict::ShowProgressIndicator(bool bShow)
 {
     if (bShow)
-       hildon_gtk_window_set_progress_indicator(GTK_WINDOW(main_window), 1);
+       hildon_gtk_window_set_progress_indicator(GTK_WINDOW(window), 1);
     else
-       hildon_gtk_window_set_progress_indicator(GTK_WINDOW(main_window), 0);
+       hildon_gtk_window_set_progress_indicator(GTK_WINDOW(window), 0);
+}
+
+void
+MStarDict::GrabFocus()
+{
+    gtk_widget_grab_focus(GTK_WIDGET(search_entry));
 }
 
 int
@@ -532,6 +555,7 @@ main(int argc,
 
     /* create main window */
     MStarDict mStarDict;
+    pMStarDict = &mStarDict;
     mStarDict.CreateMainWindow();
     mStarDict.CreateMainMenu();
     mStarDict.ShowNoResults(true);