/* CcShell implementation */
static void
_shell_embed_widget_in_header (CcShell      *shell,
                               GtkWidget    *widget)
{
  GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (shell)->priv;
  GtkBox *box;

  /* add to header */
  box = GTK_BOX (W (priv->builder, "topright"));
  gtk_box_pack_end (box, widget, FALSE, FALSE, 0);
  g_ptr_array_add (priv->custom_widgets, g_object_ref (widget));
}
static void
gnome_control_center_dispose (GObject *object)
{
  GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (object)->priv;

  g_free (priv->current_panel_id);

  if (priv->custom_widgets)
    {
      g_ptr_array_unref (priv->custom_widgets);
      priv->custom_widgets = NULL;
    }
  if (priv->window)
    {
      gtk_widget_destroy (priv->window);
      priv->window = NULL;

      /* destroying the window will destroy its children */
      priv->notebook = NULL;
      priv->search_entry = NULL;
      priv->search_view = NULL;
    }

  if (priv->builder)
    {
      g_object_unref (priv->builder);
      priv->builder = NULL;
    }

  if (priv->store)
    {
      g_object_unref (priv->store);
      priv->store = NULL;
    }

  if (priv->search_filter)
    {
      g_object_unref (priv->search_filter);
      priv->search_filter = NULL;
    }


  G_OBJECT_CLASS (gnome_control_center_parent_class)->dispose (object);
}
static void
gnome_control_center_finalize (GObject *object)
{
  GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (object)->priv;

  if (priv->filter_string)
    {
      g_free (priv->filter_string);
      priv->filter_string = NULL;
    }

  if (priv->default_window_title)
    {
      g_free (priv->default_window_title);
      priv->default_window_title = NULL;
    }

  if (priv->default_window_icon)
    {
      g_free (priv->default_window_icon);
      priv->default_window_icon = NULL;
    }

  if (priv->menu_tree)
    {
      g_signal_handlers_disconnect_by_func (priv->menu_tree,
					    G_CALLBACK (on_menu_changed), object);
      g_object_unref (priv->menu_tree);
    }

  if (priv->category_views)
    {
      g_hash_table_destroy (priv->category_views);
    }

  G_OBJECT_CLASS (gnome_control_center_parent_class)->finalize (object);
}
/* CcShell implementation */
static gboolean
_shell_set_active_panel_from_id (CcShell      *shell,
                                 const gchar  *start_id,
				 const gchar **argv,
                                 GError      **err)
{
  GtkTreeIter iter;
  gboolean iter_valid;
  gchar *name = NULL;
  gchar *desktop = NULL;
  GIcon *gicon = NULL;
  GnomeControlCenterPrivate *priv = GNOME_CONTROL_CENTER (shell)->priv;
  GtkWidget *old_panel;

  /* clear any custom widgets */
  _shell_remove_all_custom_widgets (priv);

  iter_valid = gtk_tree_model_get_iter_first (GTK_TREE_MODEL (priv->store),
                                              &iter);

  /* find the details for this item */
  while (iter_valid)
    {
      gchar *id;

      gtk_tree_model_get (GTK_TREE_MODEL (priv->store), &iter,
                          COL_NAME, &name,
                          COL_DESKTOP_FILE, &desktop,
                          COL_GICON, &gicon,
                          COL_ID, &id,
                          -1);

      if (id && !strcmp (id, start_id))
        {
          g_free (id);
          break;
        }
      else
        {
          g_free (id);
          g_free (name);
          g_free (desktop);
	  if (gicon)
	    g_object_unref (gicon);

          name = NULL;
          id = NULL;
          desktop = NULL;
          gicon = NULL;
        }

      iter_valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (priv->store),
                                             &iter);
    }

  if (!name)
    {
      g_warning ("Could not find settings panel \"%s\"", start_id);
    }
  else if (activate_panel (GNOME_CONTROL_CENTER (shell), start_id, argv, desktop,
                           name, gicon) == FALSE)
    {
      old_panel = priv->current_panel;
      priv->current_panel = NULL;
      notebook_select_page (priv->notebook, priv->scrolled_window);
      if (old_panel)
        notebook_remove_page (priv->notebook, old_panel);
    }

  g_free (name);
  g_free (desktop);
  if (gicon)
    g_object_unref (gicon);

  return TRUE;
}
static GtkWidget *
_shell_get_toplevel (CcShell *shell)
{
  return GNOME_CONTROL_CENTER (shell)->priv->window;
}