diff --git a/src/dialogs/commondialog.c b/src/dialogs/commondialog.c index 9ea9886..7bde8d0 100644 --- a/src/dialogs/commondialog.c +++ b/src/dialogs/commondialog.c @@ -32,17 +32,17 @@ /*--[ Implement ]------------------------------------------------------------------------------------*/ #if GTK_CHECK_VERSION(3,12,0) -static void apply_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) +void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) { gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY); } -static void cancel_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) +void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) { gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_CANCEL); } -static GtkWidget * create_button(GtkWidget *dialog, const gchar *mnemonic, GCallback callback) +GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback) { GtkWidget * button = gtk_button_new_with_mnemonic(mnemonic); gtk_button_set_use_underline(GTK_BUTTON (button), TRUE); @@ -91,8 +91,8 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); gtk_header_bar_set_title(GTK_HEADER_BAR(header),title); - gtk_header_bar_pack_start(GTK_HEADER_BAR(header),create_button(dialog,_("_Cancel"),G_CALLBACK(cancel_clicked))); - gtk_header_bar_pack_end(GTK_HEADER_BAR(header),create_button(dialog,apply,G_CALLBACK(apply_clicked))); + gtk_header_bar_pack_start(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,_("_Cancel"),G_CALLBACK(v3270_dialog_cancel))); + gtk_header_bar_pack_end(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,apply,G_CALLBACK(v3270_dialog_apply))); } else { diff --git a/src/dialogs/transfer.c b/src/dialogs/transfer.c index a172835..78f045f 100644 --- a/src/dialogs/transfer.c +++ b/src/dialogs/transfer.c @@ -51,12 +51,62 @@ static void header_on_state_changed(GtkWidget *worker, guint state, const gchar static void transfer_success(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) { debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); + gtk_dialog_response(dialog,GTK_RESPONSE_OK); } +/* static void transfer_failed(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) { debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); +} +*/ + +static void save_activity_clicked(GtkWidget *button, GObject *activity) +{ + debug("%s",__FUNCTION__); + + g_autofree gchar * filename = v3270_select_file( + gtk_widget_get_toplevel(button), + _("Save transfer activity to file"), + _("Save"), + GTK_FILE_CHOOSER_ACTION_SAVE, + NULL, + N_("XML file"), "*.xml", + NULL ); + + if(filename) + { + GError * error = NULL; + GString * str = g_string_new("\n\n"); + + v3270_ft_activity_xml_encode(activity,str); + g_string_append(str,"\n"); + + g_autofree gchar * text = g_string_free(str,FALSE); + + debug("Saving %s",filename); + + if(!g_file_set_contents(filename,text,-1,&error)) { + + GtkWidget *popup = gtk_message_dialog_new_with_markup( + GTK_WINDOW(gtk_widget_get_toplevel(button)), + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, + _("Can't save %s"),filename + ); + + gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); + + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); + g_error_free(error); + + gtk_dialog_run(GTK_DIALOG(popup)); + gtk_widget_destroy(popup); + + } + + } } @@ -80,10 +130,15 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt v3270_ft_worker_set_session(worker,v3270_get_session(widget)); v3270_ft_worker_set_activity(worker,activity); + // Create save button + GtkWidget * save_button = NULL; + // Create dialog + const gchar *title = (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" ); + gboolean use_header = FALSE; + #if GTK_CHECK_VERSION(3,12,0) - gboolean use_header; g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); GtkWidget * dialog = @@ -93,36 +148,69 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt NULL )); - gtk_window_set_title(GTK_WINDOW(dialog),(options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" )); - if(use_header) { - gtk_header_bar_set_subtitle(GTK_HEADER_BAR(gtk_dialog_get_header_bar(dialog)),_("Starting transfer")); + GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); + gtk_header_bar_set_title(GTK_HEADER_BAR(header),title); + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header),_("Starting transfer")); + + save_button = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_header_bar_pack_start(GTK_HEADER_BAR(header),save_button); + g_signal_connect(worker,"ft-state-changed",G_CALLBACK(header_on_state_changed), dialog); + + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18); + + } + else + { + gtk_window_set_title(GTK_WINDOW(dialog), title); + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); + + gtk_container_set_border_width(GTK_CONTAINER(worker),18); + + gtk_dialog_add_buttons( + GTK_DIALOG (dialog), + _("_Close"), GTK_RESPONSE_CANCEL, + NULL + ); + } #else - GtkWidget * dialog = gtk_dialog_new_with_buttons( - (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" ), - GTK_WINDOW(gtk_widget_get_toplevel(widget)), - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, - _( "_Close" ), GTK_RESPONSE_CANCEL, + GtkWidget * dialog = gtk_dialog_new(); + + gtk_window_set_title(GTK_WINDOW(dialog), title); + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); + + gtk_box_set_spacing( + GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), + 18 + ); + + gtk_dialog_add_buttons( + GTK_DIALOG (dialog), + _("_Close"), GTK_RESPONSE_CANCEL, NULL ); #endif // GTK(3,12,0) + if(save_button) + { + gtk_widget_set_tooltip_markup(save_button,_("Save transfer information to file")); + g_signal_connect(save_button,"clicked",G_CALLBACK(save_activity_clicked),activity); + } + gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget))); gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18); - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),worker,TRUE,TRUE,2); // Start transfer - g_signal_connect(worker,"failed",G_CALLBACK(transfer_failed), dialog); + // g_signal_connect(worker,"failed",G_CALLBACK(transfer_failed), dialog); g_signal_connect(worker,"success",G_CALLBACK(transfer_success), dialog); v3270_ft_worker_start(worker); diff --git a/src/filetransfer/activity.c b/src/filetransfer/activity.c index 8bd5d41..a5f2df6 100644 --- a/src/filetransfer/activity.c +++ b/src/filetransfer/activity.c @@ -350,3 +350,33 @@ ); } + + LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str) + { + g_return_if_fail(G_IS_V3270_FT_ACTIVITY(object)); + + size_t ix; + V3270FTActivity * activity = G_V3270_FT_ACTIVITY(object); + + g_string_append_printf( + str, + "\t\n\t\t\n\t\t\n", + activity->file.local, + activity->file.remote + ); + + for(ix = 0; v3270_activity_list_options[ix].name; ix++) + { + if((activity->options & v3270_activity_list_options[ix].option) == v3270_activity_list_options[ix].option) + g_string_append_printf(str,"\t\t\n"); + + } + diff --git a/src/filetransfer/activitylist.c b/src/filetransfer/activitylist.c index 74a1250..127f58e 100644 --- a/src/filetransfer/activitylist.c +++ b/src/filetransfer/activitylist.c @@ -295,7 +295,6 @@ V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget); GString * str = g_string_new("\n\n"); GError * error = NULL; - size_t ix; debug("%s",__FUNCTION__); @@ -310,6 +309,9 @@ GObject * activity = NULL; gtk_tree_model_get(model, &iter, 0, &activity, -1); + v3270_ft_activity_xml_encode(activity,str); + + /* if(activity) { g_string_append(str,"\t\n"); @@ -331,6 +333,7 @@ g_string_append(str,"\t\n"); } + */ } while(gtk_tree_model_iter_next(model,&iter)); diff --git a/src/include/internals.h b/src/include/internals.h index f077518..4c98da9 100644 --- a/src/include/internals.h +++ b/src/include/internals.h @@ -56,6 +56,9 @@ #if GTK_CHECK_VERSION(3,12,0) G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget); + G_GNUC_INTERNAL void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog); + G_GNUC_INTERNAL void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog); + G_GNUC_INTERNAL GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback); #endif // ! GTK 3.12 // Activity list widget. diff --git a/src/include/v3270/filetransfer.h b/src/include/v3270/filetransfer.h index 0bcb267..4361de7 100644 --- a/src/include/v3270/filetransfer.h +++ b/src/include/v3270/filetransfer.h @@ -128,6 +128,7 @@ LIB3270_EXPORT void v3270_ft_activity_set_options(GObject * object, LIB3270_FT_OPTION options); LIB3270_EXPORT void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value); LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message); + LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str); // FT Dialog widget #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ()) -- libgit2 0.21.2