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 55 GtkDialog parent;
56 56 GtkWidget * filename[FILENAME_COUNT]; /**< Filenames for the transfer */
57 57 GtkWidget * units; /**< Units frame box */
  58 + GtkWidget * ready; /**< Send/Save button */
58 59 GtkSpinButton * value[VALUE_COUNT];
  60 + gboolean local; /**< TRUE if local filename is ok */
  61 + gboolean remote; /**< TRUE if remote filename is ok */
59 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 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 291 GtkWidget * v3270_ft_dialog_new(GtkWidget *parent, LIB3270_FT_OPTION options)
236 292 {
237 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 330 gtk_widget_set_tooltip_text(GTK_WIDGET(browse),_("Select file"));
275 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 342 if(options & LIB3270_FT_OPTION_RECEIVE)
278 343 {
279 344 // It's receiving file first host filename, then local filename
280 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 350 gtk_grid_attach(grid,label[FILENAME_HOST],0,0,1,1);
283 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 413 gtk_grid_attach(grid,label[FILENAME_LOCAL],0,0,1,1);
346 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 418 gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],1,0,3,1);
349 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 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 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 591 gtk_widget_show_all(gtk_dialog_get_content_area(GTK_DIALOG(dialog)));
527 592  
528 593 return GTK_WIDGET(dialog);
... ...
src/pw3270/ft/testprogram.c
... ... @@ -34,24 +34,22 @@
34 34  
35 35 int main (int argc, char *argv[])
36 36 {
37   - GtkWidget *win;
  37 +// GtkWidget *win;
38 38  
39 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 54 return 0;
57 55  
... ...