From 3cbbbab6b1e5f9a07250b927df0441f8dfb7a442 Mon Sep 17 00:00:00 2001
From: Emmanuel Milou <emmanuel.milou@savoirfairelinux.com>
Date: Thu, 9 Apr 2009 16:37:07 -0400
Subject: [PATCH] Add a contextual menu to edit a number from the contacts tab

---
 sflphone-gtk/src/contacts/calltree.c | 709 ++++++++++++++-------------
 sflphone-gtk/src/menus.c             |  65 ++-
 2 files changed, 405 insertions(+), 369 deletions(-)

diff --git a/sflphone-gtk/src/contacts/calltree.c b/sflphone-gtk/src/contacts/calltree.c
index c7548763fc..a1b5373ed9 100644
--- a/sflphone-gtk/src/contacts/calltree.c
+++ b/sflphone-gtk/src/contacts/calltree.c
@@ -27,39 +27,39 @@
 /**
  * Show popup menu
  */
-  static gboolean
+    static gboolean
 popup_menu (GtkWidget *widget,
-    gpointer   user_data UNUSED)
+        gpointer   user_data UNUSED)
 {
-  show_popup_menu(widget, NULL);
-  return TRUE;
+    show_popup_menu(widget, NULL);
+    return TRUE;
 }
 
 /* Call back when the user click on a call in the list */
