Commit 9ed6bd9aee23fe8548ecb8095a2550cec85adc5e

Authored by perry.werneck@gmail.com
1 parent be38b135

Corrigindo tratamento de atributos na opção "cut"

src/include/lib3270.h
@@ -792,6 +792,8 @@ @@ -792,6 +792,8 @@
792 */ 792 */
793 LIB3270_EXPORT int lib3270_field_addr(H3270 *h, int baddr); 793 LIB3270_EXPORT int lib3270_field_addr(H3270 *h, int baddr);
794 794
  795 + LIB3270_EXPORT int lib3270_field_attribute(H3270 *hSession, int baddr);
  796 +
795 /** 797 /**
796 * Get the length of the field at given buffer address. 798 * Get the length of the field at given buffer address.
797 * 799 *
src/lib3270/ctlr.c
@@ -326,6 +326,27 @@ LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr) @@ -326,6 +326,27 @@ LIB3270_EXPORT int lib3270_field_addr(H3270 *hSession, int baddr)
326 return -1; 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 * Get Field width 351 * Get Field width
331 */ 352 */
src/lib3270/selection.c
@@ -554,46 +554,63 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) @@ -554,46 +554,63 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession)
554 { 554 {
555 int end; 555 int end;
556 size_t szText; 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 char *text; 561 char *text;
560 int f; 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 return NULL; 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 text = lib3270_malloc(szText+1); 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 for(f=0;f<szText;f++) 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 lib3270_unselect(hSession); 616 lib3270_unselect(hSession);