home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / fed0217s.zip / source / dispatch.cpp < prev    next >
C/C++ Source or Header  |  2001-08-01  |  10KB  |  275 lines

  1. /*
  2. ** Module   :DISPATCH.CPP
  3. ** Abstract :Keyboard events dispatcher
  4. **
  5. ** Copyright (C) Sergey I. Yevtushenko
  6. **
  7. ** Log: Thu  26/03/1998     Created
  8. */
  9.  
  10. #include <string.h>
  11.  
  12. #include <boxcoll.h>
  13. #include <keynames.h>
  14. #include <version.h>
  15.  
  16. #define INCL_DOS
  17. #include <os2.h>
  18.  
  19. void EditBoxCollection::Dispatcher(KeyInfo& k, int iMode)
  20. {
  21.     lock();
  22.     track_beg();
  23.  
  24.     if((k.skey & 0x00FF) == kbEnter &&
  25.         !(k.skey & (shAlt | shCtrl | shShift)))
  26.             k.skey &= ~shIsCtrl;
  27.  
  28.     char* pre_key  = (iMode) ? keys.GetDef("kbBeforeKey"):0;
  29.     char* post_key = (iMode) ? keys.GetDef("kbAfterKey"):0;
  30.  
  31.     if(pre_key)
  32.     {
  33.         track_recording(pre_key, 0);
  34.         play_macro(pre_key);
  35.     }
  36.  
  37.     if(k.skey & shIsCtrl)
  38.     {
  39.         char* prog = keys.GetDef(k.KeyName);
  40.  
  41.         if(prog)
  42.         {
  43.             track_recording(prog, 0);
  44.             play_macro(prog);
  45.         }
  46.     }
  47.     else
  48.     {
  49.         track_recording(0, (char)k.key);
  50.         usual_key(k);
  51.     }
  52.  
  53.     if(post_key)
  54.     {
  55.         track_recording(post_key, 0);
  56.         play_macro(post_key);
  57.     }
  58.  
  59.     track_end();
  60.     unlock();
  61. }
  62.  
  63. void EditBoxCollection::play_macro(char *macro)
  64. {
  65.     if(!macro)
  66.         return;
  67.  
  68.     KeyInfo k;
  69.  
  70.     while(*macro)
  71.     {
  72.         if(*macro == FUNC_ESCAPE)
  73.         {
  74.             macro++;
  75.             switch(unsigned(*macro))
  76.             {
  77.                 case FUNC_ABORT            : doAbort            (); break;
  78.                 case FUNC_BKSP             : doBksp             (); break;
  79.                 case FUNC_CLOSE            : doClose            (); break;
  80.                 case FUNC_COPY             : doCopy             (); break;
  81.                 case FUNC_COPYRIGHT2       : doCopyright2       (); break;
  82.                 case FUNC_CUT              : doCut              (); break;
  83.                 case FUNC_DEL              : doDel              (); break;
  84.                 case FUNC_DELLINE          : doDelLine          (); break;
  85.                 case FUNC_DELTOEOL         : doDelToEOL         (); break;
  86.                 case FUNC_DELWORDLEFT      : doDelWordLeft      (); break;
  87.                 case FUNC_DELWORDRIGHT     : doDelWordRight     (); break;
  88.                 case FUNC_DOWN             : doDown             (); break;
  89.                 case FUNC_DOWNMARK         : doDownMark         (); break;
  90.                 case FUNC_DUPLICATE_LINE   : doDupLine          (); break;
  91.                 case FUNC_END              : doEnd              (); break;
  92.                 case FUNC_ENDMARK          : doEndMark          (); break;
  93.                 case FUNC_EXIT             : doExit             (); break;
  94.                 case FUNC_FILEBEGIN        : doFileBegin        (); break;
  95.                 case FUNC_FILEBEGINMARK    : doFileBeginMark    (); break;
  96.                 case FUNC_FILEEND          : doFileEnd          (); break;
  97.                 case FUNC_FILEENDMARK      : doFileEndMark      (); break;
  98.                 case FUNC_FILELIST         : doFileList         (); break;
  99.                 case FUNC_FLIPAUTOINDENT   : doFlipAutoindent   (); break;
  100.                 case FUNC_FLIPBLOCKMODE    : doFlipBlockMode    (); break;
  101.                 case FUNC_FLIPHILITING     : doFlipHiliting     (); break;
  102.                 case FUNC_FLIPWORDWRAP     : doFlipWordWrap     (); break;
  103.                 case FUNC_FLIPWWMERGE      : doFlipWWMerge      (); break;
  104.                 case FUNC_FLIPWWLONG       : doFlipWWLong       (); break;
  105.                 case FUNC_HELPSCREEN       : doHelpScreen       (); break;
  106.                 case FUNC_HOME             : doHome             (); break;
  107.                 case FUNC_HOMEMARK         : doHomeMark         (); break;
  108.                 case FUNC_INDENT           : doIndent           (); break;
  109.                 case FUNC_INS              : doIns              (); break;
  110.                 case FUNC_INSDATE          : doInsDate          (); break;
  111.                 case FUNC_INSFILENAME      : doInsFileName      (); break;
  112.                 case FUNC_INSFILENAMESHORT : doInsFileNameShort (); break;
  113.                 case FUNC_JUMPCOL          : doJumpCol          (); break;
  114.                 case FUNC_JUMPLINE         : doJumpLine         (); break;
  115.                 case FUNC_LEFT             : doLeft             (); break;
  116.                 case FUNC_LEFTMARK         : doLeftMark         (); break;
  117.                 case FUNC_LOAD             : doLoad             (); break;
  118.                 case FUNC_LOWER            : doLower            (); break;
  119.                 case FUNC_MACRORECEND      : doMacroRecEnd      (); break;
  120.                 case FUNC_MACRORECSTART    : doMacroRecStart    (); break;
  121.                 case FUNC_MATCHBRACKET     : doMatchBracket     (); break;
  122.                 case FUNC_MATCHBRACKETMARK : doMatchBracketMark (); break;
  123.                 case FUNC_NEW              : doNew              (); break;
  124.                 case FUNC_NEXTFILE         : doNextFile         (); break;
  125.                 case FUNC_PASTE            : doPaste            (); break;
  126.                 case FUNC_PGDN             : doPgDn             (); break;
  127.                 case FUNC_PGDNMARK         : doPgDnMark         (); break;
  128.                 case FUNC_PGUP             : doPgUp             (); break;
  129.                 case FUNC_PGUPMARK         : doPgUpMark         (); break;
  130.                 case FUNC_PREVFILE         : doPrevFile         (); break;
  131.                 case FUNC_RIGHT            : doRight            (); break;
  132.                 case FUNC_RIGHTMARK        : doRightMark        (); break;
  133.                 case FUNC_SAVE             : doSave             (); break;
  134.                 case FUNC_SAVEALL          : doSaveAll          (); break;
  135.                 case FUNC_SAVEAS           : doSaveAs           (); break;
  136.                 case FUNC_SEARCH           : doSearch           (); break;
  137.                 case FUNC_SEARCHAGAIN      : doSearchAgain      (); break;
  138.                 case FUNC_SORT             : doSort             (); break;
  139.                 case FUNC_UNDO             : doUndo             (); break;
  140.                 case FUNC_UNINDENT         : doUnindent         (); break;
  141.                 case FUNC_UP               : doUp               (); break;
  142.                 case FUNC_UPMARK           : doUpMark           (); break;
  143.                 case FUNC_UPPER            : doUpper            (); break;
  144.                 case FUNC_WORDLEFT         : doWordLeft         (); break;
  145.                 case FUNC_WORDLEFTMARK     : doWordLeftMark     (); break;
  146.                 case FUNC_WORDRIGHT        : doWordRight        (); break;
  147.                 case FUNC_WORDRIGHTMARK    : doWordRightMark    (); break;
  148.                 case FUNC_FLIPTYPE         : doFlipType         (); break;
  149.                 case FUNC_HILITE_ACHOICE   : doHilitingChoice   (); break;
  150.                 case FUNC_SET_XLAT         : doSetXlat          (); break;
  151.                 case FUNC_LOAD_KEYS        : doLoadProfile      (); break;
  152.  
  153.                 case FUNC_REXX             : doRexx(++macro); return;
  154.  
  155.                 case FUNC_BMK_PUT_0: case FUNC_BMK_PUT_1: case FUNC_BMK_PUT_2:
  156.                 case FUNC_BMK_PUT_3: case FUNC_BMK_PUT_4: case FUNC_BMK_PUT_5:
  157.                 case FUNC_BMK_PUT_6: case FUNC_BMK_PUT_7: case FUNC_BMK_PUT_8:
  158.                 case FUNC_BMK_PUT_9:
  159.                     doSetMark(*macro - FUNC_BMK_PUT_0);
  160.                     break;
  161.  
  162.                 case FUNC_BMK_GET_0: case FUNC_BMK_GET_1: case FUNC_BMK_GET_2:
  163.                 case FUNC_BMK_GET_3: case FUNC_BMK_GET_4: case FUNC_BMK_GET_5:
  164.                 case FUNC_BMK_GET_6: case FUNC_BMK_GET_7: case FUNC_BMK_GET_8:
  165.                 case FUNC_BMK_GET_9:
  166.                     doGotoMark(*macro - FUNC_BMK_GET_0);
  167.                     break;
  168.  
  169.                 case FUNC_JMP_LST_0: case FUNC_JMP_LST_1: case FUNC_JMP_LST_2:
  170.                 case FUNC_JMP_LST_3: case FUNC_JMP_LST_4: case FUNC_JMP_LST_5:
  171.                 case FUNC_JMP_LST_6: case FUNC_JMP_LST_7: case FUNC_JMP_LST_8:
  172.                 case FUNC_JMP_LST_9:
  173.                     doJumpList(*macro - FUNC_JMP_LST_0);
  174.                     break;
  175.  
  176.             }
  177.             macro++;
  178.         }
  179.         else
  180.         {
  181.             k.key = *macro++;
  182.             usual_key(k);
  183.         }
  184.     }
  185. }
  186.  
  187. void EditBoxCollection::track_recording(char *macro, char chr)
  188. {
  189.     if(!recording)
  190.         return;
  191.     struct macro_rec *tmp = new macro_rec;
  192.     tmp->macro = macro;
  193.     tmp->chr   = chr;
  194.     tmp->next  = 0;
  195.  
  196.     if(!head)
  197.         head = tmp;
  198.  
  199.     if(tail)
  200.         tail->next = tmp;
  201.     tail = tmp;
  202. }
  203.  
  204. void EditBoxCollection::clear_recording()
  205. {
  206.     struct macro_rec *tmp;
  207.  
  208.     while(head)
  209.     {
  210.         tmp = head->next;
  211.         delete head;
  212.         head = tmp;
  213.     }
  214.     head = tail = 0;
  215.     recording = 0;
  216. }
  217.  
  218. char* EditBoxCollection::track_recording_done()
  219. {
  220.     struct macro_rec *tmp;
  221.     int len   = 0;
  222.     char *out = 0;
  223.  
  224.     for(tmp = head; tmp; tmp = tmp->next)
  225.     {
  226.         if(tmp->macro)
  227.             len += strlen(tmp->macro);
  228.         else
  229.             len++;
  230.     }
  231.  
  232.     out = new char[len + 1];
  233.  
  234.     char *ptr = out;
  235.  
  236.     for(tmp = head; tmp; tmp = tmp->next)
  237.     {
  238.         if(tmp->macro)
  239.         {
  240.             char *str = tmp->macro;
  241.  
  242.             while(*str)
  243.             {
  244.                 if(*str == FUNC_ESCAPE)
  245.                 {
  246.                     if(*(str+1) == FUNC_MACRORECEND  ||
  247.                        *(str+1) == FUNC_MACRORECSTART)
  248.                     {
  249.                         str++;
  250.                         str++;
  251.                     }
  252.                     else
  253.                     {
  254.                         *ptr++ = *str++;
  255.                         *ptr++ = *str++;
  256.                     }
  257.                 }
  258.                 else
  259.                     *ptr++ = *str++;
  260.             }
  261.         }
  262.         else
  263.             *ptr++ = tmp->chr;
  264.     }
  265.     *ptr = 0;
  266.  
  267.     return out;
  268. }
  269.  
  270. void EditBoxCollection::start_recording()
  271. {
  272.     recording = 1;
  273. }
  274.  
  275.