gnome-utils r8269 - trunk/logview



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

Log:
First implementation of full-buffer search.

Modified:
   trunk/logview/logview.c

Modified: trunk/logview/logview.c
==============================================================================
--- trunk/logview/logview.c	(original)
+++ trunk/logview/logview.c	Tue Dec 23 13:26:41 2008
@@ -34,6 +34,7 @@
 #include "logview-manager.h"
 
 #define APP_NAME _("System Log Viewer")
+#define SEARCH_MARK "lw-search-mark"
 
 struct _LogviewWindowPrivate {
   GtkWidget *statusbar;
@@ -56,6 +57,7 @@
   LogviewManager *manager;
 
   gulong monitor_id;
+  guint search_timeout_id;
 };
 
 #define GET_PRIVATE(o) \
@@ -425,12 +427,66 @@
 }
 
 static void
+findbar_close_cb (LogviewFindbar *findbar,
+                  gpointer user_data)
+{
+  LogviewWindow *logview = user_data;
+
+  gtk_widget_hide (logview->priv->find_bar);
+}
+
+static void
+logview_search_text (LogviewWindow *logview, gboolean forward)
+{
+  GtkTextBuffer *buffer;
+  GtkTextMark *search_mark;
+  GtkTextIter start, start_m, end_m;
+  const char *text;
+  gboolean res;
+
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view));
+  search_mark = gtk_text_buffer_get_mark (buffer, SEARCH_MARK);
+
+  if (!search_mark) {
+    /* this is our first search on the buffer, create a new search mark */
+    gtk_text_buffer_get_start_iter (buffer, &start);
+    search_mark = gtk_text_buffer_create_mark (buffer, SEARCH_MARK,
+                                               &start, TRUE);
+  } else {
+    gtk_text_buffer_get_iter_at_mark (buffer, &start, search_mark);
+  }
+
+  text = logview_findbar_get_text (LOGVIEW_FINDBAR (logview->priv->find_bar));
+
+  if (forward) {
+    res = gtk_text_iter_forward_search (&start, text, 0, &start_m, &end_m, NULL);
+  } else {
+    res = gtk_text_iter_backward_search (&start, text, 0, &start_m, &end_m, NULL);
+  }
+
+  if (res) {
+    gtk_text_buffer_select_range (buffer, &start_m, &end_m);
+    gtk_text_buffer_move_mark (buffer, search_mark, &end_m);
+  } else {
+    GtkTextMark *mark;
+    GtkTextIter iter;
+
+    if (gtk_text_buffer_get_has_selection (buffer)) {
+      /* unselect */
+      mark = gtk_text_buffer_get_mark (buffer, "insert");
+      gtk_text_buffer_get_iter_at_mark (buffer, &iter, mark);
+      gtk_text_buffer_move_mark_by_name (buffer, "selection_bound", &iter);
+    }
+  }
+}
+
+static void
 findbar_previous_cb (LogviewFindbar *findbar,
                      gpointer user_data)
 {
   LogviewWindow *logview = user_data;
 
-  /* TODO: implement */
+  logview_search_text (logview, FALSE);
 }
 
 static void
@@ -439,16 +495,31 @@
 {
   LogviewWindow *logview = user_data;
 
-  /* TODO: implement */
+  logview_search_text (logview, TRUE);
 }
 
-static void
-findbar_close_cb (LogviewFindbar *findbar,
-                  gpointer user_data)
+static gboolean
+text_changed_timeout_cb (gpointer user_data)
 {
   LogviewWindow *logview = user_data;
+  GtkTextMark *search_mark;
+  GtkTextIter start;
+  GtkTextBuffer *buffer;
 
-  gtk_widget_hide (logview->priv->find_bar);
+  logview->priv->search_timeout_id = 0;
+
+  buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (logview->priv->text_view));
+  search_mark = gtk_text_buffer_get_mark (buffer, SEARCH_MARK);
+  
+  if (search_mark) {
+    /* reset the search mark to the start */
+    gtk_text_buffer_get_start_iter (buffer, &start);
+    gtk_text_buffer_move_mark (buffer, search_mark, &start);
+  }
+
+  logview_search_text (logview, TRUE);
+
+  return FALSE;
 }
 
 static void
@@ -458,7 +529,11 @@
 {
   LogviewWindow *logview = user_data;
 
-  /* TODO: implement */
+  if (logview->priv->search_timeout_id != 0) {
+    g_source_remove (logview->priv->search_timeout_id);
+  }
+
+  logview->priv->search_timeout_id = g_timeout_add (300, text_changed_timeout_cb, logview);
 }
 
 static void



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