kde-workspace/kate/part/render/katetextlayout.cpp
Ivailo Monev f68295ea28 generic: move sub-projects from kde-baseapps [ci reset]
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2022-05-14 21:56:54 +03:00

221 lines
4.9 KiB
C++

/* This file is part of the KDE libraries
Copyright (C) 2002-2005 Hamish Rodda <rodda@kde.org>
Copyright (C) 2003 Anakim Border <aborder@sources.sourceforge.net>
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 "katetextlayout.h"
#include <kdebug.h>
KateTextLayout::KateTextLayout(KateLineLayoutPtr line, int viewLine)
: m_lineLayout(line)
, m_viewLine(viewLine)
, m_startX(m_viewLine ? -1 : 0)
, m_invalidDirty(true)
{
if (isValid())
m_textLayout = m_lineLayout->layout()->lineAt(m_viewLine);
}
bool KateTextLayout::isDirty( ) const
{
if (!isValid())
return m_invalidDirty;
return m_lineLayout->isDirty(viewLine());
}
bool KateTextLayout::setDirty( bool dirty )
{
if (!isValid())
return (m_invalidDirty = dirty);
return m_lineLayout->setDirty(viewLine(), dirty);
}
bool KateTextLayout::includesCursor(const KTextEditor::Cursor& realCursor) const
{
return realCursor.line() == line() && realCursor.column() >= startCol() && (!wrap() || realCursor.column() < endCol());
}
int KateTextLayout::xOffset() const
{
if (!isValid())
return 0;
return startX() ? m_lineLayout->shiftX() : 0;
}
void KateTextLayout::debugOutput() const
{
kDebug( 13033 ) << "KateTextLayout: " << m_lineLayout << " valid " << isValid() << " line " << m_lineLayout->line() << " (" << line() << ") cols [" << startCol() << " -> " << endCol() << "] x [" << startX() << " -> " << endX() << " off " << m_lineLayout->shiftX() << "] wrap " << wrap();
}
bool operator> (const KateTextLayout& r, const KTextEditor::Cursor& c)
{
return r.line() > c.line() || r.endCol() > c.column();
}
bool operator>= (const KateTextLayout& r, const KTextEditor::Cursor& c)
{
return r.line() > c.line() || r.endCol() >= c.column();
}
bool operator< (const KateTextLayout& r, const KTextEditor::Cursor& c)
{
return r.line() < c.line() || r.startCol() < c.column();
}
bool operator<= (const KateTextLayout& r, const KTextEditor::Cursor& c)
{
return r.line() < c.line() || r.startCol() <= c.column();
}
bool KateTextLayout::isValid( ) const
{
return m_lineLayout && m_lineLayout->isValid() && m_viewLine >= 0 && m_viewLine < m_lineLayout->viewLineCount();
}
int KateTextLayout::line( ) const
{
if (!isValid())
return -1;
return m_lineLayout->line();
}
int KateTextLayout::virtualLine( ) const
{
if (!isValid())
return -1;
return m_lineLayout->virtualLine();
}
int KateTextLayout::viewLine( ) const
{
if (!isValid())
return 0;
return m_viewLine;
}
const QTextLine & KateTextLayout::lineLayout( ) const
{
return m_textLayout;
}
KateLineLayoutPtr KateTextLayout::kateLineLayout( ) const
{
return m_lineLayout;
}
int KateTextLayout::startCol( ) const
{
if (!isValid())
return 0;
return lineLayout().textStart();
}
KTextEditor::Cursor KateTextLayout::start( ) const
{
return KTextEditor::Cursor(line(), startCol());
}
int KateTextLayout::endCol(bool indicateEOL) const
{
if (!isValid())
return 0;
if (indicateEOL)
if (viewLine() == kateLineLayout()->viewLineCount() - 1)
return -1;
return startCol() + m_textLayout.textLength();
}
KTextEditor::Cursor KateTextLayout::end(bool indicateEOL) const
{
return KTextEditor::Cursor(line(), endCol(indicateEOL));
}
int KateTextLayout::length( ) const
{
if (!isValid())
return 0;
return m_textLayout.textLength();
}
bool KateTextLayout::isEmpty( ) const
{
if (!isValid())
return true;
return startCol() == 0 && endCol() == 0;
}
bool KateTextLayout::wrap( ) const
{
if (!isValid())
return false;
return viewLine() < m_lineLayout->viewLineCount() - 1;
}
int KateTextLayout::startX( ) const
{
if (!isValid())
return 0;
if (m_startX == -1)
// viewLine is already > 0, from the constructor
for (int i = 0; i < viewLine(); ++i)
m_startX += (int)m_lineLayout->layout()->lineAt(i).naturalTextWidth();
return m_startX;
}
int KateTextLayout::endX( ) const
{
if (!isValid())
return 0;
return startX() + (int)m_textLayout.naturalTextWidth();
}
int KateTextLayout::width( ) const
{
if (!isValid())
return 0;
return (int)m_textLayout.naturalTextWidth();
}
KateTextLayout KateTextLayout::invalid( )
{
return KateTextLayout();
}
bool KateTextLayout::isRightToLeft() const
{
if (m_lineLayout)
return m_lineLayout->isRightToLeft();
return false;
}