Commit 25832dbabcd362690375d5243ff4194e386c5001

Authored by perry.werneck@gmail.com
1 parent 7f24770a

Atualizações no diálogo de transferência de arquivos

Showing 1 changed file with 69 additions and 41 deletions   Show diff stats
src/pw3270/filetransfer.c
@@ -44,6 +44,7 @@ @@ -44,6 +44,7 @@
44 GtkWidget * dialog; 44 GtkWidget * dialog;
45 GtkEntry * file[2]; 45 GtkEntry * file[2];
46 GtkEntry * parm[5]; 46 GtkEntry * parm[5];
  47 + GtkWidget * ready;
47 }; 48 };
48 49
49 struct ftoption 50 struct ftoption
@@ -81,10 +82,14 @@ static void error_dialog(GtkWidget *widget, const gchar *title, const gchar *msg @@ -81,10 +82,14 @@ static void error_dialog(GtkWidget *widget, const gchar *title, const gchar *msg
81 gtk_widget_destroy(popup); 82 gtk_widget_destroy(popup);
82 } 83 }
83 84
84 -static void begin_ft_session(GtkAction *action, GtkWidget *widget, LIB3270_FT_OPTION opt) 85 +static gchar * get_attribute(GObject *action, struct ftdialog *dlg, const gchar *name)
85 { 86 {
86 - // Create file-transfer options dialog 87 + gchar *val = g_object_get_data(action,name);
87 88
  89 + if(val)
  90 + return g_strdup(val);
  91 +
  92 + return get_string_from_config(dlg->name,name,"");
88 } 93 }
89 94
90 static void browse_file(GtkButton *button,struct ftdialog *dlg) 95 static void browse_file(GtkButton *button,struct ftdialog *dlg)
@@ -117,6 +122,38 @@ static void browse_file(GtkButton *button,struct ftdialog *dlg) @@ -117,6 +122,38 @@ static void browse_file(GtkButton *button,struct ftdialog *dlg)
117 122
118 } 123 }
119 124
  125 +static gboolean is_dialog_ok(GtkEditable *editable, struct ftdialog *dlg)
  126 +{
  127 + const gchar *local = gtk_entry_get_text(GTK_ENTRY(dlg->file[0]));
  128 + const gchar *remote = gtk_entry_get_text(GTK_ENTRY(dlg->file[1]));
  129 + int f;
  130 +
  131 + if(!(*local && *remote))
  132 + return FALSE;
  133 +
  134 + if( (dlg->option&LIB3270_FT_OPTION_RECEIVE) == 0 && !g_file_test(local,G_FILE_TEST_EXISTS))
  135 + return FALSE;
  136 +
  137 + for(f=0;f<5;f++)
  138 + {
  139 + const gchar *val = gtk_entry_get_text(GTK_ENTRY(dlg->parm[f]));
  140 +
  141 + while(*val)
  142 + {
  143 + if(*val < '0' || *val > '9')
  144 + return FALSE;
  145 + val++;
  146 + }
  147 + }
  148 +
  149 + return TRUE;
  150 +}
  151 +
  152 +static void check_entry(GtkEditable *editable, struct ftdialog *dlg)
  153 +{
  154 + gtk_widget_set_sensitive(dlg->ready,is_dialog_ok(editable,dlg));
  155 +}
  156 +
