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) (ignore whitespace changes)
-rw-r--r--noncore/apps/opie-reader/QTReader.cpp540
1 files changed, 379 insertions, 161 deletions
diff --git a/noncore/apps/opie-reader/QTReader.cpp b/noncore/apps/opie-reader/QTReader.cpp
index 7cf08e5..3995ee7 100644
--- a/noncore/apps/opie-reader/QTReader.cpp
+++ b/noncore/apps/opie-reader/QTReader.cpp
@@ -24,2 +24,3 @@
#include <qpe/qcopenvelope_qws.h>
+#include "StateData.h"
@@ -37,3 +38,3 @@ const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 };
-QTReader::QTReader( QWidget *parent, const char *name, WFlags f) :
+QTReader::QTReader( QWidget *parent=0, const char *name=0, WFlags f = 0) :
QWidget(parent, name, f),
@@ -50,3 +51,5 @@ QTReader::QTReader( QWidget *parent, const char *name, WFlags f) :
m_twotouch(true),
- m_touchone(true)
+ m_touchone(true),
+ bDoUpdates(false),
+ m_navkeys(true)
{
@@ -83,2 +86,3 @@ void QTReader::mousePressEvent( QMouseEvent* _e )
{
+ buffdoc.unsuspend();
if (_e->button() == RightButton)
@@ -86,5 +90,36 @@ void QTReader::mousePressEvent( QMouseEvent* _e )
mouseUpOn = false;
- if (_e->y() > height()/2)
+ if (buffdoc.hasnavigation())
{
- goDown();
+ if (_e->y() > (2*height())/3)
+ {
+ goDown();
+ }
+ else if (_e->y() < height()/3)
+ {
+ goUp();
+ }
+ else
+ {
+ if (_e->x() < width()/3)
+ {
+ size_t target = pagelocate();
+ if (buffdoc.back(target))
+ {
+ locate(target);
+ }
+ }
+ else if (_e->x() > (2*width())/3)
+ {
+ size_t target = pagelocate();
+ if (buffdoc.forward(target))
+ {
+ locate(target);
+ }
+ }
+ else
+ {
+ buffdoc.saveposn(pagelocate());
+ locate(buffdoc.getHome());
+ }
+ }
}
@@ -92,3 +127,10 @@ void QTReader::mousePressEvent( QMouseEvent* _e )
{
- goUp();
+ if (_e->y() > height()/2)
+ {
+ goDown();
+ }
+ else
+ {
+ goUp();
+ }
}
@@ -97,3 +139,3 @@ void QTReader::mousePressEvent( QMouseEvent* _e )
-bool QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt)
+linkType QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt)
{
@@ -114,6 +156,7 @@ bool QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t
CDrawBuffer* t = textarray[lineno];
- for (i = t->length(); t->width(i) > x; i--);
+ x = x - t->offset(width());
+ for (i = t->length(); i >= 0 && t->width(i) > x; i--);
offset = i;
}
- return textarray[lineno]->isLink(offset, tgt);
+ return textarray[lineno]->getLinkType(offset, tgt);
}
@@ -126,4 +169,11 @@ void QTReader::setTwoTouch(bool _b)
+void QTReader::setContinuous(bool _b)
+{
+ buffdoc.unsuspend();
+ buffdoc.setContinuous(m_continuousDocument = _b);
+}
+
void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
+ buffdoc.unsuspend();
if (_e->button() == LeftButton)
@@ -143,14 +193,39 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
size_t startpos, startoffset, tgt;
- if (getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt))
+ switch (getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt))
{
- if (buffdoc.hyperlink(tgt))
+ case eLink:
{
- fillbuffer();
- update();
+ size_t saveposn = pagelocate();
+ if (buffdoc.hyperlink(tgt))
+ {
+ buffdoc.saveposn(saveposn);
+ fillbuffer();
+ update();
+ }
+ else
+ {
+ locate(pagelocate());
+ }
+ return;
}
- else
+ case ePicture:
{
- locate(pagelocate());
+ qDebug("Picture:%x", tgt);
+ QPixmap* pm = buffdoc.getPicture(tgt);
+ if (pm != NULL)
+ {
+ emit OnShowPicture(*pm);
+ delete pm;
+ }
+ else
+ {
+ locate(pagelocate());
+ }
+ return;
}
- return;
+ case eNone:
+ break;
+ default:
+ qDebug("Unknown linktype");
+ return;
}
@@ -214,2 +289,3 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
int first = 0;
+ int tgt = _e->x() - t->offset(width());
while (1)
@@ -218,3 +294,3 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
- if (t->width(i) > _e->x())
+ if (t->width(i) > tgt)
{
@@ -284,4 +360,73 @@ void QTReader::goUp()
+void QTReader::NavUp()
+{
+ buffdoc.unsuspend();
+ if (buffdoc.hasnavigation())
+ {
+/*
+ size_t target = pagelocate();
+ if (buffdoc.back(target))
+ {
+ locate(target);
+ }
+*/
+ locate(buffdoc.startSection());
+ }
+ else
+ {
+ goUp();
+ }
+}
+
+void QTReader::NavDown()
+{
+ buffdoc.unsuspend();
+ if (buffdoc.hasnavigation())
+ {
+/*
+ size_t target = pagelocate();
+ if (buffdoc.forward(target))
+ {
+ locate(target);
+ }
+*/
+ dopageup(buffdoc.endSection());
+ }
+ else
+ {
+ goDown();
+ }
+}
+
+void QTReader::zoomin()
+{
+ if (m_fontControl.increasesize())
+ {
+ bool sc = m_autoScroll;
+ setfont();
+ m_autoScroll = false;
+ locate(pagelocate());
+ update();
+ m_autoScroll = sc;
+ if (m_autoScroll) autoscroll();
+ }
+}
+
+void QTReader::zoomout()
+{
+ if (m_fontControl.decreasesize())
+ {
+ bool sc = m_autoScroll;
+ m_autoScroll = false;
+ setfont();
+ locate(pagelocate());
+ update();
+ m_autoScroll = sc;
+ if (m_autoScroll) autoscroll();
+ }
+}
+
void QTReader::keyPressEvent(QKeyEvent* e)
{
+ buffdoc.unsuspend();
switch (e->key())
@@ -359,32 +504,30 @@ void QTReader::keyPressEvent(QKeyEvent* e)
*/
- case Key_Right:
+ case Key_Right:
{
- e->accept();
- if (m_fontControl.increasesize())
- {
- bool sc = m_autoScroll;
- setfont();
- m_autoScroll = false;
- locate(pagelocate());
- update();
- m_autoScroll = sc;
- if (m_autoScroll) autoscroll();
- }
+ e->accept();
+ if (m_navkeys && buffdoc.hasnavigation())
+ {
+ size_t target = pagelocate();
+ if (buffdoc.forward(target))
+ {
+ locate(target);
+ }
+ }
+ else zoomin();
}
- break;
- case Key_Left:
+ break;
+ case Key_Left:
{
- e->accept();
- if (m_fontControl.decreasesize())
- {
- bool sc = m_autoScroll;
- m_autoScroll = false;
- setfont();
- locate(pagelocate());
- update();
- m_autoScroll = sc;
- if (m_autoScroll) autoscroll();
- }
+ e->accept();
+ if (m_navkeys && buffdoc.hasnavigation())
+ {
+ size_t target = pagelocate();
+ if (buffdoc.back(target))
+ {
+ locate(target);
+ }
+ }
+ else zoomout();
}
- break;
+ break;
case Key_Space:
@@ -411,2 +554,4 @@ void QTReader::setautoscroll(bool _sc)
{
+ CDrawBuffer* reusebuffer = textarray[numlines];
+ if (reusebuffer == NULL || reusebuffer->eof()) return;
m_autoScroll = true;
@@ -419,2 +564,3 @@ bool QTReader::getline(CDrawBuffer *buff)
{
+ buffdoc.unsuspend();
if (m_bMonoSpaced)
@@ -461,3 +607,3 @@ void QTReader::doscroll()
{
- textarray[numlines] = new CDrawBuffer;
+ textarray[numlines] = new CDrawBuffer(&m_fontControl);
}
@@ -465,3 +611,3 @@ void QTReader::doscroll()
int ch = getline(textarray[numlines]);
- textarray[numlines-1]->render(&p, height() - textarray[numlines]->descent() - 2, m_bMonoSpaced, m_charWidth, width());
+ textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - 2, m_bMonoSpaced, m_charWidth, width());
mylastpos = locate();
@@ -471,3 +617,2 @@ void QTReader::doscroll()
((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll);
- emit OnRedraw();
}
@@ -494,74 +639,66 @@ void QTReader::drawFonts( QPainter *p )
{
- setfont();
- if (m_lastwidth != width() || m_lastheight != height())
- {
- m_lastwidth = width();
- m_lastheight = height();
- locate(pagelocate());
- }
- else
- {
-
-/*
- int sl = screenlines();
- if (sl < numlines)
- {
-// qDebug("df:<%u,%u>",sl,numlines);
-
- size_t newpos = locnarray[sl];
- CDrawBuffer** nta = new CDrawBuffer*[sl];
- size_t* nla = new size_t[sl];
- for (int i = 0; i < sl; i++)
- {
- nta[i] = textarray[i];
- nla[i] = locnarray[i];
- }
- for (int i = sl; i < numlines; i++) delete textarray[i];
- delete [] locnarray;
- delete [] textarray;
- textarray = nta;
- locnarray = nla;
- numlines = sl;
- jumpto(mylastpos = newpos);
- }
- if (sl > numlines)
- {
-// qDebug("df:<%u,%u>",sl,numlines);
- CDrawBuffer** nta = new CDrawBuffer*[sl];
- size_t* nla = new size_t[sl];
- for (int i = 0; i < numlines; i++)
- {
- nta[i] = textarray[i];
- nla[i] = locnarray[i];
- }
- if (locate() != mylastpos) jumpto(mylastpos);
- for (int i = numlines; i < sl; i++)
- {
- nta[i] = new CDrawBuffer(&m_fontControl);
- nla[i] = locate();
- getline(nta[i]);
- }
- mylastpos = locate();
- delete [] locnarray;
- delete [] textarray;
- textarray = nta;
- locnarray = nla;
- numlines = sl;
- }
-*/
- if (numlines > 0)
- {
- int ypos = textarray[0]->ascent();
- textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width());
- for (int i = 1; i < numlines; i++)
- {
- ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2;
- textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, width());
-
- }
+ if (bDoUpdates)
+ {
+ qDebug("How refreshing...");
+ if (buffdoc.empty()) return;
+ setfont();
+ if (m_lastwidth != width())
+ {
+ qDebug("Not Optimised %d", m_lastwidth);
+ m_lastwidth = width();
+ m_lastheight = height();
+ locate(pagelocate());
+ qDebug("Not Optimised %d", m_lastwidth);
+ }
+ else
+ {
+ if (m_lastheight > height())
+ {
+ qDebug("Optimised < %d", numlines);
+ int ypos = 0;
+ for (int i = 0; i < numlines; i++)
+ {
+ if ((ypos += textarray[i]->lineSpacing()) > height())
+ {
+ numlines = i;
+ jumpto(locnarray[i+1]);
+ break;
+ }
+ }
+ qDebug("Optimised < %d", numlines);
+ m_lastheight = height();
+ }
+ else if (m_lastheight < height())
+ {
+ qDebug("Optimised > %d", numlines);
+ int ypos = 0;
+ for (int i = 0; i <= numlines; i++)
+ {
+ ypos += textarray[i]->lineSpacing();
+ }
+ fillbuffer(numlines+1, ypos);
+ qDebug("Optimised > %d", numlines);
+ m_lastheight = height();
+ }
+ if (numlines > 0)
+ {
+ int ypos = textarray[0]->ascent();
+ textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width());
+ 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());
+ }
// mylastpos = locate();
- }
- }
- m_scrolldy1 = m_scrolldy2 = 0;
- emit OnRedraw();
+ }
+ }
+ m_scrolldy1 = m_scrolldy2 = 0;
+ emit OnRedraw();
+ }
+ else
+ {
+ qDebug("Not so refreshing...");
+ }
}
@@ -609,2 +746,3 @@ void QTReader::init()
+ buffdoc.unsuspend();
setBackgroundColor( white );
@@ -620,5 +758,4 @@ void QTReader::init()
// QMessageBox::information(this, "init", m_lastfile, 1);
- m_lastwidth = width();
- m_lastheight = height();
setfont();
+/*
if (!m_lastfile.isEmpty())
@@ -628,2 +765,3 @@ void QTReader::init()
}
+*/
}
@@ -703,2 +841,3 @@ bool QTReader::locate(unsigned long n) {
//printf("Locate\n");
+ buffdoc.unsuspend();
buffdoc.locate(n);
@@ -721,2 +860,3 @@ bool QTReader::fillbuffer(int reuse, int ht)
{
+ buffdoc.unsuspend();
if (buffdoc.empty()) return false;
@@ -728,3 +868,3 @@ bool QTReader::fillbuffer(int reuse, int ht)
numlines = reuse;
- while (ypos < height())
+ while (ypos < height() || numlines < 2)
{
@@ -740,3 +880,3 @@ bool QTReader::fillbuffer(int reuse, int ht)
{
- if (numlines - reuse == 1/* && locnarray[0] == buffdoc.locate()*/)
+ if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/)
{
@@ -763,2 +903,3 @@ void QTReader::dopagedn()
{
+ buffdoc.unsuspend();
int skip = 0, ypos = 0;
@@ -770,2 +911,3 @@ void QTReader::dopagedn()
CDrawBuffer* reusebuffer = textarray[numlines];
+ if (reusebuffer != NULL && reusebuffer->eof()) return;
if (reusebuffer != NULL)
@@ -779,2 +921,3 @@ void QTReader::dopagedn()
textarray[i] = reusebuffer;
+// reusebuffer->empty();
locnarray[offset] = locnarray[i];
@@ -793,46 +936,69 @@ void QTReader::dopageup()
{
+ buffdoc.unsuspend();
+ dopageup(locnarray[(m_overlap < numlines) ? m_overlap : numlines/2]);
+}
+
+void QTReader::dopageup(unsigned int target)
+{
+ buffdoc.unsuspend();
CBufferFace<CDrawBuffer*> buff;
CBufferFace<size_t> loc;
- unsigned int target = locnarray[(m_overlap < numlines) ? m_overlap : numlines/2];
- size_t delta;
- if (target < 2048)
- {
- delta = target;
- jumpto(0);
- }
- else
- {
- delta = 2048;
+ size_t delta, guess = 2048;
+ bool ch = true;
+ int nbfl, ypos = 0;
- jumpto(target - delta);
-
- buff[0] = new CDrawBuffer(&m_fontControl);
-
- do
+ while (1)
+ {
+ ch = true;
+ nbfl = 0;
+ if (target < guess)
+ {
+ delta = 0; // 0 is a flag to say don't guess any more
+ jumpto( (m_continuousDocument) ? 0 : buffdoc.startSection() );
+ }
+ else if (!m_continuousDocument && (target - guess < buffdoc.startSection()))
+ {
+ delta = 0; // 0 is a flag to say don't guess any more
+ jumpto(buffdoc.startSection());
+ }
+ else
{
+ delta = guess;
- if (!getline(buff[0])) break;
+ jumpto(target - delta);
- if (locate() > target) continue;
+ buff[0] = new CDrawBuffer(&m_fontControl);
+
+ do
+ {
+
+ if (!getline(buff[0])) break;
+
+ if (locate() > target) break;
+ }
+ while (!buffdoc.iseol());
}
- while (!buffdoc.iseol());
- }
- int nbfl = 0;
-
- bool ch = true;
- int ypos = 0;
- while (locate() < target)
- {
- if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl);
- loc[nbfl] = locate();
- ch = getline(buff[nbfl]);
- ypos += buff[nbfl]->lineSpacing();
- nbfl++;
- if (!ch) break;
- }
- if (ypos < height())
- {
- locate(0);
- return;
+
+ ypos = 0;
+ while (locate() < target)
+ {
+ if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl);
+ loc[nbfl] = locate();
+ ch = getline(buff[nbfl]);
+ ypos += buff[nbfl]->lineSpacing();
+ nbfl++;
+ if (!ch) break;
+ }
+ if (ypos < height() && (delta != 0))
+ {
+ for (int i = 0; i < nbfl; i++)
+ {
+ delete buff[i];
+ buff[i] = NULL;
+ }
+ guess <<= 1;
+ continue;
+ }
+ break;
}
@@ -847,5 +1013,5 @@ void QTReader::dopageup()
numlines = 0;
- while (ypos < height() && numlines <= nbfl-2)
+ while (ypos < height() && numlines <= nbfl-1)
{
- ypos += buff[nbfl - numlines - 2]->lineSpacing();
+ ypos += buff[nbfl - numlines - 1]->lineSpacing();
numlines++;
@@ -853,4 +1019,5 @@ void QTReader::dopageup()
--numlines;
- int offset = nbfl;
- offset -= numlines+1;
+ int offset = nbfl-1;
+ offset -= numlines;
+ ypos = 0;
for (int i = 0; i <= numlines; i++)
@@ -860,2 +1027,3 @@ void QTReader::dopageup()
locnarray[i] = loc[offset + i];
+ ypos += textarray[i]->lineSpacing();
}
@@ -866,3 +1034,11 @@ void QTReader::dopageup()
-// --numlines;
+ while (ypos < height())
+ {
+ numlines++;
+ locnarray[numlines] = locate();
+ if (textarray[numlines] == NULL) textarray[numlines] = new CDrawBuffer(&m_fontControl);
+ if (!getline(textarray[numlines])) break;
+ ypos += textarray[numlines]->lineSpacing();
+ }
+
mylastpos = locate();
@@ -885,2 +1061,4 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
// QMessageBox::information(0, "Opening...", newfile);
+ m_lastwidth = width();
+ m_lastheight = height();
if (buffdoc.openfile(this,newfile) == 0)
@@ -888,2 +1066,3 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
bRC = true;
+ buffdoc.setContinuous(m_continuousDocument);
// qDebug("buffdoc.openfile done");
@@ -1014,2 +1193,3 @@ void QTReader::lineUp()
{
+ buffdoc.unsuspend();
CDrawBuffer* buff = textarray[numlines];
@@ -1021,2 +1201,3 @@ void QTReader::lineUp()
if (target == 0) return;
+ if (!m_continuousDocument && (target == buffdoc.startSection())) return;
if (buffdoc.hasrandomaccess())
@@ -1036,2 +1217,10 @@ void QTReader::lineUp()
}
+ else if (!m_continuousDocument && (target - delta < buffdoc.startSection()))
+ {
+ delta = target-buffdoc.startSection();
+ jumpto(buffdoc.startSection());
+ loc = locate();
+ getline(buff);
+ break;
+ }
jumpto(target-delta);
@@ -1109 +1298,30 @@ MarkupType QTReader::PreferredMarkup()
}
+
+void QTReader::setstate(const statedata& sd)
+{
+ bstripcr = sd.bstripcr;
+ btextfmt = sd.btextfmt;
+ bautofmt = sd.bautofmt;
+ bstriphtml = sd.bstriphtml;
+ bpeanut = sd.bpeanut;
+ bdehyphen = sd.bdehyphen;
+ bonespace = sd.bonespace;
+ bunindent = sd.bunindent;
+ brepara = sd.brepara;
+ bdblspce = sd.bdblspce;
+ m_bpagemode = sd.m_bpagemode;
+ m_navkeys = sd.m_navkeys;
+ m_bMonoSpaced = sd.m_bMonoSpaced;
+ bremap = sd.bremap;
+ bmakebold = sd.bmakebold;
+ m_continuousDocument = sd.Continuous;
+#ifdef REPALM
+ brepalm = sd.brepalm;
+#endif
+ bindenter = sd.bindenter;
+ m_encd = sd.m_charpc;
+ m_fontname = sd.m_fontname;
+ setContinuous(sd.Continuous);
+ ChangeFont(sd.m_textsize);
+ refresh();
+}