3 * This program is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2 of the License, or (at your option) version 3.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with the program; if not, see <http://www.gnu.org/licenses/>
18 * Jeffrey Stedfast <fejj@ximian.com>
20 * Copyright (C) 1999-2008 Novell, Inc. (www.novell.com)
28 #include "e-mail-tag-editor.h"
31 #include <glib/gi18n-lib.h>
33 #include "e-util/e-util.h"
35 #define E_MAIL_TAG_EDITOR_GET_PRIVATE(obj) \
36 (G_TYPE_INSTANCE_GET_PRIVATE \
37 ((obj), E_TYPE_MAIL_TAG_EDITOR, EMailTagEditorPrivate))
39 #define DEFAULT_FLAG 2 /* "Follow-Up" */
41 struct _EMailTagEditorPrivate
{
42 GtkTreeView
*message_list
;
43 GtkComboBox
*combo_entry
;
44 EDateEdit
*target_date
;
47 time_t completed_date
;
60 G_DEFINE_TYPE (EMailTagEditor
, e_mail_tag_editor
, GTK_TYPE_DIALOG
)
63 mail_tag_editor_clear_clicked_cb (EMailTagEditor
*editor
)
65 gtk_combo_box_set_active (editor
->priv
->combo_entry
, DEFAULT_FLAG
);
66 e_date_edit_set_time (editor
->priv
->target_date
, (time_t) -1);
67 e_mail_tag_editor_set_completed (editor
, FALSE
);
71 mail_tag_editor_set_property (GObject
*object
,
76 switch (property_id
) {
78 e_mail_tag_editor_set_completed (
79 E_MAIL_TAG_EDITOR (object
),
80 g_value_get_boolean (value
));
84 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
88 mail_tag_editor_get_property (GObject
*object
,
93 switch (property_id
) {
97 e_mail_tag_editor_get_completed (
98 E_MAIL_TAG_EDITOR (object
)));
102 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
106 mail_tag_editor_realize (GtkWidget
*widget
)
108 GtkWidget
*action_area
;
109 GtkWidget
*content_area
;
111 /* Chain up to parent's realize() method. */
112 GTK_WIDGET_CLASS (e_mail_tag_editor_parent_class
)->realize (widget
);
114 /* XXX Override GTK's brain-dead border width defaults. */
116 action_area
= gtk_dialog_get_action_area (GTK_DIALOG (widget
));
117 content_area
= gtk_dialog_get_content_area (GTK_DIALOG (widget
));
119 gtk_container_set_border_width (GTK_CONTAINER (content_area
), 0);
120 gtk_container_set_border_width (GTK_CONTAINER (action_area
), 12);
124 mail_tag_editor_get_tag_list (EMailTagEditor
*editor
)
126 CamelTag
*tag_list
= NULL
;
131 entry
= gtk_bin_get_child (GTK_BIN (editor
->priv
->combo_entry
));
133 text
= g_strdup (gtk_entry_get_text (GTK_ENTRY (entry
)));
134 camel_tag_set (&tag_list
, "follow-up", text
);
137 date
= e_date_edit_get_time (editor
->priv
->target_date
);
138 if (date
!= (time_t) -1) {
139 text
= camel_header_format_date (date
, 0);
140 camel_tag_set (&tag_list
, "due-by", text
);
143 camel_tag_set (&tag_list
, "due-by", "");
145 if (e_mail_tag_editor_get_completed (editor
)) {
146 text
= camel_header_format_date (
147 editor
->priv
->completed_date
, 0);
148 camel_tag_set (&tag_list
, "completed-on", text
);
151 camel_tag_set (&tag_list
, "completed-on", "");
157 mail_tag_editor_set_tag_list (EMailTagEditor
*editor
,
164 /* Extract the GtkEntry from the GtkComboBoxEntry. */
165 child
= gtk_bin_get_child (GTK_BIN (editor
->priv
->combo_entry
));
167 /* XXX This is kind of cheating. Since we only store the
168 * translated tag there's no sure-fire way to determine
169 * the corresponding combo box index (e.g. the tag may
170 * have been set while running in a different locale). */
171 text
= camel_tag_get (&tag_list
, "follow-up");
173 gtk_entry_set_text (GTK_ENTRY (child
), text
);
175 text
= camel_tag_get (&tag_list
, "due-by");
176 if (text
!= NULL
&& *text
!= '\0') {
177 date
= camel_header_decode_date (text
, NULL
);
178 e_date_edit_set_time (editor
->priv
->target_date
, date
);
180 e_date_edit_set_time (editor
->priv
->target_date
, (time_t) -1);
182 text
= camel_tag_get (&tag_list
, "completed-on");
183 if (text
!= NULL
&& *text
!= '\0') {
184 date
= camel_header_decode_date (text
, NULL
);
185 if (date
!= (time_t) 0) {
186 e_mail_tag_editor_set_completed (editor
, TRUE
);
187 editor
->priv
->completed_date
= date
;
193 e_mail_tag_editor_class_init (EMailTagEditorClass
*class)
195 GObjectClass
*object_class
;
196 GtkWidgetClass
*widget_class
;
198 g_type_class_add_private (class, sizeof (EMailTagEditorPrivate
));
200 object_class
= G_OBJECT_CLASS (class);
201 object_class
->set_property
= mail_tag_editor_set_property
;
202 object_class
->get_property
= mail_tag_editor_get_property
;
204 widget_class
= GTK_WIDGET_CLASS (class);
205 widget_class
->realize
= mail_tag_editor_realize
;
207 class->get_tag_list
= mail_tag_editor_get_tag_list
;
208 class->set_tag_list
= mail_tag_editor_set_tag_list
;
210 g_object_class_install_property (
213 g_param_spec_boolean (
222 e_mail_tag_editor_init (EMailTagEditor
*editor
)
227 GtkWidget
*content_area
;
229 GtkCellRenderer
*renderer
;
232 editor
->priv
= E_MAIL_TAG_EDITOR_GET_PRIVATE (editor
);
234 dialog
= GTK_DIALOG (editor
);
235 window
= GTK_WINDOW (editor
);
237 gtk_window_set_default_size (window
, 400, 500);
238 gtk_window_set_title (window
, _("Flag to Follow Up"));
239 gtk_window_set_icon_name (window
, "stock_mail-flag-for-followup");
241 gtk_dialog_add_buttons (
242 dialog
, GTK_STOCK_CANCEL
, GTK_RESPONSE_CANCEL
,
243 GTK_STOCK_OK
, GTK_RESPONSE_OK
, NULL
);
245 gtk_dialog_set_default_response (dialog
, GTK_RESPONSE_OK
);
247 content_area
= gtk_dialog_get_content_area (dialog
);
249 /* Load the rest of the UI from the builder file. */
251 builder
= gtk_builder_new ();
252 e_load_ui_builder_definition (builder
, "mail-dialogs.ui");
254 widget
= e_builder_get_widget (builder
, "toplevel");
255 gtk_box_pack_start (GTK_BOX (content_area
), widget
, TRUE
, TRUE
, 6);
257 widget
= e_builder_get_widget (builder
, "pixmap");
258 g_object_bind_property (
261 G_BINDING_SYNC_CREATE
);
263 widget
= e_builder_get_widget (builder
, "message_list");
264 editor
->priv
->message_list
= GTK_TREE_VIEW (widget
);
266 store
= gtk_list_store_new (2, G_TYPE_STRING
, G_TYPE_STRING
);
267 gtk_tree_view_set_model (
268 GTK_TREE_VIEW (widget
), GTK_TREE_MODEL (store
));
270 renderer
= gtk_cell_renderer_text_new ();
271 gtk_tree_view_insert_column_with_attributes (
272 GTK_TREE_VIEW (widget
), -1, _("From"),
273 renderer
, "text", 0, NULL
);
275 renderer
= gtk_cell_renderer_text_new ();
276 gtk_tree_view_insert_column_with_attributes (
277 GTK_TREE_VIEW (widget
), -1, _("Subject"),
278 renderer
, "text", 1, NULL
);
280 widget
= e_builder_get_widget (builder
, "combo");
281 editor
->priv
->combo_entry
= GTK_COMBO_BOX (widget
);
282 gtk_combo_box_set_active (GTK_COMBO_BOX (widget
), DEFAULT_FLAG
);
284 widget
= e_builder_get_widget (builder
, "target_date");
285 editor
->priv
->target_date
= E_DATE_EDIT (widget
);
287 widget
= e_builder_get_widget (builder
, "completed");
288 g_object_bind_property (
291 G_BINDING_BIDIRECTIONAL
|
292 G_BINDING_SYNC_CREATE
);
294 widget
= e_builder_get_widget (builder
, "clear");
295 g_signal_connect_swapped (
297 G_CALLBACK (mail_tag_editor_clear_clicked_cb
), editor
);
299 g_object_unref (builder
);
303 e_mail_tag_editor_new (void)
305 return g_object_new (E_TYPE_MAIL_TAG_EDITOR
, NULL
);
309 e_mail_tag_editor_get_completed (EMailTagEditor
*editor
)
311 g_return_val_if_fail (E_IS_MAIL_TAG_EDITOR (editor
), FALSE
);
313 return editor
->priv
->completed
;
317 e_mail_tag_editor_set_completed (EMailTagEditor
*editor
,
320 g_return_if_fail (E_IS_MAIL_TAG_EDITOR (editor
));
322 if (editor
->priv
->completed
== completed
)
325 editor
->priv
->completed
= completed
;
326 editor
->priv
->completed_date
= completed
? time (NULL
) : 0;
328 g_object_notify (G_OBJECT (editor
), "completed");
332 e_mail_tag_editor_get_tag_list (EMailTagEditor
*editor
)
334 EMailTagEditorClass
*class;
336 g_return_val_if_fail (E_IS_MAIL_TAG_EDITOR (editor
), NULL
);
338 class = E_MAIL_TAG_EDITOR_GET_CLASS (editor
);
339 g_return_val_if_fail (class->get_tag_list
!= NULL
, NULL
);
341 return class->get_tag_list (editor
);
345 e_mail_tag_editor_set_tag_list (EMailTagEditor
*editor
,
348 EMailTagEditorClass
*class;
350 g_return_if_fail (E_IS_MAIL_TAG_EDITOR (editor
));
351 g_return_if_fail (tag_list
!= NULL
);
353 class = E_MAIL_TAG_EDITOR_GET_CLASS (editor
);
354 g_return_if_fail (class->set_tag_list
!= NULL
);
356 class->set_tag_list (editor
, tag_list
);
360 e_mail_tag_editor_add_message (EMailTagEditor
*editor
,
362 const gchar
*subject
)
367 g_return_if_fail (E_MAIL_TAG_EDITOR (editor
));
369 model
= gtk_tree_view_get_model (editor
->priv
->message_list
);
371 gtk_list_store_append (GTK_LIST_STORE (model
), &iter
);
374 GTK_LIST_STORE (model
), &iter
,
375 COLUMN_FROM
, from
, COLUMN_SUBJECT
, subject
, -1);