]> Pileus Git - ~andy/gtk/blob - gtk/gtkprinteroption.c
stylecontext: Do invalidation on first resize container
[~andy/gtk] / gtk / gtkprinteroption.c
1 /* GTK - The GIMP Toolkit
2  * gtkprinteroption.c: Handling possible settings for a specific printer setting
3  * Copyright (C) 2006, Red Hat, Inc.
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 #include <string.h>
21 #include <gmodule.h>
22
23 #include "gtkintl.h"
24 #include "gtkprivate.h"
25 #include "gtkprinteroption.h"
26
27 /*****************************************
28  *            GtkPrinterOption           *
29  *****************************************/
30
31 enum {
32   CHANGED,
33   LAST_SIGNAL
34 };
35
36 enum {
37   PROP_0,
38   PROP_VALUE
39 };
40
41 static guint signals[LAST_SIGNAL] = { 0 };
42
43 static void gtk_printer_option_set_property (GObject      *object,
44                                              guint         prop_id,
45                                              const GValue *value,
46                                              GParamSpec   *pspec);
47 static void gtk_printer_option_get_property (GObject      *object,
48                                              guint         prop_id,
49                                              GValue       *value,
50                                              GParamSpec   *pspec);
51
52 G_DEFINE_TYPE (GtkPrinterOption, gtk_printer_option, G_TYPE_OBJECT)
53
54 static void
55 gtk_printer_option_finalize (GObject *object)
56 {
57   GtkPrinterOption *option = GTK_PRINTER_OPTION (object);
58   int i;
59   
60   g_free (option->name);
61   g_free (option->display_text);
62   g_free (option->value);
63   for (i = 0; i < option->num_choices; i++)
64     {
65       g_free (option->choices[i]);
66       g_free (option->choices_display[i]);
67     }
68   g_free (option->choices);
69   g_free (option->choices_display);
70   g_free (option->group);
71   
72   G_OBJECT_CLASS (gtk_printer_option_parent_class)->finalize (object);
73 }
74
75 static void
76 gtk_printer_option_init (GtkPrinterOption *option)
77 {
78   option->value = g_strdup ("");
79   option->activates_default = FALSE;
80 }
81
82 static void
83 gtk_printer_option_class_init (GtkPrinterOptionClass *class)
84 {
85   GObjectClass *gobject_class = (GObjectClass *)class;
86
87   gobject_class->finalize = gtk_printer_option_finalize;
88   gobject_class->set_property = gtk_printer_option_set_property;
89   gobject_class->get_property = gtk_printer_option_get_property;
90
91   signals[CHANGED] =
92     g_signal_new ("changed",
93                   G_TYPE_FROM_CLASS (class),
94                   G_SIGNAL_RUN_LAST,
95                   G_STRUCT_OFFSET (GtkPrinterOptionClass, changed),
96                   NULL, NULL,
97                   g_cclosure_marshal_VOID__VOID,
98                   G_TYPE_NONE, 0);
99
100   g_object_class_install_property (G_OBJECT_CLASS (class),
101                                    PROP_VALUE,
102                                    g_param_spec_string ("value",
103                                                         P_("Option Value"),
104                                                         P_("Value of the option"),
105                                                         "",
106                                                         GTK_PARAM_READWRITE));
107 }
108
109 GtkPrinterOption *
110 gtk_printer_option_new (const char *name, const char *display_text,
111                         GtkPrinterOptionType type)
112 {
113   GtkPrinterOption *option;
114
115   option = g_object_new (GTK_TYPE_PRINTER_OPTION, NULL);
116
117   option->name = g_strdup (name);
118   option->display_text = g_strdup (display_text);
119   option->type = type;
120   
121   return option;
122 }
123
124 static void
125 gtk_printer_option_set_property (GObject         *object,
126                                  guint            prop_id,
127                                  const GValue    *value,
128                                  GParamSpec      *pspec)
129 {
130   GtkPrinterOption *option = GTK_PRINTER_OPTION (object);
131
132   switch (prop_id)
133     {
134     case PROP_VALUE:
135       gtk_printer_option_set (option, g_value_get_string (value));
136       break;
137     default:
138       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
139       break;
140     }
141 }
142
143 static void
144 gtk_printer_option_get_property (GObject    *object,
145                                  guint       prop_id,
146                                  GValue     *value,
147                                  GParamSpec *pspec)
148 {
149   GtkPrinterOption *option = GTK_PRINTER_OPTION (object);
150
151   switch (prop_id)
152     {
153     case PROP_VALUE:
154       g_value_set_string (value, option->value);
155       break;
156     default:
157       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
158       break;
159     }
160 }
161
162 static void
163 emit_changed (GtkPrinterOption *option)
164 {
165   g_signal_emit (option, signals[CHANGED], 0);
166 }
167
168 void
169 gtk_printer_option_set (GtkPrinterOption *option,
170                         const char *value)
171 {
172   if (value == NULL)
173     value = "";
174   
175   if (strcmp (option->value, value) == 0)
176     return;
177
178   if ((option->type == GTK_PRINTER_OPTION_TYPE_PICKONE ||
179        option->type == GTK_PRINTER_OPTION_TYPE_ALTERNATIVE))
180     {
181       int i;
182       
183       for (i = 0; i < option->num_choices; i++)
184         {
185           if (g_ascii_strcasecmp (value, option->choices[i]) == 0)
186             {
187               value = option->choices[i];
188               break;
189             }
190         }
191
192       if (i == option->num_choices)
193         return; /* Not found in available choices */
194     }
195           
196   g_free (option->value);
197   option->value = g_strdup (value);
198   
199   emit_changed (option);
200 }
201
202 void
203 gtk_printer_option_set_boolean (GtkPrinterOption *option,
204                                 gboolean value)
205 {
206   gtk_printer_option_set (option, value ? "True" : "False");
207 }
208
209 void
210 gtk_printer_option_set_has_conflict  (GtkPrinterOption *option,
211                                       gboolean  has_conflict)
212 {
213   has_conflict = has_conflict != 0;
214   
215   if (option->has_conflict == has_conflict)
216     return;
217
218   option->has_conflict = has_conflict;
219   emit_changed (option);
220 }
221
222 void
223 gtk_printer_option_clear_has_conflict (GtkPrinterOption     *option)
224 {
225   gtk_printer_option_set_has_conflict  (option, FALSE);
226 }
227
228 void
229 gtk_printer_option_allocate_choices (GtkPrinterOption     *option,
230                                      int num)
231 {
232   g_free (option->choices);
233   g_free (option->choices_display);
234
235   option->num_choices = num;
236   if (num == 0)
237     {
238       option->choices = NULL;
239       option->choices_display = NULL;
240     }
241   else
242     {
243       option->choices = g_new0 (char *, num);
244       option->choices_display = g_new0 (char *, num);
245     }
246 }
247
248 void
249 gtk_printer_option_choices_from_array (GtkPrinterOption   *option,
250                                        int                 num_choices,
251                                        char               *choices[],
252                                        char              *choices_display[])
253 {
254   int i;
255   
256   gtk_printer_option_allocate_choices (option, num_choices);
257   for (i = 0; i < num_choices; i++)
258     {
259       option->choices[i] = g_strdup (choices[i]);
260       option->choices_display[i] = g_strdup (choices_display[i]);
261     }
262 }
263
264 gboolean
265 gtk_printer_option_has_choice (GtkPrinterOption     *option,
266                                const char           *choice)
267 {
268   int i;
269   
270   for (i = 0; i < option->num_choices; i++)
271     {
272       if (strcmp (option->choices[i], choice) == 0)
273         return TRUE;
274     }
275   
276   return FALSE;
277 }
278
279 void
280 gtk_printer_option_set_activates_default (GtkPrinterOption *option,
281                                           gboolean          activates)
282 {
283   g_return_if_fail (GTK_IS_PRINTER_OPTION (option));
284
285   option->activates_default = activates;
286 }
287
288 gboolean
289 gtk_printer_option_get_activates_default (GtkPrinterOption *option)
290 {
291   g_return_val_if_fail (GTK_IS_PRINTER_OPTION (option), FALSE);
292
293   return option->activates_default;
294 }