summaryrefslogtreecommitdiff
path: root/mainwin.c
diff options
context:
space:
mode:
Diffstat (limited to 'mainwin.c')
-rw-r--r--mainwin.c552
1 files changed, 457 insertions, 95 deletions
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 <http://www.gnu.org/licenses/>.
+ * along with WordExtract. If not, see <http://www.gnu.org/licenses/>.
*/
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#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 <http://www.gnu.org/licenses/>."};
+ 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)
}
}
-