[monkey-bubble: 654/753] Bring back the old GnomeEntry widget.
- From: Sven Herzberg <herzi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [monkey-bubble: 654/753] Bring back the old GnomeEntry widget.
- Date: Wed, 14 Jul 2010 22:50:40 +0000 (UTC)
commit 46d6e28e014060e8dac98d43e4690b7af59fd7bc
Author: Anders Carlsson <andersca codefactory se>
Date: Fri Aug 24 09:11:49 2001 +0000
Bring back the old GnomeEntry widget.
2001-08-24 Anders Carlsson <andersca codefactory se>
* gnome-entry.c: (gnome_entry_get_type), (gnome_entry_class_init),
(gnome_entry_get_property), (gnome_entry_set_property),
(entry_changed), (entry_activated), (gnome_entry_init),
(gnome_entry_construct), (gnome_entry_new), (free_item),
(free_items), (gnome_entry_destroy), (gnome_entry_finalize),
(gnome_entry_gtk_entry), (gnome_entry_set_history_id),
(gnome_entry_get_history_id), (gnome_entry_set_max_saved),
(gnome_entry_get_max_saved), (build_prefix),
(gnome_entry_add_history), (gnome_entry_prepend_history),
(gnome_entry_append_history), (set_combo_items),
(gnome_entry_load_history), (gnome_entry_clear_history),
(check_for_duplicates), (gnome_entry_save_history):
* gnome-entry.h:
Bring back the old GnomeEntry widget.
libgnomeui/ChangeLog | 18 +
libgnomeui/gnome-entry.c | 803 ++++++++++++++++++++++++++++++++++++----------
libgnomeui/gnome-entry.h | 48 ++-
3 files changed, 677 insertions(+), 192 deletions(-)
---
diff --git a/libgnomeui/ChangeLog b/libgnomeui/ChangeLog
index a20aa33..42f7b83 100644
--- a/libgnomeui/ChangeLog
+++ b/libgnomeui/ChangeLog
@@ -1,3 +1,21 @@
+2001-08-24 Anders Carlsson <andersca codefactory se>
+
+ * gnome-entry.c: (gnome_entry_get_type), (gnome_entry_class_init),
+ (gnome_entry_get_property), (gnome_entry_set_property),
+ (entry_changed), (entry_activated), (gnome_entry_init),
+ (gnome_entry_construct), (gnome_entry_new), (free_item),
+ (free_items), (gnome_entry_destroy), (gnome_entry_finalize),
+ (gnome_entry_gtk_entry), (gnome_entry_set_history_id),
+ (gnome_entry_get_history_id), (gnome_entry_set_max_saved),
+ (gnome_entry_get_max_saved), (build_prefix),
+ (gnome_entry_add_history), (gnome_entry_prepend_history),
+ (gnome_entry_append_history), (set_combo_items),
+ (gnome_entry_load_history), (gnome_entry_clear_history),
+ (check_for_duplicates), (gnome_entry_save_history):
+ * gnome-entry.h:
+
+ Bring back the old GnomeEntry widget.
+
Fri Aug 24 07:57:50 2001 George Lebl <jirka 5z com>
* gnome-color-picker.c, gnome-font-picker.c: use gnome-macros.h
diff --git a/libgnomeui/gnome-entry.c b/libgnomeui/gnome-entry.c
index 13e6e3e..8b9d447 100644
--- a/libgnomeui/gnome-entry.c
+++ b/libgnomeui/gnome-entry.c
@@ -1,4 +1,3 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
/*
* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
* All rights reserved.
@@ -34,252 +33,700 @@
#include <stdio.h>
#include <string.h>
#include <gtk/gtkentry.h>
-#include <gtk/gtkcombo.h>
#include <gtk/gtklist.h>
#include <gtk/gtklistitem.h>
#include <gtk/gtksignal.h>
-#include <libgnome/gnome-i18n.h>
-#include <bonobo/bonobo-exception.h>
-#include "gnome-macros.h"
+
#include "gnome-entry.h"
+#include <libgnome/gnome-i18n.h>
+
+enum {
+ PROP_0,
+ PROP_HISTORY_ID,
+ PROP_GTK_ENTRY
+};
+
+#define DEFAULT_MAX_HISTORY_SAVED 10 /* This seems to make more sense then 60*/
+
struct _GnomeEntryPrivate {
- Bonobo_PropertyBag pbag;
+ gchar *history_id;
- gboolean constructed;
+ GList *items;
- gboolean is_file_entry;
+ guint16 max_saved;
+ guint32 changed : 1;
};
-
-static void gnome_entry_class_init (GnomeEntryClass *class);
-static void gnome_entry_init (GnomeEntry *gentry);
-static void gnome_entry_finalize (GObject *object);
-static GObject*
-gnome_entry_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_properties);
+struct item {
+ gboolean save;
+ gchar *text;
+};
-static GnomeComponentWidget *parent_class;
-enum {
- PROP_0,
+static void gnome_entry_class_init (GnomeEntryClass *class);
+static void gnome_entry_init (GnomeEntry *gentry);
+static void gnome_entry_destroy (GtkObject *object);
+static void gnome_entry_finalize (GObject *object);
- /* Construction properties */
- PROP_IS_FILE_ENTRY
-};
+static void gnome_entry_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec);
+static void gnome_entry_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec);
+
+static GtkComboClass *parent_class;
-GType
+guint
gnome_entry_get_type (void)
{
- static GType entry_type = 0;
-
- if (!entry_type) {
- GtkTypeInfo entry_info = {
- "GnomeEntry",
- sizeof (GnomeEntry),
- sizeof (GnomeEntryClass),
- (GtkClassInitFunc) gnome_entry_class_init,
- (GtkObjectInitFunc) gnome_entry_init,
- NULL,
- NULL,
- NULL
- };
-
- entry_type = gtk_type_unique (gnome_component_widget_get_type (), &entry_info);
- }
-
- return entry_type;
+ static guint entry_type = 0;
+
+ if (!entry_type) {
+ GtkTypeInfo entry_info = {
+ "GnomeEntry",
+ sizeof (GnomeEntry),
+ sizeof (GnomeEntryClass),
+ (GtkClassInitFunc) gnome_entry_class_init,
+ (GtkObjectInitFunc) gnome_entry_init,
+ NULL,
+ NULL,
+ NULL
+ };
+
+ entry_type = gtk_type_unique (gtk_combo_get_type (), &entry_info);
+ }
+
+ return entry_type;
}
static void
-gnome_entry_set_property (GObject *object, guint param_id,
- const GValue *value, GParamSpec *pspec)
+gnome_entry_class_init (GnomeEntryClass *class)
{
- GnomeEntry *entry;
-
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_ENTRY (object));
-
- entry = GNOME_ENTRY (object);
-
- switch (param_id) {
- case PROP_IS_FILE_ENTRY:
- g_assert (!entry->_priv->constructed);
- entry->_priv->is_file_entry = g_value_get_boolean (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
+ GtkObjectClass *object_class;
+ GObjectClass *gobject_class;
+
+ object_class = (GtkObjectClass *) class;
+ gobject_class = (GObjectClass *) class;
+
+ parent_class = gtk_type_class (gtk_combo_get_type ());
+
+ object_class->destroy = gnome_entry_destroy;
+
+ gobject_class->finalize = gnome_entry_finalize;
+ gobject_class->set_property = gnome_entry_set_property;
+ gobject_class->get_property = gnome_entry_get_property;
+
+ g_object_class_install_property (gobject_class,
+ PROP_HISTORY_ID,
+ g_param_spec_string ("history_id",
+ _("History id"),
+ _("History id"),
+ NULL,
+ G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class,
+ PROP_GTK_ENTRY,
+ g_param_spec_object ("gtk_entry",
+ _("GTK entry"),
+ _("The GTK entry"),
+ GTK_TYPE_ENTRY,
+ G_PARAM_READABLE));
}
static void
-gnome_entry_get_property (GObject *object, guint param_id, GValue *value,
- GParamSpec *pspec)
+gnome_entry_get_property (GObject *object,
+ guint param_id,
+ GValue *value,
+ GParamSpec *pspec)
{
- GnomeEntry *entry;
+ GnomeEntry *entry = GNOME_ENTRY (object);
+
+ switch (param_id) {
+ case PROP_HISTORY_ID:
+ g_value_set_string (value, entry->_priv->history_id);
+ break;
+ case PROP_GTK_ENTRY:
+ g_value_set_object (value, gnome_entry_gtk_entry (entry));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
+
+}
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_ENTRY (object));
+static void
+gnome_entry_set_property (GObject *object,
+ guint param_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ GnomeEntry *entry = GNOME_ENTRY (object);
+
+ switch (param_id) {
+ case PROP_HISTORY_ID:
+ gnome_entry_set_history_id (entry, g_value_get_string (value));
+ gnome_entry_load_history (entry);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
+ break;
+ }
+
+}
- entry = GNOME_ENTRY (object);
+static void
+entry_changed (GtkWidget *widget, gpointer data)
+{
+ GnomeEntry *gentry;
- switch (param_id) {
- case PROP_IS_FILE_ENTRY:
- g_value_set_boolean (value, entry->_priv->is_file_entry);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- break;
- }
+ gentry = data;
+ gentry->_priv->changed = TRUE;
}
static void
-gnome_entry_class_init (GnomeEntryClass *class)
+entry_activated (GtkWidget *widget, gpointer data)
{
- GtkObjectClass *object_class;
- GObjectClass *gobject_class;
-
- object_class = (GtkObjectClass *) class;
- gobject_class = (GObjectClass *) class;
+ GnomeEntry *gentry;
+ const gchar *text;
- parent_class = gtk_type_class (gnome_component_widget_get_type ());
+ gentry = data;
- gobject_class->get_property = gnome_entry_get_property;
- gobject_class->set_property = gnome_entry_set_property;
+ text = gtk_entry_get_text (GTK_ENTRY (widget));
- /* Construction properties */
- g_object_class_install_property
- (gobject_class,
- PROP_IS_FILE_ENTRY,
- g_param_spec_boolean ("is-file-entry", NULL, NULL,
- FALSE,
- (G_PARAM_READABLE | G_PARAM_WRITABLE |
- G_PARAM_CONSTRUCT_ONLY)));
+ if (!gentry->_priv->changed || (strcmp (text, "") == 0)) {
+ gentry->_priv->changed = FALSE;
+ return;
+ }
- gobject_class->constructor = gnome_entry_constructor;
- gobject_class->finalize = gnome_entry_finalize;
+ gnome_entry_prepend_history (gentry, TRUE, gtk_entry_get_text (GTK_ENTRY (widget)));
}
static void
gnome_entry_init (GnomeEntry *gentry)
{
- gentry->_priv = g_new0 (GnomeEntryPrivate, 1);
+ gentry->_priv = g_new0(GnomeEntryPrivate, 1);
+
+ gentry->_priv->changed = FALSE;
+ gentry->_priv->history_id = NULL;
+ gentry->_priv->items = NULL;
+ gentry->_priv->max_saved = DEFAULT_MAX_HISTORY_SAVED;
+
+ gtk_signal_connect (GTK_OBJECT (gnome_entry_gtk_entry (gentry)), "changed",
+ (GtkSignalFunc) entry_changed,
+ gentry);
+ gtk_signal_connect (GTK_OBJECT (gnome_entry_gtk_entry (gentry)), "activate",
+ (GtkSignalFunc) entry_activated,
+ gentry);
+ gtk_combo_disable_activate (GTK_COMBO (gentry));
+ gtk_combo_set_case_sensitive (GTK_COMBO (gentry), TRUE);
}
-extern GnomeComponentWidget *gnome_component_widget_do_construct (GnomeComponentWidget *);
-
-static GObject*
-gnome_entry_constructor (GType type,
- guint n_construct_properties,
- GObjectConstructParam *construct_properties)
+/**
+ * gnome_entry_construct:
+ * @gentry: Pointer to GnomeEntry object.
+ * @history_id: If not %NULL, the text id under which history data is stored
+ *
+ * Constructs a #GnomeEntry object, for language bindings or subclassing
+ * use #gnome_entry_new from C
+ *
+ * Returns:
+ */
+void
+gnome_entry_construct (GnomeEntry *gentry,
+ const gchar *history_id)
{
- GObject *object = G_OBJECT_CLASS (parent_class)->constructor
- (type, n_construct_properties, construct_properties);
- GnomeEntry *gentry = GNOME_ENTRY (object);
- GnomeEntryPrivate *priv = gentry->_priv;
- Bonobo_Unknown corba_objref = CORBA_OBJECT_NIL;
- gchar *moniker = NULL;
- GValue value = { 0, };
- CORBA_Environment ev;
-
- if (type != GNOME_TYPE_ENTRY)
- return object;
-
- g_value_init (&value, G_TYPE_POINTER);
- g_object_get_property (object, "corba-objref", &value);
- corba_objref = g_value_get_pointer (&value);
- g_value_unset (&value);
-
- if (corba_objref != CORBA_OBJECT_NIL)
- goto out;
-
- g_value_init (&value, G_TYPE_STRING);
- g_object_get_property (object, "moniker", &value);
- moniker = g_value_dup_string (&value);
- g_value_unset (&value);
-
- if (moniker != NULL)
- goto out;
-
- if (priv->is_file_entry)
- g_object_set (object, "moniker", "OAFIID:GNOME_UI_Component_FileEntry", NULL);
- else
- g_object_set (object, "moniker", "OAFIID:GNOME_UI_Component_Entry", NULL);
-
- out:
- g_free (moniker);
- if (!gnome_component_widget_do_construct (GNOME_COMPONENT_WIDGET (gentry)))
- return NULL;
-
- corba_objref = bonobo_widget_get_objref (BONOBO_WIDGET (gentry));
- if (corba_objref == CORBA_OBJECT_NIL) {
- g_object_unref (object);
- return NULL;
- }
-
- CORBA_exception_init (&ev);
- priv->pbag = Bonobo_Unknown_queryInterface (corba_objref, "IDL:Bonobo/PropertyBag:1.0", &ev);
- CORBA_exception_free (&ev);
-
- return object;
+ g_return_if_fail (gentry != NULL);
+
+ gnome_entry_set_history_id (gentry, history_id);
+ gnome_entry_load_history (gentry);
}
+
+/**
+ * gnome_entry_new
+ * @history_id: If not %NULL, the text id under which history data is stored
+ *
+ * Description: Creates a new GnomeEntry widget. If @history_id is
+ * not %NULL, then the history list will be saved and restored between
+ * uses under the given id.
+ *
+ * Returns: Newly-created GnomeEntry widget.
+ */
GtkWidget *
-gnome_entry_new (void)
+gnome_entry_new (const gchar *history_id)
{
- return g_object_new (gnome_entry_get_type (), "is-file-entry", FALSE, NULL);
+ GnomeEntry *gentry;
+
+ gentry = gtk_type_new (gnome_entry_get_type ());
+
+ gnome_entry_construct (gentry, history_id);
+
+ return GTK_WIDGET (gentry);
}
-GtkWidget *
-gnome_file_entry_new (void)
+static void
+free_item (gpointer data, gpointer user_data)
{
- return g_object_new (gnome_entry_get_type (), "is-file-entry", TRUE, NULL);
+ struct item *item;
+
+ item = data;
+ if (item->text)
+ g_free (item->text);
+
+ g_free (item);
+}
+
+static void
+free_items (GnomeEntry *gentry)
+{
+ g_list_foreach (gentry->_priv->items, free_item, NULL);
+ g_list_free (gentry->_priv->items);
+ gentry->_priv->items = NULL;
+}
+
+static void
+gnome_entry_destroy (GtkObject *object)
+{
+ GnomeEntry *gentry;
+
+ /* remember, destroy can be run multiple times! */
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (object));
+
+ gentry = GNOME_ENTRY (object);
+
+ if(gentry->_priv->history_id) {
+ GtkWidget *entry;
+ const gchar *text;
+
+ entry = gnome_entry_gtk_entry (gentry);
+ text = gtk_entry_get_text (GTK_ENTRY (entry));
+
+ if (gentry->_priv->changed && (strcmp (text, "") != 0)) {
+ struct item *item;
+
+ item = g_new (struct item, 1);
+ item->save = 1;
+ item->text = g_strdup (text);
+
+ gentry->_priv->items = g_list_prepend (gentry->_priv->items, item);
+ }
+
+ gnome_entry_save_history (gentry);
+
+ g_free (gentry->_priv->history_id);
+ gentry->_priv->history_id = NULL;
+
+ free_items (gentry);
+ }
+
+ if (GTK_OBJECT_CLASS (parent_class)->destroy)
+ (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
}
static void
gnome_entry_finalize (GObject *object)
{
- GnomeEntry *gentry;
- CORBA_Environment ev;
+ GnomeEntry *gentry;
+
+ g_return_if_fail (object != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (object));
+
+ gentry = GNOME_ENTRY (object);
+
+ g_free(gentry->_priv);
+ gentry->_priv = NULL;
+
+ if (G_OBJECT_CLASS (parent_class)->finalize)
+ (* G_OBJECT_CLASS (parent_class)->finalize) (object);
+}
+
+/**
+ * gnome_entry_gtk_entry
+ * @gentry: Pointer to GnomeEntry object.
+ *
+ * Description: Obtain pointer to GnomeEntry's internal text entry
+ *
+ * Returns: Pointer to GtkEntry widget.
+ */
+GtkWidget *
+gnome_entry_gtk_entry (GnomeEntry *gentry)
+{
+ g_return_val_if_fail (gentry != NULL, NULL);
+ g_return_val_if_fail (GNOME_IS_ENTRY (gentry), NULL);
+
+ return GTK_COMBO (gentry)->entry;
+}
+
+/**
+ * gnome_entry_set_history_id
+ * @gentry: Pointer to GnomeEntry object.
+ * @history_id: If not %NULL, the text id under which history data is stored
+ *
+ * Description: Set or clear the history id of the GnomeEntry widget. If
+ * @history_id is %NULL, the widget's history id is cleared. Otherwise,
+ * the given id replaces the previous widget history id.
+ *
+ * Returns:
+ */
+void
+gnome_entry_set_history_id (GnomeEntry *gentry, const gchar *history_id)
+{
+ g_return_if_fail (gentry != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (gentry));
+
+ if (gentry->_priv->history_id)
+ g_free (gentry->_priv->history_id);
+
+ gentry->_priv->history_id = g_strdup (history_id); /* this handles NULL correctly */
+}
+
+/**
+ * gnome_entry_get_history_id
+ * @gentry: Pointer to GnomeEntry object.
+ *
+ * Description: Returns the current history id of the GnomeEntry widget.
+ *
+ * Returns: The current history id.
+ */
+const gchar *
+gnome_entry_get_history_id (GnomeEntry *gentry)
+{
+ g_return_val_if_fail (gentry != NULL, NULL);
+ g_return_val_if_fail (GNOME_IS_ENTRY (gentry), NULL);
+
+ return gentry->_priv->history_id;
+}
- g_return_if_fail (object != NULL);
- g_return_if_fail (GNOME_IS_ENTRY (object));
- gentry = GNOME_ENTRY (object);
+/**
+ * gnome_entry_set_max_saved
+ * @gentry: Pointer to GnomeEntry object.
+ * @max_saved: Maximum number of history items to save
+ *
+ * Description: Set internal limit on number of history items saved
+ * to the config file, when #gnome_entry_save_history() is called.
+ * Zero is an acceptable value for @max_saved, but the same thing is
+ * accomplished by setting the history id of @gentry to %NULL.
+ *
+ * Returns:
+ */
+void
+gnome_entry_set_max_saved (GnomeEntry *gentry, guint max_saved)
+{
+ g_return_if_fail (gentry != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (gentry));
+
+ gentry->_priv->max_saved = max_saved;
+}
- if (gentry->_priv->pbag != CORBA_OBJECT_NIL) {
- CORBA_exception_init (&ev);
- Bonobo_Unknown_unref (gentry->_priv->pbag, &ev);
- CORBA_exception_free (&ev);
- }
+/**
+ * gnome_entry_get_max_saved
+ * @gentry: Pointer to GnomeEntry object.
+ *
+ * Description: Get internal limit on number of history items saved
+ * to the config file, when #gnome_entry_save_history() is called.
+ * See #gnome_entry_set_max_saved().
+ *
+ * Returns: An unsigned integer
+ */
+guint
+gnome_entry_get_max_saved (GnomeEntry *gentry)
+{
+ g_return_val_if_fail (gentry != NULL, 0);
+ g_return_val_if_fail (GNOME_IS_ENTRY (gentry), 0);
- g_free (gentry->_priv);
- gentry->_priv = NULL;
+ return gentry->_priv->max_saved;
+}
- if (G_OBJECT_CLASS (parent_class)->finalize)
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
+#ifdef FIXME
+static char *
+build_prefix (GnomeEntry *gentry, gboolean trailing_slash)
+{
+ return g_strconcat ("/",
+ gnome_program_get_name(gnome_program_get()),
+ "/History: ",
+ gentry->_priv->history_id,
+ trailing_slash ? "/" : "",
+ NULL);
}
+#endif
-gchar *
-gnome_entry_get_text (GnomeEntry *gentry)
+static void
+gnome_entry_add_history (GnomeEntry *gentry, gboolean save,
+ const gchar *text, gboolean append)
{
- g_return_val_if_fail (gentry != NULL, NULL);
- g_return_val_if_fail (GNOME_IS_ENTRY (gentry), NULL);
- g_return_val_if_fail (gentry->_priv->pbag != CORBA_OBJECT_NIL, NULL);
+ struct item *item;
+ GList *gitem;
+ GtkWidget *li;
+ GtkWidget *entry;
+ gchar *tmp;
+
+ g_return_if_fail (gentry != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (gentry));
+ g_return_if_fail (text != NULL); /* FIXME: should we just return without warning? */
+
+ entry = gnome_entry_gtk_entry (gentry);
+ tmp = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+
+ item = g_new (struct item, 1);
+ item->save = save;
+ item->text = g_strdup (text);
+
+ gentry->_priv->items = g_list_prepend (gentry->_priv->items, item);
- return bonobo_pbclient_get_string (gentry->_priv->pbag, "entry-text", NULL);
+ li = gtk_list_item_new_with_label (text);
+ gtk_widget_show (li);
+
+ gitem = g_list_append (NULL, li);
+
+ if (append)
+ gtk_list_prepend_items (GTK_LIST (GTK_COMBO (gentry)->list), gitem);
+ else
+ gtk_list_append_items (GTK_LIST (GTK_COMBO (gentry)->list), gitem);
+
+ gtk_entry_set_text (GTK_ENTRY (entry), tmp);
+ g_free (tmp);
+
+ /* gtk_entry_set_text runs our 'entry_changed' routine, so we have
+ to undo the effect */
+ gentry->_priv->changed = FALSE;
}
+
+
+/**
+ * gnome_entry_prepend_history
+ * @gentry: Pointer to GnomeEntry object.
+ * @save: If %TRUE, history entry will be saved to config file
+ * @text: Text to add
+ *
+ * Description: Adds a history item of the given @text to the head of
+ * the history list inside @gentry. If @save is %TRUE, the history
+ * item will be saved in the config file (assuming that @gentry's
+ * history id is not %NULL).
+ *
+ * Returns:
+ */
void
-gnome_entry_set_text (GnomeEntry *gentry, const gchar *text)
+gnome_entry_prepend_history (GnomeEntry *gentry, gboolean save,
+ const gchar *text)
{
- g_return_if_fail (gentry != NULL);
- g_return_if_fail (GNOME_IS_ENTRY (gentry));
- g_return_if_fail (gentry->_priv->pbag != CORBA_OBJECT_NIL);
+ gnome_entry_add_history (gentry, save, text, FALSE);
+}
+
- bonobo_pbclient_set_string (gentry->_priv->pbag, "entry-text", text, NULL);
+/**
+ * gnome_entry_append_history
+ * @gentry: Pointer to GnomeEntry object.
+ * @save: If %TRUE, history entry will be saved to config file
+ * @text: Text to add
+ *
+ * Description: Adds a history item of the given @text to the tail
+ * of the history list inside @gentry. If @save is %TRUE, the
+ * history item will be saved in the config file (assuming that
+ * @gentry's history id is not %NULL).
+ *
+ * Returns:
+ */
+void
+gnome_entry_append_history (GnomeEntry *gentry, gboolean save,
+ const gchar *text)
+{
+ gnome_entry_add_history (gentry, save, text, TRUE);
}
+
+
+static void
+set_combo_items (GnomeEntry *gentry)
+{
+ GtkList *gtklist;
+ GList *items;
+ GList *gitems;
+ struct item *item;
+ GtkWidget *li;
+ GtkWidget *entry;
+ gchar *tmp;
+
+ gtklist = GTK_LIST (GTK_COMBO (gentry)->list);
+
+ /* We save the contents of the entry because when we insert
+ * items on the combo list, the contents of the entry will get
+ * changed.
+ */
+
+ entry = gnome_entry_gtk_entry (gentry);
+ tmp = g_strdup (gtk_entry_get_text (GTK_ENTRY (entry)));
+
+ gtk_list_clear_items (gtklist, 0, -1); /* erase everything */
+
+ gitems = NULL;
+
+ for (items = gentry->_priv->items; items; items = items->next) {
+ item = items->data;
+
+ li = gtk_list_item_new_with_label (item->text);
+ gtk_widget_show (li);
+
+ gitems = g_list_append (gitems, li);
+ }
+
+ gtk_list_append_items (gtklist, gitems); /* this handles NULL correctly */
+
+ gtk_entry_set_text (GTK_ENTRY (entry), tmp);
+ g_free (tmp);
+
+ gentry->_priv->changed = FALSE;
+}
+
+
+/**
+ * gnome_entry_load_history
+ * @gentry: Pointer to GnomeEntry object.
+ *
+ * Description: Loads a stored history list from the GNOME config file,
+ * if one is available. If the history id of @gentry is %NULL,
+ * nothing occurs.
+ *
+ * Returns:
+ */
+void
+gnome_entry_load_history (GnomeEntry *gentry)
+{
+#ifdef FIXME
+ gchar *prefix;
+ struct item *item;
+ gint n;
+ gchar key[13];
+ gchar *value;
+
+ g_return_if_fail (gentry != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (gentry));
+
+ if (!(gnome_program_get_name(gnome_program_get()) && gentry->_priv->history_id))
+ return;
+
+ free_items (gentry);
+
+ prefix = build_prefix (gentry, TRUE);
+ gnome_config_push_prefix (prefix);
+ g_free (prefix);
+
+ for (n = 0; ; n++) {
+ g_snprintf (key, sizeof(key), "%d", n);
+ value = gnome_config_get_string (key);
+ if (!value)
+ break;
+
+ item = g_new (struct item, 1);
+ item->save = TRUE;
+ item->text = value;
+
+ gentry->_priv->items = g_list_append (gentry->_priv->items, item);
+ }
+
+ set_combo_items (gentry);
+
+ gnome_config_pop_prefix ();
+#endif
+}
+
+/**
+ * gnome_entry_clear_history
+ * @gentry: Pointer to GnomeEntry object.
+ *
+ * Description: Clears the history, you should call #gnome_entry_save_history
+ * To make the change permanent.
+ *
+ * Returns:
+ */
+void
+gnome_entry_clear_history (GnomeEntry *gentry)
+{
+ g_return_if_fail (gentry != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (gentry));
+
+ free_items (gentry);
+
+ set_combo_items (gentry);
+}
+
+static gboolean
+check_for_duplicates (struct item **final_items, gint n,
+ const struct item *item)
+{
+ gint i;
+ for (i = 0; i < n; i++) {
+ if (final_items[i] &&
+ !strcmp (item->text, final_items[i]->text))
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
+/**
+ * gnome_entry_save_history
+ * @gentry: Pointer to GnomeEntry object.
+ *
+ * Description: Force the history items of the widget to be stored
+ * in a configuration file. If the history id of @gentry is %NULL,
+ * nothing occurs.
+ *
+ * Returns:
+ */
+void
+gnome_entry_save_history (GnomeEntry *gentry)
+{
+#ifdef FIXME
+ gchar *prefix;
+ GList *items;
+ struct item *final_items[DEFAULT_MAX_HISTORY_SAVED];
+ struct item *item;
+ gint n;
+ gchar key[13];
+
+ g_return_if_fail (gentry != NULL);
+ g_return_if_fail (GNOME_IS_ENTRY (gentry));
+
+ if (!(gnome_program_get_name(gnome_program_get()) && gentry->_priv->history_id))
+ return;
+
+ prefix = build_prefix (gentry, TRUE);
+ /* a little ugly perhaps, but should speed things up and
+ * prevent us from building this twice */
+ prefix[strlen (prefix) - 1] = '\0';
+ if (gnome_config_has_section (prefix))
+ gnome_config_clean_section (prefix);
+
+ prefix [strlen (prefix)] = '/';
+ gnome_config_push_prefix (prefix);
+ g_free (prefix);
+
+ for (n = 0, items = gentry->_priv->items; items && n < gentry->_priv->max_saved; items = items->next, n++) {
+ item = items->data;
+
+ final_items [n] = NULL;
+ if (item->save) {
+ if (check_for_duplicates (final_items, n, item)) {
+ final_items [n] = item;
+ g_snprintf (key, sizeof(key), "%d", n);
+ gnome_config_set_string (key, item->text);
+ }
+ }
+ }
+
+ gnome_config_pop_prefix ();
+ prefix = g_strconcat ("/",gnome_app_id,NULL);
+ gnome_config_sync_file (prefix);
+ g_free (prefix);
+#endif
+}
diff --git a/libgnomeui/gnome-entry.h b/libgnomeui/gnome-entry.h
index 23ddd63..0252508 100644
--- a/libgnomeui/gnome-entry.h
+++ b/libgnomeui/gnome-entry.h
@@ -1,4 +1,4 @@
-/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* Copyright (C) 1997, 1998, 1999, 2000 Free Software Foundation
* All rights reserved.
@@ -33,10 +33,12 @@
#define GNOME_ENTRY_H
-#include <libgnomeui/gnome-component-widget.h>
+#include <glib.h>
+#include <gtk/gtkcombo.h>
+#include <libgnome/gnome-defs.h>
-G_BEGIN_DECLS
+BEGIN_GNOME_DECLS
#define GNOME_TYPE_ENTRY (gnome_entry_get_type ())
@@ -52,28 +54,46 @@ typedef struct _GnomeEntryPrivate GnomeEntryPrivate;
typedef struct _GnomeEntryClass GnomeEntryClass;
struct _GnomeEntry {
- GnomeComponentWidget widget;
+ GtkCombo combo;
- /*< private >*/
- GnomeEntryPrivate *_priv;
+ /*< private >*/
+ GnomeEntryPrivate *_priv;
};
struct _GnomeEntryClass {
- GnomeComponentWidgetClass parent_class;
+ GtkComboClass parent_class;
};
-GType gnome_entry_get_type (void) G_GNUC_CONST;
+guint gnome_entry_get_type (void) G_GNUC_CONST;
+GtkWidget *gnome_entry_new (const gchar *history_id);
-GtkWidget *gnome_entry_new (void);
+/* for language bindings and subclassing, use gnome_entry_new */
+void gnome_entry_construct (GnomeEntry *gentry,
+ const gchar *history_id);
-GtkWidget *gnome_file_entry_new (void);
+GtkWidget *gnome_entry_gtk_entry (GnomeEntry *gentry);
-gchar *gnome_entry_get_text (GnomeEntry *gentry);
+const gchar *gnome_entry_get_history_id (GnomeEntry *gentry);
-void gnome_entry_set_text (GnomeEntry *gentry,
- const gchar *text);
+void gnome_entry_set_history_id (GnomeEntry *gentry,
+ const gchar *history_id);
+const gchar *gnome_entry_get_history_id (GnomeEntry *gentry);
-G_END_DECLS
+void gnome_entry_set_max_saved (GnomeEntry *gentry,
+ guint max_saved);
+guint gnome_entry_get_max_saved (GnomeEntry *gentry);
+
+void gnome_entry_prepend_history (GnomeEntry *gentry,
+ gboolean save,
+ const gchar *text);
+void gnome_entry_append_history (GnomeEntry *gentry,
+ gboolean save,
+ const gchar *text);
+void gnome_entry_load_history (GnomeEntry *gentry);
+void gnome_entry_save_history (GnomeEntry *gentry);
+void gnome_entry_clear_history (GnomeEntry *gentry);
+
+END_GNOME_DECLS
#endif
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]