You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdeutils/khexedit/lib/controller/keditor.cpp

198 lines
5.6 KiB

/***************************************************************************
keditor.cpp - description
-------------------
begin : Sa Dez 4 2004
copyright : (C) 2004 by Friedrich W. H. Kossebau
email : Friedrich.W.H@Kossebau.de
***************************************************************************/
/***************************************************************************
* *
* This library is free software; you can redistribute it and/or *
* modify it under the terms of the GNU Library General Public *
* License version 2 as published by the Free Software Foundation. *
* *
***************************************************************************/
// lib specific
#include "kdatabuffer.h"
#include "kbufferranges.h"
#include "kbufferlayout.h"
#include "kbuffercursor.h"
#include "kwordbufferservice.h"
#include "khexedit.h"
#include "keditor.h"
using namespace KHE;
KEditor::KEditor( TDEBufferCursor *BC, KHexEdit* HE, KController *P )
: KController( HE, P ),
BufferCursor( BC )
{
}
bool KEditor::handleKeyPress( TQKeyEvent *KeyEvent )
{
bool clearUndoRedoInfo = true;
bool ShiftPressed = KeyEvent->state() & TQt::ShiftButton;
bool ControlPressed = KeyEvent->state() & TQt::ControlButton;
bool AltPressed = KeyEvent->state() & TQt::AltButton;
bool KeyUsed = true;
// we only care for cursor keys and the like, won't hardcode any other keys
// we also don't check whether the commands are allowed
// as the commands are also available as API so the check has to be done
// in each command anyway
switch( KeyEvent->key() )
{
case TQt::Key_Delete:
if( ShiftPressed )
HexEdit->cut();
else if( HexEdit->BufferRanges->hasSelection() )
HexEdit->removeSelectedData();
else
{
doEditAction( ControlPressed ? WordDelete : CharDelete );
clearUndoRedoInfo = false;
}
break;
case TQt::Key_Insert:
if( ShiftPressed )
HexEdit->paste();
else if( ControlPressed )
HexEdit->copy();
else
HexEdit->setOverwriteMode( !HexEdit->OverWrite );
break;
case TQt::Key_Backspace:
if( AltPressed )
{
if( ControlPressed )
break;
else if( ShiftPressed )
{
// HexEdit->redo();
break;
}
else
{
// HexEdit->undo();
break;
}
}
else if( HexEdit->BufferRanges->hasSelection() )
{
HexEdit->removeSelectedData();
break;
}
doEditAction( ControlPressed ? WordBackspace : CharBackspace );
clearUndoRedoInfo = false;
break;
case TQt::Key_F16: // "Copy" key on Sun keyboards
HexEdit->copy();
break;
case TQt::Key_F18: // "Paste" key on Sun keyboards
HexEdit->paste();
break;
case TQt::Key_F20: // "Cut" key on Sun keyboards
HexEdit->cut();
break;
default:
KeyUsed = false;
}
// if( clearUndoRedoInfo )
// clearUndoRedo();
// changeIntervalTimer->start( 100, true );
return KeyUsed ? true : KController::handleKeyPress(KeyEvent);
}
void KEditor::doEditAction( KEditAction Action )
{
KSection ChangedRange;
HexEdit->pauseCursor( true );
switch( Action )
{
case CharDelete:
if( !HexEdit->OverWrite )
{
int Index = BufferCursor->realIndex();
if( Index < HexEdit->BufferLayout->length() )
{
ChangedRange = HexEdit->removeData( KSection(Index,1,false) );
if( Index == HexEdit->BufferLayout->length() )
BufferCursor->gotoEnd();
}
}
break;
case WordDelete: // kills data until the start of the next word
if( !HexEdit->OverWrite )
{
int Index = BufferCursor->realIndex();
if( Index < HexEdit->BufferLayout->length() )
{
KWordBufferService WBS( HexEdit->DataBuffer, HexEdit->Codec );
int End = WBS.indexOfBeforeNextWordStart( Index );
ChangedRange = HexEdit->removeData( KSection(Index,End) );
if( Index == HexEdit->BufferLayout->length() )
BufferCursor->gotoEnd();
}
}
break;
case CharBackspace:
if( HexEdit->OverWrite )
BufferCursor->gotoPreviousByte();
else
{
int DeleteIndex = BufferCursor->realIndex() - 1;
if( DeleteIndex >= 0 )
{
ChangedRange = HexEdit->removeData( KSection(DeleteIndex,1,false) );
if( DeleteIndex == HexEdit->BufferLayout->length() )
BufferCursor->gotoEnd();
else
BufferCursor->gotoPreviousByte();
}
}
break;
case WordBackspace:
{
int LeftIndex = BufferCursor->realIndex() - 1;
if( LeftIndex >= 0 )
{
KWordBufferService WBS( HexEdit->DataBuffer, HexEdit->Codec );
int WordStart = WBS.indexOfPreviousWordStart( LeftIndex );
if( !HexEdit->OverWrite )
ChangedRange = HexEdit->removeData( KSection(WordStart,LeftIndex) );
if( WordStart == HexEdit->BufferLayout->length() )
BufferCursor->gotoEnd();
else
BufferCursor->gotoIndex(WordStart);
}
}
}
HexEdit->repaintChanged();
HexEdit->ensureCursorVisible();
HexEdit->unpauseCursor();
emit HexEdit->cursorPositionChanged( BufferCursor->index() );
if( ChangedRange.isValid() ) emit HexEdit->bufferChanged( ChangedRange.start(), ChangedRange.end() );
}