summaryrefslogtreecommitdiff
path: root/noncore/apps/opie-reader/QTReader.cpp
Unidiff
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
@@ -19,12 +19,13 @@
19#include <stdio.h> //for sprintf 19#include <stdio.h> //for sprintf
20#include <qpe/config.h> 20#include <qpe/config.h>
21#include <qpe/applnk.h> 21#include <qpe/applnk.h>
22#include <qfontdatabase.h> 22#include <qfontdatabase.h>
23#include <qpe/global.h> 23#include <qpe/global.h>
24#include <qpe/qcopenvelope_qws.h> 24#include <qpe/qcopenvelope_qws.h>
25#include "StateData.h"
25 26
26#ifdef _UNICODE 27#ifdef _UNICODE
27const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 }; 28const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 };
28#else 29#else
29const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 }; 30const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 };
30#endif 31#endif
@@ -32,26 +33,28 @@ const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 };
32 33
33//const tchar *QTReader::fonts[] = { "unifont", "fixed", "micro", "smoothtimes", "Courier", "Times", 0 }; 34//const tchar *QTReader::fonts[] = { "unifont", "fixed", "micro", "smoothtimes", "Courier", "Times", 0 };
34//const int QTReader::fontsizes[] = {10,16,17,22,0}; 35//const int QTReader::fontsizes[] = {10,16,17,22,0};
35//const tchar *QTReader::fonts[] = { "verdana", "Courier", "Times", 0 }; 36//const tchar *QTReader::fonts[] = { "verdana", "Courier", "Times", 0 };
36//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}; 37//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};
37 38
38QTReader::QTReader( QWidget *parent, const char *name, WFlags f) : 39QTReader::QTReader( QWidget *parent=0, const char *name=0, WFlags f = 0) :
39 QWidget(parent, name, f), 40 QWidget(parent, name, f),
40 m_delay(100), 41 m_delay(100),
41 m_scrolldy1(0), 42 m_scrolldy1(0),
42 m_scrolldy2(0), 43 m_scrolldy2(0),
43 m_autoScroll(false), 44 m_autoScroll(false),
44 //textarray(NULL), 45 //textarray(NULL),
45 //locnarray(NULL), 46 //locnarray(NULL),
46 numlines(0), 47 numlines(0),
47 m_fontname("unifont"), 48 m_fontname("unifont"),
48 m_fm(NULL), 49 m_fm(NULL),
49 mouseUpOn(true), 50 mouseUpOn(true),
50 m_twotouch(true), 51 m_twotouch(true),
51 m_touchone(true) 52 m_touchone(true),
53 bDoUpdates(false),
54 m_navkeys(true)
52{ 55{
53 m_overlap = 1; 56 m_overlap = 1;
54// init(); 57// init();
55} 58}
56/* 59/*
57QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0) : 60QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0) :
@@ -78,27 +81,66 @@ long QTReader::real_delay()
78{ 81{
79 return ( 8976 + m_delay ) / ( m_linespacing * m_linespacing ); 82 return ( 8976 + m_delay ) / ( m_linespacing * m_linespacing );
80} 83}
81 84
82void QTReader::mousePressEvent( QMouseEvent* _e ) 85void QTReader::mousePressEvent( QMouseEvent* _e )
83{ 86{
87 buffdoc.unsuspend();
84 if (_e->button() == RightButton) 88 if (_e->button() == RightButton)
85 { 89 {
86 mouseUpOn = false; 90 mouseUpOn = false;
87 if (_e->y() > height()/2) 91 if (buffdoc.hasnavigation())
88 { 92 {
89 goDown(); 93 if (_e->y() > (2*height())/3)
94 {
95 goDown();
96 }
97 else if (_e->y() < height()/3)
98 {
99 goUp();
100 }
101 else
102 {
103 if (_e->x() < width()/3)
104 {
105 size_t target = pagelocate();
106 if (buffdoc.back(target))
107 {
108 locate(target);
109 }
110 }
111 else if (_e->x() > (2*width())/3)
112 {
113 size_t target = pagelocate();
114 if (buffdoc.forward(target))
115 {
116 locate(target);
117 }
118 }
119 else
120 {
121 buffdoc.saveposn(pagelocate());
122 locate(buffdoc.getHome());
123 }
124 }
90 } 125 }
91 else 126 else
92 { 127 {
93 goUp(); 128 if (_e->y() > height()/2)
129 {
130 goDown();
131 }
132 else
133 {
134 goUp();
135 }
94 } 136 }
95 } 137 }
96} 138}
97 139
98bool QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt) 140linkType QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt)
99{ 141{
100 int lineno = 0; 142 int lineno = 0;
101 int ht = textarray[0]->lineSpacing(); 143 int ht = textarray[0]->lineSpacing();
102 while ((ht < y) && (lineno < numlines)) 144 while ((ht < y) && (lineno < numlines))
103 { 145 {
104 ht += textarray[++lineno]->lineSpacing(); 146 ht += textarray[++lineno]->lineSpacing();
@@ -109,26 +151,34 @@ bool QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t
109 offset = x/m_charWidth; 151 offset = x/m_charWidth;
110 } 152 }
111 else 153 else
112 { 154 {
113 int i; 155 int i;
114 CDrawBuffer* t = textarray[lineno]; 156 CDrawBuffer* t = textarray[lineno];
115 for (i = t->length(); t->width(i) > x; i--); 157 x = x - t->offset(width());
158 for (i = t->length(); i >= 0 && t->width(i) > x; i--);
116 offset = i; 159 offset = i;
117 } 160 }
118 return textarray[lineno]->isLink(offset, tgt); 161 return textarray[lineno]->getLinkType(offset, tgt);
119} 162}
120 163
121void QTReader::setTwoTouch(bool _b) 164void QTReader::setTwoTouch(bool _b)
122{ 165{
123 setBackgroundColor( white ); 166 setBackgroundColor( white );
124 m_twotouch = m_touchone = _b; 167 m_twotouch = m_touchone = _b;
125} 168}
126 169
170void QTReader::setContinuous(bool _b)
171{
172 buffdoc.unsuspend();
173 buffdoc.setContinuous(m_continuousDocument = _b);
174}
175
127void QTReader::mouseReleaseEvent( QMouseEvent* _e ) 176void QTReader::mouseReleaseEvent( QMouseEvent* _e )
128{ 177{
178 buffdoc.unsuspend();
129 if (_e->button() == LeftButton) 179 if (_e->button() == LeftButton)
130 { 180 {
131 if (mouseUpOn) 181 if (mouseUpOn)
132 { 182 {
133 if (textarray[0] != NULL) 183 if (textarray[0] != NULL)
134 { 184 {
@@ -138,24 +188,49 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
138 int ht = textarray[0]->lineSpacing(); 188 int ht = textarray[0]->lineSpacing();
139 while ((ht < _e->y()) && (lineno < numlines)) 189 while ((ht < _e->y()) && (lineno < numlines))
140 { 190 {
141 ht += textarray[++lineno]->lineSpacing(); 191 ht += textarray[++lineno]->lineSpacing();
142 } 192 }
143 size_t startpos, startoffset, tgt; 193 size_t startpos, startoffset, tgt;
144 if (getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt)) 194 switch (getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt))
145 { 195 {
146 if (buffdoc.hyperlink(tgt)) 196 case eLink:
147 { 197 {
148 fillbuffer(); 198 size_t saveposn = pagelocate();
149 update(); 199 if (buffdoc.hyperlink(tgt))
200 {
201 buffdoc.saveposn(saveposn);
202 fillbuffer();
203 update();
204 }
205 else
206 {
207 locate(pagelocate());
208 }
209 return;
150 } 210 }
151 else 211 case ePicture:
152 { 212 {
153 locate(pagelocate()); 213 qDebug("Picture:%x", tgt);
214 QPixmap* pm = buffdoc.getPicture(tgt);
215 if (pm != NULL)
216 {
217 emit OnShowPicture(*pm);
218 delete pm;
219 }
220 else
221 {
222 locate(pagelocate());
223 }
224 return;
154 } 225 }
155 return; 226 case eNone:
227 break;
228 default:
229 qDebug("Unknown linktype");
230 return;
156 } 231 }
157 if (m_twotouch) 232 if (m_twotouch)
158 { 233 {
159 if (m_touchone) 234 if (m_touchone)
160 { 235 {
161 m_touchone = false; 236 m_touchone = false;
@@ -209,17 +284,18 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
209 } 284 }
210 } 285 }
211 else 286 else
212 { 287 {
213 CDrawBuffer* t = textarray[lineno]; 288 CDrawBuffer* t = textarray[lineno];
214 int first = 0; 289 int first = 0;
290 int tgt = _e->x() - t->offset(width());
215 while (1) 291 while (1)
216 { 292 {
217 int i = first+1; 293 int i = first+1;
218 while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; 294 while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
219 if (t->width(i) > _e->x()) 295 if (t->width(i) > tgt)
220 { 296 {
221 wrd = toQString(t->data()+first, i - first); 297 wrd = toQString(t->data()+first, i - first);
222 break; 298 break;
223 } 299 }
224 while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; 300 while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
225 if ((*t)[i] == 0) break; 301 if ((*t)[i] == 0) break;
@@ -279,14 +355,83 @@ void QTReader::goUp()
279 else 355 else
280 { 356 {
281 lineUp(); 357 lineUp();
282 } 358 }
283} 359}
284 360
361void QTReader::NavUp()
362{
363 buffdoc.unsuspend();
364 if (buffdoc.hasnavigation())
365 {
366/*
367 size_t target = pagelocate();
368 if (buffdoc.back(target))
369 {
370 locate(target);
371 }
372*/
373 locate(buffdoc.startSection());
374 }
375 else
376 {
377 goUp();
378 }
379}
380
381void QTReader::NavDown()
382{
383 buffdoc.unsuspend();
384 if (buffdoc.hasnavigation())
385 {
386/*
387 size_t target = pagelocate();
388 if (buffdoc.forward(target))
389 {
390 locate(target);
391 }
392*/
393 dopageup(buffdoc.endSection());
394 }
395 else
396 {
397 goDown();
398 }
399}
400
401void QTReader::zoomin()
402{
403 if (m_fontControl.increasesize())
404 {
405 bool sc = m_autoScroll;
406 setfont();
407 m_autoScroll = false;
408 locate(pagelocate());
409 update();
410 m_autoScroll = sc;
411 if (m_autoScroll) autoscroll();
412 }
413}
414
415void QTReader::zoomout()
416{
417 if (m_fontControl.decreasesize())
418 {
419 bool sc = m_autoScroll;
420 m_autoScroll = false;
421 setfont();
422 locate(pagelocate());
423 update();
424 m_autoScroll = sc;
425 if (m_autoScroll) autoscroll();
426 }
427}
428
285void QTReader::keyPressEvent(QKeyEvent* e) 429void QTReader::keyPressEvent(QKeyEvent* e)
286{ 430{
431 buffdoc.unsuspend();
287 switch (e->key()) 432 switch (e->key())
288 { 433 {
289 case Key_Down: 434 case Key_Down:
290 { 435 {
291 e->accept(); 436 e->accept();
292 if (m_autoScroll) 437 if (m_autoScroll)
@@ -354,42 +499,40 @@ void QTReader::keyPressEvent(QKeyEvent* e)
354 locate(pagelocate()); 499 locate(pagelocate());
355 update(); 500 update();
356 } 501 }
357 } 502 }
358 break; 503 break;
359 */ 504 */
360 case Key_Right: 505 case Key_Right:
361 { 506 {
362 e->accept(); 507 e->accept();
363 if (m_fontControl.increasesize()) 508 if (m_navkeys && buffdoc.hasnavigation())
364 { 509 {
365 bool sc = m_autoScroll; 510 size_t target = pagelocate();
366 setfont(); 511 if (buffdoc.forward(target))
367 m_autoScroll = false; 512 {
368 locate(pagelocate()); 513 locate(target);
369 update(); 514 }
370 m_autoScroll = sc; 515 }
371 if (m_autoScroll) autoscroll(); 516 else zoomin();
372 }
373 } 517 }
374 break; 518 break;
375 case Key_Left: 519 case Key_Left:
376 { 520 {
377 e->accept(); 521 e->accept();
378 if (m_fontControl.decreasesize()) 522 if (m_navkeys && buffdoc.hasnavigation())
379 { 523 {
380 bool sc = m_autoScroll; 524 size_t target = pagelocate();
381 m_autoScroll = false; 525 if (buffdoc.back(target))
382 setfont(); 526 {
383 locate(pagelocate()); 527 locate(target);
384 update(); 528 }
385 m_autoScroll = sc; 529 }
386 if (m_autoScroll) autoscroll(); 530 else zoomout();
387 }
388 } 531 }
389 break; 532 break;
390 case Key_Space: 533 case Key_Space:
391 case Key_Return: 534 case Key_Return:
392 { 535 {
393 e->accept(); 536 e->accept();
394 emit OnActionPressed(); 537 emit OnActionPressed();
395 } 538 }
@@ -406,20 +549,23 @@ void QTReader::setautoscroll(bool _sc)
406 { 549 {
407 m_autoScroll = false; 550 m_autoScroll = false;
408 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; 551 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
409 } 552 }
410 else 553 else
411 { 554 {
555 CDrawBuffer* reusebuffer = textarray[numlines];
556 if (reusebuffer == NULL || reusebuffer->eof()) return;
412 m_autoScroll = true; 557 m_autoScroll = true;
413 autoscroll(); 558 autoscroll();
414 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed 559 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed
415 } 560 }
416} 561}
417 562
418bool QTReader::getline(CDrawBuffer *buff) 563bool QTReader::getline(CDrawBuffer *buff)
419{ 564{
565 buffdoc.unsuspend();
420 if (m_bMonoSpaced) 566 if (m_bMonoSpaced)
421 { 567 {
422 return buffdoc.getline(buff ,width(), m_charWidth); 568 return buffdoc.getline(buff ,width(), m_charWidth);
423 } 569 }
424 else 570 else
425 { 571 {
@@ -456,23 +602,22 @@ void QTReader::doscroll()
456 { 602 {
457 m_scrolldy2 = 0; 603 m_scrolldy2 = 0;
458 numlines++; 604 numlines++;
459 605
460 if (textarray[numlines] == NULL) 606 if (textarray[numlines] == NULL)
461 { 607 {
462 textarray[numlines] = new CDrawBuffer; 608 textarray[numlines] = new CDrawBuffer(&m_fontControl);
463 } 609 }
464 locnarray[numlines] = locate(); 610 locnarray[numlines] = locate();
465 int ch = getline(textarray[numlines]); 611 int ch = getline(textarray[numlines]);
466 textarray[numlines-1]->render(&p, height() - textarray[numlines]->descent() - 2, m_bMonoSpaced, m_charWidth, width()); 612 textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - 2, m_bMonoSpaced, m_charWidth, width());
467 mylastpos = locate(); 613 mylastpos = locate();
468 if (!ch) 614 if (!ch)
469 { 615 {
470 m_autoScroll = false; 616 m_autoScroll = false;
471 ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); 617 ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll);
472 emit OnRedraw();
473 } 618 }
474 emit OnRedraw(); 619 emit OnRedraw();
475 } 620 }
476} 621}
477 622
478void QTReader::autoscroll() 623void QTReader::autoscroll()
@@ -489,84 +634,76 @@ void QTReader::setfont()
489 m_descent = m_fontControl.descent(); 634 m_descent = m_fontControl.descent();
490 m_linespacing = m_fontControl.lineSpacing(); 635 m_linespacing = m_fontControl.lineSpacing();
491} 636}
492 637
493void QTReader::drawFonts( QPainter *p ) 638void QTReader::drawFonts( QPainter *p )
494{ 639{
495 setfont(); 640 if (bDoUpdates)
496 if (m_lastwidth != width() || m_lastheight != height()) 641 {
497 { 642 qDebug("How refreshing...");
498 m_lastwidth = width(); 643 if (buffdoc.empty()) return;
499 m_lastheight = height(); 644 setfont();
500 locate(pagelocate()); 645 if (m_lastwidth != width())
501 } 646 {
502 else 647 qDebug("Not Optimised %d", m_lastwidth);
503 { 648 m_lastwidth = width();
504 649 m_lastheight = height();
505/* 650 locate(pagelocate());
506 int sl = screenlines(); 651 qDebug("Not Optimised %d", m_lastwidth);
507 if (sl < numlines) 652 }
508 { 653 else
509 //qDebug("df:<%u,%u>",sl,numlines); 654 {
510 655 if (m_lastheight > height())
511 size_t newpos = locnarray[sl]; 656 {
512 CDrawBuffer** nta = new CDrawBuffer*[sl]; 657 qDebug("Optimised < %d", numlines);
513 size_t* nla = new size_t[sl]; 658 int ypos = 0;
514 for (int i = 0; i < sl; i++) 659 for (int i = 0; i < numlines; i++)
515 { 660 {
516 nta[i] = textarray[i]; 661 if ((ypos += textarray[i]->lineSpacing()) > height())
517 nla[i] = locnarray[i]; 662 {
518 } 663 numlines = i;
519 for (int i = sl; i < numlines; i++) delete textarray[i]; 664 jumpto(locnarray[i+1]);
520 delete [] locnarray; 665 break;
521 delete [] textarray; 666 }
522 textarray = nta; 667 }
523 locnarray = nla; 668 qDebug("Optimised < %d", numlines);
524 numlines = sl; 669 m_lastheight = height();
525 jumpto(mylastpos = newpos); 670 }
526 } 671 else if (m_lastheight < height())
527 if (sl > numlines) 672 {
528 { 673 qDebug("Optimised > %d", numlines);
529 //qDebug("df:<%u,%u>",sl,numlines); 674 int ypos = 0;
530 CDrawBuffer** nta = new CDrawBuffer*[sl]; 675 for (int i = 0; i <= numlines; i++)
531 size_t* nla = new size_t[sl]; 676 {
532 for (int i = 0; i < numlines; i++) 677 ypos += textarray[i]->lineSpacing();
533 { 678 }
534 nta[i] = textarray[i]; 679 fillbuffer(numlines+1, ypos);
535 nla[i] = locnarray[i]; 680 qDebug("Optimised > %d", numlines);
536 } 681 m_lastheight = height();
537 if (locate() != mylastpos) jumpto(mylastpos); 682 }
538 for (int i = numlines; i < sl; i++) 683 if (numlines > 0)
539 { 684 {
540 nta[i] = new CDrawBuffer(&m_fontControl); 685 int ypos = textarray[0]->ascent();
541 nla[i] = locate(); 686 textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width());
542 getline(nta[i]); 687 for (int i = 1; i < numlines; i++)
543 } 688 {
544 mylastpos = locate(); 689 // ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2;
545 delete [] locnarray; 690 ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+
546 delete [] textarray; 691 (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2;
547 textarray = nta; 692 textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, width());
548 locnarray = nla; 693 }
549 numlines = sl;
550 }
551*/
552 if (numlines > 0)
553 {
554 int ypos = textarray[0]->ascent();
555 textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width());
556 for (int i = 1; i < numlines; i++)
557 {
558 ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2;
559 textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, width());
560
561 }
562// mylastpos = locate(); 694// mylastpos = locate();
563 } 695 }
564 } 696 }
565 m_scrolldy1 = m_scrolldy2 = 0; 697 m_scrolldy1 = m_scrolldy2 = 0;
566 emit OnRedraw(); 698 emit OnRedraw();
699 }
700 else
701 {
702 qDebug("Not so refreshing...");
703 }
567} 704}
568 705
569QString QTReader::firstword() 706QString QTReader::firstword()
570{ 707{
571 if (m_bMonoSpaced) 708 if (m_bMonoSpaced)
572 { 709 {
@@ -604,31 +741,32 @@ bool QTReader::ChangeFont(int tgt)
604} 741}
605 742
606void QTReader::init() 743void QTReader::init()
607{ 744{
608 // setCaption( "Qt Draw Demo Application" ); 745 // setCaption( "Qt Draw Demo Application" );
609 746
747 buffdoc.unsuspend();
610 setBackgroundColor( white ); 748 setBackgroundColor( white );
611// QPainter p(this); 749// QPainter p(this);
612// p.setBackgroundMode( Qt::OpaqueMode ); 750// p.setBackgroundMode( Qt::OpaqueMode );
613 buffdoc.setfilter(getfilter()); 751 buffdoc.setfilter(getfilter());
614 ChangeFont(m_textsize); 752 ChangeFont(m_textsize);
615 setFocusPolicy(QWidget::StrongFocus); 753 setFocusPolicy(QWidget::StrongFocus);
616 // resize( 240, 320 ); 754 // resize( 240, 320 );
617 //setFocus(); 755 //setFocus();
618 timer = new QTimer(this); 756 timer = new QTimer(this);
619 connect(timer, SIGNAL(timeout()), this, SLOT(doscroll())); 757 connect(timer, SIGNAL(timeout()), this, SLOT(doscroll()));
620// QMessageBox::information(this, "init", m_lastfile, 1); 758// QMessageBox::information(this, "init", m_lastfile, 1);
621 m_lastwidth = width();
622 m_lastheight = height();
623 setfont(); 759 setfont();
760/*
624 if (!m_lastfile.isEmpty()) 761 if (!m_lastfile.isEmpty())
625 { 762 {
626 m_string = DocLnk(m_lastfile).name(); 763 m_string = DocLnk(m_lastfile).name();
627 load_file(m_lastfile); 764 load_file(m_lastfile);
628 } 765 }
766*/
629} 767}
630 768
631// 769//
632// Clean up 770// Clean up
633// 771//
634QTReader::~QTReader() 772QTReader::~QTReader()
@@ -698,12 +836,13 @@ int main( int argc, tchar **argv )
698} 836}
699*/ 837*/
700 838
701 839
702bool QTReader::locate(unsigned long n) { 840bool QTReader::locate(unsigned long n) {
703 //printf("Locate\n"); 841 //printf("Locate\n");
842 buffdoc.unsuspend();
704 buffdoc.locate(n); 843 buffdoc.locate(n);
705 // qDebug("&buffdoc.located"); 844 // qDebug("&buffdoc.located");
706 fillbuffer(); 845 fillbuffer();
707 // qDebug("&Buffer filled"); 846 // qDebug("&Buffer filled");
708 update(); 847 update();
709 // qDebug("&Located"); 848 // qDebug("&Located");
@@ -716,32 +855,33 @@ unsigned int QTReader::screenlines()
716 // return (height()-m_descent)/(m_linespacing); 855 // return (height()-m_descent)/(m_linespacing);
717 return (height()-2)/(m_linespacing); 856 return (height()-2)/(m_linespacing);
718}; 857};
719 858
720bool QTReader::fillbuffer(int reuse, int ht) 859bool QTReader::fillbuffer(int reuse, int ht)
721{ 860{
861 buffdoc.unsuspend();
722 if (buffdoc.empty()) return false; 862 if (buffdoc.empty()) return false;
723 m_scrolldy1 = m_scrolldy2 = 0; 863 m_scrolldy1 = m_scrolldy2 = 0;
724 int ch; 864 int ch;
725 bool ret = false; 865 bool ret = false;
726 unsigned int oldpagepos = locnarray[reuse]; 866 unsigned int oldpagepos = locnarray[reuse];
727 int ypos = ht; 867 int ypos = ht;
728 numlines = reuse; 868 numlines = reuse;
729 while (ypos < height()) 869 while (ypos < height() || numlines < 2)
730 { 870 {
731 if (textarray[numlines] == NULL) 871 if (textarray[numlines] == NULL)
732 { 872 {
733 textarray[numlines] = new CDrawBuffer(&m_fontControl); 873 textarray[numlines] = new CDrawBuffer(&m_fontControl);
734 } 874 }
735 locnarray[numlines] = locate(); 875 locnarray[numlines] = locate();
736 int ch = getline(textarray[numlines]); 876 int ch = getline(textarray[numlines]);
737 ypos += textarray[numlines]->lineSpacing(); 877 ypos += textarray[numlines]->lineSpacing();
738 numlines++; 878 numlines++;
739 if (!ch) 879 if (!ch)
740 { 880 {
741 if (numlines - reuse == 1/* && locnarray[0] == buffdoc.locate()*/) 881 if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/)
742 { 882 {
743 locate(oldpagepos); 883 locate(oldpagepos);
744 return false; 884 return false;
745 } 885 }
746 else 886 else
747 { 887 {
@@ -758,28 +898,31 @@ bool QTReader::fillbuffer(int reuse, int ht)
758 return true; 898 return true;
759} 899}
760 900
761 901
762void QTReader::dopagedn() 902void QTReader::dopagedn()
763{ 903{
904 buffdoc.unsuspend();
764 int skip = 0, ypos = 0; 905 int skip = 0, ypos = 0;
765 if (locate() != mylastpos) 906 if (locate() != mylastpos)
766 { 907 {
767 //qDebug("Jumping to %u", mylastpos); 908 //qDebug("Jumping to %u", mylastpos);
768 jumpto(mylastpos); 909 jumpto(mylastpos);
769 } 910 }
770 CDrawBuffer* reusebuffer = textarray[numlines]; 911 CDrawBuffer* reusebuffer = textarray[numlines];
912 if (reusebuffer != NULL && reusebuffer->eof()) return;
771 if (reusebuffer != NULL) 913 if (reusebuffer != NULL)
772 { 914 {
773 for (int i = 0; i <= m_overlap; i++) 915 for (int i = 0; i <= m_overlap; i++)
774 { 916 {
775 int offset = numlines - m_overlap + i; 917 int offset = numlines - m_overlap + i;
776 reusebuffer = textarray[offset]; 918 reusebuffer = textarray[offset];
777 size_t reuselocn = locnarray[offset]; 919 size_t reuselocn = locnarray[offset];
778 textarray[offset] = textarray[i]; 920 textarray[offset] = textarray[i];
779 textarray[i] = reusebuffer; 921 textarray[i] = reusebuffer;
922 // reusebuffer->empty();
780 locnarray[offset] = locnarray[i]; 923 locnarray[offset] = locnarray[i];
781 locnarray[i] = reuselocn; 924 locnarray[i] = reuselocn;
782 ypos += textarray[i]->lineSpacing(); 925 ypos += textarray[i]->lineSpacing();
783 skip++; 926 skip++;
784 } 927 }
785 } 928 }
@@ -788,86 +931,119 @@ void QTReader::dopagedn()
788 update(); 931 update();
789 } 932 }
790} 933}
791 934
792void QTReader::dopageup() 935void QTReader::dopageup()
793{ 936{
937 buffdoc.unsuspend();
938 dopageup(locnarray[(m_overlap < numlines) ? m_overlap : numlines/2]);
939}
940
941void QTReader::dopageup(unsigned int target)
942{
943 buffdoc.unsuspend();
794 CBufferFace<CDrawBuffer*> buff; 944 CBufferFace<CDrawBuffer*> buff;
795 CBufferFace<size_t> loc; 945 CBufferFace<size_t> loc;
796 unsigned int target = locnarray[(m_overlap < numlines) ? m_overlap : numlines/2];
797 946
798 size_t delta; 947 size_t delta, guess = 2048;
799 if (target < 2048) 948 bool ch = true;
800 { 949 int nbfl, ypos = 0;
801 delta = target;
802 jumpto(0);
803 }
804 else
805 {
806 delta = 2048;
807 950
808 jumpto(target - delta); 951 while (1)
809 952 {
810 buff[0] = new CDrawBuffer(&m_fontControl); 953 ch = true;
811 954 nbfl = 0;
812 do 955 if (target < guess)
956 {
957 delta = 0; // 0 is a flag to say don't guess any more
958 jumpto( (m_continuousDocument) ? 0 : buffdoc.startSection() );
959 }
960 else if (!m_continuousDocument && (target - guess < buffdoc.startSection()))
961 {
962 delta = 0; // 0 is a flag to say don't guess any more
963 jumpto(buffdoc.startSection());
964 }
965 else
813 { 966 {
967 delta = guess;
814 968
815 if (!getline(buff[0])) break; 969 jumpto(target - delta);
816 970
817 if (locate() > target) continue; 971 buff[0] = new CDrawBuffer(&m_fontControl);
972
973 do
974 {
975
976 if (!getline(buff[0])) break;
977
978 if (locate() > target) break;
979 }
980 while (!buffdoc.iseol());
818 } 981 }
819 while (!buffdoc.iseol()); 982
820 } 983 ypos = 0;
821 int nbfl = 0; 984 while (locate() < target)
822 985 {
823 bool ch = true; 986 if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl);
824 int ypos = 0; 987 loc[nbfl] = locate();
825 while (locate() < target) 988 ch = getline(buff[nbfl]);
826 { 989 ypos += buff[nbfl]->lineSpacing();
827 if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); 990 nbfl++;
828 loc[nbfl] = locate(); 991 if (!ch) break;
829 ch = getline(buff[nbfl]); 992 }
830 ypos += buff[nbfl]->lineSpacing(); 993 if (ypos < height() && (delta != 0))
831 nbfl++; 994 {
832 if (!ch) break; 995 for (int i = 0; i < nbfl; i++)
833 } 996 {
834 if (ypos < height()) 997 delete buff[i];
835 { 998 buff[i] = NULL;
836 locate(0); 999 }
837 return; 1000 guess <<= 1;
1001 continue;
1002 }
1003 break;
838 } 1004 }
839 if (ch) 1005 if (ch)
840 { 1006 {
841 if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); 1007 if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl);
842 loc[nbfl] = locate(); 1008 loc[nbfl] = locate();
843 int ch = getline(buff[nbfl]); 1009 int ch = getline(buff[nbfl]);
844 nbfl++; 1010 nbfl++;
845 } 1011 }
846 ypos = 0; 1012 ypos = 0;
847 numlines = 0; 1013 numlines = 0;
848 while (ypos < height() && numlines <= nbfl-2) 1014 while (ypos < height() && numlines <= nbfl-1)
849 { 1015 {
850 ypos += buff[nbfl - numlines - 2]->lineSpacing(); 1016 ypos += buff[nbfl - numlines - 1]->lineSpacing();
851 numlines++; 1017 numlines++;
852 } 1018 }
853 --numlines; 1019 --numlines;
854 int offset = nbfl; 1020 int offset = nbfl-1;
855 offset -= numlines+1; 1021 offset -= numlines;
1022 ypos = 0;
856 for (int i = 0; i <= numlines; i++) 1023 for (int i = 0; i <= numlines; i++)
857 { 1024 {
858 delete textarray[i]; 1025 delete textarray[i];
859 textarray[i] = buff[offset+i]; 1026 textarray[i] = buff[offset+i];
860 locnarray[i] = loc[offset + i]; 1027 locnarray[i] = loc[offset + i];
1028 ypos += textarray[i]->lineSpacing();
861 } 1029 }
862 for (int i = 0; i < nbfl - numlines - 1; i++) 1030 for (int i = 0; i < nbfl - numlines - 1; i++)
863 { 1031 {
864 delete buff[i]; 1032 delete buff[i];
865 } 1033 }
866 1034
867// --numlines; 1035 while (ypos < height())
1036 {
1037 numlines++;
1038 locnarray[numlines] = locate();
1039 if (textarray[numlines] == NULL) textarray[numlines] = new CDrawBuffer(&m_fontControl);
1040 if (!getline(textarray[numlines])) break;
1041 ypos += textarray[numlines]->lineSpacing();
1042 }
1043
868 mylastpos = locate(); 1044 mylastpos = locate();
869 1045
870 update(); 1046 update();
871} 1047}
872 1048
873bool QTReader::load_file(const char *newfile, unsigned int _lcn) 1049bool QTReader::load_file(const char *newfile, unsigned int _lcn)
@@ -880,15 +1056,18 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
880 if (m_lastfile == newfile) 1056 if (m_lastfile == newfile)
881 { 1057 {
882 lcn = m_lastposn; 1058 lcn = m_lastposn;
883 } 1059 }
884 m_lastfile = newfile; 1060 m_lastfile = newfile;
885 // QMessageBox::information(0, "Opening...", newfile); 1061 // QMessageBox::information(0, "Opening...", newfile);
1062 m_lastwidth = width();
1063 m_lastheight = height();
886 if (buffdoc.openfile(this,newfile) == 0) 1064 if (buffdoc.openfile(this,newfile) == 0)
887 { 1065 {
888 bRC = true; 1066 bRC = true;
1067 buffdoc.setContinuous(m_continuousDocument);
889 // qDebug("buffdoc.openfile done"); 1068 // qDebug("buffdoc.openfile done");
890 locate(lcn); 1069 locate(lcn);
891 // qDebug("buffdoc.locate done"); 1070 // qDebug("buffdoc.locate done");
892 } 1071 }
893 setfilter(getfilter()); 1072 setfilter(getfilter());
894 update(); 1073 update();
@@ -1009,19 +1188,21 @@ void QTReader::lineUp()
1009 mylastpos = locate(); 1188 mylastpos = locate();
1010 update(); 1189 update();
1011} 1190}
1012*/ 1191*/
1013void QTReader::lineUp() 1192void QTReader::lineUp()
1014{ 1193{
1194 buffdoc.unsuspend();
1015 CDrawBuffer* buff = textarray[numlines]; 1195 CDrawBuffer* buff = textarray[numlines];
1016 unsigned int loc; 1196 unsigned int loc;
1017 unsigned int end = locnarray[numlines]; 1197 unsigned int end = locnarray[numlines];
1018 int cbptr = 0; 1198 int cbptr = 0;
1019 if (locate() != mylastpos) jumpto(mylastpos); 1199 if (locate() != mylastpos) jumpto(mylastpos);
1020 unsigned int target = locnarray[0]; 1200 unsigned int target = locnarray[0];
1021 if (target == 0) return; 1201 if (target == 0) return;
1202 if (!m_continuousDocument && (target == buffdoc.startSection())) return;
1022 if (buffdoc.hasrandomaccess()) 1203 if (buffdoc.hasrandomaccess())
1023 { 1204 {
1024 unsigned int delta = locate()-pagelocate(); 1205 unsigned int delta = locate()-pagelocate();
1025 if (delta < 64) delta = 64; 1206 if (delta < 64) delta = 64;
1026 do 1207 do
1027 { 1208 {
@@ -1031,12 +1212,20 @@ void QTReader::lineUp()
1031 delta = target; 1212 delta = target;
1032 jumpto(0); 1213 jumpto(0);
1033 loc = locate(); 1214 loc = locate();
1034 getline(buff); 1215 getline(buff);
1035 break; 1216 break;
1036 } 1217 }
1218 else if (!m_continuousDocument && (target - delta < buffdoc.startSection()))
1219 {
1220 delta = target-buffdoc.startSection();
1221 jumpto(buffdoc.startSection());
1222 loc = locate();
1223 getline(buff);
1224 break;
1225 }
1037 jumpto(target-delta); 1226 jumpto(target-delta);
1038 do 1227 do
1039 { 1228 {
1040 getline(buff); 1229 getline(buff);
1041#ifdef WS 1230#ifdef WS
1042 //printf("Trying:%s\n",buff[0]); 1231 //printf("Trying:%s\n",buff[0]);
@@ -1104,6 +1293,35 @@ MarkupType QTReader::PreferredMarkup()
1104 m = cHTML; 1293 m = cHTML;
1105 } 1294 }
1106 } 1295 }
1107 } 1296 }
1108 return m; 1297 return m;
1109} 1298}
1299
1300void QTReader::setstate(const statedata& sd)
1301{
1302 bstripcr = sd.bstripcr;
1303 btextfmt = sd.btextfmt;
1304 bautofmt = sd.bautofmt;
1305 bstriphtml = sd.bstriphtml;
1306 bpeanut = sd.bpeanut;
1307 bdehyphen = sd.bdehyphen;
1308 bonespace = sd.bonespace;
1309 bunindent = sd.bunindent;
1310 brepara = sd.brepara;
1311 bdblspce = sd.bdblspce;
1312 m_bpagemode = sd.m_bpagemode;
1313 m_navkeys = sd.m_navkeys;
1314 m_bMonoSpaced = sd.m_bMonoSpaced;
1315 bremap = sd.bremap;
1316 bmakebold = sd.bmakebold;
1317 m_continuousDocument = sd.Continuous;
1318#ifdef REPALM
1319 brepalm = sd.brepalm;
1320#endif
1321 bindenter = sd.bindenter;
1322 m_encd = sd.m_charpc;
1323 m_fontname = sd.m_fontname;
1324 setContinuous(sd.Continuous);
1325 ChangeFont(sd.m_textsize);
1326 refresh();
1327}