calltree.c 20.6 KB
Newer Older
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
1
2
/*
 *  Copyright (C) 2007 Savoir-Faire Linux inc.
3
 *  Author: Pierre-Luc Beaudoin <pierre-luc.beaudoin@savoirfairelinux.com>
4
 *  Author: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
5
6
7
 *                                                                              
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
8
 *  the Free Software Foundation; either version 3 of the License, or
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
9
10
11
12
13
14
15
16
17
18
19
20
 *  (at your option) any later version.
 *                                                                                
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *                                                                              
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

21
#include <stdlib.h>
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
22
#include <gtk/gtk.h>
23
#include <actions.h>
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
24
25
#include <calltree.h>
#include <calllist.h>
26
#include <menus.h>
27
#include <dbus.h>
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
28

29

30

31
GtkWidget   * toolbar;
Emmanuel Milou's avatar
Emmanuel Milou committed
32
GtkToolItem * pickupButton;
33
34
35
36
37
GtkToolItem * callButton;
GtkToolItem * hangupButton;
GtkToolItem * holdButton;
GtkToolItem * transfertButton;
GtkToolItem * unholdButton;
areversat's avatar
areversat committed
38
GtkToolItem * historyButton;
39
GtkToolItem * mailboxButton;
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
40
guint transfertButtonConnId; //The button toggled signal connection ID
areversat's avatar
areversat committed
41
gboolean history_shown;
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
42

43

44
45
46
/**
 * Show popup menu
 */
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
47
static gboolean            
48
49
50
51
52
53
54
popup_menu (GtkWidget *widget,
            gpointer   user_data)
{
  show_popup_menu(widget, NULL);
  return TRUE;
}            
            
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
55
56
57
58
59
60
61
62
63
64
static gboolean
button_pressed(GtkWidget* widget, GdkEventButton *event, gpointer user_data)
{
  if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
  {
    show_popup_menu(widget,  event);
    return TRUE;
  }
  return FALSE;
}
65
/**
66
 * Make a call
67
 */
areversat's avatar
areversat committed
68
static void 
69
call_button( GtkWidget *widget, gpointer   data )
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
70
{
areversat's avatar
areversat committed
71
72
73
	call_t * selectedCall;
	printf("Call button pressed\n");
	if(call_list_get_size(current_calls)>0)
Emmanuel Milou's avatar
Emmanuel Milou committed
74
		sflphone_pick_up();
areversat's avatar
areversat committed
75
76
77
78
79
80
81
	else if(call_list_get_size(active_calltree) > 0){
		printf("Calling a called num\n");
		selectedCall = call_get_selected(active_calltree);
		if(!selectedCall->to){
			selectedCall->to = call_get_number(selectedCall);
			selectedCall->from = g_strconcat("\"\" <", selectedCall->to, ">",NULL);
		}
82
		gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(historyButton), FALSE);
areversat's avatar
areversat committed
83
84
85
86
87
		printf("call : from : %s to %s\n", selectedCall->from, selectedCall->to);
		call_list_add(current_calls, selectedCall);
		update_call_tree_add(current_calls, selectedCall);
		sflphone_place_call(selectedCall);
	}else
Emmanuel Milou's avatar
Emmanuel Milou committed
88
		sflphone_new_call();
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
89
90
}

91
/**
92
 * Hang up the line
93
 */
areversat's avatar
areversat committed
94
static void 
95
hang_up( GtkWidget *widget, gpointer   data )
96
{
97
	sflphone_hang_up();
98
99
100
}

/**
101
 * Hold the line
102
 */
areversat's avatar
areversat committed
103
static void 
104
hold( GtkWidget *widget, gpointer   data )
105
{
106
	sflphone_on_hold();
107
108
109
110
111
}

/**
 * Transfert the line
 */
areversat's avatar
areversat committed
112
static void 
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
113
transfert  (GtkToggleToolButton *toggle_tool_button,
114
		gpointer             user_data)
