home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 26 / CD_ASCQ_26_1295.iso / vrac / tvme30.zip / TMSGVIEW.CPP < prev    next >
C/C++ Source or Header  |  1995-08-02  |  5KB  |  203 lines

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