/************************************************************************

vJet V1.0 © 1992 Jan Pfeil · fileviewer for AMIGA
Last changes:   15.04.92

vJet keyboard command interface

************************************************************************/

#include <stdio.h>
#include <string.h>


#define BS  0x08
#define TAB 0x09
#define CR  0x0D
#define SP  0x20
#define ESC 0x1B
#define DEL 0x7F

#include <exec/memory.h>
#include <proto/dos.h>
#include <proto/exec.h>

#include "extern.h"

struct EasyStruct Help = {
    sizeof(struct EasyStruct),0,
    " Help...",
    "vJet V1.0 © 1992 Jan Pfeil\n"\
    "freely distributable file viewing utility\n"\
    "\n"\
    "All MORE commands are supported\n"\
    "On numeric keypad Home,End,PgUp,PgDn\n"\
    "and cursor keys are available.\n"\
    "extra cursor keys  - move up/down/left/right\n"\
    "   + Ctrl          - half pages\n"\
    "   + Shift         - full pages\n"\
    "   + Alt           - to top/end\n"\
    "\n"\
    "For complete command history read the vJet.doc !",
    "Thanks"
    };

struct EasyStruct noEditor = {
    sizeof(struct EasyStruct),0,
    " ENV:EDITOR...",
    "environment variable\nnot set",
    "OK"
    };


VOID runEditor(struct vJet *vjet)
{
LONG len = 0,size = FMSIZE;     //size should be enough to hold env string + arguments
UBYTE *buffer = NULL;


if(buffer = AllocMem(size,MEMF_PUBLIC)) {
    len = GetVar("ENV:EDITOR",buffer,size,NULL);    //size is len + \0
    if(len == -1) {
        arqEasyRequest(vjet->win,noEditor,ARQ_ID_EXCLAM,NULL,NULL);
        FreeMem(buffer,size);
        }
    else if(len < size) {
        strcat(buffer," ");
        strcat(buffer,vjet->path[vjet->pathNum]);
        Execute(buffer,NULL,NULL);
        FreeMem(buffer,size);
        }
    else {
        FreeMem(buffer,size);
        }
    }

}


BOOL handleVanilla(struct vJet *vjet,USHORT code,USHORT qual)
{
BOOL quit = FALSE;

/*catch keypad keys*/
if(qual & IEQUALIFIER_NUMERICPAD) {
        switch(code) {
            case '7':   // Home
                        movePageVert(vjet,-vjet->maxline);
                        movePageHoriz(vjet,-vjet->maxcolumn);
                        setVSlider(vjet);
                        setHSlider(vjet);
                        break;
            case '1':   // End
                        movePageVert(vjet,vjet->maxline);
                        movePageHoriz(vjet,-vjet->maxcolumn);
                        setVSlider(vjet);
                        setHSlider(vjet);
                        break;
            case '9':   // PgUp
                        movePageVert(vjet,-vjet->linesPerPage);
                        setVSlider(vjet);
                        break;
            case '3':   // PgDn
                        movePageVert(vjet,vjet->linesPerPage);
                        setVSlider(vjet);
                        break;
            case '8':   // UC
                        movePageVert(vjet,-1);
                        setVSlider(vjet);
                        break;
            case '2':   // DC
                        movePageVert(vjet,1);
                        setVSlider(vjet);
                        break;
            case '4':   // LC
                        movePageHoriz(vjet,-1);
                        setHSlider(vjet);
                        break;
            case '6':   // RC
                        movePageHoriz(vjet,1);
                        setHSlider(vjet);
                        break;
            default:    break;
            }
    }

/*catch MORE keys*/
switch(code) {
    case SP:    //next page
                movePageVert(vjet,vjet->linesPerPage);
                setVSlider(vjet);
                break;
    case CR:    //next line
                movePageVert(vjet,1);
                setVSlider(vjet);
                break;
    case 'Q':   //terminate program
    case 'q':
    case 0x03:  // Ctrl/c
    case ESC:   quit = TRUE;
                break;
    case 'h':   //display help
                arqEasyRequest(vjet->win,Help,ARQ_ID_INFO,NULL,NULL);
                break;
    case '/':   //search case sensitive
                vjet->caseInSensitive = FALSE;
                findReq(vjet,vjet->find);
                break;
    case '.':   //search none case sensitive
                vjet->caseInSensitive = TRUE;
                findReq(vjet,vjet->find);
                break;
    case 'n':   //search next
                findNext(vjet);
                break;
    case 0x0c:  // Ctrl/L, redisplay
                checkWinSize(vjet);
                displayWholePage(vjet);
                setVSlider(vjet);
                setHSlider(vjet);
                break;
    case '<':   movePageVert(vjet,-vjet->maxline);
                setVSlider(vjet);
                break;
    case '>':   movePageVert(vjet,vjet->maxline);
                setVSlider(vjet);
                break;
    case '%':   //goto line
                gotoLine(vjet);
                break;
    case 'b':   //previous page
    case BS:
                movePageVert(vjet,-vjet->linesPerPage);
                setVSlider(vjet);
                break;
    case 'E':   //start Editor set in ENV:EDITOR
                runEditor(vjet);
                break;
    default:    //printf("vanilla: code = %x : qualifier = %x\n",code,qual);
                break;
    }/* switch (code) */

return(quit);
}


