diff --git a/gnucash/gnome-utils/gnc-gui-query.c b/gnucash/gnome-utils/gnc-gui-query.c index dc82b91d7f..1aef41910a 100644 --- a/gnucash/gnome-utils/gnc-gui-query.c +++ b/gnucash/gnome-utils/gnc-gui-query.c @@ -316,24 +316,9 @@ gnc_choose_radio_option_dialog(GtkWidget *parent, return radio_result; } -/********************************************************************\ - * gnc_input_dialog * - * simple convenience dialog to get a single value from the user * - * user may choose between "Ok" and "Cancel" * - * * - * NOTE: This function does not return until the dialog is closed * - * * - * Args: parent - the parent window or NULL * - * title - the title of the dialog * - * msg - the message to display * - * default_input - will be displayed as default input * - * Return: the input (text) the user entered, if pressed "Ok" * - * NULL, if pressed "Cancel" * - \********************************************************************/ -gchar * -gnc_input_dialog (GtkWidget *parent, const gchar *title, const gchar *msg, const gchar *default_input) +static gchar * +gnc_input_dialog_internal (GtkWidget *parent, const gchar *title, const gchar *msg, const gchar *default_input, gboolean use_entry) { - GtkWidget *dialog, *label, *content_area; gint result; GtkWidget *view; GtkTextBuffer *buffer; @@ -341,36 +326,46 @@ gnc_input_dialog (GtkWidget *parent, const gchar *title, const gchar *msg, const GtkTextIter start, end; /* Create the widgets */ - dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent), + GtkWidget* dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("_OK"), GTK_RESPONSE_ACCEPT, _("_Cancel"), GTK_RESPONSE_REJECT, NULL); - content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + GtkWidget* content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); // add a label - label = gtk_label_new (msg); + GtkWidget* label = gtk_label_new (msg); gtk_box_pack_start(GTK_BOX(content_area), label, FALSE, FALSE, 0); - // add a textview - view = gtk_text_view_new (); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD_CHAR); - buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); - gtk_text_buffer_set_text (buffer, default_input, -1); + // add a textview or an entry. + if (use_entry) + { + view = gtk_entry_new (); + gtk_entry_set_text (GTK_ENTRY (view), default_input); + } + else + { + view = gtk_text_view_new (); + gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (view), GTK_WRAP_WORD_CHAR); + buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)); + gtk_text_buffer_set_text (buffer, default_input, -1); + } gtk_box_pack_start(GTK_BOX(content_area), view, TRUE, TRUE, 0); - + // run the dialog gtk_widget_show_all (dialog); result = gtk_dialog_run (GTK_DIALOG (dialog)); - if (result == GTK_RESPONSE_REJECT) - user_input = 0; - else + if (result != GTK_RESPONSE_REJECT) { - gtk_text_buffer_get_start_iter (buffer, &start); - gtk_text_buffer_get_end_iter (buffer, &end); - user_input = gtk_text_buffer_get_text (buffer, - &start, &end, FALSE); + if (use_entry) + user_input = g_strdup (gtk_entry_get_text ((GTK_ENTRY (view)))); + else + { + gtk_text_buffer_get_start_iter (buffer, &start); + gtk_text_buffer_get_end_iter (buffer, &end); + user_input = gtk_text_buffer_get_text (buffer, &start, &end, FALSE); + } } gtk_widget_destroy (dialog); @@ -378,23 +373,53 @@ gnc_input_dialog (GtkWidget *parent, const gchar *title, const gchar *msg, const return user_input; } +/********************************************************************\ + * gnc_input_dialog * + * simple convenience dialog to get a single value from the user * + * user may choose between "Ok" and "Cancel" * + * * + * NOTE: This function does not return until the dialog is closed * + * * + * Args: parent - the parent window or NULL * + * title - the title of the dialog * + * msg - the message to display * + * default_input - will be displayed as default input * + * Return: the input (text) the user entered, if pressed "Ok" * + * NULL, if pressed "Cancel" * + \********************************************************************/ +gchar * +gnc_input_dialog (GtkWidget *parent, const gchar *title, const gchar *msg, const gchar *default_input) +{ + return gnc_input_dialog_internal (parent, title, msg, default_input, FALSE); +} + +/********************************************************************\ + * gnc_input_dialog_with_entry * + * Similar to gnc_input_dialog but use a single line entry widget * + * user may choose between "Ok" and "Cancel" * + \********************************************************************/ +gchar * +gnc_input_dialog_with_entry (GtkWidget *parent, const gchar *title, const gchar *msg, const gchar *default_input) +{ + return gnc_input_dialog_internal (parent, title, msg, default_input, TRUE); +} + void gnc_info2_dialog (GtkWidget *parent, const gchar *title, const gchar *msg) { - GtkWidget *dialog, *scrolledwindow, *content_area; GtkWidget *view; GtkTextBuffer *buffer; gint width, height; /* Create the widgets */ - dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent), + GtkWidget* dialog = gtk_dialog_new_with_buttons (title, GTK_WINDOW (parent), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, _("_OK"), GTK_RESPONSE_ACCEPT, NULL); - content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); + GtkWidget* content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog)); // add a scroll area - scrolledwindow = gtk_scrolled_window_new (NULL, NULL); + GtkWidget* scrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_box_pack_start(GTK_BOX(content_area), scrolledwindow, TRUE, TRUE, 0); // add a textview diff --git a/gnucash/gnome-utils/gnc-ui.h b/gnucash/gnome-utils/gnc-ui.h index 41c3ebd864..bc7327d90b 100644 --- a/gnucash/gnome-utils/gnc-ui.h +++ b/gnucash/gnome-utils/gnc-ui.h @@ -107,6 +107,9 @@ gnc_error_dialog (GtkWindow *parent, extern gchar * gnc_input_dialog (GtkWidget *parent, const gchar *title, const gchar *msg, const gchar *default_input); +extern gchar * +gnc_input_dialog_with_entry (GtkWidget *parent, const gchar *title, const gchar *msg, const gchar *default_input); + extern void gnc_info2_dialog (GtkWidget *parent, const gchar *title, const gchar *msg); diff --git a/gnucash/import-export/import-main-matcher.c b/gnucash/import-export/import-main-matcher.c index 0b9e028978..69700d7f3f 100644 --- a/gnucash/import-export/import-main-matcher.c +++ b/gnucash/import-export/import-main-matcher.c @@ -130,7 +130,8 @@ static void gnc_gen_trans_assign_transfer_account_to_selection_cb (GtkMenuItem * GNCImportMainMatcher *info); static void gnc_gen_trans_view_popup_menu (GtkTreeView *treeview, GdkEvent *event, - GNCImportMainMatcher *info); + GNCImportMainMatcher *info, + gboolean show_edit_actions); static gboolean gnc_gen_trans_onButtonPressed_cb (GtkTreeView *treeview, GdkEvent *event, GNCImportMainMatcher *info); @@ -879,6 +880,106 @@ gnc_gen_trans_assign_transfer_account_to_selection_cb (GtkMenuItem *menuitem, LEAVE(""); } +typedef enum +{ + DESCRIPTION = 0, + MEMO = 1, + NOTES = 2, +} edit_field; + +static void +gnc_gen_trans_edit_fields (GtkMenuItem *menuitem, GNCImportMainMatcher *info, edit_field field) +{ + GtkTreeView *treeview; + GtkTreeSelection *selection; + GtkTreeModel *model; + GtkTreeIter iter; + GNCImportTransInfo *trans_info; + GList *selected_rows; + gboolean first, is_selection; + GList *refs = NULL; + const gchar* messages[] = {_("Enter new Description"),_("Enter new Memo"),_("Enter new Notes")}; + const gchar* message = messages[field]; + + ENTER("assign_transfer_account_to_selection_cb"); + treeview = GTK_TREE_VIEW(info->view); + model = gtk_tree_view_get_model (treeview); + selection = gtk_tree_view_get_selection (treeview); + selected_rows = gtk_tree_selection_get_selected_rows (selection, &model); + first = TRUE; + is_selection = TRUE; + + DEBUG("Rows in selection = %i", + gtk_tree_selection_count_selected_rows (selection)); + DEBUG("Entering loop over selection"); + + if (gtk_tree_selection_count_selected_rows (selection) > 0) + { + GtkTreeStore* store = GTK_TREE_STORE (model); + for (GList* l = selected_rows; l != NULL; l = l->next) + { + gchar *path_str = gtk_tree_path_to_string (l->data); + GtkTreeRowReference *ref = gtk_tree_row_reference_new (model, l->data); + g_free (path_str); + refs = g_list_prepend (refs, ref); + if (gtk_tree_model_get_iter (model, &iter, l->data)) + { + Split* first_split; + Transaction* trans; + gtk_tree_model_get (model, &iter, DOWNLOADED_COL_DATA, &trans_info, -1); + trans = gnc_import_TransInfo_get_trans (trans_info); + if (field == DESCRIPTION) + { + gchar* new_field = gnc_input_dialog_with_entry(info->main_widget, "", message, xaccTransGetDescription (trans)); + if (!new_field) break; + xaccTransSetDescription (trans, new_field); + gtk_tree_store_set (store, &iter, DOWNLOADED_COL_DESCRIPTION, new_field, -1); + g_free (new_field); + } + else if (field == MEMO) + { + gchar* new_field; + first_split = gnc_import_TransInfo_get_fsplit (trans_info); + new_field = gnc_input_dialog_with_entry(info->main_widget, "", message, xaccSplitGetMemo (first_split)); + if (!new_field) break; + xaccSplitSetMemo (first_split, new_field); + gtk_tree_store_set (store, &iter, DOWNLOADED_COL_MEMO, new_field, -1); + g_free (new_field); + } + else if (field == NOTES) + { + gchar* new_field = gnc_input_dialog_with_entry(info->main_widget, "", message, xaccTransGetNotes (trans)); + if (!new_field) break; + xaccTransSetNotes (trans, new_field); + g_free (new_field); + } + } + } + } + g_list_free_full (selected_rows, (GDestroyNotify)gtk_tree_path_free); + g_list_free (refs); + LEAVE(""); + +} + +static void +gnc_gen_trans_edit_description_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info) +{ + gnc_gen_trans_edit_fields (menuitem, info, DESCRIPTION); +} + +static void +gnc_gen_trans_edit_memo_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info) +{ + gnc_gen_trans_edit_fields (menuitem, info, MEMO); +} + +static void +gnc_gen_trans_edit_notes_cb (GtkMenuItem *menuitem, GNCImportMainMatcher *info) +{ + gnc_gen_trans_edit_fields (menuitem, info, NOTES); +} + static void gnc_gen_trans_row_activated_cb (GtkTreeView *treeview, GtkTreePath *path, @@ -966,7 +1067,8 @@ gnc_gen_trans_row_changed_cb (GtkTreeSelection *selection, static void gnc_gen_trans_view_popup_menu (GtkTreeView *treeview, GdkEvent *event, - GNCImportMainMatcher *info) + GNCImportMainMatcher *info, + gboolean show_edit_actions) { GtkWidget *menu, *menuitem; GdkEventButton *event_button; @@ -981,6 +1083,33 @@ gnc_gen_trans_view_popup_menu (GtkTreeView *treeview, info); DEBUG("Callback to assign destination account to selection connected"); gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); + + if (show_edit_actions) + { + menuitem = gtk_menu_item_new_with_label ( + _("Edit description.")); + g_signal_connect (menuitem, "activate", + G_CALLBACK (gnc_gen_trans_edit_description_cb), + info); + DEBUG("Callback to edit description"); + gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); + + menuitem = gtk_menu_item_new_with_label ( + _("Edit memo.")); + g_signal_connect (menuitem, "activate", + G_CALLBACK (gnc_gen_trans_edit_memo_cb), + info); + DEBUG("Callback to edit memo"); + gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); + + menuitem = gtk_menu_item_new_with_label ( + _("Edit notes.")); + g_signal_connect (menuitem, "activate", + G_CALLBACK (gnc_gen_trans_edit_notes_cb), + info); + DEBUG("Callback to edit notes"); + gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); + } gtk_widget_show_all (menu); event_button = (GdkEventButton *) event; /* Note: event can be NULL here when called from view_onPopupMenu; */ @@ -1012,14 +1141,14 @@ gnc_gen_trans_onButtonPressed_cb (GtkTreeView *treeview, selection = gtk_tree_view_get_selection (treeview); count = gtk_tree_selection_count_selected_rows (selection); if (count > 1) - gnc_gen_trans_view_popup_menu (treeview, event, info); + gnc_gen_trans_view_popup_menu (treeview, event, info, FALSE); else if (count > 0) { GList* selected; GtkTreeModel *model; selected = gtk_tree_selection_get_selected_rows (selection, &model); if (get_action_for_path (selected->data, model) == GNCImport_ADD) - gnc_gen_trans_view_popup_menu (treeview, event, info); + gnc_gen_trans_view_popup_menu (treeview, event, info, TRUE); g_list_free_full (selected, (GDestroyNotify)gtk_tree_path_free); } LEAVE("return TRUE"); @@ -1040,7 +1169,7 @@ gnc_gen_trans_onPopupMenu_cb (GtkTreeView *treeview, selection = gtk_tree_view_get_selection (treeview); if (gtk_tree_selection_count_selected_rows (selection) > 0) { - gnc_gen_trans_view_popup_menu (treeview, NULL, info); + gnc_gen_trans_view_popup_menu (treeview, NULL, info, TRUE); LEAVE ("TRUE"); return TRUE; }