summaryrefslogtreecommitdiff
authorpohly <pohly>2005-05-05 14:39:33 (UTC)
committer pohly <pohly>2005-05-05 14:39:33 (UTC)
commit39fbfd5eb7e45d73d38e8a2ce9437a3d7e1b8e91 (patch) (side-by-side diff)
tree96e66fdc18dca4d4ab8611133e072f57dea224b9
parent279fc4fd1986074acbadd3a8e86fcf3968a8dd5c (diff)
downloadopie-39fbfd5eb7e45d73d38e8a2ce9437a3d7e1b8e91.zip
opie-39fbfd5eb7e45d73d38e8a2ce9437a3d7e1b8e91.tar.gz
opie-39fbfd5eb7e45d73d38e8a2ce9437a3d7e1b8e91.tar.bz2
new opie-reader sources with support for ArriereGo, Reb input and flite output plugins
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/apps/opie-reader/Aportis.cpp8
-rw-r--r--noncore/apps/opie-reader/ArriereCodec/.cvsignore5
-rw-r--r--noncore/apps/opie-reader/ArriereCodec/ArriereCodec.pro16
-rw-r--r--noncore/apps/opie-reader/BuffDoc.cpp55
-rw-r--r--noncore/apps/opie-reader/BuffDoc.h25
-rw-r--r--noncore/apps/opie-reader/ButtonPrefs.cpp4
-rw-r--r--noncore/apps/opie-reader/CDrawBuffer.cpp25
-rw-r--r--noncore/apps/opie-reader/CDrawBuffer.h2
-rw-r--r--noncore/apps/opie-reader/CEncoding.h15
-rw-r--r--noncore/apps/opie-reader/CExpander.cpp10
-rw-r--r--noncore/apps/opie-reader/CExpander.h14
-rw-r--r--noncore/apps/opie-reader/CFilter.cpp54
-rw-r--r--noncore/apps/opie-reader/CFilter.h55
-rw-r--r--noncore/apps/opie-reader/CHM.cpp13
-rw-r--r--noncore/apps/opie-reader/CHM.h2
-rw-r--r--noncore/apps/opie-reader/CRegExp.cpp0
-rw-r--r--noncore/apps/opie-reader/CSource.h62
-rw-r--r--noncore/apps/opie-reader/Coder.h113
-rw-r--r--noncore/apps/opie-reader/FliteCmd/.cvsignore5
-rw-r--r--noncore/apps/opie-reader/FliteCmd/FliteCmd.pro18
-rw-r--r--noncore/apps/opie-reader/FliteDyn/.cvsignore5
-rw-r--r--noncore/apps/opie-reader/FliteDyn/FliteDyn.pro18
-rw-r--r--noncore/apps/opie-reader/FliteDyn16/.cvsignore5
-rw-r--r--noncore/apps/opie-reader/FliteDyn16/FliteDyn16.pro18
-rw-r--r--noncore/apps/opie-reader/FontControl.cpp1
-rw-r--r--noncore/apps/opie-reader/FontControl.h2
-rw-r--r--noncore/apps/opie-reader/Model.cpp721
-rw-r--r--noncore/apps/opie-reader/Model.h11
-rw-r--r--noncore/apps/opie-reader/Palm2QImage.cpp1
-rw-r--r--noncore/apps/opie-reader/Prefs.cpp127
-rw-r--r--noncore/apps/opie-reader/Prefs.h75
-rw-r--r--noncore/apps/opie-reader/QTReader.cpp855
-rw-r--r--noncore/apps/opie-reader/QTReader.h96
-rw-r--r--noncore/apps/opie-reader/QTReaderApp.cpp238
-rw-r--r--noncore/apps/opie-reader/QTReaderApp.h13
-rw-r--r--noncore/apps/opie-reader/Reb.cpp789
-rw-r--r--noncore/apps/opie-reader/Reb.h157
-rw-r--r--noncore/apps/opie-reader/RebCodec/.cvsignore5
-rw-r--r--noncore/apps/opie-reader/RebCodec/RebCodec.pro21
-rw-r--r--noncore/apps/opie-reader/StyleConsts.h12
-rw-r--r--noncore/apps/opie-reader/SubAlloc.h201
-rw-r--r--noncore/apps/opie-reader/TableDialog.cpp17
-rw-r--r--noncore/apps/opie-reader/TableDialog.h34
-rw-r--r--noncore/apps/opie-reader/ToolbarPrefs.h3
-rw-r--r--noncore/apps/opie-reader/ZText.h11
-rw-r--r--noncore/apps/opie-reader/arith.h12
-rw-r--r--noncore/apps/opie-reader/arrierego.cpp188
-rw-r--r--noncore/apps/opie-reader/arrierego.h37
-rw-r--r--noncore/apps/opie-reader/cbkmkselector.h64
-rw-r--r--noncore/apps/opie-reader/config.in4
-rw-r--r--noncore/apps/opie-reader/decompress.cpp95
-rw-r--r--noncore/apps/opie-reader/decompress.h5
-rw-r--r--noncore/apps/opie-reader/ebookcodec.h21
-rw-r--r--noncore/apps/opie-reader/fileBrowser.cpp2
-rw-r--r--noncore/apps/opie-reader/flitecmd.cpp43
-rw-r--r--noncore/apps/opie-reader/flitecmd.h10
-rw-r--r--noncore/apps/opie-reader/flitedyn.cpp29
-rw-r--r--noncore/apps/opie-reader/flitedyn.h16
-rw-r--r--noncore/apps/opie-reader/iSilo.cpp1
-rw-r--r--noncore/apps/opie-reader/linktype.h2
-rw-r--r--noncore/apps/opie-reader/main.cpp1
-rw-r--r--noncore/apps/opie-reader/mytypes.h8
-rw-r--r--noncore/apps/opie-reader/opie-reader.pro8
-rw-r--r--noncore/apps/opie-reader/outputcodec.h84
-rw-r--r--noncore/apps/opie-reader/pdb.cpp7
-rw-r--r--noncore/apps/opie-reader/pdb.h9
-rw-r--r--noncore/apps/opie-reader/plucker_base.cpp224
-rw-r--r--noncore/apps/opie-reader/plucker_base.h9
-rw-r--r--noncore/apps/opie-reader/pluckerbaselib/pluckerbaselib.pro3
-rw-r--r--noncore/apps/opie-reader/pluckerdecompress/.cvsignore5
-rw-r--r--noncore/apps/opie-reader/pluckerdecompress/pluckerdecompress.pro17
-rw-r--r--noncore/apps/opie-reader/ppm_expander.cpp11
-rw-r--r--noncore/apps/opie-reader/ppm_expander.h5
-rwxr-xr-xnoncore/apps/opie-reader/preferences.cpp1
-rw-r--r--noncore/apps/opie-reader/preferences.h0
-rw-r--r--noncore/apps/opie-reader/reader.staticpro108
-rw-r--r--noncore/apps/opie-reader/reader.staticzpro108
-rw-r--r--noncore/apps/opie-reader/reader/reader.pro3
-rw-r--r--noncore/apps/opie-reader/setn.sh27
-rw-r--r--noncore/apps/opie-reader/seto.sh25
-rw-r--r--noncore/apps/opie-reader/setqt.sh30
-rw-r--r--noncore/apps/opie-reader/setws.sh27
-rw-r--r--noncore/apps/opie-reader/setz.sh25
-rw-r--r--noncore/apps/opie-reader/striphtml.cpp232
-rw-r--r--noncore/apps/opie-reader/striphtml.h3
-rwxr-xr-xnoncore/apps/opie-reader/update-gcc3.sh47
-rwxr-xr-xnoncore/apps/opie-reader/update-opie.sh45
-rwxr-xr-xnoncore/apps/opie-reader/update.sh47
-rw-r--r--noncore/apps/opie-reader/usenef.h6
-rw-r--r--noncore/apps/opie-reader/util.cpp9
-rw-r--r--noncore/apps/opie-reader/util.h48
-rw-r--r--noncore/apps/opie-reader/version.cpp45
-rw-r--r--noncore/apps/opie-reader/version.h2
-rw-r--r--noncore/apps/opie-reader/ztxt.cpp3
94 files changed, 4630 insertions, 1068 deletions
diff --git a/noncore/apps/opie-reader/Aportis.cpp b/noncore/apps/opie-reader/Aportis.cpp
index 353996c..37dcc99 100644
--- a/noncore/apps/opie-reader/Aportis.cpp
+++ b/noncore/apps/opie-reader/Aportis.cpp
@@ -49,16 +49,17 @@ CList<Bkmk>* Aportis::getbkmklist()
else
{
return NULL;
}
}
*/
if (bCompressed != 4) return NULL;
CList<Bkmk>* t = new CList<Bkmk>;
+ unsuspend();
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);
@@ -241,16 +242,17 @@ int Aportis::OpenFile(const char *src)
int Aportis::getch()
{
if (bCompressed == 1)
{
if ((dwRecLen == 0) && !refreshbuffer()) return EOF;
else
{
+unsuspend();
int c = getc(fin);
dePeanut(c);
dwRecLen--;
currentpos++;
return c;
}
}
if (outptr != cbptr)
@@ -258,16 +260,17 @@ int Aportis::getch()
currentpos++;
return (circbuf[outptr = (outptr + 1) % 2048]);
}
if ((dwRecLen == 0) && !refreshbuffer()) return EOF;
currentpos++;
int c;
// take a char from the input buffer
+unsuspend();
c = getc(fin);
dePeanut(c);
dwRecLen--;
// separate the char into zones: 0, 1...8, 9...0x7F, 0x80...0xBF, 0xC0...0xFF
// codes 1...8 mean copy that many chars; for accented chars & binary
if (c == 0)
{
@@ -315,17 +318,17 @@ int Aportis::getch()
return circbuf[outptr = (outptr+1)%2048];
}
}
unsigned int Aportis::GetBS(unsigned int bn)
{
DWORD dwPos;
WORD fs;
-
+unsuspend();
fseek(fin, 0x56 + 8*bn, SEEK_SET);
fread(&dwPos, 4, 1, fin);
dwPos = SwapLong(dwPos);
fseek(fin,dwPos,SEEK_SET);
// gotorecordnumber(bn+1);
unsigned char ch;
fread(&ch,1,1,fin);
@@ -338,16 +341,17 @@ unsigned int Aportis::GetBS(unsigned int bn)
fs = 0;
return fs;
}
unsigned int Aportis::locate()
{
if (bCompressed == 4)
{
+unsuspend();
size_t cur = ftell(fin);
unsigned int clen = 0;
for (unsigned int i = 0; i < currentrec-1; i++)
{
unsigned int bs = GetBS(i);
if (bs == 0) break;
clen += bs;
}
@@ -396,16 +400,17 @@ bool Aportis::refreshbuffer()
{
if (currentrec < nRecs)
{
dwRecLen = recordlength(currentrec+1);
gotorecordnumber(currentrec+1);
if (bCompressed == 4)
{
unsigned char t[3];
+ unsuspend();
fread(t,1,3,fin);
if (t[0] != 241)
{
printf("You shouldn't be here!\n");
return false;
}
dwRecLen -= 3;
}
@@ -425,16 +430,17 @@ bool Aportis::refreshbuffer()
return false;
}
}
#include <qimage.h>
QImage* Aportis::getPicture(unsigned long tgt)
{
+unsuspend();
unsigned short tgtrec = tgt+mobiimagerec;
if (tgtrec > nRecs2) return NULL;
size_t cur = ftell(fin);
unsigned short reclen = recordlength(tgtrec);
gotorecordnumber(tgtrec);
UInt8* imgbuffer = new UInt8[reclen];
fread(imgbuffer, 1, reclen, fin);
QByteArray arr;
diff --git a/noncore/apps/opie-reader/ArriereCodec/.cvsignore b/noncore/apps/opie-reader/ArriereCodec/.cvsignore
new file mode 100644
index 0000000..1810ee0
--- a/dev/null
+++ b/noncore/apps/opie-reader/ArriereCodec/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+config.in
+moc_*
+.moc
+.obj
diff --git a/noncore/apps/opie-reader/ArriereCodec/ArriereCodec.pro b/noncore/apps/opie-reader/ArriereCodec/ArriereCodec.pro
new file mode 100644
index 0000000..8d820d6
--- a/dev/null
+++ b/noncore/apps/opie-reader/ArriereCodec/ArriereCodec.pro
@@ -0,0 +1,16 @@
+DEFINES += OPIE USEQPE
+VPATH = ..
+TEMPLATE = lib
+CONFIG = qt warn_on release dll
+HEADERS = arrierego.h
+
+SOURCES = arrierego.cpp
+
+INTERFACES =
+DESTDIR = $(OPIEDIR)/plugins/reader/codecs
+TARGET = ArriereGo
+LIBS += -L$(OPIEDIR)/lib -lreader_pdb -lreader_pluckerbase -lreader_codec
+
+INCLUDEPATH += $(OPIEDIR)/include
+DEPENDPATH += $(OPIEDIR)/include
+DEFINES += USENEF
diff --git a/noncore/apps/opie-reader/BuffDoc.cpp b/noncore/apps/opie-reader/BuffDoc.cpp
index 1f0a524..355d14d 100644
--- a/noncore/apps/opie-reader/BuffDoc.cpp
+++ b/noncore/apps/opie-reader/BuffDoc.cpp
@@ -1,14 +1,13 @@
#include "names.h"
#define NEWLINEBREAK
#define INCREMENTALWIDTH
-#include "usenef.h"
#include "BuffDoc.h"
#include "config.h"
#include "CDrawBuffer.h"
#include "ZText.h"
#include "ebookcodec.h"
#ifdef __STATIC
#include "Aportis.h"
@@ -16,16 +15,17 @@
#include "ppm_expander.h"
#include "ztxt.h"
#include "plucker.h"
#ifdef USENEF
#include "nef.h"
#include "arrierego.h"
#endif
#include "iSilo.h"
+#include "Reb.h"
#endif
linkType BuffDoc::hyperlink(unsigned int n, unsigned int noff, QString& wrd, QString& nm)
{
linkType bRet = eNone;
if (exp != NULL)
{
@@ -55,16 +55,28 @@ void BuffDoc::locate(unsigned int n)
#else
lastispara = false;
#endif
// tchar linebuf[1024];
if (exp != NULL) filt->locate(n);
// //qDebug("BuffDoc:Located");
}
+void BuffDoc::resetPos()
+{
+ // //qDebug("BuffDoc:locating:%u",n);
+ lastword.empty();
+ lastsizes[0] = laststartline = exp->locate();
+#ifdef NEWLINEBREAK
+ lastispara = false;
+#else
+ lastispara = false;
+#endif
+}
+
static bool isletter(unsigned short c)
{
if ('a' <= c && c <= 'z') return true;
if ('A' <= c && c <= 'Z') return true;
// Cyrillic letters
if (0x400 <= c && c <= 0x52F) return true;
return false;
}
@@ -630,16 +642,23 @@ int BuffDoc::openfile(QWidget* _parent, const char *src)
delete exp;
exp = new iSilo;
ret = exp->openfile(src);
}
if (ret != 0)
{
delete exp;
//qDebug("Trying ppms");
+ exp = new CReb;
+ ret = exp->openfile(src);
+ }
+ 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");
@@ -650,17 +669,27 @@ int BuffDoc::openfile(QWidget* _parent, const char *src)
if (ret != 0)
{
delete exp;
QMessageBox::information(_parent, PROGNAME, "Unknown file compression type","Try another file");
return ret;
}
// //qDebug("Doing final open:%x:%x",exp,filt);
#else
- QString codecpath(QTReaderUtil::getPluginPath());
+#ifdef USEQPE
+#ifdef OPIE
+ QString codecpath(getenv("OPIEDIR"));
+#else
+ QString codecpath(getenv("QTDIR"));
+#endif
+ codecpath += "/plugins/reader/codecs";
+#else
+ QString codecpath(getenv("READERDIR"));
+ codecpath += "/codecs";
+#endif
QDir d(codecpath, "*.so");
if (d.exists())
{
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
@@ -701,8 +730,30 @@ int BuffDoc::openfile(QWidget* _parent, const char *src)
qDebug("BuffDoc:file opened");
return 0;
}
QString BuffDoc::about()
{
return QString("Buffered Decompressor (c) Tim Wentford\nHyphenation algorithm (c) Tim Wentford\n (Cyrillic support by Konstantin Isakov\n")+filt->about();
}
+
+int BuffDoc::getsentence(CBuffer& buff)
+{
+ tchar ch;
+ int i = 0;
+ bool intext = false;
+ while ((ch = getch()) != 10 && ch != UEOF)
+ {
+ buff[i++] = ch;
+ if (ch == '"' || ch == '\'' || ch == 0x2018 || ch == 0x2019 ||
+ ch == 0x201a || ch == 0x201b || ch == 0x201c || ch == 0x201d)
+ {
+ intext = !intext;
+ }
+ if (!intext && (ch == '.' || ch == '!' || ch == '?')) break;
+ }
+
+ buff[i] = '\0';
+ if (i == 0 && ch == UEOF) i = -1;
+ laststartline = exp->locate();
+ return i;
+}
diff --git a/noncore/apps/opie-reader/BuffDoc.h b/noncore/apps/opie-reader/BuffDoc.h
index 2b4fb57..d6bfd99 100644
--- a/noncore/apps/opie-reader/BuffDoc.h
+++ b/noncore/apps/opie-reader/BuffDoc.h
@@ -42,20 +42,18 @@ class BuffDoc
{
if (exp != NULL)
{
exp->putSaveData(src, srclen);
}
}
#ifdef USEQPE
void suspend() { if (exp != NULL) exp->suspend(); }
- void unsuspend() { if (exp != NULL) exp->unsuspend(); }
#else
void suspend() {}
- void unsuspend() {}
#endif
~BuffDoc()
{
delete filt;
delete exp;
}
BuffDoc()
{
@@ -90,20 +88,32 @@ class BuffDoc
{
if (exp != NULL)
{
filt->getch(ch, sty, pos);
}
else
ch = UEOF;
}
+ /*
+ void rawgetch(tchar& ch, CStyle& sty, unsigned long& pos)
+ {
+ if (exp != NULL)
+ {
+ filt->rawgetch(ch, sty, pos);
+ }
+ else
+ ch = UEOF;
+ }
+ */
void setwidth(int w) { if (exp != NULL) exp->setwidth(w); }
QImage* getPicture(unsigned long tgt) { return (exp == NULL) ? NULL : exp->getPicture(tgt); }
unsigned int startSection() { return (exp == NULL) ? 0 : exp->startSection(); }
unsigned int endSection() { return (exp == NULL) ? 0 : exp->endSection(); }
+ void resetPos();
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(); }
linkType hyperlink(unsigned int n, unsigned int noff, QString& wrd, QString& nm);
size_t getHome() { return ((exp != NULL) ? exp->getHome() : 0); }
void locate(unsigned int n);
bool getline(CDrawBuffer* buff, int w, unsigned short _lborder, unsigned short _rborder, bool hyphenate, int availht);
@@ -124,20 +134,25 @@ class BuffDoc
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;
}
+ int getsentence(CBuffer& buff);
void saveposn(const QString& f, size_t posn) { filt->saveposn(f, posn); }
void writeposn(const QString& f, size_t posn) { filt->writeposn(f, posn); }
linkType forward(QString& f, size_t& loc) { return filt->forward(f, loc); }
linkType back(QString& f, size_t& loc) { return filt->back(f, loc); }
- bool hasnavigation() { return filt->hasnavigation(); }
- bool getFile(QString href)
+ bool hasnavigation() { return (exp == NULL) ? false : filt->hasnavigation(); }
+ bool getFile(const QString& href, QString& nm)
+ {
+ return (exp == NULL) ? false : exp->getFile(href, nm);
+ }
+ QString getTableAsHtml(unsigned long loc)
{
- return (exp == NULL) ? false : exp->getFile(href);
+ return (exp != NULL) ? filt->getTableAsHtml(loc) : QString("");
}
};
#endif
diff --git a/noncore/apps/opie-reader/ButtonPrefs.cpp b/noncore/apps/opie-reader/ButtonPrefs.cpp
index 50365a8..762de55 100644
--- a/noncore/apps/opie-reader/ButtonPrefs.cpp
+++ b/noncore/apps/opie-reader/ButtonPrefs.cpp
@@ -147,16 +147,20 @@ CButtonPrefs::CButtonPrefs( QMap<orKey, int>* _kmap, QWidget* parent, const cha
lo = new QHBoxLayout();
QLabel* TextLabel = new QLabel( this, "TextLabel1" );
TextLabel->setText( tr( "Debounce" ) );
lo->addWidget(TextLabel);
debounce = new QSpinBox( this, "Debounce" );
debounce->setRange(0,1000);
lo->addWidget(debounce);
+ /*
+ QPushButton* assignClose = new QPushButton("Assign\nCancel", this);
+ lo->addWidget(assignClose);
+ */
lo->addStretch(1);
QPushButton* delButton = new QPushButton("Delete", this);
connect(delButton, SIGNAL( clicked() ), this, SLOT( erasemapping() ));
lo->addWidget(delButton);
QPushButton* exitButton = new QPushButton("Close", this);
connect(exitButton, SIGNAL( clicked() ), this, SLOT( slotClosed() ) );
lo->addWidget(exitButton);
vo->addLayout(lo);
diff --git a/noncore/apps/opie-reader/CDrawBuffer.cpp b/noncore/apps/opie-reader/CDrawBuffer.cpp
index bfb3027..227f0f6 100644
--- a/noncore/apps/opie-reader/CDrawBuffer.cpp
+++ b/noncore/apps/opie-reader/CDrawBuffer.cpp
@@ -359,16 +359,17 @@ int CDrawBuffer::offset(int scwidth, unsigned short _lborder, unsigned short _rb
currentx = (
scwidth - _lborder -_rborder +
leftMargin() - rightMargin()
- width(availht))/2 + _lborder;
}
break;
case m_AlignJustify:
case m_AlignLeft:
+ case m_AlignNone:
currentx = _lborder + leftMargin();
break;
}
return currentx;
}
void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int scwidth, unsigned short _lborder, unsigned short _rborder, const QColor& _bg, int availht)
{
@@ -479,17 +480,17 @@ void CDrawBuffer::render(QPainter* _p, int _y, bool _bMono, int _charWidth, int
// if (drawBackground) qDebug("Drawing background");
QFont f((currentstyle.isMono() && fc->hasCourier()) ? fc->fixedfontname() : fc->name(), fc->getsize(currentstyle), (currentstyle.isBold()) ? QFont::Bold : QFont::Normal, (currentstyle.isItalic()) );
// f.setUnderline(currentstyle.isUnderline());
// if (currentstyle.isUnderline()) qDebug("UNDERLINE");
_p->setFont(f);
QString str = text.mid(textstart->start, end-textstart->start);
#if defined(OPIE) || !defined(USEQPE)
- _p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/100));
+ _p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/10/*0*/));
#else
_p->setPen(QPen(QColor(currentstyle.Red(), currentstyle.Green(), currentstyle.Blue()), fc->getsize(currentstyle)/10));
#endif
int voffset = currentstyle.getVOffset()*fc->getsize(currentstyle)/2;
if (_bMono)
{
@@ -653,17 +654,17 @@ CStyle CDrawBuffer::laststyle()
return segs.last().style;
}
CStyle CDrawBuffer::firststyle()
{
return segs.first().style;
}
-linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt, size_t& offset, size_t& pictgt, QImage*& img)
+linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt, size_t& offset, size_t& pictgt, QImage*& img, size_t& tabletgt)
{
linkType ret = eNone;
int end = 0;
CStyle currentstyle;
CList<textsegment>::iterator textstart = segs.begin();
CList<textsegment>::iterator textend = textstart;
do
{
@@ -685,16 +686,21 @@ linkType CDrawBuffer::getLinkType(int numchars, size_t& tgt, size_t& offset, siz
ret |= ePicture;
}
if (currentstyle.getLink())
{
tgt = currentstyle.getData();
offset = currentstyle.getOffset();
ret |= eLink;
}
+ if (currentstyle.isTable())
+ {
+ tabletgt = currentstyle.getTable();
+ ret |= eTable;
+ }
return ret;
}
void CDrawBuffer::resize(int availht)
{
int gzoom = fc->gzoom();
m_ascent = m_descent = m_lineSpacing = m_lineExtraSpacing = 0;
/*
@@ -711,17 +717,17 @@ void CDrawBuffer::resize(int availht)
{
m_hastext = true;
break;
}
iter++;
}
if (m_hastext)
{
-
+ int p_linespacing = 0;
for (CList<textsegment>::iterator iter = segs.begin(); iter != segs.end() && iter->start <= len; )
{
CList<textsegment>::iterator next = iter;
iter++;
int st = next->start;
if (st < 0) st = 0;
CStyle _style = next->style;
@@ -751,33 +757,44 @@ void CDrawBuffer::resize(int availht)
ht = availht;
willscale = true;
}
if (willscale || _style.canScale())
{
descent = ((gzoom*_style.getPicture()->height())/100-ascent)/2;
ascent = ((gzoom*_style.getPicture()->height())/100+ascent)/2;
}
+ else
+ {
+ descent = (_style.getPicture()->height()-ascent)/2;
+ ascent = (_style.getPicture()->height()+ascent)/2;
+ }
+ int lineSpacing = ascent+descent;
+ if (lineSpacing > p_linespacing)
+ {
+ p_linespacing = lineSpacing;
+ }
+ extra = 0;
}
/*
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;
}
- m_showPartial = (m_lineSpacing > t_lineSpacing);
+ m_showPartial = (p_linespacing > t_lineSpacing);
int lead = fc->getlead();
if (lead != 0)
{
int xt = (lead*t_lineSpacing+5)/10;
m_lineExtraSpacing += xt;
m_lineSpacing += xt;
}
if (m_bSop)
diff --git a/noncore/apps/opie-reader/CDrawBuffer.h b/noncore/apps/opie-reader/CDrawBuffer.h
index 2625a72..1782cf8 100644
--- a/noncore/apps/opie-reader/CDrawBuffer.h
+++ b/noncore/apps/opie-reader/CDrawBuffer.h
@@ -73,15 +73,15 @@ class CDrawBuffer : public CBuffer
CStyle firststyle();
CStyle laststyle();
int ascent() { return m_ascent; }
int descent() { return m_descent; }
int lineSpacing() { return m_lineSpacing; }
int lineExtraSpacing() { return m_lineExtraSpacing; }
// void frig();
- linkType getLinkType(int numchars, size_t& tgt, size_t& offset, size_t& pictgt, QImage*&);
+ linkType getLinkType(int numchars, size_t& tgt, size_t& offset, size_t& pictgt, QImage*&, size_t&);
void resize(int);
bool showPartial() { return m_showPartial; }
CStyle* getNextLink(int&);
int invertLink(int);
};
#endif
diff --git a/noncore/apps/opie-reader/CEncoding.h b/noncore/apps/opie-reader/CEncoding.h
index 1dfd74d..76cbfae 100644
--- a/noncore/apps/opie-reader/CEncoding.h
+++ b/noncore/apps/opie-reader/CEncoding.h
@@ -7,32 +7,39 @@
class CEncoding : public CCharacterSource
{
friend class CFilterChain;
protected:
CExpander_Interface* parent;
linkType hyperlink(unsigned int n, unsigned int noff, QString& t, QString& nm) { return parent->hyperlink(n, noff, t, nm); }
public:
+ virtual QString getTableAsHtml(unsigned long loc)
+ {
+ qDebug("CEncoding::getTableAsHtml()");
+ return parent->getTableAsHtml(loc);
+ }
CEncoding() : parent(NULL) {}
void setparent(CExpander_Interface* p) { parent = p; }
virtual ~CEncoding() {};
void locate(unsigned int n) { parent->locate(n); }
- bool findanchor(const QString& nm) { return false; }
+ bool findanchor(const QString& nm)
+ {
+ return parent->findanchor(nm);
+ }
void saveposn(const QString& f, size_t posn) { parent->saveposn(posn); }
void writeposn(const QString& f, size_t posn) { parent->writeposn(posn); }
linkType forward(QString& f, size_t& loc) { return parent->forward(loc); }
linkType back(QString& f, size_t& loc) { return parent->back(loc); }
bool hasnavigation() { return parent->hasnavigation(); }
virtual int getwidth() { return parent->getwidth(); }
QImage* getPicture(unsigned long tgt) { return parent->getPicture(tgt); }
QImage* getPicture(const QString& href) { return parent->getPicture(href); }
- bool getFile(const QString& href) { qDebug("Encoding Get File"); return parent->getFile(href);}
-
-
+ bool getFile(const QString& href, const QString& nm) { qDebug("Encoding Get File"); return parent->getFile(href, nm);}
+ unsigned long startSection() { return parent->startSection(); }
};
class CUtf8 : public CEncoding
{
public:
void getch(tchar& ch, CStyle& sty, unsigned long& pos);
QString about() { return QString("UTF8 decoder (c) Tim Wentford\n")+parent->about(); }
};
diff --git a/noncore/apps/opie-reader/CExpander.cpp b/noncore/apps/opie-reader/CExpander.cpp
index e398d86..1158a7a 100644
--- a/noncore/apps/opie-reader/CExpander.cpp
+++ b/noncore/apps/opie-reader/CExpander.cpp
@@ -1,9 +1,12 @@
#include "CExpander.h"
+#ifdef USEQPE
+#include <qpe/global.h>
+#endif
size_t CExpander::getHome() { return m_homepos; }
CExpander::CExpander() : m_homepos(0), fname(NULL), m_scrWidth(240), m_currentstart(1), m_currentend(0) {};
CExpander::~CExpander() { if (fname != NULL) delete [] fname; };
int CExpander::openfile(const char *src)
@@ -65,20 +68,25 @@ void CExpander::suspend(FILE*& fin)
}
void CExpander::unsuspend(FILE*& fin)
{
if (bSuspended)
{
bSuspended = false;
int delay = time(NULL) - sustime;
- if (delay < 10) sleep(10-delay);
+ if (delay < 10)
+ {
+ Global::statusMessage("Stalling");
+ sleep(10-delay);
+ }
fin = fopen(fname, "rb");
for (int i = 0; fin == NULL && i < 5; i++)
{
+ Global::statusMessage("Stalling");
sleep(5);
fin = fopen(fname, "rb");
}
if (fin == NULL)
{
QMessageBox::warning(NULL, PROGNAME, "Couldn't reopen file");
exit(0);
}
diff --git a/noncore/apps/opie-reader/CExpander.h b/noncore/apps/opie-reader/CExpander.h
index 7fa84f9..24c317d 100644
--- a/noncore/apps/opie-reader/CExpander.h
+++ b/noncore/apps/opie-reader/CExpander.h
@@ -19,30 +19,32 @@ class Bkmk;
class QString;
template<class T>
class CList;
class CCharacterSource
{
public:
+ virtual QString getTableAsHtml(unsigned long loc) = 0;
virtual void getch(tchar&, CStyle&, unsigned long&) = 0;
virtual linkType hyperlink(unsigned int n, unsigned int noff, QString&, QString& nm) = 0;
virtual void locate(unsigned int n) = 0;
virtual bool findanchor(const QString& nm) = 0;
virtual void saveposn(const QString& f, size_t posn) = 0;
virtual void writeposn(const QString& f, size_t posn) = 0;
virtual linkType forward(QString& f, size_t& loc) = 0;
virtual linkType back(QString& f, size_t& loc) = 0;
virtual bool hasnavigation() = 0;
virtual int getwidth() = 0;
virtual QImage* getPicture(unsigned long) = 0;
virtual QImage* getPicture(const QString& href) = 0;
- virtual bool getFile(const QString& href) = 0;
+ virtual bool getFile(const QString& href, const QString& nm) = 0;
virtual QString about() = 0;
+ virtual unsigned long startSection() = 0;
};
class CExpander_Interface
{
public:
#ifdef USEQPE
virtual void suspend() = 0;
virtual void unsuspend() = 0;
@@ -78,17 +80,19 @@ class CExpander_Interface
#endif
virtual void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen) = 0;
virtual void putSaveData(unsigned char*& src, unsigned short& srclen) = 0;
virtual void setwidth(int w) = 0;
// bool findstring(const QString& info);
// int getpara(CBuffer& buff);
virtual int getwidth() = 0;
virtual QImage* getPicture(const QString& href) = 0;
- virtual bool getFile(const QString& href) = 0;
+ virtual bool getFile(const QString& href, const QString& nm) = 0;
+ virtual bool findanchor(const QString& nm) = 0;
+ virtual QString getTableAsHtml(unsigned long loc) { return QString(""); }
};
class CExpander : public CExpander_Interface
{
protected:
size_t m_homepos;
bool m_continuous;
char* fname;
@@ -138,11 +142,15 @@ class CExpander : public CExpander_Interface
}
int getwidth()
{
return m_scrWidth;
}
// bool findstring(const QString& info);
// int getpara(CBuffer& buff);
virtual QImage* getPicture(const QString& href) { return NULL; }
- virtual bool getFile(const QString& href) { return false; }
+ virtual bool getFile(const QString& href, const QString& nm) { return false; }
+ virtual bool findanchor(const QString& nm)
+ {
+ return false;
+ }
};
#endif
diff --git a/noncore/apps/opie-reader/CFilter.cpp b/noncore/apps/opie-reader/CFilter.cpp
index ab98829..25cdfae 100644
--- a/noncore/apps/opie-reader/CFilter.cpp
+++ b/noncore/apps/opie-reader/CFilter.cpp
@@ -1,19 +1,19 @@
#include <qmap.h>
#include <qfileinfo.h>
#include <qtextstream.h>
#include <qdir.h>
+
#ifdef USEQPE
#include <qpe/global.h>
#endif
#include "CDrawBuffer.h"
#include "CFilter.h"
#include "hrule.h"
-#include "util.h"
#include <qregexp.h>
#include <qimage.h>
#include <qpixmap.h>
//#include <qprogressdialog.h>
//#include <qapplication.h>
void textfmt::mygetch(tchar& ch, CStyle& sty, unsigned long& pos)
@@ -660,18 +660,27 @@ class ErrorFilter : public CFilter
}
}
QString about() { return parent->about(); }
};
#ifndef __STATIC
ExternFilter::ExternFilter(const QString& nm, const QString& optional) : filt(NULL), handle(NULL)
{
- QString filterpath(QTReaderUtil::getPluginPath("filters"));
- filterpath += "/lib";
+#ifdef USEQPE
+#ifdef OPIE
+ QString filterpath(getenv("OPIEDIR"));
+#else
+ QString filterpath(getenv("QTDIR"));
+#endif
+ filterpath += "/plugins/reader/filters/lib";
+#else
+ QString filterpath(getenv("READERDIR"));
+ filterpath += "/filters/lib";
+#endif
filterpath += nm;
filterpath += ".so";
if (QFile::exists(filterpath))
{
qDebug("Filter:%s", (const char*)filterpath);
handle = dlopen(filterpath, RTLD_LAZY);
if (handle == 0)
{
@@ -687,17 +696,17 @@ ExternFilter::ExternFilter(const QString& nm, const QString& optional) : filt(NU
qDebug("Can't find newfilter");
filt = new ErrorFilter(QString("Can't find entry point in plugin:")+nm);
return;
}
filt = (*newfilter)(optional);
}
else
{
- qDebug("No filter path");
+ qDebug("No filter path:%s", (const char*)filterpath);
filt = new ErrorFilter(QString("No filter plugins installed:")+nm);
}
if (filt == NULL)
{
qDebug("Can't do newfilter");
filt = new ErrorFilter(QString("Filter creation failed:")+nm);
return;
}
@@ -808,8 +817,45 @@ void repara::getch(tchar& ch, CStyle& sty, unsigned long& pos)
ch = ' ';
return;
}
}
tch = ch;
*/
return;
}
+
+void tableLink::getch(tchar& ch, CStyle& sty, unsigned long& pos)
+{
+ if (offset >= (int)text.length())
+ {
+ offset = -1;
+ sty.setColour(m_r, m_g, m_b);
+ do
+ {
+ parent->getch(ch, sty, pos);
+ }
+ while (sty.isTable());
+ return;
+ }
+ if (offset >= 0)
+ {
+ ch = text[offset++].unicode();
+ return;
+ }
+ parent->getch(ch, sty, pos);
+ if (sty.isTable())
+ {
+ offset = 1;
+ ch = text[0].unicode();
+ m_r = sty.Red(), m_g = sty.Green(), m_b = sty.Blue();
+ sty.setColour(255, 0, 0);
+ }
+ return;
+}
+
+void underlineLink::getch(tchar& ch, CStyle& sty, unsigned long& pos)
+{
+ parent->getch(ch, sty, pos);
+ if (sty.getLink()) sty.setUnderline();
+ //if (isLink && !sty.getLink()) sty.unsetUnderline();
+ //isLink = sty.getLink();
+}
diff --git a/noncore/apps/opie-reader/CFilter.h b/noncore/apps/opie-reader/CFilter.h
index 174e6b4..594b606 100644
--- a/noncore/apps/opie-reader/CFilter.h
+++ b/noncore/apps/opie-reader/CFilter.h
@@ -14,23 +14,29 @@ class CFilter_IFace : public CCharacterSource
virtual bool findanchor(const QString& nm) = 0;
virtual void saveposn(const QString& f, size_t posn) = 0;
virtual void writeposn(const QString& f, size_t posn) = 0;
virtual linkType forward(QString& f, size_t& loc) = 0;
virtual linkType back(QString& f, size_t& loc) = 0;
virtual bool hasnavigation() = 0;
virtual int getwidth() = 0;
virtual CCharacterSource* getparent() = 0;
+ virtual unsigned long startSection() = 0;
};
class CFilter : public CFilter_IFace
{
protected:
CCharacterSource* parent;
public:
+ virtual QString getTableAsHtml(unsigned long loc)
+ {
+ qDebug("CFilter::getTableAsHtml()");
+ return parent->getTableAsHtml(loc);
+ }
virtual linkType hyperlink(unsigned int n, unsigned int noff, QString& w, QString& nm)
{
return parent->hyperlink(n,noff,w,nm);
}
CFilter() : parent(NULL) {}
void setparent(CCharacterSource* p) { parent = p; }
CCharacterSource* getparent() { return parent; }
virtual ~CFilter() {};
@@ -45,17 +51,18 @@ class CFilter : public CFilter_IFace
virtual void saveposn(const QString& f, size_t posn) { parent->saveposn(f, posn); }
virtual void writeposn(const QString& f, size_t posn) { parent->writeposn(f, posn); }
virtual linkType forward(QString& f, size_t& loc) { return parent->forward(f, loc); }
virtual linkType back(QString& f, size_t& loc) { return parent->back(f, loc); }
virtual bool hasnavigation() { return parent->hasnavigation(); }
virtual int getwidth() { return parent->getwidth(); }
QImage* getPicture(unsigned long tgt) { return parent->getPicture(tgt); }
QImage* getPicture(const QString& href) { return parent->getPicture(href); }
- bool getFile(const QString& href) { return parent->getFile(href); }
+ bool getFile(const QString& href, const QString& nm) { return parent->getFile(href, nm); }
+ virtual unsigned long startSection() { return parent->startSection(); }
};
class CFilterChain
{
CExpander_Interface* expander;
CEncoding* encoder;
CFilter_IFace* first;
CCharacterSource* front;
@@ -71,24 +78,34 @@ class CFilterChain
delete pnext;
}
delete encoder;
}
linkType hyperlink(unsigned int n, unsigned int noff, QString& wrd, QString& nm)
{
return front->hyperlink(n, noff, wrd, nm);
}
+ QString getTableAsHtml(unsigned long loc)
+ {
+ return front->getTableAsHtml(loc);
+ }
void locate(unsigned int n)
{
front->locate(n);
}
void getch(tchar& ch, CStyle& sty, unsigned long& pos)
{
front->getch(ch, sty, pos);
}
+ /*
+ void rawgetch(tchar& ch, CStyle& sty, unsigned long& pos)
+ {
+ encoder->getch(ch, sty, pos);
+ }
+ */
void addfilter(CFilter_IFace* p)
{
if (first == NULL)
{
front = first = p;
p->setparent(encoder);
}
else
@@ -398,38 +415,47 @@ class ExternFilter : public CFilter_IFace
{
CFilter* filt;
void *handle;
public:
linkType hyperlink(unsigned int n, unsigned int noff, QString& w, QString& nm)
{
return filt->hyperlink(n, noff, w, nm);
}
+ QString getTableAsHtml(unsigned long loc)
+ {
+ qDebug("ExternFilter::getTableAsHtml()");
+ return filt->getTableAsHtml(loc);
+ }
void setparent(CCharacterSource* p) { filt->setparent(p); }
ExternFilter(const QString& nm, const QString& optional);
~ExternFilter()
{
if (filt != NULL) delete filt;
if (handle != NULL) dlclose(handle);
}
void locate(unsigned int n) { filt->locate(n); }
- bool findanchor(const QString& nm) { return filt->findanchor(nm); }
+ bool findanchor(const QString& nm)
+ {
+ return filt->findanchor(nm);
+ }
void saveposn(const QString& f, size_t posn) { filt->saveposn(f, posn); }
void writeposn(const QString& f, size_t posn) { filt->writeposn(f, posn); }
linkType forward(QString& f, size_t& loc) { return filt->forward(f, loc); }
linkType back(QString& f, size_t& loc) { return filt->back(f, loc); }
bool hasnavigation() { return filt->hasnavigation(); }
int getwidth() { return filt->getwidth(); }
CCharacterSource* getparent() { return filt->getparent(); }
void getch(tchar& c, CStyle& s, unsigned long& l) { filt->getch(c, s, l); }
QImage* getPicture(unsigned long tgt) { return filt->getPicture(tgt); }
CFilter* filter() { return filt; }
QImage* getPicture(const QString& href) { return filt->getPicture(href); }
- bool getFile(const QString& href) { return filt->getFile(href); }
+ bool getFile(const QString& href, const QString& nm) { return filt->getFile(href, nm); }
QString about() { return QString("Filter plug-in (c) Tim Wentford\n")+filt->about(); }
+ unsigned long startSection() { return filt->startSection(); }
};
#endif
class kern : public CFilter
{
tchar lastchar;
bool uselast;
CStyle laststy;
@@ -466,9 +492,32 @@ class setfg : public CFilter
{
int m_r, m_g, m_b;
public:
setfg(int _r, int _g, int _b) : m_r(_r), m_g(_g), m_b(_b) {}
void getch(tchar& ch, CStyle& sty, unsigned long& pos);
QString about() { return QString("Foreground colour filter (c) Tim Wentford\n")+parent->about(); }
};
+class tableLink : public CFilter
+{
+ QString text;
+ int offset;
+ int m_r, m_g, m_b;
+ public:
+ tableLink() : text( "See Table" ), offset(-1)
+ {
+ }
+ void getch(tchar& ch, CStyle& sty, unsigned long& pos);
+ QString about() { return QString("Table link filter (c) Tim Wentford\n")+parent->about(); }
+};
+
+class underlineLink : public CFilter
+{
+ bool isLink;
+ public:
+ underlineLink() : isLink(false) {}
+ ~underlineLink() {}
+ void getch(tchar& ch, CStyle& sty, unsigned long& pos);
+ QString about() { return QString("Link underlining filter (c) Tim Wentford\n")+parent->about(); }
+};
+
#endif
diff --git a/noncore/apps/opie-reader/CHM.cpp b/noncore/apps/opie-reader/CHM.cpp
index 88d53bf..ace5abc 100644
--- a/noncore/apps/opie-reader/CHM.cpp
+++ b/noncore/apps/opie-reader/CHM.cpp
@@ -1,15 +1,18 @@
#include "CHM.h"
#include "chm_lib.h"
#include <qstring.h>
#include <qstringlist.h>
#include <stdio.h>
#include <qimage.h>
#include <qpixmap.h>
+#ifdef USEQPE
+#include <qpe/global.h>
+#endif
#ifndef __STATIC
extern "C"
{
CExpander* newcodec() { return new CHM; }
}
#endif
@@ -61,19 +64,23 @@ void CHM::suspend() {
void CHM::unsuspend() {
#ifdef USEQPE
if (bSuspended)
{
bSuspended = false;
int delay = time(NULL) - sustime;
if (delay < 10)
+ {
+ Global::statusMessage("Stalling");
sleep(10-delay);
+ }
chmFile = chm_open(fname);
for (int i = 0; chmFile == NULL && i < 5; i++) {
+ Global::statusMessage("Stalling");
sleep(5);
chmFile = chm_open(fname);
}
if (chmFile == NULL) {
QMessageBox::warning(NULL, PROGNAME, "Couldn't reopen file");
exit(0);
}
//suspos = gzseek(file, suspos, SEEK_SET);
@@ -81,16 +88,17 @@ void CHM::unsuspend() {
#endif
}
void CHM::addContent(QString content) {
chmBuffer += content;
}
void CHM::FillHomeContent() {
+unsuspend();
if (chmHHCPath != "") {
const char *ext;
char buffer[65536];
unsigned int swath, offset;
QString tmp="";
QString HTML="";
/* try to find the file */
const char *filename = (const char *)chmHHCPath;
@@ -157,16 +165,17 @@ void CHM::FillHomeContent() {
fsize = chmBuffer.length();
m_currentstart = m_ui.start;
m_currentend = m_currentstart+chmBuffer.length();
}
}
bool CHM::FillBuffer()
{
+unsuspend();
bool bRetVal = false;
char buffer[65536];
int swath, offset;
chmBuffer = "";
swath = 65536;
offset = 0;
fsize = m_ui.length;
while (offset < m_ui.length)
@@ -191,16 +200,17 @@ bool CHM::FillBuffer()
bufpos = 0;
bRetVal = true;
m_currentstart = m_ui.start;
m_currentend = m_currentstart+chmBuffer.length();
return bRetVal;
}
bool CHM::FillContent() {
+unsuspend();
bool bRetVal = false;
if (chmPath != "") {
/* try to find the file */
const char *filename = (const char *)chmPath;
if (chm_resolve_object(chmFile, filename, &m_ui) != CHM_RESOLVE_SUCCESS)
{
fsize = chmBuffer.length();
return bRetVal;
@@ -234,17 +244,18 @@ bool CHM::FillContent() {
bufpos = 0;
m_currentstart = m_ui.start;
m_currentend = m_currentstart+chmBuffer.length();
bRetVal = true;
}
return bRetVal;
}
-bool CHM::getFile(const QString& href) {
+bool CHM::getFile(const QString& _href, const QString& ) {
+ QString href = "/" + _href;
qDebug("Got:%s", (const char*)href);
bool bRetVal = false;
QString temp = chmPath;
chmPath = href;
if (FillContent()) {
qDebug("Got it");
bRetVal = true;
} else {
diff --git a/noncore/apps/opie-reader/CHM.h b/noncore/apps/opie-reader/CHM.h
index 001f7fc..291818d 100644
--- a/noncore/apps/opie-reader/CHM.h
+++ b/noncore/apps/opie-reader/CHM.h
@@ -51,17 +51,17 @@ public:
void addContent(QString content);
void getch(tchar& ch, CStyle& sty);
void setPath(QString PathName) {chmPath = PathName;};
void setHomePath(QString PathName) {chmHHCPath = PathName;};
MarkupType PreferredMarkup() {
return cCHM;
}
- bool getFile(const QString& href);
+ bool getFile(const QString& href, const QString& nm);
QImage *getPicture(const QString& href);
QString about() { return QString("CHM codec (c) Bob Griffin\nchm_lib (c) Jed Wing\nLZX code (c) Stuart Cale"); }
private :
bool FillBuffer();
bool FillContent();
void FillHomeContent();
};
#endif
diff --git a/noncore/apps/opie-reader/CRegExp.cpp b/noncore/apps/opie-reader/CRegExp.cpp
index 77dc2dc..6318d28 100644
--- a/noncore/apps/opie-reader/CRegExp.cpp
+++ b/noncore/apps/opie-reader/CRegExp.cpp
diff --git a/noncore/apps/opie-reader/CSource.h b/noncore/apps/opie-reader/CSource.h
new file mode 100644
index 0000000..2885f72
--- a/dev/null
+++ b/noncore/apps/opie-reader/CSource.h
@@ -0,0 +1,62 @@
+#ifndef __CSOURCE_H
+#define __CSOURCE_H
+
+class CInfo
+{
+ public:
+ virtual unsigned long size() = 0;
+};
+
+class CSource : public CInfo
+{
+ public:
+ virtual int get() = 0;
+};
+
+class CSink : public CInfo
+{
+ public:
+ virtual void put(unsigned char c) = 0;
+};
+
+class CMemSource : public CSource
+{
+ unsigned long m_total_size;
+ unsigned long m_current;
+ unsigned char* m_buffer;
+ public:
+ CMemSource(unsigned char* _buffer, unsigned long _size)
+ :
+ m_total_size(_size),
+ m_current(0),
+ m_buffer(_buffer)
+ {}
+ unsigned long size() { return m_current; }
+ int get()
+ {
+ return ((m_current < m_total_size) ? m_buffer[m_current++] : -1);
+ }
+};
+
+class CMemSink : public CSink
+{
+ unsigned long m_total_size;
+ unsigned long m_current;
+ unsigned char* m_buffer;
+ public:
+ CMemSink(unsigned char* _buffer, unsigned long _size)
+ :
+ m_total_size(_size),
+ m_current(0),
+ m_buffer(_buffer)
+ {}
+ unsigned long size() { return m_current; }
+ void put(unsigned char c)
+ {
+ if (m_current < m_total_size)
+ {
+ m_buffer[m_current++] = c;
+ }
+ }
+};
+#endif
diff --git a/noncore/apps/opie-reader/Coder.h b/noncore/apps/opie-reader/Coder.h
new file mode 100644
index 0000000..64587cf
--- a/dev/null
+++ b/noncore/apps/opie-reader/Coder.h
@@ -0,0 +1,113 @@
+#include "CSource.h"
+/****************************************************************************
+ * This file is part of PPMd project *
+ * Contents: 'Carryless rangecoder' by Dmitry Subbotin *
+ * Comments: this implementation is claimed to be a public domain *
+ ****************************************************************************/
+/********************** Original text *************************************
+//////// Carryless rangecoder (c) 1999 by Dmitry Subbotin ////////
+
+typedef unsigned int uint;
+typedef unsigned char uc;
+
+#define DO(n) for (int _=0; _<n; _++)
+#define TOP (1<<24)
+#define BOT (1<<16)
+
+
+class RangeCoder
+{
+ uint low, code, range, passed;
+ FILE *f;
+
+ void OutByte (uc c) { passed++; fputc(c,f); }
+ uc InByte () { passed++; return fgetc(f); }
+
+public:
+
+ uint GetPassed () { return passed; }
+ void StartEncode (FILE *F) { f=F; passed=low=0; range= (uint) -1; }
+ void FinishEncode () { DO(4) OutByte(low>>24), low<<=8; }
+ void StartDecode (FILE *F) { passed=low=code=0; range= (uint) -1;
+ f=F; DO(4) code= code<<8 | InByte();
+ }
+
+ void Encode (uint cumFreq, uint freq, uint totFreq) {
+ assert(cumFreq+freq<totFreq && freq && totFreq<=BOT);
+ low += cumFreq * (range/= totFreq);
+ range*= freq;
+ while ((low ^ low+range)<TOP || range<BOT && ((range= -low & BOT-1),1))
+ OutByte(low>>24), range<<=8, low<<=8;
+ }
+
+ uint GetFreq (uint totFreq) {
+ uint tmp= (code-low) / (range/= totFreq);
+ if (tmp >= totFreq) throw ("Input data corrupt"); // or force it to return
+ return tmp; // a valid value :)
+ }
+
+ void Decode (uint cumFreq, uint freq, uint totFreq) {
+ assert(cumFreq+freq<totFreq && freq && totFreq<=BOT);
+ low += cumFreq*range;
+ range*= freq;
+ while ((low ^ low+range)<TOP || range<BOT && ((range= -low & BOT-1),1))
+ code= code<<8 | InByte(), range<<=8, low<<=8;
+ }
+};
+*****************************************************************************/
+
+static struct SUBRANGE {
+ DWORD LowCount, HighCount, scale;
+} SubRange;
+enum { TOP=1 << 24, BOT=1 << 15 };
+static DWORD low, code, range;
+
+inline void ariInitEncoder()
+{
+ low=0; range=DWORD(-1);
+}
+#define ARI_ENC_NORMALIZE(stream) { \
+ while ((low ^ (low+range)) < TOP || range < BOT && \
+ ((range= -low & (BOT-1)),1)) { \
+ _PPMD_E_PUTC(low >> 24,stream); \
+ range <<= 8; low <<= 8; \
+ } \
+}
+inline void ariEncodeSymbol()
+{
+ low += SubRange.LowCount*(range /= SubRange.scale);
+ range *= SubRange.HighCount-SubRange.LowCount;
+}
+inline void ariShiftEncodeSymbol(UINT SHIFT)
+{
+ low += SubRange.LowCount*(range >>= SHIFT);
+ range *= SubRange.HighCount-SubRange.LowCount;
+}
+#define ARI_FLUSH_ENCODER(stream) { \
+ for (UINT i=0;i < 4;i++) { \
+ _PPMD_E_PUTC(low >> 24,stream); low <<= 8; \
+ } \
+}
+#define ARI_INIT_DECODER(stream) { \
+ low=code=0; range=DWORD(-1); \
+ for (UINT i=0;i < 4;i++) \
+ code=(code << 8) | _PPMD_D_GETC(stream); \
+}
+#define ARI_DEC_NORMALIZE(stream) { \
+ while ((low ^ (low+range)) < TOP || range < BOT && \
+ ((range= -low & (BOT-1)),1)) { \
+ code=(code << 8) | _PPMD_D_GETC(stream); \
+ range <<= 8; low <<= 8; \
+ } \
+}
+inline UINT ariGetCurrentCount() {
+ return (code-low)/(range /= SubRange.scale);
+}
+inline UINT ariGetCurrentShiftCount(UINT SHIFT) {
+ return (code-low)/(range >>= SHIFT);
+}
+inline void ariRemoveSubrange()
+{
+ low += range*SubRange.LowCount;
+ range *= SubRange.HighCount-SubRange.LowCount;
+}
diff --git a/noncore/apps/opie-reader/FliteCmd/.cvsignore b/noncore/apps/opie-reader/FliteCmd/.cvsignore
new file mode 100644
index 0000000..1810ee0
--- a/dev/null
+++ b/noncore/apps/opie-reader/FliteCmd/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+config.in
+moc_*
+.moc
+.obj
diff --git a/noncore/apps/opie-reader/FliteCmd/FliteCmd.pro b/noncore/apps/opie-reader/FliteCmd/FliteCmd.pro
new file mode 100644
index 0000000..0e1a782
--- a/dev/null
+++ b/noncore/apps/opie-reader/FliteCmd/FliteCmd.pro
@@ -0,0 +1,18 @@
+DEFINES += OPIE USEQPE
+VPATH = ..
+TEMPLATE = lib
+CONFIG = qt warn_on release dll
+HEADERS = flitecmd.h
+
+SOURCES = flitecmd.cpp
+
+
+INTERFACES =
+DESTDIR = $(OPIEDIR)/plugins/reader/outcodecs
+TARGET = flitecmd
+
+
+INCLUDEPATH += $(OPIEDIR)/include
+DEPENDPATH += $(OPIEDIR)/include
+
+include( $(OPIEDIR)/include.pro )
diff --git a/noncore/apps/opie-reader/FliteDyn/.cvsignore b/noncore/apps/opie-reader/FliteDyn/.cvsignore
new file mode 100644
index 0000000..1810ee0
--- a/dev/null
+++ b/noncore/apps/opie-reader/FliteDyn/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+config.in
+moc_*
+.moc
+.obj
diff --git a/noncore/apps/opie-reader/FliteDyn/FliteDyn.pro b/noncore/apps/opie-reader/FliteDyn/FliteDyn.pro
new file mode 100644
index 0000000..a949209
--- a/dev/null
+++ b/noncore/apps/opie-reader/FliteDyn/FliteDyn.pro
@@ -0,0 +1,18 @@
+DEFINES += OPIE USEQPE
+VPATH = ..
+TEMPLATE = lib
+CONFIG = qt warn_on release dll
+HEADERS = flitedyn.h
+
+SOURCES = flitedyn.cpp
+
+
+INTERFACES =
+DESTDIR = $(OPIEDIR)/plugins/reader/outcodecs
+TARGET = flitedyn
+LIBS += -L/home/tim/flite/flite-1.2-release/lib -lflite_cmu_us_kal -lflite_usenglish -lflite_cmulex -lflite
+
+INCLUDEPATH += /home/tim/flite/flite-1.2-release/include $(OPIEDIR)/include
+DEPENDPATH += /home/tim/flite/flite-1.2-release/include $(OPIEDIR)/include
+
+include( $(OPIEDIR)/include.pro )
diff --git a/noncore/apps/opie-reader/FliteDyn16/.cvsignore b/noncore/apps/opie-reader/FliteDyn16/.cvsignore
new file mode 100644
index 0000000..1810ee0
--- a/dev/null
+++ b/noncore/apps/opie-reader/FliteDyn16/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+config.in
+moc_*
+.moc
+.obj
diff --git a/noncore/apps/opie-reader/FliteDyn16/FliteDyn16.pro b/noncore/apps/opie-reader/FliteDyn16/FliteDyn16.pro
new file mode 100644
index 0000000..49c2c42
--- a/dev/null
+++ b/noncore/apps/opie-reader/FliteDyn16/FliteDyn16.pro
@@ -0,0 +1,18 @@
+DEFINES += OPIE USEQPE
+VPATH = ..
+TEMPLATE = lib
+CONFIG = qt warn_on release dll
+HEADERS = flitedyn.h
+
+SOURCES = flitedyn.cpp
+
+
+INTERFACES =
+DESTDIR = $(OPIEDIR)/plugins/reader/outcodecs
+TARGET = flitedyn
+LIBS += -L/home/tim/flite/flite-1.2-release/lib -lflite_cmu_us_kal16 -lflite_usenglish -lflite_cmulex -lflite
+
+INCLUDEPATH += /home/tim/flite/flite-1.2-release/include $(OPIEDIR)/include
+DEPENDPATH += /home/tim/flite/flite-1.2-release/include $(OPIEDIR)/include
+
+include( $(OPIEDIR)/include.pro )
diff --git a/noncore/apps/opie-reader/FontControl.cpp b/noncore/apps/opie-reader/FontControl.cpp
index 9bb3bc0..08b8c52 100644
--- a/noncore/apps/opie-reader/FontControl.cpp
+++ b/noncore/apps/opie-reader/FontControl.cpp
@@ -1,9 +1,10 @@
#include <qfontdatabase.h>
+
#include "FontControl.h"
int FontControl::gzoom()
{
if (m_fixgraphics)
{
return 100;
}
diff --git a/noncore/apps/opie-reader/FontControl.h b/noncore/apps/opie-reader/FontControl.h
index 90d39b2..563e1a8 100644
--- a/noncore/apps/opie-reader/FontControl.h
+++ b/noncore/apps/opie-reader/FontControl.h
@@ -56,17 +56,17 @@ class FontControl
if (tgt < 0)
{
tgt = 0;
}
if (tgt >= m_maxsize)
{
tgt = m_maxsize - 1;
}
- return m_fontsizes[tgt];
+ return tgt >= 0 ? m_fontsizes[tgt] : 12;
}
int ascent()
{
QFont f(name(), currentsize());
QFontMetrics fm(f);
return fm.ascent();
}
int ascent(const CStyle& ch)
diff --git a/noncore/apps/opie-reader/Model.cpp b/noncore/apps/opie-reader/Model.cpp
new file mode 100644
index 0000000..6b61fa0
--- a/dev/null
+++ b/noncore/apps/opie-reader/Model.cpp
@@ -0,0 +1,721 @@
+/****************************************************************************
+ * This file is part of PPMd project *
+ * Written and distributed to public domain by Dmitry Shkarin 1997, *
+ * 1999-2001 *
+ * Contents: PPMII model description and encoding/decoding routines *
+ ****************************************************************************/
+#include <string.h>
+#include "PPMd.h"
+#pragma hdrstop
+#include "Coder.h"
+#include "SubAlloc.h"
+
+enum { UP_FREQ=5, INT_BITS=7, PERIOD_BITS=7, TOT_BITS=INT_BITS+PERIOD_BITS,
+ INTERVAL=1 << INT_BITS, BIN_SCALE=1 << TOT_BITS, MAX_FREQ=124, O_BOUND=9 };
+
+#pragma pack(1)
+static struct SEE2_CONTEXT { // SEE-contexts for PPM-contexts with masked symbols
+ WORD Summ;
+ BYTE Shift, Count;
+ void init(UINT InitVal) { Summ=InitVal << (Shift=PERIOD_BITS-4); Count=7; }
+ UINT getMean() {
+ UINT RetVal=(Summ >> Shift); Summ -= RetVal;
+ return RetVal+(RetVal == 0);
+ }
+ void update() {
+ if (Shift < PERIOD_BITS && --Count == 0) {
+ Summ += Summ; Count=3 << Shift++;
+ }
+ }
+} _PACK_ATTR SEE2Cont[24][32], DummySEE2Cont;
+static struct PPM_CONTEXT { // Notes:
+ BYTE NumStats, Flags; // 1. NumStats & NumMasked contain
+ WORD SummFreq; // number of symbols minus 1
+ struct STATE { // 2. sizeof(WORD) > sizeof(BYTE)
+ BYTE Symbol, Freq; // 3. contexts example:
+ PPM_CONTEXT* Successor; // MaxOrder:
+ } _PACK_ATTR * Stats; // ABCD context
+ PPM_CONTEXT* Suffix; // BCD suffix
+ inline void encodeBinSymbol(int symbol);// BCDE successor
+ inline void encodeSymbol1(int symbol);// other orders:
+ inline void encodeSymbol2(int symbol);// BCD context
+ inline void decodeBinSymbol();// CD suffix
+ inline void decodeSymbol1();// BCDE successor
+ inline void decodeSymbol2();
+ inline void update1(STATE* p);
+ inline void update2(STATE* p);
+ inline SEE2_CONTEXT* makeEscFreq2();
+ void rescale();
+ void refresh(int OldNU,BOOL Scale);
+ PPM_CONTEXT* cutOff(int Order);
+ PPM_CONTEXT* removeBinConts(int Order);
+ STATE& oneState() const { return (STATE&) SummFreq; }
+} _PACK_ATTR* MaxContext;
+#pragma pack()
+
+static BYTE NS2BSIndx[256], QTable[260]; // constants
+static PPM_CONTEXT::STATE* FoundState; // found next state transition
+static int InitEsc, OrderFall, RunLength, InitRL, MaxOrder;
+static BYTE CharMask[256], NumMasked, PrevSuccess, EscCount, PrintCount;
+static WORD BinSumm[25][64]; // binary SEE-contexts
+static MR_METHOD MRMethod;
+
+inline void SWAP(PPM_CONTEXT::STATE& s1,PPM_CONTEXT::STATE& s2)
+{
+ /*
+ WORD t1=(WORD&) s1; PPM_CONTEXT* t2=s1.Successor;
+ (WORD&) s1 = (WORD&) s2; s1.Successor=s2.Successor;
+ (WORD&) s2 = t1; s2.Successor=t2;
+ */
+ PPM_CONTEXT::STATE t = s1;
+ s1 = s2;
+ s2 = t;
+}
+inline void StateCpy(PPM_CONTEXT::STATE& s1,const PPM_CONTEXT::STATE& s2)
+{
+ // (WORD&) s1=(WORD&) s2; s1.Successor=s2.Successor;
+ s1 = s2;
+}
+struct PPMD_STARTUP { inline PPMD_STARTUP(); } PPMd_StartUp;
+inline PPMD_STARTUP::PPMD_STARTUP() // constants initialization
+{
+ UINT i, k, m, Step;
+ for (i=0,k=1;i < N1 ;i++,k += 1) Indx2Units[i]=k;
+ for (k++;i < N1+N2 ;i++,k += 2) Indx2Units[i]=k;
+ for (k++;i < N1+N2+N3 ;i++,k += 3) Indx2Units[i]=k;
+ for (k++;i < N1+N2+N3+N4;i++,k += 4) Indx2Units[i]=k;
+ for (k=i=0;k < 128;k++) {
+ i += (Indx2Units[i] < k+1); Units2Indx[k]=i;
+ }
+ NS2BSIndx[0]=2*0; NS2BSIndx[1]=2*1;
+ memset(NS2BSIndx+2,2*2,9); memset(NS2BSIndx+11,2*3,256-11);
+ for (i=0;i < UP_FREQ;i++) QTable[i]=i;
+ for (m=i=UP_FREQ, k=Step=1;i < 260;i++) {
+ QTable[i]=m;
+ if ( !--k ) { k = ++Step; m++; }
+ }
+ (DWORD&) DummySEE2Cont=PPMdSignature;
+}
+static void _STDCALL StartModelRare(int MaxOrder,MR_METHOD MRMethod)
+{
+ UINT i, k, m;
+ memset(CharMask,0,sizeof(CharMask)); EscCount=PrintCount=1;
+ if (MaxOrder < 2) { // we are in solid mode
+ OrderFall=::MaxOrder;
+ for (PPM_CONTEXT* pc=MaxContext;pc->Suffix != NULL;pc=pc->Suffix)
+ OrderFall--;
+ return;
+ }
+ OrderFall=::MaxOrder=MaxOrder; ::MRMethod=MRMethod;
+ InitSubAllocator();
+ RunLength=InitRL=-((MaxOrder < 12)?MaxOrder:12)-1;
+ MaxContext = (PPM_CONTEXT*) AllocContext();
+ MaxContext->Suffix=NULL;
+ MaxContext->SummFreq=(MaxContext->NumStats=255)+2;
+ MaxContext->Stats = (PPM_CONTEXT::STATE*) AllocUnits(256/2);
+ for (PrevSuccess=i=0;i < 256;i++) {
+ MaxContext->Stats[i].Symbol=i; MaxContext->Stats[i].Freq=1;
+ MaxContext->Stats[i].Successor=NULL;
+ }
+static const WORD InitBinEsc[]={0x3CDD,0x1F3F,0x59BF,0x48F3,0x64A1,0x5ABC,0x6632,0x6051};
+ for (i=m=0;m < 25;m++) {
+ while (QTable[i] == m) i++;
+ for (k=0;k < 8;k++)
+ BinSumm[m][k]=BIN_SCALE-InitBinEsc[k]/(i+1);
+ for (k=8;k < 64;k += 8)
+ memcpy(BinSumm[m]+k,BinSumm[m],8*sizeof(WORD));
+ }
+ for (i=m=0;m < 24;m++) {
+ while (QTable[i+3] == m+3) i++;
+ SEE2Cont[m][0].init(2*i+5);
+ for (k=1;k < 32;k++) SEE2Cont[m][k]=SEE2Cont[m][0];
+ }
+}
+void PPM_CONTEXT::refresh(int OldNU,BOOL Scale)
+{
+ int i=NumStats, EscFreq;
+ STATE* p = Stats = (STATE*) ShrinkUnits(Stats,OldNU,(i+2) >> 1);
+ Flags=(Flags & (0x10+0x04*Scale))+0x08*(p->Symbol >= 0x40);
+ EscFreq=SummFreq-p->Freq;
+ SummFreq = (p->Freq=(p->Freq+Scale) >> Scale);
+ do {
+ EscFreq -= (++p)->Freq;
+ SummFreq += (p->Freq=(p->Freq+Scale) >> Scale);
+ Flags |= 0x08*(p->Symbol >= 0x40);
+ } while ( --i );
+ SummFreq += (EscFreq=(EscFreq+Scale) >> Scale);
+}
+#define P_CALL(F) ( PrefetchData(p->Successor), \
+ p->Successor=p->Successor->F(Order+1))
+PPM_CONTEXT* PPM_CONTEXT::cutOff(int Order)
+{
+ int i, tmp;
+ STATE* p;
+ if ( !NumStats ) {
+ if ((BYTE*) (p=&oneState())->Successor >= UnitsStart) {
+ if (Order < MaxOrder) P_CALL(cutOff);
+ else p->Successor=NULL;
+ if (!p->Successor && Order > O_BOUND)
+ goto REMOVE;
+ return this;
+ } else {
+REMOVE: SpecialFreeUnit(this); return NULL;
+ }
+ }
+ PrefetchData(Stats);
+ Stats = (STATE*) MoveUnitsUp(Stats,tmp=(NumStats+2) >> 1);
+ for (p=Stats+(i=NumStats);p >= Stats;p--)
+ if ((BYTE*) p->Successor < UnitsStart) {
+ p->Successor=NULL; SWAP(*p,Stats[i--]);
+ } else if (Order < MaxOrder) P_CALL(cutOff);
+ else p->Successor=NULL;
+ if (i != NumStats && Order) {
+ NumStats=i; p=Stats;
+ if (i < 0) { FreeUnits(p,tmp); goto REMOVE; }
+ else if (i == 0) {
+ Flags=(Flags & 0x10)+0x08*(p->Symbol >= 0x40);
+ StateCpy(oneState(),*p); FreeUnits(p,tmp);
+ oneState().Freq=(oneState().Freq+11) >> 3;
+ } else refresh(tmp,SummFreq > 16*i);
+ }
+ return this;
+}
+PPM_CONTEXT* PPM_CONTEXT::removeBinConts(int Order)
+{
+ STATE* p;
+ if ( !NumStats ) {
+ p=&oneState();
+ if ((BYTE*) p->Successor >= UnitsStart && Order < MaxOrder)
+ P_CALL(removeBinConts);
+ else p->Successor=NULL;
+ if (!p->Successor && (!Suffix->NumStats || Suffix->Flags == 0xFF)) {
+ FreeUnits(this,1); return NULL;
+ } else return this;
+ }
+ PrefetchData(Stats);
+ for (p=Stats+NumStats;p >= Stats;p--)
+ if ((BYTE*) p->Successor >= UnitsStart && Order < MaxOrder)
+ P_CALL(removeBinConts);
+ else p->Successor=NULL;
+ return this;
+}
+static void RestoreModelRare(PPM_CONTEXT* pc1,PPM_CONTEXT* MinContext,
+ PPM_CONTEXT* FSuccessor)
+{
+ PPM_CONTEXT* pc;
+ PPM_CONTEXT::STATE* p;
+ for (pc=MaxContext, pText=HeapStart;pc != pc1;pc=pc->Suffix)
+ if (--(pc->NumStats) == 0) {
+ pc->Flags=(pc->Flags & 0x10)+0x08*(pc->Stats->Symbol >= 0x40);
+ p=pc->Stats; StateCpy(pc->oneState(),*p);
+ SpecialFreeUnit(p);
+ pc->oneState().Freq=(pc->oneState().Freq+11) >> 3;
+ } else
+ pc->refresh((pc->NumStats+3) >> 1,FALSE);
+ for ( ;pc != MinContext;pc=pc->Suffix)
+ if ( !pc->NumStats )
+ pc->oneState().Freq -= pc->oneState().Freq >> 1;
+ else if ((pc->SummFreq += 4) > 128+4*pc->NumStats)
+ pc->refresh((pc->NumStats+2) >> 1,TRUE);
+ if (MRMethod > MRM_FREEZE) {
+ MaxContext=FSuccessor; GlueCount += !(BList[1].Stamp & 1);
+ } else if (MRMethod == MRM_FREEZE) {
+ while ( MaxContext->Suffix ) MaxContext=MaxContext->Suffix;
+ MaxContext->removeBinConts(0); MRMethod=MR_METHOD(MRMethod+1);
+ GlueCount=0; OrderFall=MaxOrder;
+ } else if (MRMethod == MRM_RESTART || GetUsedMemory() < (SubAllocatorSize >> 1)) {
+ StartModelRare(MaxOrder,MRMethod);
+ EscCount=0; PrintCount=0xFF;
+ } else {
+ while ( MaxContext->Suffix ) MaxContext=MaxContext->Suffix;
+ do {
+ MaxContext->cutOff(0); ExpandTextArea();
+ } while (GetUsedMemory() > 3*(SubAllocatorSize >> 2));
+ GlueCount=0; OrderFall=MaxOrder;
+ }
+}
+static PPM_CONTEXT* _FASTCALL CreateSuccessors(BOOL Skip,PPM_CONTEXT::STATE* p,
+ PPM_CONTEXT* pc);
+static PPM_CONTEXT* _FASTCALL ReduceOrder(PPM_CONTEXT::STATE* p,PPM_CONTEXT* pc)
+{
+ PPM_CONTEXT::STATE* p1, * ps[MAX_O], ** pps=ps;
+ PPM_CONTEXT* pc1=pc, * UpBranch = (PPM_CONTEXT*) pText;
+ BYTE tmp, sym=FoundState->Symbol;
+ *pps++ = FoundState; FoundState->Successor=UpBranch;
+ OrderFall++;
+ if ( p ) { pc=pc->Suffix; goto LOOP_ENTRY; }
+ for ( ; ; ) {
+ if ( !pc->Suffix ) {
+ if (MRMethod > MRM_FREEZE) {
+FROZEN: do { (*--pps)->Successor = pc; } while (pps != ps);
+ pText=HeapStart+1; OrderFall=1;
+ }
+ return pc;
+ }
+ pc=pc->Suffix;
+ if ( pc->NumStats ) {
+ if ((p=pc->Stats)->Symbol != sym)
+ do { tmp=p[1].Symbol; p++; } while (tmp != sym);
+ tmp=2*(p->Freq < MAX_FREQ-9);
+ p->Freq += tmp; pc->SummFreq += tmp;
+ } else { p=&(pc->oneState()); p->Freq += (p->Freq < 32); }
+LOOP_ENTRY:
+ if ( p->Successor ) break;
+ *pps++ = p; p->Successor=UpBranch;
+ OrderFall++;
+ }
+ if (MRMethod > MRM_FREEZE) {
+ pc = p->Successor; goto FROZEN;
+ } else if (p->Successor <= UpBranch) {
+ p1=FoundState; FoundState=p;
+ p->Successor=CreateSuccessors(FALSE,NULL,pc);
+ FoundState=p1;
+ }
+ if (OrderFall == 1 && pc1 == MaxContext) {
+ FoundState->Successor=p->Successor; pText--;
+ }
+ return p->Successor;
+}
+void PPM_CONTEXT::rescale()
+{
+ UINT OldNU, Adder, EscFreq, i=NumStats;
+ STATE tmp, * p1, * p;
+ for (p=FoundState;p != Stats;p--) SWAP(p[0],p[-1]);
+ p->Freq += 4; SummFreq += 4;
+ EscFreq=SummFreq-p->Freq;
+ Adder=(OrderFall != 0 || MRMethod > MRM_FREEZE);
+ SummFreq = (p->Freq=(p->Freq+Adder) >> 1);
+ do {
+ EscFreq -= (++p)->Freq;
+ SummFreq += (p->Freq=(p->Freq+Adder) >> 1);
+ if (p[0].Freq > p[-1].Freq) {
+ StateCpy(tmp,*(p1=p));
+ do StateCpy(p1[0],p1[-1]); while (tmp.Freq > (--p1)[-1].Freq);
+ StateCpy(*p1,tmp);
+ }
+ } while ( --i );
+ if (p->Freq == 0) {
+ do { i++; } while ((--p)->Freq == 0);
+ EscFreq += i; OldNU=(NumStats+2) >> 1;
+ if ((NumStats -= i) == 0) {
+ StateCpy(tmp,*Stats);
+ tmp.Freq=(2*tmp.Freq+EscFreq-1)/EscFreq;
+ if (tmp.Freq > MAX_FREQ/3) tmp.Freq=MAX_FREQ/3;
+ FreeUnits(Stats,OldNU); StateCpy(oneState(),tmp);
+ Flags=(Flags & 0x10)+0x08*(tmp.Symbol >= 0x40);
+ FoundState=&oneState(); return;
+ }
+ Stats = (STATE*) ShrinkUnits(Stats,OldNU,(NumStats+2) >> 1);
+ Flags &= ~0x08; i=NumStats;
+ Flags |= 0x08*((p=Stats)->Symbol >= 0x40);
+ do { Flags |= 0x08*((++p)->Symbol >= 0x40); } while ( --i );
+ }
+ SummFreq += (EscFreq -= (EscFreq >> 1));
+ Flags |= 0x04; FoundState=Stats;
+}
+static PPM_CONTEXT* _FASTCALL CreateSuccessors(BOOL Skip,PPM_CONTEXT::STATE* p,
+ PPM_CONTEXT* pc)
+{
+ PPM_CONTEXT ct, * UpBranch=FoundState->Successor;
+ PPM_CONTEXT::STATE* ps[MAX_O], ** pps=ps;
+ UINT cf, s0;
+ BYTE tmp, sym=FoundState->Symbol;
+ if ( !Skip ) {
+ *pps++ = FoundState;
+ if ( !pc->Suffix ) goto NO_LOOP;
+ }
+ if ( p ) { pc=pc->Suffix; goto LOOP_ENTRY; }
+ do {
+ pc=pc->Suffix;
+ if ( pc->NumStats ) {
+ if ((p=pc->Stats)->Symbol != sym)
+ do { tmp=p[1].Symbol; p++; } while (tmp != sym);
+ tmp=(p->Freq < MAX_FREQ-9);
+ p->Freq += tmp; pc->SummFreq += tmp;
+ } else {
+ p=&(pc->oneState());
+ p->Freq += (!pc->Suffix->NumStats & (p->Freq < 24));
+ }
+LOOP_ENTRY:
+ if (p->Successor != UpBranch) {
+ pc=p->Successor; break;
+ }
+ *pps++ = p;
+ } while ( pc->Suffix );
+NO_LOOP:
+ if (pps == ps) return pc;
+ ct.NumStats=0; ct.Flags=0x10*(sym >= 0x40);
+ ct.oneState().Symbol=sym=*(BYTE*) UpBranch;
+ ct.oneState().Successor=(PPM_CONTEXT*) (((BYTE*) UpBranch)+1);
+ ct.Flags |= 0x08*(sym >= 0x40);
+ if ( pc->NumStats ) {
+ if ((p=pc->Stats)->Symbol != sym)
+ do { tmp=p[1].Symbol; p++; } while (tmp != sym);
+ s0=pc->SummFreq-pc->NumStats-(cf=p->Freq-1);
+ ct.oneState().Freq=1+((2*cf <= s0)?(5*cf > s0):((cf+2*s0-3)/s0));
+ } else
+ ct.oneState().Freq=pc->oneState().Freq;
+ do {
+ PPM_CONTEXT* pc1 = (PPM_CONTEXT*) AllocContext();
+ if ( !pc1 ) return NULL;
+ ((DWORD*) pc1)[0] = ((DWORD*) &ct)[0];
+ ((DWORD*) pc1)[1] = ((DWORD*) &ct)[1];
+ pc1->Suffix=pc; (*--pps)->Successor=pc=pc1;
+ } while (pps != ps);
+ return pc;
+}
+static inline void UpdateModel(PPM_CONTEXT* MinContext)
+{
+ PPM_CONTEXT::STATE* p=NULL;
+ PPM_CONTEXT* Successor, * FSuccessor, * pc, * pc1=MaxContext;
+ UINT ns1, ns, cf, sf, s0, FFreq=FoundState->Freq;
+ BYTE Flag, sym, FSymbol=FoundState->Symbol;
+ FSuccessor=FoundState->Successor; pc=MinContext->Suffix;
+ if (FFreq < MAX_FREQ/4 && pc) {
+ if ( pc->NumStats ) {
+ if ((p=pc->Stats)->Symbol != FSymbol) {
+ do { sym=p[1].Symbol; p++; } while (sym != FSymbol);
+ if (p[0].Freq >= p[-1].Freq) {
+ SWAP(p[0],p[-1]); p--;
+ }
+ }
+ cf=2*(p->Freq < MAX_FREQ-9);
+ p->Freq += cf; pc->SummFreq += cf;
+ } else { p=&(pc->oneState()); p->Freq += (p->Freq < 32); }
+ }
+ if (!OrderFall && FSuccessor) {
+ FoundState->Successor=CreateSuccessors(TRUE,p,MinContext);
+ if ( !FoundState->Successor ) goto RESTART_MODEL;
+ MaxContext=FoundState->Successor; return;
+ }
+ *pText++ = FSymbol; Successor = (PPM_CONTEXT*) pText;
+ if (pText >= UnitsStart) goto RESTART_MODEL;
+ if ( FSuccessor ) {
+ if ((BYTE*) FSuccessor < UnitsStart)
+ FSuccessor=CreateSuccessors(FALSE,p,MinContext);
+ } else
+ FSuccessor=ReduceOrder(p,MinContext);
+ if ( !FSuccessor ) goto RESTART_MODEL;
+ if ( !--OrderFall ) {
+ Successor=FSuccessor; pText -= (MaxContext != MinContext);
+ } else if (MRMethod > MRM_FREEZE) {
+ Successor=FSuccessor; pText=HeapStart;
+ OrderFall=0;
+ }
+ s0=MinContext->SummFreq-(ns=MinContext->NumStats)-FFreq;
+ for (Flag=0x08*(FSymbol >= 0x40);pc1 != MinContext;pc1=pc1->Suffix) {
+ if ((ns1=pc1->NumStats) != 0) {
+ if ((ns1 & 1) != 0) {
+ p=(PPM_CONTEXT::STATE*) ExpandUnits(pc1->Stats,(ns1+1) >> 1);
+ if ( !p ) goto RESTART_MODEL;
+ pc1->Stats=p;
+ }
+ pc1->SummFreq += (3*ns1+1 < ns);
+ } else {
+ p=(PPM_CONTEXT::STATE*) AllocUnits(1);
+ if ( !p ) goto RESTART_MODEL;
+ StateCpy(*p,pc1->oneState()); pc1->Stats=p;
+ if (p->Freq < MAX_FREQ/4-1) p->Freq += p->Freq;
+ else p->Freq = MAX_FREQ-4;
+ pc1->SummFreq=p->Freq+InitEsc+(ns > 2);
+ }
+ cf=2*FFreq*(pc1->SummFreq+6); sf=s0+pc1->SummFreq;
+ if (cf < 6*sf) {
+ cf=1+(cf > sf)+(cf >= 4*sf);
+ pc1->SummFreq += 4;
+ } else {
+ cf=4+(cf > 9*sf)+(cf > 12*sf)+(cf > 15*sf);
+ pc1->SummFreq += cf;
+ }
+ p=pc1->Stats+(++pc1->NumStats); p->Successor=Successor;
+ p->Symbol = FSymbol; p->Freq = cf;
+ pc1->Flags |= Flag;
+ }
+ MaxContext=FSuccessor; return;
+RESTART_MODEL:
+ RestoreModelRare(pc1,MinContext,FSuccessor);
+}
+// Tabulated escapes for exponential symbol distribution
+static const BYTE ExpEscape[16]={ 25,14, 9, 7, 5, 5, 4, 4, 4, 3, 3, 3, 2, 2, 2, 2 };
+#define GET_MEAN(SUMM,SHIFT,ROUND) ((SUMM+(1 << (SHIFT-ROUND))) >> (SHIFT))
+inline void PPM_CONTEXT::encodeBinSymbol(int symbol)
+{
+ BYTE indx=NS2BSIndx[Suffix->NumStats]+PrevSuccess+Flags;
+ STATE& rs=oneState();
+ WORD& bs=BinSumm[QTable[rs.Freq-1]][indx+((RunLength >> 26) & 0x20)];
+ if (rs.Symbol == symbol) {
+ FoundState=&rs; rs.Freq += (rs.Freq < 196);
+ SubRange.LowCount=0; SubRange.HighCount=bs;
+ bs += INTERVAL-GET_MEAN(bs,PERIOD_BITS,2);
+ PrevSuccess=1; RunLength++;
+ } else {
+ SubRange.LowCount=bs; bs -= GET_MEAN(bs,PERIOD_BITS,2);
+ SubRange.HighCount=BIN_SCALE; InitEsc=ExpEscape[bs >> 10];
+ CharMask[rs.Symbol]=EscCount;
+ NumMasked=PrevSuccess=0; FoundState=NULL;
+ }
+}
+inline void PPM_CONTEXT::decodeBinSymbol()
+{
+ BYTE indx=NS2BSIndx[Suffix->NumStats]+PrevSuccess+Flags;
+ STATE& rs=oneState();
+ WORD& bs=BinSumm[QTable[rs.Freq-1]][indx+((RunLength >> 26) & 0x20)];
+ if (ariGetCurrentShiftCount(TOT_BITS) < bs) {
+ FoundState=&rs; rs.Freq += (rs.Freq < 196);
+ SubRange.LowCount=0; SubRange.HighCount=bs;
+ bs += INTERVAL-GET_MEAN(bs,PERIOD_BITS,2);
+ PrevSuccess=1; RunLength++;
+ } else {
+ SubRange.LowCount=bs; bs -= GET_MEAN(bs,PERIOD_BITS,2);
+ SubRange.HighCount=BIN_SCALE; InitEsc=ExpEscape[bs >> 10];
+ CharMask[rs.Symbol]=EscCount;
+ NumMasked=PrevSuccess=0; FoundState=NULL;
+ }
+}
+inline void PPM_CONTEXT::update1(STATE* p)
+{
+ (FoundState=p)->Freq += 4; SummFreq += 4;
+ if (p[0].Freq > p[-1].Freq) {
+ SWAP(p[0],p[-1]); FoundState=--p;
+ if (p->Freq > MAX_FREQ) rescale();
+ }
+}
+inline void PPM_CONTEXT::encodeSymbol1(int symbol)
+{
+ UINT LoCnt, i=Stats->Symbol;
+ STATE* p=Stats; SubRange.scale=SummFreq;
+ if (i == symbol) {
+ PrevSuccess=(2*(SubRange.HighCount=p->Freq) >= SubRange.scale);
+ (FoundState=p)->Freq += 4; SummFreq += 4;
+ RunLength += PrevSuccess;
+ if (p->Freq > MAX_FREQ) rescale();
+ SubRange.LowCount=0; return;
+ }
+ LoCnt=p->Freq;
+ i=NumStats; PrevSuccess=0;
+ while ((++p)->Symbol != symbol) {
+ LoCnt += p->Freq;
+ if (--i == 0) {
+ if ( Suffix ) PrefetchData(Suffix);
+ SubRange.LowCount=LoCnt; CharMask[p->Symbol]=EscCount;
+ i=NumMasked=NumStats; FoundState=NULL;
+ do { CharMask[(--p)->Symbol]=EscCount; } while ( --i );
+ SubRange.HighCount=SubRange.scale;
+ return;
+ }
+ }
+ SubRange.HighCount=(SubRange.LowCount=LoCnt)+p->Freq;
+ update1(p);
+}
+inline void PPM_CONTEXT::decodeSymbol1()
+{
+ UINT i, count, HiCnt=Stats->Freq;
+ STATE* p=Stats; SubRange.scale=SummFreq;
+ if ((count=ariGetCurrentCount()) < HiCnt) {
+ PrevSuccess=(2*(SubRange.HighCount=HiCnt) >= SubRange.scale);
+ (FoundState=p)->Freq=(HiCnt += 4); SummFreq += 4;
+ RunLength += PrevSuccess;
+ if (HiCnt > MAX_FREQ) rescale();
+ SubRange.LowCount=0; return;
+ }
+ i=NumStats; PrevSuccess=0;
+ while ((HiCnt += (++p)->Freq) <= count)
+ if (--i == 0) {
+ if ( Suffix ) PrefetchData(Suffix);
+ SubRange.LowCount=HiCnt; CharMask[p->Symbol]=EscCount;
+ i=NumMasked=NumStats; FoundState=NULL;
+ do { CharMask[(--p)->Symbol]=EscCount; } while ( --i );
+ SubRange.HighCount=SubRange.scale;
+ return;
+ }
+ SubRange.LowCount=(SubRange.HighCount=HiCnt)-p->Freq;
+ update1(p);
+}
+inline void PPM_CONTEXT::update2(STATE* p)
+{
+ (FoundState=p)->Freq += 4; SummFreq += 4;
+ if (p->Freq > MAX_FREQ) rescale();
+ EscCount++; RunLength=InitRL;
+}
+inline SEE2_CONTEXT* PPM_CONTEXT::makeEscFreq2()
+{
+ BYTE* pb=(BYTE*) Stats; UINT t=2*NumStats;
+ PrefetchData(pb); PrefetchData(pb+t);
+ PrefetchData(pb += 2*t); PrefetchData(pb+t);
+ SEE2_CONTEXT* psee2c;
+ if (NumStats != 0xFF) {
+ t=Suffix->NumStats;
+ psee2c=SEE2Cont[QTable[NumStats+2]-3]+(SummFreq > 11*(NumStats+1));
+ psee2c += 2*(2*NumStats < t+NumMasked)+Flags;
+ SubRange.scale=psee2c->getMean();
+ } else {
+ psee2c=&DummySEE2Cont; SubRange.scale=1;
+ }
+ return psee2c;
+}
+inline void PPM_CONTEXT::encodeSymbol2(int symbol)
+{
+ SEE2_CONTEXT* psee2c=makeEscFreq2();
+ UINT Sym, LoCnt=0, i=NumStats-NumMasked;
+ STATE* p1, * p=Stats-1;
+ do {
+ do { Sym=p[1].Symbol; p++; } while (CharMask[Sym] == EscCount);
+ CharMask[Sym]=EscCount;
+ if (Sym == symbol) goto SYMBOL_FOUND;
+ LoCnt += p->Freq;
+ } while ( --i );
+ SubRange.HighCount=(SubRange.scale += (SubRange.LowCount=LoCnt));
+ psee2c->Summ += SubRange.scale; NumMasked = NumStats;
+ return;
+SYMBOL_FOUND:
+ SubRange.LowCount=LoCnt; SubRange.HighCount=(LoCnt+=p->Freq);
+ for (p1=p; --i ; ) {
+ do { Sym=p1[1].Symbol; p1++; } while (CharMask[Sym] == EscCount);
+ LoCnt += p1->Freq;
+ }
+ SubRange.scale += LoCnt;
+ psee2c->update(); update2(p);
+}
+inline void PPM_CONTEXT::decodeSymbol2()
+{
+ SEE2_CONTEXT* psee2c=makeEscFreq2();
+ UINT Sym, count, HiCnt=0, i=NumStats-NumMasked;
+ STATE* ps[256], ** pps=ps, * p=Stats-1;
+ do {
+ do { Sym=p[1].Symbol; p++; } while (CharMask[Sym] == EscCount);
+ HiCnt += p->Freq; *pps++ = p;
+ } while ( --i );
+ SubRange.scale += HiCnt; count=ariGetCurrentCount();
+ p=*(pps=ps);
+ if (count < HiCnt) {
+ HiCnt=0;
+ while ((HiCnt += p->Freq) <= count) p=*++pps;
+ SubRange.LowCount = (SubRange.HighCount=HiCnt)-p->Freq;
+ psee2c->update(); update2(p);
+ } else {
+ SubRange.LowCount=HiCnt; SubRange.HighCount=SubRange.scale;
+ i=NumStats-NumMasked; NumMasked = NumStats;
+ do { CharMask[(*pps)->Symbol]=EscCount; pps++; } while ( --i );
+ psee2c->Summ += SubRange.scale;
+ }
+}
+inline void ClearMask(CInfo* EncodedFile, CInfo* DecodedFile)
+{
+ EscCount=1; memset(CharMask,0,sizeof(CharMask));
+ // if (++PrintCount == 0) PrintInfo(DecodedFile,EncodedFile);
+}
+void _STDCALL EncodeFile(CSink* EncodedFile, CSource* DecodedFile,
+ int MaxOrder,MR_METHOD MRMethod)
+{
+ ariInitEncoder(); StartModelRare(MaxOrder,MRMethod);
+ for (PPM_CONTEXT* MinContext; ; ) {
+ BYTE ns=(MinContext=MaxContext)->NumStats;
+ int c = _PPMD_E_GETC(DecodedFile);
+ if ( ns ) {
+ MinContext->encodeSymbol1(c); ariEncodeSymbol();
+ } else {
+ MinContext->encodeBinSymbol(c); ariShiftEncodeSymbol(TOT_BITS);
+ }
+ while ( !FoundState ) {
+ ARI_ENC_NORMALIZE(EncodedFile);
+ do {
+ OrderFall++; MinContext=MinContext->Suffix;
+ if ( !MinContext ) goto STOP_ENCODING;
+ } while (MinContext->NumStats == NumMasked);
+ MinContext->encodeSymbol2(c); ariEncodeSymbol();
+ }
+ if (!OrderFall && (BYTE*) FoundState->Successor >= UnitsStart)
+ PrefetchData(MaxContext=FoundState->Successor);
+ else {
+ UpdateModel(MinContext); PrefetchData(MaxContext);
+ if (EscCount == 0) ClearMask(EncodedFile,DecodedFile);
+ }
+ ARI_ENC_NORMALIZE(EncodedFile);
+ }
+STOP_ENCODING:
+ ARI_FLUSH_ENCODER(EncodedFile); //PrintInfo(DecodedFile,EncodedFile);
+}
+void _STDCALL DecodeFile(CSink* DecodedFile, CSource* EncodedFile,
+ int MaxOrder,MR_METHOD MRMethod)
+{
+ ARI_INIT_DECODER(EncodedFile); StartModelRare(MaxOrder,MRMethod);
+ PPM_CONTEXT* MinContext=MaxContext;
+ for (BYTE ns=MinContext->NumStats; ; ) {
+ ( ns )?(MinContext->decodeSymbol1()):(MinContext->decodeBinSymbol());
+ ariRemoveSubrange();
+ while ( !FoundState ) {
+ ARI_DEC_NORMALIZE(EncodedFile);
+ do {
+ OrderFall++; MinContext=MinContext->Suffix;
+ if ( !MinContext ) goto STOP_DECODING;
+ } while (MinContext->NumStats == NumMasked);
+ MinContext->decodeSymbol2(); ariRemoveSubrange();
+ }
+ _PPMD_D_PUTC(FoundState->Symbol,DecodedFile);
+ if (!OrderFall && (BYTE*) FoundState->Successor >= UnitsStart)
+ PrefetchData(MaxContext=FoundState->Successor);
+ else {
+ UpdateModel(MinContext); PrefetchData(MaxContext);
+ if (EscCount == 0) ClearMask(EncodedFile,DecodedFile);
+ }
+ ns=(MinContext=MaxContext)->NumStats;
+ ARI_DEC_NORMALIZE(EncodedFile);
+ }
+STOP_DECODING:
+ // PrintInfo(DecodedFile,EncodedFile);
+ return;
+}
+
+
+
+#include "PPMd.h"
+#include "CSource.h"
+
+size_t UnPPM(bool extra, unsigned char* readbuffer, size_t reclen, unsigned char* buffer, size_t buffersize)
+{
+ unsigned short order, mem, offset = 1;
+ int type = 0;
+ if (extra)
+ {
+ order = readbuffer[1];
+ mem = readbuffer[0];
+ type = order >> 6;
+ order = (order & 63) + 2;
+ offset = 2;
+ }
+ else
+ {
+ order = readbuffer[0];
+ mem = order >> 4;
+ order = (order & 15) + 2;
+ }
+ mem++;
+ // qDebug("Mem:%u Order:%u Type:%u\n", mem, order, type);
+ StartSubAllocator(mem);
+ CMemSink sink(buffer, buffersize);
+ CMemSource source(readbuffer+offset, reclen-offset);
+ DecodeFile(&sink,&source,order,(MR_METHOD)type);
+ StopSubAllocator();
+ return sink.size();
+}
+
+
+extern "C"
+{
+
+size_t PluckerDecompress3(unsigned char* a, size_t b, unsigned char* c, size_t d)
+{
+ return UnPPM(false, a, b, c, d);
+}
+
+size_t PluckerDecompress4(unsigned char* a, size_t b, unsigned char* c, size_t d)
+{
+ return UnPPM(true, a, b, c, d);
+}
+
+size_t RebDecompress(unsigned char* a, size_t b, unsigned char* c, size_t d)
+{
+ return UnPPM(true, a, b, c, d);
+}
+
+}
diff --git a/noncore/apps/opie-reader/Model.h b/noncore/apps/opie-reader/Model.h
new file mode 100644
index 0000000..f3f5274
--- a/dev/null
+++ b/noncore/apps/opie-reader/Model.h
@@ -0,0 +1,11 @@
+#ifndef __MODEL_H
+#define __MODEL_H
+
+extern "C"
+{
+ size_t PluckerDecompress3(unsigned char* a, size_t b, unsigned char* c, size_t d);
+ size_t PluckerDecompress4(unsigned char* a, size_t b, unsigned char* c, size_t d);
+ size_t RebDecompress(unsigned char* a, size_t b, unsigned char* c, size_t d);
+}
+
+#endif
diff --git a/noncore/apps/opie-reader/Palm2QImage.cpp b/noncore/apps/opie-reader/Palm2QImage.cpp
index c6907eb..361755f 100644
--- a/noncore/apps/opie-reader/Palm2QImage.cpp
+++ b/noncore/apps/opie-reader/Palm2QImage.cpp
@@ -1,9 +1,10 @@
/* -*- mode: c; indent-tabs-mode: nil; -*- */
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _WINDOWS
#include <unistd.h> /* for link */
#endif
#include <sys/types.h>
#include <sys/stat.h>
diff --git a/noncore/apps/opie-reader/Prefs.cpp b/noncore/apps/opie-reader/Prefs.cpp
index 2733faa..6c4d45b 100644
--- a/noncore/apps/opie-reader/Prefs.cpp
+++ b/noncore/apps/opie-reader/Prefs.cpp
@@ -3,26 +3,29 @@
**
** Created: Tue Feb 11 23:53:35 2003
** by: The User Interface Compiler (uic)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
#include "Prefs.h"
+#include <stdlib.h>
+
#include <qcheckbox.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qspinbox.h>
#include <qlayout.h>
#include <qvariant.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
#include <qbuttongroup.h>
#include <qlineedit.h>
+#include <qdir.h>
#ifdef USECOMBO
#include <qcombobox.h>
#else
#include <qpe/menubutton.h>
#endif
#include <qfontdatabase.h>
#ifdef USECOMBO
@@ -97,16 +100,21 @@ CLayoutPrefs::CLayoutPrefs( QWidget* parent, const char* name, WFlags fl )
*/
prepalm = new QCheckBox( bg );
prepalm->setText( tr( "Repalm(Baen)" ) );
pkern = new QCheckBox( bg );
pkern->setText( tr( "Kern" ) );
+ InlineTables = new QCheckBox( bg );
+ InlineTables->setText( tr( "Inline Tables" ) );
+
+ Underlinelinks = new QCheckBox( bg );
+ Underlinelinks->setText( tr( "Underline Links" ) );
/*
Negative = new QCheckBox( bg );
Negative->setText( tr( "Negative" ) );
*/
// Inverse = new QCheckBox( bg );
// Inverse->setText( tr( "Inverse" ) );
}
@@ -557,16 +565,19 @@ CMiscPrefs::CMiscPrefs( QWidget* parent, const char* name, WFlags fl )
annotation->setText( tr( "Annotation" ) );
dictionary = new QCheckBox( bg );
dictionary->setText( tr( "Dictionary" ) );
clipboard = new QCheckBox( bg );
clipboard->setText( tr( "Clipboard" ) );
+ QCheckBox* outcodec = new QCheckBox( bg );
+ outcodec->setText( tr( "Output" ) );
+
}
CMiscPrefs::~CMiscPrefs()
{
// no need to delete child widgets, Qt does it all for us
}
*/
@@ -588,107 +599,159 @@ CMiscPrefs::CMiscPrefs( QWidget* parent, const char* name, WFlags fl )
annotation->setText( tr( "Annotation" ) );
dictionary = new QCheckBox( gb );
dictionary->setText( tr( "Dictionary" ) );
clipboard = new QCheckBox( gb );
clipboard->setText( tr( "Clipboard" ) );
+ boutput = new QCheckBox( gb );
+ boutput->setText( tr( "Output" ) );
+
QButtonGroup* bg = new QButtonGroup(1, Qt::Horizontal, "Plucker", this);
hl->addWidget( bg );
Depluck = new QCheckBox( bg );
Depluck->setText( tr( "Depluck" ) );
Dejpluck = new QCheckBox( bg );
Dejpluck->setText( tr( "Dejpluck" ) );
Continuous = new QCheckBox( bg );
Continuous->setText( tr( "Continuous" ) );
-
- bg = new QButtonGroup(2, Qt::Horizontal, "Scroll", this);
+ bg = new QButtonGroup(2, Qt::Horizontal, "Background", this);
vl->addWidget( bg );
- // scrollinplace = new QCheckBox( bg );
- // scrollinplace->setText( tr( "In Place" ) );
+// QLabel* TextLabel = new QLabel( bg );
+// TextLabel->setText( tr( "Copy an image to \"background\" in\n~/Applications/uqtreader/Theme/" ) );
+
#ifdef USECOMBO
- scrolltype = new QComboBox( bg );
+ bgtype = new QComboBox( bg );
#else
- scrolltype = new MenuButton( this);
+ bgtype = new MenuButton( this);
#endif
- scrolltype->insertItem("In Place");
- scrolltype->insertItem("Rolling (moving bg)");
- scrolltype->insertItem("Rolling (window)");
- scrolltype->insertItem("Rolling (static bg)");
- scrolltype->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ bgtype->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+
+ bgtype->insertItem( tr("Centred") );
+ bgtype->insertItem( tr("Tiled") );
+ bgtype->insertItem( tr("Fitted") );
+ DoubleBuffer = new QCheckBox( bg );
+ DoubleBuffer->setText( tr( "Double Buffer" ) );
+ QLabel* TextLabel = new QLabel( bg );
+ TextLabel->setText( tr( "Minibar Colour" ) );
#ifdef USECOMBO
- scrollcolor = new QComboBox( bg );
+ minibarcol = new QComboBox( bg );
#else
- scrollcolor = new MenuButton( this);
+ minibarcol = new MenuButton( this);
#endif
- populate_colours(scrollcolor);
- scrollcolor->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ populate_colours(minibarcol);
+ minibarcol->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+}
+
+CMiscPrefs::~CMiscPrefs()
+{
+ // no need to delete child widgets, Qt does it all for us
+}
+
+CScrollPrefs::CScrollPrefs( QWidget* parent, const char* name, WFlags fl )
+ : QWidget( parent, name, fl )
+{
+
+ QHBoxLayout* hl = new QHBoxLayout(this);
+ hl->setMargin( 0 );
+
+ QButtonGroup* bg = new QButtonGroup(2, Qt::Horizontal, "Scroll", this);
+ hl->addWidget( bg );
+ // scrollinplace = new QCheckBox( bg );
+ // scrollinplace->setText( tr( "In Place" ) );
QLabel* TextLabel = new QLabel( bg );
TextLabel->setText( tr( "Scroll step" ) );
// gl->addWidget(TextLabel, 2, 0);
scrollstep = new QSpinBox( bg );
scrollstep->setRange(1, 10);
scrollstep->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
TextLabel = new QLabel( bg );
- TextLabel->setText( tr( "Minibar Colour" ) );
+ TextLabel->setText( tr( "Scroll type" ) );
#ifdef USECOMBO
- minibarcol = new QComboBox( bg );
+ scrolltype = new QComboBox( bg );
#else
- minibarcol = new MenuButton( this);
+ scrolltype = new MenuButton( this);
#endif
- populate_colours(minibarcol);
- minibarcol->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ scrolltype->insertItem("In Place");
+ scrolltype->insertItem("Rolling (moving bg)");
+ scrolltype->insertItem("Rolling (window)");
+ scrolltype->insertItem("Rolling (static bg)");
+ scrolltype->insertItem("Send to output");
+ scrolltype->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
+ TextLabel = new QLabel( bg );
+ TextLabel->setText( tr( "Colour of scroll\nprogress indicator" ) );
- bg = new QButtonGroup(2, Qt::Vertical, "Background", this);
- vl->addWidget( bg );
+#ifdef USECOMBO
+ scrollcolor = new QComboBox( bg );
+#else
+ scrollcolor = new MenuButton( this);
+#endif
+ populate_colours(scrollcolor);
+ scrollcolor->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
-// QLabel* TextLabel = new QLabel( bg );
-// TextLabel->setText( tr( "Copy an image to \"background\" in\n~/Applications/uqtreader/Theme/" ) );
+ TextLabel = new QLabel( bg );
+ TextLabel->setText( tr( "Output" ) );
#ifdef USECOMBO
- bgtype = new QComboBox( bg );
+ outcodec = new QComboBox( bg );
#else
- bgtype = new MenuButton( this);
+ outcodec = new MenuButton( this);
#endif
- bgtype->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
-
- bgtype->insertItem( tr("Centred") );
- bgtype->insertItem( tr("Tiled") );
- bgtype->insertItem( tr("Fitted") );
+#ifdef USEQPE
+#ifdef OPIE
+ QString codecpath(getenv("OPIEDIR"));
+#else
+ QString codecpath(getenv("QTDIR"));
+#endif
+ codecpath += "/plugins/reader/outcodecs";
+#else
+ QString codecpath(getenv("READERDIR"));
+ codecpath += "/outcodecs";
+#endif
+ QDir ocd(codecpath, "lib*.so");
+ for (int i = 0; i < ocd.count(); ++i)
+ {
+ QString tmp(ocd[i]);
+ outcodec->insertItem(tmp.mid(3,tmp.length()-6));
+ }
+ outcodec->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
}
-CMiscPrefs::~CMiscPrefs()
+CScrollPrefs::~CScrollPrefs()
{
// no need to delete child widgets, Qt does it all for us
}
+
CPrefs::CPrefs( int w, bool fs, QWidget* parent, const char* name) : QDialog(parent, name, true)
{
setCaption(tr( "OpieReader Settings" ) );
QTabWidget* td = new QTabWidget(this);
layout = new CLayoutPrefs(this);
layout2 = new CLayoutPrefs2(w, this);
+ scroll = new CScrollPrefs(this);
misc = new CMiscPrefs(this);
// button = new CButtonPrefs(kmap, this);
inter = new CInterPrefs(this);
td->addTab(layout, tr("Layout"));
td->addTab(layout2, tr("Layout(2)"));
td->addTab(inter, tr("Locale"));
+ td->addTab(scroll, tr("Scroll"));
td->addTab(misc, tr("Misc"));
// td->addTab(button, tr("Buttons"));
QVBoxLayout* v = new QVBoxLayout(this);
v->addWidget(td);
if (fs) showMaximized();
}
diff --git a/noncore/apps/opie-reader/Prefs.h b/noncore/apps/opie-reader/Prefs.h
index cf12b70..103484e 100644
--- a/noncore/apps/opie-reader/Prefs.h
+++ b/noncore/apps/opie-reader/Prefs.h
@@ -56,16 +56,18 @@ public:
QCheckBox* FullJustify;
QCheckBox* FixGraphics;
QCheckBox* hyphenate;
// QCheckBox* customhyphen;
QCheckBox* prepalm;
QCheckBox* pkern;
// QCheckBox* Inverse;
// QCheckBox* Negative;
+ QCheckBox* InlineTables;
+ QCheckBox* Underlinelinks;
};
class CLayoutPrefs2 : public QWidget
{
public:
friend class CPrefs;
@@ -93,16 +95,17 @@ public:
friend class CPrefs;
CPluckerPrefs( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~CPluckerPrefs();
QCheckBox* Depluck;
QCheckBox* Dejpluck;
QCheckBox* Continuous;
+ QCheckBox* DoubleBuffer;
protected:
QHBoxLayout* Layout5;
QVBoxLayout* Layout11;
QGridLayout* Layout4;
};
*/
@@ -111,32 +114,49 @@ class CMiscPrefs : public QWidget
public:
friend class CPrefs;
CMiscPrefs( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
~CMiscPrefs();
- QCheckBox *annotation, *dictionary, *clipboard;
- QCheckBox *Depluck, *Dejpluck, *Continuous;
+ QCheckBox *annotation, *dictionary, *clipboard, *boutput;
+ QCheckBox *Depluck, *Dejpluck, *Continuous, *DoubleBuffer;
+
+#ifdef USECOMBO
+ QComboBox *bgtype, *minibarcol;
+#else
+ MenuButton *bgtype, *minibarcol;
+#endif
+};
+
+class CScrollPrefs : public QWidget
+{
+
+public:
+
+ friend class CPrefs;
+
+ CScrollPrefs( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
+ ~CScrollPrefs();
QSpinBox *scrollstep;
#ifdef USECOMBO
- QComboBox *scrollcolor, *bgtype, *scrolltype, *minibarcol;
+ QComboBox *scrollcolor, *scrolltype, *outcodec;
#else
- MenuButton *scrollcolor, *bgtype, *scrolltype, *minibarcol;
+ MenuButton *scrollcolor, *scrolltype, *outcodec;
#endif
};
/*
class QListView;
class QListViewItem;
-class CButtonPrefs : public QWidget
+sclass CButtonPrefs : public QWidget
{
Q_OBJECT
QMap<orKey, int> *kmap;
QMap<orKey, QListViewItem*> listmap;
QListView* lb;
void keyPressEvent(QKeyEvent* e);
#ifdef USECOMBO
void populate(QComboBox*);
@@ -184,17 +204,17 @@ public:
class CPrefs : public QDialog
{
Q_OBJECT
CLayoutPrefs* layout;
CLayoutPrefs2* layout2;
CMiscPrefs* misc;
- // CButtonPrefs* button;
+ CScrollPrefs* scroll;
CInterPrefs* inter;
void keyPressEvent(QKeyEvent* e)
{
switch (e->key())
{
case Key_Escape:
e->accept();
@@ -216,17 +236,19 @@ Q_OBJECT
}
bool hyphenate() { return layout->hyphenate->isChecked(); }
void hyphenate(bool _v) { layout->hyphenate->setChecked(_v); }
/*
bool customhyphen() { return layout->customhyphen->isChecked(); }
void customhyphen(bool _v) { layout->customhyphen->setChecked(_v); }
*/
bool StripCR() { return layout->StripCR->isChecked(); }
+ bool InlineTables() { return layout->InlineTables->isChecked(); }
bool repalm() { return layout->prepalm->isChecked(); }
+ bool UnderlineLink() { return layout->Underlinelinks->isChecked(); }
bool kern() { return layout->pkern->isChecked(); }
bool Dehyphen() { return layout->Dehyphen->isChecked(); }
bool SingleSpace() { return layout->SingleSpace->isChecked(); }
bool Unindent() { return layout->Unindent->isChecked(); }
bool Reparagraph() { return layout->Reparagraph->isChecked(); }
bool DoubleSpace() { return layout->DoubleSpace->isChecked(); }
bool Remap() { return layout->Remap->isChecked(); }
bool Embolden() { return layout->Embolden->isChecked(); }
@@ -241,17 +263,19 @@ Q_OBJECT
int LeftMargin() { return layout2->LeftMargin->value(); }
int RightMargin() { return layout2->RightMargin->value(); }
int Indent() { return layout2->Indent->value(); }
int Markup() { return layout2->Markup->currentItem(); }
QString Font() { return layout2->fontselector->currentText(); }
void StripCR(bool v) { layout->StripCR->setChecked(v); }
+ void InlineTables(bool v) { layout->InlineTables->setChecked(v); }
void repalm(bool v) { layout->prepalm->setChecked(v); }
+ void UnderlineLink(bool v) { layout->Underlinelinks->setChecked(v); }
void kern(bool v) { layout->pkern->setChecked(v); }
void Dehyphen(bool v) { layout->Dehyphen->setChecked(v); }
void SingleSpace(bool v) { layout->SingleSpace->setChecked(v); }
void Unindent(bool v) { layout->Unindent->setChecked(v); }
void Reparagraph(bool v) { layout->Reparagraph->setChecked(v); }
void DoubleSpace(bool v) { layout->DoubleSpace->setChecked(v); }
void Remap(bool v) { layout->Remap->setChecked(v); }
void Embolden(bool v) { layout->Embolden->setChecked(v); }
@@ -268,25 +292,25 @@ Q_OBJECT
void Indent(int v) { layout2->Indent->setValue(v); }
#ifdef USECOMBO
void Markup(int v) { layout2->Markup->setCurrentItem(v); }
#else
void Markup(int v) { layout2->Markup->select(v); }
#endif
#ifdef USECOMBO
void bgtype(int v) { misc->bgtype->setCurrentItem(v); }
- void scrollcolor(int v) { misc->scrollcolor->setCurrentItem(v); }
+ void scrollcolor(int v) { scroll->scrollcolor->setCurrentItem(v); }
void minibarcol(int v) { misc->minibarcol->setCurrentItem(v); }
#else
void bgtype(int v) { misc->bgtype->select(v); }
- void scrollcolor(int v) { misc->scrollcolor->select(v); }
+ void scrollcolor(int v) { scroll->scrollcolor->select(v); }
void minibarcol(int v) { misc->minibarcol->select(v); }
#endif
int bgtype() { return misc->bgtype->currentItem(); }
- int scrollcolor() { return misc->scrollcolor->currentItem(); }
+ int scrollcolor() { return scroll->scrollcolor->currentItem(); }
int minibarcol() { return misc->minibarcol->currentItem(); }
#ifdef USECOMBO
void foreground(int v) { layout2->fgsel->setCurrentItem(v); }
#else
void foreground(int v) { layout2->fgsel->select(v); }
#endif
@@ -295,39 +319,60 @@ Q_OBJECT
#ifdef USECOMBO
void background(int v) { layout2->bgsel->setCurrentItem(v); }
#else
void background(int v) { layout2->bgsel->select(v); }
#endif
int background() { return layout2->bgsel->currentItem(); }
-
#ifdef USECOMBO
void Font(QString& s)
{
for (int i = 1; i <= layout2->fontselector->count(); i++)
{
if (layout2->fontselector->text(i) == s)
{
layout2->fontselector->setCurrentItem(i);
break;
}
}
}
#else
void Font(QString& s) { layout2->fontselector->select(s); }
#endif
+#ifdef USECOMBO
+ void outcodec(QString& s)
+ {
+ for (int i = 1; i <= scroll->outcodec->count(); i++)
+ {
+ if (scroll->outcodec->text(i) == s)
+ {
+ scroll->outcodec->setCurrentItem(i);
+ break;
+ }
+ }
+ }
+#else
+ void outcodec(QString& s) { scroll->outcodec->select(s); }
+#endif
+ QString outcodec() { return scroll->outcodec->currentText(); }
+
+ void miscoutput(bool v) { return misc->boutput->setChecked(v); }
+ bool miscoutput() { return misc->boutput->isChecked(); }
+
bool Depluck() { return misc->Depluck->isChecked(); }
void Depluck(bool v) { misc->Depluck->setChecked(v); }
bool Dejpluck() { return misc->Dejpluck->isChecked(); }
void Dejpluck(bool v) { misc->Dejpluck->setChecked(v); }
bool Continuous() { return misc->Continuous->isChecked(); }
void Continuous(bool v) { misc->Continuous->setChecked(v); }
+ bool DoubleBuffer() { return misc->DoubleBuffer->isChecked(); }
+ void DoubleBuffer(bool v) { misc->DoubleBuffer->setChecked(v); }
bool SwapMouse() { return inter->SwapMouse->isChecked(); }
void SwapMouse(bool v) { inter->SwapMouse->setChecked(v); }
void dictApplication(const QString& v) { inter->application->setText(v); }
QString dictApplication() { return inter->application->text(); }
void dictMessage(const QString& v) { inter->message->setText(v); }
QString dictMessage() { return inter->message->text(); }
@@ -366,20 +411,20 @@ Q_OBJECT
int ideogramwidth() { return inter->ideogramwidth->value(); }
void ideogramwidth(int v) { inter->ideogramwidth->setValue(v); }
bool propfontchange() { return inter->propfontchange->isChecked(); }
void propfontchange(bool v) { inter->propfontchange->setChecked(v); }
int encoding() { return inter->encoding->currentItem(); }
- int scrolltype() { return misc->scrolltype->currentItem(); }
+ int scrolltype() { return scroll->scrolltype->currentItem(); }
#ifdef USECOMBO
void encoding(int v) { inter->encoding->setCurrentItem(v); }
- void scrolltype(int v) { misc->scrolltype->setCurrentItem(v); }
+ void scrolltype(int v) { scroll->scrolltype->setCurrentItem(v); }
#else
void encoding(int v) { inter->encoding->select(v); }
- void scrolltype(int v) { misc->scrolltype->select(v); }
+ void scrolltype(int v) { scroll->scrolltype->select(v); }
#endif
- void scrollstep(int v) { misc->scrollstep->setValue(v); }
- int scrollstep() { return misc->scrollstep->value(); }
+ void scrollstep(int v) { scroll->scrollstep->setValue(v); }
+ int scrollstep() { return scroll->scrollstep->value(); }
};
#endif // CPREFS_H
diff --git a/noncore/apps/opie-reader/QTReader.cpp b/noncore/apps/opie-reader/QTReader.cpp
index 33884a0..0c56dd4 100644
--- a/noncore/apps/opie-reader/QTReader.cpp
+++ b/noncore/apps/opie-reader/QTReader.cpp
@@ -27,36 +27,40 @@ const int _SBARHEIGHT = 3;
#ifdef USEQPE
#include <qpe/config.h>
#include <qpe/applnk.h>
#include <qpe/global.h>
#include <qpe/qcopenvelope_qws.h>
#endif
#include <qfileinfo.h>
#include <qdir.h>
+#include "TableDialog.h"
+#include "outputcodec.h"
+/*
#ifdef _UNICODE
const char *QTReader::fonts[] = { "unifont", "Courier", "Times", 0 };
#else
const char *QTReader::fonts[] = { "Helvetica", "Courier", "Times", 0 };
#endif
+*/
//const int QTReader::fontsizes[] = { 8, 10, 12, 14, 18, 24, 30, 40, 50, 60, 70, 80, 90, 100, 0 };
//const tchar *QTReader::fonts[] = { "unifont", "fixed", "micro", "smoothtimes", "Courier", "Times", 0 };
//const int QTReader::fontsizes[] = {10,16,17,22,0};
//const tchar *QTReader::fonts[] = { "verdana", "Courier", "Times", 0 };
//const int QTReader::fontsizes[] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,0};
tchar QTReader::pluckernextpart[] = { 'C','l','i','c','k',' ','h','e','r','e',' ','f','o','r',' ','t','h','e',' ','n','e','x','t',' ','p','a','r','t',0 };
tchar QTReader::jplucknextpart[] = { 'N','e','x','t',' ','P','a','r','t',' ','>','>',0 };
//tchar QTReader::jplucknextpart[] = { 10,'#',10,'N','e','x','t',' ','P','a','r','t',' ','>','>',0 };
-
QTReader::QTReader( QWidget *parent, const char *name, WFlags f) :
- QWidget(parent, name, f),
+ QWidget(parent, name, f | WRepaintNoErase | WResizeNoErase),
+ m_outofdate(true),
m_default_fg(0,0,0),
m_default_bg(255,255,255),
m_bg(255,255,255),
m_delay(100),
m_scrolldy1(0),
m_scrolldy2(0),
m_totalscroll(0),
m_autoScroll(false),
@@ -84,26 +88,22 @@ QTReader::QTReader( QWidget *parent, const char *name, WFlags f) :
m_scrollstep(2),
m_topmargin(5),
m_bottommargin(5),
m_reparastring("{\\n[\\n ]}"),
m_currentlinkstyle(NULL),
m_currentlinkoffset(-1),
m_currentlink(-1)
{
+ m_output = NULL;
m_overlap = 1;
setKeyCompression ( true );
-#ifdef DOUBLEBUFFER
- dbuff = new QPixmap();
- dbp = new QPainter();
- // if (painter->isActive()) painter->end();
- // painter->begin(frame);
-#endif
-// init();
+ dbuff = NULL;
+ dbp = NULL;
}
/*
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),
@@ -112,17 +112,17 @@ QTReader::QTReader( const QString& filename, QWidget *parent=0, const tchar *nam
bunindent(false),
brepara(false),
bdblspce(false),
btight(false),
bindenter(0),
m_fm(NULL)
{
init();
-// // qDebug("Load_file(1)");
+// // qDeb2ug("Load_file(1)");
load_file((const tchar*)filename);
}
*/
/*
void QTReader::mouseMoveEvent(QMouseEvent* _e)
{
@@ -133,55 +133,200 @@ void QTReader::mouseMoveEvent(QMouseEvent* _e)
*/
long QTReader::real_delay()
{
return m_scrollstep*( 8976 + m_delay ) / ( m_linespacing * m_linespacing );
}
void QTReader::mousePressEvent( QMouseEvent* _e )
{
- buffdoc.unsuspend();
+ m_drageligible = false;
+ qDebug("Mouse pressed at (%u, %u)", _e->x(), _e->y());
int x, y, ht, wh;
if (m_rotated)
{
x = _e->y();
y = width()-_e->x();
ht = width();
wh = height();
}
else
{
x = _e->x();
y = _e->y();
ht = height();
wh = width();
}
+ if (x >= m_left_border && x <= wh - m_right_border && y >= m_topmargin && y <= ht-m_bottommargin)
+ {
if (_e->button() == RightButton)
{
// qDebug("MousePress");
mouseUpOn = false;
if (m_swapmouse)
{
int lineno = 0;
/*
int hgt = textarray[0]->lineSpacing();
while ((hgt < y) && (lineno < numlines))
{
hgt += textarray[++lineno]->lineSpacing();
}
*/
- size_t startpos, startoffset, tgt, tgtoffset, pictgt;
+ size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt;
QImage* img;
- getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img);
+ getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt);
processmousewordevent(startpos, startoffset, _e, lineno);
}
else
+ {
processmousepositionevent(_e);
}
}
+ }
+ else
+ {
+ int ln = -1;
+ int mp;
+ int sectionsize = (buffdoc.endSection()-buffdoc.startSection());
+ switch (m_scrollpos)
+ {
+ case 1:
+ {
+ if (m_rotated)
+ {
+ if (_e->x() < m_bottommargin)
+ {
+ ln = height();
+ mp = _e->y();
+ }
+ }
+ else
+ {
+ if (_e->y() > height()-m_bottommargin)
+ {
+ ln = width();
+ mp = _e->x();
+ }
+ }
+ }
+ break;
+ case 2:
+ {
+ if (m_rotated)
+ {
+ if (_e->y() > height() - m_right_border)
+ {
+ ln = width();
+ mp = width()-_e->x();
+ }
+ }
+ else
+ {
+ if (_e->x() > width() - m_right_border)
+ {
+ ln = height();
+ mp = _e->y();
+ }
+ }
+ }
+ break;
+ case 3:
+ {
+ if (m_rotated)
+ {
+ if (_e->y() < m_left_border)
+ {
+ ln = width();
+ mp = width()-_e->x();
+ }
+ }
+ else
+ {
+ if (_e->x() < m_left_border)
+ {
+ ln = height();
+ mp = _e->y();
+ }
+ }
+ }
+ break;
+ case 0:
+ default:
+ ln = -1;
+ break;
+ }
+ if (ln >= 0)
+ {
+ int dp = (sectionsize*mp+ln/2)/ln + buffdoc.startSection();
+ int winsize = locnarray[numlines]-locnarray[0];
+ int slidersize = 10*(sectionsize+ln/2)/ln;
+ if (slidersize > winsize)
+ {
+ int mid = (locnarray[0] + locnarray[numlines])/2;
+ slidersize /= 2;
+ if (dp < mid-slidersize)
+ {
+ dopageup();
+ }
+ else if (dp > mid+slidersize)
+ {
+ dopagedn();
+ }
+ //if (mid-slidersize < dp && dp < mid+slidersize)
+ else
+ {
+ m_drageligible = true;
+ }
+ }
+ else
+ {
+ if (dp < locnarray[0])
+ {
+ dopageup();
+ }
+ else if (dp > locnarray[numlines])
+ {
+ dopagedn();
+ }
+ //if (locnarray[0] < dp && dp < locnarray[numlines])
+ else
+ {
+ m_drageligible = true;
+ }
+ }
+ qDebug("Drag eligible:%s", (m_drageligible) ? "true" : "false");
+ }
+ else
+ {
+ if (m_scrollpos == 1)
+ {
+ if (x < m_left_border)
+ {
+ lineUp();
+ }
+ if (y > ht - m_bottommargin)
+ {
+ lineDown();
+ }
+ }
+ else if (m_scrollpos != 0)
+ {
+ if (y < m_topmargin)
+ {
+ lineUp();
+ }
+ if (y > ht - m_bottommargin)
+ {
+ lineDown();
+ }
+ }
+ }
+ }
+}
void QTReader::processmousepositionevent( QMouseEvent* _e )
{
int x, y, ht, wh;
if (m_rotated)
{
x = _e->y();
y = width()-_e->x();
@@ -290,17 +435,17 @@ void QTReader::goForward()
}
else if ((lt & eLink) != 0)
{
locate(target);
}
}
}
-linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*& img)
+linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*& img, size_t& tabtgt)
{
int ht;
if (m_scrolldy == m_topmargin)
{
lineno = 0;
ht = textarray[0]->lineSpacing()-m_scrolldy1 + m_topmargin;
}
else
@@ -335,39 +480,70 @@ linkType QTReader::getcurrentpos(int x, int y, int w, int h, int& lineno, size_t
else
{
int i;
CDrawBuffer* t = textarray[lineno];
x = x - t->offset(width(), m_left_border, m_right_border, availht);
for (i = t->length(); i > 0 && t->width(availht, i, true, w, m_left_border, m_right_border) > x; i--);
offset = i;
}
- return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img);
+ return textarray[lineno]->getLinkType(offset, tgt, tgtoffset, pictgt, img, tabtgt);
}
void QTReader::suspend()
{
buffdoc.suspend();
/*#ifdef OPIE
if (memcmp("/mnt/", m_lastfile.latin1(), 5) == 0) buffdoc.suspend();
#else
if (memcmp("/usr/mnt.rom/", m_lastfile.latin1(), 13) == 0) buffdoc.suspend();
#endif
*/
}
+void QTReader::setDoubleBuffer(bool _b)
+{
+ m_doubleBuffered = _b;
+ if (_b || m_rotated)
+ {
+ if (dbuff == NULL)
+ {
+ dbuff = new QPixmap();
+ dbp = new QPainter();
+ }
+ if (m_rotated)
+ {
+ dbuff->resize(height(), width());
+ }
+ else
+ {
+ dbuff->resize(width(), height());
+ }
+ m_outofdate = true;
+ }
+ else
+ {
+ if (dbuff != NULL)
+ {
+ delete dbuff;
+ delete dbp;
+ }
+ dbuff = NULL;
+ dbp = NULL;
+ }
+}
+
void QTReader::setTwoTouch(bool _b)
{
setBackgroundColor( m_bg );
m_twotouch = m_touchone = _b;
}
void QTReader::setContinuous(bool _b)
{
- buffdoc.unsuspend();
buffdoc.setContinuous(m_continuousDocument = _b);
}
void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouseEvent* _e, int lineno)
{
unsigned long wrdstart, wrdend;
QString wrd;
int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin;
@@ -450,32 +626,145 @@ void QTReader::processmousewordevent(size_t startpos, size_t startoffset, QMouse
}
while (!QChar((*t)[i]).isLetter() && (*t)[i] != 0) i++;
if ((*t)[i] == 0) break;
first = i;
}
}
if (!wrd.isEmpty())
{
- qDebug("Selecteed:%s", (const char*)wrd);
+ qDebug("Selected:%s", (const char*)wrd);
if (m_twotouch)
{
emit OnWordSelected(wrd, wrdstart, wrdend, wrd);
}
else
{
QString line = toQString(textarray[lineno]->data());
emit OnWordSelected(wrd, locnarray[lineno], locnarray[lineno]+line.length(), line);
}
}
}
+#ifdef USETIMER
+void QTReader::actionDrag()
+{
+ if (m_drageligible)
+ {
+ int fivepages = 5*((2*width()+m_textsize/2)/m_textsize)*((height()+m_textsize/2)/m_textsize);
+ if (m_dragtarget > fivepages && locnarray[numlines] < m_dragtarget - fivepages)
+ {
+ int tgt = m_dragtarget - fivepages/2;
+ //qDebug("Jumping to %u (%u)", tgt, fivepages);
+ if (tgt < buffdoc.startSection())
+ {
+ tgt = buffdoc.startSection();
+ }
+ locate(tgt);
+ drawFonts();
+ }
+ else if (locnarray[0] > m_dragtarget+fivepages)
+ {
+ int tgt = m_dragtarget + fivepages/2;
+ //qDebug("Jumping to %u (%u)", tgt, fivepages);
+ if (tgt > buffdoc.endSection())
+ {
+ dopageup();
+ }
+ else
+ {
+ locate(tgt);
+ drawFonts();
+ }
+ }
+ else if (locnarray[numlines] <= m_dragtarget)
+ {
+ dopagedn();
+ }
+ else if (locnarray[0] > m_dragtarget)
+ {
+ dopageup();
+ }
+ }
+ else
+ {
+ m_dragtimer->stop();
+ }
+}
+#endif
+
+void QTReader::mouseMoveEvent( QMouseEvent* _e )
+{
+ if (m_drageligible)
+ {
+ int ht;
+ int mp;
+ int sectionsize = (buffdoc.endSection()-buffdoc.startSection());
+ //qDebug("Mouse moved to (%u, %u)", _e->x(), _e->y());
+ switch (m_scrollpos)
+ {
+ case 1:
+ {
+ if (m_rotated)
+ {
+ ht = height();
+ mp = _e->y();
+ }
+ else
+ {
+ ht = width();
+ mp = _e->x();
+ }
+ }
+ break;
+ case 2:
+ case 3:
+ {
+ if (m_rotated)
+ {
+ ht = width();
+ mp = width()-_e->x();
+ }
+ else
+ {
+ ht = height();
+ mp = _e->y();
+ }
+ }
+ break;
+ case 0:
+ default:
+ ht = -1;
+ break;
+ }
+ if (ht >= 0)
+ {
+#ifdef USETIMER
+ m_dragtarget = (sectionsize*mp+ht/2)/ht + buffdoc.startSection();
+ if (!m_dragtimer->isActive())
+ {
+ m_dragtimer->start(0, false);
+ }
+#else
+ int dp = (sectionsize*mp+ht/2)/ht + buffdoc.startSection();
+ locate(dp);
+#endif
+ }
+ }
+}
+
void QTReader::mouseReleaseEvent( QMouseEvent* _e )
{
- buffdoc.unsuspend();
+ qDebug("Mouse released at (%u, %u)", _e->x(), _e->y());
+ if (m_drageligible)
+ {
+ m_drageligible = false;
+ }
+ else
+ {
int x, y, ht, wh;
if (m_rotated)
{
x = _e->y();
y = width()-_e->x();
ht = width();
wh = height();
}
@@ -486,16 +775,17 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
ht = height();
wh = width();
}
if (_e->button() == LeftButton)
{
if (mouseUpOn)
{
// qDebug("MouseRelease");
+ /*
switch(m_scrollpos)
{
case 1: // Bottom
if (y > ht - 5)
{
locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*x+wh/2)/wh);
return;
}
@@ -513,38 +803,53 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
locate(buffdoc.startSection()+((buffdoc.endSection()-buffdoc.startSection())*y+ht/2)/ht);
return;
}
break;
case 0:
default:
break;
}
+ */
if (textarray[0] != NULL)
{
QString line;
// int lineno = _e->y()/m_linespacing;
int lineno = 0;
/*
int ht = textarray[0]->lineSpacing();
while ((ht < y) && (lineno < numlines))
{
ht += textarray[++lineno]->lineSpacing();
}
*/
- size_t startpos, startoffset, tgt, tgtoffset, pictgt;
+ size_t startpos, startoffset, tgt, tgtoffset, pictgt, tabtgt;
QImage* img;
if (m_currentlinkstyle != NULL)
{
textarray[m_currentlink]->invertLink(m_currentlinkoffset);
m_currentlinkstyle = NULL;
m_currentlink = -1;
m_currentlinkoffset = -1;
}
- linkType glt = getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img);
+ linkType glt = getcurrentpos(x, y, wh, ht, lineno, startpos, startoffset, tgt, tgtoffset, pictgt, img, tabtgt);
+ if (bNoInlineTables && ((glt & eTable) != 0))
+ {
+ size_t currentpos = locate();
+ QString tabtext = buffdoc.getTableAsHtml(tabtgt);
+ qDebug("TABLE:%u:%u:%s", currentpos, tabtgt, (const char*)tabtext);
+ QFont f(m_fontname, m_fontControl.currentsize());
+#ifdef USEQPE
+ CTableDialog td(f, tabtext, true, this);
+#else
+ CTableDialog td(f, tabtext, false, this);
+#endif
+ td.exec();
+ jumpto(currentpos);
+ }
if ((glt & eLink) != 0)
{
if ((glt & ePicture) != 0)
{
qDebug("Big Picture:%x", pictgt);
if (QMessageBox::warning(this, PROGNAME, "Show picture or goto link?", "Show", "Goto Link") == 0)
{
QImage* pm = buffdoc.getPicture(pictgt);
@@ -574,49 +879,56 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
#ifdef USEQPE
{
QCopEnvelope e("QPE/System", "busy()");
}
#endif
ResetScroll();
if (!href.isEmpty())
{
- if (!buffdoc.getFile(href))
+ if (!buffdoc.getFile(href, nm))
{
emit NewFileRequest(href);
}
else
{
+ qDebug("BEFORE:%u", pagelocate());
+ buffdoc.resetPos();
ResetScroll();
fillbuffer();
+ qDebug("AFTER:%u", pagelocate());
+ m_outofdate = true;
update();
}
}
if (!nm.isEmpty())
{
qDebug("QTReader:Finding %s", (const char*)nm);
if (buffdoc.findanchor(nm))
{
+ buffdoc.resetPos();
fillbuffer();
+ m_outofdate = true;
update();
}
}
//fillbuffer();
//update();
#ifdef USEQPE
{
QCopEnvelope e("QPE/System", "notBusy()");
}
#endif
}
else if ((lt & eLink) != 0)
{
buffdoc.saveposn(m_lastfile, saveposn);
ResetScroll();
fillbuffer();
+ m_outofdate = true;
update();
}
else
{
if ((lt & ePicture) != 0)
{
QImage* pm = buffdoc.getPicture(tgt);
if (pm != NULL)
@@ -628,32 +940,31 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
else
{
// QString anchortext = textarray[lineno]->getanchortext(startoffset);
if (!href.isEmpty())
{
emit OnURLSelected(href, tgt);
}
}
- locate(pagelocate());
}
return;
}
else if ((glt & ePicture) != 0)
{
qDebug("Big Picture:%x", pictgt);
QImage* pm = buffdoc.getPicture(pictgt);
if (pm != NULL)
{
emit OnShowPicture(*pm);
delete pm;
}
else
{
- locate(pagelocate());
+ update();
}
return;
}
else if (img != NULL)
{
emit OnShowPicture(*img);
return;
}
@@ -664,28 +975,36 @@ void QTReader::mouseReleaseEvent( QMouseEvent* _e )
}
}
else
{
mouseUpOn = true;
}
}
}
+}
void QTReader::focusInEvent(QFocusEvent* e)
{
- if (m_autoScroll) timer->start(real_delay(), false);
+ if (m_autoScroll && (m_scrolltype != 4)) timer->start(real_delay(), false);
update();
}
void QTReader::focusOutEvent(QFocusEvent* e)
{
if (m_autoScroll)
{
+ if (m_scrolltype != 4)
+ {
timer->stop();
+ }
+ else
+ {
+ m_autoScroll = false;
+ }
// m_scrolldy1 = m_scrolldy2 = 0;
}
}
#include <qapplication.h>
#include <qdrawutil.h>
#ifndef _WINDOWS
#include <unistd.h>
@@ -712,17 +1031,16 @@ void QTReader::goUp()
else
{
lineUp();
}
}
void QTReader::NavUp()
{
- buffdoc.unsuspend();
if (buffdoc.hasnavigation())
{
/*
size_t target = pagelocate();
if (buffdoc.back(target))
{
locate(target);
}
@@ -732,17 +1050,16 @@ void QTReader::NavUp()
else
{
goUp();
}
}
void QTReader::NavDown()
{
- buffdoc.unsuspend();
if (buffdoc.hasnavigation())
{
/*
size_t target = pagelocate();
if (buffdoc.forward(target))
{
locate(target);
}
@@ -757,31 +1074,29 @@ void QTReader::NavDown()
void QTReader::zoomin()
{
if (m_fontControl.increasesize())
{
bool sc = m_autoScroll;
setautoscroll(false);
setfont();
- locate(pagelocate());
- repaint();
+ refresh();
setautoscroll(sc);
}
}
void QTReader::zoomout()
{
if (m_fontControl.decreasesize())
{
bool sc = m_autoScroll;
setautoscroll(false);
setfont();
- locate(pagelocate());
- repaint();
+ refresh();
setautoscroll(sc);
}
}
void QTReader::reduceScroll()
{
if (m_delay < 59049)
{
@@ -804,17 +1119,16 @@ void QTReader::increaseScroll()
else
{
m_delay = 454;
}
}
void QTReader::keyPressEvent(QKeyEvent* e)
{
- buffdoc.unsuspend();
//((QTReaderApp*)parent()->parent())->handlekey(e);
emit HandleKeyRequest(e);
// e->ignore();
return;
#ifdef _SCROLLPIPE
if (m_isPaused)
{
@@ -901,16 +1215,17 @@ void QTReader::CalculateScrollParameters()
m_scrolldy2 = ((m_rotated) ? width() : height()) - ypos - bmargin;
}
break;
}
}
void QTReader::setautoscroll(bool _sc)
{
+ m_outofdate = true;
if (_sc == m_autoScroll) return;
if (m_autoScroll)
{
m_autoScroll = false;
#ifdef USEQPE
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
#endif
#ifdef _SCROLLPIPE
@@ -922,16 +1237,19 @@ void QTReader::setautoscroll(bool _sc)
#endif
// m_scrolldy1 = 0;
//refresh();
}
else
{
CDrawBuffer* reusebuffer = textarray[numlines];
if (reusebuffer == NULL || reusebuffer->eof()) return;
+#ifndef __STATIC
+ if ((m_scrolltype == 4) && !checkoutput()) return;
+#endif
m_autoScroll = true;
CalculateScrollParameters();
#ifdef _SCROLLPIPE
if (!m_pipetarget.isEmpty())
{
// qDebug("Opening pipe to %s", (const char*)m_pipetarget);
m_pipeout = popen((const char*)m_pipetarget, "w");
@@ -942,17 +1260,16 @@ void QTReader::setautoscroll(bool _sc)
#ifdef USEQPE
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Disable; // light is even not dimmed
#endif
}
}
bool QTReader::getline(CDrawBuffer *buff)
{
- buffdoc.unsuspend();
bool bRet;
int availht = ((m_rotated) ? width() : height()) - m_topmargin - m_bottommargin;
if (m_bMonoSpaced)
{
bRet = buffdoc.getline(buff ,(m_rotated) ? height() : width(), m_charWidth, m_left_border, m_right_border, availht);
}
else
{
@@ -1060,51 +1377,32 @@ void QTReader::doinplacescroll()
int h_tmp = textarray[numlines-1]->lineSpacing();
bitBlt(this, m_left_border, m_scrolldy-h_tmp, dbuff, m_left_border, m_scrolldy-h_tmp, width()-(m_left_border+m_right_border), h_tmp);
}
textarray[numlines-1]->render(&p, m_scrolldy -textarray[numlines-1]->lineSpacing()+ textarray[numlines-1]->ascent(), m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin);
}
mylastpos = locate();
if (!ch)
{
- /*
- if (m_rotated)
- {
- blitRot2(0,0,height(),width()-m_scrolldy,NULL);
-// blitRot2(0,0,0,height(),width()-m_scrolldy,NULL);
- }
- else
- {
- if (m_bgpm.isNull())
- {
- p.fillRect(0,m_scrolldy,width(),height()-m_scrolldy,m_bg);
- }
- else
- {
- bitBlt(this, 0, m_scrolldy, dbuff, 0, m_scrolldy, width(), height()-m_scrolldy);
- }
- }
- */
m_scrolldy = m_topmargin;
m_autoScroll = false;
#ifdef _SCROLLPIPE
for (int i = 0; i < numlines; i++)
{
if (m_pipeout != NULL)
{
QString outstr = toQString(textarray[i]->data());
if (!outstr.isEmpty())
{
fprintf(m_pipeout, "%s\n", (const char*)outstr);
fflush(m_pipeout);
}
}
}
#endif
- //((QTReaderApp*)parent()->parent())->setScrollState(m_autoScroll);
emit SetScrollState(m_autoScroll);
#ifdef USEQPE
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
#endif
}
if (m_scrolldy > ht-textarray[numlines]->lineSpacing())
{
if (m_rotated)
@@ -1489,20 +1787,31 @@ void QTReader::redrawScroll(QPainter* p)
default:
break;
}
if (m_scrollpos != 0) DrawScroll(p, width(), height());
}
void QTReader::autoscroll()
{
- drawBackground();
+ if (m_scrolltype == 4)
+ {
+ readAloud();
+ }
+ else
+ {
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
dbp->end();
+ }
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();
@@ -1552,167 +1861,148 @@ void QTReader::DrawStraight(QPainter* p, int w, int h)
m_rotated = wasrotated;
}
void QTReader::redrawall()
{
if (m_rotated)
{
-#ifdef DOUBLEBUFFER
- drawBackground();
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
DrawStraight(dbp, height(), width());
dbp->end();
QWMatrix m;
m.rotate(90);
QPixmap rp = dbuff->xForm(m);
bitBlt(this, 0,0,&rp,0,0,-1,-1);
-#else
+ }
+ else
+ {
+ qDebug("This shouldn't happen but it doesn't matter if it does (rotated == double buffered)");
QPixmap dbuff(height(), width());
QPainter dbp(&dbuff);
- // dbp.setBackgroundMode(OpaqueMode);
- dbp.fillRect(dbuff.rect(), m_bg);
+ drawBackground(&dbp);
DrawStraight(&dbp, height(), width());
QWMatrix m;
m.rotate(90);
QPixmap rp = dbuff.xForm(m);
bitBlt(this, 0,0,&rp,0,0,-1,-1);
-#endif
+ }
}
else
{
-#ifdef DOUBLEBUFFER
- drawBackground();
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
DrawStraight(dbp, width(), height());
dbp->end();
bitBlt(this, 0,0,dbuff,0,0,-1,-1);
-#else
- DrawStraight(p, width(), height());
-#endif
+ }
+ else
+ {
+ QPainter p(this);
+ drawBackground(&p);
+ DrawStraight(&p, width(), height());
+ }
}
}
void QTReader::drawFonts()
{
if (bDoUpdates)
{
int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0);
if (hmargin < m_bottommargin) hmargin = m_bottommargin;
// qDebug("How refreshing...");
- if (buffdoc.empty()) return;
- setfont();
- // if (!m_autoScroll) m_scrolldy1 = 0;
-#ifdef ROTATION_ENABLED
- if (m_lastwidth != ((m_rotated) ? height() : width()))
+ if (buffdoc.empty())
{
- m_scrolldy = m_topmargin;
- // qDebug("Not Optimised %d", m_lastwidth);
- m_lastwidth = ((m_rotated) ? height() : width());
- m_lastheight = ((m_rotated) ? width() : height());
- buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border));
- locate(pagelocate());
- // qDebug("Not Optimised %d", m_lastwidth);
+ if (dbuff != NULL)
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
+ dbp->end();
}
else
{
- int newht = ((m_rotated) ? width() : height());
- if (m_lastheight > newht)
- {
- // qDebug("Optimised < %d %d %d", numlines, m_lastheight, newht);
- m_scrolldy = m_topmargin;
- int ypos = m_scrolldy1+m_topmargin;
- for (int i = 0; i < numlines; i++)
- {
- if ((ypos += textarray[i]->lineSpacing()) > newht - hmargin)
- {
- numlines = i;
- jumpto(mylastpos = locnarray[i+1]);
- break;
- }
+ QPainter p(this);
+ drawBackground(&p);
}
- // qDebug("Optimised < %d", numlines);
- m_lastheight = newht;
+ return;
}
- else if (m_lastheight < newht)
+ setfont();
+ // if (!m_autoScroll) m_scrolldy1 = 0;
+ if (dbuff != NULL && (dbuff->width() != width() || dbuff->height() != height()))
{
- m_scrolldy = m_topmargin;
- // qDebug("Optimised > %d", numlines);
- int ypos = m_scrolldy1+m_topmargin;
- for (int i = 0; i <= numlines; i++)
+ qDebug("Oh no! A resize event was missed...");
+ if (m_rotated)
{
- ypos += textarray[i]->lineSpacing();
- }
- fillbuffer(numlines+1, ypos, newht);
- // qDebug("Optimised > %d", numlines);
+ dbuff->resize(height(), width());
}
- if (numlines > 0)
+ else
{
- redrawall();
+ dbuff->resize(width(), height());
}
+ m_lastwidth = 0;
}
-#else
- if (m_lastwidth != width())
+ if (m_lastwidth != ((m_rotated) ? height() : width()))
{
+ m_scrolldy = m_topmargin;
// qDebug("Not Optimised %d", m_lastwidth);
- m_lastwidth = width();
- m_lastheight = height();
+ m_lastwidth = ((m_rotated) ? height() : width());
+ m_lastheight = ((m_rotated) ? width() : height());
buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border));
- locate(pagelocate());
+ buffdoc.locate(pagelocate());
+ fillbuffer();
+ redrawall();
// qDebug("Not Optimised %d", m_lastwidth);
}
else
{
- int newht = height();
+ int newht = ((m_rotated) ? width() : height());
if (m_lastheight > newht)
{
// qDebug("Optimised < %d %d %d", numlines, m_lastheight, newht);
- int ypos = m_topmargin;
+ m_scrolldy = m_topmargin;
+ int ypos = m_scrolldy1+m_topmargin;
for (int i = 0; i < numlines; i++)
{
if ((ypos += textarray[i]->lineSpacing()) > newht - hmargin)
{
numlines = i;
jumpto(mylastpos = locnarray[i+1]);
break;
}
}
// qDebug("Optimised < %d", numlines);
m_lastheight = newht;
}
else if (m_lastheight < newht)
{
+ m_scrolldy = m_topmargin;
// qDebug("Optimised > %d", numlines);
- int ypos = m_topmargin;
+ int ypos = m_scrolldy1+m_topmargin;
for (int i = 0; i <= numlines; i++)
{
ypos += textarray[i]->lineSpacing();
}
fillbuffer(numlines+1, ypos, newht);
// qDebug("Optimised > %d", numlines);
}
if (numlines > 0)
{
- int ypos = textarray[0]->ascent()+m_topmargin;
- textarray[0]->render( p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin);
-// int last = (m_showlast) ? numlines : numlines-1;
-// for (int i = 1; i <= last; i++)
- for (int i = 1; i < numlines; i++)
- {
-// ypos += (textarray[i-1]->lineSpacing() + textarray[i]->lineSpacing())/2;
- ypos += (textarray[i-1]->descent() + textarray[i]->ascent())+
- (textarray[i-1]->lineExtraSpacing() + textarray[i]->lineExtraSpacing())/2;
- textarray[i]->render( p, ypos, m_bMonoSpaced, m_charWidth, width(), m_left_border, m_right_border, m_bg, height()-m_topmargin-m_bottommargin);
- }
-// mylastpos = locate();
+ redrawall();
}
}
-#endif
emitRedraw();
}
/*
else
{
qDebug("Not so refreshing...");
}
*/
@@ -1923,36 +2213,44 @@ QString QTReader::firstword()
bool QTReader::ChangeFont(int tgt)
{
return m_fontControl.ChangeFont(m_fontname, tgt);
}
void QTReader::init()
{
- buffdoc.unsuspend();
setBackgroundColor( m_bg );
buffdoc.setfilter(getfilter());
ChangeFont(m_textsize);
setFocusPolicy(QWidget::StrongFocus);
timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(doscroll()));
+#ifdef USETIMER
+ m_dragtimer = new QTimer(this);
+ connect(m_dragtimer, SIGNAL(timeout()), this, SLOT(actionDrag()));
+#endif
// QMessageBox::information(this, "init", m_lastfile, 1);
setfont();
}
//
// Clean up
//
QTReader::~QTReader()
{
-#ifdef DOUBLEBUFFER
+ if (m_output != NULL)
+ {
+ delete m_output;
+ }
+ if (dbuff != NULL)
+ {
delete dbuff;
delete dbp;
-#endif
+ }
#ifdef USEQPE
if (m_autoScroll)
{
QCopEnvelope( "QPE/System", "setScreenSaverMode(int)" ) << QPEApplication::Enable;
}
#endif
#ifdef _SCROLLPIPE
if (m_pipeout != NULL)
@@ -1977,20 +2275,58 @@ void QTReader::printIt()
}
#endif
}
*/
//
// Called when the widget needs to be updated.
//
-void QTReader::paintEvent( QPaintEvent * )
+void QTReader::paintEvent( QPaintEvent * p )
+{
+ if ((dbuff != NULL) && !m_outofdate)
+ {
+ if (m_rotated)
+ {
+ if ((p->rect().width() != width()) || (p->rect().height() != height()))
+ {
+ qDebug("Partial paint");
+ QRect r;
+ r.setTop(width()-p->rect().right()-1);
+ r.setLeft(p->rect().top());
+ r.setHeight(p->rect().width());
+ r.setWidth(p->rect().height());
+ QPixmap p1(r.width(), r.height());
+ bitBlt(&p1, QPoint(0, 0), dbuff, r);
+ QWMatrix m;
+ m.rotate(90);
+ QPixmap p2 = p1.xForm(m);
+ bitBlt(this, p->rect().left(), p->rect().top(), &p2, 0, 0, -1, -1);
+ }
+ else
+ {
+ qDebug("Full paint");
+ QWMatrix m;
+ m.rotate(90);
+ QPixmap rp = dbuff->xForm(m);
+ bitBlt(this, 0,0,&rp,0,0,-1,-1);
+ }
+ }
+ else
+ {
+ //bitBlt(this, 0,0,dbuff,0,0,-1,-1);
+ bitBlt(this,p->rect().topLeft(),dbuff,p->rect());
+ }
+ }
+ else
{
drawFonts();
}
+ m_outofdate = false;
+}
//
// Called when the widget has been resized.
// Moves the button group to the upper right corner
// of the widget.
/*
void QTReader::resizeEvent( QResizeEvent * )
@@ -2011,40 +2347,49 @@ int main( int argc, tchar **argv )
app.setMainWidget( &draw );
draw.setCaption("Qt Example - Drawdemo");
draw.show();
return app.exec();
}
*/
+bool QTReader::locate(unsigned long n)
+{
+ m_outofdate = true;
+ m_lastwidth = 0;
+ locnarray[0] = n;
+ ResetScroll();
+ update();
+ return true;
+}
+/*
bool QTReader::locate(unsigned long n) {
//printf("Locate\n");
- buffdoc.unsuspend();
buffdoc.locate(n);
// // qDebug("&buffdoc.located");
ResetScroll();
fillbuffer();
+ m_outofdate = true;
// // qDebug("&Buffer filled");
update();
// // qDebug("&Located");
emitRedraw();
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, int newht)
{
- buffdoc.unsuspend();
int hmargin = ((m_scrollpos == 1) ? _SBARHEIGHT : 0);
if (hmargin < m_bottommargin) hmargin = m_bottommargin;
if (ht < 0) ht = m_topmargin;
if (buffdoc.empty()) return false;
if (newht < 0)
m_lastheight = (m_rotated) ? width() : height();
else
m_lastheight = newht;
@@ -2058,23 +2403,32 @@ bool QTReader::fillbuffer(int reuse, int ht, int newht)
lastypos = ypos;
if (textarray[numlines] == NULL)
{
textarray[numlines] = new CDrawBuffer(&m_fontControl);
}
locnarray[numlines] = locate();
int ch = getline(textarray[numlines]);
ypos += textarray[numlines]->lineSpacing();
+ /*
+ QString tmp = toQString(textarray[numlines]->data());
+ printf("[%u, %u, %u](%s):%s\n", lastypos, m_lastheight-hmargin, ypos,
+ ((textarray[numlines]->showPartial()) ? "TRUE" : "FALSE"),
+ (const char*)tmp);
+ */
numlines++;
if (!ch)
{
if (numlines - reuse == 1 /*&& locnarray[numlines] == buffdoc.locate()*/)
{
qDebug("FALSE");
+ if (oldpagepos < buffdoc.endSection())
locate(oldpagepos);
+ else
+ dopageup(buffdoc.endSection());
return false;
}
else
{
qDebug("TRUE");
--numlines;
mylastpos = locate();
return true;
@@ -2096,17 +2450,16 @@ bool QTReader::fillbuffer(int reuse, int ht, int newht)
CalculateScrollParameters();
}
return true;
}
void QTReader::dopagedn()
{
// qDebug("HEIGHT(2):%d", m_lastheight);
- buffdoc.unsuspend();
ResetScroll();
int skip = 0, ypos = m_topmargin;
if (locate() != mylastpos)
{
jumpto(mylastpos);
}
CDrawBuffer* reusebuffer = textarray[numlines];
if (reusebuffer != NULL)
@@ -2145,46 +2498,48 @@ void QTReader::dopageup()
bool QTReader::synch(size_t start, size_t end)
{
jumpto(start);
while (start++ < end)
{
tchar ch = getch();
if (ch == 10) return true;
- if (ch == UEOF) return false;
- if (ch == 6) return false;
+ if ((ch == UEOF) || (ch == 6))
+ {
+ return false;
+ }
}
return false;
}
void QTReader::dopageup(unsigned int target)
{
- buffdoc.unsuspend();
ResetScroll();
CBufferFace<CDrawBuffer*> buff;
CBufferFace<size_t> loc;
-
size_t delta, guess = 2*(locate()-pagelocate()), lastdelta = 0;
+ qDebug("dopageup:: locate():%u pagelocate():%u guess:%u", locate(), pagelocate(), guess);
bool ch = true;
int nbfl, ypos = m_topmargin;
if (guess < 128) guess = 128;
while (1)
{
// qDebug("Guess:%u", guess);
ch = true;
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
+ qDebug("Jumping to startsection:%d", buffdoc.startSection());
jumpto(buffdoc.startSection());
}
else
{
delta = guess;
if (!synch(target-delta, target-lastdelta))
{
lastdelta = delta;
@@ -2288,18 +2643,19 @@ void QTReader::dopageup(unsigned int target)
bool QTReader::load_file(const char *newfile, unsigned int _lcn)
{
// QMessageBox::information(this, "Name", name, 1);
// QMessageBox::information(this, "load_file", newfile, 1);
int prog = 0;
bool bRC = false;
unsigned int lcn = _lcn;
+ bDoUpdates = false;
ResetScroll();
- if (m_lastfile == newfile)
+ if (m_lastfile == newfile && lcn == 0)
{
lcn = m_lastposn;
}
// QMessageBox::information(0, "Opening...", newfile);
if (m_rotated)
{
m_lastwidth = height();
m_lastheight = width();
@@ -2311,21 +2667,21 @@ bool QTReader::load_file(const char *newfile, unsigned int _lcn)
}
if (buffdoc.openfile(this,newfile) == 0)
{
m_lastfile = newfile;
buffdoc.setwidth(m_lastwidth-(m_left_border+m_right_border));
bRC = true;
buffdoc.setContinuous(m_continuousDocument);
qDebug("buffdoc.openfile done");
- locate(lcn);
- qDebug("buffdoc.locate done");
}
setfilter(getfilter());
qDebug("Updated");
+ bDoUpdates = true;
+ locate(lcn);
return bRC;
}
void QTReader::lineDown()
{
int ypos = m_topmargin;
ResetScroll();
int offset = numlines;
@@ -2353,16 +2709,17 @@ void QTReader::lineDown()
numlines = numlines - offset + 1;
locnarray[numlines] = locate();
if (textarray[numlines] == NULL)
{
textarray[numlines] = new CDrawBuffer(&m_fontControl);
}
getline(textarray[numlines]);
mylastpos = locate();
+ m_outofdate = true;
update();
}
/*
void QTReader::lineUp()
{
CBuffer** buff = textarray;
unsigned int *loc = new unsigned int[numlines];
int cbptr = 0;
@@ -2567,27 +2924,32 @@ MarkupType QTReader::PreferredMarkup()
if (ft.left(3) == "HTM")
{
m = cHTML;
}
}
}
return m;
}
-#ifdef DOUBLEBUFFER
+
void QTReader::resizeEvent( QResizeEvent * p )
{
+ qDebug("Resizing");
+ m_outofdate = true;
+ if (dbuff != NULL)
+ {
if (m_rotated)
{
dbuff->resize(p->size().height(),p->size().width());
}
else
{
dbuff->resize(p->size());
}
+ }
m_bgIsScaled = false;
if (m_bgtype == bgStretched)
{
emit RefreshBitmap();
}
{
int h, w;
@@ -2600,39 +2962,33 @@ void QTReader::resizeEvent( QResizeEvent * p )
{
w = p->size().width();
h = p->size().height();
}
m_topmargin = (h*m_abstopmargin+500)/1000;
m_bottommargin = (h*m_absbottommargin+500)/1000;
m_left_border = (w*m_absleft_border+500)/1000;
m_right_border = (w*m_absright_border+500)/1000;
-
- qDebug("Top margin:%u", m_topmargin );
- qDebug("Bottom margin:%u", m_bottommargin );
- qDebug("Left margin:%u", m_left_border );
- qDebug("Right margin:%u", m_right_border );
+ }
+ if (dbuff != NULL && buffdoc.empty())
+ {
+ dbp->begin(dbuff);
+ drawBackground(dbp);
+ dbp->end();
}
}
-#endif
void QTReader::setrotated(bool sfs)
{
+ qDebug("Rotating");
m_rotated = sfs;
-#ifdef DOUBLEBUFFER
- if (m_rotated)
- {
- dbuff->resize(height(), width());
- }
- else
- {
- dbuff->resize(width(), height());
- }
+ setDoubleBuffer(m_doubleBuffered);
m_bgIsScaled = false;
-#endif
+ m_outofdate = true;
+ /*
int h, w;
if (m_rotated)
{
h = width();
w = height();
}
else
{
@@ -2643,65 +2999,91 @@ void QTReader::setrotated(bool sfs)
m_bottommargin = (h*m_absbottommargin+500)/1000;
m_left_border = (w*m_absleft_border+500)/1000;
m_right_border = (w*m_absright_border+500)/1000;
qDebug("Top margin:%u", m_topmargin );
qDebug("Bottom margin:%u", m_bottommargin );
qDebug("Left margin:%u", m_left_border );
qDebug("Right margin:%u", m_right_border );
+ */
}
-void QTReader::drawBackground()
+void QTReader::drawBackground(QPainter *p)
{
- dbp->begin(dbuff);
- // dbp->setBackgroundMode(OpaqueMode);
- dbp->setBackgroundColor(m_bg);
- dbp->eraseRect(dbuff->rect());
+ // p->setBackgroundMode(OpaqueMode);
+ p->setBackgroundColor(m_bg);
+ if (dbuff != NULL)
+ {
+ p->eraseRect(dbuff->rect());
+ }
+ else
+ {
+ if (m_rotated)
+ {
+ p->eraseRect(0,0,height(),width());
+ }
+ else
+ {
+ p->eraseRect(rect());
+ }
+ }
if (!m_bgpm.isNull())
{
- // dbp->setBackgroundMode(TransparentMode);
+ // p->setBackgroundMode(TransparentMode);
switch (m_bgtype)
{
case bgCentred:
{
+ if (dbuff == NULL)
+ {
+ p->drawPixmap(width(),height(),m_bgpm);
+ }
+ else
+ {
int w = (dbuff->rect().width()-m_bgpm.width())/2;
int h = (dbuff->rect().height()-m_bgpm.height())/2;
- dbp->drawPixmap(w,h,m_bgpm);
+ p->drawPixmap(w,h,m_bgpm);
+ }
}
break;
case bgTiled:
{
- dbp->drawTiledPixmap(0,0,dbuff->rect().width(),dbuff->rect().height(),m_bgpm);
- /*
- for (int h = 0; h < dbuff->rect().height(); h += m_bgpm.height())
- {
- for (int w = 0; w < dbuff->rect().width(); w += m_bgpm.width())
+ if (dbuff == NULL)
{
- dbp->drawPixmap(w,h,m_bgpm);
+ p->drawTiledPixmap(0,0,width(),height(),m_bgpm);
}
+ else
+ {
+ p->drawTiledPixmap(0,0,dbuff->rect().width(),dbuff->rect().height(),m_bgpm);
}
- */
}
break;
case bgStretched:
{
if (!m_bgIsScaled)
{
m_bgIsScaled = true;
QImage im = m_bgpm.convertToImage();
+ if (dbuff == NULL)
+ {
+ m_bgpm.convertFromImage(im.smoothScale(width(),height()));
+ }
+ else
+ {
m_bgpm.convertFromImage(im.smoothScale(dbuff->rect().width(), dbuff->rect().height()));
}
- dbp->drawPixmap(0,0,m_bgpm);
+ }
+ p->drawPixmap(0,0,m_bgpm);
}
break;
default:
qDebug("Unknown background type");
}
- // dbp->setBackgroundMode(OpaqueMode);
+ // p->setBackgroundMode(OpaqueMode);
}
}
void QTReader::blitRot(int dx, int dy, int sw, int sh, CDrawBuffer* txt)
{
if (txt != NULL)
{
sh = txt->lineSpacing();
@@ -2754,17 +3136,22 @@ void QTReader::blitRot(int dx, int dy, int sw, int sh, CDrawBuffer* txt)
/*
p.drawPixmap(QPoint(dx, dy), rp);
*/
bitBlt(this, dx, dy, &rp, 0, 0, -1, -1, CopyROP);
}
QString QTReader::about()
{
- return QString("QTReader widget (c) Tim Wentford\n")+buffdoc.about() + "\nMini-scrollbar by Markus Gritsch\nNavigation History fixes by Frantisek Dufka";
+ QString ab = QString("QTReader widget (c) Tim Wentford\n")+buffdoc.about() + "\nMini-scrollbar by Markus Gritsch\nNavigation History fixes by Frantisek Dufka";
+ if (m_output != NULL)
+ {
+ ab += QString("\n") + m_output->about();
+ }
+ return ab;
}
void QTReader::getNextLink()
{
if (m_scrolldy != 0)
{
setautoscroll(false);
ResetScroll();
@@ -2892,49 +3279,53 @@ void QTReader::gotoLink()
#ifdef USEQPE
{
QCopEnvelope e("QPE/System", "busy()");
}
#endif
ResetScroll();
if (!href.isEmpty())
{
- if (!buffdoc.getFile(href))
+ if (!buffdoc.getFile(href, nm))
{
emit NewFileRequest(href);
}
else
{
ResetScroll();
fillbuffer();
+ m_outofdate = true;
update();
}
}
if (!nm.isEmpty())
{
qDebug("QTReader:Finding %s", (const char*)nm);
if (buffdoc.findanchor(nm))
{
+ buffdoc.resetPos();
fillbuffer();
+ m_outofdate = true;
update();
}
}
//fillbuffer();
//update();
#ifdef USEQPE
{
QCopEnvelope e("QPE/System", "notBusy()");
}
#endif
}
else if ((lt & eLink) != 0)
{
buffdoc.saveposn(m_lastfile, saveposn);
ResetScroll();
fillbuffer();
+ m_outofdate = true;
update();
}
else
{
if ((lt & ePicture) != 0)
{
QImage* pm = buffdoc.getPicture(tgt);
if (pm != NULL)
@@ -2944,27 +3335,28 @@ void QTReader::gotoLink()
}
}
else
{
// QString anchortext = textarray[lineno]->getanchortext(startoffset);
if (!href.isEmpty())
{
emit OnURLSelected(href, tgt);
+ refresh();
}
}
- locate(pagelocate());
}
m_currentlinkstyle = NULL;
m_currentlink = -1;
m_currentlinkoffset = -1;
}
void QTReader::refresh(bool full)
{
+ qDebug("Refreshing");
int h, w;
if (m_rotated)
{
h = width();
w = height();
}
else
{
@@ -2976,10 +3368,125 @@ void QTReader::refresh(bool full)
m_left_border = (w*m_absleft_border+500)/1000;
m_right_border = (w*m_absright_border+500)/1000;
qDebug("Top margin:%u", m_topmargin );
qDebug("Bottom margin:%u", m_bottommargin );
qDebug("Left margin:%u", m_left_border );
qDebug("Right margin:%u", m_right_border );
if (full && m_highlightfilter) m_highlightfilter->refresh(pagelocate());
+ m_outofdate = true;
locate(pagelocate());
}
+
+#include "striphtml.h"
+
+CFilterChain* QTReader::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(m_lastfile));
+
+#ifdef __STATIC
+ if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile));
+ if (bautofmt && (PreferredMarkup() == cCHM))
+ {
+ striphtml* f = new striphtml(m_lastfile);
+ f->setchm(true);
+ filt->addfilter(f);
+ }
+#else
+ if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new ExternFilter("HTMLfilter", m_lastfile));
+ if (bautofmt && (PreferredMarkup() == cCHM))
+ {
+ ExternFilter* f = new ExternFilter("HTMLfilter",m_lastfile);
+ ((striphtml*)f->filter())->setchm(true);
+ filt->addfilter(f);
+ }
+#endif
+ m_highlightfilter = new HighlightFilter(this);
+ filt->addfilter(m_highlightfilter);
+
+ if (bdehyphen) filt->addfilter(new dehyphen);
+ if (bunindent) filt->addfilter(new unindent);
+ if (brepara) filt->addfilter(new repara(m_reparastring));
+ if (bonespace) filt->addfilter(new OnePara);
+ if (bindenter) filt->addfilter(new indenter(bindenter));
+ if (bdblspce) filt->addfilter(new dblspce);
+ if (bdepluck) filt->addfilter(new DePluck(pluckernextpart));
+ if (bdejpluck) filt->addfilter(new DePluck(jplucknextpart));
+ if (brepalm) filt->addfilter(new repalm);
+ if (bunderlineLink) filt->addfilter(new underlineLink);
+ if (bkern) filt->addfilter(new kern);
+ if (bremap) filt->addfilter(new remap);
+ if (bmakebold) filt->addfilter(new embolden);
+ if (bfulljust) filt->addfilter(new FullJust);
+ int r,g,b;
+ m_default_bg.rgb(&r, &g, &b);
+ if (r != 255 || g != 255 || b != 255)
+ filt->addfilter(new setbg(r,g,b));
+ m_default_fg.rgb(&r, &g, &b);
+ if (r != 0 || g != 0 || b != 0)
+ filt->addfilter(new setfg(r,g,b));
+ // if (bNegative) filt->addfilter(new makeNegative);
+ if (bInverse) filt->addfilter(new makeInverse);
+ if (bNoInlineTables) filt->addfilter(new tableLink);
+ return filt;
+}
+
+void QTReader::readAloud()
+{
+#ifdef __STATIC
+ return;
+#else
+ CBuffer para;
+ jumpto(pagelocate());
+ while (m_autoScroll && (buffdoc.getpara(para) != -1))
+ {
+ if (para.length() > 0)
+ {
+ unsigned long lastpos = buffdoc.explocate();
+ while (lastpos > mylastpos)
+ {
+ dopagedn();
+ qApp->processEvents();
+ }
+ jumpto(lastpos);
+ QString txt = toQString(para.data());
+
+ doOutput(txt);
+ }
+ qApp->processEvents();
+ }
+#endif
+}
+
+bool QTReader::doOutput(const QString& wrd)
+{
+ if (m_output != NULL)
+ {
+ m_output->output(wrd);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+bool QTReader::checkoutput()
+{
+ if (m_output == NULL)
+ {
+ m_output = new outputcodec(m_outputName);
+ if (reinterpret_cast<outputcodec*>(m_output)->getStatus() != 0)
+ {
+ delete m_output;
+ m_output = NULL;
+ QMessageBox::warning(this, PROGNAME, QString("Couldn't find output codec\n")+m_outputName);
+ return false;
+ }
+ }
+ return true;
+}
diff --git a/noncore/apps/opie-reader/QTReader.h b/noncore/apps/opie-reader/QTReader.h
index 3bcdde4..9daa07a 100644
--- a/noncore/apps/opie-reader/QTReader.h
+++ b/noncore/apps/opie-reader/QTReader.h
@@ -13,35 +13,38 @@
class CDrawBuffer;
//class CBuffer;
#include <qpixmap.h>
class QPainter;
class QTimer;
class QImage;
#include "BGType.h"
-#include "striphtml.h"
-#define ROTATION_ENABLED
#define SPECIALSCROLL
-#define DOUBLEBUFFER
-#ifdef DOUBLEBUFFER
+
class QPainter;
-#endif
+class COutput;
class CStyle;
+#define USETIMER
class QTReader : public QWidget
{
Q_OBJECT
friend class QTReaderApp;
-#ifdef DOUBLEBUFFER
+#ifdef USETIMER
+ QTimer* m_dragtimer;
+ unsigned long m_dragtarget;
+#endif
+ COutput* m_output;
+ bool checkoutput();
+ bool m_outofdate, m_drageligible;
QPixmap *dbuff;
QPainter* dbp;
-#endif
void drawSingleLine(int lineno);
void gotoLink();
void emitRedraw();
CStyle* m_currentlinkstyle;
int m_currentlink;
int m_currentlinkoffset;
QPixmap m_bgpm;
bool m_bgIsScaled;
@@ -69,48 +72,48 @@ class QTReader : public QWidget
void dorollingscroll(bool);
void doinplacescroll();
void dostaticscroll();
void suspend();
void redrawScroll(QPainter* p);
int m_delay, m_scrolltype;
unsigned int m_overlap;
bool m_autoScroll, m_swapmouse;
- void drawBackground();
-#ifdef ROTATION_ENABLED
+ void drawBackground(QPainter*);
bool m_rotated;
void setrotated(bool);
-#endif
void autoscroll();
QTimer* timer;
int m_scrolldy1, m_scrolldy2, m_encd, m_scrollpart, m_totalscroll;
void focusInEvent(QFocusEvent*);
void focusOutEvent(QFocusEvent*);
void processmousepositionevent( QMouseEvent* _e );
void processmousewordevent(size_t startpos, size_t startoffset, QMouseEvent* _e, int lineno);
bool ChangeFont(int);
bool getline(CDrawBuffer*);
int m_charWidth;
int m_charpc;
unsigned short m_absleft_border, m_absright_border;
unsigned short m_left_border, m_right_border;
FontControl m_fontControl;
void setBaseSize(unsigned char _s) { m_fontControl.setBaseSize(_s); }
unsigned char getBaseSize() { return m_fontControl.getBaseSize(); }
+ QString m_outputName;
#ifdef _SCROLLPIPE
FILE* m_pipeout;
QString m_pipetarget;
bool m_isPaused;
bool m_pauseAfterEachPara;
#endif
public:
QTReader( QWidget *parent=0, const char *name=0, WFlags f = 0);
// QTReader( const QString& filename, QWidget *parent=0, const tchar *name=0, WFlags f = 0);
~QTReader();
QString about();
+ void readAloud();
CList<Bkmk>* Bkmklist() { return pBkmklist; }
void setBackground(const QColor& _c)
{
m_default_bg = _c;
reset_bg();
}
void setForeground(const QColor& _c)
{
@@ -148,17 +151,17 @@ public:
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(const QString& n, const QString& s, unsigned int lcn = 0) { m_string = n; load_file((const char*)s, lcn); };
/*
void setText(bool oldfile)
{
if (oldfile)
{
m_string = m_lastfile;
load_file((const tchar*)m_string);
}
@@ -220,121 +223,78 @@ public:
case 0:
// qDebug("ascii");
return new CAscii;
default:
return new CGeneral8Bit(m_encd-MAX_ENCODING+1);
}
}
HighlightFilter* m_highlightfilter;
- 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(m_lastfile));
-
-#ifdef __STATIC
- if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new striphtml(m_lastfile));
- if (bautofmt && (PreferredMarkup() == cCHM))
- {
- filt->addfilter(new striphtml(m_lastfile));
- }
-#else
- if (bstriphtml || (bautofmt && (PreferredMarkup() == cHTML))) filt->addfilter(new ExternFilter("HTMLfilter", m_lastfile));
- if (bautofmt && (PreferredMarkup() == cCHM))
- {
- ExternFilter* f = new ExternFilter("HTMLfilter",m_lastfile);
- ((striphtml*)f->filter())->setchm(true);
- filt->addfilter(f);
- }
-#endif
- m_highlightfilter = new HighlightFilter(this);
- filt->addfilter(m_highlightfilter);
-
- if (bdehyphen) filt->addfilter(new dehyphen);
- if (bunindent) filt->addfilter(new unindent);
- if (brepara) filt->addfilter(new repara(m_reparastring));
- if (bonespace) filt->addfilter(new OnePara);
- if (bindenter) filt->addfilter(new indenter(bindenter));
- if (bdblspce) filt->addfilter(new dblspce);
- if (bdepluck) filt->addfilter(new DePluck(pluckernextpart));
- if (bdejpluck) filt->addfilter(new DePluck(jplucknextpart));
- if (brepalm) filt->addfilter(new repalm);
- if (bkern) filt->addfilter(new kern);
- if (bremap) filt->addfilter(new remap);
- if (bmakebold) filt->addfilter(new embolden);
- if (bfulljust) filt->addfilter(new FullJust);
- int r,g,b;
- m_default_bg.rgb(&r, &g, &b);
- if (r != 255 || g != 255 || b != 255)
- filt->addfilter(new setbg(r,g,b));
- m_default_fg.rgb(&r, &g, &b);
- if (r != 0 || g != 0 || b != 0)
- filt->addfilter(new setfg(r,g,b));
- // if (bNegative) filt->addfilter(new makeNegative);
- if (bInverse) filt->addfilter(new makeInverse);
- return filt;
- }
-
+ CFilterChain* getfilter();
private slots:
+#ifdef USETIMER
+ void actionDrag();
+#endif
void dopageup();
void lineDown();
void lineUp();
void dopagedn();
void goHome();
void goBack();
void goForward();
void doscroll();
void paintEvent( QPaintEvent * );
-#ifdef DOUBLEBUFFER
+
void resizeEvent( QResizeEvent * p );
-#endif
+
void keyPressEvent(QKeyEvent*);
private:
// void drawIt( QPainter * );
void redrawall();
void drawFonts();
void DrawStraight(QPainter* p, int w, int h);
QColor m_scrollcolor, m_scrollbarcolor;
void setTwoTouch(bool _b);
void init();
+ void mouseMoveEvent( QMouseEvent* );
void mousePressEvent( QMouseEvent* );
void mouseReleaseEvent( QMouseEvent* );
// void mouseDoubleClickEvent( QMouseEvent* );
QString m_string, m_fontname, m_reparastring;
void setfont();
+ bool m_doubleBuffered;
+
+ void setDoubleBuffer(bool _b);
//myoutput stuff
private:
#ifdef SPECIALSCROLL
int m_scrolldy;
#endif
bool mouseUpOn;
- linkType getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*&);
+ linkType getcurrentpos(int x, int y, int w, int h, int& lineno, size_t& start, size_t& offset, size_t& tgt, size_t& tgtoffset, size_t& pictgt, QImage*&, size_t&);
bool m_twotouch, m_touchone;
size_t m_startpos, m_startoffset;
void dopageup(unsigned int);
long real_delay();
int m_textsize;
int m_lastwidth, m_lastheight;
CBufferFace<CDrawBuffer*> textarray;
CBufferFace<size_t> locnarray;
unsigned int numlines;
// bool m_showlast;
- bool bstripcr, btextfmt, bstriphtml, bdehyphen, bdepluck, bdejpluck, bunindent, brepara, bdblspce, btight, bmakebold, bremap, bpeanut, bautofmt, bonespace, bfulljust, /*bNegative,*/ bInverse;
- bool bkern, brepalm;
+ bool bstripcr, btextfmt, bstriphtml, bdehyphen, bdepluck, bdejpluck, bunindent, brepara, bdblspce, btight, bmakebold, bremap, bpeanut, bautofmt, bonespace, bfulljust, /*bNegative,*/ bInverse, bNoInlineTables;
+ bool bkern, brepalm, bunderlineLink;
bool m_bpagemode, m_bMonoSpaced, m_continuousDocument;
unsigned char bindenter;
QString m_lastfile;
size_t m_lastposn;
bool bDoUpdates;
public:
+ bool doOutput(const QString& wrd);
void setDoUpdates(bool b) { bDoUpdates = b; }
void setStripCR(bool b) { bstripcr = b; }
void NavUp();
void NavDown();
tchar getch() { return buffdoc.getch(); }
bool synch(size_t, size_t);
bool tight;
bool load_file(const char *newfile, unsigned int lcn=0);
diff --git a/noncore/apps/opie-reader/QTReaderApp.cpp b/noncore/apps/opie-reader/QTReaderApp.cpp
index 876b65a..6753698 100644
--- a/noncore/apps/opie-reader/QTReaderApp.cpp
+++ b/noncore/apps/opie-reader/QTReaderApp.cpp
@@ -12,16 +12,17 @@
** 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 <qregexp.h>
#include <qclipboard.h>
#include <qwidgetstack.h>
#ifdef USEQPE
#include <qpe/qpemenubar.h>
#include <qpe/qpetoolbar.h>
#endif
#include <qmenubar.h>
@@ -61,39 +62,44 @@
#include "ToolbarPrefs.h"
#include "Prefs.h"
#include "CAnnoEdit.h"
#include "QFloatBar.h"
#include "FixedFont.h"
#include "URLDialog.h"
#include "util.h"
#include <qfontdatabase.h>
+
#ifdef USEQPE
#include <qpe/resource.h>
#ifdef OPIE
-//#include <qpe/applnk.h>
+#if defined(OPIEFILEDIALOG)
+#include <qpe/applnk.h>
#include <opie2/ofiledialog.h>
using namespace Opie::Ui;
#else
#include "fileBrowser.h"
#endif
#else
+#include "fileBrowser.h"
+#endif
+#else
#include "qfiledialog.h"
#endif
#include "QTReaderApp.h"
#include "CDrawBuffer.h"
#include "Filedata.h"
#include "names.h"
#include "CEncoding_tables.h"
#include "CloseDialog.h"
#include "ButtonPrefs.h"
-bool CheckVersion(int&, int&, char&);
+bool CheckVersion(int&, int&, char&, QWidget*);
#ifdef _WINDOWS
#define PICDIR "c:\\uqtreader\\pics\\"
#else
#ifdef USEQPE
#define USEMSGS
#define PICDIR "opie-reader/"
#else
@@ -148,21 +154,19 @@ void QTReaderApp::listBkmkFiles()
d.setFilter( QDir::Files | QDir::NoSymLinks );
// d.setSorting( QDir::Size | QDir::Reversed );
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
-
while ( (fi=it.current()) ) { // for each file...
- bkmkselector->insertItem(fi->fileName());
- cnt++;
+ bkmkselector->insertItem(fi->fileName(), cnt++);
//qDebug( "%10li %s", fi->size(), fi->fileName().data() );
++it; // goto next list element
}
#else /* USEQPE */
int cnt = 0;
DIR *d;
@@ -172,18 +176,17 @@ void QTReaderApp::listBkmkFiles()
{
struct dirent* de;
struct stat buf;
de = readdir(d);
if (de == NULL) break;
if (lstat((const char *)Global::applicationFileName(APPDIR,de->d_name),&buf) == 0 && S_ISREG(buf.st_mode))
{
- bkmkselector->insertItem(de->d_name);
- cnt++;
+ bkmkselector->insertItem(de->d_name, cnt++);
}
}
closedir(d);
#endif
if (cnt > 0)
{
//tjw menu->hide();
@@ -197,17 +200,17 @@ void QTReaderApp::listBkmkFiles()
QMessageBox::information(this, PROGNAME, "No bookmark files");
}
void QTReaderApp::hidetoolbars()
{
if (m_scrollbar != NULL) m_scrollbar->hide();
if (m_prog != NULL) m_prog->hide();
-#ifdef USEQPE
+#if defined(USEQPE)
menubar->hide();
#endif
if (m_scrollbar != NULL) m_scrollbar->hide();
if (fileBar != NULL) fileBar->hide();
if (viewBar != NULL) viewBar->hide();
if (navBar != NULL) navBar->hide();
@@ -328,24 +331,24 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
m_qtscroll = config.readNumEntry("QTScrollBar", false);
m_localscroll = config.readNumEntry("LocalScrollBar", false);
// fileBar = new QToolBar("File", this);
// QToolBar* viewBar = new QToolBar("File", this);
// QToolBar* navBar = new QToolBar("File", this);
// QToolBar* markBar = new QToolBar("File", this);
-#ifdef USEQPE
+#if defined(USEQPE)
menubar = new QToolBar("Menus", this, m_tbposition);
mb = new QPEMenuBar( menubar );
#else
mb = new QMenuBar( this );
#endif
-#ifdef USEQPE
+#if defined(USEQPE)
QPopupMenu* tmp = new QPopupMenu(mb);
mb->insertItem( geticon( "AppsIcon" ), tmp );
#else
QMenuBar* tmp = mb;
#endif
QPopupMenu *file = new QPopupMenu( mb );
tmp->insertItem( tr( "File" ), file );
@@ -431,16 +434,19 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
#ifdef USEQPE
((QPEApplication*)qApp)->setStylusOperation(reader, QPEApplication::RightOnHold);
#endif
// qDebug("Reading config");
// Config config( APPDIR );
config.setGroup( "View" );
+#if defined(USEQPE) && defined(USENEWFULLSCREEN)
+ m_usenewfullscreen = config.readBoolEntry("NewFullScreen", false);
+#endif
m_debounce = config.readNumEntry("Debounce", 0);
m_buttonprefs->Debounce(m_debounce);
#ifdef USEQPE
m_bFloatingDialog = config.readBoolEntry("FloatDialogs", false);
#else
m_bFloatingDialog = config.readBoolEntry("FloatDialogs", true);
#endif
reader->setStripCR(config.readBoolEntry( "StripCr", true ));
@@ -451,31 +457,34 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
*/
reader->bInverse = config.readBoolEntry("Inverse", false);
reader->m_fontControl.FixGraphics(config.readBoolEntry( "FixGraphics", false ));
reader->setextraspace(config.readNumEntry( "ExtraSpace", 0 ));
reader->setlead(config.readNumEntry( "ExtraLead", 0 ));
reader->btextfmt = config.readBoolEntry( "TextFmt", false );
reader->bautofmt = config.readBoolEntry( "AutoFmt", true );
reader->bstriphtml = config.readBoolEntry( "StripHtml", false );
+ reader->bNoInlineTables = config.readBoolEntry( "NoInlineTables", false );
reader->bpeanut = config.readBoolEntry( "Peanut", false );
reader->bdehyphen = config.readBoolEntry( "Dehyphen", false );
reader->bdepluck = config.readBoolEntry( "Depluck", false );
reader->bdejpluck = config.readBoolEntry( "Dejpluck", false );
reader->bonespace = config.readBoolEntry( "OneSpace", false );
reader->bunindent = config.readBoolEntry( "Unindent", false );
reader->brepara = config.readBoolEntry( "Repara", false );
reader->m_reparastring = config.readEntry( "ReparaString", "\\n{[\\n \\t]}");
m_bgtype = (bground)config.readNumEntry( "BackgroundType" , 0 );
m_themename = config.readEntry("Theme", QString::null );
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_scrollstep = config.readNumEntry( "ScrollStep", 1);
+ reader->m_outputName = config.readEntry( "OutputCodec", "");
+
reader->m_lastfile = config.readEntry( "LastFile", QString::null );
reader->m_lastposn = config.readNumEntry( "LastPosn", 0 );
reader->m_bpagemode = config.readBoolEntry( "PageMode", true );
reader->m_bMonoSpaced = config.readBoolEntry( "MonoSpaced", false);
reader->m_rotated = config.readBoolEntry( "IsRotated", false );
reader->m_scrolltype = config.readNumEntry( "ScrollType", 0 );
m_statusstring = config.readEntry("StatusContent", "%P%% Doc:%d/%D %p%% %z%%");
@@ -495,32 +504,36 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
reader->m_charpc = config.readNumEntry( "CharSpacing", 100 );
reader->m_overlap = config.readNumEntry( "Overlap", 0 );
reader->m_abstopmargin = config.readNumEntry( "Top Margin", 100 );
reader->m_absbottommargin = config.readNumEntry( "Bottom Margin", 100 );
reader->m_absleft_border = config.readNumEntry( "Left Margin", 100 );
reader->m_absright_border = config.readNumEntry( "Right Margin", 100 );
m_scrollishidden = config.readBoolEntry( "HideScrollBar", false );
+ m_hidebars = config.readBoolEntry( "HideToolBar", false );
reader->brepalm = config.readBoolEntry( "Repalm", false );
+ reader->bunderlineLink = config.readBoolEntry( "UnderlineLink", true );
reader->bkern = config.readBoolEntry( "Kern", false );
reader->bremap = config.readBoolEntry( "Remap", true );
reader->bmakebold = config.readBoolEntry( "MakeBold", false );
reader->setContinuous(config.readBoolEntry( "Continuous", true ));
+ reader->setDoubleBuffer(config.readBoolEntry("DoubleBuffer", true));
m_targetapp = config.readEntry( "TargetApp", QString::null );
m_targetmsg = config.readEntry( "TargetMsg", QString::null );
#ifdef _SCROLLPIPE
reader->m_pipetarget = config.readEntry( "PipeTarget", QString::null );
reader->m_pauseAfterEachPara = config.readBoolEntry( "PauseAfterPara", true );
#endif
m_twoTouch = config.readBoolEntry( "TwoTouch", false);
m_doAnnotation = config.readBoolEntry( "Annotation", false);
m_doDictionary = config.readBoolEntry( "Dictionary", false);
m_doClipboard = config.readBoolEntry( "Clipboard", false);
+ m_doOutput = config.readBoolEntry( "OutputTgt", false);
/*
m_spaceTarget = (ActionTypes)config.readNumEntry("SpaceTarget", cesAutoScroll);
m_escapeTarget = (ActionTypes)config.readNumEntry("EscapeTarget", cesNone);
m_returnTarget = (ActionTypes)config.readNumEntry("ReturnTarget", cesFullScreen);
m_leftTarget = (ActionTypes)config.readNumEntry("LeftTarget", cesZoomOut);
m_rightTarget = (ActionTypes)config.readNumEntry("RightTarget", cesZoomIn);
m_upTarget = (ActionTypes)config.readNumEntry("UpTarget", cesPageUp);
m_downTarget = (ActionTypes)config.readNumEntry("DownTarget", cesPageDown);
@@ -837,16 +850,28 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
connect( m_endBlock_action, SIGNAL( activated() ), this, SLOT( editCopy() ) );
m_endBlock_action->addTo( marks );
m_bkmkAvail = NULL;
setToolBarsMovable(m_tbmove);
addtoolbars(&config);
+ if (m_hidebars)
+ {
+#if defined(USEQPE)
+ menubar->hide();
+#endif
+ if (fileBar != NULL) fileBar->hide();
+ if (viewBar != NULL) viewBar->hide();
+ if (navBar != NULL) navBar->hide();
+ if (markBar != NULL) markBar->hide();
+ mb->hide();
+ }
+
pbar = new QProgressBar(this);
pbar->hide();
searchBar = new QFloatBar( "Search", this, QMainWindow::Top, TRUE );
searchBar->setHorizontalStretchable( TRUE );
@@ -967,16 +992,17 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
// qDebug("Inited");
// m_buttonAction[m_spaceTarget]->setOn(true);
// qDebug("fonting");
do_setfont(reader->m_fontname);
// qDebug("fonted");
QFont progfont(reader->m_fontname, reader->m_fontControl.getsize(0));
m_prog->setFont( progfont );
if (m_statusishidden) m_prog->hide();
+ showEditTools();
if (!reader->m_lastfile.isEmpty())
{
// qDebug("doclnk");
// doc = new DocLnk(reader->m_lastfile);
// qDebug("doclnk done");
if (pOpenlist != NULL)
{
@@ -1027,23 +1053,23 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
if (m_scrollbar == NULL || m_scrollbar->isHidden())
{
reader->m_scrollpos = m_localscroll;
}
else
{
reader->m_scrollpos = (m_qtscroll == 0) ? m_localscroll : 0;
}
- reader->bDoUpdates = true;
- reader->update();
+ // reader->bDoUpdates = true;
+ // reader->update();
config.setGroup("Version");
int major = config.readNumEntry("Major", 0);
int bkmktype = config.readNumEntry("BkmkType", 0);
char minor = config.readNumEntry("Minor", 0);
- if (CheckVersion(major, bkmktype, minor))
+ if (CheckVersion(major, bkmktype, minor, this))
{
config.writeEntry("Major", major);
config.writeEntry("BkmkType", bkmktype);
config.writeEntry("Minor", (int)minor);
}
// qDebug("finished update");
if (kmap.isEmpty())
{
@@ -1060,17 +1086,17 @@ QTReaderApp::QTReaderApp( QWidget *parent, const char *name, WFlags f )
}
void QTReaderApp::addtoolbars(Config* config)
{
config->setGroup("Toolbar");
if (fileBar != NULL)
{
-#ifdef USEQPE
+#if defined(USEQPE)
if (fileBar != menubar)
{
fileBar->clear();
}
else
{
m_preferences_action->removeFrom( filebar() );
m_open_action->removeFrom( filebar() );
@@ -1088,17 +1114,17 @@ void QTReaderApp::addtoolbars(Config* config)
addfilebar(config, "Open", m_open_action);
addfilebar(config, "Close", m_close_action);
addfilebar(config, "Info", m_info_action);
addfilebar(config, "Two/One Touch", m_touch_action);
addfilebar(config, "Find", m_find_action);
if (navBar != NULL)
{
-#ifdef USEQPE
+#if defined(USEQPE)
if ((navBar == fileBar) && (fileBar == menubar))
#else
if (navBar == fileBar)
#endif
{
m_scrollButton->removeFrom( navbar() );
m_start_action->removeFrom( navbar() );
m_end_action->removeFrom( navbar() );
@@ -1127,17 +1153,17 @@ void QTReaderApp::addtoolbars(Config* config)
addnavbar(config, "Page Down", m_pagedn_action);
addnavbar(config, "Back", m_back_action);
addnavbar(config, "Home", m_home_action);
addnavbar(config, "Forward", m_forward_action);
if (viewBar != NULL)
{
-#ifdef USEQPE
+#if defined(USEQPE)
if ((viewBar == fileBar) && (fileBar == menubar))
#else
if (viewBar == fileBar)
#endif
{
m_actFullscreen->removeFrom( filebar() );
m_rotate_action->removeFrom( viewbar() );
m_inverse_action->removeFrom( viewbar() );
@@ -1159,17 +1185,17 @@ void QTReaderApp::addtoolbars(Config* config)
addviewbar(config, "Zoom In", m_zoomin_action);
addviewbar(config, "Zoom Out", m_zoomout_action);
addviewbar(config, "Set Font", m_setfont_action);
addviewbar(config, "Encoding Select", m_setenc_action);
addviewbar(config, "Ideogram Mode", m_setmono_action);
if (markBar != NULL)
{
-#ifdef USEQPE
+#if defined(USEQPE)
if ((markBar == fileBar) && (fileBar == menubar))
#else
if (markBar == fileBar)
#endif
{
m_mark_action->removeFrom( markbar() );
m_annotate_action->removeFrom( markbar());
m_goto_action->removeFrom( markbar() );
@@ -1228,17 +1254,17 @@ bool QTReaderApp::checkbar(Config* _config, const QString& key)
QToolBar* QTReaderApp::filebar()
{
if (fileBar == NULL)
{
switch (m_tbpol)
{
-#ifdef USEQPE
+#if defined(USEQPE)
case cesSingle:
// qDebug("Setting filebar to menubar");
fileBar = menubar;
break;
#endif
default:
qDebug("Incorrect toolbar policy set");
case cesMenuTool:
@@ -1712,35 +1738,33 @@ void QTReaderApp::setrotated(bool sfs)
m_scrollbar->setOrientation(Qt::Horizontal);
connect(scrollbar, SIGNAL(nextLine()), reader, SLOT(lineUp()) );
connect(scrollbar, SIGNAL(prevLine()), reader, SLOT(lineDown()) );
connect(scrollbar, SIGNAL(nextPage()), reader, SLOT(dopageup()) );
connect(scrollbar, SIGNAL(prevPage()), reader, SLOT(dopagedn()) );
connect(scrollbar, SIGNAL(sliderMoved(int)), this, SLOT(actionscroll(int)) );
}
// reader->repaint(0, reader->m_left_border, reader->width(), reader->height()-2*reader->m_border);
- reader->repaint();
}
else
{
m_layout->setDirection( (m_qtscroll == 2) ? QBoxLayout::RightToLeft : QBoxLayout::LeftToRight );
if (m_scrollbar != NULL)
{
scrollbar->disconnect();
m_scrollbar->setOrientation(Qt::Vertical);
connect(scrollbar, SIGNAL(nextLine()), reader, SLOT(lineDown()) );
connect(scrollbar, SIGNAL(prevLine()), reader, SLOT(lineUp()) );
connect(scrollbar, SIGNAL(nextPage()), reader, SLOT(dopagedn()) );
connect(scrollbar, SIGNAL(prevPage()), reader, SLOT(dopageup()) );
connect(scrollbar, SIGNAL(sliderMoved(int)), this, SLOT(actionscroll(int)) );
}
// reader->repaint(reader->m_border, 0, reader->width()-2*reader->m_border, reader->height());
- reader->repaint();
}
- // reader->update();
+ reader->refresh();
}
void QTReaderApp::setgrab(bool sfs)
{
#ifdef USEQPE
m_grabkeyboard = sfs;
if (m_grabkeyboard)
{
@@ -1923,17 +1947,17 @@ void QTReaderApp::fileOpen2()
/*
editorStack->raiseWidget( fileSelector );
fileSelector->reread();
*/
bool usebrowser = true;
if (pOpenlist != NULL)
{
m_nBkmkAction = cOpenFile;
- if (listbkmk(pOpenlist, "Browse")) usebrowser = false;
+ if (listbkmk(pOpenlist, "Browse", true)) usebrowser = false;
}
if (usebrowser)
{
QString fn = usefilebrowser();
// qApp->processEvents();
if (!fn.isEmpty() && QFileInfo(fn).isFile())
{
openFile(fn);
@@ -1946,17 +1970,17 @@ void QTReaderApp::fileOpen2()
QString QTReaderApp::usefilebrowser()
{
#ifndef USEQPE
QString s( QFileDialog::getOpenFileName( reader->m_lastfile, QString::null, this ) );
return s;
#else
QString fn;
-#ifdef OPIE
+#if defined(OPIE) && defined(OPIEFILEDIALOG)
QMap<QString, QStringList> mimeTypes;
QStringList etypes;
etypes << "etext/*";
mimeTypes.insert( tr("eText"), etypes );
QStringList types;
types << "text/*";
mimeTypes.insert( tr("Text"), types );
mimeTypes.insert( tr("All"), "*/*" );
@@ -1998,28 +2022,30 @@ void QTReaderApp::showbuttonprefs()
void QTReaderApp::showprefs()
{
CPrefs* prefwin = new CPrefs(reader->width(), !m_bFloatingDialog, this);
// prefwin->Debounce(m_debounce);
prefwin->bgtype(m_bgtype);
prefwin->repalm(reader->brepalm);
+ prefwin->UnderlineLink(reader->bunderlineLink);
prefwin->kern(reader->bkern);
prefwin->hyphenate(reader->hyphenate);
// prefwin->customhyphen(reader->buffdoc.getCustomHyphen());
prefwin->scrolltype(reader->m_scrolltype);
prefwin->scrollstep(reader->m_scrollstep);
prefwin->scrollcolor(m_scrollcolor);
prefwin->minibarcol(m_scrollbarcolor);
prefwin->foreground(m_foreground);
prefwin->background(m_background);
prefwin->twotouch(m_twoTouch);
prefwin->propfontchange(m_propogatefontchange);
prefwin->StripCR(reader->bstripcr);
+ prefwin->InlineTables(!reader->bNoInlineTables);
prefwin->Dehyphen(reader->bdehyphen);
prefwin->SingleSpace(reader->bonespace);
prefwin->Unindent(reader->bunindent);
prefwin->Reparagraph(reader->brepara);
prefwin->DoubleSpace(reader->bdblspce);
prefwin->Remap(reader->bremap);
prefwin->Embolden(reader->bmakebold);
prefwin->FullJustify(reader->bfulljust);
@@ -2051,49 +2077,55 @@ void QTReaderApp::showprefs()
}
else
{
prefwin->Markup(1);
}
prefwin->Depluck(reader->bdepluck);
prefwin->Dejpluck(reader->bdejpluck);
prefwin->Continuous(reader->m_continuousDocument);
+ prefwin->DoubleBuffer(reader->m_doubleBuffered);
prefwin->dictApplication(m_targetapp);
prefwin->dictMessage(m_targetmsg);
/*
prefwin->leftScroll(m_leftScroll);
prefwin->rightScroll(m_rightScroll);
prefwin->upScroll(m_upScroll);
prefwin->downScroll(m_downScroll);
*/
prefwin->miscannotation(m_doAnnotation);
prefwin->miscdictionary(m_doDictionary);
prefwin->miscclipboard(m_doClipboard);
+ prefwin->miscoutput(m_doOutput);
prefwin->SwapMouse(reader->m_swapmouse);
prefwin->Font(reader->m_fontname);
prefwin->gfxsize(reader->getBaseSize());
prefwin->pageoverlap(reader->m_overlap);
prefwin->ideogram(reader->m_bMonoSpaced);
prefwin->encoding(reader->m_encd);
prefwin->ideogramwidth(reader->m_charpc);
+ prefwin->outcodec(reader->m_outputName);
+
if (prefwin->exec())
{
// m_debounce = prefwin->Debounce();
reader->brepalm = prefwin->repalm();
+ reader->bunderlineLink = prefwin->UnderlineLink();
+
reader->bkern = prefwin->kern();
reader->hyphenate = prefwin->hyphenate();
// reader->buffdoc.setCustomHyphen(prefwin->customhyphen());
reader->m_scrolltype = prefwin->scrolltype();
reader->m_scrollstep = prefwin->scrollstep();
m_scrollcolor = prefwin->scrollcolor();
setscrollcolour();
m_scrollbarcolor = prefwin->minibarcol();
@@ -2102,16 +2134,17 @@ void QTReaderApp::showprefs()
reader->setForeground(getcolour(m_foreground));
m_background = prefwin->background();
reader->setBackground(getcolour(m_background));
m_twoTouch = prefwin->twotouch();
reader->setTwoTouch(m_twoTouch);
m_touch_action->setOn(m_twoTouch);
reader->bstripcr = prefwin->StripCR();
+ reader->bNoInlineTables = !prefwin->InlineTables();
reader->bdehyphen = prefwin->Dehyphen();
reader->bonespace = prefwin->SingleSpace();
reader->bunindent = prefwin->Unindent();
reader->brepara = prefwin->Reparagraph();
reader->bdblspce = prefwin->DoubleSpace();
reader->bremap = prefwin->Remap();
reader->bmakebold = prefwin->Embolden();
reader->bfulljust = prefwin->FullJustify();
@@ -2144,29 +2177,31 @@ void QTReaderApp::showprefs()
reader->bpeanut = true;
break;
default:
qDebug("Format out of range");
}
reader->bdepluck = prefwin->Depluck();
reader->bdejpluck = prefwin->Dejpluck();
reader->setContinuous(prefwin->Continuous());
+ reader->setDoubleBuffer(prefwin->DoubleBuffer());
/*
m_leftScroll = prefwin->leftScroll();
m_rightScroll = prefwin->rightScroll();
m_upScroll = prefwin->upScroll();
m_downScroll = prefwin->downScroll();
*/
m_targetapp = prefwin->dictApplication();
m_targetmsg = prefwin->dictMessage();
m_doAnnotation = prefwin->miscannotation();
m_doDictionary = prefwin->miscdictionary();
m_doClipboard = prefwin->miscclipboard();
+ m_doOutput = prefwin->miscoutput();
reader->m_swapmouse = prefwin->SwapMouse();
reader->setBaseSize(prefwin->gfxsize());
reader->m_overlap = prefwin->pageoverlap();
reader->m_bMonoSpaced = prefwin->ideogram();
m_setmono_action->setOn(reader->m_bMonoSpaced);
reader->m_encd = prefwin->encoding();
reader->m_charpc = prefwin->ideogramwidth();
@@ -2178,16 +2213,25 @@ void QTReaderApp::showprefs()
m_propogatefontchange = prefwin->propfontchange();
setfontHelper(prefwin->Font());
}
if (m_bgtype != (bground)prefwin->bgtype())
{
m_bgtype = (bground)prefwin->bgtype();
setBackgroundBitmap();
}
+ qDebug("OutCodec:%s", (const char*)prefwin->outcodec());
+ if (reader->m_outputName != prefwin->outcodec())
+ {
+ if (reader->m_output != NULL)
+ {
+ QMessageBox::warning(this, PROGNAME, "Change of output codec\nrequires a restart");
+ }
+ reader->m_outputName = prefwin->outcodec();
+ }
delete prefwin;
reader->setfilter(reader->getfilter());
reader->refresh();
}
else
{
delete prefwin;
}
@@ -2285,22 +2329,46 @@ void QTReaderApp::showinfo()
else
{
reader->sizes(fs,ts);
ds = reader->buffdoc.endSection() - reader->buffdoc.startSection();
pl = reader->pagelocate();
dl = pl - reader->buffdoc.startSection();
m_infoWin->setFileSize(fs);
m_infoWin->setTextSize(ts);
+ if (fs > UINT_MAX/100)
+ {
+ unsigned long t1 = (ts+50)/100;
+ m_infoWin->setRatio(100-(fs + (t1 >> 1))/t1);
+ }
+ else
+ {
m_infoWin->setRatio(100-(100*fs + (ts >> 1))/ts);
+ }
m_infoWin->setLocation(pl);
+ if (pl > UINT_MAX/100)
+ {
+ unsigned long t1 = (ts+50)/100;
+ m_infoWin->setRead((pl + (t1 >> 1))/t1);
+ }
+ else
+ {
m_infoWin->setRead((100*pl + (ts >> 1))/ts);
+ }
m_infoWin->setDocSize(ds);
m_infoWin->setDocLocation(dl);
+ if (dl > UINT_MAX/100)
+ {
+ unsigned long d1 = (ds+50)/100;
+ m_infoWin->setDocRead((dl + (d1 >> 1))/d1);
+ }
+ else
+ {
m_infoWin->setDocRead((100*dl + (ds >> 1))/ds);
+ }
m_infoWin->setZoom(reader->m_fontControl.currentsize()*10);
m_infoWin->setAbout(QString("\nApplication (c) Tim Wentford\n")+reader->about());
editorStack->raiseWidget( m_infoWin );
hidetoolbars();
m_infoWin->setFocus();
}
}
@@ -2737,17 +2805,17 @@ void QTReaderApp::search(const QString & arg)
}
#else
void QTReaderApp::search()
{
findNext();
}
#endif
-void QTReaderApp::openFile( const QString &f )
+void QTReaderApp::openFile( const QString &f, unsigned int loc )
{
// qDebug("File:%s", (const char*)f);
// openFile(DocLnk(f));
//}
//
//void QTReaderApp::openFile( const DocLnk &f )
//{
clear();
@@ -2760,17 +2828,17 @@ void QTReaderApp::openFile( const QString &f )
{
DocLnk d(f);
QFileInfo fnew(d.file());
fm = fnew;
if (!fm.exists()) return;
}
#endif
clear();
- reader->setText(fm.baseName(), fm.absFilePath());
+ reader->setText(fm.baseName(), fm.absFilePath(), loc);
m_loadedconfig = readconfig(APPDIR "/configs", reader->m_string, false);
qDebug("Showing tools");
showEditTools();
qDebug("Shown tools");
readbkmks();
qDebug("read markss");
m_savedpos = 0xffffffff;
}
@@ -2801,17 +2869,17 @@ void QTReaderApp::handlekey(QKeyEvent* e)
unsigned long etime = (1000*(now.time - m_lastkeytime.time) + now.millitm)-m_lastkeytime.millitm;
if (etime < m_debounce)
{
return;
}
switch(e->key())
{
case Key_Escape:
-// qDebug("escape event");
+ qDebug("escape event");
if (m_disableesckey)
{
m_disableesckey = false;
}
else
{
m_bcloseDisabled = true;
if (m_fullscreen)
@@ -2886,50 +2954,51 @@ void QTReaderApp::handlekey(QKeyEvent* e)
QString key;
msg += key.setNum(e->key());
QMessageBox::information(this, PROGNAME, msg);
*/
}
ftime(&m_lastkeytime);
}
-#ifdef NEWFULLSCREEN
-void QTReaderApp::enableFullscreen()
-{
- setFixedSize(qApp->desktop()->size());
- showNormal();
- reparent(0, WStyle_Customize | WStyle_NoBorder, QPoint(0,0));
- showFullScreen();
-}
-
-void QTReaderApp::resizeEvent(QResizeEvent *)
+#if defined(USEQPE) && defined(USENEWFULLSCREEN)
+void QTReaderApp::focusInEvent(QFocusEvent *)
{
- if (m_fullscreen && (size() != qApp->desktop()->size()))
+ if (m_usenewfullscreen && m_fullscreen && (editorStack->visibleWidget() == reader))
{
- enableFullscreen();
+ m_usenewfullscreen = false;
+ reader->bDoUpdates = false;
+ showEditTools();
+ reader->bDoUpdates = true;
+ reader->update();
+ m_usenewfullscreen = true;
}
}
-void QTReaderApp::focusInEvent(QFocusEvent*)
+void QTReaderApp::resizeEvent(QResizeEvent *)
{
- if (m_fullscreen)
+ if (m_usenewfullscreen && m_fullscreen && (editorStack->visibleWidget() == reader))
{
- enableFullscreen();
- raise();
+ m_usenewfullscreen = false;
+ reader->bDoUpdates = false;
+ showEditTools();
+ reader->bDoUpdates = true;
+ reader->update();
+ m_usenewfullscreen = true;
}
}
#endif
void QTReaderApp::showEditTools()
{
// if ( !doc )
// close();
if (m_fullscreen)
{
-#ifdef USEQPE
+#if defined(USEQPE)
if (menubar != NULL) menubar->hide();
#endif
if (fileBar != NULL) fileBar->hide();
if (viewBar != NULL) viewBar->hide();
if (navBar != NULL) navBar->hide();
if (markBar != NULL) markBar->hide();
if (m_prog != NULL)
{
@@ -2939,21 +3008,17 @@ void QTReaderApp::showEditTools()
searchBar->hide();
regBar->hide();
#ifdef USEQPE
Global::hideInputMethod();
#endif
if (m_scrollbar != NULL) m_scrollbar->hide();
m_fontBar->hide();
// showNormal();
-#ifdef NEWFULLSCREEN
- enableFullscreen();
-#else
showFullScreen();
-#endif
}
else
{
// qDebug("him");
#ifdef USEQPE
Global::hideInputMethod();
#endif
// qDebug("eb");
@@ -2965,17 +3030,17 @@ void QTReaderApp::showEditTools()
}
else
{
m_scrollbar->show();
}
}
if (!m_hidebars)
{
-#ifdef USEQPE
+#if defined(USEQPE)
menubar->show();
#endif
if (fileBar != NULL) fileBar->show();
if (viewBar != NULL) viewBar->show();
if (navBar != NULL) navBar->show();
if (markBar != NULL) markBar->show();
if (m_prog != NULL && !m_statusishidden)
{
@@ -2999,30 +3064,30 @@ void QTReaderApp::showEditTools()
Global::showInputMethod();
#endif
regBar->show();
}
if (m_fontVisible) m_fontBar->show();
// qDebug("sn");
showNormal();
// qDebug("sm");
-#ifdef USEQPE
+#if defined(USEQPE) && !defined(SIMPAD)
showMaximized();
#endif
// setCentralWidget(reader);
}
// qDebug("uc");
updateCaption();
// qDebug("rw");
editorStack->raiseWidget( reader );
// qDebug("sf");
reader->setFocus();
// qDebug("ref");
- reader->refresh(true);
+ //reader->refresh(true);
// qDebug("done");
}
/*
void QTReaderApp::save()
{
if ( !doc )
return;
if ( !editor->edited() )
@@ -3169,41 +3234,51 @@ void QTReaderApp::do_gotomark()
void QTReaderApp::do_delmark()
{
m_nBkmkAction = cDelBkmk;
if (!listbkmk(pBkmklist))
QMessageBox::information(this, PROGNAME, "No bookmarks in memory");
}
-bool QTReaderApp::listbkmk(CList<Bkmk>* plist, const QString& _lab)
+bool QTReaderApp::listbkmk(CList<Bkmk>* plist, const QString& _lab, bool presel)
{
bkmkselector->clear();
if (_lab.isEmpty())
bkmkselector->setText("Cancel");
else
bkmkselector->setText(_lab);
int cnt = 0;
+ int slt = -1;
if (plist != NULL)
{
for (CList<Bkmk>::iterator i = plist->begin(); i != plist->end(); i++)
{
+ if (presel)
+ {
+ Bkmk* p = i.pContent();
+ if (toQString(CFiledata(p->anno()).name()) == reader->m_lastfile)
+ {
+ slt = cnt;
+ }
+ }
#ifdef _UNICODE
// qDebug("Item:%s", (const char*)toQString(i->name()));
- bkmkselector->insertItem(toQString(i->name()));
+ bkmkselector->insertItem(toQString(i->name()), cnt++);
#else
- bkmkselector->insertItem(i->name());
+ bkmkselector->insertItem(i->name(), cnt++);
#endif
- cnt++;
+
}
}
if (cnt > 0)
{
hidetoolbars();
editorStack->raiseWidget( bkmkselector );
+ if (slt != -1) bkmkselector->setCurrentItem(slt);
return true;
}
else
return false;
}
void QTReaderApp::do_autogen()
{
@@ -3233,40 +3308,41 @@ 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);
+ stat((const char *)fn, &fnstat);
if (CFiledata(bk->anno()).date()
!= fnstat.st_mtime)
{
CFiledata fd(bk->anno());
fd.setdate(fnstat.st_mtime);
bk->value(0);
+ reader->m_lastposn = 0;
+ openFile(fn);
}
else
{
unsigned short svlen = bk->filedatalen();
unsigned char* svdata = bk->filedata();
+ openFile(fn, bk->value());
reader->putSaveData(svdata, svlen);
// setstate(svdata, svlen);
if (svlen != 0)
{
QMessageBox::warning(this, PROGNAME, "Not all file data used\nNew version?");
}
// qDebug("updating");
// showEditTools();
- reader->locate(bk->value());
}
return true;
}
else
{
return false;
}
}
@@ -3361,17 +3437,17 @@ void QTReaderApp::gotobkmk(int ind)
QMessageBox::information(this, PROGNAME, "Couldn't open output");
}
}
#else /* USEQPE */
FILE* fin = fopen((const char *)Global::applicationFileName(APPDIR "/urls",bkmkselector->text(ind)), "r");
if (fin != NULL)
{
bool allok = false;
-#ifdef OPIE
+#if defined(OPIE) && defined(OPIEFILEDIALOG)
QString outfile = OFileDialog::getSaveFileName(OFileSelector::EXTENDED_ALL, QString::null, QString::null, MimeTypes(), 0, "OpieReader");
if (!outfile.isEmpty())
{
FILE* fout = fopen((const char *)outfile, "w");
if (fout != NULL)
{
fprintf(fout, "<html><body>\n");
int ch = 0;
@@ -3698,35 +3774,44 @@ void QTReaderApp::do_autogen(const QString& regText)
pbar->raise();
pbar->reset();
reader->update();
qApp->processEvents();
reader->setFocus();
reader->jumpto(0);
int lastpc = 0;
int i = 0;
+ unsigned int llcn = reader->locate();
while (i >= 0)
{
- unsigned int lcn = reader->locate();
+ unsigned int lcn = llcn;
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));
+ /*
+ llcn = reader->locate();
+ if ((i == 0) && (llcn+1 < ts))
+ {
+ reader->jumpto(++llcn);
+ i = 1;
+ }
+ */
}
pBkmklist->sort();
pbar->setProgress(100);
qApp->processEvents();
pbar->hide();
reader->refresh();
}
@@ -4027,16 +4112,20 @@ void QTReaderApp::showAnnotation()
hidetoolbars();
m_annoWin->setFocus();
}
void QTReaderApp::OnWordSelected(const QString& wrd, size_t posn, size_t posn2, const QString& line)
{
//// qDebug("OnWordSelected(%u):%s", posn, (const char*)wrd);
+ if (m_doOutput && reader->checkoutput())
+ {
+ reader->doOutput(wrd);
+ }
if (m_doClipboard)
{
QClipboard* cb = QApplication::clipboard();
cb->setText(wrd);
#ifdef USEQPE
if (wrd.length() > 10)
{
Global::statusMessage(wrd.left(8) + "..");
@@ -4111,28 +4200,28 @@ void QTReaderApp::doAction(QKeyEvent* e)
break;
case cesInvertColours:
m_inverse_action->setOn(!reader->bInverse);
break;
case cesToggleBars:
m_hidebars = !m_hidebars;
if (m_hidebars)
{
-#ifdef USEQPE
+#if defined(USEQPE)
menubar->hide();
#endif
if (fileBar != NULL) fileBar->hide();
if (viewBar != NULL) viewBar->hide();
if (navBar != NULL) navBar->hide();
if (markBar != NULL) markBar->hide();
mb->hide();
}
else
{
-#ifdef USEQPE
+#if defined(USEQPE)
menubar->show();
#endif
if (fileBar != NULL) fileBar->show();
if (viewBar != NULL) viewBar->show();
if (navBar != NULL) navBar->show();
if (markBar != NULL) markBar->show();
mb->show();
}
@@ -4335,16 +4424,17 @@ void QTReaderApp::do_saveconfig(const QString& _txt, bool full)
fi.setFile(d, _txt);
}
// qDebug("Path:%s", (const char*)fi.absFilePath());
Config config(fi.absFilePath());
#endif
config.writeEntry( "StripCr", reader->bstripcr );
+ config.writeEntry( "NoInlineTables", reader->bNoInlineTables );
config.writeEntry( "AutoFmt", reader->bautofmt );
config.writeEntry( "TextFmt", reader->btextfmt );
config.writeEntry( "StripHtml", reader->bstriphtml );
config.writeEntry( "Dehyphen", reader->bdehyphen );
config.writeEntry( "Depluck", reader->bdepluck );
config.writeEntry( "Dejpluck", reader->bdejpluck );
config.writeEntry( "OneSpace", reader->bonespace );
config.writeEntry( "Unindent", reader->bunindent );
@@ -4360,16 +4450,17 @@ void QTReaderApp::do_saveconfig(const QString& _txt, bool full)
config.writeEntry( "ScrollType", reader->m_scrolltype );
if (full)
{
config.writeEntry("Debounce", m_debounce);
config.writeEntry("FloatDialogs", m_bFloatingDialog);
reader->m_lastposn = reader->pagelocate();
config.writeEntry( "LastFile", reader->m_lastfile );
config.writeEntry( "LastPosn", (int)(reader->pagelocate()) );
+ config.writeEntry( "OutputCodec", reader->m_outputName);
}
config.writeEntry( "PageMode", reader->m_bpagemode );
config.writeEntry( "MonoSpaced", reader->m_bMonoSpaced );
config.writeEntry( "SwapMouse", reader->m_swapmouse);
config.writeEntry( "IsRotated", reader->m_rotated );
config.writeEntry("StatusContent", m_statusstring);
config.writeEntry("StatusHidden", m_statusishidden);
config.writeEntry( "Background", m_background );
@@ -4391,36 +4482,40 @@ void QTReaderApp::do_saveconfig(const QString& _txt, bool full)
#ifdef _SCROLLPIPE
config.writeEntry( "PipeTarget", reader->m_pipetarget );
config.writeEntry( "PauseAfterPara", reader->m_pauseAfterEachPara );
#endif
config.writeEntry( "TwoTouch", m_twoTouch );
config.writeEntry( "Annotation", m_doAnnotation);
config.writeEntry( "Dictionary", m_doDictionary);
config.writeEntry( "Clipboard", m_doClipboard);
+ config.writeEntry( "OutputTgt", m_doOutput);
/*
config.writeEntry( "SpaceTarget", m_spaceTarget);
config.writeEntry( "EscapeTarget", m_escapeTarget);
config.writeEntry( "ReturnTarget", m_returnTarget);
config.writeEntry( "LeftTarget", m_leftTarget);
config.writeEntry( "RightTarget", m_rightTarget);
config.writeEntry( "UpTarget", m_upTarget);
config.writeEntry( "DownTarget", m_downTarget);
config.writeEntry("LeftScroll", m_leftScroll);
config.writeEntry("RightScroll", m_rightScroll);
config.writeEntry("UpScroll", m_upScroll);
config.writeEntry("DownScroll", m_downScroll);
*/
config.writeEntry( "Repalm", reader->brepalm );
+ config.writeEntry( "UnderlineLink", reader->bunderlineLink );
config.writeEntry( "HideScrollBar", m_scrollishidden );
+ config.writeEntry( "HideToolBar", m_hidebars );
config.writeEntry( "Kern", reader->bkern );
config.writeEntry( "Remap", reader->bremap );
config.writeEntry( "Peanut", reader->bpeanut );
config.writeEntry( "MakeBold", reader->bmakebold );
config.writeEntry( "Continuous", reader->m_continuousDocument );
+ config.writeEntry( "DoubleBuffer", reader->m_doubleBuffered);
config.writeEntry( "FullJust", reader->bfulljust );
// config.writeEntry( "Negative", reader->bNegative );
config.writeEntry( "Inverse", reader->bInverse );
config.writeEntry( "FixGraphics", reader->m_fontControl.FixGraphics());
config.writeEntry( "ExtraSpace", reader->getextraspace() );
config.writeEntry( "ExtraLead", reader->getlead() );
config.writeEntry( "Basesize", (int)reader->getBaseSize());
config.writeEntry( "RequestorFontChange", m_propogatefontchange);
@@ -4514,16 +4609,17 @@ bool QTReaderApp::readconfig(const QString& dirname, const QString& _txt, bool f
config.setGroup("Toolbar");
m_tbmovesave = m_tbmove = config.readBoolEntry("Movable", m_tbmovesave);
m_tbpolsave = m_tbpol = (ToolbarPolicy)config.readNumEntry("Policy", m_tbpolsave);
m_tbposition = (ToolBarDock)config.readNumEntry("Position", m_tbposition);
}
config.setGroup( "View" );
m_bFloatingDialog = config.readBoolEntry("FloatDialogs", m_bFloatingDialog);
reader->bstripcr = config.readBoolEntry( "StripCr", reader->bstripcr );
+ reader->bNoInlineTables = config.readBoolEntry( "NoInlineTables", reader->bNoInlineTables );
reader->bfulljust = config.readBoolEntry( "FullJust", reader->bfulljust );
reader->bInverse = config.readBoolEntry( "Inverse", reader->bInverse );
// reader->bNegative = config.readBoolEntry( "Negative", false );
reader->m_fontControl.FixGraphics(config.readBoolEntry( "FixGraphics", reader->m_fontControl.FixGraphics() ));
reader->setextraspace(config.readNumEntry( "ExtraSpace", reader->getextraspace() ));
reader->setlead(config.readNumEntry( "ExtraLead", reader->getlead() ));
reader->btextfmt = config.readBoolEntry( "TextFmt", reader->btextfmt );
reader->bautofmt = config.readBoolEntry( "AutoFmt", reader->bautofmt );
@@ -4569,38 +4665,44 @@ bool QTReaderApp::readconfig(const QString& dirname, const QString& _txt, bool f
reader->m_encd = config.readNumEntry( "Encoding", reader->m_encd );
reader->m_charpc = config.readNumEntry( "CharSpacing", reader->m_charpc );
reader->m_overlap = config.readNumEntry( "Overlap", reader->m_overlap );
reader->m_abstopmargin = config.readNumEntry( "Top Margin", reader->m_abstopmargin );
reader->m_absbottommargin = config.readNumEntry( "Bottom Margin", reader->m_absbottommargin );
reader->m_absleft_border = config.readNumEntry( "Left Margin", reader->m_absleft_border );
reader->m_absright_border = config.readNumEntry( "Right Margin", reader->m_absright_border );
m_scrollishidden = config.readBoolEntry( "HideScrollBar", m_scrollishidden );
+ m_hidebars = config.readBoolEntry( "HideToolBar", m_hidebars );
reader->brepalm = config.readBoolEntry( "Repalm", reader->brepalm );
+ reader->bunderlineLink = config.readBoolEntry( "UnderlineLink", reader->bunderlineLink );
reader->bkern = config.readBoolEntry( "Kern", reader->bkern );
reader->bremap = config.readBoolEntry( "Remap", reader->bremap );
reader->bmakebold = config.readBoolEntry( "MakeBold", reader->bmakebold );
reader->setContinuous(config.readBoolEntry( "Continuous", reader->m_continuousDocument ));
+ reader->setDoubleBuffer(config.readBoolEntry("DoubleBuffer", reader->m_doubleBuffered));
m_targetapp = config.readEntry( "TargetApp", m_targetapp );
m_targetmsg = config.readEntry( "TargetMsg", m_targetmsg );
#ifdef _SCROLLPIPE
reader->m_pipetarget = config.readEntry( "PipeTarget", reader->m_pipetarget );
reader->m_pauseAfterEachPara = config.readBoolEntry( "PauseAfterPara", reader->m_pauseAfterEachPara );
#endif
m_twoTouch = config.readBoolEntry( "TwoTouch", m_twoTouch);
m_doAnnotation = config.readBoolEntry( "Annotation", m_doAnnotation);
m_doDictionary = config.readBoolEntry( "Dictionary", m_doDictionary);
m_doClipboard = config.readBoolEntry( "Clipboard", m_doClipboard);
+ m_doOutput = config.readBoolEntry( "OutputTgt", m_doOutput);
#ifdef USEQPE
m_grabkeyboard = config.readBoolEntry( "GrabKeyboard", m_grabkeyboard);
#endif
m_propogatefontchange = config.readBoolEntry( "RequestorFontChange", m_propogatefontchange);
reader->setBaseSize(config.readNumEntry( "Basesize", reader->getBaseSize() ));
reader->setTwoTouch(m_twoTouch);
+ reader->m_outputName = config.readEntry( "OutputCodec", reader->m_outputName);
+
m_touch_action->setOn(m_twoTouch);
m_setmono_action->setOn(reader->m_bMonoSpaced);
setfontHelper(reader->m_fontname);
if (full)
{
addtoolbars(&config);
}
reader->setfilter(reader->getfilter());
@@ -4632,18 +4734,17 @@ bool QTReaderApp::PopulateConfig(const char* tgtdir, bool usedirs)
// d.setSorting( QDir::Size | QDir::Reversed );
const QFileInfoList *list = d.entryInfoList();
QFileInfoListIterator it( *list ); // create list iterator
QFileInfo *fi; // pointer for traversing
while ( (fi=it.current()) ) { // for each file...
- bkmkselector->insertItem(fi->fileName());
- cnt++;
+ bkmkselector->insertItem(fi->fileName(), cnt++);
//qDebug( "%10li %s", fi->size(), fi->fileName().data() );
++it; // goto next list element
}
#else /* USEQPE */
int cnt = 0;
DIR *d;
@@ -4658,18 +4759,17 @@ bool QTReaderApp::PopulateConfig(const char* tgtdir, bool usedirs)
{
struct dirent* de;
struct stat buf;
de = readdir(d);
if (de == NULL) break;
if (lstat((const char *)Global::applicationFileName(finaldir,de->d_name),&buf) == 0 && ((usedirs && S_ISDIR(buf.st_mode)) || (!usedirs && S_ISREG(buf.st_mode))))
{
- bkmkselector->insertItem(de->d_name);
- cnt++;
+ bkmkselector->insertItem(de->d_name, cnt++);
}
}
delete [] finaldir;
closedir(d);
#endif
return (cnt > 0);
}
@@ -4730,16 +4830,18 @@ void QTReaderApp::OnURLSelected(const QString& href, const size_t tgt)
{
QString type = href.left(col);
qDebug("Type:%s", (const char*)type);
}
else
{
qDebug("No type");
}
+ QString msg = "External URL\n" + href;
+ QMessageBox::information(this, PROGNAME, msg);
#else
if (href.isEmpty())
{
QMessageBox::information(this, PROGNAME, "No URL information supplied");
}
else
{
CURLDialog* urld = new CURLDialog(href, false, this);
@@ -4896,33 +4998,37 @@ void QTReaderApp::setscrollbarcolour()
void QTReaderApp::forceopen(const QString& filename)
{
/*
QFileInfo fi(reader->m_lastfile);
fi = QFileInfo(filename);
QString flnm = fi.absFilePath();
*/
- if (!filename.isEmpty())
+ if (!filename.isEmpty() && QFileInfo(filename).exists())
{
updatefileinfo();
if (pBkmklist != NULL)
{
if (m_fBkmksChanged)
{
savebkmks();
}
delete pBkmklist;
pBkmklist = NULL;
m_fBkmksChanged = false;
}
reader->disableAutoscroll();
openFile(filename);
reader->setFocus();
}
+ else
+ {
+ OnURLSelected(filename, 0);
+ }
}
void QTReaderApp::actionscroll(int v)
{
if (reader->m_rotated)
{
reader->dopageup(reader->buffdoc.startSection()+reader->buffdoc.endSection()-v);
}
diff --git a/noncore/apps/opie-reader/QTReaderApp.h b/noncore/apps/opie-reader/QTReaderApp.h
index ad47fc9..ab1b7ad 100644
--- a/noncore/apps/opie-reader/QTReaderApp.h
+++ b/noncore/apps/opie-reader/QTReaderApp.h
@@ -170,31 +170,31 @@ class QTReaderApp : public QMainWindow
{
if (m_grabkeyboard)
{
((QPEApplication*)qApp)->grabKeyboard();
}
}
#endif
void suspend();
- void openFile( const QString & );
+ void openFile( const QString &, unsigned int loc = 0 );
protected:
void setfontHelper(const QString& lcn, int size = 0);
QAction* m_bkmkAvail, *m_actFullscreen;
CAnnoEdit* m_annoWin;
Bkmk* m_anno;
int m_scrollcolor, m_scrollbarcolor, m_background, m_foreground;
// void resizeEvent(QResizeEvent* e);
void closeEvent( QCloseEvent *e );
-#ifdef NEWFULLSCREEN
+#if defined(USEQPE) && defined(USENEWFULLSCREEN)
+ bool m_usenewfullscreen;
void resizeEvent(QResizeEvent *);
void focusInEvent(QFocusEvent*);
- void enableFullscreen();
#endif
void readbkmks();
void do_mono(const QString&);
void do_jump(const QString&);
void do_reparastring(const QString&);
void do_settarget(const QString&);
#ifdef _SCROLLPIPE
// void do_setpipetarget(const QString&);
@@ -203,16 +203,17 @@ class QTReaderApp : public QMainWindow
bool readconfig(const QString&, const QString&, bool);
bool PopulateConfig(const char*, bool usedirs = false);
ActionTypes ActNameToInt(const QString&);
#ifdef USEQPE
bool m_grabkeyboard;
#endif
bool m_doAnnotation;
bool m_doDictionary;
+ bool m_doOutput;
bool m_doClipboard;
bool m_fullscreen;
bool m_loadedconfig;
public:
void saveprefs();
public slots:
void setBackgroundBitmap();
void UpdateStatus();
@@ -383,17 +384,17 @@ private slots:
void getstate(unsigned char*& data, unsigned short& len);
*/
void fileOpen2();
void readfilelist();
void savefilelist();
void updatefileinfo();
bool openfrombkmk(Bkmk*);
QString m_targetapp, m_targetmsg, m_statusstring, m_themename;
- bool listbkmk(CList<Bkmk>*, const QString& _lab = QString::null);
+ bool listbkmk(CList<Bkmk>*, const QString& _lab = QString::null, bool presel=false);
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);
@@ -416,21 +417,21 @@ private slots:
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,*/ *fileBar;
-#ifdef USEQPE
+#if defined(USEQPE)
QToolBar *menubar;
#endif
QToolBar *fileBar, *navBar, *viewBar, *markBar;
-#ifdef USEQPE
+#if defined(USEQPE)
QPEMenuBar *mb;
#else
QMenuBar *mb;
#endif
QFloatBar *searchBar, *regBar/*, *m_fontBar*/;
QToolBar /* *searchBar, *regBar,*/ *m_fontBar;
QLineEdit *searchEdit, *regEdit;
bool searchVisible;
diff --git a/noncore/apps/opie-reader/Reb.cpp b/noncore/apps/opie-reader/Reb.cpp
new file mode 100644
index 0000000..2e6c1fc
--- a/dev/null
+++ b/noncore/apps/opie-reader/Reb.cpp
@@ -0,0 +1,789 @@
+#include <stdio.h>
+#include <string.h>
+#include <qimage.h>
+#include "decompress.h"
+#include "Reb.h"
+#include "my_list.h"
+#include "Bkmks.h"
+#include "Model.h"
+/*
+#ifdef offsetof
+#define OffsetOf(type, field) ((int) offsetof(type, field))
+#else
+#define OffsetOf(type, field) ((int) ((char *) &((type *) 0)->field))
+#endif
+
+template<class T>
+UInt32 binarychop(T* data, UInt32 n, T val)
+{
+ UInt32 jl = 0,jh = n-1,jm = (jl+jh)/2;
+ while (jh > jl+1)
+ {
+ if (data[jm] > val)
+ {
+ jh = jm;
+ }
+ else
+ {
+ jl = jm;
+ }
+ jm = (jl+jh)/2;
+ }
+ return jl;
+}
+
+template<class T, class D>
+UInt32 binarychop(D* data, UInt32 n, T val, UInt32 offset)
+{
+ UInt32 jl = 0,jh = n-1,jm = (jl+jh)/2;
+ while (jh > jl+1)
+ {
+ T* d = reinterpret_cast<T*>(reinterpret_cast<char*>(data+jm)+offset);
+ if (*d > val)
+ {
+ jh = jm;
+ }
+ else
+ {
+ jl = jm;
+ }
+ jm = (jl+jh)/2;
+ }
+ return jl;
+}
+*/
+
+CReb::CReb()
+:
+ fin(NULL), m_indexpages(NULL), m_pagedetails(NULL),tagoffset(0),
+ tags(NULL), paras(NULL), noparas(0), joins(NULL), nojoins(0)
+{
+}
+
+CReb::~CReb()
+{
+ if (fin != NULL) fclose(fin);
+ if (m_indexpages != NULL) delete [] m_indexpages;
+ if (m_pagedetails != NULL) delete [] m_pagedetails;
+ if (tags != NULL) delete [] tags;
+ if (paras != NULL) delete [] paras;
+ if (joins != NULL) delete [] joins;
+}
+
+unsigned int CReb::locate()
+{
+ return m_pagedetails[currentpage.pageno()].pagestart+currentpage.offset();
+}
+
+void CReb::locate(unsigned int n)
+{
+ /*
+ UInt32 cp = nopages-1;
+ for (int i = 0; i < nopages; ++i)
+ {
+ if (m_pagedetails[i].pagestart > n)
+ {
+ cp = i-1;
+ break;
+ }
+ }
+ qDebug("Requesting %u from page %u [%u]", n, cp, n - m_pagedetails[cp].pagestart);
+ */
+ //UInt32 jl = binarychop<UInt32, Page_detail>(m_pagedetails, nopages, n, OffsetOf(Page_detail, pagestart));
+
+ UInt32 jl = 0,jh = nopages-1,jm = (jl+jh)/2;
+ while (jh > jl+1)
+ {
+ if (m_pagedetails[jm].pagestart > n)
+ {
+ jh = jm;
+ }
+ else
+ {
+ jl = jm;
+ }
+ jm = (jl+jh)/2;
+ }
+
+ unsuspend();
+ Page_detail rs = m_pagedetails[jl];
+ UInt32 val = n - rs.pagestart;
+ if (jl != currentpage.pageno()) readindex(jl);
+ currentpage.setoffset(page2pos(jl), jl, ((rs.flags & 8) != 0), rs.len, val);
+ if (noparas > 0)
+ {
+ //jl = binarychop<int, ParaRef>(paras, noparas, val, OffsetOf(ParaRef, pos));
+
+ UInt32 jl = 0,jh = noparas-1,jm = (jl+jh)/2;
+ while (jh > jl+1)
+ {
+ if (paras[jm].pos > val)
+ {
+ jh = jm;
+ }
+ else
+ {
+ jl = jm;
+ }
+ jm = (jl+jh)/2;
+ }
+
+ qDebug("TAGS:%s", (const char*)tags[paras[jl].tag]);
+ tagstring = tags[paras[jl].tag]+"<br>"; // Add br to set extra space to 0
+ tagoffset = 0;
+ }
+ unsigned long current = locate();
+ if (m_currentstart > current || current > m_currentend)
+ {
+ start2endSection();
+ }
+ if (current != n) qDebug("ERROR:Ended up at %u", current);
+}
+
+bool CReb::getFile(const QString& href, const QString& nm)
+{
+ qDebug("File:%s, Name:%s", (const char*)href, (const char*)nm);
+ QMap<QString, UInt32>::Iterator iter = m_index.find(href);
+ if (iter != m_index.end())
+ {
+ qDebug("REB:BEFORE:%u", locate());
+ startpage(iter.data());
+ qDebug("REB:AFTER:%u", locate());
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+QImage* CReb::getPicture(const QString& ref)
+{
+ QMap<QString, UInt32>::Iterator iter = m_index.find(ref);
+ if (iter != m_index.end())
+ {
+ unsuspend();
+ Page_detail rs = m_pagedetails[iter.data()];
+ char* imgbuffer = new char[rs.len];
+ fseek(fin, page2pos(iter.data()), SEEK_SET);
+ fread(imgbuffer, rs.len, 1, fin);
+ QByteArray arr;
+ arr.assign((const char*)imgbuffer, rs.len);
+ QImage* qimage = new QImage(arr);
+ return qimage;
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+CList<Bkmk>* CReb::getbkmklist() { return NULL; }
+
+void CReb::home()
+{
+ startpage(m_homepage);
+}
+
+int CReb::OpenFile(const char *src)
+{
+ m_binary = false;
+ if (fin != NULL) fclose(fin);
+ fin = fopen(src, "r");
+ if (fin == NULL)
+ {
+ return -1;
+ }
+ UInt32 type;
+ fseek(fin, 6, SEEK_SET);
+ fread(&type, 1, sizeof(type), fin);
+ qDebug("CREB:Okay %x", type);
+
+ if (type == 0x4f56554e || type == 0x574d4954 || type == 0x576d6954)
+ {
+ struct stat _stat;
+ stat(src, &_stat);
+ file_length = _stat.st_size;
+ fread(&m_blocksize, 1, sizeof(m_blocksize), fin);
+ if (type == 0x574d4954 || type == 0x576d6954)
+ {
+ if (type == 0x576d6954) m_binary = true;
+ qDebug("Blocksize(1) %x", m_blocksize);
+ unsigned char ct = (m_blocksize >> 24) & 0xff;
+ qDebug("Compress type:%x", ct);
+ switch (ct)
+ {
+ case 0:
+ m_decompress = UnZip;
+ break;
+ case 3:
+ m_decompress = getdecompressor("PluckerDecompress3");
+ break;
+ case 4:
+ m_decompress = getdecompressor("PluckerDecompress4");
+ break;
+ }
+ if (m_decompress == NULL) return -1;
+ m_blocksize = 1024*(m_blocksize & 0xffffff);
+ }
+ else
+ {
+ m_blocksize = 4096;
+ m_decompress = UnZip;
+ }
+ qDebug("Blocksize %u", m_blocksize);
+ currentpage.init(fin, m_blocksize, m_decompress);
+ qDebug("Its a REB!!!!");
+ fseek(fin, 0x18, SEEK_SET);
+ fread(&toc, 1, sizeof(toc), fin);
+ qDebug("Expect this to be 128 or 20:%x", toc);
+ fread(&type, 1, sizeof(type), fin);
+ qDebug("File length:%u", type);
+ fseek(fin, toc, SEEK_SET);
+ fread(&nopages, 1, sizeof(nopages), fin);
+ m_indexpages = new UInt32[nopages];
+ m_pagedetails = new Page_detail[nopages];
+ qDebug("There are %u pages", nopages);
+ UInt32 loc = 0;
+ UInt32 homeguess = nopages-1;
+ QString homeurl;
+ for (int i = 0; i < nopages; ++i)
+ {
+ char name[32];
+ UInt32 len, pos, flags;
+ fread(name, 1, 32, fin);
+ fread(&len, 1, 4, fin);
+ fread(&pos, 1, 4, fin);
+ fread(&flags, 1, 4, fin);
+ //qDebug("Page %u (%s) is %u bytes at %u (%u) of type %u", i, name, len, pos, loc, flags);
+ m_index[name] = i;
+ m_pagedetails[i] = Page_detail(loc, len, flags);
+
+ if (QString(name).find(".htm", 0, false) >= 0)
+ {
+ if (homeguess > i) homeguess = i;
+ if ((flags & 8) != 0)
+ {
+ UInt32 lastpos = ftell(fin);
+ loc += pagelength(i);
+ fseek(fin, lastpos, SEEK_SET);
+ }
+ else
+ {
+ loc += len;
+ }
+ }
+ if ((flags & 2) != 0)
+ {
+ UInt32 lastpos = ftell(fin);
+ RBPage* idx = new RBPage();
+ idx->init(fin, m_blocksize, m_decompress);
+ idx->startpage(page2pos(i), i, ((flags & 8) != 0), len);
+ int c = 0;
+ while (c != EOF)
+ {
+ QString s("");
+ while (1)
+ {
+ c = idx->getch(this);
+ if (c == 10 || c == EOF) break;
+ s += c;
+ }
+ if (s.left(5) == "BODY=")
+ {
+ homeurl = s.right(s.length()-5);
+ qDebug("Home:%s", (const char*)homeurl);
+ }
+ else
+ {
+ qDebug("Info:%s", (const char*)s);
+ }
+ }
+ delete idx;
+ fseek(fin, lastpos, SEEK_SET);
+ }
+ }
+ text_length = loc;
+ qDebug("Looking for homepage");
+ if (homeurl.isEmpty())
+ {
+ m_homepage = homeguess;
+ }
+ else
+ {
+ QMap<QString, UInt32>::Iterator iter = m_index.find(homeurl);
+ if (iter != m_index.end())
+ {
+ m_homepage = iter.data();
+ }
+ else
+ {
+ m_homepage = homeguess;
+ }
+ }
+ m_homepos = m_pagedetails[m_homepage].pagestart;
+ qDebug("Finding indices");
+ for (QMap<QString, UInt32>::Iterator iter = m_index.begin(); iter != m_index.end(); ++iter)
+ {
+ QString href = iter.key();
+ if (href.find(".htm", 0, false) >= 0)
+ {
+ QString hind = href.left(href.find(".htm", 0, false))+".hidx";
+ //qDebug("Index is %s", (const char*)hind);
+ QMap<QString, UInt32>::Iterator iter2 = m_index.find(hind);
+ if (iter2 != m_index.end())
+ {
+ m_indexpages[iter.data()] = iter2.data();
+ }
+ }
+ }
+ qDebug("Going home");
+ home();
+ return 0;
+ }
+ else
+ {
+ char * tmp = (char*)(&type);
+ for (int i = 0; i < 4; ++i) qDebug("%d:%c", i, tmp[i]);
+ return -1;
+ }
+}
+
+UInt32 CReb::page2pos(UInt32 page)
+{
+ fseek(fin, toc+40+44*page, SEEK_SET);
+ UInt32 pos;
+ fread(&pos, 1, 4, fin);
+ return pos;
+}
+
+UInt32 CReb::pagelength(UInt32 pagenum)
+{
+ fseek(fin, toc+40+44*pagenum, SEEK_SET);
+ UInt32 pos;
+ fread(&pos, 1, 4, fin);
+ fseek(fin, pos+4, SEEK_SET);
+ UInt32 len;
+ fread(&len, 1, sizeof(len), fin);
+ return len;
+}
+
+void CReb::readindex(UInt32 cp)
+{
+ if (joins != NULL)
+ {
+ delete [] joins;
+ joins = NULL;
+ }
+ if (tags != NULL)
+ {
+ delete [] tags;
+ tags = NULL;
+ }
+ if (paras != NULL)
+ {
+ delete [] paras;
+ paras = NULL;
+ }
+ noparas = 0;
+ nojoins = 0;
+ names.clear();
+
+ UInt32 rspage = m_indexpages[cp];
+ if (rspage != 0)
+ {
+ Page_detail rs = m_pagedetails[rspage];
+ int count = 0;
+ RBPage* idx = new RBPage();
+ idx->init(fin, m_blocksize, m_decompress);
+ idx->startpage(page2pos(rspage), rspage, ((rs.flags & 8) != 0), rs.len);
+ int c = 0;
+ int phase = 0;
+ int i;
+ if (m_binary)
+ {
+ count = idx->getuint(this);
+ qDebug("tag count:%d", count);
+ tags = new QString[count];
+ for (int i = 0; i < count; ++i)
+ {
+ QString s;
+ while (1)
+ {
+ c = idx->getch(this);
+ if (c == 0 || c == EOF) break;
+ s += c;
+ }
+ unsigned short val = idx->getuint(this);
+ if (val != 0xffff)
+ {
+ tags[i] = tags[val]+s;
+ }
+ else
+ {
+ tags[i] = s;
+ }
+ //qDebug("tags[%d](%d) = %s", i, val, (const char*)tags[i]);
+ }
+ noparas = idx->getint(this);
+ qDebug("Para count %d", noparas);
+ paras = new ParaRef[noparas];
+ for (int i = 0; i < noparas; ++i)
+ {
+ paras[i] = ParaRef(idx->getint(this), idx->getuint(this));
+ }
+ count = idx->getint(this);
+ qDebug("Name count %d", count);
+ for (int i = 0; i < count; ++i)
+ {
+ QString s;
+ while (1)
+ {
+ c = idx->getch(this);
+ if (c == 0 || c == EOF) break;
+ s += c;
+ }
+ int val = idx->getint(this);
+ names[s.mid(1,s.length()-2)] = val;
+ qDebug("names[%s] = %d", (const char*)s, val);
+ }
+ count = idx->getint(this);
+ qDebug("Join count %d", count);
+ if (count > 0)
+ {
+ nojoins = count+2;
+ joins = new UInt32[count+2];
+ joins[0] = 0;
+ joins[count+1] = currentpage.length();
+ for (int i = 1; i < count+1; ++i)
+ {
+ joins[i] = idx->getint(this);
+ }
+ }
+ }
+ else
+ {
+ while (c != EOF)
+ {
+ QString s("");
+ while (1)
+ {
+ c = idx->getch(this);
+ if (c == 10 || c == EOF) break;
+ s += c;
+ }
+ //qDebug("%s", (const char*)s);
+ if (count > 0)
+ {
+ --count;
+ int sp = s.findRev(' ');
+ QString l = s.left(sp);
+ int val = s.right(s.length()-sp).toInt();
+ switch (phase)
+ {
+ case 4:
+ //qDebug("Join %d is at offset %d", i, val);
+ joins[i++] = val;
+ break;
+ case 3:
+ //qDebug("Name %s is at offset %d", (const char*)l.mid(1,l.length()-2), val+m_pagedetails[cp].pagestart);
+ names[l.mid(1,l.length()-2)] = val;
+ break;
+ case 1:
+ //qDebug("%s:%d [%d]", (const char*)l, val, i);
+ if (val >= 0)
+ {
+ tags[i++] = tags[val]+l;
+ }
+ else
+ {
+ tags[i++] = l;
+ }
+ //qDebug("TAG:%s", (const char*)tags[i-1]);
+ break;
+ case 2:
+ paras[i++] = ParaRef(QString(l).toInt(), val);
+ //qDebug("Para:%u - %u (%s)", QString(l).toInt(), val, (const char*)s);
+ break;
+ default:
+ qDebug("%s:%d", (const char*)l, val);
+ break;
+ }
+ }
+ else
+ {
+ QString key = "[tags ";
+ if (s.left(key.length()) == key)
+ {
+ phase = 1;
+ i = 0;
+ count = s.mid(key.length(),s.length()-key.length()-1).toInt();
+ qDebug("%s:%s:%d", (const char*)key, (const char*)s, count);
+ tags = new QString[count];
+ }
+ key = "[paragraphs ";
+ if (s.left(key.length()) == key)
+ {
+ phase = 2;
+ i = 0;
+ count = s.mid(key.length(),s.length()-key.length()-1).toInt();
+ qDebug("%s:%s:%d", (const char*)key, (const char*)s, count);
+ paras = new ParaRef[count];
+ noparas = count;
+ }
+ key = "[names ";
+ if (s.left(key.length()) == key)
+ {
+ phase = 3;
+ count = s.mid(key.length(),s.length()-key.length()-1).toInt();
+ qDebug("%s:%s:%d", (const char*)key, (const char*)s, count);
+ }
+ key = "[joins ";
+ if (s.left(key.length()) == key)
+ {
+ phase = 4;
+ count = s.mid(key.length(),s.length()-key.length()-1).toInt();
+ qDebug("%s:%s:%d", (const char*)key, (const char*)s, count);
+ nojoins = count+2;
+ i = 1;
+ joins = new UInt32[count+2];
+ joins[0] = 0;
+ joins[count+1] = currentpage.length();
+ qDebug("%s:%s:%d", (const char*)key, (const char*)s, count);
+ }
+ qDebug("ZC:%s", (const char*)s);
+ }
+ }
+ }
+ // for (int i = 0; i < nojoins; ++i) qDebug("JOINS:%u %u", i, joins[i]);
+ delete idx;
+ }
+}
+
+bool CReb::findanchor(const QString& _info)
+{
+ QMap<QString, int>::Iterator iter = names.find(_info);
+ if (iter != names.end())
+ {
+ locate(iter.data()+m_pagedetails[currentpage.pageno()].pagestart);
+ return true;
+ }
+ return false;
+}
+
+#ifdef USEQPE
+void CReb::suspend()
+{
+ CExpander::suspend(fin);
+}
+void CReb::unsuspend()
+{
+ CExpander::unsuspend(fin);
+}
+#endif
+
+#ifndef __STATIC
+extern "C"
+{
+ CExpander* newcodec() { return new CReb; }
+}
+#endif
+
+void CReb::startpage(UInt32 pgno)
+{
+ Page_detail rs = m_pagedetails[pgno];
+ unsuspend();
+ readindex(pgno);
+ currentpage.startpage(page2pos(pgno), pgno, ((rs.flags & 8) != 0), rs.len);
+}
+
+void CReb::startpage(UInt32 _cp, bool _isCompressed, UInt32 _len)
+{
+ unsuspend();
+ readindex(_cp);
+ currentpage.startpage(page2pos(_cp), _cp, _isCompressed, _len);
+}
+
+void RBPage::initpage(UInt32 pos, size_t _cp, bool _isCompressed, UInt32 _len)
+{
+ filepos = pos;
+ m_pageno = _cp;
+ m_Compressed = _isCompressed;
+ m_pagelen = _len;
+ currentchunk = 0;
+ pageoffset = 0;
+
+ if (chunklist != NULL) delete [] chunklist;
+
+ fseek(fin, filepos, SEEK_SET);
+ if (m_Compressed)
+ {
+ fread(&nochunks, 1, sizeof(nochunks), fin);
+ fread(&m_pagelen, 1, sizeof(m_pagelen), fin);
+ chunklist = new UInt32[nochunks];
+ fread(chunklist, nochunks, 4, fin);
+ }
+ else
+ {
+ chunklist = NULL;
+ nochunks = (_len+m_blocksize-1)/m_blocksize;
+ }
+ m_startoff = 0;
+ m_endoff = m_pagelen;
+ chunkpos = ftell(fin);
+ qDebug("Compressed:%u Expanded:%u", _len, m_pagelen);
+}
+
+void RBPage::startpage(UInt32 pos, UInt32 _cp, bool _isCompressed, UInt32 _len)
+{
+ initpage(pos, _cp, _isCompressed, _len);
+ readchunk();
+}
+
+int CReb::getch()
+{
+ if (tagoffset < tagstring.length())
+ return tagstring[tagoffset++].unicode();
+ else
+ return currentpage.getch(this);
+}
+
+int RBPage::getch(CReb* parent)
+{
+ if (chunkoffset >= chunklen)
+ {
+ if (++currentchunk >= nochunks)
+ {
+ --currentchunk;
+ return EOF;
+ }
+ pageoffset += chunklen;
+ parent->unsuspend();
+ readchunk();
+ }
+ if (offset() == m_endoff) return EOF;
+ return chunk[chunkoffset++];
+}
+
+unsigned short int RBPage::getuint(CReb* parent)
+{
+ unsigned short int ret = 0;
+ char *buffer = (char*)(&ret);
+ for (int i = 0; i < 2; ++i)
+ {
+ int ch = getch(parent);
+ if (ch == EOF) return 0;
+ buffer[i] = ch;
+ }
+ return ret;
+}
+
+int RBPage::getint(CReb* parent)
+{
+ int ret = 0;
+ char *buffer = (char*)(&ret);
+ for (int i = 0; i < 4; ++i)
+ {
+ int ch = getch(parent);
+ if (ch == EOF) return 0;
+ buffer[i] = ch;
+ }
+ return ret;
+}
+
+void RBPage::readchunk()
+{
+ if (m_Compressed)
+ {
+ chunkoffset = 0;
+ fseek(fin, chunkpos, SEEK_SET);
+ UInt8* inbuf = new UInt8[chunklist[currentchunk]];
+ fread(inbuf, 1, chunklist[currentchunk], fin);
+ chunklen = (*m_decompress)(inbuf, chunklist[currentchunk], chunk, m_blocksize);
+ delete [] inbuf;
+ chunkpos = ftell(fin);
+ }
+ else
+ {
+ chunkoffset = 0;
+ chunklen = m_blocksize;
+ if (m_blocksize*(currentchunk+1) > m_pagelen)
+ {
+ chunklen = m_pagelen - currentchunk*m_blocksize;
+ }
+ fseek(fin, chunkpos, SEEK_SET);
+ chunklen = fread(chunk, 1, chunklen, fin);
+ chunkpos = ftell(fin);
+ }
+}
+
+void RBPage::setoffset(UInt32 pos, size_t _cp, bool _isCompressed, UInt32 _len, UInt32 _offset)
+{
+ if (m_pageno != _cp)
+ {
+ initpage(pos, _cp, _isCompressed, _len);
+ }
+ else
+ {
+ if (m_Compressed)
+ {
+ chunkpos = filepos + sizeof(nochunks) + sizeof(m_pagelen) + 4*nochunks;
+ }
+ else
+ {
+ chunkpos = filepos;
+ }
+ }
+
+ currentchunk = _offset/m_blocksize;
+ pageoffset = m_blocksize*currentchunk;
+ if (m_Compressed)
+ {
+ for (int i = 0; i < currentchunk; ++i)
+ {
+ chunkpos += chunklist[i];
+ }
+ }
+ else
+ {
+ chunkpos += pageoffset;
+ }
+ readchunk();
+ chunkoffset = _offset - pageoffset;
+}
+
+void CReb::start2endSection()
+{
+ if (m_pagedetails != NULL)
+ {
+ if (nojoins > 0)
+ {
+ //UInt32 jl = binarychop<UInt32>(joins, nojoins, currentpage.offset());
+
+ UInt32 jl = 0,jh = nojoins-1,jm = (jl+jh)/2;
+ while (jh > jl+1)
+ {
+ if (joins[jm] > currentpage.offset())
+ {
+ jh = jm;
+ }
+ else
+ {
+ jl = jm;
+ }
+ jm = (jl+jh)/2;
+ }
+
+ currentpage.m_startoff = joins[jl];
+ currentpage.m_endoff = joins[jl+1]-1;
+ //currentpage.m_endoff = joins[jh]-1;
+ }
+ m_currentstart = m_pagedetails[currentpage.pageno()].pagestart+currentpage.m_startoff;
+ m_currentend = m_pagedetails[currentpage.pageno()].pagestart+currentpage.m_endoff;
+ }
+ else
+ {
+ m_currentstart = m_currentend = 0;
+ }
+ qDebug("s2e:[%u, %u, %u]", m_currentstart, locate(), m_currentend);
+}
diff --git a/noncore/apps/opie-reader/Reb.h b/noncore/apps/opie-reader/Reb.h
new file mode 100644
index 0000000..f268eb0
--- a/dev/null
+++ b/noncore/apps/opie-reader/Reb.h
@@ -0,0 +1,157 @@
+#ifndef __REB_H
+#define __REB_H
+#include <stdio.h>
+#include <zlib.h>
+#include <sys/stat.h>
+#ifdef USEQPE
+#include <qpe/global.h>
+#endif
+#include <qmap.h>
+
+#include "CExpander.h"
+#include <zlib.h>
+
+#ifdef _WINDOWS
+#include <winsock.h>
+#endif
+
+#include "mytypes.h"
+
+/*
+struct Reb_Segment
+{
+ UInt32 len, page, flags;
+ Reb_Segment(UInt32 _len = 0, UInt32 _page = 0, UInt32 _flags = 0)
+ :
+ len(_len), page(_page), flags(_flags)
+ {}
+};
+*/
+
+class CReb;
+
+class RBPage
+{
+ UInt32 filepos;
+ UInt32 pageoffset;
+ UInt32 nochunks, currentchunk, chunkpos, chunklen, chunkoffset;
+ UInt32 m_pagelen, m_blocksize;
+ bool m_Compressed;
+ void readchunk();
+ UInt32* chunklist;
+ UInt8* chunk;
+ FILE* fin;
+ UInt32 m_pageno;
+ void initpage(UInt32 pos, size_t _cp, bool _isCompressed, UInt32 _len);
+ size_t (*m_decompress)(UInt8*, size_t, UInt8*, size_t);
+ public:
+ RBPage() : pageoffset(0), nochunks(0), currentchunk(0), chunkpos(0), chunkoffset(0), m_pagelen(0), m_Compressed(false), chunklist(NULL), chunk(NULL) {}
+ ~RBPage()
+ {
+ if (chunk != NULL) delete [] chunk;
+ if (chunklist != NULL) delete [] chunklist;
+ }
+ int getch(CReb*);
+ unsigned short int getuint(CReb*);
+ int getint(CReb*);
+ void startpage(UInt32, UInt32, bool, UInt32);
+ UInt32 pageno() { return m_pageno; }
+ UInt32 offset() { return pageoffset+chunkoffset; }
+ void setoffset(UInt32, size_t, bool, UInt32, UInt32);
+ void init(FILE* _f, UInt32 _bs, size_t (*_decompress)(UInt8*, size_t, UInt8*, size_t))
+ {
+ fin = _f;
+ m_blocksize = _bs;
+ chunk = new UInt8[m_blocksize];
+ m_decompress = _decompress;
+ }
+ UInt32 length() { return m_pagelen; }
+ UInt32 m_startoff, m_endoff;
+};
+
+struct Page_detail
+{
+ UInt32 pagestart, len, flags;
+ Page_detail(UInt32 _ps = 0, UInt32 _l = 0, UInt32 _f = 0)
+ :
+ pagestart(_ps), len(_l), flags(_f)
+ {
+ }
+};
+
+struct ParaRef
+{
+ int pos, tag;
+ ParaRef(int _pos = 0, int _tag = 0) : pos(_pos), tag(_tag)
+ {
+ //qDebug("New PARAREF:%d, %d", pos, tag);
+ }
+};
+
+class CReb : public CExpander
+{
+ //friend class RBPage;
+ size_t (*m_decompress)(UInt8*, size_t, UInt8*, size_t);
+ RBPage currentpage;
+ UInt32 nopages, m_homepage, m_blocksize;
+
+ QMap<QString, UInt32> m_index;
+
+ size_t file_length, text_length;
+ UInt32 toc;
+ FILE* fin;
+ void home();
+ void startpage(UInt32);
+ void startpage(UInt32, bool, UInt32);
+ void readchunk();
+ QString tagstring;
+ UInt32 tagoffset;
+ UInt32 pagelength(UInt32);
+ QImage* getPicture(const QString& ref);
+ UInt32 page2pos(UInt32);
+ //UInt32 m_pagelen;
+ UInt32* m_indexpages;
+ Page_detail* m_pagedetails;
+ // void UnZip(size_t bsize);
+ QMap<QString, int> names;
+ QString* tags;
+ ParaRef* paras;
+ UInt32* joins;
+ UInt32 nojoins;
+ UInt32 noparas;
+ bool m_binary;
+ void readindex(UInt32);
+public:
+ bool findanchor(const QString& _info);
+ QString about() { return QString("REB codec (c) Tim Wentford"); }
+ bool getFile(const QString& href, const QString& nm);
+ void start2endSection();
+ void sizes(unsigned long& _file, unsigned long& _text)
+ {
+ _file = file_length;
+ _text = text_length;
+ }
+ bool hasrandomaccess() { return true; }
+ virtual ~CReb();
+ CReb();
+ int OpenFile(const char *src);
+ int getch();
+ unsigned int locate();
+ void locate(unsigned int n);
+ CList<Bkmk>* getbkmklist();
+ MarkupType PreferredMarkup()
+ {
+ return cCHM;
+ }
+#ifdef USEQPE
+ void suspend();
+ void unsuspend();
+#else
+ void suspend() {}
+ void unsuspend() {}
+#endif
+};
+
+#endif
+
+
diff --git a/noncore/apps/opie-reader/RebCodec/.cvsignore b/noncore/apps/opie-reader/RebCodec/.cvsignore
new file mode 100644
index 0000000..1810ee0
--- a/dev/null
+++ b/noncore/apps/opie-reader/RebCodec/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+config.in
+moc_*
+.moc
+.obj
diff --git a/noncore/apps/opie-reader/RebCodec/RebCodec.pro b/noncore/apps/opie-reader/RebCodec/RebCodec.pro
new file mode 100644
index 0000000..2d6410a
--- a/dev/null
+++ b/noncore/apps/opie-reader/RebCodec/RebCodec.pro
@@ -0,0 +1,21 @@
+DEFINES += OPIE USEQPE
+VPATH = ..
+TEMPLATE = lib
+CONFIG = qt warn_on release dll
+HEADERS = Reb.h
+
+SOURCES = Reb.cpp \
+ decompress.cpp
+
+
+INTERFACES =
+DESTDIR = $(OPIEDIR)/plugins/reader/codecs
+TARGET = Reb
+LIBS += -L$(OPIEDIR)/lib -lreader_codec
+
+
+INCLUDEPATH += $(OPIEDIR)/include
+DEPENDPATH += $(OPIEDIR)/include
+
+include( $(OPIEDIR)/include.pro )
+
diff --git a/noncore/apps/opie-reader/StyleConsts.h b/noncore/apps/opie-reader/StyleConsts.h
index 8e23c6f..4b7ff4b 100644
--- a/noncore/apps/opie-reader/StyleConsts.h
+++ b/noncore/apps/opie-reader/StyleConsts.h
@@ -33,24 +33,26 @@ struct pmstore
~pmstore();
};
enum EalignmentType
{
m_AlignLeft,
m_AlignRight,
m_AlignCentre,
- m_AlignJustify
+ m_AlignJustify,
+ m_AlignNone
};
class CBasicStyle
{
friend class CStyle;
bool m_bold,
m_italic;
+ unsigned long m_table;
int m_fontsize;
EalignmentType m_align;
unsigned char red, green, blue;
unsigned char bred, bgreen, bblue;
unsigned char pred, pgreen, pblue;
unsigned long data;
unsigned long offset;
bool isLink;
@@ -59,16 +61,17 @@ class CBasicStyle
bool m_strikethru;
bool m_monospaced;
unsigned char m_leftmargin, m_rightmargin;
signed char m_extraspace;
signed char m_voffset;
CBasicStyle()
{
unset();
+ m_table = 0xffffffff;
}
bool operator!=(const CBasicStyle& rhs)
{
return (memcmp(this, &rhs, sizeof(CBasicStyle)) != 0);
}
void unset()
{
m_bold = false;
@@ -141,16 +144,19 @@ class CStyle
sty.bblue = b;
}
CStyle() : graphic(NULL) {}
~CStyle();
// CStyle(CStyle&);
CStyle(const CStyle&);
CStyle& operator=(const CStyle&);
void unset();
+ bool isTable() const { return (sty.m_table != 0xffffffff); }
+ void setTable(unsigned long _b) { sty.m_table = _b; }
+ unsigned long getTable() { return sty.m_table; }
bool isPicture() const { return (graphic != NULL); }
bool canScale() const { return graphic->m_isScaleable; }
void clearPicture();
void setPicture(bool canScale, QImage* _g, bool il=false, unsigned long tgt=0);
QImage* getPicture()
{
QImage* pm = ((graphic != NULL) ? graphic->graphic->graphic : NULL);
return pm;
@@ -182,16 +188,20 @@ class CStyle
void setCentreJustify()
{
sty.m_align = m_AlignCentre;
}
void setFullJustify()
{
sty.m_align = m_AlignJustify;
}
+ void setNoJustify()
+ {
+ sty.m_align = m_AlignNone;
+ }
StyleType getJustify()
{
return sty.m_align;
}
void setFontSize(int _fs)
{
sty.m_fontsize = _fs;
diff --git a/noncore/apps/opie-reader/SubAlloc.h b/noncore/apps/opie-reader/SubAlloc.h
new file mode 100644
index 0000000..ded2b73
--- a/dev/null
+++ b/noncore/apps/opie-reader/SubAlloc.h
@@ -0,0 +1,201 @@
+/****************************************************************************
+ * This file is part of PPMd project *
+ * Written and distributed to public domain by Dmitry Shkarin 1997, *
+ * 1999-2001 *
+ * Contents: memory allocation routines *
+ ****************************************************************************/
+
+enum { UNIT_SIZE=12, N1=4, N2=4, N3=4, N4=(128+3-1*N1-2*N2-3*N3)/4,
+ N_INDEXES=N1+N2+N3+N4 };
+
+#pragma pack(1)
+struct BLK_NODE {
+ DWORD Stamp;
+ BLK_NODE* next;
+ BOOL avail() const { return (next != NULL); }
+ void link(BLK_NODE* p) { p->next=next; next=p; }
+ void unlink() { next=next->next; }
+ void* remove() {
+ BLK_NODE* p=next; unlink();
+ Stamp--; return p;
+ }
+ inline void insert(void* pv,int NU);
+} BList[N_INDEXES];
+struct MEM_BLK: public BLK_NODE { DWORD NU; } _PACK_ATTR;
+#pragma pack()
+
+static BYTE Indx2Units[N_INDEXES], Units2Indx[128]; // constants
+static DWORD GlueCount, SubAllocatorSize=0;
+static BYTE* HeapStart, * pText, * UnitsStart, * LoUnit, * HiUnit;
+
+inline void PrefetchData(void* Addr)
+{
+#if defined(_USE_PREFETCHING)
+ BYTE PrefetchByte = *(volatile BYTE*) Addr;
+#endif /* defined(_USE_PREFETCHING) */
+}
+inline void BLK_NODE::insert(void* pv,int NU) {
+ MEM_BLK* p=(MEM_BLK*) pv; link(p);
+ p->Stamp=~0UL; p->NU=NU;
+ Stamp++;
+}
+inline UINT U2B(UINT NU) { return 8*NU+4*NU; }
+inline void SplitBlock(void* pv,UINT OldIndx,UINT NewIndx)
+{
+ UINT i, k, UDiff=Indx2Units[OldIndx]-Indx2Units[NewIndx];
+ BYTE* p=((BYTE*) pv)+U2B(Indx2Units[NewIndx]);
+ if (Indx2Units[i=Units2Indx[UDiff-1]] != UDiff) {
+ k=Indx2Units[--i]; BList[i].insert(p,k);
+ p += U2B(k); UDiff -= k;
+ }
+ BList[Units2Indx[UDiff-1]].insert(p,UDiff);
+}
+DWORD _STDCALL GetUsedMemory()
+{
+ DWORD i, RetVal=SubAllocatorSize-(HiUnit-LoUnit)-(UnitsStart-pText);
+ for (i=0;i < N_INDEXES;i++)
+ RetVal -= UNIT_SIZE*Indx2Units[i]*BList[i].Stamp;
+ return RetVal;
+}
+void _STDCALL StopSubAllocator() {
+ if ( SubAllocatorSize ) {
+ SubAllocatorSize=0; delete[] HeapStart;
+ }
+}
+BOOL _STDCALL StartSubAllocator(UINT SASize)
+{
+ DWORD t=SASize << 19U;
+ if (SubAllocatorSize == t) return TRUE;
+ StopSubAllocator();
+ if ((HeapStart=new BYTE[t]) == NULL) return FALSE;
+ SubAllocatorSize=t; return TRUE;
+}
+static inline void InitSubAllocator()
+{
+ memset(BList,0,sizeof(BList));
+ HiUnit=(pText=HeapStart)+SubAllocatorSize;
+ UINT Diff=UNIT_SIZE*(SubAllocatorSize/8/UNIT_SIZE*7);
+ LoUnit=UnitsStart=HiUnit-Diff; GlueCount=0;
+}
+static void GlueFreeBlocks()
+{
+ UINT i, k, sz;
+ MEM_BLK s0, * p, * p0, * p1;
+ if (LoUnit != HiUnit) *LoUnit=0;
+ for (i=0, (p0=&s0)->next=NULL;i < N_INDEXES;i++)
+ while ( BList[i].avail() ) {
+ p=(MEM_BLK*) BList[i].remove();
+ if ( !p->NU ) continue;
+ while ((p1=p+p->NU)->Stamp == ~0UL) {
+ p->NU += p1->NU; p1->NU=0;
+ }
+ p0->link(p); p0=p;
+ }
+ while ( s0.avail() ) {
+ p=(MEM_BLK*) s0.remove(); sz=p->NU;
+ if ( !sz ) continue;
+ for ( ;sz > 128;sz -= 128, p += 128)
+ BList[N_INDEXES-1].insert(p,128);
+ if (Indx2Units[i=Units2Indx[sz-1]] != sz) {
+ k=sz-Indx2Units[--i]; BList[k-1].insert(p+(sz-k),k);
+ }
+ BList[i].insert(p,Indx2Units[i]);
+ }
+ GlueCount=1 << 13;
+}
+static void* _STDCALL AllocUnitsRare(UINT indx)
+{
+ UINT i=indx;
+ if ( !GlueCount ) {
+ GlueFreeBlocks();
+ if ( BList[i].avail() ) return BList[i].remove();
+ }
+ do {
+ if (++i == N_INDEXES) {
+ GlueCount--; i=U2B(Indx2Units[indx]);
+ return (UnitsStart-pText > i)?(UnitsStart -= i):(NULL);
+ }
+ } while ( !BList[i].avail() );
+ void* RetVal=BList[i].remove(); SplitBlock(RetVal,i,indx);
+ return RetVal;
+}
+inline void* AllocUnits(UINT NU)
+{
+ UINT indx=Units2Indx[NU-1];
+ if ( BList[indx].avail() ) return BList[indx].remove();
+ void* RetVal=LoUnit; LoUnit += U2B(Indx2Units[indx]);
+ if (LoUnit <= HiUnit) return RetVal;
+ LoUnit -= U2B(Indx2Units[indx]); return AllocUnitsRare(indx);
+}
+inline void* AllocContext()
+{
+ if (HiUnit != LoUnit) return (HiUnit -= UNIT_SIZE);
+ else if ( BList->avail() ) return BList->remove();
+ else return AllocUnitsRare(0);
+}
+inline void UnitsCpy(void* Dest,void* Src,UINT NU)
+{
+ DWORD* p1=(DWORD*) Dest, * p2=(DWORD*) Src;
+ do {
+ p1[0]=p2[0]; p1[1]=p2[1];
+ p1[2]=p2[2];
+ p1 += 3; p2 += 3;
+ } while ( --NU );
+}
+inline void* ExpandUnits(void* OldPtr,UINT OldNU)
+{
+ UINT i0=Units2Indx[OldNU-1], i1=Units2Indx[OldNU-1+1];
+ if (i0 == i1) return OldPtr;
+ void* ptr=AllocUnits(OldNU+1);
+ if ( ptr ) {
+ UnitsCpy(ptr,OldPtr,OldNU); BList[i0].insert(OldPtr,OldNU);
+ }
+ return ptr;
+}
+inline void* ShrinkUnits(void* OldPtr,UINT OldNU,UINT NewNU)
+{
+ UINT i0=Units2Indx[OldNU-1], i1=Units2Indx[NewNU-1];
+ if (i0 == i1) return OldPtr;
+ if ( BList[i1].avail() ) {
+ void* ptr=BList[i1].remove(); UnitsCpy(ptr,OldPtr,NewNU);
+ BList[i0].insert(OldPtr,Indx2Units[i0]);
+ return ptr;
+ } else {
+ SplitBlock(OldPtr,i0,i1); return OldPtr;
+ }
+}
+inline void FreeUnits(void* ptr,UINT NU) {
+ UINT indx=Units2Indx[NU-1];
+ BList[indx].insert(ptr,Indx2Units[indx]);
+}
+inline void SpecialFreeUnit(void* ptr)
+{
+ if ((BYTE*) ptr != UnitsStart) BList->insert(ptr,1);
+ else { *(DWORD*) ptr=~0UL; UnitsStart += UNIT_SIZE; }
+}
+inline void* MoveUnitsUp(void* OldPtr,UINT NU)
+{
+ UINT indx=Units2Indx[NU-1];
+ if ((BYTE*) OldPtr > UnitsStart+16*1024 || (BLK_NODE*) OldPtr > BList[indx].next)
+ return OldPtr;
+ void* ptr=BList[indx].remove();
+ UnitsCpy(ptr,OldPtr,NU); NU=Indx2Units[indx];
+ if ((BYTE*) OldPtr != UnitsStart) BList[indx].insert(OldPtr,NU);
+ else UnitsStart += U2B(NU);
+ return ptr;
+}
+static inline void ExpandTextArea()
+{
+ BLK_NODE* p;
+ UINT Count[N_INDEXES]; memset(Count,0,sizeof(Count));
+ while ((p=(BLK_NODE*) UnitsStart)->Stamp == ~0UL) {
+ MEM_BLK* pm=(MEM_BLK*) p; UnitsStart=(BYTE*) (pm+pm->NU);
+ Count[Units2Indx[pm->NU-1]]++; pm->Stamp=0;
+ }
+ for (UINT i=0;i < N_INDEXES;i++)
+ for (p=BList+i;Count[i] != 0;p=p->next)
+ while ( !p->next->Stamp ) {
+ p->unlink(); BList[i].Stamp--;
+ if ( !--Count[i] ) break;
+ }
+}
diff --git a/noncore/apps/opie-reader/TableDialog.cpp b/noncore/apps/opie-reader/TableDialog.cpp
new file mode 100644
index 0000000..b67d534
--- a/dev/null
+++ b/noncore/apps/opie-reader/TableDialog.cpp
@@ -0,0 +1,17 @@
+#include "TableDialog.h"
+
+CTableDialog::CTableDialog(const QFont& f, const QString& tabtext, bool fs, QWidget* parent, const char* name) : QDialog(parent, name, true)
+{
+ setCaption("Table View");
+ QVBoxLayout *tmp = new QVBoxLayout(this);
+ QTextView* qtv = new QTextView(this);
+ qtv->setFont(f);
+ tmp->addWidget(qtv);
+ qtv->setText(tabtext);
+ if (fs) showMaximized();
+ else if (parent != NULL)
+ {
+ resize(parent->size());
+ move(parent->pos());
+ }
+}
diff --git a/noncore/apps/opie-reader/TableDialog.h b/noncore/apps/opie-reader/TableDialog.h
new file mode 100644
index 0000000..2257a81
--- a/dev/null
+++ b/noncore/apps/opie-reader/TableDialog.h
@@ -0,0 +1,34 @@
+#ifndef __TABLEDIALOG_H
+#define __TABLEDIALOG_H
+
+#include <qdialog.h>
+#include <qtextview.h>
+#include <qlayout.h>
+
+class CTableDialog : public QDialog
+{
+Q_OBJECT
+#ifndef USEQPE
+ void keyPressEvent(QKeyEvent* e)
+ {
+ switch (e->key())
+ {
+ case Key_Escape:
+ e->accept();
+ reject();
+ break;
+ case Key_Space:
+ case Key_Return:
+ e->accept();
+ accept();
+ break;
+ default:
+ QWidget::keyPressEvent(e);
+ }
+ }
+#endif
+ public:
+ CTableDialog(const QFont& f, const QString& tabtext, bool fs = true, QWidget* parent = 0, const char* name = 0);
+ ~CTableDialog() {}
+};
+#endif // CPREFS_H
diff --git a/noncore/apps/opie-reader/ToolbarPrefs.h b/noncore/apps/opie-reader/ToolbarPrefs.h
index 0bdae6b..9df8940 100644
--- a/noncore/apps/opie-reader/ToolbarPrefs.h
+++ b/noncore/apps/opie-reader/ToolbarPrefs.h
@@ -3,33 +3,32 @@
**
** Created: Tue Feb 11 23:53:32 2003
** by: The User Interface Compiler (uic)
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
#ifndef CTOOLBARPREFS_H
#define CTOOLBARPREFS_H
+
#include <qvariant.h>
#include <qwidget.h>
#include <qtabdialog.h>
#include <qtabwidget.h>
#include <qspinbox.h>
#include <qcheckbox.h>
#include <qcombobox.h>
#include <qlineedit.h>
#ifdef USEQPE
#include <qpe/menubutton.h>
#include <qpe/config.h>
#else
#include "preferences.h"
#endif
-//#ifdef OPIE
#define USECOMBO
-//#endif
class QVBoxLayout;
class QHBoxLayout;
class QGridLayout;
//class QCheckBox;
class QLabel;
//class QSpinBox;
/*
diff --git a/noncore/apps/opie-reader/ZText.h b/noncore/apps/opie-reader/ZText.h
index 199c7da..40b0f0a 100644
--- a/noncore/apps/opie-reader/ZText.h
+++ b/noncore/apps/opie-reader/ZText.h
@@ -1,13 +1,17 @@
#ifndef __Text_h
#define __Text_h
#include <stdio.h>
#include <zlib.h>
#include <sys/stat.h>
+#ifdef USEQPE
+#include <qpe/global.h>
+#endif
+
#include "CExpander.h"
class Text: public CExpander {
gzFile file;
unsigned long fsize;
public:
void suspend()
{
@@ -26,21 +30,26 @@ public:
{
#ifdef USEQPE
if (bSuspended)
{
bSuspended = false;
if (sustime != ((time_t)-1))
{
int delay = time(NULL) - sustime;
- if (delay < 10) sleep(10-delay);
+ if (delay < 10)
+ {
+ Global::statusMessage("Stalling");
+ sleep(10-delay);
+ }
}
file = gzopen(fname, "rb");
for (int i = 0; file == NULL && i < 5; i++)
{
+ Global::statusMessage("Stalling");
sleep(5);
file = gzopen(fname, "rb");
}
if (file == NULL)
{
QMessageBox::warning(NULL, PROGNAME, "Couldn't reopen file");
exit(0);
}
diff --git a/noncore/apps/opie-reader/arith.h b/noncore/apps/opie-reader/arith.h
index 19ca646..59b2ea9 100644
--- a/noncore/apps/opie-reader/arith.h
+++ b/noncore/apps/opie-reader/arith.h
@@ -4,27 +4,25 @@
#ifndef ARITH_H
#define ARITH_H
#include "utypes.h"
#include <stdio.h>
+class ppm_expander;
+
class PPM_ReadBuf
{
FILE *my_file_in;
+ ppm_expander* parent;
public:
- PPM_ReadBuf(FILE* f) : my_file_in(f) {}
- UINT readbuf(UCHAR *buf,UINT len)
- {
- UINT len1;
- len1=fread(buf,1,len,my_file_in);
- return len1;
- }
+ PPM_ReadBuf(FILE* f, ppm_expander* _parent) : my_file_in(f), parent(_parent) {}
+ UINT readbuf(UCHAR *buf,UINT len);
};
class ArithClass
{
UCHAR *ainbuf;
UCHAR *apinbuf,*aendinbuf;
UINT ainbufsize;
diff --git a/noncore/apps/opie-reader/arrierego.cpp b/noncore/apps/opie-reader/arrierego.cpp
new file mode 100644
index 0000000..be2a3fa
--- a/dev/null
+++ b/noncore/apps/opie-reader/arrierego.cpp
@@ -0,0 +1,188 @@
+#ifdef USENEF
+#include <qimage.h>
+#include "arrierego.h"
+
+struct CArriere_dataRecord
+{
+ UInt16 uid;
+ UInt16 nParagraphs;
+ UInt32 size;
+ UInt8 type;
+ UInt8 reserved;
+};
+
+int CArriere::HeaderSize()
+{
+ return 10;
+}
+
+void CArriere::GetHeader(UInt16& uid, UInt16& nParagraphs, UInt32& size, UInt8& type, UInt8& reserved)
+{
+ CArriere_dataRecord thishdr;
+ unsuspend();
+ fread(&thishdr, 1, HeaderSize(), fin);
+ uid = ntohs(thishdr.uid);
+ nParagraphs = ntohs(thishdr.nParagraphs);
+ size = ntohl(thishdr.size);
+ type = thishdr.type;
+ reserved = thishdr.reserved;
+ // qDebug("UID:%u Paras:%u Size:%u Type:%u Reserved:%u", uid, nParagraphs, size, (unsigned int)type, (unsigned int)reserved);
+// for (int i = 0; i < sizeof(thishdr); i++)
+// printf("%d %x\n", i, (int)(((char *)(&thishdr))[i]));
+}
+
+bool CArriere::CorrectDecoder()
+{
+ char * type = (char*)(&(head.type));
+ for (int i = 0; i < 8; ++i) qDebug("%c", type[i]);
+ return (memcmp(&head.type, "ArriereG", 8) == 0);
+}
+
+int CArriere::bgetch()
+{
+ int ch = EOF;
+ if (bufferpos >= buffercontent)
+ {
+ if (bufferrec >= ntohs(head.recordList.numRecords) - 1)
+ {
+ return EOF;
+ }
+ if (isEndOfSection(bufferrec))
+ {
+ return EOF;
+ }
+ if (!expand(bufferrec+1))
+ {
+ return EOF;
+ }
+ mystyle.unset();
+ if (m_ParaOffsets[m_nextParaIndex] == 0)
+ {
+ while (m_ParaOffsets[m_nextParaIndex+1] == 0)
+ {
+ m_nextParaIndex++;
+ }
+ }
+ mystyle.setExtraSpace((m_ParaAttrs[m_nextParaIndex]&7)*2);
+ }
+ if (bufferpos == m_nextPara)
+ {
+ while (bufferpos == m_nextPara)
+ {
+ m_nextParaIndex++;
+ if (m_nextParaIndex == m_nParas)
+ {
+ m_nextPara = -1;
+ }
+ else
+ {
+ m_nextPara += m_ParaOffsets[m_nextParaIndex];
+ }
+ }
+ mystyle.unset();
+ mystyle.setExtraSpace((m_ParaAttrs[m_nextParaIndex]&7)*2);
+ if (m_lastBreak == locate())
+ {
+ currentpos++;
+ ch = expandedtextbuffer[bufferpos++];
+ }
+ else
+ {
+ ch = 10;
+ }
+ }
+ else
+ {
+ currentpos++;
+ ch = expandedtextbuffer[bufferpos++];
+ }
+ return ch;
+}
+
+tchar CArriere::getch(bool fast)
+{
+ mystyle.clearPicture();
+ return getch_base(fast);
+}
+
+/*
+void CArriere::setlink(QString& fn, const QString& wrd)
+{
+ fn = wrd;
+}
+*/
+
+QImage* CArriere::imagefromdata(UInt8* imgbuffer, UInt32 imgsize)
+{
+ QByteArray arr;
+ arr.assign((const char*)imgbuffer, imgsize);
+
+ QImage* qimage = new QImage(arr);
+
+ return qimage;
+}
+
+void CArriere::start2endSection()
+{
+ m_currentstart = NEFstartSection();
+ m_currentend = NEFendSection();
+}
+
+unsigned long CArriere::NEFstartSection()
+{
+//inefficient - Should calc start/end of section on entry to section?
+ UInt16 thishdr_uid, thishdr_nParagraphs;
+ UInt32 thishdr_size;
+ UInt8 thishdr_type, thishdr_reserved;
+ unsigned long textlength = currentpos-bufferpos;
+ for (UInt16 recptr = bufferrec-1; recptr >= 1; recptr--)
+ {
+ gotorecordnumber(recptr);
+ //qDebug("recptr:%u", recptr);
+ GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved);
+ if (thishdr_type < 2)
+ {
+ if ((thishdr_reserved && continuation_bit) == 0) break;
+ textlength -= thishdr_size;
+ //qDebug("Textlength:%u, reserved:%u, recptr:%u", textlength, thishdr_reserved, recptr);
+ }
+ }
+ return textlength;
+}
+
+unsigned long CArriere::NEFendSection()
+{
+//inefficient - Should calc start/end of section on entry to section?
+ unsigned long textlength = currentpos-bufferpos+buffercontent;
+ gotorecordnumber(bufferrec);
+ UInt16 thishdr_uid, thishdr_nParagraphs;
+ UInt32 thishdr_size;
+ UInt8 thishdr_type, thishdr_reserved;
+ GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved);
+ if ((thishdr_reserved && continuation_bit) != 0)
+ {
+ for (UInt16 recptr = bufferrec+1; recptr < ntohs(head.recordList.numRecords); recptr++)
+ {
+ gotorecordnumber(recptr);
+ UInt16 thishdr_uid, thishdr_nParagraphs;
+ UInt32 thishdr_size;
+ UInt8 thishdr_type, thishdr_reserved;
+ GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved);
+ // qDebug("recptr %u bufferrec %u type %u m_reserved %u", recptr, bufferrec, typ
+ if (thishdr_type < 2)
+ {
+ textlength += thishdr_size;
+ if ((thishdr_reserved && continuation_bit) == 0) break;
+ }
+ }
+ }
+ return textlength;
+}
+
+#ifndef __STATIC
+extern "C"
+{
+ CExpander* newcodec() { return new CArriere; }
+}
+#endif
+#endif
diff --git a/noncore/apps/opie-reader/arrierego.h b/noncore/apps/opie-reader/arrierego.h
new file mode 100644
index 0000000..5d6e2d0
--- a/dev/null
+++ b/noncore/apps/opie-reader/arrierego.h
@@ -0,0 +1,37 @@
+#if (!defined(__ARRIEREGO_H)) && defined(USENEF)
+#define __ARRIEREGO_H
+#include "plucker_base.h"
+
+#ifdef LOCALPICTURES
+class QScrollView;
+class QWidget;
+#endif
+
+class CArriere : public CPlucker_base
+{
+protected:
+ bool isEndOfSection(int thisrec)
+ {
+ return !m_bufferisreserved;
+ }
+ unsigned long NEFstartSection();
+ unsigned long NEFendSection();
+ void setbuffersize()
+ {
+ compressedbuffersize = buffersize = 64*1024;
+ }
+ void GetHeader(UInt16&, UInt16&, UInt32&, UInt8&, UInt8&);
+ int HeaderSize();
+ int bgetch();
+ tchar getch(bool);
+
+ bool CorrectDecoder();
+// void setlink(QString&, const QString&);
+ QImage* imagefromdata(UInt8*, UInt32);
+ unsigned char m_reserved;
+public:
+ void start2endSection();
+ QString about() { return CPlucker_base::about()+QString("\nArriereGo codec (c) Tim Wentford"); }
+};
+
+#endif
diff --git a/noncore/apps/opie-reader/cbkmkselector.h b/noncore/apps/opie-reader/cbkmkselector.h
index 42951e5..ec0c6e8 100644
--- a/noncore/apps/opie-reader/cbkmkselector.h
+++ b/noncore/apps/opie-reader/cbkmkselector.h
@@ -1,43 +1,89 @@
#include <qwidget.h>
#include <qlistbox.h>
#include <qpushbutton.h>
#include <qlayout.h>
+class CBkmkSelectorItem : public QListBoxText
+{
+ int m_ref;
+ public:
+ CBkmkSelectorItem(const QString& _t, int ref) : QListBoxText(_t), m_ref(ref)
+ {
+ }
+ int reference() { return m_ref; }
+};
+
class CBkmkSelector : public QWidget
{
Q_OBJECT
QListBox* bkmkselector;
QPushButton* exitButton;
-
+ /*
+ void keyPressEvent ( QKeyEvent * e )
+ {
+ if ((e->key() == Key_Return) || (e->key() == Key_Space))
+ {
+ emit selected(reinterpret_cast<CBkmkSelectorItem*>(bkmkselector->item(bkmkselector->currentItem()))->reference());
+ e->accept();
+ }
+ else
+ {
+ e->ignore();
+ }
+ }
+ */
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 slotSelected(QListBoxItem* t)
+ {
+ if (t != NULL)
+ {
+ emit selected(reinterpret_cast<CBkmkSelectorItem*>(t)->reference());
+ }
+ }
+//void slotSelected(int t) { emit selected(t); }
void slotCancel() { emit cancelled(); }
+ void slotSort()
+ {
+ bkmkselector->sort();
+#ifdef USEQPE
+ setCurrentItem(bkmkselector->currentItem());
+#endif
+ }
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");
- exitButton = new QPushButton("Cancel", this);
- connect(bkmkselector, SIGNAL( selected(int) ), this, SLOT( slotSelected(int) ) );
+ QHBoxLayout* hgrid = new QHBoxLayout();
+ bkmkselector = new QListBox(this, tr("Bookmarks"));
+ QPushButton* _sort = new QPushButton(tr("Sort"), this);
+ connect(_sort, SIGNAL(clicked()), this, SLOT( slotSort() ) );
+ exitButton = new QPushButton(tr("Cancel"), this);
+ // connect(bkmkselector, SIGNAL( selected(int) ), this, SLOT( slotSelected(int) ) );
connect(bkmkselector, SIGNAL( clicked(QListBoxItem*) ), this, SLOT( slotSelected(QListBoxItem*) ) );
+ connect(bkmkselector, SIGNAL( returnPressed(QListBoxItem*) ), this, SLOT( slotSelected(QListBoxItem*) ) );
connect(exitButton, SIGNAL( clicked() ), this, SLOT( slotCancel() ) );
grid->addWidget(bkmkselector,1);
- grid->addWidget(exitButton);
+ grid->addLayout(hgrid);
+ hgrid->addWidget(_sort);
+ hgrid->addWidget(exitButton);
}
void clear() { bkmkselector->clear(); }
- void insertItem(const QString& item) { bkmkselector->insertItem(item); }
+ void insertItem(const QString& _item, int ref)
+ {
+ CBkmkSelectorItem* item = new CBkmkSelectorItem(_item, ref);
+ bkmkselector->insertItem(item);
+ }
QString text(int index) const { return bkmkselector->text(index); }
void setText(const QString& _l) { exitButton->setText(_l); }
+ void setCurrentItem(int _i) { bkmkselector->setCurrentItem(_i); }
};
-
diff --git a/noncore/apps/opie-reader/config.in b/noncore/apps/opie-reader/config.in
index 9f80a93..04ff2f1 100644
--- a/noncore/apps/opie-reader/config.in
+++ b/noncore/apps/opie-reader/config.in
@@ -1,4 +1,8 @@
config OPIE-READER
boolean "opie-reader (E-Text reader)"
default "y"
depends ( LIBQPE || LIBQPE-X11 ) && LIBOPIE2CORE && LIBOPIE2UI
+
+ source noncore/apps/opie-reader/FliteDyn/config.in
+ source noncore/apps/opie-reader/FliteDyn16/config.in
+
diff --git a/noncore/apps/opie-reader/decompress.cpp b/noncore/apps/opie-reader/decompress.cpp
new file mode 100644
index 0000000..9bfec49
--- a/dev/null
+++ b/noncore/apps/opie-reader/decompress.cpp
@@ -0,0 +1,95 @@
+#include <string.h>
+#include "decompress.h"
+#include <zlib.h>
+#include <stdlib.h>
+
+size_t UnZip(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize)
+{
+ z_stream zstream;
+ memset(&zstream,sizeof(zstream),0);
+ zstream.next_in = compressedbuffer;
+ 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 = compressedbuffer + 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);
+ return zstream.total_out;
+}
+
+#if defined(__STATIC) && defined(USENEF)
+#include "Model.h"
+size_t (*getdecompressor(char* _s))(UInt8*, size_t, UInt8*, size_t)
+{
+ if (strcmp(_s, "PluckerDecompress3") == 0)
+ {
+ return PluckerDecompress3;
+ }
+ if (strcmp(_s, "PluckerDecompress4") == 0)
+ {
+ return PluckerDecompress4;
+ }
+ if (strcmp(_s, "RebDecompress") == 0)
+ {
+ return RebDecompress;
+ }
+ return NULL;
+}
+#else
+
+#include "qfileinfo.h"
+
+#include <dlfcn.h>
+
+size_t (*getdecompressor(char* _s))(UInt8*, size_t, UInt8*, size_t)
+{
+#ifdef USEQPE
+#ifdef OPIE
+ QString codecpath(getenv("OPIEDIR"));
+#else
+ QString codecpath(getenv("QTDIR"));
+#endif
+ codecpath += "/plugins/reader/support/libpluckerdecompress.so";
+#else
+ QString codecpath(getenv("READERDIR"));
+ codecpath += "/support/libpluckerdecompress.so";
+#endif
+ qDebug("Codec:%s", (const char*)codecpath);
+ if (QFile::exists(codecpath))
+ {
+ qDebug("Codec:%s", (const char*)codecpath);
+ void* handle = dlopen(codecpath, RTLD_LAZY);
+ if (handle == 0)
+ {
+ qDebug("Can't find codec:%s", dlerror());
+ return NULL;
+ }
+ return (size_t (*)(UInt8*, size_t, UInt8*, size_t))dlsym(handle, _s);
+ }
+ return NULL;
+}
+#endif
diff --git a/noncore/apps/opie-reader/decompress.h b/noncore/apps/opie-reader/decompress.h
new file mode 100644
index 0000000..400685f
--- a/dev/null
+++ b/noncore/apps/opie-reader/decompress.h
@@ -0,0 +1,5 @@
+#include "mytypes.h"
+
+size_t UnZip(UInt8* compressedbuffer,size_t reclen,UInt8* tgtbuffer,size_t bsize);
+
+size_t (*getdecompressor(char* _s))(UInt8*, size_t, UInt8*, size_t);
diff --git a/noncore/apps/opie-reader/ebookcodec.h b/noncore/apps/opie-reader/ebookcodec.h
index f6e2daf..4229fb9 100644
--- a/noncore/apps/opie-reader/ebookcodec.h
+++ b/noncore/apps/opie-reader/ebookcodec.h
@@ -2,33 +2,42 @@
#include <qfileinfo.h>
#include <qdir.h>
#ifdef USEQPE
#include <qpe/global.h>
#endif
-#include "util.h"
-
#ifndef __STATIC
#include <dlfcn.h>
class ebookcodec : public CExpander_Interface
{
CExpander *codec;
void *handle;
int status;
public:
+ QString getTableAsHtml(unsigned long loc) { return codec->getTableAsHtml(loc); }
QString about()
{
return QString("Plug-in ebook codec interface (c) Tim Wentford\n")+codec->about();
}
ebookcodec(const QString& _s) : codec(NULL), handle(NULL), status(0)
{
- QString codecpath(QTReaderUtil::getPluginPath());
+#ifdef USEQPE
+#ifdef OPIE
+ QString codecpath(getenv("OPIEDIR"));
+#else
+ QString codecpath(getenv("QTDIR"));
+#endif
+ codecpath += "/plugins/reader/codecs/";
+#else
+ QString codecpath(getenv("READERDIR"));
+ codecpath += "/codecs/";
+#endif
codecpath += _s;
if (QFile::exists(codecpath))
{
qDebug("Codec:%s", (const char*)codecpath);
handle = dlopen(codecpath, RTLD_LAZY);
if (handle == 0)
{
/*
@@ -108,11 +117,15 @@ class ebookcodec : public CExpander_Interface
unsigned long endSection() { return codec->endSection(); }
int openfile(const char *src)
{
//qDebug("ebook openfile:%s", src);
return (status != 0) ? status : codec->openfile(src);
}
int getwidth() { return codec->getwidth(); }
QImage* getPicture(const QString& href) { return codec->getPicture(href); }
- bool getFile(const QString& href) { return codec->getFile(href); }
+ bool getFile(const QString& href, const QString& nm) { return codec->getFile(href, nm); }
+ bool findanchor(const QString& nm)
+ {
+ return codec->findanchor(nm);
+ }
};
#endif
diff --git a/noncore/apps/opie-reader/fileBrowser.cpp b/noncore/apps/opie-reader/fileBrowser.cpp
index 2291c85..c8c371a 100644
--- a/noncore/apps/opie-reader/fileBrowser.cpp
+++ b/noncore/apps/opie-reader/fileBrowser.cpp
@@ -50,17 +50,17 @@ fileBrowser::fileBrowser( bool allownew, QWidget* parent, const char* name, boo
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(0, ((modal) ? QListView::Manual : QListView::Maximum));
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 *)) );
diff --git a/noncore/apps/opie-reader/flitecmd.cpp b/noncore/apps/opie-reader/flitecmd.cpp
new file mode 100644
index 0000000..bb7e303
--- a/dev/null
+++ b/noncore/apps/opie-reader/flitecmd.cpp
@@ -0,0 +1,43 @@
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <errno.h>
+#include "flitecmd.h"
+
+void CFliteCmd::output(const QString& txt)
+{
+ pid_t pid;
+ if ((pid = fork()) <0)
+ {
+ qDebug("No memory");
+ }
+ else if (pid == 0)
+ {
+ execlp("flite", "flite", "-t", (const char*)txt, NULL);
+ _exit(127);
+ qDebug("Can't find flite");
+ }
+ else
+ {
+ int status;
+ while (waitpid(pid, &status, 0) < 0)
+ {
+ if (errno != EINTR)
+ {
+ qDebug("Error from flite");
+ break;
+ }
+ }
+ qDebug("flite status:%d", status);
+ }
+}
+
+QString CFliteCmd::about()
+{
+ return QString("FliteCmd output codec (c) Tim Wentford\n");
+}
+
+extern "C"
+{
+ COutput* newcodec() { return new CFliteCmd; }
+}
diff --git a/noncore/apps/opie-reader/flitecmd.h b/noncore/apps/opie-reader/flitecmd.h
new file mode 100644
index 0000000..10f9710
--- a/dev/null
+++ b/noncore/apps/opie-reader/flitecmd.h
@@ -0,0 +1,10 @@
+#include "outputcodec.h"
+
+class CFliteCmd : public COutput
+{
+ public:
+ CFliteCmd() {}
+ ~CFliteCmd() {}
+ QString about();
+ void output(const QString& _o);
+};
diff --git a/noncore/apps/opie-reader/flitedyn.cpp b/noncore/apps/opie-reader/flitedyn.cpp
new file mode 100644
index 0000000..c268cd4
--- a/dev/null
+++ b/noncore/apps/opie-reader/flitedyn.cpp
@@ -0,0 +1,29 @@
+#include "flitedyn.h"
+
+cst_voice *CFliteDyn::m_voice = NULL;
+
+CFliteDyn::CFliteDyn()
+{
+ if (m_voice == NULL)
+ {
+ qDebug("Constucting flite");
+ flite_init();
+ m_voice = register_cmu_us_kal();
+ }
+}
+
+QString CFliteDyn::about()
+{
+ return QString("FliteDyn output codec (c) Tim Wentford\n");
+}
+
+void CFliteDyn::output(const QString& _o)
+{
+ float tm = flite_text_to_speech((const char*)_o, m_voice, "play");
+ qDebug("Produced %g seconds of speech", tm);
+}
+
+extern "C"
+{
+ COutput* newcodec() { return new CFliteDyn; }
+}
diff --git a/noncore/apps/opie-reader/flitedyn.h b/noncore/apps/opie-reader/flitedyn.h
new file mode 100644
index 0000000..4455048
--- a/dev/null
+++ b/noncore/apps/opie-reader/flitedyn.h
@@ -0,0 +1,16 @@
+#include "outputcodec.h"
+extern "C"
+{
+#include <flite.h>
+ cst_voice *register_cmu_us_kal();
+}
+
+class CFliteDyn : public COutput
+{
+ static cst_voice *m_voice;
+ public:
+ CFliteDyn();
+ ~CFliteDyn() {}
+ QString about();
+ void output(const QString& _o);
+};
diff --git a/noncore/apps/opie-reader/iSilo.cpp b/noncore/apps/opie-reader/iSilo.cpp
index 5f14b96..1f727fe 100644
--- a/noncore/apps/opie-reader/iSilo.cpp
+++ b/noncore/apps/opie-reader/iSilo.cpp
@@ -289,16 +289,17 @@ u_int32_t iSilo::get_bits(int num) {
if (num == 0) {
pos = 0;
return(0);
}
for (i = 0; i < num; i++) {
if (pos == 0) {
+ unsuspend();
r = fread(buf, sizeof(u_int32_t), 256, fin);
if (r <= 0) {
qDebug("ERROR: Unexpected end of file");
exit(-1); /* FIXME */
}
pos = 32*256;
}
diff --git a/noncore/apps/opie-reader/linktype.h b/noncore/apps/opie-reader/linktype.h
index 23c24ac..a23d345 100644
--- a/noncore/apps/opie-reader/linktype.h
+++ b/noncore/apps/opie-reader/linktype.h
@@ -1,7 +1,7 @@
#ifndef __LINKTYPE_H
#define __LINKTYPE_H
typedef unsigned int linkType;
-const linkType eNone = 0, eLink = 1, ePicture = 2, eFile = 4;
+const linkType eNone = 0, eLink = 1, ePicture = 2, eFile = 4, eTable = 8;
#endif
diff --git a/noncore/apps/opie-reader/main.cpp b/noncore/apps/opie-reader/main.cpp
index af276da..2be6045 100644
--- a/noncore/apps/opie-reader/main.cpp
+++ b/noncore/apps/opie-reader/main.cpp
@@ -1,8 +1,9 @@
+
#ifdef USEQPE
#include <qpe/qpeapplication.h>
#else
#include <qapplication.h>
#endif
#include "QTReaderApp.h"
#include "signal.h"
diff --git a/noncore/apps/opie-reader/mytypes.h b/noncore/apps/opie-reader/mytypes.h
new file mode 100644
index 0000000..ea60db3
--- a/dev/null
+++ b/noncore/apps/opie-reader/mytypes.h
@@ -0,0 +1,8 @@
+#ifndef __MYTYPES_H__
+#define __MYTYPES_H__
+typedef unsigned char UInt8;
+typedef unsigned short UInt16;
+typedef signed short Int16;
+typedef unsigned long UInt32;
+#endif
+
diff --git a/noncore/apps/opie-reader/opie-reader.pro b/noncore/apps/opie-reader/opie-reader.pro
index 170f7fa..47980e1 100644
--- a/noncore/apps/opie-reader/opie-reader.pro
+++ b/noncore/apps/opie-reader/opie-reader.pro
@@ -4,13 +4,21 @@ SUBDIRS = pluckerbaselib \
pdblib \
PluckerCodec \
AportisCodec \
CHM \
HTMLFilter \
WeaselCodec \
iSiloCodec \
ppmsCodec \
+ FliteCmd \
+ pluckerdecompress \
+ ArriereCodec \
+ RebCodec \
reader
+# these are added only built if enabled in "make menuconfig"
+# FliteDyn
+# FliteDyn16
+
include( $(OPIEDIR)/include.pro )
diff --git a/noncore/apps/opie-reader/outputcodec.h b/noncore/apps/opie-reader/outputcodec.h
new file mode 100644
index 0000000..727575c
--- a/dev/null
+++ b/noncore/apps/opie-reader/outputcodec.h
@@ -0,0 +1,84 @@
+#include <stdlib.h>
+#include <qfileinfo.h>
+#include <qdir.h>
+
+#ifdef USEQPE
+#include <qpe/global.h>
+#endif
+
+class COutput
+{
+ public:
+ virtual ~COutput() {}
+ virtual void output(const QString&) = 0;
+ virtual QString about() = 0;
+};
+
+#ifndef __STATIC
+#include <dlfcn.h>
+class outputcodec : public COutput
+{
+ COutput *codec;
+ void *handle;
+ int status;
+ public:
+ void output(const QString& q) { codec->output(q); }
+ QString about()
+ {
+ return QString("Plug-in output codec interface (c) Tim Wentford\n")+codec->about();
+ }
+ outputcodec(const QString& _s) : codec(NULL), handle(NULL), status(-1)
+ {
+#ifdef USEQPE
+#ifdef OPIE
+ QString codecpath(getenv("OPIEDIR"));
+#else
+ QString codecpath(getenv("QTDIR"));
+#endif
+ codecpath += "/plugins/reader/outcodecs/lib";
+#else
+ QString codecpath(getenv("READERDIR"));
+ codecpath += "/outcodecs/lib";
+#endif
+ codecpath += _s;
+ codecpath += ".so";
+ if (QFile::exists(codecpath))
+ {
+ qDebug("Codec:%s", (const char*)codecpath);
+ handle = dlopen(codecpath, RTLD_LAZY);
+ if (handle == 0)
+ {
+ qDebug("Can't find codec:%s", dlerror());
+ status = -10;
+ return;
+ }
+ COutput* (*newcodec)();
+ newcodec = (COutput* (*)())dlsym(handle, "newcodec");
+ if (newcodec == NULL)
+ {
+ qDebug("Can't find newcodec");
+ status = -20;
+ return;
+ }
+ codec = (*newcodec)();
+ status = 0;
+ }
+ else
+ {
+ qDebug("Can't find codec:%s", (const char*)codecpath);
+ }
+ if (codec == NULL)
+ {
+ qDebug("Can't do newcodec");
+ status = -30;
+ return;
+ }
+ }
+ virtual ~outputcodec()
+ {
+ if (codec != NULL) delete codec;
+ if (handle != NULL) dlclose(handle);
+ }
+ int getStatus() { return status; }
+};
+#endif
diff --git a/noncore/apps/opie-reader/pdb.cpp b/noncore/apps/opie-reader/pdb.cpp
index 6719af4..a13b33d 100644
--- a/noncore/apps/opie-reader/pdb.cpp
+++ b/noncore/apps/opie-reader/pdb.cpp
@@ -1,14 +1,13 @@
#include "pdb.h"
#ifdef _WINDOWS
#include <winsock2.h>
#endif
-
#ifdef USEQPE
void Cpdb::suspend()
{
CExpander::suspend(fin);
}
void Cpdb::unsuspend()
{
CExpander::unsuspend(fin);
@@ -32,31 +31,33 @@ size_t Cpdb::recordpos(int n)
if (n >= mxn)
{
return file_length;
}
else
{
size_t dataoffset = sizeof(DatabaseHdrType) - sizeof(UInt16);
dataoffset += /*dataoffset%4 + */ sizeof(RecordListType) * n;
+ unsuspend();
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)
{
+unsuspend();
fseek(fin, recordpos(n), SEEK_SET);
}
bool Cpdb::openpdbfile(const char *src)
{
//qDebug("cpdb openfile:%s", src);
// printf("In openfile\n");
@@ -77,13 +78,13 @@ bool Cpdb::openpdbfile(const char *src)
file_length = _stat.st_size;
// fseek(fin,0,SEEK_END);
// file_length = ftell(fin);
fseek(fin,0,SEEK_SET);
fread(&head, 1, sizeof(head), fin);
- qDebug("Database name:%s", head.name);
- qDebug("Total number of records:%u", ntohs(head.recordList.numRecords));
+ //qDebug("Database name:%s", head.name);
+ //qDebug("Total number of records:%u", ntohs(head.recordList.numRecords));
return true;
}
diff --git a/noncore/apps/opie-reader/pdb.h b/noncore/apps/opie-reader/pdb.h
index 7458919..a0abd1b 100644
--- a/noncore/apps/opie-reader/pdb.h
+++ b/noncore/apps/opie-reader/pdb.h
@@ -10,23 +10,21 @@
#ifndef __PDB_H__
#define __PDB_H__
#ifndef _WINDOWS
#include <netinet/in.h>
#endif
#include <stdio.h>
+
#include "CExpander.h"
/* Normal Palm typedefs */
-typedef unsigned char UInt8;
-typedef unsigned short UInt16;
-typedef signed short Int16;
-typedef unsigned long UInt32;
+#include "mytypes.h"
typedef UInt32 LocalID;
/* Max length of DB name */
#define dmDBNameLength 0x20
/************************************************************
* Structure of a Record entry
@@ -87,14 +85,17 @@ class Cpdb : public CExpander
void gotorecordnumber(int);
DatabaseHdrType head;
bool openpdbfile(const char* src);
Cpdb() : fin(NULL) {}
~Cpdb();
#ifdef USEQPE
void suspend();
void unsuspend();
+#else
+ void suspend() {}
+ void unsuspend() {}
#endif
public:
virtual void sizes(unsigned long& _file, unsigned long& _text) = 0;
};
#endif
diff --git a/noncore/apps/opie-reader/plucker_base.cpp b/noncore/apps/opie-reader/plucker_base.cpp
index d7d538f..51c7fa7 100644
--- a/noncore/apps/opie-reader/plucker_base.cpp
+++ b/noncore/apps/opie-reader/plucker_base.cpp
@@ -1,9 +1,8 @@
-#include "usenef.h"
#include <stdio.h>
#include <string.h>
#include <qmessagebox.h>
#include <qpixmap.h>
#ifdef USEQPE
#include <qpe/qcopenvelope_qws.h>
#endif /* USEQPE */
#ifdef LOCALPICTURES
@@ -18,17 +17,17 @@
#else /* USEQPE */
#include <qpe/qpeapplication.h>
#endif /* USEQPE */
#include <qimage.h>
#include "plucker_base.h"
#include "Aportis.h"
#include "hrule.h"
-#include "util.h"
+#include "decompress.h"
const UInt8 CPlucker_base::continuation_bit = 1;
CPlucker_base::CPlucker_base() :
#ifdef LOCALPICTURES
m_viewer(NULL),
m_picture(NULL),
#endif
@@ -37,17 +36,18 @@ CPlucker_base::CPlucker_base() :
bufferrec(-1),
m_offset(0)
//, urls(NULL)
{ /*printf("constructing:%x\n",fin);*/ }
void CPlucker_base::Expand(UInt32 reclen, UInt8 type, UInt8* buffer, UInt32 buffersize)
{
- if (type%2 == 0)
+unsuspend();
+ if ((type%2 == 0) && (type != 14))
{
fread(buffer, reclen, sizeof(char), fin);
}
else
{
UInt8* readbuffer = NULL;
if (reclen > compressedbuffersize)
{
@@ -300,17 +300,17 @@ void CPlucker_base::locate(unsigned int n)
if (thishdr_type < 2)
{
bs = thishdr_size;
}
else
{
bs = 0;
}
- } while (locpos + bs <= n);
+ } while (locpos + bs < n);
// qDebug("Time(2): %u", clock()-start);
/*
if (recptr != thisrec)
{
qDebug("Disaster:recptr:%u thisrec:%u", recptr, thisrec);
UInt16 thishdr_uid, thishdr_nParagraphs;
UInt32 thishdr_size = buffercontent;
@@ -407,17 +407,17 @@ bool CPlucker_base::expand(int thisrec)
else
{
m_nextPara = -1;
}
bufferpos = 0;
//qDebug("BC:%u, HS:%u", buffercontent, thishdr_size);
return true;
}
-
+/*
void CPlucker_base::UnZip(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize)
{
z_stream zstream;
memset(&zstream,sizeof(zstream),0);
zstream.next_in = compressedbuffer;
zstream.next_out = tgtbuffer;
zstream.avail_out = bsize;
zstream.avail_in = reclen;
@@ -444,18 +444,18 @@ void CPlucker_base::UnZip(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuff
err = inflate( &zstream, Z_SYNC_FLUSH );
// //qDebug("err:%d - %u", err, zstream.avail_in);
} while ( err == Z_OK );
inflateEnd(&zstream);
}
-
-void CPlucker_base::UnDoc(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize)
+*/
+size_t CPlucker_base::UnDoc(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuffer, size_t bsize)
{
// UInt16 headerSize;
UInt16 docSize;
UInt16 i;
UInt16 j;
UInt16 k;
UInt8 *inBuf = compressedbuffer;
@@ -496,16 +496,17 @@ void CPlucker_base::UnDoc(UInt8* compressedbuffer, size_t reclen, UInt8* tgtbuff
do {
outBuf[ i ] = outBuf[ i - m ];
i++;
} while ( 0 < n-- );
}
}
k += bsize;
}
+ return i;
}
void CPlucker_base::home()
{
currentpos = 0;
expand(1);
}
@@ -1051,19 +1052,173 @@ linkType CPlucker_base::hyperlink(unsigned int n, unsigned int offset, QString&
{
m_nextPara += m_ParaOffsets[m_nextParaIndex];
}
}
*/
}
return eLink;
}
+QString CPlucker_base::getTableAsHtml(unsigned long tgt)
+{
+ qDebug("CPlucker_base::getTableAsHtml:%u", tgt);
+ size_t reclen;
+ UInt16 thisrec = finduid(tgt);
+ qDebug("getimg:Found %u from uid:%u", thisrec, tgt);
+ reclen = recordlength(thisrec);
+ gotorecordnumber(thisrec);
+ UInt16 thishdr_uid, thishdr_nParagraphs;
+ UInt32 thishdr_size;
+ UInt8 thishdr_type, thishdr_reserved;
+ GetHeader(thishdr_uid, thishdr_nParagraphs, thishdr_size, thishdr_type, thishdr_reserved);
+ qDebug("Found a table of type:%u", thishdr_type);
+ reclen -= HeaderSize();
+ UInt32 imgsize = thishdr_size;
+ UInt8* imgbuffer = new UInt8[imgsize];
+ Expand(reclen, thishdr_type, imgbuffer, imgsize);
+
+ QString ret;
+
+ UInt16 size, columns, rows;
+ UInt8 depth, border;
+ UInt32 borderColour, linkColour;
+ UInt8* dp(imgbuffer);
+
+ memcpy(&size, dp, sizeof(size));
+ size = ntohs(size);
+ dp += sizeof(size);
+ memcpy(&columns, dp, sizeof(columns));
+ columns = ntohs(columns);
+ dp += sizeof(columns);
+ memcpy(&rows, dp, sizeof(rows));
+ rows = ntohs(rows);
+ dp += sizeof(rows);
+ qDebug("Rows:%u Cols:%u", rows, columns);
+
+ memcpy(&depth, dp, sizeof(depth));
+ dp += sizeof(depth);
+ memcpy(&border, dp, sizeof(border));
+ dp += sizeof(border);
+
+ qDebug("Depth:%u, Border:%u", depth, border);
+
+ memcpy(&borderColour, dp, sizeof(borderColour));
+ dp += sizeof(borderColour);
+ memcpy(&linkColour, dp, sizeof(linkColour));
+ dp += sizeof(linkColour);
+
+ qDebug("Colours: border:%x, link:%x", borderColour, linkColour);
+
+ if (border)
+ {
+ ret = "<table border>";
+ }
+ else
+ {
+ ret = "<table>";
+ }
+ bool firstrow = true;
+ bool firstcol = true;
+ while (dp < imgbuffer+imgsize)
+ {
+ UInt8 ch = *dp++;
+ if (ch == 0x00)
+ {
+ ch = *dp++;
+ if (ch == 0x90)
+ {
+ if (firstrow)
+ {
+ ret += "<tr>";
+ firstrow = false;
+ firstcol = true;
+ }
+ else
+ {
+ ret += "</tr><tr>";
+ }
+ }
+ else if (ch == 0x97)
+ {
+ if (firstcol)
+ {
+ ret += "<td";
+ firstcol = false;
+ }
+ else
+ {
+ ret += "</td><td";
+ }
+ UInt8 align;
+ UInt16 imgid;
+ UInt8 cols, rows;
+ UInt16 len;
+ memcpy(&align, dp, sizeof(align));
+ dp += sizeof(align);
+ memcpy(&imgid, dp, sizeof(imgid));
+ dp += sizeof(imgid);
+ imgid = ntohs(imgid);
+ memcpy(&cols, dp, sizeof(cols));
+ dp += sizeof(cols);
+ memcpy(&rows, dp, sizeof(rows));
+ dp += sizeof(rows);
+ memcpy(&len, dp, sizeof(len));
+ dp += sizeof(len);
+ len = ntohs(len);
+ switch (align)
+ {
+ case 1:
+ ret += " align=right";
+ break;
+ case 2:
+ ret += " align=center";
+ break;
+ case 3:
+ ret += " align=justify";
+ break;
+ case 0:
+ break;
+ default:
+ qDebug("Unknown table cell alignment:%u", align);
+ }
+ if (cols != 1)
+ {
+ QString num;
+ num.setNum(cols);
+ ret += " colspan=";
+ ret += num;
+ }
+ if (rows != 1)
+ {
+ QString num;
+ num.setNum(rows);
+ ret += " rowspan=";
+ ret += num;
+ }
+ ret += ">";
+ }
+ else
+ {
+ dp += (ch & 7);
+ }
+ }
+ else
+ {
+ ret += QChar(ch);
+ }
+ }
+
+ ret += "</td></tr></table>";
+ delete [] imgbuffer;
+ return ret;
+}
tchar CPlucker_base::getch_base(bool fast)
{
+ mystyle.setTable(0xffffffff);
int ch = bgetch();
while (ch == 0)
{
ch = bgetch();
// //qDebug("Function:%x", ch);
switch (ch)
{
case 0x38:
@@ -1114,20 +1269,16 @@ tchar CPlucker_base::getch_base(bool fast)
hasseen = true;
break;
}
}
if (hasseen)
{
mystyle.setStrikethru();
}
- else
- {
- mystyle.setUnderline();
- }
mystyle.setOffset(m_offset);
m_offset = 0;
ch = bgetch();
}
break;
case 0x08:
ch = bgetch();
// mystyle.setColour(0, 0, 0);
@@ -1324,16 +1475,25 @@ tchar CPlucker_base::getch_base(bool fast)
case 0x9a:
{
m_offset = 255*bgetch();
m_offset += bgetch();
qDebug("Found offset:%u", m_offset);
ch = bgetch();
}
break;
+ case 0x92:
+ {
+ ch = bgetch();
+ ch <<= 8;
+ ch |= (tchar)bgetch();
+ mystyle.setTable(ch);
+ ch = 0x16e5;
+ }
+ break;
case 0x85:
default:
qDebug("Function:%x NOT IMPLEMENTED", ch);
{
int skip = ch & 7;
for (int i = 0; i < skip; i++)
{
ch = bgetch();
@@ -1352,57 +1512,17 @@ tchar CPlucker_base::getch_base(bool fast)
}
}
m_lastIsBreak = (ch == 10);
return (ch == EOF) ? UEOF : ch;
}
-#if defined(__STATIC) && defined(USENEF)
-#include "Model.h"
-void (*CPlucker_base::getdecompressor(const QString& _s))(UInt8*, size_t, UInt8*, size_t)
-{
- if (_s == "PluckerDecompress3")
- {
- return PluckerDecompress3;
- }
- if (_s == "PluckerDecompress4")
- {
- return PluckerDecompress4;
- }
- return NULL;
-}
-#else
-
-#include "qfileinfo.h"
-
-#include <dlfcn.h>
-
-void (*CPlucker_base::getdecompressor(const QString& _s))(UInt8*, size_t, UInt8*, size_t)
-{
- QString codecpath(QTReaderUtil::getPluginPath("support"));
- codecpath += "/libpluckerdecompress.so";
- qDebug("Codec:%s", (const char*)codecpath);
- if (QFile::exists(codecpath))
- {
- qDebug("Codec:%s", (const char*)codecpath);
- void* handle = dlopen(codecpath, RTLD_LAZY);
- if (handle == 0)
- {
- qDebug("Can't find codec:%s", dlerror());
- return NULL;
- }
- return (void (*)(UInt8*, size_t, UInt8*, size_t))dlsym(handle, _s);
- }
- return NULL;
-}
-#endif
-
QString CPlucker_base::about()
{
QString abt = "Plucker base codec (c) Tim Wentford";
if (m_decompress != UnDoc && m_decompress != UnZip)
{
- abt += "\nSpecial decompression (c) Tim Wentford";
+ abt += "\nSpecial decompression (c) Tim Wentford (ppmd by Dmitry Shkarin";
}
return abt;
}
diff --git a/noncore/apps/opie-reader/plucker_base.h b/noncore/apps/opie-reader/plucker_base.h
index 8d74cc2..2b57986 100644
--- a/noncore/apps/opie-reader/plucker_base.h
+++ b/noncore/apps/opie-reader/plucker_base.h
@@ -61,21 +61,21 @@ protected:
// char* urls;
// size_t urlsize;
size_t bufferpos;
int bufferrec;
CPlucker_record0 hdr0;
bool m_bufferisreserved;
size_t currentpos;
bool expand(int);
- static void UnZip(UInt8*, size_t, UInt8*, size_t);
- static void UnDoc(UInt8*, size_t, UInt8*, size_t);
+ //static void UnZip(UInt8*, size_t, UInt8*, size_t);
+ static size_t UnDoc(UInt8*, size_t, UInt8*, size_t);
+
+ size_t (*m_decompress)(UInt8*, size_t, UInt8*, size_t);
- void (*m_decompress)(UInt8*, size_t, UInt8*, size_t);
- void (*getdecompressor(const QString& _s))(UInt8*, size_t, UInt8*, size_t);
#ifdef LOCALPICTURES
void showimg(UInt16 tgt);
#endif
QImage* getimg(UInt16 tgt);
QImage* expandimg(UInt16 tgt, bool border=false);
void home();
virtual int bgetch() = 0;
CNavigation m_nav;
@@ -105,11 +105,12 @@ protected:
linkType back(size_t& loc) { return (m_nav.back(loc)) ? eLink : eNone; }
bool hasnavigation() { return true; }
void setSaveData(unsigned char*& data, unsigned short& len, unsigned char* src, unsigned short srclen);
void putSaveData(unsigned char*& src, unsigned short& srclen);
virtual bool CorrectDecoder() = 0;
// virtual void setlink(QString&, const QString&) = 0;
virtual QImage* imagefromdata(UInt8*, UInt32) = 0;
+ QString getTableAsHtml(unsigned long loc);
};
#endif
diff --git a/noncore/apps/opie-reader/pluckerbaselib/pluckerbaselib.pro b/noncore/apps/opie-reader/pluckerbaselib/pluckerbaselib.pro
index a66dc44..0212d84 100644
--- a/noncore/apps/opie-reader/pluckerbaselib/pluckerbaselib.pro
+++ b/noncore/apps/opie-reader/pluckerbaselib/pluckerbaselib.pro
@@ -1,16 +1,17 @@
DEFINES += OPIE USEQPE
VPATH = ..
TEMPLATE = lib
CONFIG = qt warn_on release dll
HEADERS = pdb.h \
util.h
-SOURCES = plucker_base.cpp
+SOURCES = plucker_base.cpp \
+ decompress.cpp
INTERFACES =
DESTDIR = $(OPIEDIR)/lib
TARGET = reader_pluckerbase
LIBS += -ldl
INCLUDEPATH += $(OPIEDIR)/include
DEPENDPATH += $(OPIEDIR)/include
diff --git a/noncore/apps/opie-reader/pluckerdecompress/.cvsignore b/noncore/apps/opie-reader/pluckerdecompress/.cvsignore
new file mode 100644
index 0000000..1810ee0
--- a/dev/null
+++ b/noncore/apps/opie-reader/pluckerdecompress/.cvsignore
@@ -0,0 +1,5 @@
+Makefile
+config.in
+moc_*
+.moc
+.obj
diff --git a/noncore/apps/opie-reader/pluckerdecompress/pluckerdecompress.pro b/noncore/apps/opie-reader/pluckerdecompress/pluckerdecompress.pro
new file mode 100644
index 0000000..c1b7686
--- a/dev/null
+++ b/noncore/apps/opie-reader/pluckerdecompress/pluckerdecompress.pro
@@ -0,0 +1,17 @@
+DEFINES += OPIE USEQPE
+VPATH = ..
+TEMPLATE = lib
+CONFIG = qt warn_on release dll
+HEADERS = CSource.h Model.h Coder.h SubAlloc.h
+
+SOURCES = Model.cpp
+
+
+INTERFACES =
+DESTDIR = $(OPIEDIR)/plugins/reader/support
+TARGET = pluckerdecompress
+
+INCLUDEPATH += $(OPIEDIR)/include
+DEPENDPATH += $(OPIEDIR)/include
+
+include( $(OPIEDIR)/include.pro )
diff --git a/noncore/apps/opie-reader/ppm_expander.cpp b/noncore/apps/opie-reader/ppm_expander.cpp
index 2a4318b..61ef90e 100644
--- a/noncore/apps/opie-reader/ppm_expander.cpp
+++ b/noncore/apps/opie-reader/ppm_expander.cpp
@@ -33,17 +33,17 @@ ppm_expander::~ppm_expander() {
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)
{
my_file_in=fopen(infile,"rb");
- my_read_buf = new PPM_ReadBuf(my_file_in);
+ my_read_buf = new PPM_ReadBuf(my_file_in, this);
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;
@@ -102,14 +102,23 @@ int ppm_expander::getch() {
if (++curblock >= numblocks) return EOF;
locate(curblock,0);
c = ppm.PPM_Decode();
}
outbytes++;
return (c==SYM_EOF) ? EOF : c;
}
+UINT PPM_ReadBuf::readbuf(UCHAR *buf,UINT len)
+ {
+ UINT len1;
+ parent->unsuspend();
+ len1=fread(buf,1,len,my_file_in);
+ return len1;
+ }
+
+
#ifndef __STATIC
extern "C"
{
CExpander* newcodec() { return new ppm_expander; }
}
#endif
diff --git a/noncore/apps/opie-reader/ppm_expander.h b/noncore/apps/opie-reader/ppm_expander.h
index ccc89c2..c5f8a17 100644
--- a/noncore/apps/opie-reader/ppm_expander.h
+++ b/noncore/apps/opie-reader/ppm_expander.h
@@ -2,18 +2,18 @@
#define __ppm_expander_h
#include "CExpander.h"
#include <sys/stat.h>
#include "utypes.h"
#include "ppm.h"
-#include "arith.h"
+class PPM_ReadBuf;
#define SYM_EOF 256
class ppm_expander : public CExpander {
UCHAR *buf_in,*buf_out;
unsigned int bufsize;
unsigned int outbytes;
unsigned long blocksize;
@@ -31,16 +31,19 @@ public:
void suspend()
{
CExpander::suspend(my_file_in);
}
void unsuspend()
{
CExpander::unsuspend(my_file_in);
}
+#else
+ void suspend() {}
+ void unsuspend() {}
#endif
ppm_expander() : needppmend(false), my_file_in(NULL), my_read_buf(NULL)
{
bufsize = 1024;
buf_in = new UCHAR[bufsize];
buf_out = new UCHAR[bufsize];
outbytes = 0;
}
diff --git a/noncore/apps/opie-reader/preferences.cpp b/noncore/apps/opie-reader/preferences.cpp
index 0f59a22..67960ed 100755
--- a/noncore/apps/opie-reader/preferences.cpp
+++ b/noncore/apps/opie-reader/preferences.cpp
@@ -1,8 +1,9 @@
+
#ifndef USEQPE
#include "preferences.h"
#include <qfile.h>
#include <qtextstream.h>
Config::Config(const QString& _fn) : fname(_fn)
diff --git a/noncore/apps/opie-reader/preferences.h b/noncore/apps/opie-reader/preferences.h
index aeb2a84..39959d4 100644
--- a/noncore/apps/opie-reader/preferences.h
+++ b/noncore/apps/opie-reader/preferences.h
diff --git a/noncore/apps/opie-reader/reader.staticpro b/noncore/apps/opie-reader/reader.staticpro
deleted file mode 100644
index 78ea8fb..0000000
--- a/noncore/apps/opie-reader/reader.staticpro
+++ b/dev/null
@@ -1,108 +0,0 @@
-TEMPLATE = app
-CONFIG = qt warn_off debug
-HEADERS = Aportis.h \
- Bkmks.h \
- BuffDoc.h \
- ButtonPrefs.h \
- CAnnoEdit.h \
- CBuffer.h \
- CDrawBuffer.h \
- CEncoding.h \
- CEncoding_tables.h \
- CExpander.h \
- CFilter.h \
- CloseDialog.h \
- Filedata.h \
- FixedFont.h \
- FontControl.h \
- GraphicWin.h \
- Markups.h \
- Navigation.h \
- Palm2QImage.h \
- Prefs.h \
- QFloatBar.h \
- QTReader.h \
- QTReaderApp.h \
- QtrListView.h \
- Queue.h \
- StyleConsts.h \
- ToolbarPrefs.h \
- URLDialog.h \
- ZText.h \
- arith.h \
- cbkmkselector.h \
- config.h \
- fileBrowser.h \
- infowin.h \
- linktype.h \
- my_list.h \
- names.h \
- QSTATICREADERINC/opie.h \
- pdb.h \
- plucker_base.h \
- plucker.h \
- ppm.h \
- ppm_expander.h \
- preferences.h \
- QSTATICREADERINC/static.h \
- usenef.h \
- QSTATICREADERINC/useqpe.h \
- ustring.h \
- utypes.h \
- version.h \
- ztxt.h
-
-SOURCES = Aportis.cpp \
- Bkmks.cpp \
- BuffDoc.cpp \
- ButtonPrefs.cpp \
- CAnnoEdit.cpp \
- CBuffer.cpp \
- CDrawBuffer.cpp \
- CEncoding.cpp \
- CEncoding_tables.cpp \
- CExpander.cpp \
- CFilter.cpp \
- CHM.cpp \
- CRegExp.cpp \
- CloseDialog.cpp \
- FontControl.cpp \
- GraphicWin.cpp \
- Navigation.cpp \
- Palm2QImage.cpp \
- Prefs.cpp \
- QTReader.cpp \
- QTReaderApp.cpp \
- QtrListView.cpp \
- StyleConsts.cpp \
- ToolbarPrefs.cpp \
- URLDialog.cpp \
- arith_d.cpp \
- chm_lib.c \
- fileBrowser.cpp \
- hrule.cpp \
- infowin.cpp \
- iSilo.cpp \
- lzx.c \
- main.cpp \
- orkey.cpp \
- pdb.cpp \
- plucker.cpp \
- plucker_base.cpp \
- ppm.cpp \
- ppm_expander.cpp \
- preferences.cpp \
- striphtml.cpp \
- util.cpp \
- version.cpp \
- ztxt.cpp
-
-INTERFACES =
-DESTDIR = QSTATICREADEROBJS
-INCLUDEPATH += QSTATICREADERINC
-DEPENDPATH += QSTATICREADERINC
-OBJECTS_DIR = QSTATICREADEROBJS
-MOC_DIR = QSTATICREADERMOCS
-TARGET = uqtreader
-#LIBS += -lqpe
-
diff --git a/noncore/apps/opie-reader/reader.staticzpro b/noncore/apps/opie-reader/reader.staticzpro
deleted file mode 100644
index 861eb88..0000000
--- a/noncore/apps/opie-reader/reader.staticzpro
+++ b/dev/null
@@ -1,108 +0,0 @@
-TEMPLATE = app
-CONFIG = qt warn_on release
-HEADERS = Aportis.h \
- Bkmks.h \
- BuffDoc.h \
- ButtonPrefs.h \
- CAnnoEdit.h \
- CBuffer.h \
- CDrawBuffer.h \
- CEncoding.h \
- CEncoding_tables.h \
- CExpander.h \
- CFilter.h \
- CloseDialog.h \
- Filedata.h \
- FixedFont.h \
- FontControl.h \
- GraphicWin.h \
- Markups.h \
- Navigation.h \
- Palm2QImage.h \
- Prefs.h \
- QFloatBar.h \
- QTReader.h \
- QTReaderApp.h \
- QtrListView.h \
- Queue.h \
- StateData.h \
- StyleConsts.h \
- ToolbarPrefs.h \
- URLDialog.h \
- ZText.h \
- arith.h \
- cbkmkselector.h \
- config.h \
- fileBrowser.h \
- infowin.h \
- linktype.h \
- my_list.h \
- names.h \
- ZSTATICREADERINC/opie.h \
- pdb.h \
- plucker_base.h \
- plucker.h \
- ppm.h \
- ppm_expander.h \
- preferences.h \
- ZSTATICREADERINC/static.h \
- usenef.h \
- ZSTATICREADERINC/useqpe.h \
- ustring.h \
- utypes.h \
- version.h \
- ztxt.h
-
-SOURCES = Aportis.cpp \
- Bkmks.cpp \
- BuffDoc.cpp \
- ButtonPrefs.cpp \
- CAnnoEdit.cpp \
- CBuffer.cpp \
- CDrawBuffer.cpp \
- CEncoding.cpp \
- CEncoding_tables.cpp \
- CExpander.cpp \
- CFilter.cpp \
- CHM.cpp \
- CRegExp.cpp \
- CloseDialog.cpp \
- FontControl.cpp \
- GraphicWin.cpp \
- Navigation.cpp \
- Palm2QImage.cpp \
- Prefs.cpp \
- QTReader.cpp \
- QTReaderApp.cpp \
- QtrListView.cpp \
- StyleConsts.cpp \
- ToolbarPrefs.cpp \
- URLDialog.cpp \
- arith_d.cpp \
- chm_lib.c \
- fileBrowser.cpp \
- hrule.cpp \
- infowin.cpp \
- iSilo.cpp \
- lzx.c \
- main.cpp \
- orkey.cpp \
- pdb.cpp \
- plucker.cpp \
- plucker_base.cpp \
- ppm.cpp \
- ppm_expander.cpp \
- striphtml.cpp \
- util.cpp \
- version.cpp \
- ztxt.cpp
-
-INTERFACES =
-DESTDIR = ZSTATICREADEROBJS
-INCLUDEPATH += ZSTATICREADERINC
-DEPENDPATH += ZSTATICREADERINC
-OBJECTS_DIR = ZSTATICREADEROBJS
-MOC_DIR = ZSTATICREADERMOCS
-TARGET = uqtreader
-LIBS += -lqpe
-
diff --git a/noncore/apps/opie-reader/reader/reader.pro b/noncore/apps/opie-reader/reader/reader.pro
index 6349ea7..dc6a5dd 100644
--- a/noncore/apps/opie-reader/reader/reader.pro
+++ b/noncore/apps/opie-reader/reader/reader.pro
@@ -25,33 +25,33 @@ HEADERS = Aportis.h \
PPMd.h \
PPMdType.h \
QFloatBar.h \
QTReader.h \
QTReaderApp.h \
QtrListView.h \
Queue.h \
StyleConsts.h \
+ TableDialog.h \
ToolbarPrefs.h \
URLDialog.h \
ZText.h \
arith.h \
cbkmkselector.h \
config.h \
fileBrowser.h \
infowin.h \
linktype.h \
my_list.h \
names.h \
pdb.h \
plucker.h \
plucker_base.h \
ppm.h \
ppm_expander.h \
- usenef.h \
ustring.h \
util.h \
utypes.h \
version.h \
ztxt.h
SOURCES = BuffDoc.cpp \
ButtonPrefs.cpp \
@@ -63,16 +63,17 @@ SOURCES = BuffDoc.cpp \
CRegExp.cpp \
CloseDialog.cpp \
FontControl.cpp \
GraphicWin.cpp \
Prefs.cpp \
QTReader.cpp \
QTReaderApp.cpp \
QtrListView.cpp \
+ TableDialog.cpp \
ToolbarPrefs.cpp \
URLDialog.cpp \
fileBrowser.cpp \
infowin.cpp \
main.cpp \
orkey.cpp \
util.cpp \
version.cpp
diff --git a/noncore/apps/opie-reader/setn.sh b/noncore/apps/opie-reader/setn.sh
deleted file mode 100644
index ad9409f..0000000
--- a/noncore/apps/opie-reader/setn.sh
+++ b/dev/null
@@ -1,27 +0,0 @@
-red='\e[0;31m'
-RED='\e[1;31m'
-blue='\e[0;34m'
-BLUE='\e[1;34m'
-cyan='\e[0;36m'
-CYAN='\e[1;36m'
-NC='\e[0m' # No Color
-
-if test -z $OLDPATH; then
- export OLDPATH=$PATH
-fi
-
-if test -z $OLD_LD_LIBRARY_PATH; then
- export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
-fi
-
-#export QPEDIR=/opt/Qtopia
-export QTDIR=/home/tim/nevyos/qt-embedded-free-3.1.1
-export PATH=$QTDIR/bin:$OLDPATH
-export TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-generic-g++
-export LD_LIBRARY_PATH=$QTDIR/lib:$OLD_LD_LIBRARY_PATH
-
-#PS1="[${cyan}\T$NC][${RED}Laptop${NC}]\W> "
-#PS1="[${RED}NevyOS${NC}]\W> "
-PS1="[NevyOS]\W> "
-
-echo -e \\n${RED}NevyOS${NC} environment configured\\n
diff --git a/noncore/apps/opie-reader/seto.sh b/noncore/apps/opie-reader/seto.sh
deleted file mode 100644
index c1d1dd1..0000000
--- a/noncore/apps/opie-reader/seto.sh
+++ b/dev/null
@@ -1,25 +0,0 @@
-red='\e[0;31m'
-RED='\e[1;31m'
-blue='\e[0;34m'
-BLUE='\e[1;34m'
-cyan='\e[0;36m'
-CYAN='\e[1;36m'
-NC='\e[0m' # No Color
-
-if test -z $OLDPATH; then
- export OLDPATH=$PATH
-fi
-
-if test -z $OLD_LD_LIBRARY_PATH; then
- export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
-fi
-
-export QPEDIR=/opt/Qtopia/opie
-export QTDIR=/opt/Qtopia/opie
-export PATH=$QTDIR/bin:/usr/local/arm/3.3/bin:$OLDPATH
-export TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-opie-g++
-#export LD_LIBRARY_PATH=$QTDIR/lib:$OLD_LD_LIBRARY_PATH
-
-PS1="[Opie]\W> "
-
-echo -e \\n${RED}Opie${NC} environment configured\\n
diff --git a/noncore/apps/opie-reader/setqt.sh b/noncore/apps/opie-reader/setqt.sh
deleted file mode 100644
index 1b7e7b7..0000000
--- a/noncore/apps/opie-reader/setqt.sh
+++ b/dev/null
@@ -1,30 +0,0 @@
-red='\e[0;31m'
-RED='\e[1;31m'
-blue='\e[0;34m'
-BLUE='\e[1;34m'
-cyan='\e[0;36m'
-CYAN='\e[1;36m'
-NC='\e[0m' # No Color
-
-if test -z $OLDPATH; then
- export OLDPATH=$PATH
-fi
-
-if test -z $OLD_LD_LIBRARY_PATH; then
- export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
-fi
-
-#export QPEDIR=/opt/Qtopia
-export QTDIR=/usr/lib/qt3
-export PATH=$QTDIR/bin:$OLDPATH
-#export TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-generic-g++
-
-export READERDIR=/home/tim/uqtreader
-export LD_LIBRARY_PATH=$READERDIR/lib:$OLD_LD_LIBRARY_PATH
-
-
-#PS1="[${cyan}\T$NC][${RED}Laptop${NC}]\W> "
-#PS1="[${RED}NevyOS${NC}]\W> "
-PS1="[QT]\W> "
-
-echo -e \\n${RED}QT${NC} environment configured\\n
diff --git a/noncore/apps/opie-reader/setws.sh b/noncore/apps/opie-reader/setws.sh
deleted file mode 100644
index 61aeccb..0000000
--- a/noncore/apps/opie-reader/setws.sh
+++ b/dev/null
@@ -1,27 +0,0 @@
-red='\e[0;31m'
-RED='\e[1;31m'
-blue='\e[0;34m'
-BLUE='\e[1;34m'
-cyan='\e[0;36m'
-CYAN='\e[1;36m'
-NC='\e[0m' # No Color
-
-if test -z $OLDPATH; then
- export OLDPATH=$PATH
-fi
-
-if test -z $OLD_LD_LIBRARY_PATH; then
- export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
-fi
-
-export QPEDIR=/opt/Qtopia
-export QTDIR=/opt/Qtopia
-export PATH=$QTDIR/bin:$OLDPATH
-export TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-generic-g++
-export LD_LIBRARY_PATH=$QTDIR/lib:$OLD_LD_LIBRARY_PATH
-
-#PS1="[${cyan}\T$NC][${RED}Laptop${NC}]\W> "
-#PS1="[${RED}Laptop${NC}]\W> "
-PS1="[Laptop]\W> "
-
-echo -e \\n${RED}Laptop${NC} environment configured\\n
diff --git a/noncore/apps/opie-reader/setz.sh b/noncore/apps/opie-reader/setz.sh
deleted file mode 100644
index e2fa4cd..0000000
--- a/noncore/apps/opie-reader/setz.sh
+++ b/dev/null
@@ -1,25 +0,0 @@
-red='\e[0;31m'
-RED='\e[1;31m'
-blue='\e[0;34m'
-BLUE='\e[1;34m'
-cyan='\e[0;36m'
-CYAN='\e[1;36m'
-NC='\e[0m' # No Color
-
-if test -z $OLDPATH; then
- export OLDPATH=$PATH
-fi
-
-if test -z $OLD_LD_LIBRARY_PATH; then
- export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH
-fi
-
-export QPEDIR=/opt/Qtopia/sharp
-export QTDIR=/opt/Qtopia/sharp
-export PATH=$QTDIR/bin:/usr/local/arm/bin:$OLDPATH
-export TMAKEPATH=/opt/Qtopia/tmake/lib/qws/linux-sharp-g++
-export LD_LIBRARY_PATH=$QTDIR/lib:$OLD_LD_LIBRARY_PATH
-
-PS1="[Zaurus]\W> "
-
-echo -e \\n${RED}Zaurus${NC} environment configured\\n
diff --git a/noncore/apps/opie-reader/striphtml.cpp b/noncore/apps/opie-reader/striphtml.cpp
index e86402b..c434dbb 100644
--- a/noncore/apps/opie-reader/striphtml.cpp
+++ b/noncore/apps/opie-reader/striphtml.cpp
@@ -3,17 +3,16 @@
#include <qtextstream.h>
#include <qdir.h>
#ifdef USEQPE
#include <qpe/global.h>
#endif
#include "CDrawBuffer.h"
#include "striphtml.h"
#include "hrule.h"
-#include "util.h"
#include <qregexp.h>
#include <qimage.h>
#include <qpixmap.h>
//#include <qprogressdialog.h>
//#include <qapplication.h>
static unsigned char h2i(unsigned char c)
@@ -85,25 +84,33 @@ void striphtml::skipblock(const QString& _ent)
ch = skip_ws();
ent = getname(ch, " >").lower();
qDebug("Skipblock:%s", (const char*)ent);
} while (ent != _ent && ch != UEOF);
}
-void striphtml::locate(unsigned int n)
+void striphtml::reset()
{
m_inblock = false;
text_q = "";
+ q = "";
+ tablenesteddepth = 0;
forcecentre = false;
ignorespace = false;
+ indent = 0;
while (!stylestack.isEmpty()) stylestack.pop();
currentstyle.unset();
+}
+
+void striphtml::locate(unsigned int n)
+{
qDebug("striphtml:locating:%u", n);
+ reset();
parent->locate(n);
}
int striphtml::getpara(CBuffer& buff, unsigned long& startpos)
{
tchar ch;
CStyle sty;
unsigned long pos;
@@ -228,16 +235,23 @@ QString striphtml::dehtml(const QString& _info)
}
return info;
}
bool striphtml::findanchor(const QString& _info)
{
// QProgressDialog dlg("Finding link...", QString::null, 0, NULL, "progress", true);
// QProgressBar dlg(0);
+ if (parent->findanchor(_info))
+ {
+ reset();
+ return true;
+ }
+ qDebug("Using html find");
+ parent->locate(parent->startSection());
#if defined(USEQPE) || defined(_WINDOWS)
QString info;
for (int i = 0; i < _info.length(); i++)
{
tchar ch = _info[i];
if (QString(".^$[]*+?").find(ch) != -1)
{
info += '\\';
@@ -290,33 +304,43 @@ bool striphtml::findanchor(const QString& _info)
{
locate(startpos);
qDebug("Not found");
ret = false;
}
return ret;
}
-striphtml::striphtml(const QString& _s) : entmap(NULL), isPre(false), currentid(0), lastch(0), currentfile(_s), indent(0), forcecentre(false), m_inblock(false), m_bchm(false), ignorespace(false)
+striphtml::striphtml(const QString& _s) : entmap(NULL), isPre(false), currentid(0), lastch(0), currentfile(_s), indent(0), forcecentre(false), m_inblock(false), m_bchm(false), ignorespace(false), tablenesteddepth(0)
{
href2filepos = new QMap<QString, unsigned long>;
id2href = new QMap<unsigned long, QString>;
}
striphtml::~striphtml()
{
if (entmap != NULL) delete entmap;
delete href2filepos;
delete id2href;
}
void striphtml::initentmap()
{
entmap = new QMap<QString, tchar>;
- QString fname(QTReaderUtil::getPluginPath("data"));
+#ifdef USEQPE
+#ifdef OPIE
+ QString fname(getenv("OPIEDIR"));
+#else
+ QString fname(getenv("QTDIR"));
+#endif
+ fname += "/plugins/reader/data";
+#else
+ QString fname(getenv("READERDIR"));
+ fname += "/data";
+#endif
QFileInfo fi;
fi.setFile(fname, "HTMLentities");
if (fi.exists())
{
fname = fi.absFilePath();
QFile fl(fname);
if (fl.open(IO_ReadOnly))
@@ -407,16 +431,22 @@ QString striphtml::getattr(tchar& ch)
{
ch = skip_ws();
if (ch == '"')
{
mygetch(ch, sty, pos);
ref = getname(ch, "\"");
ch = skip_ws();
}
+ else if (ch == '\'')
+ {
+ mygetch(ch, sty, pos);
+ ref = getname(ch, "\'");
+ ch = skip_ws();
+ }
else
{
ref = getname(ch, " >");
if (ch == ' ') ch = skip_ws();
}
}
return ref;
}
@@ -473,37 +503,41 @@ linkType striphtml::hyperlink(unsigned int n, unsigned int, QString& w, QString&
}
qDebug("File:%s", (const char*)file);
qDebug("Name:%s", (const char*)name);
if (file.isEmpty())
{
+ if (parent->findanchor(name))
+ {
+ reset();
+ return eLink;
+ }
fpit = href2filepos->find(name);
if (fpit != href2filepos->end())
{
locate(*fpit);
return eLink;
}
else
{
// nm = QString("<a[^>]*name[ \t]*=[ \t]*\"") + name + "\"";
qDebug("Do a search for:%s", (const char*)name);
- parent->locate(0);
findanchor(name);
return eLink;
}
}
else
// if (href.find('#') == -1)
{
if (m_bchm)
{
- w = "/"+file;
+ w = file;
nm = name;
return eFile;
}
else
{
QFileInfo f(currentfile);
QFileInfo f1(f.dir(true), file);
if (f1.exists())
@@ -559,17 +593,41 @@ void striphtml::mygetch(tchar& ch, CStyle& sty, unsigned long& pos)
}
if (ch == '>')
{
m_inblock = false;
}
}
if (ch == 10 && !isPre)
{
+#ifdef REMOVE_LF_BEFORE_ENDTAG
+ parent->getch(ch, sty, pos);
+ if (ch == '<')
+ {
+ parent->getch(ch, sty, pos);
+ if (ch == '/')
+ {
+ ch = '<';
+ text_q += '/';
+ }
+ else
+ {
+ text_q += '<';
+ text_q += ch;
+ ch = ' ';
+ }
+ }
+ else
+ {
+ text_q += ch;
+ ch = ' ';
+ }
+#else
ch = ' ';
+#endif
}
}
void striphtml::parse_paragraph(CStyle& currentstyle, tchar& ch, unsigned long pos)
{
/*
int count = 0;
for (CList<CStyle>::iterator iter = stylestack.begin(); iter != stylestack.end(); ++iter)
@@ -579,17 +637,16 @@ void striphtml::parse_paragraph(CStyle& currentstyle, tchar& ch, unsigned long p
qDebug("Currently have %u styles", count);
*/
if (stylestack.isEmpty())
{
currentstyle.unset();
}
else
{
- qDebug("Using stack style");
currentstyle = stylestack.first();
}
if (forcecentre)
{
currentstyle.setCentreJustify();
}
if (ch == ' ') ch = skip_ws();
while (ch != '>' && ch != UEOF)
@@ -602,16 +659,20 @@ void striphtml::parse_paragraph(CStyle& currentstyle, tchar& ch, unsigned long p
if (attr == "center")
{
currentstyle.setCentreJustify();
}
if (attr == "right")
{
currentstyle.setRightJustify();
}
+ if (attr == "justify")
+ {
+ currentstyle.setFullJustify();
+ }
}
if (ent == "id")
{
(*href2filepos)[attr] = pos;
}
if (ent == "bgcolor")
{
qDebug("Got paper colour:%s", (const char*)attr);
@@ -649,44 +710,43 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
currentstyle.setPicture(false, hRule(w,h,r,g,b));
q = q.right(q.length()-6);
}
else
{
q = q.right(q.length()-1);
}
sty = currentstyle;
+ lastch = ch;
return;
}
do
{
unsigned long npos;
CStyle dummy;
mygetch(ch, dummy, pos);
- // if (ch == 10 && !isPre) ch = ' ';
while (ch == '<' && ch != UEOF)
{
ch = skip_ws();
-
QString ent = getname(ch, " >").lower();
// qDebug("Entity:%s", (const char*)ent);
if (ent == "a"/* || ent == "reference"*/)
{
if (ch == ' ') ch = skip_ws();
bool fileposfound = false;
bool ishref = false;
unsigned int filepos = 0;
QString ref, name;
while (ch != '>' && ch != UEOF)
{
QString ent = getname(ch, " =>").lower();
QString attr = getattr(ch);
- qDebug("<A>Entity:%s Attr:%s", (const char*)ent, (const char*)attr);
+ //qDebug("<A>Entity:%s Attr:%s", (const char*)ent, (const char*)attr);
if (ent == "name")
{
name = attr;
}
if (ent == "onclick")
{
int st = attr.find('\'');
int nd = attr.findRev('\'');
@@ -707,17 +767,17 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
ishref = true;
ref = attr;
}
}
if (ent == "title")
{
text_q = attr + "</a><p>";
}
- qDebug("<a %s=%s>", (const char*)ent, (const char*)ref);
+ //qDebug("<a %s=%s>", (const char*)ent, (const char*)ref);
}
if (ishref)
{
currentstyle.setColour(0,0,255);
currentstyle.setLink(true);
currentstyle.setData(currentid);
if (!text_q.isEmpty())
{
@@ -743,16 +803,17 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
parse_paragraph(currentstyle, ch, pos);
currentstyle.setExtraSpace(3);
continue;
}
else if (ent == "div")
{
parse_paragraph(currentstyle, ch, pos);
stylestack.push_front(currentstyle);
+ currentstyle.setExtraSpace(16);
//indent = 0;
continue;
}
else if (ent == "sup")
{
currentstyle.setVOffset(-1);
}
else if (ent == "sup")
@@ -795,16 +856,17 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
if (!stylestack.isEmpty())
{
stylestack.pop();
}
}
else if (ent == "pre")
{
isPre = true;
+ currentstyle.setNoJustify();
currentstyle.setMono();
}
else if (ent == "tt")
{
currentstyle.setMono();
}
else if (ent == "b" || ent == "strong")
{
@@ -817,24 +879,27 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
else if (ent == "/u")
{
currentstyle.unsetUnderline();
}
else if (ent == "blockquote")
{
if (ch != '>') ch = skip_ws_end();
ch = 10;
+ currentstyle.setExtraSpace(0);
currentstyle.setLeftMargin(30);
currentstyle.setRightMargin(30);
continue;
}
else if (ent == "br" || ent == "br/")
{
if (ch != '>') ch = skip_ws_end();
ch = 10;
+ currentstyle.setExtraSpace(0);
+ lastch = 0;
continue;
}
else if (ent == "mbp:pagebreak")
{
/*
if (ch != '>') ch = skip_ws_end(pos);
q += 10;
q += QChar(UEOF);
@@ -856,16 +921,17 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
else if (ent == "/center")
{
qDebug("unsetting centre");
forcecentre = false;
}
else if (ent == "li")
{
if (ch != '>') ch = skip_ws_end();
+ lastch = 0;
ch = 10;
if (m_listtype[indent % m_cmaxdepth] == 1)
{
q.setNum(m_ctr[indent % m_cmaxdepth]++);
}
else
{
q += QChar(8226);
@@ -913,54 +979,58 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
else if (ent == "big")
{
currentstyle.setFontSize(2);
}
else if (ent == "/big")
{
currentstyle.setFontSize(0);
}
+ else if (ent[0] == '/' && ent[1] == 'h' && ent.length() == 3 && QString("123456789").find(ent[2]) != -1)
+ {
+ parse_paragraph(currentstyle, ch, pos);
+ currentstyle.setExtraSpace(3);
+ continue;
+ }
else if (ent[0] == 'h' && ent.length() == 2 && QString("123456789").find(ent[1]) != -1)
{
indent = 0;
if (ent[1] == '1')
{
parse_paragraph(currentstyle, ch, pos);
currentstyle.setFontSize(3);
currentstyle.setExtraSpace(8);
currentstyle.setBold();
// currentstyle.setExtraSpace(10);
- continue;
}
else if (ent[1] == '2')
{
parse_paragraph(currentstyle, ch, pos);
currentstyle.setFontSize(2);
currentstyle.setExtraSpace(6);
currentstyle.setBold();
// currentstyle.setExtraSpace(10);
- continue;
}
else if (ent[1] == '3')
{
parse_paragraph(currentstyle, ch, pos);
currentstyle.setFontSize(1);
currentstyle.setExtraSpace(4);
currentstyle.setBold();
// currentstyle.setExtraSpace(10);
- continue;
}
else
{
parse_paragraph(currentstyle, ch, pos);
currentstyle.setExtraSpace(4);
currentstyle.setBold();
// currentstyle.setExtraSpace(10);
- continue;
}
+ ch = 10;
+ continue;
}
else if (ent == "/a")
{
currentstyle.setColour(0,0,0);
currentstyle.setLink(false);
}
@@ -1042,100 +1112,142 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
// ch = 10;
continue;
}
*/
else if (ent[0] == '/' && ent.length() == 3 && ent[1] == 'h' && QString("123456789").find(ent[2]) != -1)
{
currentstyle.unset();
if (ch != '>') ch = skip_ws_end();
- ch = 10;
- continue;
+ //ch = 10;
+ //continue;
}
-
-
-
else if (ent == "table" || ent == "/table")
{
currentstyle.unset();
ignorespace = (ent == "table");
+ if (ent == "table")
+ {
+ if (tablenesteddepth++ == 0) currentstyle.setTable(pos);
+ }
+ else
+ {
+ if (--tablenesteddepth <= 0)
+ {
+ tablenesteddepth = 0;
+ currentstyle.setTable(0xffffffff);
+ }
+ }
if (ch == ' ') ch = skip_ws();
while (ch != '>' && ch != UEOF)
{
QString ent = getname(ch, " =>").lower();
QString attr = getattr(ch);
qDebug("<table>Entity:%s Attr:%s", (const char*)ent, (const char*)attr);
}
if (ch != '>') ch = skip_ws_end();
+ currentstyle.setLeftMargin(6*tablenesteddepth);
+
+
+ lastch = 0; // Anything but 10
ch = 10;
q += '-';
q += QChar(parent->getwidth());
- q += 2;
+ q += 3;
q += '\0';
q += '\0';
q += '\0';
continue;
}
else if (ent == "hr")
{
+ //bool isPageBreak = false;
if (ch == ' ') ch = skip_ws();
- // if (stylestack.isEmpty())
- // {
- currentstyle.unset();
- // }
- /*
- else
- {
- qDebug("Using stack style");
- currentstyle = stylestack.first();
- }
- */
unsigned char red = 0, green = 0, blue = 0;
while (ch != '>' && ch != UEOF)
{
QString ent = getname(ch, " =>").lower();
QString attr = getattr(ch);
if (ent == "color")
{
parse_color(attr, red, green, blue);
}
+ /*
+ if (ent == "size")
+ {
+ if (attr == "0")
+ {
+ isPageBreak = true;
+ }
+ }
+ */
qDebug("<hr>Entity:%s Attr:%s", (const char*)ent, (const char*)attr);
}
if (ch != '>') ch = skip_ws_end();
+ /*
+ if (isPageBreak)
+ {
+ ch = UEOF;
+ }
+ else
+ {
+ */
+ // if (stylestack.isEmpty())
+ // {
+ currentstyle.unset();
+ // }
+ /*
+ else
+ {
+ qDebug("Using stack style");
+ currentstyle = stylestack.first();
+ }
+ */
+ lastch = 0; //Anything but 10 or ' '
ch = 10;
q += '-';
q += QChar(parent->getwidth());
q += 3;
q += red;
q += green;
q += blue;
+
continue;
}
else if (ent == "img")
{
if (ch == ' ') ch = skip_ws();
while (ch != '>' && ch != UEOF)
{
QString ent = getname(ch, " =>").lower();
QString attr = getattr(ch);
qDebug("<img>Entity:%s Attr:%s", (const char*)ent, (const char*)attr);
if (ent == "src")
{
+ /*
if (m_bchm)
{
QImage* img = parent->getPicture(attr);
if (img != NULL)
{
currentstyle.setPicture(true, img);
}
}
+ */
+
+
+ QImage* img = parent->getPicture(attr);
+ if (img != NULL)
+ {
+ currentstyle.setPicture(true, img);
+ }
else
{
QFileInfo f(currentfile);
QFileInfo f1(f.dir(true), attr);
QPixmap pm;
if (pm.load(f1.absFilePath()))
{
QImage* img = new QImage(pm.convertToImage());
@@ -1167,16 +1279,24 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
{
QString nd("/");
skipblock(nd+ent);
}
else if (ent == "metadata")
{
// skipblock("/metadata");
}
+ else if (ent == "title")
+ {
+ skipblock("/title");
+ }
+ else if (ent == "head")
+ {
+ skipblock("/head");
+ }
/*
else if (ent == "metadata")
{
currentstyle.setFontSize(-2);
}
else if (ent == "/metadata")
{
currentstyle.unset();
@@ -1186,16 +1306,19 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
*/
else
{
if (ent[0] != '/')
qDebug("Not handling:%s", (const char*)ent);
}
if (ch != '>') ch = skip_ws_end();
+ if (ent[0] == '/')
+ mygetch(ch, dummy, pos);
+ else
mygetch(ch, dummy, npos);
}
if (ch == '&')
{
mygetch(ch, dummy, npos);
if (ch == '#')
{
int id = 0;
@@ -1229,20 +1352,63 @@ void striphtml::getch(tchar& ch, CStyle& sty, unsigned long& pos)
}
else
{
ch = '.';
}
}
}
// sty = (dummy == ucFontBase) ? currentstyle : dummy;
+ if (lastch == 10 && ch == 10 && sty.getExtraSpace() > currentstyle.getExtraSpace())
+ {
+ currentstyle.setExtraSpace(sty.getExtraSpace());
+ }
sty = currentstyle;
}
- while (!isPre && (lastch == ' ' || lastch == 10 || ignorespace) && ch == ' ');
+ while (!isPre && (((lastch == ' ' || lastch == 10 || ignorespace) && ch == ' ') || ((ch == 10) && (lastch == 10))));
// lastch = ch;
lastch = ch;
return;
}
+QString striphtml::getTableAsHtml(unsigned long loc)
+{
+ qDebug("striphtml::getTableAsHtml");
+ QString ret;
+ tchar ch(0);
+ CStyle sty;
+ unsigned long pos;
+ locate(loc);
+ int endpos(0);
+ QString endmarker("</table>");
+ QString startmarker("<table");
+ int startpos(0);
+ int depth(0);
+ while (ch != UEOF)
+ {
+ parent->getch(ch, sty, pos);
+ QChar qc(ch);
+ ret += qc;
+ if (qc.lower() == endmarker[endpos])
+ {
+ if ((++endpos >= endmarker.length()) && (--depth <= 0)) break;
+ }
+ else
+ {
+ endpos = 0;
+ }
+ if (qc.lower() == startmarker[startpos])
+ {
+ if (++startpos >= startmarker.length()) ++depth;
+ }
+ else
+ {
+ startpos = 0;
+ }
+ }
+ return ret;
+}
+
+
extern "C"
{
CFilter* newfilter(const QString& s) { return new striphtml(s); }
}
diff --git a/noncore/apps/opie-reader/striphtml.h b/noncore/apps/opie-reader/striphtml.h
index 42e2b7e..b1f7c0a 100644
--- a/noncore/apps/opie-reader/striphtml.h
+++ b/noncore/apps/opie-reader/striphtml.h
@@ -4,18 +4,20 @@
#include "CFilter.h"
#include "Navigation.h"
#include "CBuffer.h"
#include "CExpander.h"
#include "my_list.h"
class striphtml : public CFilter
{
+ void reset();
bool ignorespace;
bool m_bchm;
+ int tablenesteddepth;
CList<CStyle> stylestack;
static CNavigation_base<htmlmark> m_nav;
QMap<QString, tchar>* entmap;
CStyle currentstyle;
bool isPre;
unsigned short skip_ws();
unsigned short skip_ws_end();
unsigned short skip_ws_end(unsigned long&);
@@ -84,10 +86,11 @@ class striphtml : public CFilter
f = m.filename();
}
loc = m.posn();
return ret;
}
bool hasnavigation() { return true; }
virtual void locate(unsigned int n);
void setchm(bool _b) { m_bchm = _b; }
+ QString getTableAsHtml(unsigned long loc);
};
#endif
diff --git a/noncore/apps/opie-reader/update-gcc3.sh b/noncore/apps/opie-reader/update-gcc3.sh
deleted file mode 100755
index f604e42..0000000
--- a/noncore/apps/opie-reader/update-gcc3.sh
+++ b/dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-touch infowin.cpp
-for f in *lib.omak; do make -f $f; done
-for f in *.omak; do make -f $f; done
-for f in *.omak; do make -f $f; done
-cp /home/tim/codecreader/opie-reader.desktop $QTDIR/apps/Applications/
-cp /home/tim/codecreader/pics/* $QTDIR/pics/opie-reader/
-cp /home/tim/codecreader/opie-pics/* $QTDIR/pics/opie-reader/
-cp HTMLentities $QTDIR/plugins/reader/data/
-rm $QTDIR/help/html/*reader*.html
-cp /home/tim/codecreader/help/*.html $QTDIR/help/html/
-rm $QTDIR/help/html/*reader*.html
-cp /home/tim/codecreader/help/*.html $QTDIR/help/html/
-rm -f $QTDIR/lib/libreader*.so
-rm -f $QTDIR/lib/libreader*.so.1
-for f in $QTDIR/lib/libreader*.1.0.0 ; do mv -f $f $QTDIR/lib/`basename $f .1.0.0`.1 ; done
-rm -f $QTDIR/lib/libreader*.so.1.*
-
-/home/tim/bin/zstrip.sh $QTDIR/bin/reader
-for f in $QTDIR/lib/libreader* ; do /home/tim/bin/zstrip.sh $f; done
-
-for SUBDIR in codecs support filters
-do
- CDIR=$QTDIR/plugins/reader/$SUBDIR
- rm -f $CDIR/*.so
- for f in $CDIR/*.1.0.0 ; do mv -f $f $CDIR/`basename $f .1.0.0` ; done
- rm -f $CDIR/*.so.*
- for f in $CDIR/*.so ; do /home/tim/bin/zstrip.sh $f ; done
-done
-rm -f opie-reader-gcc3_*.ipk
-rm -f full/opie-reader-gcc3_*.ipk
-rm -f partial/opie-reader-gcc3_*.ipk
-mkipks opie-reader-gcc3.control
-cp opie-reader-gcc3_*.ipk full/
-for f in opie-reader-gcc3_*.ipk
- do
- cp $f full/`basename $f _arm.ipk`-`date +%y%m%d`_arm.ipk
-done
-rm $QTDIR/plugins/reader/support/libpluckerdecompress.so
-rm $QTDIR/plugins/reader/codecs/libArriereGo.so
-rm $QTDIR/plugins/reader/codecs/libNEF.so
-mkipks opie-reader-gcc3.control
-cp opie-reader-gcc3_*.ipk partial/
-for f in opie-reader-gcc3_*.ipk
- do
- cp $f partial/`basename $f _arm.ipk`-`date +%y%m%d`_arm.ipk
-done
diff --git a/noncore/apps/opie-reader/update-opie.sh b/noncore/apps/opie-reader/update-opie.sh
deleted file mode 100755
index 261ef46..0000000
--- a/noncore/apps/opie-reader/update-opie.sh
+++ b/dev/null
@@ -1,45 +0,0 @@
-#!/bin/bash
-touch infowin.cpp
-for f in *lib.zmak; do make -f $f; done
-for f in *.zmak; do make -f $f; done
-for f in *.zmak; do make -f $f; done
-cp /home/tim/codecreader/pics/* $QTDIR/pics/opie-reader/
-cp /home/tim/codecreader/opie-pics/* $QTDIR/pics/opie-reader/
-cp HTMLentities $QTDIR/plugins/reader/data/
-rm $QTDIR/help/html/*reader*.html
-cp /home/tim/codecreader/help/*.html $QTDIR/help/html/
-rm -f $QTDIR/lib/libreader*.so
-rm -f $QTDIR/lib/libreader*.so.1
-for f in $QTDIR/lib/libreader*.1.0.0 ; do mv -f $f $QTDIR/lib/`basename $f .1.0.0`.1 ; done
-rm -f $QTDIR/lib/libreader*.so.1.*
-
-/home/tim/bin/zstrip.sh $QTDIR/bin/uqtreader
-rm -f $QTDIR/bin/reader
-mv $QTDIR/bin/uqtreader $QTDIR/bin/reader
-for f in $QTDIR/lib/libreader* ; do /home/tim/bin/zstrip.sh $f; done
-for SUBDIR in codecs support filters
-do
- CDIR=$QTDIR/plugins/reader/$SUBDIR
- rm -f $CDIR/*.so
- for f in $CDIR/*.1.0.0 ; do mv -f $f $CDIR/`basename $f .1.0.0` ; done
- rm -f $CDIR/*.so.*
- for f in $CDIR/*.so ; do zstrip.sh $f ; done
-done
-rm -f opie-reader-opie_*.ipk
-rm -f full/opie-reader-opie_*.ipk
-rm -f partial/opie-reader-opie_*.ipk
-mkipks opie-reader-opie.control
-cp opie-reader-opie_*.ipk full/
-for f in opie-reader-opie_*.ipk
- do
- cp $f full/`basename $f _arm.ipk`-`date +%y%m%d`_arm.ipk
-done
-rm $QTDIR/plugins/reader/support/libpluckerdecompress.so
-rm $QTDIR/plugins/reader/codecs/libArriereGo.so
-rm $QTDIR/plugins/reader/codecs/libNEF.so
-mkipks opie-reader-opie.control
-cp opie-reader-opie_*.ipk partial/
-for f in opie-reader-opie_*.ipk
- do
- cp $f partial/`basename $f _arm.ipk`-`date +%y%m%d`_arm.ipk
-done
diff --git a/noncore/apps/opie-reader/update.sh b/noncore/apps/opie-reader/update.sh
deleted file mode 100755
index 61b8a5e..0000000
--- a/noncore/apps/opie-reader/update.sh
+++ b/dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-touch infowin.cpp
-for f in *lib.zmak; do make -f $f; done
-for f in *.zmak; do make -f $f; done
-for f in *.zmak; do make -f $f; done
-cp /home/tim/codecreader/uqtreader*.desktop /opt/Qtopia/apps/Applications/
-cp /home/tim/codecreader/pics/* /opt/Qtopia/pics/opie-reader/
-cp /home/tim/codecreader/uqtreader*.desktop $QTDIR/apps/Applications/
-cp /home/tim/codecreader/opie-reader.desktop $QTDIR/apps/Applications/
-cp /home/tim/codecreader/pics/* $QTDIR/pics/opie-reader/
-cp HTMLentities $QTDIR/plugins/reader/data/
-rm $QTDIR/help/html/*reader*.html
-cp /home/tim/codecreader/help/*.html $QTDIR/help/html/
-rm -f $QTDIR/lib/libreader*.so
-rm -f $QTDIR/lib/libreader*.so.1
-for f in $QTDIR/lib/libreader*.1.0.0 ; do mv -f $f $QTDIR/lib/`basename $f .1.0.0`.1 ; done
-rm -f $QTDIR/lib/libreader*.so.1.*
-
-/home/tim/bin/zstrip.sh $QTDIR/bin/uqtreader
-for f in $QTDIR/lib/libreader* ; do /home/tim/bin/zstrip.sh $f; done
-
-for SUBDIR in codecs support filters
-do
- CDIR=$QTDIR/plugins/reader/$SUBDIR
- rm -f $CDIR/*.so
- for f in $CDIR/*.1.0.0 ; do mv -f $f $CDIR/`basename $f .1.0.0` ; done
- rm -f $CDIR/*.so.*
- for f in $CDIR/*.so ; do /home/tim/bin/zstrip.sh $f ; done
-done
-rm -f opie-reader_*.ipk
-rm -f full/opie-reader_*.ipk
-rm -f partial/opie-reader_*.ipk
-mkipks opie-reader.control
-cp opie-reader_*.ipk full/
-for f in opie-reader_*.ipk
- do
- cp $f full/`basename $f _arm.ipk`-`date +%y%m%d`_arm.ipk
-done
-rm $QTDIR/plugins/reader/support/libpluckerdecompress.so
-rm $QTDIR/plugins/reader/codecs/libArriereGo.so
-rm $QTDIR/plugins/reader/codecs/libNEF.so
-mkipks opie-reader.control
-cp opie-reader_*.ipk partial/
-for f in opie-reader_*.ipk
- do
- cp $f partial/`basename $f _arm.ipk`-`date +%y%m%d`_arm.ipk
-done
diff --git a/noncore/apps/opie-reader/usenef.h b/noncore/apps/opie-reader/usenef.h
deleted file mode 100644
index 57898cb..0000000
--- a/noncore/apps/opie-reader/usenef.h
+++ b/dev/null
@@ -1,6 +0,0 @@
-#ifndef __USENEF_H
-#define __USENEF_H
-
-//#define USENEF
-
-#endif
diff --git a/noncore/apps/opie-reader/util.cpp b/noncore/apps/opie-reader/util.cpp
index a736f8b..2ca1cc8 100644
--- a/noncore/apps/opie-reader/util.cpp
+++ b/noncore/apps/opie-reader/util.cpp
@@ -1,9 +1,10 @@
#include "util.h"
+#include <limits.h>
QString filesize(unsigned long l)
{
char units[] = { 'K', 'M', 'G' };
int iu = 0;
while (l > 999 && iu < sizeof(units))
{
l = (l+512)/1024;
@@ -17,18 +18,26 @@ QString filesize(unsigned long l)
return ret;
}
QString percent(unsigned long pos, unsigned long len)
{
unsigned long permil = 0;
if (len != 0)
{
+ if (pos > UINT_MAX/1000)
+ {
+ unsigned long l1 = (len+500)/1000;
+ permil = (pos+l1/2)/l1;
+ }
+ else
+ {
permil = (1000*pos+len/2)/len;
}
+ }
unsigned long percen = permil/10;
unsigned long frac = permil - 10*percen;
return QString::number(percen) + "." + QString::number(frac);
}
QString fmt(unsigned long pos, unsigned long len)
{
QString ret = filesize(pos) + "/" + filesize(len) + " : " + percent(pos,len) +"%";
diff --git a/noncore/apps/opie-reader/util.h b/noncore/apps/opie-reader/util.h
index f831ead..3964b5e 100644
--- a/noncore/apps/opie-reader/util.h
+++ b/noncore/apps/opie-reader/util.h
@@ -1,57 +1,9 @@
#ifndef __UTIL_H
#define __UTIL_H
#include <qstring.h>
-#include <qdir.h>
-#include <stdlib.h>
QString filesize(unsigned long l);
QString percent(unsigned long pos, unsigned long len);
QString fmt(unsigned long pos, unsigned long len);
-
-/**
- * class with utility inline function(s)
- * (in contrast to global functions they become available by just
- * including util.h)
- */
-class QTReaderUtil
-{
- public:
-
- /**
- * searches for a specific direcory inside OpieReader installation
- *
- * @param subdir name of sub directory inside installation directory which is needed
- * @return full path name including that sub directory
- *
- * search order is (on all platforms):
- * - OPIEDIR
- * - QTDIR
- * - READERDIR
- */
- static QString getPluginPath( const char *subdir = "codecs/" )
- {
- QString dirname;
- dirname = getenv("OPIEDIR");
- dirname += "/plugins/reader/";
- dirname += subdir;
- if (QDir(dirname).exists())
- return dirname;
-
- dirname = getenv("QTDIR");
- dirname += "/plugins/reader/";
- dirname += subdir;
- if (QDir(dirname).exists())
- return dirname;
-
- dirname = getenv("READERDIR");
- dirname += "/";
- dirname += subdir;
- if (QDir(dirname).exists())
- return dirname;
-
- return "";
- }
-};
-
#endif
diff --git a/noncore/apps/opie-reader/version.cpp b/noncore/apps/opie-reader/version.cpp
index 9d92abe..aafb3d8 100644
--- a/noncore/apps/opie-reader/version.cpp
+++ b/noncore/apps/opie-reader/version.cpp
@@ -1,29 +1,62 @@
#include "version.h"
#include "names.h"
#include <qmessagebox.h>
-bool CheckVersion(int& major, int& bkmktype, char& minor)
+#include <qmultilineedit.h>
+#include <qlayout.h>
+#include <qtextview.h>
+class versionbox : public QDialog
+{
+public:
+ versionbox(const QString& txt, QWidget* parent = NULL) : QDialog(parent, NULL, true)
+ {
+ setCaption(tr( "New Features" ));
+ QVBoxLayout* v = new QVBoxLayout(this);
+ /*
+ QMultiLineEdit* box = new QMultiLineEdit(this);
+ v->addWidget(box);
+ box->setReadOnly(true);
+ box->setWordWrap(QMultiLineEdit::WidgetWidth);
+ box->setText(txt);
+ */
+ QTextView* box = new QTextView(this);
+ v->addWidget(box);
+ box->setText(txt);
+#ifdef USEQPE
+ showMaximized();
+#endif
+ }
+};
+
+bool CheckVersion(int& major, int& bkmktype, char& minor, QWidget* pnt)
{
if (
(major != MAJOR)
||
(bkmktype != BKMKTYPE)
||
(minor != MINOR)
)
{
major = MAJOR;
bkmktype = BKMKTYPE;
minor = MINOR;
-
- QMessageBox::warning(NULL, PROGNAME,
- "New Features in this version\n\n\n"
- "Relative margin settings\n"
- "Cyrillic hyphenation");
+ versionbox v(
+ "<h2>New Features</h2>"
+ "<h3>Support for custom version of rbmake</h3>"
+ "<h3>Mini scrollbar now acts more like a QT scrollbar.</h3>"
+ "<p>The handle can be dragged to jump to a \"random\" location and tapping to either side of the handle does page up/down</p>"
+ "<p>Line up/down is done by tapping in the margins to either end of the scroll bar (left/right margins for a horizontal scrollbar, top/bottom for a vertical scrollbar).</p>"
+ "<p>The toolbar now stays hidden if you hide it.</p>"
+ "<p>Better support for tables. Tapping on a table brings up a table viewer. The inline display of the linearised table can be toggled using the Inline Table option"
+ ,
+ pnt
+ );
+ v.exec();
return true;
}
else
{
return false;
}
}
diff --git a/noncore/apps/opie-reader/version.h b/noncore/apps/opie-reader/version.h
index dcf0692..486d152 100644
--- a/noncore/apps/opie-reader/version.h
+++ b/noncore/apps/opie-reader/version.h
@@ -1,9 +1,9 @@
#ifndef __VERSION_H
#define __VERSION_H
#define MAJOR 0
#define BKMKTYPE 7
-#define MINOR 'g'
+#define MINOR 'i'
#define RELEASE_TYPE "beta"
#endif
diff --git a/noncore/apps/opie-reader/ztxt.cpp b/noncore/apps/opie-reader/ztxt.cpp
index 35db05e..e04eaa0 100644
--- a/noncore/apps/opie-reader/ztxt.cpp
+++ b/noncore/apps/opie-reader/ztxt.cpp
@@ -62,16 +62,17 @@ unsigned int ztxt::locate()
return currentpos;
}
void ztxt::locate(unsigned int n)
{
if (hasrandomaccess())
{
+ unsuspend();
bufferrec = n / ntohs(hdr0.recordSize) + 1;
if (bufferrec == 1)
{
inflateEnd(&zstream);
}
size_t reclen = recordlength(bufferrec);
if (reclen == 0) return;
gotorecordnumber(bufferrec);
@@ -102,16 +103,17 @@ void ztxt::locate(unsigned int n)
{
home();
while (currentpos < n && getch() != EOF);
}
}
void ztxt::home()
{
+unsuspend();
if (bInit)
{
inflateEnd(&zstream);
}
bInit = true;
size_t reclen = recordlength(1);
gotorecordnumber(1);
fread(compressedtextbuffer, reclen, sizeof(char), fin);
@@ -142,16 +144,17 @@ CList<Bkmk>* ztxt::getbkmklist()
{
UInt16 recno = ntohs(hdr0.bookmarkRecord);
// printf("Bookmarks - record %d contains %d\n", recno, ntohs(hdr0.numBookmarks));
if (recno == 0) return NULL;
CList<Bkmk>* t = new CList<Bkmk>;
+ unsuspend();
size_t cur = ftell(fin);
gotorecordnumber(recno);
for (int i = 0; i < ntohs(hdr0.numBookmarks); i++)
{
zTXTbkmk bkmk;
if (fread(&bkmk, sizeof(bkmk), 1, fin) != 1) break;
// printf("Bookmark number:%d:%.20s\n", i, bkmk.title);
tchar title[MAX_BMRK_LENGTH];