#define UC  0x4c
#define DC  0x4d
#define LC  0x4f
#define RC  0x4e

#define HELP 0x5f

#define CTRL    IEQUALIFIER_CONTROL
#define SHIFT   (IEQUALIFIER_LSHIFT+IEQUALIFIER_RSHIFT)
#define ALT     (IEQUALIFIER_LALT+IEQUALIFIER_RALT)

BOOL handleRaw(struct vJet *vjet,USHORT code,USHORT qual)
{
BOOL quit = FALSE;

switch(code) {
    case UC:    if(qual & ALT) {                        //top
                    movePageVert(vjet,-vjet->maxline);
                    setVSlider(vjet);
                    }
                else if(qual & SHIFT) {                 //up one page
                    movePageVert(vjet,-vjet->linesPerPage);
                    setVSlider(vjet);
                    }
                else if(qual & CTRL) {                 //up half page
                    movePageVert(vjet,-vjet->linesPerPage/2);
                    setVSlider(vjet);
                    }
                else {                                  //up one line
                    movePageVert(vjet,-1);
                    setVSlider(vjet);
                    }
                break;
    case DC:    if(qual & ALT) {                        //end of page
                    movePageVert(vjet,vjet->maxline);
                    setVSlider(vjet);
                    }
                else if(qual & SHIFT) {                 //down one page
                    movePageVert(vjet,vjet->linesPerPage);
                    setVSlider(vjet);
                    }
                else if(qual & CTRL) {                 //down half page
                    movePageVert(vjet,vjet->linesPerPage/2);
                    setVSlider(vjet);
                    }
                else {                                  //down one line
                    movePageVert(vjet,1);
                    setVSlider(vjet);
                    }
                break;
    case LC:    if(qual & ALT) {                        //left margin
                    movePageHoriz(vjet,-vjet->maxcolumn);
                    setHSlider(vjet);
                    }
                else if(qual & SHIFT) {                 //left one page
                        movePageHoriz(vjet,-vjet->columnsPerPage);
                        setHSlider(vjet);
                        }
                else if(qual & CTRL) {                 //left half page
                        movePageHoriz(vjet,-vjet->columnsPerPage/2);
                        setHSlider(vjet);
                        }
                else {                                  //left one row
                    movePageHoriz(vjet,-1);
                    setHSlider(vjet);
                    }
                break;
    case RC:    if(qual & ALT) {                        //right margin
                    movePageHoriz(vjet,vjet->maxcolumn);
                    setHSlider(vjet);
                    }
                else if(qual & SHIFT) {                 //right one page
                    movePageHoriz(vjet,vjet->columnsPerPage);
                    setHSlider(vjet);
                    }
                else if(qual & CTRL) {                 //right half page
                    movePageHoriz(vjet,vjet->columnsPerPage/2);
                    setHSlider(vjet);
                    }
                else {                                  //right one row
                    movePageHoriz(vjet,1);
                    setHSlider(vjet);
                    }
                break;
    case HELP:  arqEasyRequest(vjet->win,Help,ARQ_ID_INFO,NULL,NULL);
                break;
    default:    //printf("rawkey: code = %d,%x : qualifier = %d,%x\n",code,code,qual,qual);
                break;
    }/*end switch(code)*/


return(quit);
}
