[ekiga] Call Window: Move the URI toolbar to the dialpad.



commit b14596ef60bc67c1c5fe8a9d7e39a86b8f366836
Author: Damien Sandras <dsandras beip be>
Date:   Sun Jan 29 17:44:28 2012 +0100

    Call Window: Move the URI toolbar to the dialpad.
    
    It is the most logical place to put the URI toolbar if people do not use
    the roster.

 src/gui/call_window.cpp |  298 -----------------------------------------------
 src/gui/main_window.cpp |  215 ++++++++++++++++++++++++++++++----
 2 files changed, 191 insertions(+), 322 deletions(-)
---
diff --git a/src/gui/call_window.cpp b/src/gui/call_window.cpp
index df2c79a..fa43267 100644
--- a/src/gui/call_window.cpp
+++ b/src/gui/call_window.cpp
@@ -129,7 +129,6 @@ struct _EkigaCallWindowPrivate
   GtkTextTag *bandwidth_tag;
 
   GtkWidget *main_menu;
-  GtkWidget *main_toolbar;
   GtkWidget *call_panel_toolbar;
   GtkWidget *preview_button;
   GtkWidget *hold_button;
@@ -200,11 +199,6 @@ struct _EkigaCallWindowPrivate
    */
   bool changing_back_to_local_after_a_call;
 
-  GtkWidget *entry;
-  GtkListStore *completion;
-  GtkWidget *call_button;
-  gboolean ekiga_call_window_call_button_connected;
-
   GtkWidget *transfer_call_popup;
 
   std::vector<boost::signals::connection> connections;
@@ -224,9 +218,6 @@ enum {
   CHANNEL_LAST
 };
 
-static bool account_completion_helper (Ekiga::AccountPtr acc,
-                                       const gchar* text,
-                                       EkigaCallWindow* cw);
 
 static void zoom_in_changed_cb (GtkWidget *widget,
                                 gpointer data);
@@ -247,18 +238,9 @@ static void stay_on_top_changed_nt (gpointer id,
                                     GmConfEntry *entry,
                                     gpointer data);
 
-static void url_changed_cb (GtkEditable *e,
-                            gpointer data);
-
 static void toolbar_toggle_button_changed_cb (GtkWidget *widget,
                                               gpointer data);
 
-static void place_call_cb (GtkWidget * /*widget*/,
-                           gpointer data);
-
-static void toggle_call_cb (GtkWidget *widget,
-                            gpointer data);
-
 static void hangup_call_cb (GtkWidget * /*widget*/,
                             gpointer data);
 
@@ -458,31 +440,16 @@ static void ekiga_call_window_set_channel_pause (EkigaCallWindow *cw,
                                                  gboolean pause,
                                                  gboolean is_video);
 
-static void ekiga_call_window_set_call_url (EkigaCallWindow *cw,
-                                            const char *url);
-
-G_GNUC_UNUSED static void ekiga_call_window_append_call_url (EkigaCallWindow *cw,
-                                                             const char *url);
-
-static const std::string ekiga_call_window_get_call_url (EkigaCallWindow *cw);
-
 static void ekiga_call_window_init_menu (EkigaCallWindow *cw);
 
-static void ekiga_call_window_init_uri_toolbar (EkigaCallWindow *cw);
-
 static GtkWidget * gm_cw_audio_settings_window_new (EkigaCallWindow *cw);
 
 static GtkWidget *gm_cw_video_settings_window_new (EkigaCallWindow *cw);
 
-static GtkWidget* ekiga_call_window_call_button_new (EkigaCallWindow *cw);
-
 static void ekiga_call_window_update_logo (EkigaCallWindow *cw);
 
 static void ekiga_call_window_toggle_fullscreen (Ekiga::VideoOutputFSToggle toggle);
 
-static void ekiga_call_window_call_button_set_connected (EkigaCallWindow *cw,
-                                                         gboolean state);
-
 static void ekiga_call_window_zooms_menu_update_sensitivity (EkigaCallWindow *cw,
                                                              unsigned int zoom);
 
@@ -516,27 +483,6 @@ stay_on_top_changed_nt (G_GNUC_UNUSED gpointer id,
   }
 }
 
