gnome-utils r8259 - trunk/logview



Author: cosimoc
Date: Tue Dec 23 13:26:24 2008
New Revision: 8259
URL: http://svn.gnome.org/viewvc/gnome-utils?rev=8259&view=rev

Log:
Add a first implementation of a find bar.

Modified:
   trunk/logview/Makefile.am
   trunk/logview/logview-findbar.c
   trunk/logview/logview-findbar.h
   trunk/logview/logview.c

Modified: trunk/logview/Makefile.am
==============================================================================
--- trunk/logview/Makefile.am	(original)
+++ trunk/logview/Makefile.am	Tue Dec 23 13:26:24 2008
@@ -34,6 +34,8 @@
 	logview.h		\
 	logview-log.h		\
 	logview-log.c		\
+	logview-findbar.h	\
+	logview-findbar.c	\
 	misc.c			\
 	misc.h			\
 	logview-prefs.c		\

Modified: trunk/logview/logview-findbar.c
==============================================================================
--- trunk/logview/logview-findbar.c	(original)
+++ trunk/logview/logview-findbar.c	Tue Dec 23 13:26:24 2008
@@ -1,6 +1,6 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
 /*
  * Copyright (C) 2005 Vincent Noel <vnoel cox net>
+ * Copyright (C) 2008 Cosimo Cecchi <cosimoc gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -17,165 +17,208 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#include <string.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 
-#include "logview.h"
 #include "logview-findbar.h"
 
-struct LogviewFindBarPriv
-{
-	GtkWidget *entry;
-	GtkWidget *clear_button;
-	gchar *search_string;
-	gpointer logview;
+struct _LogviewFindbarPrivate {
+  GtkWidget *entry;
+
+  GtkToolItem *clear_button;
+  GtkToolItem *back_button;
+  GtkToolItem *forward_button;
+  
+  char *string;
 };
 
-G_DEFINE_TYPE (LogviewFindBar, logview_findbar, GTK_TYPE_HBOX);
-#define LOGVIEW_FINDBAR_GET_PRIVATE(o)  \
-   (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_FINDBAR_TYPE, LogviewFindBarPriv))
+enum {
+  PREVIOUS,
+  NEXT,
+  TEXT_CHANGED,
+  LAST_SIGNAL
+};
 
+static guint signals[LAST_SIGNAL] = { 0 };
 
-static gboolean
-iter_is_visible (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
-{
-	LogviewFindBar *findbar = LOGVIEW_FINDBAR (data);
-	gboolean found = FALSE;
-	gchar *message;
-	gpointer day;
+G_DEFINE_TYPE (LogviewFindbar, logview_findbar, GTK_TYPE_TOOLBAR);
 
-	gtk_tree_model_get (model, iter, 0, &message, 1, &day, -1);
-	if (day)
-		return TRUE;
-	if (message)
-		found = (g_strstr_len (message, -1, findbar->priv->search_string) != NULL);
-	return found;
-}
+#define GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_FINDBAR, LogviewFindbarPrivate))
 
 static void
-logview_findbar_clear (GtkWidget *widget, gpointer data)
+back_button_clicked_cb (GtkToolButton *button,
+                        gpointer user_data)
 {
-	LogviewFindBar *findbar = LOGVIEW_FINDBAR (data);
-	LogviewWindow *logview = LOGVIEW_WINDOW (findbar->priv->logview);
-	Log *log = logview->curlog;
-
-	if (log==NULL || log->filter == NULL)
- 		return;
+  LogviewFindbar *findbar = user_data;
 
-	gtk_entry_set_text (GTK_ENTRY (findbar->priv->entry), "");
-	gtk_widget_hide (GTK_WIDGET (findbar));
+  g_signal_emit (findbar, signals[PREVIOUS], 0);
 }
-	
-static  gboolean
-logview_findbar_entry_timeout (gpointer data)
-{
-	LogviewFindBar *findbar = LOGVIEW_FINDBAR (data);
-	LogviewWindow *logview = LOGVIEW_WINDOW (findbar->priv->logview);
-	Log *log = logview->curlog;
-	GdkCursor *cursor;
 
-	cursor = gdk_cursor_new (GDK_WATCH);
-	gdk_window_set_cursor (GTK_WIDGET (logview)->window, cursor);
-	gdk_cursor_unref (cursor);
-	gdk_display_flush (gtk_widget_get_display (GTK_WIDGET (logview)));
-	
-	if (log->filter == NULL) {
-
-		log->filter = GTK_TREE_MODEL_FILTER (gtk_tree_model_filter_new (log->model, NULL));
-		gtk_tree_model_filter_set_visible_func (log->filter, iter_is_visible, findbar, NULL);
-		gtk_tree_view_set_model (GTK_TREE_VIEW (logview->view), GTK_TREE_MODEL (log->filter));
+static void
+forward_button_clicked_cb (GtkToolButton *button,
+                           gpointer user_data)
+{
+  LogviewFindbar *findbar = user_data;
 
-	} else {
-		gtk_tree_model_filter_refilter (log->filter);
-	}
+  g_signal_emit (findbar, signals[NEXT], 0);
+}
 
-	gtk_tree_view_expand_all (GTK_TREE_VIEW (logview->view));
+static void
+clear_button_clicked_cb (GtkToolButton *button,
+                         gpointer user_data)
+{
+  /* TODO: implement */
+}
 
