Diffstat (limited to 'noncore/apps/opie-reader/BuffDoc.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/apps/opie-reader/BuffDoc.cpp | 248 |
1 files changed, 190 insertions, 58 deletions
diff --git a/noncore/apps/opie-reader/BuffDoc.cpp b/noncore/apps/opie-reader/BuffDoc.cpp index d4541ea..1123960 100644 --- a/noncore/apps/opie-reader/BuffDoc.cpp +++ b/noncore/apps/opie-reader/BuffDoc.cpp @@ -1,3 +1,5 @@ +#include "name.h" + #include "BuffDoc.h" //#include <FL/fl_draw.h> #include "config.h" @@ -13,8 +15,8 @@ bool BuffDoc::hyperlink(unsigned int n) lastispara = false; if (exp != NULL) { - bRet = exp->hyperlink(n); - lastsizes[0] = laststartline = exp->locate(); + bRet = exp->hyperlink(n); + lastsizes[0] = laststartline = exp->locate(); } return bRet; } @@ -30,22 +32,128 @@ void BuffDoc::locate(unsigned int n) // qDebug("BuffDoc:Located"); } -bool BuffDoc::getline(CDrawBuffer* buff, int w) +#define NEWLINEBREAK +#ifdef NEWLINEBREAK +bool BuffDoc::getline(CDrawBuffer* buff, int wth) { + bool moreleft = true; + bool margindone = false; + int w = wth-2*BORDER; tchar ch = 32; CStyle cs; buff->empty(); if (exp == NULL) { -// (*buff)[0] = '\0'; - buff->empty(); - return false; + buff->empty(); + buff->setEof(); + return false; + } + int len = 0; + if (lastword.length() > 0) + { + *buff = lastword; + cs = lastword.laststyle(); + w -= buff->leftMargin() + buff->rightMargin(); + margindone = true; + len = lastword.length(); + } + else buff->empty(); + lastword.empty(); + unsigned int slen = buff->width(len); + lastispara = false; + while (1) + { + lastsizes[len] = exp->locate(); + getch(ch, cs); + if (ch == UEOF) + { + lastword.empty(); + if (len == 0) + { + buff->setEof(); + moreleft = false; + } + laststartline = exp->locate(); + break; + } + if (ch == 10) + { + lastword.empty(); + lastispara = true; + laststartline = exp->locate(); + break; + } + buff->addch(ch, cs); + len++; + if (!margindone) + { + w -= buff->leftMargin() + buff->rightMargin(); + margindone = true; + } + if ((slen = buff->width(len)) > w) + { + if (ch == ' ' || len == 1) + { + lastword.empty(); + laststartline = exp->locate(); + break; + } + else // should do a backward search for spaces, first. + { + for (int i = len-1; i > 0; i--) + { + if ((*buff)[i] == ' ') + { + (*buff)[len] = 0; + lastword.setright(*buff, i+1); + buff->truncate(i); + (*buff)[i] = '\0'; + laststartline = lastsizes[i+1]; + buff->resize(); + for (int j = 0; j < lastword.length(); j++) + { + lastsizes[j] = lastsizes[j+i+1]; + } + return true; + } + } + laststartline = lastsizes[len-1]; + lastword.setright(*buff, len - 1); + buff->truncate(len-1); + buff->addch('-', cs); + for (int j = 0; j < lastword.length(); j++) + { + lastsizes[j] = lastsizes[j+len]; + } + break; + } + } + } + (*buff)[len] = '\0'; + buff->resize(); + return moreleft; +} +#else +bool BuffDoc::getline(CDrawBuffer* buff, int wth) +{ + bool margindone = false; + int w = wth-2*BORDER; + tchar ch = 32; + CStyle cs; + buff->empty(); + if (exp == NULL) + { +// (*buff)[0] = '\0'; + buff->empty(); + return false; } int len = 0, lastcheck = 0; if (lastword.length() > 0) { *buff = lastword; cs = lastword.laststyle(); + w -= buff->leftMargin() + buff->rightMargin(); + margindone = true; } else buff->empty(); // qDebug("Buff:%s Lastword:%s", (const char*)toQString(buff->data()), (const char*)toQString(lastword.data())); @@ -53,18 +161,28 @@ bool BuffDoc::getline(CDrawBuffer* buff, int w) unsigned int slen = buff->width(len); if (slen > w) { - for ( ; len > 0; len--) - { - if (buff->width(len) < w) break; - } + for ( ; len > 1; len--) + { + if (buff->width(len) < w) break; + } // lastword = buff->data() + len - 1; laststartline = lastsizes[len-1]; - lastword.setright(*buff, len - 1); for (int i = 0; i < buff->length(); i++) lastsizes[i] = lastsizes[i+len-1]; // (*buff)[len-1] = '-'; - buff->truncate(len-1); - buff->addch('-', cs); - (*buff)[len] = '\0'; + if (len > 2) + { + lastword.setright(*buff, len - 1); + buff->truncate(len-1); + buff->addch('-', cs); + (*buff)[len] = '\0'; + } + + else + { + lastword.empty(); + (*buff)[len] = '\0'; + } + buff->resize(); return true; } if (lastispara) @@ -77,6 +195,7 @@ bool BuffDoc::getline(CDrawBuffer* buff, int w) // (*buff)[len] = '\0'; buff->truncate(len); laststartline = exp->locate(); + buff->resize(); return true; } lastispara = false; @@ -88,27 +207,40 @@ bool BuffDoc::getline(CDrawBuffer* buff, int w) getch(ch, cs); while (ch != ' ' && ch != '\012' && ch != UEOF && len < 128) { - len++; - buff->addch(ch,cs); - allsizes[len] = exp->locate(); - getch(ch, cs); + len++; + buff->addch(ch,cs); + allsizes[len] = exp->locate(); + getch(ch, cs); } (*buff)[len] = 0; slen = buff->width(len); len++; buff->addch(' ', cs); + if (!margindone) + { + w -= buff->leftMargin() + buff->rightMargin(); + margindone = true; + } allsizes[len] = exp->locate(); if (slen < w && ch != ' ') { - lastcheck = len; - break; + lastcheck = len; + break; } lastispara = (ch == '\012'); } (*buff)[len] = '\0'; // lastword = buff->data()+lastcheck; - lastword.setright(*buff, lastcheck); +#ifdef WINDOWS + lastword.setright(*buff, (lastcheck > 0) ? lastcheck : 1); + { + int i; + for (i = 0; i < lastword.length(); i++) lastsizes[i] = allsizes[i+lastcheck]; + } +#else + lastword.setright(*buff, (lastcheck > 0) ? lastcheck : 1); for (int i = 0; i < lastword.length(); i++) lastsizes[i] = allsizes[i+lastcheck]; +#endif if (lastcheck > 0) { laststartline = allsizes[lastcheck]; @@ -122,28 +254,37 @@ bool BuffDoc::getline(CDrawBuffer* buff, int w) buff->truncate(lastcheck); } // buff->frig(); - return (ch != UEOF); + buff->resize(); + if (ch == UEOF && buff->length() == 0) + { + buff->setEof(); + return false; + } + return true; } +#endif -bool BuffDoc::getline(CDrawBuffer* buff, int w, int cw) +bool BuffDoc::getline(CDrawBuffer* buff, int wth, int cw) { + int w = wth-2*BORDER; buff->empty(); if (exp == NULL) { - return false; + return false; } tchar ch; CStyle cs; int i = 0; while (i*cw < w) { - getch(ch, cs); - if (ch == '\12' || ch == UEOF) break; - buff->addch(ch,cs); - i++; + getch(ch, cs); + if (ch == '\12' || ch == UEOF) break; + buff->addch(ch,cs); + i++; } buff->truncate(i); laststartline = exp->locate(); + buff->resize(); return (ch != UEOF); } @@ -164,53 +305,44 @@ int BuffDoc::openfile(QWidget* _parent, const char *src) int ret = exp->openfile(src); if (ret == -1) { - delete exp; - exp = NULL; - return ret; + delete exp; + exp = NULL; + return ret; } if (ret == -2) { - delete exp; - exp = new ztxt; - ret = exp->openfile(src); + delete exp; + exp = new ztxt; + ret = exp->openfile(src); } if (ret != 0) { - delete exp; - exp = new CPlucker; - ret = exp->openfile(src); + delete exp; + exp = new CPlucker; + ret = exp->openfile(src); } -#ifndef SMALL if (ret != 0) { - delete exp; - qDebug("Trying ppms"); - exp = new ppm_expander; - ret = exp->openfile(src); + delete exp; + qDebug("Trying ppms"); + exp = new ppm_expander; + ret = exp->openfile(src); } - if (ret != 0) { - delete exp; - exp = new Text; -// qDebug("Trying text"); - ret = exp->openfile(src); + delete exp; + exp = new Text; +// qDebug("Trying text"); + ret = exp->openfile(src); } -#else - if (ret != 0) - { - delete exp; - exp = new Text; - ret = exp->openfile(src); - } -#endif + if (ret != 0) { - delete exp; - QMessageBox::information(_parent, "OpieReader", "Unknown file compression type","Try another file"); - return ret; + delete exp; + QMessageBox::information(_parent, PROGNAME, "Unknown file compression type","Try another file"); + return ret; } // qDebug("Doing final open:%x:%x",exp,filt); |