home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / tv20cpp.zip / src / help.cpp < prev    next >
C/C++ Source or Header  |  1998-05-03  |  7KB  |  274 lines

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