void TEditor::handleEvent( TEvent& event ) { TView::handleEvent( event ); convertEvent( event ); Boolean centerCursor = Boolean(!cursorVisible()); uchar selectMode = 0; if( selecting == True || (getShiftState() & 0x03) != 0 ) selectMode = smExtend; switch( event.what ) { case evMouseDown: if( event.mouse.doubleClick == True ) selectMode |= smDouble; do { lock(); if( event.what == evMouseAuto ) { TPoint mouse = makeLocal( event.mouse.where ); TPoint d = delta; if( mouse.x < 0 ) d.x--; if( mouse.x >= size.x ) d.x++; if( mouse.y < 0 ) d.y--; if( mouse.y >= size.y ) d.y++; scrollTo(d.x, d.y); } setCurPtr(getMousePtr(event.mouse.where), selectMode); selectMode |= smExtend; unlock(); } while( mouseEvent(event, evMouseMove + evMouseAuto) ); break; case evKeyDown: if( event.keyDown.charScan.charCode == 9 || ( event.keyDown.charScan.charCode >= 32 && event.keyDown.charScan.charCode < 255 ) ) { lock(); if( overwrite == True && hasSelection() == False ) if( curPtr != lineEnd(curPtr) ) selEnd = nextChar(curPtr); insertText( &event.keyDown.charScan.charCode, 1, False); trackCursor(centerCursor); unlock(); } else return; break; case evCommand: switch( event.message.command ) { case cmFind: find(); break; case cmReplace: replace(); break; case cmSearchAgain: doSearchReplace(); break; default: lock(); switch( event.message.command ) { case cmCut: clipCut(); break; case cmCopy: clipCopy(); // hideSelect(); // JS 12.4.94 break; case cmPaste: clipPaste(); break; case cmUndo: undo(); break; case cmClear: deleteSelect(); break; case cmCharLeft: setCurPtr(prevChar(curPtr), selectMode); break; case cmCharRight: setCurPtr(nextChar(curPtr), selectMode); break; case cmWordLeft: setCurPtr(prevWord(curPtr), selectMode); break; case cmWordRight: setCurPtr(nextWord(curPtr), selectMode); break; case cmLineStart: setCurPtr(lineStart(curPtr), selectMode); break; case cmLineEnd: setCurPtr(lineEnd(curPtr), selectMode); break; case cmLineUp: setCurPtr(lineMove(curPtr, -1), selectMode); break; case cmLineDown: setCurPtr(lineMove(curPtr, 1), selectMode); break; case cmPageUp: setCurPtr(lineMove(curPtr, -(size.y-1)), selectMode); break; case cmPageDown: setCurPtr(lineMove(curPtr, size.y-1), selectMode); break; case cmTextStart: setCurPtr(0, selectMode); break; case cmTextEnd: setCurPtr(bufLen, selectMode); break; case cmNewLine: newLine(); break; case cmBackSpace: deleteRange(prevChar(curPtr), curPtr, True); break; case cmDelChar: deleteRange(curPtr, nextChar(curPtr), True); break; case cmDelWord: deleteRange(curPtr, nextWord(curPtr), False); break; case cmDelStart: deleteRange(lineStart(curPtr), curPtr, False); break; case cmDelEnd: deleteRange(curPtr, lineEnd(curPtr), False); break; case cmDelLine: deleteRange(lineStart(curPtr), nextLine(curPtr), False); break; case cmInsMode: toggleInsMode(); break; case cmStartSelect: startSelect(); break; case cmHideSelect: hideSelect(); break; case cmIndentMode: autoIndent = Boolean(!autoIndent); break; default: unlock(); return; } trackCursor(centerCursor); unlock(); break; } case evBroadcast: switch( event.message.command ) { case cmScrollBarChanged: checkScrollBar( event, hScrollBar, delta.x ); checkScrollBar( event, vScrollBar, delta.y ); break; default: return; } } clearEvent(event); }
void THexEditor::handleEvent( TEvent& event ) { TScroller::handleEvent(event); if (event.what==evKeyDown && getState(sfFocused+sfSelected)) { ushort kb = event.keyDown.keyCode; switch (kb) { case kbUp: if (cursor.y==0) if (delta.y>0) scrollTo(delta.x,delta.y-1); else setCursor(cursor.x,1); setCursor(cursor.x,cursor.y-1); clearEvent(event); break; case kbDown: if (cursor.y>=size.y-1) if (delta.y<MaxLines-size.y) scrollTo(delta.x,delta.y+1); else setCursor(cursor.x,size.y-2); setCursor(cursor.x,cursor.y+1); clearEvent(event); break; case kbRight: if (cursor.x+1<size.x) setCursor(cursor.x+1,cursor.y); clearEvent(event); break; case kbLeft: if (cursor.x-1>=10) setCursor(cursor.x-1,cursor.y); clearEvent(event); break; case kbIns: toggleInsMode(); clearEvent(event); break; case kbPgUp: scrollTo(delta.x,delta.y-size.y+2>=0?delta.y-size.y+2:0); setCursor(cursor.x,cursor.y-size.y+2>=0?cursor.y-size.y+2:0); clearEvent(event); break; case kbPgDn: scrollTo(delta.x,delta.y+size.y<MaxLines-size.y? delta.y+size.y-2:MaxLines-size.y); setCursor(cursor.x,cursor.y+size.y-2?cursor.y+size.y-2:size.y-1); clearEvent(event); break; case kbHome: setCursor(cursor.x>=60?60:10,cursor.y); clearEvent(event); break; case kbEnd: { long mp=Size-(delta.y+cursor.y<<4); if (mp>15) mp=15; setCursor(cursor.x>=60?60+mp:10+3*mp,cursor.y); clearEvent(event); break; } case kbTab: if (cursor.x>=10&&cursor.x<58) { setCursor((cursor.x-10)/3+60,cursor.y); clearEvent(event); } break; case kbShiftTab: if (cursor.x>=60&&cursor.x<=75) { setCursor((cursor.x-60)*3+10,cursor.y); clearEvent(event); } break; } if (event.what==evNothing) return; uchar ch = event.keyDown.charScan.charCode; if (cursor.x>=10&&cursor.x<57) { long pos=cursor.x-10, ofs=(delta.y+cursor.y<<4)+pos/3; if (ch>='0'&&ch<='9'||ch>='A'&&ch<='F'||ch>='a'&&ch<='f') { char cc[2]; cc[0]=toupper(ch); cc[1]=0; long val=strtol(cc,0,16); if ((ofs==Size || !overwrite && pos%3==0) && sizeable) { ++Size; data=realloc(data,Size); if (!overwrite) { memmove((uchar*)data+ofs+1, (uchar*)data+ofs, Size-ofs-1); ((uchar*)data)[ofs] = 0; } else ((uchar*)data)[Size-1] = 0; } clearEvent(event); if (ofs<Size) { if (pos%3==0) *((uchar*)data+ofs)=*((uchar*)data+ofs)&0x0F|val<<4; else *((uchar*)data+ofs)=*((uchar*)data+ofs)&0xF0|val; if (pos%3==1) pos++; if (++pos/3==16) { if (cursor.y>=size.y-1) { setLimit(0,MaxLines=(Size+16)>>4); scrollTo(delta.x,delta.y+1); } setCursor(10,cursor.y+1); } else setCursor(pos+10,cursor.y);