gimp r26196 - in trunk: . plug-ins/help-browser



Author: neo
Date: Wed Jul 16 12:32:42 2008
New Revision: 26196
URL: http://svn.gnome.org/viewvc/gimp?rev=26196&view=rev

Log:
2008-07-16  Sven Neumann  <sven gimp org>

	* plug-ins/help-browser/dialog.c: applied patch from RÃman Joost
	as attached to bug #542826 (with some minor modifications). This
	adds a "Search in this page" feature bound to Ctrl-F.



Modified:
   trunk/ChangeLog
   trunk/plug-ins/help-browser/dialog.c

Modified: trunk/plug-ins/help-browser/dialog.c
==============================================================================
--- trunk/plug-ins/help-browser/dialog.c	(original)
+++ trunk/plug-ins/help-browser/dialog.c	Wed Jul 16 12:32:42 2008
@@ -4,6 +4,7 @@
  * GIMP Help Browser
  * Copyright (C) 1999-2008 Sven Neumann <sven gimp org>
  *                         Michael Natterer <mitch gimp org>
+ *                         RÃman Joost <romanofski gimp org>
  *
  * dialog.c
  *
@@ -26,16 +27,11 @@
 
 #include <stdlib.h>
 #include <string.h>
-#include <errno.h>
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-
-#include <glib/gstdio.h>
 
 #include <gtk/gtk.h>
 
+#include <gdk/gdkkeysyms.h>
+
 #include <webkit/webkit.h>
 
 #include "libgimpwidgets/gimpwidgets.h"
@@ -43,10 +39,6 @@
 #include "libgimp/gimp.h"
 #include "libgimp/gimpui.h"
 
-#ifdef G_OS_WIN32
-#include "libgimpbase/gimpwin32-io.h"
-#endif
-
 #include "plug-ins/help/gimphelp.h"
 
 #include "gimpthrobber.h"
@@ -57,10 +49,6 @@
 
 #include "libgimp/stdplugins-intl.h"
 
-#ifndef _O_BINARY
-#define _O_BINARY 0
-#endif
-
 
 #define GIMP_HELP_BROWSER_DIALOG_DATA      "gimp-help-browser-dialog"
 
@@ -84,59 +72,73 @@
 
 /*  local function prototypes  */
 
-static GtkUIManager * ui_manager_new     (GtkWidget         *window);
-
-static void       back_callback          (GtkAction         *action,
-                                          gpointer           data);
-static void       forward_callback       (GtkAction         *action,
-                                          gpointer           data);
-static void       reload_callback        (GtkAction         *action,
-                                          gpointer           data);
-static void       stop_callback          (GtkAction         *action,
-                                          gpointer           data);
-static void       home_callback          (GtkAction         *action,
-                                          gpointer           data);
-static void       copy_location_callback (GtkAction         *action,
-                                          gpointer           data);
-static void       show_index_callback    (GtkAction         *action,
-                                          gpointer           data);
-static void       zoom_in_callback       (GtkAction         *action,
-                                          gpointer           data);
-static void       zoom_out_callback      (GtkAction         *action,
-                                          gpointer           data);
-static void       close_callback         (GtkAction         *action,
-                                          gpointer           data);
-static void       website_callback       (GtkAction         *action,
-                                          gpointer           data);
-
-static void       update_actions         (void);
-
-static void       window_set_icons       (GtkWidget         *window);
-
-static void       row_activated          (GtkTreeView       *tree_view,
-                                          GtkTreePath       *path,
-                                          GtkTreeViewColumn *column);
-static void       dialog_unmap           (GtkWidget         *window,
-                                          GtkWidget         *paned);
-
-static void       view_realize           (GtkWidget         *widget);
-static void       view_unrealize         (GtkWidget         *widget);
-static gboolean   view_popup_menu        (GtkWidget         *widget,
-                                          GdkEventButton    *event);
-static gboolean   view_button_press      (GtkWidget         *widget,
-                                          GdkEventButton    *event);
-
-static void       title_changed          (GtkWidget         *view,
-                                          WebKitWebFrame    *frame,
-                                          const gchar       *title,
-                                          GtkWidget         *window);
-static void       load_started           (GtkWidget         *view,
-                                          WebKitWebFrame    *frame);
-static void       load_finished          (GtkWidget         *view,
-                                          WebKitWebFrame    *frame);
+static GtkUIManager * ui_manager_new      (GtkWidget         *window);
 
-static void       select_index           (const gchar       *uri);
+static GtkWidget * build_searchbar        (void);
 
