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.
119 lines
3.6 KiB
119 lines
3.6 KiB
// -*- Mode: C++; c-basic-offset: 2; indent-tabs-mode: nil; c-brace-offset: 0; -*- |
|
// |
|
// Class: DVIWidget |
|
// |
|
// Widget for displaying TeX DVI files. |
|
// Part of KDVI- A previewer for TeX DVI files. |
|
// |
|
// (C) 2004-2005 Wilfried Huss, Stefan Kebekus |
|
// Distributed under the GPL |
|
// |
|
|
|
#include <config.h> |
|
|
|
#include "dviWidget.h" |
|
#include "documentPageCache.h" |
|
#include "hyperlink.h" |
|
#include "kvs_debug.h" |
|
#include "renderedDviPagePixmap.h" |
|
|
|
#include <klocale.h> |
|
|
|
#include <QMouseEvent> |
|
|
|
|
|
DVIWidget::DVIWidget(PageView* sv, DocumentPageCache* cache, const char* name) |
|
: DocumentWidget(sv, cache, name) |
|
{ |
|
} |
|
|
|
|
|
void DVIWidget::mousePressEvent(QMouseEvent* e) |
|
{ |
|
// Call implementation from parent |
|
DocumentWidget::mousePressEvent(e); |
|
|
|
// Safety check |
|
if (!pageNumber.isValid()) { |
|
return; |
|
} |
|
|
|
// Get a pointer to the page contents |
|
RenderedDviPagePixmap* pageData = dynamic_cast<RenderedDviPagePixmap*>(documentCache->getPage(pageNumber)); |
|
if (pageData == 0) { |
|
kDebug(kvs::dvi) << "DVIWidget::mousePressEvent(...) pageData for page #" << pageNumber << " is empty" << endl; |
|
return; |
|
} |
|
|
|
// Check if the mouse is pressed on a source-hyperlink |
|
// source hyperlinks can be invoked with the Middle Mousebutton or alternatively |
|
// with Control+Left Mousebutton |
|
if ((e->button() == Qt::MidButton || (e->button() == Qt::LeftButton && (e->state() & Qt::ControlButton))) |
|
&& (pageData->sourceHyperLinkList.size() > 0)) { |
|
int minIndex = 0; |
|
int minimum = 0; |
|
|
|
for(int i=0; i<pageData->sourceHyperLinkList.size(); i++) { |
|
if (pageData->sourceHyperLinkList[i].box.contains(inverseMap(e->pos()))) { |
|
emit(SRCLink(pageData->sourceHyperLinkList[i].linkText, inverseMap(e->pos()), this)); |
|
e->accept(); |
|
return; |
|
} |
|
// Remember the closest source link |
|
QPoint center = pageData->sourceHyperLinkList[i].box.center(); |
|
int dx = center.x() - e->pos().x(); |
|
int dy = center.y() - e->pos().y(); |
|
if (dx*dx + dy*dy < minimum || i == 0) { |
|
minIndex = i; |
|
minimum = dx*dx + dy*dy; |
|
} |
|
} |
|
// If the mouse pointer is not exactly inside a source link, jump to the closest target. |
|
emit(SRCLink(pageData->sourceHyperLinkList[minIndex].linkText, inverseMap(e->pos()), this)); |
|
e->accept(); |
|
} |
|
} |
|
|
|
|
|
void DVIWidget::mouseMoveEvent(QMouseEvent* e) |
|
{ |
|
// Safety check |
|
if (!pageNumber.isValid()) |
|
return; |
|
|
|
// Call the standard implementation |
|
DocumentWidget::mouseMoveEvent(e); |
|
|
|
// Analyze the mouse movement only if no mouse button was pressed |
|
if ( e->state() == 0 ) { |
|
// Get a pointer to the page contents |
|
RenderedDviPagePixmap* pageData = dynamic_cast<RenderedDviPagePixmap*>(documentCache->getPage(pageNumber)); |
|
if (pageData == 0) { |
|
kDebug(kvs::dvi) << "DVIWidget::mouseMoveEvent(...) pageData for page #" << pageNumber << " is empty" << endl; |
|
return; |
|
} |
|
|
|
// Check if the cursor hovers over a sourceHyperlink. |
|
for(int i=0; i<pageData->sourceHyperLinkList.size(); i++) { |
|
if (pageData->sourceHyperLinkList[i].box.contains(e->pos())) { |
|
clearStatusBarTimer.stop(); |
|
|
|
// The macro-package srcltx gives a special like "src:99 test.tex" |
|
// while MikTeX gives "src:99test.tex". KDVI tries |
|
// to understand both. |
|
QString cp = pageData->sourceHyperLinkList[i].linkText; |
|
int max = cp.length(); |
|
int i; |
|
for(i=0; i<max; i++) |
|
if (cp[i].isDigit() == false) |
|
break; |
|
|
|
emit setStatusBarText( i18n("line %1 of %2", cp.left(i), cp.mid(i).simplified()) ); |
|
return; |
|
} |
|
} |
|
} |
|
} |
|
|
|
|
|
#include "dviWidget.moc"
|
|
|