/*-- AutoRev header do NOT edit!
*
*   Program         :   Goto.c
*   Copyright       :   Copyright © 1991-92 Jab Development
*   Author          :   Jan van den Baard
*   Creation Date   :   05-Apr-92
*   Current version :   2.0
*   Translator      :   Dice v2.06.40
*
*   REVISION HISTORY
*
*   Date          Version         Comment
*   ---------     -------         ------------------------------------------
*   05-Apr-92     2.0             Goto % & line routine. (rewrite)
*
*-- REV_END --*/

#include "View.h"

Prototype void Goto( long );

extern struct Window        *vwWindow;
extern struct AsciiText     *vwText;
extern struct Line          *vwFirst, *vwLast;
extern ULONG                 vwNum, vwShown;
extern UWORD                 vwMaxLin;
extern UBYTE                 ClearStr[];
#ifdef __DETACH
extern ULONG                *vwArgs;
#else
extern ULONG                 vwArgs[];
#endif

extern __far struct Custom   custom;

void Goto( long how )
{
    struct  Line            *line;
    ULONG                    sizex = NULL, sizen = NULL, i, ln, max, min, num;
    UBYTE                   *title;

    if ( ! vwText )         return;

    if ( how == GT_PERC ) {
        title = "Type percentage...";
        min = 0;
        max = 100;
        num = vwNum;
    } else {
        title = "Type line number...";
        min = 1;
        max = vwText->NumLines - vwText->NumSplit;
        for ( line = vwText->First, num = 1; line != vwFirst; line = line->Next ) {
            if (( line->Flags & LNF_Split ) != LNF_Split ) num++;
        }
    }

    if ( vwArgs[ 11 ] ) ON_SPRITE;

    if ( rtGetLong( &num, title, NULL, RT_ReqPos,         REQPOS_CENTERSCR,
                                       RT_WaitPointer,    TRUE,
                                       RTGL_Min,          min,
                                       RTGL_Max,          max,
                                       RTGL_ShowDefault,  TRUE,
                                       TAG_DONE )) {
        switch( how ) {
            case    GT_PERC:
                vwNum = num;

                if ( vwNum == 100 )
                    Bottom();
                else if ( ! vwNum )
                    Top();
                else {
                    sizen = vwNum * vwText->NumBytes / 100;

                    for ( line = vwText->First; line->Next; line = line->Next ) {
                        sizex += line->Size;
                        if ( sizex > sizen ) break;
                    }

                    vwFirst = line;

                    for ( i = 1; i < vwMaxLin; i++ )
                        if (( vwFirst = vwFirst->Prev ) == vwText->First ) break;

                    vwLast = vwFirst;

                    for ( i = 1; i < vwMaxLin; i++ )
                        if (( vwLast = vwLast->Next ) == vwText->Last->Next ) break;

                    displayIt:

                    vwShown = NULL;

                    for ( line = vwText->First; line != vwLast->Next; line = line->Next )
                       vwShown += line->Size;

                    Inform( ClearStr );
                    DisplayText();
                }
                break;

            case GT_LINE:
                for ( line = vwText->First, ln = 1; ln != num; line = line->Next ) {
                    if (( line->Flags & LNF_Split ) != LNF_Split ) ln++;
                }

                vwLast = line;

                for ( i = 1; i < vwMaxLin; i++ ) {
                    if (( vwLast = vwLast->Next ) == vwText->Last->Next ) {
                        vwLast = vwText->Last;
                        break;
                    }
                }

                vwFirst = vwLast;

                for ( i = 1; i < vwMaxLin; i++ )
                    if (( vwFirst = vwFirst->Prev ) == vwText->First ) break;

                goto displayIt;
        }
    }

    if ( vwArgs[ 11 ] ) OFF_SPRITE;
}
