/*-- AutoRev header do NOT edit!
*
*   Program         :   event.c
*   Copyright       :   Copyright © 1991-92 Jaba Development
*   Author          :   Jan van den Baard
*   Creation Date   :   04-Apr-1992
*   Current version :   2.0
*   Translator      :   Dice v2.06.40
*
*   REVISION HISTORY
*
*   Date          Version         Comment
*   ---------     -------         ------------------------------------------
*   04-Apr-92     2.0             View keyboard event-handler. (rewrite)
*
*-- REV_END --*/

#include "view.h"

/*
 * All kinds of qualifier-key combinations.
 */
#define MOUSE           IEQUALIFIER_RELATIVEMOUSE
#define REPEAT          IEQUALIFIER_REPEAT
#define LOCK            IEQUALIFIER_CAPSLOCK
#define NUMPAD          IEQUALIFIER_NUMERICPAD
#define LSHIFT          IEQUALIFIER_LSHIFT
#define RSHIFT          IEQUALIFIER_RSHIFT
#define CONTROL         IEQUALIFIER_CONTROL
#define ALT             IEQUALIFIER_LALT

#define NORM1           MOUSE
#define NORM2           NORM1+REPEAT
#define NORM3           NORM1+LOCK
#define NORM4           NORM2+LOCK

#define LALT1           MOUSE+ALT
#define LALT2           LALT1+REPEAT
#define LALT3           LALT1+LOCK
#define LALT4           LALT2+LOCK

#define NUMP1           MOUSE+NUMPAD
#define NUMP2           NUMP1+REPEAT
#define NUMP3           NUMP1+LOCK
#define NUMP4           NUMP2+LOCK

#define CTRL1           MOUSE+CONTROL
#define CTRL2           CTRL1+REPEAT
#define CTRL3           CTRL1+LOCK
#define CTRL4           CTRL2+LOCK

#define PRIN1           CTRL1+LSHIFT
#define PRIN2           CTRL3+LSHIFT

#define SHIF1           MOUSE+LSHIFT
#define SHIF2           MOUSE+RSHIFT
#define SHIF3           SHIF1+REPEAT
#define SHIF4           SHIF2+REPEAT
#define SHIF5           SHIF1+LOCK
#define SHIF6           SHIF2+LOCK
#define SHIF7           SHIF3+LOCK
#define SHIF8           SHIF4+LOCK

/*
 * hot-keys to be pressed together with LALT+LAMIGA
 * when view is taking a nap.
 */
#define VIEW            0x34
#define QUIT            0x10
#define FLUSH           0x23

/*
 * some external referenced globals.
 */
#ifndef __DETACH
extern ULONG             vwArgs[];
#else
extern ULONG            *vwArgs;
#endif
extern UWORD             vwPMark;
extern UWORD             vwMode, vwPMode;
extern UBYTE             vwPrinting, vwErr;
extern UBYTE             ClearStr[];
extern struct Screen    *vwScreen;
extern UBYTE             vwFound;
extern struct AsciiText *vwText;
extern UBYTE             KeyTable[];
extern UBYTE             SKeyTable[];

extern __far struct Custom custom;

Prototype void HandleKeyboard( UWORD, UWORD );

/*
 * Handle all incoming RAWKEY messages.
 */
