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 44 GtkWidget * dialog;
45 45 GtkEntry * file[2];
46 46 GtkEntry * parm[5];
  47 + GtkWidget * ready;
47 48 };
48 49  
49 50 struct ftoption
... ... @@ -81,10 +82,14 @@ static void error_dialog(GtkWidget *widget, const gchar *title, const gchar *msg
81 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 95 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 157 static void add_file_fields(GObject *action, struct ftdialog *dlg)
121 158 {
122 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 166  
130 167 for(f=0;f<2;f++)
131 168 {
132   - const gchar *val;
  169 + gchar *val;
133 170  
134 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 174 gtk_table_attach(GTK_TABLE(table),widget,0,1,f,f+1,GTK_FILL,GTK_FILL,2,2);
138 175  
139 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 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 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 295 {
267 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 332 parm[4], // dft
312 333 &msg );
313 334  
314   - trace("%s ft=%p msg=%p",__FUNCTION__,ft,&msg);
315   -
316 335 if(msg)
317 336 {
318 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 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 372 void download_action(GtkAction *action, GtkWidget *widget)
339 373 {
340 374 struct ftdialog dlg;
... ... @@ -350,12 +384,12 @@ void download_action(GtkAction *action, GtkWidget *widget)
350 384 dlg.dialog = gtk_dialog_new_with_buttons( _( "Receive file from host" ), \
351 385 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
352 386 GTK_DIALOG_DESTROY_WITH_PARENT, \
353   - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, \
354   - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, \
355 387 NULL );
356 388  
357 389 dlg.name = gtk_action_get_name(action);
358 390 dlg.option = LIB3270_FT_OPTION_RECEIVE;
  391 +
  392 + add_buttons(&dlg);
359 393 add_file_fields(G_OBJECT(action),&dlg);
360 394 add_transfer_options(G_OBJECT(action),&dlg);
361 395  
... ... @@ -410,12 +444,12 @@ void upload_action(GtkAction *action, GtkWidget *widget)
410 444 dlg.dialog = gtk_dialog_new_with_buttons( _( "Send file to host" ), \
411 445 GTK_WINDOW(gtk_widget_get_toplevel(widget)),
412 446 GTK_DIALOG_DESTROY_WITH_PARENT, \
413   - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, \
414   - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, \
415 447 NULL );
416 448  
417 449 dlg.name = gtk_action_get_name(action);
418 450 dlg.option = LIB3270_FT_OPTION_SEND;
  451 +
  452 + add_buttons(&dlg);
419 453 add_file_fields(G_OBJECT(action),&dlg);
420 454 add_transfer_options(G_OBJECT(action),&dlg);
421 455  
... ... @@ -456,15 +490,9 @@ void upload_action(GtkAction *action, GtkWidget *widget)
456 490 GtkWidget * frame = gtk_frame_new(gettext(fdesk[f].title));
457 491 GtkWidget * vbox = gtk_vbox_new(TRUE,2);
458 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 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 496 for(p=0;p<4;p++)
469 497 {
470 498 GtkWidget *widget = gtk_radio_button_new_with_label(group,gettext(fdesk[f].option[p].label));
... ...