summaryrefslogtreecommitdiff
path: root/interface.c
diff options
context:
space:
mode:
authorb0ric <b0risov.alexandr@rambler.ru>2009-08-07 01:45:54 +0300
committerb0ric <b0risov.alexandr@rambler.ru>2009-08-07 01:45:54 +0300
commit180da16f3c1592d1515de2e647144a37cc23c1b9 (patch)
treef03e590b6fbc2ccbc0f662525f9133e1fe780de1 /interface.c
parent4fc82214f27252f5e11e7d9a0c605a7d33c690bd (diff)
Basical GUI functionality and few GIU improvements
Diffstat (limited to 'interface.c')
-rw-r--r--interface.c331
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);
+ }
+}
+