gnome-utils r8513 - trunk/logview



Author: cosimoc
Date: Wed Mar 18 11:34:35 2009
New Revision: 8513
URL: http://svn.gnome.org/viewvc/gnome-utils?rev=8513&view=rev

Log:
Add LogviewFilter and LogviewFilterManager.


Added:
   trunk/logview/logview-filter-manager.c
   trunk/logview/logview-filter-manager.h
   trunk/logview/logview-filter.c
   trunk/logview/logview-filter.h

Added: trunk/logview/logview-filter-manager.c
==============================================================================
--- (empty file)
+++ trunk/logview/logview-filter-manager.c	Wed Mar 18 11:34:35 2009
@@ -0,0 +1,572 @@
+/*-*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/*
+ * gnome-utils
+ * Copyright (C) Johannes Schmid 2009 <jhs gnome org>
+ *
+ * gnome-utils 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, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * gnome-utils 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "logview-filter-manager.h"
+#include "logview-prefs.h"
+#include <gtk/gtk.h>
+#include <string.h>
+#include <glib/gi18n.h>
+
+#define UI_FILE LOGVIEW_DATADIR "/logview-filter.ui"
+
+struct _LogviewFilterManagerPrivate {
+  GtkWidget *tree;
+
+  GtkWidget *add_button;
+  GtkWidget *remove_button;
+  GtkWidget *edit_button;
+
+  GtkTreeModel *model;
+  GtkBuilder* builder;
+
+  LogviewPrefs* prefs;
+};
+
+enum {
+  COLUMN_NAME = 0,
+  COLUMN_FILTER,
+  N_COLUMNS
+};
+
+#define LOGVIEW_FILTER_MANAGER_GET_PRIVATE(o)  \
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_FILTER_MANAGER, LogviewFilterManagerPrivate))
+
+G_DEFINE_TYPE (LogviewFilterManager, logview_filter_manager, GTK_TYPE_DIALOG);
+
+static void
+logview_filter_manager_update_model (LogviewFilterManager *manager)
+{
+  GList *filters;
+  GList *filter;
+  gchar *name;
+  GtkTreeIter iter;
+
+  gtk_list_store_clear (GTK_LIST_STORE (manager->priv->model));
+
+  filters = logview_prefs_get_filters (manager->priv->prefs);  
+
+  for (filter = filters; filter != NULL; filter = g_list_next (filter)) {
+    g_object_get (filter->data, "name", &name, NULL);
+
+    gtk_list_store_append (GTK_LIST_STORE(manager->priv->model), &iter);
+    gtk_list_store_set (GTK_LIST_STORE (manager->priv->model),
+                        &iter,
+                        COLUMN_NAME, name,
+                        COLUMN_FILTER, filter->data,
+                        -1);
+
+    g_free (name);
+  }
+
+  g_list_free (filters);  
+}
+
+static gboolean
+check_name (LogviewFilterManager *manager, const gchar *name)
+{
+  GtkWidget *dialog;
+
+  if (!strlen (name)) {
+    dialog = gtk_message_dialog_new (GTK_WINDOW (manager),
+                                     GTK_DIALOG_MODAL,
+                                     GTK_MESSAGE_ERROR,
+                                     GTK_BUTTONS_CLOSE,
+                                     "%s", _("Filter name is empty!"));
+    gtk_dialog_run (GTK_DIALOG (dialog));
+
+    gtk_widget_destroy (dialog);
+
+    return FALSE;
+  }
+
+  if (strstr (name, ":") != NULL) {
+    dialog = gtk_message_dialog_new (GTK_WINDOW(manager),
+                                     GTK_DIALOG_MODAL,
+                                     GTK_MESSAGE_ERROR,
+                                     GTK_BUTTONS_CLOSE,
+                                     "%s", _("Filter name may not contain the ':' character"));
+    gtk_dialog_run (GTK_DIALOG (dialog));
+
+    gtk_widget_destroy (dialog);
+
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+static gboolean
+check_regex (LogviewFilterManager *manager, const gchar *regex)
+{
+  GtkWidget *dialog;
+  GError *error = NULL;
+  GRegex *reg;
+
+  if (!strlen (regex)) {
+    dialog = gtk_message_dialog_new (GTK_WINDOW(manager),
+                                     GTK_DIALOG_MODAL,
+                                     GTK_MESSAGE_ERROR,
+                                     GTK_BUTTONS_CLOSE,
+                                     "%s", _("Regular expression is empty!"));
+
+    gtk_dialog_run (GTK_DIALOG (dialog));
+
+    gtk_widget_destroy (dialog);
+
+    return FALSE;
+  }
+
+  reg = g_regex_new (regex,
+                     0, 0, &error);
+  if (error) {
+    dialog = gtk_message_dialog_new (GTK_WINDOW (manager),
+                                     GTK_DIALOG_MODAL,
+                                     GTK_MESSAGE_ERROR,
+                                     GTK_BUTTONS_CLOSE,
+                                     _("Regular expression is invalid: %s"),
+                                     error->message);
+    gtk_dialog_run (GTK_DIALOG (dialog));
+
+    gtk_widget_destroy (dialog);
+    g_error_free (error);
+
+    return FALSE;
+  }
+
+  g_regex_unref (reg);
+
+  return TRUE;
+}
+
+static void
+on_check_toggled (GtkToggleButton *button, GtkWidget *widget)
+{
+  gtk_widget_set_sensitive (widget, 
+                            gtk_toggle_button_get_active (button));
+}
+
+static void
+on_dialog_add_edit_reponse (GtkWidget *dialog, int response_id,
+                            LogviewFilterManager *manager)
+{
+  GtkWidget *entry_name, *entry_regex;
+  GtkWidget *radio_color, *radio_visible;
+  GtkWidget *check_foreground, *check_background;
+  GtkWidget *color_foreground, *color_background;
+  gchar *old_name;
+  const gchar *name;
+  const gchar *regex;
+  LogviewFilter *filter;
+  GtkTextTag *tag;
+  GtkBuilder *builder;
+
+  old_name = g_object_get_data (G_OBJECT (manager), "old_name");
+  builder = manager->priv->builder;
+
+  entry_name = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                   "entry_name"));
+  entry_regex = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                    "entry_regex"));
+  radio_color = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                    "radio_color"));
+  radio_visible = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                      "radio_visible"));
+  check_foreground = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "check_foreground"));
+  check_background = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "check_background"));
+  color_foreground = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "color_foreground"));
+  color_background = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "color_background"));
+
+  if (response_id == GTK_RESPONSE_APPLY) {
+    name = gtk_entry_get_text (GTK_ENTRY (entry_name));
+    regex = gtk_entry_get_text (GTK_ENTRY (entry_regex));
+
+    if (!check_name (manager, name) || !check_regex (manager, regex)) {
+      return;
+    }
+
+    filter = logview_filter_new (name, regex);
+    tag = gtk_text_tag_new (name);
+
+    if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio_color))) {
+      if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_foreground))) {
+        GdkColor foreground_color;
+        gtk_color_button_get_color (GTK_COLOR_BUTTON (color_foreground),
+                                    &foreground_color);
+        g_object_set (G_OBJECT (tag), 
+                      "foreground-gdk", &foreground_color,
+                      "foreground-set", TRUE, NULL);
+      }
+
+      if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_background))) {
+        GdkColor background_color;
+        gtk_color_button_get_color (GTK_COLOR_BUTTON (color_background),
+                                    &background_color);
+        g_object_set (tag, 
+                      "paragraph-background-gdk", &background_color,
+                      "paragraph-background-set", TRUE, NULL);
+      }
+      
+      if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_foreground))
+          && !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_background))) {
+          GtkWidget *error_dialog;
+
+          error_dialog = gtk_message_dialog_new (GTK_WINDOW (manager),
+                                                 GTK_DIALOG_MODAL,
+                                                 GTK_MESSAGE_ERROR,
+                                                 GTK_BUTTONS_CLOSE,
+                                                 "%s",
+                                                 _("Please specify either foreground or background color!"));
+          gtk_dialog_run (GTK_DIALOG (error_dialog));
+          gtk_widget_destroy (error_dialog);
+          g_object_unref (tag);
+          g_object_unref (filter);
+
+          return;
+      }
+    } else { /* !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio_color)) */
+      g_object_set (tag, "invisible", TRUE, NULL);
+    }
+
+    if (old_name && !g_str_equal (old_name, name)) {
+      logview_prefs_remove_filter (manager->priv->prefs, old_name);
+    }
+
+    g_object_set (G_OBJECT (filter), "texttag", tag, NULL);
+    g_object_unref (tag);
+
+    logview_prefs_add_filter (manager->priv->prefs, filter);
+    g_object_unref (filter);
+
+    logview_filter_manager_update_model (manager);
+  }
+
+  g_free (old_name);
+  gtk_widget_destroy (dialog);
+}
+
+static void
+run_add_edit_dialog (LogviewFilterManager *manager, LogviewFilter *filter)
+{
+  int response;
+  GError *error;
+  gchar *name, *regex;
+  const gchar *title;
+  GtkWidget *dialog, *entry_name, *entry_regex, *radio_color;
+  GtkWidget *radio_visible, *check_foreground, *check_background;
+  GtkWidget *color_foreground, *color_background, *vbox_color;
+  gboolean foreground_set, background_set, invisible;
+  GtkTextTag *tag;
+  GtkBuilder* builder;
+
+  builder = manager->priv->builder;
+
+  error = NULL;
+  name = NULL;
+  
+  gtk_builder_add_from_file (builder, UI_FILE, &error);
+
+  if (error) {
+    g_warning ("Could not load filter ui: %s", error->message);
+    g_error_free (error);
+    return;
+  }
+
+  title = (filter != NULL ? _("Edit filter") : _("Add new filter"));
+
+  dialog = GTK_WIDGET (gtk_builder_get_object (builder,
+                                               "dialog_filter"));
+
+  entry_name = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                   "entry_name"));
+  entry_regex = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                    "entry_regex"));
+  radio_color = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                    "radio_color"));
+  radio_visible = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                      "radio_visible"));
+
+  gtk_radio_button_set_group (GTK_RADIO_BUTTON (radio_color),
+                              gtk_radio_button_get_group (GTK_RADIO_BUTTON (radio_visible)));
+
+  check_foreground = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "check_foreground"));
+  check_background = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "check_background"));
+  color_foreground = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "color_foreground"));
+  color_background = GTK_WIDGET (gtk_builder_get_object (builder,
+                                                         "color_background"));
+  g_signal_connect (check_foreground, "toggled", G_CALLBACK (on_check_toggled),
+                    color_foreground);
+  g_signal_connect (check_background, "toggled", G_CALLBACK (on_check_toggled),
+                    color_background);
+
+  on_check_toggled (GTK_TOGGLE_BUTTON (check_foreground),
+                    color_foreground);
+  on_check_toggled (GTK_TOGGLE_BUTTON (check_background),
+                    color_background);
+
+  vbox_color = GTK_WIDGET (gtk_builder_get_object (builder, "vbox_color"));
+  g_signal_connect (radio_color, "toggled", G_CALLBACK (on_check_toggled),
+                    vbox_color);
+  on_check_toggled (GTK_TOGGLE_BUTTON (radio_color),
+                    vbox_color);
+
+  if (filter) {
+    g_object_get (filter,
+                  "name", &name,
+                  "regex", &regex,
+                  "texttag", &tag,
+                  NULL);
+    g_object_get (tag,
+                  "foreground-set", &foreground_set,
+                  "paragraph-background-set", &background_set,
+                  "invisible", &invisible, NULL);
+    gtk_entry_set_text (GTK_ENTRY(entry_name), name);
+    gtk_entry_set_text (GTK_ENTRY(entry_regex), regex);
+
+    if (foreground_set) {
+      GdkColor *foreground;
+
+      g_object_get (tag, "foreground-gdk", &foreground, NULL);
+      gtk_color_button_set_color (GTK_COLOR_BUTTON (color_foreground),
+                                  foreground);
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_foreground),
+                                    TRUE);
+
+      gdk_color_free (foreground);
+    }
+
+    if (background_set) {
+      GdkColor *background;
+
+      g_object_get (tag, "paragraph-background-gdk", &background, NULL);
+      gtk_color_button_set_color (GTK_COLOR_BUTTON (color_background),
+                                  background);
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (check_background),
+                                    TRUE);
+
+      gdk_color_free (background);
+    }
+
+    if (background_set || foreground_set) {
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_color), TRUE);
+    } else if (invisible) {
+      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (radio_visible), TRUE);
+    }
+
+    g_free (regex);
+    g_free (name);
+    g_object_unref (tag);
+  }
+
+  g_object_set_data (G_OBJECT (manager), "old_name", name);
+
+  g_signal_connect (G_OBJECT (dialog), "response",
+                    G_CALLBACK (on_dialog_add_edit_reponse), manager);
+  gtk_window_set_transient_for (GTK_WINDOW (dialog),
+                                GTK_WINDOW (manager));
+  gtk_window_set_modal (GTK_WINDOW (dialog),
+                        TRUE);
+
+  gtk_widget_show (GTK_WIDGET (dialog));
+}
+
+static void
+on_add_clicked (GtkWidget *button, LogviewFilterManager *manager)
+{                                                   
+  run_add_edit_dialog (manager, NULL);
+}
+
+static void
+on_edit_clicked (GtkWidget *button, LogviewFilterManager *manager)
+{
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  LogviewFilter *filter;
+  GtkTreeSelection *selection;
+
+  selection =
+    gtk_tree_view_get_selection (GTK_TREE_VIEW (manager->priv->tree));
+
+  gtk_tree_selection_get_selected (selection, &model, &iter);
+  gtk_tree_model_get (model, &iter, COLUMN_FILTER, &filter, -1);
+
+  run_add_edit_dialog (manager, filter);
+
+  g_object_unref (filter);
+}
+
+static void
+on_remove_clicked (GtkWidget *button, LogviewFilterManager *manager)
+{
+  GtkTreeSelection *selection;
+  GtkTreeIter iter;
+  GtkTreeModel *model;
+  gchar *name;
+
+  selection  = 
+    gtk_tree_view_get_selection (GTK_TREE_VIEW (manager->priv->tree));
+
+  gtk_tree_selection_get_selected (selection, &model, &iter);
+  gtk_tree_model_get (model, &iter, COLUMN_NAME, &name, -1);
+
+  logview_prefs_remove_filter (manager->priv->prefs, name);
+  logview_filter_manager_update_model (manager);
+
+  g_free(name);
+}
+
+static void
+on_tree_selection_changed (GtkTreeSelection *selection, LogviewFilterManager *manager)
+{
+  gboolean status;
+
+  status = gtk_tree_selection_get_selected (selection, NULL, NULL);
+
+  gtk_widget_set_sensitive (manager->priv->edit_button, status);
+  gtk_widget_set_sensitive (manager->priv->remove_button, status);	
+}
+
+static void
+logview_filter_manager_init (LogviewFilterManager *manager)
+{
+  GtkWidget *table;
+  GtkWidget *scrolled_window;
+  GtkTreeViewColumn *column;
+  GtkCellRenderer *text_renderer;
+  LogviewFilterManagerPrivate *priv;
+
+  manager->priv = LOGVIEW_FILTER_MANAGER_GET_PRIVATE (manager);
+  priv = manager->priv;
+
+  priv->builder = gtk_builder_new ();
+  g_object_ref (priv->builder);
+  priv->prefs = logview_prefs_get ();
+
+  gtk_dialog_add_button (GTK_DIALOG(manager),
+                         GTK_STOCK_CLOSE,
+                         GTK_RESPONSE_CLOSE);
+  gtk_window_set_modal (GTK_WINDOW (manager),
+                        TRUE);
+
+  priv->model = GTK_TREE_MODEL (gtk_list_store_new (N_COLUMNS,
+                                                    G_TYPE_STRING,
+                                                    G_TYPE_OBJECT));
+  logview_filter_manager_update_model (manager);
+
+  table = gtk_table_new (3, 2, FALSE);
+  scrolled_window = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
+                                  GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
+                                       GTK_SHADOW_ETCHED_IN);
+  priv->tree = gtk_tree_view_new_with_model (priv->model);
+  gtk_widget_set_size_request (priv->tree, 150, 200);
+  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (priv->tree), FALSE);
+  gtk_container_add (GTK_CONTAINER (scrolled_window), priv->tree);
+
+  text_renderer = gtk_cell_renderer_text_new ();
+
+  column = gtk_tree_view_column_new();
+  gtk_tree_view_column_pack_start (column, text_renderer, TRUE);
+  gtk_tree_view_column_set_attributes (column,
+                                       text_renderer,
+                                       "text", COLUMN_NAME,
+                                       NULL);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (priv->tree),
+                               column);
+
+  priv->add_button = gtk_button_new_from_stock (GTK_STOCK_ADD);
+  priv->edit_button = gtk_button_new_from_stock (GTK_STOCK_PROPERTIES);
+  priv->remove_button = gtk_button_new_from_stock (GTK_STOCK_REMOVE);
+
+  gtk_window_set_title (GTK_WINDOW (manager),
+                        _("Filters"));
+
+  g_signal_connect (priv->add_button, "clicked", 
+                    G_CALLBACK (on_add_clicked), manager);
+  g_signal_connect (priv->edit_button, "clicked", 
+                    G_CALLBACK (on_edit_clicked), manager);
+  g_signal_connect (priv->remove_button, "clicked", 
+                    G_CALLBACK (on_remove_clicked), manager);
+
+  gtk_widget_set_sensitive (priv->edit_button, FALSE);
+  gtk_widget_set_sensitive (priv->remove_button, FALSE);
+
+  g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->tree)),
+                    "changed", G_CALLBACK (on_tree_selection_changed),
+                    manager);
+
+  gtk_table_attach_defaults (GTK_TABLE (table),
+                             scrolled_window,
+                             0, 1, 0, 3);
+  gtk_table_attach (GTK_TABLE (table),
+                    priv->add_button,
+                    1, 2, 0, 1, GTK_FILL, 0, 5, 5);
+  gtk_table_attach (GTK_TABLE (table),
+                    priv->edit_button,
+                    1, 2, 1, 2, GTK_FILL, 0, 5, 5);
+  gtk_table_attach (GTK_TABLE (table),
+                    priv->remove_button,
+                    1, 2, 2, 3, GTK_FILL, 0, 5, 5);
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (manager))),
+                      table, TRUE, TRUE, 5);
+  gtk_widget_show_all (GTK_WIDGET (manager));
+}
+
+static void
+logview_filter_manager_dispose (GObject *object)
+{
+  LogviewFilterManager* manager;
+
+  manager = LOGVIEW_FILTER_MANAGER (object);
+
+  g_object_unref (manager->priv->builder);
+
+  G_OBJECT_CLASS (logview_filter_manager_parent_class)->dispose (object);
+}
+
+static void
+logview_filter_manager_response (GtkDialog* dialog, gint response_id)
+{
+  gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+logview_filter_manager_class_init (LogviewFilterManagerClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkDialogClass *parent_class = GTK_DIALOG_CLASS (klass);
+
+  g_type_class_add_private (klass, sizeof (LogviewFilterManagerPrivate));
+
+  object_class->dispose = logview_filter_manager_dispose;
+  parent_class->response = logview_filter_manager_response;
+}
+
+GtkWidget *
+logview_filter_manager_new (void)
+{
+  return g_object_new (LOGVIEW_TYPE_FILTER_MANAGER, NULL);
+}

Added: trunk/logview/logview-filter-manager.h
==============================================================================
--- (empty file)
+++ trunk/logview/logview-filter-manager.h	Wed Mar 18 11:34:35 2009
@@ -0,0 +1,54 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/*
+ * gnome-utils
+ * Copyright (C) Johannes Schmid 2009 <jhs gnome org>
+ * 
+ * gnome-utils 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, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * gnome-utils 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _LOGVIEW_FILTER_MANAGER_H_
+#define _LOGVIEW_FILTER_MANAGER_H_
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define LOGVIEW_TYPE_FILTER_MANAGER             (logview_filter_manager_get_type ())
+#define LOGVIEW_FILTER_MANAGER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGVIEW_TYPE_FILTER_MANAGER, LogviewFilterManager))
+#define LOGVIEW_FILTER_MANAGER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), LOGVIEW_TYPE_FILTER_MANAGER, LogviewFilterManagerClass))
+#define LOGVIEW_IS_FILTER_MANAGER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGVIEW_TYPE_FILTER_MANAGER))
+#define LOGVIEW_IS_FILTER_MANAGER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGVIEW_TYPE_FILTER_MANAGER))
+#define LOGVIEW_FILTER_MANAGER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGVIEW_TYPE_FILTER_MANAGER, LogviewFilterManagerClass))
+
+typedef struct _LogviewFilterManagerClass LogviewFilterManagerClass;
+typedef struct _LogviewFilterManager LogviewFilterManager;
+typedef struct _LogviewFilterManagerPrivate LogviewFilterManagerPrivate;
+
+struct _LogviewFilterManagerClass {
+	GtkDialogClass parent_class;
+};
+
+struct _LogviewFilterManager {
+	GtkDialog parent_instance;
+
+	LogviewFilterManagerPrivate* priv;
+};
+
+GType       logview_filter_manager_get_type (void) G_GNUC_CONST;
+GtkWidget * logview_filter_manager_new (void);
+
+G_END_DECLS
+
+#endif /* _LOGVIEW_FILTER_MANAGER_H_ */

Added: trunk/logview/logview-filter.c
==============================================================================
--- (empty file)
+++ trunk/logview/logview-filter.c	Wed Mar 18 11:34:35 2009
@@ -0,0 +1,197 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/*
+ * gnome-utils
+ * Copyright (C) Johannes Schmid 2009 <jhs gnome org>
+ * 
+ * gnome-utils 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, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * gnome-utils 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "logview-filter.h"
+
+enum {
+  PROP_0,
+  PROP_REGEX,
+  PROP_NAME,
+  PROP_TEXTTAG
+};
+
+G_DEFINE_TYPE (LogviewFilter, logview_filter, G_TYPE_OBJECT);
+
+struct _LogviewFilterPrivate {
+  GRegex* regex;
+  gchar* name;
+  GtkTextTag* tag;
+};
+
+#define LOGVIEW_FILTER_GET_PRIVATE(o)  \
+(G_TYPE_INSTANCE_GET_PRIVATE ((o), LOGVIEW_TYPE_FILTER, LogviewFilterPrivate))
+
+static void
+logview_filter_init (LogviewFilter *object) 
+{
+  object->priv = LOGVIEW_FILTER_GET_PRIVATE(object);
+  object->priv->tag = NULL;
+}
+
+static void
+logview_filter_finalize (GObject *object)
+{
+  LogviewFilterPrivate *priv = LOGVIEW_FILTER (object)->priv;
+
+  if (priv->tag) {
+    g_object_unref (priv->tag);
+  }
+
+  g_regex_unref (priv->regex);
+  g_free (priv->name);
+
+  G_OBJECT_CLASS (logview_filter_parent_class)->finalize (object);
+}
+
+static void
+logview_filter_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
+{
+  LogviewFilterPrivate* priv = LOGVIEW_FILTER (object)->priv;
+
+  switch (prop_id) {
+    case PROP_NAME:
+      priv->name = g_value_dup_string (value);
+      break;
+    case PROP_REGEX: {
+      GError* err;
+      const gchar* regex;
+
+      err = NULL;
+      
+      regex = g_value_get_string (value);
+      priv->regex = g_regex_new (regex, 0, 0, &err);
+
+      if (err) {
+        g_regex_unref (priv->regex);
+        priv->regex = NULL;
+        g_warning ("Couldn't create GRegex object: %s", err->message);
+        g_error_free (err);
+      }
+
+      break;
+    }
+    case PROP_TEXTTAG: {
+      if (priv->tag) {
+        g_object_unref (priv->tag);
+      }
+
+      priv->tag = g_value_dup_object (value);
+      break;
+    }
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+logview_filter_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
+{
+  LogviewFilterPrivate* priv = LOGVIEW_FILTER (object)->priv;
+
+  switch (prop_id) {
+    case PROP_REGEX:
+      g_value_set_string (value, g_regex_get_pattern (priv->regex));
+      break;
+    case PROP_NAME:
+      g_value_set_string (value, priv->name);
+      break;
+    case PROP_TEXTTAG:
+      g_value_set_object (value, priv->tag);
+      break;
+  }
+}
+
+static void
+logview_filter_class_init (LogviewFilterClass *klass)
+{
+  GObjectClass* object_class = G_OBJECT_CLASS (klass);
+  GObjectClass* parent_class = G_OBJECT_CLASS (klass);
+
+  object_class->finalize = logview_filter_finalize;
+  object_class->set_property = logview_filter_set_property;
+  object_class->get_property = logview_filter_get_property;
+
+  g_object_class_install_property (object_class,
+                                   PROP_REGEX,
+                                   g_param_spec_string ("regex",
+                                                        "regular expression",
+                                                        "regular expression",
+                                                        "NULL",
+                                                        G_PARAM_WRITABLE | G_PARAM_READABLE | G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (object_class,
+                                   PROP_NAME,
+                                   g_param_spec_string ("name",
+                                                        "name",
+                                                        "name",
+                                                        "NULL",
+                                                        G_PARAM_WRITABLE | G_PARAM_READABLE | G_PARAM_CONSTRUCT_ONLY));
+
+  g_object_class_install_property (object_class,
+                                   PROP_TEXTTAG,
+                                   g_param_spec_object ("texttag",
+                                                        "texttag",
+                                                        "The text tag to be set on matching lines",
+                                                        GTK_TYPE_TEXT_TAG,
+                                                        G_PARAM_READABLE | G_PARAM_WRITABLE));
+
+
+  g_type_class_add_private (klass, sizeof (LogviewFilterPrivate));
+}
+
+/* public methods */
+
+LogviewFilter*
+logview_filter_new (const gchar *name, const gchar *regex)
+{
+  return g_object_new (LOGVIEW_TYPE_FILTER,
+                       "name", name,
+                       "regex", regex,
+                       NULL);
+}
+
+gboolean
+logview_filter_filter (LogviewFilter *filter, const gchar *line)
+{
+  GMatchInfo* match_info;
+  LogviewFilterPrivate* priv;
+  gboolean retval;
+
+  g_return_val_if_fail (LOGVIEW_IS_FILTER (filter), FALSE);
+  g_return_val_if_fail (line != NULL, FALSE);
+
+  priv = filter->priv;
+
+  g_regex_match (priv->regex, line, 0, &match_info);
+
+  retval = g_match_info_matches (match_info);
+
+  g_match_info_free (match_info);
+
+  return retval;
+}
+
+GtkTextTag *
+logview_filter_get_tag (LogviewFilter *filter)
+{
+  g_return_val_if_fail (LOGVIEW_IS_FILTER (filter), NULL);
+
+  return filter->priv->tag;
+}

Added: trunk/logview/logview-filter.h
==============================================================================
--- (empty file)
+++ trunk/logview/logview-filter.h	Wed Mar 18 11:34:35 2009
@@ -0,0 +1,59 @@
+/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2; -*- */
+/*
+ * gnome-utils
+ * Copyright (C) Johannes Schmid 2009 <jhs gnome org>
+ * 
+ * gnome-utils 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, either version 3 of the License, or
+ * (at your option) any later version.
+ * 
+ * gnome-utils 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _LOGVIEW_FILTER_H_
+#define _LOGVIEW_FILTER_H_
+
+#include <glib.h>
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+#define LOGVIEW_TYPE_FILTER             (logview_filter_get_type ())
+#define LOGVIEW_FILTER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), LOGVIEW_TYPE_FILTER, LogviewFilter))
+#define LOGVIEW_FILTER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), LOGVIEW_TYPE_FILTER, LogviewFilterClass))
+#define LOGVIEW_IS_FILTER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), LOGVIEW_TYPE_FILTER))
+#define LOGVIEW_IS_FILTER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), LOGVIEW_TYPE_FILTER))
+#define LOGVIEW_FILTER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), LOGVIEW_TYPE_FILTER, LogviewFilterClass))
+
+typedef struct _LogviewFilterClass LogviewFilterClass;
+typedef struct _LogviewFilter LogviewFilter;
+typedef struct _LogviewFilterPrivate LogviewFilterPrivate;
+
+struct _LogviewFilterClass {
+  GObjectClass parent_class;
+};
+
+struct _LogviewFilter {
+  GObject parent_instance;
+
+  LogviewFilterPrivate *priv;
+};
+
+GType           logview_filter_get_type (void) G_GNUC_CONST;
+LogviewFilter * logview_filter_new (const gchar *name, 
+                                    const gchar *regex);
+gboolean        logview_filter_filter (LogviewFilter *filter, 
+                                       const gchar *line);
+GtkTextTag *    logview_filter_get_tag (LogviewFilter *filter);
+
+G_END_DECLS
+
+#endif /* _LOGVIEW_FILTER_H_ */



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