1 /* GTK - The GIMP Toolkit
2  * gtkrecentchooserwidget.c: embeddable recently used resources chooser widget
3  * Copyright (C) 2006 Emmanuele Bassi
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library. If not, see <http://www.gnu.org/licenses/>.
17  */
18 
19 #include "config.h"
20 
21 #include "gtkrecentchooserwidget.h"
22 #include "gtkrecentchooserdefault.h"
23 #include "gtkrecentchooserutils.h"
24 #include "gtkorientable.h"
25 #include "gtktypebuiltins.h"
26 
27 /**
28  * SECTION:gtkrecentchooserwidget
29  * @Short_description: Displays recently used files
30  * @Title: GtkRecentChooserWidget
31  * @See_also:#GtkRecentChooser, #GtkRecentChooserDialog
32  *
33  * #GtkRecentChooserWidget is a widget suitable for selecting recently used
34  * files.  It is the main building block of a #GtkRecentChooserDialog.  Most
35  * applications will only need to use the latter; you can use
36  * #GtkRecentChooserWidget as part of a larger window if you have special needs.
37  *
38  * Note that #GtkRecentChooserWidget does not have any methods of its own.
39  * Instead, you should use the functions that work on a #GtkRecentChooser.
40  *
41  * Recently used files are supported since GTK+ 2.10.
42  */
43 
44 
45 struct _GtkRecentChooserWidgetPrivate
46 {
47   GtkRecentManager *manager;
48 
49   GtkWidget *chooser;
50 };
51 
52 static void     gtk_recent_chooser_widget_set_property (GObject               *object,
53 						        guint                  prop_id,
54 						        const GValue          *value,
55 						        GParamSpec            *pspec);
56 static void     gtk_recent_chooser_widget_get_property (GObject               *object,
57 						        guint                  prop_id,
58 						        GValue                *value,
59 						        GParamSpec            *pspec);
60 static void     gtk_recent_chooser_widget_finalize     (GObject               *object);
61 
62 
G_DEFINE_TYPE_WITH_CODE(GtkRecentChooserWidget,gtk_recent_chooser_widget,GTK_TYPE_BOX,G_ADD_PRIVATE (GtkRecentChooserWidget)G_IMPLEMENT_INTERFACE (GTK_TYPE_RECENT_CHOOSER,_gtk_recent_chooser_delegate_iface_init))63 G_DEFINE_TYPE_WITH_CODE (GtkRecentChooserWidget,
64 		         gtk_recent_chooser_widget,
65 			 GTK_TYPE_BOX,
66                          G_ADD_PRIVATE (GtkRecentChooserWidget)
67 			 G_IMPLEMENT_INTERFACE (GTK_TYPE_RECENT_CHOOSER,
68 						_gtk_recent_chooser_delegate_iface_init))
69 
70 static void
71 gtk_recent_chooser_widget_constructed (GObject *gobject)
72 {
73   GtkRecentChooserWidget *self = GTK_RECENT_CHOOSER_WIDGET (gobject);
74 
75   self->priv->chooser = _gtk_recent_chooser_default_new (self->priv->manager);
76 
77   gtk_container_add (GTK_CONTAINER (self), self->priv->chooser);
78   gtk_widget_show (self->priv->chooser);
79   _gtk_recent_chooser_set_delegate (GTK_RECENT_CHOOSER (self),
80 				    GTK_RECENT_CHOOSER (self->priv->chooser));
81 }
82 
83 static void
gtk_recent_chooser_widget_set_property(GObject * object,guint prop_id,const GValue * value,GParamSpec * pspec)84 gtk_recent_chooser_widget_set_property (GObject      *object,
85 				        guint         prop_id,
86 				        const GValue *value,
87 				        GParamSpec   *pspec)
88 {
89   GtkRecentChooserWidgetPrivate *priv;
90 
91   priv = gtk_recent_chooser_widget_get_instance_private (GTK_RECENT_CHOOSER_WIDGET (object));
92 
93   switch (prop_id)
94     {
95     case GTK_RECENT_CHOOSER_PROP_RECENT_MANAGER:
96       priv->manager = g_value_get_object (value);
97       break;
98     default:
99       g_object_set_property (G_OBJECT (priv->chooser), pspec->name, value);
100       break;
101     }
102 }
103 
104 static void
gtk_recent_chooser_widget_get_property(GObject * object,guint prop_id,GValue * value,GParamSpec * pspec)105 gtk_recent_chooser_widget_get_property (GObject    *object,
106 				        guint       prop_id,
107 				        GValue     *value,
108 				        GParamSpec *pspec)
109 {
110   GtkRecentChooserWidgetPrivate *priv;
111 
112   priv = gtk_recent_chooser_widget_get_instance_private (GTK_RECENT_CHOOSER_WIDGET (object));
113 
114   g_object_get_property (G_OBJECT (priv->chooser), pspec->name, value);
115 }
116 
117 static void
gtk_recent_chooser_widget_finalize(GObject * object)118 gtk_recent_chooser_widget_finalize (GObject *object)
119 {
120   GtkRecentChooserWidget *self = GTK_RECENT_CHOOSER_WIDGET (object);
121 
122   self->priv->manager = NULL;
123 
124   G_OBJECT_CLASS (gtk_recent_chooser_widget_parent_class)->finalize (object);
125 }
126 
127 static void
gtk_recent_chooser_widget_class_init(GtkRecentChooserWidgetClass * klass)128 gtk_recent_chooser_widget_class_init (GtkRecentChooserWidgetClass *klass)
129 {
130   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
131 
132   gobject_class->constructed = gtk_recent_chooser_widget_constructed;
133   gobject_class->set_property = gtk_recent_chooser_widget_set_property;
134   gobject_class->get_property = gtk_recent_chooser_widget_get_property;
135   gobject_class->finalize = gtk_recent_chooser_widget_finalize;
136 
137   _gtk_recent_chooser_install_properties (gobject_class);
138 }
139 
140 static void
gtk_recent_chooser_widget_init(GtkRecentChooserWidget * widget)141 gtk_recent_chooser_widget_init (GtkRecentChooserWidget *widget)
142 {
143   widget->priv = gtk_recent_chooser_widget_get_instance_private (widget);
144 
145   gtk_orientable_set_orientation (GTK_ORIENTABLE (widget),
146                                   GTK_ORIENTATION_VERTICAL);
147 }
148 
149 /*
150  * Public API
151  */
152 
153 /**
154  * gtk_recent_chooser_widget_new:
155  *
156  * Creates a new #GtkRecentChooserWidget object.  This is an embeddable widget
157  * used to access the recently used resources list.
158  *
159  * Returns: a new #GtkRecentChooserWidget
160  *
161  * Since: 2.10
162  */
163 GtkWidget *
gtk_recent_chooser_widget_new(void)164 gtk_recent_chooser_widget_new (void)
165 {
166   return g_object_new (GTK_TYPE_RECENT_CHOOSER_WIDGET, NULL);
167 }
168 
169 /**
170  * gtk_recent_chooser_widget_new_for_manager:
171  * @manager: a #GtkRecentManager
172  *
173  * Creates a new #GtkRecentChooserWidget with a specified recent manager.
174  *
175  * This is useful if you have implemented your own recent manager, or if you
176  * have a customized instance of a #GtkRecentManager object.
177  *
178  * Returns: a new #GtkRecentChooserWidget
179  *
180  * Since: 2.10
181  */
182 GtkWidget *
gtk_recent_chooser_widget_new_for_manager(GtkRecentManager * manager)183 gtk_recent_chooser_widget_new_for_manager (GtkRecentManager *manager)
184 {
185   g_return_val_if_fail (manager == NULL || GTK_IS_RECENT_MANAGER (manager), NULL);
186 
187   return g_object_new (GTK_TYPE_RECENT_CHOOSER_WIDGET,
188   		       "recent-manager", manager,
189   		       NULL);
190 }
191