120 static void add_file_fields(GObject *action, struct ftdialog *dlg) 157 static void add_file_fields(GObject *action, struct ftdialog *dlg)
121 { 158 {
122 static const gchar * label[] = { N_( "_Local file name:" ), N_( "_Host file name:" ) }; 159 static const gchar * label[] = { N_( "_Local file name:" ), N_( "_Host file name:" ) };
@@ -129,7 +166,7 @@ static void add_file_fields(GObject *action, struct ftdialog *dlg) @@ -129,7 +166,7 @@ static void add_file_fields(GObject *action, struct ftdialog *dlg)
129 166
130 for(f=0;f<2;f++) 167 for(f=0;f<2;f++)
131 { 168 {
132 - const gchar *val; 169 + gchar *val;
133 170
134 widget = gtk_label_new_with_mnemonic(gettext(label[f])); 171 widget = gtk_label_new_with_mnemonic(gettext(label[f]));
135 172
@@ -137,21 +174,13 @@ static void add_file_fields(GObject *action, struct ftdialog *dlg) @@ -137,21 +174,13 @@ static void add_file_fields(GObject *action, struct ftdialog *dlg)
137 gtk_table_attach(GTK_TABLE(table),widget,0,1,f,f+1,GTK_FILL,GTK_FILL,2,2); 174 gtk_table_attach(GTK_TABLE(table),widget,0,1,f,f+1,GTK_FILL,GTK_FILL,2,2);
138 175
139 dlg->file[f] = GTK_ENTRY(gtk_entry_new()); 176 dlg->file[f] = GTK_ENTRY(gtk_entry_new());
  177 + g_signal_connect(G_OBJECT(dlg->file[f]),"changed",G_CALLBACK(check_entry),dlg);
140 178
141 gtk_widget_set_name(GTK_WIDGET(dlg->file[f]),attr[f]); 179 gtk_widget_set_name(GTK_WIDGET(dlg->file[f]),attr[f]);
142 180
143 - val = g_object_get_data(action,attr[f]);  
144 -  
145 - if(val)  
146 - {  
147 - gtk_entry_set_text(dlg->file[f],val);  
148 - }  
149 - else  
150 - {  
151 - gchar *name = get_string_from_config(dlg->name,attr[f],"");  
152 - gtk_entry_set_text(dlg->file[f],name);  
153 - g_free(name);  
154 - } 181 + val = get_attribute(action,dlg,attr[f]);
  182 + gtk_entry_set_text(dlg->file[f],val);
  183 + g_free(val);
155 184
156 gtk_entry_set_width_chars(dlg->file[f],40); 185 gtk_entry_set_width_chars(dlg->file[f],40);
157 186
@@ -266,18 +295,10 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo @@ -266,18 +295,10 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo
266 { 295 {
267 if(dlg->parm[f]) 296 if(dlg->parm[f])
268 { 297 {
269 - const gchar *name = gtk_widget_get_name(GTK_WIDGET(dlg->parm[f]));  
270 - const gchar *attr = g_object_get_data(action,name);  
271 - if(attr)  
272 - {  
273 - gtk_entry_set_text(dlg->parm[f],attr);  
274 - }  
275 - else  
276 - {  
277 - gchar *ptr = get_string_from_config(dlg->name,name,"");  
278 - gtk_entry_set_text(dlg->parm[f],ptr);  
279 - g_free(ptr);  
280 - } 298 + gchar *val = get_attribute(action,dlg,gtk_widget_get_name(GTK_WIDGET(dlg->parm[f])));
  299 + gtk_entry_set_text(dlg->parm[f],val);
  300 + g_free(val);
  301 + g_signal_connect(G_OBJECT(dlg->parm[f]),"changed",G_CALLBACK(check_entry),dlg);
281 } 302 }
282 } 303 }
283 304
@@ -311,8 +332,6 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo @@ -311,8 +332,6 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo
311 parm[4], // dft 332 parm[4], // dft
312 &msg ); 333 &msg );
313 334
314 - trace("%s ft=%p msg=%p",__FUNCTION__,ft,&msg);  
315 -  
316 if(msg) 335 if(msg)
317 { 336 {
318 GtkWidget *popup = gtk_message_dialog_new_with_markup( 337 GtkWidget *popup = gtk_message_dialog_new_with_markup(
@@ -332,9 +351,24 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo @@ -332,9 +351,24 @@ static gboolean run_ft_dialog(GObject *action, GtkWidget *widget, struct ftdialo
332 351
333 } 352 }
334 353
335 - return ft != NULL; 354 + if(!ft)
  355 + return FALSE;
  356 +
  357 + return TRUE;
  358 +}
  359 +
  360 +static void add_buttons(struct ftdialog *dlg)
  361 +{
  362 + dlg->ready = gtk_dialog_add_button(GTK_DIALOG(dlg->dialog),
  363 + dlg->option & LIB3270_FT_OPTION_RECEIVE != 0 ? GTK_STOCK_SAVE : GTK_STOCK_OPEN,
  364 + GTK_RESPONSE_ACCEPT);
  365 +
  366 + gtk_widget_set_sensitive(dlg->ready,FALSE);
  367 +
  368 + gtk_dialog_add_button(GTK_DIALOG(dlg->dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
336 } 369 }
337 370
  371 +
338 void download_action(GtkAction *action, GtkWidget *widget) 372 void download_action(GtkAction *action, GtkWidget *widget)
339 { 373 {
340 struct ftdialog dlg; 374 struct ftdialog dlg;
@@ -350,12 +384,12 @@ void download_action(GtkAction *action, GtkWidget *widget) @@ -350,12 +384,12 @@ void download_action(GtkAction *action, GtkWidget *widget)
350 dlg.dialog = gtk_dialog_new_with_buttons( _( "Receive file from host" ), \ 384 dlg.dialog = gtk_dialog_new_with_buttons( _( "Receive file from host" ), \
351 GTK_WINDOW(gtk_widget_get_toplevel(widget)), 385 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
352 GTK_DIALOG_DESTROY_WITH_PARENT, \ 386 GTK_DIALOG_DESTROY_WITH_PARENT, \
353 - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, \  
354 - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, \  
355 NULL ); 387 NULL );
356 388
357 dlg.name = gtk_action_get_name(action); 389 dlg.name = gtk_action_get_name(action);
358 dlg.option = LIB3270_FT_OPTION_RECEIVE; 390 dlg.option = LIB3270_FT_OPTION_RECEIVE;
  391 +
  392 + add_buttons(&dlg);
359 add_file_fields(G_OBJECT(action),&dlg); 393 add_file_fields(G_OBJECT(action),&dlg);
360 add_transfer_options(G_OBJECT(action),&dlg); 394 add_transfer_options(G_OBJECT(action),&dlg);
361 395
@@ -410,12 +444,12 @@ void upload_action(GtkAction *action, GtkWidget *widget) @@ -410,12 +444,12 @@ void upload_action(GtkAction *action, GtkWidget *widget)
410 dlg.dialog = gtk_dialog_new_with_buttons( _( "Send file to host" ), \ 444 dlg.dialog = gtk_dialog_new_with_buttons( _( "Send file to host" ), \
411 GTK_WINDOW(gtk_widget_get_toplevel(widget)), 445 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
412 GTK_DIALOG_DESTROY_WITH_PARENT, \ 446 GTK_DIALOG_DESTROY_WITH_PARENT, \
413 - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, \  
414 - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, \  
415 NULL ); 447 NULL );
416 448
417 dlg.name = gtk_action_get_name(action); 449 dlg.name = gtk_action_get_name(action);
418 dlg.option = LIB3270_FT_OPTION_SEND; 450 dlg.option = LIB3270_FT_OPTION_SEND;
  451 +
  452 + add_buttons(&dlg);
419 add_file_fields(G_OBJECT(action),&dlg); 453 add_file_fields(G_OBJECT(action),&dlg);
420 add_transfer_options(G_OBJECT(action),&dlg); 454 add_transfer_options(G_OBJECT(action),&dlg);
421 455
@@ -456,15 +490,9 @@ void upload_action(GtkAction *action, GtkWidget *widget) @@ -456,15 +490,9 @@ void upload_action(GtkAction *action, GtkWidget *widget)
456 GtkWidget * frame = gtk_frame_new(gettext(fdesk[f].title)); 490 GtkWidget * frame = gtk_frame_new(gettext(fdesk[f].title));
457 GtkWidget * vbox = gtk_vbox_new(TRUE,2); 491 GtkWidget * vbox = gtk_vbox_new(TRUE,2);
458 GSList * group = NULL; 492 GSList * group = NULL;
459 - const gchar * attr = g_object_get_data(G_OBJECT(action),fdesk[f].name);  
460 - gchar * setup; 493 + gchar * setup = get_attribute(G_OBJECT(action),&dlg,fdesk[f].name);
461 int p; 494 int p;
462 495
463 - if(attr)  
464 - setup = g_strdup(attr);  
465 - else  
466 - setup = get_string_from_config(dlg.name,fdesk[f].name,fdesk[f].option[0].name);  
467 -  
468 for(p=0;p<4;p++) 496 for(p=0;p<4;p++)
469 { 497 {
470 GtkWidget *widget = gtk_radio_button_new_with_label(group,gettext(fdesk[f].option[p].label)); 498 GtkWidget *widget = gtk_radio_button_new_with_label(group,gettext(fdesk[f].option[p].label));