Find Toolbar
BAM <[email protected]> Wed, 10 Nov 2004 17:07:56 -0500
| Newsgroups | gmane.comp.web.galeon.devel |
|---|---|
| Message-ID | <1100124476.5963.6.camel@localhost> |
--Boundary_(ID_huNjSPxRhJ8GYaCizxWyVg)
Content-type: text/plain
Content-transfer-encoding: 7bit
This basically just the find dialog in a toolbar, like in Firefox. The
main advantage is that the toolbar doesn't cover up the page.
Notes/Caveats:
1. I've never used Firefox's find toolbar.
2. Doesn't use glade or any of the galeon dialog-type classes.
3. I added a new gconf key to choose between the dialog and toolbar
(/apps/galeon/Browsing/Find/use_dialog).
--Boundary_(ID_huNjSPxRhJ8GYaCizxWyVg)
Content-type: text/x-patch; name=galeon-ben-find_toolbar.patch;
charset=ISO-8859-15
Content-transfer-encoding: 7bit
Content-disposition: attachment; filename=galeon-ben-find_toolbar.patch
diff -urwN galeon/src/Makefile.am galeon.ben/src/Makefile.am
--- galeon/src/Makefile.am 2004-11-10 17:00:13.252295272 -0500
+++ galeon.ben/src/Makefile.am 2004-11-10 17:02:56.910415456 -0500
@@ -48,6 +48,8 @@
galeon-shell.h \
galeon-tab.c \
galeon-tab.h \
+ find-toolbar.c \
+ find-toolbar.h \
galeon-window.c \
galeon-window.h \
galeon-window-bookmark-activated-proxy.c \
diff -urwN galeon/src/find-toolbar.c galeon.ben/src/find-toolbar.c
--- galeon/src/find-toolbar.c 1969-12-31 19:00:00.000000000 -0500
+++ galeon.ben/src/find-toolbar.c 2004-11-10 17:02:56.910415456 -0500
@@ -0,0 +1,476 @@
+/*
+ * Copyright (C) 2004
+ *
+ * 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, 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 Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <gtk/gtkbutton.h>
+#include <gtk/gtkcombo.h>
+#include <gtk/gtkentry.h>
+#include <gtk/gtktogglebutton.h>
+#include <gtk/gtktoolbar.h>
+#include <gtk/gtkwidget.h>
+#include <libgnomeui/gnome-entry.h>
+#include <libgnomeui/libgnomeui.h>
+
+#include "eel-gconf-extensions.h"
+#include "galeon-embed.h"
+#include "galeon-window.h"
+
+#include "find-toolbar.h"
+
+#define GCONF_FIND_MATCH_CASE "/apps/galeon/Browsing/Find/match_case"
+#define GCONF_FIND_AUTOWRAP "/apps/galeon/Browsing/Find/autowrap"
+#define GCONF_FIND_WORD "/apps/galeon/Browsing/Find/word"
+
+struct FindToolbarPrivate
+{
+ gboolean b_match_case;
+ gboolean b_wrap;
+ gchar *search_string;
+
+ GaleonWindow *window;
+ GtkWidget *toolbar;
+ gboolean active;
+
+ GtkEntry *find_entry;
+ GtkWidget *button_prev;
+ GtkWidget *button_next;
+
+ gboolean dispose_has_run;
+};
+
+#define FIND_TOOLBAR_GET_PRIVATE(object) \
+ (G_TYPE_INSTANCE_GET_PRIVATE ((object), \
+ TYPE_FIND_TOOLBAR, FindToolbarPrivate))
+
+static void find_toolbar_go_next_cb (GtkWidget *widget, FindToolbarPrivate *p);
+static void find_toolbar_go_prev_cb (GtkWidget *widget, FindToolbarPrivate *p);
+static void find_toolbar_string_changed_cb (GnomeEntry *find_gnome_entry,
+ FindToolbarPrivate *p);
+static void find_toolbar_case_cb (GtkToggleButton *match_case,
+ FindToolbarPrivate *p);
+static void find_toolbar_wrap_cb (GtkToggleButton *wrap,
+ FindToolbarPrivate *p);
+static void find_toolbar_hide_cb (GtkButton *button_hide, FindToolbar *self);
+
+static void update_navigation_controls (GtkWidget *button_prev,
+ GtkWidget *button_next,
+ gboolean b_prev, gboolean b_next);
+
+static void find_toolbar_dispose (GObject *instance);
+static void find_toolbar_finalize (GObject *instance);
+
+static void find_toolbar_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void find_toolbar_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static void
+find_toolbar_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ FindToolbar *self = FIND_TOOLBAR (object);
+
+ switch (property_id)
+ {
+ case FIND_TOOLBAR_PROP_WINDOW:
+ self->priv->window = g_value_get_pointer (value);
+ break;
+ default:
+ g_assert (FALSE);
+ break;
+ }
+}
+
+static void
+find_toolbar_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ FindToolbar *self = FIND_TOOLBAR (object);
+
+ switch (property_id)
+ {
+ case FIND_TOOLBAR_PROP_WINDOW:
+ g_value_set_pointer (value, self->priv->window);
+ break;
+ default:
+ g_assert (FALSE);
+ break;
+ }
+}
+
+static void
+find_toolbar_init (FindToolbar *self,
+ gpointer data)
+{
+ self->area = gtk_vbox_new (FALSE, 0);
+
+ self->priv = g_new0 (FindToolbarPrivate, 1);
+ self->priv->active = FALSE;
+ self->priv->toolbar = gtk_toolbar_new ();
+
+ self->priv->dispose_has_run = FALSE;
+}
+
+static GObject *
+find_toolbar_constructor (GType type,
+ guint n_props,
+ GObjectConstructParam *props)
+{
+ GObject *obj;
+ FindToolbar *self;
+ FindToolbarPrivate *p;
+ GtkToolbar *tb;
+
+ {
+ FindToolbarClass *klass = FIND_TOOLBAR_CLASS
+ (g_type_class_peek (TYPE_FIND_TOOLBAR));
+ GObjectClass *parent_class =
+ G_OBJECT_CLASS (g_type_class_peek_parent (klass));
+ obj = parent_class->constructor (type, n_props, props);
+ }
+
+ self = FIND_TOOLBAR(obj);
+ p = self->priv;
+ tb = GTK_TOOLBAR (self->priv->toolbar);
+
+ p->b_match_case = eel_gconf_get_boolean (GCONF_FIND_MATCH_CASE);
+ p->b_wrap = eel_gconf_get_boolean (GCONF_FIND_AUTOWRAP);
+ p->search_string = eel_gconf_get_string (GCONF_FIND_WORD);
+
+ {
+ GtkWidget *l = gtk_label_new_with_mnemonic ("Fin_d: ");
+ GnomeEntry *find_gnome_entry =
+ GNOME_ENTRY (gnome_entry_new ("FindEntrySELF"));
+
+ gtk_misc_set_padding (GTK_MISC (l), 5, 0);
+ gtk_toolbar_append_element (tb, GTK_TOOLBAR_CHILD_WIDGET,
+ l,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+
+ p->find_entry = GTK_ENTRY (gnome_entry_gtk_entry(find_gnome_entry));
+ gnome_entry_set_max_saved (find_gnome_entry, 10);
+ gtk_entry_set_text (p->find_entry, p->search_string);
+ gtk_label_set_mnemonic_widget (GTK_LABEL (l),
+ GTK_WIDGET (find_gnome_entry));
+ gtk_toolbar_append_element (tb, GTK_TOOLBAR_CHILD_WIDGET,
+ GTK_WIDGET (find_gnome_entry),
+ NULL, NULL, NULL, NULL, NULL, NULL);
+ g_signal_connect (G_OBJECT(find_gnome_entry), "changed",
+ G_CALLBACK (find_toolbar_string_changed_cb), p);
+ g_signal_connect (G_OBJECT(p->find_entry), "activate",
+ G_CALLBACK (find_toolbar_go_next_cb), p);
+ }
+
+ {
+ GtkWidget *button_prev_box;
+ p->button_prev = gtk_button_new ();
+ gtk_button_set_relief (GTK_BUTTON (p->button_prev),
+ GTK_RELIEF_NONE);
+ button_prev_box = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (p->button_prev), button_prev_box);
+ gtk_box_pack_start (GTK_BOX (button_prev_box),
+ GTK_WIDGET (gtk_image_new_from_stock
+ ("gtk-go-back",
+ GTK_ICON_SIZE_SMALL_TOOLBAR)),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (button_prev_box),
+ gtk_label_new("Previous"), FALSE, FALSE, 0);
+ gtk_toolbar_append_element (tb, GTK_TOOLBAR_CHILD_WIDGET,
+ p->button_prev,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+ g_signal_connect (G_OBJECT(p->button_prev), "clicked",
+ G_CALLBACK (find_toolbar_go_prev_cb), p);
+ }
+
+ {
+ GtkWidget *button_next_box;
+ p->button_next = gtk_button_new ();
+ gtk_button_set_relief (GTK_BUTTON (p->button_next),
+ GTK_RELIEF_NONE);
+ button_next_box = gtk_hbox_new (FALSE, 0);
+ gtk_container_add (GTK_CONTAINER (p->button_next), button_next_box);
+ gtk_box_pack_start (GTK_BOX (button_next_box),
+ GTK_WIDGET (gtk_image_new_from_stock
+ ("gtk-go-forward",
+ GTK_ICON_SIZE_SMALL_TOOLBAR)),
+ FALSE, FALSE, 0);
+ gtk_box_pack_start (GTK_BOX (button_next_box),
+ gtk_label_new("Next"), FALSE, FALSE, 0);
+ gtk_toolbar_append_element (tb, GTK_TOOLBAR_CHILD_WIDGET,
+ p->button_next,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+ g_signal_connect (G_OBJECT(p->button_next), "clicked",
+ G_CALLBACK (find_toolbar_go_next_cb), p);
+ }
+
+ gtk_toolbar_append_space (tb);
+
+ {
+ GtkWidget *match_case =
+ gtk_toggle_button_new_with_label ("Case Sensitive");
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (match_case),
+ p->b_match_case);
+ gtk_toolbar_append_element (tb, GTK_TOOLBAR_CHILD_WIDGET,
+ match_case,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+ g_signal_connect (G_OBJECT(match_case), "toggled",
+ G_CALLBACK (find_toolbar_case_cb), p);
+ }
+
+ {
+ GtkWidget *wrap = gtk_toggle_button_new_with_label ("Wrap Around");
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (wrap), p->b_wrap);
+ gtk_toolbar_append_element (tb, GTK_TOOLBAR_CHILD_WIDGET,
+ wrap,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+ g_signal_connect (G_OBJECT(wrap), "toggled",
+ G_CALLBACK (find_toolbar_wrap_cb), p);
+ }
+
+ gtk_toolbar_append_space (tb);
+
+ {
+ GtkWidget *button_hide =
+ gtk_button_new_from_stock (GTK_STOCK_CLOSE);
+ gtk_toolbar_append_element (tb, GTK_TOOLBAR_CHILD_WIDGET,
+ button_hide,
+ NULL, NULL, NULL, NULL, NULL, NULL);
+ g_signal_connect (G_OBJECT(button_hide), "clicked",
+ G_CALLBACK (find_toolbar_hide_cb), self);
+ }
+
+ gtk_widget_show_all (GTK_WIDGET (tb));
+ g_object_ref(self->priv->toolbar);
+ return obj;
+}
+
+static void
+find_toolbar_dispose (GObject *instance)
+{
+ FindToolbar *self = FIND_TOOLBAR(instance);
+ FindToolbarPrivate *p;
+
+ if (self->priv->dispose_has_run)
+ {
+ return;
+ }
+ self->priv->dispose_has_run = TRUE;
+ p = self->priv;
+
+ eel_gconf_set_boolean(GCONF_FIND_MATCH_CASE, p->b_match_case);
+ eel_gconf_set_boolean(GCONF_FIND_AUTOWRAP, p->b_wrap);
+ eel_gconf_set_string(GCONF_FIND_WORD, p->search_string);
+
+ g_object_unref(p->toolbar);
+ if (p->active)
+ {
+ gtk_container_remove(GTK_CONTAINER (self->area), p->toolbar);
+ }
+}
+
+static void
+find_toolbar_finalize (GObject *instance)
+{
+ FindToolbar *self = FIND_TOOLBAR(instance);
+ g_free(self->priv);
+}
+
+static void
+find_toolbar_class_init (FindToolbarClass *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GParamSpec *pspec;
+
+ gobject_class->set_property = find_toolbar_set_property;
+ gobject_class->get_property = find_toolbar_get_property;
+ gobject_class->constructor = find_toolbar_constructor;
+ gobject_class->dispose = find_toolbar_dispose;
+ gobject_class->finalize = find_toolbar_finalize;
+
+ pspec = g_param_spec_pointer ("window",
+ "GaleonWindow",
+ "GaleonWindow to contain the toolbar.",
+ G_PARAM_CONSTRUCT_ONLY
+ | G_PARAM_READWRITE);
+ g_object_class_install_property (gobject_class,
+ FIND_TOOLBAR_PROP_WINDOW, pspec);
+
+ g_type_class_add_private (klass, sizeof (FindToolbarPrivate));
+}
+
+FindToolbar *
+find_toolbar_new (GaleonWindow *window)
+{
+ return FIND_TOOLBAR (g_object_new (TYPE_FIND_TOOLBAR,
+ "window", window,
+ NULL));
+}
+
+static void
+find_toolbar_go_next_cb (GtkWidget *widget, FindToolbarPrivate *p)
+{
+ GaleonEmbed *embed = galeon_window_get_active_embed (p->window);
+ gresult result;
+
+ g_return_if_fail (embed != NULL);
+ result = galeon_embed_find_next (embed, FALSE);
+
+ if (result == G_OK)
+ {
+ update_navigation_controls(p->button_prev, p->button_next,
+ TRUE, TRUE);
+ }
+ else
+ {
+ update_navigation_controls(p->button_prev, p->button_next,
+ TRUE, FALSE);
+ }
+}
+
+static void
+find_toolbar_go_prev_cb (GtkWidget *widget, FindToolbarPrivate *p)
+{
+ GaleonEmbed *embed = galeon_window_get_active_embed (p->window);
+ gresult result;
+
+ g_return_if_fail (embed != NULL);
+ result = galeon_embed_find_next (embed, TRUE);
+
+ if (result == G_OK)
+ {
+ update_navigation_controls(p->button_prev, p->button_next,
+ TRUE, TRUE);
+ }
+ else
+ {
+ update_navigation_controls(p->button_prev, p->button_next,
+ FALSE, TRUE);
+ }
+}
+
+
+static void
+find_toolbar_string_changed_cb (GnomeEntry *find_gnome_entry,
+ FindToolbarPrivate *p)
+{
+ GaleonEmbed *embed = galeon_window_get_active_embed (p->window);
+ p->search_string = (gchar *)gtk_entry_get_text (p->find_entry);
+
+ galeon_embed_find_set_properties (embed,
+ p->search_string,
+ p->b_match_case,
+ p->b_wrap);
+ update_navigation_controls(p->button_prev, p->button_next, TRUE, TRUE);
+}
+
+static void
+find_toolbar_case_cb (GtkToggleButton *match_case, FindToolbarPrivate *p)
+{
+ GaleonEmbed *embed = galeon_window_get_active_embed (p->window);
+
+ p->b_match_case = !(p->b_match_case);
+
+ galeon_embed_find_set_properties (embed,
+ p->search_string,
+ p->b_match_case,
+ p->b_wrap);
+}
+
+static void
+find_toolbar_wrap_cb (GtkToggleButton *wrap, FindToolbarPrivate *p)
+{
+ GaleonEmbed *embed = galeon_window_get_active_embed (p->window);
+
+ p->b_wrap = !(p->b_wrap);
+
+ galeon_embed_find_set_properties (embed,
+ p->search_string,
+ p->b_match_case,
+ p->b_wrap);
+}
+
+GType
+find_toolbar_get_type (void)
+{
+ static GType find_toolbar_type = 0;
+
+ if (find_toolbar_type == 0)
+ {
+ static const GTypeInfo info =
+ {
+ sizeof (FindToolbarClass),
+ NULL, /* base_init */
+ NULL, /* base_finalize */
+ (GClassInitFunc) find_toolbar_class_init,
+ NULL,
+ NULL, /* class_data */
+ sizeof (FindToolbar),
+ 0, /* n_preallocs */
+ (GInstanceInitFunc) find_toolbar_init
+ };
+
+ find_toolbar_type = g_type_register_static (G_TYPE_OBJECT,
+ "FindToolbar",
+ &info, 0);
+ }
+
+ return find_toolbar_type;
+}
+
+static void
+update_navigation_controls (GtkWidget *button_prev,
+ GtkWidget *button_next,
+ gboolean b_prev, gboolean b_next)
+{
+ gtk_widget_set_sensitive (button_prev, b_prev);
+ gtk_widget_set_sensitive (button_next, b_next);
+}
+
+void
+find_toolbar_toggle_active (FindToolbar *self)
+{
+ if (self->priv->active)
+ {
+ gtk_container_remove(GTK_CONTAINER (self->area),
+ self->priv->toolbar);
+ }
+ else
+ {
+ gtk_container_add(GTK_CONTAINER (self->area),
+ self->priv->toolbar);
+
+ gtk_widget_grab_focus(GTK_WIDGET (self->priv->find_entry));
+ }
+
+
+ self->priv->active = !self->priv->active;
+ gtk_widget_show_all (self->area);
+}
+
+static void
+find_toolbar_hide_cb (GtkButton *button_hide, FindToolbar *self)
+{
+ find_toolbar_toggle_active (self);
+}
diff -urwN galeon/src/find-toolbar.h galeon.ben/src/find-toolbar.h
--- galeon/src/find-toolbar.h 1969-12-31 19:00:00.000000000 -0500
+++ galeon.ben/src/find-toolbar.h 2004-11-10 17:02:56.910415456 -0500
@@ -0,0 +1,65 @@
+/*
+ * Copyright (C) 2004
+ *
+ * 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, 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 Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef FIND_TOOLBAR_H
+#define FIND_TOOLBAR_H
+
+#include <glib-object.h>
+#include <glib.h>
+
+G_BEGIN_DECLS
+
+typedef struct FindToolbar FindToolbar;
+typedef struct FindToolbarClass FindToolbarClass;
+
+#define TYPE_FIND_TOOLBAR (find_toolbar_get_type ())
+#define FIND_TOOLBAR(obj) (GTK_CHECK_CAST ((obj), TYPE_FIND_TOOLBAR, FindToolbar))
+#define FIND_TOOLBAR_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), TYPE_FIND_TOOLBAR, FindToolbarClass))
+#define IS_FIND_TOOLBAR(obj) (GTK_CHECK_TYPE ((obj), TYPE_FIND_TOOLBAR))
+#define IS_FIND_TOOLBAR_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), FIND_TOOLBAR))
+
+typedef struct FindToolbarPrivate FindToolbarPrivate;
+
+struct FindToolbar
+{
+ GObject parent;
+
+ GtkWidget *area;
+
+ FindToolbarPrivate *priv;
+};
+
+struct FindToolbarClass
+{
+ GObjectClass parent;
+};
+
+GType find_toolbar_get_type (void);
+FindToolbar *find_toolbar_new (GaleonWindow *window);
+
+
+void find_toolbar_toggle_active (FindToolbar *self);
+
+enum {
+ FIND_TOOLBAR_PROP_0,
+ FIND_TOOLBAR_PROP_WINDOW
+};
+
+G_END_DECLS
+
+#endif
diff -urwN galeon/src/galeon-window.c galeon.ben/src/galeon-window.c
--- galeon/src/galeon-window.c 2004-11-10 17:00:13.356279464 -0500
+++ galeon.ben/src/galeon-window.c 2004-11-10 17:02:56.912415152 -0500
@@ -33,6 +33,7 @@
#include "ppview-toolbar.h"
#include "window-commands.h"
#include "find-dialog.h"
+#include "find-toolbar.h"
#include "history-dialog.h"
#include "galeon-shell.h"
#include "bookmarks-gtk-menu.h"
@@ -102,6 +103,7 @@
#define GCONF_DETACH_TOOLBAR "/desktop/gnome/interface/toolbar_detachable"
#define GCONF_DETACH_MENUBAR "/desktop/gnome/interface/menubar_detachable"
+#define GCONF_FIND_USE_DIALOG "/apps/galeon/Browsing/Find/use_dialog"
enum GaleonWindowSignalsEnum
{
@@ -138,7 +140,10 @@
GaleonTab *active_tab;
GtkWidget *sidebar;
GaleonPopup *embed_popup;
+
GaleonDialog *find_dialog;
+ FindToolbar *find_toolbar;
+
GaleonDialog *history_dialog;
GaleonDialog *history_sidebar;
GbEditorDockable *bookmarks_sidebar;
@@ -1906,6 +1911,8 @@
GTK_WIDGET(p->hpaned),
TRUE, TRUE, 0);
+ p->find_toolbar = NULL;
+
gtk_container_add(GTK_CONTAINER(window),
GTK_WIDGET(p->main_area));
@@ -2020,6 +2027,11 @@
g_object_unref (G_OBJECT (p->find_dialog));
}
+ if (p->find_toolbar)
+ {
+ g_object_unref (G_OBJECT (p->find_toolbar));
+ }
+
if (p->history_dialog)
{
g_object_remove_weak_pointer
@@ -3341,6 +3353,9 @@
void
galeon_window_show_find (GaleonWindow *window)
{
+ gboolean use_dialog = eel_gconf_get_boolean (GCONF_FIND_USE_DIALOG);
+ if (use_dialog)
+ {
GaleonDialog *dialog;
GaleonEmbed *embed;
@@ -3359,6 +3374,20 @@
galeon_dialog_show (window->priv->find_dialog);
}
+ else {
+ if (!window->priv->find_toolbar)
+ {
+ window->priv->find_toolbar = find_toolbar_new (window);
+ gtk_box_pack_end(GTK_BOX (window->priv->main_area),
+ GTK_WIDGET (window->priv->find_toolbar->area),
+ FALSE, FALSE, 0);
+
+ }
+
+ find_toolbar_toggle_active(window->priv->find_toolbar);
+ }
+}
+
void
galeon_window_show_history (GaleonWindow *window)
{
--Boundary_(ID_huNjSPxRhJ8GYaCizxWyVg)--
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click