1 /*
2 * This program is free software; you can redistribute it and/or modify it
3 * under the terms of the GNU Lesser General Public License as published by
4 * the Free Software Foundation.
5 *
6 * This program is distributed in the hope that it will be useful, but
7 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
8 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
9 * for more details.
10 *
11 * You should have received a copy of the GNU Lesser General Public License
12 * along with this program; if not, see <http://www.gnu.org/licenses/>.
13 *
14 *
15 * Authors:
16 * Srinivasa Ragavan <sragavan@gnome.org>
17 *
18 * Copyright (C) 2010 Intel corporation. (www.intel.com)
19 *
20 */
21
22 #include "evolution-config.h"
23
24 #include "e-mail-view.h"
25
26 #include <glib/gi18n-lib.h>
27
28 #define E_MAIL_VIEW_GET_PRIVATE(obj) \
29 (G_TYPE_INSTANCE_GET_PRIVATE \
30 ((obj), E_TYPE_MAIL_VIEW, EMailViewPrivate))
31
32 struct _EMailViewPrivate {
33 EShellView *shell_view;
34 GtkOrientation orientation;
35 EMailView *previous_view;
36
37 guint preview_visible : 1;
38 guint show_deleted : 1;
39 guint show_junk : 1;
40 };
41
42 enum {
43 PROP_0,
44 PROP_ORIENTATION,
45 PROP_PREVIEW_VISIBLE,
46 PROP_PREVIOUS_VIEW,
47 PROP_SHELL_VIEW,
48 PROP_SHOW_DELETED,
49 PROP_SHOW_JUNK
50 };
51
52 enum {
53 PANE_CLOSE,
54 VIEW_CHANGED,
55 OPEN_MAIL,
56 LAST_SIGNAL
57 };
58
59 static guint signals[LAST_SIGNAL];
60
G_DEFINE_TYPE(EMailView,e_mail_view,GTK_TYPE_BOX)61 G_DEFINE_TYPE (EMailView, e_mail_view, GTK_TYPE_BOX)
62
63 static void
64 mail_view_set_shell_view (EMailView *view,
65 EShellView *shell_view)
66 {
67 g_return_if_fail (E_IS_SHELL_VIEW (shell_view));
68 g_return_if_fail (view->priv->shell_view == NULL);
69
70 view->priv->shell_view = g_object_ref (shell_view);
71 }
72
73 static void
mail_view_set_property(GObject * object,guint property_id,const GValue * value,GParamSpec * pspec)74 mail_view_set_property (GObject *object,
75 guint property_id,
76 const GValue *value,
77 GParamSpec *pspec)
78 {
79 switch (property_id) {
80 case PROP_ORIENTATION:
81 e_mail_view_set_orientation (
82 E_MAIL_VIEW (object),
83 g_value_get_enum (value));
84 return;
85
86 case PROP_PREVIEW_VISIBLE:
87 e_mail_view_set_preview_visible (
88 E_MAIL_VIEW (object),
89 g_value_get_boolean (value));
90 return;
91
92 case PROP_PREVIOUS_VIEW:
93 e_mail_view_set_previous_view (
94 E_MAIL_VIEW (object),
95 g_value_get_object (value));
96 return;
97
98 case PROP_SHELL_VIEW:
99 mail_view_set_shell_view (
100 E_MAIL_VIEW (object),
101 g_value_get_object (value));
102 return;
103
104 case PROP_SHOW_DELETED:
105 e_mail_view_set_show_deleted (
106 E_MAIL_VIEW (object),
107 g_value_get_boolean (value));
108 return;
109
110 case PROP_SHOW_JUNK:
111 e_mail_view_set_show_junk (
112 E_MAIL_VIEW (object),
113 g_value_get_boolean (value));
114 return;
115 }
116
117 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
118 }
119
120 static void
mail_view_get_property(GObject * object,guint property_id,GValue * value,GParamSpec * pspec)121 mail_view_get_property (GObject *object,
122 guint property_id,
123 GValue *value,
124 GParamSpec *pspec)
125 {
126 switch (property_id) {
127 case PROP_ORIENTATION:
128 g_value_set_enum (
129 value, e_mail_view_get_orientation (
130 E_MAIL_VIEW (object)));
131 return;
132
133 case PROP_PREVIEW_VISIBLE:
134 g_value_set_boolean (
135 value, e_mail_view_get_preview_visible (
136 E_MAIL_VIEW (object)));
137 return;
138
139 case PROP_PREVIOUS_VIEW:
140 g_value_set_object (
141 value, e_mail_view_get_previous_view (
142 E_MAIL_VIEW (object)));
143 return;
144
145 case PROP_SHELL_VIEW:
146 g_value_set_object (
147 value, e_mail_view_get_shell_view (
148 E_MAIL_VIEW (object)));
149 return;
150
151 case PROP_SHOW_DELETED:
152 g_value_set_boolean (
153 value, e_mail_view_get_show_deleted (
154 E_MAIL_VIEW (object)));
155 return;
156
157 case PROP_SHOW_JUNK:
158 g_value_set_boolean (
159 value, e_mail_view_get_show_junk (
160 E_MAIL_VIEW (object)));
161 return;
162 }
163
164 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
165 }
166
167 static void
mail_view_dispose(GObject * object)168 mail_view_dispose (GObject *object)
169 {
170 EMailViewPrivate *priv;
171
172 priv = E_MAIL_VIEW_GET_PRIVATE (object);
173 g_clear_object (&priv->shell_view);
174 g_clear_object (&priv->previous_view);
175
176 /* Chain up to parent's dispose() method. */
177 G_OBJECT_CLASS (e_mail_view_parent_class)->dispose (object);
178 }
179
180 static GtkOrientation
mail_view_get_orientation(EMailView * view)181 mail_view_get_orientation (EMailView *view)
182 {
183 return view->priv->orientation;
184 }
185
186 static void
mail_view_set_orientation(EMailView * view,GtkOrientation orientation)187 mail_view_set_orientation (EMailView *view,
188 GtkOrientation orientation)
189 {
190 if (view->priv->orientation == orientation)
191 return;
192
193 view->priv->orientation = orientation;
194
195 g_object_notify (G_OBJECT (view), "orientation");
196
197 e_mail_view_update_view_instance (view);
198 }
199
200 static gboolean
mail_view_get_preview_visible(EMailView * view)201 mail_view_get_preview_visible (EMailView *view)
202 {
203 return view->priv->preview_visible;
204 }
205
206 static void
mail_view_set_preview_visible(EMailView * view,gboolean preview_visible)207 mail_view_set_preview_visible (EMailView *view,
208 gboolean preview_visible)
209 {
210 if (view->priv->preview_visible == preview_visible)
211 return;
212
213 view->priv->preview_visible = preview_visible;
214
215 g_object_notify (G_OBJECT (view), "preview-visible");
216 }
217
218 static gboolean
mail_view_get_show_deleted(EMailView * view)219 mail_view_get_show_deleted (EMailView *view)
220 {
221 return view->priv->show_deleted;
222 }
223
224 static void
mail_view_set_show_deleted(EMailView * view,gboolean show_deleted)225 mail_view_set_show_deleted (EMailView *view,
226 gboolean show_deleted)
227 {
228 if (view->priv->show_deleted == show_deleted)
229 return;
230
231 view->priv->show_deleted = show_deleted;
232
233 g_object_notify (G_OBJECT (view), "show-deleted");
234 }
235
236 static gboolean
mail_view_get_show_junk(EMailView * view)237 mail_view_get_show_junk (EMailView *view)
238 {
239 return view->priv->show_junk;
240 }
241
242 static void
mail_view_set_show_junk(EMailView * view,gboolean show_junk)243 mail_view_set_show_junk (EMailView *view,
244 gboolean show_junk)
245 {
246 if (view->priv->show_junk == show_junk)
247 return;
248
249 view->priv->show_junk = show_junk;
250
251 g_object_notify (G_OBJECT (view), "show-junk");
252 }
253
254 static void
e_mail_view_class_init(EMailViewClass * class)255 e_mail_view_class_init (EMailViewClass *class)
256 {
257 GObjectClass *object_class;
258
259 g_type_class_add_private (class, sizeof (EMailViewPrivate));
260
261 object_class = G_OBJECT_CLASS (class);
262 object_class->set_property = mail_view_set_property;
263 object_class->get_property = mail_view_get_property;
264 object_class->dispose = mail_view_dispose;
265
266 class->get_orientation = mail_view_get_orientation;
267 class->set_orientation = mail_view_set_orientation;
268 class->get_preview_visible = mail_view_get_preview_visible;
269 class->set_preview_visible = mail_view_set_preview_visible;
270 class->get_show_deleted = mail_view_get_show_deleted;
271 class->set_show_deleted = mail_view_set_show_deleted;
272 class->get_show_junk = mail_view_get_show_junk;
273 class->set_show_junk = mail_view_set_show_junk;
274
275 signals[PANE_CLOSE] = g_signal_new (
276 "pane-close",
277 G_OBJECT_CLASS_TYPE (object_class),
278 G_SIGNAL_RUN_FIRST,
279 G_STRUCT_OFFSET (EMailViewClass , pane_close),
280 NULL, NULL,
281 g_cclosure_marshal_VOID__VOID,
282 G_TYPE_NONE, 0);
283
284 signals[VIEW_CHANGED] = g_signal_new (
285 "view-changed",
286 G_OBJECT_CLASS_TYPE (object_class),
287 G_SIGNAL_RUN_FIRST,
288 G_STRUCT_OFFSET (EMailViewClass , view_changed),
289 NULL, NULL,
290 g_cclosure_marshal_VOID__VOID,
291 G_TYPE_NONE, 0);
292
293 signals[OPEN_MAIL] = g_signal_new (
294 "open-mail",
295 G_OBJECT_CLASS_TYPE (object_class),
296 G_SIGNAL_RUN_FIRST,
297 G_STRUCT_OFFSET (EMailViewClass , open_mail),
298 NULL, NULL,
299 g_cclosure_marshal_VOID__STRING,
300 G_TYPE_NONE, 1, G_TYPE_STRING);
301
302 g_object_class_install_property (
303 object_class,
304 PROP_ORIENTATION,
305 g_param_spec_enum (
306 "orientation",
307 "Orientation",
308 NULL,
309 GTK_TYPE_ORIENTATION,
310 GTK_ORIENTATION_HORIZONTAL,
311 G_PARAM_READWRITE));
312
313 g_object_class_install_property (
314 object_class,
315 PROP_PREVIEW_VISIBLE,
316 g_param_spec_boolean (
317 "preview-visible",
318 "Preview Visible",
319 NULL,
320 FALSE,
321 G_PARAM_READWRITE));
322
323 g_object_class_install_property (
324 object_class,
325 PROP_PREVIOUS_VIEW,
326 g_param_spec_object (
327 "previous-view",
328 "Previous View",
329 NULL,
330 E_TYPE_MAIL_VIEW,
331 G_PARAM_READWRITE));
332
333 g_object_class_install_property (
334 object_class,
335 PROP_SHELL_VIEW,
336 g_param_spec_object (
337 "shell-view",
338 "Shell View",
339 NULL,
340 E_TYPE_SHELL_VIEW,
341 G_PARAM_READWRITE |
342 G_PARAM_CONSTRUCT_ONLY));
343
344 g_object_class_install_property (
345 object_class,
346 PROP_SHOW_DELETED,
347 g_param_spec_boolean (
348 "show-deleted",
349 "Show Deleted",
350 NULL,
351 FALSE,
352 G_PARAM_READWRITE));
353
354 g_object_class_install_property (
355 object_class,
356 PROP_SHOW_JUNK,
357 g_param_spec_boolean (
358 "show-junk",
359 "Show Junk",
360 NULL,
361 FALSE,
362 G_PARAM_READWRITE));
363 }
364
365 static void
e_mail_view_init(EMailView * view)366 e_mail_view_init (EMailView *view)
367 {
368 view->priv = E_MAIL_VIEW_GET_PRIVATE (view);
369 view->priv->orientation = GTK_ORIENTATION_VERTICAL;
370 }
371
372 EShellView *
e_mail_view_get_shell_view(EMailView * view)373 e_mail_view_get_shell_view (EMailView *view)
374 {
375 g_return_val_if_fail (E_IS_MAIL_VIEW (view), NULL);
376
377 return view->priv->shell_view;
378 }
379
380 void
e_mail_view_update_view_instance(EMailView * view)381 e_mail_view_update_view_instance (EMailView *view)
382 {
383 EMailViewClass *class;
384
385 g_return_if_fail (E_IS_MAIL_VIEW (view));
386
387 class = E_MAIL_VIEW_GET_CLASS (view);
388 g_return_if_fail (class != NULL);
389 g_return_if_fail (class->update_view_instance != NULL);
390
391 class->update_view_instance (view);
392 }
393
394 GalViewInstance *
e_mail_view_get_view_instance(EMailView * view)395 e_mail_view_get_view_instance (EMailView *view)
396 {
397 EMailViewClass *class;
398
399 g_return_val_if_fail (E_IS_MAIL_VIEW (view), NULL);
400
401 class = E_MAIL_VIEW_GET_CLASS (view);
402 g_return_val_if_fail (class != NULL, NULL);
403 g_return_val_if_fail (class->get_view_instance != NULL, NULL);
404
405 return class->get_view_instance (view);
406 }
407
408 void
e_mail_view_set_search_strings(EMailView * view,GSList * search_strings)409 e_mail_view_set_search_strings (EMailView *view,
410 GSList *search_strings)
411 {
412 EMailViewClass *class;
413
414 g_return_if_fail (E_IS_MAIL_VIEW (view));
415
416 class = E_MAIL_VIEW_GET_CLASS (view);
417 g_return_if_fail (class != NULL);
418 g_return_if_fail (class->set_search_strings != NULL);
419
420 class->set_search_strings (view, search_strings);
421 }
422
423 GtkOrientation
e_mail_view_get_orientation(EMailView * view)424 e_mail_view_get_orientation (EMailView *view)
425 {
426 EMailViewClass *class;
427
428 g_return_val_if_fail (E_IS_MAIL_VIEW (view), 0);
429
430 class = E_MAIL_VIEW_GET_CLASS (view);
431 g_return_val_if_fail (class != NULL, 0);
432 g_return_val_if_fail (class->get_orientation != NULL, 0);
433
434 return class->get_orientation (view);
435 }
436
437 void
e_mail_view_set_orientation(EMailView * view,GtkOrientation orientation)438 e_mail_view_set_orientation (EMailView *view,
439 GtkOrientation orientation)
440 {
441 EMailViewClass *class;
442
443 g_return_if_fail (E_IS_MAIL_VIEW (view));
444
445 class = E_MAIL_VIEW_GET_CLASS (view);
446 g_return_if_fail (class != NULL);
447 g_return_if_fail (class->set_orientation != NULL);
448
449 class->set_orientation (view, orientation);
450 }
451
452 gboolean
e_mail_view_get_preview_visible(EMailView * view)453 e_mail_view_get_preview_visible (EMailView *view)
454 {
455 EMailViewClass *class;
456
457 g_return_val_if_fail (E_IS_MAIL_VIEW (view), FALSE);
458
459 class = E_MAIL_VIEW_GET_CLASS (view);
460 g_return_val_if_fail (class != NULL, FALSE);
461 g_return_val_if_fail (class->get_preview_visible != NULL, FALSE);
462
463 return class->get_preview_visible (view);
464 }
465
466 void
e_mail_view_set_preview_visible(EMailView * view,gboolean visible)467 e_mail_view_set_preview_visible (EMailView *view,
468 gboolean visible)
469 {
470 EMailViewClass *class;
471
472 g_return_if_fail (E_IS_MAIL_VIEW (view));
473
474 class = E_MAIL_VIEW_GET_CLASS (view);
475 g_return_if_fail (class != NULL);
476 g_return_if_fail (class->set_preview_visible != NULL);
477
478 class->set_preview_visible (view, visible);
479 }
480
481 EMailView *
e_mail_view_get_previous_view(EMailView * view)482 e_mail_view_get_previous_view (EMailView *view)
483 {
484 g_return_val_if_fail (E_IS_MAIL_VIEW (view), NULL);
485
486 return view->priv->previous_view;
487 }
488
489 void
e_mail_view_set_previous_view(EMailView * view,EMailView * previous_view)490 e_mail_view_set_previous_view (EMailView *view,
491 EMailView *previous_view)
492 {
493 g_return_if_fail (E_IS_MAIL_VIEW (view));
494
495 if (view->priv->previous_view == previous_view)
496 return;
497
498 if (previous_view != NULL) {
499 g_return_if_fail (E_IS_MAIL_VIEW (previous_view));
500 g_object_ref (previous_view);
501 }
502
503 if (view->priv->previous_view != NULL)
504 g_object_unref (view->priv->previous_view);
505
506 view->priv->previous_view = previous_view;
507
508 g_object_notify (G_OBJECT (view), "previous-view");
509 }
510
511 gboolean
e_mail_view_get_show_deleted(EMailView * view)512 e_mail_view_get_show_deleted (EMailView *view)
513 {
514 EMailViewClass *class;
515
516 g_return_val_if_fail (E_IS_MAIL_VIEW (view), FALSE);
517
518 class = E_MAIL_VIEW_GET_CLASS (view);
519 g_return_val_if_fail (class != NULL, FALSE);
520 g_return_val_if_fail (class->get_show_deleted != NULL, FALSE);
521
522 return class->get_show_deleted (view);
523 }
524
525 void
e_mail_view_set_show_deleted(EMailView * view,gboolean show_deleted)526 e_mail_view_set_show_deleted (EMailView *view,
527 gboolean show_deleted)
528 {
529 EMailViewClass *class;
530
531 g_return_if_fail (E_IS_MAIL_VIEW (view));
532
533 class = E_MAIL_VIEW_GET_CLASS (view);
534 g_return_if_fail (class != NULL);
535 g_return_if_fail (class->set_show_deleted != NULL);
536
537 class->set_show_deleted (view, show_deleted);
538 }
539
540 gboolean
e_mail_view_get_show_junk(EMailView * view)541 e_mail_view_get_show_junk (EMailView *view)
542 {
543 EMailViewClass *class;
544
545 g_return_val_if_fail (E_IS_MAIL_VIEW (view), FALSE);
546
547 class = E_MAIL_VIEW_GET_CLASS (view);
548 g_return_val_if_fail (class != NULL, FALSE);
549 g_return_val_if_fail (class->get_show_junk != NULL, FALSE);
550
551 return class->get_show_junk (view);
552 }
553
554 void
e_mail_view_set_show_junk(EMailView * view,gboolean show_junk)555 e_mail_view_set_show_junk (EMailView *view,
556 gboolean show_junk)
557 {
558 EMailViewClass *class;
559
560 g_return_if_fail (E_IS_MAIL_VIEW (view));
561
562 class = E_MAIL_VIEW_GET_CLASS (view);
563 g_return_if_fail (class != NULL);
564 g_return_if_fail (class->set_show_junk != NULL);
565
566 class->set_show_junk (view, show_junk);
567 }
568