Commit c483b7cea9ddff44585d76ca154e7a5838d9ef3c
1 parent
5a0a1092
Exists in
master
and in
5 other branches
Implementando diálogo de transferência de arquivos
Showing
2 changed files
with
79 additions
and
16 deletions
Show diff stats
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 |