Commit 9ed6bd9aee23fe8548ecb8095a2550cec85adc5e
1 parent
be38b135
Exists in
master
and in
5 other branches
Corrigindo tratamento de atributos na opção "cut"
Showing
3 changed files
with
59 additions
and
19 deletions
Show diff stats
src/include/lib3270.h
src/lib3270/ctlr.c
| ... | ... | @@ -326,6 +326,27 @@ LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) |
| 326 | 326 | return -1; |
| 327 | 327 | } |
| 328 | 328 | |
| 329 | +LIB3270_EXPORT int lib3270_field_attribute(H3270 *hSession, int baddr) | |
| 330 | +{ | |
| 331 | + int sbaddr; | |
| 332 | + | |
| 333 | + CHECK_SESSION_HANDLE(hSession); | |
| 334 | + | |
| 335 | + if (!hSession->formatted) | |
| 336 | + return -1; | |
| 337 | + | |
| 338 | + sbaddr = baddr; | |
| 339 | + do | |
| 340 | + { | |
| 341 | + if(hSession->ea_buf[baddr].fa) | |
| 342 | + return hSession->ea_buf[baddr].fa; | |
| 343 | + DEC_BA(baddr); | |
| 344 | + } while (baddr != sbaddr); | |
| 345 | + | |
| 346 | + return -1; | |
| 347 | +} | |
| 348 | + | |
| 349 | + | |
| 329 | 350 | /* |
| 330 | 351 | * Get Field width |
| 331 | 352 | */ | ... | ... |
src/lib3270/selection.c
| ... | ... | @@ -554,46 +554,63 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
| 554 | 554 | { |
| 555 | 555 | int end; |
| 556 | 556 | size_t szText; |
| 557 | - int baddr; | |
| 558 | - int saddr; | |
| 557 | + int daddr; /* Destination addr */ | |
| 558 | + int dattr; /* Destination addr attribute */ | |
| 559 | + int saddr; /* Source addr (First field after the selected area) */ | |
| 560 | + int sattr; /* Source addr attribute */ | |
| 559 | 561 | char *text; |
| 560 | 562 | int f; |
| 561 | 563 | |
| 562 | - get_selected_addr(hSession,&baddr,&end); | |
| 564 | + get_selected_addr(hSession,&daddr,&end); | |
| 563 | 565 | |
| 564 | - if(baddr >= end) | |
| 566 | + if(daddr >= end) | |
| 565 | 567 | return NULL; |
| 566 | 568 | |
| 567 | - szText = (end-baddr)+1; | |
| 569 | + dattr = lib3270_field_attribute(hSession,daddr); /* Get first attribute */ | |
| 570 | + | |
| 571 | + szText = (end-daddr)+1; | |
| 568 | 572 | |
| 569 | 573 | text = lib3270_malloc(szText+1); |
| 570 | 574 | |
| 571 | - saddr = baddr+szText; | |
| 575 | + saddr = daddr+szText; | |
| 576 | + sattr = lib3270_field_attribute(hSession,saddr); | |
| 572 | 577 | |
| 573 | 578 | for(f=0;f<szText;f++) |
| 574 | 579 | { |
| 575 | - text[f] = hSession->text[baddr].chr; | |
| 580 | + if(hSession->ea_buf[daddr].fa) | |
| 581 | + dattr = hSession->ea_buf[daddr].fa; | |
| 576 | 582 | |
| 577 | - if(FA_IS_PROTECTED(hSession->ea_buf[saddr].fa)) | |
| 578 | - saddr = lib3270_get_next_unprotected(hSession,saddr); | |
| 583 | + text[f] = hSession->text[daddr].chr; | |
| 579 | 584 | |
| 580 | - if(!FA_IS_PROTECTED(hSession->ea_buf[saddr].fa)) | |
| 585 | + if(!FA_IS_PROTECTED(dattr)) | |
| 581 | 586 | { |
| 582 | - if(hSession->text[baddr].chr != hSession->text[saddr].chr) | |
| 587 | + if(hSession->ea_buf[saddr].fa) | |
| 588 | + sattr = hSession->ea_buf[saddr].fa; | |
| 589 | + | |
| 590 | + if(FA_IS_PROTECTED(sattr)) | |
| 583 | 591 | { |
| 584 | - hSession->text[baddr].chr = hSession->text[saddr].chr; | |
| 585 | - hSession->update(hSession,baddr,hSession->text[baddr].chr,hSession->text[baddr].attr,baddr == hSession->cursor_addr); | |
| 592 | + saddr = lib3270_get_next_unprotected(hSession,saddr); | |
| 593 | + sattr = lib3270_field_attribute(hSession,saddr); | |
| 586 | 594 | } |
| 587 | 595 | |
| 588 | - if(hSession->text[saddr].chr != ' ') | |
| 596 | + if(!FA_IS_PROTECTED(sattr)) | |
| 589 | 597 | { |
| 590 | - hSession->text[saddr].chr = ' '; | |
| 591 | - hSession->update(hSession,saddr,hSession->text[saddr].chr,hSession->text[saddr].attr,saddr == hSession->cursor_addr); | |
| 598 | + if(hSession->text[daddr].chr != hSession->text[saddr].chr) | |
| 599 | + { | |
| 600 | + hSession->text[daddr].chr = hSession->text[saddr].chr; | |
| 601 | + hSession->update(hSession,daddr,hSession->text[daddr].chr,hSession->text[daddr].attr,daddr == hSession->cursor_addr); | |
| 602 | + } | |
| 603 | + | |
| 604 | + if(hSession->text[saddr].chr != ' ') | |
| 605 | + { | |
| 606 | + hSession->text[saddr].chr = ' '; | |
| 607 | + hSession->update(hSession,saddr,hSession->text[saddr].chr,hSession->text[saddr].attr,saddr == hSession->cursor_addr); | |
| 608 | + } | |
| 609 | + | |
| 610 | + saddr++; | |
| 592 | 611 | } |
| 593 | - | |
| 594 | - saddr++; | |
| 595 | 612 | } |
| 596 | - baddr++; | |
| 613 | + daddr++; | |
| 597 | 614 | } |
| 598 | 615 | |
| 599 | 616 | lib3270_unselect(hSession); | ... | ... |