37 #include <gdk/gdkkeysyms.h>    39 #include "completioncell.h"    47 #include <gnc-unicode.h>    49 typedef struct _PopBox
    55     GHashTable*   item_hash; 
    56     GtkListStore* item_store; 
    61     gboolean      signals_connected; 
    66     gboolean      sort_enabled; 
    67     gboolean      register_is_reversed; 
    70     gboolean      in_list_select; 
    76 #define DONT_TEXT N_("Don't autocomplete")    79 enum GncCompletionColumn
    87 static void gnc_completion_cell_gui_realize (BasicCell* bcell, gpointer w);
    88 static void gnc_completion_cell_gui_move (BasicCell* bcell);
    89 static void gnc_completion_cell_gui_destroy (BasicCell* bcell);
    90 static gboolean gnc_completion_cell_enter (BasicCell* bcell,
    94 static void gnc_completion_cell_leave (BasicCell* bcell);
    95 static void gnc_completion_cell_destroy (BasicCell* bcell);
    98 gnc_completion_cell_new (
void)
   101     gnc_completion_cell_init (cell);
   108     gnc_basic_cell_init (& (cell->cell));
   110     cell->cell.is_popup = TRUE;
   112     cell->cell.destroy = gnc_completion_cell_destroy;
   114     cell->cell.gui_realize = gnc_completion_cell_gui_realize;
   115     cell->cell.gui_destroy = gnc_completion_cell_gui_destroy;
   120     box->item_edit = NULL;
   121     box->item_list = NULL;
   122     box->item_store = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING,
   123                                              G_TYPE_INT, G_TYPE_INT);
   124     box->signals_connected = FALSE;
   125     box->list_popped = FALSE;
   126     box->autosize = FALSE;
   127     box->register_is_reversed = FALSE;
   129     box->sort_enabled = FALSE;
   131     cell->cell.gui_private = box;
   134     box->in_list_select = FALSE;
   137     box->item_hash = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
   143     gnc_item_edit_hide_popup (box->item_edit);
   144     box->list_popped = FALSE;
   148 select_item_cb (
GncItemList* item_list, 
char* item_string, gpointer user_data)
   151     PopBox* box = cell->cell.gui_private;
   153     box->in_list_select = TRUE;
   154     gnucash_sheet_modify_current_cell (box->sheet, item_string);
   155     box->in_list_select = FALSE;
   161 text_width (PangoLayout *layout)
   163     PangoRectangle logical_rect;
   164     pango_layout_set_width (layout, -1);
   165     pango_layout_get_pixel_extents (layout, NULL, &logical_rect);
   166     return logical_rect.width;
   170 horizontal_scroll_to_found_text (
PopBox* box, 
char* item_string, gint found_location)
   172     if (!gtk_widget_get_realized (GTK_WIDGET(box->item_list->tree_view)))
   176     gtk_widget_get_allocation (GTK_WIDGET(box->item_list->tree_view), &alloc);
   177     gint scroll_point = 0;
   178     gchar *start_string = g_utf8_substring (item_string, 0, found_location + box->newval_len);
   180     PangoLayout *layout = gtk_widget_create_pango_layout (GTK_WIDGET(box->item_list->tree_view), item_string);
   181     PangoAttrList *atlist = pango_attr_list_new ();
   182     PangoAttribute *bold_weight = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
   183     bold_weight->start_index = found_location;
   184     bold_weight->end_index = found_location + box->newval_len;
   185     pango_attr_list_insert (atlist, bold_weight);
   186     pango_layout_set_attributes (layout, atlist);
   188     gint item_string_width = text_width (layout);
   190     pango_layout_set_text (layout, start_string, -1);
   192     gint start_string_width = text_width (layout);
   194     pango_attr_list_unref (atlist);
   195     g_object_unref (layout);
   196     g_free (start_string);
   198     if (item_string_width <= alloc.width)
   201         scroll_point = start_string_width - alloc.width / 2;
   203     if (scroll_point < 0)
   206     gtk_tree_view_scroll_to_point (box->item_list->tree_view, scroll_point, -1);
   210 change_item_cb (
GncItemList* item_list, 
char* item_string, gpointer user_data)
   213     PopBox* box = cell->cell.gui_private;
   215     box->in_list_select = TRUE;
   216     gnucash_sheet_modify_current_cell (box->sheet, item_string);
   217     box->in_list_select = FALSE;
   219     GtkTreeModel *model = gtk_tree_view_get_model (item_list->tree_view);
   220     GtkTreeSelection *selection = gtk_tree_view_get_selection (item_list->tree_view);
   222     if (gtk_tree_selection_get_selected (selection, &model, &iter))
   225         gtk_tree_model_get (model, &iter, FOUND_LOCATION_COL, &found_location, -1);
   226         horizontal_scroll_to_found_text (box, item_string, found_location);
   231 activate_item_cb (
GncItemList* item_list, 
char* item_string, gpointer user_data)
   234     PopBox* box = cell->cell.gui_private;
   241     PopBox* box = cell->cell.gui_private;
   243     if (!box->signals_connected)
   246     g_signal_handlers_block_matched (G_OBJECT(box->item_list),
   248                                      0, 0, NULL, NULL, cell);
   254     PopBox* box = cell->cell.gui_private;
   256     if (!box->signals_connected)
   259     g_signal_handlers_unblock_matched (G_OBJECT(box->item_list),
   261                                        0, 0, NULL, NULL, cell);
   265 key_press_item_cb (
GncItemList* item_list, GdkEventKey* event, gpointer user_data)
   268     PopBox* box = cell->cell.gui_private;
   270     switch (event->keyval)
   273         block_list_signals (cell); 
   274         gnc_item_list_select (box->item_list, NULL);
   275         unblock_list_signals (cell);
   280         gtk_widget_event (GTK_WIDGET (box->sheet),
   289     PopBox* box = cell->cell.gui_private;
   291     if (!box->signals_connected)
   294     g_signal_handlers_disconnect_matched (G_OBJECT(box->item_list),
   296                                           0, 0, NULL, NULL, cell);
   298     box->signals_connected = FALSE;
   304     PopBox* box = cell->cell.gui_private;
   306     if (box->signals_connected)
   309     g_signal_connect (G_OBJECT(box->item_list), 
"select_item",
   310                       G_CALLBACK(select_item_cb), cell);
   312     g_signal_connect (G_OBJECT(box->item_list), 
"change_item",
   313                       G_CALLBACK(change_item_cb), cell);
   315     g_signal_connect (G_OBJECT(box->item_list), 
"activate_item",
   316                       G_CALLBACK(activate_item_cb), cell);
   318     g_signal_connect (G_OBJECT(box->item_list), 
"key_press_event",
   319                       G_CALLBACK(key_press_item_cb), cell);
   321     box->signals_connected = TRUE;
   325 gnc_completion_cell_gui_destroy (BasicCell* bcell)
   329     if (cell->cell.gui_realize)
   331         PopBox* box = bcell->gui_private;
   332         if (box && box->item_list)
   334             completion_disconnect_signals (cell);
   335             g_object_unref (box->item_list);
   336             box->item_list = NULL;
   339         cell->cell.gui_realize = gnc_completion_cell_gui_realize;
   340         cell->cell.gui_move = NULL;
   341         cell->cell.enter_cell = NULL;
   342         cell->cell.leave_cell = NULL;
   343         cell->cell.gui_destroy = NULL;
   348 gnc_completion_cell_destroy (BasicCell* bcell)
   351     PopBox* box = cell->cell.gui_private;
   353     gnc_completion_cell_gui_destroy (& (cell->cell));
   358             g_hash_table_destroy (box->item_hash);
   361         cell->cell.gui_private = NULL;
   363     cell->cell.gui_private = NULL;
   364     cell->cell.gui_realize = NULL;
   368 sort_func (GtkTreeModel* model, GtkTreeIter* iter_a, GtkTreeIter* iter_b, gpointer user_data)
   370     gint a_weight, b_weight;
   373     gtk_tree_model_get (model, iter_a, WEIGHT_COL, &a_weight, -1);
   374     gtk_tree_model_get (model, iter_b, WEIGHT_COL, &b_weight, -1);
   376     if (a_weight < b_weight)
   378     else if (a_weight > b_weight)
   391     PopBox* box = cell->cell.gui_private;
   392     box->sort_enabled = enabled;
   396 set_sort_column_enabled (
PopBox* box, gboolean enable)
   400         gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE(box->item_list->list_store),
   401                                          WEIGHT_COL, sort_func, box->item_list, NULL);
   403         gnc_item_list_set_sort_column (box->item_list, WEIGHT_COL);
   406         gnc_item_list_set_sort_column (box->item_list, GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID);
   415     PopBox* box = cell->cell.gui_private;
   418     GtkListStore *store = gnc_item_list_disconnect_store (box->item_list);
   420     block_list_signals (cell);
   422     if (box->sort_enabled) 
   423         set_sort_column_enabled (box, FALSE);
   425     gtk_list_store_clear (box->item_store);
   427     if (box->sort_enabled) 
   428         set_sort_column_enabled (box, TRUE);
   430     unblock_list_signals (cell);
   433     gnc_item_list_connect_store (box->item_list, store);
   444     PopBox* box = cell->cell.gui_private;
   450         g_hash_table_remove_all (box->item_hash);
   451         item_store_clear (cell);
   460     if (!cell || !menustr)
   463     PopBox* box = cell->cell.gui_private;
   467         gpointer value = g_hash_table_lookup (box->item_hash, menustr);
   468         gboolean update = FALSE;
   471             if (!box->register_is_reversed)
   479             g_hash_table_insert (box->item_hash, g_strdup (menustr),
   480                                  GINT_TO_POINTER(box->occurrence));
   487 gnc_completion_cell_set_value (
CompletionCell* cell, 
const char* str)
   491     gnc_basic_cell_set_value (&cell->cell, str);
   495 list_store_append (GtkListStore *store, 
char* 
string,
   496                    char* markup, gint weight, gint found_location)
   500     g_return_if_fail (store);
   501     g_return_if_fail (
string);
   502     g_return_if_fail (markup);
   504     gtk_list_store_append (store, &iter);
   506     gtk_list_store_set (store, &iter, TEXT_COL, 
string,
   507                                       TEXT_MARKUP_COL, markup,
   509                                       FOUND_LOCATION_COL, found_location, -1);
   513 test_and_add (
PopBox* box, 
const gchar *text, gint start_pos,
   514               gpointer key, gint occurrence_difference)
   517     gint text_length = g_utf8_strlen (text, -1);
   519     if (start_pos >= text_length)
   522     gchar *sub_text = g_utf8_substring (text, start_pos, text_length);
   523     int pos = 0, len = 0;
   524     if (gnc_unicode_has_substring_base_chars (box->newval, sub_text, &pos, &len))
   526         gchar *markup = NULL, *prefix = NULL, *match = NULL, *suffix = NULL;
   527         gint found_location = start_pos + pos;
   528         gboolean have_boundary = FALSE;
   532         if (found_location > 0)
   533             prefix = g_utf8_substring (text, 0, found_location);
   535             prefix = g_strdup (
"");
   537         prefix_length = g_utf8_strlen (prefix, -1);
   539         match = g_utf8_substring (text, found_location, found_location + len);
   543             gunichar prev = g_utf8_get_char (g_utf8_offset_to_pointer (sub_text, pos - 1));
   544             if (prev && (g_unichar_isspace (prev) || g_unichar_ispunct (prev)))
   545                 have_boundary = TRUE;
   547                 ret_value = found_location + 1;
   550         suffix = g_utf8_substring (text, found_location + len, text_length);
   552         markup = g_markup_printf_escaped (
"%s<b>%s</b>%s%s", prefix, match, suffix, 
" ");
   554         if ((prefix_length == 0 ) || have_boundary)
   556             weight = occurrence_difference; 
   558             if (gnc_unicode_compare_base_chars (sub_text, box->newval) == 0) 
   561             list_store_append (box->item_store, key, markup, weight, found_location);
   573 add_item (gpointer key, gpointer value, gpointer user_data)
   576     gchar *hash_entry = g_strdup (key);
   578     if (hash_entry && *hash_entry)
   581         gint occurrence_difference;
   584         if (box->register_is_reversed)
   585             occurrence_difference = GPOINTER_TO_INT(value) + 1;
   587             occurrence_difference = box->occurrence - GPOINTER_TO_INT(value);
   591             start_pos = test_and_add (box, hash_entry, start_pos, key, occurrence_difference);
   593         while (start_pos != -1);
   599 select_first_entry_in_list (
PopBox* box)
   601     GtkTreeModel *model = gtk_tree_view_get_model (box->item_list->tree_view);
   605     if (!gtk_tree_model_get_iter_first (model, &iter))
   608     if (!gtk_tree_model_iter_next (model, &iter))
   611     gtk_tree_model_get (model, &iter, TEXT_COL, &
string, -1);
   613     gnc_item_list_select (box->item_list, 
string);
   615     GtkTreePath* path = gtk_tree_path_new_first ();
   616     gtk_tree_view_scroll_to_cell (box->item_list->tree_view,
   617                                   path, NULL, TRUE, 0.5, 0.0);
   618     gtk_tree_path_free (path);
   625     PopBox* box = cell->cell.gui_private;
   627     box->in_list_select = FALSE;
   628     box->item_edit->popup_allocation_height = -1;
   631         box->newval = g_strdup(str);
   635     box->newval_len = g_utf8_strlen (str, -1);
   638     box->item_store = gnc_item_list_disconnect_store (box->item_list);
   640     block_list_signals (cell);
   642     if (box->sort_enabled) 
   643         set_sort_column_enabled (box, FALSE);
   645     gtk_list_store_clear (box->item_store);
   648     gchar *markup = g_markup_printf_escaped (
"<i>%s</i>", DONT_TEXT);
   649     list_store_append (box->item_store, DONT_TEXT, markup, 0, 0);
   653     g_hash_table_foreach (box->item_hash, add_item, box);
   655     if (box->sort_enabled) 
   656         set_sort_column_enabled (box, TRUE);
   658     unblock_list_signals (cell);
   661     gnc_item_list_connect_store (box->item_list, box->item_store);
   664     gtk_tree_view_column_queue_resize (gtk_tree_view_get_column (
   665                                        box->item_list->tree_view, TEXT_COL));
   668     if (gtk_tree_model_iter_n_children (GTK_TREE_MODEL(box->item_store), NULL) == 1)
   673         gnc_item_edit_show_popup (box->item_edit);
   675     block_list_signals (cell); 
   676     select_first_entry_in_list (box);
   677     unblock_list_signals (cell);
   679     g_free (box->newval);
   683 gnc_completion_cell_modify_verify (BasicCell* bcell,
   688                                    int* cursor_position,
   689                                    int* start_selection,
   693     PopBox* box = cell->cell.gui_private;
   695     if (box->in_list_select)
   697         if (g_strcmp0 (newval, DONT_TEXT) == 0)
   699         gnc_basic_cell_set_value_internal (bcell, newval);
   700         *cursor_position = -1;
   701         *start_selection = 0;
   707     if (change == NULL || *cursor_position < bcell->value_chars)
   708         *start_selection = *end_selection = *cursor_position;
   710     gchar *start_of_text = g_utf8_substring (newval, 0, *cursor_position);
   711     populate_list_store (cell, start_of_text);
   712     g_free (start_of_text);
   714     if (g_strcmp0 (newval, 
"") == 0)
   716         block_list_signals (cell); 
   717         gnc_item_list_select (box->item_list, NULL);
   718         unblock_list_signals (cell);
   721     gnc_basic_cell_set_value_internal (bcell, newval);
   730     PopBox* box = cell->cell.gui_private;
   732     if (box->item_hash && (g_hash_table_size (box->item_hash) == 1))
   734         GList *keys = g_hash_table_get_keys (box->item_hash);
   735         char *ret = g_strdup (keys->data);
   743 gnc_completion_cell_direct_update (BasicCell* bcell,
   744                                    int* cursor_position,
   745                                    int* start_selection,
   750     PopBox* box = cell->cell.gui_private;
   751     GdkEventKey* 
event = gui_data;
   753     if (event->type != GDK_KEY_PRESS)
   756     switch (event->keyval)
   759     case GDK_KEY_ISO_Left_Tab:
   761             if (event->state & GDK_CONTROL_MASK)
   763                 char* hash_string = get_entry_from_hash_if_size_is_one (cell);
   767                     gnc_basic_cell_set_value_internal (bcell, hash_string);
   768                     *cursor_position = strlen (hash_string);
   770                 g_free (hash_string);
   779             g_signal_emit_by_name (G_OBJECT(box->item_list), 
"change_item",
   780                                    string, (gpointer)bcell);
   788         box->in_list_select = gnc_item_in_list (box->item_list, bcell->value);
   791         item_store_clear (cell);
   802     PopBox* box = cell->cell.gui_private;
   804     if (is_reversed != box->register_is_reversed)
   806         gnc_completion_cell_clear_menu (cell);
   807         box->register_is_reversed = is_reversed;
   813 gnc_completion_cell_gui_realize (BasicCell* bcell, gpointer data)
   815     GnucashSheet* sheet = data;
   816     GncItemEdit* item_edit = gnucash_sheet_get_item_edit (sheet);
   818     PopBox* box = cell->cell.gui_private;
   822     box->item_edit = item_edit;
   823     box->item_list = GNC_ITEM_LIST(gnc_item_list_new (box->item_store));
   825     block_list_signals (cell);
   826     set_sort_column_enabled (box, FALSE);
   827     unblock_list_signals (cell);
   829     gtk_widget_show_all (GTK_WIDGET(box->item_list));
   830     g_object_ref_sink (box->item_list);
   833     cell->cell.gui_realize = NULL;
   834     cell->cell.gui_move = gnc_completion_cell_gui_move;
   835     cell->cell.enter_cell = gnc_completion_cell_enter;
   836     cell->cell.leave_cell = gnc_completion_cell_leave;
   837     cell->cell.gui_destroy = gnc_completion_cell_gui_destroy;
   838     cell->cell.modify_verify = gnc_completion_cell_modify_verify;
   839     cell->cell.direct_update = gnc_completion_cell_direct_update;
   843 reset_item_list_to_default_setup (BasicCell* bcell)
   845     PopBox* box = bcell->gui_private;
   846     PopupToggle popup_toggle;
   850     popup_toggle = box->item_edit->popup_toggle;
   851     gtk_widget_set_sensitive (GTK_WIDGET(popup_toggle.tbutton), TRUE);
   852     gtk_widget_set_visible (GTK_WIDGET(popup_toggle.tbutton), TRUE);
   854     GtkTreeViewColumn *column = gtk_tree_view_get_column (
   855                                     GTK_TREE_VIEW(box->item_list->tree_view), TEXT_COL);
   856     gtk_tree_view_column_clear_attributes (column,box->item_list->renderer);
   857     gtk_tree_view_column_add_attribute (column, box->item_list->renderer,
   859     box->list_popped = FALSE;
   863 gnc_completion_cell_gui_move (BasicCell* bcell)
   865     PopBox* box = bcell->gui_private;
   869     gnc_item_edit_set_popup (box->item_edit, NULL, NULL,
   870                              NULL, NULL, NULL, NULL, NULL);
   872     reset_item_list_to_default_setup (bcell);
   876 popup_get_height (GtkWidget* widget,
   878                   G_GNUC_UNUSED 
int row_height,
   882     GtkScrolledWindow* scrollwin = GNC_ITEM_LIST(widget)->scrollwin;
   886     if (box->item_edit->popup_allocation_height != -1)
   887         height = box->item_edit->popup_allocation_height;
   889         height = gnc_item_list_get_popup_height (GNC_ITEM_LIST(widget));
   891     if (height < space_available)
   895         gint ret_height = height ? height : 1;
   897         gtk_widget_set_size_request (GTK_WIDGET(scrollwin), -1, ret_height);
   898         gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrollwin),
   899                                         GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER);
   903         gtk_widget_set_size_request (GTK_WIDGET(scrollwin), -1, -1);
   905     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrollwin),
   906                                     GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
   907     return space_available;
   911 popup_autosize (GtkWidget* widget,
   917     if (!box || !box->autosize)
   920     return gnc_item_list_autosize (GNC_ITEM_LIST(widget)) + 20;
   924 popup_set_focus (GtkWidget* widget,
   925                  G_GNUC_UNUSED gpointer user_data)
   930     if (gnc_item_list_num_entries (GNC_ITEM_LIST(widget)))
   931         gtk_widget_grab_focus (GTK_WIDGET (GNC_ITEM_LIST(widget)->tree_view));
   935 popup_post_show (GtkWidget* widget,
   936                  G_GNUC_UNUSED gpointer user_data)
   938     gnc_item_list_autosize (GNC_ITEM_LIST(widget));
   939     gnc_item_list_show_selected (GNC_ITEM_LIST(widget));
   943 popup_get_width (GtkWidget* widget,
   944                  G_GNUC_UNUSED gpointer user_data)
   947     gtk_widget_get_allocation (GTK_WIDGET (GNC_ITEM_LIST(widget)->tree_view),
   953 tree_view_size_allocate_cb (GtkWidget *widget,
   954                             G_GNUC_UNUSED GtkAllocation *allocation,
   957     GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW(widget));
   958     GtkTreeSelection *selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(widget));
   960     if (gtk_tree_selection_get_selected (selection, &model, &iter))
   965         gtk_tree_model_get (model, &iter, TEXT_COL, &item_text,
   966                                           FOUND_LOCATION_COL, &found_location, -1);
   967         horizontal_scroll_to_found_text (box, item_text, found_location);
   973 gnc_completion_cell_enter (BasicCell* bcell,
   974                            int* cursor_position,
   975                            int* start_selection,
   979     PopBox* box = bcell->gui_private;
   980     PopupToggle popup_toggle;
   982     gnc_item_edit_set_popup (box->item_edit,
   983                              GTK_WIDGET(box->item_list),
   984                              popup_get_height, popup_autosize,
   985                              popup_set_focus, popup_post_show,
   986                              popup_get_width, box);
   988     popup_toggle = box->item_edit->popup_toggle;
   989     gtk_widget_set_sensitive (GTK_WIDGET(popup_toggle.tbutton), FALSE);
   990     gtk_widget_set_visible (GTK_WIDGET(popup_toggle.tbutton), FALSE);
   992     GtkTreeViewColumn *column = gtk_tree_view_get_column (
   993                                     GTK_TREE_VIEW(box->item_list->tree_view), TEXT_COL);
   994     gtk_tree_view_column_clear_attributes (column, box->item_list->renderer);
   995     gtk_tree_view_column_add_attribute (column, box->item_list->renderer,
   996                                         "markup", TEXT_MARKUP_COL);
   998     g_signal_connect (G_OBJECT(box->item_list->tree_view), 
"size-allocate",
   999                       G_CALLBACK(tree_view_size_allocate_cb), box);
  1001     completion_connect_signals (cell);
  1003     *cursor_position = -1;
  1004     *start_selection = 0;
  1005     *end_selection = -1;
  1011 gnc_completion_cell_leave (BasicCell* bcell)
  1013     PopBox* box = bcell->gui_private;
  1017     gnc_item_edit_set_popup (box->item_edit, NULL, NULL,
  1018                              NULL, NULL, NULL, NULL, NULL);
  1020     reset_item_list_to_default_setup (bcell);
  1022     if (box->strict && !box->in_list_select)
  1023         gnc_basic_cell_set_value_internal (bcell, 
"");
  1032     PopBox* box = cell->cell.gui_private;
  1036     box->strict = strict;
  1045     PopBox* box = cell->cell.gui_private;
  1049     box->autosize = autosize;
 The CompletionCell object implements a cell handler with a "combination-box" pull-down menu in it...
void gnc_completion_cell_reverse_sort(CompletionCell *cell, gboolean is_reversed)
Register the sort direction. 
void gnc_completion_cell_set_sort_enabled(CompletionCell *cell, gboolean enabled)
Enable sorting of the menu item's contents. 
void gnc_utf8_strip_invalid_and_controls(gchar *str)
Strip any non-utf8 characters and any control characters (everything < 0x20, , ,  ...
Public Declarations for GncItemList class. 
Public declarations of GnucashRegister class. 
Private declarations for GnucashSheet class. 
Generic api to store and retrieve preferences. 
void gnc_completion_cell_add_menu_item(CompletionCell *cell, const char *menustr)
Add a menu item to the hash table list. 
Public declarations for GncItemEdit class. 
void gnc_completion_cell_set_strict(CompletionCell *cell, gboolean strict)
Determines whether the cell will accept strings not in the menu. 
Declarations for the Table object. 
void gnc_completion_cell_set_autosize(CompletionCell *cell, gboolean autosize)
Determines whether the popup list autosizes itself or uses all available space. 
char * gnc_item_list_get_selection(GncItemList *item_list)
Retrieve the selected string from the item_list's active GtkListStore.