home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Textdisplayers / View / Source / Goto.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-27  |  3.8 KB  |  129 lines

  1. /*-- AutoRev header do NOT edit!
  2. *
  3. *   Program         :   Goto.c
  4. *   Copyright       :   Copyright © 1991-92 Jab Development
  5. *   Author          :   Jan van den Baard
  6. *   Creation Date   :   05-Apr-92
  7. *   Current version :   2.0
  8. *   Translator      :   Dice v2.06.40
  9. *
  10. *   REVISION HISTORY
  11. *
  12. *   Date          Version         Comment
  13. *   ---------     -------         ------------------------------------------
  14. *   05-Apr-92     2.0             Goto % & line routine. (rewrite)
  15. *
  16. *-- REV_END --*/
  17.  
  18. #include "View.h"
  19.  
  20. Prototype void Goto( long );
  21.  
  22. extern struct Window        *vwWindow;
  23. extern struct AsciiText     *vwText;
  24. extern struct Line          *vwFirst, *vwLast;
  25. extern ULONG                 vwNum, vwShown;
  26. extern UWORD                 vwMaxLin;
  27. extern UBYTE                 ClearStr[];
  28. #ifdef __DETACH
  29. extern ULONG                *vwArgs;
  30. #else
  31. extern ULONG                 vwArgs[];
  32. #endif
  33.  
  34. extern __far struct Custom   custom;
  35.  
  36. void Goto( long how )
  37. {
  38.     struct  Line            *line;
  39.     ULONG                    sizex = NULL, sizen = NULL, i, ln, max, min, num;
  40.     UBYTE                   *title;
  41.  
  42.     if ( ! vwText )         return;
  43.  
  44.     if ( how == GT_PERC ) {
  45.         title = "Type percentage...";
  46.         min = 0;
  47.         max = 100;
  48.         num = vwNum;
  49.     } else {
  50.         title = "Type line number...";
  51.         min = 1;
  52.         max = vwText->NumLines - vwText->NumSplit;
  53.         for ( line = vwText->First, num = 1; line != vwFirst; line = line->Next ) {
  54.             if (( line->Flags & LNF_Split ) != LNF_Split ) num++;
  55.         }
  56.     }
  57.  
  58.     if ( vwArgs[ 11 ] ) ON_SPRITE;
  59.  
  60.     if ( rtGetLong( &num, title, NULL, RT_ReqPos,         REQPOS_CENTERSCR,
  61.                                        RT_WaitPointer,    TRUE,
  62.                                        RTGL_Min,          min,
  63.                                        RTGL_Max,          max,
  64.                                        RTGL_ShowDefault,  TRUE,
  65.                                        TAG_DONE )) {
  66.         switch( how ) {
  67.             case    GT_PERC:
  68.                 vwNum = num;
  69.  
  70.                 if ( vwNum == 100 )
  71.                     Bottom();
  72.                 else if ( ! vwNum )
  73.                     Top();
  74.                 else {
  75.                     sizen = vwNum * vwText->NumBytes / 100;
  76.  
  77.                     for ( line = vwText->First; line->Next; line = line->Next ) {
  78.                         sizex += line->Size;
  79.                         if ( sizex > sizen ) break;
  80.                     }
  81.  
  82.                     vwFirst = line;
  83.  
  84.                     for ( i = 1; i < vwMaxLin; i++ )
  85.                         if (( vwFirst = vwFirst->Prev ) == vwText->First ) break;
  86.  
  87.                     vwLast = vwFirst;
  88.  
  89.                     for ( i = 1; i < vwMaxLin; i++ )
  90.                         if (( vwLast = vwLast->Next ) == vwText->Last->Next ) break;
  91.  
  92.                     displayIt:
  93.  
  94.                     vwShown = NULL;
  95.  
  96.                     for ( line = vwText->First; line != vwLast->Next; line = line->Next )
  97.                        vwShown += line->Size;
  98.  
  99.                     Inform( ClearStr );
  100.                     DisplayText();
  101.                 }
  102.                 break;
  103.  
  104.             case GT_LINE:
  105.                 for ( line = vwText->First, ln = 1; ln != num; line = line->Next ) {
  106.                     if (( line->Flags & LNF_Split ) != LNF_Split ) ln++;
  107.                 }
  108.  
  109.                 vwLast = line;
  110.  
  111.                 for ( i = 1; i < vwMaxLin; i++ ) {
  112.                     if (( vwLast = vwLast->Next ) == vwText->Last->Next ) {
  113.                         vwLast = vwText->Last;
  114.                         break;
  115.                     }
  116.                 }
  117.  
  118.                 vwFirst = vwLast;
  119.  
  120.                 for ( i = 1; i < vwMaxLin; i++ )
  121.                     if (( vwFirst = vwFirst->Prev ) == vwText->First ) break;
  122.  
  123.                 goto displayIt;
  124.         }
  125.     }
  126.  
  127.     if ( vwArgs[ 11 ] ) OFF_SPRITE;
  128. }
  129.