115
{
116
117
118
119
120
121
122
123
124
	gboolean up = gtk_toggle_tool_button_get_active(toggle_tool_button);
	if(up)
	{
		sflphone_set_transfert();
	}
	else
	{
		sflphone_unset_transfert();
	}
125
126
}

127
128
129
/**
 * Unhold call
 */
areversat's avatar
areversat committed
130
static void 
131
132
unhold( GtkWidget *widget, gpointer   data )
{
133
	sflphone_off_hold();
134
}
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
135

areversat's avatar
areversat committed
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
static void
toggle_history(GtkToggleToolButton *toggle_tool_button,
		gpointer	user_data)
{
	GtkTreeSelection *sel;
	if(history_shown){
		active_calltree = current_calls;
		gtk_widget_hide(history->tree);
		gtk_widget_show(current_calls->tree);
		history_shown = FALSE;
	}else{
		active_calltree = history;
		gtk_widget_hide(current_calls->tree);
		gtk_widget_show(history->tree);
		history_shown = TRUE;
	}
	sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (active_calltree->view));
	g_signal_emit_by_name(sel, "changed");
	toolbar_update_buttons();
155

areversat's avatar
areversat committed
156
}
157
158
159
160
161
162
163
164
165
166

  static void
call_mailbox( GtkWidget* widget , gpointer data )
{
    account_t* current = account_list_get_current();
    call_t* mailboxCall = g_new0( call_t , 1);
    mailboxCall->state = CALL_STATE_DIALING;
    mailboxCall->from = g_strconcat("\"\" <>", NULL);
    mailboxCall->callID = g_new0(gchar, 30);
    g_sprintf(mailboxCall->callID, "%d", rand());
167
    mailboxCall->to = g_strdup(g_hash_table_lookup(current->properties, ACCOUNT_MAILBOX));
168
169
170
171
172
173
174
    mailboxCall->accountID = g_strdup(current->accountID);
    call_list_add( current_calls , mailboxCall );
    update_call_tree_add( current_calls , mailboxCall );    
    update_menus();
    sflphone_place_call( mailboxCall );
}

areversat's avatar
areversat committed
175
void 
176
toolbar_update_buttons ()
177
{
178

179
180
181
182
	gtk_widget_set_sensitive( GTK_WIDGET(callButton),       FALSE);
	gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     FALSE);
	gtk_widget_set_sensitive( GTK_WIDGET(holdButton),       FALSE);
	gtk_widget_set_sensitive( GTK_WIDGET(transfertButton),  FALSE);
183
	gtk_widget_set_sensitive( GTK_WIDGET(mailboxButton) , TRUE );
184
185
186
187
188
189
	gtk_widget_set_sensitive( GTK_WIDGET(unholdButton),     FALSE);
	g_object_ref(holdButton);
	g_object_ref(unholdButton);
	gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(holdButton));
	gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(unholdButton));
	gtk_toolbar_insert(GTK_TOOLBAR(toolbar), holdButton, 3);
Emmanuel Milou's avatar
Emmanuel Milou committed
190
191
192
193
194
	g_object_ref(callButton);
	g_object_ref(pickupButton);
	gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(callButton));
        gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(pickupButton));
        gtk_toolbar_insert(GTK_TOOLBAR(toolbar), callButton, 0);
195
	
196

Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
197
	gtk_signal_handler_block(GTK_OBJECT(transfertButton),transfertButtonConnId);
198
199
200
	gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(transfertButton), FALSE);
	gtk_signal_handler_unblock(transfertButton, transfertButtonConnId);

areversat's avatar
areversat committed
201
	call_t * selectedCall = call_get_selected(active_calltree);
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
202
	if (selectedCall)
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
203
	{
204
205
206
		switch(selectedCall->state) 
		{
			case CALL_STATE_INCOMING:
Emmanuel Milou's avatar
Emmanuel Milou committed
207
				gtk_widget_set_sensitive( GTK_WIDGET(pickupButton),     TRUE);
208
				gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),	TRUE);