void HandleKeyboard( code, qualifier )
    UWORD           code, qualifier;
{
    if(( code & IECODE_UP_PREFIX) != IECODE_UP_PREFIX ) {
        if ( vwErr )  InfoLine();

        switch( qualifier ) {

            case NORM1:
            case NORM2:
            case NORM3:
            case NORM4:
                if ( code < 64 ) {
                    switch( KeyTable[ code ] ) {

                        case 'm':
                            if ( vwArgs[ 11 ] ) {
                                vwArgs[ 11 ] = NULL;
                                ON_SPRITE;
                            } else {
                                vwArgs[ 11 ] = ~0;
                                OFF_SPRITE;
                            }
                            break;

                        case 'c':
                            if ( vwArgs[ 12 ] )
                                vwArgs[ 12 ] = NULL;
                            else
                                vwArgs[ 12 ]  = ~0;
                            break;

                        case 'h':
                            Help();
                            break;

                        case 'q':
                            if ( ! vwPrinting ) Quit( RETURN_OK );
                            break;

                        case '/':
                        case 'f':
                            vwMode = TRUE;
                            Find();
                            break;

                        case '.':
                        case 's':
                            vwMode = FALSE;
                            Find();
                            break;

                        case 'n':
                            vwMode = TRUE;
                            FindNP( SR_FORWARD );
                            break;

                        case 'p':
                            vwMode = TRUE;
                            FindNP( SR_BACKWARD );
                            break;

                        case 'r':
                            Inform( ClearStr );
                            DisplayText();
                            break;
#ifndef __DETACH
                        case 'e':
                            EditFile();
                            break;
#endif
                        case 'l':
                            if ( ! vwPrinting ) LoadFile( TRUE );
                            break;

                        case 'j':
                            if ( vwFound )
                                DoFound();
                            break;

                        case 'b':
                            if ( ! vwPrinting ) {
                                if ( vwText ) FreeAscii( vwText );
                                vwText = NULL;
                                CloseDisplay();
                            }
                            break;

                        case '<':
                            Top();
                            break;

                        default:
                            break;
                    }
                } else if ( code >= 0x50 && code <= 0x59 ) {
                    SetMark(( UWORD )( code - 0x50 ));
                    break;
                } else {
                    switch( code ) {

                        case 0x40:
                            PageDown();
                            break;

                        case 0x41:
                            PageUp();
                            break;

                        case 0x4d:
                        case 0x44:
                            LineDown();
                            break;

                        case 0x4c:
                            LineUp();
                            break;

                        case 0x5f:
                            Help();
                            break;

                        case 0x45:
                            if ( ! vwPrinting) Quit( RETURN_OK );
                            break;

                        default:
                            break;
                    }
                }
                break;

            case NUMP1:
            case NUMP2:
            case NUMP3:
            case NUMP4:
                if ( code < 64 ) {
                    switch( KeyTable[ code ] ) {

                        case '7':
                        case '4':
                            Top();
                            break;

                        case '1':
                        case '6':
                            Bottom();
                            break;

                        case '8':
                            LineUp();
                            break;

                        case '2':
                            LineDown();
                            break;

                        case '9':
                            PageUp();
                            break;

                        case '3':
                            PageDown();
                            break;

                        case '5':
                            if ( ! vwPrinting ) Quit( RETURN_OK );
                            break;

                        default:
                            break;
                    }
                } else if ( code == 0x43 ) {
                    LineUp();
                    break;
                }
                break;

            case CTRL1:
            case CTRL2:
            case CTRL3:
            case CTRL4:
                if ( code < 64 ) {
                    switch( KeyTable[ code ] ) {

                        case 'c':
                            if ( ! vwPrinting ) Quit( RETURN_OK );
                            break;

                        case 'n':
                            vwMode = FALSE;
                            FindNP( SR_FORWARD );
                            break;

                        case 'p':
                            vwMode = FALSE;
                            FindNP( SR_BACKWARD );
                            break;

                        case 'l':
                            Inform( ClearStr );
                            DisplayText();
                            break;

                        case 'b':
                            if ( ! vwPrinting )
                                CloseDisplay();
                            break;

                        case 's':
                            SaveBlock( -1 );
                            break;

                        default:
                            break;
                    }
                } else if ( code >= 0x50 && code <= 0x59 ) {
                    JumpMark(( UWORD )( code - 0x50 ));
                    break;
                }
                break;

            case PRIN1:
            case PRIN2:
                if ( code < 64 ) {
                    switch( KeyTable[ code ] ) {

                        case 'd':
                            if ( ! vwPrinting ) {
                                vwPMode = PRT_PAGE;
                                PrintFile();
                            }
                            break;

                        case 'p':
                            if ( ! vwPrinting ) {
                                vwPMode = PRT_FILE;
                                PrintFile();
                            }
                            break;

                        default:
                            break;
                    }
                } else if ( code >= 0x50 && code <= 0x59 ) {
                    vwPMode = PRT_BLOCK;
                    vwPMark = ( UWORD )( code - 0x50 );
                    PrintFile();
                    break;
                }
                break;

            case SHIF1:
            case SHIF2:
            case SHIF3:
            case SHIF4:
            case SHIF5:
            case SHIF6:
            case SHIF7:
            case SHIF8:
                if ( code < 64 ) {
                    switch( SKeyTable[ code ] ) {

                        case '<':
                            Top();
                            break;

                        case '>':
                            Bottom();
                            break;

                        case '%':
                            Goto( GT_PERC );
                            break;

                        case 'N':
                            Goto( GT_LINE );
                            break;

                        default:
                            break;
                    }
                } else if ( code >= 0x50 && code <= 0x59 ) {
                    UnSetMark(( UWORD )( code - 0x50 ));
                    break;
                }
                break;

            case LALT1:
            case LALT2:
            case LALT3:
            case LALT4:
                if ( code >= 0x50 && code <= 0x59 ) {
                    SaveBlock(( WORD )( code - 0x50 ));
                    break;
                }
                break;

            default:
                break;
        }
    }
}
