/*************************************************************************** kbufferlayout.cpp - description ------------------- begin : Thu Jun 12 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 "kbufferlayout.h" using namespace KHE; TDEBufferLayout::TDEBufferLayout( int NoBpL, int SO, int L ) : NoOfBytesPerLine( NoBpL ), StartOffset( SO ), Length( L ) { calcStart(); calcEnd(); } TDEBufferLayout::~TDEBufferLayout() { } bool TDEBufferLayout::setStartOffset( int SO ) { // rejecting <0 if( SO < 0 ) SO = 0; if( StartOffset == SO ) return false; StartOffset = SO; calcStart(); calcEnd(); return true; } bool TDEBufferLayout::setNoOfBytesPerLine( int N ) { // rejecting <1 if( N < 1 ) N = 1; // no changes? if( NoOfBytesPerLine == N ) return false; NoOfBytesPerLine = N; calcStart(); calcEnd(); return true; } bool TDEBufferLayout::setLength( int L ) { // rejecting < 0 if( L < 0 ) L = 0; // no changes? if( Length == L ) return false; Length = L; calcEnd(); return true; } void TDEBufferLayout::setNoOfLinesPerPage( int N ) { NoOfLinesPerPage = N; } void TDEBufferLayout::calcStart() { ContentCoords.setStart( TDEBufferCoord(StartOffset,NoOfBytesPerLine,false) ); } void TDEBufferLayout::calcEnd() { ContentCoords.setEnd( (Length>0)?TDEBufferCoord(Length-1+StartOffset,NoOfBytesPerLine,false): TDEBufferCoord(-1,ContentCoords.start().line()) ); } int TDEBufferLayout::indexAtCLineStart( int L ) const { return ( L <= ContentCoords.start().line() ) ? 0: ( L > ContentCoords.end().line() ) ? Length-1: L * NoOfBytesPerLine - StartOffset; } int TDEBufferLayout::indexAtCLineEnd( int L ) const { return ( L < ContentCoords.start().line() ) ? 0: ( L >= ContentCoords.end().line() ) ? Length-1: (L+1)*NoOfBytesPerLine-StartOffset-1; } int TDEBufferLayout::indexAtCCoord( const TDEBufferCoord &C ) const { int Index = indexAtCoord( C ); return ( Index <= 0 ) ? 0: ( Index >= Length ) ? Length-1: Index; } int TDEBufferLayout::lineAtCIndex( int Index ) const { return ( Index <= 0 ) ? ContentCoords.start().line(): ( Index >= Length ) ? ContentCoords.end().line(): lineAtIndex(Index); } TDEBufferCoord TDEBufferLayout::coordOfCIndex( int Index ) const { return ( Index <= 0 ) ? ContentCoords.start(): ( Index >= Length ) ? ContentCoords.end(): coordOfIndex(Index); } int TDEBufferLayout::indexAtLineStart( int L ) const { return ( L == ContentCoords.start().line() ) ? 0 : L*NoOfBytesPerLine-StartOffset; } int TDEBufferLayout::indexAtLineEnd( int L ) const { return ( L == ContentCoords.end().line() ) ? Length-1 : (L+1)*NoOfBytesPerLine-StartOffset-1; } int TDEBufferLayout::indexAtCoord( const TDEBufferCoord &C ) const { return C.indexByLineWidth( NoOfBytesPerLine ) - StartOffset; } int TDEBufferLayout::lineAtIndex( int Index ) const { return (Index+StartOffset)/NoOfBytesPerLine; } TDEBufferCoord TDEBufferLayout::coordOfIndex( int Index ) const { return TDEBufferCoord( Index+StartOffset, NoOfBytesPerLine, false ); } int TDEBufferLayout::correctIndex( int I ) const { return ( I <= 0 ) ? 0: ( I >= Length ) ? Length-1: I; } TDEBufferCoord TDEBufferLayout::correctCoord( const TDEBufferCoord &C ) const { return ( C <= ContentCoords.start() ) ? ContentCoords.start(): ( C >= ContentCoords.end() ) ? ContentCoords.end(): ( C.pos() >= NoOfBytesPerLine ) ? TDEBufferCoord( NoOfBytesPerLine-1, C.line() ): C; } bool TDEBufferLayout::atLineStart( const TDEBufferCoord &C ) const { return ( C.line() == ContentCoords.start().line() ) ? C.pos() == ContentCoords.start().pos(): C.pos() == 0; } bool TDEBufferLayout::atLineEnd( const TDEBufferCoord &C ) const { return ( C.line() == ContentCoords.end().line() ) ? C.pos() == ContentCoords.end().pos(): C.pos() == NoOfBytesPerLine-1; } KSection TDEBufferLayout::positions( int Line ) const { return KSection( firstPos(Line), lastPos(Line) ); } int TDEBufferLayout::firstPos( const TDEBufferCoord &C ) const { return ( ContentCoords.start().isLaterInLineThan(C) ) ? ContentCoords.start().pos() : C.pos(); } int TDEBufferLayout::lastPos( const TDEBufferCoord &C ) const { return ( ContentCoords.end().isPriorInLineThan(C) ) ? ContentCoords.end().pos() : C.pos(); } int TDEBufferLayout::firstPos( int Line ) const { return Line == ContentCoords.start().line() ? ContentCoords.start().pos() : 0; } int TDEBufferLayout::lastPos( int Line ) const { return ( Line == ContentCoords.end().line() ) ? ContentCoords.end().pos() : NoOfBytesPerLine-1; } bool TDEBufferLayout::hasContent( int Line ) const { return ContentCoords.includesLine( Line ); }