Diffstat (limited to 'noncore/apps/opie-reader/QTReader.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/QTReader.cpp | 400 |
1 files changed, 309 insertions, 91 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 @@ -23,4 +23,5 @@ #include <qpe/global.h> #include <qpe/qcopenvelope_qws.h> +#include "StateData.h" #ifdef _UNICODE @@ -36,5 +37,5 @@ const char *QTReader::fonts[] = { "Helvetica", "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), @@ -49,5 +50,7 @@ QTReader::QTReader( QWidget *parent, const char *name, WFlags f) : mouseUpOn(true), m_twotouch(true), - m_touchone(true) + m_touchone(true), + bDoUpdates(false), + m_navkeys(true) { m_overlap = 1; @@ -82,7 +85,45 @@ long QTReader::real_delay() void QTReader::mousePressEvent( QMouseEvent* _e ) { + buffdoc.unsuspend(); if (_e->button() == RightButton) { mouseUpOn = false; + if (buffdoc.hasnavigation()) + { + 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 + { if (_e->y() > height()/2) { @@ -95,6 +136,7 @@ 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) { int lineno = 0; @@ -113,8 +155,9 @@ 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); } @@ -125,6 +168,13 @@ 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) { @@ -142,8 +192,12 @@ 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)) + { + case eLink: { + size_t saveposn = pagelocate(); if (buffdoc.hyperlink(tgt)) { + buffdoc.saveposn(saveposn); fillbuffer(); update(); @@ -155,4 +209,25 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) return; } + case ePicture: + { + qDebug("Picture:%x", tgt); + QPixmap* pm = buffdoc.getPicture(tgt); + if (pm != NULL) + { + emit OnShowPicture(*pm); + delete pm; + } + else + { + locate(pagelocate()); + } + return; + } + case eNone: + break; + default: + qDebug("Unknown linktype"); + return; + } if (m_twotouch) { @@ -213,9 +288,10 @@ 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); @@ -283,6 +359,75 @@ 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()) { @@ -361,29 +506,27 @@ void QTReader::keyPressEvent(QKeyEvent* e) { e->accept(); - if (m_fontControl.increasesize()) + if (m_navkeys && buffdoc.hasnavigation()) { - bool sc = m_autoScroll; - setfont(); - m_autoScroll = false; - locate(pagelocate()); - update(); - m_autoScroll = sc; - if (m_autoScroll) autoscroll(); + size_t target = pagelocate(); + if (buffdoc.forward(target)) + { + locate(target); } } + else zoomin(); + } break; case Key_Left: { e->accept(); - if (m_fontControl.decreasesize()) + if (m_navkeys && buffdoc.hasnavigation()) { - bool sc = m_autoScroll; - m_autoScroll = false; - setfont(); - locate(pagelocate()); - update(); - m_autoScroll = sc; - if (m_autoScroll) autoscroll(); + size_t target = pagelocate(); + if (buffdoc.back(target)) + { + locate(target); + } } + else zoomout(); } break; @@ -410,4 +553,6 @@ void QTReader::setautoscroll(bool _sc) else { + CDrawBuffer* reusebuffer = textarray[numlines]; + if (reusebuffer == NULL || reusebuffer->eof()) return; m_autoScroll = true; autoscroll(); @@ -418,4 +563,5 @@ void QTReader::setautoscroll(bool _sc) bool QTReader::getline(CDrawBuffer *buff) { + buffdoc.unsuspend(); if (m_bMonoSpaced) { @@ -460,9 +606,9 @@ 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) @@ -470,5 +616,4 @@ void QTReader::doscroll() m_autoScroll = false; ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); - emit OnRedraw(); } emit OnRedraw(); @@ -493,61 +638,47 @@ void QTReader::setfont() void QTReader::drawFonts( QPainter *p ) { + if (bDoUpdates) + { + qDebug("How refreshing..."); + if (buffdoc.empty()) return; setfont(); - if (m_lastwidth != width() || m_lastheight != height()) + 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 { - -/* - int sl = screenlines(); - if (sl < numlines) + if (m_lastheight > height()) { -// 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++) + qDebug("Optimised < %d", numlines); + int ypos = 0; + for (int i = 0; i < numlines; i++) + { + if ((ypos += textarray[i]->lineSpacing()) > height()) { - nta[i] = textarray[i]; - nla[i] = locnarray[i]; + numlines = i; + jumpto(locnarray[i+1]); + break; } - 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]; + qDebug("Optimised < %d", numlines); + m_lastheight = height(); } - if (locate() != mylastpos) jumpto(mylastpos); - for (int i = numlines; i < sl; i++) + else if (m_lastheight < height()) { - nta[i] = new CDrawBuffer(&m_fontControl); - nla[i] = locate(); - getline(nta[i]); + qDebug("Optimised > %d", numlines); + int ypos = 0; + for (int i = 0; i <= numlines; i++) + { + ypos += textarray[i]->lineSpacing(); } - mylastpos = locate(); - delete [] locnarray; - delete [] textarray; - textarray = nta; - locnarray = nla; - numlines = sl; + fillbuffer(numlines+1, ypos); + qDebug("Optimised > %d", numlines); + m_lastheight = height(); } -*/ if (numlines > 0) { @@ -556,7 +687,8 @@ void QTReader::drawFonts( QPainter *p ) for (int i = 1; i < numlines; i++) { - ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2; +// 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(); @@ -566,4 +698,9 @@ void QTReader::drawFonts( QPainter *p ) emit OnRedraw(); } + else + { + qDebug("Not so refreshing..."); + } +} QString QTReader::firstword() @@ -608,4 +745,5 @@ void QTReader::init() // setCaption( "Qt Draw Demo Application" ); + buffdoc.unsuspend(); setBackgroundColor( white ); // QPainter p(this); @@ -619,7 +757,6 @@ void QTReader::init() 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()) { @@ -627,4 +764,5 @@ void QTReader::init() load_file(m_lastfile); } +*/ } @@ -702,4 +840,5 @@ int main( int argc, tchar **argv ) bool QTReader::locate(unsigned long n) { //printf("Locate\n"); + buffdoc.unsuspend(); buffdoc.locate(n); // qDebug("&buffdoc.located"); @@ -720,4 +859,5 @@ unsigned int QTReader::screenlines() bool QTReader::fillbuffer(int reuse, int ht) { + buffdoc.unsuspend(); if (buffdoc.empty()) return false; m_scrolldy1 = m_scrolldy2 = 0; @@ -727,5 +867,5 @@ bool QTReader::fillbuffer(int reuse, int ht) int ypos = ht; numlines = reuse; - while (ypos < height()) + while (ypos < height() || numlines < 2) { if (textarray[numlines] == NULL) @@ -739,5 +879,5 @@ bool QTReader::fillbuffer(int reuse, int ht) if (!ch) { - if (numlines - reuse == 1/* && locnarray[0] == buffdoc.locate()*/) + if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/) { locate(oldpagepos); @@ -762,4 +902,5 @@ bool QTReader::fillbuffer(int reuse, int ht) void QTReader::dopagedn() { + buffdoc.unsuspend(); int skip = 0, ypos = 0; if (locate() != mylastpos) @@ -769,4 +910,5 @@ void QTReader::dopagedn() } CDrawBuffer* reusebuffer = textarray[numlines]; + if (reusebuffer != NULL && reusebuffer->eof()) return; if (reusebuffer != NULL) { @@ -778,4 +920,5 @@ void QTReader::dopagedn() textarray[offset] = textarray[i]; textarray[i] = reusebuffer; +// reusebuffer->empty(); locnarray[offset] = locnarray[i]; locnarray[i] = reuselocn; @@ -792,17 +935,35 @@ 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) + size_t delta, guess = 2048; + bool ch = true; + int nbfl, ypos = 0; + + while (1) { - delta = target; - jumpto(0); + 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 = 2048; + delta = guess; jumpto(target - delta); @@ -815,12 +976,10 @@ void QTReader::dopageup() if (!getline(buff[0])) break; - if (locate() > target) continue; + if (locate() > target) break; } while (!buffdoc.iseol()); } - int nbfl = 0; - bool ch = true; - int ypos = 0; + ypos = 0; while (locate() < target) { @@ -832,8 +991,15 @@ void QTReader::dopageup() if (!ch) break; } - if (ypos < height()) + if (ypos < height() && (delta != 0)) { - locate(0); - return; + for (int i = 0; i < nbfl; i++) + { + delete buff[i]; + buff[i] = NULL; + } + guess <<= 1; + continue; + } + break; } if (ch) @@ -846,12 +1012,13 @@ 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++) { @@ -859,4 +1026,5 @@ void QTReader::dopageup() textarray[i] = buff[offset+i]; locnarray[i] = loc[offset + i]; + ypos += textarray[i]->lineSpacing(); } for (int i = 0; i < nbfl - numlines - 1; i++) @@ -865,5 +1033,13 @@ 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(); @@ -884,7 +1060,10 @@ 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); @@ -1013,4 +1192,5 @@ void QTReader::lineUp() void QTReader::lineUp() { + buffdoc.unsuspend(); CDrawBuffer* buff = textarray[numlines]; unsigned int loc; @@ -1020,4 +1200,5 @@ void QTReader::lineUp() unsigned int target = locnarray[0]; if (target == 0) return; + if (!m_continuousDocument && (target == buffdoc.startSection())) return; if (buffdoc.hasrandomaccess()) { @@ -1035,4 +1216,12 @@ void QTReader::lineUp() 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 @@ -1108,2 +1297,31 @@ 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(); +} |