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.
tdegraphics/kviewshell/documentWidget.h

195 lines
5.9 KiB

// -*- 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 <tqregion.h>
#include <tqtimer.h>
#include <tqwidget.h>
class DocumentPageCache;
class PageView;
class TQMouseEvent;
class TQPaintEvent;
/* DocumentWidget */
class DocumentWidget : public TQWidget
{
Q_OBJECT
TQ_OBJECT
public:
DocumentWidget(TQWidget *tqparent, PageView *sv, DocumentPageCache *cache, const char *name);
void setPageNumber(TQ_UINT16 pageNr);
TQ_UINT16 getPageNumber() const {return pageNr;}
/** Returns the size of the widget without the page shadow. */
TQSize pageSize() const;
/** Returns the bounding rectangle of the widget without the page shadow. */
TQRect 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 TQSize&);
void setPageSize(int width, int height);
signals:
/** Passed through to the top-level kpart. */
void setStatusBarText( const TQString& );
void localLink( const TQString& );
/** 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 (TQPaintEvent *);
virtual void mousePressEvent ( TQMouseEvent * e );
virtual void mouseReleaseEvent (TQMouseEvent *);
/** 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 TQMouseEvent 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 (TQMouseEvent *);
protected:
void updateSelection(const TextSelection& newTextSelection);
/** Methods and counters used for the animation to mark the target of
an hyperlink. */
int timerIdent;
void timerEvent( TQTimerEvent *e );
int animationCounter;
int flashOffset;
TQ_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. */
TQTimer clearStatusBarTimer;
/* Data structures used for marking text with the mouse */
TQPoint firstSelectedPoint;
TQRect 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 */
TQRegion 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(TQString()) 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:
TQRect 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 TQColor 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