46 files changed, 3701 insertions, 643 deletions
diff --git a/noncore/apps/opie-reader/Aportis.cpp b/noncore/apps/opie-reader/Aportis.cpp index 1327ff8..b4988da 100644 --- a/noncore/apps/opie-reader/Aportis.cpp +++ b/noncore/apps/opie-reader/Aportis.cpp @@ -29,129 +29,129 @@ CList<Bkmk>* Aportis::getbkmklist() char name[17]; name[16] = '\0'; 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); 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) +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)); 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; diff --git a/noncore/apps/opie-reader/Aportis.h b/noncore/apps/opie-reader/Aportis.h index 1ca5e73..af1fd3b 100644 --- a/noncore/apps/opie-reader/Aportis.h +++ b/noncore/apps/opie-reader/Aportis.h @@ -14,87 +14,95 @@ 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() + { + CExpander::suspend(fin); + } + virtual void unsuspend() + { + CExpander::unsuspend(fin); + } virtual void sizes(unsigned long& _file, unsigned long& _text) { _file = dwLen; _text = dwTLen; } virtual bool hasrandomaccess() { return true; } virtual ~Aportis() {} Aportis(); - virtual int openfile(const char *src); + 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() { 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 30d2881..998601a 100644 --- a/noncore/apps/opie-reader/Bkmks.cpp +++ b/noncore/apps/opie-reader/Bkmks.cpp @@ -1,240 +1,322 @@ +#include "name.h" #include <qmessagebox.h> #include "Bkmks.h" #include "StyleConsts.h" #include "Markups.h" #include "my_list.h" #include "version.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) { - int len = ustrlen(_nm)+1; - m_name = new tchar[len]; - for (int i = 0; i < len; i++) m_name[i] = _nm[i]; if (_anno == NULL) { - m_anno = new tchar[1]; - m_anno[0] = 0; + tchar t = 0; + init(_nm, sizeof(tchar)*(ustrlen(_nm)+1), &t, sizeof(t), _p); } else { - len = ustrlen(_anno)+1; - m_anno = new tchar[len]; - for (int i = 0; i < len; i++) m_anno[i] = _anno[i]; + 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) { - int len = ustrlen(rhs.m_name)+1; - m_name = new tchar[len]; - for (int i = 0; i < len; i++) m_name[i] = rhs.m_name[i]; + 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) { - int len = ustrlen(rhs.m_anno)+1; - m_anno = new tchar[len]; - for (int i = 0; i < len; i++) m_anno[i] = rhs.m_anno[i]; + 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 && ustrcmp(m_name,rhs.m_name) == 0); + return (m_position == rhs.m_position && (rhs.m_namelen == m_namelen) && memcmp(m_name,rhs.m_name,m_namelen) == 0); } -void Bkmk::setAnno(tchar* t) +void Bkmk::setAnno(unsigned char* t, unsigned short len) { if (m_anno != NULL) { delete [] m_anno; m_anno = NULL; } if (t != NULL) { - int len = ustrlen(t)+1; - m_anno = new tchar[len]; - for (int i = 0; i < len; i++) m_anno[i] = t[i]; + 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 ) +BkmkFile::BkmkFile(const char *fnm, bool w = false) : 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(tchar* nm, tchar* an, const unsigned int& pos) +void BkmkFile::write(const Bkmk& b) { if (f != NULL) { - unsigned short ln = ustrlen(nm); - fwrite(&ln,sizeof(ln),1,f); - fwrite(nm,sizeof(tchar),ln,f); - ln = ustrlen(an); - fwrite(&ln,sizeof(ln),1,f); - if (ln > 0) fwrite(an,sizeof(tchar),ln,f); - fwrite(&pos,sizeof(pos),1,f); + 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(const Bkmk& b) { write(b.name(), b.anno(), b.value()); } - 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); } } } -Bkmk* BkmkFile::read() -{ - Bkmk* b = NULL; - if (f != NULL) - { - unsigned short ln; - if (fread(&ln,sizeof(ln),1,f) == 1) - { - b = new Bkmk; - b->m_name = new tchar[ln+1]; - fread(b->m_name,sizeof(tchar),ln,f); - b->m_name[ln] = 0; - - fread(&ln,sizeof(ln),1,f); - b->m_anno = new tchar[ln+1]; - if (ln > 0) fread(b->m_anno,sizeof(tchar),ln,f); - b->m_anno[ln] = 0; - fread(&b->m_position,sizeof(b->m_position),1,f); - } - } - return b; -} - CList<Bkmk>* BkmkFile::readall() { CList<Bkmk>* bl = NULL; if (f != NULL) { unsigned long newmagic; fread(&newmagic, sizeof(newmagic), 1, f); - if (newmagic != magic) + if ((newmagic & 0xffffff00) != (magic & 0xffffff00)) { - if (QMessageBox::warning(NULL, "Old bookmark file!", "Which version of OpieReader\ndid you upgrade from?", "0_4*", "Any other version") == 0) + 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 = readall04(); + bl = readall00(&read05); } else { fseek(f,0,SEEK_SET); - bl = readall03(); + bl = readall00(&read03); } isUpgraded = true; } else { - bl = readall04(); + switch(newmagic & 0xff) + { + case 6: + isUpgraded = false; + bl = readall00(read06); + qDebug("Correct version!"); + break; + case 5: + isUpgraded = true; + bl = readall00(read05); + qDebug("Known version!"); + break; + default: + qDebug("Unknown version!"); + isUpgraded = true; + bl = readall00(read05); + } } } return bl; } -CList<Bkmk>* BkmkFile::readall04() +CList<Bkmk>* BkmkFile::readall00(Bkmk* (*readfn)(FILE*)) { CList<Bkmk>* bl = new CList<Bkmk>; while (1) { - Bkmk* b = read(); + Bkmk* b = (*readfn)(f); if (b == NULL) break; bl->push_back(*b); delete b; } return bl; } -CList<Bkmk>* BkmkFile::readall03() +Bkmk* BkmkFile::read03(FILE* f) { - CList<Bkmk>* bl = new CList<Bkmk>; - while (1) + Bkmk* b = NULL; + if (f != NULL) { - Bkmk* b = read03(); - if (b == NULL) break; - bl->push_back(*b); - delete b; + 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 bl; + } + return b; } -Bkmk* BkmkFile::read03() +Bkmk* BkmkFile::read05(FILE* f) { Bkmk* b = NULL; if (f != NULL) { unsigned short ln; if (fread(&ln,sizeof(ln),1,f) == 1) { - b = new Bkmk; - b->m_name = new tchar[ln+1]; - fread(b->m_name,sizeof(tchar),ln,f); - b->m_name[ln] = 0; + 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; +} - ln = 0; - b->m_anno = new tchar[ln+1]; - b->m_anno[ln] = 0; +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_position,sizeof(b->m_position),1,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/Bkmks.h b/noncore/apps/opie-reader/Bkmks.h index b38184a..ee528e4 100644 --- a/noncore/apps/opie-reader/Bkmks.h +++ b/noncore/apps/opie-reader/Bkmks.h @@ -1,53 +1,70 @@ #ifndef __Bkmks_h #define __Bkmks_h #include "config.h" +#include "Filedata.h" #include <stdio.h> template<class T> class CList; class Bkmk { friend class BkmkFile; - tchar* m_name; - tchar* m_anno; + unsigned char* m_name; + unsigned short m_namelen; + unsigned char* m_anno; + unsigned short m_annolen; unsigned int m_position; + void init(const void*, unsigned short, const void*, unsigned short, unsigned int); public: - Bkmk() : m_name(NULL), m_anno(NULL), m_position(0) {}; + Bkmk() : m_name(NULL), m_namelen(0), m_anno(NULL), m_annolen(0), m_position(0) {}; + Bkmk(const unsigned char* _nm, unsigned short _nmlen, const unsigned char* _anno, unsigned short _annolen, unsigned int _p); + Bkmk(const tchar* _nm, const unsigned char* _anno, unsigned short _annolen, unsigned int _p); Bkmk(const tchar* _nm, const tchar* _anno, unsigned int _p); Bkmk(const Bkmk& rhs) : m_name(NULL), m_anno(NULL) { *this = rhs; } ~Bkmk(); unsigned int value() const { return m_position; } - tchar *name() const { return m_name; } - tchar *anno() const { return m_anno; } + void value(unsigned int _v) { m_position = _v; } + tchar *name() const { return (tchar*)m_name; } + tchar *anno() const { return (tchar*)m_anno; } bool operator<(const Bkmk& rhs) { return (m_position < rhs.m_position); } Bkmk& operator=(const Bkmk& rhs); bool operator==(const Bkmk& rhs); void setAnno(tchar* t); + void setAnno(unsigned char* t, unsigned short len); + unsigned char* filedata() + { + CFiledata fd(anno()); + return m_anno+fd.length(); + } + unsigned short filedatalen() + { + CFiledata fd(anno()); + return m_annolen - fd.length(); + } }; class BkmkFile { FILE* f; bool wt; bool isUpgraded; static const unsigned long magic; private: - Bkmk* read(); - Bkmk* read03(); - CList<Bkmk>* readall03(); - CList<Bkmk>* readall04(); - void write(tchar* nm, tchar* an, const unsigned int& pos); + static Bkmk* read06(FILE*); + static Bkmk* read05(FILE*); + static Bkmk* read03(FILE*); + CList<Bkmk>* readall00(Bkmk*(*fn)(FILE*)); void write(const Bkmk& b); public: bool upgraded() { return isUpgraded; } BkmkFile(const char *fnm, bool w = false); ~BkmkFile(); void write(CList<Bkmk>& bl); CList<Bkmk>* readall(); }; #endif diff --git a/noncore/apps/opie-reader/BuffDoc.cpp b/noncore/apps/opie-reader/BuffDoc.cpp index d4541ea..1123960 100644 --- a/noncore/apps/opie-reader/BuffDoc.cpp +++ b/noncore/apps/opie-reader/BuffDoc.cpp @@ -1,224 +1,356 @@ +#include "name.h" + #include "BuffDoc.h" //#include <FL/fl_draw.h> #include "config.h" #include "CDrawBuffer.h" #include "plucker.h" bool BuffDoc::hyperlink(unsigned int n) { bool bRet = false; lastword.empty(); lastsizes[0] = laststartline = n; lastispara = false; if (exp != NULL) { bRet = exp->hyperlink(n); lastsizes[0] = laststartline = exp->locate(); } return bRet; } void BuffDoc::locate(unsigned int n) { // qDebug("BuffDoc:locating:%u",n); lastword.empty(); lastsizes[0] = laststartline = n; lastispara = false; // tchar linebuf[1024]; if (exp != NULL) exp->locate(n); // qDebug("BuffDoc:Located"); } -bool BuffDoc::getline(CDrawBuffer* buff, int w) +#define NEWLINEBREAK +#ifdef NEWLINEBREAK +bool BuffDoc::getline(CDrawBuffer* buff, int wth) +{ + bool moreleft = true; + bool margindone = false; + int w = wth-2*BORDER; + tchar ch = 32; + CStyle cs; + buff->empty(); + if (exp == NULL) + { + buff->empty(); + buff->setEof(); + return false; + } + int len = 0; + if (lastword.length() > 0) + { + *buff = lastword; + cs = lastword.laststyle(); + w -= buff->leftMargin() + buff->rightMargin(); + margindone = true; + len = lastword.length(); + } + else buff->empty(); + lastword.empty(); + unsigned int slen = buff->width(len); + lastispara = false; + while (1) + { + lastsizes[len] = exp->locate(); + getch(ch, cs); + if (ch == UEOF) + { + lastword.empty(); + if (len == 0) + { + buff->setEof(); + moreleft = false; + } + laststartline = exp->locate(); + break; + } + if (ch == 10) + { + lastword.empty(); + lastispara = true; + laststartline = exp->locate(); + break; + } + buff->addch(ch, cs); + len++; + if (!margindone) + { + w -= buff->leftMargin() + buff->rightMargin(); + margindone = true; + } + if ((slen = buff->width(len)) > w) + { + if (ch == ' ' || len == 1) + { + lastword.empty(); + laststartline = exp->locate(); + break; + } + else // should do a backward search for spaces, first. + { + for (int i = len-1; i > 0; i--) + { + if ((*buff)[i] == ' ') + { + (*buff)[len] = 0; + lastword.setright(*buff, i+1); + buff->truncate(i); + (*buff)[i] = '\0'; + laststartline = lastsizes[i+1]; + buff->resize(); + for (int j = 0; j < lastword.length(); j++) + { + lastsizes[j] = lastsizes[j+i+1]; + } + return true; + } + } + laststartline = lastsizes[len-1]; + lastword.setright(*buff, len - 1); + buff->truncate(len-1); + buff->addch('-', cs); + for (int j = 0; j < lastword.length(); j++) { + lastsizes[j] = lastsizes[j+len]; + } + break; + } + } + } + (*buff)[len] = '\0'; + buff->resize(); + return moreleft; +} +#else +bool BuffDoc::getline(CDrawBuffer* buff, int wth) +{ + bool margindone = false; + int w = wth-2*BORDER; tchar ch = 32; CStyle cs; buff->empty(); if (exp == NULL) { // (*buff)[0] = '\0'; buff->empty(); return false; } int len = 0, lastcheck = 0; if (lastword.length() > 0) { *buff = lastword; cs = lastword.laststyle(); + w -= buff->leftMargin() + buff->rightMargin(); + margindone = true; } else buff->empty(); // qDebug("Buff:%s Lastword:%s", (const char*)toQString(buff->data()), (const char*)toQString(lastword.data())); lastcheck = len = buff->length(); unsigned int slen = buff->width(len); if (slen > w) { - for ( ; len > 0; len--) + for ( ; len > 1; len--) { if (buff->width(len) < w) break; } // lastword = buff->data() + len - 1; laststartline = lastsizes[len-1]; - lastword.setright(*buff, len - 1); for (int i = 0; i < buff->length(); i++) lastsizes[i] = lastsizes[i+len-1]; // (*buff)[len-1] = '-'; + 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; - lastword.setright(*buff, lastcheck); +#ifdef WINDOWS + lastword.setright(*buff, (lastcheck > 0) ? lastcheck : 1); + { + int i; + for (i = 0; i < lastword.length(); i++) lastsizes[i] = allsizes[i+lastcheck]; + } +#else + lastword.setright(*buff, (lastcheck > 0) ? lastcheck : 1); for (int i = 0; i < lastword.length(); i++) lastsizes[i] = allsizes[i+lastcheck]; +#endif if (lastcheck > 0) { laststartline = allsizes[lastcheck]; // (*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(); - return (ch != UEOF); + buff->resize(); + if (ch == UEOF && buff->length() == 0) + { + buff->setEof(); + return false; + } + return true; } +#endif -bool BuffDoc::getline(CDrawBuffer* buff, int w, int cw) +bool BuffDoc::getline(CDrawBuffer* buff, int wth, int cw) { + int w = wth-2*BORDER; buff->empty(); if (exp == NULL) { return false; } tchar ch; CStyle cs; int i = 0; while (i*cw < w) { getch(ch, cs); if (ch == '\12' || ch == UEOF) break; buff->addch(ch,cs); i++; } 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); if (exp != NULL) delete exp; lastword.empty(); lastsizes[0] = laststartline = 0; lastispara = false; /* 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); } if (ret != 0) { delete exp; exp = new CPlucker; ret = exp->openfile(src); } -#ifndef SMALL if (ret != 0) { delete exp; qDebug("Trying ppms"); exp = new ppm_expander; ret = exp->openfile(src); } - if (ret != 0) { delete exp; exp = new Text; // qDebug("Trying text"); ret = exp->openfile(src); } -#else - if (ret != 0) - { - delete exp; - exp = new Text; - ret = exp->openfile(src); - } -#endif + if (ret != 0) { delete exp; - QMessageBox::information(_parent, "OpieReader", "Unknown file compression type","Try another file"); + QMessageBox::information(_parent, PROGNAME, "Unknown file compression type","Try another file"); return ret; } // qDebug("Doing final open:%x:%x",exp,filt); lastword.empty(); lastsizes[0] = laststartline = 0; lastispara = false; exp->locate(0); filt->setsource(exp); // qDebug("BuffDoc:file opened"); return 0; } diff --git a/noncore/apps/opie-reader/BuffDoc.h b/noncore/apps/opie-reader/BuffDoc.h index 1aac817..78d8457 100644 --- a/noncore/apps/opie-reader/BuffDoc.h +++ b/noncore/apps/opie-reader/BuffDoc.h @@ -1,84 +1,114 @@ #ifndef __BuffDoc_h #define __BuffDoc_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); + } + } + void suspend() { if (exp != NULL) exp->suspend(); } + void unsuspend() { if (exp != NULL) exp->unsuspend(); } ~BuffDoc() { delete filt; delete exp; } BuffDoc() { exp = NULL; filt = NULL; lastword.empty(); // 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); } + 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); + 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); 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); } + 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/CBuffer.cpp b/noncore/apps/opie-reader/CBuffer.cpp index 0780a88..526b25f 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); return *this; } -CBufferBase::CBufferBase(size_t ms, size_t n) : len(n), membersize(ms) +CBufferBase::CBufferBase(size_t ms, size_t n = 16) : len(n), membersize(ms) { buffer = new unsigned char[len*membersize]; memset(buffer, 0, len*membersize); } 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) +size_t CBufferBase::bstrlen(unsigned char* _buffer = NULL) { 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 892456f..ca220e6 100644 --- a/noncore/apps/opie-reader/CDrawBuffer.cpp +++ b/noncore/apps/opie-reader/CDrawBuffer.cpp @@ -1,211 +1,379 @@ - #include "CDrawBuffer.h" #include "FontControl.h" #include <qfontmetrics.h> #include <qpainter.h> +#include <qpixmap.h> +#include "opie.h" + +CDrawBuffer::~CDrawBuffer() +{ + while (!segs.isEmpty()) segs.erase(0); +} void CDrawBuffer::setright(CDrawBuffer& rhs, int f) { int i; -// qDebug("Trying 1:%d:%s", f, (const char*)toQString(rhs.data())); len = rhs.len; - m_maxstyle = rhs.m_maxstyle; - m_ascent = rhs.m_ascent; - m_descent = rhs.m_descent; - m_lineSpacing = rhs.m_lineSpacing; - while (!segs.isEmpty()) segs.erase(0); + 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; -// qDebug("Tried 1"); } CDrawBuffer& CDrawBuffer::operator=(CDrawBuffer& rhs) { int i; // 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; - while (!segs.isEmpty()) segs.erase(0); + 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"); return *this; } CDrawBuffer& CDrawBuffer::operator=(const tchar*sztmp) { int i; - while (!segs.isEmpty()) segs.erase(0); + 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() { len = 0; (*this)[0] = 0; - while (!segs.isEmpty()) segs.erase(0); + while (!segs.isEmpty()) + { + segs.erase(0); + } segs.push_back(textsegment(0,CStyle())); - m_maxstyle = m_ascent = m_descent = m_lineSpacing = 0; + 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) { - int thissize = fc->getsize(_style); - m_maxstyle = thissize; - m_ascent = fc->ascent(_style); - m_descent = fc->descent(_style); - m_lineSpacing = fc->lineSpacing(_style); segs.first().start = 0; segs.first().style = _style; } else if (_style != segs.last().style) { - int thissize = fc->getsize(_style); - if (thissize > m_maxstyle) - { - m_maxstyle = thissize; - m_ascent = fc->ascent(_style); - m_descent = fc->descent(_style); - m_lineSpacing = fc->lineSpacing(_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 currentx = 0, end = 0; QString text = toQString(data()); CList<textsegment>::iterator textstart = segs.begin(); CList<textsegment>::iterator textend = textstart; do { textend++; end = (textend != segs.end()) ? textend->start : length(); if (numchars >= 0 && end > numchars) { end = numchars; } CStyle currentstyle = textstart->style; - QFont f(fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) ); + if (currentstyle.isPicture()) + { + 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()) ); +// f.setUnderline(currentstyle.isUnderline()); QString str = text.mid(textstart->start, end-textstart->start); QFontMetrics fm(f); currentx += fm.width(str); + } + } textstart = textend; } while (textend != segs.end() && end != numchars); return currentx; } +int CDrawBuffer::leftMargin() +{ + return (segs.begin()->style.getLeftMargin()*fc->getsize(segs.begin()->style))/6; +} + +int CDrawBuffer::rightMargin() +{ + return (segs.begin()->style.getRightMargin()*fc->getsize(segs.begin()->style))/6; +} + +int CDrawBuffer::offset(int scwidth) +{ + int currentx = BORDER; + switch(segs.begin()->style.getJustify()) + { + case m_AlignRight: + { + 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(); + break; + } + return currentx; +} + void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scwidth) { - int currentx = 0; + int currentx = offset(scwidth); QString text = toQString(data()); CList<textsegment>::iterator textstart = segs.begin(); +/* StyleType align = textstart->style.getJustify(); switch (align) { case CStyle::m_AlignRight: { -// int linelength = width(); - currentx = scwidth - width(); + currentx = scwidth - width() - 2*BORDER; } break; case CStyle::m_AlignCentre: { -// int linelength = width(); - currentx = (scwidth - width())/2; + currentx = (scwidth - width())/2 - BORDER; } 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(); CStyle currentstyle = textstart->style; - QFont f(fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) ); + QFont f((currentstyle.isMono() && fc->hasCourier()) ? QString("courier") : 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); - _p->setPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue())); +#ifdef OPIE + _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 if (_bMono) { + if (currentstyle.isUnderline()) + { + _p->drawLine( currentx, _y, currentx + str.length()*_charWidth, _y); + } + if (currentstyle.isStrikethru()) + { + int ascent = fc->ascent(currentstyle)/3; + _p->drawLine( currentx, _y-ascent, currentx + str.length()*_charWidth, _y-ascent); + } for (int i = 0; i < str.length(); i++) { _p->drawText( currentx + i*_charWidth, _y, QString(str[i])); } currentx += str.length()*_charWidth; } else { - _p->drawText( currentx, _y, str); + if (currentstyle.isPicture()) + { + int ascent = fc->ascent(currentstyle)/2; + int yoffset = currentstyle.getPicture()->height()/2 + ascent; + _p->drawPixmap( currentx, _y-yoffset, *(currentstyle.getPicture())); + currentx += currentstyle.getPicture()->width(); + } + 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); + } + if (currentstyle.isStrikethru()) + { + int ascent = fc->ascent(currentstyle)/3; + _p->drawLine( currentx, _y-ascent, currentx + w, _y-ascent); + } + QString str = text.mid(textstart->start, end-textstart->start); + + for (int i = 0; i < str.length(); i++) + { + _p->drawText( currentx, _y, QString(str[i])); + currentx += cw; + } + } + else + { QFontMetrics fm(f); - currentx += fm.width(str); + int w = fm.width(str); + if (currentstyle.isUnderline()) + { + _p->drawLine( currentx, _y, currentx + w, _y); + } + if (currentstyle.isStrikethru()) + { + int ascent = fc->ascent(currentstyle)/3; + _p->drawLine( currentx, _y-ascent, currentx + w, _y-ascent); + } + _p->drawText( currentx, _y, str); + currentx += w; + } + } } textstart = textend; } - while (textend != segs.end()); + while (textend != segs.end() && textstart->start < length()-1); } CStyle CDrawBuffer::laststyle() { return segs.last().style; } -bool CDrawBuffer::isLink(int numchars, size_t& tgt) +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(); - if (numchars >= 0 && end > numchars) - { - end = numchars; - } currentstyle = textstart->style; +/* + if (currentstyle.isPicture()) qDebug("Passed thru picture"); + if (currentstyle.getLink()) qDebug("Passed thru link"); + qDebug("islink:%d - %d", numchars, end); +*/ textstart = textend; } - while (textend != segs.end() && end != numchars); + 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 currentstyle.getLink(); + return eLink; + } + return eNone; +} + +void CDrawBuffer::resize() +{ + int i; + m_maxstyle = m_ascent = m_descent = m_lineSpacing = m_lineExtraSpacing = 0; + for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= length(); ) + { + 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()) + { + descent = (_style.getPicture()->height()-ascent)/2; + ascent = (_style.getPicture()->height()+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; + } } diff --git a/noncore/apps/opie-reader/CDrawBuffer.h b/noncore/apps/opie-reader/CDrawBuffer.h index 4d3696e..0d8968c 100644 --- a/noncore/apps/opie-reader/CDrawBuffer.h +++ b/noncore/apps/opie-reader/CDrawBuffer.h @@ -1,59 +1,76 @@ #ifndef __CDRAWBUFFER_H #define __CDRAWBUFFER_H #include "StyleConsts.h" #include "CBuffer.h" #include "my_list.h" class QPainter; +enum linkType +{ + eNone, + eLink, + ePicture +}; + struct textsegment { int start; CStyle style; - 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; + int m_maxstyle, m_ascent, m_descent, m_lineSpacing, m_lineExtraSpacing; + bool m_bEof; + CDrawBuffer(const CDrawBuffer&); + CDrawBuffer& operator=(const tchar*sztmp); public: + 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); - CDrawBuffer& operator=(const tchar*sztmp); - CDrawBuffer& operator=(CDrawBuffer&); 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(); - bool isLink(int numchars, size_t& tgt); + linkType getLinkType(int numchars, size_t& tgt); + void resize(); }; #endif diff --git a/noncore/apps/opie-reader/CExpander.h b/noncore/apps/opie-reader/CExpander.h index b1147a6..c281398 100644 --- a/noncore/apps/opie-reader/CExpander.h +++ b/noncore/apps/opie-reader/CExpander.h @@ -1,43 +1,124 @@ #ifndef __CExpander_h #define __CExpander_h +#include <unistd.h> +#include <stdio.h> +#include <time.h> +#include <qmessagebox.h> #include "config.h" #include "StyleConsts.h" #include "Markups.h" +#include "name.h" +class QPixmap; class Bkmk; template<class T> class CList; class CCharacterSource { public: virtual void getch(tchar&, CStyle&) = 0; }; class CExpander { + protected: + size_t m_homepos; + bool m_continuous; + char* fname; + bool bSuspended; + size_t suspos; + time_t sustime; public: - CExpander() {}; - virtual ~CExpander() {}; - virtual int openfile(const char *src) = 0; + virtual void suspend() = 0; + virtual void unsuspend() = 0; + size_t getHome() { return m_homepos; } + CExpander() : m_homepos(0), fname(NULL) {}; + 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) { ch = getch(); sty.unset(); } virtual int getch() = 0; virtual bool hyperlink(unsigned int n) { locate(n); return true; } virtual MarkupType PreferredMarkup() = 0; + virtual void saveposn(size_t posn) {} + virtual bool forward(size_t& loc) {} + virtual bool back(size_t& loc) {} + virtual bool hasnavigation() { return false; } + virtual unsigned long startSection() + { + return 0; + } + virtual unsigned long endSection() + { + unsigned long file, text; + sizes(file, text); + return text; + } + virtual QPixmap* getPicture(unsigned long tgt) { return NULL; } + void setContinuous(bool _b) { m_continuous = _b; } + + 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); + } + } + 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"); + } + } }; #endif diff --git a/noncore/apps/opie-reader/CFilter.cpp b/noncore/apps/opie-reader/CFilter.cpp index c17cf61..d5e3116 100644 --- a/noncore/apps/opie-reader/CFilter.cpp +++ b/noncore/apps/opie-reader/CFilter.cpp @@ -471,91 +471,214 @@ void PeanutFormatter::getch(tchar& ch, CStyle& sty) } } } } 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() == CStyle::m_AlignCentre) + if (currentstyle.getJustify() == m_AlignCentre) { currentstyle.setLeftJustify(); } else { currentstyle.setCentreJustify(); } parent->getch(ch, dummy); break; case 'r': - if (currentstyle.getJustify() == CStyle::m_AlignRight) + 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 diff --git a/noncore/apps/opie-reader/CFilter.h b/noncore/apps/opie-reader/CFilter.h index 8cfd7eb..2d0c30f 100644 --- a/noncore/apps/opie-reader/CFilter.h +++ b/noncore/apps/opie-reader/CFilter.h @@ -205,65 +205,83 @@ class dblspce : public CFilter CStyle lsty; public: dblspce() : lastlf(false) {} virtual ~dblspce() {} virtual 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); }; class embolden : public CFilter { public: embolden() {} virtual ~embolden() {} virtual 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); }; class PeanutFormatter : public CFilter { CStyle currentstyle; public: virtual ~PeanutFormatter() {} virtual 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); +}; + +#ifdef REPALM +class repalm : public CFilter +{ + public: + virtual ~repalm() {} + virtual void getch(tchar& ch, CStyle& sty); +}; +#endif #endif diff --git a/noncore/apps/opie-reader/Filedata.h b/noncore/apps/opie-reader/Filedata.h new file mode 100644 index 0000000..f920238 --- a/dev/null +++ b/noncore/apps/opie-reader/Filedata.h @@ -0,0 +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"); + } + else + { + 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 new file mode 100644 index 0000000..f0ed98b --- a/dev/null +++ b/noncore/apps/opie-reader/FontControl.cpp @@ -0,0 +1,37 @@ +#include "opie.h" +#include "FontControl.h" + +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 + 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; + } + return true; +} diff --git a/noncore/apps/opie-reader/FontControl.h b/noncore/apps/opie-reader/FontControl.h index d427680..02049d0 100644 --- a/noncore/apps/opie-reader/FontControl.h +++ b/noncore/apps/opie-reader/FontControl.h @@ -1,121 +1,104 @@ #ifndef __FONTCONTROL_H #define __FONTCONTROL_H #include <qfontdatabase.h> #include <qfontmetrics.h> #include "StyleConsts.h" class FontControl { int * m_fontsizes; int m_size; QString m_fontname; int m_maxsize; + bool m_hasCourier; public: FontControl(QString n = "helvetica", int size = 10) : - m_fontsizes(NULL) + m_fontsizes(NULL), m_hasCourier(false) { ChangeFont(n, size); } ~FontControl() { if (m_fontsizes != NULL) delete [] m_fontsizes; } + void hasCourier(bool _b) { m_hasCourier = _b; } + bool hasCourier() { return m_hasCourier; } QString name() { return m_fontname; } int currentsize() { return m_fontsizes[m_size]; } int getsize(CStyle size) { - return m_fontsizes[m_size+size.getFontSize()]; + 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) { 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) { 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) { 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; } bool increasesize() { if (++m_size >= m_maxsize) { m_size = m_maxsize - 1; return false; } else return true; } bool ChangeFont(QString& n) { return ChangeFont(n, currentsize()); } - bool 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++) - { - m_fontsizes[i] = (*it); - if (abs(tgt-m_fontsizes[i]) < abs(tgt-m_fontsizes[best])) - { - best = i; - } - i++; - } - m_size = best; - } - return true; - } + bool ChangeFont(QString& n, int tgt); }; #endif diff --git a/noncore/apps/opie-reader/GraphicWin.h b/noncore/apps/opie-reader/GraphicWin.h new file mode 100644 index 0000000..31811d2 --- a/dev/null +++ b/noncore/apps/opie-reader/GraphicWin.h @@ -0,0 +1,65 @@ +#ifndef __GRAPHICWIN_H +#define __GRAPHICWIN_H + +#include <qscrollview.h> +#include <qpixmap.h> +#include <qpushbutton.h> +#include <qlayout.h> + +class GraphicScroll : public QScrollView +{ + Q_OBJECT + QWidget* m_picture; + protected: + void hideEvent( QHideEvent * p) + { + m_picture->setFixedSize(1,1); + } + public: + GraphicScroll( QWidget *parent=0, const char *name=0, WFlags f = 0) + : QScrollView(parent, name, f) + { + m_picture = new QWidget(viewport()); + addChild(m_picture); + } + void setPixmap(QPixmap& pm) + { + m_picture->setFixedSize(pm.size()); + m_picture->setBackgroundPixmap(pm); + } +/* + private slots: + void graphicClose() { emit Close(); } + signals: + void Close(); +*/ + +}; + + +class GraphicWin : public QWidget +{ + Q_OBJECT + + GraphicScroll* m_scroll; + signals: + void Closed(); + private slots: + void slotClosed() { emit Closed(); } + + public: + + void setPixmap(QPixmap& pm) { m_scroll->setPixmap(pm); } + GraphicWin( QWidget *parent=0, const char *name=0, WFlags f = 0) + : QWidget(parent, name, f) + { + QVBoxLayout* grid = new QVBoxLayout(this); + m_scroll = new GraphicScroll(this); + QPushButton* exitButton = new QPushButton("Close", this); + connect(exitButton, SIGNAL( released() ), this, SLOT( slotClosed() ) ); + grid->addWidget(m_scroll,1); + grid->addWidget(exitButton); + } +}; + +#endif diff --git a/noncore/apps/opie-reader/Navigation.cpp b/noncore/apps/opie-reader/Navigation.cpp new file mode 100644 index 0000000..7b392ba --- a/dev/null +++ b/noncore/apps/opie-reader/Navigation.cpp @@ -0,0 +1,98 @@ +#include "Navigation.h" + +void CNavigation::saveposn(size_t posn) +{ +// qDebug("Saved:%u [%u,%u,%u]", posn, historystart, historycurrent, historyend); + historycurrent = historyend = (historycurrent+1)%NAVIGATION_HISTORY_SIZE; + 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; + } + else + { + return false; + } +} + +bool CNavigation::back(size_t& loc) +{ + if (historyend != historystart) + { +// 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; + } + else + { + size_t sv = historycurrent; + historycurrent = (historycurrent + NAVIGATION_HISTORY_SIZE - 1) % NAVIGATION_HISTORY_SIZE; + if (historycurrent == historystart) + { + historycurrent = sv; + return false; + } + } + loc = history[historycurrent]; +// qDebug("Back:%u [%u,%u,%u]", loc, historystart, historycurrent, historyend); + return true; + } + else + { + 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 new file mode 100644 index 0000000..57fb006 --- a/dev/null +++ b/noncore/apps/opie-reader/Navigation.h @@ -0,0 +1,16 @@ +#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); + 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 new file mode 100644 index 0000000..ef88cc5 --- a/dev/null +++ b/noncore/apps/opie-reader/Palm2QImage.cpp @@ -0,0 +1,290 @@ +/* -*- mode: c; indent-tabs-mode: nil; -*- */ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> /* for link */ +#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]; + 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; + } + + QImage* qimage = new QImage(width, height, 16); + + /* 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) { + + /* 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; + } + + /* 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 = (inbyte[0] << 8) | inbyte[1]; +#if 0 + qDebug ("pixel is %d,%d (%02x:%02x:%02x)", + j, i, + (inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1), + (inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1), + (inval >> 0) & ((1 << palm_blue_bits) - 1)); +#endif + QRgb colour = qRgb( + (inval >> (bits_per_pixel - palm_red_bits)) & ((1 << palm_red_bits) - 1), + (inval >> palm_blue_bits) & ((1 << palm_green_bits) - 1), + (inval >> 0) & ((1 << palm_blue_bits) - 1)); + qimage->setPixel(j, i, colour); + inbyte += 2; + } + } + } + + delete [] rowbuf; + delete [] lastrow; + + return qimage; +} + +QPixmap* 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)); + return qimage; +} diff --git a/noncore/apps/opie-reader/Palm2QImage.h b/noncore/apps/opie-reader/Palm2QImage.h new file mode 100644 index 0000000..3ac2d19 --- a/dev/null +++ b/noncore/apps/opie-reader/Palm2QImage.h @@ -0,0 +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); diff --git a/noncore/apps/opie-reader/QTReader.cpp b/noncore/apps/opie-reader/QTReader.cpp index 7cf08e5..3995ee7 100644 --- a/noncore/apps/opie-reader/QTReader.cpp +++ b/noncore/apps/opie-reader/QTReader.cpp @@ -1,1109 +1,1327 @@ /**************************************************************************** ** $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 <qpainter.h> #include "config.h" #include "QTReader.h" #include "QTReaderApp.h" #include "CDrawBuffer.h" #include <qpe/qpeapplication.h> #include <math.h> #include <ctype.h> #include <stdio.h> //for sprintf #include <qpe/config.h> #include <qpe/applnk.h> #include <qfontdatabase.h> #include <qpe/global.h> #include <qpe/qcopenvelope_qws.h> +#include "StateData.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}; -QTReader::QTReader( QWidget *parent, const char *name, WFlags f) : +QTReader::QTReader( QWidget *parent=0, const char *name=0, WFlags f = 0) : 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) + m_touchone(true), + bDoUpdates(false), + m_navkeys(true) { m_overlap = 1; // init(); } /* 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)"); load_file((const tchar*)filename); } */ long QTReader::real_delay() { return ( 8976 + m_delay ) / ( m_linespacing * m_linespacing ); } void QTReader::mousePressEvent( QMouseEvent* _e ) { + buffdoc.unsuspend(); if (_e->button() == RightButton) { mouseUpOn = false; + 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); + } + } + else if (_e->x() > (2*width())/3) + { + size_t target = pagelocate(); + if (buffdoc.forward(target)) + { + locate(target); + } + } + else + { + buffdoc.saveposn(pagelocate()); + locate(buffdoc.getHome()); + } + } + } + else + { if (_e->y() > height()/2) { goDown(); } else { goUp(); } } } +} -bool QTReader::getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt) +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; } else { int i; CDrawBuffer* t = textarray[lineno]; - for (i = t->length(); t->width(i) > x; i--); + x = x - t->offset(width()); + for (i = t->length(); i >= 0 && t->width(i) > x; i--); offset = i; } - return textarray[lineno]->isLink(offset, tgt); + return textarray[lineno]->getLinkType(offset, tgt); } 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; - if (getcurrentpos(_e->x(), _e->y(), 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 + { + locate(pagelocate()); + } + return; + } + case eNone: + break; + default: + qDebug("Unknown linktype"); + return; + } 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; 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()); while (1) { int i = first+1; while (QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; - if (t->width(i) > _e->x()) + if (t->width(i) > tgt) { wrd = toQString(t->data()+first, i - first); break; } while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++; if ((*t)[i] == 0) break; first = i; } } if (!wrd.isEmpty()) { emit OnWordSelected(wrd, locnarray[lineno], (m_twotouch) ? wrd : toQString(textarray[lineno]->data())); } } } 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; } } #include <qapplication.h> #include <qdrawutil.h> #include <unistd.h> 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::keyPressEvent(QKeyEvent* e) { + buffdoc.unsuspend(); 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_fontControl.increasesize()) + if (m_navkeys && buffdoc.hasnavigation()) { - bool sc = m_autoScroll; - setfont(); - m_autoScroll = false; - locate(pagelocate()); - update(); - m_autoScroll = sc; - if (m_autoScroll) autoscroll(); + size_t target = pagelocate(); + if (buffdoc.forward(target)) + { + locate(target); } } + else zoomin(); + } break; case Key_Left: { e->accept(); - if (m_fontControl.decreasesize()) + if (m_navkeys && buffdoc.hasnavigation()) { - bool sc = m_autoScroll; - m_autoScroll = false; - setfont(); - locate(pagelocate()); - update(); - m_autoScroll = sc; - if (m_autoScroll) autoscroll(); + 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; QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable; } else { + CDrawBuffer* reusebuffer = textarray[numlines]; + if (reusebuffer == NULL || reusebuffer->eof()) return; m_autoScroll = true; autoscroll(); QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed } } bool QTReader::getline(CDrawBuffer *buff) { + buffdoc.unsuspend(); if (m_bMonoSpaced) { return buffdoc.getline(buff ,width(), m_charWidth); } else { return buffdoc.getline(buff, width()); } } 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()) { 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; + textarray[numlines] = new CDrawBuffer(&m_fontControl); } locnarray[numlines] = locate(); int ch = getline(textarray[numlines]); - textarray[numlines-1]->render(&p, height() - textarray[numlines]->descent() - 2, m_bMonoSpaced, m_charWidth, width()); + textarray[numlines-1]->render(&p, height() - textarray[numlines-1]->descent() - 2, m_bMonoSpaced, m_charWidth, width()); mylastpos = locate(); if (!ch) { m_autoScroll = false; ((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll); - emit OnRedraw(); } 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..."); + if (buffdoc.empty()) return; setfont(); - if (m_lastwidth != width() || m_lastheight != height()) + if (m_lastwidth != width()) { + qDebug("Not Optimised %d", m_lastwidth); m_lastwidth = width(); m_lastheight = height(); locate(pagelocate()); + qDebug("Not Optimised %d", m_lastwidth); } else { - -/* - int sl = screenlines(); - if (sl < numlines) + if (m_lastheight > height()) { -// qDebug("df:<%u,%u>",sl,numlines); - - size_t newpos = locnarray[sl]; - CDrawBuffer** nta = new CDrawBuffer*[sl]; - size_t* nla = new size_t[sl]; - for (int i = 0; i < sl; i++) + qDebug("Optimised < %d", numlines); + int ypos = 0; + for (int i = 0; i < numlines; i++) + { + if ((ypos += textarray[i]->lineSpacing()) > height()) { - nta[i] = textarray[i]; - nla[i] = locnarray[i]; + numlines = i; + jumpto(locnarray[i+1]); + break; } - for (int i = sl; i < numlines; i++) delete textarray[i]; - delete [] locnarray; - delete [] textarray; - textarray = nta; - locnarray = nla; - numlines = sl; - jumpto(mylastpos = newpos); } - if (sl > numlines) - { -// qDebug("df:<%u,%u>",sl,numlines); - CDrawBuffer** nta = new CDrawBuffer*[sl]; - size_t* nla = new size_t[sl]; - for (int i = 0; i < numlines; i++) - { - nta[i] = textarray[i]; - nla[i] = locnarray[i]; + qDebug("Optimised < %d", numlines); + m_lastheight = height(); } - if (locate() != mylastpos) jumpto(mylastpos); - for (int i = numlines; i < sl; i++) + else if (m_lastheight < height()) { - nta[i] = new CDrawBuffer(&m_fontControl); - nla[i] = locate(); - getline(nta[i]); + qDebug("Optimised > %d", numlines); + int ypos = 0; + for (int i = 0; i <= numlines; i++) + { + ypos += textarray[i]->lineSpacing(); } - mylastpos = locate(); - delete [] locnarray; - delete [] textarray; - textarray = nta; - locnarray = nla; - numlines = sl; + fillbuffer(numlines+1, ypos); + qDebug("Optimised > %d", numlines); + m_lastheight = height(); } -*/ if (numlines > 0) { int ypos = textarray[0]->ascent(); textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width()); for (int i = 1; i < numlines; i++) { - ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2; +// 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()); - } // mylastpos = locate(); } } m_scrolldy1 = m_scrolldy2 = 0; 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() { // 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); - m_lastwidth = width(); - m_lastheight = height(); setfont(); +/* if (!m_lastfile.isEmpty()) { m_string = DocLnk(m_lastfile).name(); load_file(m_lastfile); } +*/ } // // Clean up // QTReader::~QTReader() { } // // 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()); // 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"); fillbuffer(); // qDebug("&Buffer filled"); update(); // 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) { + buffdoc.unsuspend(); if (buffdoc.empty()) return false; m_scrolldy1 = m_scrolldy2 = 0; int ch; bool ret = false; unsigned int oldpagepos = locnarray[reuse]; int ypos = ht; numlines = reuse; - while (ypos < height()) + while (ypos < height() || numlines < 2) { 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[0] == buffdoc.locate()*/) + if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/) { locate(oldpagepos); return false; } else { --numlines; mylastpos = locate(); return true; } } } --numlines; mylastpos = locate(); return true; } void QTReader::dopagedn() { + buffdoc.unsuspend(); int skip = 0, ypos = 0; if (locate() != 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]); +} + +void QTReader::dopageup(unsigned int target) +{ + buffdoc.unsuspend(); CBufferFace<CDrawBuffer*> buff; CBufferFace<size_t> loc; - unsigned int target = locnarray[(m_overlap < numlines) ? m_overlap : numlines/2]; - size_t delta; - if (target < 2048) + size_t delta, guess = 2048; + bool ch = true; + int nbfl, ypos = 0; + + while (1) { - delta = target; - jumpto(0); + 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 = 2048; + delta = guess; jumpto(target - delta); buff[0] = new CDrawBuffer(&m_fontControl); do { if (!getline(buff[0])) break; - if (locate() > target) continue; + if (locate() > target) break; } while (!buffdoc.iseol()); } - int nbfl = 0; - bool ch = true; - int ypos = 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()) + if (ypos < height() && (delta != 0)) { - locate(0); - return; + 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-2) + while (ypos < height() && numlines <= nbfl-1) { - ypos += buff[nbfl - numlines - 2]->lineSpacing(); + ypos += buff[nbfl - numlines - 1]->lineSpacing(); numlines++; } --numlines; - int offset = nbfl; - offset -= 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(); } for (int i = 0; i < nbfl - numlines - 1; i++) { delete buff[i]; } -// --numlines; + 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) { bRC = true; + buffdoc.setContinuous(m_continuousDocument); // qDebug("buffdoc.openfile done"); locate(lcn); // qDebug("buffdoc.locate done"); } setfilter(getfilter()); update(); // 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; for (int i = offset; i <= numlines; i++) { 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; for (int i = 0; i <= numlines; i++) { 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 78230b4..3d5f57d 100644 --- a/noncore/apps/opie-reader/QTReader.h +++ b/noncore/apps/opie-reader/QTReader.h @@ -1,272 +1,312 @@ #ifndef __QTREADER_H #define __QTREADER_H #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 friend class QTReaderApp; + void suspend() { buffdoc.suspend(); } void drawText(QPainter& p, int x, int y, tchar* text); int m_delay; unsigned int m_overlap; bool m_autoScroll; void autoscroll(); QTimer* timer; int m_scrolldy1, m_scrolldy2, m_encd; void focusInEvent(QFocusEvent*); void focusOutEvent(QFocusEvent*); bool ChangeFont(int); bool getline(CDrawBuffer*); int m_charWidth; int m_charpc; FontControl m_fontControl; 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) { bremap = _b; setfilter(getfilter()); } void setmakebold(bool _b) { bmakebold = _b; setfilter(getfilter()); } void setautofmt(bool _b) { bautofmt = _b; if (bautofmt) { btextfmt = false; bstriphtml = false;; bpeanut = false; } setfilter(getfilter()); } void settextfmt(bool _b) { 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()); } 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() { switch (m_encd) { case 5: return new Ccp1252; case 4: return new CPalm; case 1: return new CUtf8; case 2: return new CUcs16be; case 3: return new CUcs16le; case 0: default: return new CAscii; } } 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 (bmakebold) filt->addfilter(new embolden); return filt; } private slots: 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; - bool getcurrentpos(int x, int y, size_t& start, size_t& offset, size_t& tgt); + 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; - bool m_bpagemode, m_bMonoSpaced; + bool bstripcr, btextfmt, bstriphtml, bdehyphen, bunindent, brepara, bdblspce, btight, bmakebold, bremap, bpeanut, bautofmt, bonespace; +#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(); } 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.locate(n); } - unsigned long locate() { return buffdoc.locate(); } - unsigned long explocate() { return buffdoc.explocate(); } + 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.setfilter(f); locate(pagelocate()); } + 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); unsigned int screenlines(); - void sizes(unsigned long& fs, unsigned long& ts) { buffdoc.sizes(fs,ts); } + 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&); }; #endif diff --git a/noncore/apps/opie-reader/QTReaderApp.cpp b/noncore/apps/opie-reader/QTReaderApp.cpp index 8726df7..2044b1d 100644 --- a/noncore/apps/opie-reader/QTReaderApp.cpp +++ b/noncore/apps/opie-reader/QTReaderApp.cpp @@ -1,506 +1,586 @@ /********************************************************************** ** 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. ** **********************************************************************/ #include <qclipboard.h> #include <qwidgetstack.h> #include <qpe/qpemenubar.h> -#include <qpe/qpetoolbar.h> +//#include <qpe/qpetoolbar.h> +#include <qmenubar.h> +#include <qtoolbar.h> +#include <qpe/menubutton.h> #include <qpe/fontdatabase.h> #include <qcombobox.h> #include <qpopupmenu.h> #include <qaction.h> #include <qapplication.h> #include <qlineedit.h> #include <qtoolbutton.h> #include <qspinbox.h> #include <qobjectlist.h> #include <qpe/global.h> #include <qpe/applnk.h> #include <qfileinfo.h> #include <stdlib.h> //getenv #include <qprogressbar.h> #include <qpe/config.h> #include <qbuttongroup.h> #include <qradiobutton.h> #include <qpe/qcopenvelope_qws.h> #include "QTReader.h" +#include "GraphicWin.h" #include "Bkmks.h" #include "cbkmkselector.h" #include "infowin.h" #include "CAnnoEdit.h" #include "QFloatBar.h" //#include <qpe/fontdatabase.h> #include <qpe/resource.h> #include <qpe/qpeapplication.h> #include "QTReaderApp.h" #include "fileBrowser.h" #include "CDrawBuffer.h" +#include "Filedata.h" +#include "opie.h" +#include "name.h" +#include "StateData.h" + +#ifdef OPIE +#define PICDIR "opie-reader/" +#else +#define PICDIR +#endif unsigned long QTReaderApp::m_uid = 0; void QTReaderApp::setScrollState(bool _b) { m_scrollButton->setOn(_b); } #include <unistd.h> #include <stddef.h> #include <dirent.h> void QTReaderApp::listBkmkFiles() { bkmkselector->clear(); + bkmkselector->setText("Cancel"); int cnt = 0; DIR *d; - d = opendir((const char *)Global::applicationFileName("uqtreader","")); + 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("uqtreader",de->d_name),&buf) == 0 && S_ISREG(buf.st_mode)) + 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); if (cnt > 0) { //tjw menu->hide(); editBar->hide(); if (m_fontVisible) m_fontBar->hide(); - if (regVisible) regBar->hide(); - if (searchVisible) searchBar->hide(); + if (regVisible) + { + Global::hideInputMethod(); + regBar->hide(); + } + if (searchVisible) + { + Global::hideInputMethod(); + searchBar->hide(); + } m_nRegAction = cRmBkmkFile; editorStack->raiseWidget( bkmkselector ); } else - QMessageBox::information(this, "OpieReader", "No bookmark files"); + 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")); pBkmklist = NULL; - doc = 0; + pOpenlist = NULL; +// doc = 0; m_fBkmksChanged = false; QString lang = getenv( "LANG" ); m_autogenstr = "^ *[A-Z].*[a-z] *$"; setToolBarsMovable( FALSE ); - setIcon( Resource::loadPixmap( "opie-reader/uqtreader" ) ); + setIcon( Resource::loadPixmap( "uqtreader" ) ); - QPEToolBar *bar = new QPEToolBar( this ); +// 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 ); // bar = new QToolBar( this ); editBar = bar; /* 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"); + readfilelist(); reader = new QTReader( editorStack ); + reader->bDoUpdates = false; + ((QPEApplication*)qApp)->setStylusOperation(reader, QPEApplication::RightOnHold); - Config config( "uqtreader" ); + qDebug("Reading config"); + Config config( APPDIR ); config.setGroup( "View" ); reader->bstripcr = config.readBoolEntry( "StripCr", true ); 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->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_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 ); +#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 ); 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); + connect( reader, SIGNAL( OnShowPicture(QPixmap&) ), this, SLOT( showgraphic(QPixmap&) ) ); + 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&) ) ); 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 ); + 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 ); + /* a = new QAction( tr( "Revert" ), Resource::loadPixmap( "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 ); connect( a, SIGNAL( activated() ), this, SLOT( editCut() ) ); a->addTo( editBar ); 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_buttonAction[2] = new QAction( tr( "Mark" ), QString::null, 0, ag, NULL, true ); + m_buttonAction[3] = new QAction( tr( "Fullscreen" ), QString::null, 0, ag, NULL, true ); + ag->addTo(spacemenu); connect(ag, SIGNAL( selected(QAction*) ), this, SLOT( buttonActionSelected(QAction*) ) ); + file->insertSeparator(); + + ag = new QActionGroup(this); + ag->setExclusive(false); + QPopupMenu *encoding = new QPopupMenu(this); + file->insertItem( tr( "Navigation" ), encoding ); + + a = m_scrollButton = new QAction( tr( "Scroll" ), Resource::loadPixmap( PICDIR "panel-arrow-down" ), QString::null, 0, ag, 0, true ); - a = m_scrollButton = new QAction( tr( "Scroll" ), Resource::loadPixmap( "opie-reader/panel-arrow-down" ), QString::null, 0, this, 0, true ); -// connect( a, SIGNAL( activated() ), this, SLOT( autoScroll() ) ); a->setOn(false); connect( a, SIGNAL( toggled(bool) ), this, SLOT( autoScroll(bool) ) ); - file->insertSeparator(); a->addTo( bar ); - a->addTo( file ); + + a = new QAction( tr( "Jump" ), QString::null, 0, ag, NULL); + connect( a, SIGNAL( activated() ), this, SLOT( jump() ) ); + + 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); + + a = new QAction( tr( "Set Overlap" ), QString::null, 0, ag, NULL); + connect( a, SIGNAL( activated() ), this, SLOT( setoverlap() ) ); + + 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); + + ag->addTo(encoding); /* 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 ); */ - a = new QAction( tr( "Jump" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( jump() ) ); - a->addTo( file ); - - a = new QAction( tr( "Page/Line Scroll" ), QString::null, 0, this, NULL, true ); - connect( a, SIGNAL( toggled(bool) ), this, SLOT( pagemode(bool) ) ); - a->setOn(reader->m_bpagemode); - a->addTo( file ); - - a = new QAction( tr( "Set Overlap" ), QString::null, 0, this, NULL); - connect( a, SIGNAL( activated() ), this, SLOT( setoverlap() ) ); - 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 ); 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 ); ag = new QActionGroup(this); ag->setExclusive(false); - QPopupMenu *encoding = new QPopupMenu(this); + 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); 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( "Clipboard" ), QString::null, 0, ag, NULL, true ); connect( a, SIGNAL( toggled(bool) ), this, SLOT( OnClipboard(bool) ) ); a->setOn(m_doClipboard); ag->addTo(encoding); /* 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 ); connect( a, SIGNAL( activated() ), this, SLOT( editPaste() ) ); a->addTo( editBar ); 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 ); + 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 ); + + 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 ); + 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_bkmkAvail->setEnabled(false); ag = new QActionGroup(this); // ag->setExclusive(false); encoding = new QPopupMenu(this); format->insertItem( tr( "Markup" ), encoding ); a = new QAction( tr( "Auto" ), QString::null, 0, ag, NULL, true ); a->setOn(reader->bautofmt); connect( a, SIGNAL( toggled(bool) ), this, SLOT( autofmt(bool) ) ); 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); 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 ); - a = new QAction( tr( "Zoom" ), QString::null, 0, this); - connect( a, SIGNAL( activated() ), this, SLOT( TBDzoom() ) ); 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 = 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); - format->insertSeparator(); a->addTo( format ); 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 = new QAction( tr( "Mark" ), QString::null, 0, this, NULL); connect( a, SIGNAL( activated() ), this, SLOT( addbkmk() ) ); a->addTo( marks ); a = new QAction( tr( "Annotate" ), QString::null, 0, this, NULL); connect( a, SIGNAL( activated() ), this, SLOT( addanno() ) ); a->addTo( marks ); a = new QAction( tr( "Goto" ), QString::null, 0, this, NULL, false ); connect( a, SIGNAL( activated() ), this, SLOT( do_gotomark() ) ); a->addTo( marks ); a = new QAction( tr( "Delete" ), QString::null, 0, this, NULL); connect( a, SIGNAL( activated() ), this, SLOT( do_delmark() ) ); a->addTo( marks ); a = new QAction( tr( "Autogen" ), QString::null, 0, this, NULL, false ); connect( a, SIGNAL( activated() ), this, SLOT( do_autogen() ) ); marks->insertSeparator(); a->addTo( marks ); a = new QAction( tr( "Clear" ), QString::null, 0, this, NULL); connect( a, SIGNAL( activated() ), this, SLOT( clearBkmkList() ) ); a->addTo( marks ); a = new QAction( tr( "Save" ), QString::null, 0, this, NULL ); connect( a, SIGNAL( activated() ), this, SLOT( savebkmks() ) ); a->addTo( marks ); @@ -518,1512 +598,2009 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f ) connect( a, SIGNAL( activated() ), this, SLOT( editCopy() ) ); a->addTo( marks ); mb->insertItem( tr( "File" ), file ); // mb->insertItem( tr( "Edit" ), edit ); mb->insertItem( tr( "Format" ), format ); mb->insertItem( tr( "Marks" ), marks ); 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 ); connect( a, SIGNAL( activated() ), this, SLOT( findNext() ) ); a->addTo( searchBar ); a = new QAction( tr( "Close Find" ), Resource::loadPixmap( "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 ); 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 ); 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"); m_fontSelector = new QComboBox(false, m_fontBar); m_fontBar->setStretchableWidget( m_fontSelector ); { FontDatabase f; 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; - break; } + if (*nm == "courier") reader->m_fontControl.hasCourier(true); } if (!realfont) reader->m_fontname = flist[0]; } // delete the FontDatabase!!! connect( m_fontSelector, SIGNAL( activated(const QString& ) ), this, SLOT( do_setfont(const QString&) ) ); m_fontBar->hide(); m_fontVisible = false; connect(qApp, SIGNAL( appMessage(const QCString&, const QByteArray& ) ), this, SLOT( msgHandler(const QCString&, const QByteArray&) ) ); - + qDebug("Initing"); reader->init(); + qDebug("Inited"); + m_EncodingAction[reader->m_encd]->setOn(true); + m_buttonAction[m_spaceTarget]->setOn(true); + qDebug("fonting"); + do_setfont(reader->m_fontname); if (!reader->m_lastfile.isEmpty()) { + qDebug("doclnk"); +// doc = new DocLnk(reader->m_lastfile); + 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())); + p = NULL; + } + if (p != NULL) + { + qDebug("openfrombkmk"); + openfrombkmk(p); + } + else + { + qDebug("openfile"); openFile( reader->m_lastfile ); - doc = new DocLnk(reader->m_lastfile); } - m_EncodingAction[reader->m_encd]->setOn(true); - m_buttonAction[m_spaceTarget]->setOn(true); - do_setfont(reader->m_fontname); } + else + { + qDebug("Openfile 2"); + if (!reader->m_lastfile.isNull()) + openFile( reader->m_lastfile ); + } + } + qApp->processEvents(); + reader->bDoUpdates = true; + reader->update(); + qDebug("finished update"); +} + +void QTReaderApp::suspend() { reader->suspend(); } void QTReaderApp::msgHandler(const QCString& _msg, const QByteArray& _data) { QString msg = QString::fromUtf8(_msg); // qDebug("Received:%s", (const char*)msg); QDataStream stream( _data, IO_ReadOnly ); if ( msg == "info(QString)" ) { QString info; stream >> info; - QMessageBox::information(this, "OpieReader", info); + QMessageBox::information(this, PROGNAME, info); } else if ( msg == "warn(QString)" ) { QString info; stream >> info; - QMessageBox::warning(this, "OpieReader", 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 == "File/Open(QString)" ) { QString info; stream >> info; openFile( info ); } else if ( msg == "File/Info()" ) { showinfo(); } else if ( msg == "File/Start Block()" ) { editMark(); } else if ( msg == "File/Copy Block()" ) { editCopy(); } else if ( msg == "File/Scroll(int)" ) { int info; stream >> info; autoScroll(info); } else if ( msg == "File/Jump(int)" ) { int info; stream >> info; reader->locate(info); } else if ( msg == "File/Page/Line Scroll(int)" ) { int info; stream >> info; pagemode(info); } else if ( msg == "File/Set Overlap(int)" ) { int info; stream >> info; reader->m_overlap = info; } else if ( msg == "File/Set Dictionary(QString)" ) { QString info; stream >> info; do_settarget(info); } 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()); while (arg.match(toQString(test.data())) == -1) { pos = reader->locate(); if (!reader->buffdoc.getline(&test,reader->width())) { - QMessageBox::information(this, "OpieReader", QString("Can't find\n")+info); + QMessageBox::information(this, PROGNAME, QString("Can't find\n")+info); pos = start; break; } } reader->locate(pos); } else if ( msg == "Layout/Strip CR(int)" ) { int info; stream >> info; stripcr(info); } + else if ( msg == "Layout/Single Space" ) + { + int info; + stream >> info; + onespace(info); + } +#ifdef REPALM + else if ( msg == "Layout/Repalm(int)" ) + { + int info; + stream >> info; + repalm(info); + } +#endif else if ( msg == "Markup/Auto(int)" ) { int info; stream >> info; autofmt(info); } else if ( msg == "Markup/Text(int)" ) { int info; stream >> info; textfmt(info); } else if ( msg == "Markup/HTML(int)" ) { int info; stream >> info; striphtml(info); } else if ( msg == "Markup/Peanut(int)" ) { int info; stream >> info; peanut(info); } else if ( msg == "Layout/Dehyphen(int)" ) { int info; stream >> info; dehyphen(info); } 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)" ) { 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); } } 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(); + 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())); m_spaceTarget = ActNameToInt(_a->text()); } QTReaderApp::~QTReaderApp() { } void QTReaderApp::autoScroll(bool _b) { reader->setautoscroll(_b); + setScrollState(reader->m_autoScroll); } -void QTReaderApp::TBD() +void QTReaderApp::zoomin() { - QMessageBox::information(this, "OpieReader", "Not yet implemented", 1); + reader->zoomin(); } -void QTReaderApp::TBDzoom() +void QTReaderApp::zoomout() { - QMessageBox::information(this, "OpieReader", "Zooming is done interactively\nTry left/right cursor keys", 1); + reader->zoomout(); } void QTReaderApp::clearBkmkList() { delete pBkmklist; pBkmklist = NULL; m_fBkmksChanged = false; } +void QTReaderApp::fileClose() +{ + 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 )) + { + case 0: + default: + break; + case 2: + unlink((const char*)reader->m_lastfile); + case 1: + unlink((const char *)Global::applicationFileName(APPDIR, reader->m_string)); + } + } + + fileOpen2(); +} + +void QTReaderApp::updatefileinfo() +{ + if (reader->m_string.isNull()) return; + if (reader->m_lastfile.isNull()) return; + tchar* nm = fromQString(reader->m_string); + tchar* fl = fromQString(reader->m_lastfile); + 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); +// getstate(data, dlen); + iter->setAnno(data, dlen); + notadded = false; + delete [] data; + break; + } + } + } + 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); + delete [] data; + } + delete [] nm; + delete [] fl; +} + void QTReaderApp::fileOpen() { /* menu->hide(); editBar->hide(); if (regVisible) regBar->hide(); if (searchVisible) searchBar->hide(); */ + qDebug("fileOpen"); +// if (!reader->m_lastfile.isEmpty()) + updatefileinfo(); + fileOpen2(); +} + +void QTReaderApp::fileOpen2() +{ if (pBkmklist != NULL) { if (m_fBkmksChanged) { - if (QMessageBox::warning(this, "OpieReader", "Save bookmarks?", "Save", "Don't bother") == 0) + 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(); */ - fileBrowser* fb = new fileBrowser(this,"OpieReader",TRUE, + if (pOpenlist != NULL) + { + m_nRegAction = cOpenFile; + listbkmk(pOpenlist, "Browse"); + } + else + { + QString fn = usefilebrowser(); + if (!fn.isEmpty() && QFileInfo(fn).isFile()) + { + openFile(fn); + } + reader->setFocus(); + } +} + +QString QTReaderApp::usefilebrowser() +{ + fileBrowser* fb = new fileBrowser(this,"QTReader",TRUE, 0, // WStyle_Customize | WStyle_NoBorderEx, "*", QFileInfo(reader->m_lastfile).dirPath(true)); + + QString fn; if (fb->exec()) { - QString fn(fb->fileList[0]); -// fb->populateList(); - if (!fn.isEmpty() && QFileInfo(fn).isFile()) openFile(fn); + fn = fb->fileList[0]; } + qDebug("Selected %s", (const char*)fn); delete fb; - reader->setFocus(); + return fn; +} + +void QTReaderApp::showgraphic(QPixmap& pm) +{ + m_graphicwin->setPixmap(pm); + editorStack->raiseWidget( m_graphicwin ); + m_graphicwin->setFocus(); } void QTReaderApp::showinfo() { unsigned long fs, ts, pl; if (reader->empty()) { - QMessageBox::information(this, "OpieReader", "No file loaded", 1); + 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, "OpieReader", "Need a name for the bookmark\nPlease try again", 1); + 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, "OpieReader", "No file loaded", 1); + 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 ); + Global::showInputMethod(); 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(); reader->jumpto(m_savedpos); while (reader->explocate() < endpos && (ch = reader->getch()) != UEOF) { text += ch; } cb->setText(text); reader->locate(currentpos); } void QTReaderApp::pageup() { - reader->goUp(); + reader->NavUp(); } void QTReaderApp::pagedn() { - reader->goDown(); + reader->NavDown(); } 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) { reader->setrepara(_b); } void QTReaderApp::dblspce(bool _b) { reader->setdblspce(_b); } 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, "OpieReader", "Must be a number"); + 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, "OpieReader", "Must be a number"); + 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 + Global::showInputMethod(); searchBar->show(); searchVisible = TRUE; searchEdit->setFocus(); #ifdef __ISEARCH searchStack->push(new searchrecord("",reader->pagelocate())); #endif } void QTReaderApp::findNext() { // 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()); dosearch(start, test, arg); } void QTReaderApp::findClose() { searchVisible = FALSE; searchEdit->setText(""); + Global::hideInputMethod(); 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(); + Global::hideInputMethod(); 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->show(); + pbar->resize(width(), editBar->height()); + pbar->reset(); + int lastpc = (100*pos)/ts; + pbar->setProgress(lastpc); + qApp->processEvents(); + reader->setFocus(); #ifdef __ISEARCH while (strstr(test.data(),(const tchar*)arg) == NULL) #else #ifdef _UNICODE while (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 (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 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 ) { - openFile(DocLnk(f)); -} - -void QTReaderApp::openFile( const DocLnk &f ) -{ + qDebug("File:%s", (const char*)f); +// openFile(DocLnk(f)); +//} +// +//void QTReaderApp::openFile( const DocLnk &f ) +//{ clear(); - FileManager fm; - if ( fm.exists( f ) ) + QFileInfo fm(f); + if ( fm.exists() ) { // QMessageBox::information(0, "Progress", "Calling fileNew()"); - clear(); - - // editorStack->raiseWidget( reader ); - - // reader->setFocus(); + if (fm.extension( FALSE ) == "desktop") + { + DocLnk d(f); + QFileInfo fnew(d.file()); + fm = fnew; + if (!fm.exists()) return; + } - // QMessageBox::information(0, "DocLnk", "Begin"); - doc = new DocLnk(f); - // QMessageBox::information(0, "DocLnk done", doc->file()); - // QMessageBox::information(0, "Progress", "Calling setText()"); - // QMessageBox::information(0, "Progress", "Textset"); + clear(); - // updateCaption(); + reader->setText(fm.baseName(), fm.absFilePath()); showEditTools(); - reader->setText(doc->name(), doc->file()); readbkmks(); } else { - QMessageBox::information(this, "OpieReader", "File does not exist"); + QMessageBox::information(this, PROGNAME, "File does not exist"); } } +/* +void QTReaderApp::resizeEvent(QResizeEvent* e) +{ + if (m_fullscreen) + { + showNormal(); + showFullScreen(); + } +} +*/ +void QTReaderApp::keyPressEvent(QKeyEvent* e) +{ + if (m_fullscreen) + { + switch(e->key()) + { + case Key_Escape: + m_actFullscreen->setOn(false); + if (m_fullscreen) + { + qDebug("Fullscreen already set - remove this!"); + } + else + { + m_fullscreen = false; + reader->bDoUpdates = false; + showEditTools(); + qApp->processEvents(); + reader->bDoUpdates = true; + reader->update(); + } + e->accept(); + break; + default: + e->ignore(); + } + } + else + { + e->ignore(); + } +} void QTReaderApp::showEditTools() { - if ( !doc ) - close(); -// fileSelector->hide(); -//tjw menu->show(); +// if ( !doc ) +// close(); + if (m_fullscreen) + { + editBar->hide(); + searchBar->hide(); + regBar->hide(); + Global::hideInputMethod(); + m_fontBar->hide(); +// showNormal(); + showFullScreen(); + } + else + { + qDebug("him"); + Global::hideInputMethod(); + qDebug("eb"); editBar->show(); if ( searchVisible ) + { + Global::showInputMethod(); searchBar->show(); + } if ( regVisible ) + { + Global::showInputMethod(); regBar->show(); + } if (m_fontVisible) m_fontBar->show(); + qDebug("sn"); + showNormal(); + qDebug("sm"); + showMaximized(); +// setCentralWidget(reader); + } + qDebug("uc"); updateCaption(); + qDebug("rw"); editorStack->raiseWidget( reader ); + qDebug("sf"); reader->setFocus(); } /* 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, "QTReader", "Deleting doc", 1); - delete doc; -// QMessageBox::information(this, "QTReader", "Deleted doc", 1); - doc = 0; - } +// 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("OpieReader") ); - else { - QString s = doc->name(); - if ( s.isEmpty() ) - s = tr( "Unnamed" ); - setCaption( s + " - " + tr("OpieReader") ); - } +// 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(DocLnk(fileref)); + openFile(fileref); // showEditTools(); } void QTReaderApp::closeEvent( QCloseEvent *e ) { - if (m_dontSave) + if (m_fullscreen) + { + m_fullscreen = false; + showEditTools(); + e->accept(); + } + else if (m_dontSave) { e->accept(); } else { if (editorStack->visibleWidget() == reader) { if (m_fontVisible) { m_fontBar->hide(); m_fontVisible = false; } if (regVisible) { regBar->hide(); + Global::hideInputMethod(); regVisible = false; return; } if (searchVisible) { searchBar->hide(); + Global::hideInputMethod(); searchVisible = false; return; } if (m_fBkmksChanged && pBkmklist != NULL) { - if (QMessageBox::warning(this, "OpieReader", "Save bookmarks?", "Save", "Don't bother") == 0) + 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(); } } } void QTReaderApp::do_gotomark() { m_nRegAction = cGotoBkmk; - listbkmk(); + listbkmk(pBkmklist); } void QTReaderApp::do_delmark() { m_nRegAction = cDelBkmk; - listbkmk(); + listbkmk(pBkmklist); } -void QTReaderApp::listbkmk() +void QTReaderApp::listbkmk(CList<Bkmk>* plist, const QString& _lab) { bkmkselector->clear(); + if (_lab.isNull()) + bkmkselector->setText("Cancel"); + else + bkmkselector->setText(_lab); int cnt = 0; - if (pBkmklist != NULL) + if (plist != NULL) { - for (CList<Bkmk>::iterator i = pBkmklist->begin(); i != pBkmklist->end(); i++) + for (CList<Bkmk>::iterator i = plist->begin(); i != plist->end(); i++) { #ifdef _UNICODE + 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) regBar->hide(); - if (searchVisible) searchBar->hide(); + if (regVisible) + { + Global::hideInputMethod(); + regBar->hide(); + } + if (searchVisible) + { + Global::hideInputMethod(); + searchBar->hide(); + } editorStack->raiseWidget( bkmkselector ); } else - QMessageBox::information(this, "OpieReader", "No bookmarks in memory"); + QMessageBox::information(this, PROGNAME, "No bookmarks in memory"); } void QTReaderApp::do_autogen() { m_nRegAction = cAutoGen; regEdit->setText(m_autogenstr); do_regedit(); } void QTReaderApp::do_regedit() { // editBar->hide(); + reader->bDoUpdates = false; + qDebug("Showing regbar"); regBar->show(); + qDebug("Showing kbd"); + Global::showInputMethod(); regVisible = true; regEdit->setFocus(); + qApp->processEvents(); + reader->bDoUpdates = true; + reader->update(); +} + +bool QTReaderApp::openfrombkmk(Bkmk* bk) +{ + QString fn = toQString( + CFiledata(bk->anno()).name() + ); + qDebug("fileinfo"); + if (!fn.isEmpty() && QFileInfo(fn).isFile()) + { + 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"); + reader->locate(bk->value()); + } + return true; + } + else + { + return false; + } } void QTReaderApp::gotobkmk(int ind) { switch (m_nRegAction) { + case cOpenFile: + { + 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()); pBkmklist->erase(ind); m_fBkmksChanged = true; // pBkmklist->sort(); break; case cRmBkmkFile: - unlink((const char *)Global::applicationFileName("uqtreader",bkmkselector->text(ind))); + unlink((const char *)Global::applicationFileName(APPDIR,bkmkselector->text(ind))); break; } showEditTools(); } void QTReaderApp::cancelbkmk() { + if (m_nRegAction == 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, "OpieReader", "Must be a number"); + QMessageBox::information(this, PROGNAME, "Must be a number"); } void QTReaderApp::do_regaction() { + reader->bDoUpdates = false; regBar->hide(); + Global::hideInputMethod(); 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; } reader->restore(); // editBar->show(); reader->setFocus(); + 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, "OpieReader", "Format is\nappname/messagename"); + QMessageBox::information(this, PROGNAME, "Format is\nappname/messagename"); } else { m_targetapp = _txt.left(ind); m_targetmsg = _txt.right(_txt.length()-ind-1); } } void QTReaderApp::setfont() { for (int i = 1; i <= m_fontSelector->count(); i++) { if (m_fontSelector->text(i) == reader->m_fontname) { m_fontSelector->setCurrentItem(i); break; } } m_fontBar->show(); m_fontVisible = true; } -void QTReaderApp::setfontHelper(const QString& lcn, int size) +void QTReaderApp::setfontHelper(const QString& lcn, int size = 0) { if (size == 0) size = reader->m_fontControl.currentsize(); QFont f(lcn, 10 /*, QFont::Bold*/); + qDebug("bs"); 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"); reader->refresh(); m_fontBar->hide(); m_fontVisible = false; - showEditTools(); + qDebug("showedit"); + if (reader->isVisible()) showEditTools(); + qDebug("showeditdone"); } void QTReaderApp::do_setfont(const QString& lcn) { setfontHelper(lcn); } void QTReaderApp::do_autogen(const QString& regText) { unsigned long fs, ts; reader->sizes(fs,ts); // 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->show(); pbar->resize(width(), editBar->height()); pbar->reset(); 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(); } void QTReaderApp::saveprefs() { // reader->saveprefs("uqtreader"); - Config config( "uqtreader" ); + Config config( APPDIR ); config.setGroup( "View" ); reader->m_lastposn = reader->pagelocate(); 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( "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( "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( "TargetApp", m_targetapp ); config.writeEntry( "TargetMsg", m_targetmsg ); 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); +#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 ); + + savefilelist(); } void QTReaderApp::indentplus() { reader->indentplus(); } void QTReaderApp::indentminus() { reader->indentminus(); } /* void QTReaderApp::oldFile() { qDebug("oldFile called"); reader->setText(true); qDebug("settext called"); showEditTools(); 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) { - BkmkFile bf((const char *)Global::applicationFileName("uqtreader",reader->m_string), true); + BkmkFile bf((const char *)Global::applicationFileName(APPDIR, reader->m_string), true); bf.write(*pBkmklist); } m_fBkmksChanged = false; } +void QTReaderApp::readfilelist() +{ + BkmkFile bf((const char *)Global::applicationFileName(APPDIR, ".openfiles")); + qDebug("Reading open files"); + pOpenlist = bf.readall(); + if (pOpenlist != NULL) qDebug("...with success"); + else qDebug("...without success!"); +} + +void QTReaderApp::savefilelist() +{ + if (pOpenlist != NULL) + { + BkmkFile bf((const char *)Global::applicationFileName(APPDIR, ".openfiles"), true); + qDebug("Writing open files"); + bf.write(*pOpenlist); + } +} + void QTReaderApp::readbkmks() { if (pBkmklist != NULL) { delete pBkmklist; } - BkmkFile bf((const char *)Global::applicationFileName("uqtreader",reader->m_string)); + struct stat fnstat; + struct stat bkstat; + if ( + stat((const char *)reader->m_lastfile, &fnstat) == 0 + && + stat((const char *)Global::applicationFileName(APPDIR, reader->m_string), &bkstat) == 0 + ) + { + if (bkstat.st_mtime < fnstat.st_mtime) + { + unlink((const char *)Global::applicationFileName(APPDIR, reader->m_string)); + } + } + + BkmkFile bf((const char *)Global::applicationFileName(APPDIR, reader->m_string)); + 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, "OpieReader", "Need a name for the bookmark\nSelect add again", 1); + 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) { 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; + Global::showInputMethod(); 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); if (m_doClipboard) { QClipboard* cb = QApplication::clipboard(); cb->setText(wrd); if (wrd.length() > 10) { Global::statusMessage(wrd.left(8) + ".."); } else { Global::statusMessage(wrd); } } 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; + Global::showInputMethod(); editorStack->raiseWidget( m_annoWin ); } if (m_doDictionary) { if (!m_targetapp.isEmpty() && !m_targetmsg.isEmpty()) { QCopEnvelope e(("QPE/Application/"+m_targetapp).utf8(), (m_targetmsg+"(QString)").utf8()); e << wrd; } } } void QTReaderApp::OnActionPressed() { switch (m_spaceTarget) { 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); + } + break; default: { qDebug("Unknown ActionType:%u", m_spaceTarget); } break; } } void QTReaderApp::setTwoTouch(bool _b) { reader->setTwoTouch(_b); } void QTReaderApp::restoreFocus() { reader->setFocus(); } + +/* +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->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()); +} +*/ diff --git a/noncore/apps/opie-reader/QTReaderApp.h b/noncore/apps/opie-reader/QTReaderApp.h index 22c57e4..cb33e4a 100644 --- a/noncore/apps/opie-reader/QTReaderApp.h +++ b/noncore/apps/opie-reader/QTReaderApp.h @@ -1,263 +1,291 @@ /********************************************************************** ** 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 __ISEARCH #define MAX_ENCODING 6 -#define MAX_ACTIONS 3 +#define MAX_ACTIONS 4 #include <qmainwindow.h> #include "CExpander.h" #include <qlist.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; +//class QPEToolBar; class CBkmkSelector; class QProgressBar; class QAction; class CAnnoEdit; class QFloatBar; class CDrawBuffer; class QTReader; +class QPixmap; enum ActionTypes { cesOpenFile = 0, cesAutoScroll, - cesActionMark + cesActionMark, + cesFullScreen }; #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; bool m_annoIsEditing; public: QTReaderApp( QWidget *parent = 0, const char *name = 0, WFlags f = 0 ); ~QTReaderApp(); - + void suspend(); void openFile( const QString & ); void setScrollState(bool _b); protected: void setfontHelper(const QString& lcn, int size = 0); - QAction* m_bkmkAvail; + 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&); ActionTypes ActNameToInt(const QString&); bool m_doAnnotation; bool m_doDictionary; bool m_doClipboard; + bool m_fullscreen; public: void saveprefs(); private slots: + void zoomin(); + void zoomout(); + void setfullscreen(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 addAnno(const QString&, const QString&, size_t); void addAnno(const QString&, const QString&); void addanno(); void showAnnotation(); void do_setfont(const QString&); void encodingSelected(QAction*); void buttonActionSelected(QAction*); void msgHandler(const QCString&, const QByteArray&); void monospace(bool); void jump(); void setoverlap(); void settarget(); void setspacing(); void setfont(); void clearBkmkList(); void listBkmkFiles(); void editMark(); void autoScroll(bool); void addbkmk(); void savebkmks(); // void importFiles(); void infoClose(); // void oldFile(); void showinfo(); void setDocument(const QString&); - void TBD(); - void TBDzoom(); void indentplus(); void indentminus(); void fileOpen(); + void fileClose(); void editCopy(); void editFind(); void pageup(); void pagedn(); void findNext(); void findClose(); void regClose(); #ifdef __ISEARCH // void search( const QString& ); #else void search(); #endif - void openFile( const DocLnk & ); void showEditTools(); void stripcr(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 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 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(); + void 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; 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; +// QPEToolBar /* *menu,*/ *editBar; + QToolBar /* *menu,*/ *editBar; QFloatBar *searchBar, *regBar/*, *m_fontBar*/; QToolBar /* *searchBar, *regBar,*/ *m_fontBar; QLineEdit *searchEdit, *regEdit; - DocLnk *doc; 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()); // 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; 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; + #endif diff --git a/noncore/apps/opie-reader/StateData.h b/noncore/apps/opie-reader/StateData.h new file mode 100644 index 0000000..0cb0f07 --- a/dev/null +++ b/noncore/apps/opie-reader/StateData.h @@ -0,0 +1,32 @@ +#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 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 new file mode 100644 index 0000000..e111dbd --- a/dev/null +++ b/noncore/apps/opie-reader/StyleConsts.cpp @@ -0,0 +1,99 @@ + +#include <qpixmap.h> +#include "StyleConsts.h" + +GraphicLink::~GraphicLink() { delete graphic; } + +pmstore::~pmstore() +{ +// 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) +{ + if (graphic != NULL) + { + if (--(graphic->count) == 0) + { + delete graphic; + } + graphic = NULL; + } + if (_g != NULL) graphic = new pmstore(_g, il, tgt); +} diff --git a/noncore/apps/opie-reader/StyleConsts.h b/noncore/apps/opie-reader/StyleConsts.h index b6dd861..5aacdf0 100644 --- a/noncore/apps/opie-reader/StyleConsts.h +++ b/noncore/apps/opie-reader/StyleConsts.h @@ -1,113 +1,177 @@ #ifndef __STYLECONSTS_H #define __STYLECONSTS_H typedef unsigned short StyleType; -class CStyle -{ -// 15 14 13-5 4 3 2 1 0 -//bold italic spare align align fs fs fs - static const StyleType m_Bold = 1 << 15; - static const StyleType m_Italic = 1 << 14; - static const StyleType m_FontMask = 7; - static const StyleType m_FontBase = 3; +#include <stdlib.h> +#include <qglobal.h> +class QPixmap; - static const StyleType m_AlignShift = 3; - static const StyleType m_AlignMask = 3 << m_AlignShift; - static const StyleType m_EveryBit = 0xffff; +struct GraphicLink +{ + QPixmap* graphic; + bool isLink; + unsigned long link; + GraphicLink(QPixmap* p, bool isLnk, unsigned long tgt) : + graphic(p), isLink(isLnk), link(tgt) {} + ~GraphicLink(); +}; +struct pmstore +{ + unsigned int count; + GraphicLink* graphic; + pmstore(QPixmap* p, bool isLnk, unsigned long tgt) : count(1) + { + graphic = new GraphicLink(p, isLnk, tgt); + } + ~pmstore(); +}; - StyleType sty; +enum EalignmentType +{ + m_AlignLeft, + m_AlignRight, + m_AlignCentre, + m_AlignJustify +}; - void unjustify() { sty &= m_EveryBit ^ m_AlignMask; } +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; - public: - unsigned char Red() { return red; } - unsigned char Green() { return green; } - unsigned char Blue() { return blue; } - void setColour(unsigned char r, unsigned char g, unsigned char b) + bool m_underline; + bool m_strikethru; + bool m_monospaced; + unsigned char m_leftmargin, m_rightmargin; + CBasicStyle() { - red = r; - green = g; - blue = b; - } - static const StyleType m_AlignLeft = 0; - static const StyleType m_AlignRight = 1 << m_AlignShift; - static const StyleType m_AlignCentre = 2 << m_AlignShift; - static const StyleType m_AlignJustify = 3 << m_AlignShift; - CStyle() - : - sty(m_FontBase), - red(0), green(0), blue(0), - data(0), isLink(false) - {} -// CStyle(const int _fs) : sty(m_FontBase+_fs) {} - + unset(); + } + bool operator!=(const CBasicStyle& rhs) + { + return (memcmp(this, &rhs, sizeof(CBasicStyle)) != 0); + } void unset() { - sty = m_FontBase; + 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; } +}; - void setBold() { sty |= m_Bold; } - void setItalic() { sty |= m_Italic; } - void unsetBold() { sty &= m_EveryBit ^ m_Bold; } - void unsetItalic() { sty &= m_EveryBit ^ m_Italic; } - bool isBold() { return ((sty & m_Bold) != 0); } - bool isItalic() { return ((sty & m_Italic) != 0); } +class CStyle +{ + CBasicStyle sty; + pmstore* graphic; + public: + 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(const CStyle&); + CStyle& operator=(const CStyle&); + void unset(); + bool isPicture() { return (graphic != NULL); } + void clearPicture(); + void setPicture(QPixmap* _g, bool il=false, unsigned long tgt=0); + QPixmap* getPicture() + { + QPixmap* 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() { - unjustify(); - sty |= m_AlignLeft; + sty.m_align = m_AlignLeft; } void setRightJustify() { - unjustify(); - sty |= m_AlignRight; + sty.m_align = m_AlignRight; } void setCentreJustify() { - unjustify(); - sty |= m_AlignCentre; + sty.m_align = m_AlignCentre; } void setFullJustify() { - unjustify(); - sty |= m_AlignJustify; + sty.m_align = m_AlignJustify; } StyleType getJustify() { - return sty & m_AlignMask; + return sty.m_align; } void setFontSize(int _fs) { - sty &= m_EveryBit ^ m_FontMask; - sty |= m_FontBase + _fs; + sty.m_fontsize = _fs; } int getFontSize() { - return (sty & m_FontMask) - m_FontBase; + return sty.m_fontsize; } bool operator!=(const CStyle& rhs) { return ( - (sty != rhs.sty) || (red != rhs.red) || (green != rhs.green) || - (blue != rhs.blue) || - (data != rhs.data) || - (isLink != rhs.isLink) + (sty != rhs.sty) || + (graphic != rhs.graphic) ); } - void setLink(bool _l) { isLink = _l; } - bool getLink() { return isLink; } - void setData(unsigned long _d) { data = _d; } - unsigned long getData() { return data; } + 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/Text.h b/noncore/apps/opie-reader/Text.h deleted file mode 100644 index 4c689be..0000000 --- a/noncore/apps/opie-reader/Text.h +++ b/dev/null @@ -1,28 +0,0 @@ -#ifndef __Text_h -#define __Text_h -#include <stdio.h> -#include <sys/stat.h> -#include "CExpander.h" - -class Text: public CExpander { - FILE* file; -public: - Text() : file(NULL) {}; - virtual ~Text() { if (file != NULL) fclose(file); } - virtual int openfile(const tchar *src) - { - if (file != NULL) fclose(file); - return ((file = fopen(src,"rb")) == NULL); - } - virtual int getch() { return fgetc(file); } - virtual unsigned int locate() { return ftell(file); } - virtual void locate(unsigned int n) { fseek(file,n,SEEK_SET); } - virtual bool hasrandomaccess() { return true; } - virtual void sizes(unsigned long& _file, unsigned long& _text) - { - struct stat _stat; - fstat(fileno(file),&_stat); - _text = _file = _stat.st_size; - } -}; -#endif diff --git a/noncore/apps/opie-reader/ZText.h b/noncore/apps/opie-reader/ZText.h index debfe8c..22d3733 100644 --- a/noncore/apps/opie-reader/ZText.h +++ b/noncore/apps/opie-reader/ZText.h @@ -1,39 +1,68 @@ #ifndef __Text_h #define __Text_h #include <stdio.h> #include "zlib/zlib.h" #include <sys/stat.h> #include "CExpander.h" class Text: public CExpander { gzFile file; unsigned long fsize; public: + virtual void suspend() + { + bSuspended = true; + suspos = gztell(file); + gzclose(file); + file = NULL; + sustime = time(NULL); + } + virtual void unsuspend() + { + 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); + } + } Text() : file(NULL) {}; virtual ~Text() { if (file != NULL) gzclose(file); } - virtual int openfile(const char *src) + virtual 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) { _text = _file = fsize; } virtual MarkupType PreferredMarkup() { return cTEXT; } }; #endif diff --git a/noncore/apps/opie-reader/cbkmkselector.h b/noncore/apps/opie-reader/cbkmkselector.h index 1a49c5a..1a70048 100644 --- a/noncore/apps/opie-reader/cbkmkselector.h +++ b/noncore/apps/opie-reader/cbkmkselector.h @@ -1,41 +1,43 @@ #include <qwidget.h> #include <qlistbox.h> #include <qpushbutton.h> #include <qlayout.h> class CBkmkSelector : public QWidget { Q_OBJECT QListBox* bkmkselector; + QPushButton* exitButton; signals: void selected(int i); void cancelled(); private slots: void slotSelected(QListBoxItem* t) { emit selected(bkmkselector->index(t)); } void slotSelected(int t) { emit selected(t); } void slotCancel() { emit cancelled(); } public: CBkmkSelector( QWidget *parent=0, const char *name=0, WFlags f = 0) : QWidget(parent, name, f) { // QFont f("unifont", 16); // setFont( f ); QVBoxLayout* grid = new QVBoxLayout(this); bkmkselector = new QListBox(this, "Bookmarks"); - QPushButton* exitButton = new QPushButton("Cancel", this); + exitButton = new QPushButton("Cancel", this); connect(bkmkselector, SIGNAL( selected(int) ), this, SLOT( slotSelected(int) ) ); connect(bkmkselector, SIGNAL( clicked(QListBoxItem*) ), this, SLOT( slotSelected(QListBoxItem*) ) ); connect(exitButton, SIGNAL( released() ), this, SLOT( slotCancel() ) ); grid->addWidget(bkmkselector,1); grid->addWidget(exitButton); } void clear() { bkmkselector->clear(); } void insertItem(const QString& item) { bkmkselector->insertItem(item); } QString text(int index) const { return bkmkselector->text(index); } + void setText(const QString& _l) { exitButton->setText(_l); } }; diff --git a/noncore/apps/opie-reader/config.h b/noncore/apps/opie-reader/config.h index 5150270..b6281a4 100644 --- a/noncore/apps/opie-reader/config.h +++ b/noncore/apps/opie-reader/config.h @@ -1,21 +1,25 @@ #ifndef __CONFIG_H #define __CONFIG_H #define _UNICODE #ifdef _UNICODE #include <limits.h> #define UTF8 typedef unsigned short tchar; const tchar UEOF = USHRT_MAX; #else typedef char tchar; const int UEOF = -1; #endif #include "ustring.h" +#define BORDER 2 + +//#define _FAST + #endif diff --git a/noncore/apps/opie-reader/fileBrowser.cpp b/noncore/apps/opie-reader/fileBrowser.cpp index b21d59d..21c970b 100644 --- a/noncore/apps/opie-reader/fileBrowser.cpp +++ b/noncore/apps/opie-reader/fileBrowser.cpp @@ -1,113 +1,116 @@ /**************************************************************************** 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 <qpushbutton.h> #include <qfile.h> #include <qmessagebox.h> #include <unistd.h> #include <qlayout.h> 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) { // showMaximized(); if ( !name ) setName( "fileBrowser" ); if (parent != NULL) resize( parent->width(), parent->height() ); 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 (QFileInfo(iPath).exists()) { currentDir.setPath(iPath); chdir(iPath.latin1()); } else { currentDir.setPath(QDir::currentDirPath()); chdir(QDir::currentDirPath().latin1()); } populateList(); } 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()); // 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() ) diff --git a/noncore/apps/opie-reader/infowin.cpp b/noncore/apps/opie-reader/infowin.cpp index 7b8f280..30adebf 100644 --- a/noncore/apps/opie-reader/infowin.cpp +++ b/noncore/apps/opie-reader/infowin.cpp @@ -1,42 +1,43 @@ +#include "name.h" #include "infowin.h" #include "version.h" #include <stdio.h> -infowin::infowin( QWidget *parent, const char *name, WFlags f) : +infowin::infowin( QWidget *parent=0, const char *name=0, WFlags f = 0) : 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, "QT Reader v%u.%u%c (%s)\nA small e-text reader", MAJOR, BKMKTYPE, MINOR, RELEASE_TYPE); + 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 08f59a8..2440037 100644 --- a/noncore/apps/opie-reader/main.cpp +++ b/noncore/apps/opie-reader/main.cpp @@ -1,30 +1,34 @@ #include <qpe/qpeapplication.h> #include "QTReaderApp.h" #include "signal.h" #include "stdio.h" #include "time.h" QTReaderApp* app = NULL; void handler(int signum) { - if (app != NULL) app->saveprefs(); + if (app != NULL) + { + app->suspend(); + app->saveprefs(); + } signal(signum, handler); } int main( int argc, char ** argv ) { signal(SIGCONT, handler); QPEApplication a( argc, argv ); QTReaderApp m; a.showMainDocumentWidget( &m ); app = &m; return a.exec(); } diff --git a/noncore/apps/opie-reader/name.h b/noncore/apps/opie-reader/name.h new file mode 100644 index 0000000..d419005 --- a/dev/null +++ b/noncore/apps/opie-reader/name.h @@ -0,0 +1,8 @@ +#ifndef __NAME_H +#define __NAME_H + +#define PROGNAME "Opie-Reader" +#define SHORTPROGNAME "Reader" +#define APPDIR "uqtreader" + +#endif diff --git a/noncore/apps/opie-reader/opie-reader.pro b/noncore/apps/opie-reader/opie-reader.pro index 51849a3..139c03a 100644 --- a/noncore/apps/opie-reader/opie-reader.pro +++ b/noncore/apps/opie-reader/opie-reader.pro @@ -1,58 +1,73 @@ TEMPLATE = app CONFIG = qt warn_on release HEADERS = Aportis.h \ + Bkmks.h \ BuffDoc.h \ + CAnnoEdit.h \ CBuffer.h \ CDrawBuffer.h \ + CEncoding.h \ CExpander.h \ CFilter.h \ + Filedata.h \ + FontControl.h \ + GraphicWin.h \ + Markups.h \ + Navigation.h \ + Palm2QImage.h \ + QFloatBar.h \ QTReader.h \ QTReaderApp.h \ + QtrListView.h \ + Queue.h \ + StateData.h \ + StyleConsts.h \ ZText.h \ arith.h \ - my_list.h \ - ppm.h \ - ppm_expander.h \ cbkmkselector.h \ + config.h \ fileBrowser.h \ - ztxt.h \ - QtrListView.h \ infowin.h \ - version.h \ + my_list.h \ + name.h \ + opie.h \ pdb.h \ - utypes.h \ - ustring.h \ - CEncoding.h \ - CAnnoEdit.h \ - QFloatBar.h \ - StyleConsts.h \ - FontControl.h \ plucker.h \ - Markups.h \ - Bkmks.h \ - config.h + ppm.h \ + ppm_expander.h \ + ustring.h \ + utypes.h \ + version.h \ + ztxt.h + SOURCES = Aportis.cpp \ + Bkmks.cpp \ BuffDoc.cpp \ CBuffer.cpp \ CDrawBuffer.cpp \ + CEncoding.cpp \ + CFilter.cpp \ + FontControl.cpp \ + Navigation.cpp \ + Palm2QImage.cpp \ QTReader.cpp \ QTReaderApp.cpp \ - arith_d.cpp \ - main.cpp \ - ppm.cpp \ - ppm_expander.cpp \ - ztxt.cpp \ QtrListView.cpp \ + StyleConsts.cpp \ + arith_d.cpp \ + fileBrowser.cpp \ infowin.cpp \ + main.cpp \ pdb.cpp \ - CEncoding.cpp \ - CFilter.cpp \ plucker.cpp \ - Bkmks.cpp \ - fileBrowser.cpp + ppm.cpp \ + ppm_expander.cpp \ + ztxt.cpp + +INTERFACES = DESTDIR = $(OPIEDIR)/bin INCLUDEPATH += $(OPIEDIR)/include DEPENDPATH += $(OPIEDIR)/include TARGET = reader LIBS += -lqpe diff --git a/noncore/apps/opie-reader/opie.h b/noncore/apps/opie-reader/opie.h new file mode 100644 index 0000000..e28c2ab --- a/dev/null +++ b/noncore/apps/opie-reader/opie.h @@ -0,0 +1,6 @@ +#ifndef __OPIE_H +#define __OPIE_H + +#define OPIE + +#endif diff --git a/noncore/apps/opie-reader/pdb.cpp b/noncore/apps/opie-reader/pdb.cpp index 68b904e..3054424 100644 --- a/noncore/apps/opie-reader/pdb.cpp +++ b/noncore/apps/opie-reader/pdb.cpp @@ -1,57 +1,63 @@ #include "pdb.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> 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]; - fseek(fin,0,SEEK_END); - file_length = ftell(fin); + struct stat buf; + stat(src, &buf); + file_length = buf.st_size; +// 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/plucker.cpp b/noncore/apps/opie-reader/plucker.cpp index ddda4bc..eb039de 100644 --- a/noncore/apps/opie-reader/plucker.cpp +++ b/noncore/apps/opie-reader/plucker.cpp @@ -1,579 +1,1241 @@ #include <stdio.h> #include <string.h> #include <qmessagebox.h> -#include "plucker.h" +#include <qpixmap.h> +#include <qpe/qcopenvelope_qws.h> +#ifdef LOCALPICTURES +#include <qscrollview.h> +#endif +#include <qpe/global.h> +#include <qclipboard.h> +#include <qpe/qpeapplication.h> +#include "plucker.h" #include "Aportis.h" +#include "Palm2QImage.h" +#include "name.h" -CPlucker::CPlucker() : expandedtextbuffer(NULL), compressedtextbuffer(NULL) { /*printf("constructing:%x\n",fin);*/ } +CPlucker::CPlucker() : +#ifdef LOCALPICTURES + m_viewer(NULL), + m_picture(NULL), +#endif + expandedtextbuffer(NULL), + compressedtextbuffer(NULL), + urls(NULL) + { /*printf("constructing:%x\n",fin);*/ } -int CPlucker::openfile(const char *src) +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)) + { + case 2: + UnZip(reclen, buffer, buffersize); + break; + case 1: + UnDoc(reclen, buffer, buffersize); + break; + } + } +} + +int CPlucker::OpenFile(const char *src) +{ + m_lastBreak = 0; if (!Cpdb::openfile(src)) { return -1; } //printf("Okay %u\n", 4); if (memcmp(&head.type, "DataPlkr", 8) != 0) return -1; // qDebug("Cool - this IS plucker"); - 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 += htons(thisHdr.size); - } - + 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)); + qDebug("Total number of records:%u", ntohs(head.recordList.numRecords)); unsigned int nrecs = ntohs(hdr0.nRecords); -// qDebug("Version %u, no. res %u", ntohs(hdr0.version), nrecs); - for (unsigned int i = 0; i < 4*nrecs; i++) + 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++) { - UInt8 id; + 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; + +} + +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() +{ + 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 } 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); if (!expand(bufferrec+1)) return EOF; mystyle.unset(); + ch = 10; + EOPPhase = 4; } - - if (bufferpos == m_nextPara) + else if (bufferpos == m_nextPara) + { + while (bufferpos == m_nextPara) { UInt16 attr = m_ParaAttrs[m_nextParaIndex]; m_nextParaIndex++; if (m_nextParaIndex == m_nParas) { m_nextPara = -1; } else { m_nextPara += m_ParaOffsets[m_nextParaIndex]; } -// qDebug("New paragraph"); + } + mystyle.unset(); + if (m_lastBreak == locate()) + { + currentpos++; + ch = expandedtextbuffer[bufferpos++]; + } + else + { ch = 10; } + } else { currentpos++; ch = expandedtextbuffer[bufferpos++]; } return ch; } int CPlucker::getch() { + mystyle.clearPicture(); + + + if (EOPPhase > 0) + { + int ch = 10; + switch (EOPPhase) + { + case 4: + mystyle.setPicture(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); +// 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.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); +// qDebug("Font:%d",ch); switch (ch) { case 0: + mystyle.unsetMono(); mystyle.unsetBold(); mystyle.setFontSize(0); break; case 1: + mystyle.unsetMono(); mystyle.setBold(); - mystyle.setFontSize(1); + mystyle.setFontSize(3); break; case 2: + mystyle.unsetMono(); mystyle.setBold(); - mystyle.setFontSize(1); + mystyle.setFontSize(2); break; case 3: -// mystyle.setBold(); + mystyle.unsetMono(); + mystyle.setBold(); +// mystyle.unsetBold(); mystyle.setFontSize(1); break; case 4: -// mystyle.setBold(); - mystyle.setFontSize(1); + 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(); - expandimg(ir); + 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 } - ch = bgetch(); + else + { + mystyle.setPicture(expandimg(ir)); + } + if (mystyle.getLink()) qDebug("Picture link!"); + ch = '#'; + } +// ch = bgetch(); break; -*/ case 0x33: - case 0x22: - case 0x5c: + { + 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); +// 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 += htons(thisHdr.size); + 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 = htons(thisHdr.size); + bs = ntohs(thisHdr.size); } else { bs = 0; } - } while (locpos + bs < n); + } 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 <= htons(thisHdr.uid)) break; - if (thisHdr.type < 2) currentpos += htons(thisHdr.size); + 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, - QString("OpieReader"), - QString("External links\nnot yet supported") + 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", htons(thisHdr.nParagraphs), htons(thisHdr.size)); +// 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 = htons(thisHdr.size); + buffercontent = ntohs(thisHdr.size); - if (thisHdr.type == 0) - { - fread(expandedtextbuffer, reclen, sizeof(char), fin); - } - else - { - fread(compressedtextbuffer, reclen, sizeof(char), fin); - switch (ntohs(hdr0.version)) - { - case 2: - UnZip(reclen, expandedtextbuffer, buffercontent); - break; - case 1: - UnDoc(reclen, expandedtextbuffer, buffercontent); - break; - } - } + 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++ ]; } 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++) { 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; } -void CPlucker::expandimg(UInt16 tgt) +QImage* CPlucker::getimg(UInt16 tgt) { - qDebug("Image:%u", 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 { - thisrec++; + hthisrec++; reclen = recordlength(thisrec); gotorecordnumber(thisrec); - qDebug("thisrec:%u.%u", ftell(fin),thisrec); +// qDebug("thisrec:%u.%u", ftell(fin),thisrec); fread(&thisHdr, 1, sizeof(thisHdr), fin); } while (ntohs(thisHdr.uid) != tgt); - +*/ reclen -= sizeof(thisHdr); - UInt16 imgsize = htons(thisHdr.size); + UInt16 imgsize = ntohs(thisHdr.size); UInt8* imgbuffer = new UInt8[imgsize]; - qDebug("type:%u", thisHdr.type); +// qDebug("type:%u", thisHdr.type); + Expand(reclen, thisHdr.type, imgbuffer, imgsize); + + QImage* qimage = Palm2QImage(imgbuffer, imgsize); + + delete [] imgbuffer; + + return qimage; +} + +#include <qnamespace.h> - if (thisHdr.type == 2) +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) { - qDebug("Not compressed:%u.%u", ftell(fin),reclen); - fread(imgbuffer, reclen, sizeof(char), fin); - qDebug("Not compressed:%u.%u", ftell(fin),reclen); + 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 { - qDebug("Compressed"); - fread(compressedtextbuffer, reclen, sizeof(char), fin); - switch (ntohs(hdr0.version)) + ret = image; + } + return ret; +} + +#ifdef _BUFFERPICS +#include <qmap.h> +#endif + +QPixmap* CPlucker::getPicture(unsigned long tgt) { - case 2: - UnZip(reclen, imgbuffer, imgsize); - break; - case 1: - UnDoc(reclen, imgbuffer, imgsize); +#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; } } - FILE* imgfile = fopen("/home/tim/newreader/imagefile.tbmp", "w"); - if (imgfile != NULL) + m_nav.putSaveData(src, srclen); +} + +unsigned short CPlucker::finduid(unsigned short urlid) { - fwrite(imgbuffer, 1, imgsize, imgfile); - fclose(imgfile); +// 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; } - delete [] imgbuffer; + 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 d3ca732..083eac6 100644 --- a/noncore/apps/opie-reader/plucker.h +++ b/noncore/apps/opie-reader/plucker.h @@ -1,86 +1,123 @@ #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" + +#ifdef LOCALPICTURES +class QScrollView; +class QWidget; +#endif struct CPlucker_dataRecord { UInt16 uid; UInt16 nParagraphs; UInt16 size; UInt8 type; UInt8 reserved; }; struct CPlucker_record0 { UInt16 uid; UInt16 version; UInt16 nRecords; }; struct CPluckerbkmk { UInt32 offset; tchar title[MAX_BMRK_LENGTH]; }; - const UInt32 CPLUCKER_ID = 0x5458547a; class CPlucker : public CExpander, Cpdb { - size_t textlength; + 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); - void expandimg(UInt16 tgt); +#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; public: - virtual void sizes(unsigned long& _file, unsigned long& _text) + virtual void suspend() { - _file = file_length; - _text = textlength; -//ntohl(hdr0.size); + CExpander::suspend(fin); } - virtual bool hasrandomaccess() { return true; } - virtual ~CPlucker() + virtual void unsuspend() { - if (expandedtextbuffer != NULL) delete [] expandedtextbuffer; - if (compressedtextbuffer != NULL) delete [] compressedtextbuffer; + 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 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.cpp b/noncore/apps/opie-reader/ppm_expander.cpp index 4f0a277..fe2745c 100644 --- a/noncore/apps/opie-reader/ppm_expander.cpp +++ b/noncore/apps/opie-reader/ppm_expander.cpp @@ -1,102 +1,102 @@ /* * Interface pour le programme de compression * (c) 1995 Fabrice Bellard */ #include <stdlib.h> //#include <unistd.h> #include <stdio.h> #include <string.h> #include <time.h> /*************************************************************************** * Interface avec les routines de compression */ #define METHOD_NB 2 /* nombre total de méthodes de compression */ #define METHOD_STORE 0 #define METHOD_PPM 1 #define DEFAULT_SUFFIX ".st" /* extension par défault */ /* signature en début de fichier */ #define STAT_MAGIC_SIZE 4 char stat_magic[STAT_MAGIC_SIZE]={'P','P','M','S'}; #include "ppm_expander.h" ppm_expander::~ppm_expander() { if (needppmend) ppm.PPM_End(); ppm.arith.Arith_DecodeEnd(); if (buf_in!=NULL) delete [] buf_in; if (buf_out!=NULL) delete [] buf_out; if (my_read_buf != NULL) delete my_read_buf; if (my_file_in != NULL) fclose(my_file_in); } -int ppm_expander::openfile(const char* infile) +int ppm_expander::OpenFile(const char* infile) { my_file_in=fopen(infile,"rb"); my_read_buf = new PPM_ReadBuf(my_file_in); return home(); } void ppm_expander::sizes(unsigned long& file, unsigned long& text) { struct stat _stat; fstat(fileno(my_file_in),&_stat); file = _stat.st_size; text = numblocks*blocksize; } int ppm_expander::home() { fseek(my_file_in,0, SEEK_SET); unsigned char header[STAT_MAGIC_SIZE]; size_t len=fread(header,1,STAT_MAGIC_SIZE,my_file_in); if (strncmp((char*)header,stat_magic,STAT_MAGIC_SIZE)!=0) { return 1; } if (len!=(STAT_MAGIC_SIZE)) { return 1; } if (fread(&maxnode,sizeof(maxnode),1,my_file_in) != 1) return 1; if (fread(&blocksize,sizeof(blocksize),1,my_file_in) != 1) return 1; if (fread(&numblocks,sizeof(numblocks),1,my_file_in) != 1) return 1; //fprintf(stderr,"<%u,%u,%u>\n",maxnode,blocksize,numblocks); int err = locate(0,0); outbytes = 0; return err; } void ppm_expander::locate(unsigned int n) { locate(n/blocksize, n%blocksize); outbytes = n; } int ppm_expander::locate(unsigned short block, unsigned int n) { if (needppmend) { ppm.PPM_End(); needppmend = false; } size_t fpos; fseek(my_file_in,STAT_MAGIC_SIZE+sizeof(maxnode)+sizeof(blocksize)+sizeof(numblocks)+block*sizeof(fpos),SEEK_SET); if (fread(&fpos,sizeof(fpos),1,my_file_in) != 1) return 1; fseek(my_file_in,fpos,SEEK_SET); ppm.arith.Arith_DecodeInit(my_read_buf,buf_in,bufsize); int err=ppm.PPM_Init(maxnode); needppmend = true; curblock = block; for (int i = 0; i < n; i++) getch(); } int ppm_expander::getch() { if (curblock >= numblocks) return EOF; int c=ppm.PPM_Decode(); if (c == SYM_EOF) { if (++curblock >= numblocks) return EOF; diff --git a/noncore/apps/opie-reader/ppm_expander.h b/noncore/apps/opie-reader/ppm_expander.h index 115988d..4278c82 100644 --- a/noncore/apps/opie-reader/ppm_expander.h +++ b/noncore/apps/opie-reader/ppm_expander.h @@ -1,50 +1,58 @@ #ifndef __ppm_expander_h #define __ppm_expander_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() + { + CExpander::suspend(my_file_in); + } + virtual void unsuspend() + { + CExpander::unsuspend(my_file_in); + } 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 OpenFile(const char* infile); virtual 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() { return cTEXT; } }; #endif diff --git a/noncore/apps/opie-reader/ustring.h b/noncore/apps/opie-reader/ustring.h index a4dc048..a3ef8df 100644 --- a/noncore/apps/opie-reader/ustring.h +++ b/noncore/apps/opie-reader/ustring.h @@ -2,70 +2,82 @@ #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; while (*p != 0 && i < len) ret[i++] = *(p++); 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 8b6c756..003e9db 100644 --- a/noncore/apps/opie-reader/version.h +++ b/noncore/apps/opie-reader/version.h @@ -1,5 +1,5 @@ #define MAJOR 0 -#define BKMKTYPE 5 +#define BKMKTYPE 6 #define MINOR 'a' #define RELEASE_TYPE "beta" diff --git a/noncore/apps/opie-reader/ztxt.cpp b/noncore/apps/opie-reader/ztxt.cpp index 289b13a..8091d32 100644 --- a/noncore/apps/opie-reader/ztxt.cpp +++ b/noncore/apps/opie-reader/ztxt.cpp @@ -1,74 +1,74 @@ #include <stdio.h> #include <string.h> #include "ztxt.h" #include "my_list.h" #include "Bkmks.h" ztxt::ztxt() : bInit(false), expandedtextbuffer(NULL), compressedtextbuffer(NULL) { /*printf("constructing:%x\n",fin);*/ } -int ztxt::openfile(const char *src) +int ztxt::OpenFile(const char *src) { if (!Cpdb::openfile(src)) { return -1; } //printf("Okay %u\n", 4); if (head.type != ZTXT_ID) return -1; gotorecordnumber(0); fread(&hdr0, 1, sizeof(hdr0), fin); //printf("Okay %u\n", 5); buffersize = ntohl(hdr0.size); compressedtextbuffer = new UInt8[buffersize]; expandedtextbuffer = new UInt8[buffersize]; //printf("Okay %u\n", 6); home(); //printf("Okay %u\n", 7); // printf("Returning 0\n"); return 0; } int ztxt::getch() { if (bufferpos >= buffercontent) { size_t reclen = recordlength(++bufferrec); if (reclen == 0) return -1; gotorecordnumber(bufferrec); fread(compressedtextbuffer, reclen, sizeof(char), fin); zstream.next_in = compressedtextbuffer; zstream.next_out = expandedtextbuffer; zstream.avail_out = buffersize; zstream.avail_in = reclen; int ret = inflate(&zstream, Z_SYNC_FLUSH); buffercontent = buffersize - zstream.avail_out; bufferpos = 0; } currentpos++; return expandedtextbuffer[bufferpos++]; } unsigned int ztxt::locate() { return currentpos; } void ztxt::locate(unsigned int n) { if (hasrandomaccess()) { bufferrec = n / ntohs(hdr0.recordSize) + 1; if (bufferrec == 1) { inflateEnd(&zstream); } diff --git a/noncore/apps/opie-reader/ztxt.h b/noncore/apps/opie-reader/ztxt.h index 20558a6..d7cb96a 100644 --- a/noncore/apps/opie-reader/ztxt.h +++ b/noncore/apps/opie-reader/ztxt.h @@ -14,92 +14,100 @@ #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() + { + CExpander::suspend(fin); + } + virtual void unsuspend() + { + CExpander::unsuspend(fin); + } virtual void sizes(unsigned long& _file, unsigned long& _text) { _file = file_length; _text = ntohl(hdr0.size); } virtual 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 OpenFile(const char *src); virtual int getch(); virtual unsigned int locate(); virtual void locate(unsigned int n); virtual CList<Bkmk>* getbkmklist(); virtual MarkupType PreferredMarkup() { return cTEXT; } }; #endif |