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.
tdelibs/kate/part/katecursor.cpp

191 lines
4.1 KiB

/* This file is part of the KDE libraries
Copyright (C) 2002 Christian Couder <christian@kdevelop.org>
Copyright (C) 2001, 2003 Christoph Cullmann <cullmann@kde.org>
Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
Copyright (C) 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.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.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "katecursor.h"
#include "katedocument.h"
#include "katetextline.h"
//
// KateDocCursor implementation
//
KateDocCursor::KateDocCursor(KateDocument *doc) : KateTextCursor(), m_doc(doc)
{
}
KateDocCursor::KateDocCursor(int line, int col, KateDocument *doc)
: KateTextCursor(line, col), m_doc(doc)
{
}
bool KateDocCursor::validPosition(uint line, uint col)
{
return line < m_doc->numLines() && (int)col <= m_doc->lineLength(line);
}
bool KateDocCursor::validPosition()
{
return validPosition(line(), col());
}
void KateDocCursor::position(uint *pline, uint *pcol) const
{
if (pline)
*pline = (uint)line();
if (pcol)
*pcol = (uint)col();
}
bool KateDocCursor::setPosition(uint line, uint col)
{
bool ok = validPosition(line, col);
if(ok)
setPos(line, col);
return ok;
}
bool KateDocCursor::gotoNextLine()
{
bool ok = (line() + 1 < (int)m_doc->numLines());
if (ok) {
m_line++;
m_col = 0;
}
return ok;
}
bool KateDocCursor::gotoPreviousLine()
{
bool ok = (line() > 0);
if (ok) {
m_line--;
m_col = 0;
}
return ok;
}
bool KateDocCursor::gotoEndOfNextLine()
{
bool ok = gotoNextLine();
if(ok)
m_col = m_doc->lineLength(line());
return ok;
}
bool KateDocCursor::gotoEndOfPreviousLine()
{
bool ok = gotoPreviousLine();
if(ok)
m_col = m_doc->lineLength(line());
return ok;
}
int KateDocCursor::nbCharsOnLineAfter()
{
return ((int)m_doc->lineLength(line()) - col());
}
bool KateDocCursor::moveForward(uint nbChar)
{
int nbCharLeft = nbChar - nbCharsOnLineAfter();
if(nbCharLeft > 0) {
return gotoNextLine() && moveForward((uint)nbCharLeft);
} else {
m_col += nbChar;
return true;
}
}
bool KateDocCursor::moveBackward(uint nbChar)
{
int nbCharLeft = nbChar - m_col;
if(nbCharLeft > 0) {
return gotoEndOfPreviousLine() && moveBackward((uint)nbCharLeft);
} else {
m_col -= nbChar;
return true;
}
}
bool KateDocCursor::insertText(const TQString& s)
{
return m_doc->insertText(line(), col(), s);
}
bool KateDocCursor::removeText(uint nbChar)
{
// Get a cursor at the end of the removed area
KateDocCursor endCursor = *this;
endCursor.moveForward(nbChar);
// Remove the text
return m_doc->removeText((uint)line(), (uint)col(),
(uint)endCursor.line(), (uint)endCursor.col());
}
TQChar KateDocCursor::currentChar() const
{
return m_doc->plainKateTextLine(line())->getChar(col());
}
uchar KateDocCursor::currentAttrib() const
{
return m_doc->plainKateTextLine(line())->attribute(col());
}
bool KateDocCursor::nextNonSpaceChar()
{
for(; m_line < (int)m_doc->numLines(); m_line++) {
m_col = m_doc->plainKateTextLine(line())->nextNonSpaceChar(col());
if(m_col != -1)
return true; // Next non-space char found
m_col = 0;
}
// No non-space char found
setPos(-1, -1);
return false;
}
bool KateDocCursor::previousNonSpaceChar()
{
while (true) {
m_col = m_doc->plainKateTextLine(line())->previousNonSpaceChar(col());
if(m_col != -1) return true; // Previous non-space char found
if(m_line == 0) return false;
--m_line;
m_col = m_doc->plainKateTextLine(m_line)->length();
}
// No non-space char found
setPos(-1, -1);
return false;
}