-static bool
-account_completion_helper (Ekiga::AccountPtr acc,
-			   const gchar* text,
-			   EkigaCallWindow* cw)
-{
-  Opal::AccountPtr account = boost::dynamic_pointer_cast<Opal::Account>(acc);
-  if (account && account->is_enabled ()) {
-
-    if (g_ascii_strncasecmp (text, "sip:", 4) == 0 && account->get_protocol_name () == "SIP") {
-
-      GtkTreeIter iter;
-      gchar* entry = NULL;
-
-      entry = g_strdup_printf ("%s %s", text, account->get_host ().c_str ());
-      gtk_list_store_append (cw->priv->completion, &iter);
-      gtk_list_store_set (cw->priv->completion, &iter, 0, entry, -1);
-      g_free (entry);
-    }
-  }
-  return true;
-}
 
 static void
 zoom_in_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
@@ -640,26 +586,6 @@ fullscreen_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
 }
 
 static void
-url_changed_cb (GtkEditable *e,
-		gpointer data)
-{
-  EkigaCallWindow *cw = EKIGA_CALL_WINDOW (data);
-  const char *tip_text = NULL;
-
-  tip_text = gtk_entry_get_text (GTK_ENTRY (e));
-
-  if (g_strrstr (tip_text, "@") == NULL) {
-    boost::shared_ptr<Opal::Bank> bank = cw->priv->core->get<Opal::Bank> ("opal-account-store");
-    if (bank) {
-      gtk_list_store_clear (cw->priv->completion);
-      bank->visit_accounts (boost::bind (&account_completion_helper, _1, tip_text, cw));
-    }
-  }
-
-  gtk_widget_set_tooltip_text (GTK_WIDGET (e), tip_text);
-}
-
-static void
 toolbar_toggle_button_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
 				  gpointer data)
 {
@@ -669,69 +595,6 @@ toolbar_toggle_button_changed_cb (G_GNUC_UNUSED GtkWidget *widget,
 }
 
 static void
-place_call_cb (GtkWidget * /*widget*/,
-               gpointer data)
-{
-  std::string uri;
-  EkigaCallWindow *cw = NULL;
-
-  g_return_if_fail (EKIGA_IS_CALL_WINDOW (data));
-
-  cw = EKIGA_CALL_WINDOW (data);
-
-  if (cw->priv->calling_state == Standby && !cw->priv->current_call) {
-
-    size_t pos;
-
-    // Check for empty uri
-    uri = ekiga_call_window_get_call_url (cw);
-    pos = uri.find (":");
-    if (pos != std::string::npos)
-      if (uri.substr (++pos).empty ())
-        return;
-
-    ekiga_call_window_update_calling_state (cw, Calling);
-    boost::shared_ptr<Ekiga::CallCore> call_core = cw->priv->core->get<Ekiga::CallCore> ("call-core");
-
-    // Remove appended spaces
-    pos = uri.find_first_of (' ');
-    if (pos != std::string::npos)
-      uri = uri.substr (0, pos);
-
-    // Dial
-    if (call_core->dial (uri)) {
-
-      // nothing special
-
-    } else {
-
-      //FIXME
-      gm_statusbar_flash_message (GM_STATUSBAR (cw->priv->statusbar), _("Could not connect to remote host"));
-      ekiga_call_window_update_calling_state (cw, Standby);
-    }
-  }
-  else if (cw->priv->calling_state == Called && cw->priv->current_call)
-    cw->priv->current_call->answer ();
-}
-
-// FIXME ??? Useless ?
-static void
-toggle_call_cb (GtkWidget *widget,
-                gpointer data)
-{
-  EkigaCallWindow *cw = EKIGA_CALL_WINDOW (data);
-
-  if (cw->priv->ekiga_call_window_call_button_connected)
-    hangup_call_cb (widget, data);
-  else {
-    if (!cw->priv->current_call)
-      place_call_cb (widget, data);
-    else
-      cw->priv->current_call->answer ();
-  }
-}
-
-static void
 hangup_call_cb (GtkWidget * /*widget*/,
                 gpointer data)
 {
@@ -1235,8 +1098,6 @@ on_established_call_cb (boost::shared_ptr<Ekiga::CallManager>  /*manager*/,
   info = g_strdup_printf (_("Connected with %s"),
 			  call->get_remote_party_name ().c_str ());
 
-  if (!call->get_remote_uri ().empty ())
-    ekiga_call_window_set_call_url (cw, call->get_remote_uri ().c_str());
   if (gm_conf_get_bool (VIDEO_DISPLAY_KEY "stay_on_top"))
     ekiga_call_window_set_stay_on_top (cw, TRUE);
   ekiga_call_window_set_status (cw, info);
@@ -1264,7 +1125,6 @@ on_cleared_call_cb (G_GNUC_UNUSED boost::shared_ptr<Ekiga::CallManager> manager,
     ekiga_call_window_set_stay_on_top (cw, FALSE);
   ekiga_call_window_update_calling_state (cw, Standby);
   ekiga_call_window_set_status (cw, _("Standby"));
-  ekiga_call_window_set_call_url (cw, "sip:");
   ekiga_call_window_set_call_duration (cw, NULL);
   ekiga_call_window_set_bandwidth (cw, 0.0, 0.0, 0.0, 0.0, 0, 0);
   ekiga_call_window_set_call_info (cw, NULL, NULL, NULL, NULL);
@@ -1470,9 +1330,6 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->hold_button), FALSE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), TRUE);
 
-      /* Update the connect button */
-      ekiga_call_window_call_button_set_connected (cw, FALSE);
-
       /* Destroy the transfer call popup */
       if (cw->priv->transfer_call_popup)
         gtk_dialog_response (GTK_DIALOG (cw->priv->transfer_call_popup),
@@ -1485,9 +1342,6 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
       /* Update the menus and toolbar items */
       gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", TRUE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), FALSE);
-
-      /* Update the connect button */
-      ekiga_call_window_call_button_set_connected (cw, TRUE);
       break;
 
 
@@ -1498,9 +1352,6 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
       gtk_menu_section_set_sensitive (cw->priv->main_menu, "hold_call", TRUE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->hold_button), TRUE);
       gtk_widget_set_sensitive (GTK_WIDGET (cw->priv->preview_button), FALSE);
-
-      /* Update the connect button */
-      ekiga_call_window_call_button_set_connected (cw, TRUE);
       break;
 
 
@@ -1508,9 +1359,6 @@ ekiga_call_window_update_calling_state (EkigaCallWindow *cw,
 
       /* Update the menus and toolbar items */
       gtk_menu_set_sensitive (cw->priv->main_menu, "disconnect", TRUE);
-
-      /* Update the connect button */
-      ekiga_call_window_call_button_set_connected (cw, TRUE);
       break;
 
     default:
@@ -1832,53 +1680,6 @@ ekiga_call_window_set_channel_pause (EkigaCallWindow *cw,
     gtk_label_set_text_with_mnemonic (GTK_LABEL (child), msg);
 }
 
-static void
-ekiga_call_window_set_call_url (EkigaCallWindow *cw,
-				const char *url)
-{
-  g_return_if_fail (cw != NULL && url != NULL);
-
-  gtk_entry_set_text (GTK_ENTRY (cw->priv->entry), url);
-  gtk_editable_set_position (GTK_EDITABLE (cw->priv->entry), -1);
-  gtk_widget_grab_focus (GTK_WIDGET (cw->priv->entry));
-  gtk_editable_select_region (GTK_EDITABLE (cw->priv->entry), -1, -1);
-}
-
-static void
-ekiga_call_window_append_call_url (EkigaCallWindow *cw,
-				   const char *url)
-{
-  int pos = -1;
-  GtkEditable *entry;
-
-  g_return_if_fail (EKIGA_IS_CALL_WINDOW (cw));
-  g_return_if_fail (url != NULL);
-
-  entry = GTK_EDITABLE (cw->priv->entry);
-
-  if (gtk_editable_get_selection_bounds (entry, NULL, NULL))
-    gtk_editable_delete_selection (entry);
-
-  pos = gtk_editable_get_position (entry);
-  gtk_editable_insert_text (entry, url, strlen (url), &pos);
-  gtk_editable_select_region (entry, -1, -1);
-  gtk_editable_set_position (entry, pos);
-}
-
-
-static const std::string
-ekiga_call_window_get_call_url (EkigaCallWindow *cw)
-{
-  g_return_val_if_fail (EKIGA_IS_CALL_WINDOW (cw), NULL);
-
-  const gchar* entry_text = gtk_entry_get_text (GTK_ENTRY (cw->priv->entry));
-
-  if (entry_text != NULL)
-    return entry_text;
-  else
-    return "";
-}
-
 static GtkWidget *
 gm_cw_video_settings_window_new (EkigaCallWindow *cw)
 {
@@ -2219,86 +2020,6 @@ ekiga_call_window_init_menu (EkigaCallWindow *cw)
 }
 
 static void
-ekiga_call_window_init_uri_toolbar (EkigaCallWindow *cw)
-{
-  GtkToolItem *item = NULL;
-  GtkEntryCompletion *completion = NULL;
-
-  g_return_if_fail (EKIGA_IS_CALL_WINDOW (cw));
-
-  /* The call horizontal toolbar */
-  cw->priv->main_toolbar = gtk_toolbar_new ();
-  gtk_toolbar_set_style (GTK_TOOLBAR (cw->priv->main_toolbar), GTK_TOOLBAR_ICONS);
-  gtk_toolbar_set_show_arrow (GTK_TOOLBAR (cw->priv->main_toolbar), FALSE);
-
-  /* URL bar */
-  /* Entry */
-  item = gtk_tool_item_new ();
-  cw->priv->entry = gtk_entry_new ();
-  cw->priv->completion = gtk_list_store_new (1, G_TYPE_STRING);
-  completion = gtk_entry_completion_new ();
-  gtk_entry_completion_set_model (GTK_ENTRY_COMPLETION (completion), GTK_TREE_MODEL (cw->priv->completion));
-  gtk_entry_set_completion (GTK_ENTRY (cw->priv->entry), completion);
-  gtk_entry_completion_set_inline_completion (GTK_ENTRY_COMPLETION (completion), false);
-  gtk_entry_completion_set_popup_completion (GTK_ENTRY_COMPLETION (completion), true);
-  gtk_entry_completion_set_text_column (GTK_ENTRY_COMPLETION (completion), 0);
-
-  gtk_container_add (GTK_CONTAINER (item), cw->priv->entry);
-  gtk_container_set_border_width (GTK_CONTAINER (item), 0);
-  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), true);
-
-  ekiga_call_window_set_call_url (cw, "sip:");
-
-  // activate Ctrl-L to get the entry focus
-  gtk_widget_add_accelerator (cw->priv->entry, "grab-focus",
-			      cw->priv->accel, GDK_L,
-			      (GdkModifierType) GDK_CONTROL_MASK,
-			      (GtkAccelFlags) 0);
-
-  gtk_editable_set_position (GTK_EDITABLE (cw->priv->entry), -1);
-
-  g_signal_connect (cw->priv->entry, "changed",
-		    G_CALLBACK (url_changed_cb), cw);
-  g_signal_connect (cw->priv->entry, "activate",
-		    G_CALLBACK (place_call_cb), cw);
-
-  gtk_toolbar_insert (GTK_TOOLBAR (cw->priv->main_toolbar), item, 0);
-
-  /* The connect button */
-  item = gtk_tool_item_new ();
-  cw->priv->call_button = ekiga_call_window_call_button_new (cw);
-  gtk_container_add (GTK_CONTAINER (item), cw->priv->call_button);
-  gtk_container_set_border_width (GTK_CONTAINER (cw->priv->call_button), 0);
-  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), FALSE);
-
-  gtk_widget_set_tooltip_text (GTK_WIDGET (cw->priv->call_button),
-			       _("Enter a URI on the left, and click this button to place a call or to hangup"));
-
-  gtk_toolbar_insert (GTK_TOOLBAR (cw->priv->main_toolbar), item, -1);
-
-  g_signal_connect (cw->priv->call_button, "clicked",
-                    G_CALLBACK (toggle_call_cb),
-                    cw);
-
-  gtk_widget_show_all (GTK_WIDGET (cw->priv->main_toolbar));
-}
-
-static GtkWidget*
-ekiga_call_window_call_button_new (EkigaCallWindow *cw)
-{
-  GtkButton *button;
-  GtkWidget* image;
-
-  button = (GtkButton*) gtk_button_new ();
-  image = gtk_image_new_from_stock (GM_STOCK_PHONE_PICK_UP_24, GTK_ICON_SIZE_LARGE_TOOLBAR);
-  gtk_button_set_image (button, image);
-  gtk_button_set_relief (button, GTK_RELIEF_NONE);
-  cw->priv->ekiga_call_window_call_button_connected = FALSE;
-
-  return GTK_WIDGET (button);
-}
-
-static void
 ekiga_call_window_update_logo (EkigaCallWindow *cw)
 {
   g_return_if_fail (EKIGA_IS_CALL_WINDOW (cw));
@@ -2384,18 +2105,6 @@ ekiga_call_window_channels_menu_update_sensitivity (EkigaCallWindow *cw,
   }
 }
 
