diff options
author | b0ric <b0risov.alexandr@rambler.ru> | 2009-08-07 01:45:54 +0300 |
---|---|---|
committer | b0ric <b0risov.alexandr@rambler.ru> | 2009-08-07 01:45:54 +0300 |
commit | 180da16f3c1592d1515de2e647144a37cc23c1b9 (patch) | |
tree | f03e590b6fbc2ccbc0f662525f9133e1fe780de1 /interface.c | |
parent | 4fc82214f27252f5e11e7d9a0c605a7d33c690bd (diff) |
Basical GUI functionality and few GIU improvements
Diffstat (limited to 'interface.c')
-rw-r--r-- | interface.c | 331 |
1 files changed, 245 insertions, 86 deletions
diff --git a/interface.c b/interface.c index d494a1c..e44ed96 100644 --- a/interface.c +++ b/interface.c @@ -16,144 +16,172 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <gtk/gtk.h> #include "interface.h" #include "callbacks.h" +#include "word.h" static GtkWidget *gtk_button_new_with_label_and_image(gchar *img_file, gchar *label); -GtkWidget *create_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; +static int current_highlighted_end; +static int current_highlighted_start; + +void create_main_window() { - GtkWidget *main_window; - GtkWidget *vbox; - GtkWidget *tool_hbox; - GtkWidget *open_btn; - GtkWidget *save_btn; - GtkWidget *preferences_btn; - GtkWidget *dict_btn; - GtkWidget *about_btn; - GtkWidget *quit_btn; - GtkWidget *hpaned; - GtkWidget *word_sc_win; - GtkWidget *word_list; - GtkWidget *sentences_sc_win; - GtkWidget *sentences_text; - GtkWidget *statusbar; - main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_widget_set_size_request(main_window, 640, 480); gtk_container_set_border_width(GTK_CONTAINER(main_window), 2); gtk_window_set_title(GTK_WINDOW(main_window), "WordExtract"); gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER); - g_signal_connect(G_OBJECT(main_window), "delete_event", G_CALLBACK(main_window_close), NULL); + 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, 0); gtk_widget_show(vbox); gtk_container_add(GTK_CONTAINER(main_window), vbox); gtk_container_set_border_width(GTK_CONTAINER(vbox), 2); + GtkWidget *tool_hbox; tool_hbox = gtk_hbox_new(FALSE, 0); - gtk_widget_show(tool_hbox); gtk_box_pack_start(GTK_BOX(vbox), tool_hbox, FALSE, FALSE, 0); + gtk_widget_show(tool_hbox); - open_btn = gtk_button_new_with_label_and_image("gtk-open", "Open"); - gtk_widget_show(open_btn); + 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); - save_btn = gtk_button_new_with_label_and_image("gtk-save-as", "Save"); - gtk_widget_show(save_btn); + 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); - preferences_btn = gtk_button_new_with_label_and_image("gtk-preferences", "Preferences"); - gtk_widget_show (preferences_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_widget_show(dict_btn); 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"); + gtk_widget_show(dict_btn); - quit_btn = gtk_button_new_with_label_and_image("gtk-quit", "Quit"); - gtk_widget_show (quit_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); - about_btn = gtk_button_new_with_label_and_image("gtk-about", "About"); - gtk_widget_show(about_btn); + 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 *hpaned; hpaned = gtk_hpaned_new(); - gtk_widget_show(hpaned); 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); - gtk_widget_show(word_sc_win); 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); + + GtkWidget *list; + list = create_word_list(); + gtk_container_add(GTK_CONTAINER(word_sc_win), list); + gtk_widget_show(list); - word_list = gtk_tree_view_new(); - gtk_widget_show(word_list); - gtk_container_add(GTK_CONTAINER(word_sc_win), word_list); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(word_list), FALSE); - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(word_list), TRUE); + GtkWidget *text_vbox; + 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); - sentences_sc_win = gtk_scrolled_window_new (NULL, NULL); - gtk_widget_show (sentences_sc_win); - gtk_paned_add2(GTK_PANED(hpaned), sentences_sc_win); - gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sentences_sc_win), GTK_SHADOW_IN); + GtkWidget *sentences_sc_win; + sentences_sc_win = gtk_scrolled_window_new(NULL, NULL); + 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(); - gtk_widget_show(sentences_text); - gtk_container_add(GTK_CONTAINER(sentences_sc_win), sentences_text); + 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); - statusbar = gtk_statusbar_new(); - gtk_widget_show(statusbar); - gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0); - - return main_window; -} - -/*GtkWidget *create_popup_menu(void) -{ - GtkWidget *popup_menu; - GtkWidget *show_sent_item; - GtkWidget *find_image; - GtkWidget *add_to_dict_item; - GtkWidget *add_image; - GtkTooltips *tooltips; - - tooltips = gtk_tooltips_new (); - - popup_menu = gtk_menu_new (); - - show_sent_item = gtk_image_menu_item_new_with_mnemonic (_("Show Sentence")); - gtk_widget_show (show_sent_item); - gtk_container_add (GTK_CONTAINER (popup_menu), show_sent_item); - gtk_tooltips_set_tip (tooltips, show_sent_item, _("Show sentenses word appears in"), NULL); + GtkWidget *text_hbox; + 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); - 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); + find_label = gtk_label_new("Find: "); + gtk_box_pack_start(GTK_BOX(text_hbox), find_label, FALSE, FALSE, 0); + gtk_widget_set_sensitive(GTK_WIDGET(find_label), FALSE); + gtk_widget_show(find_label); - add_to_dict_item = gtk_image_menu_item_new_with_mnemonic (_("Add To Dictionary")); - gtk_widget_show (add_to_dict_item); - gtk_container_add (GTK_CONTAINER (popup_menu), add_to_dict_item); - gtk_tooltips_set_tip (tooltips, add_to_dict_item, _("Add word to my dictionary"), NULL); + find_entry = gtk_entry_new_with_max_length(WORDLENGTH); + 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); + gtk_widget_show(find_entry); - 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); + GtkWidget *image; - g_signal_connect ((gpointer) show_sent_item, "activate", - G_CALLBACK (on_show_sent_item_activate), - NULL); - g_signal_connect ((gpointer) add_to_dict_item, "activate", - G_CALLBACK (on_add_to_dict_item_activate), - NULL); + prev_btn = gtk_button_new(); + image = gtk_image_new_from_stock(GTK_STOCK_GO_BACK, GTK_ICON_SIZE_BUTTON); + gtk_container_add(GTK_CONTAINER(prev_btn), image); + gtk_widget_show(image); + gtk_box_pack_start(GTK_BOX(text_hbox), prev_btn, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(prev_btn), "Previous sentence"); + gtk_widget_set_sensitive(GTK_WIDGET(prev_btn), FALSE); + g_signal_connect(G_OBJECT(prev_btn), "clicked", G_CALLBACK(find_prev_btn_click), (gpointer) find_entry); + gtk_widget_show(prev_btn); + + next_btn = gtk_button_new(); + image = gtk_image_new_from_stock(GTK_STOCK_GO_FORWARD, GTK_ICON_SIZE_BUTTON); + gtk_container_add(GTK_CONTAINER(next_btn), image); + gtk_widget_show(image); + gtk_box_pack_start(GTK_BOX(text_hbox), next_btn, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(next_btn), "Next sentence"); + gtk_widget_set_sensitive(GTK_WIDGET(next_btn), FALSE); + g_signal_connect(G_OBJECT(next_btn), "clicked", G_CALLBACK(find_next_btn_click), (gpointer) find_entry); + gtk_widget_show(next_btn); + + clear_btn = gtk_button_new(); + image = gtk_image_new_from_stock(GTK_STOCK_CLEAR, GTK_ICON_SIZE_BUTTON); + gtk_container_add(GTK_CONTAINER(clear_btn), image); + gtk_widget_show(image); + gtk_box_pack_start(GTK_BOX(text_hbox), clear_btn, FALSE, FALSE, 0); + gtk_widget_set_tooltip_text(GTK_WIDGET(clear_btn), "Cleanup highlighting"); + gtk_widget_set_sensitive(GTK_WIDGET(clear_btn), FALSE); + g_signal_connect(G_OBJECT(clear_btn), "clicked", G_CALLBACK(clear_btn_click), (gpointer) find_entry); + gtk_widget_show(clear_btn); - return popup_menu; -}*/ + statusbar = gtk_statusbar_new(); + gtk_box_pack_start(GTK_BOX(vbox), statusbar, FALSE, FALSE, 0); + gtk_widget_show(statusbar); +} static GtkWidget *gtk_button_new_with_label_and_image(gchar *img_name, gchar *label_text) { @@ -180,3 +208,134 @@ static GtkWidget *gtk_button_new_with_label_and_image(gchar *img_name, gchar *la return button; } +void add_sentence(char *sentence) +{ + GtkTextBuffer *buffer; + GtkTextIter iter; + + 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); +} + +void clear_sentences() +{ + GtkTextBuffer *buffer; + gchar text[] = "\0"; + + buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(sentences_text)); + gtk_text_buffer_set_text(buffer, text, -1); +} + +void search_sentences(const gchar *word) +{ + GtkTextBuffer *buffer; + GtkTextIter find_start, find_end; + GtkTextIter match_start, match_end; + int offset; + + 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); + gtk_text_buffer_remove_tag_by_name(buffer, "yellow-bg", &find_start, &find_end); + while (gtk_text_iter_forward_search(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| + GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, + &match_end, NULL)) { + 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); + } + gtk_text_buffer_get_start_iter(buffer, &find_start); + gtk_text_buffer_get_end_iter(buffer, &find_end); + if (gtk_text_iter_forward_search(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| + GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, + &match_end, NULL)) { + gtk_text_buffer_apply_tag_by_name(buffer, "green-bg", &match_start, &match_end); + current_highlighted_end = gtk_text_iter_get_offset(&match_end); + current_highlighted_start = gtk_text_iter_get_offset(&match_start); + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(sentences_text), &match_start, 0.0, TRUE, 0.5, 0.5); + } +} + +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) +{ + gtk_entry_set_text(GTK_ENTRY(find_entry), text); +} + +void clear_search_tags() +{ + GtkTextBuffer *buffer; + GtkTextIter find_start, find_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); +} + +void find_next(const gchar *word) +{ + GtkTextBuffer *buffer; + GtkTextIter find_start, find_end; + GtkTextIter match_start, match_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, "green-bg", &find_start, &find_end); + gtk_text_buffer_get_iter_at_offset(buffer, &find_start, current_highlighted_end); + if (gtk_text_iter_forward_search(&find_start, word, GTK_TEXT_SEARCH_TEXT_ONLY| + GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, + &match_end, NULL)) { + gtk_text_buffer_apply_tag_by_name(buffer, "green-bg", &match_start, &match_end); + current_highlighted_start = gtk_text_iter_get_offset(&match_start); + current_highlighted_end = gtk_text_iter_get_offset(&match_end); + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(sentences_text), &match_start, 0.0, TRUE, 0.5, 0.5); + } else { + gtk_text_buffer_get_end_iter(buffer, &find_end); + current_highlighted_start = gtk_text_iter_get_offset(&find_end); + current_highlighted_end = gtk_text_iter_get_offset(&find_end); + } +} + +void find_prev(const gchar *word) +{ + GtkTextBuffer *buffer; + GtkTextIter find_start, find_end; + GtkTextIter match_start, match_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, "green-bg", &find_start, &find_end); + gtk_text_buffer_get_iter_at_offset(buffer, &find_end, current_highlighted_start); + if (gtk_text_iter_backward_search(&find_end, word, GTK_TEXT_SEARCH_TEXT_ONLY| + GTK_TEXT_SEARCH_VISIBLE_ONLY, &match_start, + &match_end, NULL)) { + gtk_text_buffer_apply_tag_by_name(buffer, "green-bg", &match_start, &match_end); + current_highlighted_start = gtk_text_iter_get_offset(&match_start); + current_highlighted_end = gtk_text_iter_get_offset(&match_end); + gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(sentences_text), &match_start, 0.0, TRUE, 0.5, 0.5); + } else { + gtk_text_buffer_get_start_iter(buffer, &find_start); + current_highlighted_start = gtk_text_iter_get_offset(&find_start); + current_highlighted_end = gtk_text_iter_get_offset(&find_start); + } +} + |