Commit c483b7cea9ddff44585d76ca154e7a5838d9ef3c

Authored by perry.werneck@gmail.com
1 parent 5a0a1092

Implementando diálogo de transferência de arquivos

src/pw3270/ft/ftdialog.c
@@ -55,7 +55,10 @@ @@ -55,7 +55,10 @@
55 GtkDialog parent; 55 GtkDialog parent;
56 GtkWidget * filename[FILENAME_COUNT]; /**< Filenames for the transfer */ 56 GtkWidget * filename[FILENAME_COUNT]; /**< Filenames for the transfer */
57 GtkWidget * units; /**< Units frame box */ 57 GtkWidget * units; /**< Units frame box */
  58 + GtkWidget * ready; /**< Send/Save button */
58 GtkSpinButton * value[VALUE_COUNT]; 59 GtkSpinButton * value[VALUE_COUNT];
  60 + gboolean local; /**< TRUE if local filename is ok */
  61 + gboolean remote; /**< TRUE if remote filename is ok */
59 LIB3270_FT_OPTION options; 62 LIB3270_FT_OPTION options;
60 }; 63 };
61 64
@@ -232,6 +235,59 @@ static GtkWidget * ftradio_new(v3270FTD *dialog, const gchar *title, const gchar @@ -232,6 +235,59 @@ static GtkWidget * ftradio_new(v3270FTD *dialog, const gchar *title, const gchar
232 return GTK_WIDGET(frame); 235 return GTK_WIDGET(frame);
233 } 236 }
234 237
  238 +static void test_remote_file(GtkEditable *editable, v3270FTD *dialog)
  239 +{
  240 +#if GTK_CHECK_VERSION(3,2,0)
  241 + if(!gtk_entry_get_text_length(GTK_ENTRY(dialog->filename[FILENAME_LOCAL])))
  242 + {
  243 + gchar *basename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(editable)));
  244 + gchar *filename = g_build_filename(g_get_user_special_dir(G_USER_DIRECTORY_DOCUMENTS),basename,NULL);
  245 + gtk_entry_set_placeholder_text(GTK_ENTRY(dialog->filename[FILENAME_LOCAL]),filename);
  246 + g_free(filename);
  247 + g_free(basename);
  248 + }
  249 +#endif // GTK(3,2)
  250 +
  251 + dialog->remote = gtk_entry_get_text_length(GTK_ENTRY(dialog->filename[FILENAME_HOST])) > 0;
  252 + gtk_widget_set_sensitive(dialog->ready,dialog->local && dialog->remote);
  253 +
  254 +}
  255 +
  256 +static void test_file_exists(GtkEditable *editable, v3270FTD *dialog)
  257 +{
  258 + const gchar *filename = gtk_entry_get_text(GTK_ENTRY(dialog->filename[FILENAME_LOCAL]));
  259 + dialog->local = g_file_test(filename,G_FILE_TEST_EXISTS);
  260 +
  261 +#if GTK_CHECK_VERSION(3,2,0)
  262 + if(dialog->local && !gtk_entry_get_text_length(GTK_ENTRY(dialog->filename[FILENAME_HOST])))
  263 + {
  264 + gchar *basename = g_path_get_basename(gtk_entry_get_text(GTK_ENTRY(editable)));
  265 + gtk_entry_set_placeholder_text(GTK_ENTRY(dialog->filename[FILENAME_HOST]),basename);
  266 + g_free(basename);
  267 + }
  268 +#endif // GTK(3,2)
  269 +
  270 + gtk_widget_set_sensitive(dialog->ready,dialog->local && dialog->remote);
  271 +
  272 +}
  273 +
  274 +static void test_path_exists(GtkEditable *editable, v3270FTD *dialog)
  275 +{
  276 + const gchar *filename = gtk_entry_get_text(GTK_ENTRY(dialog->filename[FILENAME_LOCAL]));
  277 +
  278 + if(!*filename)
  279 + {
  280 + dialog->local = FALSE;
  281 + }
  282 + else
  283 + {
  284 + gchar *dirname = g_path_get_dirname(filename);
  285 + dialog->local = g_file_test(dirname,G_FILE_TEST_IS_DIR);
  286 + g_free(dirname);
  287 +
  288 + }
  289 +}
  290 +
235 GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options) 291 GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options)
236 { 292 {
237 v3270FTD *dialog = g_object_new(GTK_TYPE_V3270FTD, NULL); 293 v3270FTD *dialog = g_object_new(GTK_TYPE_V3270FTD, NULL);
@@ -274,11 +330,23 @@ GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options) @@ -274,11 +330,23 @@ GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options)
274 gtk_widget_set_tooltip_text(GTK_WIDGET(browse),_("Select file")); 330 gtk_widget_set_tooltip_text(GTK_WIDGET(browse),_("Select file"));
275 g_signal_connect(G_OBJECT(browse),"clicked",G_CALLBACK(browse_file),dialog); 331 g_signal_connect(G_OBJECT(browse),"clicked",G_CALLBACK(browse_file),dialog);
276 332
  333 + gtk_dialog_add_button(GTK_DIALOG(dialog),_( "_Cancel" ), GTK_RESPONSE_CANCEL);
  334 +
  335 + dialog->ready = gtk_dialog_add_button(GTK_DIALOG(dialog),
  336 + (dialog->options & LIB3270_FT_OPTION_RECEIVE) != 0 ? _( "_Send") : _( "_Save" ),
  337 + GTK_RESPONSE_ACCEPT);
  338 +
  339 + gtk_widget_set_sensitive(dialog->ready,FALSE);
  340 + g_signal_connect(G_OBJECT(dialog->filename[FILENAME_HOST]),"changed",G_CALLBACK(test_remote_file),dialog);
  341 +
