src/mn-evolution-folder-tree-server.gob (3714B) - raw
1 /* 2 * Mail Notification 3 * Copyright (C) 2003-2008 Jean-Yves Lefort <jylefort@brutele.be> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 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 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 */ 19 20 %privateheader{ 21 #include <gtk/gtk.h> 22 %} 23 24 %{ 25 #include <dbus/dbus.h> 26 #include <libedataserver/eds-version.h> 27 #if !EDS_CHECK_VERSION(2,29,0) 28 #include <mail/mail-component.h> 29 #endif 30 #include <mail/em-folder-tree.h> 31 #include "mn-evolution-plugin.h" 32 #include "mn-evolution.h" 33 34 #include "mn-evolution-folder-tree-server-dbus.h" 35 %} 36 37 class MN:Evolution:Folder:Tree:Server from G:Object 38 { 39 /* the GdkNativeWindow, which we also use as our ID */ 40 private guint32 id; 41 property UINT id (flags = CONSTRUCT_ONLY, link); 42 43 private GtkWidget *plug; 44 private GtkWidget *tree; /* plug's child, destroyed with it */ 45 46 property STRING uri 47 set 48 { 49 em_folder_tree_set_selected(EM_FOLDER_TREE(selfp->tree), g_value_get_string(VAL), FALSE); 50 }; 51 52 signal private NONE (STRING) 53 void folder_selected (self, const char *uri); 54 55 signal private NONE (NONE) 56 void folder_activated (self); 57 58 class_init (class) 59 { 60 dbus_g_object_type_install_info(TYPE_SELF, &dbus_glib_mn_evolution_folder_tree_server_object_info); 61 } 62 63 constructor (self) 64 { 65 #if EDS_CHECK_VERSION(2,29,0) 66 selfp->tree = em_folder_tree_new(); 67 #else 68 EMFolderTreeModel *model; 69 70 model = mail_component_peek_tree_model(mail_component_peek()); 71 selfp->tree = em_folder_tree_new_with_model(model); 72 #endif 73 74 selfp->plug = gtk_plug_new((GdkNativeWindow) selfp->id); 75 gtk_container_add(GTK_CONTAINER(selfp->plug), selfp->tree); 76 gtk_widget_show_all(selfp->plug); 77 78 g_signal_connect(selfp->plug, "destroy", G_CALLBACK(self_plug_destroy_h), self); 79 80 g_object_connect(selfp->tree, 81 "signal::folder-selected", self_selected_h, self, 82 "signal::folder-activated", self_activated_h, self, 83 NULL); 84 } 85 86 finalize (self) 87 { 88 g_signal_handlers_disconnect_by_func(selfp->plug, self_plug_destroy_h, self); 89 } 90 91 private void 92 plug_destroy_h (GtkObject *object, gpointer user_data) 93 { 94 Self *self = user_data; 95 char *service; 96 GError *err = NULL; 97 98 /* the MN side is gone: unregister and unreference the server */ 99 100 service = g_strdup_printf(MN_EVOLUTION_FOLDER_TREE_SERVER_SERVICE, selfp->id); 101 if (! mn_evolution_plugin_unregister_server(service, &err)) 102 { 103 g_warning("unable to unregister D-Bus service \"%s\": %s", service, err->message); 104 g_error_free(err); 105 } 106 g_free(service); 107 108 g_object_unref(self); 109 } 110 111 private void 112 selected_h (EMFolderTree *tree, 113 const char *full_name, 114 const char *uri, 115 guint32 flags, 116 gpointer user_data) 117 { 118 Self *self = user_data; 119 self_folder_selected(self, uri); 120 } 121 122 private void 123 activated_h (EMFolderTree *tree, 124 const char *full_name, 125 const char *uri, 126 gpointer user_data) 127 { 128 Self *self = user_data; 129 self_folder_activated(self); 130 } 131 132 public MNEvolutionFolderTreeServer * 133 new (guint32 id) 134 { 135 return GET_NEW_VARG(MN_EVOLUTION_FOLDER_TREE_SERVER_PROP_ID(id), NULL); 136 } 137 }