home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 17 / CD_ASCQ_17_101194.iso / vrac / ve2tv103.zip / TMSGVIEW.CPP < prev    next >
C/C++ Source or Header  |  1994-07-31  |  5KB  |  191 lines

  1. // File    : TMSGVIEW.CPP
  2. // Author  : Eric Woodruff,  CIS ID: 72134,1150
  3. // Updated : Sun 07/31/94 15:56:28
  4. // Note    : Copyright 1994, Eric Woodruff, All rights reserved
  5. // Compiler: Borland C++ 3.1 to 4.02
  6. //
  7. // This file contains the message viewer class.
  8. //
  9.  
  10. #include <stdio.h>
  11. #include <string.h>
  12.  
  13. #define Uses_TDeskTop
  14. #define Uses_TEvent
  15. #define Uses_TKeys
  16. #define Uses_TListViewer
  17. #define Uses_TNSCollection
  18. #define Uses_TProgram
  19. #define Uses_TScrollBar
  20. #define Uses_TWindow
  21. #define Uses_TVCOLR
  22. #include <tv.h>
  23.  
  24. #if !defined(cpDefSize)
  25. // Use this if you chose not to modify the Turbo Vision files.
  26. #include <tvcolr.h>
  27. #endif
  28.  
  29. #include <tvmedit.h>
  30.  
  31. #define Uses_TMsgViewWindow
  32. #include <tmsgview.h>
  33.  
  34. // ============================================================================
  35. //
  36. // Message list viewer window.
  37. //
  38. TMsgViewWindow::TMsgViewWindow(const TRect &bounds, const char *aTitle) :
  39.     TWindow(bounds, aTitle, wnNoNumber),
  40.     TWindowInit(&TMsgViewWindow::initFrame),
  41.     isValid(True)
  42. {
  43.     options |= ofTileable;
  44.     growMode |= gfGrowAll;
  45.  
  46.     TScrollBar *vScrollBar = standardScrollBar(sbVertical | sbHandleKeyboard);
  47.     TScrollBar *hScrollBar = standardScrollBar(sbHorizontal |  sbHandleKeyboard);
  48.  
  49.     if(!vScrollBar || !hScrollBar)
  50.         isValid = False;
  51.     else
  52.     {
  53.         enableCommand(cmPrevMsg);
  54.         enableCommand(cmNextMsg);
  55.  
  56.         TRect r = getClipRect();    // Get exposed view bounds
  57.         r.grow(-1, -1);           // Shrink to fit inside window frame
  58.  
  59.         msgList = (TMsgListViewer *)new TMsgListViewer(r, hScrollBar,
  60.             vScrollBar);
  61.  
  62.         insert(msgList);
  63.     }
  64. }
  65.  
  66. TMsgViewWindow::~TMsgViewWindow()
  67. {
  68.     disableCommand(cmPrevMsg);
  69.     disableCommand(cmNextMsg);
  70. }
  71.  
  72. #pragma argsused
  73. Boolean TMsgViewWindow::valid(ushort command)
  74. {
  75.     return isValid;
  76. }
  77.  
  78. //void TMsgViewWindow::close()
  79. //{
  80. //    hide();        // Never really closed, just hidden.
  81. //}
  82.  
  83. char cpMsgWindow[] = { cMsgFramePassive, cMsgFrameActive, cMsgFrameIcon,
  84.                        cMsgSBPage, cMsgSBCtrl, cMsgNText, cMsgSText,
  85.                        cMsgSelected };
  86.  
  87. TPalette &TMsgViewWindow::getPalette() const
  88. {
  89.   // No "- 1" because it's an array!
  90.   static TPalette palette(cpMsgWindow, sizeof(cpMsgWindow));
  91.   return palette;
  92. }
  93.  
  94. // ============================================================================
  95. //
  96. // Message list viewer class.
  97. //
  98. TMsgListViewer::TMsgListViewer(const TRect &bounds, TScrollBar *aHScrollBar,
  99.   TScrollBar *aVScrollBar) :
  100.     TListViewer(bounds, 1, aHScrollBar, aVScrollBar)
  101. {
  102.     growMode = gfGrowHiY | gfGrowHiX;
  103.     Msgs = new TNSCollection(5, 5);
  104.     setRange(0);
  105.  
  106.     hScrollBar->setParams(0, 0, 249, hScrollBar->pgStep, hScrollBar->arStep);
  107. }
  108.  
  109. void TMsgListViewer::getText(char *dest, short item, short maxLen)
  110. {
  111.     memset(dest, 0, 250);
  112.  
  113.     if(item < Msgs->getCount() && maxLen < 250)
  114.     {
  115.         TMessage *mp = (TMessage *)Msgs->at(item);
  116.  
  117.         strncpy(dest, mp->MsgEntry, maxLen);
  118.         dest[maxLen] = EOS;
  119.     }
  120. }
  121.  
  122. void TMsgListViewer::handleEvent(TEvent &event)
  123. {
  124.     TMessage *mp;
  125.     short curItem = focused;
  126.  
  127.     TListViewer::handleEvent(event);
  128.  
  129.     // These need to be broadcast events so that they can be handled
  130.     // even when the viewer is not the active window.  The application
  131.     // must convert them to broadcast events.
  132.     if(event.what == evBroadcast)
  133.         switch(event.message.command)
  134.         {
  135.             case cmPrevMsg:
  136.                 clearEvent(event);
  137.                 focusItemNum(focused - 1);
  138.                 break;
  139.  
  140.             case cmNextMsg:
  141.                 clearEvent(event);
  142.                 focusItemNum(focused + 1);
  143.                 break;
  144.         }
  145.  
  146.     // Selected item changed so tell the editor to change lines.
  147.     if(curItem != focused)
  148.     {
  149.         mp = (TMessage *)Msgs->at(focused);
  150.  
  151.         // Only broadcast when there is a row to jump to.
  152.         if(mp->Line)
  153.             message(TProgram::deskTop, evBroadcast, cmSetLine, &mp->Line);
  154.     }
  155. }
  156.  
  157. #define cpMsgListViewer "\x06\x06\x07\x08"
  158.  
  159. TPalette &TMsgListViewer::getPalette() const
  160. {
  161.   // Must include "- 1" to ignore NULL byte in string.
  162.   static TPalette palette(cpMsgListViewer, sizeof(cpMsgListViewer) - 1);
  163.   return palette;
  164. }
  165.  
  166. void TMsgListViewer::setState(ushort aState, Boolean enable)
  167. {
  168.     TListViewer::setState(aState, enable);
  169.  
  170.     if((aState == sfActive || aState == sfSelected) && enable &&
  171.       Msgs->getCount())
  172.     {
  173.         TMessage *mp = (TMessage *)Msgs->at(focused);
  174.  
  175.         // Only broadcast when there is a row to jump to.
  176.         if(mp->Line)
  177.             message(TProgram::deskTop, evBroadcast, cmSetLine, &mp->Line);
  178.     }
  179. }
  180.  
  181. void TMsgListViewer::insertMsg(long Line, char *Message)
  182. {
  183.     TMessage *mp = new TMessage;
  184.  
  185.     mp->Line = Line;
  186.     strcpy(mp->MsgEntry, Message);
  187.     Msgs->insert(mp);
  188.     setRange(Msgs->getCount());
  189.     drawView();
  190. }
  191.