static void
irc_network_dialog_destroy_cb (GtkWidget *widget,
    EmpathyIrcNetworkChooserDialog *self)
{
  EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self);
  EmpathyIrcNetwork *network;
  GtkTreeIter iter, filter_iter;

  priv->changed = TRUE;

  network = dup_selected_network (self, &iter);
  if (network == NULL)
    return;

  /* name could be changed */
  gtk_list_store_set (GTK_LIST_STORE (priv->store), &iter,
      COL_NETWORK_NAME, empathy_irc_network_get_name (network), -1);

  filter_iter = iter_to_filter_iter (self, &iter);
  scroll_to_iter (self, &filter_iter);

  gtk_widget_grab_focus (priv->treeview);

  g_object_unref (network);
}
static void
fill_store (EmpathyIrcNetworkChooserDialog *self)
{
  EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self);
  GSList *networks, *l;

  networks = empathy_irc_network_manager_get_networks (
      priv->network_manager);

  for (l = networks; l != NULL; l = g_slist_next (l))
    {
      EmpathyIrcNetwork *network = l->data;
      GtkTreeIter iter;

      gtk_list_store_insert_with_values (priv->store, &iter, -1,
          COL_NETWORK_OBJ, network,
          COL_NETWORK_NAME, empathy_irc_network_get_name (network),
          -1);

      if (network == priv->network)
        {
          GtkTreeIter filter_iter = iter_to_filter_iter (self, &iter);

          select_iter (self, &filter_iter, FALSE);
        }

      g_object_unref (network);
    }

  g_slist_free (networks);
}
static gchar *
dup_network_service (EmpathyIrcNetwork *network)
{
  /* Account.Service has to be a lower case alphanumeric string which may
   * also contain '-' but not start with it. */
#define VALID G_CSET_a_2_z G_CSET_DIGITS "-"
  gchar *service, *tmp;

  service = g_strdup (empathy_irc_network_get_name (network));
  service = g_strstrip (service);

  if (tp_str_empty (service))
    {
      g_free (service);
      return NULL;
    }

  tmp = service;
  service = g_ascii_strdown (service, -1);
  g_free (tmp);

  service = g_strcanon (service, VALID, '-');

  if (service[0] == '-')
    {
      tmp = service;
      service = g_strdup (service + 1);

      g_free (tmp);
    }

  return service;
}
static void
set_label (EmpathyIrcNetworkChooser *self)
{
  EmpathyIrcNetworkChooserPriv *priv = GET_PRIV (self);

  g_assert (priv->network != NULL);

  gtk_button_set_label (GTK_BUTTON (self),
      empathy_irc_network_get_name (priv->network));
}
static void
remove_network (EmpathyIrcNetworkChooserDialog *self)
{
  EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self);
  EmpathyIrcNetwork *network;
  GtkTreeIter iter;

  network = dup_selected_network (self, &iter);
  if (network == NULL)
    return;

  /* Hide the search after picking the network to get the right one */
  gtk_widget_hide (priv->search);

  DEBUG ("Remove network %s", empathy_irc_network_get_name (network));

  /* Delete network and select next network */
  if (gtk_list_store_remove (priv->store, &iter))
    {
      GtkTreeIter filter_iter = iter_to_filter_iter (self, &iter);

      select_iter (self, &filter_iter, TRUE);
    }
  else
    {
      /* this should only happen if the last network was deleted */
      GtkTreeIter last, filter_iter;
      gint n_elements;

      n_elements = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (priv->store),
          NULL);

      if (n_elements > 0)
        {
          gtk_tree_model_iter_nth_child (GTK_TREE_MODEL (priv->store), &last,
              NULL, (n_elements-1));
          filter_iter = iter_to_filter_iter (self, &last);

          select_iter (self, &filter_iter, TRUE);
        }
    }

  empathy_irc_network_manager_remove (priv->network_manager, network);
  gtk_widget_grab_focus (priv->treeview);

  g_object_unref (network);
}
static gboolean
filter_visible_func (GtkTreeModel *model,
    GtkTreeIter *iter,
    gpointer user_data)
{
  EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (user_data);
  EmpathyIrcNetwork *network;
  gboolean visible;

  gtk_tree_model_get (model, iter, COL_NETWORK_OBJ, &network, -1);

  visible = empathy_live_search_match (EMPATHY_LIVE_SEARCH (priv->search),
      empathy_irc_network_get_name (network));

  g_object_unref (network);
  return visible;
}
static void
add_network (EmpathyIrcNetworkChooserDialog *self)
{
  EmpathyIrcNetworkChooserDialogPriv *priv = GET_PRIV (self);
  EmpathyIrcNetwork *network;
  GtkTreeIter iter, filter_iter;

  gtk_widget_hide (priv->search);

  network = empathy_irc_network_new (_("New Network"));
  empathy_irc_network_manager_add (priv->network_manager, network);

  gtk_list_store_insert_with_values (priv->store, &iter, -1,
      COL_NETWORK_OBJ, network,
      COL_NETWORK_NAME, empathy_irc_network_get_name (network),
      -1);

  filter_iter = iter_to_filter_iter (self, &iter);
  select_iter (self, &filter_iter, TRUE);

  display_irc_network_dialog (self, network);

  g_object_unref (network);
}