+static void       back_callback           (GtkAction         *action,
+                                           gpointer           data);
+static void       forward_callback        (GtkAction         *action,
+                                           gpointer           data);
+static void       reload_callback         (GtkAction         *action,
+                                           gpointer           data);
+static void       stop_callback           (GtkAction         *action,
+                                           gpointer           data);
+static void       home_callback           (GtkAction         *action,
+                                           gpointer           data);
+static void       find_callback           (GtkAction         *action,
+                                           gpointer           data);
+static void       copy_location_callback  (GtkAction         *action,
+                                           gpointer           data);
+static void       show_index_callback     (GtkAction         *action,
+                                           gpointer           data);
+static void       zoom_in_callback        (GtkAction         *action,
+                                           gpointer           data);
+static void       zoom_out_callback       (GtkAction         *action,
+                                           gpointer           data);
+static void       close_callback          (GtkAction         *action,
+                                           gpointer           data);
+static void       website_callback        (GtkAction         *action,
+                                           gpointer           data);
+
+static void       update_actions          (void);
+
+static void       window_set_icons        (GtkWidget         *window);
+
+static void       row_activated           (GtkTreeView       *tree_view,
+                                           GtkTreePath       *path,
+                                           GtkTreeViewColumn *column);
+static void       dialog_unmap            (GtkWidget         *window,
+                                           GtkWidget         *paned);
+
+static void       view_realize            (GtkWidget         *widget);
+static void       view_unrealize          (GtkWidget         *widget);
+static gboolean   view_popup_menu         (GtkWidget         *widget,
+                                           GdkEventButton    *event);
+static gboolean   view_button_press       (GtkWidget         *widget,
+                                           GdkEventButton    *event);
+
+static void       title_changed           (GtkWidget         *view,
+                                           WebKitWebFrame    *frame,
+                                           const gchar       *title,
+                                           GtkWidget         *window);
+static void       load_started            (GtkWidget         *view,
+                                           WebKitWebFrame    *frame);
+static void       load_finished           (GtkWidget         *view,
+                                           WebKitWebFrame    *frame);
+
+static void       select_index            (const gchar       *uri);
+
+static void       search_entry_changed    (GtkWidget         *entry);
+static gboolean   search_entry_key_press  (GtkWidget         *entry,
+                                           GdkEventKey       *event);
+static void       search_prev_clicked     (GtkWidget         *button,
+					   GtkWidget         *entry);
+static void       search_next_clicked     (GtkWidget         *button,
+					   GtkWidget         *entry);
+static void       search_close_clicked    (GtkWidget         *button);
+static void       search                  (const gchar       *text,
+                                           gboolean           forward);
 
 
 /*  private variables  */
@@ -145,6 +147,7 @@
 
 static GtkWidget    *view           = NULL;
 static GtkWidget    *sidebar        = NULL;
+static GtkWidget    *searchbar      = NULL;
 static GtkWidget    *tree_view      = NULL;
 static GtkUIManager *ui_manager     = NULL;
 static GtkWidget    *button_prev    = NULL;
@@ -158,6 +161,7 @@
 browser_dialog_open (void)
 {
   GtkWidget   *window;
+  GtkWidget   *main_vbox;
   GtkWidget   *vbox;
   GtkWidget   *toolbar;
   GtkWidget   *paned;
@@ -256,12 +260,16 @@
                     NULL);
 
   /*  HTML view  */
+  main_vbox = gtk_vbox_new (FALSE, 0);
+  gtk_widget_show (main_vbox);
+  gtk_paned_pack2 (GTK_PANED (paned), main_vbox, TRUE, TRUE);
+
   scrolled = gtk_scrolled_window_new (NULL, NULL);
   gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled),
                                   GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
   gtk_widget_set_size_request (scrolled, 300, 200);
-  gtk_paned_add2 (GTK_PANED (paned), scrolled);
+  gtk_box_pack_start (GTK_BOX (main_vbox), scrolled, TRUE, TRUE, 0);
   gtk_widget_show (scrolled);
 
   view = webkit_web_view_new ();
@@ -306,6 +314,10 @@
                     paned);
 
   update_actions ();
+
+  /* Searchbar */
+  searchbar = build_searchbar ();
+  gtk_box_pack_start (GTK_BOX (main_vbox), searchbar, FALSE, FALSE, 0);
 }
 
 void
