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 | 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 | ... | ... |