Diffstat (limited to 'noncore/apps/opie-reader/QTReader.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/QTReader.cpp | 1186 |
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 | ||
77 | void QTReader::mouseReleaseEvent( QMouseEvent* _e ) | 82 | void 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 | { | 98 | bool 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 | } | 121 | void QTReader::setTwoTouch(bool _b) |
123 | } | 122 | { |
123 | setBackgroundColor( white ); | ||
124 | m_twotouch = m_touchone = _b; | ||
125 | } | ||
126 | |||
127 | void 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 | ||
308 | bool QTReader::getline(CBuffer *buff) | 418 | bool 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 | |||
362 | void 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 | ||
383 | void QTReader::setfont(QPainter* p) | 483 | void 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 | ||
519 | void QTReader::ChangeFont(int tgt) | 601 | bool 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 | ||
675 | bool QTReader::fillbuffer() { | 720 | bool 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 | |||
1093 | MarkupType 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 | } | ||