Commit fa979f8d5738b072aa0275d574206f8c9a114aff

Authored by Perry Werneck
1 parent ac72231f
Exists in master and in 1 other branch develop

Refactoring simple file transfer dialog.

src/dialogs/commondialog.c
@@ -32,17 +32,17 @@ @@ -32,17 +32,17 @@
32 /*--[ Implement ]------------------------------------------------------------------------------------*/ 32 /*--[ Implement ]------------------------------------------------------------------------------------*/
33 33
34 #if GTK_CHECK_VERSION(3,12,0) 34 #if GTK_CHECK_VERSION(3,12,0)
35 -static void apply_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) 35 +void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog)
36 { 36 {
37 gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY); 37 gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY);
38 } 38 }
39 39
40 -static void cancel_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) 40 +void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog)
41 { 41 {
42 gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_CANCEL); 42 gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_CANCEL);
43 } 43 }
44 44
45 -static GtkWidget * create_button(GtkWidget *dialog, const gchar *mnemonic, GCallback callback) 45 +GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback)
46 { 46 {
47 GtkWidget * button = gtk_button_new_with_mnemonic(mnemonic); 47 GtkWidget * button = gtk_button_new_with_mnemonic(mnemonic);
48 gtk_button_set_use_underline(GTK_BUTTON (button), TRUE); 48 gtk_button_set_use_underline(GTK_BUTTON (button), TRUE);
@@ -91,8 +91,8 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl @@ -91,8 +91,8 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl
91 GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); 91 GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
92 92
93 gtk_header_bar_set_title(GTK_HEADER_BAR(header),title); 93 gtk_header_bar_set_title(GTK_HEADER_BAR(header),title);
94 - gtk_header_bar_pack_start(GTK_HEADER_BAR(header),create_button(dialog,_("_Cancel"),G_CALLBACK(cancel_clicked)));  
95 - gtk_header_bar_pack_end(GTK_HEADER_BAR(header),create_button(dialog,apply,G_CALLBACK(apply_clicked))); 94 + gtk_header_bar_pack_start(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,_("_Cancel"),G_CALLBACK(v3270_dialog_cancel)));
  95 + gtk_header_bar_pack_end(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,apply,G_CALLBACK(v3270_dialog_apply)));
96 } 96 }
97 else 97 else
98 { 98 {
src/dialogs/transfer.c
@@ -51,12 +51,62 @@ static void header_on_state_changed(GtkWidget *worker, guint state, const gchar @@ -51,12 +51,62 @@ static void header_on_state_changed(GtkWidget *worker, guint state, const gchar
51 static void transfer_success(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) 51 static void transfer_success(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog)
52 { 52 {
53 debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); 53 debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description);
  54 + gtk_dialog_response(dialog,GTK_RESPONSE_OK);
54 55
55 } 56 }
56 57
  58 +/*
57 static void transfer_failed(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) 59 static void transfer_failed(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog)
58 { 60 {
59 debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); 61 debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description);
  62 +}
  63 +*/
  64 +
  65 +static void save_activity_clicked(GtkWidget *button, GObject *activity)
  66 +{
  67 + debug("%s",__FUNCTION__);
  68 +
  69 + g_autofree gchar * filename = v3270_select_file(
  70 + gtk_widget_get_toplevel(button),
  71 + _("Save transfer activity to file"),
  72 + _("Save"),
  73 + GTK_FILE_CHOOSER_ACTION_SAVE,
  74 + NULL,
  75 + N_("XML file"), "*.xml",
  76 + NULL );
  77 +
  78 + if(filename)
  79 + {
  80 + GError * error = NULL;
  81 + GString * str = g_string_new("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<filelist>\n");
  82 +
  83 + v3270_ft_activity_xml_encode(activity,str);
  84 + g_string_append(str,"</filelist>\n");
  85 +
  86 + g_autofree gchar * text = g_string_free(str,FALSE);
  87 +
  88 + debug("Saving %s",filename);
  89 +
  90 + if(!g_file_set_contents(filename,text,-1,&error)) {
  91 +
  92 + GtkWidget *popup = gtk_message_dialog_new_with_markup(
  93 + GTK_WINDOW(gtk_widget_get_toplevel(button)),
  94 + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
  95 + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE,
  96 + _("Can't save %s"),filename
  97 + );
  98 +
  99 + gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed"));
  100 +
  101 + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message);
  102 + g_error_free(error);
  103 +
  104 + gtk_dialog_run(GTK_DIALOG(popup));
  105 + gtk_widget_destroy(popup);
  106 +
  107 + }
  108 +
  109 + }
60 110
61 } 111 }
62 112
@@ -80,10 +130,15 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt @@ -80,10 +130,15 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt
80 v3270_ft_worker_set_session(worker,v3270_get_session(widget)); 130 v3270_ft_worker_set_session(worker,v3270_get_session(widget));
81 v3270_ft_worker_set_activity(worker,activity); 131 v3270_ft_worker_set_activity(worker,activity);
82 132
  133 + // Create save button
  134 + GtkWidget * save_button = NULL;
  135 +
