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 32 /*--[ Implement ]------------------------------------------------------------------------------------*/
33 33  
34 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 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 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 47 GtkWidget * button = gtk_button_new_with_mnemonic(mnemonic);
48 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 91 GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog));
92 92  
93 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 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 51 static void transfer_success(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog)
52 52 {
53 53 debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description);
  54 + gtk_dialog_response(dialog,GTK_RESPONSE_OK);
54 55  
55 56 }
56 57  
  58 +/*
57 59 static void transfer_failed(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog)
58 60 {
59 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 130 v3270_ft_worker_set_session(worker,v3270_get_session(widget));
81 131 v3270_ft_worker_set_activity(worker,activity);
82 132  
  133 + // Create save button
  134 + GtkWidget * save_button = NULL;
  135 +
83 136 // Create dialog
  137 + const gchar *title = (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" );
  138 + gboolean use_header = FALSE;
  139 +
84 140 #if GTK_CHECK_VERSION(3,12,0)
85 141  
86   - gboolean use_header;
87 142 g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
88 143  
89 144 GtkWidget * dialog =
... ... @@ -93,36 +148,69 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt
93 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 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 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 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 195 NULL
112 196 );
113 197  
114 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 206 gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget)));
117 207 gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
118 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 210 gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),worker,TRUE,TRUE,2);
123 211  
124 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 214 g_signal_connect(worker,"success",G_CALLBACK(transfer_success), dialog);
127 215 v3270_ft_worker_start(worker);
128 216  
... ...
src/filetransfer/activity.c
... ... @@ -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 295 V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget);
296 296 GString * str = g_string_new("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<filelist>\n");
297 297 GError * error = NULL;
298   - size_t ix;
299 298  
300 299 debug("%s",__FUNCTION__);
301 300  
... ... @@ -310,6 +309,9 @@
310 309 GObject * activity = NULL;
311 310 gtk_tree_model_get(model, &iter, 0, &activity, -1);
312 311  
  312 + v3270_ft_activity_xml_encode(activity,str);
  313 +
  314 + /*
313 315 if(activity)
314 316 {
315 317 g_string_append(str,"\t<entry>\n");
... ... @@ -331,6 +333,7 @@
331 333  
332 334 g_string_append(str,"\t</entry>\n");
333 335 }
  336 + */
334 337  
335 338 }
336 339 while(gtk_tree_model_iter_next(model,&iter));
... ...
src/include/internals.h
... ... @@ -56,6 +56,9 @@
56 56  
57 57 #if GTK_CHECK_VERSION(3,12,0)
58 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 62 #endif // ! GTK 3.12
60 63  
61 64 // Activity list widget.
... ...
src/include/v3270/filetransfer.h
... ... @@ -128,6 +128,7 @@
128 128 LIB3270_EXPORT void v3270_ft_activity_set_options(GObject * object, LIB3270_FT_OPTION options);
129 129 LIB3270_EXPORT void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value);
130 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 133 // FT Dialog widget
133 134 #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ())
... ...