summaryrefslogtreecommitdiffstats
path: root/kate/part/katerenderer.h
diff options
context:
space:
mode:
Diffstat (limited to 'kate/part/katerenderer.h')
-rw-r--r--kate/part/katerenderer.h272
1 files changed, 272 insertions, 0 deletions
diff --git a/kate/part/katerenderer.h b/kate/part/katerenderer.h
new file mode 100644
index 000000000..fc4865ab1
--- /dev/null
+++ b/kate/part/katerenderer.h
@@ -0,0 +1,272 @@
+/* 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 <qfont.h>
+#include <qfontmetrics.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 QFont* currentFont();
+ const QFontMetrics* 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(QPainter& 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(QPainter& 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(QPainter &paint, uint x, uint y);
+
+ /** Paint a SciTE-like indent marker. */
+ void paintIndentMarker(QPainter &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;
+
+ QMemArray<KateAttribute> *m_attributes;
+
+ /**
+ * Configuration
+ */
+ public:
+ inline KateRendererConfig *config () { return m_config; };
+
+ void updateConfig ();
+
+ private:
+ KateRendererConfig *m_config;
+};
+
+#endif