diff options
author | Emmanuele Bassi <ebassi@cvs.gnome.org> | 2006-03-29 20:16:44 +0000 |
---|---|---|
committer | Emmanuele Bassi <ebassi@src.gnome.org> | 2006-03-29 20:16:44 +0000 |
commit | 056f6db533b418e3571d2614c349bb412900dbc1 (patch) | |
tree | e3126a3d1d0300f497f9f99ee6e781327d92a8f4 /gtk/gtkrecentchooserdialog.c | |
parent | 5f5de68e8267cd3c3f4effa2e552b66a03951cce (diff) | |
download | gtk+-056f6db533b418e3571d2614c349bb412900dbc1.tar.gz |
Import GtkRecent* from libegg.
2006-03-29 Emmanuele Bassi <ebassi@cvs.gnome.org>
Import GtkRecent* from libegg.
* gtk/gtkrecentmanager.[ch]: Add GtkRecentManager, an object
for managing a list of recently used resources.
* gtk/gtkrecentchooser.[ch]:
* gtk/gtkrecentchooserdefault.[ch]:
* gtk/gtkrecentchooserdialog.[ch]:
* gtk/gtkrecentchoosermenu.[ch]:
* gtk/gtkrecentchooserprivate.h:
* gtk/gtkrecentchooserutils.[ch]:
* gtk/gtkrecentchooserwidget.[ch]: Add GtkRecentChooser, a
GTypeInterface for widgets implementing viewers for recently
used resources.
* gtk/gtkrecentfilter.[ch]: GtkRecentFilter, a filter object
for GtkRecentChooser implementations.
* gtk/gtk.h:
* gtk/gtk.symbols:
* gtk/Makefile.am: Build glue for GtkRecent*.
Diffstat (limited to 'gtk/gtkrecentchooserdialog.c')
-rw-r--r-- | gtk/gtkrecentchooserdialog.c | 376 |
1 files changed, 376 insertions, 0 deletions
diff --git a/gtk/gtkrecentchooserdialog.c b/gtk/gtkrecentchooserdialog.c new file mode 100644 index 0000000000..a047789a9a --- /dev/null +++ b/gtk/gtkrecentchooserdialog.c @@ -0,0 +1,376 @@ +/* GTK - The GIMP Toolkit + * gtkrecentchooserdialog.c: Recent files selector dialog + * Copyright (C) 2006 Emmanuele Bassi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#include <config.h> + +#include "gtkrecentchooserdialog.h" +#include "gtkrecentchooserwidget.h" +#include "gtkrecentchooserutils.h" +#include "gtkrecentmanager.h" +#include "gtktypebuiltins.h" +#include "gtkalias.h" + +#include <stdarg.h> + +struct _GtkRecentChooserDialogPrivate +{ + GtkRecentManager *manager; + + GtkWidget *chooser; +}; + +#define GTK_RECENT_CHOOSER_DIALOG_GET_PRIVATE(obj) (GTK_RECENT_CHOOSER_DIALOG (obj)->priv) + +static void gtk_recent_chooser_dialog_class_init (GtkRecentChooserDialogClass *klass); +static void gtk_recent_chooser_dialog_init (GtkRecentChooserDialog *dialog); +static void gtk_recent_chooser_dialog_finalize (GObject *object); + +static GObject *gtk_recent_chooser_dialog_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params); + +static void gtk_recent_chooser_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec); +static void gtk_recent_chooser_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec); + +static void gtk_recent_chooser_dialog_map (GtkWidget *widget); +static void gtk_recent_chooser_dialog_unmap (GtkWidget *widget); +static void gtk_recent_chooser_dialog_style_set (GtkWidget *widget, + GtkStyle *old_style); + + +G_DEFINE_TYPE_WITH_CODE (GtkRecentChooserDialog, + gtk_recent_chooser_dialog, + GTK_TYPE_DIALOG, + G_IMPLEMENT_INTERFACE (GTK_TYPE_RECENT_CHOOSER, + _gtk_recent_chooser_delegate_iface_init)); + +static void +gtk_recent_chooser_dialog_class_init (GtkRecentChooserDialogClass *klass) +{ + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + gobject_class->set_property = gtk_recent_chooser_dialog_set_property; + gobject_class->get_property = gtk_recent_chooser_dialog_get_property; + gobject_class->constructor = gtk_recent_chooser_dialog_constructor; + gobject_class->finalize = gtk_recent_chooser_dialog_finalize; + + widget_class->map = gtk_recent_chooser_dialog_map; + widget_class->unmap = gtk_recent_chooser_dialog_unmap; + widget_class->style_set = gtk_recent_chooser_dialog_style_set; + + _gtk_recent_chooser_install_properties (gobject_class); + + g_type_class_add_private (klass, sizeof (GtkRecentChooserDialogPrivate)); +} + +static void +gtk_recent_chooser_dialog_init (GtkRecentChooserDialog *dialog) +{ + GtkRecentChooserDialogPrivate *priv = G_TYPE_INSTANCE_GET_PRIVATE (dialog, + GTK_TYPE_RECENT_CHOOSER_DIALOG, + GtkRecentChooserDialogPrivate); + + dialog->priv = priv; + + gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE); +} + +/* we intercept the GtkRecentChooser::item_activated signal and try to + * make the dialog emit a valid response signal + */ +static void +gtk_recent_chooser_item_activated_cb (GtkRecentChooser *chooser, + gpointer user_data) +{ + GtkRecentChooserDialog *dialog; + GList *children, *l; + + dialog = GTK_RECENT_CHOOSER_DIALOG (user_data); + + if (gtk_window_activate_default (GTK_WINDOW (dialog))) + return; + + children = gtk_container_get_children (GTK_CONTAINER (GTK_DIALOG (dialog)->action_area)); + + for (l = children; l; l = l->next) + { + GtkWidget *widget; + gint response_id; + + widget = GTK_WIDGET (l->data); + response_id = gtk_dialog_get_response_for_widget (GTK_DIALOG (dialog), widget); + + if (response_id == GTK_RESPONSE_ACCEPT || + response_id == GTK_RESPONSE_OK || + response_id == GTK_RESPONSE_YES || + response_id == GTK_RESPONSE_APPLY) + { + g_list_free (children); + + gtk_dialog_response (GTK_DIALOG (dialog), response_id); + + return; + } + } + + g_list_free (children); +} + +static GObject * +gtk_recent_chooser_dialog_constructor (GType type, + guint n_construct_properties, + GObjectConstructParam *construct_params) +{ + GObject *object; + GtkRecentChooserDialogPrivate *priv; + + object = G_OBJECT_CLASS (gtk_recent_chooser_dialog_parent_class)->constructor (type, + n_construct_properties, + construct_params); + priv = GTK_RECENT_CHOOSER_DIALOG_GET_PRIVATE (object); + + gtk_widget_push_composite_child (); + + if (priv->manager) + priv->chooser = g_object_new (GTK_TYPE_RECENT_CHOOSER_WIDGET, + "recent-manager", priv->manager, + NULL); + else + priv->chooser = g_object_new (GTK_TYPE_RECENT_CHOOSER_WIDGET, NULL); + + g_signal_connect (priv->chooser, "item-activated", + G_CALLBACK (gtk_recent_chooser_item_activated_cb), + object); + + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (object)->vbox), + priv->chooser, TRUE, TRUE, 0); + gtk_widget_show (priv->chooser); + + _gtk_recent_chooser_set_delegate (GTK_RECENT_CHOOSER (object), + GTK_RECENT_CHOOSER (priv->chooser)); + + gtk_widget_pop_composite_child (); + + return object; +} + +static void +gtk_recent_chooser_dialog_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + GtkRecentChooserDialogPrivate *priv; + + priv = GTK_RECENT_CHOOSER_DIALOG_GET_PRIVATE (object); + + switch (prop_id) + { + case GTK_RECENT_CHOOSER_PROP_RECENT_MANAGER: + priv->manager = g_value_get_object (value); + break; + default: + g_object_set_property (G_OBJECT (priv->chooser), pspec->name, value); + break; + } +} + +static void +gtk_recent_chooser_dialog_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + GtkRecentChooserDialogPrivate *priv; + + priv = GTK_RECENT_CHOOSER_DIALOG_GET_PRIVATE (object); + + g_object_get_property (G_OBJECT (priv->chooser), pspec->name, value); +} + +static void +gtk_recent_chooser_dialog_finalize (GObject *object) +{ + GtkRecentChooserDialog *dialog = GTK_RECENT_CHOOSER_DIALOG (object); + + dialog->priv->manager = NULL; + + G_OBJECT_CLASS (gtk_recent_chooser_dialog_parent_class)->finalize (object); +} + +static void +gtk_recent_chooser_dialog_map (GtkWidget *widget) +{ + GtkRecentChooserDialog *dialog = GTK_RECENT_CHOOSER_DIALOG (widget); + GtkRecentChooserDialogPrivate *priv = dialog->priv; + + if (!GTK_WIDGET_MAPPED (priv->chooser)) + gtk_widget_map (priv->chooser); + + GTK_WIDGET_CLASS (gtk_recent_chooser_dialog_parent_class)->map (widget); +} + +static void +gtk_recent_chooser_dialog_unmap (GtkWidget *widget) +{ + GtkRecentChooserDialog *dialog = GTK_RECENT_CHOOSER_DIALOG (widget); + GtkRecentChooserDialogPrivate *priv = dialog->priv; + + GTK_WIDGET_CLASS (gtk_recent_chooser_dialog_parent_class)->unmap (widget); + + gtk_widget_unmap (priv->chooser); +} + +/* taken from gtkfilechooserdialog.c */ +static void +gtk_recent_chooser_dialog_style_set (GtkWidget *widget, + GtkStyle *old_style) +{ + GtkDialog *dialog; + + dialog = GTK_DIALOG (widget); + + /* Override the style properties with HIG-compliant spacings. Ugh. + * http://developer.gnome.org/projects/gup/hig/1.0/layout.html#layout-dialogs + * http://developer.gnome.org/projects/gup/hig/1.0/windows.html#alert-spacing + */ + + gtk_container_set_border_width (GTK_CONTAINER (dialog->vbox), 12); + gtk_box_set_spacing (GTK_BOX (dialog->vbox), 24); + + gtk_container_set_border_width (GTK_CONTAINER (dialog->action_area), 0); + gtk_box_set_spacing (GTK_BOX (dialog->action_area), 6); + + if (GTK_WIDGET_CLASS (gtk_recent_chooser_dialog_parent_class)->style_set) + GTK_WIDGET_CLASS (gtk_recent_chooser_dialog_parent_class)->style_set (widget, old_style); +} + +static GtkWidget * +gtk_recent_chooser_dialog_new_valist (const gchar *title, + GtkWindow *parent, + GtkRecentManager *manager, + const gchar *first_button_text, + va_list varargs) +{ + GtkWidget *result; + const char *button_text = first_button_text; + gint response_id; + + result = g_object_new (GTK_TYPE_RECENT_CHOOSER_DIALOG, + "title", title, + "recent-manager", manager, + NULL); + + if (parent) + gtk_window_set_transient_for (GTK_WINDOW (result), parent); + + while (button_text) + { + response_id = va_arg (varargs, gint); + gtk_dialog_add_button (GTK_DIALOG (result), button_text, response_id); + button_text = va_arg (varargs, const gchar *); + } + + return result; +} + +/** + * gtk_recent_chooser_dialog_new: + * @title: Title of the dialog, or %NULL + * @parent: Transient parent of the dialog, or %NULL, + * @first_button_text: stock ID or text to go in the first button, or %NULL + * @Varargs: response ID for the first button, then additional (button, id) + * pairs, ending with %NULL + * + * Creates a new #GtkRecentChooserDialog. This function is analogous to + * gtk_dialog_new_with_buttons(). + * + * Return value: a new #GtkRecentChooserDialog + * + * Since: 2.10 + */ +GtkWidget * +gtk_recent_chooser_dialog_new (const gchar *title, + GtkWindow *parent, + const gchar *first_button_text, + ...) +{ + GtkWidget *result; + va_list varargs; + + va_start (varargs, first_button_text); + result = gtk_recent_chooser_dialog_new_valist (title, + parent, + NULL, + first_button_text, + varargs); + va_end (varargs); + + return result; +} + +/** + * gtk_recent_chooser_dialog_new_for_manager: + * @title: Title of the dialog, or %NULL + * @parent: Transient parent of the dialog, or %NULL, + * @manager: a #GtkRecentManager + * @first_button_text: stock ID or text to go in the first button, or %NULL + * @Varargs: response ID for the first button, then additional (button, id) + * pairs, ending with %NULL + * + * Creates a new #GtkRecentChooserDialog with a specified recent manager. + * + * This is useful if you have implemented your own recent manager, or if you + * have a customized instance of a #GtkRecentManager object. + * + * Return value: a new #GtkRecentChooserDialog + * + * Since: 2.10 + */ +GtkWidget * +gtk_recent_chooser_dialog_new_for_manager (const gchar *title, + GtkWindow *parent, + GtkRecentManager *manager, + const gchar *first_button_text, + ...) +{ + GtkWidget *result; + va_list varargs; + + va_start (varargs, first_button_text); + result = gtk_recent_chooser_dialog_new_valist (title, + parent, + manager, + first_button_text, + varargs); + va_end (varargs); + + return result; +} + +#define __GTK_RECENT_CHOOSER_DIALOG_C__ +#include "gtkaliasdef.c" |