1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
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 <Wilfried.Huss@gmx.at>
//
// 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
|