home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / vos2-121.zip / v / srcos2 / vtextc.cpp < prev    next >
C/C++ Source or Header  |  1999-02-20  |  8KB  |  245 lines

  1. //===============================================================
  2. // vtextc.cxx   - Text output cmd - Windows
  3. //
  4. // Copyright (C) 1995,1996,1997,1998  Bruce E. Wampler
  5. //
  6. // This file is part of the V C++ GUI Framework, and is covered
  7. // under the terms of the GNU Library General Public License,
  8. // Version 2. This library has NO WARRANTY. See the source file
  9. // vapp.cxx for more complete information about license terms.
  10. //===============================================================
  11. #include <v/vos2.h>     // for OS/2 stuff
  12. #include <v/vapp.h>
  13. #include <v/vtextc.h>   // our definitions
  14. #include <v/vcmdprnt.h> // a command parent
  15. #include <v/vutil.h>
  16.  
  17.   // Text boxes are subclassed to this procedure
  18.   MRESULT EXPENTRY TextProc(HWND hDlg, ULONG uMsg, MPARAM mp1, MPARAM mp2);
  19.   // this is a pointer to the original MLE procedure that is subclassed
  20.   PFNWP orgTextProc;
  21.  
  22.  
  23. //=====================>>> vTextCmd::vTextCmd <<<=======================
  24.   vTextCmd::vTextCmd(vCmdParent* dp, CommandObject* dc) :
  25.             vCmd(dp, dc)
  26.   {
  27.     initialize();
  28.   }
  29. //=====================>>> vTextCmd::~vTextCmd <<<=======================
  30.   vTextCmd::~vTextCmd()
  31.   {
  32.     SysDebug(Destructor,"vTextCmd::~vTextCmd() destructor\n")
  33.   }
  34. //=====================>>> vTextCmd::initialize <<<=======================
  35.   void vTextCmd::initialize(void)
  36.   {
  37.     // multiline, boxed text output
  38.     SysDebug(Constructor,"vTextCmd::vTextCmd() constructor\n")
  39.     int numLines;
  40.     char* useText;
  41.     char* winCopy = 0;
  42.     char* theText;
  43.     long style = MLS_READONLY;
  44.  
  45.     CopyToLocal();                      // Make local copies of CmdObject
  46.  
  47.     if (!_itemList || (*(char*)_itemList == 0))
  48.     theText = (char*) _title;
  49.     else
  50.     theText = (char*)_itemList;
  51.  
  52.     if (!(dlgCmd->attrs & CA_NoBorder))
  53.     style |= MLS_BORDER;
  54.  
  55.     if (!(dlgCmd->attrs & CA_Hidden))   // Check for Hidden
  56.     style |= WS_VISIBLE;
  57.     // vTextLen returns the max number of characters per line and the number of lines
  58.     _w = vTextLen(theText, numLines)*5+4; // set my width AND get numLines
  59.  
  60.     // calculate max width of multiline text string
  61.     char *str, *start, word[1024];
  62.     int width, maxW=0;
  63.     str=theText;
  64.     start=theText;
  65.     for (int ix=0; *str; str++)
  66.     {
  67.       if (*str == '\n')    // end of current line
  68.       {
  69.         strncpy(word, start, ix);
  70.         width = LabelWidth(word);  // width of current word
  71.         if (width > maxW)
  72.           maxW = width;
  73.         ix = 0;  // reset posn counter
  74.         start = str+1;
  75.       }
  76.       else
  77.         ix++;
  78.     }
  79.     strcpy(word, start);
  80.     width = LabelWidth(word);  // width of current word
  81.     if (width > maxW)
  82.       maxW = width;
  83.  
  84.     _w = maxW + 8; // set my width
  85.  
  86.     if (dlgCmd->size > 0)               // may reset title!
  87.     {
  88.       _w = dlgCmd->size;
  89.     }
  90.  
  91.     if (_parentWin->paneType() == P_Status)
  92.     {
  93.       _h = (LabelHeight() * numLines) + 4;       // (was 7 * numLines)
  94.     }
  95.     else
  96.     {
  97.       _h = (LabelHeight() * numLines) + 4;       // (was 7 * numLines)
  98.     }
  99.     useText = theText;
  100.  
  101.     if (numLines > 1)           // have to convert \n to \r\n
  102.     {
  103.       winCopy = new char[(strlen(theText) + numLines + 1)];
  104.       char * cp;
  105.       for (cp = winCopy ; *useText ; )
  106.       {
  107.     if (*useText == '\n')       // add extra \r
  108.       *cp++ = '\r';
  109.     *cp++ = *useText++;
  110.       }
  111.       *cp = 0;                        // terminate string
  112.       useText = winCopy;
  113.     }
  114.  
  115.     // set the entryfield colors so they blend into the dialog background
  116.     _PPColor[0].PPtype = PP_BACKGROUNDCOLORINDEX;
  117.     _PPColor[0].PPval.color = SYSCLR_DIALOGBACKGROUND;
  118.     _PPColor[1].PPtype = PP_DISABLEDBACKGROUNDCOLORINDEX;
  119.     _PPColor[1].PPval.color = SYSCLR_DIALOGBACKGROUND;
  120.     _PPColor[2].PPtype = PP_HILITEBACKGROUNDCOLORINDEX;
  121.     _PPColor[2].PPval.color = SYSCLR_DIALOGBACKGROUND;
  122.     _PPColor[3].PPtype = PP_HILITEFOREGROUNDCOLORINDEX;
  123.     _PPColor[3].PPval.color = SYSCLR_MENUTEXT;
  124.     _PPColor[4].PPtype = 0;    // end of array marker
  125.  
  126.     _parentWin->SetPosition(_x, _y, _w, _h, dlgCmd->cFrame, dlgCmd->cRightOf,
  127.     dlgCmd->cBelow);
  128.  
  129.       // inc y positions control lower in the allocate ddialog space
  130.       // dec h makes control smaller in allocated space
  131.       _y += 1;
  132. //      _h -= 1;   // we play this game to get better positioning in a frame
  133.  
  134.     _CtrlOffset = _parentWin->AddDlgControl(_x, _y , _w, _h, _cmdId,
  135.        style, WC_MLE, useText, _parentWin->AssyPresParams(_PPColor), 0, NULL);
  136.  
  137.     if (winCopy != 0)
  138.     delete [] winCopy;
  139.   }
  140. //================>>> vTextCmd::SetCmdVal <<<============================
  141.   void vTextCmd::SetCmdVal(ItemVal val, ItemSetType st)
  142.   {
  143.     SysDebug1(Misc,"vTextCmd::SetCmdVal(val:%d)\n",val)
  144.     HWND myHwnd = GetMyHwnd(_cmdId);
  145.  
  146.     switch (st)
  147.     {
  148.       case Sensitive:
  149.     _Sensitive = val;               // set
  150.     WinEnableWindow (myHwnd, val);
  151.     break;
  152.  
  153.       case Hidden:
  154.     if (val)
  155.       WinShowWindow (myHwnd, FALSE);
  156.     else
  157.       WinShowWindow (myHwnd, TRUE);
  158.     break;
  159.     }
  160.   }
  161. //================>>> vTextCmd::SetCmdStr <<<============================
  162.   void vTextCmd::SetCmdStr(VCONST char* str)
  163.   {
  164.     char trunc[80];
  165.     SysDebug1(Misc,"vTextCmd::SetCmdStr(str:%s)\n",strncpy(trunc, str, 60) )
  166.     int numLines;
  167.     VCONST char* useText = str;
  168.     char* winCopy = 0;
  169.     HWND myHwnd = GetMyHwnd(_cmdId);
  170.  
  171.     (void) vTextLen(str, numLines);
  172.     if (numLines > 1)           // have to convert \n to \r\n
  173.       {
  174.     winCopy = new char[(strlen(str) + numLines + 1)];
  175.     char * cp;
  176.     for (cp = winCopy ; *useText ; )
  177.       {
  178.         if (*useText == '\n')       // add extra \r
  179.         *cp++ = '\r';
  180.         *cp++ = *useText++;
  181.       }
  182.     *cp = 0;                        // terminate string
  183.     useText = winCopy;
  184.       }
  185.     WinSetWindowText(myHwnd, useText);
  186.  
  187.     if (winCopy != 0)
  188.     delete [] winCopy;
  189.     _title = str;
  190.   }
  191.  
  192. //================>>> vTextCmd::SubClass <<<============================
  193.   int vTextCmd::DRAWITEM(int id, OWNERITEM* hwnd)
  194.   {
  195.     // used to subclass text labels during the WM_INITDLG setup
  196.     HWND hControl = GetMyHwnd(id);
  197.     WinSetWindowULong(hControl, QWL_USER, (LONG) this);
  198.     _orgTextProc = WinSubclassWindow(hControl, TextProc);
  199.     SysDebug2(OS2Dev,"vTextCmd::SubClass this:%x hControl:%x \n", this, hControl)
  200.     return (0);
  201.   }
  202.  
  203. //====================>>> TextProc <<<=======================
  204. // we subclass the C_BoxedLabel so we can intercept any attempt
  205. // to activate it with a mouse click
  206.   MRESULT EXPENTRY TextProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
  207.   {
  208.     vTextCmd* thisCmd = (vTextCmd*) WinQueryWindowULong( hwnd, QWL_USER ); // Pointer from window word
  209.     if (!thisCmd)
  210.     {
  211.       return (MRESULT) WinDefDlgProc(hwnd, msg, mp1, mp2);
  212.     }
  213.     else
  214.       return (MRESULT) thisCmd->vTextProc(hwnd, msg, mp1, mp2);
  215.   }
  216.  
  217.  
  218.  
  219. //====================>>> vTextProc <<<=======================
  220.   MRESULT vTextCmd::vTextProc(HWND hBtn, ULONG uMsg, MPARAM mp1, MPARAM mp2)
  221.   {
  222.     // set the original frame procedure
  223.     orgTextProc = (PFNWP) _orgTextProc;
  224.  
  225.     switch (uMsg)
  226.     {
  227.       case WM_CHORD:
  228.       case WM_BUTTON1DBLCLK:
  229.       case WM_BUTTON2DBLCLK:
  230.       case WM_BUTTON3DBLCLK:
  231.       case WM_BUTTON1DOWN:
  232.       case WM_BUTTON2DOWN:
  233.       case WM_BUTTON3DOWN:
  234.       case WM_SETFOCUS:
  235.       {
  236.         // user has clicked on the label, so trap message and prevent
  237.         // it from reaching the entry field procedure so that control
  238.         // does not get focus
  239.         return 0;
  240.       }
  241.     }
  242.     return orgTextProc(hBtn, uMsg, mp1, mp2);
  243.   }
  244.  
  245.