-	gdk_window_set_cursor (GTK_WIDGET (logview)->window, NULL);
-	gdk_display_flush (gtk_widget_get_display (GTK_WIDGET (logview)));
+static void
+entry_activate_cb (GtkWidget *entry,
+                   gpointer user_data)
+{
+  LogviewFindbar *findbar = user_data;
 
-	return FALSE;
+  g_signal_emit (findbar, signals[NEXT], 0);
 }
-	
 
 static void
-logview_findbar_entry_changed_cb (GtkEditable *editable,
-				  gpointer     data)
+entry_changed_cb (GtkEditable *editable,
+                  gpointer user_data)
 {
-	LogviewFindBar *findbar = LOGVIEW_FINDBAR (data);
-	LogviewWindow *logview = LOGVIEW_WINDOW (findbar->priv->logview);
-	Log *log = logview->curlog;
-	gchar *search_string;    
+  LogviewFindbar *findbar = user_data;
+  const char *text;
 
-	search_string = g_strdup (gtk_entry_get_text (GTK_ENTRY (findbar->priv->entry)));
-	
-	if (strlen (search_string) == 0 && log->filter != NULL) {
-		g_object_unref (log->filter);
-		log->filter = NULL;
-		logview_repaint (logview);
-		return;
-	}
+  text = gtk_entry_get_text (GTK_ENTRY (editable));
 
-	if (strlen (search_string) < 3) 
-		return;
+  if (g_strcmp0 (findbar->priv->string, text) != 0) {
+    g_free (findbar->priv->string);
+    findbar->priv->string = g_strdup (text);
+  }
 
-	findbar->priv->search_string = search_string;
-
-	g_timeout_add (500, (GSourceFunc) logview_findbar_entry_timeout, findbar);
+  g_signal_emit (findbar, signals[TEXT_CHANGED], 0, findbar->priv->string, NULL);
 }
 
