Пример #1
0
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);
}
Пример #2
0
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);