/*************************************************************************** kbufferlayout.h - 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. * * * ***************************************************************************/ #ifndef KHE_KBUFFERLAYOUT_H #define KHE_KBUFFERLAYOUT_H // lib specific #include "kcoordrange.h" #include "ksection.h" namespace KHE { /**@short the logical layout of a plain buffer view * * Given the values for * * length of the buffer, * * number of bytes per line, * * a possible (relative) offset in the display, and * * the number of lines per page jump * the following values are calculated: * * starting line of display, * * starting position in this line, * * final line of display, * * final position in this line, and * * the total number of lines (is final line +1 or 0) * * This layout sees the buffer as a continous stream of byte, * thus uses each line after the start from the begin to the end. * * If the buffer is empty the end coord will be set one pos left to the start coord * to easen the cursor handling. * *@author Friedrich W. H. Kossebau */ class TDEBufferLayout { public: TDEBufferLayout( int NoBpL, int SO, int L ); //TDEBufferLayout(); ~TDEBufferLayout(); public: // given values /** */ int startOffset() const; /** returns number of bytes per line */ int noOfBytesPerLine() const; /** returns the length of the displayed data (equals Buffer->size()) */ int length() const; /** returns number of lines per visual page */ int noOfLinesPerPage() const; public: // calculated values int startLine() const; int startPos() const; /** returns the coord of the start */ TDEBufferCoord start() const; int finalLine() const; int finalPos() const; /** returns the coord of the end */ TDEBufferCoord final() const; /** tells how much lines this layout needs (incl. blank leading lines due to StartOffset) */ int noOfLines() const; public: // value calculation service /** calculates the index of the coord * If the coord is before the first coord the first index is returned, * if the coord is behind the last coord the last index is returned */ int indexAtCCoord( const TDEBufferCoord &C ) const; /** calculates the index of the first pos in line. * If the line is below the first line the first index is returned, * if the line is above the last line the last index is returned */ int indexAtCLineStart( int L ) const; /** calculates the index of last pos in line * If the line is below the first line the first index is returned, * if the line is above the last line the last index is returned */ int indexAtCLineEnd( int L ) const; /** calculates the line in which index is found * If the index is below the first index the first line is returned, * if the index is above the last index the last line is returned */ int lineAtCIndex( int Index ) const; /** calculates the coord in which index is found * If the index is below the first index the first coord is returned, * if the index is above the last index the last coord is returned */ TDEBufferCoord coordOfCIndex( int Index ) const; /** calculates the index of coord. if coord is invalid the behaviour is undefinded */ int indexAtCoord( const TDEBufferCoord &C ) const; /** calculates the index of the first pos in line. if line is invalid the behaviour is undefinded */ int indexAtLineStart( int L ) const; /** calculates the index of last pos in line. if line is invalid the behaviour is undefinded */ int indexAtLineEnd( int L ) const; /** calculates the line in which index is found. if index is invalid the behaviour is undefinded */ int lineAtIndex( int Index ) const; /** calculates the coord in which index is found. if index is invalid the behaviour is undefinded */ TDEBufferCoord coordOfIndex( int Index ) const; /** returns the used positions in line */ KSection positions( int Line ) const; /** returns the first Pos in line. if line is invalid the behaviour is undefinded */ int firstPos( int Line ) const; /** returns the last Pos in line. if line is invalid the behaviour is undefinded */ int lastPos( int Line ) const; /** returns the valid Pos or the first Pos in line. if coord is invalid the behaviour is undefinded */ int firstPos( const TDEBufferCoord &C ) const; /** returns the valid Pos or the last Pos in line. if coord is invalid the behaviour is undefinded */ int lastPos( const TDEBufferCoord &C ) const; /** returns true if the line has content */ bool hasContent( int Line ) const; /** returns true if the coord is the first in it's line. if coord is invalid the behaviour is undefinded */ bool atLineStart( const TDEBufferCoord &C ) const; /** returns true if the coord is the last in it's line. if coord is invalid the behaviour is undefinded */ bool atLineEnd( const TDEBufferCoord &C ) const; /** returns the index if valid or the nearest valid index */ int correctIndex( int I ) const; /** returns the coord if valid or the nearest valid coord */ TDEBufferCoord correctCoord( const TDEBufferCoord &C ) const; public: // modification access; return true if changes /** sets StartOffset, returns true if changed */ bool setStartOffset( int SO ); /** sets number of bytes per line, returns true if changed */ bool setNoOfBytesPerLine( int N ); /** sets number of lines per page */ void setNoOfLinesPerPage( int N ); /** sets length of data to display, returns true if changed */ bool setLength( int L ); protected: /** calculates the start coord by startoffset and number of bytes per line */ void calcStart(); /** calculates the final coord by startoffset, length, and number of bytes per line */ void calcEnd(); protected: /** how many chars per line */ int NoOfBytesPerLine; /** starting offset of the displayed data */ int StartOffset; /** length of the displayed buffer */ int Length; /** number of lines that are moved by page up/down */ int NoOfLinesPerPage; protected: // calculated values, buffered /** coord in which the start offset is (starting with 0) */ // TDEBufferCoord Start; /** coord in which the last byte is (starting with 0) */ // TDEBufferCoord Final; /** */ KCoordRange ContentCoords; }; inline int TDEBufferLayout::startOffset() const { return StartOffset; } inline int TDEBufferLayout::noOfBytesPerLine() const { return NoOfBytesPerLine; } inline int TDEBufferLayout::length() const { return Length; } inline TDEBufferCoord TDEBufferLayout::final() const { return ContentCoords.end(); } inline TDEBufferCoord TDEBufferLayout::start() const { return ContentCoords.start(); } inline int TDEBufferLayout::startPos() const { return start().pos(); } inline int TDEBufferLayout::finalPos() const { return final().pos(); } inline int TDEBufferLayout::startLine() const { return start().line(); } inline int TDEBufferLayout::finalLine() const { return final().line(); } inline int TDEBufferLayout::noOfLinesPerPage() const { return NoOfLinesPerPage; } inline int TDEBufferLayout::noOfLines() const { return Length==0?0:final().line()+1; } } #endif