static void gnc_plugin_page_owner_tree_selection_changed_cb (GtkTreeSelection *selection, GncPluginPageOwnerTree *page) { GtkActionGroup *action_group; GtkTreeView *view; GncOwner *owner = NULL; gboolean sensitive; gboolean is_readwrite = !qof_book_is_readonly(gnc_get_current_book()); g_return_if_fail(GNC_IS_PLUGIN_PAGE_OWNER_TREE(page)); if (!selection) { sensitive = FALSE; } else { g_return_if_fail(GTK_IS_TREE_SELECTION(selection)); view = gtk_tree_selection_get_tree_view (selection); owner = gnc_tree_view_owner_get_selected_owner (GNC_TREE_VIEW_OWNER(view)); sensitive = (owner != NULL); } action_group = gnc_plugin_page_get_action_group(GNC_PLUGIN_PAGE(page)); gnc_plugin_update_actions (action_group, actions_requiring_owner_always, "sensitive", sensitive); gnc_plugin_update_actions (action_group, actions_requiring_owner_rw, "sensitive", sensitive && is_readwrite); g_signal_emit (page, plugin_page_signals[OWNER_SELECTED], 0, owner); }
/** Create a new owner tree page based on the information saved * during a previous instantiation of gnucash. * * @param window The window where this page should be installed. * * @param key_file A pointer to the GKeyFile data structure where the * page information should be read. * * @param group_name The group name to use when restoring data. */ static GncPluginPage * gnc_plugin_page_owner_tree_recreate_page (GtkWidget *window, GKeyFile *key_file, const gchar *group_name) { GncPluginPageOwnerTree *owner_page; GncPluginPageOwnerTreePrivate *priv; GncPluginPage *page; GncOwnerType owner_type; g_return_val_if_fail(key_file, NULL); g_return_val_if_fail(group_name, NULL); ENTER("key_file %p, group_name %s", key_file, group_name); /* Create the new page. */ owner_type = g_key_file_get_integer(key_file, group_name, OWNER_TYPE_LABEL, NULL); page = gnc_plugin_page_owner_tree_new(owner_type); owner_page = GNC_PLUGIN_PAGE_OWNER_TREE(page); priv = GNC_PLUGIN_PAGE_OWNER_TREE_GET_PRIVATE(owner_page); /* Install it now so we can then manipulate the created widget */ gnc_main_window_open_page(GNC_MAIN_WINDOW(window), page); gnc_tree_view_owner_restore(GNC_TREE_VIEW_OWNER(priv->tree_view), &priv->fd, key_file, group_name, owner_type); LEAVE(" "); return page; }
/** Save enough information about this owner tree page that it can * be recreated next time the user starts gnucash. * * @param plugin_page The page to save. * * @param key_file A pointer to the GKeyFile data structure where the * page information should be written. * * @param group_name The group name to use when saving data. */ static void gnc_plugin_page_owner_tree_save_page (GncPluginPage *plugin_page, GKeyFile *key_file, const gchar *group_name) { GncPluginPageOwnerTree *owner_page; GncPluginPageOwnerTreePrivate *priv; g_return_if_fail (GNC_IS_PLUGIN_PAGE_OWNER_TREE(plugin_page)); g_return_if_fail (key_file != NULL); g_return_if_fail (group_name != NULL); ENTER("page %p, key_file %p, group_name %s", plugin_page, key_file, group_name); owner_page = GNC_PLUGIN_PAGE_OWNER_TREE(plugin_page); priv = GNC_PLUGIN_PAGE_OWNER_TREE_GET_PRIVATE(owner_page); g_key_file_set_integer(key_file, group_name, OWNER_TYPE_LABEL, priv->owner_type); gnc_tree_view_owner_save(GNC_TREE_VIEW_OWNER(priv->tree_view), &priv->fd, key_file, group_name); LEAVE(" "); }
static void gnc_plugin_page_owner_tree_double_click_cb (GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *col, GncPluginPageOwnerTree *page) { GncOwner *owner; g_return_if_fail (GNC_IS_PLUGIN_PAGE_OWNER_TREE (page)); owner = gnc_tree_view_owner_get_owner_from_path (GNC_TREE_VIEW_OWNER(treeview), path); gnc_ui_owner_edit (owner); }
static void gtvo_set_column_editor(GncTreeViewOwner *view, GtkTreeViewColumn *column, GncTreeViewOwnerColumnTextEdited edited_cb) { GList *renderers_orig, *renderers; GtkCellRenderer *renderer; // look for the first text-renderer; on the 0th column of the owner tree, // there are two renderers: pixbuf and text. So find the text one. for (renderers_orig = renderers = gtk_tree_view_column_get_cell_renderers(column); renderers && !GTK_IS_CELL_RENDERER_TEXT(renderers->data); renderers = renderers->next); renderer = GTK_CELL_RENDERER(renderers->data); g_list_free(renderers_orig); g_return_if_fail(renderer != NULL); gtvo_setup_column_renderer_edited_cb(GNC_TREE_VIEW_OWNER(view), column, renderer, edited_cb); }
GncOwner * gnc_plugin_page_owner_tree_get_current_owner (GncPluginPageOwnerTree *page) { GncPluginPageOwnerTreePrivate *priv; GncOwner *owner; priv = GNC_PLUGIN_PAGE_OWNER_TREE_GET_PRIVATE(page); ENTER("page %p (tree view %p)", page, priv->tree_view); owner = gnc_tree_view_owner_get_selected_owner (GNC_TREE_VIEW_OWNER(priv->tree_view)); if (owner == NULL) { LEAVE("no owner"); return NULL; } LEAVE("owner %p", owner); return owner; }
static void gnc_tree_view_owner_finalize (GObject *object) { GncTreeViewOwner *owner_view; GncTreeViewOwnerPrivate *priv; ENTER("view %p", object); g_return_if_fail (object != NULL); g_return_if_fail (GNC_IS_TREE_VIEW_OWNER (object)); owner_view = GNC_TREE_VIEW_OWNER (object); priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(owner_view); if (priv->filter_destroy) { priv->filter_destroy(priv->filter_data); priv->filter_destroy = NULL; } priv->filter_fn = NULL; if (G_OBJECT_CLASS (parent_class)->finalize) (* G_OBJECT_CLASS (parent_class)->finalize) (object); LEAVE(" "); }
/* * Create a new owner tree view for one type of owners. * This view will be based on a model that is common to all views of * the same set of books, but will have its own private filter on that * model. */ GtkTreeView * gnc_tree_view_owner_new (GncOwnerType owner_type) { GncTreeView *view; GtkTreeModel *model, *f_model, *s_model; const gchar *sample_type, *sample_currency; GncTreeViewOwnerPrivate *priv; GtkTreeViewColumn *tax_info_column; GtkCellRenderer *renderer; ENTER(" "); /* Create our view */ view = g_object_new (GNC_TYPE_TREE_VIEW_OWNER, "name", "owner_tree", NULL); priv = GNC_TREE_VIEW_OWNER_GET_PRIVATE(GNC_TREE_VIEW_OWNER (view)); /* Create/get a pointer to the existing model for this set of books. */ model = gnc_tree_model_owner_new (owner_type); /* Set up the view private filter layer on the common model. */ f_model = gtk_tree_model_filter_new (model, NULL); /* A GncTreeModelOwner is based on a GncTreeModel, which is a * GObject that provides a GtkTreeModel interface. */ g_object_unref(G_OBJECT(model)); /* Set up the view private sort layer on the common model. */ s_model = gtk_tree_model_sort_new_with_model(f_model); g_object_unref(G_OBJECT(f_model)); gnc_tree_view_set_model (view, s_model); g_object_unref(G_OBJECT(s_model)); /* Set default visibilities */ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(view), FALSE); sample_type = gncOwnerTypeToQofIdType (GNC_OWNER_CUSTOMER); sample_currency = gnc_commodity_get_fullname(gnc_default_currency()); priv->name_column = gnc_tree_view_add_text_column(view, _("Owner Name"), GNC_OWNER_TREE_NAME_COL, NULL, "GnuCash Inc.", GNC_TREE_MODEL_OWNER_COL_NAME, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Type"), GNC_OWNER_TREE_TYPE_COL, NULL, sample_type, GNC_TREE_MODEL_OWNER_COL_TYPE, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); priv->id_column = gnc_tree_view_add_text_column(view, _("Owner ID"), GNC_OWNER_TREE_ID_COL, NULL, "1-123-1234", GNC_TREE_MODEL_OWNER_COL_ID, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Currency"), GNC_OWNER_TREE_CURRENCY_COL, NULL, sample_currency, GNC_TREE_MODEL_OWNER_COL_CURRENCY, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Address Name"), GNC_OWNER_TREE_ADDRESS_NAME_COL, NULL, "GnuCash Inc.", GNC_TREE_MODEL_OWNER_COL_ADDRESS_NAME, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Address 1"), GNC_OWNER_TREE_ADDRESS_1_COL, NULL, "Free Software Foundation", GNC_TREE_MODEL_OWNER_COL_ADDRESS_1, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Address 2"), GNC_OWNER_TREE_ADDRESS_2_COL, NULL, "51 Franklin Street, Fifth Floor", GNC_TREE_MODEL_OWNER_COL_ADDRESS_2, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Address 3"), GNC_OWNER_TREE_ADDRESS_3_COL, NULL, "Boston, MA 02110-1301", GNC_TREE_MODEL_OWNER_COL_ADDRESS_3, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Address 4"), GNC_OWNER_TREE_ADDRESS_4_COL, NULL, "USA", GNC_TREE_MODEL_OWNER_COL_ADDRESS_4, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Phone"), GNC_OWNER_TREE_PHONE_COL, NULL, "+1-617-542-5942", GNC_TREE_MODEL_OWNER_COL_PHONE, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("Fax"), GNC_OWNER_TREE_FAX_COL, NULL, "+1-617-542-2652", GNC_TREE_MODEL_OWNER_COL_FAX, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_text_column(view, _("E-mail"), GNC_OWNER_TREE_EMAIL_COL, NULL, "*****@*****.**", GNC_TREE_MODEL_OWNER_COL_EMAIL, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_numeric_column(view, _("Balance"), GNC_OWNER_TREE_BALANCE_COL, SAMPLE_OWNER_VALUE, GNC_TREE_MODEL_OWNER_COL_BALANCE, GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_balance_value); priv->balance_report_column = gnc_tree_view_add_numeric_column(view, _("Balance"), GNC_OWNER_TREE_BALANCE_REPORT_COL, SAMPLE_OWNER_VALUE, GNC_TREE_MODEL_OWNER_COL_BALANCE_REPORT, GNC_TREE_MODEL_OWNER_COL_COLOR_BALANCE, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_balance_value); priv->notes_column = gnc_tree_view_add_text_column(view, _("Notes"), GNC_OWNER_TREE_NOTES_COL, NULL, "Sample owner notes.", GNC_TREE_MODEL_OWNER_COL_NOTES, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_string); gnc_tree_view_add_toggle_column (view, _("Active"), /* Translators: This string has a context prefix; the translation must only contain the part after the | character. */ Q_("Column letter for 'Active'|A"), GNC_OWNER_TREE_ACTIVE_COL, GNC_TREE_MODEL_OWNER_COL_ACTIVE, GNC_TREE_VIEW_COLUMN_VISIBLE_ALWAYS, sort_by_boolean, gnc_tree_view_owner_active_toggled); /* Update column titles to use the currency name. */ gtvo_update_column_names(view); /* By default only the first column is visible. */ gnc_tree_view_configure_columns(view); gtk_tree_model_filter_set_visible_func (GTK_TREE_MODEL_FILTER (f_model), gnc_tree_view_owner_filter_helper, view, NULL); /* Default the sorting to owner name */ gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(s_model), GNC_TREE_MODEL_OWNER_COL_NAME, GTK_SORT_ASCENDING); gtk_widget_show(GTK_WIDGET(view)); LEAVE("%p", view); return GTK_TREE_VIEW(view); }
static GtkWidget * gnc_plugin_page_owner_tree_create_widget (GncPluginPage *plugin_page) { GncPluginPageOwnerTree *page; GncPluginPageOwnerTreePrivate *priv; GtkTreeSelection *selection; GtkTreeView *tree_view; GtkWidget *scrolled_window; GtkTreeViewColumn *col; const gchar *state_section = NULL; gchar* label = ""; ENTER("page %p", plugin_page); page = GNC_PLUGIN_PAGE_OWNER_TREE (plugin_page); priv = GNC_PLUGIN_PAGE_OWNER_TREE_GET_PRIVATE(page); if (priv->widget != NULL) { LEAVE("widget = %p", priv->widget); return priv->widget; } priv->widget = gtk_vbox_new (FALSE, 0); gtk_widget_show (priv->widget); scrolled_window = gtk_scrolled_window_new (NULL, NULL); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_widget_show (scrolled_window); gtk_box_pack_start (GTK_BOX (priv->widget), scrolled_window, TRUE, TRUE, 0); tree_view = gnc_tree_view_owner_new(priv->owner_type); /* Show default columns */ col = gnc_tree_view_find_column_by_name( GNC_TREE_VIEW(tree_view), GNC_OWNER_TREE_ID_COL); g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1)); col = gnc_tree_view_find_column_by_name( GNC_TREE_VIEW(tree_view), GNC_OWNER_TREE_ADDRESS_1_COL); g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1)); col = gnc_tree_view_find_column_by_name( GNC_TREE_VIEW(tree_view), GNC_OWNER_TREE_ADDRESS_2_COL); g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1)); col = gnc_tree_view_find_column_by_name( GNC_TREE_VIEW(tree_view), GNC_OWNER_TREE_PHONE_COL); g_object_set_data(G_OBJECT(col), DEFAULT_VISIBLE, GINT_TO_POINTER(1)); gnc_tree_view_configure_columns(GNC_TREE_VIEW(tree_view)); switch (priv->owner_type) { case GNC_OWNER_NONE : case GNC_OWNER_UNDEFINED : break; case GNC_OWNER_CUSTOMER : label = N_("Customers"); state_section = "Customers Overview"; break; case GNC_OWNER_JOB : label = N_("Jobs"); state_section = "Jobs Overview"; break; case GNC_OWNER_VENDOR : label = N_("Vendors"); state_section = "Vendors Overview"; break; case GNC_OWNER_EMPLOYEE : label = N_("Employees"); state_section = "Employees Overview"; break; } g_object_set(G_OBJECT(tree_view), "state-section", state_section, "show-column-menu", TRUE, NULL); g_object_set(G_OBJECT(plugin_page), "page-name", label, NULL); priv->tree_view = tree_view; selection = gtk_tree_view_get_selection(tree_view); g_signal_connect (G_OBJECT (selection), "changed", G_CALLBACK (gnc_plugin_page_owner_tree_selection_changed_cb), page); g_signal_connect (G_OBJECT (tree_view), "button-press-event", G_CALLBACK (gnc_plugin_page_owner_tree_button_press_cb), page); g_signal_connect (G_OBJECT (tree_view), "row-activated", G_CALLBACK (gnc_plugin_page_owner_tree_double_click_cb), page); gtk_tree_view_set_headers_visible(tree_view, TRUE); gnc_plugin_page_owner_tree_selection_changed_cb (NULL, page); gtk_widget_show (GTK_WIDGET (tree_view)); gtk_container_add (GTK_CONTAINER (scrolled_window), GTK_WIDGET(tree_view)); priv->fd.tree_view = GNC_TREE_VIEW_OWNER(priv->tree_view); gnc_tree_view_owner_set_filter ( GNC_TREE_VIEW_OWNER(tree_view), gnc_plugin_page_owner_tree_filter_owners, &priv->fd, NULL); priv->component_id = gnc_register_gui_component(PLUGIN_PAGE_ACCT_TREE_CM_CLASS, gnc_plugin_page_owner_refresh_cb, gnc_plugin_page_owner_tree_close_cb, page); gnc_gui_component_set_session (priv->component_id, gnc_get_current_session()); LEAVE("widget = %p", priv->widget); return priv->widget; }