1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
5 * This program 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) version 3.
10 * This program 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.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with the program; if not, see <http://www.gnu.org/licenses/>
19 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
27 #include "e-composer-header.h"
29 #include <glib/gi18n.h>
45 struct _EComposerHeaderPrivate
{
48 GtkWidget
*action_label
;
51 GtkWidget
*remove_icon
;
52 GtkWidget
*show_label
;
53 GtkWidget
*hide_label
;
59 static guint signal_ids
[LAST_SIGNAL
];
61 G_DEFINE_ABSTRACT_TYPE (
67 composer_header_button_clicked_cb (GtkButton
*button
,
68 EComposerHeader
*header
)
70 gtk_widget_grab_focus (header
->input_widget
);
71 g_signal_emit (header
, signal_ids
[CLICKED
], 0);
75 composer_header_constructor (GType type
,
76 guint n_construct_properties
,
77 GObjectConstructParam
*construct_properties
)
81 EComposerHeader
*header
;
84 /* Chain up to parent's constructor() method. */
85 object
= G_OBJECT_CLASS (
86 e_composer_header_parent_class
)->constructor (
87 type
, n_construct_properties
, construct_properties
);
89 header
= E_COMPOSER_HEADER (object
);
91 if (header
->priv
->button
) {
92 widget
= gtk_button_new_with_mnemonic (header
->priv
->label
);
93 gtk_widget_set_can_focus (widget
, FALSE
);
96 G_CALLBACK (composer_header_button_clicked_cb
),
98 label
= gtk_bin_get_child (GTK_BIN (widget
));
100 widget
= gtk_label_new_with_mnemonic (header
->priv
->label
);
101 gtk_label_set_mnemonic_widget (GTK_LABEL (widget
), header
->input_widget
);
105 gtk_misc_set_alignment (GTK_MISC (label
), 1.0, 0.5);
107 header
->priv
->action_label
= NULL
;
109 header
->title_widget
= g_object_ref_sink (widget
);
111 g_free (header
->priv
->label
);
112 header
->priv
->label
= NULL
;
118 composer_header_set_property (GObject
*object
,
123 EComposerHeaderPrivate
*priv
;
125 priv
= E_COMPOSER_HEADER (object
)->priv
;
127 switch (property_id
) {
128 case PROP_BUTTON
: /* construct only */
129 priv
->button
= g_value_get_boolean (value
);
132 case PROP_LABEL
: /* construct only */
133 priv
->label
= g_value_dup_string (value
);
137 e_composer_header_set_sensitive (
138 E_COMPOSER_HEADER (object
),
139 g_value_get_boolean (value
));
143 e_composer_header_set_visible (
144 E_COMPOSER_HEADER (object
),
145 g_value_get_boolean (value
));
149 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
153 composer_header_get_property (GObject
*object
,
158 EComposerHeaderPrivate
*priv
;
160 priv
= E_COMPOSER_HEADER (object
)->priv
;
162 switch (property_id
) {
163 case PROP_BUTTON
: /* construct only */
164 g_value_set_boolean (value
, priv
->button
);
167 case PROP_LABEL
: /* construct only */
168 g_value_take_string (
169 value
, e_composer_header_get_label (
170 E_COMPOSER_HEADER (object
)));
174 g_value_set_boolean (
175 value
, e_composer_header_get_sensitive (
176 E_COMPOSER_HEADER (object
)));
180 g_value_set_boolean (
181 value
, e_composer_header_get_visible (
182 E_COMPOSER_HEADER (object
)));
186 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
190 composer_header_dispose (GObject
*object
)
192 EComposerHeader
*header
= E_COMPOSER_HEADER (object
);
194 if (header
->title_widget
!= NULL
) {
195 g_object_unref (header
->title_widget
);
196 header
->title_widget
= NULL
;
199 if (header
->input_widget
!= NULL
) {
200 g_object_unref (header
->input_widget
);
201 header
->input_widget
= NULL
;
204 /* Chain up to parent's dispose() method. */
205 G_OBJECT_CLASS (e_composer_header_parent_class
)->dispose (object
);
209 e_composer_header_class_init (EComposerHeaderClass
*class)
211 GObjectClass
*object_class
;
213 g_type_class_add_private (class, sizeof (EComposerHeaderPrivate
));
215 object_class
= G_OBJECT_CLASS (class);
216 object_class
->constructor
= composer_header_constructor
;
217 object_class
->set_property
= composer_header_set_property
;
218 object_class
->get_property
= composer_header_get_property
;
219 object_class
->dispose
= composer_header_dispose
;
221 g_object_class_install_property (
224 g_param_spec_boolean (
230 G_PARAM_CONSTRUCT_ONLY
));
232 g_object_class_install_property (
235 g_param_spec_string (
241 G_PARAM_CONSTRUCT_ONLY
));
243 g_object_class_install_property (
246 g_param_spec_boolean (
253 g_object_class_install_property (
256 g_param_spec_boolean (
263 signal_ids
[CHANGED
] = g_signal_new (
265 G_TYPE_FROM_CLASS (class),
267 G_STRUCT_OFFSET (EComposerHeaderClass
, changed
),
269 g_cclosure_marshal_VOID__VOID
,
272 signal_ids
[CLICKED
] = g_signal_new (
274 G_TYPE_FROM_CLASS (class),
276 G_STRUCT_OFFSET (EComposerHeaderClass
, clicked
),
278 g_cclosure_marshal_VOID__VOID
,
283 e_composer_header_init (EComposerHeader
*header
)
285 header
->priv
= G_TYPE_INSTANCE_GET_PRIVATE (
286 header
, E_TYPE_COMPOSER_HEADER
, EComposerHeaderPrivate
);
290 e_composer_header_get_label (EComposerHeader
*header
)
294 g_return_val_if_fail (E_IS_COMPOSER_HEADER (header
), NULL
);
296 /* GtkButton and GtkLabel both have a "label" property. */
297 g_object_get (header
->title_widget
, "label", &label
, NULL
);
303 e_composer_header_get_sensitive (EComposerHeader
*header
)
305 g_return_val_if_fail (E_IS_COMPOSER_HEADER (header
), FALSE
);
307 return header
->priv
->sensitive
;
311 e_composer_header_set_sensitive (EComposerHeader
*header
,
314 g_return_if_fail (E_IS_COMPOSER_HEADER (header
));
316 header
->priv
->sensitive
= sensitive
;
318 g_object_notify (G_OBJECT (header
), "sensitive");
322 e_composer_header_get_visible (EComposerHeader
*header
)
324 g_return_val_if_fail (E_IS_COMPOSER_HEADER (header
), FALSE
);
326 return header
->priv
->visible
;
330 e_composer_header_set_visible (EComposerHeader
*header
,
333 g_return_if_fail (E_IS_COMPOSER_HEADER (header
));
335 header
->priv
->visible
= visible
;
337 if (header
->priv
->action_label
) {
339 gtk_widget_show (header
->priv
->add_icon
);
340 gtk_widget_show (header
->priv
->show_label
);
341 gtk_widget_hide (header
->priv
->remove_icon
);
342 gtk_widget_hide (header
->priv
->hide_label
);
344 gtk_widget_hide (header
->priv
->add_icon
);
345 gtk_widget_hide (header
->priv
->show_label
);
346 gtk_widget_show (header
->priv
->remove_icon
);
347 gtk_widget_show (header
->priv
->hide_label
);
351 g_object_notify (G_OBJECT (header
), "visible");
355 e_composer_header_set_title_tooltip (EComposerHeader
*header
,
356 const gchar
*tooltip
)
358 g_return_if_fail (E_IS_COMPOSER_HEADER (header
));
360 gtk_widget_set_tooltip_text (header
->title_widget
, tooltip
);
364 e_composer_header_set_input_tooltip (EComposerHeader
*header
,
365 const gchar
*tooltip
)
367 g_return_if_fail (E_IS_COMPOSER_HEADER (header
));
369 gtk_widget_set_tooltip_text (header
->input_widget
, tooltip
);