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.cpp1186
1 files changed, 630 insertions, 556 deletions
diff --git a/noncore/apps/opie-reader/QTReader.cpp b/noncore/apps/opie-reader/QTReader.cpp
index 6335ea2..e7bfc28 100644
--- a/noncore/apps/opie-reader/QTReader.cpp
+++ b/noncore/apps/opie-reader/QTReader.cpp
@@ -10,2 +10,3 @@
10 10
11#include <qpainter.h>
11#include "config.h" 12#include "config.h"
@@ -13,2 +14,3 @@
13#include "QTReaderApp.h" 14#include "QTReaderApp.h"
15#include "CDrawBuffer.h"
14#include <qpe/qpeapplication.h> 16#include <qpe/qpeapplication.h>
@@ -38,12 +40,15 @@ QTReader::QTReader( QWidget *parent=0, const char *name=0, WFlags f = 0) :
38 m_delay(100), 40 m_delay(100),
39 m_scrolldy(0), 41 m_scrolldy1(0),
42 m_scrolldy2(0),
40 m_autoScroll(false), 43 m_autoScroll(false),
41 textarray(NULL), 44 //textarray(NULL),
42 locnarray(NULL), 45 //locnarray(NULL),
43 numlines(0), 46 numlines(0),
44 m_fontname("unifont"), 47 m_fontname("unifont"),
45 m_fm(NULL) 48 m_fm(NULL),
49 mouseUpOn(true),
50 m_twotouch(true),
51 m_touchone(true)
46{ 52{
47 m_overlap = 1; 53 m_overlap = 1;
48 fontsizes = NULL;
49// init(); 54// init();
@@ -76,49 +81,159 @@ long QTReader::real_delay()
76 81
77void QTReader::mouseReleaseEvent( QMouseEvent* _e ) 82void QTReader::mousePressEvent( QMouseEvent* _e )
78//void QTReader::mouseDoubleClickEvent( QMouseEvent* _e )
79{ 83{
80 if (textarray != NULL) 84 if (_e->button() == RightButton)
81 { 85 {
82// printf("(%u, %u)\n", _e->x(), _e->y()); 86 mouseUpOn = false;
83 QString wrd = QString::null; 87 if (_e->y() > height()/2)
84 int lineno = _e->y()/m_linespacing; 88 {
85 if (m_bMonoSpaced) 89 goDown();
86 { 90 }
87 int chno = _e->x()/m_charWidth; 91 else
88 if (chno < ustrlen(textarray[lineno]->data())) 92 {
89 { 93 goUp();
90 wrd[0] = textarray[lineno]->data()[chno]; 94 }
91 } 95 }
92 } 96}
93 else 97
94 { 98bool QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt)
95 CBuffer* t = textarray[lineno]; 99{
96 int first = 0; 100 int lineno = 0;
97 while (1) 101 int ht = textarray[0]->lineSpacing();
98 { 102 while ((ht < y) && (lineno < numlines))
99 int i = first+1;
100// while ((*t)[i] != ' ' && (*t)[i] != 0) i++;
101 while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
102 if (m_fm->width(toQString(t->data()), i) > _e->x())
103 { 103 {
104 wrd = toQString(t->data()+first, i - first); 104 ht += textarray[++lineno]->lineSpacing();
105 break;
106 } 105 }
107// while ((*t)[i] == ' ' && (*t)[i] != 0) i++; 106 start = locnarray[lineno];
108 while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; 107 if (m_bMonoSpaced)
109 if ((*t)[i] == 0) break; 108 {
110 first = i; 109 offset = x/m_charWidth;
111 } 110 }
112 } 111 else
113 if (!wrd.isEmpty()) 112 {
114 { 113 int i;
115 QClipboard* cb = QApplication::clipboard(); 114 CDrawBuffer* t = textarray[lineno];
116 cb->setText(wrd); 115 for (i = t->length(); t->width(i) > x; i--);
117 Global::statusMessage(wrd); 116 offset = i;
118 if (!m_targetapp.isEmpty() && !m_targetmsg.isEmpty()) 117 }
119 { 118 return textarray[lineno]->isLink(offset, tgt);
120 QCopEnvelope e(("QPE/Application/"+m_targetapp).utf8(), (m_targetmsg+"(QString)").utf8()); 119}
121 e << wrd; 120
122 } 121void QTReader::setTwoTouch(bool _b)
123 } 122{
123 setBackgroundColor( white );
124 m_twotouch = m_touchone = _b;
125}
126
127void QTReader::mouseReleaseEvent( QMouseEvent* _e )
128{
129 if (_e->button() == LeftButton)
130 {
131 if (mouseUpOn)
132 {
133 if (textarray[0] != NULL)
134 {
135 QString wrd, line;
136 // int lineno = _e->y()/m_linespacing;
137 int lineno = 0;
138 int ht = textarray[0]->lineSpacing();
139 while ((ht < _e->y()) && (lineno < numlines))
140 {
141 ht += textarray[++lineno]->lineSpacing();
142 }
143 size_t startpos, startoffset, tgt;
144 if (getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt))
145 {
146 if (buffdoc.hyperlink(tgt))
147 {
148 fillbuffer();
149 update();
150 }
151 else
152 {
153 locate(pagelocate());
154 }
155 return;
156 }
157 if (m_twotouch)
158 {
159 if (m_touchone)
160 {
161 m_touchone = false;
162 m_startpos = startpos;
163 m_startoffset = startoffset;
164 setBackgroundColor( lightGray );
165 }
166 else
167 {
168 m_touchone = true;
169 setBackgroundColor( white );
170 size_t endpos, endoffset;
171 endpos = startpos;
172 endoffset = startoffset;
173 size_t currentpos = locate();
174 if (endpos >= m_startpos)
175 {
176 jumpto(m_startpos);
177 for (int i = 0; i < m_startoffset; i++)
178 {
179 getch();
180 }
181 if (m_startpos == endpos)
182 {
183 for (int i = m_startoffset; i <= endoffset; i++)
184 {
185 wrd += QChar(getch());
186 }
187 }
188 else
189 {
190 while (buffdoc.explocate() <= endpos)
191 {
192 wrd += QChar(getch());
193 }
194 for (int i = 0; i < endoffset; i++)
195 {
196 wrd += QChar(getch());
197 }
198 }
199 jumpto(currentpos);
200 }
201 }
202 }
203 else if (m_bMonoSpaced)
204 {
205 int chno = _e->x()/m_charWidth;
206 if (chno < ustrlen(textarray[lineno]->data()))
207 {
208 wrd[0] = textarray[lineno]->data()[chno];
209 }
210 }
211 else
212 {
213 CDrawBuffer* t = textarray[lineno];
214 int first = 0;
215 while (1)
216 {
217 int i = first+1;
218 while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
219 if (t->width(i) > _e->x())
220 {
221 wrd = toQString(t->data()+first, i - first);
222 break;
223 }
224 while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
225 if ((*t)[i] == 0) break;
226 first = i;
227 }
228 }
229 if (!wrd.isEmpty())
230 {
231 emit OnWordSelected(wrd, locnarray[lineno], (m_twotouch) ? wrd : toQString(textarray[lineno]->data()));
232 }
233 }
234 }
235 else
236 {
237 mouseUpOn = true;
238 }
124 } 239 }
@@ -136,4 +251,4 @@ void QTReader::focusOutEvent(QFocusEvent* e)
136 { 251 {
137 timer->stop(); 252 timer->stop();
138 m_scrolldy = 0; 253 m_scrolldy1 = m_scrolldy2 = 0;
139 } 254 }
@@ -149,3 +264,3 @@ void QTReader::goDown()
149 { 264 {
150 dopagedn(); 265 dopagedn();
151 } 266 }
@@ -153,3 +268,3 @@ void QTReader::goDown()
153 { 268 {
154 lineDown(); 269 lineDown();
155 } 270 }
@@ -161,3 +276,3 @@ void QTReader::goUp()
161 { 276 {
162 dopageup(); 277 dopageup();
163 } 278 }
@@ -165,3 +280,3 @@ void QTReader::goUp()
165 { 280 {
166 lineUp(); 281 lineUp();
167 } 282 }
@@ -174,42 +289,42 @@ void QTReader::keyPressEvent(QKeyEvent* e)
174 case Key_Down: 289 case Key_Down:
175 { 290 {
176 e->accept(); 291 e->accept();
177 if (m_autoScroll) 292 if (m_autoScroll)
178 { 293 {
179 if (m_delay < 59049) 294 if (m_delay < 59049)
180 { 295 {
181 m_delay = (3*m_delay)/2; 296 m_delay = (3*m_delay)/2;
182 timer->changeInterval(real_delay()); 297 timer->changeInterval(real_delay());
183 } 298 }
184 else 299 else
185 { 300 {
186 m_delay = 59049; 301 m_delay = 59049;
187 } 302 }
188 } 303 }
189 else 304 else
190 { 305 {
191 goDown(); 306 goDown();
192 } 307 }
193 } 308 }
194 break; 309 break;
195 case Key_Up: 310 case Key_Up:
196 { 311 {
197 e->accept(); 312 e->accept();
198 if (m_autoScroll) 313 if (m_autoScroll)
199 { 314 {
200 if (m_delay > 1024) 315 if (m_delay > 1024)
201 { 316 {
202 m_delay = (2*m_delay)/3; 317 m_delay = (2*m_delay)/3;
203 timer->changeInterval(real_delay()); 318 timer->changeInterval(real_delay());
204 } 319 }
205 else 320 else
206 { 321 {
207 m_delay = 1024; 322 m_delay = 1024;
208 } 323 }
209 } 324 }
210 else 325 else
211 { 326 {
212 goUp(); 327 goUp();
213 } 328 }
214 } 329 }
215 break; 330 break;
@@ -217,27 +332,27 @@ void QTReader::keyPressEvent(QKeyEvent* e)
217 case Key_Left: 332 case Key_Left:
218 { 333 {
219 e->accept(); 334 e->accept();
220 if (m_textfont > 0) 335 if (m_textfont > 0)
221 { 336 {
222 m_textfont--; 337 m_textfont--;
223 setfont(NULL); 338 setfont(NULL);
224 locate(pagelocate()); 339 locate(pagelocate());
225 update(); 340 update();
226 } 341 }
227 } 342 }
228 break; 343 break;
229 case Key_Right: 344 case Key_Right:
230 { 345 {
231 e->accept(); 346 e->accept();
232 if (fonts[++m_textfont] == 0) 347 if (fonts[++m_textfont] == 0)
233 { 348 {
234 m_textfont--; 349 m_textfont--;
235 } 350 }
236 else 351 else
237 { 352 {
238 setfont(NULL); 353 setfont(NULL);
239 locate(pagelocate()); 354 locate(pagelocate());
240 update(); 355 update();
241 } 356 }
242 } 357 }
243 break; 358 break;
@@ -245,47 +360,40 @@ void QTReader::keyPressEvent(QKeyEvent* e)
245 case Key_Right: 360 case Key_Right:
246 { 361 {
247 e->accept(); 362 e->accept();
248 if (fontsizes[++m_textsize] == 0) 363 if (m_fontControl.increasesize())
249 { 364 {
250 m_textsize--; 365 bool sc = m_autoScroll;
251 } 366 setfont();
252 else 367 m_autoScroll = false;
253 { 368 locate(pagelocate());
254 bool sc = m_autoScroll; 369 update();
255 m_autoScroll = false; 370 m_autoScroll = sc;
256 setfont(NULL); 371 if (m_autoScroll) autoscroll();
257 locate(pagelocate()); 372 }
258 update(); 373 }
259 m_autoScroll = sc;
260 if (m_autoScroll) autoscroll();
261 }
262 }
263 break; 374 break;
264 case Key_Left: 375 case Key_Left:
265 { 376 {
266 e->accept(); 377 e->accept();
267 if (m_textsize > 0) 378 if (m_fontControl.decreasesize())
268 { 379 {
269 bool sc = m_autoScroll; 380 bool sc = m_autoScroll;
270 m_autoScroll = false; 381 m_autoScroll = false;
271 m_textsize--; 382 setfont();
272 setfont(NULL); 383 locate(pagelocate());
273 locate(pagelocate()); 384 update();
274 update(); 385 m_autoScroll = sc;
275 m_autoScroll = sc; 386 if (m_autoScroll) autoscroll();
276 if (m_autoScroll) autoscroll(); 387 }
277 } 388 }
278 }
279 break; 389 break;
280 case Key_Space: 390 case Key_Space:
281// case Key_Enter: 391 case Key_Return:
282 case Key_Return: 392 {
283 { 393 e->accept();
284 e->accept(); 394 emit OnActionPressed();
285 setautoscroll(!m_autoScroll); 395 }
286 ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); 396 break;
287 } 397 default:
288 break; 398 e->ignore();
289 default:
290 e->ignore();
291 } 399 }
@@ -298,8 +406,10 @@ void QTReader::setautoscroll(bool _sc)
298 { 406 {
299 m_autoScroll = false; 407 m_autoScroll = false;
300 } 408 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
409 }
301 else 410 else
302 { 411 {
303 m_autoScroll = true; 412 m_autoScroll = true;
304 autoscroll(); 413 autoscroll();
414 QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed
305 } 415 }
@@ -307,3 +417,3 @@ void QTReader::setautoscroll(bool _sc)
307 417
308bool QTReader::getline(CBuffer *buff) 418bool QTReader::getline(CDrawBuffer *buff)
309{ 419{
@@ -311,3 +421,3 @@ bool QTReader::getline(CBuffer *buff)
311 { 421 {
312 return buffdoc.getline(buff ,width(), m_charWidth); 422 return buffdoc.getline(buff ,width(), m_charWidth);
313 } 423 }
@@ -315,3 +425,3 @@ bool QTReader::getline(CBuffer *buff)
315 { 425 {
316 return buffdoc.getline(buff, width()); 426 return buffdoc.getline(buff, width());
317 } 427 }
@@ -323,4 +433,4 @@ void QTReader::doscroll()
323 { 433 {
324 timer->stop(); 434 timer->stop();
325 return; 435 return;
326 } 436 }
@@ -332,44 +442,34 @@ void QTReader::doscroll()
332 442
333 if (++m_scrolldy == m_linespacing) 443 if (++m_scrolldy1 == textarray[0]->lineSpacing())
334 {
335 setfont(&p);
336 m_scrolldy = 0;
337// qDrawPlainRect(&p,0,height() - m_linespacing,width(),m_linespacing,white,1,&b);
338 pagepos = locnarray[1];
339 CBuffer* buff = textarray[0];
340 for (int i = 1; i < numlines; i++)
341 {
342 textarray[i-1] = textarray[i];
343 locnarray[i-1] = locnarray[i];
344 }
345 locnarray[numlines-1] = locate();
346 if (getline(buff))
347 {
348 textarray[numlines-1] = buff;
349 drawText( p, 0, height() - m_descent - 2, buff->data());
350 mylastpos = locate();
351 }
352 else
353 {
354// (*buff)[0] = '\0';
355 textarray[numlines-1] = buff;
356 m_autoScroll = false;
357 ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll);
358 }
359 }
360}
361
362void QTReader::drawText(QPainter& p, int x, int y, tchar* _text)
363{
364 QString text = toQString(_text);
365 if (m_bMonoSpaced)
366 { 444 {
367 for (int i = 0; i < text.length(); i++) 445 CDrawBuffer* buff = textarray[0];
368 { 446 for (int i = 1; i <= numlines; i++)
369 p.drawText( x+i*m_charWidth, y, QString(text[i]) ); 447 {
370 } 448 textarray[i-1] = textarray[i];
449 locnarray[i-1] = locnarray[i];
450 }
451 textarray[numlines] = buff;
452 --numlines;
453 m_scrolldy1 = 0;
371 } 454 }
372 else 455 if (++m_scrolldy2 == textarray[numlines]->lineSpacing())
373 { 456 {
374 p.drawText( x, y, text ); 457 m_scrolldy2 = 0;
458 numlines++;
459
460 if (textarray[numlines] == NULL)
461 {
462 textarray[numlines] = new CDrawBuffer;
463 }
464 locnarray[numlines] = locate();
465 int ch = getline(textarray[numlines]);
466 textarray[numlines-1]->render(&p, height() - textarray[numlines]->descent() - 2, m_bMonoSpaced, m_charWidth, width());
467 mylastpos = locate();
468 if (!ch)
469 {
470 m_autoScroll = false;
471 ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll);
472 emit OnRedraw();
473 }
474 emit OnRedraw();
375 } 475 }
@@ -382,24 +482,10 @@ void QTReader::autoscroll()
382 482
383void QTReader::setfont(QPainter* p) 483void QTReader::setfont()
384{ 484{
385 // qDebug("Fontsize = %u",fontsizes[m_textsize]); 485// m_fontControl.Change
386 // qDebug("SetFont %x",p); 486 m_charWidth = (m_charpc*m_fontControl.currentsize())/100;
387 QFont font(m_fontname, fontsizes[m_textsize], (m_bBold) ? QFont::Bold : QFont::Normal );
388 m_charWidth = (m_charpc*fontsizes[m_textsize])/100;
389 if (m_charWidth <= 0) m_charWidth = 1; 487 if (m_charWidth <= 0) m_charWidth = 1;
390// font.setFixedPitch(m_bMonoSpaced); 488 m_ascent = m_fontControl.ascent();
391// qDebug("Raw name = %s", (const char*)font.rawName()); 489 m_descent = m_fontControl.descent();
392 if (p != NULL) p->setFont( font ); 490 m_linespacing = m_fontControl.lineSpacing();
393 if (m_fm == NULL)
394 {
395 m_fm = new QFontMetrics(font);
396 buffdoc.setfm(m_fm);
397 }
398 else
399 {
400 *m_fm = QFontMetrics(font);
401 }
402 m_ascent = m_fm->ascent();
403 m_descent = m_fm->descent();
404 m_linespacing = m_fm->lineSpacing();
405} 491}
@@ -408,7 +494,8 @@ void QTReader::drawFonts( QPainter *p )
408{ 494{
409 setfont(p); 495 setfont();
410 if (m_lastwidth != width()) 496 if (m_lastwidth != width() || m_lastheight != height())
411 { 497 {
412 m_lastwidth = width(); 498 m_lastwidth = width();
413 locate(pagepos); 499 m_lastheight = height();
500 locate(pagelocate());
414 } 501 }
@@ -416,2 +503,4 @@ void QTReader::drawFonts( QPainter *p )
416 { 503 {
504
505/*
417 int sl = screenlines(); 506 int sl = screenlines();
@@ -419,20 +508,19 @@ void QTReader::drawFonts( QPainter *p )
419 { 508 {
420// qDebug("df:<%u,%u>",sl,numlines); 509 //qDebug("df:<%u,%u>",sl,numlines);
421 510
422 size_t newpos = locnarray[sl]; 511 size_t newpos = locnarray[sl];
423 CBuffer** nta = new CBuffer*[sl]; 512 CDrawBuffer** nta = new CDrawBuffer*[sl];
424 size_t* nla = new size_t[sl]; 513 size_t* nla = new size_t[sl];
425 for (int i = 0; i < sl; i++) 514 for (int i = 0; i < sl; i++)
426 { 515 {
427 nta[i] = textarray[i]; 516 nta[i] = textarray[i];
428 nla[i] = locnarray[i]; 517 nla[i] = locnarray[i];
429 } 518 }
430 for (int i = sl; i < numlines; i++) delete textarray[i]; 519 for (int i = sl; i < numlines; i++) delete textarray[i];
431 delete [] textarray; 520 delete [] locnarray;
432 delete [] locnarray; 521 delete [] textarray;
433 textarray = nta; 522 textarray = nta;
434 locnarray = nla; 523 locnarray = nla;
435 numlines = sl; 524 numlines = sl;
436 jumpto(mylastpos = newpos); 525 jumpto(mylastpos = newpos);
437// locate(pagepos);
438 } 526 }
@@ -440,46 +528,40 @@ void QTReader::drawFonts( QPainter *p )
440 { 528 {
441// qDebug("df:<%u,%u>",sl,numlines); 529 //qDebug("df:<%u,%u>",sl,numlines);
442 CBuffer** nta = new CBuffer*[sl]; 530 CDrawBuffer** nta = new CDrawBuffer*[sl];
443 size_t* nla = new size_t[sl]; 531 size_t* nla = new size_t[sl];
444 for (int i = 0; i < numlines; i++) 532 for (int i = 0; i < numlines; i++)
445 { 533 {
446 nta[i] = textarray[i]; 534 nta[i] = textarray[i];
447 nla[i] = locnarray[i]; 535 nla[i] = locnarray[i];
448 } 536 }
449 if (locate() != mylastpos) jumpto(mylastpos); 537 if (locate() != mylastpos) jumpto(mylastpos);
450 for (int i = numlines; i < sl; i++) 538 for (int i = numlines; i < sl; i++)
451 { 539 {
452 nta[i] = new CBuffer; 540 nta[i] = new CDrawBuffer(&m_fontControl);
453 nla[i] = locate(); 541 nla[i] = locate();
454 getline(nta[i]); 542 getline(nta[i]);
455 } 543 }
456 mylastpos = locate(); 544 mylastpos = locate();
457 delete [] textarray; 545 delete [] locnarray;
458 delete [] locnarray; 546 delete [] textarray;
459 textarray = nta; 547 textarray = nta;
460 locnarray = nla; 548 locnarray = nla;
461 numlines = sl; 549 numlines = sl;
462 } 550 }
463 int ypos = (btight) ? 0 : m_ascent-m_linespacing; 551*/
464 // int linespacing = (tight) ? m_ascent : m_ascent+m_descent; 552 if (numlines > 0)
465 for (int i = 0; i < numlines; i++) 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++)
466 { 557 {
467 drawText( *p, 0, ypos += m_linespacing, textarray[i]->data()); 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();
468 } 563 }
469 /*
470
471
472
473 int nlines = height()/(fontmetric.ascent()+fontmetric.descent());
474 tchar buffer[1024];
475 for (int i = 0; i < nlines; i++)
476 {
477 y += fontmetric.ascent();
478 sprintf(buffer, "%d:%d:%s[%d]:Lines %d:%s", i+1, m_textfont, fonts[m_textfont], m_fs, nlines, (const tchar*)m_string);
479 drawText( *p, 0, y, buffer );
480 y += fontmetric.descent();
481 }
482 */
483 } 564 }
484 m_scrolldy = 0; 565 m_scrolldy1 = m_scrolldy2 = 0;
566 emit OnRedraw();
485} 567}
@@ -490,3 +572,3 @@ QString QTReader::firstword()
490 { 572 {
491 return toQString(textarray[0]->data()); 573 return toQString(textarray[0]->data());
492 } 574 }
@@ -494,19 +576,19 @@ QString QTReader::firstword()
494 { 576 {
495 int start, end, len, j; 577 int start, end, len, j;
496 for (j = 0; j < numlines; j++) 578 for (j = 0; j < numlines; j++)
497 { 579 {
498 len = textarray[j]->length(); 580 len = textarray[j]->length();
499 for (start = 0; start < len && !isalpha((*textarray[j])[start]); start++); 581 for (start = 0; start < len && !isalpha((*textarray[j])[start]); start++);
500 if (start < len) break; 582 if (start < len) break;
501 } 583 }
502 if (j < numlines) 584 if (j < numlines)
503 { 585 {
504 QString ret = ""; 586 QString ret = "";
505 for (end = start; end < len && isalpha((*textarray[j])[end]); end++) 587 for (end = start; end < len && isalpha((*textarray[j])[end]); end++)
506 ret += (*textarray[j])[end]; 588 ret += (*textarray[j])[end];
507 if (ret.isEmpty()) ret = "Current position"; 589 if (ret.isEmpty()) ret = "Current position";
508 return ret; 590 return ret;
509 } 591 }
510 else 592 else
511 return "Current position"; 593 return "Current position";
512 } 594 }
@@ -518,40 +600,5 @@ QString QTReader::firstword()
518 600
519void QTReader::ChangeFont(int tgt) 601bool QTReader::ChangeFont(int tgt)
520{ 602{
521 603 return m_fontControl.ChangeFont(m_fontname, tgt);
522 QValueList<int>::Iterator it;
523
524// QValueList<int> sizes = QFontDatabase::pointSizes(m_fontname, (m_bBold) ? QFont::Bold : QFont::Normal);
525 QFontDatabase fdb;
526/*
527 QStringList styles = fdb.styles(m_fontname);
528 for ( QStringList::Iterator it = styles.begin(); it != styles.end(); ++it )
529 {
530 printf( "%s \n", (*it).latin1() );
531 }
532*/
533 QValueList<int> sizes = fdb.pointSizes(m_fontname, (m_bBold) ? QString("Bold") : QString::null);
534 uint n = sizes.count();
535 if (fontsizes != NULL) delete [] fontsizes;
536 fontsizes = new unsigned int[n+1];
537 uint i = 0;
538 uint best = 0;
539 for (it = sizes.begin(); it != sizes.end(); it++)
540 {
541 fontsizes[i] = (*it)/10;
542 if (abs(tgt-fontsizes[i]) < abs(tgt-fontsizes[best]))
543 {
544 best = i;
545 }
546 i++;
547 }
548 m_textsize = best;
549 fontsizes[i] = 0;
550 setfont(NULL);
551 QFont font(m_fontname, fontsizes[m_textsize], (m_bBold) ? QFont::Bold : QFont::Normal );
552 if (m_fm == NULL)
553 {
554 m_fm = new QFontMetrics(font);
555 buffdoc.setfm(m_fm);
556 }
557} 604}
@@ -567,3 +614,3 @@ void QTReader::init()
567 ChangeFont(m_textsize); 614 ChangeFont(m_textsize);
568 // setFocusPolicy(QWidget::StrongFocus); 615 setFocusPolicy(QWidget::StrongFocus);
569 // resize( 240, 320 ); 616 // resize( 240, 320 );
@@ -574,6 +621,8 @@ void QTReader::init()
574 m_lastwidth = width(); 621 m_lastwidth = width();
622 m_lastheight = height();
623 setfont();
575 if (!m_lastfile.isEmpty()) 624 if (!m_lastfile.isEmpty())
576 { 625 {
577 m_string = DocLnk(m_lastfile).name(); 626 m_string = DocLnk(m_lastfile).name();
578 load_file(m_lastfile); 627 load_file(m_lastfile);
579 } 628 }
@@ -586,6 +635,2 @@ QTReader::~QTReader()
586{ 635{
587 if (fontsizes != NULL) delete [] fontsizes;
588#ifndef QT_NO_PRINTER
589 // delete printer;
590#endif
591} 636}
@@ -674,57 +719,41 @@ unsigned int QTReader::screenlines()
674 719
675bool QTReader::fillbuffer() { 720bool QTReader::fillbuffer(int reuse, int ht)
676 if (buffdoc.empty()) return false; 721{
677 //printf("Fillbuffer\n"); 722 if (buffdoc.empty()) return false;
678 m_scrolldy = 0; 723 m_scrolldy1 = m_scrolldy2 = 0;
679 int ch; 724 int ch;
680 bool ret = false; 725 bool ret = false;
681 int delta = screenlines(); 726 unsigned int oldpagepos = locnarray[reuse];
682 // qDebug("fillbuffer:%u-%u",delta,numlines); 727 int ypos = ht;
683 if (delta != numlines) 728 numlines = reuse;
684 { 729 while (ypos < height())
685 if (textarray != NULL)
686 {
687 for (int i = 0; i < numlines; i++) delete textarray[i];
688 delete [] textarray;
689 delete [] locnarray;
690 }
691 numlines = delta;
692 textarray = new CBuffer*[numlines];
693 locnarray = new size_t[numlines];
694 for (int i = 0; i < numlines; i++) textarray[i] = new CBuffer;
695 }
696 // qDebug("fillbuffer:pagepos:%u",pagepos);
697 unsigned int oldpagepos = pagepos;
698// if (textarray != NULL)
699// pagepos = locnarray[0];
700// else
701 pagepos = locate();
702 for (int i = 0; i < delta; i++)
703 { 730 {
704 locnarray[i] = locate(); 731 if (textarray[numlines] == NULL)
705 ch = getline(textarray[i]); 732 {
706 // if (ch == EOF) { 733 textarray[numlines] = new CDrawBuffer(&m_fontControl);
707 if (!ch) 734 }
708 { 735 locnarray[numlines] = locate();
709 if (i == 0) 736 int ch = getline(textarray[numlines]);
710 { 737 ypos += textarray[numlines]->lineSpacing();
711 locate(oldpagepos); 738 numlines++;
712 return false; 739 if (!ch)
713 } 740 {
714 else 741 if (numlines - reuse == 1/* && locnarray[0] == buffdoc.locate()*/)
715 { 742 {
716 ret = true; 743 locate(oldpagepos);
717 for (int j = i+1; j < delta; j++) 744 return false;
718 { 745 }
719 locnarray[j] = locnarray[j-1]; 746 else
720 (*(textarray[j]))[0] = '\0'; 747 {
721 } 748 --numlines;
722 break; 749 mylastpos = locate();
723 } 750 return true;
724 } 751 }
725 if (ch == '\012') ret = true; 752 }
726 } 753 }
727 mylastpos = locate(); 754
728 // qDebug("fillbuffer:lastpos:%u",mylastpos); 755 --numlines;
729 return true; 756 mylastpos = locate();
757
758 return true;
730} 759}
@@ -734,14 +763,27 @@ void QTReader::dopagedn()
734{ 763{
735 if (m_overlap == 0) 764 int skip = 0, ypos = 0;
765 if (locate() != mylastpos)
736 { 766 {
737 if (locate() != mylastpos) jumpto(mylastpos); 767 //qDebug("Jumping to %u", mylastpos);
768 jumpto(mylastpos);
738 } 769 }
739 else 770 CDrawBuffer* reusebuffer = textarray[numlines];
771 if (reusebuffer != NULL)
740 { 772 {
741 if (m_overlap >= screenlines()) m_overlap = screenlines()/2; 773 for (int i = 0; i <= m_overlap; i++)
742 jumpto(locnarray[screenlines()-m_overlap]); 774 {
775 int offset = numlines - m_overlap + i;
776 reusebuffer = textarray[offset];
777 size_t reuselocn = locnarray[offset];
778 textarray[offset] = textarray[i];
779 textarray[i] = reusebuffer;
780 locnarray[offset] = locnarray[i];
781 locnarray[i] = reuselocn;
782 ypos += textarray[i]->lineSpacing();
783 skip++;
784 }
743 } 785 }
744 if (fillbuffer()) 786 if (fillbuffer(skip, ypos))
745 { 787 {
746 update(); 788 update();
747 } 789 }
@@ -751,82 +793,78 @@ void QTReader::dopageup()
751{ 793{
752 CBuffer** buff = textarray; 794 CBufferFace<CDrawBuffer*> buff;
753 unsigned int *loc = new unsigned int[numlines]; 795 CBufferFace<size_t> loc;
754 int cbptr = 0; 796 unsigned int target = locnarray[(m_overlap < numlines) ? m_overlap : numlines/2];
755 if (locate() != mylastpos) jumpto(mylastpos); 797
756 if (m_overlap >= screenlines()) m_overlap = screenlines()/2; 798 size_t delta;
757 unsigned int target = locnarray[m_overlap]; 799 if (target < 2048)
758 if (buffdoc.hasrandomaccess())
759 {
760 unsigned int delta = locate()-pagelocate();
761 if (delta < 64) delta = 64;
762 if (delta % 2 != 0) delta++;
763 if (target % 2 != 0) target++;
764 do
765 { 800 {
766 delta <<= 1; 801 delta = target;
767 if (delta >= target) 802 jumpto(0);
768 { 803 }
769 delta = target; 804 else
770 jumpto(0); 805 {
771 for (int i = 0; i < numlines; i++) 806 delta = 2048;
772 { 807
773 loc[i] = locate(); 808 jumpto(target - delta);
774 getline(buff[i]); 809
775 } 810 buff[0] = new CDrawBuffer(&m_fontControl);
776 break; 811
777 } 812 do
778 jumpto(target-delta);
779 do
780 {
781 getline(buff[0]);
782#ifdef WS
783 //printf("Trying:%s\n",buff[0]);
784#endif
785 if (locate() > target) continue;
786 }
787 while (!buffdoc.iseol());
788 for (int i = 0; i < numlines; i++)
789 { 813 {
790 loc[i] = locate(); 814
791 getline(buff[i]); 815 if (!getline(buff[0])) break;
792#ifdef WS 816
793 //printf("Filling:%s\n",buff[i]); 817 if (locate() > target) continue;
794#endif
795 } 818 }
819 while (!buffdoc.iseol());
796 } 820 }
797 while (locate() >= target && delta < 4096); 821 int nbfl = 0;
798#ifdef WS 822
799 //printf("Delta:%u\n",delta); 823 bool ch = true;
800#endif 824 int ypos = 0;
801 } 825 while (locate() < target)
802 else
803 {
804 jumpto(0);
805 for (int i = 0; i < numlines; i++)
806 { 826 {
807 loc[i] = locate(); 827 if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl);
808 getline(buff[i]); 828 loc[nbfl] = locate();
829 ch = getline(buff[nbfl]);
830 ypos += buff[nbfl]->lineSpacing();
831 nbfl++;
832 if (!ch) break;
809 } 833 }
810 } 834 if (ypos < height())
811 cbptr = 0; 835 {
812 while (locate() < target) 836 locate(0);
813 { 837 return;
814 loc[cbptr] = locate(); 838 }
815 getline(buff[cbptr]); 839 if (ch)
816#ifdef WS 840 {
817 //printf("Adding:%s\n",buff[cbptr]->data()); 841 if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl);
818#endif 842 loc[nbfl] = locate();
819 cbptr = (cbptr+1) % numlines; 843 int ch = getline(buff[nbfl]);
820 } 844 nbfl++;
821 pagepos = loc[cbptr]; 845 }
822 textarray = new CBuffer*[numlines]; 846 ypos = 0;
823 for (int i = 0; i < numlines; i++) 847 numlines = 0;
824 { 848 while (ypos < height() && numlines <= nbfl-2)
825 int j = (cbptr+i)%numlines; 849 {
826 textarray[i] = buff[j]; 850 ypos += buff[nbfl - numlines - 2]->lineSpacing();
827 locnarray[i] = loc[j]; 851 numlines++;
828 } 852 }
829 delete [] buff; 853 --numlines;
830 delete [] loc; 854 int offset = nbfl;
855 offset -= numlines+1;
856 for (int i = 0; i <= numlines; i++)
857 {
858 delete textarray[i];
859 textarray[i] = buff[offset+i];
860 locnarray[i] = loc[offset + i];
861 }
862 for (int i = 0; i < nbfl - numlines - 1; i++)
863 {
864 delete buff[i];
865 }
866
867// --numlines;
831 mylastpos = locate(); 868 mylastpos = locate();
869
832 update(); 870 update();
@@ -854,2 +892,3 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
854 } 892 }
893 setfilter(getfilter());
855 update(); 894 update();
@@ -861,19 +900,29 @@ void QTReader::lineDown()
861{ 900{
862 pagepos = locnarray[1]; 901 int ypos = 0;
863 CBuffer* buff = textarray[0]; 902 int offset = numlines;
864 for (int i = 1; i < numlines; i++) 903
904 for (int i = 0; i <= numlines; i++)
865 { 905 {
866 textarray[i-1] = textarray[i]; 906 if ((ypos += textarray[numlines-i]->lineSpacing()) > height())
867 locnarray[i-1] = locnarray[i]; 907 {
908 offset = i-1;
909 break;
910 }
868 } 911 }
869 locnarray[numlines-1] = locate(); 912 offset = numlines - offset;
870 if (getline(buff)) 913 for (int i = offset; i <= numlines; i++)
871 { 914 {
872 textarray[numlines-1] = buff; 915 CDrawBuffer* buff = textarray[i-offset];
873 mylastpos = locate(); 916 textarray[i-offset] = textarray[i];
917 locnarray[i-offset] = locnarray[i];
918 textarray[i] = buff;
874 } 919 }
875 else 920 numlines = numlines - offset + 1;
921 locnarray[numlines] = locate();
922 if (textarray[numlines] == NULL)
876 { 923 {
877 textarray[numlines-1] = buff; 924 textarray[numlines] = new CDrawBuffer(&m_fontControl);
878 } 925 }
926 getline(textarray[numlines]);
927 mylastpos = locate();
879 update(); 928 update();
@@ -893,34 +942,34 @@ void QTReader::lineUp()
893 do 942 do
894 { 943 {
895 delta <<= 1; 944 delta <<= 1;
896 if (delta >= target) 945 if (delta >= target)
897 { 946 {
898 delta = target; 947 delta = target;
899 jumpto(0); 948 jumpto(0);
900 for (int i = 0; i < numlines; i++) 949 for (int i = 0; i < numlines; i++)
901 { 950 {
902 loc[i] = locate(); 951 loc[i] = locate();
903 getline(buff[i]); 952 getline(buff[i]);
904 } 953 }
905 break; 954 break;
906 } 955 }
907 jumpto(target-delta); 956 jumpto(target-delta);
908 do 957 do
909 { 958 {
910 buffdoc.getline(buff[0],width()); 959 buffdoc.getline(buff[0],width());
911#ifdef WS 960#ifdef WS
912 //printf("Trying:%s\n",buff[0]); 961 //printf("Trying:%s\n",buff[0]);
913#endif 962#endif
914 if (locate() > target) continue; 963 if (locate() > target) continue;
915 } 964 }
916 while (!buffdoc.iseol()); 965 while (!buffdoc.iseol());
917 for (int i = 0; i < numlines; i++) 966 for (int i = 0; i < numlines; i++)
918 { 967 {
919 loc[i] = locate(); 968 loc[i] = locate();
920 buffdoc.getline(buff[i],width()); 969 buffdoc.getline(buff[i],width());
921#ifdef WS 970#ifdef WS
922 //printf("Filling:%s\n",buff[i]); 971 //printf("Filling:%s\n",buff[i]);
923#endif 972#endif
924 } 973 }
925 } 974 }
926 while (locate() >= target && delta < 4096); 975 while (locate() >= target && delta < 4096);
@@ -934,6 +983,6 @@ void QTReader::lineUp()
934 for (int i = 0; i < numlines; i++) 983 for (int i = 0; i < numlines; i++)
935 { 984 {
936 loc[i] = locate(); 985 loc[i] = locate();
937 buffdoc.getline(buff[i],width()); 986 buffdoc.getline(buff[i],width());
938 } 987 }
939 } 988 }
@@ -965,5 +1014,5 @@ void QTReader::lineUp()
965{ 1014{
966 CBuffer* buff = textarray[numlines-1]; 1015 CDrawBuffer* buff = textarray[numlines];
967 unsigned int loc; 1016 unsigned int loc;
968 unsigned int end = locnarray[numlines-1]; 1017 unsigned int end = locnarray[numlines];
969 int cbptr = 0; 1018 int cbptr = 0;
@@ -971,2 +1020,3 @@ void QTReader::lineUp()
971 unsigned int target = locnarray[0]; 1020 unsigned int target = locnarray[0];
1021 if (target == 0) return;
972 if (buffdoc.hasrandomaccess()) 1022 if (buffdoc.hasrandomaccess())
@@ -976,28 +1026,25 @@ void QTReader::lineUp()
976 do 1026 do
977 { 1027 {
978 delta <<= 1; 1028 delta <<= 1;
979 if (delta >= target) 1029 if (delta >= target)
980 { 1030 {
981 delta = target; 1031 delta = target;
982 jumpto(0); 1032 jumpto(0);
983 for (int i = 0; i < numlines; i++) 1033 loc = locate();
984 { 1034 getline(buff);
985 loc = locate(); 1035 break;
986 getline(buff); 1036 }
987 } 1037 jumpto(target-delta);
988 break; 1038 do
989 } 1039 {
990 jumpto(target-delta); 1040 getline(buff);
991 do
992 {
993 getline(buff);
994#ifdef WS 1041#ifdef WS
995 //printf("Trying:%s\n",buff[0]); 1042 //printf("Trying:%s\n",buff[0]);
996#endif 1043#endif
997 if (locate() > target) continue; 1044 if (locate() > target) continue;
998 } 1045 }
999 while (!buffdoc.iseol()); 1046 while (!buffdoc.iseol());
1000 loc = locate(); 1047 loc = locate();
1001 getline(buff); 1048 getline(buff);
1002 } 1049 }
1003 while (locate() >= target && delta < 4096); 1050 while (locate() >= target && delta < 4096);
@@ -1016,4 +1063,3 @@ void QTReader::lineUp()
1016 } 1063 }
1017 pagepos = loc; 1064 for (int i = numlines; i > 0; i--)
1018 for (int i = numlines-1; i > 0; i--)
1019 { 1065 {
@@ -1024,6 +1070,16 @@ void QTReader::lineUp()
1024 locnarray[0] = loc; 1070 locnarray[0] = loc;
1025// delete [] buff; 1071 int start = numlines;
1026// delete [] loc; 1072 int ypos = 0;
1027 mylastpos = locate(); 1073 for (int i = 0; i <= numlines; i++)
1028 jumpto(end); 1074 {
1075 ypos += textarray[i]->lineSpacing();
1076 if (ypos > height())
1077 {
1078 start = i;
1079 ypos -= textarray[i]->lineSpacing();
1080 break;
1081 }
1082 }
1083 jumpto(locnarray[start]);
1084 fillbuffer(start, ypos);
1029 update(); 1085 update();
@@ -1035 +1091,19 @@ bool QTReader::empty()
1035} 1091}
1092
1093MarkupType QTReader::PreferredMarkup()
1094{
1095 MarkupType m = buffdoc.PreferredMarkup();
1096 if (m == cTEXT)
1097 {
1098 int ext = m_lastfile.findRev('.');
1099 if (ext >= 0)
1100 {
1101 QString ft = m_lastfile.right(m_lastfile.length()-ext-1).upper();
1102 if (ft.left(3) == "HTM")
1103 {
1104 m = cHTML;
1105 }
1106 }
1107 }
1108 return m;
1109}