diff options
Diffstat (limited to 'hardinfo2/help-viewer/help-viewer.c')
| -rw-r--r-- | hardinfo2/help-viewer/help-viewer.c | 514 | 
1 files changed, 0 insertions, 514 deletions
diff --git a/hardinfo2/help-viewer/help-viewer.c b/hardinfo2/help-viewer/help-viewer.c deleted file mode 100644 index ace6ef37..00000000 --- a/hardinfo2/help-viewer/help-viewer.c +++ /dev/null @@ -1,514 +0,0 @@ -/* - *    HelpViewer - Simple Help file browser - *    Copyright (C) 2009 Leandro A. F. Pereira <leandro@hardinfo.org> - * - *    This program 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, version 2. - * - *    This program 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 - *    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, write to the Free Software - *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA - */ - -#define _GNU_SOURCE		/* for strcasestr() */ -#include <string.h> -#include <stdlib.h> -#include <gtk/gtk.h> - -#include "config.h" -#include "shell.h" -#include "markdown-text-view.h" -#include "help-viewer.h" -#include "hardinfo.h" - -static void do_search(HelpViewer *hv, gchar *text); - -static void forward_clicked(GtkWidget *widget, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -    GSList *temp; -     -    /* puts the current file on the back stack */ -    hv->back_stack = g_slist_prepend(hv->back_stack, g_strdup(hv->current_file)); -     -    /* enables the back button */ -    gtk_widget_set_sensitive(hv->btn_back, TRUE); - -    /* loads the new current file */ -    if (g_str_has_prefix(hv->forward_stack->data, "search://")) { -        do_search(hv, hv->forward_stack->data + sizeof("search://") - 1); -    } else { -        markdown_textview_load_file(MARKDOWN_TEXTVIEW(hv->text_view), hv->forward_stack->data); -    } -     -    /* pops the stack */ -    temp = hv->forward_stack->next; -    g_free(hv->forward_stack->data); -    g_slist_free1(hv->forward_stack); -    hv->forward_stack = temp; -     -    /* if there aren't items on forward stack anymore, disables the button */ -    if (!hv->forward_stack) { -        gtk_widget_set_sensitive(hv->btn_forward, FALSE); -    } -} - -static void back_clicked(GtkWidget *widget, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -    GSList *temp; -     -    /* puts the current file on the forward stack */ -    hv->forward_stack = g_slist_prepend(hv->forward_stack, g_strdup(hv->current_file)); -     -    /* enables the forward button */ -    gtk_widget_set_sensitive(hv->btn_forward, TRUE); - -    /* loads the new current file */ -    if (g_str_has_prefix(hv->back_stack->data, "search://")) { -        do_search(hv, hv->back_stack->data + sizeof("search://") - 1); -    } else { -        markdown_textview_load_file(MARKDOWN_TEXTVIEW(hv->text_view), hv->back_stack->data); -    } -     -    /* pops the stack */ -    temp = hv->back_stack->next; -    g_free(hv->back_stack->data); -    g_slist_free1(hv->back_stack); -    hv->back_stack = temp; -     -    /* if there aren't items on back stack anymore, disables the button */ -    if (!hv->back_stack) { -        gtk_widget_set_sensitive(hv->btn_back, FALSE); -    } -} - -static void link_clicked(MarkdownTextView *text_view, gchar *link, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -     -    if (g_str_has_prefix(link, "http://")) { -        open_url(link); -    } else { -        /* adds the current file to the back stack (before loading the new file */ -        hv->back_stack = g_slist_prepend(hv->back_stack, g_strdup(hv->current_file)); -        gtk_widget_set_sensitive(hv->btn_back, TRUE); - -        gtk_statusbar_pop(GTK_STATUSBAR(hv->status_bar), 1); -        markdown_textview_load_file(text_view, link); -    } -} - -static void file_load_complete(MarkdownTextView *text_view, gchar *file, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -     -    /* sets the currently-loaded file */ -    g_free(hv->current_file); -    hv->current_file = g_strdup(file); -     -    gtk_statusbar_push(GTK_STATUSBAR(hv->status_bar), 1, "Done."); -} - -static void hovering_over_link(MarkdownTextView *text_view, gchar *link, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -    gchar *temp; -     -    temp = g_strconcat("Link to ", link, NULL); -     -    gtk_statusbar_push(GTK_STATUSBAR(hv->status_bar), 1, temp); -     -    g_free(temp); -} - -static void hovering_over_text(MarkdownTextView *text_view, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -     -    gtk_statusbar_pop(GTK_STATUSBAR(hv->status_bar), 1); -} - -static void do_search(HelpViewer *hv, gchar *text) -{ -    GString *markdown; -    GDir *dir; -    gchar **terms; -    gint no_results = 0; -    int term; -     -    /* -     * FIXME: This search is currently pretty slow; think on a better way to do search.  -     * Ideas: -     * - Build a index the first time the help file is opened -     * - Search only titles and subtitles -     */ -     -    terms = g_strsplit(text, " ", 0); -    markdown = g_string_new("# Search Results\n"); -    g_string_append_printf(markdown, "Search terms: *%s*\n****\n", text); -     -    gtk_widget_set_sensitive(hv->window, FALSE); -     -    if ((dir = g_dir_open(hv->help_directory, 0, NULL))) { -        const gchar *name; -         -        while ((name = g_dir_read_name(dir))) { -#if GTK_CHECK_VERSION(2,16,0) -            gtk_entry_progress_pulse(GTK_ENTRY(hv->text_search)); -#endif	/* GTK_CHECK_VERSION(2,16,0) */ -             -            if (g_str_has_suffix(name, ".hlp")) { -                FILE *file; -                gchar *path; -                gchar buffer[256]; -                 -                path = g_build_filename(hv->help_directory, name, NULL); -                if ((file = fopen(path, "rb"))) { -                    gboolean found = FALSE; -                    gchar *title = NULL; -                     -                    while (!found && fgets(buffer, sizeof buffer, file)) { -                        if (!title && (g_str_has_prefix(buffer, "# ") || g_str_has_prefix(buffer, " # "))) { -                            title = g_strstrip(strchr(buffer, '#') + 1); -                            title = g_strdup(title); -                        } -                         -                        for (term = 0; !found && terms[term]; term++) { -#ifdef strcasestr -                            found = strcasestr(buffer, terms[term]) != NULL; -#else -                            gchar *upper1, *upper2; -                             -                            upper1 = g_utf8_strup(buffer, -1); -                            upper2 = g_utf8_strup(terms[term], -1); -                             -                            found = strstr(upper1, upper2) != NULL; -                             -                            g_free(upper1); -                            g_free(upper2); -#endif -                        } -                    } -                     -                    if (found) { -                        no_results++; -                         -                        if (title) { -                              g_string_append_printf(markdown, -                                                     "* [%s %s]\n", name, title); -                        } else { -                              g_string_append_printf(markdown, -                                                     "* [%s %s]\n", name, name); -                        } -                    } -                     -                    g_free(title); -                    fclose(file); -                } -                 -                g_free(path); -            } -        } -         -        g_dir_close(dir); -    } -     -     -    if (no_results == 0) { -        g_string_append_printf(markdown, -                               "Search returned no results."); -    } else { -        g_string_append_printf(markdown, -                               "****\n%d results found.", no_results); -    } -     -    /* shows the results inside the textview */ -    markdown_textview_set_text(MARKDOWN_TEXTVIEW(hv->text_view), markdown->str); - -    g_free(hv->current_file); -    hv->current_file = g_strdup_printf("search://%s", text); - -#if GTK_CHECK_VERSION(2,16,0) -    gtk_entry_set_progress_fraction(GTK_ENTRY(hv->text_search), 0.0f); -#endif	/* GTK_CHECK_VERSION(2,16,0) */ -    gtk_widget_set_sensitive(hv->window, TRUE); - -    g_string_free(markdown, TRUE); -    g_strfreev(terms); -} - -static void activate(GtkEntry *entry, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -     -    /* adds the current file to the back stack (before loading the new file */ -    hv->back_stack = g_slist_prepend(hv->back_stack, g_strdup(hv->current_file)); -    gtk_widget_set_sensitive(hv->btn_back, TRUE); - -    do_search((HelpViewer *)data, (gchar *)gtk_entry_get_text(entry)); -} - -#if GTK_CHECK_VERSION(2,16,0) -static void icon_press(GtkEntry *entry, gint position, -                       GdkEventButton *event, gpointer data) -{ -    if (position == GTK_ENTRY_ICON_SECONDARY) -        activate(entry, data); -} -#endif	/* GTK_CHECK_VERSION(2,16,0) */  - -static void home_clicked(GtkWidget *button, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -     -    help_viewer_open_page(hv, "index.hlp"); -} - -void help_viewer_open_page(HelpViewer *hv, const gchar *page) -{ -    gchar *temp; -     -    temp = g_strdup(hv->current_file); -     -    if (!markdown_textview_load_file(MARKDOWN_TEXTVIEW(hv->text_view), page)) { -        GtkWidget	*dialog; -        Shell		*shell; -         -        shell = shell_get_main_shell(); -        dialog = gtk_message_dialog_new(GTK_WINDOW(shell->window), -                                        GTK_DIALOG_DESTROY_WITH_PARENT, -                                        GTK_MESSAGE_ERROR, -                                        GTK_BUTTONS_CLOSE, -                                        "Cannot open help file (%s).", -                                        page); -        gtk_dialog_run(GTK_DIALOG(dialog)); -        gtk_widget_destroy(dialog); -         -        g_free(temp); -    } else { -        /* adds the current file to the back stack (before loading the new file */ -        hv->back_stack = g_slist_prepend(hv->back_stack, temp); -        gtk_widget_set_sensitive(hv->btn_back, TRUE); -        gtk_window_present(GTK_WINDOW(hv->window)); -    } -} - -void help_viewer_destroy(HelpViewer *hv) -{ -    Shell *shell; -    GSList *item; - -    for (item = hv->back_stack; item; item = item->next) { -        g_free(item->data); -    } - -    for (item = hv->forward_stack; item; item = item->next) { -        g_free(item->data); -    } -     -    g_slist_free(hv->back_stack); -    g_slist_free(hv->forward_stack); - -    g_free(hv->current_file); -    g_free(hv->help_directory); -     -    shell = shell_get_main_shell(); -    shell->help_viewer = NULL; -} - -static gboolean destroy_me(GtkWidget *widget, gpointer data) -{ -    HelpViewer *hv = (HelpViewer *)data; -     -    help_viewer_destroy(hv); - -    return FALSE; -} - -HelpViewer * -help_viewer_new (const gchar *help_dir, const gchar *help_file) -{ -    Shell *shell; -    HelpViewer *hv; -    GtkWidget *help_viewer; -    GtkWidget *vbox; -    GtkWidget *hbox; -    GtkWidget *toolbar1; -    GtkIconSize tmp_toolbar_icon_size; -    GtkWidget *btn_back; -    GtkWidget *btn_forward; -    GtkWidget *separatortoolitem1; -    GtkWidget *toolbar2; -    GtkWidget *toolitem3; -#if !GTK_CHECK_VERSION(2,16,0) -    GtkWidget *label1; -#endif	/* GTK_CHECK_VERSION(2,16,0) */ -    GtkWidget *toolitem4; -    GtkWidget *txt_search; -    GtkWidget *scrolledhelp_viewer; -    GtkWidget *markdown_textview; -    GtkWidget *status_bar; -    GtkWidget *btn_home; -    GdkPixbuf *icon; -     -    shell = shell_get_main_shell(); - -    help_viewer = gtk_window_new(GTK_WINDOW_TOPLEVEL); -    gtk_widget_set_size_request(help_viewer, 300, 200); -    gtk_window_set_default_size(GTK_WINDOW(help_viewer), 640, 480); -    gtk_window_set_title(GTK_WINDOW(help_viewer), "Help Viewer"); -    gtk_window_set_transient_for(GTK_WINDOW(help_viewer), GTK_WINDOW(shell->window)); -     -    icon = gtk_widget_render_icon(help_viewer, GTK_STOCK_HELP,  -                                  GTK_ICON_SIZE_DIALOG, -                                  NULL); -    gtk_window_set_icon(GTK_WINDOW(help_viewer), icon); -    g_object_unref(icon); -     -    vbox = gtk_vbox_new (FALSE, 0); -    gtk_widget_show (vbox); -    gtk_container_add (GTK_CONTAINER (help_viewer), vbox); - -    hbox = gtk_hbox_new (FALSE, 0); -    gtk_widget_show (hbox); -    gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0); - -    toolbar1 = gtk_toolbar_new (); -    gtk_widget_show (toolbar1); -    gtk_box_pack_start (GTK_BOX (hbox), toolbar1, TRUE, TRUE, 0); -    gtk_toolbar_set_style (GTK_TOOLBAR (toolbar1), GTK_TOOLBAR_BOTH_HORIZ); -    tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar1)); - -    btn_back = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-go-back"); -    gtk_widget_show (btn_back); -    gtk_container_add (GTK_CONTAINER (toolbar1), btn_back); -    gtk_tool_item_set_is_important (GTK_TOOL_ITEM (btn_back), TRUE); -    gtk_widget_set_sensitive(btn_back, FALSE); - -    btn_forward = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-go-forward"); -    gtk_widget_show (btn_forward); -    gtk_container_add (GTK_CONTAINER (toolbar1), btn_forward); -    gtk_widget_set_sensitive(btn_forward, FALSE); - -    separatortoolitem1 = (GtkWidget*) gtk_separator_tool_item_new (); -    gtk_widget_show (separatortoolitem1); -    gtk_container_add (GTK_CONTAINER (toolbar1), separatortoolitem1); - -    btn_home = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-home"); -    gtk_widget_show (btn_home); -    gtk_container_add (GTK_CONTAINER (toolbar1), btn_home); - -    toolbar2 = gtk_toolbar_new (); -    gtk_widget_show (toolbar2); -    gtk_box_pack_end (GTK_BOX (hbox), toolbar2, FALSE, TRUE, 0); -    gtk_toolbar_set_style (GTK_TOOLBAR (toolbar2), GTK_TOOLBAR_BOTH_HORIZ); -    gtk_toolbar_set_show_arrow (GTK_TOOLBAR (toolbar2), FALSE); -    tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (toolbar2)); - -    toolitem3 = (GtkWidget*) gtk_tool_item_new (); -    gtk_widget_show (toolitem3); -    gtk_container_add (GTK_CONTAINER (toolbar2), toolitem3); - -#if !GTK_CHECK_VERSION(2,16,0) -    label1 = gtk_label_new_with_mnemonic ("_Search:"); -    gtk_widget_show (label1); -    gtk_container_add (GTK_CONTAINER (toolitem3), label1); -#endif	/* GTK_CHECK_VERSION(2,16,0) */ - -    toolitem4 = (GtkWidget*) gtk_tool_item_new (); -    gtk_widget_show (toolitem4); -    gtk_container_add (GTK_CONTAINER (toolbar2), toolitem4); - -    txt_search = gtk_entry_new (); -    gtk_widget_show (txt_search); -    gtk_container_add (GTK_CONTAINER (toolitem4), txt_search); -    gtk_entry_set_invisible_char (GTK_ENTRY (txt_search), 9679); -#if GTK_CHECK_VERSION(2,16,0) -    gtk_entry_set_icon_from_stock(GTK_ENTRY(txt_search), -                                  GTK_ENTRY_ICON_SECONDARY, -                                  GTK_STOCK_FIND); -#endif	/* GTK_CHECK_VERSION(2,16,0) */ - -    scrolledhelp_viewer = gtk_scrolled_window_new (NULL, NULL); -    gtk_widget_show (scrolledhelp_viewer); -    gtk_box_pack_start (GTK_BOX (vbox), scrolledhelp_viewer, TRUE, TRUE, 0); -    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledhelp_viewer), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); - -    markdown_textview = markdown_textview_new(); -    markdown_textview_set_image_directory(MARKDOWN_TEXTVIEW(markdown_textview), help_dir); -    gtk_widget_show (markdown_textview); -    gtk_container_add (GTK_CONTAINER (scrolledhelp_viewer), markdown_textview); - -    status_bar = gtk_statusbar_new (); -    gtk_widget_show (status_bar); -    gtk_box_pack_start (GTK_BOX (vbox), status_bar, FALSE, FALSE, 0); - -    hv = g_new0(HelpViewer, 1); -    hv->window = help_viewer; -    hv->status_bar = status_bar; -    hv->btn_back = btn_back; -    hv->btn_forward = btn_forward; -    hv->text_view = markdown_textview; -    hv->text_search = txt_search; -    hv->help_directory = g_strdup(help_dir); -    hv->back_stack = NULL; -    hv->forward_stack = NULL; - -    g_signal_connect(markdown_textview, "link-clicked", G_CALLBACK(link_clicked), hv); -    g_signal_connect(markdown_textview, "hovering-over-link", G_CALLBACK(hovering_over_link), hv); -    g_signal_connect(markdown_textview, "hovering-over-text", G_CALLBACK(hovering_over_text), hv); -    g_signal_connect(markdown_textview, "file-load-complete", G_CALLBACK(file_load_complete), hv); - -    g_signal_connect(btn_back, "clicked", G_CALLBACK(back_clicked), hv); -    g_signal_connect(btn_forward, "clicked", G_CALLBACK(forward_clicked), hv); -    g_signal_connect(btn_home, "clicked", G_CALLBACK(home_clicked), hv); - -    g_signal_connect(help_viewer, "delete-event", G_CALLBACK(destroy_me), hv); -    g_signal_connect(txt_search, "activate", G_CALLBACK(activate), hv); - -#if GTK_CHECK_VERSION(2,16,0) -    g_signal_connect(txt_search, "icon-press", G_CALLBACK(icon_press), hv); -#endif	/* GTK_CHECK_VERSION(2,16,0) */ -                             -    if (!markdown_textview_load_file(MARKDOWN_TEXTVIEW(markdown_textview), help_file ? help_file : "index.hlp")) { -        GtkWidget	*dialog; - -        dialog = gtk_message_dialog_new(GTK_WINDOW(shell->window), -                                        GTK_DIALOG_DESTROY_WITH_PARENT, -                                        GTK_MESSAGE_ERROR, -                                        GTK_BUTTONS_CLOSE, -                                        "Cannot open help file (%s).", -                                        help_file ? help_file : "index.hlp"); -        gtk_dialog_run(GTK_DIALOG(dialog)); -        gtk_widget_destroy(dialog); -         -        gtk_widget_destroy(hv->window); -        g_free(hv); -         -        return NULL; -    } -     -    gtk_widget_show_all(hv->window); - -    return hv; -} - -#ifdef HELPVIEWER_TEST -int main(int argc, char **argv) -{ -    HelpViewer *hv; -     -    gtk_init(&argc, &argv); -     -    hv = help_viewer_new("documentation", NULL); -     -    gtk_main(); -} -#endif	/* HELPVIEWER_TEST */  | 