-  static void
+    static void
 selected(GtkTreeSelection *sel, void* data UNUSED )
 {
-  GtkTreeIter  iter;
-  GValue val;
-  GtkTreeModel *model = (GtkTreeModel*)active_calltree->store;
+    GtkTreeIter  iter;
+    GValue val;
+    GtkTreeModel *model = (GtkTreeModel*)active_calltree->store;
 
-  if (! gtk_tree_selection_get_selected (sel, &model, &iter))
-    return;
+    if (! gtk_tree_selection_get_selected (sel, &model, &iter))
+        return;
 
-  val.g_type = 0;
-  gtk_tree_model_get_value (model, &iter, 2, &val);
+    val.g_type = 0;
+    gtk_tree_model_get_value (model, &iter, 2, &val);
 
-  calltab_select_call(active_calltree, (call_t*) g_value_get_pointer(&val));
-  g_value_unset(&val);
+    calltab_select_call(active_calltree, (call_t*) g_value_get_pointer(&val));
+    g_value_unset(&val);
 
-  toolbar_update_buttons();
+    toolbar_update_buttons();
 }
 
 /* A row is activated when it is double clicked */
 void  row_activated(GtkTreeView       *tree_view UNUSED,
-    GtkTreePath       *path UNUSED,
-    GtkTreeViewColumn *column UNUSED,
-    void * data UNUSED)
+        GtkTreePath       *path UNUSED,
+        GtkTreeViewColumn *column UNUSED,
+        void * data UNUSED)
 {
     call_t* selectedCall;
     call_t* new_call;
@@ -77,23 +77,23 @@ void  row_activated(GtkTreeView       *tree_view UNUSED,
             switch(selectedCall->state)
             {
                 case CALL_STATE_INCOMING:
-	                dbus_accept(selectedCall);
+                    dbus_accept(selectedCall);
                     stop_notification();
-	                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("Row activated - Should not happen!");
-	                break;
+                    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("Row activated - Should not happen!");
+                    break;
             }
         }
 
@@ -101,7 +101,7 @@ void  row_activated(GtkTreeView       *tree_view UNUSED,
         else
         {
             to = g_strdup(call_get_number(selectedCall));
-            from = g_strconcat("\"\" <", call_get_number(selectedCall), ">",NULL);
+            from = g_strconcat("\"", call_get_name (selectedCall), "\" <", call_get_number(selectedCall), ">",NULL);
             account_id = g_strdup (selectedCall->accountID);
 
             // Create a new call
@@ -115,378 +115,381 @@ void  row_activated(GtkTreeView       *tree_view UNUSED,
     }
 }
 
-static gboolean
+    static gboolean
 on_key_released (GtkWidget   *widget UNUSED,
-                GdkEventKey *event,
-                gpointer     user_data UNUSED)
+        GdkEventKey *event,
+        gpointer     user_data UNUSED)
 {
-  // If a modifier key is pressed, it's a shortcut, pass along
-  if(event->state & GDK_CONTROL_MASK ||
-     event->state & GDK_MOD1_MASK    ||
-     event->keyval == 60             || // <
-     event->keyval == 62             || // >
-     event->keyval == 34             || // "
-     event->keyval == 65361          || // left arrow
-     event->keyval == 65363          || // right arrow
-     event->keyval >= 65470          || // F-keys
-     event->keyval == 32                // space
-     )
-    return FALSE;
-  else
-    sflphone_keypad(event->keyval, event->string);
-  return TRUE;
+    // If a modifier key is pressed, it's a shortcut, pass along
+    if(event->state & GDK_CONTROL_MASK ||
+            event->state & GDK_MOD1_MASK    ||
+            event->keyval == 60             || // <
+            event->keyval == 62             || // >
+            event->keyval == 34             || // "
+            event->keyval == 65361          || // left arrow
+            event->keyval == 65363          || // right arrow
+            event->keyval >= 65470          || // F-keys
+            event->keyval == 32                // space
+      )
+        return FALSE;
+    else
+        sflphone_keypad(event->keyval, event->string);
+    return TRUE;
 }
 
-static gboolean
+    static gboolean
 button_pressed(GtkWidget* widget, GdkEventButton *event, gpointer user_data UNUSED)
 {
-if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
-{
-  if( active_calltree == current_calls )
-  {
-    show_popup_menu(widget,  event);
-    return TRUE;
-  }
-  else if (active_calltree == history)
-  {
-    show_popup_menu_history (widget,  event);
-    return TRUE;
-  }
-  else{
-      show_popup_menu_contacts (widget, event);
-      return TRUE;
-  }
-}
-return FALSE;
+    if (event->button == 3 && event->type == GDK_BUTTON_PRESS)
+    {
+        if( active_calltree == current_calls )
+        {
+            show_popup_menu(widget,  event);
+            return TRUE;
+        }
+        else if (active_calltree == history)
+        {
+            show_popup_menu_history (widget,  event);
+            return TRUE;
+        }
+        else{
+            show_popup_menu_contacts (widget, event);
+            return TRUE;
+        }
+    }
+    return FALSE;
 }
 
 /**
  * Reset call tree
  */
-  void
+    void
 calltree_reset (calltab_t* tab)
 {
-  gtk_list_store_clear (tab->store);
+    gtk_list_store_clear (tab->store);
 }
 
-  void
+    void
 calltree_create (calltab_t* tab, gchar* searchbar_type)
 {
-  GtkWidget *sw;
-  GtkCellRenderer *rend;
-  GtkTreeViewColumn *col;
-  GtkTreeSelection *sel;
-
-  tab->tree = gtk_vbox_new(FALSE, 10);
-
-  gtk_container_set_border_width (GTK_CONTAINER (tab->tree), 0);
-
-  sw = gtk_scrolled_window_new( NULL, NULL);
-  gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
-  gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
-  g_signal_connect (G_OBJECT ( sw ), "key-release-event",G_CALLBACK (on_key_released), NULL);
-
-  tab->store = gtk_list_store_new (3,
-      GDK_TYPE_PIXBUF,// Icon
-      G_TYPE_STRING,  // Description
-      G_TYPE_POINTER  // Pointer to the Object
-      );
-
-  tab->view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(tab->store));
-  gtk_tree_view_set_enable_search( GTK_TREE_VIEW(tab->view), FALSE);
-  gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(tab->view), FALSE);
-  g_signal_connect (G_OBJECT (tab->view), "row-activated",
-      G_CALLBACK (row_activated),
-      NULL);
-
-  // Connect the popup menu
-  g_signal_connect (G_OBJECT (tab->view), "popup-menu",
-      G_CALLBACK (popup_menu),
-      NULL);
-  g_signal_connect (G_OBJECT (tab->view), "button-press-event",
-      G_CALLBACK (button_pressed),
-      NULL);
-
-
-  rend = gtk_cell_renderer_pixbuf_new();
-  col = gtk_tree_view_column_new_with_attributes ("Icon",
-      rend,
-      "pixbuf", 0,
-      NULL);
-  gtk_tree_view_append_column (GTK_TREE_VIEW(tab->view), col);
-
-  rend = gtk_cell_renderer_text_new();
-  col = gtk_tree_view_column_new_with_attributes ("Description",
-      rend,
-      "markup", 1,
-      NULL);
-  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);
-
-  sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tab->view));
-  g_signal_connect (G_OBJECT (sel), "changed",
-      G_CALLBACK (selected),
-      NULL);
-
-  gtk_box_pack_start(GTK_BOX(tab->tree), sw, TRUE, TRUE, 0);
+    GtkWidget *sw;
+    GtkCellRenderer *rend;
+    GtkTreeViewColumn *col;
+    GtkTreeSelection *sel;
 
