2 * MStarDict - International dictionary for Maemo.
3 * Copyright (C) 2010 Roman Moravcik
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
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.
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 02111-1307 USA
31 #include <glib/gi18n.h>
32 #include <glib/gstdio.h>
35 #include <hildon/hildon.h>
42 #include "libwrapper.hpp"
44 #include "mstardict.hpp"
54 MStarDict::MStarDict ()
57 results_widget = NULL;
60 /* create list of ressults */
61 results_list = gtk_list_store_new (N_COLUMNS,
62 G_TYPE_INT, /* INDEX_COLUMN */
63 G_TYPE_STRING, /* BOOKNAME_COLUMN */
64 G_TYPE_STRING); /* DEF_COLUMN */
66 /* set sorting of resuslts */
67 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (results_list),
71 /* initialize stardict library */
72 lib = new Library (true, true);
75 MStarDict::~MStarDict ()
77 /* destroy list of results */
78 g_object_unref (results_list);
80 /* deinitialize stardict library */
85 MStarDict::on_results_view_selection_changed (GtkTreeSelection *selection,
90 char *bookname, *def, *exp;
93 if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
94 /* unselect selected rows */
95 gtk_tree_selection_unselect_all (selection);
96 gtk_tree_model_get (model, &iter, INDEX_COLUMN, &selected, -1);
98 bookname = g_markup_printf_escaped ("<span color=\"dimgray\" size=\"x-small\">%s</span>",
99 mStarDict->result_list[selected].bookname.c_str());
100 def = g_markup_printf_escaped ("<span color=\"darkred\" weight=\"heavy\" size=\"large\">%s</span>",
101 mStarDict->result_list[selected].def.c_str());
102 exp = g_strdup (mStarDict->result_list[selected].exp.c_str());
104 /* create translation window */
105 mStarDict->create_translation_window (bookname, def, exp);
112 /* grab focus to search entry */
113 gtk_widget_grab_focus (GTK_WIDGET (mStarDict->search));
119 MStarDict::on_search_entry_changed (GtkEditable *editable,
120 MStarDict *mStarDict)
122 GtkTreeSelection *selection;
126 search = gtk_entry_get_text (GTK_ENTRY (editable));
128 if (strcmp (search, "") == 0) {
129 gtk_widget_show (mStarDict->label_widget);
130 gtk_widget_hide (mStarDict->results_widget);
132 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (mStarDict->results_view));
133 gtk_tree_selection_set_mode (selection, GTK_SELECTION_NONE);
135 /* clear previous search results */
136 mStarDict->result_list.clear();
137 gtk_list_store_clear (mStarDict->results_list);
140 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (mStarDict->results_view));
141 gtk_tree_selection_unselect_all (selection);
143 /* fill list with new results */
144 mStarDict->lib->process_phrase(search, mStarDict->result_list);
145 if (!mStarDict->result_list.empty()) {
146 for (size_t i = 0; i < mStarDict->result_list.size(); ++i) {
147 gtk_list_store_append (mStarDict->results_list, &iter);
148 gtk_list_store_set (mStarDict->results_list,
151 BOOKNAME_COLUMN, mStarDict->result_list[i].bookname.c_str(),
152 DEF_COLUMN, mStarDict->result_list[i].def.c_str(),
157 /* unselect selected rows */
158 gtk_tree_selection_unselect_all (selection);
159 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
161 gtk_widget_hide (mStarDict->label_widget);
162 gtk_widget_show (mStarDict->results_widget);
168 class GetAllDictList {
170 GetAllDictList(std::list<std::string> &dict_all_list_) :
171 dict_all_list(dict_all_list_) {}
172 void operator()(const std::string& url, bool disable) {
173 dict_all_list.push_back(url);
176 std::list<std::string> &dict_all_list;
180 MStarDict::load_dictionaries ()
182 strlist_t dicts_dir_list;
183 strlist_t order_list;
184 strlist_t disable_list;
186 std::list<std::string> load_list;
188 /* dictionary directory */
189 dicts_dir_list.push_back (std::string ("/home/user/MyDocs/mstardict"));
191 for_each_file(dicts_dir_list, ".ifo", order_list, disable_list, GetAllDictList(load_list));
192 lib->load(load_list);
194 lib->query_dictmask.clear();
195 for (std::list<std::string>::iterator i = load_list.begin(); i != load_list.end(); ++i) {
197 if (lib->find_lib_by_filename(i->c_str(), iLib)) {
198 InstantDictIndex instance_dict_index;
199 instance_dict_index.type = InstantDictType_LOCAL;
200 instance_dict_index.index = iLib;
201 lib->query_dictmask.push_back(instance_dict_index);
207 MStarDict::create_translation_window (const gchar *bookname,
211 GtkWidget *window, *alignment, *pannable, *vbox, *label;
213 window = hildon_stackable_window_new ();
214 gtk_window_set_title (GTK_WINDOW (window), _("Translation"));
216 alignment = gtk_alignment_new (0.0, 0.0, 1.0, 1.0);
217 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
218 HILDON_MARGIN_DEFAULT,
219 HILDON_MARGIN_DEFAULT,
220 HILDON_MARGIN_DOUBLE,
221 HILDON_MARGIN_DEFAULT);
222 gtk_container_add (GTK_CONTAINER (window), alignment);
224 pannable = hildon_pannable_area_new ();
225 g_object_set (G_OBJECT (pannable), "mov-mode", HILDON_MOVEMENT_MODE_BOTH,
227 gtk_container_add (GTK_CONTAINER (alignment), pannable);
229 vbox = gtk_vbox_new (FALSE, 0);
230 hildon_pannable_area_add_with_viewport (HILDON_PANNABLE_AREA (pannable),
233 label = gtk_label_new ("Bookname");
234 gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
235 gtk_label_set_markup (GTK_LABEL (label), bookname);
236 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
238 label = gtk_label_new ("Definition");
239 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
240 gtk_label_set_markup (GTK_LABEL (label), def);
241 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
243 label = gtk_label_new ("Expresion");
244 gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
245 gtk_label_set_markup (GTK_LABEL (label), exp);
246 gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 0);
248 gtk_widget_show_all (window);
252 MStarDict::create_main_window ()
254 HildonProgram *program = NULL;
255 GtkWidget *window, *alignment, *vbox, *pannable;
256 GtkCellRenderer *renderer;
257 GtkTreeSelection *selection;
258 GdkColor style_color;
261 program = hildon_program_get_instance ();
262 g_set_application_name (_("MStardict"));
265 window = hildon_stackable_window_new ();
266 hildon_program_add_window (program, HILDON_WINDOW (window));
269 alignment = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
270 gtk_alignment_set_padding (GTK_ALIGNMENT (alignment),
273 HILDON_MARGIN_DEFAULT,
274 HILDON_MARGIN_DEFAULT);
275 gtk_container_add (GTK_CONTAINER (window), alignment);
278 vbox = gtk_vbox_new (FALSE, 0);
279 gtk_container_add (GTK_CONTAINER (alignment), vbox);
281 /* no_search_result label */
282 label_widget = gtk_label_new (_("No search result"));
283 hildon_helper_set_logical_color (label_widget, GTK_RC_FG,
284 GTK_STATE_NORMAL, "SecondaryTextColor");
285 hildon_helper_set_logical_font (label_widget, "LargeSystemFont");
286 gtk_box_pack_start (GTK_BOX (vbox), label_widget, TRUE, TRUE, 0);
288 /* alignment for pannable area */
289 results_widget = gtk_alignment_new (0.5, 0.5, 1.0, 1.0);
290 gtk_alignment_set_padding (GTK_ALIGNMENT (results_widget),
293 HILDON_MARGIN_DEFAULT,
294 HILDON_MARGIN_DEFAULT);
295 gtk_box_pack_start (GTK_BOX (vbox), results_widget, TRUE, TRUE, 0);
297 /* pannable for tree view */
298 pannable = hildon_pannable_area_new ();
299 gtk_container_add (GTK_CONTAINER (results_widget), pannable);
301 /* result tree view */
302 results_view = hildon_gtk_tree_view_new (HILDON_UI_MODE_EDIT);
303 gtk_tree_view_set_model (GTK_TREE_VIEW (results_view),
304 GTK_TREE_MODEL (results_list));
305 gtk_container_add (GTK_CONTAINER (pannable), results_view);
307 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (results_view));
308 g_signal_connect (selection, "changed",
309 G_CALLBACK (on_results_view_selection_changed), this);
312 renderer = gtk_cell_renderer_text_new ();
313 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (results_view),
318 g_object_set (G_OBJECT (renderer), "xpad", 10, NULL);
320 /* bookname column */
321 renderer = gtk_cell_renderer_text_new ();
322 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (results_view),
324 "Bookname", renderer,
325 "text", BOOKNAME_COLUMN,
328 if (!gtk_style_lookup_color (GTK_WIDGET (label_widget)->style, "SecondaryTextColor",
330 gdk_color_parse ("grey", &style_color);
332 g_object_set (G_OBJECT (renderer),
335 "foreground-gdk", &style_color,
336 "foreground-set", TRUE,
338 "ellipsize", PANGO_ELLIPSIZE_END,
339 "ellipsize-set", TRUE,
343 search = hildon_entry_new (HILDON_SIZE_FINGER_HEIGHT);
344 gtk_box_pack_end (GTK_BOX (vbox), search, FALSE, TRUE, 0);
345 g_signal_connect (search, "changed",
346 G_CALLBACK (on_search_entry_changed), this);
349 g_signal_connect (G_OBJECT (window), "destroy",
350 G_CALLBACK (gtk_main_quit), NULL);
352 /* show all widget instead of alignment */
353 gtk_widget_show_all (GTK_WIDGET (window));
354 gtk_widget_hide (results_widget);
356 /* grab focus to search entry */
357 gtk_widget_grab_focus (GTK_WIDGET (search));
361 main (int argc, char **argv)
363 /* initialize hildon */
364 hildon_gtk_init (&argc, &argv);
366 /* initialize localization */
367 setlocale(LC_ALL, "");
368 bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR);
369 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
370 textdomain(GETTEXT_PACKAGE);
372 /* create main window */
374 mStarDict.create_main_window ();
376 /* load all dictionaries */
377 mStarDict.load_dictionaries ();