diff options
author | b0ric <b0risov.alexandr@rambler.ru> | 2009-08-15 20:10:40 +0300 |
---|---|---|
committer | b0ric <b0risov.alexandr@rambler.ru> | 2009-08-15 20:10:40 +0300 |
commit | 9d2cc46e50218768b43d4f8b80647828bca74576 (patch) | |
tree | 82f6670a01248d517ff0c3b8070cffc16ea4b48f /mainwin.c | |
parent | d2b347e0aa6e5fc3de95253c43900c15938dbaaf (diff) |
It seems that everything is working except settings (they are in TODO)
Diffstat (limited to 'mainwin.c')
-rw-r--r-- | mainwin.c | 369 |
1 files changed, 218 insertions, 151 deletions
@@ -10,20 +10,24 @@ * * 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 WordExtract. If not, see <http://www.gnu.org/licenses/>. + * along with WordExtract. If not, see <http://www.gnu.org/licenses/>. */ +#include <gdk/gdkkeysyms.h> #include <stdlib.h> +#include <libgen.h> #include <string.h> #include <ctype.h> #include "mainwin.h" #include "dictwin.h" #include "confwin.h" +#include "main.h" #include "word.h" +#include "dict.h" #include "srt.h" #define SEARCH_FORWARD 0 @@ -39,6 +43,7 @@ enum {WORD_ITEM = 0, N_COLUMNS}; GtkWidget *main_window; static GtkWidget *sentences_text; +static GtkWidget *find_btn; static GtkWidget *prev_btn; static GtkWidget *next_btn; static GtkWidget *clear_btn; @@ -51,14 +56,18 @@ static GtkWidget *save_item; static GtkToolItem *save; static GtkWidget *find_label; static GtkWidget *find_entry; -/*vars to controll current word highlighting (green)*/ +/*vars to control current word highlighting (green)*/ static int current_highlighted_end; static int current_highlighted_start; +/*statusbar context id*/ +static guint id, find_id; +static void set_status_msg(); 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 save_words_item_click(GtkWidget *, gpointer); +static void save_text_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); @@ -70,6 +79,7 @@ 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 gboolean find_entry_key_press(GtkWidget *, GdkEventKey *, gpointer); static void on_find_text_change(GtkWidget *, gpointer); static void find_prev_btn_click(GtkWidget *, gpointer); static void find_next_btn_click(GtkWidget *, gpointer); @@ -77,7 +87,7 @@ 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, +static gboolean gtk_text_iter_search_word(const GtkTextIter *, const gchar *, GtkTextSearchFlags, GtkTextIter *, GtkTextIter *, const GtkTextIter *, int); static void find_other(const gchar *, const int); @@ -91,33 +101,35 @@ void create_main_window() g_signal_connect(G_OBJECT(main_window), "delete_event", G_CALLBACK(main_window_close), (gpointer) main_window); g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(main_window_destroy), NULL); - GtkWidget *vbox; - vbox = gtk_vbox_new(FALSE, 2); + GtkWidget *vbox = gtk_vbox_new(FALSE, 2); gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(main_window), vbox); - 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"); + GtkWidget *menu_bar = gtk_menu_bar_new(); + GtkWidget *sep_item = gtk_separator_menu_item_new(); + GtkWidget *file_menu = gtk_menu_new(); + GtkWidget *file_item = gtk_menu_item_new_with_mnemonic("_File"); + + GtkWidget *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 analyse"); 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"); + save_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_SAVE_AS, NULL); 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); + GtkWidget *save_menu = gtk_menu_new(); + GtkWidget *save_words_img = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU); + GtkWidget *save_words_item = gtk_image_menu_item_new_with_label("Words"); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(save_words_item), save_words_img); + gtk_widget_set_tooltip_text(GTK_WIDGET(save_words_item), "Save list of words to file"); + g_signal_connect(G_OBJECT(save_words_item), "activate", G_CALLBACK(save_words_item_click), NULL); + GtkWidget *save_text_img = gtk_image_new_from_stock(GTK_STOCK_SAVE_AS, GTK_ICON_SIZE_MENU); + GtkWidget *save_text_item = gtk_image_menu_item_new_with_label("Text"); + gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(save_text_item), save_text_img); + gtk_widget_set_tooltip_text(GTK_WIDGET(save_text_item), "Save text from which words were picked up"); + g_signal_connect(G_OBJECT(save_text_item), "activate", G_CALLBACK(save_text_item_click), NULL); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(save_item), save_menu); + gtk_menu_shell_append(GTK_MENU_SHELL(save_menu), save_words_item); + gtk_menu_shell_append(GTK_MENU_SHELL(save_menu), save_text_item); + GtkWidget *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); @@ -128,33 +140,25 @@ void create_main_window() 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"); + GtkWidget *edit_menu = gtk_menu_new(); + GtkWidget *edit_item = gtk_menu_item_new_with_mnemonic("_Edit"); + GtkWidget *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); + GtkWidget *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); + GtkWidget *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_menu_item_set_submenu(GTK_MENU_ITEM(edit_item), edit_menu); + gtk_menu_shell_append(GTK_MENU_SHELL(edit_menu), dict_item); + gtk_menu_shell_append(GTK_MENU_SHELL(edit_menu), pref_item); + gtk_menu_shell_append(GTK_MENU_SHELL(menu_bar), edit_item); + gtk_widget_show_all(edit_item); + + GtkWidget *help_menu = gtk_menu_new(); + GtkWidget *help_item = gtk_menu_item_new_with_mnemonic("_Help"); + GtkWidget *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); @@ -165,53 +169,44 @@ void create_main_window() gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2); gtk_widget_show(menu_bar); - GtkWidget *toolbar; - toolbar = gtk_toolbar_new(); + GtkWidget *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"); + GtkToolItem *open = gtk_tool_button_new_from_stock(GTK_STOCK_OPEN); + gtk_widget_set_tooltip_text(GTK_WIDGET(open), "Open file to analyse"); 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); + g_signal_connect(G_OBJECT(save), "clicked", G_CALLBACK(save_words_item_click), NULL); gtk_toolbar_insert(GTK_TOOLBAR(toolbar), save, -1); - GtkToolItem *tool_sep1; - tool_sep1 = gtk_separator_tool_item_new(); + GtkToolItem *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); + GtkToolItem *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(); + GtkToolItem *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); + GtkToolItem *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(); + GtkWidget *hpaned = gtk_hpaned_new(); gtk_box_pack_start(GTK_BOX(vbox), hpaned, TRUE, TRUE, 0); gtk_paned_set_position(GTK_PANED(hpaned), 200); gtk_widget_show(hpaned); - GtkWidget *word_sc_win; - word_sc_win = gtk_scrolled_window_new(NULL, NULL); + GtkWidget *word_sc_win = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(word_sc_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_paned_add1(GTK_PANED(hpaned), word_sc_win); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(word_sc_win), GTK_SHADOW_IN); gtk_widget_show(word_sc_win); - 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); @@ -220,36 +215,34 @@ void create_main_window() 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_unref(store_model); + GtkCellRenderer *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); + GtkTreeViewColumn *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); + GtkWidget *text_vbox = gtk_vbox_new(FALSE, 0); gtk_paned_add2(GTK_PANED(hpaned), text_vbox); gtk_container_set_border_width(GTK_CONTAINER(text_vbox), 2); gtk_widget_show(text_vbox); - GtkWidget *sentences_sc_win; - sentences_sc_win = gtk_scrolled_window_new(NULL, NULL); + GtkWidget *sentences_sc_win = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sentences_sc_win), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_box_pack_start(GTK_BOX(text_vbox), sentences_sc_win, TRUE, TRUE, 0); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sentences_sc_win), GTK_SHADOW_IN); gtk_widget_show(sentences_sc_win); - GtkTextBuffer *buffer; sentences_text = gtk_text_view_new(); - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); gtk_text_view_set_editable(GTK_TEXT_VIEW(sentences_text), FALSE); gtk_text_buffer_create_tag(buffer, "yellow-bg", "background", "yellow", NULL); gtk_text_buffer_create_tag(buffer, "green-bg", "background", "green", NULL); gtk_container_add(GTK_CONTAINER(sentences_sc_win), sentences_text); gtk_widget_show(sentences_text); - GtkWidget *text_hbox; - text_hbox = gtk_hbox_new(FALSE, 0); + GtkWidget *text_hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_end(GTK_BOX(text_vbox), text_hbox, FALSE, FALSE, 0); gtk_widget_show(text_hbox); @@ -262,9 +255,18 @@ void create_main_window() gtk_box_pack_start(GTK_BOX(text_hbox), find_entry, FALSE, FALSE, 0); gtk_widget_set_sensitive(GTK_WIDGET(find_entry), FALSE); g_signal_connect(G_OBJECT(find_entry), "activate", G_CALLBACK(on_find_text_change), NULL); + g_signal_connect(G_OBJECT(find_entry), "key-press-event", G_CALLBACK(find_entry_key_press), NULL); gtk_widget_show(find_entry); - GtkWidget *image; + find_btn = gtk_button_new(); + GtkWidget *image = gtk_image_new_from_stock(GTK_STOCK_FIND, GTK_ICON_SIZE_BUTTON); + gtk_container_add(GTK_CONTAINER(find_btn), image); + gtk_widget_show(image); + gtk_box_pack_start(GTK_BOX(text_hbox), find_btn, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(find_btn), "Find word"); + gtk_widget_set_sensitive(GTK_WIDGET(find_btn), FALSE); + g_signal_connect(G_OBJECT(find_btn), "clicked", G_CALLBACK(on_find_text_change), NULL); + gtk_widget_show(find_btn); prev_btn = gtk_button_new(); image = gtk_image_new_from_stock(GTK_STOCK_GO_BACK, GTK_ICON_SIZE_BUTTON); @@ -298,15 +300,24 @@ void create_main_window() statusbar = gtk_statusbar_new(); gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0); + id = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "main_context"); + find_id = gtk_statusbar_get_context_id(GTK_STATUSBAR(statusbar), "find_context"); + gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, "Open file to pick up words from it..."); gtk_widget_show(statusbar); } +static void set_status_msg() +{ + char words_cnt_str[40] = {0}; + sprintf(words_cnt_str, "<b> Words in your dictionary: %d</b>", dict_words.count); + gtk_statusbar_pop(GTK_STATUSBAR(statusbar), find_id); +} + static gint main_window_close(GtkWidget *widget, GdkEvent *event, gpointer main_window) { - GtkWidget *dialog; gint response = TRUE; - dialog = gtk_message_dialog_new(main_window, GTK_DIALOG_DESTROY_WITH_PARENT, + GtkWidget *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) @@ -323,21 +334,17 @@ static void main_window_destroy(GtkWidget *widget, gpointer data) 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(); + GtkFileFilter *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); + GtkWidget *filedialog = gtk_file_chooser_dialog_new("Open File for analysing", + 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)); @@ -346,7 +353,7 @@ static void open_item_click(GtkWidget *widget, gpointer data) 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), + GtkWidget *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); @@ -356,39 +363,41 @@ static void open_item_click(GtkWidget *widget, gpointer data) return ; } if (words != NULL) { - /*we won't free() 'words' variable, it's statical*/ - free_words(words->lsibl); - free_words(words->rsibl); - free(words->word); + free(user_words.by_az); + free_words(words); 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(find_btn), 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); + user_words = get_sorted(words); + fill_list(user_words.by_az); fclose(subtitle); + gchar *file = malloc(strlen(filename)+1); + file = basename(filename); + gchar *status_msg = malloc(strlen(file)+40); + sprintf(status_msg, "%d words were picked up from '%s'", user_words.count, file); + gtk_statusbar_pop(GTK_STATUSBAR(statusbar), id); + gtk_statusbar_push(GTK_STATUSBAR(statusbar), id, status_msg); } gtk_widget_destroy(filedialog); } -static void save_item_click(GtkWidget *widget, gpointer data) +static void save_words_item_click(GtkWidget *widget, gpointer data) { - GtkWidget *filedialog; - GtkWidget *errmsg; FILE *savefile; - char *filename; - char *errstr; + gchar *filename; + gchar *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, + GtkWidget *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)); @@ -397,7 +406,7 @@ static void save_item_click(GtkWidget *widget, gpointer data) 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), + GtkWidget *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); @@ -406,15 +415,52 @@ static void save_item_click(GtkWidget *widget, gpointer data) free(errstr); return ; } + save_words(savefile, user_words, save_user_words); + fclose(savefile); } gtk_widget_destroy(filedialog); } -static void quit_item_click(GtkWidget *widget, gpointer data) +static void save_text_item_click(GtkWidget *widget, gpointer data) { - GtkWidget *dialog; + FILE *savefile; + gchar *filename; + gchar *errstr; + gchar *text; - dialog = gtk_message_dialog_new(GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, + GtkWidget *filedialog = gtk_file_chooser_dialog_new("Save text 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); + GtkWidget *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); + return ; + } + GtkTextIter start, end; + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); + gtk_text_buffer_get_start_iter(buffer, &start); + gtk_text_buffer_get_end_iter(buffer, &end); + text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE); + fprintf(savefile, text); + fclose(savefile); + } + gtk_widget_destroy(filedialog); +} + +static void quit_item_click(GtkWidget *widget, gpointer data) +{ + GtkWidget *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) { @@ -439,16 +485,21 @@ 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 <http://www.gnu.org/licenses/>."}; + const gchar gplv3[] = {"WordExtract is free software: you can\n" + "redistribute it and/or modify it under the\n" + "terms of the GNU General Public License as\n" + "published by the Free Software Foundation,\n" + "either version 3 of the License, or (at your\n" + "option) any later version.\n\n" + "WordExtract is distributed in the hope that\n" + "it will be useful, but WITHOUT ANY WARRANTY;\n" + "without even the implied warranty of\n" + "MERCHANTABILITY or FITNESS FOR A PARTICULAR\n" + "PURPOSE. See the GNU General Public License\n" + "for more details.\n\n" + "You should have received a copy of the GNU\n" + "General Public License along with WordExtract.\n" + "If not, see <http://www.gnu.org/licenses/>."}; const gchar *authors[] = {"Borisov Alexandr aka b0ric", NULL}; gtk_show_about_dialog(GTK_WINDOW(main_window), "name", "WordExtract", @@ -465,11 +516,10 @@ static void about_item_click(GtkWidget *widget, gpointer data) 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)); + GtkTreeSelection *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)) { @@ -491,26 +541,21 @@ static gboolean popup_by_keybd(GtkWidget *word_list, gpointer data) 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"); + GtkWidget *popup_menu = gtk_menu_new(); + GtkWidget *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); + GtkWidget *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"); + GtkWidget *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); + GtkWidget *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); @@ -520,12 +565,11 @@ static void word_list_popup(GtkWidget *widget, GdkEventButton *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)); + GtkTreeSelection *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); @@ -537,7 +581,16 @@ static void show_sent_item_click(GtkWidget *widget, gpointer data) static void add_to_dict_item_click(GtkWidget *widget, gpointer data) { + GtkTreeModel *model; + GtkTreeIter iter; + gchar *word; + GtkTreeSelection *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); + add_word(dict, word); + g_free(word); + } } static void fill_list(char **word_list) @@ -562,15 +615,22 @@ static void change_search_navigation_state(gboolean state) void add_sentence(char *sentence) { - GtkTextBuffer *buffer; GtkTextIter iter; - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); gtk_text_buffer_get_end_iter(buffer, &iter); gtk_text_buffer_insert(buffer, &iter, (gchar*) sentence, -1); } -static void on_find_text_change(GtkWidget *widget, gpointer datd) +static gboolean find_entry_key_press(GtkWidget *entry, GdkEventKey *event, gpointer data) +{ + if (event->type == GDK_KEY_PRESS) + if ((event->length)||(event->keyval == GDK_BackSpace)||(event->keyval == GDK_Delete)) + set_status_msg(); + return FALSE; +} + +static void on_find_text_change(GtkWidget *widget, gpointer data) { const gchar *find_text; @@ -600,6 +660,7 @@ static void clear_btn_click(GtkWidget *widget, gpointer data) { clear_search_tags(); gtk_entry_set_text(GTK_ENTRY(find_entry), ""); + set_status_msg(); change_search_navigation_state(FALSE); } @@ -614,12 +675,11 @@ void clear_sentences() static void search_sentences(const gchar *word) { - GtkTextBuffer *buffer; GtkTextIter find_start, find_end; GtkTextIter match_start, match_end; - int offset; + int offset, cnt = 0; - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); gtk_text_buffer_get_start_iter(buffer, &find_start); gtk_text_buffer_get_end_iter(buffer, &find_end); gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &find_start, &find_end); @@ -630,7 +690,16 @@ static void search_sentences(const gchar *word) gtk_text_buffer_apply_tag_by_name(buffer, "yellow-bg", &match_start, &match_end); offset = gtk_text_iter_get_offset(&match_end); gtk_text_buffer_get_iter_at_offset(buffer, &find_start, offset); + cnt++; + } + + if (!cnt) { + char status_msg[50] = {0}; + sprintf(status_msg, "Word '%s' was not found", word); + gtk_statusbar_pop(GTK_STATUSBAR(statusbar), find_id); + gtk_statusbar_push(GTK_STATUSBAR(statusbar), find_id, (gchar *) status_msg); } + gtk_text_buffer_get_start_iter(buffer, &find_start); gtk_text_buffer_get_end_iter(buffer, &find_end); if (gtk_text_iter_search_word(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| @@ -650,14 +719,13 @@ static void set_find_text(gchar *text) static void clear_search_tags() { - GtkTextBuffer *buffer; - GtkTextIter find_start, find_end; + GtkTextIter start, end; - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); - gtk_text_buffer_get_start_iter(buffer, &find_start); - gtk_text_buffer_get_end_iter(buffer, &find_end); - gtk_text_buffer_remove_tag_by_name(buffer, "yellow-bg", &find_start, &find_end); - gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &find_start, &find_end); + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); + gtk_text_buffer_get_start_iter(buffer, &start); + gtk_text_buffer_get_end_iter(buffer, &end); + gtk_text_buffer_remove_tag_by_name(buffer, "yellow-bg", &start, &end); + gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &start, &end); } /* We won't need this abomination if GTK developers implement @@ -676,7 +744,7 @@ static gboolean gtk_text_iter_search_word(const GtkTextIter *iter, const gchar * str_wcap = malloc((strlen(str)+1)*sizeof(gchar)); strcpy(str_wcap, str); - /* We've lowered only first letter, so there are only two variants*/ + /* We've lowered only first letter, so there are only two cases*/ *str_wcap = toupper(*str_wcap); if (direction == SEARCH_FORWARD) { if (gtk_text_iter_forward_search(iter, str, flags, match_start, match_end, limit)) @@ -713,11 +781,10 @@ static gboolean gtk_text_iter_search_word(const GtkTextIter *iter, const gchar * static void find_other(const gchar *word, const int direction) { - GtkTextBuffer *buffer; GtkTextIter find_start, find_end; GtkTextIter match_start, match_end; - buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); + GtkTextBuffer *buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); gtk_text_buffer_get_start_iter(buffer, &find_start); gtk_text_buffer_get_end_iter(buffer, &find_end); gtk_text_buffer_remove_tag_by_name(buffer, "green-bg", &find_start, &find_end); |