-  // no search bar if tab is either "history" or "addressbook"
-  if(searchbar_type){
-      calltab_create_searchbar(tab,searchbar_type);
-      gtk_box_pack_start(GTK_BOX(tab->tree), tab->searchbar, FALSE, TRUE, 0);
-  }
+    tab->tree = gtk_vbox_new(FALSE, 10);
+
+    gtk_container_set_border_width (GTK_CONTAINER (tab->tree), 0);
+
+    sw = gtk_scrolled_window_new( NULL, NULL);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
+    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_IN);
+    g_signal_connect (G_OBJECT ( sw ), "key-release-event",G_CALLBACK (on_key_released), NULL);
+
+    tab->store = gtk_list_store_new (3,
+            GDK_TYPE_PIXBUF,// Icon
+            G_TYPE_STRING,  // Description
+            G_TYPE_POINTER  // Pointer to the Object
+            );
+
+    tab->view = gtk_tree_view_new_with_model (GTK_TREE_MODEL(tab->store));
+    gtk_tree_view_set_enable_search( GTK_TREE_VIEW(tab->view), FALSE);
+    gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(tab->view), FALSE);
+    g_signal_connect (G_OBJECT (tab->view), "row-activated",
+            G_CALLBACK (row_activated),
+            NULL);
+
+    // Connect the popup menu
+    g_signal_connect (G_OBJECT (tab->view), "popup-menu",
+            G_CALLBACK (popup_menu),
+            NULL);
+    g_signal_connect (G_OBJECT (tab->view), "button-press-event",
+            G_CALLBACK (button_pressed),
+            NULL);
+
+
+    rend = gtk_cell_renderer_pixbuf_new();
+    col = gtk_tree_view_column_new_with_attributes ("Icon",
+            rend,
+            "pixbuf", 0,
+            NULL);
+    gtk_tree_view_append_column (GTK_TREE_VIEW(tab->view), col);
+
+    rend = gtk_cell_renderer_text_new();
+    col = gtk_tree_view_column_new_with_attributes ("Description",
+            rend,
+            "markup", 1,
+            NULL);
+    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);
+
+    sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (tab->view));
+    g_signal_connect (G_OBJECT (sel), "changed",
+            G_CALLBACK (selected),
+            NULL);
+
+    gtk_box_pack_start(GTK_BOX(tab->tree), sw, TRUE, TRUE, 0);
+
+    // no search bar if tab is either "history" or "addressbook"
+    if(searchbar_type){
+        calltab_create_searchbar(tab,searchbar_type);
+        gtk_box_pack_start(GTK_BOX(tab->tree), tab->searchbar, FALSE, TRUE, 0);
+    }
 
-  gtk_widget_show(tab->tree);
+    gtk_widget_show(tab->tree);
 
 
-  // gtk_widget_show(tab->searchbar);
+    // gtk_widget_show(tab->searchbar);
 
-  //toolbar_update_buttons();
+    //toolbar_update_buttons();
 
 }
 
-void
+    void
 calltree_remove_call (calltab_t* tab, call_t * c)
 {
-  GtkTreeIter iter;
-  GValue val;
-  call_t * iterCall;
-  GtkListStore* store = tab->store;
-
-  int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
-  int i;
-  for( i = 0; i < nbChild; i++)
-  {
-    if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, i))
+    GtkTreeIter iter;
+    GValue val;
+    call_t * iterCall;
+    GtkListStore* store = tab->store;
+
+    int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
+    int i;
+    for( i = 0; i < nbChild; i++)
     {
-      val.g_type = 0;
-      gtk_tree_model_get_value (GTK_TREE_MODEL(store), &iter, 2, &val);
+        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);
+            iterCall = (call_t*) g_value_get_pointer(&val);
+            g_value_unset(&val);
 
-      if(iterCall == c)
-      {
-	gtk_list_store_remove(store, &iter);
-      }
+            if(iterCall == c)
+            {
+                gtk_list_store_remove(store, &iter);
+            }
+        }
     }
-  }
-  call_t * selectedCall = calltab_get_selected_call(tab);
-  if(selectedCall == c)
-    calltab_select_call(tab, NULL);
-  toolbar_update_buttons();
+    call_t * selectedCall = calltab_get_selected_call(tab);
+    if(selectedCall == c)
+        calltab_select_call(tab, NULL);
+    toolbar_update_buttons();
 }
 