Emmanuel Milou's avatar
Emmanuel Milou committed
209
				g_object_ref(callButton);	
Emmanuel Milou's avatar
Emmanuel Milou committed
210
				gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(callButton));
Emmanuel Milou's avatar
Emmanuel Milou committed
211
				gtk_toolbar_insert(GTK_TOOLBAR(toolbar), pickupButton, 0);
212
213
214
215
216
217
218
219
220
221
222
				break;
			case CALL_STATE_HOLD:
				gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(unholdButton),     TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
				g_object_ref(holdButton);
				gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(holdButton));
				gtk_toolbar_insert(GTK_TOOLBAR(toolbar), unholdButton, 3);
				break;
			case CALL_STATE_RINGING:
				gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
223
				gtk_widget_set_sensitive( GTK_WIDGET(callButton),     TRUE);
224
225
226
				break;
			case CALL_STATE_DIALING:
				gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
Emmanuel Milou's avatar
Emmanuel Milou committed
227
228
229
230
				gtk_widget_set_sensitive( GTK_WIDGET(pickupButton),       TRUE);
				g_object_ref(callButton);
				gtk_container_remove(GTK_CONTAINER(toolbar), GTK_WIDGET(callButton));
				gtk_toolbar_insert(GTK_TOOLBAR(toolbar), pickupButton, 0);
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
				break;
			case CALL_STATE_CURRENT:
				gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(holdButton),       TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(transfertButton),  TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
				break;
			case CALL_STATE_BUSY:
			case CALL_STATE_FAILURE:
				gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
				break; 
			case CALL_STATE_TRANSFERT:
				gtk_signal_handler_block(GTK_OBJECT(transfertButton),transfertButtonConnId);
				gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(transfertButton), TRUE);
				gtk_signal_handler_unblock(transfertButton, transfertButtonConnId);
				gtk_widget_set_sensitive( GTK_WIDGET(callButton),       TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(hangupButton),     TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(holdButton),       TRUE);
				gtk_widget_set_sensitive( GTK_WIDGET(transfertButton),  TRUE);
				break;
			default:
				g_warning("Should not happen!");
				break;
		}
	}
	else 
	{
		if( account_list_get_size() > 0 )
		{
			gtk_widget_set_sensitive( GTK_WIDGET(callButton), TRUE);
		}
		else
		{
			gtk_widget_set_sensitive( GTK_WIDGET(callButton), FALSE);
265
			gtk_widget_set_sensitive( GTK_WIDGET(mailboxButton), FALSE);
266
267
		}
	}
268
269
}
/* Call back when the user click on a call in the list */
areversat's avatar
areversat committed
270
static void 
271
selected(GtkTreeSelection *sel, void* data) 
272
273
274
{
	GtkTreeIter  iter;
	GValue val;
areversat's avatar
areversat committed
275
276
	GtkTreeModel *model = (GtkTreeModel*)active_calltree->store;
	printf("Select !\n");
277

278
279
	if (! gtk_tree_selection_get_selected (sel, &model, &iter))
		return;
280

281
	val.g_type = 0;
282
	gtk_tree_model_get_value (model, &iter, 2, &val);
283

areversat's avatar
areversat committed
284
	call_select(active_calltree, (call_t*) g_value_get_pointer(&val));
285
286
287
	g_value_unset(&val);

	toolbar_update_buttons();
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
288
289
}

290
291
/* A row is activated when it is double clicked */
void  row_activated(GtkTreeView       *tree_view,
292
293
		GtkTreePath       *path,
		GtkTreeViewColumn *column,
294
		void * data) 