@@ -566,6 +578,11 @@
       G_CALLBACK (home_callback)
     },
     {
+      "find", GTK_STOCK_FIND,
+      NULL, "<control>F", N_("Find Text in current page"),
+      G_CALLBACK (find_callback)
+    },
+    {
       "copy-location", GTK_STOCK_COPY,
       N_("C_opy location"), "",
       N_("Copy the location of this page to the clipboard"),
@@ -664,6 +681,7 @@
                                      "    <menuitem action=\"stop\" />"
                                      "    <separator />"
                                      "    <menuitem action=\"home\" />"
+                                     "    <menuitem action=\"find\" />"
                                      "    <menuitem action=\"copy-location\" />"
                                      "    <menuitem action=\"show-index\" />"
 #ifdef HAVE_WEBKIT_ZOOM_API
@@ -735,6 +753,15 @@
 }
 
 static void
+find_callback (GtkAction *action,
+               gpointer   data)
+{
+  gtk_widget_show (searchbar);
+  gtk_widget_grab_focus (g_object_get_data (G_OBJECT (searchbar), "entry"));
+}
+
+
+static void
 copy_location_callback (GtkAction *action,
                         gpointer   data)
 {
@@ -1047,3 +1074,120 @@
 
   select_index (webkit_web_frame_get_uri (frame));
 }
+
+static GtkWidget *
+build_searchbar (void)
+{
+  GtkWidget *button;
+  GtkWidget *image;
+  GtkWidget *entry;
+  GtkWidget *hbox;
+  GtkWidget *label;
+
+  hbox = gtk_hbox_new (FALSE, 6);
+
+  label = gtk_label_new (_("Find:"));
+  gtk_widget_show (label);
+  gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+
+  entry = gtk_entry_new ();
+  gtk_widget_show (entry);
+  gtk_box_pack_start (GTK_BOX (hbox), entry, TRUE, TRUE, 0);
+  g_object_set_data (G_OBJECT (hbox), "entry", entry);
+
+  g_signal_connect (entry, "changed",
+                    G_CALLBACK (search_entry_changed),
+                    NULL);
+
+  g_signal_connect (entry, "key-press-event",
+                    G_CALLBACK (search_entry_key_press),
+                    NULL);
+
+  button = gtk_button_new_with_mnemonic (_("_Previous"));
+  gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+  gtk_button_set_image (GTK_BUTTON (button),
+                        gtk_image_new_from_stock (GTK_STOCK_GO_BACK,
+                                                  GTK_ICON_SIZE_BUTTON));
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+
+  g_signal_connect (button, "clicked",
+                    G_CALLBACK (search_prev_clicked),
+                    entry);
+
+  button = gtk_button_new_with_mnemonic (_("_Next"));
+  gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+  gtk_button_set_image (GTK_BUTTON (button),
+                        gtk_image_new_from_stock (GTK_STOCK_GO_FORWARD,
+                                                  GTK_ICON_SIZE_BUTTON));
+  gtk_widget_show (button);
+  gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+
+  g_signal_connect (button, "clicked",
+                    G_CALLBACK (search_next_clicked),
+                    entry);
+
+  button = gtk_button_new_from_stock (GTK_STOCK_CLOSE);
+  gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
+
+  g_object_get (button, "image", &image, NULL);
+  g_object_set (image, "icon-size", GTK_ICON_SIZE_MENU, NULL);
+  g_object_unref (image);
+
+  gtk_widget_show (button);
+  gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+
+  g_signal_connect (button, "clicked",
+                    G_CALLBACK (search_close_clicked),
+                    NULL);
+
+  return hbox;
+}
+
+static void
+search_entry_changed (GtkWidget *entry)
+{
+  search (gtk_entry_get_text (GTK_ENTRY (entry)), TRUE);
+}
+
+static gboolean
+search_entry_key_press (GtkWidget   *entry,
+			GdkEventKey *event)
+{
+  if (event->keyval == GDK_Escape)
+    {
+      gtk_widget_hide (searchbar);
+      return TRUE;
+    }
+
+  return FALSE;
+}
+
+static void
+search_prev_clicked (GtkWidget *button,
+		     GtkWidget *entry)
+{
+  search (gtk_entry_get_text (GTK_ENTRY (entry)), FALSE);
+}
+
+static void
+search_next_clicked (GtkWidget *button,
+		     GtkWidget *entry)
+{
+  search (gtk_entry_get_text (GTK_ENTRY (entry)), TRUE);
+}
+
+static void
+search (const gchar *text,
+	gboolean     forward)
+{
+  if (text)
+    webkit_web_view_search_text (WEBKIT_WEB_VIEW (view),
+				 text, FALSE, forward, TRUE);
+}
+
+static void
+search_close_clicked (GtkWidget *button)
+{
+  gtk_widget_hide (searchbar);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]