-  void
+    void
 calltree_update_call (calltab_t* tab, call_t * c)
 {
-  GdkPixbuf *pixbuf=NULL;
-  GtkTreeIter iter;
-  GValue val;
-  call_t * iterCall;
-  GtkListStore* store = tab->store;
-
-  int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
-  int i;
-  for( i = 0; i < nbChild; i++)
-  {
-    if(gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store), &iter, NULL, i))
+    GdkPixbuf *pixbuf=NULL;
+    GtkTreeIter iter;
+    GValue val;
+    call_t * iterCall;
+    GtkListStore* store = tab->store;
+
+    int nbChild = gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store), NULL);
+    int i;
+    for( i = 0; i < nbChild; 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 * description;
-	gchar * date="";
-	gchar * duration="";
-	if(c->state == CALL_STATE_TRANSFERT)
-	{
-	  description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>\n<i>Transfert to:</i> %s",
-	      call_get_number(c),
-	      call_get_name(c),
-	      c->to);
-	}
-	else
-	{
-	  description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>",
-	      call_get_number(c),
-	      call_get_name(c));
-	}
-
-	if( tab == current_calls )
-	{
-	  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:
-	      pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL);
-	      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;
-            case CALL_STATE_RECORD:
-	      pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/rec_call.svg", NULL);
-	      break;
-	    default:
-	      g_warning("Update calltree - Should not happen!");
-	  }
-	}
-	else
-	{
-	  switch(c->history_state)
-	  {
-	    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;
-	    case MISSED:
-	      g_print("Missed state\n");
-	      pixbuf = gdk_pixbuf_new_from_file( ICONS_DIR "/missed.svg", NULL);
-	      break;
-	    default:
-	      g_print("No history state\n");
-	      break;
-	  }
-	  date = timestamp_get_call_date();
-	  duration = process_call_duration(c);
-	  duration = g_strconcat( date , duration , NULL);
-	  description = g_strconcat( description , duration, NULL);
-	}
-	//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, description, // Description
-	    -1);
-
-	if (pixbuf != NULL)
-	  g_object_unref(G_OBJECT(pixbuf));
-
-      }
-    }
+        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 * description;
+                gchar * date="";
+                gchar * duration="";
+                if(c->state == CALL_STATE_TRANSFERT)
+                {
+                    description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>\n<i>Transfert to:</i> %s",
+                            call_get_number(c),
+                            call_get_name(c),
+                            c->to);
+                }
+                else
+                {
+                    description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>",
+                            call_get_number(c),
+                            call_get_name(c));
+                }
+
+                if( tab == current_calls )
+                {
+                    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:
+                            pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL);
+                            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;
+                        case CALL_STATE_RECORD:
+                            pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/rec_call.svg", NULL);
+                            break;
+                        default:
+                            g_warning("Update calltree - Should not happen!");
+                    }
+                }
+                else
+                {
+                    switch(c->history_state)
+                    {
+                        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;
+                        case MISSED:
+                            g_print("Missed state\n");
+                            pixbuf = gdk_pixbuf_new_from_file( ICONS_DIR "/missed.svg", NULL);
+                            break;
+                        default:
+                            g_print("No history state\n");
+                            break;
+                    }
+                    date = timestamp_get_call_date();
+                    duration = process_call_duration(c);
+                    duration = g_strconcat( date , duration , NULL);
+                    description = g_strconcat( description , duration, NULL);
+                }
+                //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, description, // Description
+                        -1);
+
+                if (pixbuf != NULL)
+                    g_object_unref(G_OBJECT(pixbuf));
+
+            }
+        }
 
-  }
-  toolbar_update_buttons();
+    }
+    toolbar_update_buttons();
 }
 
-  void
+    void
 calltree_add_call (calltab_t* tab, call_t * c)
 {
-  if( tab == history && ( calllist_get_size( tab ) > dbus_get_max_calls() ) )
-    return;
+    if( tab == history && ( calllist_get_size( tab ) > dbus_get_max_calls() ) )
+        return;
 
-  GdkPixbuf *pixbuf=NULL;
-  GtkTreeIter iter;
-  GtkTreeSelection* sel;
+    GdkPixbuf *pixbuf=NULL;
+    GtkTreeIter iter;
+    GtkTreeSelection* sel;
 
-  // New call in the list
-  gchar * description;
-  gchar * date="";
-  description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>",
-      call_get_number(c),
-      call_get_name(c));
+    // New call in the list
+    gchar * description;
+    gchar * date="";
+    description = g_markup_printf_escaped("<b>%s</b> <i>%s</i>",
+            call_get_number(c),
+            call_get_name(c));
 
