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/katerenderer.h

273 lines
7.6 KiB

/* This file is part of the KDE libraries
Copyright (C) 2003 Hamish Rodda <rodda@kde.org>
Copyright (C) 2001 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.
*/
#ifndef __KATE_RENDERER_H__
#define __KATE_RENDERER_H__
#include "katecursor.h"
#include "kateattribute.h"
#include "katetextline.h"
#include <tqfont.h>
#include <tqfontmetrics.h>
class KateDocument;
class KateView;
class KateLineRange;
class KateRendererConfig;
/**
* Handles all of the work of rendering the text
* (used for the views and printing)
*
**/
class KateRenderer
{
public:
/**
* Style of Caret (Insert or Replace mode)
*/
enum caretStyles {
Insert,
Replace
};
/**
* Constructor
* @param doc document to render
* @param view view which is output (0 for example for rendering to print)
*/
KateRenderer(KateDocument* doc, KateView *view = 0);
/**
* Destructor
*/
~KateRenderer();
/**
* update the highlighting attributes
* (for example after an hl change or after hl config changed)
*/
void updateAttributes ();
/**
* Determine whether the caret (text cursor) will be drawn.
* @return should it be drawn?
*/
inline bool drawCaret() const { return m_drawCaret; }
/**
* Set whether the caret (text cursor) will be drawn.
* @param drawCaret should caret be drawn?
*/
void setDrawCaret(bool drawCaret);
/**
* The style of the caret (text cursor) to be painted.
* @return caretStyle
*/
inline KateRenderer::caretStyles caretStyle() const { return m_caretStyle; }
/**
* Set the style of caret to be painted.
* @param style style to set
*/
void setCaretStyle(KateRenderer::caretStyles style);
/**
* @returns whether tabs should be shown (ie. a small mark
* drawn to identify a tab)
* @return tabs should be shown
*/
inline bool showTabs() const { return m_showTabs; }
/**
* Set whether a mark should be painted to help identifying tabs.
* @param showTabs show the tabs?
*/
void setShowTabs(bool showTabs);
/**
* Sets the width of the tab. Helps performance.
* @param tabWidth new tab width
*/
void setTabWidth(int tabWidth);
/**
* @returns whether indent lines should be shown
* @return indent lines should be shown
*/
bool showIndentLines() const;
/**
* Set whether a guide should be painted to help identifying indent lines.
* @param showLines show the indent lines?
*/
void setShowIndentLines(bool showLines);
/**
* Sets the width of the tab. Helps performance.
* @param indentWidth new indent width
*/
void setIndentWidth(int indentWidth);
/**
* Show the view's selection?
* @return show sels?
*/
inline bool showSelections() const { return m_showSelections; }
/**
* Set whether the view's selections should be shown.
* The default is true.
* @param showSelections show the selections?
*/
void setShowSelections(bool showSelections);
/**
* Change to a different font (soon to be font set?)
*/
void increaseFontSizes();
void decreaseFontSizes();
const TQFont* currentFont();
const TQFontMetrics* currentFontMetrics();
/**
* @return whether the renderer is configured to paint in a
* printer-friendly fashion.
*/
bool isPrinterFriendly() const;
/**
* Configure this renderer to paint in a printer-friendly fashion.
*
* Sets the other options appropriately if true.
*/
void setPrinterFriendly(bool printerFriendly);
/**
* Text width & height calculation functions...
*/
// Width calculators
uint spaceWidth();
uint textWidth(const KateTextLine::Ptr &, int cursorCol);
uint textWidth(const KateTextLine::Ptr &textLine, uint startcol, uint maxwidth, bool *needWrap, int *endX = 0);
uint textWidth(const KateTextCursor &cursor);
// Cursor constrainer
uint textWidth(KateTextCursor &cursor, int xPos, uint startCol = 0);
// Column calculators
/**
* @return the index of the character at the horixontal position @p xpos
* in @p line.
*
* If @p nearest is true, the character starting nearest to
* @p xPos is returned. If @p nearest is false, the index of the character
* containing @p xPos is returned.
**/
uint textPos(uint line, int xPos, uint startCol = 0, bool nearest=true);
/**
* @overload
*/
uint textPos(const KateTextLine::Ptr &, int xPos, uint startCol = 0, bool nearest=true);
// Font height
uint fontHeight();
// Document height
uint documentHeight();
// Selection boundaries
bool getSelectionBounds(uint line, uint lineLength, uint &start, uint &end);
/**
* This is the ultimate function to perform painting of a text line.
* (supports startcol/endcol, startx/endx)
*
* The text line is painted from the upper limit of (0,0). To move that,
* apply a transform to your painter.
*/
void paintTextLine(TQPainter& paint, const KateLineRange* range, int xStart, int xEnd, const KateTextCursor* cursor = 0L, const KateBracketRange* bracketmark = 0L);
/**
* Paint the background of a line
*
* Split off from the main @ref paintTextLine method to make it smaller. As it's being
* called only once per line it shouldn't noticably affect performance and it
* helps readability a LOT.
*
* @return whether the selection has been painted or not
*/
bool paintTextLineBackground(TQPainter& paint, int line, bool isCurrentLine, int xStart, int xEnd);
/**
* This takes an in index, and returns all the attributes for it.
* For example, if you have a ktextline, and want the KateAttribute
* for a given position, do:
*
* attribute(myktextline->attribute(position));
*/
KateAttribute* attribute(uint pos);
private:
/**
* Paint a whitespace marker on position (x, y).
*
* Currently only used by the tabs, but it will also be used for highlighting trailing whitespace
*/
void paintWhitespaceMarker(TQPainter &paint, uint x, uint y);
/** Paint a SciTE-like indent marker. */
void paintIndentMarker(TQPainter &paint, uint x, uint y);
KateDocument* m_doc;
KateView *m_view;
// cache of config values
int m_tabWidth;
int m_indentWidth;
uint m_schema;
// some internal flags
KateRenderer::caretStyles m_caretStyle;
bool m_drawCaret;
bool m_showSelections;
bool m_showTabs;
bool m_printerFriendly;
TQMemArray<KateAttribute> *m_attributes;
/**
* Configuration
*/
public:
inline KateRendererConfig *config () { return m_config; };
void updateConfig ();
private:
KateRendererConfig *m_config;
};
#endif