-void
-logview_findbar_grab_focus (LogviewFindBar *findbar)
+static void 
+logview_findbar_init (LogviewFindbar *findbar)
 {
-	g_return_if_fail (LOGVIEW_IS_FINDBAR (findbar));
-	gtk_widget_grab_focus (findbar->priv->entry);
+  GtkWidget *label, *button, *w, *box;
+  GtkToolbar *gtoolbar;
+  GtkToolItem *item;
+  LogviewFindbarPrivate *priv;
+  
+  priv = findbar->priv = GET_PRIVATE (findbar);
+
+  gtoolbar = GTK_TOOLBAR (findbar);
+
+  gtk_toolbar_set_style (gtoolbar, GTK_TOOLBAR_BOTH_HORIZ);
+
+  /* Find: |_______| */
+  w = gtk_alignment_new (0.0, 0.5, 1.0, 1.0);
+  gtk_alignment_set_padding (GTK_ALIGNMENT (w), 0, 0, 2, 2);
+
+  box = gtk_hbox_new (FALSE, 12);
+  gtk_container_add (GTK_CONTAINER (w), box);
+
+  label = gtk_label_new_with_mnemonic (_("_Find:"));
+  gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);
+
+  priv->entry = gtk_entry_new ();
+  gtk_entry_set_width_chars (GTK_ENTRY (priv->entry), 32);
+  gtk_label_set_mnemonic_widget (GTK_LABEL (label), priv->entry);
+  gtk_box_pack_start (GTK_BOX (box), priv->entry, TRUE, TRUE, 0);
+
+  item = gtk_tool_item_new ();
+  gtk_container_add (GTK_CONTAINER (item), w);
+  gtk_toolbar_insert (gtoolbar, item, -1);
+  gtk_widget_show_all (GTK_WIDGET (item));
+
+  /* "Previous" and "Next" buttons */
+  w = gtk_arrow_new (GTK_ARROW_LEFT, GTK_SHADOW_NONE);
+  priv->back_button = gtk_tool_button_new (w, _("Find Previous"));
+  gtk_tool_item_set_is_important (priv->back_button, TRUE);
+  gtk_tool_item_set_tooltip_text (priv->back_button,
+                                 _("Find previous occurrence of the search string"));
+  gtk_toolbar_insert (gtoolbar, priv->back_button, -1);
+  gtk_widget_show_all (GTK_WIDGET (priv->back_button));
+
+  w = gtk_arrow_new (GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
+  priv->forward_button = gtk_tool_button_new (w, _("Find Next"));
+  gtk_tool_item_set_is_important (priv->forward_button, TRUE);
+  gtk_tool_item_set_tooltip_text (priv->forward_button,
+                                 _("Find next occurrence of the search string"));
+  gtk_toolbar_insert (gtoolbar, priv->forward_button, -1);
+  gtk_widget_show_all (GTK_WIDGET (priv->forward_button));
+
+  /* clear button */
+  priv->clear_button = gtk_tool_button_new_from_stock (GTK_STOCK_CLEAR);
+  gtk_tool_item_set_tooltip_text (priv->clear_button,
+                                 _("Clear the search string"));
+  gtk_toolbar_insert (gtoolbar, priv->clear_button, -1);
+  gtk_widget_show_all (GTK_WIDGET (priv->clear_button));
+
+  priv->string = NULL;
+
+  /* signal handlers */
+  g_signal_connect (priv->back_button, "clicked",
+                    G_CALLBACK (back_button_clicked_cb), findbar);
+  g_signal_connect (priv->forward_button, "clicked",
+                    G_CALLBACK (forward_button_clicked_cb), findbar);
+  g_signal_connect (priv->clear_button, "clicked",
+                    G_CALLBACK (clear_button_clicked_cb), findbar);
+  g_signal_connect (priv->entry, "activate",
+                    G_CALLBACK (entry_activate_cb), findbar);
+  g_signal_connect (priv->entry, "changed",
+                    G_CALLBACK (entry_changed_cb), findbar);
 }
 
-void
-logview_findbar_connect (LogviewFindBar *findbar, LogviewWindow *logview)
+static void
+do_finalize (GObject *obj)
 {
-	findbar->priv->logview = logview;
+  LogviewFindbar *findbar = LOGVIEW_FINDBAR (obj);
+
+  g_free (findbar->priv->string);
 
-	g_signal_connect (G_OBJECT (findbar->priv->entry), "changed",
-			  G_CALLBACK (logview_findbar_entry_changed_cb), findbar);
-	g_signal_connect (G_OBJECT (findbar->priv->clear_button), "clicked",
-			  G_CALLBACK (logview_findbar_clear), findbar);
+  G_OBJECT_CLASS (logview_findbar_parent_class)->finalize (obj);
 }
 
