]> sjero.net Git - linphone/blob - gtk/calllogs.c
Updated translation file
[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 static void fill_renderers(GtkTreeView *v){
23         GtkTreeViewColumn *c;
24         GtkCellRenderer *r;
25         r=gtk_cell_renderer_pixbuf_new();
26
27         c=gtk_tree_view_column_new_with_attributes("icon",r,"pixbuf",0,NULL);
28         gtk_tree_view_append_column (v,c);
29
30         r=gtk_cell_renderer_text_new ();
31         c=gtk_tree_view_column_new_with_attributes("sipaddress",r,"markup",1,NULL);
32         gtk_tree_view_append_column (v,c);
33 }
34
35 void call_log_selection_changed(GtkTreeView *v){
36         GtkTreeSelection *select;
37         GtkTreeIter iter;
38         GtkTreeModel *model=NULL;
39         
40         select = gtk_tree_view_get_selection(v);
41         if (select!=NULL){
42                 if (gtk_tree_selection_get_selected (select, &model, &iter)){
43                         GtkTreePath *path=gtk_tree_model_get_path(model,&iter);
44                         gtk_tree_view_collapse_all(v);
45                         gtk_tree_view_expand_row(v,path,TRUE);
46                         gtk_tree_path_free(path);
47                 }
48         }
49 }
50
51 void linphone_gtk_call_log_chat_selected(GtkWidget *w){
52         GtkTreeSelection *select;
53         GtkTreeIter iter;
54         
55         select=gtk_tree_view_get_selection(GTK_TREE_VIEW(w));
56         if (select!=NULL){
57                 GtkTreeModel *model=NULL;
58                 if (gtk_tree_selection_get_selected (select,&model,&iter)){
59                         gpointer pla;
60                         LinphoneAddress *la;
61                         gtk_tree_model_get(model,&iter,2,&pla,-1);
62                         la=(LinphoneAddress*)pla;
63                         if (la!=NULL){
64                                 linphone_gtk_friend_list_set_chat_conversation(la);
65                         }
66                 }
67         }
68 }
69
70 void linphone_gtk_call_log_add_contact(GtkWidget *w){
71         GtkTreeSelection *select;
72         GtkTreeIter iter;
73         
74         select=gtk_tree_view_get_selection(GTK_TREE_VIEW(w));
75         if (select!=NULL){
76                 GtkTreeModel *model=NULL;
77                 if (gtk_tree_selection_get_selected (select,&model,&iter)){
78                         gpointer pla;
79                         LinphoneAddress *la;
80                         LinphoneFriend *lf;
81                         gtk_tree_model_get(model,&iter,2,&pla,-1);
82                         la=(LinphoneAddress*)pla;
83                         if (la!=NULL){
84                                 char *uri=linphone_address_as_string(la);
85                                 lf=linphone_friend_new_with_addr(uri);
86                                 linphone_gtk_show_contact(lf);
87                                 ms_free(uri);
88                         }
89                 }
90         }
91 }
92
93 static bool_t put_selection_to_uribar(GtkWidget *treeview){
94         GtkTreeSelection *sel;
95         
96         sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
97         if (sel!=NULL){
98                 GtkTreeModel *model=NULL;
99                 GtkTreeIter iter;
100                 if (gtk_tree_selection_get_selected (sel,&model,&iter)){
101                         char *tmp;
102                         LinphoneAddress *la;
103                         gtk_tree_model_get(model,&iter,2,&la,-1);
104                         tmp=linphone_address_as_string(la);
105                         if(tmp!=NULL) 
106                                 gtk_entry_set_text(GTK_ENTRY(linphone_gtk_get_widget(linphone_gtk_get_main_window(),"uribar")),tmp);
107                         ms_free(tmp);
108                         return TRUE;
109                 }
110         }
111         return FALSE;
112 }
113
114 static void linphone_gtk_call_selected(GtkTreeView *treeview){
115         put_selection_to_uribar(GTK_WIDGET(treeview));
116         linphone_gtk_start_call(linphone_gtk_get_widget(gtk_widget_get_toplevel(GTK_WIDGET(treeview)),
117                                         "start_call"));
118 }
119
120 static GtkWidget *linphone_gtk_create_call_log_menu(GtkWidget *call_log){
121         GtkWidget *menu=gtk_menu_new();
122         GtkWidget *menu_item;
123         gchar *call_label=NULL;
124         gchar *text_label=NULL;
125         gchar *name=NULL;
126         GtkWidget *image;
127         GtkTreeSelection *select;
128         GtkTreeIter iter;
129         
130         select=gtk_tree_view_get_selection(GTK_TREE_VIEW(call_log));
131         if (select!=NULL){
132                 GtkTreeModel *model=NULL;
133                 if (gtk_tree_selection_get_selected (select,&model,&iter)){
134                         gpointer pla;
135                         LinphoneAddress *la;
136                         gtk_tree_model_get(model,&iter,2,&pla,-1);
137                         la=(LinphoneAddress*)pla;
138                         name=linphone_address_as_string(la);
139                         call_label=g_strdup_printf(_("Call %s"),name);
140                         text_label=g_strdup_printf(_("Send text to %s"),name);
141                         g_free(name);
142                 }
143         }
144         if (call_label){
145                 menu_item=gtk_image_menu_item_new_with_label(call_label);
146                 image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU);
147                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
148                 gtk_widget_show(image);
149                 gtk_widget_show(menu_item);
150                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
151                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_selected,call_log);
152         }
153         if (text_label){
154                 menu_item=gtk_image_menu_item_new_with_label(text_label);
155                 image=gtk_image_new_from_stock(GTK_STOCK_NETWORK,GTK_ICON_SIZE_MENU);
156                 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menu_item),image);
157                 gtk_widget_show(image);
158                 gtk_widget_show(menu_item);
159                 gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
160                 g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_log_chat_selected,call_log);
161         }
162         menu_item=gtk_image_menu_item_new_from_stock(GTK_STOCK_ADD,NULL);
163         gtk_widget_show(menu_item);
164         gtk_menu_shell_append(GTK_MENU_SHELL(menu),menu_item);
165         g_signal_connect_swapped(G_OBJECT(menu_item),"activate",(GCallback)linphone_gtk_call_log_add_contact,call_log);
166         gtk_widget_show(menu);
167         gtk_menu_attach_to_widget(GTK_MENU(menu),call_log, NULL);
168
169         if (call_label) g_free(call_label);
170         if (text_label) g_free(text_label);
171         return menu;
172 }
173
174 gboolean linphone_gtk_call_log_popup_contact(GtkWidget *list, GdkEventButton *event){
175         GtkWidget *m=linphone_gtk_create_call_log_menu(list);
176         gtk_menu_popup (GTK_MENU (m), NULL, NULL, NULL, NULL,
177                   event ? event->button : 0, event ? event->time : gtk_get_current_event_time());
178         return TRUE;
179 }
180
181 gboolean linphone_gtk_call_log_button_pressed(GtkWidget *widget, GdkEventButton *event){
182         if (event->button == 3 && event->type == GDK_BUTTON_PRESS){
183                 return linphone_gtk_call_log_popup_contact(widget, event);
184         }
185         return FALSE;
186 }
187
188 void linphone_gtk_call_log_clear_missed_call(){
189         GtkWidget *mw=linphone_gtk_get_main_window();
190         GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch"));
191         GtkWidget *page=gtk_notebook_get_nth_page(notebook,0);
192         GtkWidget *box=gtk_hbox_new(FALSE,0);
193         GtkWidget *image=gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU);
194         GtkWidget *l;
195         const gchar*text=gtk_label_get_text(GTK_LABEL(linphone_gtk_get_widget(mw,"label3")));
196         
197         l=gtk_label_new(text);
198         gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0);
199         gtk_box_pack_start(GTK_BOX(box),l,FALSE,FALSE,0);
200         gtk_notebook_set_tab_label(notebook,page,box);
201         gtk_widget_show_all(box);
202 }
203
204 gboolean linphone_gtk_call_log_reset_missed_call(GtkWidget *w, GdkEvent *event,gpointer user_data){
205         GtkWidget *mw=linphone_gtk_get_main_window();
206         GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch"));
207         gtk_notebook_set_current_page(notebook,0);
208         linphone_core_reset_missed_calls_count(linphone_gtk_get_core());
209         linphone_gtk_call_log_clear_missed_call();
210         return TRUE;
211 }
212
213 void linphone_gtk_call_log_display_missed_call(int nb){
214         GtkWidget *mw=linphone_gtk_get_main_window();
215         GtkNotebook *notebook=GTK_NOTEBOOK(linphone_gtk_get_widget(mw,"viewswitch"));
216         GtkWidget *page=gtk_notebook_get_nth_page(notebook,0);
217         GtkWidget *ebox=gtk_event_box_new();
218         GtkWidget *box=gtk_hbox_new(FALSE,0);
219         GtkWidget *image=gtk_image_new_from_stock(GTK_STOCK_REFRESH,GTK_ICON_SIZE_MENU);
220         GtkWidget *l;
221         gchar *buf;
222         
223         buf=g_markup_printf_escaped(_("<b>Recent calls (%i)</b>"),nb);
224         l=gtk_label_new(NULL);
225         gtk_label_set_markup(GTK_LABEL(l),buf);
226         gtk_box_pack_start(GTK_BOX(box),image,FALSE,FALSE,0);
227         gtk_box_pack_start(GTK_BOX(box),l,FALSE,FALSE,0);
228         gtk_container_add(GTK_CONTAINER(ebox),box);
229         gtk_notebook_set_tab_label(notebook,page,ebox);
230         gtk_widget_add_events(ebox,GDK_BUTTON_PRESS_MASK);
231         g_signal_connect(G_OBJECT(ebox),"button_press_event",(GCallback)linphone_gtk_call_log_reset_missed_call,NULL);
232         gtk_widget_show_all(ebox);
233 }
234
235 void linphone_gtk_call_log_update(GtkWidget *w){
236         GtkTreeView *v=GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view"));
237         GtkTreeStore *store;
238         const MSList *logs;
239         GtkTreeSelection *select;
240         GtkWidget *notebook=linphone_gtk_get_widget(w,"viewswitch");
241         gint nb;
242
243         store=(GtkTreeStore*)gtk_tree_view_get_model(v);
244         if (store==NULL){
245                 store=gtk_tree_store_new(3,GDK_TYPE_PIXBUF,G_TYPE_STRING,G_TYPE_POINTER,G_TYPE_STRING);
246                 gtk_tree_view_set_model(v,GTK_TREE_MODEL(store));
247                 g_object_unref(G_OBJECT(store));
248                 fill_renderers(GTK_TREE_VIEW(linphone_gtk_get_widget(w,"logs_view")));
249                 select=gtk_tree_view_get_selection(v);
250                 gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE);
251                 g_signal_connect_swapped(G_OBJECT(select),"changed",(GCallback)call_log_selection_changed,v);
252                 g_signal_connect(G_OBJECT(notebook),"focus-tab",(GCallback)linphone_gtk_call_log_reset_missed_call,NULL);
253                 g_signal_connect(G_OBJECT(v),"button-press-event",(GCallback)linphone_gtk_call_log_button_pressed,NULL);
254 //              gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")),
255 //                                   create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png")));
256         }
257         nb=linphone_core_get_missed_calls_count(linphone_gtk_get_core());
258         if(nb > 0)
259                 linphone_gtk_call_log_display_missed_call(nb);
260         gtk_tree_store_clear (store);
261
262         for (logs=linphone_core_get_call_logs(linphone_gtk_get_core());logs!=NULL;logs=logs->next){
263                 LinphoneCallLog *cl=(LinphoneCallLog*)logs->data;
264                 GtkTreeIter iter, iter2;
265                 const LinphoneAddress *la=linphone_call_log_get_dir(cl)==LinphoneCallIncoming ? linphone_call_log_get_from(cl) : linphone_call_log_get_to(cl);
266                 char *addr= linphone_address_as_string(la);
267                 const char *display;
268                 gchar *logtxt, *headtxt, *minutes, *seconds;
269                 gchar quality[20];
270                 const char *status=NULL;
271                 gchar *start_date=NULL;
272                 LinphoneFriend *lf=NULL;
273                 int duration=linphone_call_log_get_duration(cl);
274                 time_t start_date_time=linphone_call_log_get_start_date(cl);
275                 
276 #if GLIB_CHECK_VERSION(2,26,0)
277                 if (start_date_time){
278                         GDateTime *dt=g_date_time_new_from_unix_local(start_date_time);
279                         start_date=g_date_time_format(dt,"%c");
280                         g_date_time_unref(dt);
281                 }
282 #else
283                 start_date=g_strdup(ctime(&start_date_time));
284 #endif
285                 lf=linphone_core_get_friend_by_address(linphone_gtk_get_core(),addr);
286                 if(lf != NULL){
287                         la=linphone_friend_get_address(lf);
288                         display=linphone_address_get_display_name(la);
289                 } else {
290                         display=linphone_address_get_display_name(la);
291                 }
292                 if (display==NULL){
293                         display=linphone_address_get_username (la);
294                         if (display==NULL){
295                                 display=linphone_address_get_domain (la);
296                         }
297                 }
298                 if (linphone_call_log_get_quality(cl)!=-1){
299                         snprintf(quality,sizeof(quality),"%.1f",linphone_call_log_get_quality(cl));
300                 }else snprintf(quality,sizeof(quality)-1,"%s",_("n/a"));
301                 switch(linphone_call_log_get_status(cl)){
302                         case LinphoneCallAborted:
303                                 status=_("Aborted");
304                         break;
305                         case LinphoneCallMissed:
306                                 status=_("Missed");
307                         break;
308                         case LinphoneCallDeclined:
309                                 status=_("Declined");
310                         break;
311                         default:
312                         break;
313                 }
314                 minutes=g_markup_printf_escaped(
315                         ngettext("%i minute", "%i minutes", duration/60),
316                         duration/60);
317                 seconds=g_markup_printf_escaped(
318                         ngettext("%i second", "%i seconds", duration%60),
319                         duration%60);
320                 if (status==NULL) {
321                                 headtxt=g_markup_printf_escaped(_("<big><b>%s</b></big>\t%s"),display,start_date ? start_date : "");
322                                 logtxt=g_markup_printf_escaped(
323                                 _("<small><i>%s</i>\t" 
324                                   "<i>Quality: %s</i></small>\n%s\t%s\t"),
325                                 addr, quality, minutes, seconds);
326                 } else {
327                         headtxt=g_markup_printf_escaped(_("<big><b>%s</b></big>\t%s"),display,start_date ? start_date : "");
328                         logtxt=g_markup_printf_escaped(
329                         _("<small><i>%s</i></small>\t"
330                                 "\n%s"),addr, status);
331                 }
332                 g_free(minutes);
333                 g_free(seconds);
334                 if (start_date) g_free(start_date);
335                 gtk_tree_store_append (store,&iter,NULL);
336
337                 GdkPixbuf *incoming = create_pixbuf("call_status_incoming.png");
338                 GdkPixbuf *outgoing = create_pixbuf("call_status_outgoing.png");
339                 gtk_tree_store_set (store,&iter,
340                                0, linphone_call_log_get_dir(cl)==LinphoneCallOutgoing ? outgoing : incoming,
341                                1, headtxt,2,la,-1);     
342                 gtk_tree_store_append (store,&iter2,&iter);
343                 gtk_tree_store_set (store,&iter2,1,logtxt,2,la,-1);
344                 ms_free(addr);
345                 g_free(logtxt);
346                 g_free(headtxt);
347         }
348 }
349
350 void linphone_gtk_history_row_activated(GtkWidget *treeview){
351         if (put_selection_to_uribar(treeview)){
352                 GtkWidget *mw=linphone_gtk_get_main_window();
353                 linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
354         }
355 }
356
357 void linphone_gtk_history_row_selected(GtkWidget *treeview){
358         put_selection_to_uribar(treeview);
359 }
360
361 void linphone_gtk_clear_call_logs(GtkWidget *button){
362         linphone_core_clear_call_logs (linphone_gtk_get_core());
363         linphone_gtk_call_log_clear_missed_call();
364         linphone_gtk_call_log_update(gtk_widget_get_toplevel(button));
365 }
366
367 void linphone_gtk_call_log_callback(GtkWidget *button){
368         GtkWidget *mw=linphone_gtk_get_main_window();
369         if (put_selection_to_uribar(linphone_gtk_get_widget(mw,"logs_view")))
370                         linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
371 }
372
373 void linphone_gtk_call_log_response(GtkWidget *w, guint response_id){
374         GtkWidget *mw=linphone_gtk_get_main_window();
375         if (response_id==1){
376                 if (put_selection_to_uribar(linphone_gtk_get_widget(w,"logs_view")))
377                         linphone_gtk_start_call(linphone_gtk_get_widget(mw,"start_call"));
378         }else if (response_id==2){
379                 linphone_core_clear_call_logs (linphone_gtk_get_core());
380                 linphone_gtk_call_log_update(w);
381                 return;
382         }
383         g_object_set_data(G_OBJECT(mw),"call_logs",NULL);
384         gtk_widget_destroy(w);
385 }
386
387 GtkWidget * linphone_gtk_show_call_logs(void){
388         GtkWidget *mw=linphone_gtk_get_main_window();
389
390         GtkWidget *w=(GtkWidget*)g_object_get_data(G_OBJECT(linphone_gtk_get_main_window()),"call_logs");
391         if (w==NULL){
392                 w=linphone_gtk_create_window("call_logs");
393 //              gtk_button_set_image(GTK_BUTTON(linphone_gtk_get_widget(w,"call_back_button")),
394 //                                   create_pixmap (linphone_gtk_get_ui_config("callback_button","status-green.png")));
395                 g_object_set_data(G_OBJECT(mw),"call_logs",w);
396                 g_signal_connect(G_OBJECT(w),"response",(GCallback)linphone_gtk_call_log_response,NULL);
397                 gtk_widget_show(w);
398                 linphone_gtk_call_log_update(w);
399         }else gtk_window_present(GTK_WINDOW(w));
400         return w;
401 }