Diffstat (limited to 'noncore/apps/opie-reader/QTReader.cpp') (more/less context) (show whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/QTReader.cpp | 855 |
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 @@ -33,5 +33,8 @@ const int _SBARHEIGHT = 3; #include <qfileinfo.h> #include <qdir.h> +#include "TableDialog.h" +#include "outputcodec.h" +/* #ifdef _UNICODE const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 }; @@ -39,4 +42,5 @@ const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 }; 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 }; @@ -50,7 +54,7 @@ tchar QTReader::jplucknextpart[] = { 'N','e','x','t',' ','P','a','r','t',' ','>' //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), @@ -90,14 +94,10 @@ QTReader::QTReader( QWidget *parent, const char *name, WFlags f) : 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; } @@ -118,5 +118,5 @@ QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *nam { init(); -// // qDebug("Load_file(1)"); +// // qDeb2ug("Load_file(1)"); load_file((const tchar*)filename); } @@ -139,5 +139,6 @@ 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) @@ -155,4 +156,6 @@ void QTReader::mousePressEvent( QMouseEvent* _e ) wh = width(); } + if (x >= m_left_border && x <= wh - m_right_border && y >= m_topmargin && y <= ht-m_bottommargin) + { if (_e->button() == RightButton) { @@ -169,13 +172,155 @@ void QTReader::mousePressEvent( QMouseEvent* _e ) } */ - 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 ) @@ -296,5 +441,5 @@ 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; @@ -341,5 +486,5 @@ linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t offset = i; } - return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img); + return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img, tabtgt); } @@ -355,4 +500,36 @@ void QTReader::suspend() } +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) { @@ -363,5 +540,4 @@ void QTReader::setTwoTouch(bool _b) void QTReader::setContinuous(bool _b) { - buffdoc.unsuspend(); buffdoc.setContinuous(m_continuousDocument = _b); } @@ -456,5 +632,5 @@ 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) { @@ -469,7 +645,120 @@ 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) @@ -492,4 +781,5 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) { // qDebug("MouseRelease"); + /* switch(m_scrollpos) { @@ -519,4 +809,5 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) break; } + */ if (textarray[0] != NULL) { @@ -531,5 +822,5 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) } */ - size_t startpos, startoffset, tgt, tgtoffset, pictgt; + size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt; QImage* img; if (m_currentlinkstyle != NULL) @@ -540,5 +831,19 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) 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) { @@ -580,5 +885,5 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) if (!href.isEmpty()) { - if (!buffdoc.getFile(href)) + if (!buffdoc.getFile(href, nm)) { emit NewFileRequest(href); @@ -586,6 +891,10 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) else { + qDebug("BEFORE:%u", pagelocate()); + buffdoc.resetPos(); ResetScroll(); fillbuffer(); + qDebug("AFTER:%u", pagelocate()); + m_outofdate = true; update(); } @@ -596,5 +905,7 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) if (buffdoc.findanchor(nm)) { + buffdoc.resetPos(); fillbuffer(); + m_outofdate = true; update(); } @@ -613,4 +924,5 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) ResetScroll(); fillbuffer(); + m_outofdate = true; update(); } @@ -634,5 +946,4 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) } } - locate(pagelocate()); } return; @@ -649,5 +960,5 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) else { - locate(pagelocate()); + update(); } return; @@ -670,8 +981,9 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e ) } } +} 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(); } @@ -681,5 +993,12 @@ void QTReader::focusOutEvent(QFocusEvent* e) if (m_autoScroll) { + if (m_scrolltype != 4) + { timer->stop(); + } + else + { + m_autoScroll = false; + } // m_scrolldy1 = m_scrolldy2 = 0; } @@ -718,5 +1037,4 @@ void QTReader::goUp() void QTReader::NavUp() { - buffdoc.unsuspend(); if (buffdoc.hasnavigation()) { @@ -738,5 +1056,4 @@ void QTReader::NavUp() void QTReader::NavDown() { - buffdoc.unsuspend(); if (buffdoc.hasnavigation()) { @@ -763,6 +1080,5 @@ void QTReader::zoomin() setautoscroll(false); setfont(); - locate(pagelocate()); - repaint(); + refresh(); setautoscroll(sc); } @@ -776,6 +1092,5 @@ void QTReader::zoomout() setautoscroll(false); setfont(); - locate(pagelocate()); - repaint(); + refresh(); setautoscroll(sc); } @@ -810,5 +1125,4 @@ void QTReader::increaseScroll() void QTReader::keyPressEvent(QKeyEvent* e) { - buffdoc.unsuspend(); //((QTReaderApp*)parent()->parent())->handlekey(e); @@ -907,4 +1221,5 @@ void QTReader::CalculateScrollParameters() void QTReader::setautoscroll(bool _sc) { + m_outofdate = true; if (_sc == m_autoScroll) return; if (m_autoScroll) @@ -928,4 +1243,7 @@ void QTReader::setautoscroll(bool _sc) CDrawBuffer* reusebuffer = textarray[numlines]; if (reusebuffer == NULL || reusebuffer->eof()) return; +#ifndef __STATIC + if ((m_scrolltype == 4) && !checkoutput()) return; +#endif m_autoScroll = true; CalculateScrollParameters(); @@ -948,5 +1266,4 @@ void QTReader::setautoscroll(bool _sc) bool QTReader::getline(CDrawBuffer *buff) { - buffdoc.unsuspend(); bool bRet; int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin; @@ -1066,22 +1383,4 @@ void QTReader::doinplacescroll() 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; @@ -1100,5 +1399,4 @@ void QTReader::doinplacescroll() } #endif - //((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); emit SetScrollState(m_autoScroll); #ifdef USEQPE @@ -1495,8 +1793,19 @@ 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() @@ -1558,6 +1867,8 @@ void QTReader::redrawall() if (m_rotated) { -#ifdef DOUBLEBUFFER - drawBackground(); + if (dbuff != NULL) + { + dbp->begin(dbuff); + drawBackground(dbp); DrawStraight(dbp, height(), width()); dbp->end(); @@ -1567,10 +1878,12 @@ void QTReader::redrawall() 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()); @@ -1579,16 +1892,22 @@ void QTReader::redrawall() 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()); + } } } @@ -1601,72 +1920,54 @@ void QTReader::drawFonts() 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++) { @@ -1683,6 +1984,7 @@ void QTReader::drawFonts() 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++) { @@ -1694,19 +1996,7 @@ void QTReader::drawFonts() 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(); } @@ -1929,5 +2219,4 @@ bool QTReader::ChangeFont(int tgt) void QTReader::init() { - buffdoc.unsuspend(); setBackgroundColor( m_bg ); buffdoc.setfilter(getfilter()); @@ -1936,4 +2225,8 @@ void QTReader::init() 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(); @@ -1945,8 +2238,13 @@ void QTReader::init() QTReader::~QTReader() { -#ifdef DOUBLEBUFFER + if (m_output != NULL) + { + delete m_output; + } + if (dbuff != NULL) + { delete dbuff; delete dbp; -#endif + } #ifdef USEQPE if (m_autoScroll) @@ -1983,8 +2281,46 @@ void QTReader::printIt() // -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; +} // @@ -2017,11 +2353,21 @@ 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(); @@ -2030,5 +2376,5 @@ bool QTReader::locate(unsigned long n) { return true; } - +*/ unsigned int QTReader::screenlines() { @@ -2040,5 +2386,4 @@ 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; @@ -2064,4 +2409,10 @@ bool QTReader::fillbuffer(int reuse, int ht, int newht) 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) @@ -2070,5 +2421,8 @@ bool QTReader::fillbuffer(int reuse, int ht, int newht) { qDebug("FALSE"); + if (oldpagepos < buffdoc.endSection()) locate(oldpagepos); + else + dopageup(buffdoc.endSection()); return false; } @@ -2102,5 +2456,4 @@ void QTReader::dopagedn() { // qDebug("HEIGHT(2):%d", m_lastheight); - buffdoc.unsuspend(); ResetScroll(); int skip = 0, ypos = m_topmargin; @@ -2151,6 +2504,8 @@ bool QTReader::synch(size_t start, size_t 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; @@ -2159,10 +2514,9 @@ bool QTReader::synch(size_t start, size_t end) 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; @@ -2181,4 +2535,5 @@ void QTReader::dopageup(unsigned int target) { delta = 0; // 0 is a flag to say don't guess any more + qDebug("Jumping to startsection:%d", buffdoc.startSection()); jumpto(buffdoc.startSection()); } @@ -2294,6 +2649,7 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn) bool bRC = false; unsigned int lcn = _lcn; + bDoUpdates = false; ResetScroll(); - if (m_lastfile == newfile) + if (m_lastfile == newfile && lcn == 0) { lcn = m_lastposn; @@ -2317,9 +2673,9 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn) buffdoc.setContinuous(m_continuousDocument); qDebug("buffdoc.openfile done"); - locate(lcn); - qDebug("buffdoc.locate done"); } setfilter(getfilter()); qDebug("Updated"); + bDoUpdates = true; + locate(lcn); return bRC; } @@ -2359,4 +2715,5 @@ void QTReader::lineDown() getline(textarray[numlines]); mylastpos = locate(); + m_outofdate = true; update(); } @@ -2573,7 +2930,11 @@ MarkupType QTReader::PreferredMarkup() return m; } -#ifdef DOUBLEBUFFER + void QTReader::resizeEvent( QResizeEvent * p ) { + qDebug("Resizing"); + m_outofdate = true; + if (dbuff != NULL) + { if (m_rotated) { @@ -2584,4 +2945,5 @@ void QTReader::resizeEvent( QResizeEvent * p ) dbuff->resize(p->size()); } + } m_bgIsScaled = false; if (m_bgtype == bgStretched) @@ -2606,27 +2968,21 @@ void QTReader::resizeEvent( QResizeEvent * p ) 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) @@ -2649,36 +3005,55 @@ void QTReader::setrotated(bool sfs) 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; @@ -2689,7 +3064,14 @@ void QTReader::drawBackground() 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; @@ -2697,5 +3079,5 @@ void QTReader::drawBackground() qDebug("Unknown background type"); } - // dbp->setBackgroundMode(OpaqueMode); + // p->setBackgroundMode(OpaqueMode); } } @@ -2760,5 +3142,10 @@ 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; } @@ -2898,5 +3285,5 @@ void QTReader::gotoLink() if (!href.isEmpty()) { - if (!buffdoc.getFile(href)) + if (!buffdoc.getFile(href, nm)) { emit NewFileRequest(href); @@ -2906,4 +3293,5 @@ void QTReader::gotoLink() ResetScroll(); fillbuffer(); + m_outofdate = true; update(); } @@ -2914,5 +3302,7 @@ void QTReader::gotoLink() if (buffdoc.findanchor(nm)) { + buffdoc.resetPos(); fillbuffer(); + m_outofdate = true; update(); } @@ -2931,4 +3321,5 @@ void QTReader::gotoLink() ResetScroll(); fillbuffer(); + m_outofdate = true; update(); } @@ -2950,7 +3341,7 @@ void QTReader::gotoLink() { emit OnURLSelected(href, tgt); + refresh(); } } - locate(pagelocate()); } m_currentlinkstyle = NULL; @@ -2961,4 +3352,5 @@ void QTReader::gotoLink() void QTReader::refresh(bool full) { + qDebug("Refreshing"); int h, w; if (m_rotated) @@ -2982,4 +3374,119 @@ void QTReader::refresh(bool full) 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; +} |