83 // Create dialog 136 // Create dialog
  137 + const gchar *title = (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" );
  138 + gboolean use_header = FALSE;
  139 +
84 #if GTK_CHECK_VERSION(3,12,0) 140 #if GTK_CHECK_VERSION(3,12,0)
85 141
86 - gboolean use_header;  
87 g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); 142 g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
88 143
89 GtkWidget * dialog = 144 GtkWidget * dialog =
@@ -93,36 +148,69 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt @@ -93,36 +148,69 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt
93 NULL 148 NULL
94 )); 149 ));
95 150
96 - gtk_window_set_title(GTK_WINDOW(dialog),(options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" ));  
97 -  
98 if(use_header) 151 if(use_header)
99 { 152 {
100 - gtk_header_bar_set_subtitle(GTK_HEADER_BAR(gtk_dialog_get_header_bar(dialog)),_("Starting transfer")); 153 + GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
  154 + gtk_header_bar_set_title(GTK_HEADER_BAR(header),title);
  155 + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header),_("Starting transfer"));
  156 +
  157 + save_button = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR);
  158 + gtk_header_bar_pack_start(GTK_HEADER_BAR(header),save_button);
  159 +
101 g_signal_connect(worker,"ft-state-changed",G_CALLBACK(header_on_state_changed), dialog); 160 g_signal_connect(worker,"ft-state-changed",G_CALLBACK(header_on_state_changed), dialog);
  161 +
  162 + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18);
  163 +
  164 + }
  165 + else
  166 + {
  167 + gtk_window_set_title(GTK_WINDOW(dialog), title);
  168 + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
  169 +
  170 + gtk_container_set_border_width(GTK_CONTAINER(worker),18);
  171 +
  172 + gtk_dialog_add_buttons(
  173 + GTK_DIALOG (dialog),
  174 + _("_Close"), GTK_RESPONSE_CANCEL,
  175 + NULL
  176 + );
  177 +
102 } 178 }
103 179
104 #else 180 #else
105 181
106 - GtkWidget * dialog = gtk_dialog_new_with_buttons(  
107 - (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" ),  
108 - GTK_WINDOW(gtk_widget_get_toplevel(widget)),  
109 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
110 - _( "_Close" ), GTK_RESPONSE_CANCEL, 182 + GtkWidget * dialog = gtk_dialog_new();
  183 +
  184 + gtk_window_set_title(GTK_WINDOW(dialog), title);
  185 + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE);
  186 +
  187 + gtk_box_set_spacing(
  188 + GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),
  189 + 18
  190 + );
  191 +
  192 + gtk_dialog_add_buttons(
  193 + GTK_DIALOG (dialog),
  194 + _("_Close"), GTK_RESPONSE_CANCEL,
111 NULL 195 NULL
112 ); 196 );
113 197
114 #endif // GTK(3,12,0) 198 #endif // GTK(3,12,0)
115 199
  200 + if(save_button)
  201 + {
  202 + gtk_widget_set_tooltip_markup(save_button,_("Save transfer information to file"));
  203 + g_signal_connect(save_button,"clicked",G_CALLBACK(save_activity_clicked),activity);
  204 + }
  205 +
