aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--filter/ChangeLog6
-rw-r--r--filter/filter-file.c308
-rw-r--r--filter/filter-file.h61
3 files changed, 375 insertions, 0 deletions
diff --git a/filter/ChangeLog b/filter/ChangeLog
index beaecec429..358ffbdfb1 100644
--- a/filter/ChangeLog
+++ b/filter/ChangeLog
@@ -1,3 +1,9 @@
+2002-05-09 Jeffrey Stedfast <fejj@ximian.com>
+
+ * filter-file.[c,h]: New filter widgets for choosing files and/or
+ command-line's (?). Not yet hooked up or anything, just for future
+ use.
+
2002-05-08 Not Zed <NotZed@Ximian.com>
* rule-context.c (rule_context_delete_uri): Changed to return a
diff --git a/filter/filter-file.c b/filter/filter-file.c
new file mode 100644
index 0000000000..6884fcb1a9
--- /dev/null
+++ b/filter/filter-file.c
@@ -0,0 +1,308 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Jeffrey Stedfast <fejj@ximian.com>
+ *
+ * Copyright 2002 Ximian, Inc. (www.ximian.com)
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <string.h>
+#include <sys/types.h>
+#include <regex.h>
+#include <gtk/gtkobject.h>
+#include <gtk/gtkwidget.h>
+
+#include <libgnome/gnome-defs.h>
+#include <libgnome/gnome-i18n.h>
+#include <libgnomeui/gnome-dialog.h>
+#include <libgnomeui/gnome-dialog-util.h>
+#include <libgnomeui/gnome-file-entry.h>
+#include <gal/widgets/e-unicode.h>
+
+#include "filter-file.h"
+#include "e-util/e-sexp.h"
+
+#define d(x)
+
+static gboolean validate (FilterElement *fe);
+static void xml_create(FilterElement *fe, xmlNodePtr node);
+static xmlNodePtr xml_encode(FilterElement *fe);
+static int xml_decode(FilterElement *fe, xmlNodePtr node);
+static GtkWidget *get_widget(FilterElement *fe);
+static void build_code(FilterElement *fe, GString *out, struct _FilterPart *ff);
+static void format_sexp(FilterElement *, GString *);
+
+static void filter_file_class_init (FilterFileClass *class);
+static void filter_file_init (FilterFile *gspaper);
+static void filter_file_finalise (GtkObject *obj);
+
+#define _PRIVATE(x) (((FilterFile *)(x))->priv)
+
+struct _FilterFilePrivate {
+};
+
+static FilterElementClass *parent_class;
+
+enum {
+ LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL] = { 0 };
+
+GtkType
+filter_file_get_type (void)
+{
+ static GtkType type = 0;
+
+ if (!type) {
+ GtkTypeInfo type_info = {
+ "FilterFile",
+ sizeof (FilterFile),
+ sizeof (FilterFileClass),
+ (GtkClassInitFunc) filter_file_class_init,
+ (GtkObjectInitFunc) filter_file_init,
+ (GtkArgSetFunc) NULL,
+ (GtkArgGetFunc) NULL
+ };
+
+ type = gtk_type_unique (filter_element_get_type (), &type_info);
+ }
+
+ return type;
+}
+
+static void
+filter_file_class_init (FilterFileClass *klass)
+{
+ GtkObjectClass *object_class = (GtkObjectClass *) klass;
+ FilterElementClass *filter_element = (FilterElementClass *) klass;
+
+ parent_class = gtk_type_class (filter_element_get_type ());
+
+ object_class->finalize = filter_file_finalise;
+
+ /* override methods */
+ filter_element->validate = validate;
+ filter_element->xml_create = xml_create;
+ filter_element->xml_encode = xml_encode;
+ filter_element->xml_decode = xml_decode;
+ filter_element->get_widget = get_widget;
+ filter_element->build_code = build_code;
+ filter_element->format_sexp = format_sexp;
+
+ /* signals */
+
+ gtk_object_class_add_signals (object_class, signals, LAST_SIGNAL);
+}
+
+static void
+filter_file_init (FilterFile *o)
+{
+ o->priv = g_malloc0 (sizeof (*o->priv));
+}
+
+static void
+filter_file_finalise (GtkObject *obj)
+{
+ FilterFile *o = (FilterFile *) obj;
+
+ xmlFree (o->type);
+ g_free (o->path);
+
+ g_free (o->priv);
+
+ ((GtkObjectClass *)(parent_class))->finalize (obj);
+}
+
+/**
+ * filter_file_new:
+ *
+ * Create a new FilterFile object.
+ *
+ * Return value: A new #FilterFile object.
+ **/
+FilterFile *
+filter_file_new (void)
+{
+ return (FilterFile *) gtk_type_new (filter_file_get_type ());
+}
+
+
+FilterFile *
+filter_file_new_type (const char *type)
+{
+ FilterFile *file;
+
+ file = filter_file_new ();
+ file->type = xmlStrdup (type);
+
+ return file;
+}
+
+void
+filter_file_set_path (FilterFile *file, const char *path)
+{
+ g_free (file->path);
+ file->path = g_strdup (path);
+}
+
+static gboolean
+validate (FilterElement *fe)
+{
+ FilterFile *file = (FilterFile *) fe;
+ GtkWidget *dialog;
+ struct stat st;
+
+ if (!file->path) {
+ dialog = gnome_ok_dialog (_("You must specify a file name"));
+
+ gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
+ return FALSE;
+ }
+
+ if (strcmp (file->type, "command") != 0) {
+ if (stat (file->path, &st) == -1 || !S_ISREG (st.st_mode)) {
+ char *errmsg;
+
+ errmsg = g_strdup_printf (_("File '%s' does not exist or is not a regular file."), file->path);
+ dialog = gnome_ok_dialog (errmsg);
+ g_free (errmsg);
+
+ gnome_dialog_run_and_close (GNOME_DIALOG (dialog));
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+static void
+xml_create (FilterElement *fe, xmlNodePtr node)
+{
+ /* parent implementation */
+ ((FilterElementClass *)(parent_class))->xml_create (fe, node);
+
+}
+
+static xmlNodePtr
+xml_encode (FilterElement *fe)
+{
+ FilterFile *file = (FilterFile *) fe;
+ xmlNodePtr cur, value;
+ char *encstr, *type;
+
+ type = file->type ? file->type : "file";
+
+ d(printf ("Encoding %s as xml\n", type));
+
+ value = xmlNewNode (NULL, "value");
+ xmlSetProp (value, "name", fe->name);
+ xmlSetProp (value, "type", type);
+
+ cur = xmlNewChild (value, NULL, type, NULL);
+ encstr = e_utf8_xml1_encode (file->path);
+ xmlNodeSetContent (cur, encstr);
+ g_free (encstr);
+
+ return value;
+}
+
+static int
+xml_decode (FilterElement *fe, xmlNodePtr node)
+{
+ FilterFile *file = (FilterFile *)fe;
+ char *name, *str, *type;
+ xmlNodePtr n;
+
+ name = xmlGetProp (node, "name");
+ type = xmlGetProp (node, "type");
+
+ d(printf("Decoding %s from xml %p\n", type, fe));
+ d(printf ("Name = %s\n", name));
+
+ xmlFree (fe->name);
+ fe->name = name;
+ xmlFree (file->type);
+ file->type = type;
+
+ n = node->childs;
+ if (!strcmp (n->name, type)) {
+ char *decstr;
+
+ str = xmlNodeGetContent (n);
+ if (str) {
+ decstr = e_utf8_xml1_decode (str);
+ xmlFree (str);
+ } else
+ decstr = g_strdup ("");
+
+ d(printf (" '%s'\n", decstr));
+
+ file->path = decstr;
+ } else {
+ g_warning ("Unknown node type '%s' encountered decoding a %s\n", n->name, type);
+ }
+
+ return 0;
+}
+
+static void
+entry_changed (GtkEntry *entry, FilterElement *fe)
+{
+ FilterFile *file = (FilterFile *) fe;
+ char *new;
+
+ new = e_utf8_gtk_entry_get_text (entry);
+
+ g_free (file->path);
+ fi->path = new;
+}
+
+static GtkWidget *
+get_widget (FilterElement *fe)
+{
+ FilterFile *file = (FilterFile *) fe;
+ GtkWidget *fileentry, *entry;
+
+ fileentry = gnome_file_entry_new (NULL, _("Choose a file"));
+ gnome_file_entry_set_default_path (GNOME_FILE_ENTRY (fileentry), file->path);
+ gnome_file_entry_set_modal (GNOME_FILE_ENTRY (fileentry), TRUE);
+
+ entry = gnome_file_entry_gtk_entry (GNOME_FILE_ENTRY (fileentry));
+ gtk_signal_connect (GTK_OBJECT (entry), "changed", entry_changed, fe);
+
+ return fileentry;
+}
+
+static void
+build_code (FilterElement *fe, GString *out, struct _FilterPart *ff)
+{
+ return;
+}
+
+static void
+format_sexp (FilterElement *fe, GString *out)
+{
+ FilterFile *file = (FilterFile *) fe;
+
+ e_sexp_encode_string (out, file->path);
+}
diff --git a/filter/filter-file.h b/filter/filter-file.h
new file mode 100644
index 0000000000..fa772f7bd2
--- /dev/null
+++ b/filter/filter-file.h
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Authors: Jeffrey Stedfast <fejj@ximian.com>
+ *
+ * Copyright 2002 Ximian, Inc. (www.ximian.com)
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * 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., 59 Temple Street #330, Boston, MA 02111-1307, USA.
+ *
+ */
+
+
+#ifndef _FILTER_FILE_H
+#define _FILTER_FILE_H
+
+#include "filter-element.h"
+
+#define FILTER_FILE(obj) GTK_CHECK_CAST (obj, filter_file_get_type (), FilterFile)
+#define FILTER_FILE_CLASS(klass) GTK_CHECK_CLASS_CAST (klass, filter_file_get_type (), FilterFileClass)
+#define IS_FILTER_FILE(obj) GTK_CHECK_TYPE (obj, filter_file_get_type ())
+
+typedef struct _FilterFile FilterFile;
+typedef struct _FilterFileClass FilterFileClass;
+
+struct _FilterFile {
+ FilterElement parent;
+ struct _FilterFilePrivate *priv;
+
+ char *type;
+ char *path;
+};
+
+struct _FilterFileClass {
+ FilterElementClass parent_class;
+
+ /* virtual methods */
+
+ /* signals */
+};
+
+GtkType filter_file_get_type (void);
+
+FilterFile *filter_file_new (void);
+
+FilterFile *filter_file_new_type_name (const char *type);
+
+/* methods */
+void filter_file_set_path (FilterFile *file, const char *path);
+
+#endif /* ! _FILTER_FILE_H */