Commit 1211f8b239a71bbeffba18984b0f3d80577e43c0
1 parent
bc73eec4
Exists in
master
and in
5 other branches
Reimplementando diálogo de transferência de arquivos
Showing
2 changed files
with
184 additions
and
38 deletions
Show diff stats
src/pw3270/ft/ftdialog.c
| @@ -39,10 +39,22 @@ | @@ -39,10 +39,22 @@ | ||
| 39 | FILENAME_COUNT | 39 | FILENAME_COUNT |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | + enum _value | ||
| 43 | + { | ||
| 44 | + VALUE_LRECL, | ||
| 45 | + VALUE_BLKSIZE, | ||
| 46 | + VALUE_PRIMSPACE, | ||
| 47 | + VALUE_SECSPACE, | ||
| 48 | + VALUE_DFT, | ||
| 49 | + | ||
| 50 | + VALUE_COUNT | ||
| 51 | + }; | ||
| 52 | + | ||
| 42 | struct _v3270FTD | 53 | struct _v3270FTD |
| 43 | { | 54 | { |
| 44 | GtkDialog parent; | 55 | GtkDialog parent; |
| 45 | GtkWidget * filename[FILENAME_COUNT]; /**< Filenames for the transfer */ | 56 | GtkWidget * filename[FILENAME_COUNT]; /**< Filenames for the transfer */ |
| 57 | + int value[VALUE_COUNT]; | ||
| 46 | LIB3270_FT_OPTION options; | 58 | LIB3270_FT_OPTION options; |
| 47 | }; | 59 | }; |
| 48 | 60 | ||
| @@ -55,7 +67,21 @@ | @@ -55,7 +67,21 @@ | ||
| 55 | 67 | ||
| 56 | G_DEFINE_TYPE(v3270FTD, v3270FTD, GTK_TYPE_DIALOG); | 68 | G_DEFINE_TYPE(v3270FTD, v3270FTD, GTK_TYPE_DIALOG); |
| 57 | 69 | ||
| 58 | -/*--[ Globals ]--------------------------------------------------------------------------------------*/ | 70 | + struct ftoptions |
| 71 | + { | ||
| 72 | + LIB3270_FT_OPTION flag; | ||
| 73 | + const gchar * label; | ||
| 74 | + const gchar * tooltip; | ||
| 75 | + }; | ||
| 76 | + | ||
| 77 | + struct ftvalues | ||
| 78 | + { | ||
| 79 | + int id; | ||
| 80 | + const gchar * label; | ||
| 81 | + const gchar * tooltip; | ||
| 82 | + }; | ||
| 83 | + | ||
| 84 | +/*--[ Implement ]------------------------------------------------------------------------------------*/ | ||
| 59 | 85 | ||
| 60 | static void v3270FTD_class_init(v3270FTDClass *klass) | 86 | static void v3270FTD_class_init(v3270FTDClass *klass) |
| 61 | { | 87 | { |
| @@ -100,14 +126,6 @@ static void browse_file(GtkButton *button,v3270FTD *parent) | @@ -100,14 +126,6 @@ static void browse_file(GtkButton *button,v3270FTD *parent) | ||
| 100 | 126 | ||
| 101 | } | 127 | } |
| 102 | 128 | ||
| 103 | - struct ftoptions | ||
| 104 | - { | ||
| 105 | - LIB3270_FT_OPTION flag; | ||
| 106 | - const gchar * label; | ||
| 107 | - const gchar * tooltip; | ||
| 108 | - }; | ||
| 109 | - | ||
| 110 | - | ||
| 111 | static void toggle_option(GtkToggleButton *button, v3270FTD *dialog) | 129 | static void toggle_option(GtkToggleButton *button, v3270FTD *dialog) |
| 112 | { | 130 | { |
| 113 | const struct ftoptions *opt = (const struct ftoptions *) g_object_get_data(G_OBJECT(button),"cfg"); | 131 | const struct ftoptions *opt = (const struct ftoptions *) g_object_get_data(G_OBJECT(button),"cfg"); |
| @@ -143,6 +161,37 @@ static GtkWidget * ftoption_new(v3270FTD *dialog, const struct ftoptions *opt) | @@ -143,6 +161,37 @@ static GtkWidget * ftoption_new(v3270FTD *dialog, const struct ftoptions *opt) | ||
| 143 | return GTK_WIDGET(grid); | 161 | return GTK_WIDGET(grid); |
| 144 | } | 162 | } |
| 145 | 163 | ||
| 164 | +static GtkWidget * ftvalue_new(v3270FTD *dialog, const struct ftvalues *val) | ||
| 165 | +{ | ||
| 166 | + GtkGrid * grid = GTK_GRID(gtk_grid_new()); | ||
| 167 | + int f; | ||
| 168 | + | ||
| 169 | + gtk_grid_set_row_homogeneous(grid,TRUE); | ||
| 170 | + gtk_grid_set_column_homogeneous(grid,TRUE); | ||
| 171 | + gtk_grid_set_column_spacing(grid,5); | ||
| 172 | + gtk_grid_set_row_spacing(grid,5); | ||
| 173 | + | ||
| 174 | + for(f=0;val[f].label;f++) | ||
| 175 | + { | ||
| 176 | + int col = (f&1)*2; | ||
| 177 | + int row = f/2; | ||
| 178 | + GtkWidget * label = gtk_label_new_with_mnemonic(gettext(val[f].label)); | ||
| 179 | + GtkEntry * entry = GTK_ENTRY(gtk_entry_new()); | ||
| 180 | + | ||
| 181 | + gtk_label_set_mnemonic_widget(GTK_LABEL(label),GTK_WIDGET(entry)); | ||
| 182 | + gtk_widget_set_tooltip_text(GTK_WIDGET(entry),gettext(val[f].tooltip)); | ||
| 183 | + | ||
| 184 | + g_object_set_data(G_OBJECT(entry),"cfg",(gpointer) &val[f]); | ||
| 185 | + | ||
| 186 | + gtk_grid_attach(grid,GTK_WIDGET(label),col,row,1,1); | ||
| 187 | + gtk_grid_attach(grid,GTK_WIDGET(entry),col+1,row,1,1); | ||
| 188 | + | ||
| 189 | + } | ||
| 190 | + | ||
| 191 | + return GTK_WIDGET(grid); | ||
| 192 | + | ||
| 193 | +} | ||
| 194 | + | ||
| 146 | GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) | 195 | GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) |
| 147 | { | 196 | { |
| 148 | v3270FTD *dialog = g_object_new(GTK_TYPE_V3270FTD, NULL); | 197 | v3270FTD *dialog = g_object_new(GTK_TYPE_V3270FTD, NULL); |
| @@ -172,38 +221,50 @@ GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) | @@ -172,38 +221,50 @@ GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) | ||
| 172 | gtk_grid_set_column_spacing(grid,5); | 221 | gtk_grid_set_column_spacing(grid,5); |
| 173 | gtk_grid_set_row_spacing(grid,5); | 222 | gtk_grid_set_row_spacing(grid,5); |
| 174 | 223 | ||
| 175 | -// GtkButton * browse = GTK_BUTTON(gtk_button_new_with_mnemonic(_( "_Browse"))); | ||
| 176 | GtkButton * browse = GTK_BUTTON(gtk_button_new_from_icon_name("text-x-generic",GTK_ICON_SIZE_BUTTON)); | 224 | GtkButton * browse = GTK_BUTTON(gtk_button_new_from_icon_name("text-x-generic",GTK_ICON_SIZE_BUTTON)); |
| 177 | gtk_button_set_focus_on_click(browse,FALSE); | 225 | gtk_button_set_focus_on_click(browse,FALSE); |
| 178 | gtk_widget_set_tooltip_text(GTK_WIDGET(browse),_("Select file")); | 226 | gtk_widget_set_tooltip_text(GTK_WIDGET(browse),_("Select file")); |
| 179 | g_signal_connect(G_OBJECT(browse),"clicked",G_CALLBACK(browse_file),dialog); | 227 | g_signal_connect(G_OBJECT(browse),"clicked",G_CALLBACK(browse_file),dialog); |
| 180 | 228 | ||
| 181 | - GtkWidget * ftOptions; | ||
| 182 | - | ||
| 183 | if(options & LIB3270_FT_OPTION_RECEIVE) | 229 | if(options & LIB3270_FT_OPTION_RECEIVE) |
| 184 | { | 230 | { |
| 185 | // It's receiving file first host filename, then local filename | 231 | // It's receiving file first host filename, then local filename |
| 232 | + gtk_window_set_title(GTK_WINDOW(dialog),_( "Receive file from host" )); | ||
| 233 | + | ||
| 234 | + gtk_grid_attach(grid,label[FILENAME_HOST],0,0,1,1); | ||
| 235 | + gtk_grid_attach(grid,label[FILENAME_LOCAL],0,1,1,1); | ||
| 236 | + | ||
| 237 | + gtk_grid_attach(grid,dialog->filename[FILENAME_HOST],1,0,3,1); | ||
| 238 | + gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],1,1,3,1); | ||
| 239 | + gtk_grid_attach(grid,GTK_WIDGET(browse),5,1,1,1); | ||
| 240 | + | ||
| 241 | + gtk_widget_set_tooltip_text(dialog->filename[FILENAME_HOST],_("Name of the source file.")); | ||
| 242 | + gtk_widget_set_tooltip_text(dialog->filename[FILENAME_LOCAL],_("Where to save the received file.")); | ||
| 243 | + | ||
| 244 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),FALSE,TRUE,2); | ||
| 245 | + | ||
| 246 | + // Create options box | ||
| 186 | static const struct ftoptions opt[] = | 247 | static const struct ftoptions opt[] = |
| 187 | { | 248 | { |
| 188 | { | 249 | { |
| 189 | LIB3270_FT_OPTION_ASCII, | 250 | LIB3270_FT_OPTION_ASCII, |
| 190 | - N_( "_Text file" ), | ||
| 191 | - N_( "Mark this box if it's a text file.") | 251 | + N_( "_Text file." ), |
| 252 | + N_( "Check for text files.") | ||
| 192 | }, | 253 | }, |
| 193 | { | 254 | { |
| 194 | LIB3270_FT_OPTION_CRLF, | 255 | LIB3270_FT_OPTION_CRLF, |
| 195 | - N_( "Add/Remove _CR at end of line" ), | ||
| 196 | - N_( "If check the file will receive a CR/LF at the end of every line.") | 256 | + N_( "Add _CR at end of line." ), |
| 257 | + N_( "Adds Newline characters to each host file record before transferring it to the local workstation.") | ||
| 197 | }, | 258 | }, |
| 198 | { | 259 | { |
| 199 | LIB3270_FT_OPTION_APPEND, | 260 | LIB3270_FT_OPTION_APPEND, |
| 200 | - N_( "_Append" ), | ||
| 201 | - N_( "If check the data will be appended to the current file, if uncheck the file will be replaced.") | 261 | + N_( "_Append to destination" ), |
| 262 | + N_( "Appends the source file to the destination file.") | ||
| 202 | }, | 263 | }, |
| 203 | { | 264 | { |
| 204 | LIB3270_FT_OPTION_REMAP, | 265 | LIB3270_FT_OPTION_REMAP, |
| 205 | - N_("_Remap ASCII Characters"), | ||
| 206 | - N_("Check to translate file contents from EBCDIC to ASCII.") | 266 | + N_("_Remap to ASCII Characters."), |
| 267 | + N_("Remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page.") | ||
| 207 | }, | 268 | }, |
| 208 | { | 269 | { |
| 209 | 0, | 270 | 0, |
| @@ -212,19 +273,25 @@ GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) | @@ -212,19 +273,25 @@ GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) | ||
| 212 | } | 273 | } |
| 213 | }; | 274 | }; |
| 214 | 275 | ||
| 215 | - gtk_window_set_title(GTK_WINDOW(dialog),_( "Receive file from host" )); | ||
| 216 | - | ||
| 217 | - gtk_grid_attach(grid,label[FILENAME_HOST],0,0,1,1); | ||
| 218 | - gtk_grid_attach(grid,label[FILENAME_LOCAL],0,1,1,1); | ||
| 219 | - | ||
| 220 | - gtk_grid_attach(grid,dialog->filename[FILENAME_HOST],1,0,3,1); | ||
| 221 | - gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],1,1,3,1); | ||
| 222 | - gtk_grid_attach(grid,GTK_WIDGET(browse),5,1,1,1); | 276 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),ftoption_new(dialog,opt),FALSE,TRUE,2); |
| 223 | 277 | ||
| 224 | - gtk_widget_set_tooltip_text(dialog->filename[FILENAME_HOST],_("Name of the origin file on the host")); | ||
| 225 | - gtk_widget_set_tooltip_text(dialog->filename[FILENAME_LOCAL],_("Where to save the received file")); | 278 | + // Create values box |
| 279 | + static const struct ftvalues val[] = | ||
| 280 | + { | ||
| 281 | + { | ||
| 282 | + VALUE_DFT, | ||
| 283 | + N_( "DFT B_uffer size:" ), | ||
| 284 | + N_( "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." ) | ||
| 285 | + }, | ||
| 286 | + | ||
| 287 | + { | ||
| 288 | + 0, | ||
| 289 | + NULL, | ||
| 290 | + NULL | ||
| 291 | + } | ||
| 292 | + }; | ||
| 226 | 293 | ||
| 227 | - ftOptions = ftoption_new(dialog,opt); | 294 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),ftvalue_new(dialog,val),FALSE,TRUE,2); |
| 228 | 295 | ||
| 229 | } | 296 | } |
| 230 | else | 297 | else |
| @@ -232,19 +299,97 @@ GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) | @@ -232,19 +299,97 @@ GtkWidget * v3270_dialog_ft_new(LIB3270_FT_OPTION options) | ||
| 232 | // It's sending file first local filename, then hostfilename | 299 | // It's sending file first local filename, then hostfilename |
| 233 | gtk_window_set_title(GTK_WINDOW(dialog),_( "Send file to host" )); | 300 | gtk_window_set_title(GTK_WINDOW(dialog),_( "Send file to host" )); |
| 234 | 301 | ||
| 235 | - gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],0,0,1,1); | ||
| 236 | - gtk_grid_attach(grid,dialog->filename[FILENAME_HOST],0,1,1,1); | 302 | + gtk_grid_attach(grid,label[FILENAME_LOCAL],0,0,1,1); |
| 303 | + gtk_grid_attach(grid,label[FILENAME_HOST],0,1,1,1); | ||
| 237 | 304 | ||
| 238 | gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],1,0,3,1); | 305 | gtk_grid_attach(grid,dialog->filename[FILENAME_LOCAL],1,0,3,1); |
| 306 | + gtk_grid_attach(grid,GTK_WIDGET(browse),5,0,1,1); | ||
| 307 | + | ||
| 239 | gtk_grid_attach(grid,dialog->filename[FILENAME_HOST],1,1,3,1); | 308 | gtk_grid_attach(grid,dialog->filename[FILENAME_HOST],1,1,3,1); |
| 240 | 309 | ||
| 241 | - gtk_widget_set_tooltip_text(dialog->filename[FILENAME_HOST],_("Name of the target file on the host")); | ||
| 242 | - gtk_widget_set_tooltip_text(dialog->filename[FILENAME_LOCAL],_("Path of the local file to send")); | 310 | + gtk_widget_set_tooltip_text(dialog->filename[FILENAME_HOST],_("Name of the target file.")); |
| 311 | + gtk_widget_set_tooltip_text(dialog->filename[FILENAME_LOCAL],_("Path of the local file to send.")); | ||
| 312 | + | ||
| 313 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),FALSE,TRUE,2); | ||
| 314 | + | ||
| 315 | + // Create options box | ||
| 316 | + static const struct ftoptions opt[] = | ||
| 317 | + { | ||
| 318 | + { | ||
| 319 | + LIB3270_FT_OPTION_ASCII, | ||
| 320 | + N_( "_Text file." ), | ||
| 321 | + N_( "Check for text files.") | ||
| 322 | + }, | ||
| 323 | + { | ||
| 324 | + LIB3270_FT_OPTION_CRLF, | ||
| 325 | + N_( "_CR delimited file." ), | ||
| 326 | + N_( "Remove the default newline characters in local files before transferring them to the host.") | ||
| 327 | + }, | ||
| 328 | + { | ||
| 329 | + LIB3270_FT_OPTION_APPEND, | ||
| 330 | + N_( "_Append to destination" ), | ||
| 331 | + N_( "Appends the source file to the destination file.") | ||
| 332 | + }, | ||
| 333 | + { | ||
| 334 | + LIB3270_FT_OPTION_REMAP, | ||
| 335 | + N_("_Remap to EBCDIC Characters."), | ||
| 336 | + N_("Remap the text to ensure maximum compatibility between the workstation's character set and encoding and the host's EBCDIC code page.") | ||
| 337 | + }, | ||
| 338 | + { | ||
| 339 | + 0, | ||
| 340 | + NULL, | ||
| 341 | + NULL | ||
| 342 | + } | ||
| 343 | + }; | ||
| 344 | + | ||
| 345 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),ftoption_new(dialog,opt),FALSE,TRUE,2); | ||
| 346 | + | ||
| 347 | + | ||
| 348 | + // Create values box | ||
| 349 | + static const struct ftvalues val[] = | ||
| 350 | + { | ||
| 351 | + { | ||
| 352 | + VALUE_LRECL, | ||
| 353 | + N_( "Lrecl:" ), | ||
| 354 | + N_( "Specifies the record length (or maximum record length) for files created on the host." ) | ||
| 355 | + }, | ||
| 356 | + | ||
| 357 | + | ||
| 358 | + { | ||
| 359 | + VALUE_PRIMSPACE, | ||
| 360 | + N_( "Primary space:" ), | ||
| 361 | + N_( "Primary allocation for a file created on a TSO host.\nThe units are given by the Allocation option." ) | ||
| 362 | + }, | ||
| 363 | + | ||
| 364 | + { | ||
| 365 | + VALUE_BLKSIZE, | ||
| 366 | + N_( "Blksize:" ), | ||
| 367 | + N_( "Specifies the block size for files created on the host (TSO hosts only)." ) | ||
| 368 | + }, | ||
| 369 | + | ||
| 370 | + { | ||
| 371 | + VALUE_SECSPACE, | ||
| 372 | + N_( "Secondary space:" ), | ||
| 373 | + N_( "Secondary allocation for a file created on a TSO host.\nThe units are given by the Allocation option." ) | ||
| 374 | + }, | ||
| 375 | + | ||
| 376 | + { | ||
| 377 | + VALUE_DFT, | ||
| 378 | + N_( "DFT B_uffer size:" ), | ||
| 379 | + N_( "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." ) | ||
| 380 | + }, | ||
| 381 | + | ||
| 382 | + { | ||
| 383 | + 0, | ||
| 384 | + NULL, | ||
| 385 | + NULL | ||
| 386 | + } | ||
| 387 | + }; | ||
| 388 | + | ||
| 389 | + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),ftvalue_new(dialog,val),FALSE,TRUE,2); | ||
| 243 | 390 | ||
| 244 | } | 391 | } |
| 245 | 392 | ||
| 246 | - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),FALSE,TRUE,2); | ||
| 247 | - gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),ftOptions,FALSE,TRUE,2); | ||
| 248 | 393 | ||
| 249 | // File transfer options | 394 | // File transfer options |
| 250 | 395 |
src/pw3270/ft/testprogram.c
| @@ -37,7 +37,8 @@ int main (int argc, char *argv[]) | @@ -37,7 +37,8 @@ int main (int argc, char *argv[]) | ||
| 37 | GtkWidget *win; | 37 | GtkWidget *win; |
| 38 | 38 | ||
| 39 | gtk_init (&argc, &argv); | 39 | gtk_init (&argc, &argv); |
| 40 | - win = v3270_dialog_ft_new(LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII); | 40 | +// win = v3270_dialog_ft_new(LIB3270_FT_OPTION_RECEIVE|LIB3270_FT_OPTION_ASCII); |
| 41 | + win = v3270_dialog_ft_new(0); | ||
| 41 | 42 | ||
| 42 | 43 | ||
| 43 | gtk_widget_show_all (win); | 44 | gtk_widget_show_all (win); |