43 files changed, 3922 insertions, 2503 deletions
diff --git a/noncore/apps/opie-reader/Aportis.cpp b/noncore/apps/opie-reader/Aportis.cpp index b4988da..2f8cdc3 100644 --- a/noncore/apps/opie-reader/Aportis.cpp +++ b/noncore/apps/opie-reader/Aportis.cpp @@ -1,374 +1,374 @@ #include <stdio.h> #include <string.h> #include "Aportis.h" #include "my_list.h" #include "Bkmks.h" Aportis::Aportis() : peanutfile(false) { /*printf("constructing:%x\n",fin);*/ } void Aportis::dePeanut(int& ch) { if (peanutfile && ch != EOF) { unsigned char c = ch; if (peanutfile) c ^= 0xa5; ch = c; } } CList<Bkmk>* Aportis::getbkmklist() { /* if (peanutfile) { if (nRecs2 > nRecs) { CList<Bkmk>* t = new CList<Bkmk>; for (int i = nRecs; i < nRecs2; i++) { char name[17]; name[16] = '\0'; - qDebug("Record:%d, Length:%u",i,recordlength(i)); +// qDebug("Record:%d, Length:%u",i,recordlength(i)); gotorecordnumber(i); fread(name,1,16,fin); unsigned long lcn; fread(&lcn,sizeof(lcn),1,fin); lcn ^= 0xa5a5a5a5; lcn = SwapLong(lcn); - qDebug("Bookmark:%s:%u", name,lcn); +// qDebug("Bookmark:%s:%u", name,lcn); tchar tname[17]; memset(tname, 0, sizeof(tname)); for (int i = 0; name[i] != 0; i++) { tname[i] = name[i] ^ 0xa5; } t->push_back(Bkmk(tname, NULL, lcn)); } return t; } else { return NULL; } } */ if (bCompressed != 4) return NULL; CList<Bkmk>* t = new CList<Bkmk>; size_t cur = ftell(fin); for (int i = 0; i < nRecs2; i++) { DWORD dwPos; fseek(fin, 0x56 + 8*i, SEEK_SET); fread(&dwPos, 4, 1, fin); dwPos = SwapLong(dwPos); fseek(fin,dwPos,SEEK_SET); unsigned char ch; fread(&ch,1,1,fin); if (ch != 241) { char name[17]; name[16] = '\0'; fseek(fin,dwPos,SEEK_SET); fread(name,1,16,fin); unsigned long lcn; fread(&lcn,sizeof(lcn),1,fin); lcn = SwapLong(lcn); #ifdef _UNICODE tchar tname[17]; memset(tname, 0, sizeof(tname)); for (int i = 0; name[i] != 0; i++) { tname[i] = name[i]; } t->push_back(Bkmk(tname, NULL, lcn)); #else t->push_back(Bkmk(name,lcn)); #endif } } fseek(fin, cur, SEEK_SET); return t; } int Aportis::OpenFile(const char *src) { // printf("In openfile\n"); int ret = 0; if (!Cpdb::openfile(src)) return -1; if (head.creator != 0x64414552 // 'dAER' || head.type != 0x74584554) // 'tXET') { if (memcmp(&head.creator, "PPrs", 4) == 0 && memcmp(&head.type, "PNRd", 4) == 0) { peanutfile = true; } else { return -2; } } nRecs2 = nRecs = SwapWord(head.recordList.numRecords) - 1; fseek(fin,0,SEEK_END); dwLen = ftell(fin); if (peanutfile) { PeanutHeader hdr0; gotorecordnumber(0); fread(&hdr0, sizeof(hdr0), 1, fin); - qDebug("Version:%x", ntohs(hdr0.Version)); +// qDebug("Version:%x", ntohs(hdr0.Version)); if (hdr0.Version && 0x0200) { bCompressed = 2; } else { bCompressed = 1; } BlockSize = 4096; nRecs = SwapWord(hdr0.Records)-1; dwTLen = nRecs*BlockSize; } else { gotorecordnumber(0); tDocRecord0 hdr0; fread(&hdr0, sizeof(hdr0), 1, fin); bCompressed = SwapWord(hdr0.wVersion); if (bCompressed!=1 && bCompressed!=2 && bCompressed != 4) { ret = bCompressed; bCompressed = 2; } switch (bCompressed) { case 4: { dwTLen = 0; int i; for (i = 0; i < nRecs; i++) { unsigned int bs = GetBS(i); if (bs == 0) break; else dwTLen += bs; } nRecs = i; BlockSize = 0; } break; case 1: case 2: default: nRecs = SwapWord(hdr0.wNumRecs); dwTLen = SwapLong(hdr0.dwStoryLen); BlockSize = SwapWord(hdr0.wRecSize); if (BlockSize == 0) { BlockSize = 4096; printf("WARNING: Blocksize not set in source file\n"); } } } // this is the main record buffer // it knows how to stretch to accomodate the decompress currentrec = 0; cbptr = 0; outptr = 0; refreshbuffer(); - qDebug("Number of records:[%u,%u]", nRecs, nRecs2); +// qDebug("Number of records:[%u,%u]", nRecs, nRecs2); return ret; } int Aportis::getch() { if (bCompressed == 1) { if ((dwRecLen == 0) && !refreshbuffer()) return EOF; else { int c = getc(fin); dePeanut(c); dwRecLen--; currentpos++; return c; } } if (outptr != cbptr) { currentpos++; return (circbuf[outptr = (outptr + 1) % 2048]); } if ((dwRecLen == 0) && !refreshbuffer()) return EOF; currentpos++; int c; // take a char from the input buffer c = getc(fin); dePeanut(c); dwRecLen--; // separate the char into zones: 0, 1...8, 9...0x7F, 0x80...0xBF, 0xC0...0xFF // codes 1...8 mean copy that many chars; for accented chars & binary if (c == 0) { circbuf[outptr = cbptr = (cbptr+1)%2048] = c; return c; } else if (c >= 0x09 && c <= 0x7F) { circbuf[outptr = cbptr = (cbptr+1)%2048] = c; return c; } else if (c >= 0x01 && c <= 0x08) { dwRecLen -= c; while(c--) { int c = getc(fin); dePeanut(c); circbuf[cbptr = (cbptr+1)%2048] = c; } return circbuf[outptr = (outptr+1)%2048]; } else if (c >= 0x80 && c <= 0xBF) { int m,n; c <<= 8; int c1 = getc(fin); dePeanut(c1); c += c1; dwRecLen--; m = (c & 0x3FFF) >> COUNT_BITS; n = c & ((1<<COUNT_BITS) - 1); n += 3; while (n--) { cbptr = (cbptr+1)%2048; circbuf[cbptr] = circbuf[(cbptr+2048-m)%2048]; } return circbuf[outptr = (outptr+1)%2048]; } else if (c >= 0xC0 && c <= 0xFF) { circbuf[cbptr = (cbptr+1)%2048] = ' '; circbuf[cbptr = (cbptr+1)%2048] = c^0x80; return circbuf[outptr = (outptr+1)%2048]; } } unsigned int Aportis::GetBS(unsigned int bn) { DWORD dwPos; WORD fs; fseek(fin, 0x56 + 8*bn, SEEK_SET); fread(&dwPos, 4, 1, fin); dwPos = SwapLong(dwPos); fseek(fin,dwPos,SEEK_SET); // gotorecordnumber(bn+1); unsigned char ch; fread(&ch,1,1,fin); if (ch == 241) { fread(&fs,sizeof(fs),1,fin); fs = SwapWord(fs); } else fs = 0; return fs; } unsigned int Aportis::locate() { if (bCompressed == 4) { size_t cur = ftell(fin); unsigned int clen = 0; for (unsigned int i = 0; i < currentrec-1; i++) { unsigned int bs = GetBS(i); if (bs == 0) break; clen += bs; } fseek(fin,cur,SEEK_SET); return clen+currentpos; } else return (currentrec-1)*BlockSize+currentpos; } void Aportis::locate(unsigned int n) { unsigned int offset; // currentrec = (n >> OFFBITS); switch (bCompressed) { case 4: { DWORD clen = 0; offset = n; unsigned int i; for (i = 0; i < nRecs; i++) { unsigned int bs = GetBS(i); if (bs == 0) break; clen += bs; if (clen > n) break; offset = n - clen; } currentrec = i; } break; case 1: case 2: default: currentrec = n / BlockSize; offset = n % BlockSize; } outptr = cbptr; refreshbuffer(); while (currentpos < offset && getch() != EOF); } bool Aportis::refreshbuffer() { if (currentrec < nRecs) { dwRecLen = recordlength(currentrec+1); gotorecordnumber(currentrec+1); if (bCompressed == 4) { unsigned char t[3]; fread(t,1,3,fin); if (t[0] != 241) { printf("You shouldn't be here!\n"); return false; } dwRecLen -= 3; } /* int n = fread(t.buf, 1, dwRecLen, fin); t.len = n; // if(bCompressed) t.Decompress(); t.buf[t.Len()] = '\0'; */ currentpos = 0; currentrec++; return true; } else { return false; } } diff --git a/noncore/apps/opie-reader/Aportis.h b/noncore/apps/opie-reader/Aportis.h index af1fd3b..202a36f 100644 --- a/noncore/apps/opie-reader/Aportis.h +++ b/noncore/apps/opie-reader/Aportis.h @@ -1,108 +1,110 @@ /* Derived from makedoc9 by Pat Beirne */ #ifndef __Aportis_h #define __Aportis_h - +#include "useqpe.h" #include "CExpander.h" #include "pdb.h" typedef UInt32 DWORD; typedef UInt16 WORD; #define DISP_BITS 11 #define COUNT_BITS 3 /* // all numbers in these structs are big-endian, MAC format struct tDocHeader { char sName[32]; DWORD dwUnknown1; DWORD dwTime1; DWORD dwTime2; DWORD dwTime3; DWORD dwLastSync; DWORD ofsSort; DWORD ofsCatagories; DWORD dwCreator; DWORD dwType; DWORD dwUnknown2; DWORD dwUnknown3; WORD wNumRecs; }; */ struct tDocRecord0 { WORD wVersion; // 1=plain text, 2=compressed WORD wSpare; DWORD dwStoryLen; // in chars, when decompressed WORD wNumRecs; // text records only; equals tDocHeader.wNumRecs-1 WORD wRecSize; // usually 0x1000 DWORD dwSpare2; }; struct PeanutHeader { UInt16 Version; UInt8 Junk1[6]; UInt16 Records; UInt8 Junk2[106]; }; ////////////// utilities ////////////////////////////////////// inline WORD SwapWord(WORD r) { return (r>>8) + (r<<8); } inline DWORD SwapLong(DWORD r) { return ((r>>24) & 0xFF) + (r<<24) + ((r>>8) & 0xFF00) + ((r<<8) & 0xFF0000); } class Aportis : public CExpander, Cpdb { bool peanutfile; void dePeanut(int&); DWORD dwLen; WORD nRecs2; DWORD dwTLen; WORD nRecs; WORD BlockSize; DWORD dwRecLen; int currentrec, currentpos; unsigned int cbptr; unsigned int outptr; unsigned char circbuf[2048]; char bCompressed; public: - virtual void suspend() +#ifdef USEQPE
+ void suspend() { CExpander::suspend(fin); } - virtual void unsuspend() + void unsuspend() { CExpander::unsuspend(fin); } - virtual void sizes(unsigned long& _file, unsigned long& _text) +#endif + void sizes(unsigned long& _file, unsigned long& _text) { _file = dwLen; _text = dwTLen; } - virtual bool hasrandomaccess() { return true; } + bool hasrandomaccess() { return true; } virtual ~Aportis() {} Aportis(); - virtual int OpenFile(const char *src); - virtual int getch(); - virtual unsigned int locate(); - virtual void locate(unsigned int n); - virtual CList<Bkmk>* getbkmklist(); - virtual MarkupType PreferredMarkup() + int OpenFile(const char *src); + int getch(); + unsigned int locate(); + void locate(unsigned int n); + CList<Bkmk>* getbkmklist(); + MarkupType PreferredMarkup() { return (peanutfile) ? cPML : cTEXT; } private: bool refreshbuffer(); unsigned int GetBS(unsigned int bn); }; #endif diff --git a/noncore/apps/opie-reader/Bkmks.cpp b/noncore/apps/opie-reader/Bkmks.cpp index a8bee13..889c6d8 100644 --- a/noncore/apps/opie-reader/Bkmks.cpp +++ b/noncore/apps/opie-reader/Bkmks.cpp @@ -1,322 +1,322 @@ -#include "name.h" #include <qmessagebox.h> #include "Bkmks.h" #include "StyleConsts.h" #include "Markups.h" #include "my_list.h" #include "version.h" +#include "names.h" const unsigned long BkmkFile::magic = ((unsigned long)'q' << 24) | ((unsigned long)'t' << 16) | ((unsigned long)'r' << 8) | ((unsigned long)BKMKTYPE); Bkmk::Bkmk(const unsigned char* _nm, unsigned short _nmlen, const unsigned char* _anno, unsigned short _annolen, unsigned int _p) : m_position(_p) { init(_nm, _nmlen, _anno, _annolen, _p); } Bkmk::Bkmk(const tchar* _nm, const unsigned char* _anno, unsigned short annolen, unsigned int _p) : m_position(_p) { init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, annolen, _p); } Bkmk::Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p) : m_position(_p) { if (_anno == NULL) { tchar t = 0; init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), &t, sizeof(t), _p); } else { init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), _anno, sizeof(tchar)*(ustrlen(_anno)+1), _p); } } void Bkmk::init(const void* _nm, unsigned short _nmlen, const void* _anno, unsigned short _annolen, unsigned int _p) { m_namelen = _nmlen; if (m_namelen > 0) { m_name = new unsigned char[m_namelen]; memcpy(m_name, _nm, m_namelen); } else { m_name = NULL; } m_annolen = _annolen; if (m_annolen > 0) { m_anno = new unsigned char[m_annolen]; memcpy(m_anno, _anno, m_annolen); } else { m_anno = NULL; } m_position = _p; } Bkmk::~Bkmk() { if (m_name != NULL) delete [] m_name; m_name = NULL; if (m_anno != NULL) delete [] m_anno; m_anno = NULL; } Bkmk& Bkmk::operator=(const Bkmk& rhs) { if (m_name != NULL) { delete [] m_name; m_name = NULL; } if (m_anno != NULL) { delete [] m_anno; m_anno = NULL; } if (rhs.m_name != NULL) { m_namelen = rhs.m_namelen; m_name = new unsigned char[m_namelen]; memcpy(m_name, rhs.m_name, m_namelen); } else m_name = NULL; if (rhs.m_anno != NULL) { m_annolen = rhs.m_annolen; m_anno = new unsigned char[m_annolen]; memcpy(m_anno, rhs.m_anno, m_annolen); } else m_anno = NULL; m_position = rhs.m_position; return *this; } bool Bkmk::operator==(const Bkmk& rhs) { return (m_position == rhs.m_position && (rhs.m_namelen == m_namelen) && memcmp(m_name,rhs.m_name,m_namelen) == 0); } void Bkmk::setAnno(unsigned char* t, unsigned short len) { if (m_anno != NULL) { delete [] m_anno; m_anno = NULL; } if (t != NULL) { m_annolen = len; m_anno = new unsigned char[m_annolen]; memcpy(m_anno, t, m_annolen); } else { m_annolen = sizeof(tchar); m_anno = new unsigned char[m_annolen]; *((tchar*)m_anno) = 0; } } void Bkmk::setAnno(tchar* t) { if (m_anno != NULL) { delete [] m_anno; m_anno = NULL; } if (t != NULL) { unsigned short len = ustrlen(t)+1; m_annolen = sizeof(tchar)*len; m_anno = new unsigned char[m_annolen]; memcpy(m_anno, t, m_annolen); } else { m_annolen = sizeof(tchar); m_anno = new unsigned char[m_annolen]; *((tchar*)m_anno) = 0; } } BkmkFile::BkmkFile(const char *fnm, bool w) : wt(w), isUpgraded(false) { if (w) { f = fopen(fnm, "wb"); } else { f = fopen(fnm, "rb"); } } BkmkFile::~BkmkFile() { if (f != NULL) fclose(f); } void BkmkFile::write(const Bkmk& b) { if (f != NULL) { fwrite(&b.m_namelen, sizeof(b.m_namelen),1,f); fwrite(b.m_name,1,b.m_namelen,f); fwrite(&b.m_annolen, sizeof(b.m_annolen),1,f); fwrite(b.m_anno,1,b.m_annolen,f); fwrite(&b.m_position,sizeof(b.m_position),1,f); } } void BkmkFile::write(CList<Bkmk>& bl) { if (f != NULL) { fwrite(&magic, sizeof(magic), 1, f); for (CList<Bkmk>::iterator i = bl.begin(); i != bl.end(); i++) { write(*i); } } } CList<Bkmk>* BkmkFile::readall() { CList<Bkmk>* bl = NULL; if (f != NULL) { unsigned long newmagic; fread(&newmagic, sizeof(newmagic), 1, f); if ((newmagic & 0xffffff00) != (magic & 0xffffff00)) { if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of " PROGNAME "\ndid you upgrade from?", "0_4*", "Any other version") == 0) { fseek(f,0,SEEK_SET); bl = readall00(&read05); } else { fseek(f,0,SEEK_SET); bl = readall00(&read03); } isUpgraded = true; } else { switch(newmagic & 0xff) { case 6: isUpgraded = false; bl = readall00(read06); - qDebug("Correct version!"); +// qDebug("Correct version!"); break; case 5: isUpgraded = true; bl = readall00(read05); - qDebug("Known version!"); +// qDebug("Known version!"); break; default: - qDebug("Unknown version!"); +// qDebug("Unknown version!"); isUpgraded = true; bl = readall00(read05); } } } return bl; } CList<Bkmk>* BkmkFile::readall00(Bkmk* (*readfn)(FILE*)) { CList<Bkmk>* bl = new CList<Bkmk>; while (1) { Bkmk* b = (*readfn)(f); if (b == NULL) break; bl->push_back(*b); delete b; } return bl; } Bkmk* BkmkFile::read03(FILE* f) { Bkmk* b = NULL; if (f != NULL) { unsigned short ln; if (fread(&ln,sizeof(ln),1,f) == 1) { tchar* name = new tchar[ln+1]; fread(name,sizeof(tchar),ln,f); name[ln] = 0; ln = 0; tchar* anno = new tchar[ln+1]; anno[ln] = 0; unsigned int pos; fread(&pos,sizeof(pos),1,f); b = new Bkmk(name,anno,pos); } } return b; } Bkmk* BkmkFile::read05(FILE* f) { Bkmk* b = NULL; if (f != NULL) { unsigned short ln; if (fread(&ln,sizeof(ln),1,f) == 1) { tchar* nm = new tchar[ln+1]; fread(nm,sizeof(tchar),ln,f); nm[ln] = 0; fread(&ln,sizeof(ln),1,f); tchar* anno = new tchar[ln+1]; if (ln > 0) fread(anno,sizeof(tchar),ln,f); anno[ln] = 0; unsigned int pos; fread(&pos,sizeof(pos),1,f); b = new Bkmk(nm,anno,pos); } } return b; } Bkmk* BkmkFile::read06(FILE* f) { Bkmk* b = NULL; if (f != NULL) { unsigned short ln; if (fread(&ln,sizeof(ln),1,f) == 1) { b = new Bkmk; b->m_namelen = ln; b->m_name = new unsigned char[b->m_namelen]; fread(b->m_name,1,b->m_namelen,f); fread(&(b->m_annolen),sizeof(b->m_annolen),1,f); if (b->m_annolen > 0) { b->m_anno = new unsigned char[b->m_annolen]; fread(b->m_anno,1,b->m_annolen,f); } fread(&(b->m_position),sizeof(b->m_position),1,f); } } return b; } diff --git a/noncore/apps/opie-reader/BuffDoc.cpp b/noncore/apps/opie-reader/BuffDoc.cpp index 1123960..2402904 100644 --- a/noncore/apps/opie-reader/BuffDoc.cpp +++ b/noncore/apps/opie-reader/BuffDoc.cpp @@ -1,356 +1,416 @@ -#include "name.h" +#include "names.h" + +#define NEWLINEBREAK #include "BuffDoc.h" //#include <FL/fl_draw.h> #include "config.h" #include "CDrawBuffer.h" #include "plucker.h" +#include "usenef.h" +#ifdef USENEF +#include "nef.h" +#include "arrierego.h" +#endif - -bool BuffDoc::hyperlink(unsigned int n) +linkType BuffDoc::hyperlink(unsigned int n, QString& wrd) +{ + linkType bRet = eNone; + if (exp != NULL) + { + bRet = exp->hyperlink(n, wrd); + if (bRet == eLink) { - bool bRet = false; lastword.empty(); lastsizes[0] = laststartline = n; +#ifdef NEWLINEBREAK + lastispara = true; +#else lastispara = false; - if (exp != NULL) - { - bRet = exp->hyperlink(n); +#endif lastsizes[0] = laststartline = exp->locate(); } + } return bRet; } void BuffDoc::locate(unsigned int n) { - // qDebug("BuffDoc:locating:%u",n); + // //qDebug("BuffDoc:locating:%u",n); lastword.empty(); lastsizes[0] = laststartline = n; +#ifdef NEWLINEBREAK + lastispara = true; +#else lastispara = false; +#endif // tchar linebuf[1024]; if (exp != NULL) exp->locate(n); - // qDebug("BuffDoc:Located"); + // //qDebug("BuffDoc:Located"); } -#define NEWLINEBREAK #ifdef NEWLINEBREAK -bool BuffDoc::getline(CDrawBuffer* buff, int wth) +bool BuffDoc::getline(CDrawBuffer* buff, int wth, unsigned char _border) { bool moreleft = true; bool margindone = false; - int w = wth-2*BORDER; + int w = wth-2*_border; tchar ch = 32; CStyle cs; buff->empty(); if (exp == NULL) { 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; + if (lastispara) buff->setstartpara(); while (1) { lastsizes[len] = exp->locate(); getch(ch, cs); + if (ch == 10 && len == 0 && !lastispara) + { + 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(); + buff->setendpara(); lastispara = true; laststartline = exp->locate(); break; } + lastispara = false; 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(); + if (ch == ' ') buff->truncate(len-1); laststartline = exp->locate(); break; } else // should do a backward search for spaces, first. { - for (int i = len-1; i > 0; i--) + for (int i = len-2; 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; } + if ((*buff)[i] == '-' && !(((*buff)[i-1] == '-') || ((*buff)[i+1] == '-'))) + { + (*buff)[len] = 0; + lastword.setright(*buff, i+1); + buff->truncate(i+1); + (*buff)[i+1] = '\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]; + (*buff)[len] = 0; 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 BuffDoc::getline(CDrawBuffer* buff, int wth, unsigned char _border) { bool margindone = false; - int w = wth-2*BORDER; + 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())); +// //qDebug("Buff:%s Lastword:%s", (const char*)toQString(buff->data()), (const char*)toQString(lastword.data())); lastcheck = len = buff->length(); unsigned int slen = buff->width(len); if (slen > w) { for ( ; len > 1; len--) { if (buff->width(len) < w) break; } // lastword = buff->data() + len - 1; laststartline = lastsizes[len-1]; for (int i = 0; i < buff->length(); i++) lastsizes[i] = lastsizes[i+len-1]; // (*buff)[len-1] = '-'; 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) { lastispara = false; // lastword[0] = '\0'; lastword.empty(); len = buff->length(); while (buff->width(len) > w) len--; // (*buff)[len] = '\0'; buff->truncate(len); laststartline = exp->locate(); buff->resize(); return true; } lastispara = false; for (int i = 0; i < len; i++) allsizes[i] = lastsizes[i]; while (slen < w) { lastcheck = len; allsizes[len] = exp->locate(); getch(ch, cs); while (ch != ' ' && ch != '\012' && ch != UEOF && len < 128) { 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; } lastispara = (ch == '\012'); } (*buff)[len] = '\0'; // lastword = buff->data()+lastcheck; -#ifdef WINDOWS +#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]; // (*buff)[lastcheck-1] = '\0'; buff->truncate(lastcheck-1); } else { laststartline = (lastcheck == len) ? exp->locate() : allsizes[lastcheck+1]; // (*buff)[lastcheck] = '\0'; buff->truncate(lastcheck); } // buff->frig(); buff->resize(); if (ch == UEOF && buff->length() == 0) { buff->setEof(); return false; } return true; } #endif -bool BuffDoc::getline(CDrawBuffer* buff, int wth, int cw) +bool BuffDoc::getline(CDrawBuffer* buff, int wth, int cw, unsigned char _border) { - int w = wth-2*BORDER; + int w = wth-2*_border; buff->empty(); if (exp == NULL) { return false; } tchar ch; CStyle cs; - int i = 0; - while (i*cw < w) + int i = 1; + while (i*cw < w-buff->offset(w,0)) { 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); } int BuffDoc::openfile(QWidget* _parent, const char *src) { - // qDebug("BuffDoc:Openfile:%s", src); - // qDebug("Trying aportis %x",exp); + // //qDebug("BuffDoc:Openfile:%s", src); + // //qDebug("Trying aportis %x",exp); if (exp != NULL) delete exp; lastword.empty(); lastsizes[0] = laststartline = 0; +#ifdef NEWLINEBREAK + lastispara = true; +#else lastispara = false; +#endif /* exp = new Text; int ret = exp->openfile(src); */ exp = new Aportis; int ret = exp->openfile(src); if (ret == -1) { delete exp; exp = NULL; return ret; } if (ret == -2) { delete exp; exp = new ztxt; ret = exp->openfile(src); } +#ifdef USENEF + if (ret != 0) + { + + delete exp; + exp = new CArriere; + ret = exp->openfile(src); + } + if (ret != 0) + { + + delete exp; + exp = new CNEF; + ret = exp->openfile(src); + } +#endif if (ret != 0) { delete exp; exp = new CPlucker; ret = exp->openfile(src); } if (ret != 0) { delete exp; - qDebug("Trying ppms"); + //qDebug("Trying ppms"); exp = new ppm_expander; ret = exp->openfile(src); } if (ret != 0) { delete exp; exp = new Text; -// qDebug("Trying text"); +// //qDebug("Trying text"); ret = exp->openfile(src); } if (ret != 0) { delete exp; QMessageBox::information(_parent, PROGNAME, "Unknown file compression type","Try another file"); return ret; } - // qDebug("Doing final open:%x:%x",exp,filt); + // //qDebug("Doing final open:%x:%x",exp,filt); lastword.empty(); lastsizes[0] = laststartline = 0; +#ifdef NEWLINEBREAK + lastispara = true; +#else lastispara = false; +#endif exp->locate(0); filt->setsource(exp); - // qDebug("BuffDoc:file opened"); + // //qDebug("BuffDoc:file opened"); return 0; } diff --git a/noncore/apps/opie-reader/BuffDoc.h b/noncore/apps/opie-reader/BuffDoc.h index 78d8457..29d0329 100644 --- a/noncore/apps/opie-reader/BuffDoc.h +++ b/noncore/apps/opie-reader/BuffDoc.h @@ -1,114 +1,122 @@ #ifndef __BuffDoc_h #define __BuffDoc_h +#include "useqpe.h" #include "ZText.h" #include "Aportis.h" #include "ztxt.h" #include "ppm_expander.h" #include "CDrawBuffer.h" #include "CFilter.h" #include <qfontmetrics.h> #include <qmessagebox.h> class BuffDoc { CDrawBuffer lastword; CSizeBuffer lastsizes, allsizes; size_t laststartline; bool lastispara; CExpander* exp; CFilterChain* filt; public: void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) { if (exp == NULL) { data = NULL; len = 0; } else { exp->setSaveData(data, len, src, srclen); } } void putSaveData(unsigned char*& src, unsigned short& srclen) { if (exp != NULL) { exp->putSaveData(src, srclen); } } +#ifdef USEQPE void suspend() { if (exp != NULL) exp->suspend(); } void unsuspend() { if (exp != NULL) exp->unsuspend(); } +#else + void suspend() {} + void unsuspend() {} +#endif ~BuffDoc() { delete filt; delete exp; } BuffDoc() { exp = NULL; filt = NULL; lastword.empty(); - // qDebug("Buffdoc created"); +// // qDebug("Buffdoc created"); } bool empty() { return (exp == NULL); } void setfilter(CFilterChain* _f) { if (filt != NULL) delete filt; filt = _f; filt->setsource(exp); } CList<Bkmk>* getbkmklist() { return exp->getbkmklist(); } bool hasrandomaccess() { return (exp == NULL) ? false : exp->hasrandomaccess(); } bool iseol() { return (lastword[0] == '\0'); } int openfile(QWidget* _parent, const char *src); tchar getch() { tchar ch = UEOF; CStyle sty; if (exp != NULL) { filt->getch(ch, sty); } return ch; } void getch(tchar& ch, CStyle& sty) { if (exp != NULL) { filt->getch(ch, sty); } else ch = UEOF; } - QPixmap* getPicture(unsigned long tgt) { return (exp == NULL) ? NULL : exp->getPicture(tgt); } + void setwidth(int w) { if (exp != NULL) exp->setwidth(w); } + QImage* getPicture(unsigned long tgt) { return (exp == NULL) ? NULL : exp->getPicture(tgt); } unsigned int startSection() { return (exp == NULL) ? 0 : exp->startSection(); } unsigned int endSection() { return (exp == NULL) ? 0 : exp->endSection(); } unsigned int locate() { return (exp == NULL) ? 0 : laststartline; } unsigned int explocate() { return (exp == NULL) ? 0 : exp->locate(); } void setContinuous(bool _b) { if (exp != NULL) exp->setContinuous(_b); } MarkupType PreferredMarkup() { return (exp == NULL) ? cTEXT : exp->PreferredMarkup(); } - bool hyperlink(unsigned int n); + linkType hyperlink(unsigned int n, QString& wrd); size_t getHome() { return ((exp != NULL) ? exp->getHome() : 0); } void locate(unsigned int n); - bool getline(CDrawBuffer* buff, int w); - bool getline(CDrawBuffer* buff, int w, int cw); + bool getline(CDrawBuffer* buff, int w, unsigned char _border); + bool getline(CDrawBuffer* buff, int w, int cw, unsigned char _border); void sizes(unsigned long& fs, unsigned long& ts) { exp->sizes(fs,ts); } int getpara(CBuffer& buff) { tchar ch; int i = 0; while ((ch = getch()) != 10 && ch != UEOF) buff[i++] = ch; buff[i] = '\0'; if (i == 0 && ch == UEOF) i = -1; laststartline = exp->locate(); return i; } void saveposn(size_t posn) { exp->saveposn(posn); } + void writeposn(size_t posn) { exp->writeposn(posn); } bool forward(size_t& loc) { return exp->forward(loc); } bool back(size_t& loc) { return exp->back(loc); } bool hasnavigation() { return exp->hasnavigation(); } }; #endif diff --git a/noncore/apps/opie-reader/CAnnoEdit.h b/noncore/apps/opie-reader/CAnnoEdit.h index 3cc9f78..f320061 100644 --- a/noncore/apps/opie-reader/CAnnoEdit.h +++ b/noncore/apps/opie-reader/CAnnoEdit.h @@ -1,58 +1,59 @@ #ifndef __CANNOEDIT_H #define __CANNOEDIT_H #include <qlabel.h> #include <qlayout.h> #include <qpushbutton.h> #include <qlineedit.h> #include <qmultilineedit.h> class CAnnoEdit : public QWidget { Q_OBJECT QLineEdit* m_name; QMultiLineEdit* m_anno; size_t m_posn; public: void setPosn(size_t p) { m_posn = p; } size_t getPosn() { return m_posn; } void setName(const QString& name) { m_name->setText(name); } void setAnno(const QString& name) { m_anno->setText(name); m_anno->setEdited(false); } bool edited() { return m_anno->edited(); } CAnnoEdit(QWidget *parent=0, const char *name=0, WFlags f = 0) : QWidget(parent, name, f) { QVBoxLayout* grid = new QVBoxLayout(this); m_name = new QLineEdit(this, "Name"); m_anno = new QMultiLineEdit(this, "Annotation"); + m_anno->setWordWrap(QMultiLineEdit::WidgetWidth); QPushButton* exitButton = new QPushButton("Okay", this); connect(exitButton, SIGNAL( released() ), this, SLOT( slotOkay() ) ); QPushButton* cancelButton = new QPushButton("Cancel", this); connect(cancelButton, SIGNAL( released() ), this, SLOT( slotCancel() ) ); QLabel *l = new QLabel("Text",this); grid->addWidget(l); grid->addWidget(m_name); l = new QLabel("Annotation",this); grid->addWidget(l); grid->addWidget(m_anno,1); QHBoxLayout* hgrid = new QHBoxLayout(grid); hgrid->addWidget(cancelButton); hgrid->addWidget(exitButton); } private slots: void slotOkay() { emit finished(m_name->text(), m_anno->text()); } void slotCancel() { emit cancelled(); } public: signals: void finished(const QString&, const QString&); void cancelled(); }; #endif diff --git a/noncore/apps/opie-reader/CBuffer.cpp b/noncore/apps/opie-reader/CBuffer.cpp index 0780a88..03d7733 100644 --- a/noncore/apps/opie-reader/CBuffer.cpp +++ b/noncore/apps/opie-reader/CBuffer.cpp @@ -1,46 +1,46 @@ #include "CBuffer.h" CBufferBase& CBufferBase::assign(const void* sztmp, size_t ms) { if (ms*membersize > len) { delete [] buffer; buffer = new unsigned char[len = ms*membersize]; } - memcpy(buffer, sztmp, ms*membersize); + memcpy(buffer, sztmp, len); return *this; } -CBufferBase::CBufferBase(size_t ms, size_t n) : len(n), membersize(ms) +CBufferBase::CBufferBase(size_t ms, size_t n) : len(n*ms), membersize(ms) { - buffer = new unsigned char[len*membersize]; - memset(buffer, 0, len*membersize); + buffer = new unsigned char[len]; + memset(buffer, 0, len); } void* CBufferBase::operator[](int i) { if ((i+1)*membersize > len) { unsigned char* oldbuffer = buffer; buffer = new unsigned char[(i+1)*membersize]; memcpy(buffer, oldbuffer, len); memset(buffer+len, 0, (i+1)*membersize-len); len = (i+1)*membersize; delete [] oldbuffer; } return buffer+i*membersize; } size_t CBufferBase::bstrlen(unsigned char* _buffer) { if (_buffer == NULL) _buffer = buffer; unsigned char* zero = new unsigned char[membersize]; memset(zero,0,membersize); unsigned char* element = _buffer; while (memcmp(element, zero, membersize) != 0) { element += membersize; } delete [] zero; return (element - _buffer)/membersize; } diff --git a/noncore/apps/opie-reader/CDrawBuffer.cpp b/noncore/apps/opie-reader/CDrawBuffer.cpp index ca220e6..77b76fb 100644 --- a/noncore/apps/opie-reader/CDrawBuffer.cpp +++ b/noncore/apps/opie-reader/CDrawBuffer.cpp @@ -1,379 +1,550 @@ #include "CDrawBuffer.h" #include "FontControl.h" #include <qfontmetrics.h> #include <qpainter.h> #include <qpixmap.h> +#include <qimage.h> +#include "useqpe.h" #include "opie.h" CDrawBuffer::~CDrawBuffer() { while (!segs.isEmpty()) segs.erase(0); } void CDrawBuffer::setright(CDrawBuffer& rhs, int f) { int i; len = rhs.len; fc = rhs.fc; m_maxstyle = m_ascent = m_descent = m_lineSpacing = m_lineExtraSpacing = 0; while (!segs.isEmpty()) { segs.erase(0); } for (CList<textsegment>::iterator iter = rhs.segs.begin(); iter != rhs.segs.end(); ) { CList<textsegment>::iterator next = iter; iter++; if (iter == rhs.segs.end() || iter->start > f) { int st = next->start-f; if (st < 0) st = 0; CStyle _style = next->style; segs.push_back(textsegment(st,next->style)); } } for (i = f; rhs[i] != '\0'; i++) (*this)[i-f] = rhs[i]; (*this)[i-f] = '\0'; len = i; } CDrawBuffer& CDrawBuffer::operator=(CDrawBuffer& rhs) { int i; -// qDebug("Trying 2"); +// //qDebug("Trying 2"); len = rhs.len; m_maxstyle = rhs.m_maxstyle; m_ascent = rhs.m_ascent; m_descent = rhs.m_descent; m_lineSpacing = rhs.m_lineSpacing; m_lineExtraSpacing = rhs.m_lineExtraSpacing; while (!segs.isEmpty()) { segs.erase(0); } for (CList<textsegment>::iterator iter = rhs.segs.begin(); iter != rhs.segs.end(); iter++) { segs.push_back(*iter); } for (i = 0; rhs[i] != '\0'; i++) (*this)[i] = rhs[i]; (*this)[i] = '\0'; len = i; -// qDebug("Tried 2"); +// //qDebug("Tried 2"); return *this; } CDrawBuffer& CDrawBuffer::operator=(const tchar*sztmp) { int i; while (!segs.isEmpty()) { segs.erase(0); } segs.push_back(textsegment(0, CStyle())); for (i = 0; sztmp[i] != '\0'; i++) (*this)[i] = sztmp[i]; (*this)[i] = '\0'; len = i; return *this; } void CDrawBuffer::empty() { + m_bSop = false; + m_bEop = false; len = 0; (*this)[0] = 0; while (!segs.isEmpty()) { segs.erase(0); } segs.push_back(textsegment(0,CStyle())); m_maxstyle = m_ascent = m_descent = m_lineSpacing = m_lineExtraSpacing = 0; m_bEof = false; } void CDrawBuffer::addch(tchar ch, CStyle _style/* = ucFontBase*/) { if (len == 0) { segs.first().start = 0; segs.first().style = _style; } else if (_style != segs.last().style) { segs.push_back(textsegment(len, _style)); } (*this)[len++] = ch; } void CDrawBuffer::truncate(int n) { len = n; (*this)[n] = 0; } -int CDrawBuffer::width(int numchars) +int CDrawBuffer::width(int numchars, bool onscreen, int scwidth, unsigned char _border) { + int gzoom = fc->gzoom(); int currentx = 0, end = 0; - QString text = toQString(data()); + QString text = (numchars < 0) ? toQString(data()) : toQString(data(), numchars); CList<textsegment>::iterator textstart = segs.begin(); + int extraspace = 0; + bool just = (onscreen && !m_bEop && textstart->style.getJustify() == m_AlignJustify); + int spaces = 0; + int spacesofar = 0; + int spacenumber = 0; + int nonspace = 0; + if (just) + { + for (int i = 0; i < len; i++) + { + if ((*this)[i] != ' ') + { + nonspace = i; + break; + } + } +#ifdef _WINDOWS + for (i = nonspace; i < len; i++) +#else + for (int i = nonspace; i < len; i++) +#endif + { + if ((*this)[i] == ' ') + { + spaces++; + } + } + if (spaces == 0) + { + just = false; + } + else + { + extraspace = (scwidth - 2*_border - rightMargin() - leftMargin() - width()); + if (extraspace == 0) just = false; + } + } CList<textsegment>::iterator textend = textstart; do { textend++; - end = (textend != segs.end()) ? textend->start : length(); + end = (textend != segs.end()) ? textend->start : len; if (numchars >= 0 && end > numchars) { end = numchars; } CStyle currentstyle = textstart->style; if (currentstyle.isPicture()) { + if (currentstyle.canScale()) + { + currentx += (gzoom*currentstyle.getPicture()->width())/100; + } + else + { currentx += currentstyle.getPicture()->width(); } + } else { if (currentstyle.isMono() && !fc->hasCourier()) { int cw = (7*fc->getsize(currentstyle))/10; currentx += cw*(end-textstart->start); } else { - QFont f(currentstyle.isMono() ? QString("courier") : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) ); + QFont f(currentstyle.isMono() ? QString(fc->fixedfontname()) : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) ); // f.setUnderline(currentstyle.isUnderline()); QString str = text.mid(textstart->start, end-textstart->start); QFontMetrics fm(f); + if (just) + { + int lastspace = -1; + int nsp = 0; + int cx = currentx; + while ((nsp = str.find(" ", lastspace+1)) >= 0) + { + if (nsp > nonspace) + { + spacenumber++; + int nexttoadd = (extraspace*spacenumber+spaces/2)/spaces - spacesofar; + QString nstr = str.mid(lastspace+1, nsp-lastspace); + int lw = fm.width(nstr); + cx += lw+nexttoadd; + spacesofar += nexttoadd; + lastspace = nsp; + } + else + { + QString nstr = str.mid(lastspace+1, nsp-lastspace); +// qDebug("str:%s: last:%d new:%d nstr:%s:", (const char*)str, lastspace, nsp, (const char*)nstr); + int lw = fm.width(nstr); + cx += lw; + lastspace = nsp; + } + } + QString nstr = str.right(str.length()-1-lastspace); + cx += fm.width(nstr); + currentx = cx; + } + else + { currentx += fm.width(str); } } + } textstart = textend; } - while (textend != segs.end() && end != numchars); + while (textend != segs.end() && end != numchars && textstart->start < len); return currentx; } int CDrawBuffer::leftMargin() { - return (segs.begin()->style.getLeftMargin()*fc->getsize(segs.begin()->style))/6; + return (segs.begin()->style.getLeftMargin()*fc->getsize(segs.begin()->style)+3)/6; } int CDrawBuffer::rightMargin() { - return (segs.begin()->style.getRightMargin()*fc->getsize(segs.begin()->style))/6; + return (segs.begin()->style.getRightMargin()*fc->getsize(segs.begin()->style)+3)/6; } -int CDrawBuffer::offset(int scwidth) +int CDrawBuffer::offset(int scwidth, unsigned char _border) { - int currentx = BORDER; + int currentx = _border; switch(segs.begin()->style.getJustify()) { case m_AlignRight: { - currentx = scwidth - BORDER - rightMargin() - width(); + currentx = scwidth - _border - rightMargin() - width(); } break; case m_AlignCentre: { currentx = ( scwidth + leftMargin() - rightMargin() - width())/2; } break; case m_AlignJustify: case m_AlignLeft: - currentx = BORDER + leftMargin(); + currentx = _border + leftMargin(); break; } return currentx; } -void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scwidth) +void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scwidth, unsigned char _border) { - int currentx = offset(scwidth); + int gzoom = fc->gzoom(); + int currentx = offset(scwidth, _border); QString text = toQString(data()); CList<textsegment>::iterator textstart = segs.begin(); -/* - StyleType align = textstart->style.getJustify(); - switch (align) + int extraspace = 0; + bool just = (!m_bEop && textstart->style.getJustify() == m_AlignJustify); + int spaces = 0; + int spacesofar = 0; + int spacenumber = 0; + int nonspace = 0; + if (just) { - case CStyle::m_AlignRight: + for (int i = 0; i < len; i++) { - currentx = scwidth - width() - 2*BORDER; - } + if ((*this)[i] != ' ') + { + nonspace = i; break; - case CStyle::m_AlignCentre: + } + } +#ifdef _WINDOWS + for (i = nonspace; i < len; i++) +#else + for (int i = nonspace; i < len; i++) +#endif + { + if ((*this)[i] == ' ') { - currentx = (scwidth - width())/2 - BORDER; + spaces++; + } + } + if (spaces == 0) + { + just = false; + } + else + { + extraspace = (scwidth - 2*_border - rightMargin() - leftMargin() - width()); + if (extraspace == 0) just = false; } - break; - case CStyle::m_AlignJustify: - case CStyle::m_AlignLeft: - break; } -*/ CList<textsegment>::iterator textend = textstart; do { textend++; - int end = (textend != segs.end()) ? textend->start : length(); + int end = (textend != segs.end()) ? textend->start : len; CStyle currentstyle = textstart->style; - QFont f((currentstyle.isMono() && fc->hasCourier()) ? QString("courier") : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) ); + QFont f((currentstyle.isMono() && fc->hasCourier()) ? fc->fixedfontname() : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) ); // f.setUnderline(currentstyle.isUnderline()); // if (currentstyle.isUnderline()) qDebug("UNDERLINE"); _p->setFont(f); QString str = text.mid(textstart->start, end-textstart->start); -#ifdef OPIE +#if defined(OPIE) || !defined(USEQPE) _p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/100)); #else _p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/10)); #endif + int voffset = currentstyle.getVOffset()*fc->getsize(currentstyle)/2; if (_bMono) { if (currentstyle.isUnderline()) { - _p->drawLine( currentx, _y, currentx + str.length()*_charWidth, _y); + _p->drawLine( currentx, _y+voffset, currentx + str.length()*_charWidth, _y+voffset); } if (currentstyle.isStrikethru()) { int ascent = fc->ascent(currentstyle)/3; - _p->drawLine( currentx, _y-ascent, currentx + str.length()*_charWidth, _y-ascent); + _p->drawLine( currentx, _y-ascent+voffset, currentx + str.length()*_charWidth, _y-ascent+voffset); } for (int i = 0; i < str.length(); i++) { - _p->drawText( currentx + i*_charWidth, _y, QString(str[i])); + _p->drawText( currentx + i*_charWidth, _y+voffset, QString(str[i])); } currentx += str.length()*_charWidth; } else { if (currentstyle.isPicture()) { + int ht = (gzoom*currentstyle.getPicture()->height())/100; + int wt = (gzoom*currentstyle.getPicture()->width())/100; int ascent = fc->ascent(currentstyle)/2; - int yoffset = currentstyle.getPicture()->height()/2 + ascent; - _p->drawPixmap( currentx, _y-yoffset, *(currentstyle.getPicture())); - currentx += currentstyle.getPicture()->width(); + int yoffset = ht/2 + ascent; + + QPixmap pc; + if (gzoom != 100 && currentstyle.canScale()) + { + QImage im = currentstyle.getPicture()->smoothScale(wt,ht); + pc.convertFromImage(im); + } + else + { + pc.convertFromImage(*currentstyle.getPicture()); + } + _p->drawPixmap( currentx, _y-yoffset, pc ); + currentx += wt; } else { if (currentstyle.isMono() && !fc->hasCourier()) { int cw = (7*fc->getsize(currentstyle))/10; int w = cw*(end-textstart->start); if (currentstyle.isUnderline()) { - _p->drawLine( currentx, _y, currentx + w, _y); + _p->drawLine( currentx, _y+voffset, currentx + w, _y+voffset); } if (currentstyle.isStrikethru()) { int ascent = fc->ascent(currentstyle)/3; - _p->drawLine( currentx, _y-ascent, currentx + w, _y-ascent); + _p->drawLine( currentx, _y-ascent+voffset, currentx + w, _y-ascent+voffset); } QString str = text.mid(textstart->start, end-textstart->start); - for (int i = 0; i < str.length(); i++) + for (unsigned int i = 0; i < str.length(); i++) { - _p->drawText( currentx, _y, QString(str[i])); +#ifdef _WINDOWS + _p->drawText( currentx, _y+voffset, QString(str.at(i))); +#else + _p->drawText( currentx, _y+voffset, QString(str[i])); +#endif currentx += cw; } } else { QFontMetrics fm(f); - int w = fm.width(str); + int w; + if (just) + { + int lastspace = -1; + int nsp = 0; + int cx = currentx; + while ((nsp = str.find(" ", lastspace+1)) >= 0) + { + if (nsp+textstart->start >= nonspace) + { + spacenumber++; + int nexttoadd = (extraspace*spacenumber+spaces/2)/spaces - spacesofar; + QString nstr = str.mid(lastspace+1, nsp-lastspace); +// qDebug("str:%s: last:%d new:%d nstr:%s:", (const char*)str, lastspace, nsp, (const char*)nstr); + int lw = fm.width(nstr); + _p->drawText( cx, _y+voffset, nstr); + cx += lw+nexttoadd; + spacesofar += nexttoadd; + lastspace = nsp; + } + else + { + QString nstr = str.mid(lastspace+1, nsp-lastspace); +// qDebug("str:%s: last:%d new:%d nstr:%s:", (const char*)str, lastspace, nsp, (const char*)nstr); + int lw = fm.width(nstr); + _p->drawText( cx, _y+voffset, nstr); + cx += lw; + lastspace = nsp; + } + } + QString nstr = str.right(str.length()-1-lastspace); + _p->drawText( cx, _y+voffset, nstr); + cx += fm.width(nstr); + w = cx - currentx; + } + else + { + _p->drawText( currentx, _y+voffset, str); + w = fm.width(str); + } if (currentstyle.isUnderline()) { - _p->drawLine( currentx, _y, currentx + w, _y); + _p->drawLine( currentx, _y+voffset, currentx + w, _y+voffset); } if (currentstyle.isStrikethru()) { int ascent = fc->ascent(currentstyle)/3; - _p->drawLine( currentx, _y-ascent, currentx + w, _y-ascent); + _p->drawLine( currentx, _y-ascent+voffset, currentx + w, _y-ascent+voffset); } - _p->drawText( currentx, _y, str); currentx += w; } } } textstart = textend; } - while (textend != segs.end() && textstart->start < length()-1); + while (textend != segs.end() && textstart->start < len); } CStyle CDrawBuffer::laststyle() { return segs.last().style; } linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt) { int end = 0; CStyle currentstyle; CList<textsegment>::iterator textstart = segs.begin(); CList<textsegment>::iterator textend = textstart; do { textend++; - end = (textend != segs.end()) ? textend->start : length(); + end = (textend != segs.end()) ? textend->start : len; currentstyle = textstart->style; /* if (currentstyle.isPicture()) qDebug("Passed thru picture"); if (currentstyle.getLink()) qDebug("Passed thru link"); - qDebug("islink:%d - %d", numchars, end); + //qDebug("islink:%d - %d", numchars, end); */ textstart = textend; } while (textend != segs.end() && end <= numchars); // if (currentstyle.isPicture()) qDebug("Clicked on picture"); if (currentstyle.getPictureLink()) { tgt = currentstyle.getPictureLinkData(); return ePicture; } if (currentstyle.getLink()) { tgt = currentstyle.getData(); return eLink; } return eNone; } void CDrawBuffer::resize() { - int i; + int gzoom = fc->gzoom(); m_maxstyle = m_ascent = m_descent = m_lineSpacing = m_lineExtraSpacing = 0; - for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= length(); ) + for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= len; ) { CList<textsegment>::iterator next = iter; iter++; int st = next->start; if (st < 0) st = 0; CStyle _style = next->style; int linespacing, ascent, descent, extra; ascent = fc->ascent(_style); descent = fc->descent(_style); linespacing = fc->lineSpacing(_style); extra = linespacing - ascent - descent; - if (_style.isPicture()) + if (_style.isPicture() && _style.canScale()) { - descent = (_style.getPicture()->height()-ascent)/2; - ascent = (_style.getPicture()->height()+ascent)/2; + descent = ((gzoom*_style.getPicture()->height())/100-ascent)/2; + ascent = ((gzoom*_style.getPicture()->height())/100+ascent)/2; } /* else if (fc != NULL) { ascent = fc->ascent(_style); descent = fc->descent(_style); linespacing = fc->lineSpacing(_style); extra = linespacing - ascent - descent; } */ if (ascent > m_ascent) m_ascent = ascent; if (descent > m_descent) m_descent = descent; if (extra > m_lineExtraSpacing) m_lineExtraSpacing = extra; m_lineSpacing = m_ascent+m_descent+m_lineExtraSpacing; } + int lead = fc->getlead(); + if (lead != 0) + { + int xt = (lead*m_lineSpacing+5)/10; + m_descent += xt; + m_lineSpacing += xt; + } + if (m_bSop) + { + int xt = ((segs.begin()->style.getExtraSpace()+fc->getextraspace())*fc->getsize(segs.begin()->style)+5)/10; +// qDebug("ExtraSpace:%d", xt); + m_ascent += xt; + m_lineSpacing += xt; + } } diff --git a/noncore/apps/opie-reader/CDrawBuffer.h b/noncore/apps/opie-reader/CDrawBuffer.h index 0d8968c..9ec0ed9 100644 --- a/noncore/apps/opie-reader/CDrawBuffer.h +++ b/noncore/apps/opie-reader/CDrawBuffer.h @@ -1,76 +1,73 @@ #ifndef __CDRAWBUFFER_H #define __CDRAWBUFFER_H #include "StyleConsts.h" #include "CBuffer.h" #include "my_list.h" +#include "linktype.h" class QPainter; -enum linkType -{ - eNone, - eLink, - ePicture -}; - struct textsegment { int start; CStyle style; textsegment(int _start, const CStyle& _style) : start(_start), style(_style) {} }; class FontControl; class CDrawBuffer : public CBuffer { CList<textsegment> segs; int len; FontControl* fc; int m_maxstyle, m_ascent, m_descent, m_lineSpacing, m_lineExtraSpacing; bool m_bEof; + bool m_bSop, m_bEop; CDrawBuffer(const CDrawBuffer&); CDrawBuffer& operator=(const tchar*sztmp); public: + void setstartpara() { m_bSop = true; } + void setendpara() { m_bEop = true; } int leftMargin(); int rightMargin(); void setEof() { m_bEof = true; } bool eof() { return m_bEof; } CDrawBuffer& operator=(CDrawBuffer&); CDrawBuffer(FontControl* _fs = NULL) : fc(_fs) { empty(); } ~CDrawBuffer(); /* CDrawBuffer() : size(0) { empty(); } */ - int width(int numchars = -1); - int offset(int); - void render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scw); + int width(int numchars = -1, bool onscreen = false, int scwidth = 0, unsigned char _border = 0); + int offset(int, unsigned char); + void render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scw, unsigned char); void empty(); void addch(tchar ch, CStyle _style); void truncate(int); void setright(CDrawBuffer&, int); CStyle laststyle(); int ascent() { return m_ascent; } int descent() { return m_descent; } int lineSpacing() { return m_lineSpacing; } int lineExtraSpacing() { return m_lineExtraSpacing; } // void frig(); linkType getLinkType(int numchars, size_t& tgt); void resize(); }; #endif diff --git a/noncore/apps/opie-reader/CEncoding.cpp b/noncore/apps/opie-reader/CEncoding.cpp index c1dcfe8..60a1057 100644 --- a/noncore/apps/opie-reader/CEncoding.cpp +++ b/noncore/apps/opie-reader/CEncoding.cpp @@ -1,210 +1,210 @@ #include <stdio.h> #include "CEncoding.h" void CUtf8::getch(tchar& ch, CStyle& sty) { - int iret; - parent->getch(iret, sty); - if (iret == EOF) + tchar ret; + parent->getch(ret, sty); + if (ret == UEOF) { ch = UEOF; return; } - tchar ret = iret; int count = 0; if (ret & (1 << 7)) { unsigned char flags = ret << 1; while ((flags & (1 << 7)) != 0) { ret <<= 6; + tchar iret; parent->getch(iret, sty); ret += iret & 0x3f; flags <<= 1; count++; } switch (count) { case 0: break; case 1: ret &= 0x07ff; break; case 2: break; case 3: case 4: case 5: default: printf("Only 16bit unicode supported..."); } } ch = ret; return; } void CUcs16be::getch(tchar& ch, CStyle& sty) { - int iret; + tchar iret; parent->getch(iret, sty); - if (iret == EOF) + if (iret == UEOF) { ch = UEOF; return; } tchar ret = iret; parent->getch(iret, sty); ch = (ret << 8) + iret; } void CUcs16le::getch(tchar& ch, CStyle& sty) { - int iret; + tchar iret; parent->getch(iret, sty); - if (iret == EOF) + if (iret == UEOF) { ch = UEOF; return; } tchar ret = iret; parent->getch(iret, sty); ch = ret + (iret << 8); } void Ccp1252::getch(tchar& ch, CStyle& sty) { - int iret; + tchar iret; parent->getch(iret, sty); ch = iret; switch (ch) { - case EOF: + case UEOF: ch = UEOF; break; case 0x80: ch = 0x20ac; break; case 0x82: ch = 0x201a; break; case 0x83: ch = 0x0192; break; case 0x84: ch = 0x201e; break; case 0x85: ch = 0x2026; break; case 0x86: ch = 0x2020; break; case 0x87: ch = 0x2021; break; case 0x88: ch = 0x02c6; break; case 0x89: ch = 0x2030; break; case 0x8a: ch = 0x0160; break; case 0x8b: ch = 0x2039; break; case 0x8c: ch = 0x0152; break; case 0x8e: ch = 0x017d; break; case 0x91: ch = 0x2018; break; case 0x92: ch = 0x2019; break; case 0x93: ch = 0x201c; break; case 0x94: ch = 0x201d; break; case 0x95: ch = 0x2022; break; case 0x96: ch = 0x2013; break; case 0x97: ch = 0x2014; break; case 0x98: ch = 0x02dc; break; case 0x99: ch = 0x2122; break; case 0x9a: ch = 0x0161; break; case 0x9b: ch = 0x203a; break; case 0x9c: ch = 0x0153; break; case 0x9e: ch = 0x017e; break; case 0x9f: ch = 0x0178; break; default: break; } } void CPalm::getch(tchar& ch, CStyle& sty) { Ccp1252::getch(ch, sty); switch (ch) { case 0x18: ch = 0x2026; break; case 0x19: ch = 0x2007; break; case 0x8d: ch = 0x2662; break; case 0x8e: ch = 0x2663; break; case 0x8f: ch = 0x2661; break; case 0x90: ch = 0x2660; break; default: break; } } void CAscii::getch(tchar& ch, CStyle& sty) { - int iret; + tchar iret; parent->getch(iret, sty); - if (iret == EOF) + if (iret == UEOF) { ch = UEOF; } else { ch = iret; } } diff --git a/noncore/apps/opie-reader/CEncoding.h b/noncore/apps/opie-reader/CEncoding.h index 86562e7..463fba9 100644 --- a/noncore/apps/opie-reader/CEncoding.h +++ b/noncore/apps/opie-reader/CEncoding.h @@ -1,53 +1,74 @@ #ifndef __CENCODING_H #define __CENCODING_H #include "CExpander.h" +#define MAX_ENCODING 6 + class CEncoding : public CCharacterSource { friend class CFilterChain; protected: CExpander* parent; + linkType hyperlink(unsigned int n, QString& t) { return parent->hyperlink(n,t); } public: CEncoding() : parent(NULL) {} void setparent(CExpander* p) { parent = p; } virtual ~CEncoding() {}; }; class CUtf8 : public CEncoding { public: void getch(tchar& ch, CStyle& sty); }; class CUcs16be : public CEncoding { public: void getch(tchar& ch, CStyle& sty); }; class CUcs16le : public CEncoding { public: void getch(tchar& ch, CStyle& sty); }; class Ccp1252 : public CEncoding { public: void getch(tchar& ch, CStyle& sty); }; class CPalm : public Ccp1252 { public: void getch(tchar& ch, CStyle& sty); }; class CAscii : public CEncoding { public: void getch(tchar& ch, CStyle& sty); }; +#include "CEncoding_tables.h" + +class CGeneral8Bit : public CEncoding +{ + int m_index; + public: + CGeneral8Bit(int _i) : m_index(_i) + { +// qDebug("8Bit:%d", _i); +// qDebug("%s", unicodetable::iterator(_i)->mime); + } + void getch(tchar& ch, CStyle& sty) + { + parent->getch(ch, sty); + ch = unicodetable::unicodevalue(m_index, ch); + } +}; + #endif diff --git a/noncore/apps/opie-reader/CExpander.h b/noncore/apps/opie-reader/CExpander.h index c281398..7b21d3e 100644 --- a/noncore/apps/opie-reader/CExpander.h +++ b/noncore/apps/opie-reader/CExpander.h @@ -1,124 +1,151 @@ #ifndef __CExpander_h #define __CExpander_h +#ifndef _WINDOWS #include <unistd.h> +#endif #include <stdio.h> #include <time.h> #include <qmessagebox.h> +#include "useqpe.h" #include "config.h" #include "StyleConsts.h" #include "Markups.h" -#include "name.h" +#include "names.h" +#include "linktype.h" -class QPixmap; +class QImage; class Bkmk; template<class T> class CList; class CCharacterSource { public: virtual void getch(tchar&, CStyle&) = 0; + virtual linkType hyperlink(unsigned int n, QString&) = 0; }; class CExpander { protected: size_t m_homepos; bool m_continuous; char* fname; bool bSuspended; size_t suspos; time_t sustime; + int m_scrWidth; + unsigned long m_currentstart, m_currentend; public: +#ifdef USEQPE virtual void suspend() = 0; virtual void unsuspend() = 0; +#endif size_t getHome() { return m_homepos; } - CExpander() : m_homepos(0), fname(NULL) {}; + CExpander() : m_homepos(0), fname(NULL), m_scrWidth(240), m_currentstart(1), m_currentend(0) {}; virtual ~CExpander() { if (fname != NULL) delete [] fname; }; int openfile(const char *src) { bSuspended = false; fname = strdup(src); return OpenFile(src); } virtual int OpenFile(const char *src) = 0; virtual unsigned int locate() = 0; virtual void locate(unsigned int n) = 0; virtual bool hasrandomaccess() = 0; virtual void sizes(unsigned long& file, unsigned long& text) = 0; virtual CList<Bkmk>* getbkmklist() { return NULL; } - virtual void getch(int& ch, CStyle& sty) + virtual void getch(tchar& ch, CStyle& sty) { - ch = getch(); + int ich = getch(); + ch = (ich == EOF) ? UEOF : ich; sty.unset(); } virtual int getch() = 0; - virtual bool hyperlink(unsigned int n) + virtual linkType hyperlink(unsigned int n, QString& wrd) { locate(n); - return true; + return eLink; } virtual MarkupType PreferredMarkup() = 0; virtual void saveposn(size_t posn) {} - virtual bool forward(size_t& loc) {} - virtual bool back(size_t& loc) {} + virtual void writeposn(size_t posn) {} + virtual bool forward(size_t& loc) { return false; } + virtual bool back(size_t& loc) { return false; } virtual bool hasnavigation() { return false; } - virtual unsigned long startSection() + unsigned long startSection() + { + unsigned long current = locate(); + if (m_currentstart > current || current > m_currentend) + { + start2endSection(); + } + return m_currentstart; + } + unsigned long endSection() + { + unsigned long current = locate(); + if (m_currentstart > current || current > m_currentend) { - return 0; + start2endSection(); + } + return m_currentend; } - virtual unsigned long endSection() + virtual void start2endSection() { - unsigned long file, text; - sizes(file, text); - return text; + m_currentstart = 0; + unsigned long file; + sizes(file, m_currentend); } - virtual QPixmap* getPicture(unsigned long tgt) { return NULL; } + virtual QImage* getPicture(unsigned long tgt) { return NULL; } void setContinuous(bool _b) { m_continuous = _b; } - +#ifdef USEQPE virtual void suspend(FILE*& fin) { bSuspended = true; suspos = ftell(fin); fclose(fin); fin = NULL; sustime = time(NULL); } virtual void unsuspend(FILE*& fin) { if (bSuspended) { bSuspended = false; int delay = time(NULL) - sustime; if (delay < 10) sleep(10-delay); fin = fopen(fname, "rb"); for (int i = 0; fin == NULL && i < 5; i++) { sleep(5); fin = fopen(fname, "rb"); } if (fin == NULL) { QMessageBox::warning(NULL, PROGNAME, "Couldn't reopen file"); exit(0); } suspos = fseek(fin, suspos, SEEK_SET); } } +#endif virtual void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) { len = srclen; data = new unsigned char[len]; memcpy(data, src, len); } virtual void putSaveData(unsigned char*& src, unsigned short& srclen) { if (srclen != 0) { qDebug("Don't know what to do with non-zero save data"); } } + void setwidth(int w) { m_scrWidth = w; } }; #endif diff --git a/noncore/apps/opie-reader/CFilter.cpp b/noncore/apps/opie-reader/CFilter.cpp index d5e3116..73a0872 100644 --- a/noncore/apps/opie-reader/CFilter.cpp +++ b/noncore/apps/opie-reader/CFilter.cpp @@ -1,684 +1,742 @@ #include "CDrawBuffer.h" #include "CFilter.h" unsigned short striphtml::skip_ws() { tchar ch; CStyle sty; do { parent->getch(ch, sty); } while (ch < 33); return ch; } unsigned short striphtml::skip_ws_end() { tchar ch; CStyle sty; parent->getch(ch, sty); if (ch == ' ') { do { parent->getch(ch, sty); } while (ch != '>'); } return ch; } unsigned short striphtml::parse_m() { tchar ch; CStyle sty; parent->getch(ch, sty); if (ch == 'm' || ch == 'M') { ch = skip_ws_end(); if (ch == '>') { return 0; } } return ch; } void striphtml::mygetch(tchar& ch, CStyle& sty) { parent->getch(ch, sty); if (ch == 10) ch = ' '; } void striphtml::getch(tchar& ch, CStyle& sty) { CStyle dummy; mygetch(ch, dummy); if (ch == 10) ch = ' '; while (ch == '<') { ch = skip_ws(); switch (ch) { case 'p': case 'P': ch = skip_ws_end(); if (ch == '>') { ch = 10; continue; } break; case 'b': case 'B': ch = skip_ws_end(); if (ch == '>') { currentstyle.setBold(); mygetch(ch, dummy); continue; } else if (ch == 'r' || ch == 'R') { ch = skip_ws_end(); if (ch == '>') { ch = 10; continue; } } break; case 'i': case 'I': ch = skip_ws_end(); if (ch == '>') { currentstyle.setItalic(); mygetch(ch, dummy); continue; } break; case 'e': case 'E': if ((ch = parse_m()) == 0) { currentstyle.setItalic(); mygetch(ch, dummy); continue; } break; case 'h': case 'H': mygetch(ch, dummy); if ('0' < ch && ch <= '9') { tchar hs = ch; ch = skip_ws_end(); if (ch == '>') { switch (hs) { case '1': // currentstyle = ucBold | ucFontBase+2 | (ucAlignCentre << ucAlignShift); currentstyle.unset(); currentstyle.setFontSize(2); currentstyle.setBold(); currentstyle.setCentreJustify(); break; case '2': // currentstyle = ucBold | ucFontBase+1; currentstyle.unset(); currentstyle.setFontSize(1); currentstyle.setBold(); break; default: // currentstyle = ucBold | ucFontBase; currentstyle.unset(); currentstyle.setBold(); } ch = 10; // mygetch(ch, dummy); continue; } } break; case '/': mygetch(ch, dummy); switch (ch) { case 'b': case 'B': ch = skip_ws_end(); if (ch == '>') { currentstyle.unsetBold(); mygetch(ch, dummy); continue; } break; case 'i': case 'I': ch = skip_ws_end(); if (ch == '>') { currentstyle.unsetItalic(); mygetch(ch, dummy); continue; } break; case 'e': case 'E': if ((ch = parse_m()) == 0) { currentstyle.unsetItalic(); mygetch(ch, dummy); continue; } break; case 'h': case 'H': mygetch(ch, dummy); if ('0' < ch && ch <= '9') { ch = skip_ws_end(); if (ch == '>') { currentstyle.unset(); //mygetch(ch, dummy); ch = 10; continue; } } break; default: break; } break; default: break; } while (ch != '>' && ch != UEOF) { mygetch(ch, dummy); } mygetch(ch, dummy); } if (ch == '&') { mygetch(ch, dummy); if (ch == '#') { int id = 0; mygetch(ch, dummy); while (ch != ';' && ch != UEOF) { id = 10*id+ch-'0'; mygetch(ch, dummy); } ch = id; } } // sty = (dummy == ucFontBase) ? currentstyle : dummy; sty = currentstyle; return; } void textfmt::mygetch(tchar& ch, CStyle& sty) { if (uselast) { ch = lastchar; uselast = false; } else { parent->getch(ch, sty); } } void textfmt::getch(tchar& ch, CStyle& sty) { mygetch(ch, sty); do { sty = currentstyle; switch (ch) { case 10: currentstyle.unset(); sty = currentstyle; break; // Use this if you want to replace -- by em-dash case '-': // parent->getch(ch, sty); mygetch(ch, sty); if (ch == '-') { ch = 0x2014; } else { lastchar = ch; uselast = true; ch = '-'; } break; case '*': if (currentstyle.isBold()) { // Already bold - time to turn it off? // The next two lines ensure that * follows a character but it works better without // QChar c(lastchar); // if ((lastchar != '*') && (c.isPunct() || c.isLetterOrNumber())) if (lastchar != '*') { currentstyle.unsetBold(); CStyle dummy; // parent->getch(ch, dummy); mygetch(ch, dummy); } } else { // not bold - time to turn it on? CStyle dummy; // parent->getch(ch, dummy); mygetch(ch, dummy); QChar c(ch); if ((ch != '*') && (c.isPunct() || c.isLetterOrNumber())) { currentstyle.setBold(); } else { lastchar = ch; uselast = true; ch = '*'; } } break; case '_': if (currentstyle.isItalic()) { // Already bold - time to turn it off? // The next two lines ensure that * follows a character but it works better without // QChar c(lastchar); // if ((lastchar != '_') && (c.isPunct() || c.isLetterOrNumber())) if (lastchar != '_') { currentstyle.unsetItalic(); CStyle dummy; // parent->getch(ch, dummy); mygetch(ch, dummy); } } else { // not bold - time to turn it on? CStyle dummy; // parent->getch(ch, dummy); mygetch(ch, dummy); QChar c(ch); if ((ch != '_') && (c.isPunct() || c.isLetterOrNumber())) { currentstyle.setItalic(); } else { lastchar = ch; uselast = true; ch = '_'; } } break; } } while (sty != currentstyle); if (!uselast) lastchar = ch; return; } void remap::getch(tchar& ch, CStyle& sty) { if (q[offset] != 0) { q[offset++]; sty = currentstyle; return; } parent->getch(ch, sty); switch (ch) { case 0x201a: ch = '\''; break; case 0x0192: ch = 'f'; break; case 0x201e: ch = '"'; break; case 0x2026: offset = 0; q[0] = '.'; q[1] = '.'; q[2] = 0; ch = '.'; // should be ... break; case 0x0160: ch = 'S'; break; case 0x2039: ch = '<'; break; case 0x0152: offset = 0; q[0] = 'E'; q[1] = 0; ch = 'O'; break; case 0x017d: ch = 'Z'; break; case 0x2018: ch = '\''; break; case 0x2019: ch = '\''; break; case 0x201c: ch = '"'; break; case 0x201d: ch = '"'; break; case 0x2022: ch = '>'; break; case 0x2013: ch = '-'; break; case 0x2014: offset = 0; q[0] = '-'; q[1] = 0; ch = '-'; // should be -- break; case 0x02dc: ch = '~'; break; case 0x0161: ch = 's'; break; case 0x203a: ch = '>'; break; case 0x0153: offset = 0; q[0] = 'e'; q[1] = 0; ch = 'o';// should be oe break; case 0x017e: ch = 'z'; break; case 0x0178: ch = 'Y'; break; } currentstyle = sty; } void PeanutFormatter::getch(tchar& ch, CStyle& sty) { CStyle dummy; currentstyle.setColour(0,0,0); parent->getch(ch, dummy); while (ch == '\\') { parent->getch(ch, dummy); if (ch == '\\') break; switch(ch) { case 'a': { int code = 0; for (int i = 0; i < 3; i++) { parent->getch(ch, dummy); code = 10*code + ch - '0'; } ch = code; } break; case 'v': { while (1) { parent->getch(ch, dummy); if (ch == '\\') { parent->getch(ch, dummy); if (ch == 'v') { parent->getch(ch, dummy); break; } } } } break; case 's': case 'n': currentstyle.setFontSize(0); parent->getch(ch,dummy); break; case 'p': currentstyle.unset(); // parent->getch(ch,dummy); ch = 10; break; case 'l': if (currentstyle.getFontSize() == 1) { currentstyle.setFontSize(0); } else { currentstyle.setFontSize(1); } parent->getch(ch, dummy); break; case 'x': if (currentstyle.getFontSize() == 0) { // currentstyle.unset(); // currentstyle.setBold(); currentstyle.setFontSize(1); } else { currentstyle.unset(); } // parent->getch(ch, dummy); ch = 10; break; case 'i': if (currentstyle.isItalic()) { currentstyle.unsetItalic(); } else { currentstyle.setItalic(); } parent->getch(ch, dummy); break; case 'b': case 'B': if (currentstyle.isBold()) { currentstyle.unsetBold(); } else { currentstyle.setBold(); } parent->getch(ch, dummy); break; case 'c': if (currentstyle.getJustify() == m_AlignCentre) { currentstyle.setLeftJustify(); } else { currentstyle.setCentreJustify(); } parent->getch(ch, dummy); break; case 'r': if (currentstyle.getJustify() == m_AlignRight) { currentstyle.setLeftJustify(); } else { currentstyle.setRightJustify(); } parent->getch(ch, dummy); break; default: currentstyle.setColour(255,0,0); } } sty = currentstyle; } void OnePara::getch(tchar& ch, CStyle& sty) { parent->getch(ch, sty); if (m_lastchar == 10) { while (ch == 10) parent->getch(ch, sty); } m_lastchar = ch; } #ifdef REPALM void repalm::getch(tchar& ch, CStyle& sty) { parent->getch(ch, sty); switch (ch) { case 0x80: ch = 0x20ac; break; case 0x82: ch = 0x201a; break; case 0x83: ch = 0x0192; break; case 0x84: ch = 0x201e; break; case 0x85: ch = 0x2026; break; case 0x86: ch = 0x2020; break; case 0x87: ch = 0x2021; break; case 0x88: ch = 0x02c6; break; case 0x89: ch = 0x2030; break; case 0x8a: ch = 0x0160; break; case 0x8b: ch = 0x2039; break; case 0x8c: ch = 0x0152; break; /* case 0x8e: ch = 0x017d; break; */ case 0x91: ch = 0x2018; break; case 0x92: ch = 0x2019; break; case 0x93: ch = 0x201c; break; case 0x94: ch = 0x201d; break; case 0x95: ch = 0x2022; break; case 0x96: ch = 0x2013; break; case 0x97: ch = 0x2014; break; case 0x98: ch = 0x02dc; break; case 0x99: ch = 0x2122; break; case 0x9a: ch = 0x0161; break; case 0x9b: ch = 0x203a; break; case 0x9c: ch = 0x0153; break; case 0x9e: ch = 0x017e; break; case 0x9f: ch = 0x0178; break; case 0x18: ch = 0x2026; break; case 0x19: ch = 0x2007; break; case 0x8d: ch = 0x2662; break; case 0x8e: ch = 0x2663; break; case 0x8f: ch = 0x2661; break; case 0x90: ch = 0x2660; break; default: break; } } #endif + +//static tchar nextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 }; +//static tchar prevpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','p','r','e','v','i','o','u','s',' ','p','a','r','t',0 }; + +void DePluck::getch(tchar& ch, CStyle& sty) +{ + if (m_buffed > 0) + { + sty = m_laststyle; + ch = nextpart[m_current++]; + if (m_current == m_buffed) + { + m_current = m_buffed = 0; + } + } + else + { + if (m_buffer != 0) + { + ch = m_buffer; + m_buffer = 0; + return; + } + unsigned long lnk; + do + { + if (nextpart[m_buffed] == 0) break; + parent->getch(ch, sty); + m_laststyle = sty; + if (sty.getLink()) lnk = sty.getData(); + } while (ch == nextpart[m_buffed] && sty.getLink() && ++m_buffed); + m_current = 0; + if (nextpart[m_buffed] == 0) + { + m_buffed = 0; + QString dmy; + parent->hyperlink(lnk, dmy); + do + { + parent->getch(ch, sty); + } + while (ch != 10); + parent->getch(ch, sty); + } + else if (m_buffed > 0) + { + m_buffer = ch; + ch = nextpart[0]; + if (m_buffed == 1) + { + m_buffed = 0; + } + else m_current = 1; + } + } + + return; +} diff --git a/noncore/apps/opie-reader/CFilter.h b/noncore/apps/opie-reader/CFilter.h index 2d0c30f..0a03b3e 100644 --- a/noncore/apps/opie-reader/CFilter.h +++ b/noncore/apps/opie-reader/CFilter.h @@ -1,287 +1,328 @@ #ifndef __CFILTER_H #define __CFILTER_H #include "CExpander.h" #include "CEncoding.h" class CFilter : public CCharacterSource { friend class CFilterChain; protected: CCharacterSource* parent; + linkType hyperlink(unsigned int n, QString& w) + { + return parent->hyperlink(n,w); + } public: CFilter() : parent(NULL) {} void setparent(CCharacterSource* p) { parent = p; } virtual ~CFilter() {}; }; class CFilterChain { CExpander* expander; CEncoding* encoder; CFilter* first; CCharacterSource* front; public: CFilterChain(CEncoding* _e) : encoder(_e), first(NULL), front(_e) {}; ~CFilterChain() { CCharacterSource* p = front; while (p != encoder) { CFilter* pnext = (CFilter*)p; p = ((CFilter*)p)->parent; delete pnext; } delete encoder; } void getch(tchar& ch, CStyle& sty) { front->getch(ch, sty); } void addfilter(CFilter* p) { if (first == NULL) { front = first = p; p->setparent(encoder); } else { p->setparent(front); front = p; } } void setsource(CExpander* p) { expander = p; encoder->setparent(p); } void setencoder(CEncoding* p) { delete encoder; encoder = p; first->setparent(p); encoder->setparent(expander); } }; class stripcr : public CFilter { public: stripcr() {} - virtual ~stripcr() {} - virtual void getch(tchar& ch, CStyle& sty) + ~stripcr() {} + void getch(tchar& ch, CStyle& sty) { do { parent->getch(ch, sty); } while (ch == 13); } }; class dehyphen : public CFilter { bool m_bCharWaiting; tchar m_nextChar; CStyle m_nextSty; public: dehyphen() : m_bCharWaiting(false) {} - virtual ~dehyphen() {} - virtual void getch(tchar& ch, CStyle& sty) + ~dehyphen() {} + void getch(tchar& ch, CStyle& sty) { if (m_bCharWaiting) { m_bCharWaiting = false; ch = m_nextChar; sty = m_nextSty; return; } parent->getch(ch, sty); if (ch != '-') return; parent->getch(m_nextChar, m_nextSty); if (m_nextChar != 10) { m_bCharWaiting = true; ch = '-'; return; } parent->getch(ch, sty); } }; class striphtml : public CFilter { CStyle currentstyle; unsigned short skip_ws(); unsigned short skip_ws_end(); unsigned short parse_m(); void mygetch(tchar& ch, CStyle& sty); public: striphtml() {} - virtual ~striphtml() {} - virtual void getch(tchar& ch, CStyle& sty); + ~striphtml() {} + void getch(tchar& ch, CStyle& sty); }; class unindent : public CFilter { tchar lc; public: unindent() : lc(0) {} - virtual ~unindent() {} - virtual void getch(tchar& ch, CStyle& sty) + ~unindent() {} + void getch(tchar& ch, CStyle& sty) { if (lc == 10) { do { parent->getch(ch, sty); } while (ch == ' '); } else parent->getch(ch, sty); lc = ch; return; } }; class repara : public CFilter { tchar tch; public: repara() : tch(0) {} - virtual ~repara() {} - virtual void getch(tchar& ch, CStyle& sty) + ~repara() {} + void getch(tchar& ch, CStyle& sty) { parent->getch(ch, sty); if (ch == 10) { if (tch == 10) { return; } else { tch = ch; ch = ' '; return; } } tch = ch; return; } }; class indenter : public CFilter { int amnt; int indent; CStyle lsty; public: indenter(int _a=5) : amnt(_a), indent(0) {} - virtual ~indenter() {} - virtual void getch(tchar& ch, CStyle& sty) + ~indenter() {} + void getch(tchar& ch, CStyle& sty) { if (indent > 0) { indent--; ch = ' '; sty = lsty; return; } parent->getch(ch, sty); if (ch == 10) { indent = amnt; lsty = sty; } return; } }; class dblspce : public CFilter { bool lastlf; CStyle lsty; public: dblspce() : lastlf(false) {} - virtual ~dblspce() {} - virtual void getch(tchar& ch, CStyle& sty) + ~dblspce() {} + void getch(tchar& ch, CStyle& sty) { if (lastlf) { lastlf = false; ch = 10; sty = lsty; return; } parent->getch(ch, sty); if (lastlf = (ch == 10)) { lsty = sty; } return; } }; class textfmt : public CFilter { CStyle currentstyle; tchar lastchar; bool uselast; void mygetch(tchar&, CStyle&); public: textfmt() : lastchar(0), uselast(false) {} - virtual ~textfmt() {} - virtual void getch(tchar& ch, CStyle& sty); + ~textfmt() {} + void getch(tchar& ch, CStyle& sty); }; class embolden : public CFilter { public: embolden() {} - virtual ~embolden() {} - virtual void getch(tchar& ch, CStyle& sty) + ~embolden() {} + void getch(tchar& ch, CStyle& sty) { parent->getch(ch, sty); sty.setBold(); } }; class remap : public CFilter { tchar q[3]; int offset; CStyle currentstyle; public: remap() : offset(0) { q[0] = 0; } - virtual ~remap() {} - virtual void getch(tchar& ch, CStyle& sty); + ~remap() {} + void getch(tchar& ch, CStyle& sty); }; class PeanutFormatter : public CFilter { CStyle currentstyle; public: - virtual ~PeanutFormatter() {} - virtual void getch(tchar& ch, CStyle& sty); + ~PeanutFormatter() {} + void getch(tchar& ch, CStyle& sty); }; class OnePara : public CFilter { tchar m_lastchar; public: OnePara() : m_lastchar(0) {} - virtual ~OnePara() {} - virtual void getch(tchar& ch, CStyle& sty); + ~OnePara() {} + void getch(tchar& ch, CStyle& sty); +}; + +class DePluck : public CFilter +{ + tchar* nextpart; + tchar m_buffer; + int m_buffed; + int m_current; + bool m_debuff; + CStyle m_laststyle; + public: + DePluck(tchar* t) : nextpart(t), m_buffer(0), m_buffed(0), m_current(0), m_debuff(false) {} + ~DePluck() {} + void getch(tchar& ch, CStyle& sty); }; #ifdef REPALM class repalm : public CFilter { public: - virtual ~repalm() {} - virtual void getch(tchar& ch, CStyle& sty); + ~repalm() {} + void getch(tchar& ch, CStyle& sty); }; #endif + +class FullJust : public CFilter +{ + public: + void getch(tchar& ch, CStyle& sty) + { + parent->getch(ch, sty); + if (sty.getJustify() == m_AlignLeft) sty.setFullJustify(); + } +}; +/* +class AddSpace : public CFilter +{ + unsigned char m_espc; + public: + AddSpace(unsigned char s) : m_espc(s) {} + void getch(tchar& ch, CStyle& sty) + { + parent->getch(ch, sty); + sty.setExtraSpace(m_espc); + } +}; +*/ #endif diff --git a/noncore/apps/opie-reader/Filedata.h b/noncore/apps/opie-reader/Filedata.h index f920238..096dd31 100644 --- a/noncore/apps/opie-reader/Filedata.h +++ b/noncore/apps/opie-reader/Filedata.h @@ -1,51 +1,51 @@ #ifndef __FILEDATA_H #define __FILEDATA_H #include <time.h> class CFiledata { unsigned char* data; bool m_own; public: CFiledata(tchar* d) { data = (unsigned char*)d; m_own = false; } CFiledata(time_t dt, tchar* nm) { int nlen = ustrlen(nm)+1; data = new unsigned char[sizeof(time_t)+sizeof(tchar)*nlen]; *((time_t *)data) = dt; memcpy(data+sizeof(time_t), nm, sizeof(tchar)*nlen); m_own = true; } ~CFiledata() { if (m_own && data != NULL) { delete [] data; - qDebug("~Filedata: deleting"); +// qDebug("~Filedata: deleting"); } else { - qDebug("~Filedata: not deleting"); +// qDebug("~Filedata: not deleting"); } } tchar* name() const { return (tchar*)(data+sizeof(time_t)); } time_t date() { return *((time_t *)data); } void setdate(time_t _t) { *((time_t *)data) = _t; } unsigned char* content() { return data; } size_t length() const { return sizeof(time_t)+sizeof(tchar)*(ustrlen(name())+1); } bool operator==(const CFiledata& rhs) { return ((length() == rhs.length()) && (memcmp(data, rhs.data, length()) == 0)); } bool samename(const CFiledata& rhs) { return (ustrcmp((tchar *)(data+sizeof(time_t)),(tchar *)(rhs.data+sizeof(time_t))) == 0); } }; #endif diff --git a/noncore/apps/opie-reader/FontControl.cpp b/noncore/apps/opie-reader/FontControl.cpp index f0ed98b..e03bf64 100644 --- a/noncore/apps/opie-reader/FontControl.cpp +++ b/noncore/apps/opie-reader/FontControl.cpp @@ -1,37 +1,60 @@ #include "opie.h" +#include "useqpe.h" #include "FontControl.h" +int FontControl::gzoom() +{ + int ret; + if (m_size == g_size) + { + ret = m_fontsizes[m_size]*m_basesize; + } + else if (g_size < 0) + { + int f = -g_size; + ret = (m_fontsizes[0]*m_basesize) >> (f/2); + if (f%2) ret = (2*ret/3); + } + else + { + int f = g_size - m_maxsize + 1; + ret = (m_fontsizes[m_maxsize-1]*m_basesize) << (f/2); + if (f%2) ret = (3*ret/2); + } + return ret; +} + bool FontControl::ChangeFont(QString& n, int tgt) { QValueList<int>::Iterator it; QFontDatabase fdb; QValueList<int> sizes = fdb.pointSizes(n); if (sizes.count() == 0) { return false; } else { m_fontname = n; m_maxsize = sizes.count(); if (m_fontsizes != NULL) delete [] m_fontsizes; m_fontsizes = new int[m_maxsize]; uint i = 0; uint best = 0; for (it = sizes.begin(); it != sizes.end(); it++) { -#ifdef OPIE +#if defined(OPIE) || !defined(USEQPE) m_fontsizes[i] = (*it); #else m_fontsizes[i] = (*it)/10; #endif if (abs(tgt-m_fontsizes[i]) < abs(tgt-m_fontsizes[best])) { best = i; } i++; } - m_size = best; + g_size = m_size = best; } return true; } diff --git a/noncore/apps/opie-reader/FontControl.h b/noncore/apps/opie-reader/FontControl.h index 02049d0..5681496 100644 --- a/noncore/apps/opie-reader/FontControl.h +++ b/noncore/apps/opie-reader/FontControl.h @@ -1,104 +1,153 @@ #ifndef __FONTCONTROL_H #define __FONTCONTROL_H #include <qfontdatabase.h> #include <qfontmetrics.h> #include "StyleConsts.h" class FontControl { int * m_fontsizes; - int m_size; + int m_size, g_size; QString m_fontname; + QString m_fixedfontname; int m_maxsize; bool m_hasCourier; + int m_leading, m_extraspace; + unsigned char m_basesize; public: + void setBaseSize(unsigned char _s) { m_basesize = _s; } + unsigned char getBaseSize() { return m_basesize; } + int gzoom(); FontControl(QString n = "helvetica", int size = 10) : - m_fontsizes(NULL), m_hasCourier(false) + m_fontsizes(NULL), m_hasCourier(false), m_leading(0), m_extraspace(0) { ChangeFont(n, size); } ~FontControl() { if (m_fontsizes != NULL) delete [] m_fontsizes; } - void hasCourier(bool _b) { m_hasCourier = _b; } + void hasCourier(bool _b, const QString& _nm) + { + m_hasCourier = _b; + m_fixedfontname = _nm; + } + QString& fixedfontname() { return m_fixedfontname; } bool hasCourier() { return m_hasCourier; } QString name() { return m_fontname; } int currentsize() { return m_fontsizes[m_size]; } - int getsize(CStyle size) + int getsize(const CStyle& size) { int tgt = m_size+size.getFontSize(); if (tgt < 0) { tgt = 0; } if (tgt >= m_maxsize) { tgt = m_maxsize - 1; } return m_fontsizes[tgt]; } int ascent() { QFont f(name(), currentsize()); QFontMetrics fm(f); return fm.ascent(); } - int ascent(CStyle ch) + int ascent(const CStyle& ch) { QFont f(name(), getsize(ch)); QFontMetrics fm(f); return fm.ascent(); } int descent() { QFont f(name(), currentsize()); QFontMetrics fm(f); return fm.descent(); } - int descent(CStyle ch) + int descent(const CStyle& ch) { QFont f(name(), getsize(ch)); QFontMetrics fm(f); return fm.descent(); } int lineSpacing() { QFont f(name(), currentsize()); QFontMetrics fm(f); return fm.lineSpacing(); } - int lineSpacing(CStyle ch) + int lineSpacing(const CStyle& ch) { QFont f(name(), getsize(ch)); QFontMetrics fm(f); return fm.lineSpacing(); } bool decreasesize() { +/* if (--m_size < 0) { m_size = 0; return false; } else return true; +*/ + if (g_size-- == m_size) + { + if (--m_size < 0) + { + m_size = 0; + } + } +// qDebug("Font:%d Graphics:%d", m_size, g_size); + return true; } bool increasesize() { +/* if (++m_size >= m_maxsize) { m_size = m_maxsize - 1; return false; } else return true; +*/ + if (g_size++ == m_size) + { + if (++m_size >= m_maxsize) + { + m_size = m_maxsize - 1; + } + } +// qDebug("Font:%d Graphics:%d", m_size, g_size); + return true; } bool ChangeFont(QString& n) { return ChangeFont(n, currentsize()); } bool ChangeFont(QString& n, int tgt); + void setlead(int _lead) + { + m_leading = _lead; + } + int getlead() + { + return m_leading; + } + void setextraspace(int _lead) + { + m_extraspace = _lead; + } + int getextraspace() + { + return m_extraspace; + } }; #endif diff --git a/noncore/apps/opie-reader/Navigation.cpp b/noncore/apps/opie-reader/Navigation.cpp index 4f11887..36e33b4 100644 --- a/noncore/apps/opie-reader/Navigation.cpp +++ b/noncore/apps/opie-reader/Navigation.cpp @@ -1,100 +1,122 @@ -#include "Navigation.h" - +#ifdef _WINDOWS #include <string.h> +#endif +#include "Navigation.h" +//#include <stdio.h> +/* + void saveposn(size_t posn) + save/push position to history buffer for future use of back() function +*/ void CNavigation::saveposn(size_t posn) { -// qDebug("Saved:%u [%u,%u,%u]", posn, historystart, historycurrent, historyend); - historycurrent = historyend = (historycurrent+1)%NAVIGATION_HISTORY_SIZE; + //printf("saving position %u, depth %u\n",posn,historycurrent); history[historycurrent] = posn; - if (historystart == historyend) historystart = (historystart+1)%NAVIGATION_HISTORY_SIZE; -// qDebug("Saved:%u [%u,%u,%u]", posn, historystart, historycurrent, historyend); -} - -bool CNavigation::forward(size_t& loc) -{ - if (historycurrent != historyend) - { historycurrent = (historycurrent + 1)%NAVIGATION_HISTORY_SIZE; - loc = history[historycurrent]; -// qDebug("Forward:%u [%u,%u,%u]", loc, historystart, historycurrent, historyend); - return true; + if (historycurrent==historystart) + // circular buffer full, forget oldest record + historystart=(historystart+1)%NAVIGATION_HISTORY_SIZE; + // no forward possible after saveposn + historyend = historycurrent; } - else + +/* + void writeposn(size_t posn) + overwrite current (unused) position + useful for saving current position before using back button +*/ +void CNavigation::writeposn(size_t posn) { - return false; - } + //printf("witing position %u, depth %u\n",posn,historycurrent); + history[historycurrent] = posn; } -bool CNavigation::back(size_t& loc) -{ - if (historyend != historystart) +/* + bool back(size_t& posn) + go back in history + restore last position saved with saveposn() and return true + return false if there is nothing saved in history +*/ +bool CNavigation::back(size_t& posn) { -// qDebug("Back:%u [%u,%u,%u]", loc, historystart, historycurrent, historyend); - if (historycurrent == historyend && history[historycurrent] != loc) - { - historyend = (historyend+1) % NAVIGATION_HISTORY_SIZE; - history[historyend] = loc; - } + if (historycurrent!=historystart) { + // buffer is not empty + if (historycurrent==0) + historycurrent=NAVIGATION_HISTORY_SIZE-1; else - { - size_t sv = historycurrent; - historycurrent = (historycurrent + NAVIGATION_HISTORY_SIZE - 1) % NAVIGATION_HISTORY_SIZE; - if (historycurrent == historystart) - { - historycurrent = sv; + historycurrent--; + posn=history[historycurrent]; + //printf("back(): going back to %u depth %u\n",posn,historycurrent); + return true; + + } else { + // circular buffer empty + //printf("back(): empty history\n"); return false; } } - loc = history[historycurrent]; -// qDebug("Back:%u [%u,%u,%u]", loc, historystart, historycurrent, historyend); - return true; - } - else + +/* + bool forward(size_t& posn) + go forward in history, if possible + undo calling of back() +*/ +bool CNavigation::forward(size_t& posn) { + if (historycurrent!=historyend) { + // [historycurrent] = current position + // [historycurrent+1] = position we need + historycurrent=(historycurrent+1)%NAVIGATION_HISTORY_SIZE; + posn = history[historycurrent]; + //printf("forward(): going to position %d\n",posn); + return true; + } else { + //printf("forward(): there is no future :)\n"); return false; } } -#include <stdio.h> - void CNavigation::setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) { len = srclen+sizeof(size_t)*(3+NAVIGATION_HISTORY_SIZE); data = new unsigned char[len]; unsigned char* p = data; memcpy(p, src, srclen); p += srclen; memcpy(p, &historystart, sizeof(size_t)); p += sizeof(size_t); memcpy(p, &historyend, sizeof(size_t)); p += sizeof(size_t); memcpy(p, &historycurrent, sizeof(size_t)); p += sizeof(size_t); memcpy(p, history, sizeof(size_t)*NAVIGATION_HISTORY_SIZE); +/* printf("<%u,%u,%u>\n", historystart, historyend, historycurrent); for (int i = historystart; i <= historyend; i++) printf("<%u> ", history[i]); printf("\n"); +*/ } void CNavigation::putSaveData(unsigned char*& src, unsigned short& srclen) { if (srclen >= sizeof(size_t)*(3+NAVIGATION_HISTORY_SIZE)) { unsigned char* p = src; memcpy(&historystart, p, sizeof(size_t)); p += sizeof(size_t); memcpy(&historyend, p, sizeof(size_t)); p += sizeof(size_t); memcpy(&historycurrent, p, sizeof(size_t)); p += sizeof(size_t); memcpy(history, p, sizeof(size_t)*NAVIGATION_HISTORY_SIZE); src = p + sizeof(size_t)*NAVIGATION_HISTORY_SIZE; srclen -= sizeof(size_t)*(3+NAVIGATION_HISTORY_SIZE); } +/* printf("<%u,%u,%u>\n", historystart, historyend, historycurrent); for (int i = historystart; i <= historyend; i++) printf("<%u> ", history[i]); printf("\n"); +*/ } diff --git a/noncore/apps/opie-reader/Navigation.h b/noncore/apps/opie-reader/Navigation.h index 57fb006..19d7f81 100644 --- a/noncore/apps/opie-reader/Navigation.h +++ b/noncore/apps/opie-reader/Navigation.h @@ -1,16 +1,18 @@ +#include <string.h> #include <stdlib.h> const size_t NAVIGATION_HISTORY_SIZE = 32; class CNavigation { size_t history[NAVIGATION_HISTORY_SIZE]; size_t historystart, historyend, historycurrent; public: CNavigation() : historystart(0),historyend(0),historycurrent(0) {} void saveposn(size_t posn); + void writeposn(size_t posn); bool forward(size_t& loc); bool back(size_t& loc); void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen); void putSaveData(unsigned char*& src, unsigned short& srclen); }; diff --git a/noncore/apps/opie-reader/Palm2QImage.cpp b/noncore/apps/opie-reader/Palm2QImage.cpp index 9603877..bf5ece3 100644 --- a/noncore/apps/opie-reader/Palm2QImage.cpp +++ b/noncore/apps/opie-reader/Palm2QImage.cpp @@ -1,308 +1,309 @@ /* -*- mode: c; indent-tabs-mode: nil; -*- */ +#include "useqpe.h" #include <stdio.h> #include <stdlib.h> #include <string.h> -#ifndef WINDOWS
+#ifndef _WINDOWS #include <unistd.h> /* for link */
#endif #include <sys/types.h> #include <sys/stat.h> #include <stdarg.h> #include <qimage.h> /***********************************************************************/ /***********************************************************************/ /***** *****/ /***** Code to decode the Palm image format to JPEG *****/ /***** *****/ /***********************************************************************/ /***********************************************************************/ #define READ_BIGENDIAN_SHORT(p) (((p)[0] << 8)|((p)[1])) #define READ_BIGENDIAN_LONG(p) (((p)[0] << 24)|((p)[1] << 16)|((p)[2] << 8)|((p)[3])) #define PALM_IS_COMPRESSED_FLAG 0x8000 #define PALM_HAS_COLORMAP_FLAG 0x4000 #define PALM_HAS_TRANSPARENCY_FLAG 0x2000 #define PALM_DIRECT_COLOR_FLAG 0x0400 #define PALM_4_BYTE_FIELD_FLAG 0x0200 #define PALM_COMPRESSION_SCANLINE 0x00 #define PALM_COMPRESSION_RLE 0x01 #define PALM_COMPRESSION_PACKBITS 0x02 #define PALM_COMPRESSION_NONE 0xFF #define PALM_COLORMAP_SIZE 232 typedef struct { unsigned char red; unsigned char green; unsigned char blue; } ColorMapEntry; static ColorMapEntry Palm8BitColormap[] = { { 255, 255, 255 }, { 255, 204, 255 }, { 255, 153, 255 }, { 255, 102, 255 }, { 255, 51, 255 }, { 255, 0, 255 }, { 255, 255, 204 }, { 255, 204, 204 }, { 255, 153, 204 }, { 255, 102, 204 }, { 255, 51, 204 }, { 255, 0, 204 }, { 255, 255, 153 }, { 255, 204, 153 }, { 255, 153, 153 }, { 255, 102, 153 }, { 255, 51, 153 }, { 255, 0, 153 }, { 204, 255, 255 }, { 204, 204, 255 }, { 204, 153, 255 }, { 204, 102, 255 }, { 204, 51, 255 }, { 204, 0, 255 }, { 204, 255, 204 }, { 204, 204, 204 }, { 204, 153, 204 }, { 204, 102, 204 }, { 204, 51, 204 }, { 204, 0, 204 }, { 204, 255, 153 }, { 204, 204, 153 }, { 204, 153, 153 }, { 204, 102, 153 }, { 204, 51, 153 }, { 204, 0, 153 }, { 153, 255, 255 }, { 153, 204, 255 }, { 153, 153, 255 }, { 153, 102, 255 }, { 153, 51, 255 }, { 153, 0, 255 }, { 153, 255, 204 }, { 153, 204, 204 }, { 153, 153, 204 }, { 153, 102, 204 }, { 153, 51, 204 }, { 153, 0, 204 }, { 153, 255, 153 }, { 153, 204, 153 }, { 153, 153, 153 }, { 153, 102, 153 }, { 153, 51, 153 }, { 153, 0, 153 }, { 102, 255, 255 }, { 102, 204, 255 }, { 102, 153, 255 }, { 102, 102, 255 }, { 102, 51, 255 }, { 102, 0, 255 }, { 102, 255, 204 }, { 102, 204, 204 }, { 102, 153, 204 }, { 102, 102, 204 }, { 102, 51, 204 }, { 102, 0, 204 }, { 102, 255, 153 }, { 102, 204, 153 }, { 102, 153, 153 }, { 102, 102, 153 }, { 102, 51, 153 }, { 102, 0, 153 }, { 51, 255, 255 }, { 51, 204, 255 }, { 51, 153, 255 }, { 51, 102, 255 }, { 51, 51, 255 }, { 51, 0, 255 }, { 51, 255, 204 }, { 51, 204, 204 }, { 51, 153, 204 }, { 51, 102, 204 }, { 51, 51, 204 }, { 51, 0, 204 }, { 51, 255, 153 }, { 51, 204, 153 }, { 51, 153, 153 }, { 51, 102, 153 }, { 51, 51, 153 }, { 51, 0, 153 }, { 0, 255, 255 }, { 0, 204, 255 }, { 0, 153, 255 }, { 0, 102, 255 }, { 0, 51, 255 }, { 0, 0, 255 }, { 0, 255, 204 }, { 0, 204, 204 }, { 0, 153, 204 }, { 0, 102, 204 }, { 0, 51, 204 }, { 0, 0, 204 }, { 0, 255, 153 }, { 0, 204, 153 }, { 0, 153, 153 }, { 0, 102, 153 }, { 0, 51, 153 }, { 0, 0, 153 }, { 255, 255, 102 }, { 255, 204, 102 }, { 255, 153, 102 }, { 255, 102, 102 }, { 255, 51, 102 }, { 255, 0, 102 }, { 255, 255, 51 }, { 255, 204, 51 }, { 255, 153, 51 }, { 255, 102, 51 }, { 255, 51, 51 }, { 255, 0, 51 }, { 255, 255, 0 }, { 255, 204, 0 }, { 255, 153, 0 }, { 255, 102, 0 }, { 255, 51, 0 }, { 255, 0, 0 }, { 204, 255, 102 }, { 204, 204, 102 }, { 204, 153, 102 }, { 204, 102, 102 }, { 204, 51, 102 }, { 204, 0, 102 }, { 204, 255, 51 }, { 204, 204, 51 }, { 204, 153, 51 }, { 204, 102, 51 }, { 204, 51, 51 }, { 204, 0, 51 }, { 204, 255, 0 }, { 204, 204, 0 }, { 204, 153, 0 }, { 204, 102, 0 }, { 204, 51, 0 }, { 204, 0, 0 }, { 153, 255, 102 }, { 153, 204, 102 }, { 153, 153, 102 }, { 153, 102, 102 }, { 153, 51, 102 }, { 153, 0, 102 }, { 153, 255, 51 }, { 153, 204, 51 }, { 153, 153, 51 }, { 153, 102, 51 }, { 153, 51, 51 }, { 153, 0, 51 }, { 153, 255, 0 }, { 153, 204, 0 }, { 153, 153, 0 }, { 153, 102, 0 }, { 153, 51, 0 }, { 153, 0, 0 }, { 102, 255, 102 }, { 102, 204, 102 }, { 102, 153, 102 }, { 102, 102, 102 }, { 102, 51, 102 }, { 102, 0, 102 }, { 102, 255, 51 }, { 102, 204, 51 }, { 102, 153, 51 }, { 102, 102, 51 }, { 102, 51, 51 }, { 102, 0, 51 }, { 102, 255, 0 }, { 102, 204, 0 }, { 102, 153, 0 }, { 102, 102, 0 }, { 102, 51, 0 }, { 102, 0, 0 }, { 51, 255, 102 }, { 51, 204, 102 }, { 51, 153, 102 }, { 51, 102, 102 }, { 51, 51, 102 }, { 51, 0, 102 }, { 51, 255, 51 }, { 51, 204, 51 }, { 51, 153, 51 }, { 51, 102, 51 }, { 51, 51, 51 }, { 51, 0, 51 }, { 51, 255, 0 }, { 51, 204, 0 }, { 51, 153, 0 }, { 51, 102, 0 }, { 51, 51, 0 }, { 51, 0, 0 }, { 0, 255, 102 }, { 0, 204, 102 }, { 0, 153, 102 }, { 0, 102, 102 }, { 0, 51, 102 }, { 0, 0, 102 }, { 0, 255, 51 }, { 0, 204, 51 }, { 0, 153, 51 }, { 0, 102, 51 }, { 0, 51, 51 }, { 0, 0, 51 }, { 0, 255, 0 }, { 0, 204, 0 }, { 0, 153, 0 }, { 0, 102, 0 }, { 0, 51, 0 }, { 17, 17, 17 }, { 34, 34, 34 }, { 68, 68, 68 }, { 85, 85, 85 }, { 119, 119, 119 }, { 136, 136, 136 }, { 170, 170, 170 }, { 187, 187, 187 }, { 221, 221, 221 }, { 238, 238, 238 }, { 192, 192, 192 }, { 128, 0, 0 }, { 128, 0, 128 }, { 0, 128, 0 }, { 0, 128, 128 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }}; static ColorMapEntry Palm1BitColormap[] = {{ 255, 255, 255 }, { 0, 0, 0 }}; static ColorMapEntry Palm2BitColormap[] = { { 255, 255, 255 }, { 192, 192, 192 }, { 128, 128, 128 }, { 0, 0, 0 }}; static ColorMapEntry Palm4BitColormap[] = { { 255, 255, 255 }, { 238, 238, 238 }, { 221, 221, 221 }, { 204, 204, 204 }, { 187, 187, 187 }, { 170, 170, 170 }, { 153, 153, 153 }, { 136, 136, 136 }, { 119, 119, 119 }, { 102, 102, 102 }, { 85, 85, 85 }, { 68, 68, 68 }, { 51, 51, 51 }, { 34, 34, 34 }, { 17, 17, 17 }, { 0, 0, 0 }}; QImage* Palm2QImage (unsigned char *image_bytes_in, int byte_count_in) { unsigned int width, height, bytes_per_row, flags, next_depth_offset; unsigned int bits_per_pixel, version, transparent_index, compression_type, i, j, inval, inbit, mask, incount; unsigned int palm_red_bits, palm_green_bits, palm_blue_bits; unsigned char *palm_ptr, *x_ptr, *imagedata, *inbyte, *rowbuf, *lastrow, *imagedatastart, *palmimage; ColorMapEntry *colormap; palmimage = image_bytes_in; width = READ_BIGENDIAN_SHORT(palmimage + 0); height = READ_BIGENDIAN_SHORT(palmimage + 2); bytes_per_row = READ_BIGENDIAN_SHORT(palmimage + 4); flags = READ_BIGENDIAN_SHORT(palmimage + 6); bits_per_pixel = palmimage[8]; version = palmimage[9]; next_depth_offset = READ_BIGENDIAN_SHORT(palmimage + 10); transparent_index = palmimage[12]; compression_type = palmimage[13]; /* bytes 14 and 15 are reserved by Palm and always 0 */ #if 0 // qDebug ("Palm image is %dx%d, %d bpp, version %d, flags 0x%x, compression %d", width, height, bits_per_pixel, version, flags, compression_type); #endif if (compression_type == PALM_COMPRESSION_PACKBITS) { // qDebug ("Image uses packbits compression; not yet supported"); return NULL; } else if ((compression_type != PALM_COMPRESSION_NONE) && (compression_type != PALM_COMPRESSION_RLE) && (compression_type != PALM_COMPRESSION_SCANLINE)) { // qDebug ("Image uses unknown compression, code 0x%x", compression_type); return NULL; } /* as of PalmOS 4.0, there are 6 different kinds of Palm pixmaps: 1, 2, or 4 bit grayscale 8-bit StaticColor using the Palm standard colormap 8-bit PseudoColor using a user-specified colormap 16-bit DirectColor using 5 bits for red, 6 for green, and 5 for blue Each of these can be compressed with one of four compression schemes, "RLE", "Scanline", "PackBits", or none. We begin by constructing the colormap. */ if (flags & PALM_HAS_COLORMAP_FLAG) { // qDebug("Palm images with custom colormaps are not currently supported.\n"); return NULL; } else if (bits_per_pixel == 1) { colormap = Palm1BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 2) { colormap = Palm2BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 4) { colormap = Palm4BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 8) { colormap = Palm8BitColormap; imagedatastart = palmimage + 16; } else if (bits_per_pixel == 16 && (flags & PALM_DIRECT_COLOR_FLAG)) { colormap = NULL; palm_red_bits = palmimage[16]; palm_green_bits = palmimage[17]; palm_blue_bits = palmimage[18]; // qDebug("Bits:%d, %d, %d", palm_red_bits, palm_green_bits, palm_blue_bits); if (palm_blue_bits > 8 || palm_green_bits > 8 || palm_red_bits > 8) { // qDebug("Can't handle this format DirectColor image -- too wide in some color (%d:%d:%d)\n", palm_red_bits, palm_green_bits, palm_blue_bits); return NULL; } if (bits_per_pixel > (8 * sizeof(unsigned long))) { // qDebug ("Can't handle this format DirectColor image -- too many bits per pixel (%d)\n", bits_per_pixel); return NULL; } imagedatastart = palmimage + 24; } else { // qDebug("Unknown bits-per-pixel of %d encountered.\n", bits_per_pixel); return NULL; } -#ifdef WINDOWS
+#ifndef USEQPE QImage* qimage = new QImage(width, height, 32);
#else
QImage* qimage = new QImage(width, height, 16);
#endif
/* row by row, uncompress the Palm image and copy it to the JPEG buffer */ rowbuf = new unsigned char[bytes_per_row * width]; lastrow = new unsigned char[bytes_per_row * width]; for (i=0, palm_ptr = imagedatastart , x_ptr = imagedata; i < height; ++i) { // qDebug("inval:%x palm_ptr:%x x_ptr:%x bpr:%x", inval, palm_ptr, x_ptr, bytes_per_row); /* first, uncompress the Palm image */ if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_RLE)) { for (j = 0; j < bytes_per_row; ) { incount = *palm_ptr++; inval = *palm_ptr++; memset(rowbuf + j, inval, incount); j += incount; } } else if ((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_SCANLINE)) { for (j = 0; j < bytes_per_row; j += 8) { incount = *palm_ptr++; inval = ((bytes_per_row - j) < 8) ? (bytes_per_row - j) : 8; for (inbit = 0; inbit < inval; inbit += 1) { if (incount & (1 << (7 - inbit))) rowbuf[j + inbit] = *palm_ptr++; else rowbuf[j + inbit] = lastrow[j + inbit]; } } memcpy (lastrow, rowbuf, bytes_per_row); } else if (((flags & PALM_IS_COMPRESSED_FLAG) && (compression_type == PALM_COMPRESSION_NONE)) || ((flags & PALM_IS_COMPRESSED_FLAG) == 0)) { memcpy (rowbuf, palm_ptr, bytes_per_row); palm_ptr += bytes_per_row; } else { qDebug("Case 4"); qDebug("Is compressed:%s", ((flags & PALM_IS_COMPRESSED_FLAG) == 0) ? "false" : "true"); qDebug("Has colourmap:%s", ((flags & PALM_HAS_COLORMAP_FLAG) == 0) ? "false" : "true"); qDebug("Has transparency:%s", ((flags & PALM_HAS_TRANSPARENCY_FLAG) == 0) ? "false" : "true"); qDebug("Direct colour:%s", ((flags & PALM_DIRECT_COLOR_FLAG) == 0) ? "false" : "true"); qDebug("four byte field:%s", ((flags & PALM_4_BYTE_FIELD_FLAG) == 0) ? "false" : "true"); memcpy (rowbuf, palm_ptr, bytes_per_row); palm_ptr += bytes_per_row; } /* next, write it to the GDK bitmap */ if (colormap) { mask = (1 << bits_per_pixel) - 1; for (inbit = 8 - bits_per_pixel, inbyte = rowbuf, j = 0; j < width; ++j) { inval = ((*inbyte) & (mask << inbit)) >> inbit; /* correct for oddity of the 8-bit color Palm pixmap... */ if ((bits_per_pixel == 8) && (inval == 0xFF)) inval = 231; /* now lookup the correct color and set the pixel in the GTK bitmap */ QRgb colour = qRgb(colormap[inval].red, colormap[inval].green, colormap[inval].blue); qimage->setPixel(j, i, colour); if (!inbit) { ++inbyte; inbit = 8 - bits_per_pixel; } else { inbit -= bits_per_pixel; } } } else if (!colormap && bits_per_pixel == 16) { for (inbyte = rowbuf, j = 0; j < width; ++j) { inval = ((unsigned short)inbyte[0] << (unsigned short)8) | inbyte[1]; /* qDebug ("pixel is %d,%d (%d:%d:%d)", j, i, ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); */ QRgb colour = qRgb( ((inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1)) << (8-palm_red_bits), ((inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1)) << (8-palm_green_bits), ((inval >> 0) & ((1 << palm_blue_bits) - 1)) << (8-palm_blue_bits)); qimage->setPixel(j, i, colour); inbyte += 2; } } } delete [] rowbuf; delete [] lastrow; return qimage; } QImage* hRule(int w, int h, unsigned char r, unsigned char g, unsigned char b) { //// qDebug("hrule [%d, %d]", w, h); QPixmap* qimage = new QPixmap(w, h); qimage->fill(QColor(r,g,b)); QImage* ret = new QImage(qimage->convertToImage()); delete qimage; return ret; } diff --git a/noncore/apps/opie-reader/Palm2QImage.h b/noncore/apps/opie-reader/Palm2QImage.h index 3ac2d19..5d327c5 100644 --- a/noncore/apps/opie-reader/Palm2QImage.h +++ b/noncore/apps/opie-reader/Palm2QImage.h @@ -1,7 +1,7 @@ #include <qimage.h> #include <qpixmap.h> QImage* Palm2QImage (unsigned char *image_bytes_in, int byte_count_in); -QPixmap* hRule(int w, int h, unsigned char r=0, unsigned char g=0, unsigned char b=0); +QImage* hRule(int w, int h, unsigned char r=0, unsigned char g=0, unsigned char b=0); diff --git a/noncore/apps/opie-reader/QFloatBar.h b/noncore/apps/opie-reader/QFloatBar.h index bc70566..cc98233 100644 --- a/noncore/apps/opie-reader/QFloatBar.h +++ b/noncore/apps/opie-reader/QFloatBar.h @@ -1,19 +1,20 @@ #ifndef __QFLOATBAR_H #define __QFLOATBAR_H #include <qtoolbar.h> +#include <qmainwindow.h> class QFloatBar : public QToolBar { Q_OBJECT virtual void hideEvent(QHideEvent* e) { /*if (e->spontaneous())*/ emit OnHide(); } public: QFloatBar(char* t, QMainWindow* mw, QMainWindow::ToolBarDock td, bool f) : QToolBar(t, mw, td, f) {} signals: void OnHide(); }; #endif diff --git a/noncore/apps/opie-reader/QTReader.cpp b/noncore/apps/opie-reader/QTReader.cpp index f2ee027..03c8fbe 100644 --- a/noncore/apps/opie-reader/QTReader.cpp +++ b/noncore/apps/opie-reader/QTReader.cpp @@ -1,1327 +1,1563 @@ /**************************************************************************** ** $Id$ ** ** Copyright (C) 1992-2000 Trolltech AS. All rights reserved. ** ** This file is part of an example program for Qt. This example ** program may be used, distributed and modified without limitation. ** *****************************************************************************/ +#include "useqpe.h" #include <qpainter.h> +#include <qimage.h> +#include <qtimer.h> #include "config.h" #include "QTReader.h" #include "QTReaderApp.h" #include "CDrawBuffer.h" +#ifdef USEQPE #include <qpe/qpeapplication.h> +#endif #include <math.h> #include <ctype.h> #include <stdio.h> //for sprintf +#ifdef USEQPE #include <qpe/config.h> #include <qpe/applnk.h> -#include <qfontdatabase.h> #include <qpe/global.h> #include <qpe/qcopenvelope_qws.h> -#include "StateData.h" +#endif +#include <qfontdatabase.h> #ifdef _UNICODE const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 }; #else const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 }; #endif //const int QTReader::fontsizes[] = { 8, 10, 12, 14, 18, 24, 30, 40, 50, 60, 70, 80, 90, 100, 0 }; //const tchar *QTReader::fonts[] = { "unifont", "fixed", "micro", "smoothtimes", "Courier", "Times", 0 }; //const int QTReader::fontsizes[] = {10,16,17,22,0}; //const tchar *QTReader::fonts[] = { "verdana", "Courier", "Times", 0 }; //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}; +tchar QTReader::pluckernextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 }; +tchar QTReader::jplucknextpart[] = { 'N','e','x','t',' ','P','a','r','t',' ','>','>',0 }; +//tchar QTReader::jplucknextpart[] = { 10,'#',10,'N','e','x','t',' ','P','a','r','t',' ','>','>',0 }; + QTReader::QTReader( QWidget *parent, const char *name, WFlags f) : QWidget(parent, name, f), m_delay(100), m_scrolldy1(0), m_scrolldy2(0), m_autoScroll(false), //textarray(NULL), //locnarray(NULL), numlines(0), m_fontname("unifont"), m_fm(NULL), mouseUpOn(true), m_twotouch(true), m_touchone(true), bDoUpdates(false), - m_navkeys(true) +#ifdef _SCROLLPIPE + m_pipeout(NULL), +#endif + m_border(2) { m_overlap = 1; + setKeyCompression ( true ); // init(); } + /* -QTReader::QTReader( const QString& filename, QWidget *parent, const tchar *name, WFlags f ) : +QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0) : QWidget(parent, name, f), m_textfont(0), m_textsize(1), textarray(NULL), numlines(0), bstripcr(true), bunindent(false), brepara(false), bdblspce(false), btight(false), bindenter(0), m_fm(NULL) { init(); - // qDebug("Load_file(1)"); +// // qDebug("Load_file(1)"); load_file((const tchar*)filename); } */ +/* +void QTReader::mouseMoveEvent(QMouseEvent* _e) +{ + + mouseUpOn = !(_e->pos().x() == -1); + + qDebug("MouseMove:[%d, %d]", _e->pos().x(), _e->pos().y()); +} +*/ long QTReader::real_delay() { return ( 8976 + m_delay ) / ( m_linespacing * m_linespacing ); } void QTReader::mousePressEvent( QMouseEvent* _e ) { buffdoc.unsuspend(); if (_e->button() == RightButton) { +// qDebug("MousePress"); mouseUpOn = false; + if (m_swapmouse) + { + int lineno = 0; + int ht = textarray[0]->lineSpacing(); + while ((ht < _e->y()) && (lineno < numlines)) + { + ht += textarray[++lineno]->lineSpacing(); + } + size_t startpos, startoffset, tgt; + getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt); + processmousewordevent(startpos, startoffset, _e, lineno); + } + else + processmousepositionevent(_e); + } +} + +void QTReader::processmousepositionevent( QMouseEvent* _e ) +{ if (buffdoc.hasnavigation()) { if (_e->y() > (2*height())/3) { goDown(); } else if (_e->y() < height()/3) { goUp(); } else { if (_e->x() < width()/3) { - size_t target = pagelocate(); - if (buffdoc.back(target)) - { - locate(target); - } + goBack(); } else if (_e->x() > (2*width())/3) { - size_t target = pagelocate(); - if (buffdoc.forward(target)) - { - locate(target); - } + goForward(); } else { - buffdoc.saveposn(pagelocate()); - locate(buffdoc.getHome()); + goHome(); } } } else { if (_e->y() > height()/2) { goDown(); } else { goUp(); } } } + +void QTReader::goHome() +{ + if (buffdoc.hasnavigation()) + { + size_t current=pagelocate(); + size_t home=buffdoc.getHome(); + if (current!=home) + { + buffdoc.saveposn(current); + locate(home); + } + } +} + +void QTReader::goBack() +{ + if (buffdoc.hasnavigation()) + { + size_t target = pagelocate(); + buffdoc.writeposn(target); + if (buffdoc.back(target)) + { + locate(target); + } + } +} + +void QTReader::goForward() +{ + if (buffdoc.hasnavigation()) + { + size_t target = pagelocate(); + if (buffdoc.forward(target)) + { + locate(target); + } + } } linkType QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt) { int lineno = 0; int ht = textarray[0]->lineSpacing(); while ((ht < y) && (lineno < numlines)) { ht += textarray[++lineno]->lineSpacing(); } start = locnarray[lineno]; if (m_bMonoSpaced) { - offset = x/m_charWidth; + offset = (x - textarray[lineno]->offset(width(), m_border))/m_charWidth; } else { int i; CDrawBuffer* t = textarray[lineno]; - x = x - t->offset(width()); - for (i = t->length(); i >= 0 && t->width(i) > x; i--); + x = x - t->offset(width(), m_border); + for (i = t->length(); i >= 0 && t->width(i, true, width(), m_border) > x; i--); offset = i; } return textarray[lineno]->getLinkType(offset, tgt); } +void QTReader::suspend() +{ +#ifdef OPIE + if (memcmp("/mnt/", m_lastfile.latin1(), 5) == 0) buffdoc.suspend(); +#else + if (memcmp("/usr/mnt.rom/", m_lastfile.latin1(), 13) == 0) buffdoc.suspend(); +#endif +} + void QTReader::setTwoTouch(bool _b) { setBackgroundColor( white ); m_twotouch = m_touchone = _b; } void QTReader::setContinuous(bool _b) { buffdoc.unsuspend(); buffdoc.setContinuous(m_continuousDocument = _b); } -void QTReader::mouseReleaseEvent( QMouseEvent* _e ) -{ - buffdoc.unsuspend(); - if (_e->button() == LeftButton) - { - if (mouseUpOn) - { - if (textarray[0] != NULL) - { - QString wrd, line; -// int lineno = _e->y()/m_linespacing; - int lineno = 0; - int ht = textarray[0]->lineSpacing(); - while ((ht < _e->y()) && (lineno < numlines)) - { - ht += textarray[++lineno]->lineSpacing(); - } - size_t startpos, startoffset, tgt; - switch (getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt)) - { - case eLink: - { - size_t saveposn = pagelocate(); - if (buffdoc.hyperlink(tgt)) - { - buffdoc.saveposn(saveposn); - fillbuffer(); - update(); - } - else - { - locate(pagelocate()); - } - return; - } - case ePicture: - { - qDebug("Picture:%x", tgt); - QPixmap* pm = buffdoc.getPicture(tgt); - if (pm != NULL) - { - emit OnShowPicture(*pm); - delete pm; - } - else +void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouseEvent* _e, int lineno) { - locate(pagelocate()); - } - return; - } - case eNone: - break; - default: - qDebug("Unknown linktype"); - return; - } + QString wrd; if (m_twotouch) { if (m_touchone) { m_touchone = false; m_startpos = startpos; m_startoffset = startoffset; setBackgroundColor( lightGray ); } else { m_touchone = true; setBackgroundColor( white ); size_t endpos, endoffset; endpos = startpos; endoffset = startoffset; size_t currentpos = locate(); if (endpos >= m_startpos) { jumpto(m_startpos); for (int i = 0; i < m_startoffset; i++) { getch(); } if (m_startpos == endpos) { for (int i = m_startoffset; i <= endoffset; i++) { wrd += QChar(getch()); } } else { while (buffdoc.explocate() <= endpos) { wrd += QChar(getch()); } for (int i = 0; i < endoffset; i++) { wrd += QChar(getch()); } } jumpto(currentpos); } } } else if (m_bMonoSpaced) { - int chno = _e->x()/m_charWidth; + int chno = (_e->x()-textarray[lineno]->offset(width(), m_border))/m_charWidth; if (chno < ustrlen(textarray[lineno]->data())) { wrd[0] = textarray[lineno]->data()[chno]; } } else { CDrawBuffer* t = textarray[lineno]; int first = 0; - int tgt = _e->x() - t->offset(width()); + int tgt = _e->x() - t->offset(width(), m_border); while (1) { int i = first+1; while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; - if (t->width(i) > tgt) + if (t->width(i, true, width(), m_border) > tgt) { wrd = toQString(t->data()+first, i - first); +// qDebug("Got %s", (const char *)wrd); break; } while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; if ((*t)[i] == 0) break; first = i; } } if (!wrd.isEmpty()) { +// qDebug("Selected:%s", (const char*)wrd); emit OnWordSelected(wrd, locnarray[lineno], (m_twotouch) ? wrd : toQString(textarray[lineno]->data())); } } + +void QTReader::mouseReleaseEvent( QMouseEvent* _e ) +{ + buffdoc.unsuspend(); + if (_e->button() == LeftButton) + { + if (mouseUpOn) + { +// qDebug("MouseRelease"); + if (_e->x() > width() - m_border) + { + locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*_e->y()+height()/2)/height()); + return; + } + if (textarray[0] != NULL) + { + QString line; +// int lineno = _e->y()/m_linespacing; + int lineno = 0; + int ht = textarray[0]->lineSpacing(); + while ((ht < _e->y()) && (lineno < numlines)) + { + ht += textarray[++lineno]->lineSpacing(); + } + size_t startpos, startoffset, tgt; + switch (getcurrentpos(_e->x(), _e->y(), startpos, startoffset, tgt)) + { + case eLink: + { + size_t saveposn = pagelocate(); + QString href; + linkType lt = buffdoc.hyperlink(tgt, href); + if (lt == eLink) + { + buffdoc.saveposn(saveposn); + fillbuffer(); + update(); + } + else + { + if (lt == ePicture) + { + QImage* pm = buffdoc.getPicture(tgt); + if (pm != NULL) + { + emit OnShowPicture(*pm); + delete pm; + } + } + else + { +// QString anchortext = textarray[lineno]->getanchortext(startoffset); + if (!href.isEmpty()) + { + emit OnURLSelected(href); + } + } + locate(pagelocate()); + } + return; + } + case ePicture: + { +// qDebug("Picture:%x", tgt); + QImage* pm = buffdoc.getPicture(tgt); + if (pm != NULL) + { + emit OnShowPicture(*pm); + delete pm; + } + else + { + locate(pagelocate()); + } + return; + } + case eNone: + break; + default: +// qDebug("Unknown linktype"); + return; + } + if (m_swapmouse) + processmousepositionevent(_e); + else + processmousewordevent(startpos, startoffset, _e, lineno); + } } else { mouseUpOn = true; } } } void QTReader::focusInEvent(QFocusEvent* e) { if (m_autoScroll) timer->start(real_delay(), false); update(); } void QTReader::focusOutEvent(QFocusEvent* e) { if (m_autoScroll) { timer->stop(); - m_scrolldy1 = m_scrolldy2 = 0; +// m_scrolldy1 = m_scrolldy2 = 0; } } #include <qapplication.h> #include <qdrawutil.h> +#ifndef _WINDOWS #include <unistd.h> +#endif void QTReader::goDown() { if (m_bpagemode) { dopagedn(); } else { lineDown(); } } void QTReader::goUp() { if (m_bpagemode) { dopageup(); } else { lineUp(); } } void QTReader::NavUp() { buffdoc.unsuspend(); if (buffdoc.hasnavigation()) { /* size_t target = pagelocate(); if (buffdoc.back(target)) { locate(target); } */ locate(buffdoc.startSection()); } else { goUp(); } } void QTReader::NavDown() { buffdoc.unsuspend(); if (buffdoc.hasnavigation()) { /* size_t target = pagelocate(); if (buffdoc.forward(target)) { locate(target); } */ dopageup(buffdoc.endSection()); } else { goDown(); } } void QTReader::zoomin() { if (m_fontControl.increasesize()) { bool sc = m_autoScroll; setfont(); m_autoScroll = false; locate(pagelocate()); update(); m_autoScroll = sc; if (m_autoScroll) autoscroll(); } } void QTReader::zoomout() { if (m_fontControl.decreasesize()) { bool sc = m_autoScroll; m_autoScroll = false; setfont(); locate(pagelocate()); update(); m_autoScroll = sc; if (m_autoScroll) autoscroll(); } } +void QTReader::reduceScroll() +{ + if (m_delay < 59049) + { + m_delay = (3*m_delay)/2; + timer->changeInterval(real_delay()); + } + else + { + m_delay = 59049; + } +} + +void QTReader::increaseScroll() +{ + if (m_delay > 1024) + { + m_delay = (2*m_delay)/3; + timer->changeInterval(real_delay()); + } + else + { + m_delay = 1024; + } +} + void QTReader::keyPressEvent(QKeyEvent* e) { buffdoc.unsuspend(); + ((QTReaderApp*)parent()->parent())->handlekey(e); +// e->ignore(); + return; +#ifdef _SCROLLPIPE + if (m_isPaused) + { + m_isPaused = false; + if (e->key() != Key_Space) + { + m_autoScroll = false; + if (m_pipeout != NULL) + { + pclose(m_pipeout); + m_pipeout = NULL; + } + ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); + QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; + } + else + { + timer->start(real_delay(), false); + } + e->accept(); + return; + } +#endif +/* switch (e->key()) { case Key_Down: { e->accept(); if (m_autoScroll) { if (m_delay < 59049) { m_delay = (3*m_delay)/2; timer->changeInterval(real_delay()); } else { m_delay = 59049; } } else { goDown(); } } break; case Key_Up: { e->accept(); if (m_autoScroll) { if (m_delay > 1024) { m_delay = (2*m_delay)/3; timer->changeInterval(real_delay()); } else { m_delay = 1024; } } else { goUp(); } } break; - /* - case Key_Left: - { - e->accept(); - if (m_textfont > 0) - { - m_textfont--; - setfont(NULL); - locate(pagelocate()); - update(); - } - } - break; - case Key_Right: - { - e->accept(); - if (fonts[++m_textfont] == 0) - { - m_textfont--; - } - else - { - setfont(NULL); - locate(pagelocate()); - update(); - } - } - break; - */ case Key_Right: { e->accept(); if (m_navkeys && buffdoc.hasnavigation()) { size_t target = pagelocate(); if (buffdoc.forward(target)) { locate(target); } } else zoomin(); } break; case Key_Left: { e->accept(); if (m_navkeys && buffdoc.hasnavigation()) { size_t target = pagelocate(); if (buffdoc.back(target)) { locate(target); } } else zoomout(); } break; - case Key_Space: - case Key_Return: - { - e->accept(); - emit OnActionPressed(); - } - break; default: e->ignore(); } +*/ } void QTReader::setautoscroll(bool _sc) { if (_sc == m_autoScroll) return; if (m_autoScroll) { m_autoScroll = false; +#ifdef USEQPE QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; +#endif +#ifdef _SCROLLPIPE + if (m_pipeout != NULL) + { + pclose(m_pipeout); + m_pipeout = NULL; + } +#endif } else { CDrawBuffer* reusebuffer = textarray[numlines]; if (reusebuffer == NULL || reusebuffer->eof()) return; m_autoScroll = true; +#ifdef _SCROLLPIPE + if (!m_pipetarget.isEmpty()) + { +// qDebug("Opening pipe to %s", (const char*)m_pipetarget); + m_pipeout = popen((const char*)m_pipetarget, "w"); + m_isPaused = false; + } +#endif autoscroll(); +#ifdef USEQPE QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed +#endif } } bool QTReader::getline(CDrawBuffer *buff) { buffdoc.unsuspend(); if (m_bMonoSpaced) { - return buffdoc.getline(buff ,width(), m_charWidth); + return buffdoc.getline(buff ,width(), m_charWidth, m_border); } else { - return buffdoc.getline(buff, width()); + return buffdoc.getline(buff, width(), m_border); } } void QTReader::doscroll() { if (!m_autoScroll) { timer->stop(); return; } // timer->changeInterval(real_delay()); QPainter p( this ); QBrush b( white); bitBlt(this,0,0,this,0,1,width(),-1); qDrawPlainRect(&p,0,height() - 2,width(),2,white,1,&b); if (++m_scrolldy1 == textarray[0]->lineSpacing()) { +#ifdef _SCROLLPIPE + if (m_pipeout != NULL) + { + QString outstr = toQString(textarray[0]->data()); + if (!outstr.isEmpty()) + { + fprintf(m_pipeout, "%s\n", (const char*)outstr); + fflush(m_pipeout); + } + else if (m_pauseAfterEachPara) + { + m_isPaused = true; + timer->stop(); + } +// write(m_pipeout, (const char*)outstr, outstr.length()); +// write(m_pipeout, "\n", 1); +// fputc(10, m_pipeout); + } +#endif CDrawBuffer* buff = textarray[0]; for (int i = 1; i <= numlines; i++) { textarray[i-1] = textarray[i]; locnarray[i-1] = locnarray[i]; } textarray[numlines] = buff; --numlines; m_scrolldy1 = 0; } if (++m_scrolldy2 == textarray[numlines]->lineSpacing()) { m_scrolldy2 = 0; numlines++; if (textarray[numlines] == NULL) { textarray[numlines] = new CDrawBuffer(&m_fontControl); } locnarray[numlines] = locate(); int ch = getline(textarray[numlines]); - textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - 2, m_bMonoSpaced, m_charWidth, width()); + textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - 2, m_bMonoSpaced, m_charWidth, width(), m_border); mylastpos = locate(); if (!ch) { m_autoScroll = false; +#ifdef _SCROLLPIPE + for (int i = 0; i < numlines; i++) + { + if (m_pipeout != NULL) + { + QString outstr = toQString(textarray[i]->data()); + if (!outstr.isEmpty()) + { + fprintf(m_pipeout, "%s\n", (const char*)outstr); + fflush(m_pipeout); + } + } + } +#endif ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); +#ifdef USEQPE + QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; +#endif } emit OnRedraw(); } } void QTReader::autoscroll() { timer->start(real_delay(), false); } void QTReader::setfont() { // m_fontControl.Change m_charWidth = (m_charpc*m_fontControl.currentsize())/100; if (m_charWidth <= 0) m_charWidth = 1; m_ascent = m_fontControl.ascent(); m_descent = m_fontControl.descent(); m_linespacing = m_fontControl.lineSpacing(); } void QTReader::drawFonts( QPainter *p ) { if (bDoUpdates) { - qDebug("How refreshing..."); +// qDebug("How refreshing..."); if (buffdoc.empty()) return; setfont(); if (m_lastwidth != width()) { - qDebug("Not Optimised %d", m_lastwidth); +// qDebug("Not Optimised %d", m_lastwidth); m_lastwidth = width(); m_lastheight = height(); + buffdoc.setwidth(m_lastwidth-2*m_border); locate(pagelocate()); - qDebug("Not Optimised %d", m_lastwidth); +// qDebug("Not Optimised %d", m_lastwidth); } else { - if (m_lastheight > height()) + int newht = height(); + if (m_lastheight > newht) { - qDebug("Optimised < %d", numlines); +// qDebug("Optimised < %d %d %d", numlines, m_lastheight, newht); int ypos = 0; for (int i = 0; i < numlines; i++) { - if ((ypos += textarray[i]->lineSpacing()) > height()) + if ((ypos += textarray[i]->lineSpacing()) > newht) { numlines = i; - jumpto(locnarray[i+1]); + jumpto(mylastpos = locnarray[i+1]); break; } } - qDebug("Optimised < %d", numlines); - m_lastheight = height(); +// qDebug("Optimised < %d", numlines); + m_lastheight = newht; } - else if (m_lastheight < height()) + else if (m_lastheight < newht) { - qDebug("Optimised > %d", numlines); +// qDebug("Optimised > %d", numlines); int ypos = 0; for (int i = 0; i <= numlines; i++) { ypos += textarray[i]->lineSpacing(); } - fillbuffer(numlines+1, ypos); - qDebug("Optimised > %d", numlines); - m_lastheight = height(); + fillbuffer(numlines+1, ypos, newht); +// qDebug("Optimised > %d", numlines); } if (numlines > 0) { int ypos = textarray[0]->ascent(); - textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width()); + textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width(), m_border); +// int last = (m_showlast) ? numlines : numlines-1; +// for (int i = 1; i <= last; i++) for (int i = 1; i < numlines; i++) { // ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2; ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+ (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2; - textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, width()); + textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, width(), m_border); } // mylastpos = locate(); } } - m_scrolldy1 = m_scrolldy2 = 0; + + m_scrolldy1 = m_scrolldy2 = m_scrollpart; + if (m_border > 5 && !buffdoc.empty()) + { + p->fillRect(width()-2, 0, 2, height(), cyan); + int sectionsize = (buffdoc.endSection()-buffdoc.startSection()); + int mid = (height()*(locnarray[numlines]+locnarray[0]-2*buffdoc.startSection())+sectionsize)/(2*sectionsize); + p->fillRect(width()-2, mid-5, 2, 10, yellow); + p->fillRect(width()-2, (height()*(locnarray[0]-buffdoc.startSection())+sectionsize/2)/sectionsize, 2, ((locnarray[numlines]-locnarray[0])*height()+sectionsize/2)/sectionsize, magenta); + } + emit OnRedraw(); } +/* else { qDebug("Not so refreshing..."); } +*/ } QString QTReader::firstword() { if (m_bMonoSpaced) { return toQString(textarray[0]->data()); } else { int start, end, len, j; for (j = 0; j < numlines; j++) { len = textarray[j]->length(); for (start = 0; start < len && !isalpha((*textarray[j])[start]); start++); if (start < len) break; } if (j < numlines) { QString ret = ""; for (end = start; end < len && isalpha((*textarray[j])[end]); end++) ret += (*textarray[j])[end]; if (ret.isEmpty()) ret = "Current position"; return ret; } else return "Current position"; } } // // Construct the QTReader with buttons. // bool QTReader::ChangeFont(int tgt) { return m_fontControl.ChangeFont(m_fontname, tgt); } void QTReader::init() { +// m_showlast = true; // setCaption( "Qt Draw Demo Application" ); buffdoc.unsuspend(); setBackgroundColor( white ); // QPainter p(this); // p.setBackgroundMode( Qt::OpaqueMode ); buffdoc.setfilter(getfilter()); ChangeFont(m_textsize); setFocusPolicy(QWidget::StrongFocus); // resize( 240, 320 ); //setFocus(); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(doscroll())); // QMessageBox::information(this, "init", m_lastfile, 1); setfont(); /* if (!m_lastfile.isEmpty()) { m_string = DocLnk(m_lastfile).name(); load_file(m_lastfile); } */ } // // Clean up // QTReader::~QTReader() { +#ifdef USEQPE + if (m_autoScroll) + { + QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; + } +#endif +#ifdef _SCROLLPIPE + if (m_pipeout != NULL) + { + fclose(m_pipeout); + } +#endif } // // Calls the drawing function as specified by the radio buttons. // void QTReader::drawIt( QPainter *p ) { drawFonts(p); } // // Called when the print button is clicked. // /* void QTReader::printIt() { #ifndef QT_NO_PRINTER if ( printer->setup( this ) ) { QPainter paint; if ( !paint.begin( printer ) ) return; drawIt( &paint ); } #endif } */ // // Called when the widget needs to be updated. // void QTReader::paintEvent( QPaintEvent * ) { QPainter paint( this ); drawIt( &paint ); } // // Called when the widget has been resized. // Moves the button group to the upper right corner // of the widget. /* void QTReader::resizeEvent( QResizeEvent * ) { - // qDebug("resize:(%u,%u)", width(), height()); +// // qDebug("resize:(%u,%u)", width(), height()); // bgroup->move( width()-bgroup->width(), 0 ); } */ // // Create and display our widget. // /* int main( int argc, tchar **argv ) { QApplication app( argc, argv ); QTReader draw; app.setMainWidget( &draw ); draw.setCaption("Qt Example - Drawdemo"); draw.show(); return app.exec(); } */ bool QTReader::locate(unsigned long n) { //printf("Locate\n"); buffdoc.unsuspend(); buffdoc.locate(n); - // qDebug("&buffdoc.located"); +// // qDebug("&buffdoc.located"); fillbuffer(); - // qDebug("&Buffer filled"); +// // qDebug("&Buffer filled"); update(); - // qDebug("&Located"); +// // qDebug("&Located"); return true; } unsigned int QTReader::screenlines() { // int linespacing = (tight) ? m_ascent : m_ascent+m_descent; // return (height()-m_descent)/(m_linespacing); return (height()-2)/(m_linespacing); }; -bool QTReader::fillbuffer(int reuse, int ht) +bool QTReader::fillbuffer(int reuse, int ht, int newht) { buffdoc.unsuspend(); if (buffdoc.empty()) return false; - m_scrolldy1 = m_scrolldy2 = 0; + if (newht < 0) + m_lastheight = height(); + else + m_lastheight = newht; int ch; bool ret = false; unsigned int oldpagepos = locnarray[reuse]; - int ypos = ht; + int lastypos = ht, ypos = ht; numlines = reuse; - while (ypos < height() || numlines < 2) + while (ypos < m_lastheight || numlines < 2) { + lastypos = ypos; if (textarray[numlines] == NULL) { textarray[numlines] = new CDrawBuffer(&m_fontControl); } locnarray[numlines] = locate(); int ch = getline(textarray[numlines]); ypos += textarray[numlines]->lineSpacing(); numlines++; if (!ch) { if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/) { locate(oldpagepos); return false; } else { --numlines; mylastpos = locate(); return true; } } } --numlines; mylastpos = locate(); + m_scrolldy1 = m_scrolldy2 = m_scrollpart = m_lastheight - lastypos; return true; } - void QTReader::dopagedn() { +// qDebug("HEIGHT(2):%d", m_lastheight); buffdoc.unsuspend(); int skip = 0, ypos = 0; if (locate() != mylastpos) { -// qDebug("Jumping to %u", mylastpos); +//// qDebug("Jumping to %u", mylastpos); jumpto(mylastpos); } CDrawBuffer* reusebuffer = textarray[numlines]; if (reusebuffer != NULL && reusebuffer->eof()) return; if (reusebuffer != NULL) { for (int i = 0; i <= m_overlap; i++) { int offset = numlines - m_overlap + i; reusebuffer = textarray[offset]; size_t reuselocn = locnarray[offset]; textarray[offset] = textarray[i]; textarray[i] = reusebuffer; // reusebuffer->empty(); locnarray[offset] = locnarray[i]; locnarray[i] = reuselocn; ypos += textarray[i]->lineSpacing(); skip++; } } if (fillbuffer(skip, ypos)) { update(); } } void QTReader::dopageup() { buffdoc.unsuspend(); dopageup(locnarray[(m_overlap < numlines) ? m_overlap : numlines/2]); } +bool QTReader::synch(size_t start, size_t end) +{ + jumpto(start); + while (start++ < end) + { + tchar ch = getch(); + if (ch == 10) return true; + if (ch == UEOF) return false; + } + return false; +} + void QTReader::dopageup(unsigned int target) { buffdoc.unsuspend(); CBufferFace<CDrawBuffer*> buff; CBufferFace<size_t> loc; - size_t delta, guess = 2048; + size_t delta, guess = 2*(locate()-pagelocate()), lastdelta = 0; bool ch = true; int nbfl, ypos = 0; - + if (guess < 128) guess = 128; while (1) { ch = true; - nbfl = 0; if (target < guess) { delta = 0; // 0 is a flag to say don't guess any more jumpto( (m_continuousDocument) ? 0 : buffdoc.startSection() ); } else if (!m_continuousDocument && (target - guess < buffdoc.startSection())) { delta = 0; // 0 is a flag to say don't guess any more jumpto(buffdoc.startSection()); } else { delta = guess; - - jumpto(target - delta); - - buff[0] = new CDrawBuffer(&m_fontControl); - - do + if (!synch(target-delta, target-lastdelta)) { - - if (!getline(buff[0])) break; - - if (locate() > target) break; + lastdelta = delta; + if (guess < 4000) + { + guess <<= 1; + continue; + } + else + { + jumpto(target-delta); + } } - while (!buffdoc.iseol()); } + nbfl = 0; ypos = 0; + while (locate() < target) { if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); loc[nbfl] = locate(); ch = getline(buff[nbfl]); ypos += buff[nbfl]->lineSpacing(); nbfl++; if (!ch) break; } - if (ypos < height() && (delta != 0)) + if (guess < 4000 && ypos < height() && (delta != 0)) { for (int i = 0; i < nbfl; i++) { delete buff[i]; buff[i] = NULL; } guess <<= 1; continue; } break; } if (ch) { if (buff[nbfl] == NULL) buff[nbfl] = new CDrawBuffer(&m_fontControl); loc[nbfl] = locate(); int ch = getline(buff[nbfl]); nbfl++; } +/* ypos = 0; numlines = 0; while (ypos < height() && numlines <= nbfl-1) { ypos += buff[nbfl - numlines - 1]->lineSpacing(); numlines++; } --numlines; +*/ + + ypos = 0; + numlines = 0; + while (ypos < height() && numlines+2 <= nbfl) + { + ypos += buff[nbfl - numlines - 2]->lineSpacing(); + numlines++; + } + if (numlines > 0) --numlines; + if (numlines == 0 && nbfl > 1) numlines = 1; + int offset = nbfl-1; offset -= numlines; ypos = 0; for (int i = 0; i <= numlines; i++) { delete textarray[i]; textarray[i] = buff[offset+i]; locnarray[i] = loc[offset + i]; ypos += textarray[i]->lineSpacing(); } +#ifdef _WINDOWS + for (i = 0; i < nbfl - numlines - 1; i++) +#else for (int i = 0; i < nbfl - numlines - 1; i++) +#endif { delete buff[i]; } while (ypos < height()) { numlines++; locnarray[numlines] = locate(); if (textarray[numlines] == NULL) textarray[numlines] = new CDrawBuffer(&m_fontControl); if (!getline(textarray[numlines])) break; ypos += textarray[numlines]->lineSpacing(); } mylastpos = locate(); update(); } bool QTReader::load_file(const char *newfile, unsigned int _lcn) { // QMessageBox::information(this, "Name", name, 1); // QMessageBox::information(this, "load_file", newfile, 1); bool bRC = false; unsigned int lcn = _lcn; if (m_lastfile == newfile) { lcn = m_lastposn; } - m_lastfile = newfile; // QMessageBox::information(0, "Opening...", newfile); m_lastwidth = width(); m_lastheight = height(); if (buffdoc.openfile(this,newfile) == 0) { + m_lastfile = newfile; + buffdoc.setwidth(m_lastwidth-2*m_border); bRC = true; buffdoc.setContinuous(m_continuousDocument); - // qDebug("buffdoc.openfile done"); +// // qDebug("buffdoc.openfile done"); locate(lcn); - // qDebug("buffdoc.locate done"); +// // qDebug("buffdoc.locate done"); } setfilter(getfilter()); update(); - // qDebug("Updated"); +// // qDebug("Updated"); return bRC; } void QTReader::lineDown() { int ypos = 0; int offset = numlines; for (int i = 0; i <= numlines; i++) { if ((ypos += textarray[numlines-i]->lineSpacing()) > height()) { offset = i-1; break; } } offset = numlines - offset; +#ifdef _WINDOWS + for (i = offset; i <= numlines; i++) +#else for (int i = offset; i <= numlines; i++) +#endif { CDrawBuffer* buff = textarray[i-offset]; textarray[i-offset] = textarray[i]; locnarray[i-offset] = locnarray[i]; textarray[i] = buff; } numlines = numlines - offset + 1; locnarray[numlines] = locate(); if (textarray[numlines] == NULL) { textarray[numlines] = new CDrawBuffer(&m_fontControl); } getline(textarray[numlines]); mylastpos = locate(); update(); } /* void QTReader::lineUp() { CBuffer** buff = textarray; unsigned int *loc = new unsigned int[numlines]; int cbptr = 0; if (locate() != mylastpos) jumpto(mylastpos); unsigned int target = locnarray[numlines-1]; if (buffdoc.hasrandomaccess()) { unsigned int delta = locate()-pagelocate(); if (delta < 64) delta = 64; do { delta <<= 1; if (delta >= target) { delta = target; jumpto(0); for (int i = 0; i < numlines; i++) { loc[i] = locate(); getline(buff[i]); } break; } jumpto(target-delta); do { buffdoc.getline(buff[0],width()); #ifdef WS //printf("Trying:%s\n",buff[0]); #endif if (locate() > target) continue; } while (!buffdoc.iseol()); for (int i = 0; i < numlines; i++) { loc[i] = locate(); buffdoc.getline(buff[i],width()); #ifdef WS //printf("Filling:%s\n",buff[i]); #endif } } while (locate() >= target && delta < 4096); #ifdef WS //printf("Delta:%u\n",delta); #endif } else { jumpto(0); for (int i = 0; i < numlines; i++) { loc[i] = locate(); buffdoc.getline(buff[i],width()); } } cbptr = 0; while (locate() < target) { loc[cbptr] = locate(); buffdoc.getline(buff[cbptr], width()); #ifdef WS //printf("Adding:%s\n",buff[cbptr]->data()); #endif cbptr = (cbptr+1) % numlines; } pagepos = loc[cbptr]; textarray = new CBuffer*[numlines]; for (int i = 0; i < numlines; i++) { int j = (cbptr+i)%numlines; textarray[i] = buff[j]; locnarray[i] = loc[j]; } delete [] buff; delete [] loc; mylastpos = locate(); update(); } */ void QTReader::lineUp() { buffdoc.unsuspend(); CDrawBuffer* buff = textarray[numlines]; unsigned int loc; unsigned int end = locnarray[numlines]; int cbptr = 0; if (locate() != mylastpos) jumpto(mylastpos); unsigned int target = locnarray[0]; if (target == 0) return; if (!m_continuousDocument && (target == buffdoc.startSection())) return; if (buffdoc.hasrandomaccess()) { unsigned int delta = locate()-pagelocate(); if (delta < 64) delta = 64; do { delta <<= 1; if (delta >= target) { delta = target; jumpto(0); loc = locate(); getline(buff); break; } else if (!m_continuousDocument && (target - delta < buffdoc.startSection())) { delta = target-buffdoc.startSection(); jumpto(buffdoc.startSection()); loc = locate(); getline(buff); break; } jumpto(target-delta); do { getline(buff); #ifdef WS //printf("Trying:%s\n",buff[0]); #endif if (locate() > target) continue; } while (!buffdoc.iseol()); loc = locate(); getline(buff); } while (locate() >= target && delta < 4096); } else { jumpto(0); loc = locate(); getline(buff); } cbptr = 0; while (locate() < target) { loc = locate(); getline(buff); } for (int i = numlines; i > 0; i--) { textarray[i] = textarray[i-1]; locnarray[i] = locnarray[i-1]; } textarray[0] = buff; locnarray[0] = loc; int start = numlines; int ypos = 0; +#ifdef _WINDOWS + for (i = 0; i <= numlines; i++) +#else for (int i = 0; i <= numlines; i++) +#endif { ypos += textarray[i]->lineSpacing(); if (ypos > height()) { start = i; ypos -= textarray[i]->lineSpacing(); break; } } jumpto(locnarray[start]); fillbuffer(start, ypos); update(); } bool QTReader::empty() { return buffdoc.empty(); } MarkupType QTReader::PreferredMarkup() { MarkupType m = buffdoc.PreferredMarkup(); if (m == cTEXT) { int ext = m_lastfile.findRev('.'); if (ext >= 0) { QString ft = m_lastfile.right(m_lastfile.length()-ext-1).upper(); if (ft.left(3) == "HTM") { m = cHTML; } } } return m; } - -void QTReader::setstate(const statedata& sd) -{ - bstripcr = sd.bstripcr; - btextfmt = sd.btextfmt; - bautofmt = sd.bautofmt; - bstriphtml = sd.bstriphtml; - bpeanut = sd.bpeanut; - bdehyphen = sd.bdehyphen; - bonespace = sd.bonespace; - bunindent = sd.bunindent; - brepara = sd.brepara; - bdblspce = sd.bdblspce; - m_bpagemode = sd.m_bpagemode; - m_navkeys = sd.m_navkeys; - m_bMonoSpaced = sd.m_bMonoSpaced; - bremap = sd.bremap; - bmakebold = sd.bmakebold; - m_continuousDocument = sd.Continuous; -#ifdef REPALM - brepalm = sd.brepalm; -#endif - bindenter = sd.bindenter; - m_encd = sd.m_charpc; - m_fontname = sd.m_fontname; - setContinuous(sd.Continuous); - ChangeFont(sd.m_textsize); - refresh(); -} diff --git a/noncore/apps/opie-reader/QTReader.h b/noncore/apps/opie-reader/QTReader.h index 3d5f57d..dfbdfb9 100644 --- a/noncore/apps/opie-reader/QTReader.h +++ b/noncore/apps/opie-reader/QTReader.h @@ -1,312 +1,272 @@ #ifndef __QTREADER_H #define __QTREADER_H +//#define _SCROLLPIPE + #include <qwidget.h> //#include <qpainter.h> #include "my_list.h" #include "BuffDoc.h" #include "FontControl.h" //#include <qtimer.h> class CDrawBuffer; //class CBuffer; class QPainter; class QTimer; class QPixmap; -class statedata; class QTReader : public QWidget { Q_OBJECT + static tchar pluckernextpart[]; + static tchar jplucknextpart[]; friend class QTReaderApp; - void suspend() { buffdoc.suspend(); } + void suspend(); + void increaseScroll(); + void reduceScroll(); void drawText(QPainter& p, int x, int y, tchar* text); int m_delay; unsigned int m_overlap; - bool m_autoScroll; + bool m_autoScroll, m_swapmouse; void autoscroll(); QTimer* timer; - int m_scrolldy1, m_scrolldy2, m_encd; + int m_scrolldy1, m_scrolldy2, m_encd, m_scrollpart; void focusInEvent(QFocusEvent*); void focusOutEvent(QFocusEvent*); + void processmousepositionevent( QMouseEvent* _e ); + void processmousewordevent(size_t startpos, size_t startoffset, QMouseEvent* _e, int lineno); bool ChangeFont(int); bool getline(CDrawBuffer*); int m_charWidth; int m_charpc; + unsigned char m_border; FontControl m_fontControl; + void setBaseSize(unsigned char _s) { m_fontControl.setBaseSize(_s); } + unsigned char getBaseSize() { return m_fontControl.getBaseSize(); } +#ifdef _SCROLLPIPE + FILE* m_pipeout; + QString m_pipetarget; + bool m_isPaused; + bool m_pauseAfterEachPara; +#endif public: QTReader( QWidget *parent=0, const char *name=0, WFlags f = 0); // QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0); ~QTReader(); void zoomin(); void zoomout(); void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) { buffdoc.setSaveData(data, len, src, srclen); } void putSaveData(unsigned char*& src, unsigned short& srclen) { buffdoc.putSaveData(src, srclen); } bool empty(); void setContinuous(bool _b); void toggle_autoscroll(); void setautoscroll(bool); void disableAutoscroll() { m_autoScroll = false; } void copy() { /* size_t nd = locate(); jumpto(m_mark); QString text; while (m_mark < nd) { text += buffdoc.getch(); m_mark++; } QApplication::clipboard()->setText(text); jumpto(nd); */ }; void clear() {}; void setText(const QString& n, const QString& s) { m_string = n; load_file((const char*)s); }; /* void setText(bool oldfile) { if (oldfile) { m_string = m_lastfile; load_file((const tchar*)m_string); } else { m_string = QString::null; } }; */ - void setpeanut(bool _b) - { - bpeanut = _b; - setfilter(getfilter()); - } - void setremap(bool _b) + void setlead(int _lead) { - bremap = _b; - setfilter(getfilter()); + m_fontControl.setlead(_lead); } - void setmakebold(bool _b) + int getlead() { - bmakebold = _b; - setfilter(getfilter()); + return m_fontControl.getlead(); } - void setautofmt(bool _b) - { - bautofmt = _b; - if (bautofmt) + void setextraspace(int _lead) { - btextfmt = false; - bstriphtml = false;; - bpeanut = false; - } - setfilter(getfilter()); + m_fontControl.setextraspace(_lead); } - void settextfmt(bool _b) + int getextraspace() { - btextfmt = _b; - setfilter(getfilter()); - } - void setstripcr(bool _b) - { - bstripcr = _b; - setfilter(getfilter()); - } - void setonespace(bool _b) - { - bonespace = _b; - setfilter(getfilter()); - } -#ifdef REPALM - void setrepalm(bool _b) - { - brepalm = _b; - setfilter(getfilter()); - } -#endif - void setstriphtml(bool _b) - { - bstriphtml = _b; - setfilter(getfilter()); - } - void setdehyphen(bool _b) - { - bdehyphen = _b; - setfilter(getfilter()); - } - void setunindent(bool _b) - { - bunindent = _b; - setfilter(getfilter()); - } - void setrepara(bool _b) - { - brepara = _b; - setfilter(getfilter()); - } - void setdblspce(bool _b) - { - bdblspce = _b; - setfilter(getfilter()); - } - void indentplus() - { - if (bindenter < 15) bindenter += 2; - setfilter(getfilter()); - } - void indentminus() - { - if (bindenter > 1) bindenter -= 2; - setfilter(getfilter()); + return m_fontControl.getextraspace(); } void setpagemode(bool _b) { m_bpagemode = _b; } void setmono(bool _b) { m_bMonoSpaced = _b; ChangeFont(m_fontControl.currentsize()); locate(pagelocate()); } void setencoding(int _f) { m_encd = _f; setfilter(getfilter()); } MarkupType PreferredMarkup(); CEncoding* getencoding() { +// qDebug("m_encd:%d", m_encd); switch (m_encd) { - case 5: - return new Ccp1252; case 4: +// qDebug("palm"); return new CPalm; case 1: +// qDebug("utf8"); return new CUtf8; case 2: +// qDebug("ucs16be"); return new CUcs16be; case 3: +// qDebug("ucs16le"); return new CUcs16le; case 0: - default: +// qDebug("ascii"); return new CAscii; + default: + return new CGeneral8Bit(m_encd-MAX_ENCODING+1); } } CFilterChain* getfilter() { CFilterChain * filt = new CFilterChain(getencoding()); if (bstripcr) filt->addfilter(new stripcr); if (btextfmt || (bautofmt && (PreferredMarkup() == cTEXT))) filt->addfilter(new textfmt); if (bpeanut || (bautofmt && (PreferredMarkup() == cPML))) filt->addfilter(new PeanutFormatter); if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml); if (bdehyphen) filt->addfilter(new dehyphen); if (bunindent) filt->addfilter(new unindent); if (brepara) filt->addfilter(new repara); if (bonespace) filt->addfilter(new OnePara); if (bindenter) filt->addfilter(new indenter(bindenter)); if (bdblspce) filt->addfilter(new dblspce); #ifdef REPALM if (brepalm) filt->addfilter(new repalm); #endif if (bremap) filt->addfilter(new remap); + if (bdepluck) filt->addfilter(new DePluck(pluckernextpart)); + if (bdejpluck) filt->addfilter(new DePluck(jplucknextpart)); if (bmakebold) filt->addfilter(new embolden); + if (bfulljust) filt->addfilter(new FullJust); return filt; } private slots: + void goHome(); + void goBack(); + void goForward(); void doscroll(); void drawIt( QPainter * ); void paintEvent( QPaintEvent * ); // void resizeEvent( QResizeEvent * p ) { update(); } void keyPressEvent(QKeyEvent*); void drawFonts(QPainter*); private: void setTwoTouch(bool _b); void init(); void mousePressEvent( QMouseEvent* ); void mouseReleaseEvent( QMouseEvent* ); // void mouseDoubleClickEvent( QMouseEvent* ); QString m_string, m_fontname; void setfont(); //myoutput stuff private: bool mouseUpOn; linkType getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt); bool m_twotouch, m_touchone; size_t m_startpos, m_startoffset; void dopageup(unsigned int); void dopageup(); void lineDown(); void lineUp(); void dopagedn(); long real_delay(); int m_textsize; int m_lastwidth, m_lastheight; CBufferFace<CDrawBuffer*> textarray; CBufferFace<size_t> locnarray; unsigned int numlines; - bool bstripcr, btextfmt, bstriphtml, bdehyphen, bunindent, brepara, bdblspce, btight, bmakebold, bremap, bpeanut, bautofmt, bonespace; +// bool m_showlast; + bool bstripcr, btextfmt, bstriphtml, bdehyphen, bdepluck, bdejpluck, bunindent, brepara, bdblspce, btight, bmakebold, bremap, bpeanut, bautofmt, bonespace, bfulljust; #ifdef REPALM bool brepalm; #endif bool m_bpagemode, m_bMonoSpaced, m_continuousDocument; unsigned char bindenter; QString m_lastfile; size_t m_lastposn; public: bool bDoUpdates; - bool m_navkeys; void NavUp(); void NavDown(); - int getch() { return buffdoc.getch(); } + tchar getch() { return buffdoc.getch(); } + bool synch(size_t, size_t); bool tight; bool load_file(const char *newfile, unsigned int lcn=0); BuffDoc buffdoc; CList<Bkmk>* getbkmklist() { return buffdoc.getbkmklist(); } bool locate(unsigned long n); void jumpto(unsigned long n) { buffdoc.unsuspend(); buffdoc.locate(n); } unsigned long locate() { buffdoc.unsuspend(); return buffdoc.locate(); } unsigned long explocate() { buffdoc.unsuspend(); return buffdoc.explocate(); } unsigned long pagelocate() { return locnarray[0]; } unsigned long mylastpos; void setfilter(CFilterChain *f) { buffdoc.unsuspend(); buffdoc.setfilter(f); locate(pagelocate()); } void restore() { jumpto(mylastpos); } void goUp(); void refresh() { locate(pagelocate()); } void goDown(); // bool bold; int textsize() { return m_textsize; } void textsize(int ts) { m_textsize = ts; } - bool fillbuffer(int ru = 0, int ht = 0); + bool fillbuffer(int ru = 0, int ht = 0, int newht = -1); unsigned int screenlines(); void sizes(unsigned long& fs, unsigned long& ts) { buffdoc.unsuspend(); buffdoc.sizes(fs,ts); } static const char *fonts[]; // unsigned int *fontsizes; int m_ascent, m_descent, m_linespacing; QFontMetrics* m_fm; QString firstword(); - void setstate(const statedata& sd); signals: void OnRedraw(); void OnWordSelected(const QString&, size_t, const QString&); - void OnActionPressed(); - void OnShowPicture(QPixmap&); + void OnShowPicture(QImage&); + void OnURLSelected(const QString&); }; #endif diff --git a/noncore/apps/opie-reader/QTReaderApp.cpp b/noncore/apps/opie-reader/QTReaderApp.cpp index 7333a28..af1da27 100644 --- a/noncore/apps/opie-reader/QTReaderApp.cpp +++ b/noncore/apps/opie-reader/QTReaderApp.cpp @@ -1,2606 +1,4222 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. Allrights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ - +#include "useqpe.h" +#include <qregexp.h> #include <qclipboard.h> #include <qwidgetstack.h> +#ifdef USEQPE #include <qpe/qpemenubar.h> -//#include <qpe/qpetoolbar.h> +#include <qpe/qpetoolbar.h> +#endif #include <qmenubar.h> #include <qtoolbar.h> +#ifdef USEQPE #include <qpe/menubutton.h> #include <qpe/fontdatabase.h> +#endif #include <qcombobox.h> #include <qpopupmenu.h> #include <qaction.h> #include <qapplication.h> #include <qlineedit.h> #include <qtoolbutton.h> #include <qspinbox.h> #include <qobjectlist.h> +#ifdef USEQPE #include <qpe/global.h> #include <qpe/applnk.h> +#endif #include <qfileinfo.h> #include <stdlib.h> //getenv #include <qprogressbar.h> +#ifdef USEQPE #include <qpe/config.h> +#endif #include <qbuttongroup.h> #include <qradiobutton.h> +#ifdef USEQPE #include <qpe/qcopenvelope_qws.h> - +#endif #include "QTReader.h" #include "GraphicWin.h" #include "Bkmks.h" #include "cbkmkselector.h" #include "infowin.h" +#include "ToolbarPrefs.h" +#include "Prefs.h" #include "CAnnoEdit.h" #include "QFloatBar.h" +#include "FixedFont.h" +#include "URLDialog.h" //#include <qpe/fontdatabase.h> +#ifdef USEQPE #include <qpe/resource.h> #include <qpe/qpeapplication.h> +#include "fileBrowser.h" +#else +#include "qfiledialog.h" +#endif #include "QTReaderApp.h" -#include "fileBrowser.h" #include "CDrawBuffer.h" #include "Filedata.h" #include "opie.h" -#include "name.h" -#include "StateData.h" +#include "useqpe.h" +#include "names.h" +#include "CEncoding_tables.h" +#include "CloseDialog.h" -#ifdef OPIE +bool CheckVersion(int&, int&, char&); + +#ifdef _WINDOWS +#define PICDIR "c:\\uqtreader\\pics\\" +#else +#ifdef USEQPE #define PICDIR "opie-reader/" #else -#define PICDIR +#define PICDIR "/home/tim/uqtreader/pics/" +#endif #endif - unsigned long QTReaderApp::m_uid = 0; void QTReaderApp::setScrollState(bool _b) { m_scrollButton->setOn(_b); } +#ifdef USEQPE +#define geticon(iconname) Resource::loadPixmap( iconname ) +#define getmyicon(iconname) Resource::loadPixmap( PICDIR iconname ) +#else +#define geticon(iconname) QPixmap(PICDIR iconname ".png") +#define getmyicon(iconname) geticon(iconname) +//#define geticon(iconname) QIconSet( QPixmap(PICDIR iconname) ) +#endif + +#ifndef _WINDOWS #include <unistd.h> +#endif #include <stddef.h> +#ifndef _WINDOWS #include <dirent.h> +#endif void QTReaderApp::listBkmkFiles() { bkmkselector->clear(); bkmkselector->setText("Cancel"); +#ifndef USEQPE + int cnt = 0; + + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "\" directory" ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + + + + + d.setFilter( QDir::Files | QDir::NoSymLinks ); +// d.setSorting( QDir::Size | QDir::Reversed ); + + const QFileInfoList *list = d.entryInfoList(); + QFileInfoListIterator it( *list ); // create list iterator + QFileInfo *fi; // pointer for traversing + + while ( (fi=it.current()) ) { // for each file... + + bkmkselector->insertItem(fi->fileName()); + cnt++; + + //qDebug( "%10li %s", fi->size(), fi->fileName().data() ); + ++it; // goto next list element + } + +#else /* USEQPE */ int cnt = 0; DIR *d; d = opendir((const char *)Global::applicationFileName(APPDIR,"")); while(1) { struct dirent* de; struct stat buf; de = readdir(d); if (de == NULL) break; if (lstat((const char *)Global::applicationFileName(APPDIR,de->d_name),&buf) == 0 && S_ISREG(buf.st_mode)) { bkmkselector->insertItem(de->d_name); cnt++; } } closedir(d); - +#endif if (cnt > 0) { //tjw menu->hide(); - editBar->hide(); + editorStack->raiseWidget( bkmkselector ); + hidetoolbars(); + m_nBkmkAction = cRmBkmkFile; + } + else + QMessageBox::information(this, PROGNAME, "No bookmark files"); +} + +void QTReaderApp::hidetoolbars() +{ + menubar->hide(); + if (fileBar != NULL) fileBar->hide(); + if (viewBar != NULL) viewBar->hide(); + if (navBar != NULL) navBar->hide(); + if (markBar != NULL) markBar->hide(); if (m_fontVisible) m_fontBar->hide(); if (regVisible) { +#ifdef USEQPE Global::hideInputMethod(); +#endif regBar->hide(); } if (searchVisible) { +#ifdef USEQPE Global::hideInputMethod(); +#endif searchBar->hide(); } - m_nRegAction = cRmBkmkFile; - editorStack->raiseWidget( bkmkselector ); - } - else - QMessageBox::information(this, PROGNAME, "No bookmark files"); } QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f ) - : QMainWindow( parent, name, f ), bFromDocView( FALSE ), m_dontSave(false) -{ -// qDebug("Application directory = %s", (const tchar *)QPEApplication::documentDir()); -// qDebug("Application directory = %s", (const tchar *)Global::applicationFileName("uqtreader","bkmks.xml")); - + : QMainWindow( parent, name, f ), bFromDocView( FALSE ), m_dontSave(false), + fileBar(NULL), navBar(NULL), viewBar(NULL), markBar(NULL) +{ + m_url_clipboard = false; + m_url_localfile = false; + m_url_globalfile = false; + ftime(&m_lastkeytime); +//// qDebug("Application directory = %s", (const tchar *)QPEApplication::documentDir()); +//// qDebug("Application directory = %s", (const tchar *)Global::applicationFileName("uqtreader","bkmks.xml")); + + m_bcloseDisabled = true; + m_disableesckey = false; pBkmklist = NULL; pOpenlist = NULL; // doc = 0; m_fBkmksChanged = false; QString lang = getenv( "LANG" ); + QString rot = getenv( "QWS_DISPLAY" ); + +/* + int m_rot = 0; + if (rot.contains("Rot90")) + { + m_rot = 90; + } + else if (rot.contains("Rot180")) + { + m_rot = 180; + } + else if (rot.contains("Rot270")) + { + m_rot = 270; + } +// qDebug("Initial Rotation(%d):%s", m_rot, (const char*)rot); +*/ m_autogenstr = "^ *[A-Z].*[a-z] *$"; - setToolBarsMovable( FALSE ); - setIcon( Resource::loadPixmap( "uqtreader" ) ); +#ifdef USEQPE + setIcon( Resource::loadPixmap( PICDIR "uqtreader") ); +#else + setIcon( QPixmap (PICDIR "uqtreader.png") ); +#endif /* USEQPE */ // QPEToolBar *bar = new QPEToolBar( this ); - QToolBar *bar = new QToolBar( this ); - bar->setHorizontalStretchable( TRUE ); - addToolBar(bar, "tool",QMainWindow::Top, true); -//tjw menu = bar; - - QPEMenuBar *mb = new QPEMenuBar( bar ); -// QMenuBar *mb = new QMenuBar( bar ); - QPopupMenu *file = new QPopupMenu( this ); - QPopupMenu *format = new QPopupMenu( this ); - // QPopupMenu *edit = new QPopupMenu( this ); +// menubar = new QPEToolBar( this ); +#ifdef USEQPE + Config config( APPDIR ); +#else + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "\" directory" ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + QFileInfo fi(d, INIFILE); +// qDebug("Path:%s", (const char*)fi.absFilePath()); + Config config(fi.absFilePath()); +#endif + config.setGroup("Toolbar"); + m_tbmovesave = m_tbmove = config.readBoolEntry("Movable", false); + m_tbpolsave = m_tbpol = (ToolbarPolicy)config.readNumEntry("Policy", 1); + m_tbposition = (ToolBarDock)config.readNumEntry("Position", 2); + menubar = new QToolBar("Menus", this, m_tbposition); + +// fileBar = new QToolBar("File", this); +// QToolBar* viewBar = new QToolBar("File", this); +// QToolBar* navBar = new QToolBar("File", this); +// QToolBar* markBar = new QToolBar("File", this); + +#ifdef USEQPE + mb = new QPEMenuBar( menubar ); +#else + mb = new QMenuBar( menubar ); +#endif + +//#ifdef USEQPE + QPopupMenu* tmp = new QPopupMenu(mb); + mb->insertItem( geticon( "AppsIcon" ), tmp ); +//#else +// QMenuBar* tmp = mb; +//#endif + + QPopupMenu *file = new QPopupMenu( mb ); + tmp->insertItem( tr( "File" ), file ); + + QPopupMenu *navigation = new QPopupMenu(mb); + tmp->insertItem( tr( "Navigation" ), navigation ); + + QPopupMenu *view = new QPopupMenu( mb ); + tmp->insertItem( tr( "View" ), view ); + + QPopupMenu *marks = new QPopupMenu( this ); + tmp->insertItem( tr( "Marks" ), marks ); + + QPopupMenu *settings = new QPopupMenu( this ); + tmp->insertItem( tr( "Settings" ), settings ); -// bar = new QToolBar( this ); - editBar = bar; +// addToolBar(menubar, "Menus",QMainWindow::Top); +// addToolBar(fileBar, "Toolbar",QMainWindow::Top); + + // QPopupMenu *edit = new QPopupMenu( this ); /* QAction *a = new QAction( tr( "New" ), Resource::loadPixmap( "new" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( fileNew() ) ); a->addTo( bar ); a->addTo( file ); */ editorStack = new QWidgetStack( this ); setCentralWidget( editorStack ); searchVisible = FALSE; regVisible = FALSE; m_fontVisible = false; - pbar = new QProgressBar(this); - pbar->hide(); - m_annoWin = new CAnnoEdit(editorStack); editorStack->addWidget(m_annoWin, get_unique_id()); connect( m_annoWin, SIGNAL( finished(const QString&, const QString&) ), this, SLOT( addAnno(const QString&, const QString&) ) ); connect( m_annoWin, SIGNAL( cancelled() ), this, SLOT( infoClose() ) ); m_infoWin = new infowin(editorStack); editorStack->addWidget(m_infoWin, get_unique_id()); connect( m_infoWin, SIGNAL( Close() ), this, SLOT( infoClose() ) ); m_graphicwin = new GraphicWin(editorStack); editorStack->addWidget(m_graphicwin, get_unique_id()); connect( m_graphicwin, SIGNAL( Closed() ), this, SLOT( infoClose() ) ); // bkmkselector = new QListBox(editorStack, "Bookmarks"); bkmkselector = new CBkmkSelector(editorStack, "Bookmarks"); // connect(bkmkselector, SIGNAL( selected(const QString&) ), this, SLOT( gotobkmk(const QString&) ) ); connect(bkmkselector, SIGNAL( selected(int) ), this, SLOT( gotobkmk(int) ) ); connect(bkmkselector, SIGNAL( cancelled() ), this, SLOT( cancelbkmk() ) ); editorStack->addWidget( bkmkselector, get_unique_id() ); /* importSelector = new FileSelector( "*", editorStack, "importselector", false ); connect( importSelector, SIGNAL( fileSelected( const DocLnk &) ), this, SLOT( importFile( const DocLnk & ) ) ); editorStack->addWidget( importSelector, get_unique_id() ); // don't need the close visible, it is redundant... importSelector->setCloseVisible( FALSE ); */ - qDebug("Reading file list"); +// qDebug("Reading file list"); readfilelist(); reader = new QTReader( editorStack ); reader->bDoUpdates = false; +#ifdef USEQPE ((QPEApplication*)qApp)->setStylusOperation(reader, QPEApplication::RightOnHold); +#endif - qDebug("Reading config"); - Config config( APPDIR ); +// qDebug("Reading config"); +// Config config( APPDIR ); config.setGroup( "View" ); - + m_debounce = config.readNumEntry("Debounce", 0); +#ifdef USEQPE + m_bFloatingDialog = config.readBoolEntry("FloatDialogs", false); +#else + m_bFloatingDialog = config.readBoolEntry("FloatDialogs", true); +#endif reader->bstripcr = config.readBoolEntry( "StripCr", true ); + reader->bfulljust = config.readBoolEntry( "FullJust", false ); + reader->setextraspace(config.readNumEntry( "ExtraSpace", 0 )); + reader->setlead(config.readNumEntry( "ExtraLead", 0 )); reader->btextfmt = config.readBoolEntry( "TextFmt", false ); reader->bautofmt = config.readBoolEntry( "AutoFmt", true ); reader->bstriphtml = config.readBoolEntry( "StripHtml", false ); reader->bpeanut = config.readBoolEntry( "Peanut", false ); reader->bdehyphen = config.readBoolEntry( "Dehyphen", false ); + reader->bdepluck = config.readBoolEntry( "Depluck", false ); + reader->bdejpluck = config.readBoolEntry( "Dejpluck", false ); reader->bonespace = config.readBoolEntry( "OneSpace", false ); reader->bunindent = config.readBoolEntry( "Unindent", false ); reader->brepara = config.readBoolEntry( "Repara", false ); reader->bdblspce = config.readBoolEntry( "DoubleSpace", false ); reader->bindenter = config.readNumEntry( "Indent", 0 ); reader->m_textsize = config.readNumEntry( "FontSize", 12 ); reader->m_delay = config.readNumEntry( "ScrollDelay", 5184); reader->m_lastfile = config.readEntry( "LastFile", QString::null ); reader->m_lastposn = config.readNumEntry( "LastPosn", 0 ); reader->m_bpagemode = config.readBoolEntry( "PageMode", true ); - reader->m_navkeys = config.readBoolEntry( "CursorNavigation", false ); reader->m_bMonoSpaced = config.readBoolEntry( "MonoSpaced", false); + reader->m_swapmouse = config.readBoolEntry( "SwapMouse", false); reader->m_fontname = config.readEntry( "Fontname", "helvetica" ); reader->m_encd = config.readNumEntry( "Encoding", 0 ); reader->m_charpc = config.readNumEntry( "CharSpacing", 100 ); reader->m_overlap = config.readNumEntry( "Overlap", 0 ); + reader->m_border = config.readNumEntry( "Margin", 6 ); #ifdef REPALM reader->brepalm = config.readBoolEntry( "Repalm", true ); #endif reader->bremap = config.readBoolEntry( "Remap", true ); reader->bmakebold = config.readBoolEntry( "MakeBold", false ); reader->setContinuous(config.readBoolEntry( "Continuous", true )); m_targetapp = config.readEntry( "TargetApp", QString::null ); m_targetmsg = config.readEntry( "TargetMsg", QString::null ); +#ifdef _SCROLLPIPE + reader->m_pipetarget = config.readEntry( "PipeTarget", QString::null ); + reader->m_pauseAfterEachPara = config.readBoolEntry( "PauseAfterPara", true ); +#endif m_twoTouch = config.readBoolEntry( "TwoTouch", false); m_doAnnotation = config.readBoolEntry( "Annotation", false); m_doDictionary = config.readBoolEntry( "Dictionary", false); m_doClipboard = config.readBoolEntry( "Clipboard", false); m_spaceTarget = (ActionTypes)config.readNumEntry("SpaceTarget", cesAutoScroll); - setTwoTouch(m_twoTouch); + m_escapeTarget = (ActionTypes)config.readNumEntry("EscapeTarget", cesNone); + m_returnTarget = (ActionTypes)config.readNumEntry("ReturnTarget", cesFullScreen); + m_leftTarget = (ActionTypes)config.readNumEntry("LeftTarget", cesZoomOut); + m_rightTarget = (ActionTypes)config.readNumEntry("RightTarget", cesZoomIn); + m_upTarget = (ActionTypes)config.readNumEntry("UpTarget", cesPageUp); + m_downTarget = (ActionTypes)config.readNumEntry("DownTarget", cesPageDown); + + m_leftScroll = config.readBoolEntry("LeftScroll", false); + m_rightScroll = config.readBoolEntry("RightScroll", false); + m_upScroll = config.readBoolEntry("UpScroll", true); + m_downScroll = config.readBoolEntry("DownScroll", true); + + m_propogatefontchange = config.readBoolEntry( "RequestorFontChange", false); + reader->setBaseSize(config.readNumEntry( "Basesize", 10 )); + +#ifndef USEQPE + config.setGroup( "Geometry" ); + setGeometry(0,0, + config.readNumEntry( "width", QApplication::desktop()->width()/2 ), + config.readNumEntry( "height", QApplication::desktop()->height()/2 )); + move( + config.readNumEntry( "x", 20 ), + config.readNumEntry( "y", 20 )); +#endif + - connect( reader, SIGNAL( OnShowPicture(QPixmap&) ), this, SLOT( showgraphic(QPixmap&) ) ); + setTwoTouch(m_twoTouch); + + connect( reader, SIGNAL( OnShowPicture(QImage&) ), this, SLOT( showgraphic(QImage&) ) ); connect( reader, SIGNAL( OnRedraw() ), this, SLOT( OnRedraw() ) ); - connect( reader, SIGNAL( OnActionPressed() ), this, SLOT( OnActionPressed() ) ); connect( reader, SIGNAL( OnWordSelected(const QString&, size_t, const QString&) ), this, SLOT( OnWordSelected(const QString&, size_t, const QString&) ) ); + connect( reader, SIGNAL( OnURLSelected(const QString&) ), this, SLOT( OnURLSelected(const QString&) ) ); editorStack->addWidget( reader, get_unique_id() ); - QAction *a = new QAction( tr( "Open" ), Resource::loadPixmap( "fileopen" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( fileOpen() ) ); - a->addTo( bar ); - a->addTo( file ); + m_preferences_action = new QAction( tr( "Configuration" ), geticon( "SettingsIcon" ), QString::null, 0, this, NULL); + connect( m_preferences_action, SIGNAL( activated() ), this, SLOT( showprefs() ) ); + m_preferences_action->addTo( settings ); - a = new QAction( tr( "Close" ), Resource::loadPixmap( "fileclose" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( fileClose() ) ); -// a->addTo( bar ); - a->addTo( file ); + m_saveconfig_action = new QAction( tr( "Save Config" ), QString::null, 0, this, NULL); + connect( m_saveconfig_action, SIGNAL( activated() ), this, SLOT( SaveConfig() ) ); + m_saveconfig_action->addTo( settings ); + + m_loadconfig_action = new QAction( tr( "Load Config" ), QString::null, 0, this, NULL); + connect( m_loadconfig_action, SIGNAL( activated() ), this, SLOT( LoadConfig() ) ); + m_loadconfig_action->addTo( settings ); + + m_tidyconfig_action = new QAction( tr( "Delete Config" ), QString::null, 0, this, NULL); + connect( m_tidyconfig_action, SIGNAL( activated() ), this, SLOT( TidyConfig() ) ); + m_tidyconfig_action->addTo( settings ); + + settings->insertSeparator(); + m_toolbarprefs_action = new QAction( tr( "Toolbars" ), QString::null, 0, this, NULL); + connect( m_toolbarprefs_action, SIGNAL( activated() ), this, SLOT( showtoolbarprefs() ) ); + m_toolbarprefs_action->addTo( settings ); + + m_open_action = new QAction( tr( "Open" ), geticon( "fileopen" ), QString::null, 0, this, 0 ); + connect( m_open_action, SIGNAL( activated() ), this, SLOT( fileOpen() ) ); + m_open_action->addTo( file ); + m_close_action = new QAction( tr( "Close" ), geticon( "close" ), QString::null, 0, this, 0 ); + connect( m_close_action, SIGNAL( activated() ), this, SLOT( fileClose() ) ); + m_close_action->addTo( file ); + +#ifdef _SCRIPT + a = new QAction( tr( "Run Script" ), QString::null, 0, this, NULL); + connect( a, SIGNAL( activated() ), this, SLOT( RunScript() ) ); + a->addTo( file ); +#endif /* - a = new QAction( tr( "Revert" ), Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); + a = new QAction( tr( "Revert" ), geticon( "close" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( fileRevert() ) ); a->addTo( file ); - a = new QAction( tr( "Cut" ), Resource::loadPixmap( "cut" ), QString::null, 0, this, 0 ); + a = new QAction( tr( "Cut" ), geticon( "cut" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) ); - a->addTo( editBar ); + a->addTo( filebar() ); a->addTo( edit ); */ - a = new QAction( tr( "Info" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( showinfo() ) ); - a->addTo( file ); - - QActionGroup* ag = new QActionGroup(this); - QPopupMenu *spacemenu = new QPopupMenu(this); - file->insertItem( tr( "On Action..." ), spacemenu ); - - m_buttonAction[0] = new QAction( tr( "Open File" ), QString::null, 0, ag, NULL, true ); - - m_buttonAction[1] = new QAction( tr( "Autoscroll" ), QString::null, 0, ag, NULL, true ); + m_info_action = new QAction( tr( "Info" ), geticon( "UtilsIcon" ), QString::null, 0, this, NULL); + connect( m_info_action, SIGNAL( activated() ), this, SLOT( showinfo() ) ); + m_info_action->addTo( file ); - m_buttonAction[2] = new QAction( tr( "Mark" ), QString::null, 0, ag, NULL, true ); + m_touch_action = new QAction( tr( "Two/One Touch" ), geticon( "1to1" ), QString::null, 0, this, NULL, true ); + connect( m_touch_action, SIGNAL( toggled(bool) ), this, SLOT( setTwoTouch(bool) ) ); + m_touch_action->setOn(m_twoTouch); + m_touch_action->addTo( file ); - m_buttonAction[3] = new QAction( tr( "Fullscreen" ), QString::null, 0, ag, NULL, true ); + m_find_action = new QAction( tr( "Find..." ), geticon( "find" ), QString::null, 0, this, NULL); + connect( m_find_action, SIGNAL( activated() ), this, SLOT( editFind() ) ); + file->insertSeparator(); +// a->addTo( bar ); + m_find_action->addTo( file ); - ag->addTo(spacemenu); + m_exportlinks_action = new QAction( tr( "Export Links" ), QString::null, 0, this, NULL); + connect( m_exportlinks_action, SIGNAL( activated() ), this, SLOT( ExportLinks() ) ); + m_exportlinks_action->addTo( file ); - connect(ag, SIGNAL( selected(QAction*) ), this, SLOT( buttonActionSelected(QAction*) ) ); + m_scrollButton = new QAction( tr( "Scroll" ), getmyicon( "panel-arrow-down" ), QString::null, 0, this, 0, true ); + connect( m_scrollButton, SIGNAL( toggled(bool) ), this, SLOT( autoScroll(bool) ) ); + m_scrollButton->addTo(navigation); + m_scrollButton->setOn(false); - file->insertSeparator(); + m_start_action = new QAction( tr( "Goto Start" ), geticon( "start" ), QString::null, 0, this, NULL); + connect( m_start_action, SIGNAL( activated() ), this, SLOT( gotoStart() ) ); + m_start_action->addTo(navigation); - ag = new QActionGroup(this); - ag->setExclusive(false); - QPopupMenu *encoding = new QPopupMenu(this); - file->insertItem( tr( "Navigation" ), encoding ); + m_end_action = new QAction( tr( "Goto End" ), geticon( "finish" ), QString::null, 0, this, NULL); + connect( m_end_action, SIGNAL( activated() ), this, SLOT( gotoEnd() ) ); + m_end_action->addTo(navigation); - a = m_scrollButton = new QAction( tr( "Scroll" ), Resource::loadPixmap( PICDIR "panel-arrow-down" ), QString::null, 0, ag, 0, true ); + m_jump_action = new QAction( tr( "Jump" ), geticon( "rotate" ), QString::null, 0, this, NULL); + connect( m_jump_action, SIGNAL( activated() ), this, SLOT( jump() ) ); + m_jump_action->addTo(navigation); - a->setOn(false); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( autoScroll(bool) ) ); - a->addTo( bar ); + m_pageline_action = new QAction( tr( "Page/Line Scroll" ), geticon( "pass" ), QString::null, 0, this, NULL, true ); + connect( m_pageline_action, SIGNAL( toggled(bool) ), this, SLOT( pagemode(bool) ) ); + m_pageline_action->addTo(navigation); + m_pageline_action->setOn(reader->m_bpagemode); - a = new QAction( tr( "Jump" ), QString::null, 0, ag, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( jump() ) ); + m_pageup_action = new QAction( tr( "Up" ), geticon( "up" ), QString::null, 0, this, 0 ); + connect( m_pageup_action, SIGNAL( activated() ), this, SLOT( pageup() ) ); + m_pageup_action->addTo( navigation ); - a = new QAction( tr( "Page/Line Scroll" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( pagemode(bool) ) ); - a->setOn(reader->m_bpagemode); + m_pagedn_action = new QAction( tr( "Down" ), geticon( "down" ), QString::null, 0, this, 0 ); + connect( m_pagedn_action, SIGNAL( activated() ), this, SLOT( pagedn() ) ); + m_pagedn_action->addTo( navigation ); - a = new QAction( tr( "Set Overlap" ), QString::null, 0, ag, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( setoverlap() ) ); + m_back_action = new QAction( tr( "Back" ), geticon( "back" ), QString::null, 0, this, 0 ); + connect( m_back_action, SIGNAL( activated() ), reader, SLOT( goBack() ) ); + m_back_action->addTo( navigation ); - a = new QAction( tr( "Use Cursor" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( navkeys(bool) ) ); - a->setOn(reader->m_navkeys); + m_home_action = new QAction( tr( "Home" ), geticon( "home" ), QString::null, 0, this, 0 ); + connect( m_home_action, SIGNAL( activated() ), reader, SLOT( goHome() ) ); + m_home_action->addTo( navigation ); - ag->addTo(encoding); + m_forward_action = new QAction( tr( "Forward" ), geticon( "forward" ), QString::null, 0, this, 0 ); + connect( m_forward_action, SIGNAL( activated() ), reader, SLOT( goForward() ) ); + m_forward_action->addTo( navigation ); /* a = new QAction( tr( "Find" ), QString::null, 0, this, NULL, true ); // connect( a, SIGNAL( activated() ), this, SLOT( pagedn() ) ); a->addTo( file ); a = new QAction( tr( "Find Again" ), QString::null, 0, this, NULL, true ); // connect( a, SIGNAL( activated() ), this, SLOT( pagedn() ) ); a->addTo( file ); */ - file->insertSeparator(); - - a = new QAction( tr( "Set Dictionary" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( settarget() ) ); - a->addTo( file ); +// file->insertSeparator(); - a = new QAction( tr( "Two/One Touch" ), QString::null, 0, this, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( setTwoTouch(bool) ) ); - a->setOn(m_twoTouch); - a->addTo( file ); +#ifdef _SCROLLPIPE - ag = new QActionGroup(this); + QActionGroup* ag = new QActionGroup(this); ag->setExclusive(false); - encoding = new QPopupMenu(this); - file->insertItem( tr( "Target" ), encoding ); - - a = new QAction( tr( "Annotation" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( OnAnnotation(bool) ) ); - a->setOn(m_doAnnotation); + spacemenu = new QPopupMenu(this); + file->insertItem( tr( "Scrolling" ), spacemenu ); - a = new QAction( tr( "Dictionary" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( OnDictionary(bool) ) ); - a->setOn(m_doDictionary); + a = new QAction( tr( "Set Target" ), QString::null, 0, ag, NULL); + connect( a, SIGNAL( activated() ), this, SLOT( setpipetarget() ) ); - a = new QAction( tr( "Clipboard" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( OnClipboard(bool) ) ); - a->setOn(m_doClipboard); + a = new QAction( tr( "Pause Paras" ), QString::null, 0, ag, NULL, true ); + connect( a, SIGNAL( toggled(bool) ), this, SLOT( setpause(bool) ) ); + a->setOn(reader->m_pauseAfterEachPara); - ag->addTo(encoding); + ag->addTo(spacemenu); +// file->insertSeparator(); +#endif /* a = new QAction( tr( "Import" ), QString::null, 0, this, NULL ); connect( a, SIGNAL( activated() ), this, SLOT( importFiles() ) ); a->addTo( file ); */ - a = new QAction( tr( "Up" ), Resource::loadPixmap( "up" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( pageup() ) ); - a->addTo( editBar ); - - a = new QAction( tr( "Down" ), Resource::loadPixmap( "down" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( pagedn() ) ); - a->addTo( editBar ); - /* - a = new QAction( tr( "Paste" ), Resource::loadPixmap( "paste" ), QString::null, 0, this, 0 ); + a = new QAction( tr( "Paste" ), geticon( "paste" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) ); - a->addTo( editBar ); + a->addTo( fileBar ); a->addTo( edit ); */ -// a = new QAction( tr( "Find..." ), Resource::loadPixmap( "find" ), QString::null, 0, this, 0 ); - a = new QAction( tr( "Find..." ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( editFind() ) ); - file->insertSeparator(); -// a->addTo( bar ); - a->addTo( file ); - +// a = new QAction( tr( "Find..." ), geticon( "find" ), QString::null, 0, this, 0 ); m_fullscreen = false; - a = m_actFullscreen = new QAction( tr( "Fullscreen" ), QString::null, 0, this, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( setfullscreen(bool) ) ); - a->setOn(m_fullscreen); - a->addTo( file ); + m_actFullscreen = new QAction( tr( "Fullscreen" ), geticon( "fullscreen" ), QString::null, 0, this, NULL, true ); + connect( m_actFullscreen, SIGNAL( toggled(bool) ), this, SLOT( setfullscreen(bool) ) ); + m_actFullscreen->setOn(m_fullscreen); + m_actFullscreen->addTo( view ); - a = new QAction( tr( "Continuous" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( setcontinuous(bool) ) ); - a->setOn(reader->m_continuousDocument); - a->addTo( file ); + view->insertSeparator(); - a = m_bkmkAvail = new QAction( tr( "Annotation" ), Resource::loadPixmap( "find" ), QString::null, 0, this, 0 ); - connect( a, SIGNAL( activated() ), this, SLOT( showAnnotation() ) ); - a->addTo( bar ); + m_zoomin_action = new QAction( tr( "Zoom In" ), geticon( "zoom" ), QString::null, 0, this); + connect( m_zoomin_action, SIGNAL( activated() ), this, SLOT( zoomin() ) ); + m_zoomin_action->addTo( view ); - m_bkmkAvail->setEnabled(false); + m_zoomout_action = new QAction( tr( "Zoom Out" ), geticon( "mag" ), QString::null, 0, this); + connect( m_zoomout_action, SIGNAL( activated() ), this, SLOT( zoomout() ) ); + m_zoomout_action->addTo( view ); + view->insertSeparator(); + m_setfont_action = new QAction( tr( "Set Font" ), getmyicon( "font" ), QString::null, 0, this); + connect( m_setfont_action, SIGNAL( activated() ), this, SLOT( setfont() ) ); + m_setfont_action->addTo( view ); - ag = new QActionGroup(this); -// ag->setExclusive(false); - encoding = new QPopupMenu(this); - format->insertItem( tr( "Markup" ), encoding ); + view->insertSeparator(); + m_setenc_action = new QAction( tr( "Set Encoding" ), getmyicon( "charset" ), QString::null, 0, this); + connect( m_setenc_action, SIGNAL( activated() ), this, SLOT( chooseencoding() ) ); + m_setenc_action->addTo( view ); - a = new QAction( tr( "Auto" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->bautofmt); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( autofmt(bool) ) ); + m_setmono_action = new QAction( tr( "Ideogram" ), getmyicon( "ideogram" ), QString::null, 0, this, NULL, true); + connect( m_setmono_action, SIGNAL( toggled(bool) ), this, SLOT( monospace(bool) ) ); + m_setmono_action->addTo( view ); + m_setmono_action->setOn(reader->m_bMonoSpaced); - a = new QAction( tr( "None" ), QString::null, 0, ag, NULL, true ); - a->setOn(!reader->bautofmt && !(reader->btextfmt || reader->bstriphtml || reader->bpeanut)); -// connect( a, SIGNAL( toggled(bool) ), this, SLOT( textfmt(bool) ) ); - a = new QAction( tr( "Text" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->btextfmt); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( textfmt(bool) ) ); - - a = new QAction( tr( "HTML" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->bstriphtml); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( striphtml(bool) ) ); - - a = new QAction( tr( "Peanut/PML" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->bpeanut); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( peanut(bool) ) ); - - ag->addTo(encoding); - - - - ag = new QActionGroup(this); - ag->setExclusive(false); - encoding = new QPopupMenu(this); - format->insertItem( tr( "Layout" ), encoding ); - - a = new QAction( tr( "Strip CR" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->bstripcr); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( stripcr(bool) ) ); - - a = new QAction( tr( "Dehyphen" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->bdehyphen); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( dehyphen(bool) ) ); -// a->addTo( format ); - - a = new QAction( tr( "Single Space" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->bonespace); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( onespace(bool) ) ); - - a = new QAction( tr( "Unindent" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( unindent(bool) ) ); - a->setOn(reader->bunindent); -// a->addTo( format ); - - a = new QAction( tr( "Re-paragraph" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( repara(bool) ) ); - a->setOn(reader->brepara); -// a->addTo( format ); - - a = new QAction( tr( "Double Space" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( dblspce(bool) ) ); - a->setOn(reader->bdblspce); -// a->addTo( format ); - - a = new QAction( tr( "Indent+" ), QString::null, 0, ag, NULL ); - connect( a, SIGNAL( activated() ), this, SLOT( indentplus() ) ); -// a->addTo( format ); - - a = new QAction( tr( "Indent-" ), QString::null, 0, ag, NULL ); - connect( a, SIGNAL( activated() ), this, SLOT( indentminus() ) ); -#ifdef REPALM - a = new QAction( tr( "Repalm" ), QString::null, 0, ag, NULL, true ); - a->setOn(reader->brepalm); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( repalm(bool) ) ); -#endif - a = new QAction( tr( "Remap" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( remap(bool) ) ); - a->setOn(reader->bremap); - - a = new QAction( tr( "Embolden" ), QString::null, 0, ag, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( embolden(bool) ) ); - a->setOn(reader->bmakebold); + // a = new QAction( tr( "Zoom" ), QString::null, 0, this, NULL, true ); + // a = new QAction( tr( "Zoom" ), geticon( "mag" ), QString::null, 0, this, 0 ); - ag->addTo(encoding); - // a = new QAction( tr( "Zoom" ), QString::null, 0, this, NULL, true ); - // a = new QAction( tr( "Zoom" ), Resource::loadPixmap( "mag" ), QString::null, 0, this, 0 ); - format->insertSeparator(); - a = new QAction( tr( "Zoom In" ), QString::null, 0, this); - connect( a, SIGNAL( activated() ), this, SLOT( zoomin() ) ); - a->addTo( format ); - a = new QAction( tr( "Zoom Out" ), QString::null, 0, this); - connect( a, SIGNAL( activated() ), this, SLOT( zoomout() ) ); - a->addTo( format ); - // a->addTo( editBar ); - format->insertSeparator(); + // a->addTo( filebar() ); +// view->insertSeparator(); +/* a = new QAction( tr( "Ideogram/Word" ), QString::null, 0, this, NULL, true ); connect( a, SIGNAL( toggled(bool) ), this, SLOT( monospace(bool) ) ); a->setOn(reader->m_bMonoSpaced); - a->addTo( format ); - - a = new QAction( tr( "Set width" ), QString::null, 0, this, NULL); + a->addTo( view ); +*/ +/* + a = new QAction( tr( "Set Width" ), QString::null, 0, this, NULL); connect( a, SIGNAL( activated() ), this, SLOT( setspacing() ) ); - a->addTo( format ); - - encoding = new QPopupMenu(this); -// format->insertSeparator(); - format->insertItem( tr( "Encoding" ), encoding ); - - ag = new QActionGroup(this); - - m_EncodingAction[0] = new QAction( tr( "Ascii" ), QString::null, 0, ag, NULL, true ); - - m_EncodingAction[1] = new QAction( tr( "UTF-8" ), QString::null, 0, ag, NULL, true ); - - m_EncodingAction[2] = new QAction( tr( "UCS-2(BE)" ), QString::null, 0, ag, NULL, true ); - - m_EncodingAction[3] = new QAction( tr( "USC-2(LE)" ), QString::null, 0, ag, NULL, true ); - - m_EncodingAction[4] = new QAction( tr( "Palm" ), QString::null, 0, ag, NULL, true ); - - m_EncodingAction[5] = new QAction( tr( "Windows(1252)" ), QString::null, 0, ag, NULL, true ); - - ag->addTo(encoding); - - connect(ag, SIGNAL( selected(QAction*) ), this, SLOT( encodingSelected(QAction*) ) ); - - a = new QAction( tr( "Set Font" ), QString::null, 0, this); - connect( a, SIGNAL( activated() ), this, SLOT( setfont() ) ); - format->insertSeparator(); - a->addTo( format ); - - QPopupMenu *marks = new QPopupMenu( this ); + a->addTo( view ); +*/ - a = new QAction( tr( "Mark" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( addbkmk() ) ); - a->addTo( marks ); + m_mark_action = new QAction( tr( "Bookmark" ), getmyicon( "bookmark" ), QString::null, 0, this, NULL); + connect( m_mark_action, SIGNAL( activated() ), this, SLOT( addbkmk() ) ); + m_mark_action->addTo( marks ); - a = new QAction( tr( "Annotate" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( addanno() ) ); - a->addTo( marks ); + m_annotate_action = new QAction( tr( "Annotate" ), getmyicon( "annotate" ), QString::null, 0, this, NULL); + connect( m_annotate_action, SIGNAL( activated() ), this, SLOT( addanno() ) ); + m_annotate_action->addTo( marks ); - a = new QAction( tr( "Goto" ), QString::null, 0, this, NULL, false ); - connect( a, SIGNAL( activated() ), this, SLOT( do_gotomark() ) ); - a->addTo( marks ); + m_goto_action = new QAction( tr( "Goto" ), getmyicon( "bookmark_goto" ), QString::null, 0, this, NULL, false ); + connect( m_goto_action, SIGNAL( activated() ), this, SLOT( do_gotomark() ) ); + m_goto_action->addTo( marks ); - a = new QAction( tr( "Delete" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( do_delmark() ) ); - a->addTo( marks ); + m_delete_action = new QAction( tr( "Delete" ), getmyicon( "bookmark_delete" ), QString::null, 0, this, NULL); + connect( m_delete_action, SIGNAL( activated() ), this, SLOT( do_delmark() ) ); + m_delete_action->addTo( marks ); - a = new QAction( tr( "Autogen" ), QString::null, 0, this, NULL, false ); - connect( a, SIGNAL( activated() ), this, SLOT( do_autogen() ) ); + m_autogen_action = new QAction( tr( "Autogen" ), geticon( "exec" ), QString::null, 0, this, NULL, false ); + connect( m_autogen_action, SIGNAL( activated() ), this, SLOT( do_autogen() ) ); marks->insertSeparator(); - a->addTo( marks ); + m_autogen_action->addTo( marks ); - a = new QAction( tr( "Clear" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( clearBkmkList() ) ); - a->addTo( marks ); + m_clear_action = new QAction( tr( "Clear" ), getmyicon( "bookmark_clear" ), QString::null, 0, this, NULL); + connect( m_clear_action, SIGNAL( activated() ), this, SLOT( clearBkmkList() ) ); + m_clear_action->addTo( marks ); - a = new QAction( tr( "Save" ), QString::null, 0, this, NULL ); - connect( a, SIGNAL( activated() ), this, SLOT( savebkmks() ) ); - a->addTo( marks ); + m_save_action = new QAction( tr( "Save" ), getmyicon( "bookmark_save" ), QString::null, 0, this, NULL ); + connect( m_save_action, SIGNAL( activated() ), this, SLOT( savebkmks() ) ); + m_save_action->addTo( marks ); - a = new QAction( tr( "Tidy" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( listBkmkFiles() ) ); + m_tidy_action = new QAction( tr( "Tidy" ), getmyicon( "bookmark_tidy" ), QString::null, 0, this, NULL); + connect( m_tidy_action, SIGNAL( activated() ), this, SLOT( listBkmkFiles() ) ); marks->insertSeparator(); - a->addTo( marks ); + m_tidy_action->addTo( marks ); - a = new QAction( tr( "Start Block" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( editMark() ) ); + m_startBlock_action = new QAction( tr( "Start Block" ), geticon( "new" ), QString::null, 0, this, NULL); + connect( m_startBlock_action, SIGNAL( activated() ), this, SLOT( editMark() ) ); marks->insertSeparator(); - a->addTo( marks ); + m_startBlock_action->addTo( marks ); + + m_endBlock_action = new QAction( tr( "Copy Block" ), geticon( "copy" ), QString::null, 0, this, NULL); + connect( m_endBlock_action, SIGNAL( activated() ), this, SLOT( editCopy() ) ); + m_endBlock_action->addTo( marks ); - a = new QAction( tr( "Copy Block" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) ); - a->addTo( marks ); + m_bkmkAvail = NULL; - mb->insertItem( tr( "File" ), file ); - // mb->insertItem( tr( "Edit" ), edit ); - mb->insertItem( tr( "Format" ), format ); - mb->insertItem( tr( "Marks" ), marks ); + setToolBarsMovable(m_tbmove); + addtoolbars(&config); + + pbar = new QProgressBar(this); + pbar->hide(); searchBar = new QFloatBar( "Search", this, QMainWindow::Top, TRUE ); searchBar->setHorizontalStretchable( TRUE ); connect(searchBar, SIGNAL( OnHide() ), this, SLOT( restoreFocus() )); searchEdit = new QLineEdit( searchBar, "searchEdit" ); // QFont f("unifont", 16 /*, QFont::Bold*/); // searchEdit->setFont( f ); searchBar->setStretchableWidget( searchEdit ); + #ifdef __ISEARCH connect( searchEdit, SIGNAL( textChanged( const QString & ) ), this, SLOT( search( const QString& ) ) ); #else connect( searchEdit, SIGNAL( returnPressed( ) ), this, SLOT( search( ) ) ); #endif - a = new QAction( tr( "Find Next" ), Resource::loadPixmap( "next" ), QString::null, 0, this, 0 ); + QAction*a = new QAction( tr( "Find Next" ), geticon( "next" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( findNext() ) ); a->addTo( searchBar ); - a = new QAction( tr( "Close Find" ), Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); + a = new QAction( tr( "Close Find" ), geticon( "close" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( findClose() ) ); a->addTo( searchBar ); searchBar->hide(); regBar = new QFloatBar( "Autogen", this, QMainWindow::Top, TRUE ); connect(regBar, SIGNAL( OnHide() ), this, SLOT( restoreFocus() )); regBar->setHorizontalStretchable( TRUE ); regEdit = new QLineEdit( regBar, "regEdit" ); // regEdit->setFont( f ); regBar->setStretchableWidget( regEdit ); connect( regEdit, SIGNAL( returnPressed( ) ), this, SLOT( do_regaction() ) ); - a = new QAction( tr( "Do Reg" ), Resource::loadPixmap( "enter" ), QString::null, 0, this, 0 ); + a = new QAction( tr( "Do Reg" ), geticon( "enter" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( do_regaction() ) ); a->addTo( regBar ); - a = new QAction( tr( "Close Edit" ), Resource::loadPixmap( "close" ), QString::null, 0, this, 0 ); + a = new QAction( tr( "Close Edit" ), geticon( "close" ), QString::null, 0, this, 0 ); connect( a, SIGNAL( activated() ), this, SLOT( regClose() ) ); a->addTo( regBar ); regBar->hide(); m_fontBar = new QToolBar( "Autogen", this, QMainWindow::Top, TRUE ); m_fontBar->setHorizontalStretchable( TRUE ); - qDebug("Font selector"); +// qDebug("Font selector"); m_fontSelector = new QComboBox(false, m_fontBar); m_fontBar->setStretchableWidget( m_fontSelector ); { +#ifndef USEQPE + QFontDatabase f; +#else FontDatabase f; +#endif QStringList flist = f.families(); - m_fontSelector->insertStringList(flist); - bool realfont = false; for (QStringList::Iterator nm = flist.begin(); nm != flist.end(); nm++) { if (reader->m_fontname == *nm) { realfont = true; } - if (*nm == "courier") reader->m_fontControl.hasCourier(true); + if ((*nm).contains(FIXEDFONT,false)) reader->m_fontControl.hasCourier(true, *nm); } if (!realfont) reader->m_fontname = flist[0]; } // delete the FontDatabase!!! - connect( m_fontSelector, SIGNAL( activated(const QString& ) ), this, SLOT( do_setfont(const QString&) ) ); + connect( m_fontSelector, SIGNAL( activated(int ) ), + this, SLOT( do_setencoding(int) ) ); m_fontBar->hide(); m_fontVisible = false; - +#ifdef USEMSGS connect(qApp, SIGNAL( appMessage(const QCString&, const QByteArray& ) ), this, SLOT( msgHandler(const QCString&, const QByteArray&) ) ); - - qDebug("Initing"); +#endif +// qDebug("Initing"); reader->init(); - qDebug("Inited"); - m_EncodingAction[reader->m_encd]->setOn(true); - m_buttonAction[m_spaceTarget]->setOn(true); - qDebug("fonting"); +// qDebug("Inited"); +// m_buttonAction[m_spaceTarget]->setOn(true); +// qDebug("fonting"); do_setfont(reader->m_fontname); if (!reader->m_lastfile.isEmpty()) { - qDebug("doclnk"); +// qDebug("doclnk"); // doc = new DocLnk(reader->m_lastfile); - qDebug("doclnk done"); +// qDebug("doclnk done"); if (pOpenlist != NULL) { /* int ind = 0; Bkmk* p = (*pOpenlist)[ind]; while (p != NULL && toQString(CFiledata(p->anno()).name()) != reader->m_lastfile) { p = (*pOpenlist)[++ind]; } */ Bkmk* p = NULL; for (CList<Bkmk>::iterator iter = pOpenlist->begin(); iter != pOpenlist->end(); iter++) { p = iter.pContent(); if (toQString(CFiledata(p->anno()).name()) == reader->m_lastfile) { break; } - qDebug("Item:%s", (const char*)toQString(CFiledata(p->anno()).name())); +// qDebug("Item:%s", (const char*)toQString(CFiledata(p->anno()).name())); p = NULL; } if (p != NULL) { - qDebug("openfrombkmk"); - openfrombkmk(p); +// qDebug("openfrombkmk"); + if (!openfrombkmk(p)) + showEditTools(); } else { - qDebug("openfile"); +// qDebug("openfile"); openFile( reader->m_lastfile ); } } else { - qDebug("Openfile 2"); - if (!reader->m_lastfile.isNull()) +// qDebug("Openfile 2"); + if (!reader->m_lastfile.isEmpty()) openFile( reader->m_lastfile ); } } - qApp->processEvents(); + else + { + showEditTools(); + } +// qApp->processEvents(); reader->bDoUpdates = true; reader->update(); - qDebug("finished update"); + config.setGroup("Version"); + int major = config.readNumEntry("Major", 0); + int bkmktype = config.readNumEntry("BkmkType", 0); + char minor = config.readNumEntry("Minor", 0); + if (CheckVersion(major, bkmktype, minor)) + { + config.writeEntry("Major", major); + config.writeEntry("BkmkType", bkmktype); + config.writeEntry("Minor", (int)minor); + } +// qDebug("finished update"); +} + +void QTReaderApp::addtoolbars(Config* config) +{ + config->setGroup("Toolbar"); + + if (fileBar != NULL) + { + if (fileBar != menubar) + { + fileBar->clear(); + } + else + { + m_preferences_action->removeFrom( filebar() ); + m_open_action->removeFrom( filebar() ); + m_close_action->removeFrom( filebar() ); + m_info_action->removeFrom( filebar() ); + m_touch_action->removeFrom( filebar() ); + m_find_action->removeFrom( filebar() ); + } + } + + m_preferences_action->addTo( filebar() ); + addfilebar(config, "Open", m_open_action); + addfilebar(config, "Close", m_close_action); + addfilebar(config, "Info", m_info_action); + addfilebar(config, "Two/One Touch", m_touch_action); + addfilebar(config, "Find", m_find_action); + + if (navBar != NULL) + { + if ((navBar == fileBar) && (fileBar == menubar)) + { + m_scrollButton->removeFrom( navbar() ); + m_start_action->removeFrom( navbar() ); + m_end_action->removeFrom( navbar() ); + m_jump_action->removeFrom( navbar() ); + m_pageline_action->removeFrom( navbar() ); + m_pageup_action->removeFrom( navbar() ); + m_pagedn_action->removeFrom( navbar() ); + m_back_action->removeFrom( navbar() ); + m_home_action->removeFrom( navbar() ); + m_forward_action->removeFrom( navbar() ); + } + else if (navBar != fileBar) + { + navBar->clear(); + } + } + + addnavbar(config, "Scroll", m_scrollButton); + addnavbar(config, "Goto Start", m_start_action); + addnavbar(config, "Goto End", m_end_action); + + addnavbar(config, "Jump", m_jump_action); + addnavbar(config, "Page/Line Scroll", m_pageline_action); + + addnavbar(config, "Page Up", m_pageup_action); + addnavbar(config, "Page Down", m_pagedn_action); + + addnavbar(config, "Back", m_back_action); + addnavbar(config, "Home", m_home_action); + addnavbar(config, "Forward", m_forward_action); + + if (viewBar != NULL) + { + if ((viewBar == fileBar) && (fileBar == menubar)) + { + m_actFullscreen->removeFrom( filebar() ); + m_zoomin_action->removeFrom( viewbar() ); + m_zoomout_action->removeFrom( viewbar() ); + m_setfont_action->removeFrom( viewbar() ); + m_setenc_action->removeFrom( viewbar() ); + m_setmono_action->removeFrom( viewbar() ); + } + else if (viewBar != fileBar) + { + viewBar->clear(); + } + } + + addviewbar(config, "Fullscreen", m_actFullscreen); + addviewbar(config, "Zoom In", m_zoomin_action); + addviewbar(config, "Zoom Out", m_zoomout_action); + addviewbar(config, "Set Font", m_setfont_action); + addviewbar(config, "Encoding Select", m_setenc_action); + addviewbar(config, "Ideogram Mode", m_setmono_action); + + if (markBar != NULL) + { + if ((markBar == fileBar) && (fileBar == menubar)) + { + m_mark_action->removeFrom( markbar() ); + m_annotate_action->removeFrom( markbar()); + m_goto_action->removeFrom( markbar() ); + m_delete_action->removeFrom( markbar() ); + m_autogen_action->removeFrom( markbar() ); + m_clear_action->removeFrom( markbar() ); + m_save_action->removeFrom( markbar() ); + m_tidy_action->removeFrom( markbar() ); + m_startBlock_action->removeFrom( markbar() ); + m_endBlock_action->removeFrom( markbar() ); + } + else if (markBar != fileBar) + { + markBar->clear(); + } + } + addmarkbar(config, "Mark", m_mark_action); + addmarkbar(config, "Annotate", m_annotate_action); + addmarkbar(config, "Goto", m_goto_action); + addmarkbar(config, "Delete", m_delete_action); + addmarkbar(config, "Autogen", m_autogen_action); + addmarkbar(config, "Clear", m_clear_action); + addmarkbar(config, "Save", m_save_action); + addmarkbar(config, "Tidy", m_tidy_action); + addmarkbar(config, "Start Block", m_startBlock_action); + addmarkbar(config, "Copy Block", m_endBlock_action); + if (checkbar(config, "Annotation indicator")) + { + if (m_bkmkAvail == NULL) + { + m_bkmkAvail = new QAction( tr( "Annotation" ), geticon( "find" ), QString::null, 0, this, 0 ); + connect( m_bkmkAvail, SIGNAL( activated() ), this, SLOT( showAnnotation() ) ); + + m_bkmkAvail->setEnabled(false); + } + QLabel *spacer = new QLabel(markBar, ""); + markbar()->setStretchableWidget(spacer); + m_bkmkAvail->removeFrom( markbar() ); + m_bkmkAvail->addTo( markbar() ); + } + else + { + if (m_bkmkAvail != NULL) + { + m_bkmkAvail->removeFrom( markbar() ); + delete m_bkmkAvail; + m_bkmkAvail = NULL; + } + } +} + +bool QTReaderApp::checkbar(Config* _config, const QString& key) +{ + return _config->readBoolEntry(key, false); +} + + +QToolBar* QTReaderApp::filebar() +{ + if (fileBar == NULL) + { + switch (m_tbpol) + { + case cesSingle: +// qDebug("Setting filebar to menubar"); + fileBar = menubar; + break; + default: + qDebug("Incorrect toolbar policy set"); + case cesMenuTool: + case cesMultiple: +// qDebug("Creating new file bar"); + fileBar = new QToolBar("File", this, m_tbposition); + break; + } +// fileBar->setHorizontalStretchable( true ); + } + return fileBar; +} +QToolBar* QTReaderApp::viewbar() +{ + if (viewBar == NULL) + { + switch (m_tbpol) + { + case cesMultiple: + viewBar = new QToolBar("View", this, m_tbposition); + break; + default: + qDebug("Incorrect toolbar policy set"); + case cesSingle: + case cesMenuTool: + viewBar = fileBar; + break; + } + } + return viewBar; +} +QToolBar* QTReaderApp::navbar() +{ + if (navBar == NULL) + { + switch (m_tbpol) + { + case cesMultiple: +// qDebug("Creating new nav bar"); + navBar = new QToolBar("Navigation", this, m_tbposition); + break; + default: + qDebug("Incorrect toolbar policy set"); + case cesSingle: + case cesMenuTool: + navBar = fileBar; +// qDebug("Setting navbar to filebar"); + break; + } + } + return navBar; +} +QToolBar* QTReaderApp::markbar() +{ + if (markBar == NULL) + { + switch (m_tbpol) + { + case cesMultiple: + markBar = new QToolBar("Marks", this, m_tbposition); + break; + default: + qDebug("Incorrect toolbar policy set"); + case cesSingle: + case cesMenuTool: + markBar = fileBar; + break; + } + } + return markBar; +} + +void QTReaderApp::addfilebar(Config* _config, const QString& key, QAction* a) +{ + if (_config->readBoolEntry(key, false)) a->addTo( filebar() ); +} +void QTReaderApp::addnavbar(Config* _config, const QString& key, QAction* a) +{ + if (_config->readBoolEntry(key, false)) a->addTo( navbar() ); +} +void QTReaderApp::addmarkbar(Config* _config, const QString& key, QAction* a) +{ + if (_config->readBoolEntry(key, false)) a->addTo( markbar() ); +} +void QTReaderApp::addviewbar(Config* _config, const QString& key, QAction* a) +{ + if (_config->readBoolEntry(key, false)) a->addTo( viewbar() ); } void QTReaderApp::suspend() { reader->suspend(); } +#ifdef USEMSGS void QTReaderApp::msgHandler(const QCString& _msg, const QByteArray& _data) { QString msg = QString::fromUtf8(_msg); -// qDebug("Received:%s", (const char*)msg); +//// qDebug("Received:%s", (const char*)msg); QDataStream stream( _data, IO_ReadOnly ); if ( msg == "info(QString)" ) { QString info; stream >> info; QMessageBox::information(this, PROGNAME, info); } + else if ( msg == "Update(int)" ) + { + int info; + stream >> info; + if (info) + { + reader->bDoUpdates = true; + reader->refresh(); + } + else + { + reader->bDoUpdates = false; + } + } else if ( msg == "warn(QString)" ) { QString info; stream >> info; QMessageBox::warning(this, PROGNAME, info); } - - else if ( msg == "exit()" ) { m_dontSave = true; close(); } else if ( msg == "pageDown()" ) { reader->dopagedn(); } else if ( msg == "pageUp()" ) { reader->dopageup(); } else if ( msg == "lineDown()" ) { reader->lineDown(); } else if ( msg == "lineUp()" ) { reader->lineUp(); } else if ( msg == "showText()" ) { showEditTools(); } + else if ( msg == "home()" ) + { + reader->goHome(); + } + else if ( msg == "back()" ) + { + reader->goBack(); + } + else if ( msg == "forward()" ) + { + reader->goForward(); + } else if ( msg == "File/Open(QString)" ) { QString info; stream >> info; openFile( info ); } else if ( msg == "File/Info()" ) { showinfo(); } - else if ( msg == "File/Start Block()" ) + else if ( msg == "File/Action(QString)" ) { - editMark(); - } - else if ( msg == "File/Copy Block()" ) - { - editCopy(); + QString info; + stream >> info; + m_spaceTarget = ActNameToInt(info); } - else if ( msg == "File/Scroll(int)" ) + else if ( msg == "Navigation/Scroll(int)" ) { int info; stream >> info; autoScroll(info); } - else if ( msg == "File/Jump(int)" ) + + else if ( msg == "Navigation/GotoStart()" ) + { + gotoStart(); + } + else if ( msg == "Navigation/GotoEnd()" ) + { + gotoEnd(); + } + else if ( msg == "Navigation/Jump(int)" ) { int info; stream >> info; reader->locate(info); } - else if ( msg == "File/Page/Line Scroll(int)" ) + else if ( msg == "Navigation/Page/LineScroll(int)" ) { int info; stream >> info; pagemode(info); } - else if ( msg == "File/Set Overlap(int)" ) + else if ( msg == "Navigation/SetOverlap(int)" ) { int info; stream >> info; reader->m_overlap = info; } + else if ( msg == "Navigation/SetMargin(int)" ) + { + int info; + stream >> info; + do_margin(info); + } else if ( msg == "File/Set Dictionary(QString)" ) { QString info; stream >> info; do_settarget(info); } +#ifdef _SCROLLPIPE + else if ( msg == "File/SetScrollTarget(QString)" ) + { + QString info; + stream >> info; + reader->m_pipetarget = info; + } +#endif else if ( msg == "File/Two/One Touch(int)" ) { int info; stream >> info; setTwoTouch(info); } else if ( msg == "Target/Annotation(int)" ) { int info; stream >> info; OnAnnotation(info); } else if ( msg == "Target/Dictionary(int)" ) { int info; stream >> info; OnDictionary(info); } else if ( msg == "Target/Clipboard(int)" ) { int info; stream >> info; OnClipboard(info); } else if ( msg == "File/Find(QString)" ) { QString info; stream >> info; QRegExp arg(info); size_t pos = reader->pagelocate(); size_t start = pos; CDrawBuffer test(&(reader->m_fontControl)); - reader->buffdoc.getline(&test,reader->width()); + reader->getline(&test); while (arg.match(toQString(test.data())) == -1) { pos = reader->locate(); - if (!reader->buffdoc.getline(&test,reader->width())) + if (!reader->getline(&test)) { QMessageBox::information(this, PROGNAME, QString("Can't find\n")+info); pos = start; break; } } reader->locate(pos); } - else if ( msg == "Layout/Strip CR(int)" ) + else if ( msg == "File/Fullscreen(int)" ) { int info; stream >> info; - stripcr(info); + setfullscreen(info); } - else if ( msg == "Layout/Single Space" ) + else if ( msg == "File/Continuous(int)" ) { int info; stream >> info; - onespace(info); + setcontinuous(info); } -#ifdef REPALM - else if ( msg == "Layout/Repalm(int)" ) + else if ( msg == "Markup(QString)" ) + { + QString info; + stream >> info; + if (info == "Auto") + { + autofmt(true); + } + if (info == "None") + { + autofmt(false); + textfmt(false); + striphtml(false); + peanut(false); + } + if (info == "Text") + { + textfmt(true); + } + if (info == "HTML") + { + striphtml(true); + } + if (info == "Peanut/PML") + { + peanut(true); + } + } + else if ( msg == "Layout/StripCR(int)" ) { int info; stream >> info; - repalm(info); + stripcr(info); } -#endif - else if ( msg == "Markup/Auto(int)" ) + else if ( msg == "Layout/Dehyphen(int)" ) { int info; stream >> info; - autofmt(info); + dehyphen(info); } - else if ( msg == "Markup/Text(int)" ) + else if ( msg == "Layout/Depluck(int)" ) { int info; stream >> info; - textfmt(info); + depluck(info); } - else if ( msg == "Markup/HTML(int)" ) + else if ( msg == "Layout/Dejpluck(int)" ) { int info; stream >> info; - striphtml(info); + dejpluck(info); } - else if ( msg == "Markup/Peanut(int)" ) + else if ( msg == "Layout/SingleSpace(int)" ) { int info; stream >> info; - peanut(info); + onespace(info); } - else if ( msg == "Layout/Dehyphen(int)" ) +#ifdef REPALM + else if ( msg == "Layout/Repalm(int)" ) { int info; stream >> info; - dehyphen(info); + repalm(info); } +#endif else if ( msg == "Layout/Unindent(int)" ) { int info; stream >> info; unindent(info); } else if ( msg == "Layout/Re-paragraph(int)" ) { int info; stream >> info; repara(info); } else if ( msg == "Layout/Double Space(int)" ) { int info; stream >> info; dblspce(info); } else if ( msg == "Layout/Indent(int)" ) { int info; stream >> info; reader->bindenter = info; reader->setfilter(reader->getfilter()); } else if ( msg == "Layout/Remap(int)" ) { int info; stream >> info; remap(info); } else if ( msg == "Layout/Embolden(int)" ) { int info; stream >> info; embolden(info); } else if ( msg == "Format/Ideogram/Word(int)" ) { int info; stream >> info; monospace(info); } - else if ( msg == "Format/Set width(int)" ) + else if ( msg == "Format/SetWidth(int)" ) { int info; stream >> info; reader->m_charpc = info; reader->setfont(); reader->refresh(); } - else if ( msg == "Format/Encoding(QString)" ) - { - QString info; - stream >> info; - reader->setencoding(EncNameToInt(info)); - } else if ( msg == "Format/Set Font(QString,int)" ) { QString fontname; int size; stream >> fontname; stream >> size; setfontHelper(fontname, size); } else if ( msg == "Marks/Autogen(QString)" ) { QString info; stream >> info; do_autogen(info); } + else if ( msg == "File/StartBlock()" ) + { + editMark(); } - + else if ( msg == "File/CopyBlock()" ) + { + editCopy(); + } +} +#endif ActionTypes QTReaderApp::ActNameToInt(const QString& _enc) { for (int i = 0; i < MAX_ACTIONS; i++) { if (m_buttonAction[i]->text() == _enc) return (ActionTypes)i; } return cesAutoScroll; } void QTReaderApp::setfullscreen(bool sfs) { reader->bDoUpdates = false; m_fullscreen = sfs; showEditTools(); - qApp->processEvents(); +// qApp->processEvents(); reader->bDoUpdates = true; reader->update(); } -void QTReaderApp::setcontinuous(bool sfs) -{ - reader->setContinuous(sfs); - reader->refresh(); -} - -int QTReaderApp::EncNameToInt(const QString& _enc) -{ - for (int i = 0; i < MAX_ENCODING; i++) - { - if (m_EncodingAction[i]->text() == _enc) return i; - } - return 0; -/* - if (_enc == "Ascii") return 0; - if (_enc == "UTF-8") return 1; - if (_enc == "UCS-2(BE)") return 2; - if (_enc == "USC-2(LE)") return 3; -*/ -} - -void QTReaderApp::encodingSelected(QAction* _a) -{ -// qDebug("es:%x : %s", _a, (const char *)(_a->text())); - reader->setencoding(EncNameToInt(_a->text())); -} - void QTReaderApp::buttonActionSelected(QAction* _a) { -// qDebug("es:%x : %s (%u)", _a, (const char *)(_a->text()), ActNameToInt(_a->text())); +//// qDebug("es:%x : %s (%u)", _a, (const char *)(_a->text()), ActNameToInt(_a->text())); m_spaceTarget = ActNameToInt(_a->text()); } QTReaderApp::~QTReaderApp() { } void QTReaderApp::autoScroll(bool _b) { reader->setautoscroll(_b); setScrollState(reader->m_autoScroll); } void QTReaderApp::zoomin() { reader->zoomin(); } void QTReaderApp::zoomout() { reader->zoomout(); } void QTReaderApp::clearBkmkList() { delete pBkmklist; pBkmklist = NULL; m_fBkmksChanged = false; } void QTReaderApp::fileClose() { + CCloseDialog* cd = new CCloseDialog(reader->m_string, false, this); + if (cd->exec()) + { if (pOpenlist != NULL) { int ind = 0; Bkmk* p = (*pOpenlist)[ind]; while (p != NULL && toQString(CFiledata(p->anno()).name()) != reader->m_lastfile) { p = (*pOpenlist)[++ind]; } if (p != NULL) pOpenlist->erase(ind); - switch (QMessageBox::information ( this , PROGNAME, "What do you want to delete?", "Nothing", "Marks", "Marks\nFile", 1, 0 )) + if (cd->delFile()) { - case 0: - default: - break; - case 2: unlink((const char*)reader->m_lastfile); - case 1: + } + if (cd->delMarks()) + { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR); + d.remove(reader->m_string); +#else /* USEQPE */ unlink((const char *)Global::applicationFileName(APPDIR, reader->m_string)); +#endif /* USEQPE */ + } + if (cd->delConfig()) + { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR "/configs"); + d.remove(reader->m_string); +#else /* USEQPE */ + unlink((const char *)Global::applicationFileName(APPDIR "/configs",reader->m_string)); +#endif /* USEQPE */ } } fileOpen2(); } + delete cd; +} void QTReaderApp::updatefileinfo() { - if (reader->m_string.isNull()) return; - if (reader->m_lastfile.isNull()) return; + if (reader->m_string.isEmpty()) return; + if (reader->m_lastfile.isEmpty()) return; tchar* nm = fromQString(reader->m_string); tchar* fl = fromQString(reader->m_lastfile); - qDebug("Lastfile:%x", fl); +// qDebug("Lastfile:%x", fl); bool notadded = true; if (pOpenlist == NULL) pOpenlist = new CList<Bkmk>; else { for (CList<Bkmk>::iterator iter = pOpenlist->begin(); iter != pOpenlist->end(); iter++) { if (ustrcmp(CFiledata(iter->anno()).name(), fl) == 0) { iter->value(reader->pagelocate()); unsigned short dlen; unsigned char* data; CFiledata fd(iter->anno()); reader->setSaveData(data, dlen, fd.content(), fd.length()); - qDebug("Filedata(1):%u, %u", fd.length(), dlen); +// qDebug("Filedata(1):%u, %u", fd.length(), dlen); // getstate(data, dlen); iter->setAnno(data, dlen); notadded = false; delete [] data; break; } } } - qDebug("Added?:%x", notadded); +// qDebug("Added?:%x", notadded); if (notadded) { struct stat fnstat; stat((const char *)reader->m_lastfile, &fnstat); CFiledata fd(fnstat.st_mtime, fl); unsigned short dlen; unsigned char* data; reader->setSaveData(data, dlen, fd.content(), fd.length()); pOpenlist->push_front(Bkmk(nm, data, dlen, reader->pagelocate())); - qDebug("Filedata(2):%u, %u", fd.length(), dlen); +// qDebug("Filedata(2):%u, %u", fd.length(), dlen); delete [] data; } delete [] nm; delete [] fl; } void QTReaderApp::fileOpen() { /* menu->hide(); - editBar->hide(); + fileBar->hide(); if (regVisible) regBar->hide(); if (searchVisible) searchBar->hide(); */ - qDebug("fileOpen"); +// qDebug("fileOpen"); // if (!reader->m_lastfile.isEmpty()) updatefileinfo(); fileOpen2(); } void QTReaderApp::fileOpen2() { if (pBkmklist != NULL) { if (m_fBkmksChanged) { if (QMessageBox::warning(this, PROGNAME, "Save bookmarks?", "Save", "Don't bother") == 0) savebkmks(); } delete pBkmklist; pBkmklist = NULL; m_fBkmksChanged = false; } reader->disableAutoscroll(); /* editorStack->raiseWidget( fileSelector ); fileSelector->reread(); */ + bool usebrowser = true; if (pOpenlist != NULL) { - m_nRegAction = cOpenFile; - listbkmk(pOpenlist, "Browse"); + m_nBkmkAction = cOpenFile; + if (listbkmk(pOpenlist, "Browse")) usebrowser = false; } - else + if (usebrowser) { QString fn = usefilebrowser(); +// qApp->processEvents(); if (!fn.isEmpty() && QFileInfo(fn).isFile()) { openFile(fn); } reader->setFocus(); } +// reader->refresh(); +// qDebug("HEIGHT:%d", reader->m_lastheight); } QString QTReaderApp::usefilebrowser() { - fileBrowser* fb = new fileBrowser(this,"QTReader",TRUE, +#ifndef USEQPE + QString s( QFileDialog::getOpenFileName( reader->m_lastfile, QString::null, this ) ); + return s; +#else + fileBrowser* fb = new fileBrowser(false, this,"OpieReader",!m_bFloatingDialog, 0, // WStyle_Customize | WStyle_NoBorderEx, "*", QFileInfo(reader->m_lastfile).dirPath(true)); QString fn; if (fb->exec()) { - fn = fb->fileList[0]; + fn = fb->getCurrentFile(); } - qDebug("Selected %s", (const char*)fn); +// qDebug("Selected %s", (const char*)fn); delete fb; + showEditTools(); return fn; +#endif } -void QTReaderApp::showgraphic(QPixmap& pm) +void QTReaderApp::showgraphic(QImage& pm) { - m_graphicwin->setPixmap(pm); + QPixmap pc; + pc.convertFromImage(pm); + m_graphicwin->setPixmap(pc); editorStack->raiseWidget( m_graphicwin ); m_graphicwin->setFocus(); } + +void QTReaderApp::showprefs() +{ + CPrefs* prefwin = new CPrefs(!m_bFloatingDialog, this); + + prefwin->twotouch(m_twoTouch); + prefwin->propfontchange(m_propogatefontchange); + prefwin->StripCR(reader->bstripcr); + prefwin->Dehyphen(reader->bdehyphen); + prefwin->SingleSpace(reader->bonespace); + prefwin->Unindent(reader->bunindent); + prefwin->Reparagraph(reader->brepara); + prefwin->DoubleSpace(reader->bdblspce); + prefwin->Remap(reader->bremap); + prefwin->Embolden(reader->bmakebold); + prefwin->FullJustify(reader->bfulljust); + prefwin->ParaLead(reader->getextraspace()); + prefwin->LineLead(reader->getlead()); + prefwin->Margin(reader->m_border); + prefwin->Indent(reader->bindenter); + if (reader->bautofmt) + { + prefwin->Markup(0); + } + else if (reader->btextfmt) + { + prefwin->Markup(2); + } + else if (reader->bstriphtml) + { + prefwin->Markup(3); + } + else if (reader->bpeanut) + { + prefwin->Markup(4); + } + else + { + prefwin->Markup(1); + } + prefwin->Depluck(reader->bdepluck); + prefwin->Dejpluck(reader->bdejpluck); + prefwin->Continuous(reader->m_continuousDocument); + + prefwin->dictApplication(m_targetapp); + prefwin->dictMessage(m_targetmsg); + + prefwin->spaceAction(m_spaceTarget); + prefwin->escapeAction(m_escapeTarget); + prefwin->returnAction(m_returnTarget); + prefwin->leftAction(m_leftTarget); + prefwin->rightAction(m_rightTarget); + prefwin->upAction(m_upTarget); + prefwin->downAction(m_downTarget); + + prefwin->leftScroll(m_leftScroll); + prefwin->rightScroll(m_rightScroll); + prefwin->upScroll(m_upScroll); + prefwin->downScroll(m_downScroll); + + prefwin->miscannotation(m_doAnnotation); + prefwin->miscdictionary(m_doDictionary); + prefwin->miscclipboard(m_doClipboard); + + prefwin->SwapMouse(reader->m_swapmouse); + + prefwin->Font(reader->m_fontname); + + prefwin->gfxsize(reader->getBaseSize()); + + prefwin->pageoverlap(reader->m_overlap); + + prefwin->ideogram(reader->m_bMonoSpaced); + + prefwin->encoding(reader->m_encd); + + prefwin->ideogramwidth(reader->m_charpc); + + if (prefwin->exec()) + { + m_twoTouch = prefwin->twotouch(); + reader->setTwoTouch(m_twoTouch); + m_touch_action->setOn(m_twoTouch); + + reader->bstripcr = prefwin->StripCR(); + reader->bdehyphen = prefwin->Dehyphen(); + reader->bonespace = prefwin->SingleSpace(); + reader->bunindent = prefwin->Unindent(); + reader->brepara = prefwin->Reparagraph(); + reader->bdblspce = prefwin->DoubleSpace(); + reader->bremap = prefwin->Remap(); + reader->bmakebold = prefwin->Embolden(); + reader->bfulljust = prefwin->FullJustify(); + reader->setextraspace(prefwin->ParaLead()); + reader->setlead(prefwin->LineLead()); + reader->m_border = prefwin->Margin(); + reader->bindenter = prefwin->Indent(); + reader->bautofmt = reader->btextfmt = reader->bstriphtml = reader->bpeanut = false; + switch (prefwin->Markup()) + { + case 0: + reader->bautofmt = true; + break; + case 1: + break; + case 2: + reader->btextfmt = true; + break; + case 3: + reader->bstriphtml = true; + break; + case 4: + reader->bpeanut = true; + break; + default: + qDebug("Format out of range"); + } + reader->bdepluck = prefwin->Depluck(); + reader->bdejpluck = prefwin->Dejpluck(); + reader->setContinuous(prefwin->Continuous()); + + m_spaceTarget = (ActionTypes)prefwin->spaceAction(); + m_escapeTarget = (ActionTypes)prefwin->escapeAction(); + m_returnTarget = (ActionTypes)prefwin->returnAction(); + m_leftTarget = (ActionTypes)prefwin->leftAction(); + m_rightTarget = (ActionTypes)prefwin->rightAction(); + m_upTarget = (ActionTypes)prefwin->upAction(); + m_downTarget = (ActionTypes)prefwin->downAction(); + m_leftScroll = prefwin->leftScroll(); + m_rightScroll = prefwin->rightScroll(); + m_upScroll = prefwin->upScroll(); + m_downScroll = prefwin->downScroll(); + + m_targetapp = prefwin->dictApplication(); + m_targetmsg = prefwin->dictMessage(); + + m_doAnnotation = prefwin->miscannotation(); + m_doDictionary = prefwin->miscdictionary(); + m_doClipboard = prefwin->miscclipboard(); + reader->m_swapmouse = prefwin->SwapMouse(); + reader->setBaseSize(prefwin->gfxsize()); + reader->m_overlap = prefwin->pageoverlap(); + reader->m_bMonoSpaced = prefwin->ideogram(); + m_setmono_action->setOn(reader->m_bMonoSpaced); + reader->m_encd = prefwin->encoding(); + reader->m_charpc = prefwin->ideogramwidth(); + + if ( + reader->m_fontname != prefwin->Font() + || + m_propogatefontchange != prefwin->propfontchange()) + { + m_propogatefontchange = prefwin->propfontchange(); + setfontHelper(prefwin->Font()); + } + delete prefwin; + reader->setfilter(reader->getfilter()); + reader->refresh(); + + } + else + { + delete prefwin; + } +} + +void QTReaderApp::showtoolbarprefs() +{ +#ifdef USEQPE + CBarPrefs* prefwin = new CBarPrefs(APPDIR, !m_bFloatingDialog, this); +#else + QFileInfo fi; + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) + { // "/tmp" + qWarning( "Cannot find the \"~/%s\" directory", APPDIR ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + fi.setFile(d, INIFILE); + CBarPrefs* prefwin = new CBarPrefs(fi.absFilePath(), !m_bFloatingDialog, this); +#endif + prefwin->tbpolicy(m_tbpolsave); + prefwin->tbposition(m_tbposition-2); + prefwin->tbmovable(m_tbmovesave); + prefwin->floating(m_bFloatingDialog); + if (prefwin->exec()) + { + m_bFloatingDialog = prefwin->floating(); + if ( + m_tbpolsave != (ToolbarPolicy)prefwin->tbpolicy() + || + m_tbposition != (ToolBarDock)(prefwin->tbposition()+2) + || + m_tbmovesave != prefwin->tbmovable() + ) + { + QMessageBox::warning(this, PROGNAME, "Some changes won't take effect\nuntil the next time the\napplication is started"); + } + m_tbpolsave = (ToolbarPolicy)prefwin->tbpolicy(); + m_tbposition = (ToolBarDock)(prefwin->tbposition()+2); + m_tbmovesave = prefwin->tbmovable(); + bool isChanged = prefwin->isChanged(); + delete prefwin; +#ifdef USEQPE + Config config( APPDIR ); +#else + QFileInfo fi; + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) + { // "/tmp" + qWarning( "Cannot find the \"~/%s\" directory", APPDIR ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + fi.setFile(d, INIFILE); + Config config( fi.absFilePath() ); +#endif + if (isChanged) addtoolbars(&config); + } + else + { + delete prefwin; + } +} + void QTReaderApp::showinfo() { unsigned long fs, ts, pl; if (reader->empty()) { QMessageBox::information(this, PROGNAME, "No file loaded", 1); } else { reader->sizes(fs,ts); pl = reader->pagelocate(); m_infoWin->setFileSize(fs); m_infoWin->setTextSize(ts); m_infoWin->setRatio(100-(100*fs + (ts >> 1))/ts); m_infoWin->setLocation(pl); m_infoWin->setRead((100*pl + (ts >> 1))/ts); editorStack->raiseWidget( m_infoWin ); m_infoWin->setFocus(); } } void QTReaderApp::addAnno(const QString& name, const QString& text, size_t posn) { if (pBkmklist == NULL) pBkmklist = new CList<Bkmk>; #ifdef _UNICODE CBuffer buff(name.length()+1); int i; for (i = 0; i < name.length(); i++) { buff[i] = name[i].unicode(); } buff[i] = 0; CBuffer buff2(text.length()+1); for (i = 0; i < text.length(); i++) { buff2[i] = text[i].unicode(); } buff2[i] = 0; pBkmklist->push_front(Bkmk(buff.data(), buff2.data(), posn)); #else pBkmklist->push_front(Bkmk((const tchar*)text,posn)); #endif m_fBkmksChanged = true; pBkmklist->sort(); } void QTReaderApp::addAnno(const QString& name, const QString& text) { if (m_annoIsEditing) { if (name.isEmpty()) { QMessageBox::information(this, PROGNAME, "Need a name for the bookmark\nPlease try again", 1); } else { addAnno(name, text, m_annoWin->getPosn()); } showEditTools(); } else { if (m_annoWin->edited()) { CBuffer buff(text.length()+1); int i; for (i = 0; i < text.length(); i++) { buff[i] = text[i].unicode(); } buff[i] = 0; m_fBkmksChanged = true; m_anno->setAnno(buff.data()); } bool found = findNextBookmark(m_anno->value()+1); if (found) { m_annoWin->setName(toQString(m_anno->name())); m_annoWin->setAnno(toQString(m_anno->anno())); } else { showEditTools(); } } } bool QTReaderApp::findNextBookmark(size_t start) { bool found = false; for (CList<Bkmk>::iterator iter = pBkmklist->begin(); iter != pBkmklist->end(); iter++) { if (iter->value() >= start) { if (iter->value() < reader->locate()) { found = true; m_anno = iter.pContent(); } break; } } return found; } void QTReaderApp::addanno() { if (reader->empty()) { QMessageBox::information(this, PROGNAME, "No file loaded", 1); } else { m_annoWin->setName(""); m_annoWin->setAnno(""); m_annoWin->setPosn(reader->pagelocate()); m_annoIsEditing = true; editorStack->raiseWidget( m_annoWin ); +#ifdef USEQPE Global::showInputMethod(); +#endif m_annoWin->setFocus(); } } void QTReaderApp::infoClose() { showEditTools(); } /* void QTReaderApp::fileRevert() { clear(); fileOpen(); } void QTReaderApp::editCut() { #ifndef QT_NO_CLIPBOARD editor->cut(); #endif } */ void QTReaderApp::editMark() { m_savedpos = reader->pagelocate(); } void QTReaderApp::editCopy() { QClipboard* cb = QApplication::clipboard(); QString text; int ch; unsigned long currentpos = reader->pagelocate(); unsigned long endpos = reader->locate(); + if (m_savedpos == 0xffffffff) + { + m_savedpos = currentpos; + } reader->jumpto(m_savedpos); while (reader->explocate() < endpos && (ch = reader->getch()) != UEOF) { text += ch; } cb->setText(text); reader->locate(currentpos); + m_savedpos = 0xffffffff; } -void QTReaderApp::pageup() +void QTReaderApp::gotoStart() { - reader->NavUp(); + reader->locate(reader->buffdoc.startSection()); } -void QTReaderApp::pagedn() +void QTReaderApp::gotoEnd() { - reader->NavDown(); + reader->dopageup(reader->buffdoc.endSection()); } -void QTReaderApp::stripcr(bool _b) -{ - reader->setstripcr(_b); -} -void QTReaderApp::onespace(bool _b) -{ - reader->setonespace(_b); -} -#ifdef REPALM -void QTReaderApp::repalm(bool _b) -{ - reader->setrepalm(_b); -} -#endif -void QTReaderApp::remap(bool _b) -{ - reader->setremap(_b); -} -void QTReaderApp::peanut(bool _b) -{ - reader->setpeanut(_b); -} -void QTReaderApp::embolden(bool _b) -{ - reader->setmakebold(_b); -} -void QTReaderApp::autofmt(bool _b) -{ - reader->setautofmt(_b); -} -void QTReaderApp::textfmt(bool _b) -{ - reader->settextfmt(_b); -} -void QTReaderApp::striphtml(bool _b) -{ - reader->setstriphtml(_b); -} -void QTReaderApp::dehyphen(bool _b) -{ - reader->setdehyphen(_b); -} -void QTReaderApp::unindent(bool _b) -{ - reader->setunindent(_b); -} -void QTReaderApp::repara(bool _b) +void QTReaderApp::pageup() { - reader->setrepara(_b); + reader->NavUp(); } -void QTReaderApp::dblspce(bool _b) + +void QTReaderApp::pagedn() { - reader->setdblspce(_b); + reader->NavDown(); } + void QTReaderApp::pagemode(bool _b) { reader->setpagemode(_b); } -void QTReaderApp::navkeys(bool _b) -{ - reader->m_navkeys = _b; -} -void QTReaderApp::monospace(bool _b) -{ - reader->setmono(_b); -} +/* void QTReaderApp::setspacing() { m_nRegAction = cMonoSpace; char lcn[20]; sprintf(lcn, "%lu", reader->m_charpc); regEdit->setText(lcn); do_regedit(); } - -void QTReaderApp::setoverlap() -{ - m_nRegAction = cOverlap; - char lcn[20]; - sprintf(lcn, "%lu", reader->m_overlap); - regEdit->setText(lcn); - do_regedit(); -} - +*/ void QTReaderApp::settarget() { m_nRegAction = cSetTarget; QString text = ((m_targetapp.isEmpty()) ? QString("") : m_targetapp) + "/" + ((m_targetmsg.isEmpty()) ? QString("") : m_targetmsg); regEdit->setText(text); do_regedit(); } -void QTReaderApp::do_overlap(const QString& lcn) -{ - bool ok; - unsigned long ulcn = lcn.toULong(&ok); - if (ok) - { - reader->m_overlap = ulcn; - } - else - QMessageBox::information(this, PROGNAME, "Must be a number"); -} - +/* void QTReaderApp::do_mono(const QString& lcn) { bool ok; unsigned long ulcn = lcn.toULong(&ok); if (ok) { reader->m_charpc = ulcn; reader->setfont(); reader->refresh(); // reader->setmono(true); } else QMessageBox::information(this, PROGNAME, "Must be a number"); } - +*/ /* void QTReaderApp::editPaste() { #ifndef QT_NO_CLIPBOARD editor->paste(); #endif } */ void QTReaderApp::editFind() { searchStart = reader->pagelocate(); #ifdef __ISEARCH searchStack = new QStack<searchrecord>; #endif +#ifdef USEQPE Global::showInputMethod(); +#endif searchBar->show(); searchVisible = TRUE; searchEdit->setFocus(); #ifdef __ISEARCH searchStack->push(new searchrecord("",reader->pagelocate())); #endif } void QTReaderApp::findNext() { - // qDebug("findNext called\n"); +// // qDebug("findNext called\n"); #ifdef __ISEARCH QString arg = searchEdit->text(); #else QRegExp arg = searchEdit->text(); #endif CDrawBuffer test(&(reader->m_fontControl)); size_t start = reader->pagelocate(); reader->jumpto(start); - reader->buffdoc.getline(&test,reader->width()); + reader->getline(&test); dosearch(start, test, arg); } void QTReaderApp::findClose() { searchVisible = FALSE; searchEdit->setText(""); +#ifdef USEQPE Global::hideInputMethod(); +#endif searchBar->hide(); #ifdef __ISEARCH // searchStack = new QStack<searchrecord>; while (!searchStack->isEmpty()) { delete searchStack->pop(); } delete searchStack; #endif reader->setFocus(); } void QTReaderApp::regClose() { regVisible = FALSE; regEdit->setText(""); regBar->hide(); +#ifdef USEQPE Global::hideInputMethod(); +#endif reader->setFocus(); } #ifdef __ISEARCH bool QTReaderApp::dosearch(size_t start, CDrawBuffer& test, const QString& arg) #else bool QTReaderApp::dosearch(size_t start, CDrawBuffer& test, const QRegExp& arg) #endif { bool ret = true; unsigned long fs, ts; reader->sizes(fs,ts); size_t pos = reader->locate(); - reader->buffdoc.getline(&test,reader->width()); + pbar->setGeometry(searchBar->x(),searchBar->y(),searchBar->width(), searchBar->height()); pbar->show(); - pbar->resize(width(), editBar->height()); + pbar->raise(); pbar->reset(); + int offset; int lastpc = (100*pos)/ts; pbar->setProgress(lastpc); - qApp->processEvents(); +// qApp->processEvents(); + if (reader->buffdoc.getpara(test) >= 0) + { reader->setFocus(); #ifdef __ISEARCH while (strstr(test.data(),(const tchar*)arg) == NULL) #else #ifdef _UNICODE - while (arg.match(toQString(test.data())) == -1) + while ((offset = arg.match(toQString(test.data()))) == -1) #else while (arg.match(test.data()) == -1) #endif #endif { pos = reader->locate(); - unsigned int lcn = reader->locate(); int pc = (100*pos)/ts; if (pc != lastpc) { pbar->setProgress(pc); qApp->processEvents(); reader->setFocus(); lastpc = pc; } - if (!reader->buffdoc.getline(&test,reader->width())) + if (reader->buffdoc.getpara(test) < 0) { if (QMessageBox::warning(this, "Can't find", searchEdit->text(), 1, 2) == 2) pos = searchStart; else pos = start; - ret = false; findClose(); - break; + pbar->hide(); + reader->locate(pos); + return false; } } +// qDebug("Found it at %u:%u", pos, offset); pbar->hide(); - reader->locate(pos); +// qDebug("Hid"); + reader->locate(pos+offset); +// qDebug("Loacted"); +// qDebug("page up"); + ret = true; + } + else + { + if (QMessageBox::warning(this, "Can't find", searchEdit->text(), 1, 2) == 2) + pos = searchStart; + else + pos = start; + ret = false; + findClose(); + } return ret; } #ifdef __ISEARCH void QTReaderApp::search(const QString & arg) { searchrecord* ss = searchStack->top(); CBuffer test; size_t start = reader->pagelocate(); bool haspopped = false; while (arg.left(ss->s.length()) != ss->s) { haspopped = true; start = ss->pos; // reader->locate(start); searchStack->pop(); delete ss; } if (haspopped) reader->locate(start); /* if (arg.length() < ss->len) { start = ss->pos; reader->locate(start); searchStack->pop(); delete ss; } */ else { start = reader->pagelocate(); reader->jumpto(start); searchStack->push(new searchrecord(arg,start)); } dosearch(start, test, arg); } #else void QTReaderApp::search() { findNext(); } #endif void QTReaderApp::openFile( const QString &f ) { - qDebug("File:%s", (const char*)f); +// qDebug("File:%s", (const char*)f); // openFile(DocLnk(f)); //} // //void QTReaderApp::openFile( const DocLnk &f ) //{ clear(); QFileInfo fm(f); if ( fm.exists() ) { // QMessageBox::information(0, "Progress", "Calling fileNew()"); - +#ifdef USEQPE if (fm.extension( FALSE ) == "desktop") { DocLnk d(f); QFileInfo fnew(d.file()); fm = fnew; if (!fm.exists()) return; } - +#endif clear(); reader->setText(fm.baseName(), fm.absFilePath()); + m_loadedconfig = readconfig(reader->m_string, false); showEditTools(); readbkmks(); + m_savedpos = 0xffffffff; } else { QMessageBox::information(this, PROGNAME, "File does not exist"); + reader->m_lastfile = QString::null; } } /* void QTReaderApp::resizeEvent(QResizeEvent* e) { if (m_fullscreen) { showNormal(); showFullScreen(); } } */ -void QTReaderApp::keyPressEvent(QKeyEvent* e) +void QTReaderApp::handlekey(QKeyEvent* e) { - if (m_fullscreen) +// qDebug("Keypress event"); + timeb now; + ftime(&now); + unsigned long etime = (1000*(now.time - m_lastkeytime.time) + now.millitm)-m_lastkeytime.millitm; + if (etime < m_debounce) { + return; + } + m_lastkeytime = now; switch(e->key()) { case Key_Escape: - m_actFullscreen->setOn(false); +// qDebug("escape event"); + if (m_disableesckey) + { + m_disableesckey = false; + } + else + { + m_bcloseDisabled = true; if (m_fullscreen) { - qDebug("Fullscreen already set - remove this!"); + m_actFullscreen->setOn(false); + e->accept(); } else { - m_fullscreen = false; - reader->bDoUpdates = false; - showEditTools(); - qApp->processEvents(); - reader->bDoUpdates = true; - reader->update(); +// qDebug("escape action"); + doAction(m_escapeTarget, e); + } } - e->accept(); break; - default: - e->ignore(); + case Key_Space: + { + doAction(m_spaceTarget, e); + } + break; + case Key_Return: + { + doAction(m_returnTarget, e); } + break; + case Key_Left: + { + if (reader->m_autoScroll && m_leftScroll) + { + reader->reduceScroll(); } else { + doAction(m_leftTarget, e); + } + } + break; + case Key_Right: + { + if (reader->m_autoScroll && m_rightScroll) + { + reader->increaseScroll(); + } + else + { + doAction(m_rightTarget, e); + } + } + break; + case Key_Up: + { + if (reader->m_autoScroll && m_upScroll) + { + reader->increaseScroll(); + } + else + { + doAction(m_upTarget, e); + } + } + break; + case Key_Down: + { + if (reader->m_autoScroll && m_downScroll) + { + reader->reduceScroll(); + } + else + { + doAction(m_downTarget, e); + } + } + break; + default: + { e->ignore(); } + +/* + QString msg("Key press was:"); + QString key; + msg += key.setNum(e->key()); + QMessageBox::information(this, PROGNAME, msg); +*/ + } } void QTReaderApp::showEditTools() { // if ( !doc ) // close(); if (m_fullscreen) { - editBar->hide(); + if (menubar != NULL) menubar->hide(); + if (fileBar != NULL) fileBar->hide(); + if (viewBar != NULL) viewBar->hide(); + if (navBar != NULL) navBar->hide(); + if (markBar != NULL) markBar->hide(); searchBar->hide(); regBar->hide(); +#ifdef USEQPE Global::hideInputMethod(); +#endif m_fontBar->hide(); // showNormal(); showFullScreen(); } else { - qDebug("him"); +// qDebug("him"); +#ifdef USEQPE Global::hideInputMethod(); - qDebug("eb"); - editBar->show(); +#endif +// qDebug("eb"); + menubar->show(); + if (fileBar != NULL) fileBar->show(); + if (viewBar != NULL) viewBar->show(); + if (navBar != NULL) navBar->show(); + if (markBar != NULL) markBar->show(); + mb->show(); if ( searchVisible ) { +#ifdef USEQPE Global::showInputMethod(); +#endif searchBar->show(); } if ( regVisible ) { +#ifdef USEQPE Global::showInputMethod(); +#endif regBar->show(); } if (m_fontVisible) m_fontBar->show(); - qDebug("sn"); +// qDebug("sn"); showNormal(); - qDebug("sm"); +// qDebug("sm"); +#ifdef USEQPE showMaximized(); +#endif // setCentralWidget(reader); } - qDebug("uc"); +// qDebug("uc"); updateCaption(); - qDebug("rw"); +// qDebug("rw"); editorStack->raiseWidget( reader ); - qDebug("sf"); +// qDebug("sf"); reader->setFocus(); + reader->refresh(); } /* void QTReaderApp::save() { if ( !doc ) return; if ( !editor->edited() ) return; QString rt = editor->text(); QString pt = rt; if ( doc->name().isEmpty() ) { unsigned ispace = pt.find( ' ' ); unsigned ienter = pt.find( '\n' ); int i = (ispace < ienter) ? ispace : ienter; QString docname; if ( i == -1 ) { if ( pt.isEmpty() ) docname = "Empty Text"; else docname = pt; } else { docname = pt.left( i ); } doc->setName(docname); } FileManager fm; fm.saveFile( *doc, rt ); } */ void QTReaderApp::clear() { // if (doc != 0) // { // QMessageBox::information(this, PROGNAME, "Deleting doc", 1); // delete doc; // QMessageBox::information(this, PROGNAME, "Deleted doc", 1); // doc = 0; // } reader->clear(); } void QTReaderApp::updateCaption() { // if ( !doc ) // setCaption( tr("QTReader") ); // else { // QString s = doc->name(); // if ( s.isEmpty() ) // s = tr( "Unnamed" ); setCaption( reader->m_string + " - " + tr(SHORTPROGNAME) ); // } } void QTReaderApp::setDocument(const QString& fileref) { bFromDocView = TRUE; //QMessageBox::information(0, "setDocument", fileref); openFile(fileref); // showEditTools(); } void QTReaderApp::closeEvent( QCloseEvent *e ) { +// qDebug("Close event"); if (m_fullscreen) { m_fullscreen = false; showEditTools(); e->accept(); } else if (m_dontSave) { e->accept(); } else { if (editorStack->visibleWidget() == reader) { + if ((m_escapeTarget != cesNone) && m_bcloseDisabled) + { +// qDebug("Close disabled"); + m_bcloseDisabled = false; + e->ignore(); + } + else + { if (m_fontVisible) { m_fontBar->hide(); m_fontVisible = false; } if (regVisible) { regBar->hide(); +#ifdef USEQPE Global::hideInputMethod(); +#endif regVisible = false; return; } if (searchVisible) { searchBar->hide(); +#ifdef USEQPE Global::hideInputMethod(); +#endif searchVisible = false; return; } if (m_fBkmksChanged && pBkmklist != NULL) { if (QMessageBox::warning(this, PROGNAME, "Save bookmarks?", "Save", "Don't bother") == 0) savebkmks(); delete pBkmklist; pBkmklist = NULL; m_fBkmksChanged = false; } bFromDocView = FALSE; updatefileinfo(); saveprefs(); e->accept(); } + } else { showEditTools(); + m_disableesckey = true; } } } void QTReaderApp::do_gotomark() { - m_nRegAction = cGotoBkmk; - listbkmk(pBkmklist); + m_nBkmkAction = cGotoBkmk; + if (!listbkmk(pBkmklist)) + QMessageBox::information(this, PROGNAME, "No bookmarks in memory"); } void QTReaderApp::do_delmark() { - m_nRegAction = cDelBkmk; - listbkmk(pBkmklist); + m_nBkmkAction = cDelBkmk; + if (!listbkmk(pBkmklist)) + QMessageBox::information(this, PROGNAME, "No bookmarks in memory"); } -void QTReaderApp::listbkmk(CList<Bkmk>* plist, const QString& _lab) +bool QTReaderApp::listbkmk(CList<Bkmk>* plist, const QString& _lab) { bkmkselector->clear(); - if (_lab.isNull()) + if (_lab.isEmpty()) bkmkselector->setText("Cancel"); else bkmkselector->setText(_lab); int cnt = 0; if (plist != NULL) { for (CList<Bkmk>::iterator i = plist->begin(); i != plist->end(); i++) { #ifdef _UNICODE - qDebug("Item:%s", (const char*)toQString(i->name())); +// qDebug("Item:%s", (const char*)toQString(i->name())); bkmkselector->insertItem(toQString(i->name())); #else bkmkselector->insertItem(i->name()); #endif cnt++; } } if (cnt > 0) { -//tjw menu->hide(); - editBar->hide(); - if (m_fontVisible) m_fontBar->hide(); - if (regVisible) - { - Global::hideInputMethod(); - regBar->hide(); - } - if (searchVisible) - { - Global::hideInputMethod(); - searchBar->hide(); - } + hidetoolbars(); editorStack->raiseWidget( bkmkselector ); + return true; } else - QMessageBox::information(this, PROGNAME, "No bookmarks in memory"); + return false; } void QTReaderApp::do_autogen() { m_nRegAction = cAutoGen; regEdit->setText(m_autogenstr); do_regedit(); } void QTReaderApp::do_regedit() { -// editBar->hide(); +// fileBar->hide(); reader->bDoUpdates = false; - qDebug("Showing regbar"); +// qDebug("Showing regbar"); regBar->show(); - qDebug("Showing kbd"); +// qDebug("Showing kbd"); +#ifdef USEQPE Global::showInputMethod(); +#endif regVisible = true; regEdit->setFocus(); - qApp->processEvents(); +// qApp->processEvents(); reader->bDoUpdates = true; reader->update(); } bool QTReaderApp::openfrombkmk(Bkmk* bk) { QString fn = toQString( CFiledata(bk->anno()).name() ); - qDebug("fileinfo"); +// qDebug("fileinfo"); if (!fn.isEmpty() && QFileInfo(fn).isFile()) { - qDebug("Opening"); +// qDebug("Opening"); openFile(fn); struct stat fnstat; stat((const char *)reader->m_lastfile, &fnstat); if (CFiledata(bk->anno()).date() != fnstat.st_mtime) { CFiledata fd(bk->anno()); fd.setdate(fnstat.st_mtime); bk->value(0); } else { unsigned short svlen = bk->filedatalen(); unsigned char* svdata = bk->filedata(); reader->putSaveData(svdata, svlen); // setstate(svdata, svlen); if (svlen != 0) { QMessageBox::warning(this, PROGNAME, "Not all file data used\nNew version?"); } - qDebug("updating"); +// qDebug("updating"); +// showEditTools(); reader->locate(bk->value()); } return true; } else { return false; } } void QTReaderApp::gotobkmk(int ind) { - switch (m_nRegAction) + showEditTools(); + switch (m_nBkmkAction) { case cOpenFile: { +// qApp->processEvents(); if (!openfrombkmk((*pOpenlist)[ind])) { pOpenlist->erase(ind); QMessageBox::information(this, PROGNAME, "Can't find file"); } } break; case cGotoBkmk: reader->locate((*pBkmklist)[ind]->value()); break; case cDelBkmk: -// qDebug("Deleting:%s\n",(*pBkmklist)[ind]->name()); +//// qDebug("Deleting:%s\n",(*pBkmklist)[ind]->name()); pBkmklist->erase(ind); m_fBkmksChanged = true; // pBkmklist->sort(); break; case cRmBkmkFile: + { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR); + d.remove(bkmkselector->text(ind)); +#else /* USEQPE */ unlink((const char *)Global::applicationFileName(APPDIR,bkmkselector->text(ind))); +#endif /* USEQPE */ + } + break; + case cLdConfig: + readconfig(bkmkselector->text(ind), false); + break; + case cRmConfig: + { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR "/configs"); + d.remove(bkmkselector->text(ind)); +#else /* USEQPE */ + unlink((const char *)Global::applicationFileName(APPDIR "/configs",bkmkselector->text(ind))); +#endif /* USEQPE */ + } + break; + case cExportLinks: + { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR "/urls"); + QFileInfo fi(d, bkmkselector->text(ind)); + if (fi.exists()) + { + QString outfile( QFileDialog::getSaveFileName( QString::null, QString::null, this ) ); + if (!outfile.isEmpty()) + { + FILE* fout = fopen((const char *)outfile, "w"); + if (fout != NULL) + { + FILE* fin = fopen((const char *)fi.absFilePath(), "r"); + if (fin != NULL) + { + fprintf(fout, "<html><body>\n"); + int ch = 0; + while ((ch = fgetc(fin)) != EOF) + { + fputc(ch, fout); + } + fclose(fin); + fprintf(fout, "</html></body>\n"); + d.remove(bkmkselector->text(ind)); + } + fclose(fout); + } + else + QMessageBox::information(this, PROGNAME, "Couldn't open output"); + } + } +#else /* USEQPE */ + FILE* fin = fopen((const char *)Global::applicationFileName(APPDIR "/urls",bkmkselector->text(ind)), "r"); + if (fin != NULL) + { + bool allok = false; + fileBrowser* fb = new fileBrowser(true, this,"OpieReader",!m_bFloatingDialog, 0, "*", QString::null); + if (fb->exec()) + { + QString outfile = fb->getCurrentFile(); + FILE* fout = fopen((const char *)outfile, "w"); + if (fout != NULL) + { + fprintf(fout, "<html><body>\n"); + int ch = 0; + while ((ch = fgetc(fin)) != EOF) + { + fputc(ch, fout); + } + fprintf(fout, "</html></body>\n"); + fclose(fout); + allok = true; + } + else + QMessageBox::information(this, PROGNAME, "Couldn't open output"); + } + delete fb; + fclose(fin); + if (allok) unlink((const char *)Global::applicationFileName(APPDIR "/urls",bkmkselector->text(ind))); + } + else + { + QMessageBox::information(this, PROGNAME, "Couldn't open input"); + } + +/* + CFileSelector *f = new CFileSelector("text/html", this, NULL, !m_bFloatingDialog, TRUE, TRUE ); + int ret = f->exec(); + qDebug("Return:%d", ret); + DocLnk* doc = f->getDoc(); + if (doc != NULL) + { + FILE* fin = fopen((const char *)Global::applicationFileName(APPDIR "/urls",bkmkselector->text(ind)), "r"); + QString rt; + rt = "<html><body>\n"; + int ch = 0; + while ((ch = fgetc(fin)) != EOF) + { + rt += (char)ch; + } + fclose(fin); + rt += "</html></body>\n"; + if ( doc->name().isEmpty() ) + { + doc->setName(bkmkselector->text(ind)); + } + FileManager fm; + fm.saveFile( *doc, rt ); + qDebug("YES"); + } + else + { + qDebug("NO"); + } + delete f; +*/ + +#endif /* USEQPE */ + } break; } - showEditTools(); } void QTReaderApp::cancelbkmk() { - if (m_nRegAction == cOpenFile) + if (m_nBkmkAction == cOpenFile) { QString fn = usefilebrowser(); if (!fn.isEmpty() && QFileInfo(fn).isFile()) openFile(fn); } showEditTools(); } void QTReaderApp::jump() { m_nRegAction = cJump; char lcn[20]; sprintf(lcn, "%lu", reader->pagelocate()); regEdit->setText(lcn); do_regedit(); } void QTReaderApp::do_jump(const QString& lcn) { bool ok; unsigned long ulcn = lcn.toULong(&ok); if (ok) reader->locate(ulcn); else QMessageBox::information(this, PROGNAME, "Must be a number"); } void QTReaderApp::do_regaction() { reader->bDoUpdates = false; regBar->hide(); +#ifdef USEQPE Global::hideInputMethod(); +#endif regVisible = false; switch(m_nRegAction) { case cAutoGen: do_autogen(regEdit->text()); break; case cAddBkmk: do_addbkmk(regEdit->text()); break; case cJump: do_jump(regEdit->text()); break; +/* case cMonoSpace: do_mono(regEdit->text()); break; - case cOverlap: - do_overlap(regEdit->text()); - break; +*/ case cSetTarget: do_settarget(regEdit->text()); break; +#ifdef _SCROLLPIPE + case cSetPipeTarget: + do_setpipetarget(regEdit->text()); + break; +#endif + case cSetConfigName: +// qDebug("Saving config"); + do_saveconfig(regEdit->text(), false); + break; } - reader->restore(); -// editBar->show(); +// reader->restore(); +// fileBar->show(); reader->setFocus(); - qApp->processEvents(); +// qApp->processEvents(); reader->bDoUpdates = true; reader->update(); } void QTReaderApp::do_settarget(const QString& _txt) { int ind = _txt.find('/'); if (ind == -1) { m_targetapp = ""; m_targetmsg = ""; QMessageBox::information(this, PROGNAME, "Format is\nappname/messagename"); } else { m_targetapp = _txt.left(ind); m_targetmsg = _txt.right(_txt.length()-ind-1); } } +void QTReaderApp::chooseencoding() +{ + m_fontSelector->clear(); + m_fontSelector->insertItem("Ascii"); + m_fontSelector->insertItem("UTF-8"); + m_fontSelector->insertItem("UCS-2(BE)"); + m_fontSelector->insertItem("USC-2(LE)"); + m_fontSelector->insertItem("Palm"); + for (unicodetable::iterator iter = unicodetable::begin(); iter != unicodetable::end(); iter++) + { + m_fontSelector->insertItem(iter->mime); + } // delete the FontDatabase!!! + m_fontSelector->setCurrentItem (reader->m_encd); + m_fontAction = cChooseEncoding; + m_fontBar->show(); + m_fontVisible = true; +} + void QTReaderApp::setfont() { + m_fontSelector->clear(); + { +#ifdef USEQPE + FontDatabase f; +#else + QFontDatabase f; +#endif + QStringList flist = f.families(); + m_fontSelector->insertStringList(flist); + } // delete the FontDatabase!!! + for (int i = 1; i <= m_fontSelector->count(); i++) { if (m_fontSelector->text(i) == reader->m_fontname) { m_fontSelector->setCurrentItem(i); break; } } + m_fontAction = cChooseFont; m_fontBar->show(); m_fontVisible = true; } void QTReaderApp::setfontHelper(const QString& lcn, int size) { if (size == 0) size = reader->m_fontControl.currentsize(); - QFont f(lcn, 10 /*, QFont::Bold*/); - qDebug("bs"); + if (m_propogatefontchange) + { + QFont f(lcn, 10); bkmkselector->setFont( f ); - qDebug("re"); regEdit->setFont( f ); - qDebug("se"); searchEdit->setFont( f ); - qDebug("aw"); m_annoWin->setFont( f ); + } reader->m_fontname = lcn; - qDebug("cf1"); if (!reader->ChangeFont(size)) { - qDebug("cf2"); reader->ChangeFont(size); } - qDebug("ref"); +} + +void QTReaderApp::do_setencoding(int i) +{ +// qDebug("setencoding:%d", i); + if (m_fontAction == cChooseEncoding) + { + reader->setencoding(i); + } reader->refresh(); m_fontBar->hide(); m_fontVisible = false; - qDebug("showedit"); +// qDebug("showedit"); if (reader->isVisible()) showEditTools(); - qDebug("showeditdone"); +// qDebug("showeditdone"); } void QTReaderApp::do_setfont(const QString& lcn) { + if (m_fontAction == cChooseFont) + { setfontHelper(lcn); } + reader->refresh(); + m_fontBar->hide(); + m_fontVisible = false; +// qDebug("showedit"); + //if (reader->isVisible()) + showEditTools(); +// qDebug("showeditdone"); +} void QTReaderApp::do_autogen(const QString& regText) { unsigned long fs, ts; reader->sizes(fs,ts); - // qDebug("Reg:%s\n", (const tchar*)(regEdit->text())); +// // qDebug("Reg:%s\n", (const tchar*)(regEdit->text())); m_autogenstr = regText; QRegExp re(regText); CBuffer buff; if (pBkmklist != NULL) delete pBkmklist; pBkmklist = new CList<Bkmk>; m_fBkmksChanged = true; + + pbar->setGeometry(regBar->x(),regBar->y(),regBar->width(), regBar->height()); pbar->show(); -pbar->resize(width(), editBar->height()); + pbar->raise(); pbar->reset(); + reader->update(); qApp->processEvents(); reader->setFocus(); reader->jumpto(0); int lastpc = 0; int i = 0; while (i >= 0) { unsigned int lcn = reader->locate(); int pc = (100*lcn)/ts; if (pc != lastpc) { pbar->setProgress(pc); qApp->processEvents(); if (reader->locate() != lcn) reader->jumpto(lcn); reader->setFocus(); lastpc = pc; } i = reader->buffdoc.getpara(buff); #ifdef _UNICODE if (re.match(toQString(buff.data())) != -1) #else if (re.match(buff.data()) != -1) #endif pBkmklist->push_back(Bkmk(buff.data(), NULL, lcn)); } pBkmklist->sort(); pbar->setProgress(100); qApp->processEvents(); pbar->hide(); + reader->refresh(); } void QTReaderApp::saveprefs() { +// qDebug("saveprefs"); // reader->saveprefs("uqtreader"); +// if (!m_loadedconfig) + do_saveconfig( APPDIR, true ); + +/* Config config( APPDIR ); config.setGroup( "View" ); reader->m_lastposn = reader->pagelocate(); + config.writeEntry("FloatDialogs", m_bFloatingDialog); config.writeEntry( "StripCr", reader->bstripcr ); config.writeEntry( "AutoFmt", reader->bautofmt ); config.writeEntry( "TextFmt", reader->btextfmt ); config.writeEntry( "StripHtml", reader->bstriphtml ); config.writeEntry( "Dehyphen", reader->bdehyphen ); + config.writeEntry( "Depluck", reader->bdepluck ); + config.writeEntry( "Dejpluck", reader->bdejpluck ); config.writeEntry( "OneSpace", reader->bonespace ); config.writeEntry( "Unindent", reader->bunindent ); config.writeEntry( "Repara", reader->brepara ); config.writeEntry( "DoubleSpace", reader->bdblspce ); config.writeEntry( "Indent", reader->bindenter ); config.writeEntry( "FontSize", (int)(reader->m_fontControl.currentsize()) ); config.writeEntry( "ScrollDelay", reader->m_delay); config.writeEntry( "LastFile", reader->m_lastfile ); config.writeEntry( "LastPosn", (int)(reader->pagelocate()) ); config.writeEntry( "PageMode", reader->m_bpagemode ); - config.writeEntry( "CursorNavigation", reader->m_navkeys ); config.writeEntry( "MonoSpaced", reader->m_bMonoSpaced ); + config.writeEntry( "SwapMouse", reader->m_swapmouse); config.writeEntry( "Fontname", reader->m_fontname ); config.writeEntry( "Encoding", reader->m_encd ); config.writeEntry( "CharSpacing", reader->m_charpc ); config.writeEntry( "Overlap", (int)(reader->m_overlap) ); + config.writeEntry( "Margin", (int)reader->m_border ); config.writeEntry( "TargetApp", m_targetapp ); config.writeEntry( "TargetMsg", m_targetmsg ); +#ifdef _SCROLLPIPE + config.writeEntry( "PipeTarget", reader->m_pipetarget ); + config.writeEntry( "PauseAfterPara", reader->m_pauseAfterEachPara ); +#endif config.writeEntry( "TwoTouch", m_twoTouch ); config.writeEntry( "Annotation", m_doAnnotation); config.writeEntry( "Dictionary", m_doDictionary); config.writeEntry( "Clipboard", m_doClipboard); config.writeEntry( "SpaceTarget", m_spaceTarget); + config.writeEntry( "EscapeTarget", m_escapeTarget); + config.writeEntry( "ReturnTarget", m_returnTarget); + config.writeEntry( "LeftTarget", m_leftTarget); + config.writeEntry( "RightTarget", m_rightTarget); + config.writeEntry( "UpTarget", m_upTarget); + config.writeEntry( "DownTarget", m_downTarget); + config.writeEntry("LeftScroll", m_leftScroll); + config.writeEntry("RightScroll", m_rightScroll); + config.writeEntry("UpScroll", m_upScroll); + config.writeEntry("DownScroll", m_downScroll); #ifdef REPALM config.writeEntry( "Repalm", reader->brepalm ); #endif config.writeEntry( "Remap", reader->bremap ); config.writeEntry( "Peanut", reader->bpeanut ); config.writeEntry( "MakeBold", reader->bmakebold ); config.writeEntry( "Continuous", reader->m_continuousDocument ); - + config.writeEntry( "FullJust", reader->bfulljust ); + config.writeEntry( "ExtraSpace", reader->getextraspace() ); + config.writeEntry( "ExtraLead", reader->getlead() ); + config.writeEntry( "Basesize", (int)reader->getBaseSize()); + config.writeEntry( "RequestorFontChange", m_propogatefontchange); + + config.setGroup( "Toolbar" ); + config.writeEntry("Movable", m_tbmovesave); + config.writeEntry("Policy", m_tbpolsave); + config.writeEntry("Position", m_tbposition); +*/ savefilelist(); } -void QTReaderApp::indentplus() -{ - reader->indentplus(); -} - -void QTReaderApp::indentminus() -{ - reader->indentminus(); -} - /* void QTReaderApp::oldFile() { - qDebug("oldFile called"); +// qDebug("oldFile called"); reader->setText(true); - qDebug("settext called"); +// qDebug("settext called"); showEditTools(); - qDebug("showedit called"); +// qDebug("showedit called"); } */ /* void info_cb(Fl_Widget* o, void* _data) { if (infowin == NULL) { infowin = new Fl_Window(160,240); filename = new Fl_Output(45,5,110,14,"Filename"); filesize = new Fl_Output(45,25,110,14,"Filesize"); textsize = new Fl_Output(45,45,110,14,"Textsize"); comprat = new CBar(45,65,110,14,"Ratio %"); posn = new Fl_Output(45,85,110,14,"Location"); frcn = new CBar(45,105,110,14,"% Read"); about = new Fl_Multiline_Output(5,125,150,90); about->value("TWReader - $Name$\n\nA file reader program for the Agenda\n\nReads text, PalmDoc and ppms format files"); Fl_Button *jump_accept = new Fl_Button(62,220,35,14,"Okay"); infowin->set_modal(); } if (((reader_ui *)_data)->g_filename[0] != '\0') { unsigned long fs,ts; tchar sz[20]; ((reader_ui *)_data)->input->sizes(fs,ts); unsigned long pl = ((reader_ui *)_data)->input->locate(); filename->value(((reader_ui *)_data)->g_filename); sprintf(sz,"%u",fs); filesize->value(sz); sprintf(sz,"%u",ts); textsize->value(sz); comprat->value(100-(100*fs + (ts >> 1))/ts); sprintf(sz,"%u",pl); posn->value(sz); frcn->value((100*pl + (ts >> 1))/ts); } infowin->show(); } */ void QTReaderApp::savebkmks() { if (pBkmklist != NULL) { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR); + QFileInfo fi(d, reader->m_string); + BkmkFile bf((const char *)fi.absFilePath(), true); +#else /* USEQPE */ BkmkFile bf((const char *)Global::applicationFileName(APPDIR, reader->m_string), true); +#endif /* USEQPE */ bf.write(*pBkmklist); } m_fBkmksChanged = false; } void QTReaderApp::readfilelist() { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR); + QFileInfo fi(d, ".openfiles"); + BkmkFile bf((const char *)fi.absFilePath()); +#else /* USEQPE */ BkmkFile bf((const char *)Global::applicationFileName(APPDIR, ".openfiles")); - qDebug("Reading open files"); +#endif /* USEQPE */ +// qDebug("Reading open files"); pOpenlist = bf.readall(); - if (pOpenlist != NULL) qDebug("...with success"); - else qDebug("...without success!"); +// if (pOpenlist != NULL) qDebug("...with success"); +// else qDebug("...without success!"); } void QTReaderApp::savefilelist() { if (pOpenlist != NULL) { +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR); + QFileInfo fi(d, ".openfiles"); + BkmkFile bf((const char *)fi.absFilePath(), true); +#else /* USEQPE */ BkmkFile bf((const char *)Global::applicationFileName(APPDIR, ".openfiles"), true); - qDebug("Writing open files"); +#endif /* USEQPE */ +// qDebug("Writing open files"); bf.write(*pOpenlist); } } void QTReaderApp::readbkmks() { if (pBkmklist != NULL) { delete pBkmklist; } struct stat fnstat; struct stat bkstat; +#ifndef USEQPE + QDir d = QDir::home(); // "/" + d.cd(APPDIR); + QFileInfo fi(d, reader->m_string); +#endif /* ! USEQPE */ if ( stat((const char *)reader->m_lastfile, &fnstat) == 0 && +#ifndef USEQPE + stat((const char *)fi.absFilePath(), &bkstat) == 0 +#else /* USEQPE */ stat((const char *)Global::applicationFileName(APPDIR, reader->m_string), &bkstat) == 0 +#endif /* USEQPE */ ) { if (bkstat.st_mtime < fnstat.st_mtime) { +#ifndef USEQPE + unlink((const char *)fi.absFilePath()); +#else /* USEQPE */ unlink((const char *)Global::applicationFileName(APPDIR, reader->m_string)); +#endif /* USEQPE */ } } +#ifndef USEQPE + BkmkFile bf((const char *)fi.absFilePath()); +#else /* USEQPE */ BkmkFile bf((const char *)Global::applicationFileName(APPDIR, reader->m_string)); +#endif /* USEQPE */ pBkmklist = bf.readall(); m_fBkmksChanged = bf.upgraded(); if (pBkmklist == NULL) { pBkmklist = reader->getbkmklist(); } if (pBkmklist != NULL) pBkmklist->sort(); } void QTReaderApp::addbkmk() { m_nRegAction = cAddBkmk; regEdit->setText(reader->firstword()); do_regedit(); } void QTReaderApp::do_addbkmk(const QString& text) { if (text.isEmpty()) { QMessageBox::information(this, PROGNAME, "Need a name for the bookmark\nSelect add again", 1); } else { if (pBkmklist == NULL) pBkmklist = new CList<Bkmk>; #ifdef _UNICODE CBuffer buff; int i = 0; for (i = 0; i < text.length(); i++) { buff[i] = text[i].unicode(); } buff[i] = 0; pBkmklist->push_front(Bkmk(buff.data(), NULL, reader->pagelocate())); #else pBkmklist->push_front(Bkmk((const tchar*)text, reader->pagelocate())); #endif m_fBkmksChanged = true; pBkmklist->sort(); } } void QTReaderApp::OnRedraw() { - if (pBkmklist != NULL) + if ((pBkmklist != NULL) && (m_bkmkAvail != NULL)) { bool found = findNextBookmark(reader->pagelocate()); m_bkmkAvail->setEnabled(found); } } void QTReaderApp::showAnnotation() { m_annoWin->setName(toQString(m_anno->name())); m_annoWin->setAnno(toQString(m_anno->anno())); m_annoIsEditing = false; +#ifdef USEQPE Global::showInputMethod(); +#endif editorStack->raiseWidget( m_annoWin ); m_annoWin->setFocus(); } void QTReaderApp::OnWordSelected(const QString& wrd, size_t posn, const QString& line) { -// qDebug("OnWordSelected(%u):%s", posn, (const char*)wrd); +//// qDebug("OnWordSelected(%u):%s", posn, (const char*)wrd); if (m_doClipboard) { QClipboard* cb = QApplication::clipboard(); cb->setText(wrd); +#ifdef USEQPE if (wrd.length() > 10) { Global::statusMessage(wrd.left(8) + ".."); } else { Global::statusMessage(wrd); } +#endif } if (m_doAnnotation) { // addAnno(wrd, "Need to be able to edit this", posn); m_annoWin->setName(line); m_annoWin->setAnno(""); m_annoWin->setPosn(posn); m_annoIsEditing = true; +#ifdef USEQPE Global::showInputMethod(); +#endif editorStack->raiseWidget( m_annoWin ); } +#ifdef USEQPE if (m_doDictionary) { if (!m_targetapp.isEmpty() && !m_targetmsg.isEmpty()) { QCopEnvelope e(("QPE/Application/"+m_targetapp).utf8(), (m_targetmsg+"(QString)").utf8()); e << wrd; } } +#endif } -void QTReaderApp::OnActionPressed() +void QTReaderApp::doAction(ActionTypes a, QKeyEvent* e) +{ + if (a == 0) + { + e->ignore(); + } + else { - switch (m_spaceTarget) + e->accept(); +// qDebug("Accepted"); + switch (a) { case cesOpenFile: { fileOpen(); } break; case cesAutoScroll: { reader->setautoscroll(!reader->m_autoScroll); setScrollState(reader->m_autoScroll); } break; case cesActionMark: { addbkmk(); } break; case cesFullScreen: { - m_actFullscreen->setOn(true); + m_actFullscreen->setOn(!m_fullscreen); } break; - default: + case cesActionAnno: { - qDebug("Unknown ActionType:%u", m_spaceTarget); + addanno(); } break; + case cesZoomIn: + zoomin(); + break; + case cesZoomOut: + zoomout(); + break; + case cesBack: + reader->goBack(); + break; + case cesForward: + reader->goForward(); + break; + case cesHome: + reader->goHome(); + break; + case cesPageUp: + reader->dopageup(); + break; + case cesPageDown: + reader->dopagedn(); + break; + case cesLineUp: + reader->lineUp(); + break; + case cesLineDown: + reader->lineDown(); + break; + case cesStartDoc: + gotoStart(); + break; + case cesEndDoc: + gotoEnd(); + break; + default: + qDebug("Unknown ActionType:%u", a); + break; + } } } void QTReaderApp::setTwoTouch(bool _b) { reader->setTwoTouch(_b); } void QTReaderApp::restoreFocus() { reader->setFocus(); } +void QTReaderApp::SaveConfig() +{ + m_nRegAction = cSetConfigName; + regEdit->setText(reader->m_string); + do_regedit(); +} + +void QTReaderApp::do_saveconfig(const QString& _txt, bool full) +{ +// qDebug("do_saveconfig:%s", (const char*)_txt); +#ifdef USEQPE + QString configname; + Config::Domain dom; + + if (full) + { + configname = _txt; + dom = Config::User; + } + else + { + configname = Global::applicationFileName(APPDIR "/configs", _txt); + dom = Config::File; + } + + Config config(configname, dom); + config.setGroup( "View" ); + +#else + QFileInfo fi; + if (full) + { +// qDebug("full:%s", (const char*)_txt); + QDir d = QDir::home(); // "/" + if ( !d.cd(_txt) ) + { // "/tmp" + qWarning( "Cannot find the \"~/%s\" directory", (const char*)_txt ); + d = QDir::home(); + d.mkdir(_txt); + d.cd(_txt); + } + fi.setFile(d, INIFILE); + } + else + { + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) + { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "\" directory" ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + if ( !d.cd("configs") ) + { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "/configs\" directory" ); + d = QDir::home(); + d.cd(APPDIR); + d.mkdir("configs"); + d.cd("configs"); + } + fi.setFile(d, _txt); + } +// qDebug("Path:%s", (const char*)fi.absFilePath()); + Config config(fi.absFilePath()); +#endif + + + config.writeEntry( "StripCr", reader->bstripcr ); + config.writeEntry( "AutoFmt", reader->bautofmt ); + config.writeEntry( "TextFmt", reader->btextfmt ); + config.writeEntry( "StripHtml", reader->bstriphtml ); + config.writeEntry( "Dehyphen", reader->bdehyphen ); + config.writeEntry( "Depluck", reader->bdepluck ); + config.writeEntry( "Dejpluck", reader->bdejpluck ); + config.writeEntry( "OneSpace", reader->bonespace ); + config.writeEntry( "Unindent", reader->bunindent ); + config.writeEntry( "Repara", reader->brepara ); + config.writeEntry( "DoubleSpace", reader->bdblspce ); + config.writeEntry( "Indent", reader->bindenter ); + config.writeEntry( "FontSize", (int)(reader->m_fontControl.currentsize()) ); + config.writeEntry( "ScrollDelay", reader->m_delay); + if (full) + { + config.writeEntry("Debounce", m_debounce); + config.writeEntry("FloatDialogs", m_bFloatingDialog); + reader->m_lastposn = reader->pagelocate(); + config.writeEntry( "LastFile", reader->m_lastfile ); + config.writeEntry( "LastPosn", (int)(reader->pagelocate()) ); + } + config.writeEntry( "PageMode", reader->m_bpagemode ); + config.writeEntry( "MonoSpaced", reader->m_bMonoSpaced ); + config.writeEntry( "SwapMouse", reader->m_swapmouse); + config.writeEntry( "Fontname", reader->m_fontname ); + config.writeEntry( "Encoding", reader->m_encd ); + config.writeEntry( "CharSpacing", reader->m_charpc ); + config.writeEntry( "Overlap", (int)(reader->m_overlap) ); + config.writeEntry( "Margin", (int)reader->m_border ); + config.writeEntry( "TargetApp", m_targetapp ); + config.writeEntry( "TargetMsg", m_targetmsg ); +#ifdef _SCROLLPIPE + config.writeEntry( "PipeTarget", reader->m_pipetarget ); + config.writeEntry( "PauseAfterPara", reader->m_pauseAfterEachPara ); +#endif + config.writeEntry( "TwoTouch", m_twoTouch ); + config.writeEntry( "Annotation", m_doAnnotation); + config.writeEntry( "Dictionary", m_doDictionary); + config.writeEntry( "Clipboard", m_doClipboard); + config.writeEntry( "SpaceTarget", m_spaceTarget); + config.writeEntry( "EscapeTarget", m_escapeTarget); + config.writeEntry( "ReturnTarget", m_returnTarget); + config.writeEntry( "LeftTarget", m_leftTarget); + config.writeEntry( "RightTarget", m_rightTarget); + config.writeEntry( "UpTarget", m_upTarget); + config.writeEntry( "DownTarget", m_downTarget); + config.writeEntry("LeftScroll", m_leftScroll); + config.writeEntry("RightScroll", m_rightScroll); + config.writeEntry("UpScroll", m_upScroll); + config.writeEntry("DownScroll", m_downScroll); +#ifdef REPALM + config.writeEntry( "Repalm", reader->brepalm ); +#endif + config.writeEntry( "Remap", reader->bremap ); + config.writeEntry( "Peanut", reader->bpeanut ); + config.writeEntry( "MakeBold", reader->bmakebold ); + config.writeEntry( "Continuous", reader->m_continuousDocument ); + config.writeEntry( "FullJust", reader->bfulljust ); + config.writeEntry( "ExtraSpace", reader->getextraspace() ); + config.writeEntry( "ExtraLead", reader->getlead() ); + config.writeEntry( "Basesize", (int)reader->getBaseSize()); + config.writeEntry( "RequestorFontChange", m_propogatefontchange); + if (full) + { + config.setGroup( "Toolbar" ); + config.writeEntry("Movable", m_tbmovesave); + config.writeEntry("Policy", m_tbpolsave); + config.writeEntry("Position", m_tbposition); +#ifndef USEQPE + config.setGroup( "Geometry" ); + config.writeEntry( "x", x() ); + config.writeEntry( "y", y() ); + config.writeEntry( "width", width() ); + config.writeEntry( "height", height() ); +#endif + } +} + /* void QTReaderApp::setstate(unsigned char* _sd, unsigned short _sdlen) { unsigned short sdlen; memcpy(&sdlen, _sd, sizeof(sdlen)); sdlen -= sizeof(sdlen); _sd += sizeof(sdlen); statedata* sd; char* data; if (sdlen < sizeof(statedata)+1) { sdlen = sizeof(statedata)+1; } data = new char[sdlen]; sd = (statedata*)data; memcpy(sd, _sd, sdlen); data[sdlen] = 0; reader->setstate(*sd); delete [] data; } void QTReaderApp::getstate(unsigned char*& data, unsigned short& len) { unsigned char* olddata = data; unsigned short oldlen = len; len = oldlen+sizeof(unsigned short)+sizeof(statedata)+reader->m_fontname.length(); data = new unsigned char[len]; memcpy(data, olddata, oldlen); delete [] olddata; memcpy(data+oldlen, &len, sizeof(len)); statedata* sd = (statedata*)(data+oldlen+sizeof(unsigned short)); sd->bstripcr = reader->bstripcr; sd->btextfmt = reader->btextfmt; sd->bautofmt = reader->bautofmt; sd->bstriphtml = reader->bstriphtml; sd->bpeanut = reader->bpeanut; sd->bdehyphen = reader->bdehyphen; + sd->bdepluck = reader->bdepluck; + sd->bdejpluck = reader->bdejpluck; sd->bonespace = reader->bonespace; sd->bunindent = reader->bunindent; sd->brepara = reader->brepara; sd->bdblspce = reader->bdblspce; sd->m_bpagemode = reader->m_bpagemode; - sd->m_navkeys = reader->m_navkeys; sd->m_bMonoSpaced = reader->m_bMonoSpaced; sd->bremap = reader->bremap; sd->bmakebold = reader->bmakebold; sd->Continuous = reader->m_continuousDocument; #ifdef REPALM sd->brepalm = reader->brepalm; #endif sd->bindenter = reader->bindenter; sd->m_textsize = reader->m_textsize; //reader->m_fontControl.currentsize() sd->m_encd = reader->m_encd; sd->m_charpc = reader->m_charpc; strcpy(sd->m_fontname, reader->m_fontname.latin1()); } */ +#ifdef _SCRIPT +void QTReaderApp::RunScript() +{ + fileBrowser* fb = new fileBrowser(this,"OpieReader",!m_bFloatingDialog, + 0, +// WStyle_Customize | WStyle_NoBorderEx, + "*", Global::applicationFileName(APPDIR "/scripts", "")); + + QString fn; + if (fb->exec()) + { + fn = fb->fileList[0]; + } + delete fb; + if ( !fn.isEmpty() && fork() == 0 ) + { + execlp((const char *)fn,(const char *)fn,NULL); + } +} + +void QTReaderApp::SaveScript(const char* sname) +{ + FILE* f = fopen(sname,"w"); + if (f != NULL) + { +#ifdef OPIE + fprintf(f, "#!/bin/sh\nmsg() {\n\tqcop QPE/Application/reader \"$1\" \"$2\" \"$3\"\n}\n"); +#else + fprintf(f, "#!/bin/bash\nmsg() {\n\tqcop QPE/Application/uqtreader \"$1\" \"$2\" \"$3\"\n}\n"); +#endif + fprintf(f, "msg \"Update(int)\" 0\n"); + fprintf(f, "msg \"Layout/StripCR(int)\" %d\n", (reader->bstripcr) ? 1:0); + if (reader->btextfmt) fprintf(f, "msg \"Markup(QString)\" \"Text\"\n"); + else if (reader->bautofmt) fprintf(f, "msg \"Markup(QString)\" \"Auto\"\n"); + else if (reader->bstriphtml) fprintf(f, "msg \"Markup(QString)\" \"HTML\"\n"); + else if (reader->bpeanut) fprintf(f, "msg \"Markup(QString)\" \"Peanut/PML\"\n"); + else fprintf(f, "msg \"Markup(QString)\" \"None\"\n"); + fprintf(f, "msg \"Layout/Dehyphen(int)\" %d\n", (reader->bdehyphen) ? 1:0); + fprintf(f, "msg \"Layout/Depluck(int)\" %d\n", (reader->bdepluck) ? 1:0); + fprintf(f, "msg \"Layout/Dejpluck(int)\" %d\n", (reader->bdejpluck) ? 1:0); + fprintf(f, "msg \"Layout/SingleSpace(int)\" %d\n", (reader->bonespace) ? 1:0); + fprintf(f, "msg \"Layout/Unindent(int)\" %d\n", (reader->bunindent) ? 1:0); + fprintf(f, "msg \"Layout/Re-paragraph(int)\" %d\n", (reader->brepara) ? 1:0); + fprintf(f, "msg \"Layout/DoubleSpace(int)\" %d\n", (reader->bdblspce) ? 1:0); + fprintf(f, "msg \"Layout/Indent(int)\" %d\n", reader->bindenter); + fprintf(f, "msg \"Format/SetFont(QString,int)\" \"%s\" %d\n", (const char*)reader->m_fontname, reader->m_textsize); + fprintf(f, "msg \"Navigation/Page/LineScroll(int)\" %d\n", (reader->m_bpagemode) ? 1:0); + fprintf(f, "msg \"Format/Ideogram/Word(int)\" %d\n", (reader->m_bMonoSpaced) ? 1:0); + fprintf(f, "msg \"Format/Encoding(QString)\" \"%s\"\n", (const char*)m_EncodingAction[reader->m_encd]->text()); + fprintf(f, "msg \"Format/SetWidth(int)\" %d\n", reader->m_charpc); + fprintf(f, "msg \"Navigation/SetOverlap(int)\" %d\n", reader->m_overlap); + fprintf(f, "msg \"Layout/Remap(int)\" %d\n", (reader->bremap) ? 1:0); + fprintf(f, "msg \"Layout/Embolden(int)\" %d\n", (reader->bmakebold) ? 1:0); + fprintf(f, "msg \"File/Continuous(int)\" %d\n", (reader->m_continuousDocument) ? 1:0); + fprintf(f, "msg \"File/SetDictionary(QString)\" \"%s/%s\"\n", (const char *)m_targetapp, (const char *)m_targetmsg); +#ifdef _SCROLLPIPE + fprintf(f, "msg \"File/SetScrollTarget(QString)\" \"%s\"\n", (const char *)reader->m_pipetarget); +#endif + fprintf(f, "msg \"File/Two/OneTouch(int)\" %d\n", (m_twoTouch) ? 1:0); + fprintf(f, "msg \"Target/Annotation(int)\" %d\n", (m_doAnnotation) ? 1:0); + fprintf(f, "msg \"Target/Dictionary(int)\" %d\n", (m_doDictionary) ? 1:0); + fprintf(f, "msg \"Target/Clipboard(int)\" %d\n", (m_doClipboard) ? 1:0); + fprintf(f, "msg \"File/Action(QString)\" \"%s\"\n", (const char *)m_buttonAction[m_spaceTarget]->text()); + fprintf(f, "msg \"Update(int)\" 1\n"); + fprintf(f, "msg \"info(QString)\" \"All Done\"\n"); + fclose(f); + chmod(sname, S_IXUSR | S_IXGRP | S_IXOTH); + } +} + +void QTReaderApp::SaveConfig() +{ + m_nRegAction = cSetConfigName; + regEdit->setText(""); + do_regedit(); +} + +void QTReaderApp::do_saveconfig(const QString& _txt) +{ + SaveScript(Global::applicationFileName(APPDIR "/scripts", _txt)); +} +#endif + +#ifdef _SCROLLPIPE +void QTReaderApp::setpipetarget() +{ + m_nRegAction = cSetPipeTarget; + QString text = (reader->m_pipetarget.isEmpty()) ? QString("") : reader->m_pipetarget; + regEdit->setText(text); + do_regedit(); +} + +void QTReaderApp::do_setpipetarget(const QString& _txt) +{ + reader->m_pipetarget = _txt; +} + +void QTReaderApp::setpause(bool sfs) +{ + reader->m_pauseAfterEachPara = sfs; +} +#endif + +void QTReaderApp::monospace(bool _b) +{ + reader->setmono(_b); +} + +bool QTReaderApp::readconfig(const QString& _txt, bool full=false) +{ +#ifdef USEQPE + QString configname; + Config::Domain dom; + + if (full) + { + configname = _txt; + dom = Config::User; + } + else + { + configname = Global::applicationFileName(APPDIR "/configs", _txt); + QFileInfo fm(configname); + if ( !fm.exists() ) return false; + dom = Config::File; + } + + Config config(configname, dom); + config.setGroup( "View" ); + +#else + QFileInfo fi; + if (full) + { + QDir d = QDir::home(); // "/" + if ( !d.cd(_txt) ) + { // "/tmp" + qWarning( "Cannot find the \"~/%s\" directory", (const char*)_txt ); + d = QDir::home(); + d.mkdir(_txt); + d.cd(_txt); + } + fi.setFile(d, INIFILE); + } + else + { + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) + { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "\" directory" ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + if ( !d.cd("configs") ) + { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "/configs\" directory" ); + d = QDir::home(); + d.mkdir("configs"); + d.cd("configs"); + } + fi.setFile(d, _txt); + } +#ifdef _WINDOWS + struct stat fnstat; + if (stat((const char *)reader->m_lastfile, &fnstat) == 0) return false; // get round fileinfo bug on windows +#else + if (!fi.exists()) return false; +#endif + Config config(fi.absFilePath()); +#endif + if (full) + { + config.setGroup("Toolbar"); + m_tbmovesave = m_tbmove = config.readBoolEntry("Movable", false); + m_tbpolsave = m_tbpol = (ToolbarPolicy)config.readNumEntry("Policy", 1); + m_tbposition = (ToolBarDock)config.readNumEntry("Position", 2); + } + config.setGroup( "View" ); + m_bFloatingDialog = config.readBoolEntry("FloatDialogs", false); + reader->bstripcr = config.readBoolEntry( "StripCr", true ); + reader->bfulljust = config.readBoolEntry( "FullJust", false ); + reader->setextraspace(config.readNumEntry( "ExtraSpace", 0 )); + reader->setlead(config.readNumEntry( "ExtraLead", 0 )); + reader->btextfmt = config.readBoolEntry( "TextFmt", false ); + reader->bautofmt = config.readBoolEntry( "AutoFmt", true ); + reader->bstriphtml = config.readBoolEntry( "StripHtml", false ); + reader->bpeanut = config.readBoolEntry( "Peanut", false ); + reader->bdehyphen = config.readBoolEntry( "Dehyphen", false ); + reader->bdepluck = config.readBoolEntry( "Depluck", false ); + reader->bdejpluck = config.readBoolEntry( "Dejpluck", false ); + reader->bonespace = config.readBoolEntry( "OneSpace", false ); + reader->bunindent = config.readBoolEntry( "Unindent", false ); + reader->brepara = config.readBoolEntry( "Repara", false ); + reader->bdblspce = config.readBoolEntry( "DoubleSpace", false ); + reader->bindenter = config.readNumEntry( "Indent", 0 ); + reader->m_textsize = config.readNumEntry( "FontSize", 12 ); + reader->m_delay = config.readNumEntry( "ScrollDelay", 5184); + if (full) + { + reader->m_lastfile = config.readEntry( "LastFile", QString::null ); + reader->m_lastposn = config.readNumEntry( "LastPosn", 0 ); + } + reader->m_bpagemode = config.readBoolEntry( "PageMode", true ); + reader->m_bMonoSpaced = config.readBoolEntry( "MonoSpaced", false); + reader->m_swapmouse = config.readBoolEntry( "SwapMouse", false); + reader->m_fontname = config.readEntry( "Fontname", "helvetica" ); + reader->m_encd = config.readNumEntry( "Encoding", 0 ); + reader->m_charpc = config.readNumEntry( "CharSpacing", 100 ); + reader->m_overlap = config.readNumEntry( "Overlap", 0 ); + reader->m_border = config.readNumEntry( "Margin", 6 ); +#ifdef REPALM + reader->brepalm = config.readBoolEntry( "Repalm", true ); +#endif + reader->bremap = config.readBoolEntry( "Remap", true ); + reader->bmakebold = config.readBoolEntry( "MakeBold", false ); + reader->setContinuous(config.readBoolEntry( "Continuous", true )); + m_targetapp = config.readEntry( "TargetApp", QString::null ); + m_targetmsg = config.readEntry( "TargetMsg", QString::null ); +#ifdef _SCROLLPIPE + reader->m_pipetarget = config.readEntry( "PipeTarget", QString::null ); + reader->m_pauseAfterEachPara = config.readBoolEntry( "PauseAfterPara", true ); +#endif + m_twoTouch = config.readBoolEntry( "TwoTouch", false); + m_doAnnotation = config.readBoolEntry( "Annotation", false); + m_doDictionary = config.readBoolEntry( "Dictionary", false); + m_doClipboard = config.readBoolEntry( "Clipboard", false); + m_spaceTarget = (ActionTypes)config.readNumEntry("SpaceTarget", cesAutoScroll); + m_escapeTarget = (ActionTypes)config.readNumEntry("EscapeTarget", cesNone); + m_returnTarget = (ActionTypes)config.readNumEntry("ReturnTarget", cesFullScreen); + m_leftTarget = (ActionTypes)config.readNumEntry("LeftTarget", cesZoomOut); + m_rightTarget = (ActionTypes)config.readNumEntry("RightTarget", cesZoomIn); + m_upTarget = (ActionTypes)config.readNumEntry("UpTarget", cesPageUp); + m_downTarget = (ActionTypes)config.readNumEntry("DownTarget", cesPageDown); + + m_leftScroll = config.readBoolEntry("LeftScroll", false); + m_rightScroll = config.readBoolEntry("RightScroll", false); + m_upScroll = config.readBoolEntry("UpScroll", true); + m_downScroll = config.readBoolEntry("DownScroll", true); + m_propogatefontchange = config.readBoolEntry( "RequestorFontChange", false); + reader->setBaseSize(config.readNumEntry( "Basesize", 10 )); + reader->setTwoTouch(m_twoTouch); + + m_touch_action->setOn(m_twoTouch); + m_setmono_action->setOn(reader->m_bMonoSpaced); + setfontHelper(reader->m_fontname); + if (full) + { + addtoolbars(&config); + } + reader->setfilter(reader->getfilter()); + reader->refresh(); + return true; +} + +bool QTReaderApp::PopulateConfig(const char* tgtdir) +{ + bkmkselector->clear(); + bkmkselector->setText("Cancel"); +#ifndef USEQPE + int cnt = 0; + + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "\" directory" ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + if ( !d.cd(tgtdir) ) { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "/%s\" directory", tgtdir ); + d = QDir::home(); + d.mkdir(tgtdir); + d.cd(tgtdir); + } + d.setFilter( QDir::Files | QDir::NoSymLinks ); +// d.setSorting( QDir::Size | QDir::Reversed ); + + const QFileInfoList *list = d.entryInfoList(); + QFileInfoListIterator it( *list ); // create list iterator + QFileInfo *fi; // pointer for traversing + + while ( (fi=it.current()) ) { // for each file... + + bkmkselector->insertItem(fi->fileName()); + cnt++; + + //qDebug( "%10li %s", fi->size(), fi->fileName().data() ); + ++it; // goto next list element + } + +#else /* USEQPE */ + int cnt = 0; + DIR *d; + char* finaldir; + finaldir = new char[strlen(APPDIR)+1+strlen(tgtdir)+1]; + strcpy(finaldir, APPDIR); + strcat(finaldir, "/"); + strcat(finaldir, tgtdir); + d = opendir((const char *)Global::applicationFileName(finaldir,"")); + + while(1) + { + struct dirent* de; + struct stat buf; + de = readdir(d); + if (de == NULL) break; + + if (lstat((const char *)Global::applicationFileName(finaldir,de->d_name),&buf) == 0 && S_ISREG(buf.st_mode)) + { + bkmkselector->insertItem(de->d_name); + cnt++; + } + } + delete [] finaldir; + closedir(d); +#endif + return (cnt > 0); +} + +void QTReaderApp::LoadConfig() +{ + if (PopulateConfig("configs")) + { + editorStack->raiseWidget( bkmkselector ); + hidetoolbars(); + m_nBkmkAction = cLdConfig; + } + else + QMessageBox::information(this, PROGNAME, "No config files"); +} + +void QTReaderApp::TidyConfig() +{ + if (PopulateConfig("configs")) + { + editorStack->raiseWidget( bkmkselector ); + hidetoolbars(); + m_nBkmkAction = cRmConfig; + } + else + QMessageBox::information(this, PROGNAME, "No config files"); +} + +void QTReaderApp::ExportLinks() +{ + if (PopulateConfig("urls")) + { + editorStack->raiseWidget( bkmkselector ); + hidetoolbars(); + m_nBkmkAction = cExportLinks; + } + else + QMessageBox::information(this, PROGNAME, "No url files"); +} + +void QTReaderApp::OnURLSelected(const QString& href) +{ + CURLDialog* urld = new CURLDialog(href, false, this); + urld->clipboard(m_url_clipboard); + urld->localfile(m_url_localfile); + urld->globalfile(m_url_globalfile); + if (urld->exec()) + { + m_url_clipboard = urld->clipboard(); + m_url_localfile = urld->localfile(); + m_url_globalfile = urld->globalfile(); + if (m_url_clipboard) + { + QClipboard* cb = QApplication::clipboard(); + cb->setText(href); + qDebug("<a href=\"%s\">%s</a>", (const char*)href, (const char*)href); + } + if (m_url_localfile) + { + writeUrl(reader->m_string, href); + } + if (m_url_globalfile) + { + writeUrl("GlobalURLFile", href); + } + } + delete urld; +} + +void QTReaderApp::writeUrl(const QString& file, const QString& href) +{ + QString filename; +#ifdef USEQPE + filename = Global::applicationFileName(APPDIR "/urls", file); +#else + QFileInfo fi; + QDir d = QDir::home(); // "/" + if ( !d.cd(APPDIR) ) + { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "\" directory" ); + d = QDir::home(); + d.mkdir(APPDIR); + d.cd(APPDIR); + } + if ( !d.cd("urls") ) + { // "/tmp" + qWarning( "Cannot find the \"~/" APPDIR "/urls\" directory" ); + d = QDir::home(); + d.cd(APPDIR); + d.mkdir("urls"); + d.cd("urls"); + } + fi.setFile(d, file); + filename = fi.absFilePath(); +#endif + FILE* fout = fopen(filename, "a"); + if (fout != NULL) + { + fprintf(fout, "<p><a href=\"%s\">%s</a>\n", (const char*)href, (const char*)href); + fclose(fout); + } + else + { + QMessageBox::warning(this, PROGNAME, "Problem with writing URL"); + } +} diff --git a/noncore/apps/opie-reader/QTReaderApp.h b/noncore/apps/opie-reader/QTReaderApp.h index cb33e4a..2765d47 100644 --- a/noncore/apps/opie-reader/QTReaderApp.h +++ b/noncore/apps/opie-reader/QTReaderApp.h @@ -1,291 +1,442 @@ /********************************************************************** ** Copyright (C) 2000 Trolltech AS. All rights reserved. ** ** This file is part of Qt Palmtop Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** **********************************************************************/ #ifndef __QTREADERAPP_H #define __QTREADERAPP_H +//#define _SCROLLPIPE //#define __ISEARCH -#define MAX_ENCODING 6 -#define MAX_ACTIONS 4 +//#define MAX_ENCODING 6 +#define MAX_ACTIONS 5 +#include "useqpe.h" +#include <sys/timeb.h> #include <qmainwindow.h> #include "CExpander.h" +#include "CEncoding.h" #include <qlist.h> -#include <qpe/filemanager.h> +//#include <qpe/filemanager.h> #include <qmap.h> #include <qlineedit.h> #include <qstack.h> #include <qlistbox.h> //#include "Queue.h" class QWidgetStack; class QToolButton; class QPopupMenu; class QToolBar; -//class QPEToolBar; +#ifdef USEQPE
+class QPEToolBar; +class QPEMenuBar;
+#endif class CBkmkSelector; class QProgressBar; class QAction; class CAnnoEdit; class QFloatBar; class CDrawBuffer; class QTReader; -class QPixmap; +class QImage; +class Config; enum ActionTypes { - cesOpenFile = 0, + cesNone = 0, + cesOpenFile, cesAutoScroll, cesActionMark, - cesFullScreen + cesActionAnno, + cesFullScreen, + cesZoomIn, + cesZoomOut, + cesBack, + cesForward, + cesHome, + cesPageUp, + cesPageDown, + cesLineUp, + cesLineDown, + cesStartDoc, + cesEndDoc +}; +/* +*m_preferences_action, *m_close_action *m_info_action, *m_touch_action, +*m_find_action, *m_jump_action, *m_setfont_action *m_goto_action, +*m_delete_action; *m_autogen_action, *m_clear_action, *m_save_action; +*m_tidy_action, *m_startBlock_action, *m_endBlock_action; +*m_setenc_action, *m_setmono_action; +*/ +enum ToolbarPolicy +{ + cesSingle = 0, + cesMenuTool, + cesMultiple +}; + +enum regedit_type +{ + cAutoGen, + cAddBkmk, + cJump, + cMonoSpace, + cSetTarget, +#ifdef _SCROLLPIPE + cSetPipeTarget, +#endif + cSetConfigName, + cMargin, + cExtraSpace, + cExtraLead +}; + +enum bkmk_action +{ + cOpenFile, + cGotoBkmk, + cDelBkmk, + cRmBkmkFile, + cLdConfig, + cRmConfig, + cExportLinks +}; + +enum fontselector_action +{ + cChooseFont, + cChooseEncoding }; #ifdef __ISEARCH struct searchrecord { QString s; size_t pos; searchrecord(const QString& _s, size_t _pos) : s(_s), pos(_pos) {} }; #endif class infowin; class GraphicWin; class QTReaderApp : public QMainWindow { Q_OBJECT unsigned long m_savedpos; + int m_debounce; + timeb m_lastkeytime; bool m_annoIsEditing; + bool m_propogatefontchange, m_bFloatingDialog; + bool m_url_clipboard, m_url_localfile, m_url_globalfile; + fontselector_action m_fontAction; + void doAction(ActionTypes a, QKeyEvent* e); public: QTReaderApp( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); ~QTReaderApp(); + + void handlekey(QKeyEvent* e); + void hideEvent(QHideEvent*) + { + suspend(); + } + void suspend(); void openFile( const QString & ); void setScrollState(bool _b); protected: void setfontHelper(const QString& lcn, int size = 0); QAction* m_bkmkAvail, *m_actFullscreen; CAnnoEdit* m_annoWin; Bkmk* m_anno; // void resizeEvent(QResizeEvent* e); - void keyPressEvent(QKeyEvent* e); void closeEvent( QCloseEvent *e ); void readbkmks(); void do_mono(const QString&); void do_jump(const QString&); - void do_overlap(const QString&); void do_settarget(const QString&); - int EncNameToInt(const QString&); +#ifdef _SCROLLPIPE +// void do_setpipetarget(const QString&); +#endif + void do_saveconfig(const QString&, bool); + bool readconfig(const QString&, bool); + bool PopulateConfig(const char*); ActionTypes ActNameToInt(const QString&); bool m_doAnnotation; bool m_doDictionary; bool m_doClipboard; bool m_fullscreen; - + bool m_loadedconfig; public: void saveprefs(); +public slots: + void setDocument(const QString&); private slots: +#ifdef _SCRIPT +// void RunScript(); +#endif + void SaveConfig(); + void LoadConfig(); + void TidyConfig(); + void ExportLinks(); void zoomin(); void zoomout(); + void chooseencoding(); void setfullscreen(bool sfs); - void setcontinuous(bool sfs); +// void setcontinuous(bool sfs); void setTwoTouch(bool _b); void restoreFocus(); void OnAnnotation(bool _b) { m_doAnnotation = _b; } void OnDictionary(bool _b) { m_doDictionary = _b; } void OnClipboard(bool _b) { m_doClipboard = _b; } void OnWordSelected(const QString&, size_t, const QString&); - void showgraphic(QPixmap&); + void OnURLSelected(const QString& href); + void showgraphic(QImage&); void addAnno(const QString&, const QString&, size_t); void addAnno(const QString&, const QString&); void addanno(); void showAnnotation(); + void do_setencoding(int i); void do_setfont(const QString&); - void encodingSelected(QAction*); void buttonActionSelected(QAction*); - void msgHandler(const QCString&, const QByteArray&); +// void msgHandler(const QCString&, const QByteArray&); void monospace(bool); void jump(); - void setoverlap(); void settarget(); - void setspacing(); +#ifdef _SCROLLPIPE +// void setpipetarget(); +// void setpause(bool); +#endif +// void setspacing(); void setfont(); void clearBkmkList(); void listBkmkFiles(); void editMark(); void autoScroll(bool); void addbkmk(); void savebkmks(); // void importFiles(); + void showprefs(); + void showtoolbarprefs(); void infoClose(); // void oldFile(); void showinfo(); - void setDocument(const QString&); - void indentplus(); - void indentminus(); +// void indentplus(); +// void indentminus(); void fileOpen(); void fileClose(); void editCopy(); void editFind(); + void gotoStart(); + void gotoEnd(); + void pageup(); void pagedn(); void findNext(); void findClose(); void regClose(); #ifdef __ISEARCH // void search( const QString& ); #else void search(); #endif void showEditTools(); - void stripcr(bool); - void onespace(bool); +// void stripcr(bool); +// void setfulljust(bool); +// void onespace(bool); #ifdef REPALM // void repalm(bool); #endif - void peanut(bool _b); - void remap(bool); - void embolden(bool); - void autofmt(bool); - void textfmt(bool); - void striphtml(bool); - void dehyphen(bool); - void unindent(bool); - void repara(bool); - void dblspce(bool); +// void peanut(bool _b); +// void remap(bool); +// void embolden(bool); +// void autofmt(bool); +// void textfmt(bool); +// void striphtml(bool); +// void dehyphen(bool); +// void depluck(bool); +// void dejpluck(bool); +// void unindent(bool); +// void repara(bool); +// void dblspce(bool); void pagemode(bool); - void navkeys(bool); // void gotobkmk(const QString& bm); void gotobkmk(int); void cancelbkmk(); void do_gotomark(); void do_delmark(); void do_autogen(); void do_regaction(); void OnRedraw(); - void OnActionPressed(); private: + void writeUrl(const QString& file, const QString& href); + QAction *m_preferences_action, *m_open_action, *m_close_action; + QAction *m_info_action, *m_touch_action, *m_find_action, *m_start_action; + QAction *m_end_action, *m_jump_action, *m_pageline_action; + QAction *m_pageup_action, *m_pagedn_action, *m_back_action; + QAction *m_home_action, *m_forward_action, *m_zoomin_action; + QAction *m_zoomout_action, *m_setfont_action, *m_mark_action; + QAction *m_annotate_action, *m_goto_action, *m_delete_action; + QAction *m_autogen_action, *m_clear_action, *m_save_action; + QAction *m_tidy_action, *m_startBlock_action, *m_endBlock_action; + QAction *m_setenc_action, *m_setmono_action, *m_saveconfig_action; + QAction *m_loadconfig_action, *m_toolbarprefs_action, *m_tidyconfig_action; + QAction *m_exportlinks_action; + void addtoolbars(Config* config); + ToolbarPolicy m_tbpol, m_tbpolsave; + ToolBarDock m_tbposition; + bool m_tbmove, m_tbmovesave; + QToolBar* filebar(); + QToolBar* viewbar(); + QToolBar* navbar(); + QToolBar* markbar(); + void hidetoolbars(); + void addfilebar(Config* _config, const QString& key, QAction* a); + void addviewbar(Config* _config, const QString& key, QAction* a); + void addnavbar(Config* _config, const QString& key, QAction* a); + void addmarkbar(Config* _config, const QString& key, QAction* a); + bool checkbar(Config* _config, const QString& key); +#ifdef _SCRIPT + void SaveScript(const char* sname); +#endif /* void setstate(unsigned char* _sd, unsigned short _sdlen); void getstate(unsigned char*& data, unsigned short& len); */ void fileOpen2(); void readfilelist(); void savefilelist(); void updatefileinfo(); bool openfrombkmk(Bkmk*); QString m_targetapp, m_targetmsg; - void listbkmk(CList<Bkmk>*, const QString& _lab = QString::null); + bool listbkmk(CList<Bkmk>*, const QString& _lab = QString::null); QString usefilebrowser(); void do_regedit(); void colorChanged( const QColor &c ); void clear(); void updateCaption(); void do_autogen(const QString&); void do_addbkmk(const QString&); bool findNextBookmark(size_t start); private: QAction* m_scrollButton; - QAction* m_EncodingAction[MAX_ENCODING]; - QAction* m_buttonAction[MAX_ACTIONS]; CBkmkSelector* bkmkselector; - ActionTypes m_spaceTarget; + ActionTypes m_spaceTarget, m_escapeTarget, m_returnTarget, m_leftTarget, m_rightTarget, + m_upTarget, m_downTarget; + bool m_leftScroll, m_rightScroll, m_upScroll, m_downScroll; + bool m_bcloseDisabled, m_disableesckey; size_t searchStart; #ifdef __ISEARCH QStack<searchrecord>* searchStack; bool dosearch(size_t start, CDrawBuffer& test, const QString& arg); #else bool dosearch(size_t start, CDrawBuffer& test, const QRegExp& arg); #endif QWidgetStack *editorStack; QTReader* reader; QComboBox* m_fontSelector; -// QPEToolBar /* *menu,*/ *editBar; - QToolBar /* *menu,*/ *editBar; +// QPEToolBar /* *menu,*/ *fileBar; + QToolBar *menubar, *fileBar, *navBar, *viewBar, *markBar; +#ifdef USEQPE
+ QPEMenuBar *mb;
+#else
+ QMenuBar *mb;
+#endif
QFloatBar *searchBar, *regBar/*, *m_fontBar*/; QToolBar /* *searchBar, *regBar,*/ *m_fontBar; QLineEdit *searchEdit, *regEdit; bool searchVisible; bool regVisible; bool m_fontVisible, m_twoTouch; bool bFromDocView; static unsigned long m_uid; long unsigned get_unique_id() { return m_uid++; } /* void resizeEvent( QResizeEvent * r) { - qDebug("resize:(%u,%u)", r->oldSize().width(), r->oldSize().height()); - qDebug("resize:(%u,%u)", r->size().width(), r->size().height()); +// qDebug("resize:(%u,%u)", r->oldSize().width(), r->oldSize().height()); +// qDebug("resize:(%u,%u)", r->size().width(), r->size().height()); // bgroup->move( width()-bgroup->width(), 0 ); } */ CList<Bkmk>* pBkmklist; CList<Bkmk>* pOpenlist; infowin* m_infoWin; GraphicWin* m_graphicwin; QProgressBar* pbar; bool m_fBkmksChanged; - int m_nRegAction; +// int m_nRegAction; + regedit_type m_nRegAction; + bkmk_action m_nBkmkAction; QString m_autogenstr; bool m_dontSave; }; -const int cAutoGen = 0; -const int cAddBkmk = 1; -const int cDelBkmk = 2; -const int cGotoBkmk = 3; -const int cRmBkmkFile = 4; -const int cJump = 5; -const int cMonoSpace = 6; -const int cOverlap = 7; -const int cSetTarget = 8; -const int cOpenFile = 9; +//const int cAutoGen = 0; +//const int cAddBkmk = 1; +//const int cDelBkmk = 2; +//const int cGotoBkmk = 3; +//const int cRmBkmkFile = 4; +//const int cJump = 5; +//const int cMonoSpace = 6; +//const int cOverlap = 7; +//const int cSetTarget = 8; +//const int cOpenFile = 9; +//const int cSetPipeTarget = 10; +//const int cSetConfigName = 11; +//const int cMargin = 12; +//const int cExtraSpace = 14; +//const int cExtraLead = 15; +//const int cGfxSize = 16; +//const int cChooseFont = 2; +//const int cChooseEncoding = 1; #endif + + + diff --git a/noncore/apps/opie-reader/StateData.h b/noncore/apps/opie-reader/StateData.h index 0cb0f07..e3be778 100644 --- a/noncore/apps/opie-reader/StateData.h +++ b/noncore/apps/opie-reader/StateData.h @@ -1,32 +1,33 @@ #ifndef __STATEDATA_H #define __STATEDATA_H struct statedata { bool bstripcr/*:1*/; bool btextfmt/*:1*/; bool bautofmt/*:1*/; bool bstriphtml/*:1*/; bool bpeanut/*:1*/; bool bdehyphen/*:1*/; + bool bdepluck/*:1*/; bool bonespace/*:1*/; bool bunindent/*:1*/; bool brepara/*:1*/; bool bdblspce/*:1*/; bool m_bpagemode/*:1*/; bool m_navkeys/*:1*/; bool m_bMonoSpaced/*:1*/; bool bremap/*:1*/; bool bmakebold/*:1*/; bool Continuous/*:1*/; #ifdef REPALM bool brepalm/*:1*/; #endif int bindenter; int m_textsize; int m_encd; int m_charpc; char m_fontname[1]; }; #endif diff --git a/noncore/apps/opie-reader/StyleConsts.cpp b/noncore/apps/opie-reader/StyleConsts.cpp index e111dbd..9fb56b7 100644 --- a/noncore/apps/opie-reader/StyleConsts.cpp +++ b/noncore/apps/opie-reader/StyleConsts.cpp @@ -1,99 +1,94 @@ -#include <qpixmap.h> +#include <qimage.h> #include "StyleConsts.h" GraphicLink::~GraphicLink() { delete graphic; } pmstore::~pmstore() { -// qDebug("Deleting image"); +//// qDebug("Deleting image"); delete graphic; } CStyle::~CStyle() { if (graphic != NULL) { if (--(graphic->count) == 0) { delete graphic; } } } -CStyle::CStyle(CStyle& rhs) : graphic(NULL) -{ - *this = rhs; -} - CStyle::CStyle(const CStyle& rhs) : graphic(NULL) { *this = rhs; } CStyle& CStyle::operator=(const CStyle& rhs) { if (rhs.graphic != NULL) { (rhs.graphic->count)++; if (graphic != NULL) { if (--(graphic->count) == 0) { delete graphic; } } graphic = rhs.graphic; } else { if (graphic != NULL) { if (--(graphic->count) == 0) { delete graphic; } graphic = NULL; } } sty = rhs.sty; return *this; } void CStyle::clearPicture() { if (graphic != NULL) { if (--(graphic->count) == 0) { delete graphic; } graphic = NULL; } } void CStyle::unset() { sty.unset(); if (graphic != NULL) { if (--(graphic->count) == 0) { delete graphic; } graphic = NULL; } } -void CStyle::setPicture(QPixmap* _g, bool il, unsigned long tgt) +void CStyle::setPicture(bool canScale, QImage* _g, bool il, unsigned long tgt) { if (graphic != NULL) { if (--(graphic->count) == 0) { delete graphic; } graphic = NULL; } - if (_g != NULL) graphic = new pmstore(_g, il, tgt); + if (_g != NULL) graphic = new pmstore(canScale, _g, il, tgt); } diff --git a/noncore/apps/opie-reader/StyleConsts.h b/noncore/apps/opie-reader/StyleConsts.h index 9701d19..29d7501 100644 --- a/noncore/apps/opie-reader/StyleConsts.h +++ b/noncore/apps/opie-reader/StyleConsts.h @@ -1,178 +1,190 @@ #ifndef __STYLECONSTS_H #define __STYLECONSTS_H typedef unsigned short StyleType; -#include <stdlib.h> +#ifdef _WINDOWS #include <string.h> +#endif +#include <stdlib.h> #include <qglobal.h> -class QPixmap; +class QImage; struct GraphicLink { - QPixmap* graphic; + QImage* graphic; bool isLink; unsigned long link; - GraphicLink(QPixmap* p, bool isLnk, unsigned long tgt) : + GraphicLink(QImage* p, bool isLnk, unsigned long tgt) : graphic(p), isLink(isLnk), link(tgt) {} ~GraphicLink(); }; struct pmstore { unsigned int count; + bool m_isScaleable; GraphicLink* graphic; - pmstore(QPixmap* p, bool isLnk, unsigned long tgt) : count(1) + pmstore(bool _canScale, QImage* p, bool isLnk, unsigned long tgt) : count(1), m_isScaleable(_canScale) { graphic = new GraphicLink(p, isLnk, tgt); } ~pmstore(); }; enum EalignmentType { m_AlignLeft, m_AlignRight, m_AlignCentre, m_AlignJustify }; class CBasicStyle { friend class CStyle; bool m_bold, m_italic; int m_fontsize; EalignmentType m_align; unsigned char red, green, blue; unsigned long data; bool isLink; bool m_underline; bool m_strikethru; bool m_monospaced; unsigned char m_leftmargin, m_rightmargin; + signed char m_extraspace; + signed char m_voffset; CBasicStyle() { unset(); } bool operator!=(const CBasicStyle& rhs) { return (memcmp(this, &rhs, sizeof(CBasicStyle)) != 0); } void unset() { m_bold = false; m_italic = false; m_fontsize = 0; m_align = m_AlignLeft; red = green = blue = 0; data = 0; isLink = false; m_underline = false; m_strikethru = false; m_leftmargin = 0; m_rightmargin = 0; m_monospaced = false; + m_extraspace = 0; + m_voffset = 0; } }; class CStyle { CBasicStyle sty; pmstore* graphic; public: + signed char getVOffset() { return sty.m_voffset; } + void setVOffset(signed char sp) { sty.m_voffset = sp; } + signed char getExtraSpace() { return sty.m_extraspace; } + void setExtraSpace(signed char sp) { sty.m_extraspace = sp; } bool getPictureLink() { return (graphic != NULL && graphic->graphic->isLink); } unsigned long getPictureLinkData() { return graphic->graphic->link; } void setLeftMargin(unsigned char m) { sty.m_leftmargin = m; } unsigned char getLeftMargin() { return sty.m_leftmargin; } void setRightMargin(unsigned char m) { sty.m_rightmargin = m; } unsigned char getRightMargin() { return sty.m_rightmargin; } unsigned char Red() { return sty.red; } unsigned char Green() { return sty.green; } unsigned char Blue() { return sty.blue; } void setColour(unsigned char r, unsigned char g, unsigned char b) { sty.red = r; sty.green = g; sty.blue = b; } CStyle() : graphic(NULL) {} ~CStyle(); - CStyle(CStyle&); +// CStyle(CStyle&); CStyle(const CStyle&); CStyle& operator=(const CStyle&); void unset(); bool isPicture() { return (graphic != NULL); } + bool canScale() { return graphic->m_isScaleable; } void clearPicture(); - void setPicture(QPixmap* _g, bool il=false, unsigned long tgt=0); - QPixmap* getPicture() + void setPicture(bool canScale, QImage* _g, bool il=false, unsigned long tgt=0); + QImage* getPicture() { - QPixmap* pm = ((graphic != NULL) ? graphic->graphic->graphic : NULL); + QImage* pm = ((graphic != NULL) ? graphic->graphic->graphic : NULL); return pm; } void setUnderline() { sty.m_underline = true; } void unsetUnderline() { sty.m_underline = false; } bool isUnderline() { return sty.m_underline; } void setStrikethru() { sty.m_strikethru = true; } void unsetStrikethru() { sty.m_strikethru = false; } bool isStrikethru() { return sty.m_strikethru; } void setBold() { sty.m_bold = true; } void unsetBold() { sty.m_bold = false; } bool isBold() { return sty.m_bold; } void setItalic() { sty.m_italic = true; } void unsetItalic() { sty.m_italic = false; } bool isItalic() { return sty.m_italic; } void setMono() { sty.m_monospaced = true; } void unsetMono() { sty.m_monospaced = false; } bool isMono() { return sty.m_monospaced; } void setLeftJustify() { sty.m_align = m_AlignLeft; } void setRightJustify() { sty.m_align = m_AlignRight; } void setCentreJustify() { sty.m_align = m_AlignCentre; } void setFullJustify() { sty.m_align = m_AlignJustify; } StyleType getJustify() { return sty.m_align; } void setFontSize(int _fs) { sty.m_fontsize = _fs; } - int getFontSize() + int getFontSize() const { return sty.m_fontsize; } bool operator!=(const CStyle& rhs) { return ( (sty != rhs.sty) || (graphic != rhs.graphic) ); } void setLink(bool _l) { sty.isLink = _l; } bool getLink() { return sty.isLink; } void setData(unsigned long _d) { sty.data = _d; } unsigned long getData() { return sty.data; } }; #endif diff --git a/noncore/apps/opie-reader/ZText.h b/noncore/apps/opie-reader/ZText.h index 22d3733..ab81a5e 100644 --- a/noncore/apps/opie-reader/ZText.h +++ b/noncore/apps/opie-reader/ZText.h @@ -1,68 +1,85 @@ #ifndef __Text_h #define __Text_h #include <stdio.h> -#include "zlib/zlib.h" +#include <zlib.h> #include <sys/stat.h> - +#include "useqpe.h" #include "CExpander.h" class Text: public CExpander { gzFile file; unsigned long fsize; public: - virtual void suspend() + void suspend() { +#ifdef USEQPE bSuspended = true; suspos = gztell(file); gzclose(file); file = NULL; sustime = time(NULL); +#endif } - virtual void unsuspend() + void unsuspend() { +#ifdef USEQPE
if (bSuspended) { bSuspended = false; int delay = time(NULL) - sustime; if (delay < 10) sleep(10-delay); file = gzopen(fname, "rb"); for (int i = 0; file == NULL && i < 5; i++) { sleep(5); file = gzopen(fname, "rb"); } if (file == NULL) { QMessageBox::warning(NULL, PROGNAME, "Couldn't reopen file"); exit(0); } suspos = gzseek(file, suspos, SEEK_SET); } +#endif } Text() : file(NULL) {}; virtual ~Text() { if (file != NULL) gzclose(file); } - virtual int OpenFile(const char *src) + int OpenFile(const char *src) { if (file != NULL) gzclose(file); struct stat _stat; stat(src,&_stat); fsize = _stat.st_size; return ((file = gzopen(src,"rb")) == NULL); } - virtual int getch() { return gzgetc(file); } - virtual unsigned int locate() { return gztell(file); } - virtual void locate(unsigned int n) { gzseek(file,n,SEEK_SET); } - virtual bool hasrandomaccess() { return true; } - virtual void sizes(unsigned long& _file, unsigned long& _text) + int getch() { return gzgetc(file); } + unsigned int locate() { return gztell(file); } + void locate(unsigned int n) { gzseek(file,n,SEEK_SET); } + bool hasrandomaccess() { return true; } + void sizes(unsigned long& _file, unsigned long& _text) { _text = _file = fsize; + FILE* f = fopen(fname, "rb"); + if (f != NULL) + { + unsigned char mn[2]; + fread(mn, 1, 2, f); + if ((mn[0] == 31) && (mn[1] == 139)) + {
+ int tmp = sizeof(_text); + fseek(f,-tmp,SEEK_END); + fread(&_text, sizeof(_text), 1, f); + } + fclose(f); + } } - virtual MarkupType PreferredMarkup() + MarkupType PreferredMarkup() { return cTEXT; } }; #endif diff --git a/noncore/apps/opie-reader/fileBrowser.cpp b/noncore/apps/opie-reader/fileBrowser.cpp index 21c970b..9cd371d 100644 --- a/noncore/apps/opie-reader/fileBrowser.cpp +++ b/noncore/apps/opie-reader/fileBrowser.cpp @@ -1,207 +1,266 @@ /**************************************************************************** Derived from a file browser which was ** copyright 2001 ljp ljp@llornkcor.com Extensive modification by Tim Wentford to allow it to work in rotated mode ****************************************************************************/ #include "fileBrowser.h" #include "QtrListView.h" +#include <qlineedit.h> #include <qpushbutton.h> #include <qfile.h> #include <qmessagebox.h> +#ifndef _WINDOWS #include <unistd.h> +#endif #include <qlayout.h> +#ifdef _WINDOWS +#include <direct.h> +#endif -fileBrowser::fileBrowser( QWidget* parent, const char* name, bool modal, WFlags fl , const QString filter, const QString iPath ) - : QDialog( parent, name, modal, fl ), filterspec(QDir::All) +#include "opie.h" + +fileBrowser::fileBrowser( bool allownew, QWidget* parent, const char* name, bool modal, WFlags fl , const QString filter, const QString iPath ) + : QDialog( parent, name, true, + fl/* | WStyle_Customize | WStyle_Tool*/), + filterspec(QDir::All) { // showMaximized(); if ( !name ) setName( "fileBrowser" ); - if (parent != NULL) resize( parent->width(), parent->height() ); +/* + if (parent != NULL) + { +#ifdef OPIE + move(0,0); + resize( parent->width(), parent->height() ); +#else + setGeometry(parent->x(), parent->y(), parent->width(), parent->height() ); +#endif + } +*/ +// showFullScreen(); setCaption(tr( "Browse for file" ) ); filterStr=filter; buttonOk = new QPushButton( this, "buttonOk" ); buttonOk->setFixedSize( 25, 25 ); buttonOk->setAutoDefault( false ); buttonOk->setText( tr( "/" ) ); buttonShowHidden = new QPushButton( this, "buttonShowHidden" ); // buttonShowHidden->setFixedSize( 50, 25 ); buttonShowHidden->setText( tr( "Hidden" ) ); buttonShowHidden->setAutoDefault( false ); buttonShowHidden->setToggleButton( true ); buttonShowHidden->setOn( false ); dirLabel = new QLabel(this, "DirLabel"); dirLabel->setAlignment(AlignLeft | AlignVCenter | ExpandTabs | WordBreak); dirLabel->setText(currentDir.canonicalPath()); ListView = new QtrListView( this, "ListView" ); ListView->addColumn( tr( "Name" ) ); ListView->setSorting( 2, FALSE); ListView->addColumn( tr( "Size" ) ); ListView->setSelectionMode(QListView::Single); ListView->setAllColumnsShowFocus( TRUE ); ListView->setColumnWidthMode(0, QListView::Manual); ListView->setColumnWidthMode(1, QListView::Manual); // signals and slots connections connect( buttonShowHidden, SIGNAL( toggled(bool) ), this, SLOT( setHidden(bool) ) ); connect( buttonOk, SIGNAL( clicked() ), this, SLOT( OnRoot() ) ); connect( ListView, SIGNAL(doubleClicked( QListViewItem*)), SLOT(listDoubleClicked(QListViewItem *)) ); connect( ListView, SIGNAL(clicked( QListViewItem*)), SLOT(listClicked(QListViewItem *)) ); connect( ListView, SIGNAL(OnOKButton( QListViewItem*)), SLOT(listClicked(QListViewItem *)) ); connect( ListView, SIGNAL(OnCentreButton( QListViewItem*)), SLOT(listClicked(QListViewItem *)) ); connect( ListView, SIGNAL(OnCancelButton()), SLOT(OnCancel()) ); QVBoxLayout* grid = new QVBoxLayout(this); QHBoxLayout* hgrid = new QHBoxLayout(grid); hgrid->addWidget(dirLabel,1); hgrid->addWidget(buttonShowHidden); hgrid->addWidget(buttonOk); grid->addWidget(ListView,1); + if (allownew) + { + m_filename = new QLineEdit(this); + grid->addWidget(m_filename); + connect( m_filename, SIGNAL( returnPressed() ), this, SLOT( onReturn() )); + } + else + { + m_filename = NULL; + } if (QFileInfo(iPath).exists()) { currentDir.setPath(iPath); +#ifdef _WINDOWS + _chdir(iPath.latin1()); +#else chdir(iPath.latin1()); +#endif } else { currentDir.setPath(QDir::currentDirPath()); chdir(QDir::currentDirPath().latin1()); } populateList(); + + if (modal) showMaximized(); } void fileBrowser::resizeEvent(QResizeEvent* e) { ListView->setColumnWidth(1,(ListView->width())/4); ListView->setColumnWidth(0,ListView->width()-20-ListView->columnWidth(1)); } fileBrowser::~fileBrowser() { } void fileBrowser::populateList() { ListView->clear(); -//qDebug(currentDir.canonicalPath()); +////qDebug(currentDir.canonicalPath()); // currentDir.setFilter( QDir::Files | QDir::Dirs | QDir::Hidden | QDir::NoSymLinks ); currentDir.setFilter( filterspec ); currentDir.setSorting(/* QDir::Size*/ /*| QDir::Reversed | */QDir::DirsFirst); currentDir.setMatchAllDirs(TRUE); currentDir.setNameFilter(filterStr); // currentDir.setNameFilter("*.txt;*.etx"); QString fileL, fileS; const QFileInfoList *list = currentDir.entryInfoList(); QFileInfoListIterator it(*list); QFileInfo *fi; while ( (fi=it.current()) ) { if (fi->fileName() != ".") { fileS.sprintf( "%10li", fi->size() ); fileL.sprintf( "%s",fi->fileName().data() ); if( fi->isDir() ) { fileL+="/"; } else { -// qDebug("Not a dir: "+currentDir.canonicalPath()+fileL); +//// qDebug("Not a dir: "+currentDir.canonicalPath()+fileL); } new QListViewItem( ListView,fileL,fileS ); } ++it; } ListView->setSorting( 2, FALSE); dirLabel->setText("Current Directory:\n"+currentDir.canonicalPath()); ListView->setFocus(); } void fileBrowser::upDir() { -// qDebug(currentDir.canonicalPath()); +//// qDebug(currentDir.canonicalPath()); } void fileBrowser::listClicked(QListViewItem *selectedItem) { if (selectedItem == NULL) return; QString strItem=selectedItem->text(0); -// qDebug("%s", (const char*)strItem); +//// qDebug("%s", (const char*)strItem); QString strSize=selectedItem->text(1); strSize.stripWhiteSpace(); bool ok; QFileInfo fi(strItem); while (fi.isSymLink()) fi.setFile(fi.readLink()); if (fi.isDir()) { strItem=QDir::cleanDirPath(currentDir.canonicalPath()+"/"+strItem); if(QDir(strItem).exists()) { currentDir.cd(strItem, TRUE); populateList(); } } else + { + QListViewItem *selectedItem = ListView->selectedItem(); + if (selectedItem == NULL) + { + filename = ""; + } + else + { + filename = QDir::cleanDirPath(currentDir.canonicalPath()+"/"+selectedItem->text(0)); + } OnOK(); + } chdir(strItem.latin1()); // } // you may want to switch these 2 functions. I like single clicks void fileBrowser::listDoubleClicked(QListViewItem *selectedItem) { } -void fileBrowser::OnOK() { - - QListViewItemIterator it1( ListView); - for ( ; it1.current(); ++it1 ) { - if ( it1.current()->isSelected() ) { - selectedFileName=QDir::cleanDirPath(currentDir.canonicalPath()+"/"+it1.current()->text(0)); -// qDebug("selected filename is "+selectedFileName); - fileList.append( selectedFileName ); - } +QString fileBrowser::getCurrentFile() +{ + return filename; } + +void fileBrowser::OnOK() +{ accept(); } void fileBrowser::OnRoot() { currentDir.cd("/", TRUE); populateList(); chdir("/"); } void fileBrowser::OnCancel() { reject(); } void fileBrowser::setHidden(bool _hidden) { if (_hidden) filterspec = QDir::All | QDir::Hidden; else filterspec = QDir::All; populateList(); } + +void fileBrowser::onReturn() +{ + QListViewItem *selectedItem = ListView->selectedItem(); + if (selectedItem == NULL) + { + filename = m_filename->text(); + } + else + { + filename = QDir::cleanDirPath(currentDir.canonicalPath()+"/"+m_filename->text()); + } + OnOK(); +} diff --git a/noncore/apps/opie-reader/fileBrowser.h b/noncore/apps/opie-reader/fileBrowser.h index 5521383..a5274f8 100644 --- a/noncore/apps/opie-reader/fileBrowser.h +++ b/noncore/apps/opie-reader/fileBrowser.h @@ -1,74 +1,77 @@ /* Derived from the file browser published by ljp@llornkcor.com but extensively modified to work in rotated views on the Zaurus */ /**************************************************************************** ** Form interface generated from reading ui file 'fileBrowzer.ui' ** ** Created: Fri Dec 14 08:16:02 2001 ** by: The User Interface Compiler (uic) ** ** WARNING! All changes made in this file will be lost! blah,blah,blah ****************************************************************************/ #ifndef FILEBROWSER_H #define FILEBROWSER_H //#include <qvariant.h> #include <qdialog.h> #include <qfile.h> #include <qdir.h> #include <qstringlist.h> #include <qlabel.h> #include <qstring.h> class QVBoxLayout; class QHBoxLayout; class QGridLayout; class QtrListView; class QListViewItem; class QPushButton; +class QLineEdit; class fileBrowser : public QDialog { Q_OBJECT public: void populateList(); - fileBrowser( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ,const QString filter=0, const QString iPath=0); + fileBrowser( bool allownew, QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ,const QString filter=0, const QString iPath=0); ~fileBrowser(); QPushButton* buttonOk; QPushButton* buttonShowHidden; QtrListView* ListView; QPushButton* buttonCancel; QLabel *dirLabel; QString selectedFileName, filterStr; QDir currentDir; QFile file; - QStringList fileList; + QString getCurrentFile(); + QLineEdit* m_filename; int filterspec; // QDir::FilterSpec filterspec; //QListViewItem * item; public slots: private: - + QString filename; private slots: void upDir(); void listDoubleClicked(QListViewItem *); void listClicked(QListViewItem *); void OnRoot(); void OnCancel(); void setHidden(bool); + void onReturn(); protected slots: protected: void OnOK(); virtual void resizeEvent(QResizeEvent* e); }; #endif // FILEBROWSER_H diff --git a/noncore/apps/opie-reader/infowin.cpp b/noncore/apps/opie-reader/infowin.cpp index 459b648..c52a1f0 100644 --- a/noncore/apps/opie-reader/infowin.cpp +++ b/noncore/apps/opie-reader/infowin.cpp @@ -1,43 +1,43 @@ -#include "name.h" #include "infowin.h" #include "version.h" #include <stdio.h> +#include "names.h" infowin::infowin( QWidget *parent, const char *name, WFlags f ) : QWidget(parent, name, f) { grid = new QGridLayout(this, 6, 2); QLabel* l; l = new QLabel("Compressed file size", this); grid->addWidget(l, 0, 0); fileSize = new QLabel("0", this); fileSize->setAlignment( AlignVCenter | AlignRight ); grid->addWidget(fileSize, 0, 1); l = new QLabel("Original text size", this); grid->addWidget(l, 1, 0); textSize = new QLabel("0", this); textSize->setAlignment( AlignVCenter | AlignRight ); grid->addWidget(textSize, 1, 1); l = new QLabel("Compression Ratio", this); grid->addWidget(l, 2, 0); ratio = new QLabel("0", this); grid->addWidget(ratio, 2, 1); ratio->setAlignment( AlignVCenter | AlignRight ); l = new QLabel("Current location", this); grid->addWidget(l, 3, 0); location = new QLabel("0", this); location->setAlignment( AlignVCenter | AlignRight ); grid->addWidget(location, 3, 1); l = new QLabel("Per centage read", this); grid->addWidget(l, 4, 0); read = new QLabel("0", this); read->setAlignment( AlignVCenter | AlignRight ); grid->addWidget(read, 4, 1); char vstr[128]; sprintf(vstr, PROGNAME " v%u.%u%c (%s)\nA small e-text reader", MAJOR, BKMKTYPE, MINOR, RELEASE_TYPE); l = new QLabel(vstr, this); grid->addWidget(l, 5, 0); QPushButton* exitbutton = new QPushButton("Cancel", this); connect( exitbutton, SIGNAL( released() ), this, SLOT( infoClose() ) ); grid->addWidget(exitbutton, 5, 1); } diff --git a/noncore/apps/opie-reader/main.cpp b/noncore/apps/opie-reader/main.cpp index 2440037..3e1f5e7 100644 --- a/noncore/apps/opie-reader/main.cpp +++ b/noncore/apps/opie-reader/main.cpp @@ -1,34 +1,50 @@ +#include "useqpe.h" +#ifdef USEQPE #include <qpe/qpeapplication.h> +#else +#include <qapplication.h> +#endif #include "QTReaderApp.h" #include "signal.h" #include "stdio.h" #include "time.h" + +#ifdef USEQPE QTReaderApp* app = NULL; void handler(int signum) { if (app != NULL) { app->suspend(); app->saveprefs(); } signal(signum, handler); } +#endif int main( int argc, char ** argv ) { - signal(SIGCONT, handler); +#ifdef USEQPE + signal(SIGCONT, handler); QPEApplication a( argc, argv ); - QTReaderApp m; - a.showMainDocumentWidget( &m ); - app = &m; +#else + QApplication a( argc, argv ); + QTReaderApp m; + a.setMainWidget( &m ); + if (argc > 1) + { + m.setDocument(argv[1]); + } +#endif + return a.exec(); } diff --git a/noncore/apps/opie-reader/opie-reader.pro b/noncore/apps/opie-reader/opie-reader.pro index b8915b3..871fa45 100644 --- a/noncore/apps/opie-reader/opie-reader.pro +++ b/noncore/apps/opie-reader/opie-reader.pro @@ -1,94 +1,112 @@ TEMPLATE = app CONFIG = qt warn_on release HEADERS = Aportis.h \ Bkmks.h \ BuffDoc.h \ CAnnoEdit.h \ CBuffer.h \ CDrawBuffer.h \ CEncoding.h \ + CEncoding_tables.h \ CExpander.h \ CFilter.h \ + CloseDialog.h \ Filedata.h \ + FixedFont.h \ FontControl.h \ GraphicWin.h \ Markups.h \ Navigation.h \ Palm2QImage.h \ + Prefs.h \ QFloatBar.h \ QTReader.h \ QTReaderApp.h \ QtrListView.h \ Queue.h \ StateData.h \ StyleConsts.h \ + ToolbarPrefs.h \ + URLDialog.h \ ZText.h \ arith.h \ cbkmkselector.h \ config.h \ fileBrowser.h \ infowin.h \ + linktype.h \ my_list.h \ name.h \ + names.h \ opie.h \ pdb.h \ plucker.h \ + plucker_base.h \ ppm.h \ ppm_expander.h \ ustring.h \ + usenef.h \ + useqpe.h \ utypes.h \ version.h \ ztxt.h SOURCES = Aportis.cpp \ Bkmks.cpp \ BuffDoc.cpp \ CBuffer.cpp \ CDrawBuffer.cpp \ CEncoding.cpp \ + CEncoding_tables.cpp \ CFilter.cpp \ + CloseDialog.cpp \ FontControl.cpp \ Navigation.cpp \ Palm2QImage.cpp \ + Prefs.cpp \ QTReader.cpp \ QTReaderApp.cpp \ QtrListView.cpp \ StyleConsts.cpp \ + ToolbarPrefs.cpp \ + URLDialog.cpp \ arith_d.cpp \ fileBrowser.cpp \ infowin.cpp \ main.cpp \ pdb.cpp \ plucker.cpp \ + plucker_base.cpp \ ppm.cpp \ ppm_expander.cpp \ + version.cpp \ ztxt.cpp INTERFACES = DESTDIR = $(OPIEDIR)/bin INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include TARGET = reader LIBS += -lqpe TRANSLATIONS = ../../../i18n/de/reader.ts \ ../../../i18n/nl/reader.ts \ ../../../i18n/da/reader.ts \ ../../../i18n/xx/reader.ts \ ../../../i18n/en/reader.ts \ ../../../i18n/es/reader.ts \ ../../../i18n/fr/reader.ts \ ../../../i18n/hu/reader.ts \ ../../../i18n/ja/reader.ts \ ../../../i18n/ko/reader.ts \ ../../../i18n/no/reader.ts \ ../../../i18n/pl/reader.ts \ ../../../i18n/pt/reader.ts \ ../../../i18n/pt_BR/reader.ts \ ../../../i18n/sl/reader.ts \ ../../../i18n/zh_CN/reader.ts \ ../../../i18n/zh_TW/reader.ts include ( $(OPIEDIR)/include.pro ) diff --git a/noncore/apps/opie-reader/pdb.cpp b/noncore/apps/opie-reader/pdb.cpp index 3054424..dca67ff 100644 --- a/noncore/apps/opie-reader/pdb.cpp +++ b/noncore/apps/opie-reader/pdb.cpp @@ -1,63 +1,60 @@ #include "pdb.h" -#include <sys/types.h> -#include <sys/stat.h> -#include <unistd.h> +#ifdef _WINDOWS +#include <winsock2.h> +#endif size_t Cpdb::recordpos(int n) { UInt16 mxn = ntohs(head.recordList.numRecords); if (n >= mxn) { return file_length; } else { size_t dataoffset = sizeof(DatabaseHdrType) - sizeof(UInt16); dataoffset += /*dataoffset%4 + */ sizeof(RecordListType) * n; fseek(fin, dataoffset, SEEK_SET); RecordListType hdr; fread(&hdr, 1, sizeof(hdr), fin); return ntohl(hdr.nextRecordListID); } } size_t Cpdb::recordlength(int n) { return recordpos(n+1)-recordpos(n); } void Cpdb::gotorecordnumber(int n) { fseek(fin, recordpos(n), SEEK_SET); } bool Cpdb::openfile(const char *src) { // printf("In openfile\n"); int ret = 0; // printf("closing fin:%x\n",fin); if (fin != NULL) fclose(fin); // printf("opening fin\n"); fin = fopen(src,"rb"); if (fin==0) { return false; } // just holds the first few chars of the file // char buf[0x100]; - struct stat buf; - stat(src, &buf); - file_length = buf.st_size; -// fseek(fin,0,SEEK_END); -// file_length = ftell(fin); + fseek(fin,0,SEEK_END); + file_length = ftell(fin); -// fseek(fin,0,SEEK_SET); + fseek(fin,0,SEEK_SET); fread(&head, 1, sizeof(head), fin); return true; } diff --git a/noncore/apps/opie-reader/pdb.h b/noncore/apps/opie-reader/pdb.h index 41649bd..eac3ae6 100644 --- a/noncore/apps/opie-reader/pdb.h +++ b/noncore/apps/opie-reader/pdb.h @@ -1,91 +1,93 @@ /* * This header file defines some structures and types normally found in the * Palm SDK. However, I don't want to require the presense of the SDK for a * small utility since most Palm owners won't have it. * * $Id$ * */ #ifndef __PDB_H__ #define __PDB_H__ +#ifndef _WINDOWS #include <netinet/in.h> +#endif #include <stdio.h> /* Normal Palm typedefs */ typedef unsigned char UInt8; typedef unsigned short UInt16; typedef signed short Int16; typedef unsigned long UInt32; typedef UInt32 LocalID; /* Max length of DB name */ #define dmDBNameLength 0x20 /************************************************************ * Structure of a Record entry *************************************************************/ typedef struct { LocalID localChunkID; // local chunkID of a record UInt8 attributes; // record attributes; UInt8 uniqueID[3]; // unique ID of record; should // not be 0 for a legal record. } RecordEntryType; /************************************************************ * Structure of a record list extension. This is used if all * the database record/resource entries of a database can't fit into * the database header. *************************************************************/ typedef struct { LocalID nextRecordListID; // local chunkID of next list UInt16 numRecords; // number of records in this list UInt16 firstEntry; // array of Record/Rsrc entries // starts here } RecordListType; /************************************************************ * Structure of a Database Header *************************************************************/ typedef struct { UInt8 name[dmDBNameLength]; // name of database UInt16 attributes; // database attributes UInt16 version; // version of database UInt32 creationDate; // creation date of database UInt32 modificationDate; // latest modification date UInt32 lastBackupDate; // latest backup date UInt32 modificationNumber; // modification number of database LocalID appInfoID; // application specific info LocalID sortInfoID; // app specific sorting info UInt32 type; // database type UInt32 creator; // database creator UInt32 uniqueIDSeed; // used to generate unique IDs. // Note that only the low order // 3 bytes of this is used (in // RecordEntryType.uniqueID). // We are keeping 4 bytes for // alignment purposes. RecordListType recordList; // first record list } DatabaseHdrType; class Cpdb { protected: size_t file_length; FILE* fin; size_t recordpos(int); size_t recordlength(int); void gotorecordnumber(int); DatabaseHdrType head; bool openfile(const char* src); Cpdb() : fin(NULL) {} ~Cpdb() { if (fin != NULL) fclose(fin); } }; #endif diff --git a/noncore/apps/opie-reader/plucker.cpp b/noncore/apps/opie-reader/plucker.cpp index eb039de..e49e35f 100644 --- a/noncore/apps/opie-reader/plucker.cpp +++ b/noncore/apps/opie-reader/plucker.cpp @@ -1,1241 +1,156 @@ +#include "useqpe.h" #include <stdio.h> #include <string.h> #include <qmessagebox.h> #include <qpixmap.h> +#ifdef USEQPE #include <qpe/qcopenvelope_qws.h> +#endif #ifdef LOCALPICTURES #include <qscrollview.h> #endif +#ifdef USEQPE #include <qpe/global.h> -#include <qclipboard.h> #include <qpe/qpeapplication.h> +#else +#include <qapplication.h> +#endif +#include <qclipboard.h> #include "plucker.h" #include "Aportis.h" #include "Palm2QImage.h" -#include "name.h" - -CPlucker::CPlucker() : -#ifdef LOCALPICTURES - m_viewer(NULL), - m_picture(NULL), -#endif - expandedtextbuffer(NULL), - compressedtextbuffer(NULL), - urls(NULL) - { /*printf("constructing:%x\n",fin);*/ } -void CPlucker::Expand(UInt16 reclen, UInt8 type, UInt8* buffer, UInt16 buffersize) -{ - if (type%2 == 0) - { - fread(buffer, reclen, sizeof(char), fin); - } - else - { - fread(compressedtextbuffer, reclen, sizeof(char), fin); - switch (ntohs(hdr0.version)) +struct CPlucker_dataRecord { - case 2: - UnZip(reclen, buffer, buffersize); - break; - case 1: - UnDoc(reclen, buffer, buffersize); - break; - } - } -} + UInt16 uid; + UInt16 nParagraphs; + UInt16 size; + UInt8 type; + UInt8 reserved; +}; -int CPlucker::OpenFile(const char *src) +int CPlucker::HeaderSize() { - m_lastBreak = 0; - if (!Cpdb::openfile(src)) - { - return -1; + return sizeof(CPlucker_dataRecord); } -//printf("Okay %u\n", 4); - - if (memcmp(&head.type, "DataPlkr", 8) != 0) return -1; - -// qDebug("Cool - this IS plucker"); - - EOPPhase = 0; - gotorecordnumber(0); - fread(&hdr0, 1, sizeof(hdr0), fin); -//printf("Okay %u\n", 5); - buffersize = 32*1024; - compressedtextbuffer = new UInt8[buffersize]; - expandedtextbuffer = new UInt8[buffersize]; - - qDebug("Total number of records:%u", ntohs(head.recordList.numRecords)); - - unsigned int nrecs = ntohs(hdr0.nRecords); - qDebug("Version %u, no. recs %u", ntohs(hdr0.version), nrecs); - UInt16 homerecid = 1; - UInt16 urlid = 0; - bool urlsfound = false; - for (unsigned int i = 0; i < nrecs; i++) +void CPlucker::GetHeader(UInt16& uid, UInt16& nParagraphs, UInt32& size, UInt8& type, UInt8& reserved) { - UInt16 id, name; - fread(&name, 1, sizeof(name), fin); - fread(&id, 1, sizeof(id), fin); - qDebug("N:%d, I:%d", ntohs(name), ntohs(id)); - if (ntohs(name) == 0) homerecid = ntohs(id); - if (ntohs(name) == 2) - { - urlsfound = true; - urlid = id; - qDebug("Found url index:%d", ntohs(urlid)); - } -// qDebug("%x", id); - } - - textlength = 0; - for (int recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) - { - CPlucker_dataRecord thisHdr; - gotorecordnumber(recptr); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - if (ntohs(thisHdr.uid) == homerecid) - { - m_homepos = textlength; - qDebug("Home pos found after %u records", recptr); - break; - } - if (thisHdr.type < 2) textlength += ntohs(thisHdr.size); - } - textlength = 0; - - if (urlsfound) - { - unsigned short recptr = finduid(ntohs(urlid)); - if (recptr != 0) - { - CPlucker_dataRecord thisHdr; - gotorecordnumber(recptr); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - fread(&urlid, 1, sizeof(urlid), fin); - fread(&urlid, 1, sizeof(urlid), fin); - qDebug("urls are in %d", ntohs(urlid)); - recptr = finduid(ntohs(urlid)); - if (recptr != 0) - { - gotorecordnumber(recptr); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - qDebug("Found urls:%x",thisHdr.type); - UInt16 reclen = recordlength(recptr) - sizeof(thisHdr); - gotorecordnumber(recptr); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - urlsize = ntohs(thisHdr.size); - urls = new char[urlsize]; - Expand(reclen, thisHdr.type, (UInt8*)urls, urlsize); - } - } - } -/* - for (int recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) - { - CPlucker_dataRecord thisHdr; - gotorecordnumber(recptr); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - if (thisHdr.uid == urlid) - { - qDebug("Found urls:%x",thisHdr.type); - UInt16 reclen = recordlength(recptr) - sizeof(thisHdr); - gotorecordnumber(recptr); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - urlsize = ntohs(thisHdr.size); - urls = new char[urlsize]; - Expand(reclen, thisHdr.type, (UInt8*)urls, urlsize); - break; - } - } -*/ - home(); -#ifdef LOCALPICTURES - if (m_viewer == NULL) - { - m_viewer = new QScrollView(NULL); - m_picture = new QWidget(m_viewer->viewport()); - m_viewer->addChild(m_picture); - } -#endif - return 0; - + CPlucker_dataRecord thishdr; + fread(&thishdr, 1, HeaderSize(), fin); + uid = ntohs(thishdr.uid); + nParagraphs = ntohs(thishdr.nParagraphs); + size = ntohs(thishdr.size); + type = thishdr.type; + reserved = thishdr.reserved; } -void CPlucker::sizes(unsigned long& _file, unsigned long& _text) -{ - qDebug("Sizes called:%u",textlength); - _file = file_length; - if (textlength == 0) - { - for (int recptr = 1; recptr < ntohs(head.recordList.numRecords); recptr++) - { - CPlucker_dataRecord thisHdr; - gotorecordnumber(recptr); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - if (thisHdr.type < 2) textlength += ntohs(thisHdr.size); - } - } - _text = textlength; -//ntohl(hdr0.size); -} - - -char* CPlucker::geturl(UInt16 i) -{ - if (urls == NULL) return NULL; - char* ptr = urls; - int rn = 1; - while (ptr - urls < urlsize) - { - if (rn == i) return ptr; - ptr += strlen(ptr)+1; - rn++; - } - return NULL; -} +CPlucker::CPlucker() + { /*printf("constructing:%x\n",fin);*/ } -CPlucker::~CPlucker() +bool CPlucker::CorrectDecoder() { - if (expandedtextbuffer != NULL) delete [] expandedtextbuffer; - if (compressedtextbuffer != NULL) delete [] compressedtextbuffer; - if (urls != NULL) delete [] urls; -#ifdef LOCALPICTURES - if (m_viewer != NULL) delete m_viewer; -#endif + return (memcmp(&head.type, "DataPlkr", 8) == 0); } int CPlucker::bgetch() { int ch = EOF; if (bufferpos >= buffercontent) { if (!m_continuous) return EOF; if (bufferrec >= ntohs(head.recordList.numRecords) - 1) return EOF; -// qDebug("Passing through %u", currentpos); +//// qDebug("Passing through %u", currentpos); if (!expand(bufferrec+1)) return EOF; mystyle.unset(); + if (m_ParaOffsets[m_nextParaIndex] == 0) + { + while (m_ParaOffsets[m_nextParaIndex+1] == 0) + { +// qDebug("Skipping extraspace:%d", m_ParaAttrs[m_nextParaIndex]&7); + m_nextParaIndex++; + } + } + mystyle.setExtraSpace((m_ParaAttrs[m_nextParaIndex]&7)*2); +// qDebug("Using extraspace:%d", m_ParaAttrs[m_nextParaIndex]&7); ch = 10; EOPPhase = 4; } else if (bufferpos == m_nextPara) { while (bufferpos == m_nextPara) { UInt16 attr = m_ParaAttrs[m_nextParaIndex]; m_nextParaIndex++; +// qDebug("Skipping extraspace:%d", m_ParaAttrs[m_nextParaIndex]&7); if (m_nextParaIndex == m_nParas) { m_nextPara = -1; } else { m_nextPara += m_ParaOffsets[m_nextParaIndex]; } } mystyle.unset(); + mystyle.setExtraSpace((m_ParaAttrs[m_nextParaIndex]&7)*2); +// qDebug("Using extraspace:%d", m_ParaAttrs[m_nextParaIndex]&7); if (m_lastBreak == locate()) { currentpos++; ch = expandedtextbuffer[bufferpos++]; } else { ch = 10; } } else { currentpos++; ch = expandedtextbuffer[bufferpos++]; } return ch; } -int CPlucker::getch() +tchar CPlucker::getch(bool fast) { mystyle.clearPicture(); - if (EOPPhase > 0) { int ch = 10; switch (EOPPhase) { case 4: - mystyle.setPicture(hRule(100,5)); + if (!fast) mystyle.setPicture(false, hRule(100,5)); mystyle.setCentreJustify(); ch = '#'; break; case 3: mystyle.setFontSize(3); ch = 10; break; case 2: ch = 10; break; case 1: mystyle.unset(); default: ch = 10; } EOPPhase--; return ch; } - - int ch = bgetch(); - while (ch == 0) - { - ch = bgetch(); -// qDebug("Function:%x", ch); - switch (ch) - { - case 0x38: -// qDebug("Break:%u", locate()); - if (m_lastBreak == locate()) - { - ch = bgetch(); - } - else - { - ch = 10; - } - m_lastBreak = locate(); - break; - case 0x0a: - case 0x0c: - { - unsigned long ln = 0; - int skip = ch & 7; - for (int i = 0; i < 2; i++) - { - int ch = bgetch(); - ln = (ln << 8) + ch; -// qDebug("ch:%d, ln:%u", ch, ln); - } - if (skip == 2) - { - ln <<= 16; - } - else - { - for (int i = 0; i < 2; i++) - { - int ch = bgetch(); - ln = (ln << 8) + ch; -// qDebug("ch:%d, ln:%u", ch, ln); - } - } -// qDebug("ln:%u", ln); - mystyle.setLink(true); - mystyle.setData(ln); -// mystyle.setColour(255, 0, 0); - bool hasseen = false; - for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) - { - if (*it == ln) - { - hasseen = true; - break; - } - } - if (hasseen) - { - mystyle.setStrikethru(); - } - else - { - mystyle.setUnderline(); - } - ch = bgetch(); - } - break; - case 0x08: - ch = bgetch(); -// mystyle.setColour(0, 0, 0); - mystyle.unsetUnderline(); - mystyle.unsetStrikethru(); - mystyle.setLink(false); - mystyle.setData(0); - break; - case 0x40: - mystyle.setItalic(); - ch = bgetch(); - break; - case 0x48: - mystyle.unsetItalic(); - ch = bgetch(); - break; - case 0x11: - { - ch = bgetch(); -// qDebug("Font:%d",ch); - switch (ch) - { - case 0: - mystyle.unsetMono(); - mystyle.unsetBold(); - mystyle.setFontSize(0); - break; - case 1: - mystyle.unsetMono(); - mystyle.setBold(); - mystyle.setFontSize(3); - break; - case 2: - mystyle.unsetMono(); - mystyle.setBold(); - mystyle.setFontSize(2); - break; - case 3: - mystyle.unsetMono(); - mystyle.setBold(); -// mystyle.unsetBold(); - mystyle.setFontSize(1); - break; - case 4: - mystyle.unsetMono(); - mystyle.setBold(); -// mystyle.unsetBold(); - mystyle.setFontSize(0); - break; - case 5: - mystyle.unsetMono(); - mystyle.setBold(); - mystyle.setFontSize(0); - break; - case 6: - mystyle.unsetMono(); - mystyle.setBold(); - mystyle.setFontSize(0); - break; - case 7: - mystyle.unsetMono(); - mystyle.setBold(); - mystyle.setFontSize(0); - break; - case 8: // should be fixed width - qDebug("Trying fixed width"); - mystyle.unsetBold(); - mystyle.setFontSize(0); - mystyle.setMono(); - break; - default: - mystyle.unsetBold(); - mystyle.unsetMono(); - mystyle.setFontSize(0); - break; - } - ch = bgetch(); - } - break; - case 0x29: - ch = bgetch(); - switch (ch) - { - case 0: - mystyle.setLeftJustify(); -// qDebug("left"); - break; - case 1: - mystyle.setRightJustify(); -// qDebug("right"); - break; - case 2: - mystyle.setCentreJustify(); -// qDebug("centre"); - break; - case 3: - mystyle.setFullJustify(); -// qDebug("full"); - break; - - } - ch = bgetch(); - break; - case 0x53: - { - int r = bgetch(); - int g = bgetch(); - int b = bgetch(); - mystyle.setColour(r,g,b); - ch = bgetch(); - } - break; - case 0x1a: - case 0x5c: - { - bool hasalternate = (ch == 0x5c); - UInt16 ir = bgetch(); - ir = (ir << 8) + bgetch(); - if (hasalternate) - { - qDebug("Alternate image:%x", ir); - UInt16 ir2 = bgetch(); - ir2 = (ir2 << 8) + bgetch(); - mystyle.setPicture(expandimg(ir2, true), true, ir); -#ifdef LOCALPICTURES - UInt32 ln = ir; - ln <<= 16; - mystyle.setLink(true); - mystyle.setData(ln); -#endif - } - else - { - mystyle.setPicture(expandimg(ir)); - } - if (mystyle.getLink()) qDebug("Picture link!"); - ch = '#'; - } -// ch = bgetch(); - break; - case 0x33: - { - UInt8 h = bgetch(); - UInt8 wc = bgetch(); - UInt8 pc = bgetch(); - UInt16 w = wc; -// qDebug("h,w,pc [%u, %u, %u]", h, w, pc); - if (w == 0) - { - w = (240*(unsigned long)pc)/100; - } - if (w == 0) w = 320; - mystyle.setPicture(hRule(w,h,mystyle.Red(),mystyle.Green(),mystyle.Blue())); -// if (mystyle.getLink()) qDebug("hRule link!"); - ch = '#'; - } - break; - case 0x60: - mystyle.setUnderline(); - ch = bgetch(); - break; - case 0x68: - mystyle.unsetUnderline(); - ch = bgetch(); - break; - case 0x22: - ch = bgetch(); - mystyle.setLeftMargin(ch); -// qDebug("Left margin:%d", ch); - ch = bgetch(); - mystyle.setRightMargin(ch); -// qDebug("Right margin:%d", ch); - ch = bgetch(); - break; - case 0x70: - mystyle.setStrikethru(); - ch = bgetch(); - break; - case 0x78: - mystyle.unsetStrikethru(); - ch = bgetch(); - break; - case 0x83: - case 0x85: - default: - qDebug("Function:%x NOT IMPLEMENTED", ch); - { - int skip = ch & 7; - for (int i = 0; i < skip; i++) - { - ch = bgetch(); -// qDebug("Arg %d, %d", i, ch); - } - ch = bgetch(); - } - } - } - - if (m_lastIsBreak && !mystyle.isMono()) - { - while (ch == ' ') - { - ch = getch(); - } - } - - m_lastIsBreak = (ch == 10); - - return ch; -} - -void CPlucker::getch(int& ch, CStyle& sty) -{ - ch = getch(); - sty = mystyle; -} - -unsigned int CPlucker::locate() -{ - return currentpos; -/* - UInt16 thisrec = 1; - unsigned long locpos = 0; - gotorecordnumber(thisrec); - CPlucker_dataRecord thisHdr; - while (thisrec < bufferrec) - { - fread(&thisHdr, 1, sizeof(thisHdr), fin); - if (thisHdr.type < 2) locpos += ntohs(thisHdr.size); - thisrec++; - gotorecordnumber(thisrec); - } - return locpos+bufferpos; -*/ -} - -void CPlucker::locate(unsigned int n) -{ - UInt16 thisrec = 0; - unsigned long locpos = 0; - unsigned long bs = 0; - CPlucker_dataRecord thisHdr; - do - { - thisrec++; - locpos += bs; - gotorecordnumber(thisrec); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - if (thisHdr.type < 2) - { - bs = ntohs(thisHdr.size); - } - else - { - bs = 0; - } - } while (locpos + bs <= n); - currentpos = locpos; - expand(thisrec); -#ifdef _FAST - while (currentpos < n && bufferpos < buffercontent) bgetch(); -#else - while (currentpos < n && bufferpos < buffercontent) getch(); -#endif -} - -bool CPlucker::hyperlink(unsigned int n) -{ - visited.push_front(n); - UInt16 tuid = (n >> 16); - n &= 0xffff; -// qDebug("Hyper:<%u,%u>", tuid, n); - UInt16 thisrec = 1; - currentpos = 0; - gotorecordnumber(thisrec); - CPlucker_dataRecord thisHdr; - while (1) - { - fread(&thisHdr, 1, sizeof(thisHdr), fin); - if (tuid == ntohs(thisHdr.uid)) break; - if (thisHdr.type < 2) currentpos += ntohs(thisHdr.size); -// qDebug("hyper-cp:%u", currentpos); - thisrec++; - if (thisrec >= ntohs(head.recordList.numRecords)) - { - if (urls == NULL) - { - QMessageBox::information(NULL, - PROGNAME, - QString("No external links\nin this pluck") - ); - } - else - { - char *turl = geturl(tuid); - if (turl == NULL) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Couldn't find link") - ); - } - else - { - QString wrd(turl); - QClipboard* cb = QApplication::clipboard(); - cb->setText(wrd); - if (wrd.length() > 10) - { - Global::statusMessage(wrd.left(8) + ".."); - } - } - } - return false; - } - gotorecordnumber(thisrec); - } - if (thisHdr.type > 1) - { - if (thisHdr.type == 4) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Mailto links\nnot yet supported (2)")); - } - else - { -#ifdef LOCALPICTURES - if (thisHdr.type > 3) - { -#endif - QMessageBox::information(NULL, - PROGNAME, - QString("External links\nnot yet supported (2)") - ); -#ifdef LOCALPICTURES - } - else - { - showimg(tuid); - } -#endif - } - return false; - } -/* - if (thisHdr.type == 2 || thisHdr.type == 3) - { - expandimg(thisrec); - - } -*/ - else - { - expand(thisrec); - if (n != 0) - { - if (n >= m_nParas) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Error in link\nPara # too big") - ); - return false; - } - unsigned int noff = 0; - for (int i = 0; i < n; i++) noff += m_ParaOffsets[i]; - n = noff; - } - if (n > ntohs(thisHdr.size)) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Error in link\nOffset too big") - ); - return false; - } - qDebug("Hyper:<%u,%u>", tuid, n); - while (bufferpos < n && bufferpos < buffercontent) getch(); - } - return true; -} -/* -bool CPlucker::hyperlink(unsigned int n) -{ - visited.push_front(n); - UInt16 tuid = (n >> 16); - n &= 0xffff; -// qDebug("Hyper:<%u,%u>", tuid, n); - UInt16 thisrec = finduid(tuid); - if (thisrec == 0) - { - if (urls == NULL) - { - QMessageBox::information(NULL, - PROGNAME, - QString("No external links\nin this pluck") - ); - } - else - { - char *turl = geturl(tuid); - if (turl == NULL) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Couldn't find link") - ); - } - else - { - QString wrd(turl); - QClipboard* cb = QApplication::clipboard(); - cb->setText(wrd); - if (wrd.length() > 10) - { - Global::statusMessage(wrd.left(8) + ".."); - } - } - } - return false; - } - else - { - currentpos = 0; - gotorecordnumber(thisrec); - CPlucker_dataRecord thisHdr; - fread(&thisHdr, 1, sizeof(thisHdr), fin); - - if (thisHdr.type > 1) - { - if (thisHdr.type == 4) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Mailto links\nnot yet supported (2)")); - } - else - { -#ifdef LOCALPICTURES - if (thisHdr.type > 3) - { -#endif - QMessageBox::information(NULL, - PROGNAME, - QString("External links\nnot yet supported (2)") - ); -#ifdef LOCALPICTURES - } - else - { - showimg(tuid); - } -#endif - } - return false; - } -// if (thisHdr.type == 2 || thisHdr.type == 3) -// { -// expandimg(thisrec); -// } - else - { - expand(thisrec); - if (n != 0) - { - if (n >= m_nParas) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Error in link\nPara # too big") - ); - return false; - } - unsigned int noff = 0; - for (int i = 0; i < n; i++) noff += m_ParaOffsets[i]; - n = noff; - } - if (n > ntohs(thisHdr.size)) - { - QMessageBox::information(NULL, - PROGNAME, - QString("Error in link\nOffset too big") - ); - return false; - } - qDebug("Hyper:<%u,%u>", tuid, n); - while (bufferpos < n && bufferpos < buffercontent) getch(); - } - return true; - } -} -*/ -bool CPlucker::expand(int thisrec) -{ - mystyle.unset(); - size_t reclen = recordlength(thisrec); - gotorecordnumber(thisrec); - CPlucker_dataRecord thisHdr; - while (1) - { - fread(&thisHdr, 1, sizeof(thisHdr), fin); -// qDebug("This (%d) type is %d, uid is %u", thisrec, thisHdr.type, ntohs(thisHdr.uid)); - if (thisHdr.type < 2) break; - qDebug("Skipping paragraph of type %d", thisHdr.type); - if (++thisrec >= ntohs(head.recordList.numRecords) - 1) return false; - reclen = recordlength(thisrec); - gotorecordnumber(thisrec); - } - m_nParas = ntohs(thisHdr.nParagraphs); -// qDebug("It has %u paragraphs and is %u bytes", ntohs(thisHdr.nParagraphs), ntohs(thisHdr.size)); - uid = ntohs(thisHdr.uid); - for (int i = 0; i < m_nParas; i++) - { - UInt16 ubytes, attrs; - fread(&ubytes, 1, sizeof(ubytes), fin); - fread(&attrs, 1, sizeof(attrs), fin); - m_ParaOffsets[i] = ntohs(ubytes); - m_ParaAttrs[i] = ntohs(attrs); -// qDebug("Bytes %u, Attr %x", ntohs(ubytes), attrs); - } - if (m_nParas > 0) - { - m_nextPara = m_ParaOffsets[0]; -// qDebug("First offset = %u", m_nextPara); - m_nextParaIndex = 0; - } - else - { - m_nextPara = -1; - } - - reclen -= sizeof(thisHdr)+4*m_nParas; - - buffercontent = ntohs(thisHdr.size); - - Expand(reclen, thisHdr.type, expandedtextbuffer, buffercontent); - bufferpos = 0; - bufferrec = thisrec; -// qDebug("BC:%u, HS:%u", buffercontent, ntohs(thisHdr.size)); - return true; -} - -void CPlucker::UnZip(size_t reclen, UInt8* tgtbuffer, UInt16 bsize) -{ - z_stream zstream; - memset(&zstream,sizeof(zstream),0); - zstream.next_in = compressedtextbuffer; - zstream.next_out = tgtbuffer; - zstream.avail_out = bsize; - zstream.avail_in = reclen; - - int keylen = 0; - - zstream.zalloc = Z_NULL; - zstream.zfree = Z_NULL; - zstream.opaque = Z_NULL; - -// printf("Initialising\n"); - - inflateInit(&zstream); - int err = 0; - do { - if ( zstream.avail_in == 0 && 0 < keylen ) { - zstream.next_in = compressedtextbuffer + keylen; - zstream.avail_in = reclen - keylen; - keylen = 0; - } - zstream.next_out = tgtbuffer; - zstream.avail_out = bsize; - - err = inflate( &zstream, Z_SYNC_FLUSH ); - -// qDebug("err:%d - %u", err, zstream.avail_in); - - } while ( err == Z_OK ); - - inflateEnd(&zstream); -} - -void CPlucker::UnDoc(size_t reclen, UInt8* tgtbuffer, UInt16 bsize) -{ -// UInt16 headerSize; - UInt16 docSize; - UInt16 i; - UInt16 j; - UInt16 k; - - UInt8 *inBuf = compressedtextbuffer; - UInt8 *outBuf = tgtbuffer; - -// headerSize = sizeof( Header ) + record->paragraphs * sizeof( Paragraph ); - docSize = reclen; - - j = 0; - k = 0; - while ( j < docSize ) { - i = 0; - while ( i < bsize && j < docSize ) { - UInt16 c; - - c = (UInt16) inBuf[ j++ ]; - if ( 0 < c && c < 9 ) { - while ( 0 < c-- ) - outBuf[ i++ ] = inBuf[ j++ ]; + return getch_base(fast); } - else if ( c < 0x80 ) - outBuf[ i++ ] = c; - else if ( 0xc0 <= c ) { - outBuf[ i++ ] = ' '; - outBuf[ i++ ] = c ^ 0x80; - } - else { - Int16 m; - Int16 n; - - c <<= 8; - c += inBuf[ j++ ]; - - m = ( c & 0x3fff ) >> COUNT_BITS; - n = c & ( ( 1 << COUNT_BITS ) - 1 ); - n += 2; - - do { - outBuf[ i ] = outBuf[ i - m ]; - i++; - } while ( 0 < n-- ); - } - } - k += bsize; - } -} - -void CPlucker::home() -{ - currentpos = 0; - expand(1); -} - -CList<Bkmk>* CPlucker::getbkmklist() -{ -/* - CPlucker_dataRecord thisHdr; - for (int i = 1; i < ntohs(head.recordList.numRecords); i++) +QImage* CPlucker::imagefromdata(UInt8* imgbuffer, UInt32 imgsize) { - gotorecordnumber(i); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - if (thisHdr.type == 8) - { - UInt16 n; - fread(&n, 1, sizeof(n), fin); - n = ntohs(n); - qDebug("Found %u bookmarks", n); - } - qDebug("Found:%d, %u", i , thisHdr.type); - } -*/ - return NULL; -} - -QImage* CPlucker::getimg(UInt16 tgt) -{ -// static int imageno; -// char* file = "tmp1"; -// sprintf(file, "image%04u.tbmp", imageno++); -// qDebug("Image:%u", tgt); - CPlucker_dataRecord thisHdr; - size_t reclen; - UInt16 thisrec = finduid(tgt); - reclen = recordlength(thisrec); - gotorecordnumber(thisrec); - fread(&thisHdr, 1, sizeof(thisHdr), fin); -/* - UInt16 thisrec = 0; - do - { - hthisrec++; - reclen = recordlength(thisrec); - gotorecordnumber(thisrec); -// qDebug("thisrec:%u.%u", ftell(fin),thisrec); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - } - while (ntohs(thisHdr.uid) != tgt); -*/ - reclen -= sizeof(thisHdr); - - UInt16 imgsize = ntohs(thisHdr.size); - UInt8* imgbuffer = new UInt8[imgsize]; - -// qDebug("type:%u", thisHdr.type); - Expand(reclen, thisHdr.type, imgbuffer, imgsize); - QImage* qimage = Palm2QImage(imgbuffer, imgsize); - delete [] imgbuffer; - return qimage; } - -#include <qnamespace.h> - -QPixmap* CPlucker::expandimg(UInt16 tgt, bool border) -{ - QImage* qimage = getimg(tgt); - if (qimage == NULL) return NULL; - QPixmap* image = new QPixmap(0,0); - QPixmap* ret; -// qDebug("New image"); - image->convertFromImage(*qimage); - delete qimage; - if (border) - { - ret = new QPixmap(image->width()+4, image->height()+4); - ret->fill(Qt::red); - bitBlt(ret, 2, 2, image, 0, 0, -1, -1);//, Qt::RasterOp::CopyROP); - delete image; - } - else - { - ret = image; - } - return ret; -} - -#ifdef _BUFFERPICS -#include <qmap.h> -#endif - -QPixmap* CPlucker::getPicture(unsigned long tgt) -{ -#ifdef _BUFFERPICS - static QMap<unsigned long, QPixmap> pix; - QMap<unsigned long, QPixmap>::Iterator t = pix.find(tgt); - if (t == pix.end()) - { - pix[tgt] = *expandimg(tgt); - return &pix[tgt]; - } - else - return &(t.data()); -#else - return expandimg(tgt); -#endif -} - -#ifdef LOCALPICTURES -#include <unistd.h> -#include <qpe/global.h> -void CPlucker::showimg(UInt16 tgt) -{ - qDebug("Crassssssh!"); - QPixmap* qimage = expandimg(tgt); - m_picture->setFixedSize(qimage->size()); - m_picture->setBackgroundPixmap(*qimage); - delete qimage; - m_viewer->show(); - -/* - char tmp[] = "uqtreader.XXXXXX"; - QImage* qimage = getimg(tgt); - QPixmap* image = new QPixmap(0,0); -// qDebug("New image"); - image->convertFromImage(*qimage); - delete qimage; - char tmpfile[sizeof(tmp)+1]; - strcpy(tmpfile,tmp); - int f = mkstemp(tmpfile); - close(f); - qDebug("TMPFILE:%s", tmpfile); - if (image->save(tmpfile,"PNG")) - { - QCopEnvelope e("QPE/Application/showimg", "setDocument(QString)"); - e << QString(tmpfile); - } - Global::statusMessage("Opening image"); - sleep(5); - delete image; - unlink(tmpfile); -*/ -} - -#endif - -void CPlucker::setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) -{ - unsigned short sz = 0; - for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) - { - sz++; - } - size_t newlen = srclen+sizeof(sz)+sz*sizeof(unsigned long); - unsigned char* newdata = new unsigned char[newlen]; - unsigned char* pdata = newdata; - memcpy(newdata, src, srclen); - newdata += srclen; - memcpy(newdata, &sz, sizeof(sz)); - newdata += sizeof(sz); - for (CList<unsigned long>::iterator it = visited.begin(); it != visited.end(); it++) - { - unsigned long t = *it; - qDebug("[%u]", t); - memcpy(newdata, &t, sizeof(t)); - newdata += sizeof(t); - } - m_nav.setSaveData(data, len, pdata, newlen); - delete [] pdata; -} - -void CPlucker::putSaveData(unsigned char*& src, unsigned short& srclen) -{ - unsigned short sz; - if (srclen >= sizeof(sz)) - { - memcpy(&sz, src, sizeof(sz)); - src += sizeof(sz); - srclen -= sizeof(sz); - } - for (int i = 0; i < sz; i++) - { - unsigned long t; - if (srclen >= sizeof(t)) - { - memcpy(&t, src, sizeof(t)); - qDebug("[%u]", t); - visited.push_front(t); - src += sizeof(t); - srclen -= sizeof(t); - } - else - { - QMessageBox::warning(NULL, PROGNAME, "File data mismatch\nMight fix itself"); - break; - } - } - m_nav.putSaveData(src, srclen); -} - -unsigned short CPlucker::finduid(unsigned short urlid) -{ -// qDebug("Finding %u", urlid); - unsigned short jmin = 1, jmax = ntohs(head.recordList.numRecords); - unsigned short jmid = (jmin+jmax) >> 1; - while (jmax - jmin > 1) - { - CPlucker_dataRecord thisHdr; - gotorecordnumber(jmid); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - unsigned short luid = ntohs(thisHdr.uid); -// qDebug("%u %u %u : %u", jmin, jmid, jmax, urlid); - if (luid == urlid) - { - return jmid; - } - if (luid < urlid) - { - jmin = jmid; - } - else - { - jmax = jmid; - } - jmid = (jmin+jmax) >> 1; - } - CPlucker_dataRecord thisHdr; - gotorecordnumber(jmin); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - unsigned short luid = ntohs(thisHdr.uid); - qDebug("jmin at end:%u,%u", jmin, luid); - if (luid == urlid) - { - return jmin; - } - gotorecordnumber(jmax); - fread(&thisHdr, 1, sizeof(thisHdr), fin); - luid = ntohs(thisHdr.uid); - qDebug("jmax at end:%u,%u", jmax, luid); - if (luid == urlid) - { - return jmax; - } - qDebug("Couldn't find %u", urlid); - return 0; // Not found! -} diff --git a/noncore/apps/opie-reader/plucker.h b/noncore/apps/opie-reader/plucker.h index 083eac6..6d62195 100644 --- a/noncore/apps/opie-reader/plucker.h +++ b/noncore/apps/opie-reader/plucker.h @@ -1,123 +1,36 @@ #ifndef __plucker_h #define __plucker_h -#include "CExpander.h" -#include "zlib/zlib.h" -#include "ztxt.h" -#include "pdb.h" -#include "CBuffer.h" -#include "Navigation.h" -#include "my_list.h" +#include "plucker_base.h" #ifdef LOCALPICTURES class QScrollView; class QWidget; #endif -struct CPlucker_dataRecord +class CPlucker : public CPlucker_base { - UInt16 uid; - UInt16 nParagraphs; - UInt16 size; - UInt8 type; - UInt8 reserved; -}; - -struct CPlucker_record0 + void start2endSection() { - UInt16 uid; - UInt16 version; - UInt16 nRecords; -}; - -struct CPluckerbkmk + m_currentstart = currentpos-bufferpos; + m_currentend = m_currentstart+buffercontent; + } + void setbuffersize() { - UInt32 offset; - tchar title[MAX_BMRK_LENGTH]; -}; + compressedbuffersize = buffersize = 32*1024; + } + int HeaderSize(); + void GetHeader(UInt16& uid, UInt16& nParagraphs, UInt32& size, UInt8& type, UInt8& reserved); + int bgetch(); + tchar getch(bool fast); + UInt8 EOPPhase; -const UInt32 CPLUCKER_ID = 0x5458547a; -class CPlucker : public CExpander, Cpdb -{ - unsigned short finduid(unsigned short); - char* geturl(UInt16); - void Expand(UInt16, UInt8, UInt8*, UInt16); - CList<unsigned long> visited; - bool m_lastIsBreak; -#ifdef LOCALPICTURES - QScrollView* m_viewer; - QWidget* m_picture; -#endif - size_t textlength, m_lastBreak; - UInt16 uid; - UInt8 EOPPhase; - int m_nextPara, m_nextParaIndex; - CBufferFace<UInt16> m_ParaOffsets; - CBufferFace<UInt16> m_ParaAttrs; - UInt16 m_nParas; - CStyle mystyle; -// bool bInit; - UInt32 buffersize; - UInt32 buffercontent; - UInt8* expandedtextbuffer; - UInt8* compressedtextbuffer; - char* urls; - size_t urlsize; - size_t bufferpos; - UInt16 bufferrec; - CPlucker_record0 hdr0; - size_t currentpos; - bool expand(int); - void UnZip(size_t, UInt8*, UInt16); - void UnDoc(size_t, UInt8*, UInt16); -#ifdef LOCALPICTURES - void showimg(UInt16 tgt); -#endif - QImage* getimg(UInt16 tgt); - QPixmap* expandimg(UInt16 tgt, bool border=false); - void home(); - int bgetch(); - CNavigation m_nav; + + bool CorrectDecoder(); // Virtual + void setlink(QString&, const QString&); // Virtual + QImage* imagefromdata(UInt8*, UInt32); // virtual public: - virtual void suspend() - { - CExpander::suspend(fin); - } - virtual void unsuspend() - { - CExpander::unsuspend(fin); - } - virtual QPixmap* getPicture(unsigned long tgt); - virtual void sizes(unsigned long& _file, unsigned long& _text); - virtual bool hasrandomaccess() { return true; } - virtual ~CPlucker(); CPlucker(); - virtual int OpenFile(const char *src); - virtual int getch(); - virtual void getch(int&, CStyle&); - virtual unsigned int locate(); - virtual void locate(unsigned int n); - virtual CList<Bkmk>* getbkmklist(); - virtual bool hyperlink(unsigned int n); - virtual MarkupType PreferredMarkup() - { - return cNONE; - } - void saveposn(size_t posn) { m_nav.saveposn(posn); } - bool forward(size_t& loc) { return m_nav.forward(loc); } - bool back(size_t& loc) { return m_nav.back(loc); } - bool hasnavigation() { return true; } - unsigned long startSection() - { - return currentpos-bufferpos; - } - unsigned long endSection() - { - return startSection()+buffercontent; - } - void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen); - void putSaveData(unsigned char*& src, unsigned short& srclen); }; - #endif diff --git a/noncore/apps/opie-reader/ppm_expander.h b/noncore/apps/opie-reader/ppm_expander.h index 4278c82..002de86 100644 --- a/noncore/apps/opie-reader/ppm_expander.h +++ b/noncore/apps/opie-reader/ppm_expander.h @@ -1,58 +1,61 @@ #ifndef __ppm_expander_h #define __ppm_expander_h +#include "useqpe.h" #include "CExpander.h" #include <sys/stat.h> #include "utypes.h" #include "ppm.h" #include "arith.h" #define SYM_EOF 256 class ppm_expander : public CExpander { UCHAR *buf_in,*buf_out; unsigned int bufsize; unsigned int outbytes; unsigned long blocksize; unsigned short numblocks; unsigned short curblock; unsigned short maxnode; bool needppmend; int home(); FILE* my_file_in; PPM_ReadBuf* my_read_buf; ppm_worker ppm; public: - virtual void suspend() +#ifdef USEQPE
+ void suspend() { CExpander::suspend(my_file_in); } - virtual void unsuspend() + void unsuspend() { CExpander::unsuspend(my_file_in); } +#endif ppm_expander() : needppmend(false), my_file_in(NULL), my_read_buf(NULL) { bufsize = 1024; buf_in = new UCHAR[bufsize]; buf_out = new UCHAR[bufsize]; outbytes = 0; } - virtual int OpenFile(const char* infile); - virtual int getch(); + int OpenFile(const char* infile); + int getch(); int locate(unsigned short block, unsigned int n); virtual ~ppm_expander(); - virtual unsigned int locate() { return outbytes; } - virtual void locate(unsigned int n); - virtual bool hasrandomaccess() { return (numblocks > 1); } - virtual void sizes(unsigned long& file, unsigned long& text); - virtual MarkupType PreferredMarkup() + unsigned int locate() { return outbytes; } + void locate(unsigned int n); + bool hasrandomaccess() { return (numblocks > 1); } + void sizes(unsigned long& file, unsigned long& text); + MarkupType PreferredMarkup() { return cTEXT; } }; #endif diff --git a/noncore/apps/opie-reader/ustring.h b/noncore/apps/opie-reader/ustring.h index a3ef8df..95da26b 100644 --- a/noncore/apps/opie-reader/ustring.h +++ b/noncore/apps/opie-reader/ustring.h @@ -1,83 +1,93 @@ #include <qstring.h> #ifdef _UNICODE inline size_t ustrlen(const tchar* _p) { if (_p == NULL) return 0; const tchar *p = _p; while (*p != 0) { p++; /* if (p - _p == 20) { printf("ustrlen::String too long:"); for (int i = 0; i < 20; i++) printf("%c",_p[i]); printf("\n"); } */ } return p - _p; } inline int ustrcmp(const tchar* _p1, const tchar* _p2) { if (_p1 == 0) return 1; if (_p2 == 0) return -1; const tchar* p1 = _p1, *p2 = _p2; while (*p1 != 0) { /* if (p1 - _p1 == 20) { printf("ustrcmp::String too long:"); for (int i = 0; i < 20; i++) printf("%c",_p1[i]); printf("\n"); } */ if (*p1 < *p2) return -1; if (*p1 > *p2) return 1; if (*p2 == 0) return 1; p1++, p2++; } if (*p2 != 0) return -1; return 0; } inline QString toQString(tchar *_p) { if (_p == NULL) return 0; int i = 0; tchar *p = _p; QString ret; while (*p != 0) ret[i++] = *(p++); return ret; } inline QString toQString(tchar *_p, unsigned int len) { if (_p == NULL) return 0; unsigned int i = 0; tchar *p = _p; QString ret; +#ifdef _WINDOWS
+// ret.fill(' ', len);
+ for (i = 0; i < len; i++)
+ {
+ if (p[i] == 0) break;
+ ret.at((uint)i) = p[i];
+ } +// while (*p != 0 && i < len) ret.at((uint)i++) = (tchar)(*(p++)); +#else while (*p != 0 && i < len) ret[i++] = *(p++); +#endif return ret; } inline tchar* fromQString(const QString& qs) { int len = qs.length(); tchar* ret = new tchar[len+1]; for (int i = 0; i < len; i++) { ret[i] = qs[i].unicode(); } ret[len] = 0; return ret; } #else inline size_t ustrlen(const tchar* _p) { return strlen(_p); } inline int ustrcmp(const tchar* _p1, const tchar* _p2) { return strcmp(_p1, _p2); } #endif diff --git a/noncore/apps/opie-reader/version.h b/noncore/apps/opie-reader/version.h index 003e9db..85d35a4 100644 --- a/noncore/apps/opie-reader/version.h +++ b/noncore/apps/opie-reader/version.h @@ -1,5 +1,9 @@ +#ifndef __VERSION_H +#define __VERSION_H #define MAJOR 0 #define BKMKTYPE 6 -#define MINOR 'a' +#define MINOR 'j' #define RELEASE_TYPE "beta" + +#endif diff --git a/noncore/apps/opie-reader/ztxt.h b/noncore/apps/opie-reader/ztxt.h index d7cb96a..709a055 100644 --- a/noncore/apps/opie-reader/ztxt.h +++ b/noncore/apps/opie-reader/ztxt.h @@ -1,113 +1,120 @@ #ifndef __ztxt_h #define __ztxt_h +#include "useqpe.h"
#include "CExpander.h" -#include "zlib/zlib.h" +#include <zlib.h> #include "pdb.h" +#ifdef _WINDOWS
+#include <winsock.h>
+#endif
+
/* * Stuff common to both Weasel Reader and makeztxt * * $Id$ * */ #ifndef _WEASEL_COMMON_H_ #define _WEASEL_COMMON_H_ 1 /* Padding is no good */ #if defined(__GNUC__) && defined(__UNIX__) # pragma pack(2) #endif /* The default creator is Weasel Reader 'GPlm' */ #define GPLM_CREATOR_ID "GPlm" /* Databases of type 'zTXT' */ #define ZTXT_TYPE_ID "zTXT" /* Size of one database record */ #define RECORD_SIZE 8192 /* Allow largest WBIT size for data. Lower with command line options in makeztxt */ #define MAXWBITS 15 /* Max length for a bookmark/annotation title */ #define MAX_BMRK_LENGTH 20 /***************************************************** * This is the zTXT document header (record #0) * * ----zTXT version 1.42---- * *****************************************************/ typedef struct zTXT_record0Type { UInt16 version; /* zTXT format version */ UInt16 numRecords; /* Number of data (TEXT) records */ UInt32 size; /* Size in bytes of uncomp. data */ UInt16 recordSize; /* Size of a single data record */ UInt16 numBookmarks; /* Number of bookmarks in DB */ UInt16 bookmarkRecord; /* Record containing bookmarks */ UInt16 numAnnotations; /* Number of annotation records */ UInt16 annotationRecord; /* Record # of annotation index */ UInt8 randomAccess; /* 1 if compressed w/Z_FULL_FLUSH */ UInt8 padding[0x20 - 19]; /* Pad to a size of 0x20 bytes */ } zTXT_record0; struct zTXTbkmk { UInt32 offset; tchar title[MAX_BMRK_LENGTH]; }; #endif const UInt32 ZTXT_ID = 0x5458547a; class ztxt : public CExpander, Cpdb { bool bInit; UInt32 buffersize; UInt32 buffercontent; UInt8* expandedtextbuffer; UInt8* compressedtextbuffer; z_stream zstream; size_t bufferpos; UInt16 bufferrec; zTXT_record0 hdr0; size_t currentpos; void home(); public: - virtual void suspend() +#ifdef USEQPE
+ void suspend() { CExpander::suspend(fin); } - virtual void unsuspend() + void unsuspend() { CExpander::unsuspend(fin); } - virtual void sizes(unsigned long& _file, unsigned long& _text) +#endif + void sizes(unsigned long& _file, unsigned long& _text) { _file = file_length; _text = ntohl(hdr0.size); } - virtual bool hasrandomaccess() { return (hdr0.randomAccess != 0); } + bool hasrandomaccess() { return (hdr0.randomAccess != 0); } virtual ~ztxt() { if (expandedtextbuffer != NULL) delete [] expandedtextbuffer; if (compressedtextbuffer != NULL) delete [] compressedtextbuffer; if (bInit) { inflateEnd(&zstream); } } ztxt(); - virtual int OpenFile(const char *src); - virtual int getch(); - virtual unsigned int locate(); - virtual void locate(unsigned int n); - virtual CList<Bkmk>* getbkmklist(); - virtual MarkupType PreferredMarkup() + int OpenFile(const char *src); + int getch(); + unsigned int locate(); + void locate(unsigned int n); + CList<Bkmk>* getbkmklist(); + MarkupType PreferredMarkup() { return cTEXT; } }; #endif |