The "In Use" view shows symbols which are instantiated in open
schematics, for ease of adding more symbols similar to the ones
already present.  This is particularly useful for frequently-used
symbols such as resistors and capacitors.
---
 gschem/include/x_compselect.h |    3 +-
 gschem/src/x_compselect.c     |  518 +++++++++++++++++++++++++++--------------
 2 files changed, 340 insertions(+), 181 deletions(-)

diff --git a/gschem/include/x_compselect.h b/gschem/include/x_compselect.h
index 18d718f..d6d4dc1 100644
--- a/gschem/include/x_compselect.h
+++ b/gschem/include/x_compselect.h
@@ -61,7 +61,8 @@ struct _CompselectClass {
 struct _Compselect {
   GschemDialog parent_instance;
 
-  GtkTreeView *treeview;
+  GtkTreeView *libtreeview, *inusetreeview;
+  GtkNotebook *viewtabs;
   Preview     *preview;
   GtkEntry    *entry_filter;
   GtkButton   *button_clear;
diff --git a/gschem/src/x_compselect.c b/gschem/src/x_compselect.c
index 351326d..cee47e8 100644
--- a/gschem/src/x_compselect.c
+++ b/gschem/src/x_compselect.c
@@ -87,7 +87,7 @@ x_compselect_callback_response (GtkDialog *dialog,
 
   switch (arg1) {
       case GTK_RESPONSE_APPLY: {
-       CLibSymbol *symbol;
+       CLibSymbol *symbol = NULL;
         CompselectBehavior behavior;
         
         g_object_get (compselect,
@@ -244,28 +244,54 @@ static void compselect_get_property (GObject *object,
                                      GParamSpec *pspec);
 
 
-/*! \brief Sets data for a particular cell of the treeview.
+
+/*! \brief Sets data for a particular cell of the in use treeview.
+ *  \par Function Description
+ *  This function determines what data is to be displayed in the
+ *  "in use" symbol selection view.
+ *
+ *  The model is a list of symbols. s_clib_symbol_get_name() is called
+ *  to get the text to display.
+ */
+static void
+inuse_treeview_set_cell_data (GtkTreeViewColumn *tree_column,
+                            GtkCellRenderer   *cell,
+                            GtkTreeModel      *tree_model,
+                            GtkTreeIter       *iter,
+                            gpointer           data)
+{
+  GValue value = { 0, };
+  GValue strvalue = { 0, };
+  CLibSymbol *symbol;
+  
+  gtk_tree_model_get_value (tree_model, iter, 0, &value);
+
+  g_value_init (&strvalue, G_TYPE_STRING);
+
+  symbol = (CLibSymbol *) g_value_get_pointer (&value);
+  g_value_set_string (&strvalue, s_clib_symbol_get_name (symbol));
+  
+  g_object_set_property ((GObject*)cell, "text", &strvalue);
+
+  g_value_unset (&value);
+  g_value_unset (&strvalue);
+}
+
+/*! \brief Sets data for a particular cell of the library treeview.
  *  \par Function Description
  *  This function determines what data is to be displayed in the
- *  component column of the selection tree.
+ *  selection selection view.
  *
  *  The top level of the model contains sources, and the next symbols.
  *  s_clib_source_get_name() or s_clib_symbol_get_name() as
  *  appropriate is called to get the text to display.
- *
- *  \param [in] tree_column The GtkTreeColumn.
- *  \param [in] cell        The GtkCellRenderer that is being rendered
- *                          by tree_column.
- *  \param [in] tree_model  The tree model for components.
- *  \param [in] iter        An iterator on the current row to render.
- *  \param [in] data        Unused user data.
  */
 static void
-compselect_treeview_set_cell_data (GtkTreeViewColumn *tree_column,
-                                   GtkCellRenderer   *cell,
-                                   GtkTreeModel      *tree_model,
-                                   GtkTreeIter       *iter,
-                                   gpointer           data)
+lib_treeview_set_cell_data (GtkTreeViewColumn *tree_column,
+                            GtkCellRenderer   *cell,
+                            GtkTreeModel      *tree_model,
+                            GtkTreeIter       *iter,
+                            gpointer           data)
 {
   GtkTreeIter parent;
   GValue value = { 0, };
@@ -303,7 +329,7 @@ compselect_treeview_set_cell_data (GtkTreeViewColumn 
*tree_column,
  *  \returns TRUE if item should be visible, FALSE otherwise.
  */
 static gboolean
-compselect_model_filter_visible_func (GtkTreeModel *model,
+lib_model_filter_visible_func (GtkTreeModel *model,
                                       GtkTreeIter  *iter,
                                       gpointer      data)
 {
@@ -329,7 +355,7 @@ compselect_model_filter_visible_func (GtkTreeModel *model,
     gtk_tree_model_iter_children (model, &iter2, iter);
     ret = FALSE;
     do {
-      if (compselect_model_filter_visible_func (model, &iter2, data)) {
+      if (lib_model_filter_visible_func (model, &iter2, data)) {
         ret = TRUE;
         break;
       }
@@ -371,6 +397,7 @@ static void
 compselect_callback_tree_selection_changed (GtkTreeSelection *selection,
                                             gpointer          user_data)
 {
+  GtkTreeView *view;
   GtkTreeModel *model;
   GtkTreeIter iter, parent;
   Compselect *compselect = (Compselect*)user_data;
@@ -380,17 +407,25 @@ compselect_callback_tree_selection_changed 
(GtkTreeSelection *selection,
   if (!gtk_tree_selection_get_selected (selection, &model, &iter)) {
     return;
   }
-
-  if (!gtk_tree_model_iter_parent (model, &parent, &iter)) {
-    /* selected element is not a leaf -> not a component name */
-    return;
+  
+  view = gtk_tree_selection_get_tree_view (selection);
+  
+  if (view == compselect->inusetreeview) {
+    /* No special handling at the moment */
+  } else if (view == compselect->libtreeview) {
+    if (!gtk_tree_model_iter_parent (model, &parent, &iter)) {
+      /* selected element is not a leaf -> not a component name */
+      return;
+    }
+  } else {
+    /* Something's gone wrong */
+   g_assert_not_reached();
   }
   
-  /* build full path to component looking at parents */
   gtk_tree_model_get (model, &iter, 0, &sym, -1);
   filename = s_clib_symbol_get_filename(sym);
-
-  /* update the treeview with new filename */
+ 
+  /* update the preview with new filename */
   g_object_set (compselect->preview,
                 "filename", filename,
                 NULL);
@@ -425,7 +460,7 @@ compselect_filter_timeout (gpointer data)
   /* resets the source id in compselect */
   compselect->filter_timeout = 0;
   
-  model = gtk_tree_view_get_model (compselect->treeview);
+  model = gtk_tree_view_get_model (compselect->libtreeview);
 
   if (model != NULL) {
     gtk_tree_model_filter_refilter ((GtkTreeModelFilter*)model);
@@ -521,7 +556,34 @@ compselect_callback_behavior_changed (GtkOptionMenu 
*optionmenu,
 }
 
 static GtkTreeModel*
-compselect_create_child_model (void)
+create_inuse_tree_model (void)
+{
+  GtkListStore *store;
+  GList *symhead, *symlist;
+  GtkTreeIter iter;
+
+  store = (GtkListStore *) gtk_list_store_new (1, G_TYPE_POINTER);
+
+  symhead = s_toplevel_get_symbol_names (global_window_current);
+
+  for (symlist = symhead;
+       symlist != NULL;
+       symlist = g_list_next (symlist)) {
+
+    gtk_list_store_append (store, &iter);
+
+    gtk_list_store_set (store, &iter,
+                        0, symlist->data,
+                        -1);
+  }
+
+  g_list_free (symlist);
+
+  return (GtkTreeModel*)store;
+}
+
+static GtkTreeModel*
+create_lib_tree_model (void)
 {
   GtkTreeStore *store;
   GList *srchead, *srclist;
@@ -560,130 +622,78 @@ compselect_create_child_model (void)
   return (GtkTreeModel*)store;
 }
 
-/*! \brief Create the combo box for behaviors.
- *  \par Function Description
- *  This function creates and returns a <B>GtkComboBox</B> for
- *  selecting the behavior when a component is added to the sheet.
- */
 static GtkWidget*
-compselect_create_behaviors_combo_box (void)
+create_inuse_treeview (Compselect *compselect)
 {
-  GtkWidget *combobox;
+  GtkWidget *scrolled_win, *treeview;
+  GtkTreeModel *model;
+  GtkTreeSelection *selection;
+  GtkCellRenderer *renderer;
+  GtkTreeViewColumn *column;
 
-  combobox = gtk_combo_box_new_text ();
+  model = create_inuse_tree_model ();
 
-  /* Note: order of items in menu is important */
-  /* COMPSEL_BEHAVIOR_REFERENCE */
-  gtk_combo_box_append_text (GTK_COMBO_BOX (combobox),
-                             _("Default behavior - reference component"));
-  /* COMPSEL_BEHAVIOR_EMBED */
-  gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), 
-                             _("Embed component in schematic"));
-  /* COMPSEL_BEHAVIOR_INCLUDE */
-  gtk_combo_box_append_text (GTK_COMBO_BOX (combobox),
-                             _("Include component as individual objects"));
+  /* Create a scrolled window to accomodate the treeview */
+  scrolled_win = GTK_WIDGET (
+    g_object_new (GTK_TYPE_SCROLLED_WINDOW,
+                  /* GtkScrolledWindow */
+                  "hscrollbar-policy", GTK_POLICY_AUTOMATIC,
+                  "vscrollbar-policy", GTK_POLICY_ALWAYS,
+                  "shadow-type",       GTK_SHADOW_ETCHED_IN,
+                  NULL));
 
-  gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
-  
-  return combobox;
-}
+  /* Create the treeview */
+  treeview = GTK_WIDGET (g_object_new (GTK_TYPE_TREE_VIEW,
+                                       /* GtkTreeView */
+                                       "model",      model,
+                                       "rules-hint", TRUE,
+                                       "headers-visible", FALSE,
+                                       NULL));
 
-GType
-compselect_get_type ()
-{
-  static GType compselect_type = 0;
-  
-  if (!compselect_type) {
-    static const GTypeInfo compselect_info = {
-      sizeof(CompselectClass),
-      NULL, /* base_init */
-      NULL, /* base_finalize */
-      (GClassInitFunc) compselect_class_init,
-      NULL, /* class_finalize */
-      NULL, /* class_data */
-      sizeof(Compselect),
-      0,    /* n_preallocs */
-      (GInstanceInitFunc) compselect_init,
-    };
-                
-    compselect_type = g_type_register_static (GSCHEM_TYPE_DIALOG,
-                                              "Compselect",
-                                              &compselect_info, 0);
-  }
-  
-  return compselect_type;
-}
+  /* Connect callback to selection */
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+  gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
+  g_signal_connect (selection,
+                    "changed",
+                    G_CALLBACK (compselect_callback_tree_selection_changed),
+                    compselect);
 
-static void
-compselect_class_init (CompselectClass *klass)
-{
-  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  /* Insert a column for symbol name */
+  renderer = GTK_CELL_RENDERER (
+    g_object_new (GTK_TYPE_CELL_RENDERER_TEXT,
+                  /* GtkCellRendererText */
+                  "editable", FALSE,
+                  NULL));
+  column = GTK_TREE_VIEW_COLUMN (
+    g_object_new (GTK_TYPE_TREE_VIEW_COLUMN,
+                  /* GtkTreeViewColumn */
+                  "title", _("Components"),
+                  NULL));
+  gtk_tree_view_column_pack_start (column, renderer, TRUE);
+  gtk_tree_view_column_set_cell_data_func (column, renderer,
+                                           inuse_treeview_set_cell_data,
+                                           NULL, NULL);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
 
-  compselect_parent_class = g_type_class_peek_parent (klass);
-  
-  gobject_class->finalize     = compselect_finalize;
-  gobject_class->set_property = compselect_set_property;
-  gobject_class->get_property = compselect_get_property;
+  /* Add the treeview to the scrolled window */
+  gtk_container_add (GTK_CONTAINER (scrolled_win), treeview);
+  /* set the inuse treeview of compselect */
+  compselect->inusetreeview = GTK_TREE_VIEW (treeview);
 
-  g_object_class_install_property (
-    gobject_class, PROP_SYMBOL,
-    g_param_spec_pointer ("symbol",
-                         "",
-                         "",
-                         G_PARAM_READABLE));
-  g_object_class_install_property (
-    gobject_class, PROP_BEHAVIOR,
-    g_param_spec_enum ("behavior",
-                       "",
-                       "",
-                       COMPSELECT_TYPE_BEHAVIOR,
-                       COMPSELECT_BEHAVIOR_REFERENCE,
-                       G_PARAM_READWRITE));
-  g_object_class_install_property (
-    gobject_class, PROP_HIDDEN,
-    g_param_spec_boolean ("hidden",
-                         "",
-                         "",
-                         FALSE,
-                         G_PARAM_READWRITE));
-  
+  return scrolled_win;
 }
 
-static void
-compselect_init (Compselect *compselect)
+static GtkWidget *
+create_lib_treeview (Compselect *compselect)
 {
-  GtkWidget *hbox, *vbox, *filter_hbox;
-  GtkWidget *scrolled_win, *treeview, *label, *entry, *preview, *combobox;
-  GtkWidget *button;
+  GtkWidget *libtreeview, *vbox, *scrolled_win, *label, 
+    *hbox, *entry, *button;
   GtkTreeModel *child_model, *model;
+  GtkTreeSelection *selection;
   GtkCellRenderer *renderer;
   GtkTreeViewColumn *column;
-  GtkTreeSelection *selection;
-
-  GtkWidget *alignment, *frame;
-  
-  /* dialog initialization */
-  g_object_set (G_OBJECT (compselect),
-                /* GtkWindow */
-                "type",            GTK_WINDOW_TOPLEVEL,
-                "title",           _("Select Component..."),
-                "default-height",  300,
-                "default-width",   400,
-                "modal",           FALSE,
-                "window-position", GTK_WIN_POS_NONE,
-                /* GtkDialog */
-                "has-separator",   TRUE,
-                NULL);
-  g_object_set (GTK_DIALOG (compselect)->vbox,
-                "homogeneous", FALSE,
-                NULL);
 
-  /* horizontal box selection and preview */
-  hbox = GTK_WIDGET (g_object_new (GTK_TYPE_HBOX,
-                                   /* GtkBox */
-                                   "homogeneous", FALSE,
-                                   "spacing",     5,
-                                   NULL));
+  /* -- library selection view -- */
 
   /* vertical box for component selection and search entry */
   vbox = GTK_WIDGET (g_object_new (GTK_TYPE_VBOX,
@@ -693,17 +703,12 @@ compselect_init (Compselect *compselect)
                                    "homogeneous",  FALSE,
                                    "spacing",      5,
                                    NULL));
-  
-  /* -- directory/component selection -- */
-  child_model  = compselect_create_child_model ();
+
+  child_model  = create_lib_tree_model ();
   model = (GtkTreeModel*)g_object_new (GTK_TYPE_TREE_MODEL_FILTER,
                                        "child-model",  child_model,
                                        "virtual-root", NULL,
                                        NULL);
-/*   gtk_tree_model_filter_set_visible_func ((GtkTreeModelFilter*)model, */
-/*                                           
compselect_model_filter_visible_func, */
-/*                                           compselect, */
-/*                                           NULL); */
   
   scrolled_win = GTK_WIDGET (
     g_object_new (GTK_TYPE_SCROLLED_WINDOW,
@@ -713,20 +718,21 @@ compselect_init (Compselect *compselect)
                   "shadow-type",       GTK_SHADOW_ETCHED_IN,
                   NULL));
   /* create the treeview */
-  treeview = GTK_WIDGET (g_object_new (GTK_TYPE_TREE_VIEW,
-                                       /* GtkTreeView */
-                                       "model",      model,
-                                       "rules-hint", TRUE,
-                                       NULL));
+  libtreeview = GTK_WIDGET (g_object_new (GTK_TYPE_TREE_VIEW,
+                                          /* GtkTreeView */
+                                          "model",      model,
+                                          "rules-hint", TRUE,
+                                          "headers-visible", FALSE,
+                                          NULL));
   /* connect callback to selection */
-  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
+  selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (libtreeview));
   gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
   g_signal_connect (selection,
                     "changed",
                     G_CALLBACK (compselect_callback_tree_selection_changed),
                     compselect);
 
-  /* insert a column to treeview for directory name */
+  /* insert a column to treeview for library/symbol name */
   renderer = GTK_CELL_RENDERER (
     g_object_new (GTK_TYPE_CELL_RENDERER_TEXT,
                   /* GtkCellRendererText */
@@ -739,14 +745,14 @@ compselect_init (Compselect *compselect)
                   NULL));
   gtk_tree_view_column_pack_start (column, renderer, TRUE);
   gtk_tree_view_column_set_cell_data_func (column, renderer,
-                                           compselect_treeview_set_cell_data,
+                                           lib_treeview_set_cell_data,
                                            NULL, NULL);
-  gtk_tree_view_append_column (GTK_TREE_VIEW (treeview), column);
+  gtk_tree_view_append_column (GTK_TREE_VIEW (libtreeview), column);
   
   /* add the treeview to the scrolled window */
-  gtk_container_add (GTK_CONTAINER (scrolled_win), treeview);
+  gtk_container_add (GTK_CONTAINER (scrolled_win), libtreeview);
   /* set directory/component treeview of compselect */
-  compselect->treeview = GTK_TREE_VIEW (treeview);
+  compselect->libtreeview = GTK_TREE_VIEW (libtreeview);
 
   /* add the scrolled window for directories to the vertical box */
   gtk_box_pack_start (GTK_BOX (vbox), scrolled_win,
@@ -754,7 +760,7 @@ compselect_init (Compselect *compselect)
 
   
   /* -- filter area -- */
-  filter_hbox = GTK_WIDGET (g_object_new (GTK_TYPE_HBOX,
+  hbox = GTK_WIDGET (g_object_new (GTK_TYPE_HBOX,
                                           /* GtkBox */
                                           "homogeneous", FALSE,
                                           "spacing",     3,
@@ -768,7 +774,7 @@ compselect_init (Compselect *compselect)
                                     "label",  _("Filter:"),
                                     NULL));
   /* add the search label to the filter area */
-  gtk_box_pack_start (GTK_BOX (filter_hbox), label,
+  gtk_box_pack_start (GTK_BOX (hbox), label,
                       FALSE, FALSE, 0);
   
   /* create the text entry for filter in components */
@@ -780,8 +786,15 @@ compselect_init (Compselect *compselect)
                     "changed",
                     G_CALLBACK (compselect_callback_filter_entry_changed),
                     compselect);
+
+  /* now that that we have an entry, set the filter func of model */
+  gtk_tree_model_filter_set_visible_func ((GtkTreeModelFilter*)model,
+                                          lib_model_filter_visible_func,
+                                          compselect,
+                                          NULL);
+
   /* add the filter entry to the filter area */
-  gtk_box_pack_start (GTK_BOX (filter_hbox), entry,
+  gtk_box_pack_start (GTK_BOX (hbox), entry,
                       TRUE, TRUE, 0);
   /* set filter entry of compselect */
   compselect->entry_filter = GTK_ENTRY (entry);
@@ -803,26 +816,158 @@ compselect_init (Compselect *compselect)
                     G_CALLBACK (compselect_callback_filter_button_clicked),
                     compselect);
   /* add the clear button to the filter area */
-  gtk_box_pack_start (GTK_BOX (filter_hbox), button,
+  gtk_box_pack_start (GTK_BOX (hbox), button,
                       FALSE, FALSE, 0);
   /* set clear button of compselect */
   compselect->button_clear = GTK_BUTTON (button);
                                      
   /* add the filter area to the vertical box */
-  gtk_box_pack_start (GTK_BOX (vbox), filter_hbox,
+  gtk_box_pack_start (GTK_BOX (vbox), hbox,
                       FALSE, FALSE, 0);
 
+  compselect->libtreeview = GTK_TREE_VIEW (libtreeview);
+
+  return vbox;
+}
+
+/*! \brief Create the combo box for behaviors.
+ *  \par Function Description
+ *  This function creates and returns a <B>GtkComboBox</B> for
+ *  selecting the behavior when a component is added to the sheet.
+ */
+static GtkWidget*
+create_behaviors_combo_box (void)
+{
+  GtkWidget *combobox;
+
+  combobox = gtk_combo_box_new_text ();
+
+  /* Note: order of items in menu is important */
+  /* COMPSEL_BEHAVIOR_REFERENCE */
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combobox),
+                             _("Default behavior - reference component"));
+  /* COMPSEL_BEHAVIOR_EMBED */
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combobox), 
+                             _("Embed component in schematic"));
+  /* COMPSEL_BEHAVIOR_INCLUDE */
+  gtk_combo_box_append_text (GTK_COMBO_BOX (combobox),
+                             _("Include component as individual objects"));
+
+  gtk_combo_box_set_active (GTK_COMBO_BOX (combobox), 0);
+  
+  return combobox;
+}
+
+GType
+compselect_get_type ()
+{
+  static GType compselect_type = 0;
   
+  if (!compselect_type) {
+    static const GTypeInfo compselect_info = {
+      sizeof(CompselectClass),
+      NULL, /* base_init */
+      NULL, /* base_finalize */
+      (GClassInitFunc) compselect_class_init,
+      NULL, /* class_finalize */
+      NULL, /* class_data */
+      sizeof(Compselect),
+      0,    /* n_preallocs */
+      (GInstanceInitFunc) compselect_init,
+    };
+                
+    compselect_type = g_type_register_static (GSCHEM_TYPE_DIALOG,
+                                              "Compselect",
+                                              &compselect_info, 0);
+  }
+  
+  return compselect_type;
+}
+
+static void
+compselect_class_init (CompselectClass *klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  compselect_parent_class = g_type_class_peek_parent (klass);
+  
+  gobject_class->finalize     = compselect_finalize;
+  gobject_class->set_property = compselect_set_property;
+  gobject_class->get_property = compselect_get_property;
+
+  g_object_class_install_property (
+    gobject_class, PROP_SYMBOL,
+    g_param_spec_pointer ("symbol",
+                         "",
+                         "",
+                         G_PARAM_READABLE));
+  g_object_class_install_property (
+    gobject_class, PROP_BEHAVIOR,
+    g_param_spec_enum ("behavior",
+                       "",
+                       "",
+                       COMPSELECT_TYPE_BEHAVIOR,
+                       COMPSELECT_BEHAVIOR_REFERENCE,
+                       G_PARAM_READWRITE));
+  g_object_class_install_property (
+    gobject_class, PROP_HIDDEN,
+    g_param_spec_boolean ("hidden",
+                         "",
+                         "",
+                         FALSE,
+                         G_PARAM_READWRITE));
+  
+}
+
+static void
+compselect_init (Compselect *compselect)
+{
+  GtkWidget *hbox, *notebook;
+  GtkWidget *libview, *inuseview;
+  GtkWidget *preview, *combobox;
+  
+  GtkWidget *alignment, *frame;
+  
+  /* dialog initialization */
+  g_object_set (G_OBJECT (compselect),
+                /* GtkWindow */
+                "type",            GTK_WINDOW_TOPLEVEL,
+                "title",           _("Select Component..."),
+                "default-height",  300,
+                "default-width",   400,
+                "modal",           FALSE,
+                "window-position", GTK_WIN_POS_NONE,
+                /* GtkDialog */
+                "has-separator",   TRUE,
+                NULL);
+  g_object_set (GTK_DIALOG (compselect)->vbox,
+                "homogeneous", FALSE,
+                NULL);
+
+  /* horizontal box selection and preview */
+  hbox = GTK_WIDGET (g_object_new (GTK_TYPE_HBOX,
+                                   /* GtkBox */
+                                   "homogeneous", FALSE,
+                                   "spacing",     5,
+                                   NULL));
+
+  /* notebook for library and inuse views */
+  notebook = GTK_WIDGET (g_object_new (GTK_TYPE_NOTEBOOK,
+                                       NULL));
+  compselect->viewtabs = GTK_NOTEBOOK (notebook);
+
+  inuseview = create_inuse_treeview (compselect);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), inuseview,
+                            gtk_label_new (_("In Use")));  
+
+  libview = create_lib_treeview (compselect);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), libview,
+                            gtk_label_new (_("Libraries")));
+
   /* include the vertical box in horizontal box */
-  gtk_box_pack_start (GTK_BOX (hbox), vbox,
+  gtk_box_pack_start (GTK_BOX (hbox), notebook,
                       TRUE, TRUE, 0);
 
-  /* now that that we have an entry, set the filter func of model */
-  gtk_tree_model_filter_set_visible_func ((GtkTreeModelFilter*)model,
-                                          compselect_model_filter_visible_func,
-                                          compselect,
-                                          NULL);
-
                      
   /* -- preview area -- */
   frame = GTK_WIDGET (g_object_new (GTK_TYPE_FRAME,
@@ -859,7 +1004,7 @@ compselect_init (Compselect *compselect)
   
 
   /* -- behavior combo box -- */
-  combobox = compselect_create_behaviors_combo_box ();
+  combobox = create_behaviors_combo_box ();
   g_signal_connect (combobox,
                     "changed",
                     G_CALLBACK (compselect_callback_behavior_changed),
@@ -944,21 +1089,34 @@ compselect_get_property (GObject *object,
        {
          GtkTreeModel *model;
          GtkTreeIter iter, parent;
-         CLibSymbol *symbol;
-         if (gtk_tree_selection_get_selected (
-               gtk_tree_view_get_selection (compselect->treeview),
-               &model,
-               &iter)
-             && gtk_tree_model_iter_parent (model, &parent, &iter)) {
-           
-           gtk_tree_model_get (model, &iter, 0, &symbol, -1);
-           g_value_set_pointer (value, symbol);
-
-         } else {
-           g_value_set_pointer (value, NULL);
-         }
-       }
-        break;
+         CLibSymbol *symbol = NULL;
+
+          /* FIXME assumes pages are in a specific order */
+          switch (gtk_notebook_get_current_page(compselect->viewtabs)) {
+          case 0: /* In Use page */
+            if (gtk_tree_selection_get_selected (
+                  gtk_tree_view_get_selection (compselect->inusetreeview),
+                  &model,
+                  &iter)) {
+              gtk_tree_model_get (model, &iter, 0, &symbol, -1);
+            }
+            break;
+          case 1:
+            if (gtk_tree_selection_get_selected (
+                  gtk_tree_view_get_selection (compselect->libtreeview),
+                  &model,
+                  &iter)
+                && gtk_tree_model_iter_parent (model, &parent, &iter)) {
+              gtk_tree_model_get (model, &iter, 0, &symbol, -1);
+            }
+            break;
+          default:
+            g_assert_not_reached();
+          }
+
+          g_value_set_pointer (value, symbol);
+          break;
+        }
       case PROP_BEHAVIOR:
         g_value_set_enum (value,
                           gtk_combo_box_get_active (
-- 
1.5.2.1



_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev

Reply via email to