]> sjero.net Git - linphone/blob - gtk/calllogs.c
GTK: provides call logs in a tab
[linphone] / gtk / calllogs.c
1 /*
2 linphone, gtk-glade interface.
3 Copyright (C) 2008  Simon MORLAT (simon.morlat@linphone.org)
4
5 This program is free software; you can redistribute it and/or
6 modify it under the terms of the GNU General Public License
7 as published by the Free Software Foundation; either version 2
8 of the License, or (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
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18 */
19
20 #include "linphone.h"
21
22
23 static void fill_renderers(GtkTreeView *v){
24         GtkTreeViewColumn *c;
25         GtkCellRenderer *r=gtk_cell_renderer_pixbuf_new ();
26
27         g_object_set(r,"stock-size",GTK_ICON_SIZE_BUTTON,NULL);
28         c=gtk_tree_view_column_new_with_attributes("icon",r,"stock-id",0,NULL);
29         gtk_tree_view_append_column (v,c);
30
31         r=gtk_cell_renderer_text_new ();
32         c=gtk_tree_view_column_new_with_attributes("sipaddress",r,"markup",1,NULL);
33         gtk_tree_view_append_column (v,c);
34 }
35
36 void linphone_gtk_call_log_update(GtkWidget *w){
37         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"));
38         GtkListStore *store;
39         const MSList *logs;
40
41         store=(GtkListStore*)gtk_tree_view_get_model(v);
42         if (store==NULL){
43                 store=gtk_list_store_new(3,G_TYPE_STRING,G_TYPE_STRING, G_TYPE_POINTER);
44                 gtk_tree_view_set_model(v,GTK_TREE_MODEL(store));
45                 g_object_unref(G_OBJECT(store));
46                 fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view")));
47                 gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")),
48                                      create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png")));
49         }
50         gtk_list_store_clear (store);
51
52         for (logs=linphone_core_get_call_logs(linphone_gtk_get_core());logs!=NULL;logs=logs->next){
53                 LinphoneCallLog *cl=(LinphoneCallLog*)logs->data;
54                 GtkTreeIter iter;
55                 LinphoneAddress *la=cl->dir==LinphoneCallIncoming ? cl->from : cl->to;
56                 char *addr= linphone_address_as_string_uri_only (la);
57                 const char *display;
58                 gchar *logtxt;
59                 gchar quality[20];
60                 
61                 display=linphone_address_get_display_name (la);
62                 if (display==NULL){
63                         display=linphone_address_get_username (la);
64                         if (display==NULL)
65                                 display=linphone_address_get_domain (la);
66                 }
67                 if (cl->quality!=-1){
68                         snprintf(quality,sizeof(quality),"%.1f",cl->quality);
69                 }
70                 logtxt=g_markup_printf_escaped("<big><b>%s</b></big>\t<small><i>%s</i>\t<i>Quality: %s</i></small>\n"
71                                                "%s\t%i minutes %i seconds\t",display, addr, cl->quality!=-1 ? quality : _("n/a"),
72                                                cl->start_date,
73                                                cl->duration/60,cl->duration%60);
74                 gtk_list_store_append (store,&iter);
75                 gtk_list_store_set (store,&iter,
76                                0, cl->dir==LinphoneCallOutgoing ? GTK_STOCK_GO_UP : GTK_STOCK_GO_DOWN,
77                                1, logtxt,2,la,-1);
78                 ms_free(addr);
79                 g_free(logtxt);
80         }
81         
82 }
83
84 static bool_t put_selection_to_uribar(GtkWidget *treeview){
85         GtkTreeSelection *sel;
86
87         sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
88         if (sel!=NULL){
89                 GtkTreeModel *model=NULL;
90                 GtkTreeIter iter;
91                 if (gtk_tree_selection_get_selected (sel,&model,&iter)){
92                         gpointer pla;
93                         LinphoneAddress *la;
94                         char *tmp;
95                         gtk_tree_model_get(model,&iter,2,&pla,-1);
96                         la=(LinphoneAddress*)pla;
97                         tmp=linphone_address_as_string (la);
98                         gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),tmp);
99                         ms_free(tmp);
100                         return TRUE;
101                 }
102         }
103         return FALSE;
104 }
105
106 void linphone_gtk_history_row_activated(GtkWidget *treeview){
107         if (put_selection_to_uribar(treeview)){
108                 GtkWidget *mw=linphone_gtk_get_main_window();
109                 linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
110         }
111 }
112
113 void linphone_gtk_clear_call_logs(GtkWidget *button){
114         linphone_core_clear_call_logs (linphone_gtk_get_core());
115         linphone_gtk_call_log_update(gtk_widget_get_toplevel(button));
116 }
117
118 void linphone_gtk_call_log_callback(GtkWidget *button){
119         GtkWidget *mw=linphone_gtk_get_main_window();
120         if (put_selection_to_uribar(linphone_gtk_get_widget(mw,"logs_view")))
121                         linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
122 }
123
124 void linphone_gtk_call_log_response(GtkWidget *w, guint response_id){
125         GtkWidget *mw=linphone_gtk_get_main_window();
126         if (response_id==1){
127                 if (put_selection_to_uribar(linphone_gtk_get_widget(w,"logs_view")))
128                         linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
129         }else if (response_id==2){
130                 linphone_core_clear_call_logs (linphone_gtk_get_core());
131                 linphone_gtk_call_log_update(w);
132                 return;
133         }
134         g_object_set_data(G_OBJECT(mw),"call_logs",NULL);
135         gtk_widget_destroy(w);
136 }
137
138
139
140 GtkWidget * linphone_gtk_show_call_logs(void){
141         GtkWidget *mw=linphone_gtk_get_main_window();
142
143         GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"call_logs");
144         if (w==NULL){
145                 w=linphone_gtk_create_window("call_logs");
146                 gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")),
147                                      create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png")));
148                 g_object_set_data(G_OBJECT(mw),"call_logs",w);
149                 g_signal_connect(G_OBJECT(w),"response",(GCallback)linphone_gtk_call_log_response,NULL);
150                 gtk_widget_show(w);
151                 linphone_gtk_call_log_update(w);
152         }else gtk_window_present(GTK_WINDOW(w));
153         return w;
154 }
155