Diffstat (limited to 'noncore/apps/opie-reader/QTReader.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/QTReader.cpp | 540 |
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(); +} |