Commit 91a931dfd7e4762c1f3b0725a1ff49c085cdebf4
1 parent
b0e8702a
Exists in
master
and in
5 other branches
Implementação parcial do comando "cut"
Showing
4 changed files
with
83 additions
and
38 deletions
Show diff stats
src/lib3270/ctlr.c
| ... | ... | @@ -2259,9 +2259,10 @@ static void ctlr_blanks(H3270 *session) |
| 2259 | 2259 | } |
| 2260 | 2260 | |
| 2261 | 2261 | |
| 2262 | -/* | |
| 2263 | - * Change a character in the 3270 buffer. | |
| 2264 | - * Removes any field attribute defined at that location. | |
| 2262 | +/** | |
| 2263 | + * Change a character in the 3270 buffer, removes any field attribute defined at that location. | |
| 2264 | + * | |
| 2265 | + * | |
| 2265 | 2266 | */ |
| 2266 | 2267 | void ctlr_add(H3270 *hSession, int baddr, unsigned char c, unsigned char cs) |
| 2267 | 2268 | { |
| ... | ... | @@ -2430,17 +2431,19 @@ void ctlr_bcopy(H3270 *hSession, int baddr_from, int baddr_to, int count, int mo |
| 2430 | 2431 | } |
| 2431 | 2432 | |
| 2432 | 2433 | #if defined(X3270_ANSI) /*[*/ |
| 2433 | -/* | |
| 2434 | - * Erase a region of the 3270 buffer, optionally clearing extended attributes | |
| 2435 | - * as well. | |
| 2434 | +/** | |
| 2435 | + * Erase a region of the 3270 buffer, optionally clearing extended attributes as well. | |
| 2436 | + * | |
| 2437 | + * @param hSession Session handle | |
| 2438 | + * | |
| 2436 | 2439 | */ |
| 2437 | -void ctlr_aclear(H3270 *session, int baddr, int count, int clear_ea) | |
| 2440 | +void ctlr_aclear(H3270 *hSession, int baddr, int count, int clear_ea) | |
| 2438 | 2441 | { |
| 2439 | - if (memcmp((char *) &session->ea_buf[baddr], (char *) session->zero_buf, | |
| 2442 | + if (memcmp((char *) &hSession->ea_buf[baddr], (char *) hSession->zero_buf, | |
| 2440 | 2443 | count * sizeof(struct lib3270_ea))) { |
| 2441 | - (void) memset((char *) &session->ea_buf[baddr], 0, | |
| 2444 | + (void) memset((char *) &hSession->ea_buf[baddr], 0, | |
| 2442 | 2445 | count * sizeof(struct lib3270_ea)); |
| 2443 | - REGION_CHANGED(session,baddr, baddr + count); | |
| 2446 | + REGION_CHANGED(hSession,baddr, baddr + count); | |
| 2444 | 2447 | } |
| 2445 | 2448 | /* XXX: What about clear_ea? */ |
| 2446 | 2449 | } | ... | ... |
src/lib3270/selection.c
| ... | ... | @@ -532,6 +532,58 @@ LIB3270_EXPORT char * lib3270_get_selected(H3270 *hSession) |
| 532 | 532 | return get_text(hSession,0); |
| 533 | 533 | } |
| 534 | 534 | |
| 535 | +static void copy_chr(H3270 *hSession, int from, int to) | |
| 536 | +{ | |
| 537 | + if(hSession->text[from].chr == hSession->text[to].chr) | |
| 538 | + return; | |
| 539 | + | |
| 540 | + hSession->text[to].chr = hSession->text[from].chr; | |
| 541 | + | |
| 542 | + memcpy(&hSession->ea_buf[to], &hSession->ea_buf[from],sizeof(struct lib3270_ea)); | |
| 543 | + hSession->ea_buf[from].fa = 0; | |
| 544 | + | |
| 545 | + hSession->update( hSession, | |
| 546 | + to, | |
| 547 | + hSession->text[to].chr, | |
| 548 | + hSession->text[to].attr, | |
| 549 | + to == hSession->cursor_addr ); | |
| 550 | +} | |
| 551 | + | |
| 552 | +static void clear_chr(H3270 *hSession, int baddr) | |
| 553 | +{ | |
| 554 | + hSession->text[baddr].chr = ' '; | |
| 555 | + | |
| 556 | + hSession->ea_buf[baddr].cc = EBC_null; | |
| 557 | + hSession->ea_buf[baddr].cs = 0; | |
| 558 | + | |
| 559 | + hSession->update( hSession, | |
| 560 | + baddr, | |
| 561 | + hSession->text[baddr].chr, | |
| 562 | + hSession->text[baddr].attr, | |
| 563 | + baddr == hSession->cursor_addr ); | |
| 564 | +} | |
| 565 | + | |
| 566 | +int cut_addr(H3270 *hSession, int daddr, int saddr, int maxlen, int *sattr) | |
| 567 | +{ | |
| 568 | + if(hSession->ea_buf[saddr].fa) | |
| 569 | + *sattr = hSession->ea_buf[saddr++].fa; | |
| 570 | + | |
| 571 | +/* | |
| 572 | + if(FA_IS_PROTECTED(*sattr)) | |
| 573 | + { | |
| 574 | + saddr = lib3270_get_next_unprotected(hSession,saddr); | |
| 575 | + *sattr = lib3270_field_attribute(hSession,saddr); | |
| 576 | + } | |
| 577 | +*/ | |
| 578 | + | |
| 579 | + if(FA_IS_PROTECTED(*sattr) || saddr >= maxlen) | |
| 580 | + clear_chr(hSession,daddr); | |
| 581 | + else | |
| 582 | + copy_chr(hSession,saddr++,daddr); | |
| 583 | + | |
| 584 | + return saddr; | |
| 585 | +} | |
| 586 | + | |
| 535 | 587 | LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
| 536 | 588 | { |
| 537 | 589 | |
| ... | ... | @@ -559,10 +611,13 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
| 559 | 611 | int saddr; /* Source addr (First field after the selected area) */ |
| 560 | 612 | int sattr; /* Source addr attribute */ |
| 561 | 613 | char *text; |
| 614 | + size_t maxlen = hSession->rows * hSession->cols; | |
| 562 | 615 | int f; |
| 563 | 616 | |
| 564 | 617 | get_selected_addr(hSession,&daddr,&end); |
| 565 | 618 | |
| 619 | + lib3270_set_cursor_address(hSession,daddr); | |
| 620 | + | |
| 566 | 621 | if(daddr >= end) |
| 567 | 622 | return NULL; |
| 568 | 623 | |
| ... | ... | @@ -583,36 +638,23 @@ LIB3270_EXPORT char * lib3270_cut_selected(H3270 *hSession) |
| 583 | 638 | text[f] = hSession->text[daddr].chr; |
| 584 | 639 | |
| 585 | 640 | if(!FA_IS_PROTECTED(dattr)) |
| 586 | - { | |
| 587 | - if(hSession->ea_buf[saddr].fa) | |
| 588 | - sattr = hSession->ea_buf[saddr].fa; | |
| 589 | - | |
| 590 | - if(FA_IS_PROTECTED(sattr)) | |
| 591 | - { | |
| 592 | - saddr = lib3270_get_next_unprotected(hSession,saddr); | |
| 593 | - sattr = lib3270_field_attribute(hSession,saddr); | |
| 594 | - } | |
| 595 | - | |
| 596 | - if(!FA_IS_PROTECTED(sattr)) | |
| 597 | - { | |
| 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++; | |
| 611 | - } | |
| 612 | - } | |
| 641 | + saddr = cut_addr(hSession,daddr,saddr,maxlen,&sattr); | |
| 642 | + | |
| 643 | + daddr++; | |
| 644 | + } | |
| 645 | + | |
| 646 | + // Move contents of the current field | |
| 647 | + while(daddr < (maxlen-1) && !hSession->ea_buf[daddr].fa) | |
| 648 | + { | |
| 649 | + saddr = cut_addr(hSession,daddr,saddr,maxlen,&sattr); | |
| 613 | 650 | daddr++; |
| 614 | 651 | } |
| 615 | 652 | |
| 653 | + if(!hSession->ea_buf[daddr].fa) | |
| 654 | + clear_chr(hSession,daddr); | |
| 655 | + | |
| 656 | + hSession->changed(hSession,0,maxlen); | |
| 657 | + | |
| 616 | 658 | lib3270_unselect(hSession); |
| 617 | 659 | return text; |
| 618 | 660 | } | ... | ... |
ui/00default.xml
| ... | ... | @@ -60,6 +60,7 @@ |
| 60 | 60 | <menu name='EditMenu' label='_Edit' > |
| 61 | 61 | <menuitem action='copy' append='no' format='text' key='<ctrl>c' icon='copy' group='selection' label='Copy' /> |
| 62 | 62 | <menuitem action='copy' append='no' format='table' key='<ctrl><alt>c' group='selection' label='Copy as table' /> |
| 63 | + <menuitem action='cut' append='no' format='text' key='<ctrl>x' icon='cut' group='selection' label='Cut' /> | |
| 63 | 64 | <!-- menuitem action='copy' mode='image' group='selection' label='Copy as image' /--> |
| 64 | 65 | <menuitem action='copy' append='yes' key='<shift><ctrl>c' group='selection' label='Add to copy' /> |
| 65 | 66 | <menuitem action='paste' src='clipboard' key='<ctrl>v' icon='paste' group='paste' label='Paste' /> | ... | ... |
ui/99debug.xml
| ... | ... | @@ -32,7 +32,6 @@ |
| 32 | 32 | <menubar name='topmenu'> |
| 33 | 33 | |
| 34 | 34 | <menu name='EditMenu' label='_Edit' > |
| 35 | - <menuitem action='cut' append='no' format='text' key='<ctrl>x' icon='cut' group='selection' label='Cut' /> | |
| 36 | 35 | <menuitem action='copyashtml' label='Copy as HTML' /> |
| 37 | 36 | </menu> |
| 38 | 37 | ... | ... |