Commit fa979f8d5738b072aa0275d574206f8c9a114aff
1 parent
ac72231f
Exists in
master
and in
1 other branch
Refactoring simple file transfer dialog.
Showing
6 changed files
with
143 additions
and
18 deletions
Show diff stats
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 ()) |