-static void
-ekiga_call_window_call_button_set_connected (EkigaCallWindow *cw,
-                                             gboolean state)
-{
-  GtkWidget* image;
-
-  cw->priv->ekiga_call_window_call_button_connected = state;
-  image = gtk_button_get_image (GTK_BUTTON (cw->priv->call_button));
-  gtk_image_set_from_stock (GTK_IMAGE (image), state ? GM_STOCK_PHONE_HANG_UP_24 : GM_STOCK_PHONE_PICK_UP_24,
-                            GTK_ICON_SIZE_LARGE_TOOLBAR);
-}
-
 static gboolean
 ekiga_call_window_transfer_dialog_run (EkigaCallWindow *cw,
 				       GtkWidget *parent_window,
@@ -2731,13 +2440,6 @@ ekiga_call_window_init_gui (EkigaCallWindow *cw)
 		    G_CALLBACK (hold_current_call_cb), cw);
   gtk_widget_realize (cw->priv->main_video_image);
 
-  /* The URI toolbar */
-  ekiga_call_window_init_uri_toolbar (cw);
-  alignment = gtk_alignment_new (0.0, 0.0, 1.0, 0.0);
-  gtk_container_add (GTK_CONTAINER (alignment), cw->priv->main_toolbar);
-  gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (alignment), FALSE, FALSE, 0);
-  gtk_widget_show_all (frame);
-
   /* The statusbar */
   cw->priv->statusbar = gm_statusbar_new ();
   gtk_statusbar_set_has_resize_grip (GTK_STATUSBAR (cw->priv->statusbar), TRUE);
diff --git a/src/gui/main_window.cpp b/src/gui/main_window.cpp
index ae62e2b..346a22c 100644
--- a/src/gui/main_window.cpp
+++ b/src/gui/main_window.cpp
@@ -122,6 +122,11 @@ struct _EkigaMainWindowPrivate
   GtkWidget *main_notebook;
   GtkWidget *hpaned;
 
+  /* Dialpad uri toolbar */
+  GtkWidget *uri_toolbar;
+  GtkWidget *entry;
+  GtkListStore *completion;
+
   /* notebook pages
    *  (we store the numbers so we know where we are)
    */
@@ -201,18 +206,19 @@ private:
 static void on_some_core_updated (EkigaMainWindow* self);
 
 /* GUI Functions */
+static bool account_completion_helper_cb (Ekiga::AccountPtr acc,
+                                          const gchar* text,
+                                          EkigaMainWindow* mw);
+
+static void place_call_cb (GtkWidget * /*widget*/,
+                           gpointer data);
+
+static void url_changed_cb (GtkEditable *e,
+                            gpointer data);
 
-/* DESCRIPTION  : /
- * BEHAVIOR     : Shows a window
- * PRE          : The given data pointer should be a GMWindow (Gobject based)
- */
 static void show_window_cb (GtkWidget *widget,
 			    gpointer data);
 