295
{
areversat's avatar
areversat committed
296
	call_t * selectedCall = call_get_selected(current_calls);
297
298
	if (selectedCall)
	{
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
		switch(selectedCall->state)  
		{
			case CALL_STATE_INCOMING:
				dbus_accept(selectedCall);
				break;
			case CALL_STATE_HOLD:
				dbus_unhold(selectedCall);
				break;
			case CALL_STATE_RINGING:
			case CALL_STATE_CURRENT:
			case CALL_STATE_BUSY:
			case CALL_STATE_FAILURE:
				break;
			case CALL_STATE_DIALING:
				sflphone_place_call (selectedCall);
				break;
			default:
				g_warning("Should not happen!");
				break;
		}
	}
320
}                  
321

322
323

GtkWidget * 
areversat's avatar
areversat committed
324
325
create_toolbar ()
{
326
327
328
329
330
	GtkWidget *ret;
	GtkWidget *image;

	ret = gtk_toolbar_new();
	toolbar = ret;
Emmanuel Milou's avatar
Emmanuel Milou committed
331
332
	
	gtk_toolbar_set_orientation(GTK_TOOLBAR(ret), GTK_ORIENTATION_HORIZONTAL);
333
	gtk_toolbar_set_style(GTK_TOOLBAR(ret), GTK_TOOLBAR_ICONS);
334
335

	image = gtk_image_new_from_file( ICONS_DIR "/call.svg");
Emmanuel Milou's avatar
Emmanuel Milou committed
336
	callButton = gtk_tool_button_new (image, _("Place a call"));
337
	gtk_widget_set_tooltip_text(GTK_WIDGET(callButton), _("Place a call"));
338
339
	g_signal_connect (G_OBJECT (callButton), "clicked",
			G_CALLBACK (call_button), NULL);
340
	gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(callButton), -1);
341
342

	image = gtk_image_new_from_file( ICONS_DIR "/accept.svg");
343
344
	pickupButton = gtk_tool_button_new(image, _("Pick up"));
	gtk_widget_set_tooltip_text(GTK_WIDGET(pickupButton), _("Pick up"));
Emmanuel Milou's avatar
Emmanuel Milou committed
345
346
347
348
	gtk_widget_set_state( GTK_WIDGET(pickupButton), GTK_STATE_INSENSITIVE);
	g_signal_connect(G_OBJECT (pickupButton), "clicked", 
			G_CALLBACK (call_button), NULL);
	gtk_widget_show_all(GTK_WIDGET(pickupButton));
349
350

	image = gtk_image_new_from_file( ICONS_DIR "/hang_up.svg");
351
352
	hangupButton = gtk_tool_button_new (image, _("Hang up"));
	gtk_widget_set_tooltip_text(GTK_WIDGET(hangupButton), _("Hang up"));
353
354
355
356
357
358
	gtk_widget_set_state( GTK_WIDGET(hangupButton), GTK_STATE_INSENSITIVE);
	g_signal_connect (G_OBJECT (hangupButton), "clicked",
			G_CALLBACK (hang_up), NULL);
	gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(hangupButton), -1);  

	image = gtk_image_new_from_file( ICONS_DIR "/unhold.svg");
359
360
	unholdButton = gtk_tool_button_new (image, _("Off Hold"));
	gtk_widget_set_tooltip_text(GTK_WIDGET(unholdButton), _("Off Hold"));
361
362
363
364
365
366
	gtk_widget_set_state( GTK_WIDGET(unholdButton), GTK_STATE_INSENSITIVE);
	g_signal_connect (G_OBJECT (unholdButton), "clicked",
			G_CALLBACK (unhold), NULL);
	gtk_widget_show_all(GTK_WIDGET(unholdButton));

	image = gtk_image_new_from_file( ICONS_DIR "/hold.svg");
367
368
	holdButton =  gtk_tool_button_new (image, _("On Hold"));
	gtk_widget_set_tooltip_text(GTK_WIDGET(holdButton), _("On Hold"));
369
370
371
	gtk_widget_set_state( GTK_WIDGET(holdButton), GTK_STATE_INSENSITIVE);
	g_signal_connect (G_OBJECT (holdButton), "clicked",
			G_CALLBACK (hold), NULL);
