Commit 91a931dfd7e4762c1f3b0725a1ff49c085cdebf4

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

Implementação parcial do comando "cut"

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  
... ...