-/* DESCRIPTION  : /
- * BEHAVIOR     : Shows a window
- * PRE          : The given data pointer should be a GMWindow (non Gobject)
- */
 static void show_gm_window_cb (GtkWidget *widget,
                                gpointer data);
 
@@ -220,6 +226,8 @@ static void show_gm_window_cb (GtkWidget *widget,
 static void ekiga_main_window_incoming_call_dialog_show (EkigaMainWindow *mw,
                                                       boost::shared_ptr<Ekiga::Call>  call);
 
+static const std::string ekiga_main_window_get_call_url (EkigaMainWindow *mw);
+
 #ifdef HAVE_NOTIFY
 static void ekiga_main_window_incoming_call_notify (EkigaMainWindow *mw,
                                                     boost::shared_ptr<Ekiga::Call>  call);
@@ -319,6 +327,7 @@ static gboolean statusbar_clicked_cb (GtkWidget *,
 				      GdkEventButton *,
 				      gpointer);
 
+static void ekiga_main_window_init_uri_toolbar (EkigaMainWindow *mw);
 
 static void ekiga_main_window_add_device_dialog_show (EkigaMainWindow *main_window,
                                                       const Ekiga::Device & device,
@@ -485,8 +494,87 @@ name_from_uri_helper::on_visit_presentities (Ekiga::PresentityPtr presentity,
 }
 
 /*
- * Engine Callbacks
+ * Callbacks
  */
+static bool
+account_completion_helper_cb (Ekiga::AccountPtr acc,
+                              const gchar* text,
+                              EkigaMainWindow* mw)
+{
+  Opal::AccountPtr account = boost::dynamic_pointer_cast<Opal::Account>(acc);
+  if (account && account->is_enabled ()) {
+
+    if (g_ascii_strncasecmp (text, "sip:", 4) == 0 && account->get_protocol_name () == "SIP") {
+
+      GtkTreeIter iter;
+      gchar* entry = NULL;
+
+      entry = g_strdup_printf ("%s %s", text, account->get_host ().c_str ());
+      gtk_list_store_append (mw->priv->completion, &iter);
+      gtk_list_store_set (mw->priv->completion, &iter, 0, entry, -1);
+      g_free (entry);
+    }
+  }
+  return true;
+}
+
+static void
+place_call_cb (GtkWidget * /*widget*/,
+               gpointer data)
+{
+  std::string uri;
+  EkigaMainWindow *mw = NULL;
+
+  g_return_if_fail (EKIGA_IS_MAIN_WINDOW (data));
+
+  mw = EKIGA_MAIN_WINDOW (data);
+
+  if (mw->priv->calling_state == Standby) {
+
+    size_t pos;
+
+    // Check for empty uri
+    uri = ekiga_main_window_get_call_url (mw);
+    pos = uri.find (":");
+    if (pos != std::string::npos)
+      if (uri.substr (++pos).empty ())
+        return;
+
+    boost::shared_ptr<Ekiga::CallCore> call_core = mw->priv->core->get<Ekiga::CallCore> ("call-core");
+
+    // Remove appended spaces
+    pos = uri.find_first_of (' ');
+    if (pos != std::string::npos)
+      uri = uri.substr (0, pos);
+
+    // Dial
+    if (!call_core->dial (uri)) {
+
+      gm_statusbar_flash_message (GM_STATUSBAR (mw->priv->statusbar), _("Could not connect to remote host"));
+    }
+  }
+}
+
+static void
+url_changed_cb (GtkEditable *e,
+		gpointer data)
+{
+  EkigaMainWindow *mw = EKIGA_MAIN_WINDOW (data);
+  const char *tip_text = NULL;
+
+  tip_text = gtk_entry_get_text (GTK_ENTRY (e));
+
+  if (g_strrstr (tip_text, "@") == NULL) {
+    boost::shared_ptr<Opal::Bank> bank = mw->priv->core->get<Opal::Bank> ("opal-account-store");
+    if (bank) {
+      gtk_list_store_clear (mw->priv->completion);
+      bank->visit_accounts (boost::bind (&account_completion_helper_cb, _1, tip_text, mw));
+    }
+  }
+
+  gtk_widget_set_tooltip_text (GTK_WIDGET (e), tip_text);
+}
+
 static void
 show_window_cb (G_GNUC_UNUSED GtkWidget *widget,
 		gpointer data)
@@ -1196,9 +1284,8 @@ notify_action_cb (NotifyNotification *notification,
   }
 }
 
-
 static void
-closed_cb (NotifyNotification* /*notify*/, 
+closed_cb (NotifyNotification* /*notify*/,
            gpointer main_window)
 {
   EkigaMainWindow *mw;
@@ -1208,10 +1295,23 @@ closed_cb (NotifyNotification* /*notify*/,
   mw = EKIGA_MAIN_WINDOW (main_window);
 
   boost::shared_ptr<Ekiga::AudioOutputCore> audiooutput_core = mw->priv->core->get<Ekiga::AudioOutputCore> ("audiooutput-core");
-  if (audiooutput_core) 
+  if (audiooutput_core)
     audiooutput_core->stop_play_event ("incoming_call_sound");
 }
 
+static const std::string
+ekiga_main_window_get_call_url (EkigaMainWindow *mw)
+{
+  g_return_val_if_fail (EKIGA_IS_MAIN_WINDOW (mw), NULL);
+
+  const gchar* entry_text = gtk_entry_get_text (GTK_ENTRY (mw->priv->entry));
+
+  if (entry_text != NULL)
+    return entry_text;
+  else
+    return "";
+}
+
 static void
 ekiga_main_window_incoming_call_notify (EkigaMainWindow *mw,
                                         boost::shared_ptr<Ekiga::Call>  call)
@@ -1328,7 +1428,7 @@ ekiga_main_window_add_device_dialog_show (EkigaMainWindow *mw,
   gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 2);
   gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.0);
   gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
-  
+
   msg  = "<b>" + device.GetString() + "</b>";
   label = gtk_label_new (NULL);
   gtk_label_set_markup (GTK_LABEL (label), msg.c_str());
@@ -1352,30 +1452,91 @@ ekiga_main_window_add_device_dialog_show (EkigaMainWindow *mw,
 
   gtk_widget_show_all (add_device_popup);
 
-
-//  g_signal_connect (add_device_popup, "delete_event",
-//                    G_CALLBACK (gtk_widget_hide_on_delete), NULL);
-//  g_signal_connect (add_device_popup, "response",
-//                    G_CALLBACK (add_device_response_cb), &device);
-
   deviceStruct* device_struct = g_new(deviceStruct, 1);
   snprintf (device_struct->name, sizeof (device_struct->name), "%s", (device.GetString()).c_str());
   device_struct->deviceType = device_type;
 
   g_signal_connect_data (add_device_popup, "delete_event",
-                         G_CALLBACK (gtk_widget_hide_on_delete), 
+                         G_CALLBACK (gtk_widget_hide_on_delete),
                          (gpointer) device_struct,
                          (GClosureNotify) g_free,
                          (GConnectFlags) 0);
 
   g_signal_connect_data (add_device_popup, "response",
-                         G_CALLBACK (add_device_response_cb), 
+                         G_CALLBACK (add_device_response_cb),
                          (gpointer) device_struct,
                          (GClosureNotify) g_free,
                          (GConnectFlags) 0);
 }
 
 static void
+ekiga_main_window_init_uri_toolbar (EkigaMainWindow *mw)
+{
+  GtkWidget *call_button = NULL;
+  GtkWidget *image = NULL;
+  GtkToolItem *item = NULL;
+  GtkEntryCompletion *completion = NULL;
+
+  g_return_if_fail (EKIGA_IS_MAIN_WINDOW (mw));
+
+  /* The call horizontal toolbar */
+  mw->priv->uri_toolbar = gtk_toolbar_new ();
+  gtk_toolbar_set_style (GTK_TOOLBAR (mw->priv->uri_toolbar), GTK_TOOLBAR_ICONS);
+  gtk_toolbar_set_show_arrow (GTK_TOOLBAR (mw->priv->uri_toolbar), FALSE);
+
+  /* URL bar */
+  /* Entry */
+  item = gtk_tool_item_new ();
+  mw->priv->entry = gtk_entry_new ();
+  mw->priv->completion = gtk_list_store_new (1, G_TYPE_STRING);
+  completion = gtk_entry_completion_new ();
+  gtk_entry_completion_set_model (GTK_ENTRY_COMPLETION (completion), GTK_TREE_MODEL (mw->priv->completion));
+  gtk_entry_set_completion (GTK_ENTRY (mw->priv->entry), completion);
+  gtk_entry_set_text (GTK_ENTRY (mw->priv->entry), "sip:");
+  gtk_entry_completion_set_inline_completion (GTK_ENTRY_COMPLETION (completion), false);
+  gtk_entry_completion_set_popup_completion (GTK_ENTRY_COMPLETION (completion), true);
+  gtk_entry_completion_set_text_column (GTK_ENTRY_COMPLETION (completion), 0);
+
+  gtk_container_add (GTK_CONTAINER (item), mw->priv->entry);
+  gtk_container_set_border_width (GTK_CONTAINER (item), 0);
+  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), true);
+
+  // activate Ctrl-L to get the entry focus
+  gtk_widget_add_accelerator (mw->priv->entry, "grab-focus",
+			      mw->priv->accel, GDK_L,
+			      (GdkModifierType) GDK_CONTROL_MASK,
+			      (GtkAccelFlags) 0);
+
+  gtk_editable_set_position (GTK_EDITABLE (mw->priv->entry), -1);
+
+  g_signal_connect (mw->priv->entry, "changed",
+		    G_CALLBACK (url_changed_cb), mw);
+  g_signal_connect (mw->priv->entry, "activate",
+		    G_CALLBACK (place_call_cb), mw);
+
+  gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->uri_toolbar), item, 0);
+
+  /* The call button */
+  item = gtk_tool_item_new ();
+  call_button = gtk_button_new ();
+  image = gtk_image_new_from_stock (GM_STOCK_PHONE_PICK_UP_24, GTK_ICON_SIZE_LARGE_TOOLBAR);
+  gtk_button_set_image (GTK_BUTTON (call_button), image);
+  gtk_button_set_relief (GTK_BUTTON (call_button), GTK_RELIEF_NONE);
+  gtk_container_add (GTK_CONTAINER (item), call_button);
+  gtk_container_set_border_width (GTK_CONTAINER (call_button), 0);
+  gtk_tool_item_set_expand (GTK_TOOL_ITEM (item), FALSE);
+
+  gtk_widget_set_tooltip_text (GTK_WIDGET (call_button),
+			       _("Enter a URI on the left, and click this button to place a call or to hangup"));
+
+  gtk_toolbar_insert (GTK_TOOLBAR (mw->priv->uri_toolbar), item, -1);
+
+  g_signal_connect (call_button, "clicked",
+                    G_CALLBACK (place_call_cb),
+                    mw);
+}
+
+static void
 ekiga_main_window_init_menu (EkigaMainWindow *mw)
 {
   GtkWidget *addressbook_window = NULL;
@@ -1566,22 +1727,28 @@ ekiga_main_window_init_contact_list (EkigaMainWindow *mw)
 }
 
 
