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
@@ -22,6 +22,7 @@
#include <qfontdatabase.h>
#include <qpe/global.h>
#include <qpe/qcopenvelope_qws.h>
+#include "StateData.h"
#ifdef _UNICODE
const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 };
@@ -35,7 +36,7 @@ const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 };
//const tchar *QTReader::fonts[] = { "verdana", "Courier", "Times", 0 };
//const int QTReader::fontsizes[] = {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,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),
m_delay(100),
m_scrolldy1(0),
@@ -48,7 +49,9 @@ QTReader::QTReader( QWidget *parent, const char *name, WFlags f) :
m_fm(NULL),
mouseUpOn(true),
m_twotouch(true),
- m_touchone(true)
+ m_touchone(true),
+ bDoUpdates(false),
+ m_navkeys(true)
{
m_overlap = 1;
// init();
@@ -81,21 +84,60 @@ long QTReader::real_delay()
void QTReader::mousePressEvent( QMouseEvent* _e )
{
+ buffdoc.unsuspend();
if (_e->button() == RightButton)
{
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());
+ }
+ }
}
else
{
- goUp();
+ if (_e->y() > height()/2)
+ {
+ goDown();
+ }
+ else
+ {
+ goUp();
+ }
}
}
}
-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)
{
int lineno = 0;
int ht = textarray[0]->lineSpacing();
@@ -112,10 +154,11 @@ bool QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t
{
int i;
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);
}
void QTReader::setTwoTouch(bool _b)
@@ -124,8 +167,15 @@ void QTReader::setTwoTouch(bool _b)
m_twotouch = m_touchone = _b;
}
+void QTReader::setContinuous(bool _b)
+{
+ buffdoc.unsuspend();
+ buffdoc.setContinuous(m_continuousDocument = _b);
+}
+
void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
+ buffdoc.unsuspend();
if (_e->button() == LeftButton)
{
if (mouseUpOn)
@@ -141,18 +191,43 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
ht += textarray[++lineno]->lineSpacing();
}
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;
}
if (m_twotouch)
{
@@ -212,11 +287,12 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
CDrawBuffer* t = textarray[lineno];
int first = 0;
+ int tgt = _e->x() - t->offset(width());
while (1)
{
int i = first+1;
while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
- if (t->width(i) > _e->x())
+ if (t->width(i) > tgt)
{
wrd = toQString(t->data()+first, i - first);
break;
@@ -282,8 +358,77 @@ 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())
{
case Key_Down:
@@ -357,36 +502,34 @@ void QTReader::keyPressEvent(QKeyEvent* e)
}
break;
*/
- 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:
case Key_Return:
{
@@ -409,6 +552,8 @@ void QTReader::setautoscroll(bool _sc)
}
else
{
+ CDrawBuffer* reusebuffer = textarray[numlines];
+ if (reusebuffer == NULL || reusebuffer->eof()) return;
m_autoScroll = true;
autoscroll();
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed
@@ -417,6 +562,7 @@ void QTReader::setautoscroll(bool _sc)
bool QTReader::getline(CDrawBuffer *buff)
{
+ buffdoc.unsuspend();
if (m_bMonoSpaced)
{
return buffdoc.getline(buff ,width(), m_charWidth);
@@ -459,17 +605,16 @@ void QTReader::doscroll()
if (textarray[numlines] == NULL)
{
- textarray[numlines] = new CDrawBuffer;
+ textarray[numlines] = new CDrawBuffer(&m_fontControl);
}
locnarray[numlines] = locate();
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();
if (!ch)
{
m_autoScroll = false;
((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll);
- emit OnRedraw();
}
emit OnRedraw();
}
@@ -492,78 +637,70 @@ void QTReader::setfont()
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...");
+ }
}
QString QTReader::firstword()
@@ -607,6 +744,7 @@ void QTReader::init()
{
// setCaption( "Qt Draw Demo Application" );
+ buffdoc.unsuspend();
setBackgroundColor( white );
// QPainter p(this);
// p.setBackgroundMode( Qt::OpaqueMode );
@@ -618,14 +756,14 @@ void QTReader::init()
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(doscroll()));
// QMessageBox::information(this, "init", m_lastfile, 1);
- m_lastwidth = width();
- m_lastheight = height();
setfont();
+/*
if (!m_lastfile.isEmpty())
{
m_string = DocLnk(m_lastfile).name();
load_file(m_lastfile);
}
+*/
}
//
@@ -701,6 +839,7 @@ int main( int argc, tchar **argv )
bool QTReader::locate(unsigned long n) {
//printf("Locate\n");
+ buffdoc.unsuspend();
buffdoc.locate(n);
// qDebug("&buffdoc.located");
fillbuffer();
@@ -719,6 +858,7 @@ unsigned int QTReader::screenlines()
bool QTReader::fillbuffer(int reuse, int ht)
{
+ buffdoc.unsuspend();
if (buffdoc.empty()) return false;
m_scrolldy1 = m_scrolldy2 = 0;
int ch;
@@ -726,7 +866,7 @@ bool QTReader::fillbuffer(int reuse, int ht)
unsigned int oldpagepos = locnarray[reuse];
int ypos = ht;
numlines = reuse;
- while (ypos < height())
+ while (ypos < height() || numlines < 2)
{
if (textarray[numlines] == NULL)
{
@@ -738,7 +878,7 @@ bool QTReader::fillbuffer(int reuse, int ht)
numlines++;
if (!ch)
{
- if (numlines - reuse == 1/* && locnarray[0] == buffdoc.locate()*/)
+ if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/)
{
locate(oldpagepos);
return false;
@@ -761,6 +901,7 @@ bool QTReader::fillbuffer(int reuse, int ht)
void QTReader::dopagedn()
{
+ buffdoc.unsuspend();
int skip = 0, ypos = 0;
if (locate() != mylastpos)
{
@@ -768,6 +909,7 @@ void QTReader::dopagedn()
jumpto(mylastpos);
}
CDrawBuffer* reusebuffer = textarray[numlines];
+ if (reusebuffer != NULL && reusebuffer->eof()) return;
if (reusebuffer != NULL)
{
for (int i = 0; i <= m_overlap; i++)
@@ -777,6 +919,7 @@ void QTReader::dopagedn()
size_t reuselocn = locnarray[offset];
textarray[offset] = textarray[i];
textarray[i] = reusebuffer;
+// reusebuffer->empty();
locnarray[offset] = locnarray[i];
locnarray[i] = reuselocn;
ypos += textarray[i]->lineSpacing();
@@ -791,50 +934,73 @@ void QTReader::dopagedn()
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;
}
if (ch)
{
@@ -845,26 +1011,36 @@ void QTReader::dopageup()
}
ypos = 0;
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++;
}
--numlines;
- int offset = nbfl;
- offset -= numlines+1;
+ int offset = nbfl-1;
+ offset -= numlines;
+ ypos = 0;
for (int i = 0; i <= numlines; i++)
{
delete textarray[i];
textarray[i] = buff[offset+i];
locnarray[i] = loc[offset + i];
+ ypos += textarray[i]->lineSpacing();
}
for (int i = 0; i < nbfl - numlines - 1; i++)
{
delete buff[i];
}
-// --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();
update();
@@ -883,9 +1059,12 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
}
m_lastfile = newfile;
// QMessageBox::information(0, "Opening...", newfile);
+ m_lastwidth = width();
+ m_lastheight = height();
if (buffdoc.openfile(this,newfile) == 0)
{
bRC = true;
+ buffdoc.setContinuous(m_continuousDocument);
// qDebug("buffdoc.openfile done");
locate(lcn);
// qDebug("buffdoc.locate done");
@@ -1012,6 +1191,7 @@ void QTReader::lineUp()
*/
void QTReader::lineUp()
{
+ buffdoc.unsuspend();
CDrawBuffer* buff = textarray[numlines];
unsigned int loc;
unsigned int end = locnarray[numlines];
@@ -1019,6 +1199,7 @@ void QTReader::lineUp()
if (locate() != mylastpos) jumpto(mylastpos);
unsigned int target = locnarray[0];
if (target == 0) return;
+ if (!m_continuousDocument && (target == buffdoc.startSection())) return;
if (buffdoc.hasrandomaccess())
{
unsigned int delta = locate()-pagelocate();
@@ -1034,6 +1215,14 @@ void QTReader::lineUp()
getline(buff);
break;
}
+ else if (!m_continuousDocument && (target - delta < buffdoc.startSection()))
+ {
+ delta = target-buffdoc.startSection();
+ jumpto(buffdoc.startSection());
+ loc = locate();
+ getline(buff);
+ break;
+ }
jumpto(target-delta);
do
{
@@ -1107,3 +1296,32 @@ MarkupType QTReader::PreferredMarkup()
}
return m;
}
+
+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();
+}