372
	gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(holdButton), -1);
373
374
375
376

	image = gtk_image_new_from_file( ICONS_DIR "/transfert.svg");
	transfertButton = gtk_toggle_tool_button_new ();
	gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(transfertButton), image);
377
378
	gtk_widget_set_tooltip_text(GTK_WIDGET(transfertButton), _("Transfer"));
	gtk_tool_button_set_label(GTK_TOOL_BUTTON(transfertButton), _("Transfer"));
379
380
381
382
383
	gtk_widget_set_state( GTK_WIDGET(transfertButton), GTK_STATE_INSENSITIVE);
	transfertButtonConnId = g_signal_connect (G_OBJECT (transfertButton), "toggled",
			G_CALLBACK (transfert), NULL);
	gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(transfertButton), -1);  

384
	historyButton = gtk_toggle_tool_button_new_from_stock(GTK_STOCK_INDEX);
areversat's avatar
areversat committed
385
386
387
388
389
390
391
392
	gtk_widget_set_tooltip_text(GTK_WIDGET(historyButton), _("History"));
	gtk_tool_button_set_label(GTK_TOOL_BUTTON(historyButton), _("History"));
	g_signal_connect (G_OBJECT (historyButton), "toggled",
			G_CALLBACK (toggle_history), NULL);
	gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(historyButton), -1);  
	history_shown = FALSE;
	active_calltree = current_calls;

Emmanuel Milou's avatar
Emmanuel Milou committed
393
	image = gtk_image_new_from_file( ICONS_DIR "/mailbox.svg");
394
	mailboxButton = gtk_tool_button_new( image , _("Voicemail box"));
Emmanuel Milou's avatar
Emmanuel Milou committed
395
	gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(mailboxButton), image);
396
	if( account_list_get_size() ==0 ) gtk_widget_set_state( GTK_WIDGET(mailboxButton), GTK_STATE_INSENSITIVE );
397
        gtk_widget_set_tooltip_text(GTK_WIDGET(mailboxButton), _("Voicemail box"));
Emmanuel Milou's avatar
Emmanuel Milou committed
398
        g_signal_connect (G_OBJECT (mailboxButton), "clicked",
399
400
401
                        G_CALLBACK (call_mailbox), NULL);
        gtk_toolbar_insert(GTK_TOOLBAR(ret), GTK_TOOL_ITEM(mailboxButton), -1);

402
	return ret;
403
404

}  
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
405

406
void 
areversat's avatar
areversat committed
407
408
create_call_tree (calltab_t* tab)
{
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
409
410
411
412
	GtkWidget *sw;
	GtkCellRenderer *rend;
	GtkTreeViewColumn *col;
	GtkTreeSelection *sel;
413

414
415
416
	tab->tree = gtk_vbox_new(FALSE, 10); 

	gtk_container_set_border_width (GTK_CONTAINER (tab->tree), 0);
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
417
418

	sw = gtk_scrolled_window_new( NULL, NULL);
419
	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
420
421
	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);

422
	tab->store = gtk_list_store_new (3, 
423
424
425
426
			GDK_TYPE_PIXBUF,// Icon 
			G_TYPE_STRING,  // Description
			G_TYPE_POINTER  // Pointer to the Object
			);
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
427

428
429
430
	tab->view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(tab->store));
	gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(tab->view), FALSE);
	g_signal_connect (G_OBJECT (tab->view), "row-activated",
431
432
433
			G_CALLBACK (row_activated),
			NULL);

434
  // Connect the popup menu
435
	g_signal_connect (G_OBJECT (tab->view), "popup-menu",
436
437
			G_CALLBACK (popup_menu), 
			NULL);
438
	g_signal_connect (G_OBJECT (tab->view), "button-press-event",
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
439
440
			G_CALLBACK (button_pressed), 
			NULL);