+    g_print ("calltree_add_call %s\n", call_get_number (c));
+    g_print ("description %s\n", description);
 
-  gtk_list_store_prepend (tab->store, &iter);
 
-  if( tab == current_calls )
-  {
-    switch(c->state)
+    gtk_list_store_prepend (tab->store, &iter);
+
+    if( tab == current_calls )
     {
-      case CALL_STATE_INCOMING:
-	pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL);
-	break;
-      case CALL_STATE_DIALING:
-	pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL);
-	break;
-      case CALL_STATE_RINGING:
-	pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL);
-	break;
-      default:
-	g_warning("Update calltree add - Should not happen!");
+        switch(c->state)
+        {
+            case CALL_STATE_INCOMING:
+                pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL);
+                break;
+            case CALL_STATE_DIALING:
+                pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/dial.svg", NULL);
+                break;
+            case CALL_STATE_RINGING:
+                pixbuf = gdk_pixbuf_new_from_file(ICONS_DIR "/ring.svg", NULL);
+                break;
+            default:
+                g_warning("Update calltree add - Should not happen!");
+        }
     }
-  }
 
-  else if (tab == history) {
-    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("History - Should not happen!");
+    else if (tab == history) {
+        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("History - Should not happen!");
+        }
+        date = timestamp_get_call_date();
+        description = g_strconcat( date , description , NULL);
     }
-    date = timestamp_get_call_date();
-    description = g_strconcat( date , description , NULL);
-  }
 
-  else if (tab == contacts) {
-    pixbuf = c->contact_thumbnail;
-    description = g_strconcat( description , NULL);
-  }
+    else if (tab == contacts) {
+        pixbuf = c->contact_thumbnail;
+        description = g_strconcat( description , NULL);
+    }
 
-  else {
+    else {
         g_warning ("This widget doesn't exist - This is a bug in the application\n.");
-  }
+    }
 
 
-  //Resize it
-  if(pixbuf)
-  {
-    if(gdk_pixbuf_get_width(pixbuf) > 32 || gdk_pixbuf_get_height(pixbuf) > 32)
+    //Resize it
+    if(pixbuf)
     {
-      pixbuf =  gdk_pixbuf_scale_simple(pixbuf, 32, 32, GDK_INTERP_BILINEAR);
+        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(tab->store, &iter,
-      0, pixbuf, // Icon
-      1, description, // Description
-      2, c,      // Pointer
-      -1);
-
-  if (pixbuf != NULL)
-    g_object_unref(G_OBJECT(pixbuf));
-
-  sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view));
-  gtk_tree_selection_select_iter(GTK_TREE_SELECTION(sel), &iter);
-  toolbar_update_buttons();
+    gtk_list_store_set(tab->store, &iter,
+            0, pixbuf, // Icon
+            1, description, // Description
+            2, c,      // Pointer
+            -1);
+
+    if (pixbuf != NULL)
+        g_object_unref(G_OBJECT(pixbuf));
+
+    sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tab->view));
+    gtk_tree_selection_select_iter(GTK_TREE_SELECTION(sel), &iter);
+    toolbar_update_buttons();
 }
 
 void calltree_display (calltab_t *tab) {
@@ -541,7 +544,7 @@ void calltree_display (calltab_t *tab) {
     active_calltree = tab;
     gtk_widget_show (active_calltree->tree);
 
-	sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (active_calltree->view));
-	g_signal_emit_by_name(sel, "changed");
-	toolbar_update_buttons();
+    sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (active_calltree->view));
+    g_signal_emit_by_name(sel, "changed");
+    toolbar_update_buttons();
 }
diff --git a/sflphone-gtk/src/menus.c b/sflphone-gtk/src/menus.c
index b1fc049c81..386cf860f1 100644
--- a/sflphone-gtk/src/menus.c
+++ b/sflphone-gtk/src/menus.c
@@ -36,6 +36,9 @@ GtkWidget * copyMenu;
 GtkWidget * pasteMenu;
 GtkWidget * recordMenu;
 