277 if(options & LIB3270_FT_OPTION_RECEIVE) 342 if(options & LIB3270_FT_OPTION_RECEIVE)
278 { 343 {
279 // It's receiving file first host filename, then local filename 344 // It's receiving file first host filename, then local filename
280 gtk_window_set_title(GTK_WINDOW(dialog),_( "Receive file from host" )); 345 gtk_window_set_title(GTK_WINDOW(dialog),_( "Receive file from host" ));
281 346
  347 + g_signal_connect(G_OBJECT(dialog->filename[FILENAME_LOCAL]),"changed",G_CALLBACK(test_path_exists),dialog);
  348 +
  349 +
282 gtk_grid_attach(grid,label[FILENAME_HOST],0,0,1,1); 350 gtk_grid_attach(grid,label[FILENAME_HOST],0,0,1,1);
283 gtk_grid_attach(grid,label[FILENAME_LOCAL],0,1,1,1); 351 gtk_grid_attach(grid,label[FILENAME_LOCAL],0,1,1,1);
284 352
@@ -345,6 +413,8 @@ GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options) @@ -345,6 +413,8 @@ GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options)
345 gtk_grid_attach(grid,label[FILENAME_LOCAL],0,0,1,1); 413 gtk_grid_attach(grid,label[FILENAME_LOCAL],0,0,1,1);
346 gtk_grid_attach(grid,label[FILENAME_HOST],0,1,1,1); 414 gtk_grid_attach(grid,label[FILENAME_HOST],0,1,1,1);
347 415
  416 + g_signal_connect(G_OBJECT(dialog->filename[FILENAME_LOCAL]),"changed",G_CALLBACK(test_file_exists),dialog);
  417 +
348 gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],1,0,3,1); 418 gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],1,0,3,1);
349 gtk_grid_attach(grid,GTK_WIDGET(browse),5,0,1,1); 419 gtk_grid_attach(grid,GTK_WIDGET(browse),5,0,1,1);
350 420
@@ -518,11 +588,6 @@ GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options) @@ -518,11 +588,6 @@ GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options)
518 gtk_widget_set_tooltip_text(GTK_WIDGET(dialog->value[VALUE_DFT]),_( "Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them.")); 588 gtk_widget_set_tooltip_text(GTK_WIDGET(dialog->value[VALUE_DFT]),_( "Buffer size for DFT-mode transfers. Can range from 256 to 32768. Larger values give better performance, but some hosts may not be able to support them."));
519 gtk_spin_button_set_value(dialog->value[VALUE_DFT],4096); 589 gtk_spin_button_set_value(dialog->value[VALUE_DFT],4096);
520 590
521 - gtk_dialog_add_buttons(GTK_DIALOG(dialog),  
522 - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,  
523 - (options & LIB3270_FT_OPTION_RECEIVE) != 0 ? GTK_STOCK_SAVE : GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,  
524 - NULL);  
525 -  
526 gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(dialog))); 591 gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(dialog)));
527 592
528 return GTK_WIDGET(dialog); 593 return GTK_WIDGET(dialog);
src/pw3270/ft/testprogram.c
@@ -34,24 +34,22 @@ @@ -34,24 +34,22 @@
34 34
35 int main (int argc, char *argv[]) 35 int main (int argc, char *argv[])
36 { 36 {
37 - GtkWidget *win; 37 +// GtkWidget *win;
38 38
39 gtk_init (&argc, &argv); 39 gtk_init (&argc, &argv);
40 40
41 - /*  
42 -// win = v3270_ft_dialog_new(LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII);  
43 - win = v3270_ft_dialog_new(LIB3270_FT_OPTION_SEND|LIB3270_FT_OPTION_REMAP);  
44 - v3270_ft_dialog_set_tso(win,TRUE);  
45 - */ 41 +// gtk_dialog_run(GTK_DIALOG(v3270_ft_dialog_new(NULL,LIB3270_FT_OPTION_SEND|LIB3270_FT_OPTION_REMAP)));
  42 + gtk_dialog_run(GTK_DIALOG(v3270_ft_dialog_new(NULL,LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_REMAP)));
46 43
47 - win = gtk_window_new(GTK_WINDOW_TOPLEVEL);  
48 - gtk_container_add(GTK_CONTAINER(win),v3270_ft_progress_new());  
49 44
  45 +// v3270_ft_dialog_set_tso(win,TRUE);
50 46
51 - gtk_widget_show_all(win);  
52 - gtk_main (); 47 +// win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
  48 +// gtk_container_add(GTK_CONTAINER(win),v3270_ft_progress_new());
53 49
54 - gtk_dialog_run(GTK_DIALOG(win)); 50 +
  51 +// gtk_widget_show_all(win);
  52 +// gtk_main ();
55 53
56 return 0; 54 return 0;
57 55