441

442
443
444
445
446
	rend = gtk_cell_renderer_pixbuf_new();
	col = gtk_tree_view_column_new_with_attributes ("Icon",
			rend,
			"pixbuf", 0,
			NULL);
447
	gtk_tree_view_append_column (GTK_TREE_VIEW(tab->view), col);
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
448
449
450

	rend = gtk_cell_renderer_text_new();
	col = gtk_tree_view_column_new_with_attributes ("Description",
451
452
453
			rend,
			"markup", 1,
			NULL);
454
455
456
	gtk_tree_view_append_column (GTK_TREE_VIEW(tab->view), col);
	g_object_unref(G_OBJECT(tab->store));
	gtk_container_add(GTK_CONTAINER(sw), tab->view);
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
457

458
	sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tab->view));
459
460
	g_signal_connect (G_OBJECT (sel), "changed",
			G_CALLBACK (selected),
461
			NULL);
462

463
	gtk_box_pack_start(GTK_BOX(tab->tree), sw, TRUE, TRUE, 0);
464

465
466
467
468
	gtk_widget_show(tab->tree); 
	
	//toolbar_update_buttons();
	
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
469
}
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
470
471

void 
472
update_call_tree_remove (calltab_t* tab, call_t * c)
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
473
474
{
	GtkTreeIter iter;
475
476
	GValue val;
	call_t * iterCall;
477
478
	GtkListStore* store = tab->store;
	GtkWidget* view = tab->view;
479

480
	int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
481
	int i;
482
483
	for( i = 0; i < nbChild; i++)
	{
484
485
486
487
488
489
490
491
492
493
494
495
496
		if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, i))
		{
			val.g_type = 0;
			gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, 2, &val);

			iterCall = (call_t*) g_value_get_pointer(&val);
			g_value_unset(&val);

			if(iterCall == c)
			{
				gtk_list_store_remove(store, &iter);
			}
		}
497
	}
498
	call_t * selectedCall = call_get_selected(tab);
499
	if(selectedCall == c)
500
		call_select(tab, NULL);
501
	toolbar_update_buttons();
502
}
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
503

Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
504
void 
505
update_call_tree (calltab_t* tab, call_t * c)
506
{
507
508
	GdkPixbuf *pixbuf;
	GtkTreeIter iter;
509
510
	GValue val;
	call_t * iterCall;
511
512
	GtkListStore* store = tab->store;
	GtkWidget* view = tab->view;
513

514
	int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
515
	int i;
516
	for( i = 0; i < nbChild; i++)
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
517
	{
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
		if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, i))
		{
			val.g_type = 0;
			gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, 2, &val);

			iterCall = (call_t*) g_value_get_pointer(&val);
			g_value_unset(&val);

			if(iterCall == c)
			{
				// Existing call in the list
				gchar * markup;
				if(c->state == CALL_STATE_TRANSFERT)
				{
					markup = g_markup_printf_escaped("<b>%s</b>\n"
							"%s\n<i>Transfert to:</i> %s",  
							call_get_name(c), 
							call_get_number(c), 
							c->to);
				}
				else
				{
					markup = g_markup_printf_escaped("<b>%s</b>\n"
							"%s", 
							call_get_name(c), 
							call_get_number(c));
				}

546
547
				if( tab == current_calls )
				{
548
549
550
551
552
553
554
555
556
557
558
559
				switch(c->state)
				{
					case CALL_STATE_HOLD:
						pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/hold.svg", NULL);
						break;
					case CALL_STATE_RINGING:
						pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL);
						break;
					case CALL_STATE_CURRENT:
						pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/current.svg", NULL);
						break;
					case CALL_STATE_DIALING:
560
						pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL);
561
562
563
564
565
566
567
568
569
570
571
572
573
						break;
					case CALL_STATE_FAILURE:
						pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/fail.svg", NULL);
						break;
					case CALL_STATE_BUSY:
						pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/busy.svg", NULL);
						break;
					case CALL_STATE_TRANSFERT:
						pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/transfert.svg", NULL);
						break;
					default:
						g_warning("Should not happen!");
				}