-static void 
+static void
 ekiga_main_window_init_dialpad (EkigaMainWindow *mw)
 {
   GtkWidget *dialpad = NULL;
   GtkWidget *alignment = NULL;
   GtkWidget *label = NULL;
+  GtkWidget *vbox = NULL;
 
+  vbox = gtk_vbox_new (false, 0);
   dialpad = ekiga_dialpad_new (mw->priv->accel);
   g_signal_connect (dialpad, "button-clicked",
                     G_CALLBACK (dialpad_button_clicked_cb), mw);
 
   alignment = gtk_alignment_new (0.5, 0.5, 0.2, 0.2);
   gtk_container_add (GTK_CONTAINER (alignment), dialpad);
+  gtk_box_pack_start (GTK_BOX (vbox), alignment, true, true, 0);
+
+  ekiga_main_window_init_uri_toolbar (mw);
+  gtk_box_pack_start (GTK_BOX (vbox), mw->priv->uri_toolbar, false, false, 0);
 
   label = gtk_label_new (_("Dialpad"));
-  mw->priv->dialpad_page_number = gtk_notebook_append_page (GTK_NOTEBOOK (mw->priv->main_notebook), alignment, label);
+  mw->priv->dialpad_page_number = gtk_notebook_append_page (GTK_NOTEBOOK (mw->priv->main_notebook), vbox, label);
 
   g_signal_connect (mw, "key-press-event",
                     G_CALLBACK (key_press_event_cb), mw);
@@ -1595,7 +1762,7 @@ ekiga_main_window_init_history (EkigaMainWindow *mw)
 
   boost::shared_ptr<History::Source> history_source = mw->priv->core->get<History::Source> ("call-history-store");
   boost::shared_ptr<History::Book> history_book = history_source->get_book ();
-  
+
   mw->priv->call_history_view = call_history_view_gtk_new (history_book);
 
   label = gtk_label_new (_("Call history"));



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]