home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 5 Edit
/
05-Edit.zip
/
fed0217s.zip
/
source
/
dispatch.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2001-08-01
|
10KB
|
275 lines
/*
** Module :DISPATCH.CPP
** Abstract :Keyboard events dispatcher
**
** Copyright (C) Sergey I. Yevtushenko
**
** Log: Thu 26/03/1998 Created
*/
#include <string.h>
#include <boxcoll.h>
#include <keynames.h>
#include <version.h>
#define INCL_DOS
#include <os2.h>
void EditBoxCollection::Dispatcher(KeyInfo& k, int iMode)
{
lock();
track_beg();
if((k.skey & 0x00FF) == kbEnter &&
!(k.skey & (shAlt | shCtrl | shShift)))
k.skey &= ~shIsCtrl;
char* pre_key = (iMode) ? keys.GetDef("kbBeforeKey"):0;
char* post_key = (iMode) ? keys.GetDef("kbAfterKey"):0;
if(pre_key)
{
track_recording(pre_key, 0);
play_macro(pre_key);
}
if(k.skey & shIsCtrl)
{
char* prog = keys.GetDef(k.KeyName);
if(prog)
{
track_recording(prog, 0);
play_macro(prog);
}
}
else
{
track_recording(0, (char)k.key);
usual_key(k);
}
if(post_key)
{
track_recording(post_key, 0);
play_macro(post_key);
}
track_end();
unlock();
}
void EditBoxCollection::play_macro(char *macro)
{
if(!macro)
return;
KeyInfo k;
while(*macro)
{
if(*macro == FUNC_ESCAPE)
{
macro++;
switch(unsigned(*macro))
{
case FUNC_ABORT : doAbort (); break;
case FUNC_BKSP : doBksp (); break;
case FUNC_CLOSE : doClose (); break;
case FUNC_COPY : doCopy (); break;
case FUNC_COPYRIGHT2 : doCopyright2 (); break;
case FUNC_CUT : doCut (); break;
case FUNC_DEL : doDel (); break;
case FUNC_DELLINE : doDelLine (); break;
case FUNC_DELTOEOL : doDelToEOL (); break;
case FUNC_DELWORDLEFT : doDelWordLeft (); break;
case FUNC_DELWORDRIGHT : doDelWordRight (); break;
case FUNC_DOWN : doDown (); break;
case FUNC_DOWNMARK : doDownMark (); break;
case FUNC_DUPLICATE_LINE : doDupLine (); break;
case FUNC_END : doEnd (); break;
case FUNC_ENDMARK : doEndMark (); break;
case FUNC_EXIT : doExit (); break;
case FUNC_FILEBEGIN : doFileBegin (); break;
case FUNC_FILEBEGINMARK : doFileBeginMark (); break;
case FUNC_FILEEND : doFileEnd (); break;
case FUNC_FILEENDMARK : doFileEndMark (); break;
case FUNC_FILELIST : doFileList (); break;
case FUNC_FLIPAUTOINDENT : doFlipAutoindent (); break;
case FUNC_FLIPBLOCKMODE : doFlipBlockMode (); break;
case FUNC_FLIPHILITING : doFlipHiliting (); break;
case FUNC_FLIPWORDWRAP : doFlipWordWrap (); break;
case FUNC_FLIPWWMERGE : doFlipWWMerge (); break;
case FUNC_FLIPWWLONG : doFlipWWLong (); break;
case FUNC_HELPSCREEN : doHelpScreen (); break;
case FUNC_HOME : doHome (); break;
case FUNC_HOMEMARK : doHomeMark (); break;
case FUNC_INDENT : doIndent (); break;
case FUNC_INS : doIns (); break;
case FUNC_INSDATE : doInsDate (); break;
case FUNC_INSFILENAME : doInsFileName (); break;
case FUNC_INSFILENAMESHORT : doInsFileNameShort (); break;
case FUNC_JUMPCOL : doJumpCol (); break;
case FUNC_JUMPLINE : doJumpLine (); break;
case FUNC_LEFT : doLeft (); break;
case FUNC_LEFTMARK : doLeftMark (); break;
case FUNC_LOAD : doLoad (); break;
case FUNC_LOWER : doLower (); break;
case FUNC_MACRORECEND : doMacroRecEnd (); break;
case FUNC_MACRORECSTART : doMacroRecStart (); break;
case FUNC_MATCHBRACKET : doMatchBracket (); break;
case FUNC_MATCHBRACKETMARK : doMatchBracketMark (); break;
case FUNC_NEW : doNew (); break;
case FUNC_NEXTFILE : doNextFile (); break;
case FUNC_PASTE : doPaste (); break;
case FUNC_PGDN : doPgDn (); break;
case FUNC_PGDNMARK : doPgDnMark (); break;
case FUNC_PGUP : doPgUp (); break;
case FUNC_PGUPMARK : doPgUpMark (); break;
case FUNC_PREVFILE : doPrevFile (); break;
case FUNC_RIGHT : doRight (); break;
case FUNC_RIGHTMARK : doRightMark (); break;
case FUNC_SAVE : doSave (); break;
case FUNC_SAVEALL : doSaveAll (); break;
case FUNC_SAVEAS : doSaveAs (); break;
case FUNC_SEARCH : doSearch (); break;
case FUNC_SEARCHAGAIN : doSearchAgain (); break;
case FUNC_SORT : doSort (); break;
case FUNC_UNDO : doUndo (); break;
case FUNC_UNINDENT : doUnindent (); break;
case FUNC_UP : doUp (); break;
case FUNC_UPMARK : doUpMark (); break;
case FUNC_UPPER : doUpper (); break;
case FUNC_WORDLEFT : doWordLeft (); break;
case FUNC_WORDLEFTMARK : doWordLeftMark (); break;
case FUNC_WORDRIGHT : doWordRight (); break;
case FUNC_WORDRIGHTMARK : doWordRightMark (); break;
case FUNC_FLIPTYPE : doFlipType (); break;
case FUNC_HILITE_ACHOICE : doHilitingChoice (); break;
case FUNC_SET_XLAT : doSetXlat (); break;
case FUNC_LOAD_KEYS : doLoadProfile (); break;
case FUNC_REXX : doRexx(++macro); return;
case FUNC_BMK_PUT_0: case FUNC_BMK_PUT_1: case FUNC_BMK_PUT_2:
case FUNC_BMK_PUT_3: case FUNC_BMK_PUT_4: case FUNC_BMK_PUT_5:
case FUNC_BMK_PUT_6: case FUNC_BMK_PUT_7: case FUNC_BMK_PUT_8:
case FUNC_BMK_PUT_9:
doSetMark(*macro - FUNC_BMK_PUT_0);
break;
case FUNC_BMK_GET_0: case FUNC_BMK_GET_1: case FUNC_BMK_GET_2:
case FUNC_BMK_GET_3: case FUNC_BMK_GET_4: case FUNC_BMK_GET_5:
case FUNC_BMK_GET_6: case FUNC_BMK_GET_7: case FUNC_BMK_GET_8:
case FUNC_BMK_GET_9:
doGotoMark(*macro - FUNC_BMK_GET_0);
break;
case FUNC_JMP_LST_0: case FUNC_JMP_LST_1: case FUNC_JMP_LST_2:
case FUNC_JMP_LST_3: case FUNC_JMP_LST_4: case FUNC_JMP_LST_5:
case FUNC_JMP_LST_6: case FUNC_JMP_LST_7: case FUNC_JMP_LST_8:
case FUNC_JMP_LST_9:
doJumpList(*macro - FUNC_JMP_LST_0);
break;
}
macro++;
}
else
{
k.key = *macro++;
usual_key(k);
}
}
}
void EditBoxCollection::track_recording(char *macro, char chr)
{
if(!recording)
return;
struct macro_rec *tmp = new macro_rec;
tmp->macro = macro;
tmp->chr = chr;
tmp->next = 0;
if(!head)
head = tmp;
if(tail)
tail->next = tmp;
tail = tmp;
}
void EditBoxCollection::clear_recording()
{
struct macro_rec *tmp;
while(head)
{
tmp = head->next;
delete head;
head = tmp;
}
head = tail = 0;
recording = 0;
}
char* EditBoxCollection::track_recording_done()
{
struct macro_rec *tmp;
int len = 0;
char *out = 0;
for(tmp = head; tmp; tmp = tmp->next)
{
if(tmp->macro)
len += strlen(tmp->macro);
else
len++;
}
out = new char[len + 1];
char *ptr = out;
for(tmp = head; tmp; tmp = tmp->next)
{
if(tmp->macro)
{
char *str = tmp->macro;
while(*str)
{
if(*str == FUNC_ESCAPE)
{
if(*(str+1) == FUNC_MACRORECEND ||
*(str+1) == FUNC_MACRORECSTART)
{
str++;
str++;
}
else
{
*ptr++ = *str++;
*ptr++ = *str++;
}
}
else
*ptr++ = *str++;
}
}
else
*ptr++ = tmp->chr;
}
*ptr = 0;
return out;
}
void EditBoxCollection::start_recording()
{
recording = 1;
}