summaryrefslogtreecommitdiffstats
path: root/kviewshell/documentWidget.h
diff options
context:
space:
mode:
Diffstat (limited to 'kviewshell/documentWidget.h')
-rw-r--r--kviewshell/documentWidget.h193
1 files changed, 193 insertions, 0 deletions
diff --git a/kviewshell/documentWidget.h b/kviewshell/documentWidget.h
new file mode 100644
index 00000000..50f2ee44
--- /dev/null
+++ b/kviewshell/documentWidget.h
@@ -0,0 +1,193 @@
+// -*- C++ -*-
+//
+// Class: documentWidet
+//
+// Widget for displaying TeX DVI files.
+// Part of KDVI- A previewer for TeX DVI files.
+//
+// (C) 2004 Stefan Kebekus.
+// Copyright (C) 2004-2005 Wilfried Huss <[email protected]>
+//
+// Distributed under the GPL.
+
+#ifndef _documentwidget_h_
+#define _documentwidget_h_
+
+#include "selection.h"
+
+#include <qregion.h>
+#include <qtimer.h>
+#include <qwidget.h>
+
+class DocumentPageCache;
+class PageView;
+class QMouseEvent;
+class QPaintEvent;
+
+
+/* DocumentWidget */
+
+class DocumentWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ DocumentWidget(QWidget *parent, PageView *sv, DocumentPageCache *cache, const char *name);
+
+ void setPageNumber(Q_UINT16 pageNr);
+ Q_UINT16 getPageNumber() const {return pageNr;}
+
+ /** Returns the size of the widget without the page shadow. */
+ QSize pageSize() const;
+ /** Returns the bounding rectangle of the widget without the page shadow. */
+ QRect pageRect() const;
+
+ /** Draw a red vertical line at y-coordinate ycoord. The line is removed again
+ after one second. This is used to make it easier to regain reading focus if
+ the whole page is scrolled up or down. */
+ void drawScrollGuide(int ycoord);
+
+ /** Checks if the page is currently visible in the PageView. */
+ bool isVisible();
+
+public slots:
+ void slotEnableMoveTool(bool enable);
+
+ void select(const TextSelection&);
+ void selectAll();
+ void flash(int);
+
+ /** Sets the size of the widget so that the page is of the given size.
+ The widget gets slightly bigger because of the page shadow. */
+ void setPageSize(const QSize&);
+ void setPageSize(int width, int height);
+
+signals:
+ /** Passed through to the top-level kpart. */
+ void setStatusBarText( const QString& );
+ void localLink( const QString& );
+
+ /** This signal is emitted when the widget resizes itself */
+ void resized();
+
+ /** This signal is emitted when the selection needs to be cleared. */
+ void clearSelection();
+
+protected:
+ virtual void paintEvent (QPaintEvent *);
+ virtual void mousePressEvent ( QMouseEvent * e );
+ virtual void mouseReleaseEvent (QMouseEvent *);
+
+ /** This method is used by the DocumentWidget to find out of the
+ mouse pointer hovers over a hyperlink, and to update the
+ statusbar accordingly. Scrolling with the left mouse button
+ pressed, and the text copy functions are also implemented here.
+ Re-implementations of this method should do the following:
+
+ 0) Immediately return if pageNr == 0, i.e. if no page number has
+ been set
+
+ 1) Call the standard implementation using
+
+ DocumentWidget::mouseMoveEvent(e);
+
+ 2) Ignore the QMouseEvent if a mouse button is pressed
+
+ 3) If no mouse button is pressed, analyze the mouse movement and
+ take appropriate actions. To set statusbar text, do
+
+ clearStatusBarTimer.stop();
+ emit setStatusBarText( i18n("Whatever string") );
+
+ To clear the statusbar, use the following code
+
+ if (!clearStatusBarTimer.isActive())
+ clearStatusBarTimer.start(200, true);
+
+ This clears the statusbar after 200 msec and avoids awful
+ flickering when the mouse is swiftly moved across various
+ areas in the widget.
+
+ */
+ virtual void mouseMoveEvent (QMouseEvent *);
+
+protected:
+ void updateSelection(const TextSelection& newTextSelection);
+
+ /** Methods and counters used for the animation to mark the target of
+ an hyperlink. */
+ int timerIdent;
+ void timerEvent( QTimerEvent *e );
+ int animationCounter;
+ int flashOffset;
+
+ Q_UINT16 pageNr;
+
+ /* This timer is used to delay clearing of the statusbar. Clearing
+ the statusbar is delayed to avoid awful flickering when the mouse
+ moves over a block of text that contains source hyperlinks. The
+ signal timeout() is connected to the method clearStatusBar() of
+ *this. */
+ QTimer clearStatusBarTimer;
+
+ /* Data structures used for marking text with the mouse */
+ QPoint firstSelectedPoint;
+ QRect selectedRectangle;
+
+ /** Pointer to the PageView that contains this
+ widget. This pointer is used in the re-implementation of the
+ paintEvent() method ---see the explanation there. */
+ PageView *scrollView;
+ DocumentPageCache *documentCache;
+
+ /** Currently selected Region */
+ QRegion selectedRegion;
+
+ /** This is set to the index of the link over which the mouse pointer currently resides,
+ and -1 if the no link is hovered.
+ Is used when "Underline Links" is set to "Only on Hover". */
+ int indexOfUnderlinedLink;
+
+ /** True if there is already a request for this page to the renderer. */
+ bool pixmapRequested;
+
+ /** Sets the cursor to an arrow if the move tool is selected, and to the text selection
+ cursor if the selection tool is active. */
+ virtual void setStandardCursor();
+
+private slots:
+ /** This slot emits the signal setStatusBarText(QString::null) to
+ clear the status bar. It is connected to the timeout slot of the
+ clearStatusBarTimer. */
+ void clearStatusBar();
+
+ void delayedRequestPage();
+
+ /** Hide the scroll guide. This slot is called one second after drawScrollGuide(). */
+ void clearScrollGuide();
+
+private:
+ QRect linkFlashRect();
+
+ /** If this variable is positive draw a vertical line at this y-coordinate. */
+ int scrollGuide;
+
+ /** Color used by in the shadow drawing to check if the background color has been changed. */
+ static QColor backgroundColorForCorners;
+
+ /** The following tables store grey values for roundish shadow
+ corners. They were shamelessly stolen from kdelibs/kdefx/kstyle.cpp. */
+ static const int bottom_right_corner[16];
+ static const int bottom_left_corner[16];
+ static const int shadow_strip[4];
+
+ bool moveTool;
+
+ /** If this is true the zoomlevel has changed and we need to update the
+ selected region. */
+ bool selectionNeedsUpdating;
+};
+
+
+
+#endif