home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_122 / 10.ddi / TVSRC.ZIP / HELP.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-10  |  8.5 KB  |  298 lines

  1. /*------------------------------------------------------------*/
  2. /* filename -       Help.cpp                                  */
  3. /*                                                            */
  4. /* function(s)                                                */
  5. /*                  Member function(s) of following classes   */
  6. /*                      THelpViewer                           */
  7. /*                      THelpWindow                           */
  8. /*------------------------------------------------------------*/
  9.  
  10. /*------------------------------------------------------------*/
  11. /*                                                            */
  12. /*    Turbo Vision -  Version 1.0                             */
  13. /*                                                            */
  14. /*                                                            */
  15. /*    Copyright (c) 1991 by Borland International             */
  16. /*    All Rights Reserved.                                    */
  17. /*                                                            */
  18. /*------------------------------------------------------------*/
  19.  
  20. #define Uses_TStreamableClass
  21. #define Uses_TPoint
  22. #define Uses_TStreamable
  23. #define Uses_ipstream
  24. #define Uses_opstream
  25. #define Uses_fpstream
  26. #define Uses_TRect
  27. #define Uses_TScrollBar
  28. #define Uses_TScroller
  29. #define Uses_TDrawBuffer
  30. #define Uses_TEvent
  31. #define Uses_TWindow
  32. #define Uses_TKeys
  33. #define Uses_TPalette
  34. #include <tv.h>
  35.  
  36. #if !defined( __HELP_H )
  37. #include "Help.h"
  38. #endif  // __HELP_H
  39.  
  40. #if !defined( __UTIL_H )
  41. #include "Util.h"
  42. #endif  // __UTIL_H
  43.  
  44. #if !defined( __STRING_H )
  45. #include <string.h>
  46. #endif  // __STRING_H
  47.  
  48. #if !defined( __LIMITS_H )
  49. #include <limits.h>
  50. #endif  // __LIMITS_H
  51.  
  52. #if !defined( __STAT_H )
  53. #include <sys\stat.h>
  54. #endif  // __STAT_H
  55.  
  56. #if !defined( __CTYPE_H )
  57. #include <ctype.h>
  58. #endif  // __CTYPE_H
  59.  
  60. #if !defined( __IO_H )
  61. #include <io.h>
  62. #endif  // __IO_H
  63.  
  64. #pragma warn -dsz
  65.  
  66. // THelpViewer
  67.  
  68. THelpViewer::THelpViewer( const TRect& bounds, TScrollBar* aHScrollBar,
  69.     TScrollBar* aVScrollBar, THelpFile *aHelpFile, ushort context )
  70.     : TScroller( bounds, aHScrollBar, aVScrollBar )
  71. {
  72.     options = (options | ofSelectable);
  73.     growMode = gfGrowHiX | gfGrowHiY;
  74.     hFile = aHelpFile;
  75.     topic = aHelpFile->getTopic(context);
  76.     topic->setWidth(size.x);
  77.     setLimit(78, topic->numLines());
  78.     selected = 1;
  79. }
  80.  
  81. THelpViewer::~THelpViewer()
  82. {
  83.     delete hFile;
  84.     delete topic;
  85. }
  86.  
  87. void THelpViewer::changeBounds( TRect& bounds )
  88. {
  89.     TScroller::changeBounds(bounds);
  90.     topic->setWidth(size.x);
  91.     setLimit(limit.x, topic->numLines());
  92. }
  93.  
  94. void THelpViewer::draw()
  95. {
  96.     TDrawBuffer b;
  97.     char line[256];
  98.     char buffer[256];
  99.     char *bufPtr;
  100.     int i, j, l;
  101.     int keyCount;
  102.     ushort normal, keyword, selKeyword, c;
  103.     TPoint keyPoint;
  104.     uchar keyLength;
  105.     int keyRef;
  106.  
  107.     normal = getColor(1);
  108.     keyword = getColor(2);
  109.     selKeyword = getColor(3);
  110.     keyCount = 0;
  111.     keyPoint.x = 0;
  112.     keyPoint.y = 0;
  113.     topic->setWidth(size.x);
  114.     if (topic->getNumCrossRefs() > 0)
  115.         {
  116.         do
  117.             {
  118.             ++keyCount;
  119.             topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef);
  120.             } while ( (keyCount <= topic->getNumCrossRefs()) && (keyPoint.y < delta.y));
  121.         }
  122.     for (i = 1; i <= size.y; ++i)
  123.         {
  124.         b.moveChar(0, ' ', normal, size.x);
  125.         strcpy(line, topic->getLine(i + delta.y));
  126.         if (strlen(line) > delta.x)
  127.             {
  128.             bufPtr = line + delta.x; 
  129.             strncpy(buffer, bufPtr, size.x);
  130.             buffer[size.x] = 0;
  131.             b.moveStr(0, buffer, normal);
  132.             }
  133.         else
  134.             b.moveStr(0, "", normal);
  135.         while (i + delta.y == keyPoint.y)
  136.             {
  137.             l = keyLength;
  138.             if (keyPoint.x < delta.x )
  139.                 {
  140.                 l -= (delta.x - keyPoint.x);
  141.                 keyPoint.x = delta.x;
  142.                 }
  143.             if (keyCount == selected)
  144.                 c = selKeyword;
  145.             else
  146.                 c = keyword;
  147.             for(j = 0; j < l; ++j)
  148.                 b.putAttribute((keyPoint.x - delta.x + j),c);
  149.             ++keyCount;
  150.             if (keyCount <= topic->getNumCrossRefs())
  151.                 topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef);
  152.             else
  153.                 keyPoint.y = 0;
  154.             }
  155.         writeLine(0, i-1, size.x, 1, b);
  156.         }
  157. }
  158.  
  159. TPalette& THelpViewer::getPalette() const
  160. {
  161.     static TPalette palette(cHelpViewer, sizeof( cHelpViewer)-1);
  162.     return palette;
  163. }
  164.  
  165. void THelpViewer::makeSelectVisible( int selected, TPoint& keyPoint,
  166.          uchar& keyLength, int& keyRef )
  167. {
  168.     TPoint d;
  169.  
  170.     topic->getCrossRef(selected, keyPoint, keyLength, keyRef);
  171.     d = delta;
  172.     if (keyPoint.x < d.x)
  173.         d.x = keyPoint.x;
  174.     if (keyPoint.x > d.x + size.x)
  175.         d.x = keyPoint.x - size.x;
  176.     if (keyPoint.y < d.y)
  177.         d.y = keyPoint.y;
  178.     if (keyPoint.y > d.y + size.y)
  179.         d.y = keyPoint.y - size.y;
  180.     if ((d.x != delta.x) || (d.y != delta.y))
  181.          scrollTo(d.x, d.y);
  182. }
  183.  
  184. void THelpViewer::switchToTopic( int keyRef )
  185. {
  186.     if (topic != 0)
  187.         delete topic;
  188.     topic = hFile->getTopic(keyRef);
  189.     topic->setWidth(size.x);
  190.     scrollTo(0, 0);
  191.     setLimit(limit.x, topic->numLines());
  192.     selected = 1;
  193.     drawView();
  194. }
  195.  
  196. void THelpViewer::handleEvent( TEvent& event )
  197. {
  198.  
  199.     TPoint keyPoint, mouse;
  200.     uchar keyLength;
  201.     int keyRef;
  202.     int keyCount;
  203.  
  204.  
  205.     TScroller::handleEvent(event);
  206.     switch (event.what)
  207.         {
  208.  
  209.         case evKeyDown:
  210.             switch (event.keyDown.keyCode)
  211.                 {
  212.                 case kbTab:
  213.                     ++selected;
  214.                     if (selected > topic->getNumCrossRefs())
  215.                         selected = 1;
  216.                     if ( topic->getNumCrossRefs() != 0 )
  217.                         makeSelectVisible(selected-1,keyPoint,keyLength,keyRef);
  218.                     break;
  219.                 case kbShiftTab:
  220.                     --selected;
  221.                     if (selected == 0)
  222.                         selected = topic->getNumCrossRefs();
  223.                     if ( topic->getNumCrossRefs() != 0 )
  224.                         makeSelectVisible(selected-1,keyPoint,keyLength,keyRef);
  225.                     break;
  226.                 case kbEnter:
  227.                     if (selected <= topic->getNumCrossRefs())
  228.                         {
  229.                         topic->getCrossRef(selected-1, keyPoint, keyLength, keyRef);
  230.                         switchToTopic(keyRef);
  231.                         }
  232.                     break;
  233.                 case kbEsc:
  234.                     event.what = evCommand;
  235.                     event.message.command = cmClose;
  236.                     putEvent(event);
  237.                     break;
  238.                 default:
  239.                     return;
  240.                 }
  241.             drawView();
  242.             clearEvent(event);
  243.             break;
  244.  
  245.         case evMouseDown:
  246.             mouse = makeLocal(event.mouse.where);
  247.             mouse.x += delta.x;
  248.             mouse.y += delta.y;
  249.             keyCount = 0;
  250.  
  251.             do
  252.             {
  253.                 ++keyCount;
  254.                 if (keyCount > topic->getNumCrossRefs())
  255.                     return;
  256.                 topic->getCrossRef(keyCount-1, keyPoint, keyLength, keyRef);
  257.             } while (!((keyPoint.y == mouse.y+1) && (mouse.x >= keyPoint.x) &&
  258.                   (mouse.x < keyPoint.x + keyLength)));
  259.             selected = keyCount;
  260.             drawView();
  261.             if (event.mouse.doubleClick)
  262.                 switchToTopic(keyRef);
  263.             clearEvent(event);
  264.             break;
  265.  
  266.         case evCommand:
  267.             if ((event.message.command == cmClose) && (owner->state && sfModal != 0))
  268.                 {
  269.                 endModal(cmClose);
  270.                 clearEvent(event);
  271.                 }
  272.             break;
  273.         }
  274. }
  275.  
  276. // THelpWindow 
  277.  
  278. THelpWindow::THelpWindow( THelpFile *hFile, ushort context ):
  279.        TWindow( TRect(0,0,50,18), "Help", wnNoNumber ),
  280.        TWindowInit( &THelpWindow::initFrame)
  281. {
  282.     TRect r(0, 0, 50, 18);
  283.     options = (options | ofCentered);
  284.     r.grow(-2,-1);
  285.     insert(new THelpViewer (r,
  286.       standardScrollBar(sbHorizontal | sbHandleKeyboard),
  287.       standardScrollBar(sbVertical | sbHandleKeyboard), hFile, context));
  288. }
  289.  
  290. TPalette& THelpWindow::getPalette() const
  291. {
  292.     static TPalette palette(cHelpWindow, sizeof( cHelpWindow)-1);
  293.     return palette;
  294. }
  295.  
  296. #pragma warn .dsz
  297.  
  298.