-static void 
-logview_findbar_init (LogviewFindBar *findbar)
+static void
+logview_findbar_class_init (LogviewFindbarClass *klass)
 {
-	GtkWidget *label, *button;
-
-	findbar->priv = LOGVIEW_FINDBAR_GET_PRIVATE (findbar);
-
-	gtk_container_set_border_width (GTK_CONTAINER (findbar), 3);
+  GObjectClass *oclass = G_OBJECT_CLASS (klass);
 
-	label = gtk_label_new_with_mnemonic (_("_Filter:"));
-	
-	findbar->priv->entry = gtk_entry_new ();
-	gtk_label_set_mnemonic_widget (GTK_LABEL (label), findbar->priv->entry);
-	
-	findbar->priv->clear_button = gtk_button_new_with_mnemonic (_("_Clear"));
-	
-	gtk_box_pack_start (GTK_BOX (findbar), label, FALSE, FALSE, 0);
-	gtk_box_pack_start (GTK_BOX (findbar), findbar->priv->entry, FALSE, FALSE, 0);
-	gtk_box_pack_start (GTK_BOX (findbar), findbar->priv->clear_button, FALSE, FALSE, 0);
+  oclass->finalize = do_finalize;
 
-	findbar->priv->search_string = NULL;
-}
+  signals[PREVIOUS] = g_signal_new ("previous",
+                                    G_OBJECT_CLASS_TYPE (oclass),
+                                    G_SIGNAL_RUN_FIRST,
+                                    G_STRUCT_OFFSET (LogviewFindbarClass, previous),
+                                    NULL, NULL,
+                                    g_cclosure_marshal_VOID__VOID,
+                                    G_TYPE_NONE, 0);
+
+  signals[NEXT] = g_signal_new ("next",
+                                G_OBJECT_CLASS_TYPE (oclass),
+                                G_SIGNAL_RUN_FIRST,
+                                G_STRUCT_OFFSET (LogviewFindbarClass, next),
+                                NULL, NULL,
+                                g_cclosure_marshal_VOID__VOID,
+                                G_TYPE_NONE, 0);
+
+  signals[TEXT_CHANGED] = g_signal_new ("text-changed",
+                                        G_OBJECT_CLASS_TYPE (oclass),
+                                        G_SIGNAL_RUN_FIRST,
+                                        G_STRUCT_OFFSET (LogviewFindbarClass, text_changed),
+                                        NULL, NULL,
+                                        g_cclosure_marshal_VOID__STRING,
+                                        G_TYPE_NONE,
+                                        1, G_TYPE_STRING);
 
-static void
-logview_findbar_class_init (LogviewFindBarClass *klass)
-{
-	g_type_class_add_private (klass, sizeof (LogviewFindBarPriv));
+  g_type_class_add_private (klass, sizeof (LogviewFindbarPrivate));
 }
 
 GtkWidget *
 logview_findbar_new (void)
 {
-    GtkWidget *widget;
-    widget = g_object_new (LOGVIEW_FINDBAR_TYPE, NULL);
-    return widget;
+  GtkWidget *widget;
+  widget = g_object_new (LOGVIEW_TYPE_FINDBAR, NULL);
+  return widget;
 }

Modified: trunk/logview/logview-findbar.h
==============================================================================
--- trunk/logview/logview-findbar.h	(original)
+++ trunk/logview/logview-findbar.h	Tue Dec 23 13:26:24 2008
@@ -1,6 +1,6 @@
-/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
 /*
  * Copyright (C) 2004 Vincent Noel <vnoel cox net>
+ * Copyright (C) 2008 Cosimo Cecchi <cosimoc gnome org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
@@ -17,40 +17,52 @@
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  */
 
-#ifndef __LOG_FINDBAR_H__
-#define __LOG_FINDBAR_H__
+#ifndef __LOGVIEW_FINDBAR_H__
+#define __LOGVIEW_FINDBAR_H__
 
 #include <gtk/gtk.h>
+#include <glib-object.h>
 
 G_BEGIN_DECLS
 
