/** @brief Create an absolute path when given a relative path; * otherwise return the argument. * * @warning filefrag should be a simple path fragment. It shouldn't * contain xml:// or http:// or <whatever>:// other protocol specifiers. * * If passed a string which g_path_is_absolute declares an absolute * path, return the argument. * * Otherwise, assume that filefrag is a well-formed relative path and * try to find a file with its path relative to * \li the current working directory, * \li the installed system-wide data directory (e.g., /usr/local/share/gnucash), * \li the installed system configuration directory (e.g., /usr/local/etc/gnucash), * \li or in the user's configuration directory (e.g., $HOME/.gnucash/data) * * The paths are searched for in that order. If a matching file is * found, return the absolute path to it. * If one isn't found, return a absolute path relative to the * user's configuration directory and note in the trace file that it * needs to be created. * * @param filefrag The file path to resolve * * @return An absolute file path. */ gchar * gnc_resolve_file_path (const gchar * filefrag) { gchar *fullpath = NULL, *tmp_path = NULL; /* seriously invalid */ if (!filefrag) { g_critical("filefrag is NULL"); return NULL; } /* ---------------------------------------------------- */ /* OK, now we try to find or build an absolute file path */ /* check for an absolute file path */ if (g_path_is_absolute(filefrag)) return g_strdup (filefrag); /* Look in the current working directory */ tmp_path = g_get_current_dir(); fullpath = g_build_filename(tmp_path, filefrag, (gchar *)NULL); g_free(tmp_path); fullpath = check_path_return_if_valid(fullpath); if (fullpath != NULL) return fullpath; /* Look in the data dir (e.g. $PREFIX/share/gnucash) */ tmp_path = gnc_path_get_pkgdatadir(); fullpath = g_build_filename(tmp_path, filefrag, (gchar *)NULL); g_free(tmp_path); fullpath = check_path_return_if_valid(fullpath); if (fullpath != NULL) return fullpath; /* Look in the config dir (e.g. $PREFIX/share/gnucash/accounts) */ tmp_path = gnc_path_get_accountsdir(); fullpath = g_build_filename(tmp_path, filefrag, (gchar *)NULL); g_free(tmp_path); fullpath = check_path_return_if_valid(fullpath); if (fullpath != NULL) return fullpath; /* Look in the users config dir (e.g. $HOME/.gnucash/data) */ fullpath = gnc_build_data_path(filefrag); if (g_file_test(fullpath, G_FILE_TEST_IS_REGULAR)) return fullpath; /* OK, it's not there. Note that it needs to be created and pass it * back anyway */ g_warning("create new file %s", fullpath); return fullpath; }
static void account_categories_tree_view_prepare (hierarchy_data *data) { GSList *list; gchar *gnc_accounts_dir; gchar *locale_dir; GtkTreeView *tree_view; GtkListStore *model; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeSelection *selection; GtkTreePath *path; gnc_accounts_dir = gnc_path_get_accountsdir (); locale_dir = gnc_get_ea_locale_dir (gnc_accounts_dir); list = gnc_load_example_account_list (locale_dir); g_free (gnc_accounts_dir); g_free (locale_dir); /* Prepare the account_categories GtkTreeView with a model and with some columns */ tree_view = data->categories_tree; model = gtk_list_store_new(NUM_COLUMNS, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); gtk_tree_view_set_model (tree_view, GTK_TREE_MODEL(model)); g_object_unref (model); g_slist_foreach(list, (GFunc)add_one_category, data); g_signal_connect (G_OBJECT (model), "row_changed", G_CALLBACK (categories_selection_changed), data); renderer = gtk_cell_renderer_toggle_new (); g_object_set (G_OBJECT (renderer), "activatable", TRUE, NULL); column = gtk_tree_view_column_new_with_attributes (_("Selected"), renderer, "active", COL_CHECKED, NULL); gtk_tree_view_append_column (tree_view, column); gtk_tree_view_column_set_sort_column_id (column, COL_CHECKED); g_signal_connect (G_OBJECT (renderer), "toggled", G_CALLBACK (category_checkbox_toggled), model); renderer = gtk_cell_renderer_text_new (); column = gtk_tree_view_column_new_with_attributes (_("Account Types"), renderer, "text", COL_TITLE, NULL); gtk_tree_view_append_column (tree_view, column); gtk_tree_view_column_set_sort_column_id (column, COL_TITLE); // renderer = gtk_cell_renderer_text_new (); // column = gtk_tree_view_column_new_with_attributes (_("Description"), // renderer, // "text", COL_SHORT_DESCRIPTION, // NULL); // gtk_tree_view_append_column (tree_view, column); // gtk_tree_view_column_set_sort_column_id (column, COL_SHORT_DESCRIPTION); gtk_tree_view_set_headers_clickable(tree_view, TRUE); gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(model), COL_TITLE, GTK_SORT_ASCENDING); if (data->initial_category) { path = gtk_tree_row_reference_get_path(data->initial_category); selection = gtk_tree_view_get_selection(tree_view); gtk_tree_view_scroll_to_cell(tree_view, path, NULL, TRUE, 0.5, 0.5); gtk_tree_selection_select_path(selection, path); gtk_tree_path_free(path); } }