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