116 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget))); 206 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget)));
117 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); 207 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
118 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); 208 gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE);
119 209
120 - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18);  
121 -  
122 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),worker,TRUE,TRUE,2); 210 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),worker,TRUE,TRUE,2);
123 211
124 // Start transfer 212 // Start transfer
125 - g_signal_connect(worker,"failed",G_CALLBACK(transfer_failed), dialog); 213 + // g_signal_connect(worker,"failed",G_CALLBACK(transfer_failed), dialog);
126 g_signal_connect(worker,"success",G_CALLBACK(transfer_success), dialog); 214 g_signal_connect(worker,"success",G_CALLBACK(transfer_success), dialog);
127 v3270_ft_worker_start(worker); 215 v3270_ft_worker_start(worker);
128 216
src/filetransfer/activity.c
@@ -350,3 +350,33 @@ @@ -350,3 +350,33 @@
350 ); 350 );
351 351
352 } 352 }
  353 +
  354 + LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str)
  355 + {
  356 + g_return_if_fail(G_IS_V3270_FT_ACTIVITY(object));
  357 +
  358 + size_t ix;
  359 + V3270FTActivity * activity = G_V3270_FT_ACTIVITY(object);
  360 +
  361 + g_string_append_printf(
  362 + str,
  363 + "\t<entry>\n\t\t<file type=\'local\' path=\'%s\' />\n\t\t<file type=\'remote\' path=\'%s\' />\n",
  364 + activity->file.local,
  365 + activity->file.remote
  366 + );
  367 +
  368 + for(ix = 0; v3270_activity_list_options[ix].name; ix++)
  369 + {
  370 + if((activity->options & v3270_activity_list_options[ix].option) == v3270_activity_list_options[ix].option)
  371 + g_string_append_printf(str,"\t\t<option name=\'%s\' value=\'%s\' />\n",v3270_activity_list_options[ix].name,v3270_activity_list_options[ix].value);
  372 + }
  373 +
  374 + for(ix=0;ix<LIB3270_FT_VALUE_COUNT;ix++)
  375 + {
  376 + g_string_append_printf(str,"\t\t<parameter name=\"%s\" value=\"%u\"/>\n",ft_value[ix].name,activity->values[ix]);
  377 + }
  378 +
  379 + g_string_append(str,"\t</entry>\n");
  380 +
  381 + }
  382 +
src/filetransfer/activitylist.c
@@ -295,7 +295,6 @@ @@ -295,7 +295,6 @@
295 V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget); 295 V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget);
296 GString * str = g_string_new("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<filelist>\n"); 296 GString * str = g_string_new("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<filelist>\n");
297 GError * error = NULL; 297 GError * error = NULL;
298 - size_t ix;  
299 298
300 debug("%s",__FUNCTION__); 299 debug("%s",__FUNCTION__);
301 300
@@ -310,6 +309,9 @@ @@ -310,6 +309,9 @@
310 GObject * activity = NULL; 309 GObject * activity = NULL;
311 gtk_tree_model_get(model, &iter, 0, &activity, -1); 310 gtk_tree_model_get(model, &iter, 0, &activity, -1);
312 311
  312 + v3270_ft_activity_xml_encode(activity,str);
  313 +
  314 + /*
313 if(activity) 315 if(activity)
314 { 316 {
315 g_string_append(str,"\t<entry>\n"); 317 g_string_append(str,"\t<entry>\n");
@@ -331,6 +333,7 @@ @@ -331,6 +333,7 @@
331 333
332 g_string_append(str,"\t</entry>\n"); 334 g_string_append(str,"\t</entry>\n");
333 } 335 }
  336 + */
334 337
335 } 338 }
336 while(gtk_tree_model_iter_next(model,&iter)); 339 while(gtk_tree_model_iter_next(model,&iter));
src/include/internals.h
@@ -56,6 +56,9 @@ @@ -56,6 +56,9 @@
56 56
57 #if GTK_CHECK_VERSION(3,12,0) 57 #if GTK_CHECK_VERSION(3,12,0)
58 G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget); 58 G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget);
  59 + G_GNUC_INTERNAL void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog);
  60 + G_GNUC_INTERNAL void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog);
  61 + G_GNUC_INTERNAL GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback);
59 #endif // ! GTK 3.12 62 #endif // ! GTK 3.12
60 63
61 // Activity list widget. 64 // Activity list widget.
src/include/v3270/filetransfer.h
@@ -128,6 +128,7 @@ @@ -128,6 +128,7 @@
128 LIB3270_EXPORT void v3270_ft_activity_set_options(GObject * object, LIB3270_FT_OPTION options); 128 LIB3270_EXPORT void v3270_ft_activity_set_options(GObject * object, LIB3270_FT_OPTION options);
129 LIB3270_EXPORT void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value); 129 LIB3270_EXPORT void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value);
130 LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message); 130 LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message);
  131 + LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str);
131 132
132 // FT Dialog widget 133 // FT Dialog widget
133 #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ()) 134 #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ())