From d2b347e0aa6e5fc3de95253c43900c15938dbaaf Mon Sep 17 00:00:00 2001 From: b0ric Date: Mon, 10 Aug 2009 01:08:31 +0300 Subject: Interface modification and improvement. Lecense changed to GPLv3 --- mainwin.c | 552 +++++++++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 457 insertions(+), 95 deletions(-) (limited to 'mainwin.c') diff --git a/mainwin.c b/mainwin.c index bd41de7..ffe5e6b 100644 --- a/mainwin.c +++ b/mainwin.c @@ -1,46 +1,86 @@ -/* This file is a part of WordExtract project +/* + * This file is part of WordExtract. * * Copyright (C) 2009 Borisov Alexandr * - * This program is free software: you can redistribute it and/or modify + * WordExtract is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 2 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * WordExtract is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with WordExtract. If not, see . */ #include #include #include #include "mainwin.h" -#include "listview.h" #include "dictwin.h" -#include "callbacks.h" +#include "confwin.h" #include "word.h" +#include "srt.h" -GtkWidget *main_window; +#define SEARCH_FORWARD 0 +#define SEARCH_BACKWARD 1 +#define ERR_READING_FILE "Could not open the file " +#define ERR_SAVING_FILE "Could not save the file " +#define ERR_MSG_CAPTION "Error" +#define QUIT_MSG_CAPTION "Confirmation" +#define QUIT_MSG_TEXT "Are you sure to exit?" + +enum {WORD_ITEM = 0, N_COLUMNS}; -static GtkWidget *gtk_button_new_with_label_and_image(gchar *img_file, gchar *label); +GtkWidget *main_window; static GtkWidget *sentences_text; -static GtkWidget *find_label; -static GtkWidget *find_entry; static GtkWidget *prev_btn; static GtkWidget *next_btn; static GtkWidget *clear_btn; static GtkWidget *statusbar; +/*list view variables*/ +static GtkWidget *word_list; +static GtkListStore *store_model; +/*widgets which should be disabled/enabled*/ +static GtkWidget *save_item; +static GtkToolItem *save; +static GtkWidget *find_label; +static GtkWidget *find_entry; +/*vars to controll current word highlighting (green)*/ static int current_highlighted_end; static int current_highlighted_start; + +static gint main_window_close(GtkWidget *, GdkEvent *, gpointer); +static void main_window_destroy(GtkWidget *, gpointer); +static void open_item_click(GtkWidget *, gpointer); +static void save_item_click(GtkWidget *, gpointer); +static void quit_item_click(GtkWidget *, gpointer); +static void dict_item_click(GtkWidget *, gpointer); +static void pref_item_click(GtkWidget *, gpointer); +static void about_item_click(GtkWidget *, gpointer); +static gboolean popup_by_click(GtkWidget *, GdkEventButton *, gpointer); +static gboolean popup_by_keybd(GtkWidget *, gpointer); +static void word_list_popup(GtkWidget *, GdkEventButton *); +static void show_sent_item_click(GtkWidget *, gpointer ); +static void add_to_dict_item_click(GtkWidget *, gpointer ); +static void fill_list(char **); +static void change_search_navigation_state(gboolean); +static void on_find_text_change(GtkWidget *, gpointer); +static void find_prev_btn_click(GtkWidget *, gpointer); +static void find_next_btn_click(GtkWidget *, gpointer); +static void clear_btn_click(GtkWidget *, gpointer); +static void search_sentences(const gchar *); +static void set_find_text(gchar *); +static void clear_search_tags(); static gboolean gtk_text_iter_search_word(const GtkTextIter *, const gchar *str, GtkTextSearchFlags, GtkTextIter *, GtkTextIter *, const GtkTextIter *, int); +static void find_other(const gchar *, const int); void create_main_window() { @@ -56,50 +96,107 @@ void create_main_window() gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(main_window), vbox); - GtkWidget *tool_hbox; - tool_hbox = gtk_hbox_new(FALSE, 0); - gtk_box_pack_start(GTK_BOX(vbox), tool_hbox, FALSE, FALSE, 0); - gtk_widget_show(tool_hbox); - - GtkWidget *open_btn; - open_btn = gtk_button_new_from_stock(GTK_STOCK_OPEN); - gtk_box_pack_start(GTK_BOX(tool_hbox), open_btn, FALSE, FALSE, 0); - gtk_widget_set_tooltip_text(GTK_WIDGET(open_btn), "Open file to pick up words"); - gtk_widget_show(open_btn); - g_signal_connect(G_OBJECT(open_btn), "clicked", G_CALLBACK(open_btn_click), NULL); - - GtkWidget *save_btn; - save_btn = gtk_button_new_from_stock(GTK_STOCK_SAVE_AS); - gtk_box_pack_start(GTK_BOX(tool_hbox), save_btn, FALSE, FALSE, 0); - gtk_widget_set_tooltip_text(GTK_WIDGET(save_btn), "Save list of words to file"); - gtk_widget_show(save_btn); - - GtkWidget *preferences_btn; - preferences_btn = gtk_button_new_from_stock(GTK_STOCK_PREFERENCES); - gtk_box_pack_start (GTK_BOX (tool_hbox), preferences_btn, FALSE, FALSE, 0); - gtk_widget_set_tooltip_text(GTK_WIDGET(preferences_btn), "Application and analizing options"); - gtk_widget_show (preferences_btn); - - GtkWidget *dict_btn; - dict_btn = gtk_button_new_with_label_and_image("gtk-edit", "Dictionary"); - gtk_box_pack_start(GTK_BOX(tool_hbox), dict_btn, FALSE, FALSE, 0); - gtk_widget_set_tooltip_text(GTK_WIDGET(dict_btn), "View words in dictionary"); - g_signal_connect(G_OBJECT(dict_btn), "clicked", G_CALLBACK(dict_btn_click), NULL); - gtk_widget_show(dict_btn); - - GtkWidget *quit_btn; - quit_btn = gtk_button_new_from_stock(GTK_STOCK_QUIT); - gtk_box_pack_end(GTK_BOX(tool_hbox), quit_btn, FALSE, FALSE, 0); - gtk_widget_show (quit_btn); - gtk_widget_set_tooltip_text(GTK_WIDGET(quit_btn), "Close this application"); - g_signal_connect(G_OBJECT(quit_btn), "clicked", G_CALLBACK(quit_btn_click), (gpointer) main_window); - - GtkWidget *about_btn; - about_btn = gtk_button_new_from_stock(GTK_STOCK_ABOUT); - gtk_box_pack_end(GTK_BOX(tool_hbox), about_btn, FALSE, FALSE, 0); - gtk_widget_set_tooltip_text(GTK_WIDGET(about_btn), "About this application"); - gtk_widget_show(about_btn); - g_signal_connect(G_OBJECT(about_btn), "clicked", G_CALLBACK(show_about), NULL); + GtkWidget *menu_bar; + GtkWidget *view_menu; + GtkWidget *help_menu; + GtkWidget *sep_item; + menu_bar = gtk_menu_bar_new(); + sep_item = gtk_separator_menu_item_new(); + + GtkWidget *file_menu; + GtkWidget *file_item; + GtkWidget *open_item; + GtkWidget *quit_item; + file_menu = gtk_menu_new(); + file_item = gtk_menu_item_new_with_mnemonic("_File"); + open_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_OPEN, NULL); + gtk_widget_set_tooltip_text(GTK_WIDGET(open_item), "Open file to analize"); + g_signal_connect(G_OBJECT(open_item), "activate", G_CALLBACK(open_item_click), NULL); + save_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE, NULL); + gtk_widget_set_has_tooltip(GTK_WIDGET(save_item), FALSE); + gtk_widget_set_tooltip_text(GTK_WIDGET(save_item), "Save list of words to file"); + gtk_widget_set_sensitive(GTK_WIDGET(save_item), FALSE); + g_signal_connect(G_OBJECT(save_item), "activate", G_CALLBACK(save_item_click), NULL); + quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); + gtk_widget_set_tooltip_text(GTK_WIDGET(quit_item), "Close the program"); + g_signal_connect(G_OBJECT(quit_item), "activate", G_CALLBACK(quit_item_click), NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(file_item), file_menu); + gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), open_item); + gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), save_item); + gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), sep_item); + gtk_menu_shell_append(GTK_MENU_SHELL(file_menu), quit_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), file_item); + gtk_widget_show_all(file_item); + + GtkWidget *view_item; + GtkWidget *dict_item; + GtkWidget *edit_img; + GtkWidget *pref_item; + view_menu = gtk_menu_new(); + view_item = gtk_menu_item_new_with_mnemonic("_View"); + + dict_item = gtk_image_menu_item_new_with_label("Dictionary"); + gtk_widget_set_tooltip_text(GTK_WIDGET(dict_item), "View and edit your dictionary"); + edit_img = gtk_image_new_from_stock(GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(dict_item), edit_img); + g_signal_connect(G_OBJECT(dict_item), "activate", G_CALLBACK(dict_item_click), NULL); + + pref_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_PREFERENCES, NULL); + gtk_widget_set_tooltip_text(GTK_WIDGET(pref_item), "Change application settings"); + g_signal_connect(G_OBJECT(pref_item), "activate", G_CALLBACK(pref_item_click), NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(view_item), view_menu); + gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), dict_item); + gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), pref_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), view_item); + gtk_widget_show_all(view_item); + + GtkWidget *help_item; + GtkWidget *about_item; + help_menu = gtk_menu_new(); + help_item = gtk_menu_item_new_with_mnemonic("_Help"); + about_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_ABOUT, NULL); + gtk_widget_set_tooltip_text(GTK_WIDGET(about_item), "About the program"); + g_signal_connect(G_OBJECT(about_item), "activate", G_CALLBACK(about_item_click), NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(help_item), help_menu); + gtk_menu_shell_append(GTK_MENU_SHELL(help_menu), about_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), help_item); + gtk_widget_show_all(help_item); + + gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2); + gtk_widget_show(menu_bar); + + GtkWidget *toolbar; + toolbar = gtk_toolbar_new(); + gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_ICONS); + GtkToolItem *open; + open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN); + gtk_widget_set_tooltip_text(GTK_WIDGET(open), "Open file to analize"); + g_signal_connect(G_OBJECT(open), "clicked", G_CALLBACK(open_item_click), NULL); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), open, -1); + save = gtk_tool_button_new_from_stock(GTK_STOCK_SAVE); + gtk_widget_set_has_tooltip(GTK_WIDGET(save), FALSE); + gtk_widget_set_tooltip_text(GTK_WIDGET(save), "Save list of words to file"); + gtk_widget_set_sensitive(GTK_WIDGET(save), FALSE); + g_signal_connect(G_OBJECT(save), "clicked", G_CALLBACK(save_item_click), NULL); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), save, -1); + GtkToolItem *tool_sep1; + tool_sep1 = gtk_separator_tool_item_new(); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_sep1, -1); + GtkToolItem *dict; + dict = gtk_tool_button_new_from_stock(GTK_STOCK_EDIT); + gtk_widget_set_tooltip_text(GTK_WIDGET(dict), "View and edit your dictionary"); + g_signal_connect(G_OBJECT(dict), "clicked", G_CALLBACK(dict_item_click), NULL); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), dict, -1); + GtkToolItem *tool_sep2; + tool_sep2 = gtk_separator_tool_item_new(); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), tool_sep2, -1); + GtkToolItem *quit; + quit = gtk_tool_button_new_from_stock(GTK_STOCK_QUIT); + gtk_widget_set_tooltip_text(GTK_WIDGET(quit), "Close the program"); + g_signal_connect(G_OBJECT(quit), "clicked", G_CALLBACK(quit_item_click), NULL); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), quit, -1); + gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 2); + gtk_widget_show_all(toolbar); GtkWidget *hpaned; hpaned = gtk_hpaned_new(); @@ -113,10 +210,22 @@ void create_main_window() gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(word_sc_win), GTK_SHADOW_IN); gtk_widget_show(word_sc_win); - GtkWidget *list; - list = create_word_list(); - gtk_container_add(GTK_CONTAINER(word_sc_win), list); - gtk_widget_show(list); + GtkCellRenderer *renderer; + GtkTreeViewColumn *column; + word_list = gtk_tree_view_new(); + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(GTK_TREE_VIEW(word_list)), GTK_SELECTION_SINGLE); + gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(word_list), FALSE); + gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(word_list), TRUE); + g_signal_connect(G_OBJECT(word_list), "button-press-event", G_CALLBACK(popup_by_click), NULL); + g_signal_connect(G_OBJECT(word_list), "popup-menu", G_CALLBACK(popup_by_keybd), NULL); + store_model = gtk_list_store_new(N_COLUMNS, G_TYPE_STRING); + gtk_tree_view_set_model(GTK_TREE_VIEW(word_list), GTK_TREE_MODEL(store_model)); + renderer = gtk_cell_renderer_text_new(); + g_object_set(renderer, "editable", TRUE, NULL); + column = gtk_tree_view_column_new_with_attributes("List Items", renderer, "text", WORD_ITEM, NULL); + gtk_tree_view_append_column(GTK_TREE_VIEW(word_list), column); + gtk_container_add(GTK_CONTAINER(word_sc_win), word_list); + gtk_widget_show(word_list); GtkWidget *text_vbox; text_vbox = gtk_vbox_new(FALSE, 0); @@ -192,29 +301,263 @@ void create_main_window() gtk_widget_show(statusbar); } -static GtkWidget *gtk_button_new_with_label_and_image(gchar *img_name, gchar *label_text) +static gint main_window_close(GtkWidget *widget, GdkEvent *event, gpointer main_window) { - GtkWidget *button; - GtkWidget *box; - GtkWidget *label; - GtkWidget *image; + GtkWidget *dialog; + gint response = TRUE; - button = gtk_button_new(); + dialog = gtk_message_dialog_new(main_window, GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, QUIT_MSG_TEXT); + gtk_window_set_title(GTK_WINDOW(dialog), QUIT_MSG_CAPTION); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) + response = FALSE; + gtk_widget_destroy(dialog); + + return response; +} - box = gtk_hbox_new(FALSE, 2); - gtk_container_add(GTK_CONTAINER(button), box); +static void main_window_destroy(GtkWidget *widget, gpointer data) +{ + gtk_main_quit(); +} - image = gtk_image_new_from_stock(img_name, GTK_ICON_SIZE_BUTTON); - gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0); +static void open_item_click(GtkWidget *widget, gpointer data) +{ + GtkWidget *filedialog; + GtkWidget *errmsg; + GtkFileFilter *filter; + char *filename; + char *errstr; + FILE *subtitle; + char **word_list; + + filter = gtk_file_filter_new(); + gtk_file_filter_add_mime_type(filter, "application/x-subrip"); + gtk_file_filter_set_name(filter, "SubRip subtitles (*srt)"); + filedialog = gtk_file_chooser_dialog_new("Open File for analizing", GTK_WINDOW(main_window), + GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, + GTK_RESPONSE_ACCEPT, NULL); + gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(filedialog), filter); + if (gtk_dialog_run(GTK_DIALOG(filedialog)) == GTK_RESPONSE_ACCEPT) { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filedialog)); + if (!(subtitle = fopen(filename, "r"))) { + gtk_widget_destroy(filedialog); + errstr = malloc(strlen(filename) + strlen(ERR_READING_FILE)); + strcpy(errstr, ERR_READING_FILE); + strcat(errstr, filename); + errmsg = gtk_message_dialog_new(GTK_WINDOW(main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, errstr); + gtk_window_set_title(GTK_WINDOW(errmsg), ERR_MSG_CAPTION); + gtk_dialog_run(GTK_DIALOG(errmsg)); + gtk_widget_destroy(errmsg); + free(errstr); + return ; + } + if (words != NULL) { + /*we won't free() 'words' variable, it's statical*/ + free_words(words->lsibl); + free_words(words->rsibl); + free(words->word); + words = NULL; + gtk_list_store_clear(store_model); + clear_sentences(); + } else { + gtk_widget_set_sensitive(GTK_WIDGET(find_label), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(find_entry), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(save_item), TRUE); + gtk_widget_set_sensitive(GTK_WIDGET(save), TRUE); + } + process_srt(subtitle); + word_list = get_sorted(words); + fill_list(word_list); + free(word_list); + fclose(subtitle); + } + gtk_widget_destroy(filedialog); +} - label = gtk_label_new_with_mnemonic(label_text); - gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0); +static void save_item_click(GtkWidget *widget, gpointer data) +{ + GtkWidget *filedialog; + GtkWidget *errmsg; + FILE *savefile; + char *filename; + char *errstr; + + filedialog = gtk_file_chooser_dialog_new("Save list of words as...", GTK_WINDOW(main_window), + GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, + GTK_RESPONSE_ACCEPT, NULL); + if (gtk_dialog_run(GTK_DIALOG(filedialog)) == GTK_RESPONSE_ACCEPT) { + filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(filedialog)); + if (!(savefile = fopen(filename, "w"))) { + gtk_widget_destroy(filedialog); + errstr = malloc(strlen(filename) + strlen(ERR_SAVING_FILE)); + strcpy(errstr, ERR_SAVING_FILE); + strcat(errstr, filename); + errmsg = gtk_message_dialog_new(GTK_WINDOW(main_window), + GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, errstr); + gtk_window_set_title(GTK_WINDOW(errmsg), ERR_MSG_CAPTION); + gtk_dialog_run(GTK_DIALOG(errmsg)); + gtk_widget_destroy(errmsg); + free(errstr); + return ; + } + } + gtk_widget_destroy(filedialog); +} - gtk_widget_show(image); - gtk_widget_show(label); - gtk_widget_show(box); +static void quit_item_click(GtkWidget *widget, gpointer data) +{ + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_YES_NO, QUIT_MSG_TEXT); + gtk_window_set_title(GTK_WINDOW(dialog), QUIT_MSG_CAPTION); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_YES) { + gtk_widget_destroy(dialog); + gtk_main_quit(); + } + else + gtk_widget_destroy(dialog); +} + +static void dict_item_click(GtkWidget *widget, gpointer data) +{ + create_dict_win(); +} + +static void pref_item_click(GtkWidget *widget, gpointer data) +{ + create_conf_win(); +} + +static void about_item_click(GtkWidget *widget, gpointer data) +{ + const gchar comment[] = {"WordExtract is a subtitle parser\n which shows all unique words\n from files."}; + const gchar copyright[] = {"Copyright \xc2\xa9 2009 by Borisov Alexandr"}; + const gchar gplv3[] = {"This program is free software: you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + "the Free Software Foundation, either version 3 of the License, or\n" + "(at your option) any later version.\n\n" + "This program is distributed in the hope that it will be useful,\n" + "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" + "GNU General Public License for more details.\n\n" + "You should have received a copy of the GNU General Public License\n" + "along with this program. If not, see ."}; + const gchar *authors[] = {"Borisov Alexandr aka b0ric", NULL}; + + gtk_show_about_dialog(GTK_WINDOW(main_window), "name", "WordExtract", + "version", "v0.2", + "website", "http://null.net", + "comments", comment, + "copyright", copyright, + "license", gplv3, + "authors", authors, + "documenters", NULL, + "translator-credits", NULL, + "logo", NULL, NULL); +} + +static gboolean popup_by_click(GtkWidget *word_list, GdkEventButton *event, gpointer data) +{ + GtkTreeSelection *selection; + GtkTreePath *path; + + if (event->type == GDK_BUTTON_PRESS && event->button == 3) { + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(word_list)); + if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selection), NULL, NULL)) { + if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(word_list), (gint) event->x, + (gint) event->y, &path, NULL, NULL, NULL)) { + gtk_tree_selection_unselect_all(selection); + gtk_tree_selection_select_path(selection, path); + word_list_popup(GTK_WIDGET(word_list), event); + return TRUE; + } + } + } +return FALSE; +} + +static gboolean popup_by_keybd(GtkWidget *word_list, gpointer data) +{ + word_list_popup(word_list, NULL); + return TRUE; +} + +static void word_list_popup(GtkWidget *widget, GdkEventButton *event) +{ + GtkWidget *popup_menu; + popup_menu = gtk_menu_new(); + GtkWidget *show_sent_item; + show_sent_item = gtk_image_menu_item_new_with_label("Show Sentence"); + gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), show_sent_item); + gtk_widget_show(show_sent_item); + g_signal_connect(G_OBJECT(show_sent_item), "activate", G_CALLBACK(show_sent_item_click), NULL); + gtk_widget_set_tooltip_text(GTK_WIDGET(show_sent_item), "Show sentenses word appears in"); + GtkWidget *find_image; + find_image = gtk_image_new_from_stock("gtk-find", GTK_ICON_SIZE_MENU); + gtk_widget_show(find_image); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(show_sent_item), find_image); + GtkWidget *add_to_dict_item; + add_to_dict_item = gtk_image_menu_item_new_with_label("Add To Dictionary"); + gtk_widget_show(add_to_dict_item); + gtk_menu_shell_append(GTK_MENU_SHELL(popup_menu), add_to_dict_item); + g_signal_connect(add_to_dict_item, "activate", G_CALLBACK(add_to_dict_item_click), NULL); + gtk_widget_set_tooltip_text(GTK_WIDGET(add_to_dict_item), "Add word to my dictionary"); + GtkWidget *add_image; + add_image = gtk_image_new_from_stock("gtk-add", GTK_ICON_SIZE_MENU); + gtk_widget_show(add_image); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(add_to_dict_item), add_image); + gtk_widget_show(popup_menu); + gtk_menu_popup(GTK_MENU(popup_menu), NULL, NULL, NULL, NULL, + (event != NULL) ? event->button : 0, gdk_event_get_time((GdkEvent*)event)); +} + +static void show_sent_item_click(GtkWidget *widget, gpointer data) +{ + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + gchar *word; + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(word_list)); + if (gtk_tree_selection_get_selected(selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, 0, &word, -1); + set_find_text(word); + change_search_navigation_state(TRUE); + search_sentences(word); + g_free(word); + } +} + +static void add_to_dict_item_click(GtkWidget *widget, gpointer data) +{ + +} + +static void fill_list(char **word_list) +{ + GtkTreeIter iter; + int cnt, i; + + cnt = get_words_count(words); + for (i = 0; i < cnt; i++) { + gtk_list_store_append(store_model, &iter); + gtk_list_store_set(store_model, &iter, WORD_ITEM, *word_list, -1); + word_list++; + } +} - return button; +static void change_search_navigation_state(gboolean state) +{ + gtk_widget_set_sensitive(GTK_WIDGET(prev_btn), state); + gtk_widget_set_sensitive(GTK_WIDGET(next_btn), state); + gtk_widget_set_sensitive(GTK_WIDGET(clear_btn), state); } void add_sentence(char *sentence) @@ -227,6 +570,39 @@ void add_sentence(char *sentence) gtk_text_buffer_insert(buffer, &iter, (gchar*) sentence, -1); } +static void on_find_text_change(GtkWidget *widget, gpointer datd) +{ + const gchar *find_text; + + find_text = gtk_entry_get_text(GTK_ENTRY(find_entry)); + change_search_navigation_state(strcmp(find_text, "")); + if (strcmp(find_text, "")) + search_sentences(find_text); +} + +static void find_next_btn_click(GtkWidget *widget, gpointer entry) +{ + const gchar *find_text = NULL; + + find_text = gtk_entry_get_text(GTK_ENTRY(entry)); + find_other(find_text, SEARCH_FORWARD); +} + +static void find_prev_btn_click(GtkWidget *widget, gpointer entry) +{ + const gchar *find_text = NULL; + + find_text = gtk_entry_get_text(GTK_ENTRY(entry)); + find_other(find_text, SEARCH_BACKWARD); +} + +static void clear_btn_click(GtkWidget *widget, gpointer data) +{ + clear_search_tags(); + gtk_entry_set_text(GTK_ENTRY(find_entry), ""); + change_search_navigation_state(FALSE); +} + void clear_sentences() { GtkTextBuffer *buffer; @@ -236,7 +612,7 @@ void clear_sentences() gtk_text_buffer_set_text(buffer, text, -1); } -void search_sentences(const gchar *word) +static void search_sentences(const gchar *word) { GtkTextBuffer *buffer; GtkTextIter find_start, find_end; @@ -267,25 +643,12 @@ void search_sentences(const gchar *word) } } -void enable_search() -{ - gtk_widget_set_sensitive(GTK_WIDGET(find_label), TRUE); - gtk_widget_set_sensitive(GTK_WIDGET(find_entry), TRUE); -} - -void change_search_navigation_state(gboolean state) -{ - gtk_widget_set_sensitive(GTK_WIDGET(prev_btn), state); - gtk_widget_set_sensitive(GTK_WIDGET(next_btn), state); - gtk_widget_set_sensitive(GTK_WIDGET(clear_btn), state); -} - -void set_find_text(gchar *text) +static void set_find_text(gchar *text) { gtk_entry_set_text(GTK_ENTRY(find_entry), text); } -void clear_search_tags() +static void clear_search_tags() { GtkTextBuffer *buffer; GtkTextIter find_start, find_end; @@ -301,7 +664,7 @@ void clear_search_tags() * SEARCH_CASE_INSENSITIVE flag in GtkTextSearchFlags struct * which is in their TODO list */ -gboolean gtk_text_iter_search_word(const GtkTextIter *iter, const gchar *str, +static gboolean gtk_text_iter_search_word(const GtkTextIter *iter, const gchar *str, GtkTextSearchFlags flags, GtkTextIter *match_start, GtkTextIter *match_end, const GtkTextIter *limit, const int direction) @@ -348,7 +711,7 @@ gboolean gtk_text_iter_search_word(const GtkTextIter *iter, const gchar *str, return result; } -void find_other(const gchar *word, const int direction) +static void find_other(const gchar *word, const int direction) { GtkTextBuffer *buffer; GtkTextIter find_start, find_end; @@ -383,4 +746,3 @@ void find_other(const gchar *word, const int direction) } } - -- cgit v1.2.3