-#define LOGVIEW_FINDBAR_TYPE		  (logview_findbar_get_type ())
-#define LOGVIEW_FINDBAR(obj)		  (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGVIEW_FINDBAR_TYPE, LogviewFindBar))
-#define LOGVIEW_FINDBAR_CLASS(klass)	  (G_TYPE_CHECK_CLASS_CAST ((klass), LOGVIEW_FINDBAR_TYPE, LogviewFindBarClass))
-#define LOGVIEW_IS_FINDBAR(obj)	          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGVIEW_FINDBAR_TYPE))
-#define LOGVIEW_IS_FINDBAR_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((obj), LOGVIEW_FINDBAR_TYPE))
-#define LOGVIEW_FINDBAR_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGVIEW_FINDBAR_TYPE, LogviewFindBarClass))
-
-typedef struct LogviewFindBarPriv LogviewFindBarPriv;
-
-typedef struct LogviewFindBar
-{	
-	GtkHBox parent_instance;
-	LogviewFindBarPriv *priv;
-}LogviewFindBar;
-
-typedef struct LogviewFindBarClass
-{
-	GtkHBoxClass parent_class;
-}LogviewFindBarClass;
+#define LOGVIEW_TYPE_FINDBAR \
+  (logview_findbar_get_type ())
+#define LOGVIEW_FINDBAR(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGVIEW_TYPE_FINDBAR, LogviewFindbar))
+#define LOGVIEW_FINDBAR_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST ((klass), LOGVIEW_TYPE_FINDBAR, LogviewFindbarClass))
+#define LOGVIEW_IS_FINDBAR(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGVIEW_TYPE_FINDBAR))
+#define LOGVIEW_IS_FINDBAR_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE ((obj), LOGVIEW_TYPE_FINDBAR))
+#define LOGVIEW_FINDBAR_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGVIEW_TYPE_FINDBAR, LogviewFindbarClass))
+
+typedef struct _LogviewFindbar LogviewFindbar;
+typedef struct _LogviewFindbarClass LogviewFindbarClass;
+typedef struct _LogviewFindbarPrivate LogviewFindbarPrivate;
+
+struct _LogviewFindbar {
+  GtkToolbar parent_instance;
+  LogviewFindbarPrivate *priv;
+};
+
+struct _LogviewFindbarClass {
+  GtkToolbarClass parent_class;
+
+  /* signals */
+  void (* previous)     (LogviewFindbar *findbar);
+  void (* next)         (LogviewFindbar *findbar);
+  void (* text_changed) (LogviewFindbar *findbar,
+                         const char * new_text);
+};
 
 GType logview_findbar_get_type (void);
-GtkWidget *logview_findbar_new (void);
-void logview_findbar_connect (LogviewFindBar *findbar, LogviewWindow *logview);
-void logview_findbar_update_visibility (LogviewFindBar *findbar, LogviewWindow *logview);
-void logview_findbar_grab_focus (LogviewFindBar *findbar);
 
-G_END_DECLS
+/* public methods */
+GtkWidget *  logview_findbar_new (void);
+const char * logview_findbar_get_text (LogviewFindbar *findbar);
 
-#endif /* __LOG_FINDBAR_H__ */
+G_END_DECLS
 
+#endif /* __LOGVIEW_FINDBAR_H__ */

Modified: trunk/logview/logview.c
==============================================================================
--- trunk/logview/logview.c	(original)
+++ trunk/logview/logview.c	Tue Dec 23 13:26:24 2008
@@ -28,9 +28,7 @@
 #include "logview-loglist.h"
 #include "misc.h"
 
-/*
 #include "logview-findbar.h"
-*/
 #include "logview-about.h"
 #include "logview-prefs.h"
 #include "logview-manager.h"
@@ -450,10 +448,9 @@
 logview_search (GtkAction *action, LogviewWindow *logview)
 {
   g_assert (LOGVIEW_IS_WINDOW (logview));
-/*
-  gtk_widget_show_all (logview->priv->find_bar);
-  logview_findbar_grab_focus (LOGVIEW_FINDBAR (logview->priv->find_bar));
-*/
+
+  gtk_widget_show (logview->priv->find_bar);
+//  logview_findbar_grab_focus (LOGVIEW_FINDBAR (logview->priv->find_bar));
 }
 
 void
@@ -830,11 +827,10 @@
   gtk_box_pack_end (GTK_BOX (priv->version_bar), w, FALSE, FALSE, 0);
   gtk_box_pack_end (GTK_BOX (main_view), priv->version_bar, FALSE, FALSE, 0);
 
-/*
+
   priv->find_bar = logview_findbar_new ();
   gtk_box_pack_end (GTK_BOX (main_view), priv->find_bar, FALSE, FALSE, 0);
-  logview_findbar_connect (LOGVIEW_FINDBAR (priv->find_bar), logview);
-*/
+
   /* remember the original font size */
   context = gtk_widget_get_pango_context (priv->text_view);
   fontdesc = pango_context_get_font_description (context);



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