home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / CLIPPER / NCCLIB.ZIP / NCCVIEW.ZIP / G_HELP.PRG < prev    next >
Text File  |  1993-12-12  |  24KB  |  789 lines

  1. //═══════════════════════════════════════════════════════╕
  2. //  Program .....: G_Help                                │
  3. //  CopyRight ...: 1993 National Computer Consultants    │
  4. //                 All rights are reserved.              │
  5. //  Author ......: Greg Rice                             │
  6. //═══════════════════════════════════════════════════════╛
  7.  
  8. #include "nccview.ch"
  9. #include "g_event.ch"
  10. #include "inkey.ch"
  11. #include "mouse.ch"
  12. #include "fileio.ch"
  13.  
  14. /*
  15.  ┌─────────────────────────────────────────────────────┐
  16.  │from  buildhlp.exe                                   │
  17.  │                                                     │
  18.  │      Structure                                      │
  19.  │      ~~~~~~~~~                                      │
  20.  │                                                     │
  21.  │      Offset             Id                          │
  22.  │      ------             -------------------         │
  23.  │      0-1                HELPFILE_ID                 │
  24.  │      2-3                Marker Length               │
  25.  │      4-5                Id Length                   │
  26.  │      6-9                Total Header Length         │
  27.  │                         Id marker                   │
  28.  │                         Help id's ...               │
  29.  │                         Text ...                    │
  30.  └─────────────────────────────────────────────────────┘
  31. */
  32.  
  33.  
  34. #define HELPFILE               "Nccviews.hlp"
  35. #define HELPFILE_ID            'GR'
  36. #define CRLF                   chr(13)+chr(10)
  37.  
  38. #xtranslate ftell( <x> )  =>   fseek( <x>, 0, FS_RELATIVE )
  39.  
  40.  
  41. //--------------------------------------------------------------------------
  42.  
  43.  
  44. static H_marker     := NIL, ;
  45.        H_marker_len := NIL, ;
  46.        H_id_len     := NIL, ;
  47.        H_header_len := NIL
  48.  
  49.  
  50.  
  51. //─────────────┐
  52. // Online Help │
  53. //─────────────┘
  54. Function Gen_Help( xsearch )
  55.  
  56.     local nOffset  := -1                  , ;
  57.           nLen     := -1                  , ;
  58.           nHandle                         , ;
  59.           aId                             , ;
  60.           aView                           , ;
  61.           nKey                            , ;
  62.           i                               , ;
  63.           vBar                            , ;
  64.           a                               , ;
  65.           y                               , ;
  66.           x                               , ;
  67.           xCursor := SetCursor( 0 )       , ;
  68.           xScrn   := savescreen()
  69.  
  70.  
  71.     if (nHandle := fopen(HELPFILE, FO_READ+FO_SHARED)) == -1
  72.       NccPopUp('\nUnable to open help file\nPress any key to continue.\n', ;
  73.                Message_Color(), 5 ;
  74.               )
  75.       SetCursor( xCursor )
  76.       ShowBackGround()
  77.       Return( NIL )
  78.     endif
  79.  
  80.     aId := HelpLink( nHandle )
  81.  
  82.     if Empty(aId)
  83.       NccPopUp('\nInvalid help file\nPress any key to continue.\n', ;
  84.                Message_Color(), 5 ;
  85.               )
  86.       SetCursor( xCursor )
  87.       ShowBackGround()
  88.       Return( NIL )
  89.     endif
  90.  
  91.     if xSearch == NIL
  92.       nOffset := aId[1,2]     //  Offset of Id in help file
  93.       nLen    := aId[1,3]     //  Length of help for this Id
  94.       ViewHelpIndex( aId, @nOffset, @nLen )
  95.       if lastkey() == K_ESC
  96.         SetCursor( xCursor )
  97.         Return( NIL )
  98.       endif
  99.     else
  100.       a := ascan( aId, { |x| a == uppe(x[1]) } )
  101.       if a == 0
  102.         a := 1
  103.       endif
  104.       nOffset := aId[a,2]     //  Offset of Id in help file
  105.       nLen    := aId[a,3]     //  Length of help for this Id
  106.     endif
  107.  
  108.     ShowFile( nHandle, aId, nOffset, nLen )
  109.  
  110.     fClose( nHandle )
  111.  
  112.     restscreen(,,,,xScrn)
  113.     SetCursor( xCursor )
  114.  
  115. Return( NIL )
  116.  
  117.  
  118. //-----------------------------------------------------------------------------
  119.  
  120.  
  121. //───────────────────┐
  122. // Display Help file │
  123. //───────────────────┘
  124. static function ShowFile( nHandle, aId, nOffset, nLen )
  125.  
  126.     local o                                                  , ;
  127.           vBar                                               , ;
  128.           xCursor := SET(_SET_CURSOR,0)                      , ;
  129.           xScrn   := savescreen()                            , ;
  130.           xColor  := SetColor( Title_Color() )               , ;
  131.           row     := Row()                                   , ;
  132.           col     := Col()                                   , ;
  133.           linebuf := space(512)                              , ;
  134.           nKey2                                              , ;
  135.           whereami                                           , ;
  136.           hLen                                               , ;
  137.           xtmp                                               , ;
  138.           Mouse   := MouseSys()                              , ;
  139.           Button                                             , ;
  140.           mRow                                               , ;
  141.           mColumn
  142.  
  143.     Showbackground()
  144.  
  145.     whereami := fseek(nHandle,nOffset+1,0)
  146.  
  147.     fread( nHandle, @linebuf, 80 )
  148.     whereami := fseek( nHandle, noffset + at( CRLF, linebuf ) + 2, FS_SET )
  149.                                                // save where I am
  150.  
  151.     fseek( nHandle,6, FS_SET)                  // position at Header Length
  152.     xtmp := space(4)                           // read header length
  153.     fread( nHandle, @xtmp, 4 )                 //
  154.     hLen := bin2l( xtmp ) + 2                  // header len + CRLF
  155.  
  156.     fseek(nHandle,whereami,0)                  // reset to where I was
  157.  
  158.     WinBox(2,,,,,5)
  159.     @ Maxrow()-2,1 say replicate('─',maxcol()-1)
  160.     @ maxrow()-1,1 say space(maxcol()-1) color Title_Color()
  161.     UnGrayLocalMenu()
  162.  
  163.     o                  :=  dViewTXT():New(3,2,maxrow()-3,maxcol()-2,nhandle)
  164.     o:DataBlock        := { || hLine(o) }
  165.     o:InverseColor     := setcolor( "W+/R" )
  166.     o:GoTopBlock       := { || o:dvFileSet( hLen+1 ), o:Down(), o:Refresh := .t. }
  167.     o:WhileBlock       := { || o:FilePos > hLen .and. ! o:AtBottom .and. ! o:AtTop }
  168.     o:SkipBlock        := { |n| Skipper(o,n) }
  169.     o:UserSlot         := o:StatusBlock
  170.     o:StatusBlock      := { |n| helpStat(o, n) }
  171.     o:UseStyle         := .t.
  172.  
  173.     vBar := NccvBar():New( 3                             , ;
  174.                            maxcol()                      , ;
  175.                            maxrow()-3                    , ;
  176.                            maxcol()                      , ;
  177.                            o:FileLen                       ;
  178.                          )
  179.  
  180.     o:Activate() ; vBar:Activate()
  181.  
  182.     Mouse:Activate()
  183.     Mouse:Delay := 0
  184.  
  185.     while .t.
  186.  
  187.       o:Stabilize() ; vBar:Update( if( o:AtBottom, o:FileLen, o:filePos ) )
  188.  
  189.       Mouse:MouseRead()
  190.  
  191.       if Mouse:Ascii # 0
  192.         nKey2 := Mouse:Ascii
  193.       else
  194.         Button  := Mouse:Button
  195.         mRow    := Mouse:Row
  196.         mColumn := Mouse:Column
  197.  
  198.         Do Case
  199.  
  200.           Case Button == 2
  201.              Exit
  202.  
  203.           Case Button == 1 .and. mRow == 23  .and. mColumn >= 2 .and. mColumn <= 3
  204.              keyboard CHR(K_F1)
  205.  
  206.           Case Button == 1 .and. mRow == 23  .and. mColumn >= 19 .and. mColumn <= 21
  207.              keyboard CHR(K_ESC)
  208.  
  209.           Case Button == 1 .and. mRow == 23  .and. mColumn >= 30 .and. mColumn <= 33
  210.              keyboard CHR(K_PGUP)
  211.  
  212.           Case Button == 1 .and. mRow == 23  .and. mColumn >= 35 .and. mColumn <= 38
  213.              keyboard CHR(K_PGDN)
  214.  
  215.           Case Button == 1 .and. mRow == 3  .and. mColumn == maxcol()
  216.              o:Home() ; o:Up()   ; vBar:Update(o:FilePos)
  217.  
  218.           Case Button == 1 .and. mRow == maxrow()-3 .and. mColumn == maxcol()
  219.              o:End()  ; o:Down() ; vBar:Update(o:FilePos)
  220.  
  221.         EndCase
  222.  
  223.         LOOP
  224.  
  225.       endif
  226.  
  227.       Do Case
  228.         Case nKey2 == K_ESC
  229.           exit
  230.  
  231.         Case nKey2 == K_LEFT .or. nKey2 == K_RIGHT          // do nothing
  232.  
  233.         Case nKey2 == K_F1
  234.           GrayLocalMenu()
  235.           whereami := ftell( nHandle )
  236.           if whereami >= aId[len(aId),2]
  237.             whereami := len(aId)
  238.           else
  239.             whereami := ascan( aId, { |o| o[2] > whereami } ) - 1
  240.           endif
  241.           ViewHelpIndex( aId, @nOffset, @nLen, whereami )
  242.           UnGrayLocalMenu()
  243.           if lastkey() # K_ESC
  244.             whereami := fseek(nHandle,nOffset+1,0)
  245.             fread( nHandle, @linebuf, 80 )
  246.             whereami := fseek( nHandle, noffset + at( CRLF, linebuf ) + 2, FS_SET )
  247.             o:dvFileSet( whereami )
  248.             o:RefreshAll( 0 )
  249.           endif
  250.  
  251.         Otherwise
  252.            if nKey2 == K_DOWN .or. nKey2 == K_CTRL_PGDN .or. nKey2 == K_PGDN
  253.              o:End()
  254.            elseif nKey2 == K_UP .or. nKey2 == K_CTRL_PGUP .or. nKey2 == K_PGUP
  255.              o:Home()
  256.            endif
  257.            o:StandardKeys( nKey2 )
  258.  
  259.       EndCase
  260.     enddo
  261.  
  262.     set( _SET_CURSOR, xCursor )
  263.     Setcolor( xColor )
  264.     restscreen(,,,,xScrn)
  265.     setpos( row,col )
  266.  
  267. Return( NIL )
  268.  
  269.  
  270. //-----------------------------------------------------------------------------
  271.  
  272.  
  273. //──────────────────────────────────────────┐
  274. //  Build an array of Indeces for Help file │
  275. //──────────────────────────────────────────┘
  276. static function HelpLink( nHandle )
  277.  
  278.     local xTmp                          , ;
  279.           nLen                          , ;
  280.           aRetVal := {}                 , ;
  281.           cHeaderBuffer                 , ;
  282.           nTextOffset                   , ;
  283.           nTextLen
  284.  
  285.  
  286.     xTmp := space(10)
  287.  
  288.     if ! fread( nHandle, @xTmp, 10 ) == 10
  289.       * <Invalid Helpfile>
  290.       Return( {} )
  291.     endif
  292.  
  293.     H_marker_len  := bin2i( subs( xTmp,3,2 ) )
  294.     H_id_len      := bin2i( subs( xTmp,5,2 ) )
  295.     H_header_len  := bin2l( subs( xTmp,7,4 ) )
  296.  
  297.     if subs(xTmp,1,2) # HELPFILE_ID
  298.       * <Invalid Helpfile id>
  299.       Return( {} )
  300.     endif
  301.  
  302.  
  303.     xTmp := space( H_marker_len )
  304.  
  305.     if ! fread( nHandle, @xTmp, H_marker_len ) == H_marker_len
  306.       * <Invalid Helpfile id>
  307.       Return( {} )
  308.     endif
  309.  
  310.     H_marker := xTmp
  311.  
  312.     nLen := H_header_len - H_marker_len - 10        // rest of header
  313.                                                     // from marker thru id's
  314.     if nLen > ( ( memory(1) * 1024 ) - 1 )          // nLen > Character Space
  315.       * <Not enough memory to load header>
  316.       Return( {} )
  317.     endif
  318.  
  319.     cHeaderBuffer := space( nLen )
  320.  
  321.     IF ! fread( nHandle, @cHeaderBuffer, nLen ) == nLen
  322.       * <Could not read bytes reported by header length bytes>
  323.       Return( {} )
  324.  
  325.     END
  326.  
  327.     nLen := len(cHeaderBuffer)
  328.  
  329.     While .t.
  330.       if nLen < H_marker_len
  331.         exit
  332.       endif
  333.       xtmp        := subs(cHeaderBuffer,1,H_id_len+8)
  334.       nTextOffset := bin2l( subs(xtmp,H_id_len+1,4 ) )
  335.       nTextLen    := bin2l( subs(xtmp,H_id_len+4+1,4) )
  336.       aadd( aRetVal, { subs(xTmp,1,H_id_len), nTextOffset, nTextLen } )
  337.       nLen -= (H_id_len+8)
  338.       cHeaderBuffer := subs(cHeaderBuffer,(H_id_len+9))
  339.  
  340.     Enddo
  341.  
  342. Return( aRetVal )
  343.  
  344.  
  345. //-----------------------------------------------------------------------------
  346.  
  347.  
  348. //────────────────────┐
  349. // Display Help Index │
  350. //────────────────────┘
  351. static Function ViewHelpIndex( aArray, nOffset, nLen, StartPos )
  352.  
  353.     local aView                                                   , ;
  354.           vBar                                                    , ;
  355.           nKey                                                    , ;
  356.           nKey2                                                   , ;
  357.           row    := row()                                         , ;
  358.           col    := col()                                         , ;
  359.           Top                                                     , ;
  360.           Left                                                    , ;
  361.           Bottom                                                  , ;
  362.           Right                                                   , ;
  363.           xScrn   := savescreen()                                 , ;
  364.           xCursor := Set( _SET_CURSOR, 0 )                        , ;
  365.           nRetVal := 0                                            , ;
  366.           xColor                                                  , ;
  367.           Mouse   := MouseSys()                                   , ;
  368.           Button                                                  , ;
  369.           mRow                                                    , ;
  370.           mColumn
  371.  
  372.  
  373.     Top    := 04
  374.     Left   := max( 0, int( (maxcol() - len( aArray[1,1])+2) /2 ) - 2 )
  375.     Bottom := min(maxrow()-6,Top+len(aArray) )
  376.     Right  := Left + len(aArray[1,1])+1
  377.     xColor := SetColor( Title_Color() )
  378.     StartPos := if( StartPos == NIL, 1, StartPos )
  379.  
  380.     Showbackground()
  381.  
  382.     SetColor( "W+/B,W+/R" )
  383.  
  384.     aView := dViewArray():New( Top+1           , ;
  385.                                Left            , ;
  386.                                Bottom          , ;
  387.                                Right           , ;
  388.                                aArray            ;
  389.                              )
  390.  
  391.     aView:DataBlock     := { |l| if(!l, ;
  392.                                      space(right-left+1), ;
  393.                                      " " + aArray[aView:CurrentItem,1] + " " ;
  394.                                    ) ;
  395.                            }
  396.  
  397.     aView:UseStyle      := .t.
  398.     aView:StatusBlock   := { || "" }
  399.  
  400.     SetColor( "W+/R" )
  401.  
  402.     vBar := NccvBar():New( Top           , ;
  403.                            Right+1       , ;
  404.                            Bottom        , ;
  405.                            Right+1       , ;
  406.                            len(aArray)     ;
  407.                          )
  408.  
  409.  
  410.     SetColor( "W+/B,W+/R" )
  411.  
  412.     WinBox( Top-1        , ;
  413.               Left-1       , ;
  414.               Bottom+3     , ;
  415.               Right+1      , ;
  416.                            , ;
  417.               5            , ;
  418.               .t.            ;
  419.             )
  420.  
  421.     @ Top-1,Left+2 say ' TOPIC INDEX ' color 'R/BG'
  422.     @ Bottom+1, Left    say replicate("─", Right-Left+1)
  423.     SetColor( Title_Color() )
  424.     @ Bottom+2, Left say space( Right-Left+1 ) color "N/BG"
  425.     @ Bottom+2, Left + int((Right-Left+1-19)/2)      say "┘=Select │ Esc=Exit" color "N/BG"
  426.     @ Bottom+2, Left + int((Right-Left+1-19)/2)      say "┘" color "R/BG"
  427.     @ Bottom+2, Left + int((Right-Left+1-19)/2) + 12 say "Esc" color "R/BG"
  428.     @ maxrow(), 0 say ' Use mouse or keyboard to make selection.' color 'w+/r'
  429.     SetColor( xColor )
  430.  
  431.     if StartPos > 0 .and. StartPos <= len( aArray )
  432.       aView:CurrentItem := StartPos
  433.     endif
  434.  
  435.     aView:Activate(int((Bottom-Top)/2)) ; vBar:Activate()
  436.  
  437.     Mouse:Activate()
  438.     Mouse:Delay := .1
  439.  
  440.     While .T.
  441.  
  442.       aView:Stabilize()
  443.       vBar:Update( aView:CurrentItem )
  444.  
  445.       Mouse:MouseRead()
  446.  
  447.       if Mouse:Ascii # 0
  448.         nKey2 := Mouse:Ascii
  449.       else
  450.         Button  := Mouse:Button
  451.         mRow    := Mouse:Row
  452.         mColumn := Mouse:Column
  453.  
  454.         Do Case
  455.           Case Button == 2
  456.              keyboard CHR(K_ESC)
  457.  
  458.           Case Button == 1 .and. mRow == Bottom+2 ;
  459.                          .and. mColumn >= Left + int((Right-Left+1-19)/2) + 12 ;
  460.                          .and. mColumn <= Left + int((Right-Left+1-19)/2) + 14
  461.              keyboard CHR(K_ESC)
  462.  
  463.           Case Button == 1 .and. mRow == Bottom+2 ;
  464.                          .and. mColumn >= Left + int((Right-Left+1-19)/2) ;
  465.                          .and. mColumn <= Left + int((Right-Left+1-19)/2) + 1
  466.              keyboard CHR(K_ENTER)
  467.  
  468.           Case Button == 1 .and. mRow == Top  .and. mColumn == Right+1
  469.              aView:Up()
  470.  
  471.           Case Button == 1 .and. mRow == Bottom .and. mColumn == Right+1
  472.              aView:Down()
  473.  
  474.           Case Button == 1 .and. (  Top+1 >= aView:TopRow .and. ;
  475.                         Bottom <= aView:BottomRow .and. ;
  476.                         Left >= aView:LeftColumn .and. ;
  477.                         Right <= aView:RightColumn )
  478.  
  479.              if aView:CurrentRow == mRow
  480.                 keyboard CHR(K_ENTER)
  481.              endif
  482.  
  483.              if aView:CurrentRow > mRow
  484.                 aView:Up(aView:CurrentRow - mRow)
  485.              else
  486.                 aView:Down(mRow - aView:CurrentRow)
  487.              endif
  488.         EndCase
  489.  
  490.         LOOP
  491.  
  492.       endif
  493.  
  494. //      nKey := inkey(0)
  495.  
  496.        Do Case
  497.          Case nKey2 == K_ESC
  498.            exit
  499.          Case nKey2 == K_RETURN
  500.            nOffset := aArray[aView:CurrentItem,2]
  501.            nLen    := aArray[aView:CurrentItem,3]
  502.            nRetVal := aView:CurrentItem
  503.            exit
  504.          Otherwise
  505.            aView:StandardKeys( nKey2 )
  506.  
  507.        EndCase
  508.  
  509.     enddo
  510.  
  511.     restscreen(,,,,xScrn)
  512.     SetColor( xColor )
  513.     setpos( row,col )
  514.     Set( _SET_CURSOR, xCursor )
  515.  
  516. Return( nRetVal )
  517.  
  518.  
  519.  
  520.  
  521. //-----------------------------------------------------------------------------
  522.  
  523.  
  524. //────────────────────────────┐
  525. // Line display for Help file │
  526. //────────────────────────────┘
  527. static func hline( o )
  528.  
  529.     local first                                     , ;
  530.           i                                         , ;
  531.           who                                       , ;  // max things to check
  532.           marks := { , , }                          , ;
  533.           line  := subs(o:Line,o:LeftPosition)
  534.  
  535.  
  536.     setpos( o:CurrentRow,o:LeftColumn )
  537.  
  538.     While .t.
  539.  
  540.       marks[1] := at( '~',Line )
  541.       marks[2] := at( '^',Line )
  542.       marks[3] := at( '&',Line )
  543.  
  544.       who := ascan( marks, { |x| x # 0 } )
  545.  
  546.       if who == 0
  547.         exit
  548.       endif
  549.  
  550.       for i = who+1 to 3
  551.         if marks[i] < marks[who] .and. marks[i] # 0
  552.           who := i
  553.         endif
  554.       next
  555.  
  556.       Do Case
  557.         Case who == 1
  558.           tilde( o, @line, marks[who] )
  559.  
  560.         Case who == 2
  561.           hat( o, @line, marks[who] )
  562.  
  563.         Case who == 3
  564.           perc( o, @line, marks[who] )
  565.  
  566.       EndCase
  567.  
  568.     enddo
  569.  
  570.     @row(),col() say padr(line,o:RightColumn-col()+1," ")  color o:standardcolor
  571.  
  572. Return( '' )
  573.  
  574.  
  575. //-----------------------------------------------------------------------------
  576.  
  577. static function tilde( o, line, xAt )
  578.  
  579.     @Row(),Col() say subs(line,1,xAt-1)
  580.     line := subs(line,xAt+1)
  581.     xAt := at( '~', Line )
  582.     if xAt # 0
  583.       @row(),col() say subs(line,1,min(o:RightColumn-col()+1,xAt-1)) ;
  584.                        color 'W+/R'
  585.       line := subs(line,xAt+1)
  586.     endif
  587.  
  588. Return( NIL )
  589.  
  590. //-----------------------------------------------------------------------------
  591.  
  592. static function hat( o, line, xAt )
  593.  
  594.     @Row(),Col() say subs(line,1,xAt-1)
  595.     line := subs(line,xAt+1)
  596.     xAt := at( '^', Line )
  597.     if xAt # 0
  598.       @row(),col() say subs(line,1,min(o:RightColumn-col()+1,xAt-1)) ;
  599.                    color "R/BG"
  600.       line := subs(line,xAt+1)
  601.     endif
  602.  
  603. Return( NIL )
  604.  
  605. //-----------------------------------------------------------------------------
  606.  
  607. static function perc( o , line, xAt )
  608.  
  609.     @Row(),Col() say subs(line,1,xAt-1)
  610.     line := subs(line,xAt+1)
  611.     xAt := at( '&', Line )
  612.     if xAt # 0
  613.       @row(),col() say subs(line,1,min(o:RightColumn-col()+1,xAt-1)) ;
  614.                    color 'GR+/RB'
  615.       line := subs(line,xAt+1)
  616.     endif
  617.  
  618. Return( NIL )
  619.  
  620. //-----------------------------------------------------------------------------
  621.  
  622. //───────────────────────┐
  623. // Skipper for Help file │
  624. //───────────────────────┘
  625. static Function Skipper(o,n)
  626.  
  627.     local nSkipped := 0, nDirection := if(n>0,1,-1), ;
  628.           savefilepos := o:FilePos
  629.  
  630.     if n == 0
  631.       Return( 0 )
  632.     endif
  633.  
  634.     While nSkipped # n
  635.       if n>0
  636.         if o:dvNextLn()
  637.           if H_marker $ o:Line
  638.             loop
  639.           endif
  640.           if ! o:while()
  641.             o:dvFileSet( savefilepos )
  642.             exit
  643.           endif
  644.           savefilepos := o:FilePos
  645.         else
  646.           o:dvFileSet( savefilepos )
  647.           exit
  648.         endif
  649.       else
  650.         if o:dvPrevLn()
  651.           if H_marker $ o:Line
  652.             loop
  653.           endif
  654.           if ! o:while()
  655.             o:dvFileSet( savefilepos )
  656.             exit
  657.           endif
  658.           savefilepos := o:FilePos
  659.         else
  660.           o:dvFileSet( savefilepos )
  661.           exit
  662.         endif
  663.       endif
  664.       nSkipped += nDirection
  665.     enddo
  666.  
  667. Return( nSkipped )
  668.  
  669.  
  670. //-----------------------------------------------------------------------------
  671.  
  672.  
  673. //──────────────────────────────┐
  674. // Status display for Help text │
  675. //──────────────────────────────┘
  676. static Function helpStat( o, n )
  677.  
  678.     local top    := o:TopRow          , ;
  679.           right  := o:RightColumn     , ;
  680.           sColor := o:StandardColor   , ;
  681.           iColor := o:InverseColor
  682.  
  683.  
  684.     if n == NIL
  685.       n := o:CurrentStatus
  686.     endif
  687.  
  688.     if n == DVIEW_IDLE
  689.       @ maxrow()-1, 41 say space(7) color Letter_Color()
  690.     else
  691.       o:TopRow := Maxrow() + 2
  692.       o:RightColumn := 47
  693.       o:InverseColor :=  "W+/R+"
  694.       o:StandardColor := "W+/R+"
  695.       eval( o:UserSlot, n )
  696.       o:InverseColor  := iColor
  697.       o:StandardColor := sColor
  698.       o:TopRow := top
  699.       o:RightColumn := right
  700.     endif
  701.  
  702. Return( NIL )
  703.  
  704.  
  705. //-----------------------------------------------------------------------------
  706.  
  707.  
  708. //───────────────────────────────┐
  709. // Gray menu of Help text screen │
  710. //───────────────────────────────┘
  711. static function GrayLocalMenu()
  712.  
  713.     local xColor := SetColor()
  714.  
  715.     @maxrow()-1,01 say " F1=Topic Index │ Esc=Exit │ PgUp/PgDn │" + space(38) color "N+/BG"
  716.     SetColor( xColor )
  717.  
  718. Return( NIL )
  719.  
  720.  
  721. //-----------------------------------------------------------------------------
  722.  
  723.  
  724. //─────────────────────────────────┐
  725. // UnGray menu of Help text screen │
  726. //─────────────────────────────────┘
  727. static function UnGrayLocalMenu()
  728.  
  729.     local row := maxrow()-1, xColor := SetColor( Title_Color() )
  730.  
  731.  
  732.     @row,01 say " F1=Topic Index │ Esc=Exit │ PgUp/PgDn │" + space(38) color "N/BG"
  733.  
  734.     SetColor( "R/BG" )
  735.     @row,02 say "F1"
  736.     @row,19 say "Esc"
  737.     @row,30 say "PgUp/PgDn"
  738.  
  739.     SetColor( xColor )
  740.  
  741. Return( NIL )
  742.  
  743.  
  744. //─────────────────────┐
  745. //  About NccView      │
  746. //─────────────────────┘
  747.  
  748. Function g_about()
  749.  
  750.     local screen := savescreen(), cColor := SetColor(), Mouse := MouseSys()
  751.  
  752.  
  753.     SetColor("N/BG")
  754.     WinBox(5,13,19,66,0,4,.t.)
  755.  
  756.     @ 05,14 say "╡"
  757.     @row(),col() say " National Computer Consultants " color 'W/RB+'
  758.     @row(),col() say "╞"
  759.     @  7,30 say 'NccViews Version 1.2'
  760.     @  8,31 say 'Shareware  Version'
  761.     @ 10,16 say 'Copyright (c) 1993 National Computer Consultants'
  762.     @ 12,19 say 'Phone (703) 569-2729  CompuServe 70324,634'
  763.  
  764. //    WinBox(15,37,17,43,,4)
  765.     @ 16,38 say ' Esc ' color 'W+/RB+'
  766.     @ 16,43 say '▄' color 'n/bg'
  767.     @ 17,39 say repl("▀",5) color 'n/bg'
  768.  
  769.     @ maxrow(),0 say ' Press ESC key or click with left mouse button on Esc. Or click right button.' color 'w+/r'
  770.  
  771.     While .t.
  772.       Mouse:MouseRead()
  773.       if Mouse:Row == 16 .and. ;
  774.          Mouse:Column >= 38 .and. ;
  775.          Mouse:Column <= 42 .or. ;
  776.          Mouse:Ascii == K_ESC .or. ;
  777.          Mouse:Button == RIGHT_BUTTON
  778.         While Mouse:Button # 0 .and. Mouse:ButtonHold( Mouse:Button )
  779.         Enddo
  780.         exit
  781.       endif
  782.     enddo
  783.     Mouse:ClearButtons()
  784.     SetColor( cColor )
  785.     restscreen(,,,,screen)
  786.  
  787. Return( NIL )
  788.  
  789.