+GtkWidget * editable_num;
+GtkDialog * edit_dialog;
+
 guint holdConnId;     //The hold_menu signal connection ID
 
 GtkWidget * dialpadMenu;
@@ -920,7 +923,7 @@ show_popup_menu_history(GtkWidget *my_widget, GdkEventButton *event)
       button, event_time);
 }
 
-static void edit_number_cb (gpointer user_data) {
+static void edit_number_cb (GtkWidget *widget, gpointer user_data) {
 
     show_edit_number ((call_t*)user_data);
 }
@@ -1025,38 +1028,68 @@ void add_registered_accounts_to_menu (GtkWidget *menu) {
 
 }
 
+static void ok_cb (GtkWidget *widget, gpointer userdata) {
+
+    gchar *new_number, *from;
+    call_t *modified_call, *original;
+
+    // Change the number of the selected call before calling
+    new_number = gtk_entry_get_text (GTK_WIDGET (editable_num));
+    original = (call_t*)userdata;
+    
+    //from = call_get_name (original);
+    from = g_strconcat("\"", call_get_name (original), "\" <", new_number, ">",NULL);
+    g_print ("name:%s \n", from);
+
+    create_new_call (g_strdup (new_number), from,  CALL_STATE_DIALING, g_strdup (original->accountID), &modified_call);
+
+    //modified_call->to = call_get_number (modified_call);
 
-static void change_number_cb (gpointer userdata) {
+    calllist_add(current_calls, modified_call);
+    calltree_add_call(current_calls, modified_call);
+    sflphone_place_call(modified_call);
+    calltree_display (current_calls);
 
-    gtk_widget_destroy (GTK_WIDGET (userdata));
+    gtk_widget_destroy (GTK_WIDGET (edit_dialog));
 }
 
+static void change_number_cb (GtkWidget *widget, gpointer userdata) {
+
+    gchar *new_number;
+    call_t *current_call;
+
+    }
+
 void show_edit_number (call_t *call) {
 
-    GtkDialog * dialog;
-    GtkWidget * num, *ok, *hbox;
+    GtkWidget *ok, *hbox;
     
-    dialog = GTK_DIALOG (gtk_dialog_new());
+    edit_dialog = GTK_DIALOG (gtk_dialog_new());
 
     // Set window properties
-    gtk_window_set_default_size(GTK_WINDOW(dialog), 200, 20);
-    gtk_window_set_title(GTK_WINDOW(dialog), _("Edit number"));
+    gtk_window_set_default_size(GTK_WINDOW(edit_dialog), 200, 20);
+    gtk_window_set_title(GTK_WINDOW(edit_dialog), _("Edit phone number"));
     
     hbox = gtk_hbox_new (FALSE, 0);
-    gtk_box_pack_start(GTK_BOX (dialog->vbox), hbox, TRUE, TRUE, 0);
+    gtk_box_pack_start(GTK_BOX (edit_dialog->vbox), hbox, TRUE, TRUE, 0);
+
+    // Set the number to be edited
+    editable_num = gtk_entry_new ();
+    if (call)  
+        gtk_entry_set_text(GTK_ENTRY(editable_num), g_strdup (call_get_number (call)));
+    else
+        g_print ("This a bug, the call should be defined. menus.c line 1051\n");
 
-    num = gtk_entry_new ();
-    gtk_entry_set_text(GTK_ENTRY(num), "00000000000");
-    gtk_box_pack_start(GTK_BOX (hbox), num, TRUE, TRUE, 0);
+    g_signal_connect(G_OBJECT (editable_num), "changed", G_CALLBACK (change_number_cb), call);
+    gtk_box_pack_start(GTK_BOX (hbox), editable_num, TRUE, TRUE, 0);
     
     ok = gtk_button_new_from_stock (GTK_STOCK_OK);
     gtk_box_pack_start(GTK_BOX (hbox), ok, TRUE, TRUE, 0);
-    g_signal_connect(G_OBJECT (ok), "clicked", G_CALLBACK (change_number_cb), dialog);
+    g_signal_connect(G_OBJECT (ok), "clicked", G_CALLBACK (ok_cb), call);
 
-    gtk_widget_show_all (dialog->vbox);
+    gtk_widget_show_all (edit_dialog->vbox);
 
-    gtk_dialog_run(dialog);
-    gtk_widget_destroy(GTK_WIDGET(dialog));
+    gtk_dialog_run(edit_dialog);
 
 }
 
-- 
GitLab