summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/QTReader.cpp
Side-by-side diff
Diffstat (limited to 'noncore/apps/opie-reader/QTReader.cpp') (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-reader/QTReader.cpp855
1 files changed, 681 insertions, 174 deletions
diff --git a/noncore/apps/opie-reader/QTReader.cpp b/noncore/apps/opie-reader/QTReader.cpp
index 33884a0..0c56dd4 100644
--- a/noncore/apps/opie-reader/QTReader.cpp
+++ b/noncore/apps/opie-reader/QTReader.cpp
@@ -31,14 +31,18 @@ const int _SBARHEIGHT = 3;
#include <qpe/qcopenvelope_qws.h>
#endif
#include <qfileinfo.h>
#include <qdir.h>
+#include "TableDialog.h"
+#include "outputcodec.h"
+/*
#ifdef _UNICODE
const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 };
#else
const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 };
#endif
+*/
//const int QTReader::fontsizes[] = { 8, 10, 12, 14, 18, 24, 30, 40, 50, 60, 70, 80, 90, 100, 0 };
//const tchar *QTReader::fonts[] = { "unifont", "fixed", "micro", "smoothtimes", "Courier", "Times", 0 };
//const int QTReader::fontsizes[] = {10,16,17,22,0};
@@ -48,11 +52,11 @@ const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 };
tchar QTReader::pluckernextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 };
tchar QTReader::jplucknextpart[] = { 'N','e','x','t',' ','P','a','r','t',' ','>','>',0 };
//tchar QTReader::jplucknextpart[] = { 10,'#',10,'N','e','x','t',' ','P','a','r','t',' ','>','>',0 };
-
QTReader::QTReader( QWidget *parent, const char *name, WFlags f) :
- QWidget(parent, name, f),
+ QWidget(parent, name, f | WRepaintNoErase | WResizeNoErase),
+ m_outofdate(true),
m_default_fg(0,0,0),
m_default_bg(255,255,255),
m_bg(255,255,255),
m_delay(100),
@@ -88,18 +92,14 @@ QTReader::QTReader( QWidget *parent, const char *name, WFlags f) :
m_currentlinkstyle(NULL),
m_currentlinkoffset(-1),
m_currentlink(-1)
{
+ m_output = NULL;
m_overlap = 1;
setKeyCompression ( true );
-#ifdef DOUBLEBUFFER
- dbuff = new QPixmap();
- dbp = new QPainter();
- // if (painter->isActive()) painter->end();
- // painter->begin(frame);
-#endif
-// init();
+ dbuff = NULL;
+ dbp = NULL;
}
/*
QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0) :
@@ -116,9 +116,9 @@ QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *nam
bindenter(0),
m_fm(NULL)
{
init();
-// // qDebug("Load_file(1)");
+// // qDeb2ug("Load_file(1)");
load_file((const tchar*)filename);
}
*/
@@ -137,9 +137,10 @@ long QTReader::real_delay()
}
void QTReader::mousePressEvent( QMouseEvent* _e )
{
- buffdoc.unsuspend();
+ m_drageligible = false;
+ qDebug("Mouse pressed at (%u, %u)", _e->x(), _e->y());
int x, y, ht, wh;
if (m_rotated)
{
x = _e->y();
@@ -153,8 +154,10 @@ void QTReader::mousePressEvent( QMouseEvent* _e )
y = _e->y();
ht = height();
wh = width();
}
+ if (x >= m_left_border && x <= wh - m_right_border && y >= m_topmargin && y <= ht-m_bottommargin)
+ {
if (_e->button() == RightButton)
{
// qDebug("MousePress");
mouseUpOn = false;
@@ -167,17 +170,159 @@ void QTReader::mousePressEvent( QMouseEvent* _e )
{
hgt += textarray[++lineno]->lineSpacing();
}
*/
- size_t startpos, startoffset, tgt, tgtoffset, pictgt;
+ size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt;
QImage* img;
- getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img);
+ getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt);
processmousewordevent(startpos, startoffset, _e, lineno);
}
else
+ {
processmousepositionevent(_e);
}
}
+ }
+ else
+ {
+ int ln = -1;
+ int mp;
+ int sectionsize = (buffdoc.endSection()-buffdoc.startSection());
+ switch (m_scrollpos)
+ {
+ case 1:
+ {
+ if (m_rotated)
+ {
+ if (_e->x() < m_bottommargin)
+ {
+ ln = height();
+ mp = _e->y();
+ }
+ }
+ else
+ {
+ if (_e->y() > height()-m_bottommargin)
+ {
+ ln = width();
+ mp = _e->x();
+ }
+ }
+ }
+ break;
+ case 2:
+ {
+ if (m_rotated)
+ {
+ if (_e->y() > height() - m_right_border)
+ {
+ ln = width();
+ mp = width()-_e->x();
+ }
+ }
+ else
+ {
+ if (_e->x() > width() - m_right_border)
+ {
+ ln = height();
+ mp = _e->y();
+ }
+ }
+ }
+ break;
+ case 3:
+ {
+ if (m_rotated)
+ {
+ if (_e->y() < m_left_border)
+ {
+ ln = width();
+ mp = width()-_e->x();
+ }
+ }
+ else
+ {
+ if (_e->x() < m_left_border)
+ {
+ ln = height();
+ mp = _e->y();
+ }
+ }
+ }
+ break;
+ case 0:
+ default:
+ ln = -1;
+ break;
+ }
+ if (ln >= 0)
+ {
+ int dp = (sectionsize*mp+ln/2)/ln + buffdoc.startSection();
+ int winsize = locnarray[numlines]-locnarray[0];
+ int slidersize = 10*(sectionsize+ln/2)/ln;
+ if (slidersize > winsize)
+ {
+ int mid = (locnarray[0] + locnarray[numlines])/2;
+ slidersize /= 2;
+ if (dp < mid-slidersize)
+ {
+ dopageup();
+ }
+ else if (dp > mid+slidersize)
+ {
+ dopagedn();
+ }
+ //if (mid-slidersize < dp && dp < mid+slidersize)
+ else
+ {
+ m_drageligible = true;
+ }
+ }
+ else
+ {
+ if (dp < locnarray[0])
+ {
+ dopageup();
+ }
+ else if (dp > locnarray[numlines])
+ {
+ dopagedn();
+ }
+ //if (locnarray[0] < dp && dp < locnarray[numlines])
+ else
+ {
+ m_drageligible = true;
+ }
+ }
+ qDebug("Drag eligible:%s", (m_drageligible) ? "true" : "false");
+ }
+ else
+ {
+ if (m_scrollpos == 1)
+ {
+ if (x < m_left_border)
+ {
+ lineUp();
+ }
+ if (y > ht - m_bottommargin)
+ {
+ lineDown();
+ }
+ }
+ else if (m_scrollpos != 0)
+ {
+ if (y < m_topmargin)
+ {
+ lineUp();
+ }
+ if (y > ht - m_bottommargin)
+ {
+ lineDown();
+ }
+ }
+ }
+ }
+}
void QTReader::processmousepositionevent( QMouseEvent* _e )
{
int x, y, ht, wh;
@@ -294,9 +439,9 @@ void QTReader::goForward()
}
}
}
-linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*& img)
+linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*& img, size_t& tabtgt)
{
int ht;
if (m_scrolldy == m_topmargin)
{
@@ -339,9 +484,9 @@ linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t
x = x - t->offset(width(), m_left_border, m_right_border, availht);
for (i = t->length(); i > 0 && t->width(availht, i, true, w, m_left_border, m_right_border) > x; i--);
offset = i;
}
- return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img);
+ return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img, tabtgt);
}
void QTReader::suspend()
{
@@ -353,17 +498,48 @@ void QTReader::suspend()
#endif
*/
}
+void QTReader::setDoubleBuffer(bool _b)
+{
+ m_doubleBuffered = _b;
+ if (_b || m_rotated)
+ {
+ if (dbuff == NULL)
+ {
+ dbuff = new QPixmap();
+ dbp = new QPainter();
+ }
+ if (m_rotated)
+ {
+ dbuff->resize(height(), width());
+ }
+ else
+ {
+ dbuff->resize(width(), height());
+ }
+ m_outofdate = true;
+ }
+ else
+ {
+ if (dbuff != NULL)
+ {
+ delete dbuff;
+ delete dbp;
+ }
+ dbuff = NULL;
+ dbp = NULL;
+ }
+}
+
void QTReader::setTwoTouch(bool _b)
{
setBackgroundColor( m_bg );
m_twotouch = m_touchone = _b;
}
void QTReader::setContinuous(bool _b)
{
- buffdoc.unsuspend();
buffdoc.setContinuous(m_continuousDocument = _b);
}
void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouseEvent* _e, int lineno)
@@ -454,9 +630,9 @@ void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouse
}
}
if (!wrd.isEmpty())
{
- qDebug("Selecteed:%s", (const char*)wrd);
+ qDebug("Selected:%s", (const char*)wrd);
if (m_twotouch)
{
emit OnWordSelected(wrd, wrdstart, wrdend, wrd);
}
@@ -467,11 +643,124 @@ void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouse
}
}
}
+#ifdef USETIMER
+void QTReader::actionDrag()
+{
+ if (m_drageligible)
+ {
+ int fivepages = 5*((2*width()+m_textsize/2)/m_textsize)*((height()+m_textsize/2)/m_textsize);
+ if (m_dragtarget > fivepages && locnarray[numlines] < m_dragtarget - fivepages)
+ {
+ int tgt = m_dragtarget - fivepages/2;
+ //qDebug("Jumping to %u (%u)", tgt, fivepages);
+ if (tgt < buffdoc.startSection())
+ {
+ tgt = buffdoc.startSection();
+ }
+ locate(tgt);
+ drawFonts();
+ }
+ else if (locnarray[0] > m_dragtarget+fivepages)
+ {
+ int tgt = m_dragtarget + fivepages/2;
+ //qDebug("Jumping to %u (%u)", tgt, fivepages);
+ if (tgt > buffdoc.endSection())
+ {
+ dopageup();
+ }
+ else
+ {
+ locate(tgt);
+ drawFonts();
+ }
+ }
+ else if (locnarray[numlines] <= m_dragtarget)
+ {
+ dopagedn();
+ }
+ else if (locnarray[0] > m_dragtarget)
+ {
+ dopageup();
+ }
+ }
+ else
+ {
+ m_dragtimer->stop();
+ }
+}
+#endif
+
+void QTReader::mouseMoveEvent( QMouseEvent* _e )
+{
+ if (m_drageligible)
+ {
+ int ht;
+ int mp;
+ int sectionsize = (buffdoc.endSection()-buffdoc.startSection());
+ //qDebug("Mouse moved to (%u, %u)", _e->x(), _e->y());
+ switch (m_scrollpos)
+ {
+ case 1:
+ {
+ if (m_rotated)
+ {
+ ht = height();
+ mp = _e->y();
+ }
+ else
+ {
+ ht = width();
+ mp = _e->x();
+ }
+ }
+ break;
+ case 2:
+ case 3:
+ {
+ if (m_rotated)
+ {
+ ht = width();
+ mp = width()-_e->x();
+ }
+ else
+ {
+ ht = height();
+ mp = _e->y();
+ }
+ }
+ break;
+ case 0:
+ default:
+ ht = -1;
+ break;
+ }
+ if (ht >= 0)
+ {
+#ifdef USETIMER
+ m_dragtarget = (sectionsize*mp+ht/2)/ht + buffdoc.startSection();
+ if (!m_dragtimer->isActive())
+ {
+ m_dragtimer->start(0, false);
+ }
+#else
+ int dp = (sectionsize*mp+ht/2)/ht + buffdoc.startSection();
+ locate(dp);
+#endif
+ }
+ }
+}
+
void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
- buffdoc.unsuspend();
+ qDebug("Mouse released at (%u, %u)", _e->x(), _e->y());
+ if (m_drageligible)
+ {
+ m_drageligible = false;
+ }
+ else
+ {
int x, y, ht, wh;
if (m_rotated)
{
x = _e->y();
@@ -490,8 +779,9 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
if (mouseUpOn)
{
// qDebug("MouseRelease");
+ /*
switch(m_scrollpos)
{
case 1: // Bottom
if (y > ht - 5)
@@ -517,8 +807,9 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
case 0:
default:
break;
}
+ */
if (textarray[0] != NULL)
{
QString line;
// int lineno = _e->y()/m_linespacing;
@@ -529,18 +820,32 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
ht += textarray[++lineno]->lineSpacing();
}
*/
- size_t startpos, startoffset, tgt, tgtoffset, pictgt;
+ size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt;
QImage* img;
if (m_currentlinkstyle != NULL)
{
textarray[m_currentlink]->invertLink(m_currentlinkoffset);
m_currentlinkstyle = NULL;
m_currentlink = -1;
m_currentlinkoffset = -1;
}
- linkType glt = getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img);
+ linkType glt = getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt);
+ if (bNoInlineTables && ((glt & eTable) != 0))
+ {
+ size_t currentpos = locate();
+ QString tabtext = buffdoc.getTableAsHtml(tabtgt);
+ qDebug("TABLE:%u:%u:%s", currentpos, tabtgt, (const char*)tabtext);
+ QFont f(m_fontname, m_fontControl.currentsize());
+#ifdef USEQPE
+ CTableDialog td(f, tabtext, true, this);
+#else
+ CTableDialog td(f, tabtext, false, this);
+#endif
+ td.exec();
+ jumpto(currentpos);
+ }
if ((glt & eLink) != 0)
{
if ((glt & ePicture) != 0)
{
@@ -578,25 +883,31 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
#endif
ResetScroll();
if (!href.isEmpty())
{
- if (!buffdoc.getFile(href))
+ if (!buffdoc.getFile(href, nm))
{
emit NewFileRequest(href);
}
else
{
+ qDebug("BEFORE:%u", pagelocate());
+ buffdoc.resetPos();
ResetScroll();
fillbuffer();
+ qDebug("AFTER:%u", pagelocate());
+ m_outofdate = true;
update();
}
}
if (!nm.isEmpty())
{
qDebug("QTReader:Finding %s", (const char*)nm);
if (buffdoc.findanchor(nm))
{
+ buffdoc.resetPos();
fillbuffer();
+ m_outofdate = true;
update();
}
}
//fillbuffer();
@@ -611,8 +922,9 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
buffdoc.saveposn(m_lastfile, saveposn);
ResetScroll();
fillbuffer();
+ m_outofdate = true;
update();
}
else
{
@@ -632,9 +944,8 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
emit OnURLSelected(href, tgt);
}
}
- locate(pagelocate());
}
return;
}
else if ((glt & ePicture) != 0)
@@ -647,9 +958,9 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
delete pm;
}
else
{
- locate(pagelocate());
+ update();
}
return;
}
else if (img != NULL)
@@ -668,20 +979,28 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
mouseUpOn = true;
}
}
}
+}
void QTReader::focusInEvent(QFocusEvent* e)
{
- if (m_autoScroll) timer->start(real_delay(), false);
+ if (m_autoScroll && (m_scrolltype != 4)) timer->start(real_delay(), false);
update();
}
void QTReader::focusOutEvent(QFocusEvent* e)
{
if (m_autoScroll)
{
+ if (m_scrolltype != 4)
+ {
timer->stop();
+ }
+ else
+ {
+ m_autoScroll = false;
+ }
// m_scrolldy1 = m_scrolldy2 = 0;
}
}
@@ -716,9 +1035,8 @@ void QTReader::goUp()
}
void QTReader::NavUp()
{
- buffdoc.unsuspend();
if (buffdoc.hasnavigation())
{
/*
size_t target = pagelocate();
@@ -736,9 +1054,8 @@ void QTReader::NavUp()
}
void QTReader::NavDown()
{
- buffdoc.unsuspend();
if (buffdoc.hasnavigation())
{
/*
size_t target = pagelocate();
@@ -761,10 +1078,9 @@ void QTReader::zoomin()
{
bool sc = m_autoScroll;
setautoscroll(false);
setfont();
- locate(pagelocate());
- repaint();
+ refresh();
setautoscroll(sc);
}
}
@@ -774,10 +1090,9 @@ void QTReader::zoomout()
{
bool sc = m_autoScroll;
setautoscroll(false);
setfont();
- locate(pagelocate());
- repaint();
+ refresh();
setautoscroll(sc);
}
}
@@ -808,9 +1123,8 @@ void QTReader::increaseScroll()
}
void QTReader::keyPressEvent(QKeyEvent* e)
{
- buffdoc.unsuspend();
//((QTReaderApp*)parent()->parent())->handlekey(e);
emit HandleKeyRequest(e);
// e->ignore();
@@ -905,8 +1219,9 @@ void QTReader::CalculateScrollParameters()
}
void QTReader::setautoscroll(bool _sc)
{
+ m_outofdate = true;
if (_sc == m_autoScroll) return;
if (m_autoScroll)
{
m_autoScroll = false;
@@ -926,8 +1241,11 @@ void QTReader::setautoscroll(bool _sc)
else
{
CDrawBuffer* reusebuffer = textarray[numlines];
if (reusebuffer == NULL || reusebuffer->eof()) return;
+#ifndef __STATIC
+ if ((m_scrolltype == 4) && !checkoutput()) return;
+#endif
m_autoScroll = true;
CalculateScrollParameters();
#ifdef _SCROLLPIPE
@@ -946,9 +1264,8 @@ void QTReader::setautoscroll(bool _sc)
}
bool QTReader::getline(CDrawBuffer *buff)
{
- buffdoc.unsuspend();
bool bRet;
int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin;
if (m_bMonoSpaced)
{
@@ -1064,26 +1381,8 @@ void QTReader::doinplacescroll()
}
mylastpos = locate();
if (!ch)
{
- /*
- if (m_rotated)
- {
- blitRot2(0,0,height(),width()-m_scrolldy,NULL);
-// blitRot2(0,0,0,height(),width()-m_scrolldy,NULL);
- }
- else
- {
- if (m_bgpm.isNull())
- {
- p.fillRect(0,m_scrolldy,width(),height()-m_scrolldy,m_bg);
- }
- else
- {
- bitBlt(this, 0, m_scrolldy, dbuff, 0, m_scrolldy, width(), height()-m_scrolldy);
- }
- }
- */
m_scrolldy = m_topmargin;
m_autoScroll = false;
#ifdef _SCROLLPIPE
for (int i = 0; i < numlines; i++)
@@ -1098,9 +1397,8 @@ void QTReader::doinplacescroll()
}
}
}
#endif
- //((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll);
emit SetScrollState(m_autoScroll);
#ifdef USEQPE
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
#endif
@@ -1493,12 +1791,23 @@ void QTReader::redrawScroll(QPainter* p)
}
void QTReader::autoscroll()
{
- drawBackground();
+ if (m_scrolltype == 4)
+ {
+ readAloud();
+ }
+ else
+ {
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
dbp->end();
+ }
timer->start(real_delay(), false);
}
+}
void QTReader::setfont()
{
// m_fontControl.Change
@@ -1556,41 +1865,51 @@ void QTReader::DrawStraight(QPainter* p, int w, int h)
void QTReader::redrawall()
{
if (m_rotated)
{
-#ifdef DOUBLEBUFFER
- drawBackground();
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
DrawStraight(dbp, height(), width());
dbp->end();
QWMatrix m;
m.rotate(90);
QPixmap rp = dbuff->xForm(m);
bitBlt(this, 0,0,&rp,0,0,-1,-1);
-#else
+ }
+ else
+ {
+ qDebug("This shouldn't happen but it doesn't matter if it does (rotated == double buffered)");
QPixmap dbuff(height(), width());
QPainter dbp(&dbuff);
- // dbp.setBackgroundMode(OpaqueMode);
- dbp.fillRect(dbuff.rect(), m_bg);
+ drawBackground(&dbp);
DrawStraight(&dbp, height(), width());
QWMatrix m;
m.rotate(90);
QPixmap rp = dbuff.xForm(m);
bitBlt(this, 0,0,&rp,0,0,-1,-1);
-#endif
+ }
}
else
{
-#ifdef DOUBLEBUFFER
- drawBackground();
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
DrawStraight(dbp, width(), height());
dbp->end();
bitBlt(this, 0,0,dbuff,0,0,-1,-1);
-#else
- DrawStraight(p, width(), height());
-#endif
+ }
+ else
+ {
+ QPainter p(this);
+ drawBackground(&p);
+ DrawStraight(&p, width(), height());
+ }
}
}
void QTReader::drawFonts()
@@ -1599,76 +1918,58 @@ void QTReader::drawFonts()
{
int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0);
if (hmargin < m_bottommargin) hmargin = m_bottommargin;
// qDebug("How refreshing...");
- if (buffdoc.empty()) return;
- setfont();
- // if (!m_autoScroll) m_scrolldy1 = 0;
-#ifdef ROTATION_ENABLED
- if (m_lastwidth != ((m_rotated) ? height() : width()))
+ if (buffdoc.empty())
{
- m_scrolldy = m_topmargin;
- // qDebug("Not Optimised %d", m_lastwidth);
- m_lastwidth = ((m_rotated) ? height() : width());
- m_lastheight = ((m_rotated) ? width() : height());
- buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border));
- locate(pagelocate());
- // qDebug("Not Optimised %d", m_lastwidth);
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
+ dbp->end();
}
else
{
- int newht = ((m_rotated) ? width() : height());
- if (m_lastheight > newht)
- {
- // qDebug("Optimised < %d %d %d", numlines, m_lastheight, newht);
- m_scrolldy = m_topmargin;
- int ypos = m_scrolldy1+m_topmargin;
- for (int i = 0; i < numlines; i++)
- {
- if ((ypos += textarray[i]->lineSpacing()) > newht - hmargin)
- {
- numlines = i;
- jumpto(mylastpos = locnarray[i+1]);
- break;
- }
+ QPainter p(this);
+ drawBackground(&p);
}
- // qDebug("Optimised < %d", numlines);
- m_lastheight = newht;
+ return;
}
- else if (m_lastheight < newht)
+ setfont();
+ // if (!m_autoScroll) m_scrolldy1 = 0;
+ if (dbuff != NULL && (dbuff->width() != width() || dbuff->height() != height()))
{
- m_scrolldy = m_topmargin;
- // qDebug("Optimised > %d", numlines);
- int ypos = m_scrolldy1+m_topmargin;
- for (int i = 0; i <= numlines; i++)
+ qDebug("Oh no! A resize event was missed...");
+ if (m_rotated)
{
- ypos += textarray[i]->lineSpacing();
- }
- fillbuffer(numlines+1, ypos, newht);
- // qDebug("Optimised > %d", numlines);
+ dbuff->resize(height(), width());
}
- if (numlines > 0)
+ else
{
- redrawall();
+ dbuff->resize(width(), height());
}
+ m_lastwidth = 0;
}
-#else
- if (m_lastwidth != width())
+ if (m_lastwidth != ((m_rotated) ? height() : width()))
{
+ m_scrolldy = m_topmargin;
// qDebug("Not Optimised %d", m_lastwidth);
- m_lastwidth = width();
- m_lastheight = height();
+ m_lastwidth = ((m_rotated) ? height() : width());
+ m_lastheight = ((m_rotated) ? width() : height());
buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border));
- locate(pagelocate());
+ buffdoc.locate(pagelocate());
+ fillbuffer();
+ redrawall();
// qDebug("Not Optimised %d", m_lastwidth);
}
else
{
- int newht = height();
+ int newht = ((m_rotated) ? width() : height());
if (m_lastheight > newht)
{
// qDebug("Optimised < %d %d %d", numlines, m_lastheight, newht);
- int ypos = m_topmargin;
+ m_scrolldy = m_topmargin;
+ int ypos = m_scrolldy1+m_topmargin;
for (int i = 0; i < numlines; i++)
{
if ((ypos += textarray[i]->lineSpacing()) > newht - hmargin)
{
@@ -1681,10 +1982,11 @@ void QTReader::drawFonts()
m_lastheight = newht;
}
else if (m_lastheight < newht)
{
+ m_scrolldy = m_topmargin;
// qDebug("Optimised > %d", numlines);
- int ypos = m_topmargin;
+ int ypos = m_scrolldy1+m_topmargin;
for (int i = 0; i <= numlines; i++)
{
ypos += textarray[i]->lineSpacing();
}
@@ -1692,23 +1994,11 @@ void QTReader::drawFonts()
// qDebug("Optimised > %d", numlines);
}
if (numlines > 0)
{
- int ypos = textarray[0]->ascent()+m_topmargin;
- textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin);
-// int last = (m_showlast) ? numlines : numlines-1;
-// for (int i = 1; i <= last; i++)
- for (int i = 1; i < numlines; i++)
- {
-// ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2;
- ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+
- (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2;
- textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin);
- }
-// mylastpos = locate();
+ redrawall();
}
}
-#endif
emitRedraw();
}
/*
else
@@ -1927,15 +2217,18 @@ bool QTReader::ChangeFont(int tgt)
}
void QTReader::init()
{
- buffdoc.unsuspend();
setBackgroundColor( m_bg );
buffdoc.setfilter(getfilter());
ChangeFont(m_textsize);
setFocusPolicy(QWidget::StrongFocus);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(doscroll()));
+#ifdef USETIMER
+ m_dragtimer = new QTimer(this);
+ connect(m_dragtimer, SIGNAL(timeout()), this, SLOT(actionDrag()));
+#endif
// QMessageBox::information(this, "init", m_lastfile, 1);
setfont();
}
@@ -1943,12 +2236,17 @@ void QTReader::init()
// Clean up
//
QTReader::~QTReader()
{
-#ifdef DOUBLEBUFFER
+ if (m_output != NULL)
+ {
+ delete m_output;
+ }
+ if (dbuff != NULL)
+ {
delete dbuff;
delete dbp;
-#endif
+ }
#ifdef USEQPE
if (m_autoScroll)
{
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
@@ -1981,12 +2279,50 @@ void QTReader::printIt()
//
// Called when the widget needs to be updated.
//
-void QTReader::paintEvent( QPaintEvent * )
+void QTReader::paintEvent( QPaintEvent * p )
+{
+ if ((dbuff != NULL) && !m_outofdate)
+ {
+ if (m_rotated)
+ {
+ if ((p->rect().width() != width()) || (p->rect().height() != height()))
+ {
+ qDebug("Partial paint");
+ QRect r;
+ r.setTop(width()-p->rect().right()-1);
+ r.setLeft(p->rect().top());
+ r.setHeight(p->rect().width());
+ r.setWidth(p->rect().height());
+ QPixmap p1(r.width(), r.height());
+ bitBlt(&p1, QPoint(0, 0), dbuff, r);
+ QWMatrix m;
+ m.rotate(90);
+ QPixmap p2 = p1.xForm(m);
+ bitBlt(this, p->rect().left(), p->rect().top(), &p2, 0, 0, -1, -1);
+ }
+ else
+ {
+ qDebug("Full paint");
+ QWMatrix m;
+ m.rotate(90);
+ QPixmap rp = dbuff->xForm(m);
+ bitBlt(this, 0,0,&rp,0,0,-1,-1);
+ }
+ }
+ else
+ {
+ //bitBlt(this, 0,0,dbuff,0,0,-1,-1);
+ bitBlt(this,p->rect().topLeft(),dbuff,p->rect());
+ }
+ }
+ else
{
drawFonts();
}
+ m_outofdate = false;
+}
//
// Called when the widget has been resized.
// Moves the button group to the upper right corner
@@ -2015,22 +2351,32 @@ int main( int argc, tchar **argv )
}
*/
+bool QTReader::locate(unsigned long n)
+{
+ m_outofdate = true;
+ m_lastwidth = 0;
+ locnarray[0] = n;
+ ResetScroll();
+ update();
+ return true;
+}
+/*
bool QTReader::locate(unsigned long n) {
//printf("Locate\n");
- buffdoc.unsuspend();
buffdoc.locate(n);
// // qDebug("&buffdoc.located");
ResetScroll();
fillbuffer();
+ m_outofdate = true;
// // qDebug("&Buffer filled");
update();
// // qDebug("&Located");
emitRedraw();
return true;
}
-
+*/
unsigned int QTReader::screenlines()
{
// int linespacing = (tight) ? m_ascent : m_ascent+m_descent;
// return (height()-m_descent)/(m_linespacing);
@@ -2038,9 +2384,8 @@ unsigned int QTReader::screenlines()
};
bool QTReader::fillbuffer(int reuse, int ht, int newht)
{
- buffdoc.unsuspend();
int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0);
if (hmargin < m_bottommargin) hmargin = m_bottommargin;
if (ht < 0) ht = m_topmargin;
if (buffdoc.empty()) return false;
@@ -2062,15 +2407,24 @@ bool QTReader::fillbuffer(int reuse, int ht, int newht)
}
locnarray[numlines] = locate();
int ch = getline(textarray[numlines]);
ypos += textarray[numlines]->lineSpacing();
+ /*
+ QString tmp = toQString(textarray[numlines]->data());
+ printf("[%u, %u, %u](%s):%s\n", lastypos, m_lastheight-hmargin, ypos,
+ ((textarray[numlines]->showPartial()) ? "TRUE" : "FALSE"),
+ (const char*)tmp);
+ */
numlines++;
if (!ch)
{
if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/)
{
qDebug("FALSE");
+ if (oldpagepos < buffdoc.endSection())
locate(oldpagepos);
+ else
+ dopageup(buffdoc.endSection());
return false;
}
else
{
@@ -2100,9 +2454,8 @@ bool QTReader::fillbuffer(int reuse, int ht, int newht)
void QTReader::dopagedn()
{
// qDebug("HEIGHT(2):%d", m_lastheight);
- buffdoc.unsuspend();
ResetScroll();
int skip = 0, ypos = m_topmargin;
if (locate() != mylastpos)
{
@@ -2149,22 +2502,23 @@ bool QTReader::synch(size_t start, size_t end)
while (start++ < end)
{
tchar ch = getch();
if (ch == 10) return true;
- if (ch == UEOF) return false;
- if (ch == 6) return false;
+ if ((ch == UEOF) || (ch == 6))
+ {
+ return false;
+ }
}
return false;
}
void QTReader::dopageup(unsigned int target)
{
- buffdoc.unsuspend();
ResetScroll();
CBufferFace<CDrawBuffer*> buff;
CBufferFace<size_t> loc;
-
size_t delta, guess = 2*(locate()-pagelocate()), lastdelta = 0;
+ qDebug("dopageup:: locate():%u pagelocate():%u guess:%u", locate(), pagelocate(), guess);
bool ch = true;
int nbfl, ypos = m_topmargin;
if (guess < 128) guess = 128;
while (1)
@@ -2179,8 +2533,9 @@ void QTReader::dopageup(unsigned int target)
}
else if (!m_continuousDocument && (target - guess < buffdoc.startSection()))
{
delta = 0; // 0 is a flag to say don't guess any more
+ qDebug("Jumping to startsection:%d", buffdoc.startSection());
jumpto(buffdoc.startSection());
}
else
{
@@ -2292,10 +2647,11 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
// QMessageBox::information(this, "load_file", newfile, 1);
int prog = 0;
bool bRC = false;
unsigned int lcn = _lcn;
+ bDoUpdates = false;
ResetScroll();
- if (m_lastfile == newfile)
+ if (m_lastfile == newfile && lcn == 0)
{
lcn = m_lastposn;
}
// QMessageBox::information(0, "Opening...", newfile);
@@ -2315,13 +2671,13 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border));
bRC = true;
buffdoc.setContinuous(m_continuousDocument);
qDebug("buffdoc.openfile done");
- locate(lcn);
- qDebug("buffdoc.locate done");
}
setfilter(getfilter());
qDebug("Updated");
+ bDoUpdates = true;
+ locate(lcn);
return bRC;
}
void QTReader::lineDown()
@@ -2357,8 +2713,9 @@ void QTReader::lineDown()
textarray[numlines] = new CDrawBuffer(&m_fontControl);
}
getline(textarray[numlines]);
mylastpos = locate();
+ m_outofdate = true;
update();
}
/*
void QTReader::lineUp()
@@ -2571,19 +2928,24 @@ MarkupType QTReader::PreferredMarkup()
}
}
return m;
}
-#ifdef DOUBLEBUFFER
+
void QTReader::resizeEvent( QResizeEvent * p )
{
+ qDebug("Resizing");
+ m_outofdate = true;
+ if (dbuff != NULL)
+ {
if (m_rotated)
{
dbuff->resize(p->size().height(),p->size().width());
}
else
{
dbuff->resize(p->size());
}
+ }
m_bgIsScaled = false;
if (m_bgtype == bgStretched)
{
emit RefreshBitmap();
@@ -2604,31 +2966,25 @@ void QTReader::resizeEvent( QResizeEvent * p )
m_topmargin = (h*m_abstopmargin+500)/1000;
m_bottommargin = (h*m_absbottommargin+500)/1000;
m_left_border = (w*m_absleft_border+500)/1000;
m_right_border = (w*m_absright_border+500)/1000;
-
- qDebug("Top margin:%u", m_topmargin );
- qDebug("Bottom margin:%u", m_bottommargin );
- qDebug("Left margin:%u", m_left_border );
- qDebug("Right margin:%u", m_right_border );
+ }
+ if (dbuff != NULL && buffdoc.empty())
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
+ dbp->end();
}
}
-#endif
void QTReader::setrotated(bool sfs)
{
+ qDebug("Rotating");
m_rotated = sfs;
-#ifdef DOUBLEBUFFER
- if (m_rotated)
- {
- dbuff->resize(height(), width());
- }
- else
- {
- dbuff->resize(width(), height());
- }
+ setDoubleBuffer(m_doubleBuffered);
m_bgIsScaled = false;
-#endif
+ m_outofdate = true;
+ /*
int h, w;
if (m_rotated)
{
h = width();
@@ -2647,57 +3003,83 @@ void QTReader::setrotated(bool sfs)
qDebug("Top margin:%u", m_topmargin );
qDebug("Bottom margin:%u", m_bottommargin );
qDebug("Left margin:%u", m_left_border );
qDebug("Right margin:%u", m_right_border );
+ */
}
-void QTReader::drawBackground()
+void QTReader::drawBackground(QPainter *p)
{
- dbp->begin(dbuff);
- // dbp->setBackgroundMode(OpaqueMode);
- dbp->setBackgroundColor(m_bg);
- dbp->eraseRect(dbuff->rect());
+ // p->setBackgroundMode(OpaqueMode);
+ p->setBackgroundColor(m_bg);
+ if (dbuff != NULL)
+ {
+ p->eraseRect(dbuff->rect());
+ }
+ else
+ {
+ if (m_rotated)
+ {
+ p->eraseRect(0,0,height(),width());
+ }
+ else
+ {
+ p->eraseRect(rect());
+ }
+ }
if (!m_bgpm.isNull())
{
- // dbp->setBackgroundMode(TransparentMode);
+ // p->setBackgroundMode(TransparentMode);
switch (m_bgtype)
{
case bgCentred:
{
+ if (dbuff == NULL)
+ {
+ p->drawPixmap(width(),height(),m_bgpm);
+ }
+ else
+ {
int w = (dbuff->rect().width()-m_bgpm.width())/2;
int h = (dbuff->rect().height()-m_bgpm.height())/2;
- dbp->drawPixmap(w,h,m_bgpm);
+ p->drawPixmap(w,h,m_bgpm);
+ }
}
break;
case bgTiled:
{
- dbp->drawTiledPixmap(0,0,dbuff->rect().width(),dbuff->rect().height(),m_bgpm);
- /*
- for (int h = 0; h < dbuff->rect().height(); h += m_bgpm.height())
- {
- for (int w = 0; w < dbuff->rect().width(); w += m_bgpm.width())
+ if (dbuff == NULL)
{
- dbp->drawPixmap(w,h,m_bgpm);
+ p->drawTiledPixmap(0,0,width(),height(),m_bgpm);
}
+ else
+ {
+ p->drawTiledPixmap(0,0,dbuff->rect().width(),dbuff->rect().height(),m_bgpm);
}
- */
}
break;
case bgStretched:
{
if (!m_bgIsScaled)
{
m_bgIsScaled = true;
QImage im = m_bgpm.convertToImage();
+ if (dbuff == NULL)
+ {
+ m_bgpm.convertFromImage(im.smoothScale(width(),height()));
+ }
+ else
+ {
m_bgpm.convertFromImage(im.smoothScale(dbuff->rect().width(), dbuff->rect().height()));
}
- dbp->drawPixmap(0,0,m_bgpm);
+ }
+ p->drawPixmap(0,0,m_bgpm);
}
break;
default:
qDebug("Unknown background type");
}
- // dbp->setBackgroundMode(OpaqueMode);
+ // p->setBackgroundMode(OpaqueMode);
}
}
void QTReader::blitRot(int dx, int dy, int sw, int sh, CDrawBuffer* txt)
@@ -2758,9 +3140,14 @@ void QTReader::blitRot(int dx, int dy, int sw, int sh, CDrawBuffer* txt)
}
QString QTReader::about()
{
- return QString("QTReader widget (c) Tim Wentford\n")+buffdoc.about() + "\nMini-scrollbar by Markus Gritsch\nNavigation History fixes by Frantisek Dufka";
+ QString ab = QString("QTReader widget (c) Tim Wentford\n")+buffdoc.about() + "\nMini-scrollbar by Markus Gritsch\nNavigation History fixes by Frantisek Dufka";
+ if (m_output != NULL)
+ {
+ ab += QString("\n") + m_output->about();
+ }
+ return ab;
}
void QTReader::getNextLink()
{
@@ -2896,25 +3283,28 @@ void QTReader::gotoLink()
#endif
ResetScroll();
if (!href.isEmpty())
{
- if (!buffdoc.getFile(href))
+ if (!buffdoc.getFile(href, nm))
{
emit NewFileRequest(href);
}
else
{
ResetScroll();
fillbuffer();
+ m_outofdate = true;
update();
}
}
if (!nm.isEmpty())
{
qDebug("QTReader:Finding %s", (const char*)nm);
if (buffdoc.findanchor(nm))
{
+ buffdoc.resetPos();
fillbuffer();
+ m_outofdate = true;
update();
}
}
//fillbuffer();
@@ -2929,8 +3319,9 @@ void QTReader::gotoLink()
{
buffdoc.saveposn(m_lastfile, saveposn);
ResetScroll();
fillbuffer();
+ m_outofdate = true;
update();
}
else
{
@@ -2948,19 +3339,20 @@ void QTReader::gotoLink()
// QString anchortext = textarray[lineno]->getanchortext(startoffset);
if (!href.isEmpty())
{
emit OnURLSelected(href, tgt);
+ refresh();
}
}
- locate(pagelocate());
}
m_currentlinkstyle = NULL;
m_currentlink = -1;
m_currentlinkoffset = -1;
}
void QTReader::refresh(bool full)
{
+ qDebug("Refreshing");
int h, w;
if (m_rotated)
{
h = width();
@@ -2980,6 +3372,121 @@ void QTReader::refresh(bool full)
qDebug("Bottom margin:%u", m_bottommargin );
qDebug("Left margin:%u", m_left_border );
qDebug("Right margin:%u", m_right_border );
if (full && m_highlightfilter) m_highlightfilter->refresh(pagelocate());
+ m_outofdate = true;
locate(pagelocate());
}
+
+#include "striphtml.h"
+
+CFilterChain* QTReader::getfilter()
+{
+ CFilterChain * filt = new CFilterChain(getencoding());
+ if (bstripcr) filt->addfilter(new stripcr);
+
+ if (btextfmt || (bautofmt && (PreferredMarkup() == cTEXT))) filt->addfilter(new textfmt);
+ if (bpeanut || (bautofmt && (PreferredMarkup() == cPML))) filt->addfilter(new PeanutFormatter);
+ // if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile));
+
+#ifdef __STATIC
+ if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile));
+ if (bautofmt && (PreferredMarkup() == cCHM))
+ {
+ striphtml* f = new striphtml(m_lastfile);
+ f->setchm(true);
+ filt->addfilter(f);
+ }
+#else
+ if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new ExternFilter("HTMLfilter", m_lastfile));
+ if (bautofmt && (PreferredMarkup() == cCHM))
+ {
+ ExternFilter* f = new ExternFilter("HTMLfilter",m_lastfile);
+ ((striphtml*)f->filter())->setchm(true);
+ filt->addfilter(f);
+ }
+#endif
+ m_highlightfilter = new HighlightFilter(this);
+ filt->addfilter(m_highlightfilter);
+
+ if (bdehyphen) filt->addfilter(new dehyphen);
+ if (bunindent) filt->addfilter(new unindent);
+ if (brepara) filt->addfilter(new repara(m_reparastring));
+ if (bonespace) filt->addfilter(new OnePara);
+ if (bindenter) filt->addfilter(new indenter(bindenter));
+ if (bdblspce) filt->addfilter(new dblspce);
+ if (bdepluck) filt->addfilter(new DePluck(pluckernextpart));
+ if (bdejpluck) filt->addfilter(new DePluck(jplucknextpart));
+ if (brepalm) filt->addfilter(new repalm);
+ if (bunderlineLink) filt->addfilter(new underlineLink);
+ if (bkern) filt->addfilter(new kern);
+ if (bremap) filt->addfilter(new remap);
+ if (bmakebold) filt->addfilter(new embolden);
+ if (bfulljust) filt->addfilter(new FullJust);
+ int r,g,b;
+ m_default_bg.rgb(&r, &g, &b);
+ if (r != 255 || g != 255 || b != 255)
+ filt->addfilter(new setbg(r,g,b));
+ m_default_fg.rgb(&r, &g, &b);
+ if (r != 0 || g != 0 || b != 0)
+ filt->addfilter(new setfg(r,g,b));
+ // if (bNegative) filt->addfilter(new makeNegative);
+ if (bInverse) filt->addfilter(new makeInverse);
+ if (bNoInlineTables) filt->addfilter(new tableLink);
+ return filt;
+}
+
+void QTReader::readAloud()
+{
+#ifdef __STATIC
+ return;
+#else
+ CBuffer para;
+ jumpto(pagelocate());
+ while (m_autoScroll && (buffdoc.getpara(para) != -1))
+ {
+ if (para.length() > 0)
+ {
+ unsigned long lastpos = buffdoc.explocate();
+ while (lastpos > mylastpos)
+ {
+ dopagedn();
+ qApp->processEvents();
+ }
+ jumpto(lastpos);
+ QString txt = toQString(para.data());
+
+ doOutput(txt);
+ }
+ qApp->processEvents();
+ }
+#endif
+}
+
+bool QTReader::doOutput(const QString& wrd)
+{
+ if (m_output != NULL)
+ {
+ m_output->output(wrd);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool QTReader::checkoutput()
+{
+ if (m_output == NULL)
+ {
+ m_output = new outputcodec(m_outputName);
+ if (reinterpret_cast<outputcodec*>(m_output)->getStatus() != 0)
+ {
+ delete m_output;
+ m_output = NULL;
+ QMessageBox::warning(this, PROGNAME, QString("Couldn't find output codec\n")+m_outputName);
+ return false;
+ }
+ }
+ return true;
+}