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/kbufferranges.cpp

308 lines
6.3 KiB

/***************************************************************************
kbufferranges.cpp - description
-------------------
begin : Sun Jun 22 2003
copyright : (C) 2003 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. *
* *
***************************************************************************/
//#include <kdebug.h>
// lib specific
#include "kbufferranges.h"
using namespace KHE;
TDEBufferRanges::TDEBufferRanges( TDEBufferLayout *L )
: Modified( false ),
Layout( L )
{
}
TDEBufferRanges::~TDEBufferRanges()
{
}
void TDEBufferRanges::reset()
{
Selection.cancel();
FirstWordSelection.unset();
Marking.unset();
ChangedRanges.clear();
}
void TDEBufferRanges::setMarking( KSection M )
{
if( Marking == M )
return;
Marking = M;
addChangedRange( M );
}
void TDEBufferRanges::removeFurtherSelections()
{
for( int i = 1; i < noOfSelections(); ++i )
removeSelection( i );
}
void TDEBufferRanges::setSelection( KSection S )
{
bool Changed = Selection.isValid();
if( Changed )
addChangedRange( Selection );
Selection = S;
addChangedRange( Selection );
}
void TDEBufferRanges::setSelectionStart( int StartIndex )
{
bool Changed = Selection.isValid();
if( Changed )
addChangedRange( Selection );
Selection.setStart( StartIndex );
}
void TDEBufferRanges::setSelectionEnd( int EndIndex )
{
KSection OldSelection = Selection;
Selection.setEnd( EndIndex );
// TODO: think about rather building a diff of the sections
if( !OldSelection.isValid() )
{
addChangedRange( Selection );
return;
}
if( !Selection.isValid() )
{
addChangedRange( OldSelection );
return;
}
if( OldSelection == Selection )
return;
int CS_;
int CE_;
// changes at the end?
if( Selection.start() == OldSelection.start() )
{
CS_ = OldSelection.end()+1;
CE_ = Selection.end();
if( CE_ < CS_ )
{
CS_ = Selection.end()+1;
CE_ = OldSelection.end();
}
}
// changes at the start?
else if( Selection.end() == OldSelection.end() )
{
CS_ = OldSelection.start();
CE_ = Selection.start()-1;
if( CE_ < CS_ )
{
CS_ = Selection.start();
CE_ = OldSelection.start()-1;
}
}
// change over the anchor
else
{
CS_ = OldSelection.start();
CE_ = Selection.end();
if( CE_ < CS_ )
{
CS_ = Selection.start();
CE_ = OldSelection.end();
}
}
KSection C( CS_, CE_ );
bool Changed = C.isValid();
if( Changed )
addChangedRange( C );
return;
}
void TDEBufferRanges::removeSelection( int id )
{
if( id > 0 )
return;
bool Changed = Selection.isValid();
if( Changed )
addChangedRange( Selection );
Selection.cancel();
FirstWordSelection.unset();
}
bool TDEBufferRanges::overlapsSelection( int FirstIndex, int LastIndex, int *SI, int *EI ) const
{
if( Selection.overlaps(KSection(FirstIndex,LastIndex)) )
{
*SI = Selection.start();
*EI = Selection.end();
return true;
}
return false;
}
bool TDEBufferRanges::overlapsMarking( int FirstIndex, int LastIndex, int *SI, int *EI ) const
{
if( Marking.overlaps(KSection(FirstIndex,LastIndex)) )
{
*SI = Marking.start();
*EI = Marking.end();
return true;
}
return false;
}
const KSection *TDEBufferRanges::firstOverlappingSelection( KSection Range ) const
{
if( Selection.overlaps(Range) )
return &Selection;
return 0L;
}
const KSection *TDEBufferRanges::overlappingMarking( KSection Range ) const
{
if( Marking.overlaps(Range) )
return &Marking;
return 0L;
}
/*
bool TDEBufferRanges::overlapsChanges( int FirstIndex, int LastIndex, int *SI, int *EI ) const
{
for( KCoordRangeList::const_iterator S=ChangedRanges.begin(); S!=ChangedRanges.end(); ++S )
{
if( (*S).overlaps(KBuff(FirstIndex,LastIndex)) )
{
*SI = (*S).start();
*EI = (*S).end();
return true;
}
}
return false;
}
bool TDEBufferRanges::overlapsChanges( KSection Indizes, KSection *ChangedRange ) const
{
for( KSectionList::const_iterator S=ChangedRanges.begin(); S!=ChangedRanges.end(); ++S )
{
if( (*S).overlaps(Indizes) )
{
*ChangedRange = *S;
return true;
}
}
return false;
}
*/
bool TDEBufferRanges::overlapsChanges( const KCoordRange &Range, KCoordRange *ChangedRange ) const
{
// TODO: add a lastusedrange pointer for quicker access
for( KCoordRangeList::const_iterator R=ChangedRanges.begin(); R!=ChangedRanges.end(); ++R )
{
if( (*R).overlaps(Range) )
{
*ChangedRange = *R;
return true;
}
}
return false;
}
void TDEBufferRanges::addChangedRange( int SI, int EI )
{
addChangedRange( KSection(SI,EI) );
}
void TDEBufferRanges::addChangedRange( KSection S )
{
addChangedRange( KCoordRange(Layout->coordOfIndex(S.start()),Layout->coordOfIndex(S.end())) );
}
void TDEBufferRanges::addChangedRange( const KCoordRange &NewRange )
{
ChangedRanges.addCoordRange( NewRange );
Modified = true;
}
void TDEBufferRanges::removeMarking()
{
bool Changed = Marking.isValid();
if( Changed )
addChangedRange( Marking );
Marking.unset();
}
void TDEBufferRanges::resetChangedRanges()
{
ChangedRanges.clear();
Modified = false;
}
void TDEBufferRanges::setFirstWordSelection( KSection Section )
{
FirstWordSelection = Section;
setSelection( FirstWordSelection );
}
void TDEBufferRanges::ensureWordSelectionForward( bool Forward )
{
// in the anchor not on the right side?
if( Selection.isForward() != Forward )
{
if( Forward )
{
setSelectionEnd( FirstWordSelection.start() );
Selection.setForward();
}
else
{
setSelectionEnd( FirstWordSelection.end()+1 );
Selection.setBackward();
}
}
}