diff options
Diffstat (limited to 'setedit/mainsrc/keytrans.cc')
-rw-r--r-- | setedit/mainsrc/keytrans.cc | 1281 |
1 files changed, 0 insertions, 1281 deletions
diff --git a/setedit/mainsrc/keytrans.cc b/setedit/mainsrc/keytrans.cc deleted file mode 100644 index 9861c68..0000000 --- a/setedit/mainsrc/keytrans.cc +++ /dev/null @@ -1,1281 +0,0 @@ -/* Copyright (C) 1996-2005 by Salvador E. Tropea (SET), - see copyrigh file for details */ -/***************************************************************************** - - Test to make a really complex translator from a keyboard sequence to a - command sequence. - -*****************************************************************************/ -#define Uses_stdlib -#define Uses_stdio -#define Uses_string -#define Uses_limits - -#define Uses_TNSCollection -#define Uses_TEvent -#define Uses_MsgBox -#define Uses_TStringable -#define Uses_TKeys -#define Uses_TKeys_Extended -#define Uses_TGKey -#include <settvuti.h> -#define Uses_TCEditor_Commands -#define Uses_TCEditor_External -#include <ceditor.h> -//#define NDEBUG -#include <assert.h> -#include <dyncat.h> -#define Uses_TKeyTranslate -#define Uses_TComSeqCol -#define Uses_TKeySeqCol -#include <keytrans.h> - - -static char *Error=0; -static void StoreError(const char *error,char *file); -static const char *loadedFile=0; - -TKeyTranslate::TKeyTranslate(KeyTTable *aBase, int aType) : - TStringable() -{ - assert(type!=kbtExpanded); - base=aBase; - curTable=aBase; - type=aType; - state=0; - // That's a helper to avoid counting the values by hand - Count=base->total=CountKeys(base); -} - -TKeyTranslate::~TKeyTranslate() -{ - deleteTree(); -} - -KeyTNode *TKeyTranslate::search(unsigned key) -{ - KeyTNode *array=curTable->nodes,*cmpval; - int nelem=curTable->cant,lim; - - for (lim=nelem; lim!=0; lim>>=1) - { - cmpval=&array[lim>>1]; - if (cmpval->key==(int)key) - return cmpval; - if (cmpval->key<(int)key) - { /* key > p: move right */ - array=cmpval+1; - lim--; - } /* else move left */ - } - return 0; -} - -inline -void AlignSize(unsigned &aux) -{ - if (aux & 3) - aux=(aux | 3)+1; -} - -#define EOS 0 - -void TKeyTranslate::getText(char *dest, unsigned item, int maxLen) -{ - if (item>=base->total) - { - *dest=EOS; - return; - } - DynStrCatStruct cat; - // That initializes the structure - DynStrCatInit(&cat,0,0); - KeyTTable *t=base; - unsigned c=0,i=0; - - while (1) - { - KeyTNode *node=&(t->nodes[i]); - if (node->flags==kbtIsSComm) - { - KeyTTable *nT=GetTableE(node); - if (item<c+nT->total) - { // Is in a deeper table - CatFullNameKey(node,&cat); - t=nT; - i=0; - } - else - { - c+=nT->total; - i++; - } - } - else - { - if (c==item) - { - CatFullNameKey(node,&cat); - break; - } - c++; - i++; - } - } - #ifndef NDEBUG - //printf("%s\n",cat.str); - #endif - strncpy(dest,cat.str,maxLen); - dest[maxLen]=EOS; - delete cat.str; -} - -void TKeyTranslate::deleteKey(unsigned which) -{ - assert(type==kbtExpanded); - assert(base->total>which); - DeleteKey(base,0,which); - Count=base->total; -} - -void TKeyTranslate::DeleteKey(KeyTTable *t, unsigned baseNumKey, unsigned which) -{ - unsigned cant=t->cant; - unsigned i; - - for (i=0; i<cant; ) - { - KeyTNode *node=&(t->nodes[i]); - if (node->flags==kbtIsSComm && baseNumKey!=which) - { - KeyTTable *nT=GetTableE(node); - if (which<baseNumKey+nT->total) - { // Is in a deeper table - DeleteKey(nT,baseNumKey,which); - if (nT->cant==0) - { // The table is empty - delete nT; - // Now reduce it - memcpy(node,node+1,sizeof(KeyTNode)*(cant-i-1)); - t->cant--; - } - t->total--; - return; - } - else - { // Skip the table - baseNumKey+=nT->total; - i++; - } - } - else - { - if (baseNumKey==which) - { - if (node->flags==kbtIsMacro || node->flags==kbtIsSeq) - delete[] node->d.macro; - else if (node->flags==kbtIsSComm) - // It removes a branch in the tree - DeleteTree(GetTableE(node)); - memcpy(node,node+1,sizeof(KeyTNode)*(cant-i-1)); - t->cant--; - t->total--; - return; - } - baseNumKey++; - i++; - } - } -} - -void TCEditor_MakeKeyName(char *s, unsigned short key) -{ - char *b=s; - - #define A(cas,a,b) if (key & cas) { *s=a; *(s+1)=b; s+=2; } - A(kbShiftCode,'S','h') - A(kbCtrlCode,'C','t') - A(kbAltRCode,'a','l') - A(kbAltLCode,'A','l') - #undef A - *s=0; - strcat(b,TGKey::NumberToKeyName(key & kbKeyMask)); -} - -int InterpretKeyName(char *s, ushort &code) -{ - ushort lcode=0; - - #define A(cas,a,b) if (*s==a && *(s+1)==b) { s+=2; lcode|=cas; } - A(kbShiftCode,'S','h') - A(kbCtrlCode,'C','t') - A(kbAltRCode,'a','l') - A(kbAltLCode,'A','l') - #undef A - ushort n=TGKey::KeyNameToNumber(s); - if (n==(ushort)-1) - return 1; - code=lcode | n; - return 0; -} - -void TKeyTranslate::CatFullNameKey(KeyTNode *node, DynStrCatStruct *cat) -{ - assert(type==kbtExpanded); - int i; - char b[tktMaxKeyName]; // must be enough for any key name - - TCEditor_MakeKeyName(b,node->key); - if (node->flags==kbtIsSComm) - strcat(b," "); - else - strcat(b," -> "); - DynStrCat(cat,b); - - KeyTSeq *se; - switch (node->flags) - { - case kbtIsComm: - DynStrCat(cat,TranslateEdCommand(node->d.command)); - break; - case kbtIsMacro: - DynStrCat(cat,GetMNameE(node)); - break; - case kbtIsSeq: - se=GetTSeqE(node); - for (i=0; i<se->cant; i++) - { - char *p=TranslateEdCommand(se->commands[i]); - if (p) - { - DynStrCat(cat,p); - DynStrCat(cat," "); - } - } - break; - } -} - -unsigned TKeyTranslate::CountKeys(KeyTTable *t) -{ - unsigned cant=t->cant; - unsigned i,aCount=0; - - for (i=0; i<cant; i++) - { - KeyTNode *node=&(t->nodes[i]); - if (node->flags==kbtIsSComm) - { - KeyTTable *nT=GetTableC(node); - unsigned c=CountKeys(nT); - nT->total=c; - aCount+=c; - } - else - aCount++; - } - return aCount; -} - -int TKeyTranslate::get(unsigned key,KeyTNode *ret) -{ - assert(type!=kbtExpanded); - KeyTNode *p=search(key); - if (!p) - { - rewind(); - return 0; - } - memcpy(ret,p,sizeof(KeyTNode)); - switch (ret->flags) - { - case kbtIsSComm: - state++; - curTable=GetTableC(ret); - return -1; - case kbtIsMacro: - ret->d.data=GetMNameC(ret); - break; - case kbtIsSeq: - ret->d.data=GetTSeqC(ret); - break; - } - rewind(); - return 1; -} - -KeyTNode *TKeyTranslate::move(unsigned key, int add) -{ - KeyTNode *array=curTable->nodes,*p=0; - int c=curTable->cant,i,found=0,num; - - for (i=0,num=0; i<c; i++) - { - p=array+i; - if (p->key==(int)key) - { - found++; - break; - } - if (p->flags==kbtIsSComm) - num+=(GetTable(p))->total; - else - num++; - } - if (!found || !p) - return 0; - - curTable->total+=add; - numKey+=num; - if (p->flags==kbtIsSComm) - { - state++; - lastTableInSearch=p; - curTable=GetTable(p); - } - - return p; -} - -/**[txh]******************************************************************** - - Description: - Expands the tree to be easylly editable. That means: all small chuncks -of memory. Calls @x{::ExpandTable}, to do the job.@p - Returns the old compacted block that must be deleted by the caller. That's -to allow an easy undo during the expanded phase. Additionally canBeDeleted -indicates if delete can be used or the pointer is to the original. - -***************************************************************************/ - -KeyTTable *TKeyTranslate::expand(int &canBeDeleted) -{ - assert(type!=kbtExpanded); - canBeDeleted=0; - KeyTTable *newT=ExpandTable(base); - if (!newT) - return 0; - canBeDeleted=(type==kbtDynamic); - type=kbtExpanded; - KeyTTable *oldT=base; - base=newT; - - return oldT; -} - -/**[txh]******************************************************************** - - Description: - That's the function that recursivelly travels the tree generating a -fully unpacked version. - -***************************************************************************/ - -KeyTTable *TKeyTranslate::ExpandTable(KeyTTable *t) -{ - unsigned cant=t->cant; - unsigned i,size=sizeof(KeyTTable)+cant*sizeof(KeyTNode); - KeyTTable *nAux; - - KeyTTable *nT=(KeyTTable *)new char[size]; - if (!nT) - return 0; - memcpy(nT,t,size); - for (i=0; i<cant; i++) - { - KeyTNode *node=&(nT->nodes[i]); - KeyTSeq *s,*s2; - switch (node->flags) - { - case kbtIsComm: - break; - case kbtIsSComm: - nAux=ExpandTable(GetTableC(node)); - if (!nAux) - return 0; - node->d.data=nAux; - break; - case kbtIsMacro: - node->d.data=newStr(GetMNameC(node)); - break; - case kbtIsSeq: - s=GetTSeqC(node); - size=sizeof(unsigned short)*(s->cant+1); - s2=(KeyTSeq *)(new char[size]); - if (!s2) - return 0; - memcpy(s2,s,size); - node->d.data=s2; - break; - } - } - return nT; -} - -/**[txh]******************************************************************** - - Description: - Calculates how much memory I need to store the tree in one block. - -***************************************************************************/ - -unsigned TKeyTranslate::MeassureTree(KeyTTable *t) -{ - assert(type==kbtExpanded); - unsigned cant=t->cant; - unsigned i,size=sizeof(KeyTTable)+cant*sizeof(KeyTNode),aux; - - for (i=0; i<cant; i++) - { - KeyTNode *node=&(t->nodes[i]); - KeyTSeq *s; - switch (node->flags) - { - case kbtIsComm: - break; - case kbtIsSComm: - size+=MeassureTree(GetTableE(node)); - break; - case kbtIsMacro: - aux=strlen(GetMNameE(node))+1; - AlignSize(aux); - size+=aux; - break; - case kbtIsSeq: - s=GetTSeqE(node); - aux=sizeof(unsigned short)*(s->cant+1); - AlignSize(aux); - size+=aux; - break; - } - } - return size; -} - -/**[txh]******************************************************************** - - Description: - Reports the size of the structure, can't be called when static. - -***************************************************************************/ - -unsigned TKeyTranslate::getLen(void) -{ - assert(type!=kbtStatic); - if (type==kbtExpanded) - return MeassureTree(base); - return cSize; -} - -/**[txh]******************************************************************** - - Description: - Deletes the current table and uses the new one. - -***************************************************************************/ - -void TKeyTranslate::ChangeTable(KeyTTable *aBase, int aType) -{ - deleteTree(); - base=aBase; - curTable=aBase; - type=aType; - state=0; - Count=base->total=CountKeys(base); -} - -/**[txh]******************************************************************** - - Description: - Compacts the tree in one block, switable for writing to disk. Calls to -@x{::CompactTable}, to do the job. - -***************************************************************************/ - -void TKeyTranslate::compact(void) -{ - assert(type==kbtExpanded); - cSize=MeassureTree(base); - OffSet=0; - newBase=new char[cSize]; - if (!newBase) - return; - CompactTable(base); - deleteTree(); - type=kbtDynamic; - curTable=base=(KeyTTable *)newBase; - state=0; -} - -void TKeyTranslate::CompactTable(KeyTTable *t) -{ - unsigned cant=t->cant; - unsigned i,size=sizeof(KeyTTable)+cant*sizeof(KeyTNode),aux; - - KeyTTable *nT=(KeyTTable *)(newBase+OffSet); - memcpy(nT,t,size); - OffSet+=size; - for (i=0; i<cant; i++) - { - KeyTNode *node=&(nT->nodes[i]); - KeyTSeq *s; - switch (node->flags) - { - case kbtIsComm: - break; - case kbtIsSComm: - aux=OffSet; - CompactTable(GetTableE(node)); - node->d.offset=aux; - break; - case kbtIsMacro: - aux=strlen(GetMNameE(node))+1; - AlignSize(aux); - strcpy((char *)(newBase+OffSet),GetMNameE(node)); - node->d.offset=OffSet; - OffSet+=aux; - break; - case kbtIsSeq: - s=GetTSeqE(node); - aux=sizeof(unsigned short)*(s->cant+1); - AlignSize(aux); - memcpy((KeyTSeq *)(newBase+OffSet),s,aux); - node->d.offset=OffSet; - OffSet+=aux; - break; - } - } -} - -void TKeyTranslate::deleteTree(void) -{ - if (type==kbtDynamic) - delete[] base; - else - if (type==kbtExpanded) - DeleteTree(base); -} - -void TKeyTranslate::DeleteTree(KeyTTable *t) -{ - unsigned cant=t->cant; - unsigned i; - - for (i=0; i<cant; i++) - { - KeyTNode *node=&(t->nodes[i]); - switch (node->flags) - { - case kbtIsComm: - break; - case kbtIsSComm: - DeleteTree(GetTableE(node)); - break; - case kbtIsMacro: - delete GetMNameE(node); - break; - case kbtIsSeq: - delete GetTSeqE(node); - break; - } - } - delete t; -} - -void TKeySeqCol::getText(char *dest, unsigned item, int maxLen) -{ - char b[tktMaxKeyName]; - TCEditor_MakeKeyName(b,(unsigned short)((unsigned long)at(item))); - strncpy(dest,b,maxLen); - dest[maxLen]=EOS; -} - -void TComSeqCol::getText(char *dest, unsigned item, int maxLen) -{ - char b[40]; - *b=0; - - char *s=TranslateEdCommand((unsigned long)(at(item))); - if (s) - { - strcpy(b,"cmc"); - strcat(b,s); - } - strncpy(dest,b,maxLen); - dest[maxLen]=EOS; -} - -/**[txh]******************************************************************** - - Description: - Inserts a KeyTNode in the curTable and assigns key to it. The rest of -data must be arranged by the caller. - -***************************************************************************/ - -KeyTNode *TKeyTranslate::InsertKey(unsigned key) -{ - KeyTNode *array=curTable->nodes; - int c=curTable->cant,i,updateBase; - - updateBase=curTable==base; - // look the position for it to keep the table sorted - i=0; - while (i<c && array[i].key<(int)key) i++; - // Make room for one more - curTable->cant++; - //curTable->total++; Later - curTable=(KeyTTable *)realloc(curTable,sizeof(KeyTTable)+curTable->cant*sizeof(KeyTNode)); - // Insert the key - if (i!=c) - memmove(&(curTable->nodes[i+1]),&(curTable->nodes[i]),(c-i)*sizeof(KeyTNode)); - curTable->nodes[i].key=key; - // If this table is conected to another don't forget that realloc can - // change the pointer. - if (lastTableInSearch) - lastTableInSearch->d.data=curTable; - if (updateBase) - base=curTable; - return &(curTable->nodes[i]); -} - -/**[txh]******************************************************************** - - Description: - That's a very complex thing because I must:@p -1) Check if the key can be added without problems.@* -2) Add a new key to the tree, it can mean extend the tree.@* -3) Update the counters of keys in each table.@p - The @var{simulate} arguments instructs to just verify if the key can be -added.@p - - Return: - A non-negative value if there are a key already defined for the -sequence or part of the sequence. The value is returned to allow to the -program ask for deletion.@p - -1 if the sequence will break more than one key assigment.@p - -2 if the key was added. - -***************************************************************************/ - -int TKeyTranslate::addKey(TKeySeqCol *sKeys, void *data, int Type, - int *keyDef, Boolean simulate) -{ - assert(type==kbtExpanded); - int c=sKeys->getCount(); - int i,ok=0; - KeyTNode *node; - //char b[100]; - - numKey=0; - lastTableInSearch=0; - rewind(); - for (i=0; i<c; i++) - { - node=move((unsigned long)(sKeys->at(i))); - if (!node) - { - ok=1; - break; - } - if (node->flags!=kbtIsSComm) - { - /*printf("Ya tiene asignado algo (%d)\n",numKey); - getText(b,numKey,99);*/ - rewind(); - return numKey; - } - } - if (!ok) - { - //printf("No se puede ya que tiene mas de 1 asignada\n"); - rewind(); - if (keyDef) - *keyDef=numKey; - return -1; - } - if (simulate) - { - rewind(); - return -2; - } - node=InsertKey((unsigned long)(sKeys->at(i))); - // Now if the sequence is larger create a ramification in the tree to hold it - while (i<(c-1)) - { - node->flags=kbtIsSComm; - KeyTTable *nT=(KeyTTable *)new char[sizeof(KeyTTable)+sizeof(KeyTNode)]; - node->d.data=nT; - nT->cant=1; - nT->total=0; // Later - node=nT->nodes; - node->key=(unsigned short)(unsigned long)(sKeys->at(++i)); - } - // Now node points to an end of the tree - // The valid Types are kbtIsMacro kbtIsSeq - if (Type==kbtIsMacro) - { // Easy ;-) - node->flags=kbtIsMacro; - node->d.data=newStr((char *)data); - } - else - { - TComSeqCol *p=(TComSeqCol *)data; - c=p->getCount(); - if (c==1) - { - node->flags=kbtIsComm; - node->d.command=(unsigned short)((unsigned long)p->at(0)); - } - else - { // The never ending story ... - KeyTSeq *s=(KeyTSeq *)new char[sizeof(KeyTSeq)+sizeof(unsigned short)*c]; - s->cant=c; - for (i=0; i<c; i++) - s->commands[i]=(unsigned short)((unsigned long)p->at(i)); - node->flags=kbtIsSeq; - node->d.data=s; - } - } - // Hoppefully the key is there - rewind(); - // But what about the counters? - Count++; - c=sKeys->getCount(); - for (i=0; i<c; i++) - { - #ifdef NDEBUG - move((unsigned)(sKeys->at(i)),1); - #else - node=move((unsigned long)(sKeys->at(i)),1); - assert(node!=0); - #endif - } - rewind(); - - return -2; -} - -static char Signature[]="SET's editor keyboard binding file\x1A";; -const int Version=4; - -int TKeyTranslate::Save(char *name) -{ - assert(type!=kbtExpanded); - FILE *f=fopen(name,"wb"); - if (!f) - return 1; - fwrite(Signature,sizeof(Signature),1,f); - fputc(Version,f); - ushort w=TGKey::GetAltSettings(); - fwrite(&w,sizeof(w),1,f); - if (type==kbtStatic) - { // Don't save the keys if not needed - unsigned c=0; - fwrite(&c,sizeof(cSize),1,f); - } - else - { - fwrite(&cSize,sizeof(cSize),1,f); - fwrite(base,cSize,1,f); - } - int translateKeyPad=TGKey::GetKbdMapping(TGKey::dosTranslateKeypad); - fwrite(&translateKeyPad,sizeof(translateKeyPad),1,f); - fclose(f); - return 0; -} - -#undef GenError -#define GenError(a) \ -{\ - StoreError(a,name);\ - fclose(f);\ - return 1;\ -} - -int TKeyTranslate::Load(char *name) -{ - char buf[sizeof(Signature)]; - FILE *f=fopen(name,"rb"); - if (!f) - return 0; - fread(buf,sizeof(Signature),1,f); - if (strcmp(buf,Signature)) - GenError(__("Wrong file")); - - int V=fgetc(f); - if (V>Version || V<3) - GenError(__("Wrong version")); - - ushort w; - fread(&w,sizeof(w),1,f); - TGKey::SetAltSettings(w); - - int lcSize,replaceK=0; - fread(&lcSize,sizeof(lcSize),1,f); - if (lcSize) - { - newBase=new char[lcSize]; - fread(newBase,lcSize,1,f); - replaceK=1; - } - if (ferror(f)) - { - delete newBase; - GenError(__("Error while reading")); - } - if (V>=4) - { - int translateKeyPad; - fread(&translateKeyPad,sizeof(translateKeyPad),1,f); - TGKey::SetKbdMapping(translateKeyPad ? TGKey::dosTranslateKeypad : TGKey::dosNormalKeypad); - } - fclose(f); - if (replaceK) - { - deleteTree(); - type=kbtDynamic; - curTable=base=(KeyTTable *)newBase; - } - - return 0; -} - - -/******************************* DEFAULT key assigment *******************************/ - - - - - -// That's a trick to have a hardcoded tree. Is dirty -#define DeclareTable(a) \ -typedef struct \ -{ unsigned cant; unsigned total; KeyTNode nodes[a]; } KeyTTable##a - -#define DeclareSeq(a) \ -typedef struct \ -{ unsigned short cant; unsigned short commands[a]; } KeyTSeq##a - -#define pSeq(a) (((char *)&a)-((char *)&base)) -#define dSeqSel(name,comm) \ - KeyTSeq3 name={ 3, {cmcSelectOn,comm,cmcSelectOff} } - -// Doesn't exist by now, will be implemented -//const cmcSelectOn=1000,cmcSelectOff=1001; - -DeclareSeq(3); - -extern KeyTSeq3 ShUp,ShDn,ShHome,ShEnd,ShPgUp,ShPgDn,ShL,ShR,ShCtL,ShCtR, - ShCtHome,ShCtEnd,ShCtPgUp,ShCtPgDn; - -// 196 keys defined -const int NormalSize=89,CtrlQSize=50,CtrlKSize=61; -#define NormalTable KeyTTable89 -#define CtrlQTable KeyTTable50 -#define CtrlKTable KeyTTable61 -DeclareTable(89); -DeclareTable(50); -DeclareTable(61); - -extern CtrlQTable CtrlQ; -extern CtrlKTable CtrlK; - -NormalTable base= -{ NormalSize,0, - { // MUST be sorted - // Normal 15 - { kbEsc, kbtIsComm, {cmcHideSelect} }, // 31 - { kbBackSpace, kbtIsComm, {cmcBackSpace} }, // 42 - { kbTab, kbtIsComm, {cmcSmartTab} }, // 43 - { kbEnter, kbtIsComm, {cmcNewLine} }, // 44 - { kbHome, kbtIsComm, {cmcLineStart} }, // 69 - { kbUp, kbtIsComm, {cmcLineUp} }, // 70 - { kbPgUp, kbtIsComm, {cmcPageUp} }, // 71 - { kbLeft, kbtIsComm, {cmcCharLeft} }, // 72 - { kbRight, kbtIsComm, {cmcCharRight} }, // 73 - { kbEnd, kbtIsComm, {cmcLineEnd} }, // 74 - { kbDown, kbtIsComm, {cmcLineDown} }, // 75 - { kbPgDn, kbtIsComm, {cmcPageDown} }, // 76 - { kbInsert, kbtIsComm, {cmcInsMode} }, // 77 - { kbDelete, kbtIsComm, {cmcDelCharClear} }, // 78 - { kbMacro, kbtIsComm, {cmcExpandCode} }, // 98 - // Shift 10 - { kbShBackSpace, kbtIsComm, {cmcBackSpace} }, // 42 - { kbShEnter, kbtIsComm, {cmcNewLine} }, // 44 - { kbShHome, kbtIsSeq, {pSeq(ShHome)} }, // 69 - { kbShUp, kbtIsSeq, {pSeq(ShUp)} }, // 70 - { kbShPgUp, kbtIsSeq, {pSeq(ShPgUp)} }, // 71 - { kbShLeft, kbtIsSeq, {pSeq(ShL)} }, // 72 - { kbShRight, kbtIsSeq, {pSeq(ShR)} }, // 73 - { kbShEnd, kbtIsSeq, {pSeq(ShEnd)} }, // 74 - { kbShDown, kbtIsSeq, {pSeq(ShDn)} }, // 75 - { kbShPgDn, kbtIsSeq, {pSeq(ShPgDn)} }, // 76 - // Control 46 - { kbCtA, kbtIsComm, {cmcWordLeft} }, // 1 - { kbCtC, kbtIsComm, {cmcPageDown} }, // 3 - { kbCtD, kbtIsComm, {cmcCharRight} }, // 4 - { kbCtE, kbtIsComm, {cmcLineUp} }, // 5 - { kbCtF, kbtIsComm, {cmcWordRight} }, // 6 - { kbCtG, kbtIsComm, {cmcDelChar} }, // 7 - { kbCtH, kbtIsComm, {cmcBackSpace} }, // 8 - { kbCtJ, kbtIsComm, {cmcGotoEditorLine} }, // 10 - { kbCtK, kbtIsSComm, {pSeq(CtrlK)} }, // 11 - { kbCtL, kbtIsComm, {cmcSearchAgain} }, // 12 - { kbCtM, kbtIsComm, {cmcNewLine} }, // 13 - { kbCtN, kbtIsComm, {cmcInsertNewLine} }, // 14 - { kbCtO, kbtIsComm, {cmcIndentMode} }, // 15 - { kbCtP, kbtIsComm, {cmcIntelIndentMode} }, // 16 - { kbCtQ, kbtIsSComm, {pSeq(CtrlQ)} }, // 17 - { kbCtR, kbtIsComm, {cmcPageUp} }, // 18 - { kbCtS, kbtIsComm, {cmcCharLeft} }, // 19 - { kbCtT, kbtIsComm, {cmcDelWord} }, // 20 - { kbCtU, kbtIsComm, {cmcUndo} }, // 21 - { kbCtV, kbtIsComm, {cmcInsMode} }, // 22 - // Moved to menues { kbCtW, kbtIsComm, {cmcScrollDown} }, // 23 - { kbCtX, kbtIsComm, {cmcLineDown} }, // 24 - { kbCtY, kbtIsComm, {cmcDelLine} }, // 25 - // Moved to menues { kbCtZ, kbtIsComm, {cmcScrollUp} }, // 26 - { kbCtOpenBrace, kbtIsComm, {cmcSearchStart} }, // 27 - { kbCtCloseBrace, kbtIsComm, {cmcSearchEnd} }, // 29 - { kbCt0, kbtIsComm, {cmcGotoMark0} }, // 32 - { kbCt1, kbtIsComm, {cmcGotoMark1} }, // 33 - { kbCt2, kbtIsComm, {cmcGotoMark2} }, // 34 - { kbCt3, kbtIsComm, {cmcGotoMark3} }, // 35 - { kbCt4, kbtIsComm, {cmcGotoMark4} }, // 36 - { kbCt5, kbtIsComm, {cmcGotoMark5} }, // 37 - { kbCt6, kbtIsComm, {cmcGotoMark6} }, // 38 - { kbCt7, kbtIsComm, {cmcGotoMark7} }, // 39 - { kbCt8, kbtIsComm, {cmcGotoMark8} }, // 40 - { kbCt9, kbtIsComm, {cmcGotoMark9} }, // 41 - { kbCtBackSpace, kbtIsComm, {cmcDelPrevWord} }, // 42 - { kbCtTab, kbtIsComm, {cmcSmartIndent} }, // 43 - { kbCtEnter, kbtIsComm, {cmcLoadFileUnderCur} }, // 44 - { kbCtSpace, kbtIsComm, {cmcExpandCode} }, // 52 - { kbCtHome, kbtIsComm, {cmcFirstLineInScreen} }, // 69 - { kbCtPgUp, kbtIsComm, {cmcTextStart} }, // 71 - { kbCtLeft, kbtIsComm, {cmcWordLeft} }, // 72 - { kbCtRight, kbtIsComm, {cmcWordRight} }, // 73 - { kbCtEnd, kbtIsComm, {cmcLastLineInScreen} }, // 74 - { kbCtPgDn, kbtIsComm, {cmcTextEnd} }, // 76 - { kbCtInsert, kbtIsComm, {cmcCopy} }, // 77 - { kbCtDelete, kbtIsComm, {cmcClear} }, // 78 - // Shift Ctrl 15 - { kbShCtA, kbtIsSeq, {pSeq(ShCtL)} }, // 1 - { kbShCtC, kbtIsSeq, {pSeq(ShPgUp)} }, // 3 - { kbShCtD, kbtIsSeq, {pSeq(ShR)} }, // 4 - { kbShCtE, kbtIsSeq, {pSeq(ShUp)} }, // 5 - { kbShCtF, kbtIsSeq, {pSeq(ShCtR)} }, // 6 - { kbShCtR, kbtIsSeq, {pSeq(ShPgUp)} }, // 18 - { kbShCtS, kbtIsSeq, {pSeq(ShL)} }, // 19 - { kbShCtX, kbtIsSeq, {pSeq(ShDn)} }, // 24 - { kbShCt0, kbtIsComm, {cmcSearchClPar} }, // 32 - { kbShCt9, kbtIsComm, {cmcSearchOpPar} }, // 41 - { kbShCtTab, kbtIsComm, {cmcSmartUnIndent} }, // 43 - { kbShCtHome, kbtIsSeq, {pSeq(ShCtHome)} }, // 69 - { kbShCtPgUp, kbtIsSeq, {pSeq(ShCtPgUp)} }, // 71 - { kbShCtLeft, kbtIsSeq, {pSeq(ShCtL)} }, // 72 - { kbShCtRight,kbtIsSeq, {pSeq(ShCtR)} }, // 73 - { kbShCtEnd, kbtIsSeq, {pSeq(ShCtEnd)} }, // 74 - { kbShCtPgDn, kbtIsSeq, {pSeq(ShCtPgDn)} }, // 76 - { kbShCtInsert, kbtIsComm, {cmcReplaceSelect} } // 77 - } -}; - -CtrlQTable CtrlQ= -{ CtrlQSize,0, - { // MUST be sorted - // Normal 26 - { kbA, kbtIsComm, {cmcReplace} }, // 1 - { kbB, kbtIsComm, {cmcGoBeginBlock} }, // 2 - { kbC, kbtIsComm, {cmcTextEnd} }, // 3 - { kbD, kbtIsComm, {cmcLineEnd} }, // 4 - { kbE, kbtIsComm, {cmcFirstLineInScreen} }, // 5 - { kbF, kbtIsComm, {cmcFind} }, // 6 - { kbH, kbtIsComm, {cmcDelStart} }, // 8 - { kbK, kbtIsComm, {cmcGoEndBlock} }, // 11 - { kbL, kbtIsComm, {cmcSelLength} }, // 12 - { kbM, kbtIsComm, {cmcChooseMacro} }, // 13 - { kbP, kbtIsComm, {cmcJumpLastCursorPos} }, // - { kbR, kbtIsComm, {cmcTextStart} }, // 18 - { kbS, kbtIsComm, {cmcLineStart} }, // 19 - { kbX, kbtIsComm, {cmcLastLineInScreen} }, // 24 - { kbY, kbtIsComm, {cmcDelEnd} }, // 25 - { kbEsc, kbtIsComm, {cmcSearchComplement} }, // 31 - { kb0, kbtIsComm, {cmcGotoMark0} }, // 32 - { kb1, kbtIsComm, {cmcGotoMark1} }, // 33 - { kb2, kbtIsComm, {cmcGotoMark2} }, // 34 - { kb3, kbtIsComm, {cmcGotoMark3} }, // 35 - { kb4, kbtIsComm, {cmcGotoMark4} }, // 36 - { kb5, kbtIsComm, {cmcGotoMark5} }, // 37 - { kb6, kbtIsComm, {cmcGotoMark6} }, // 38 - { kb7, kbtIsComm, {cmcGotoMark7} }, // 39 - { kb8, kbtIsComm, {cmcGotoMark8} }, // 40 - { kb9, kbtIsComm, {cmcGotoMark9} }, // 41 - - // Control 24 All twice for the people that lets the finger in Ctrl - { kbCtA, kbtIsComm, {cmcReplace} }, // 1 - { kbCtB, kbtIsComm, {cmcGoBeginBlock} }, // 2 - { kbCtC, kbtIsComm, {cmcTextEnd} }, // 3 - { kbCtD, kbtIsComm, {cmcLineEnd} }, // 4 - { kbCtE, kbtIsComm, {cmcFirstLineInScreen} }, // 5 - { kbCtF, kbtIsComm, {cmcFind} }, // 6 - { kbCtH, kbtIsComm, {cmcDelStart} }, // 8 - { kbCtK, kbtIsComm, {cmcGoEndBlock} }, // 11 - { kbCtL, kbtIsComm, {cmcSelLength} }, // 12 - { kbCtM, kbtIsComm, {cmcChooseMacro} }, // 13 - { kbCtR, kbtIsComm, {cmcTextStart} }, // 18 - { kbCtS, kbtIsComm, {cmcLineStart} }, // 19 - { kbCtX, kbtIsComm, {cmcLastLineInScreen} }, // 24 - { kbCtY, kbtIsComm, {cmcDelEnd} }, // 25 - { kbCt0, kbtIsComm, {cmcGotoMark0} }, // 32 - { kbCt1, kbtIsComm, {cmcGotoMark1} }, // 33 - { kbCt2, kbtIsComm, {cmcGotoMark2} }, // 34 - { kbCt3, kbtIsComm, {cmcGotoMark3} }, // 35 - { kbCt4, kbtIsComm, {cmcGotoMark4} }, // 36 - { kbCt5, kbtIsComm, {cmcGotoMark5} }, // 37 - { kbCt6, kbtIsComm, {cmcGotoMark6} }, // 38 - { kbCt7, kbtIsComm, {cmcGotoMark7} }, // 39 - { kbCt8, kbtIsComm, {cmcGotoMark8} }, // 40 - { kbCt9, kbtIsComm, {cmcGotoMark9} } // 41 - } -}; - -CtrlKTable CtrlK= -{ CtrlKSize,0, - { // MUST be sorted - // Normal 25 - { kbB, kbtIsComm, {cmcStartSelect} }, // 2 - { kbC, kbtIsComm, {cmcCopyBlock} }, // 3 - { kbH, kbtIsComm, {cmcHideSelect} }, // 8 - { kbI, kbtIsComm, {cmcIndentBlkOne} }, // 9 - { kbK, kbtIsComm, {cmcEndSelect} }, // 11 - { kbL, kbtIsComm, {cmcMarkLine} }, // 12 - { kbM, kbtIsComm, {cmcToUpper} }, // 13 - { kbO, kbtIsComm, {cmcToLower} }, // 15 - { kbR, kbtIsComm, {cmcReadBlock} }, // 18 - { kbT, kbtIsComm, {cmcMarkWord} }, // 20 - { kbU, kbtIsComm, {cmcUnIndentBlkOne} }, // 21 - { kbV, kbtIsComm, {cmcMoveBlock} }, // 22 - { kbW, kbtIsComm, {cmcWriteBlock} }, // 23 - { kbY, kbtIsComm, {cmcCut} }, // 25 - { kb0, kbtIsComm, {cmcPutMark0} }, // 32 - { kb1, kbtIsComm, {cmcPutMark1} }, // 33 - { kb2, kbtIsComm, {cmcPutMark2} }, // 34 - { kb3, kbtIsComm, {cmcPutMark3} }, // 35 - { kb4, kbtIsComm, {cmcPutMark4} }, // 36 - { kb5, kbtIsComm, {cmcPutMark5} }, // 37 - { kb6, kbtIsComm, {cmcPutMark6} }, // 38 - { kb7, kbtIsComm, {cmcPutMark7} }, // 39 - { kb8, kbtIsComm, {cmcPutMark8} }, // 40 - { kb9, kbtIsComm, {cmcPutMark9} }, // 41 - { kbTab, kbtIsComm, {cmcIndentBlk} }, // 43 - - // Shift 11 - { kbShA, kbtIsComm, {cmcToggleMoveOnPaste} }, // 1 - { kbShB, kbtIsComm, {cmcSelRectStart} }, // 2 - { kbShC, kbtIsComm, {cmcSelRectCopy} }, // 3 - { kbShH, kbtIsComm, {cmcSelRectHide} }, // 8 - { kbShK, kbtIsComm, {cmcSelRectEnd} }, // 11 - { kbShL, kbtIsComm, {cmcSelRectDel} }, // 12 - { kbShM, kbtIsComm, {cmcSelRectMove} }, // 13 - { kbShP, kbtIsComm, {cmcSelRectPaste} }, // 16 - { kbShT, kbtIsComm, {cmcSelRectCut} }, // 20 - { kbShV, kbtIsComm, {cmcSelRectMove} }, // 22 - { kbShTab, kbtIsComm, {cmcUnIndentBlk} }, // 43 - - // Control 25 - { kbCtB, kbtIsComm, {cmcStartSelect} }, // 2 - { kbCtC, kbtIsComm, {cmcCopyBlock} }, // 3 - { kbCtH, kbtIsComm, {cmcHideSelect} }, // 8 - { kbCtI, kbtIsComm, {cmcIndentBlkOne} }, // 9 - { kbCtK, kbtIsComm, {cmcEndSelect} }, // 11 - { kbCtL, kbtIsComm, {cmcMarkLine} }, // 12 - { kbCtM, kbtIsComm, {cmcToUpper} }, // 13 - { kbCtO, kbtIsComm, {cmcToLower} }, // 15 - { kbCtR, kbtIsComm, {cmcReadBlock} }, // 18 - { kbCtT, kbtIsComm, {cmcMarkWord} }, // 20 - { kbCtU, kbtIsComm, {cmcUnIndentBlkOne} }, // 21 - { kbCtV, kbtIsComm, {cmcMoveBlock} }, // 22 - { kbCtW, kbtIsComm, {cmcWriteBlock} }, // 23 - { kbCtY, kbtIsComm, {cmcCut} }, // 25 - { kbCt0, kbtIsComm, {cmcPutMark0} }, // 32 - { kbCt1, kbtIsComm, {cmcPutMark1} }, // 33 - { kbCt2, kbtIsComm, {cmcPutMark2} }, // 34 - { kbCt3, kbtIsComm, {cmcPutMark3} }, // 35 - { kbCt4, kbtIsComm, {cmcPutMark4} }, // 36 - { kbCt5, kbtIsComm, {cmcPutMark5} }, // 37 - { kbCt6, kbtIsComm, {cmcPutMark6} }, // 38 - { kbCt7, kbtIsComm, {cmcPutMark7} }, // 39 - { kbCt8, kbtIsComm, {cmcPutMark8} }, // 40 - { kbCt9, kbtIsComm, {cmcPutMark9} }, // 41 - { kbCtTab, kbtIsComm, {cmcIndentBlk} } // 43 - } -}; - -dSeqSel(ShHome,cmcLineStart); -dSeqSel(ShUp,cmcLineUp); -dSeqSel(ShPgUp,cmcPageUp); -dSeqSel(ShL,cmcCharLeft); -dSeqSel(ShR,cmcCharRight); -dSeqSel(ShEnd,cmcLineEnd); -dSeqSel(ShDn,cmcLineDown); -dSeqSel(ShPgDn,cmcPageDown); -dSeqSel(ShCtL,cmcWordLeft); -dSeqSel(ShCtR,cmcWordRight); -dSeqSel(ShCtHome,cmcFirstLineInScreen); -dSeqSel(ShCtEnd,cmcLastLineInScreen); -dSeqSel(ShCtPgUp,cmcTextStart); -dSeqSel(ShCtPgDn,cmcTextEnd); - - -/******************************* INTERFACE routines *******************************/ - - - - - -TKeyTranslate KeyTrans((KeyTTable *)((void *)&base)); - -static void StoreError(const char *error,char *file) -{ - char buf[PATH_MAX+80]; - char *aux=TVIntl::getTextNew(error); - TVIntl::snprintf(buf,PATH_MAX+80,__("%s, file \"%s\"\n"),aux,file); - Error=strdup(buf); - DeleteArray(aux); -} - -void ShowKeyBindError(void) -{ - if (Error) - { - messageBox(mfError | mfOKButton,__("Error while loading the keyboard binding: %s"),Error); - Error=0; - } -} - -int LoadKeysForTCEditor(char *name) -{ - loadedFile=newStr(name); - return KeyTrans.Load(name); -} - -void LoadKeysForTCEditorFreeMemory() -{ - DeleteArray(loadedFile); -} - -int SaveKeyBind(char *name) -{ - if (KeyTrans.Save(name)) - return 1; - if (loadedFile) - { - if (strcmp(name,loadedFile)!=0) - ShowSavePoint(name); - DeleteArray(loadedFile); - loadedFile=0; - } - return 0; -} - -int KeyBackToDefault(Boolean ask) -{ - // If the user is useing defaults let as-is - if (KeyTrans.getType()==kbtStatic) - return 0; - - if (ask) - if (messageBox(__("You'll lose all the changes"),mfOKCancel)==cmCancel) - return 0; - - KeyTrans.ChangeTable((KeyTTable *)((void *)&base)); - return 1; -} - -#ifdef TEST -#include <stdio.h> - -int main(void) -{ - char b[100]; -/* unsigned i,c; - - do - { - while (!TGKey::kbhit()); - TGKey::gkey(); - KeyTrans.get(TGKey::Abstract,TGKey::ascii); - } - while (TGKey::Abstract!=kbEsc); - KeyTrans.expand(); - - c=KeyTrans.getCount(); - printf("Size: %u (%d)\n",KeyTrans.getLen(),c); - for (i=0; i<c; i++) - KeyTrans.getText(b,i,99); - printf("Deleting key 36\n"); - KeyTrans.deleteKey(36); - c=KeyTrans.getCount(); - printf("Size: %u (%d)\n",KeyTrans.getLen(),c); - for (i=0; i<c; i++) - KeyTrans.getText(b,i,99); - - KeyTrans.compact(); - printf("Size: %u\n",KeyTrans.getLen()); - do - { - while (!TGKey::kbhit()); - TGKey::gkey(); - KeyTrans.get(TGKey::Abstract,TGKey::ascii); - } - while (TGKey::Abstract!=kbEsc); - */ - printf("\n"); - // A test sequence - TKeySeqCol tkc(4,5); - /*tkc.insert(kbCtQ); // 0 - tkc.insert(kbI); // 1*/ - tkc.insert(kbCtK); // 0 - tkc.insert(kbA); // 1 - tkc.insert(kbShT); // 1 - tkc.insert(kbT); // 1 - - //tkc.getText(b,0,99); - //printf(b); - //printf("\n"); - - // A commands sequence - TComSeqCol tcc(3,5); - tcc.insert(cmcSelectOn); - tcc.insert(cmcLineUp); - tcc.insert(cmcSelectOff); - tcc.getText(b,0,99); - printf(b); - printf("\n"); - - KeyTrans.expand(); - printf("Agrega retorna: %d",KeyTrans.addKey(&tkc,&tcc,kbtIsSeq)); - printf("\n"); - KeyTrans.compact(); - - // Now see if it's there - KeyTrans.get(kbCtK,0); - KeyTrans.get(kbA,0); - KeyTrans.get(kbShT,0); - KeyTrans.get(kbT,0); - - do - { - while (!TGKey::kbhit()); - TGKey::gkey(); - KeyTrans.get(TGKey::Abstract,TGKey::ascii); - } - while (TGKey::Abstract!=kbEsc); - - KeyTrans.Save("l:/pepe.dat"); - - return 0; -} -#endif |