574
575
576
577
				}
				else
				{
				switch(c->history_state)
578
579
580
581
582
583
584
585
586
				{
				  case OUTGOING:
				    g_print("Outgoing state\n");
				    pixbuf = gdk_pixbuf_new_from_file( ICONS_DIR "/outgoing.svg", NULL);
				    break;
				  case INCOMING:
				    g_print("Incoming state\n");
				    pixbuf = gdk_pixbuf_new_from_file( ICONS_DIR "/incoming.svg", NULL);
				    break;
587
588
589
590
				  case MISSED:
				    g_print("Missed state\n");
				    pixbuf = gdk_pixbuf_new_from_file( ICONS_DIR "/missed.svg", NULL);
				    break;
591
592
593
				  default:
				    g_print("No history state\n");  
				    break;
594
595
				}
				}
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
				//Resize it
				if(pixbuf)
				{
					if(gdk_pixbuf_get_width(pixbuf) > 32 || gdk_pixbuf_get_height(pixbuf) > 32)
					{
						pixbuf =  gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR);
					}
				}
				gtk_list_store_set(store, &iter,
						0, pixbuf, // Icon
						1, markup, // Description
						-1);

				if (pixbuf != NULL)
					g_object_unref(G_OBJECT(pixbuf));

			} 
		}

	} 
	toolbar_update_buttons();
617
618
}

Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
619
void 
620
update_call_tree_add (calltab_t* tab, call_t * c)
621
{
622
	if( tab == history && ( call_list_get_size( tab ) > dbus_get_max_calls() ) )
623
624
	  return;

625
	GdkPixbuf *pixbuf;
626
	GtkTreeIter iter;
627
	GtkTreeSelection* sel;
628
629
	//GtkListStore* store = tab->store;
	//GtkWidget* view = tab->view;
630

631
632
633
634
635
636
637
	// New call in the list
	gchar * markup;
	markup = g_markup_printf_escaped("<b>%s</b>\n"
			"%s", 
			call_get_name(c), 
			call_get_number(c));

638
	gtk_list_store_prepend (tab->store, &iter);
639

640
641
	if( tab == current_calls )
	{
642
	switch(c->state)
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
643
644
	{
		case CALL_STATE_INCOMING:
645
			pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL);
646
			break;
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
647
		case CALL_STATE_DIALING:
648
649
			pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL);
			break;
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
650
		case CALL_STATE_RINGING:
651
652
			pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL);
			break;
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
653
		default:
654
			g_warning("Should not happen!");
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
655
	}
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
	}
	else{
	  switch(c->history_state)
	  {
	    case INCOMING:
	      pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/incoming.svg", NULL);
	      break;
	    case OUTGOING:
	      pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/outgoing.svg", NULL);
	      break;
	    case MISSED:
	      pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/missed.svg", NULL);
	      break;
	    default:
	      g_warning("Should not happen!");
	  }
	}
	  
674
675
676
677
678
679
680
681
	//Resize it
	if(pixbuf)
	{
		if(gdk_pixbuf_get_width(pixbuf) > 32 || gdk_pixbuf_get_height(pixbuf) > 32)
		{
			pixbuf =  gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR);
		}
	}
682
	gtk_list_store_set(tab->store, &iter,
683
684
685
686
687
688
689
690
			0, pixbuf, // Icon
			1, markup, // Description
			2, c,      // Pointer
			-1);

	if (pixbuf != NULL)
		g_object_unref(G_OBJECT(pixbuf));

691
	sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view));
692
693
	gtk_tree_selection_select_iter(GTK_TREE_SELECTION(sel), &iter);
	toolbar_update_buttons();
Pierre-Luc Beaudoin's avatar
Pierre-Luc Beaudoin committed
694
}