home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / fed0217s.zip / source / pmclip.cpp < prev    next >
C/C++ Source or Header  |  2000-12-13  |  4KB  |  199 lines

  1. /*
  2. ** Module   :PMCLIP.CPP
  3. ** Abstract :PM Clipboard interface
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. **
  7. ** Log: Sat  28/03/1998     Created
  8. */
  9.  
  10. #include <string.h>
  11.  
  12. #include <pmproc.h>
  13. #include <buffer.h>
  14.  
  15. extern HAB hab;
  16.  
  17. void Buffer::to_pm()
  18. {
  19.     if(!hab)
  20.         return;
  21.  
  22.     char *pByte = 0;
  23.  
  24.     //Calculate size of buffer
  25.     int sz = 0;
  26.     int i;
  27.  
  28.     for(i = 0; i < Count(); i++)
  29.     {
  30.         sz += line(i)->len();
  31.         sz += 2; //CRLF
  32.     }
  33.     sz++; //NULL terminator
  34.  
  35.     _inOpenClipbrd(hab);
  36.     _inEmptyClipbrd(hab);
  37.  
  38.     if (!DosAllocSharedMem((PPVOID)&pByte, 0, sz,
  39.         PAG_WRITE | PAG_COMMIT | OBJ_GIVEABLE | OBJ_GETTABLE))
  40.     {
  41.         char *ptr = pByte;
  42.  
  43.         for(i = 0; i < Count(); i++)
  44.         {
  45.             line(i)->build_print(ptr);
  46.             ptr += line(i)->len();
  47.             *ptr++ = '\r';
  48.             *ptr++ = '\n';
  49.             *ptr   = 0;
  50.         }
  51.         _inSetClipbrdData(hab, (ULONG) pByte, CF_TEXT, CFI_POINTER);
  52.     }
  53.     _inCloseClipbrd(hab);
  54. }
  55.  
  56. void Buffer::from_pm()
  57. {
  58.     if(!hab)
  59.         return;
  60.  
  61.     char *ClipData;
  62.     ULONG ulFormat;
  63.  
  64.     _inQueryClipbrdFmtInfo(hab, CF_TEXT, &ulFormat);
  65.  
  66.     if(ulFormat != CFI_POINTER)
  67.         return;
  68.  
  69.     _inOpenClipbrd(hab);
  70.  
  71.     RemoveAll();
  72.     ClipData = (char *)_inQueryClipbrdData(hab, CF_TEXT);
  73.  
  74.     if(ClipData)
  75.     {
  76.         char *str;
  77.         char *ptr;
  78.         char *tmp = new char[strlen(ClipData)+1];
  79.         int sz = -1;
  80.  
  81.         set_column_block(1);
  82.  
  83.         strcpy(tmp, ClipData);
  84.  
  85.         for(ptr = str = tmp; *str;)
  86.         {
  87.             while(*str && *str != '\n')
  88.                 str++;
  89.  
  90.             if(*str)
  91.             {
  92.                 if(*(str - 1) == '\r')
  93.                     *(str - 1) = 0;
  94.                 *str++ = 0;
  95.                 if(*str == '\r' || *str == '\n')
  96.                     *str++ = 0;
  97.             }
  98.  
  99.             PLine ln = new Line(ptr);
  100.             ln->touch();
  101.  
  102.             if(sz < 0)
  103.                 sz = ln->len();
  104.             else
  105.                 if(sz != ln->len() || !sz)
  106.                     set_column_block(0);
  107.  
  108.             Add(ln);
  109.             ptr = str;
  110.         }
  111.         delete tmp;
  112.     }
  113.  
  114.     _inCloseClipbrd(hab);
  115.     return;
  116. }
  117.  
  118. //--------------------------------------------------------------
  119. // Buffer->text and text->Buffer conversion
  120. //--------------------------------------------------------------
  121.  
  122. char* Buffer::as_text()
  123. {
  124.     char *pByte = 0;
  125.  
  126.     //Calculate size of buffer
  127.     int sz = 0;
  128.     int i;
  129.  
  130.     for(i = 0; i < Count(); i++)
  131.     {
  132.         sz += line(i)->len();
  133.         sz += 2; //CRLF
  134.     }
  135.     sz++; //NULL terminator
  136.  
  137.     if(!DosAllocMem((PPVOID)&pByte, sz, PAG_WRITE | PAG_COMMIT))
  138.     {
  139.         char *ptr = pByte;
  140.  
  141.         for(i = 0; i < Count(); i++)
  142.         {
  143.             line(i)->build_print(ptr);
  144.             ptr += line(i)->len();
  145.             *ptr++ = '\r';
  146.             *ptr++ = '\n';
  147.             *ptr   = 0;
  148.         }
  149.     }
  150.  
  151.     return pByte;
  152. }
  153.  
  154. void Buffer::from_text(char *ClipData)
  155. {
  156.     if(!ClipData)
  157.         return;
  158.  
  159.     char *str;
  160.     char *ptr;
  161.     char *tmp = new char[strlen(ClipData)+1];
  162.     int sz = -1;
  163.  
  164.     RemoveAll();
  165.  
  166.     set_column_block(1);
  167.  
  168.     strcpy(tmp, ClipData);
  169.  
  170.     for(ptr = str = tmp; *str;)
  171.     {
  172.         while(*str && *str != '\n')
  173.             str++;
  174.  
  175.         if(*str)
  176.         {
  177.             if(*(str - 1) == '\r')
  178.                 *(str - 1) = 0;
  179.             *str++ = 0;
  180.             if(*str == '\r' || *str == '\n')
  181.                 *str++ = 0;
  182.         }
  183.  
  184.         PLine ln = new Line(ptr);
  185.         ln->touch();
  186.  
  187.         if(sz < 0)
  188.             sz = ln->len();
  189.         else
  190.             if(sz != ln->len())
  191.                 set_column_block(0);
  192.  
  193.         Add(ln);
  194.         ptr = str;
  195.     }
  196.     delete tmp;
  197. }
  198.  
  199.