26 #include <glib/gi18n.h> 28 #include "dialog-doclink.h" 29 #include "dialog-doclink-utils.h" 31 #include "dialog-utils.h" 32 #include "gnc-component-manager.h" 33 #include "gnc-session.h" 46 #include "dialog-invoice.h" 48 #define DIALOG_DOCLINK_CM_CLASS "dialog-doclink" 49 #define GNC_PREFS_GROUP_BUS "dialogs.business-doclink" 50 #define GNC_PREFS_GROUP_TRANS "dialogs.trans-doclink" 71 GtkWidget *path_head_label;
72 GtkWidget *total_entries_label;
74 gboolean is_list_trans;
82 static QofLogModule log_module = GNC_MOD_GUI;
87 gnc_doclink_open_uri (GtkWindow *parent,
const gchar *uri)
92 gchar *path_head = gnc_doclink_get_path_head ();
93 gchar *run_uri = gnc_doclink_get_use_uri (path_head, uri, scheme);
96 PINFO(
"Open uri scheme is '%s', uri is '%s'", run_scheme, run_uri);
112 location_ok_cb (GtkEntry *entry, gpointer user_data)
114 GtkWidget *ok_button = user_data;
115 gboolean have_scheme = FALSE;
116 const gchar *text = gtk_entry_get_text (entry);
117 GtkWidget *warning_hbox = g_object_get_data (G_OBJECT(entry),
"whbox");
127 gtk_widget_set_visible (warning_hbox, !have_scheme);
128 gtk_widget_set_sensitive (ok_button, have_scheme);
132 file_ok_cb (GtkButton *button, GtkWidget *ok_button)
134 const gchar *uri = g_object_get_data (G_OBJECT(button),
"uri");
135 gboolean file_true = FALSE;
142 if (full_filename && !g_file_test (full_filename, G_FILE_TEST_IS_DIR))
145 g_free (full_filename);
147 gtk_widget_set_sensitive (ok_button, file_true);
151 fcb_clicked_cb (GtkButton *button, GtkWidget *ok_button)
153 GtkWidget *dialog = gtk_widget_get_toplevel (GTK_WIDGET(button));
154 GtkWidget *label = g_object_get_data (G_OBJECT(button),
"fcb_label");
155 const gchar *path_head = g_object_get_data (G_OBJECT(button),
"path_head");
156 const gchar *uri = g_object_get_data (G_OBJECT(button),
"uri");
157 GtkFileChooserNative *native;
160 native = gtk_file_chooser_native_new (_(
"Select document"),
162 GTK_FILE_CHOOSER_ACTION_OPEN,
169 gchar *full_filename = gnc_doclink_get_unescape_uri (path_head, uri, scheme);
170 gchar *path = g_path_get_dirname (full_filename);
171 gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(native), path);
172 g_free (full_filename);
177 gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER(native), path_head);
179 res = gtk_native_dialog_run (GTK_NATIVE_DIALOG(native));
180 if (res == GTK_RESPONSE_ACCEPT)
182 gchar *uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER(native));
186 gchar *filename = g_path_get_basename (uri);
187 gchar *unescape_filename = g_uri_unescape_string (filename, NULL);
188 gtk_label_set_text (GTK_LABEL(label), unescape_filename);
190 DEBUG(
"Native file uri is '%s'", uri);
192 g_object_set_data_full (G_OBJECT(button),
"uri", g_strdup (uri), g_free);
194 g_free (unescape_filename);
197 file_ok_cb (button, ok_button);
199 g_object_unref (native);
203 uri_type_selected_cb (GtkToggleButton *button, GtkWidget *widget)
205 GtkWidget *top = gtk_widget_get_toplevel (widget);
206 GtkWidget *parent_hbox = gtk_widget_get_parent (widget);
207 GtkWidget *ok_button = g_object_get_data (G_OBJECT(widget),
"okbut");
208 gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button));
211 gtk_widget_set_visible (parent_hbox, active);
216 if (g_strcmp0 (gtk_buildable_get_name (
217 GTK_BUILDABLE(parent_hbox)),
"location_hbox") == 0)
218 location_ok_cb (GTK_ENTRY (widget), ok_button);
220 file_ok_cb (GTK_BUTTON(widget), ok_button);
222 gtk_window_resize (GTK_WINDOW(top), 600, 10);
227 setup_location_dialog (GtkBuilder *builder, GtkWidget *button_loc,
const gchar *uri)
229 GtkLabel *location_label = GTK_LABEL(gtk_builder_get_object (builder,
"location_label"));
230 GtkEntry *entry = GTK_ENTRY(gtk_builder_get_object (builder,
"location_entry"));
231 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button_loc), TRUE);
234 gtk_entry_set_width_chars (entry, 80);
235 gtk_entry_set_activates_default (entry, TRUE);
236 gtk_widget_grab_focus (GTK_WIDGET(entry));
241 gtk_label_set_text (location_label, _(
"Amend the URL"));
242 gtk_entry_set_text (entry, uri);
246 gchar *enter_uri = g_strdup_printf (_(
"Enter an URL like \"%s\""),
248 gtk_label_set_text (location_label, enter_uri);
254 setup_file_dialog (GtkBuilder *builder,
const gchar *path_head,
const gchar *uri, gchar *scheme)
256 GtkWidget *fcb = GTK_WIDGET(gtk_builder_get_object (builder,
"file_chooser_button"));
257 gchar *display_uri = gnc_doclink_get_unescape_uri (path_head, uri, scheme);
261 GtkWidget *existing_hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"existing_hbox"));
262 GtkWidget *image = gtk_image_new_from_icon_name (
"dialog-warning", GTK_ICON_SIZE_SMALL_TOOLBAR);
263 gchar *use_uri = gnc_doclink_get_use_uri (path_head, uri, scheme);
264 gchar *uri_label = g_strdup_printf (
"%s \"%s\"", _(
"Existing Document Link is"), display_uri);
265 GtkWidget *label = gtk_label_new (uri_label);
267 if (g_file_test (display_uri, G_FILE_TEST_EXISTS))
268 gtk_box_pack_start (GTK_BOX(existing_hbox), label, FALSE, TRUE, 0);
271 gtk_box_pack_start (GTK_BOX(existing_hbox), image, FALSE, FALSE, 0);
272 gtk_box_pack_start (GTK_BOX(existing_hbox), label, FALSE, TRUE, 0);
275 PINFO(
"Path head: '%s', URI: '%s', Filename: '%s'", path_head, uri, display_uri);
277 gtk_label_set_ellipsize (GTK_LABEL(label), PANGO_ELLIPSIZE_START);
280 gnc_widget_style_context_add_class (GTK_WIDGET(label),
"gnc-class-highlight");
281 gtk_widget_show_all (existing_hbox);
286 g_object_set_data_full (G_OBJECT(fcb),
"path_head", g_strdup (path_head), g_free);
287 gtk_widget_grab_focus (GTK_WIDGET(fcb));
288 g_free (display_uri);
292 gnc_doclink_get_uri_event_cb (GtkWidget *widget, GdkEventKey *event,
295 if (event->keyval == GDK_KEY_Escape)
297 gtk_dialog_response (GTK_DIALOG(widget),
298 GTK_RESPONSE_CANCEL);
305 gnc_doclink_get_uri_dialog (GtkWindow *parent,
const gchar *title,
308 GtkWidget *dialog, *button_loc, *button_file, *ok_button, *warning_hbox;
310 gboolean uri_is_file, have_uri = FALSE;
313 GtkWidget *fcb_label;
314 GtkWidget *head_label;
316 gchar *ret_uri = NULL;
317 gchar *path_head = gnc_doclink_get_path_head ();
318 gchar *scheme = NULL;
321 builder = gtk_builder_new();
322 gnc_builder_add_from_file (builder,
"dialog-doclink.glade",
323 "linked_doc_dialog");
324 dialog = GTK_WIDGET(gtk_builder_get_object (builder,
"linked_doc_dialog"));
325 gtk_window_set_title (GTK_WINDOW(dialog), title);
328 gtk_window_set_transient_for (GTK_WINDOW(dialog), GTK_WINDOW(parent));
331 gtk_widget_set_name (GTK_WIDGET(dialog),
"gnc-id-doclink");
332 gnc_widget_style_context_add_class (GTK_WIDGET(dialog),
"gnc-class-doclink");
335 g_signal_connect (dialog,
"key_press_event",
336 G_CALLBACK(gnc_doclink_get_uri_event_cb), dialog);
338 head_label = GTK_WIDGET(gtk_builder_get_object (builder,
"path_head_label"));
339 ok_button = GTK_WIDGET(gtk_builder_get_object (builder,
"ok_button"));
341 fcb = GTK_WIDGET(gtk_builder_get_object (builder,
"file_chooser_button"));
342 fcb_label = GTK_WIDGET(gtk_builder_get_object (builder,
"file_chooser_button_label"));
343 g_object_set_data (G_OBJECT(fcb),
"fcb_label", fcb_label);
344 g_object_set_data (G_OBJECT(fcb),
"okbut", ok_button);
345 g_signal_connect (fcb,
"clicked", G_CALLBACK(fcb_clicked_cb), ok_button);
347 button_file = GTK_WIDGET(gtk_builder_get_object (builder,
"linked_file"));
348 g_signal_connect (button_file,
"toggled", G_CALLBACK(uri_type_selected_cb), fcb);
350 gtk_widget_show_all (GTK_WIDGET(gtk_builder_get_object (builder,
"file_hbox")));
352 warning_hbox = GTK_WIDGET(gtk_builder_get_object (builder,
"warning_hbox"));
353 entry = GTK_ENTRY(gtk_builder_get_object (builder,
"location_entry"));
354 g_object_set_data (G_OBJECT(entry),
"whbox", warning_hbox);
355 g_object_set_data (G_OBJECT(entry),
"okbut", ok_button);
357 g_signal_connect (entry,
"changed", G_CALLBACK(location_ok_cb), ok_button);
359 button_loc = GTK_WIDGET(gtk_builder_get_object (builder,
"linked_loc"));
360 g_signal_connect (button_loc,
"toggled", G_CALLBACK(uri_type_selected_cb), entry);
363 gnc_doclink_set_path_head_label (head_label, NULL, NULL);
371 if (!scheme || g_strcmp0 (scheme,
"file") == 0)
378 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button_loc), TRUE);
379 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(button_file), TRUE);
387 gchar *filename = g_path_get_basename (uri);
389 g_object_set_data_full (G_OBJECT(fcb),
"uri", g_strdup (uri), g_free);
393 gchar *unescape_filename = g_uri_unescape_string (filename, NULL);
394 gtk_label_set_text (GTK_LABEL(fcb_label), unescape_filename);
395 g_free (unescape_filename);
398 setup_file_dialog (builder, path_head, uri, scheme);
401 setup_location_dialog (builder, button_loc, uri);
404 g_object_set_data_full (G_OBJECT(fcb),
"path_head", g_strdup (path_head), g_free);
407 g_object_unref (G_OBJECT(builder));
410 result = gtk_dialog_run (GTK_DIALOG(dialog));
411 if (result == GTK_RESPONSE_OK)
413 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button_loc)))
415 const gchar *dialog_uri = gtk_entry_get_text (GTK_ENTRY(entry));
417 ret_uri = g_strdup (dialog_uri);
419 DEBUG(
"Dialog Location URI: '%s'", dialog_uri);
423 const gchar *dialog_uri = g_object_get_data (G_OBJECT(fcb),
"uri");
425 PINFO(
"Dialog File URI: '%s', Path head: '%s'", dialog_uri, path_head);
428 if (g_str_has_prefix (dialog_uri, path_head))
430 const gchar *part = dialog_uri + strlen (path_head);
431 ret_uri = g_strdup (part);
434 ret_uri = g_strdup (dialog_uri);
436 DEBUG(
"Dialog File URI: '%s'", ret_uri);
439 else if (result == GTK_RESPONSE_REJECT)
440 ret_uri = g_strdup (
"");
442 ret_uri = g_strdup (uri);
445 gtk_widget_destroy (dialog);
453 static void close_handler (gpointer user_data);
456 gnc_doclink_dialog_window_delete_event_cb (GtkWidget *widget,
462 if (doclink_dialog->is_list_trans)
463 gnc_save_window_size (GNC_PREFS_GROUP_TRANS,
464 GTK_WINDOW(doclink_dialog->window));
466 gnc_save_window_size (GNC_PREFS_GROUP_BUS,
467 GTK_WINDOW(doclink_dialog->window));
472 gnc_doclink_dialog_window_destroy_cb (GtkWidget *
object, gpointer user_data)
477 gnc_unregister_gui_component (doclink_dialog->component_id);
479 if (doclink_dialog->window)
481 g_free (doclink_dialog->path_head);
482 gtk_widget_destroy (doclink_dialog->window);
483 doclink_dialog->window = NULL;
485 g_free (doclink_dialog);
490 gnc_doclink_dialog_window_key_press_cb (GtkWidget *widget, GdkEventKey *event,
495 if (event->keyval == GDK_KEY_Escape)
497 close_handler (doclink_dialog);
512 model = gtk_tree_view_get_model (GTK_TREE_VIEW (doclink_dialog->view));
513 g_object_ref (G_OBJECT(model));
514 gtk_tree_view_set_model (GTK_TREE_VIEW (doclink_dialog->view), NULL);
517 valid = gtk_tree_model_get_iter_first (model, &iter);
524 gtk_tree_model_get (model, &iter, URI, &uri, -1);
531 gnc_doclink_get_unescape_uri (doclink_dialog->path_head,
534 if (g_file_test (filename, G_FILE_TEST_EXISTS))
535 gtk_list_store_set (GTK_LIST_STORE(model), &iter, AVAILABLE, _(
"File Found"), -1);
537 gtk_list_store_set (GTK_LIST_STORE(model), &iter, AVAILABLE, _(
"File Not Found"), -1);
543 gchar *escaped = g_uri_escape_string (uri,
":/.", TRUE);
544 GNetworkMonitor *nm = g_network_monitor_get_default ();
545 GSocketConnectable *conn = g_network_address_parse_uri (escaped, 80, NULL);
549 if (g_network_monitor_can_reach (nm, conn, NULL, NULL))
550 gtk_list_store_set (GTK_LIST_STORE(model), &iter, AVAILABLE, _(
"Address Found"), -1);
552 gtk_list_store_set (GTK_LIST_STORE(model), &iter, AVAILABLE, _(
"Address Not Found"), -1);
559 valid = gtk_tree_model_iter_next (model, &iter);
562 gtk_tree_view_set_model (GTK_TREE_VIEW (doclink_dialog->view), model);
563 g_object_unref (G_OBJECT(model));
567 update_model_with_changes (
DoclinkDialog *doclink_dialog, GtkTreeIter *iter,
571 gboolean rel = FALSE;
577 display_uri = gnc_doclink_get_unescape_uri (doclink_dialog->path_head,
579 gtk_list_store_set (GTK_LIST_STORE (doclink_dialog->model), iter,
580 DISPLAY_URI, display_uri, AVAILABLE, _(
"File Found"),
583 URI_RELATIVE_PIX, (rel == TRUE ?
"emblem-default" : NULL), -1);
586 gtk_list_store_set (GTK_LIST_STORE (doclink_dialog->model), iter,
587 AVAILABLE, _(
"Unknown"), -1);
589 g_free (display_uri);
597 gtk_tree_model_iter_n_children (GTK_TREE_MODEL (doclink_dialog->model),
602 gchar *total = g_strdup_printf (
"%s %d", _(
"Total Entries"), entries);
603 gtk_label_set_text (GTK_LABEL (doclink_dialog->total_entries_label),
605 gtk_widget_show (doclink_dialog->total_entries_label);
609 gtk_widget_hide (doclink_dialog->total_entries_label);
613 row_selected_bus_cb (GtkTreeView *view, GtkTreePath *path,
614 GtkTreeViewColumn *col, gpointer user_data)
622 g_return_if_fail (gtk_tree_model_get_iter (doclink_dialog->model,
625 gtk_tree_model_get (doclink_dialog->model, &iter, URI,
626 &uri, ITEM_POINTER, &invoice, -1);
629 if (gtk_tree_view_get_column (GTK_TREE_VIEW (doclink_dialog->view),
630 DISPLAY_URI - 1) == col)
631 gnc_doclink_open_uri (GTK_WINDOW (doclink_dialog->window), uri);
640 if (gtk_tree_view_get_column (GTK_TREE_VIEW (doclink_dialog->view),
645 iw = gnc_ui_invoice_edit (GTK_WINDOW (doclink_dialog->window),
651 if (gtk_tree_view_get_column (GTK_TREE_VIEW (doclink_dialog->view),
652 AVAILABLE - 1) == col)
654 gchar *ret_uri = NULL;
656 if (doclink_dialog->book_ro)
658 gnc_warning_dialog (GTK_WINDOW (doclink_dialog->window),
"%s",
659 _(
"Business item can not be modified."));
667 gnc_doclink_get_uri_dialog (GTK_WINDOW (doclink_dialog->window),
668 _(
"Manage Document Link"), uri);
670 if (ret_uri && g_strcmp0 (uri, ret_uri) != 0)
672 gncInvoiceSetDocLink (invoice, ret_uri);
674 if (g_strcmp0 (ret_uri,
"") == 0)
677 gnc_invoice_update_doclink_for_window (invoice, ret_uri);
678 gtk_list_store_remove (GTK_LIST_STORE (doclink_dialog->model),
680 update_total_entries (doclink_dialog);
687 display_uri = gnc_doclink_get_unescape_uri (doclink_dialog->path_head, ret_uri, scheme);
689 update_model_with_changes (doclink_dialog, &iter, ret_uri);
692 gnc_invoice_update_doclink_for_window (invoice, display_uri);
695 g_free (display_uri);
704 row_selected_trans_cb (GtkTreeView *view, GtkTreePath *path,
705 GtkTreeViewColumn *col, gpointer user_data)
713 g_return_if_fail (gtk_tree_model_get_iter (doclink_dialog->model,
716 gtk_tree_model_get (doclink_dialog->model, &iter, URI,
717 &uri, ITEM_POINTER, &split, -1);
720 if (gtk_tree_view_get_column (GTK_TREE_VIEW (doclink_dialog->view),
721 DISPLAY_URI - 1) == col)
722 gnc_doclink_open_uri (GTK_WINDOW (doclink_dialog->window), uri);
731 if (gtk_tree_view_get_column (GTK_TREE_VIEW(doclink_dialog->view),
732 DESC_ITEM - 1) == col)
741 gnc_split_reg_raise (gsr);
744 if (gnc_split_reg_clear_filter_for_split (gsr, split))
747 gnc_split_reg_jump_to_split (gsr, split);
751 if (gtk_tree_view_get_column (GTK_TREE_VIEW(doclink_dialog->view), AVAILABLE - 1) == col)
754 gchar *ret_uri = NULL;
760 doclink_dialog->book_ro)
762 gnc_warning_dialog (GTK_WINDOW (doclink_dialog->window),
"%s",
763 _(
"Transaction can not be modified."));
768 gnc_doclink_get_uri_dialog (GTK_WINDOW (doclink_dialog->window),
769 _(
"Manage Document Link"), uri);
771 if (ret_uri && g_strcmp0 (uri, ret_uri) != 0)
774 if (g_strcmp0 (ret_uri,
"") == 0)
776 gtk_list_store_remove (GTK_LIST_STORE (doclink_dialog->model),
778 update_total_entries (doclink_dialog);
781 update_model_with_changes (doclink_dialog, &iter, ret_uri);
789 add_bus_info_to_model (
QofInstance* data, gpointer user_data)
792 GncInvoice *invoice = GNC_INVOICE(data);
793 const gchar *uri = gncInvoiceGetDocLink (invoice);
799 gboolean rel = FALSE;
801 time64 t = gncInvoiceGetDateOpened (invoice);
804 memset (datebuff, 0,
sizeof(datebuff));
809 switch (gncInvoiceGetType (invoice))
811 case GNC_INVOICE_VEND_INVOICE:
812 case GNC_INVOICE_VEND_CREDIT_NOTE:
813 inv_type = _(
"Bill");
815 case GNC_INVOICE_EMPL_INVOICE:
816 case GNC_INVOICE_EMPL_CREDIT_NOTE:
817 inv_type = _(
"Voucher");
819 case GNC_INVOICE_CUST_INVOICE:
820 case GNC_INVOICE_CUST_CREDIT_NOTE:
821 inv_type = _(
"Invoice");
824 inv_type = _(
"Undefined");
830 display_uri = gnc_doclink_get_unescape_uri (doclink_dialog->path_head,
833 gtk_list_store_append (GTK_LIST_STORE (doclink_dialog->model), &iter);
835 gtk_list_store_set (GTK_LIST_STORE (doclink_dialog->model), &iter,
838 DESC_ID, gncInvoiceGetID (invoice),
840 DISPLAY_URI, display_uri, AVAILABLE, _(
"Unknown"),
841 ITEM_POINTER, invoice, URI, uri,
843 URI_RELATIVE_PIX, (rel == TRUE ?
"emblem-default" : NULL), -1);
844 g_free (display_uri);
850 add_trans_info_to_model (
QofInstance* data, gpointer user_data)
853 Transaction *trans = GNC_TRANSACTION(data);
858 uri = gnc_doclink_convert_trans_link_uri (trans, doclink_dialog->book_ro);
865 gboolean rel = FALSE;
868 memset (datebuff, 0,
sizeof(datebuff));
872 gtk_list_store_append (GTK_LIST_STORE (doclink_dialog->model), &iter);
877 display_uri = gnc_doclink_get_unescape_uri (doclink_dialog->path_head,
880 gtk_list_store_set (GTK_LIST_STORE (doclink_dialog->model), &iter,
884 DISPLAY_URI, display_uri, AVAILABLE, _(
"Unknown"),
885 ITEM_POINTER, split, URI, uri,
887 URI_RELATIVE_PIX, (rel == TRUE ?
"emblem-default" : NULL), -1);
888 g_free (display_uri);
897 QofBook *book = gnc_get_current_book();
900 doclink_dialog->model =
901 gtk_tree_view_get_model (GTK_TREE_VIEW (doclink_dialog->view));
902 g_object_ref (G_OBJECT (doclink_dialog->model));
903 gtk_tree_view_set_model (GTK_TREE_VIEW (doclink_dialog->view), NULL);
906 gtk_list_store_clear (GTK_LIST_STORE (doclink_dialog->model));
910 add_bus_info_to_model, doclink_dialog);
912 update_total_entries (doclink_dialog);
915 gtk_tree_view_set_model (GTK_TREE_VIEW (doclink_dialog->view),
916 doclink_dialog->model);
917 g_object_unref (G_OBJECT (doclink_dialog->model));
923 QofBook *book = gnc_get_current_book();
928 doclink_dialog->model =
929 gtk_tree_view_get_model (GTK_TREE_VIEW (doclink_dialog->view));
930 g_object_ref (G_OBJECT (doclink_dialog->model));
931 gtk_tree_view_set_model (GTK_TREE_VIEW (doclink_dialog->view), NULL);
934 gtk_list_store_clear (GTK_LIST_STORE (doclink_dialog->model));
938 add_trans_info_to_model, doclink_dialog);
940 update_total_entries (doclink_dialog);
943 gtk_tree_view_set_model (GTK_TREE_VIEW (doclink_dialog->view),
944 doclink_dialog->model);
945 g_object_unref (G_OBJECT (doclink_dialog->model));
949 gnc_doclink_dialog_reload_button_cb (GtkWidget *widget, gpointer user_data)
952 gchar *path_head = gnc_doclink_get_path_head ();
954 if (g_strcmp0 (path_head, doclink_dialog->path_head) != 0)
956 g_free (doclink_dialog->path_head);
957 doclink_dialog->path_head = g_strdup (path_head);
960 gnc_doclink_set_path_head_label (doclink_dialog->path_head_label,
965 if (doclink_dialog->is_list_trans)
966 get_trans_info (doclink_dialog);
968 get_bus_info (doclink_dialog);
972 gnc_doclink_dialog_reload_check_button_cb (GtkWidget *widget,
977 gnc_doclink_dialog_reload_button_cb (widget, user_data);
978 doclink_dialog_update (doclink_dialog);
982 gnc_doclink_dialog_check_button_cb (GtkWidget *widget, gpointer user_data)
985 doclink_dialog_update (doclink_dialog);
989 gnc_doclink_dialog_close_button_cb (GtkWidget *widget, gpointer user_data)
992 gnc_close_gui_component (doclink_dialog->component_id);
996 gnc_doclink_dialog_create (GtkWindow *parent,
DoclinkDialog *doclink_dialog)
1000 GtkTreeSelection *selection;
1001 GtkTreeViewColumn *expanding_column;
1005 builder = gtk_builder_new();
1006 gnc_builder_add_from_file (builder,
"dialog-doclink.glade",
"list-store");
1007 gnc_builder_add_from_file (builder,
"dialog-doclink.glade",
1008 "linked_doc_window");
1010 window = GTK_WIDGET(gtk_builder_get_object (builder,
"linked_doc_window"));
1011 doclink_dialog->window = window;
1012 doclink_dialog->session = gnc_get_current_session();
1014 button = GTK_WIDGET(gtk_builder_get_object (builder,
"reload_button"));
1015 g_signal_connect (button,
"clicked",
1016 G_CALLBACK (gnc_doclink_dialog_reload_button_cb),
1018 button = GTK_WIDGET(gtk_builder_get_object (builder,
"reload_and_check_button"));
1019 g_signal_connect (button,
"clicked",
1020 G_CALLBACK (gnc_doclink_dialog_reload_check_button_cb),
1023 button = GTK_WIDGET(gtk_builder_get_object (builder,
"check_button"));
1024 g_signal_connect (button,
"clicked",
1025 G_CALLBACK (gnc_doclink_dialog_check_button_cb),
1027 button = GTK_WIDGET(gtk_builder_get_object (builder,
"close_button"));
1028 g_signal_connect (button,
"clicked",
1029 G_CALLBACK (gnc_doclink_dialog_close_button_cb),
1033 gtk_widget_set_name (GTK_WIDGET (window),
"gnc-id-transaction-doclinks");
1034 gnc_widget_style_context_add_class (GTK_WIDGET (window),
1035 "gnc-class-doclink");
1037 doclink_dialog->view =
1038 GTK_WIDGET (gtk_builder_get_object (builder,
"treeview"));
1039 doclink_dialog->path_head_label =
1040 GTK_WIDGET (gtk_builder_get_object (builder,
"path-head"));
1041 doclink_dialog->total_entries_label =
1042 GTK_WIDGET (gtk_builder_get_object (builder,
"total_entries_label"));
1043 doclink_dialog->path_head = gnc_doclink_get_path_head ();
1046 gnc_doclink_set_path_head_label (doclink_dialog->path_head_label, NULL, NULL);
1050 GTK_TREE_VIEW_COLUMN (gtk_builder_get_object (builder,
"doclink"));
1053 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE(gtk_tree_view_get_model(
1054 GTK_TREE_VIEW (doclink_dialog->view))),
1055 DATE_INT64, GTK_SORT_ASCENDING);
1058 gtk_tree_view_set_grid_lines (GTK_TREE_VIEW (doclink_dialog->view),
1059 gnc_tree_view_get_grid_lines_pref ());
1061 selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (doclink_dialog->view));
1062 gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
1064 g_signal_connect (doclink_dialog->window,
"destroy",
1065 G_CALLBACK (gnc_doclink_dialog_window_destroy_cb),
1068 g_signal_connect (doclink_dialog->window,
"delete-event",
1069 G_CALLBACK(gnc_doclink_dialog_window_delete_event_cb), doclink_dialog);
1071 g_signal_connect (doclink_dialog->window,
"key_press_event",
1072 G_CALLBACK (gnc_doclink_dialog_window_key_press_cb),
1076 if (doclink_dialog->is_list_trans)
1078 GObject *desc_item_tree_column = G_OBJECT(gtk_builder_get_object (builder,
"desc_item"));
1079 GObject *desc_id_tree_column = G_OBJECT(gtk_builder_get_object (builder,
"desc_id"));
1083 gtk_window_set_title (GTK_WINDOW (window), _(
"Transaction Document Links"));
1085 gtk_tree_view_column_set_visible (GTK_TREE_VIEW_COLUMN(desc_id_tree_column), FALSE);
1086 gtk_tree_view_column_set_title (GTK_TREE_VIEW_COLUMN(desc_item_tree_column), _(
"Description"));
1088 g_signal_connect (doclink_dialog->view,
"row-activated",
1089 G_CALLBACK (row_selected_trans_cb),
1090 (gpointer)doclink_dialog);
1091 get_trans_info (doclink_dialog);
1095 GtkWidget *help_label = GTK_WIDGET(gtk_builder_get_object (builder,
"help_label"));
1096 const gchar *item_string = N_(
1097 "Double click on the entry in the Id column to jump to the " 1098 "Business Item.\nDouble click on the entry in the Link column " 1099 "to open the Linked Document.\nDouble click on the entry in " 1100 "the Available column to modify the document link.");
1105 gtk_window_set_title (GTK_WINDOW (doclink_dialog->window),
1106 _(
"Business Document Links"));
1107 gtk_label_set_text (GTK_LABEL(help_label), gettext (item_string));
1109 g_signal_connect (doclink_dialog->view,
"row-activated",
1110 G_CALLBACK (row_selected_bus_cb),
1111 (gpointer)doclink_dialog);
1112 get_bus_info (doclink_dialog);
1115 gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func,
1118 g_object_unref (G_OBJECT(builder));
1120 gtk_tree_view_column_set_expand (expanding_column, TRUE);
1121 gtk_tree_view_columns_autosize (GTK_TREE_VIEW(doclink_dialog->view));
1126 close_handler (gpointer user_data)
1131 if (doclink_dialog->is_list_trans)
1132 gnc_save_window_size (GNC_PREFS_GROUP_TRANS,
1133 GTK_WINDOW (doclink_dialog->window));
1135 gnc_save_window_size (GNC_PREFS_GROUP_BUS,
1136 GTK_WINDOW (doclink_dialog->window));
1137 gtk_widget_destroy (GTK_WIDGET (doclink_dialog->window));
1142 refresh_handler (GHashTable *changes, gpointer user_data)
1149 show_handler (
const char *klass, gint component_id,
1150 gpointer user_data, gpointer iter_data)
1153 gboolean is_bus = GPOINTER_TO_INT(iter_data);
1156 if (!doclink_dialog)
1158 LEAVE(
"No data structure");
1163 if (is_bus == doclink_dialog->is_list_trans)
1166 gtk_window_present (GTK_WINDOW(doclink_dialog->window));
1172 gnc_doclink_business_dialog (GtkWindow *parent)
1177 if (gnc_forall_gui_components (DIALOG_DOCLINK_CM_CLASS,
1178 show_handler, GINT_TO_POINTER(1)))
1180 LEAVE(
"Existing dialog raised");
1185 doclink_dialog->is_list_trans = FALSE;
1187 gnc_doclink_dialog_create (parent, doclink_dialog);
1189 doclink_dialog->component_id =
1190 gnc_register_gui_component (DIALOG_DOCLINK_CM_CLASS,
1191 refresh_handler, close_handler,
1194 gnc_gui_component_set_session (doclink_dialog->component_id,
1195 doclink_dialog->session);
1197 gnc_restore_window_size (GNC_PREFS_GROUP_BUS,
1198 GTK_WINDOW(doclink_dialog->window), parent);
1199 gtk_widget_show_all (GTK_WIDGET(doclink_dialog->window));
1204 gnc_doclink_trans_dialog (GtkWindow *parent)
1209 if (gnc_forall_gui_components (DIALOG_DOCLINK_CM_CLASS,
1210 show_handler, GINT_TO_POINTER(0)))
1212 LEAVE(
"Existing dialog raised");
1216 doclink_dialog->is_list_trans = TRUE;
1218 gnc_doclink_dialog_create (parent, doclink_dialog);
1220 doclink_dialog->component_id =
1221 gnc_register_gui_component (DIALOG_DOCLINK_CM_CLASS,
1222 refresh_handler, close_handler,
1225 gnc_gui_component_set_session (doclink_dialog->component_id,
1226 doclink_dialog->session);
1228 gnc_restore_window_size (GNC_PREFS_GROUP_TRANS,
1229 GTK_WINDOW(doclink_dialog->window), parent);
1230 gtk_widget_show_all (GTK_WIDGET(doclink_dialog->window));
GncPluginPage * gnc_plugin_page_register_new(Account *account, gboolean subaccounts)
Create a new "register" plugin page, given a pointer to an account.
utility functions for the GnuCash UI
Split * xaccTransGetSplit(const Transaction *trans, int i)
Return a pointer to the indexed split in this transaction's split list.
gchar * gnc_uri_get_scheme(const gchar *uri)
Extracts the scheme from a uri.
The instance data structure for a content plugin.
gboolean xaccTransIsReadonlyByPostedDate(const Transaction *trans)
Returns TRUE if this Transaction is read-only because its posted-date is older than the "auto-readonl...
utility functions for the GnuCash UI
#define PINFO(format, args...)
Print an informational note.
gboolean gnc_uri_is_file_scheme(const gchar *scheme)
Checks if the given scheme is used to refer to a file (as opposed to a network service like a databas...
const char * xaccTransGetReadOnly(Transaction *trans)
Returns a non-NULL value if this Transaction was marked as read-only with some specific "reason" text...
#define DEBUG(format, args...)
Print a debugging message.
gchar * gnc_uri_get_path(const gchar *uri)
Extracts the path part from a uri.
Transaction * xaccSplitGetParent(const Split *split)
Returns the parent transaction of the split.
#define ENTER(format, args...)
Print a function entry debugging message.
void gnc_main_window_open_page(GncMainWindow *window, GncPluginPage *page)
Display a data plugin page in a window.
Functions for adding content to a window.
Functions providing a register page for the GnuCash UI.
Account handling public routines.
GncPluginPage * gnc_plugin_page_invoice_new(InvoiceWindow *iw)
Create a new "invoice" plugin page, given a pointer to an InvoiceWindow data structure.
time64 xaccTransRetDatePosted(const Transaction *trans)
Retrieve the posted date of the transaction.
const char * xaccTransGetDescription(const Transaction *trans)
Gets the transaction Description.
Gnome specific utility functions.
#define MAX_DATE_LENGTH
The maximum length of a string created by the date printers.
Generic api to store and retrieve preferences.
gboolean qof_book_is_readonly(const QofBook *book)
Return whether the book is read only.
Account * xaccSplitGetAccount(const Split *split)
Returns the account of this split, which was set through xaccAccountInsertSplit().
void xaccTransSetDocLink(Transaction *trans, const char *doclink)
Sets the transaction Document Link.
#define LEAVE(format, args...)
Print a function exit debugging message.
time64 gnc_time(time64 *tbuf)
get the current time
Utility functions for convert uri in separate components and back.
QofCollection * qof_book_get_collection(const QofBook *book, QofIdType entity_type)
Return The table of entities of the given type.
gint64 time64
Most systems that are currently maintained, including Microsoft Windows, BSD-derived Unixes and Linux...
void gnc_launch_doclink(GtkWindow *parent, const char *uri)
Launch the default browser and open the provided URI.
void gnc_plugin_page_register_clear_current_filter(GncPluginPage *plugin_page)
This function clears the registers current filter.
File path resolution utility functions.
API for Transactions and Splits (journal entries)
GNCSplitReg * gnc_plugin_page_register_get_gsr(GncPluginPage *plugin_page)
Get the GNCSplitReg data structure associated with this register page.
size_t qof_print_date_buff(char *buff, size_t buflen, time64 secs)
Convenience: calls through to qof_print_date_dmy_buff().