00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "partmemo.h"
00018 #include "liturl.h"
00019 #include <qlayout.h>
00020 #include <qtoolbar.h>
00021 #include <qaction.h>
00022 #include <qpixmap.h>
00023 #include <qmessagebox.h>
00024 #include <qlineedit.h>
00025 #include <qlabel.h>
00026 #include <qapplication.h>
00027 #include <qsqldatabase.h>
00028 #include <qsqlcursor.h>
00029 #include <qevent.h>
00030 #include <qcombobox.h>
00031 #include <qsettings.h>
00032 #include "error.h"
00033 #include "editorhelper.h"
00034 #include "global.h"
00035 #include "linklistbox.h"
00036 #include "filllinklistbox.h"
00037 #include "mainwindowimpl.h"
00038 #include "pocketreader.h"
00039 #include <qlayout.h>
00040 #include <qprinter.h>
00041 #include <qpainter.h>
00042 #include <qsimplerichtext.h>
00043 #include <qmime.h>
00044 #include <qpaintdevicemetrics.h>
00045 #include <qregexp.h>
00046
00047 PartMemo::PartMemo(LitUrl url, QObject *receiver, QString slot, MainWindow *parent, const char *name): ReadWriteFormBase(url, receiver, slot, parent, name), toolbar(0L) {
00048 partmemoform=new PartMemoForm(this, "partmemoform");
00049 QHBoxLayout *l=new QHBoxLayout(this);
00050 l->addWidget(partmemoform);
00051
00052 QSettings settings;
00053 QString backgr = settings.readEntry(QString("/literature/backgr_")+name, "");
00054 if(!backgr.isEmpty()) partmemoform->setErasePixmap(QPixmap(backgr));
00055
00056 initToolBar();
00057 new EditorHelper(this, partmemoform->memo);
00058 setData();
00059 }
00060
00061 void PartMemo::initToolBar() {
00062 toolbar=new QToolBar(mainWindow());
00063
00064 printAction=new QAction("Print", QIconSet(loadPixmap("print")), "Print", 0, this, "print");
00065 connect(printAction, SIGNAL(activated()), this, SLOT(print()));
00066
00067
00068 prAction=new QAction("Retrieve Text from Pocket Reader", QIconSet(loadPixmap("pen.png")), "Retrieve Text from Pocket Reader", 0, this, "pocketreader");
00069 connect(prAction, SIGNAL(activated()), this, SLOT(pocketReader()));
00070
00071 printAction->addTo(toolbar);
00072 prAction->addTo(toolbar);
00073 toolbar->show();
00074
00075 printAction->addTo(roMenu());
00076 prAction->addTo(roMenu());
00077
00078 }
00079
00080 PartMemo::~PartMemo() {
00081 write();
00082 delete toolbar;
00083 }
00084
00085 bool PartMemo::setData()
00086 {
00087 try {
00088 ReadWriteFormBase::setData();
00089 LitUrl u=url();
00090 setWorkingGui(true);
00091 QSqlQuery query("select publication.title from publication, part where publication.no=part.publication_no and part.no="+no(url()));
00092 Q_ASSERT(query.first());
00093 partmemoform->title->setText(query.value(0).toString());
00094
00095 form.clear();
00096 formcursor.clear();
00097 formcursor.setMode(QSqlCursor::Writable);
00098 formcursor.setName("part");
00099 if(!formcursor.select(u.query()))
00100 throw(Error(formcursor.lastError()));
00101 if(formcursor.size()!=1) throw Error("Invalid Record!");
00102 formcursor.first();
00103 QString no=formcursor.value("no").toString();
00104 form.setRecord(formcursor.primeUpdate());
00105 form.insert(partmemoform->chapterno, "partno");
00106 form.insert(partmemoform->chapter, "title");
00107 form.insert(partmemoform->memo, "memo");
00108 form.insert(partmemoform->modified, "modified");
00109 form.insert(partmemoform->created, "created");
00110 form.readFields();
00111
00112 setValid(true);
00113 } catch(Error &e) {
00114 setValid(false);
00115 setReadonlyGui(true);
00116 QMessageBox::warning(this, "Error", e.message());
00117 return false;
00118 }
00119 setValid(true);
00120 return true;
00121 }
00122
00123 void PartMemo::setWorkingGui(bool work) {
00124 ReadWriteFormBase::setInvalidGui(work);
00125 }
00126
00127 void PartMemo::setReadonlyGui(bool ro) {
00128 ReadWriteFormBase::setReadonlyGui(ro);
00129 partmemoform->memo->setEnabled(!ro);
00130 }
00131
00132 void PartMemo::setInvalidGui(bool inv) {
00133 ReadWriteFormBase::setInvalidGui(inv);
00134 setWorkingGui(false);
00135 setReadonlyGui(inv);
00136 }
00137
00138 void PartMemo::pocketReader() {
00139 PocketReader *pr=new PocketReader();
00140 pr->show();
00141 }
00142
00143 void PartMemo::print() {
00144 Q_ASSERT(partmemoform->memo);
00145 QPrinter printer;
00146 printer.setFullPage( true );
00147 printer.setDocName("Memo");
00148 printer.setCreator("Literature");
00149
00150 if(printer.setup(this)) {
00151 QSqlQuery query("select publication.title, publication.year, part.title, publisher.city, publisher.name from publisher, publication, part where publisher.no=publication.publisher_no and publication.no=part.publication_no and part.no="+no(url()));
00152 Q_ASSERT(query.first());
00153 QString publtitle=query.value(0).toString();
00154 QString year=query.value(1).toString();
00155 QString parttitle=query.value(2).toString();
00156 QString city=query.value(3).toString();
00157 QString publisher=query.value(4).toString();
00158
00159 QString publauthors;
00160 query.exec("select lastname, firstname from author, publication_author, part where publication_author.publication_no=part.publication_no and publication_author.author_no=author.no and part.no="+no(url()));
00161 if(query.first()) {
00162 publauthors=query.value(0).toString()+", "+query.value(1).toString();;
00163 if(query.next()) publauthors+=" et al.";
00164 }
00165
00166 QString partauthors;
00167 query.exec("select lastname, firstname from author, part_author, part where part_author.author_no=author.no and part_author.part_no="+no(url()));
00168 if(query.first()) {
00169 partauthors=query.value(0).toString()+", "+query.value(1).toString();;
00170 if(query.next()) partauthors+=" et al.";
00171 }
00172
00173 QString bib;
00174 if(!partauthors.isEmpty())
00175 bib=partauthors+":"+parttitle+".In:"+publauthors+":"+publtitle+"."+
00176 (city.isEmpty()?QString(""):city+":")+(publisher.isEmpty()?QString(""):publisher+",")+year;
00177 else
00178 bib=(!publauthors.isEmpty()?publauthors+":":QString(""))+publtitle+"."+
00179 (city.isEmpty()?QString(""):city+":")+(publisher.isEmpty()?QString(""):publisher+",")+
00180 year+","+parttitle;
00181 qDebug("PartMemo::print(): bib="+bib);
00182
00183 QPainter p( &printer );
00184 if ( !p.device() ) return;
00185 QPaintDeviceMetrics metrics( p.device() );
00186 int dpix = metrics.logicalDpiX();
00187 int dpiy = metrics.logicalDpiY();
00188 const double margins = 0.5;
00189 const double headermargin = 0.2;
00190 const double pagenumberbox = 0.4;
00191 const double grace=0.2;
00192
00193 QRect header=p.boundingRect(int(margins*dpix), int(margins*dpiy),
00194 int(metrics.width() - 2*margins*dpix),
00195 int(metrics.height() - 2*margins*dpiy),
00196 Qt::AlignLeft | Qt::WordBreak, bib);
00197
00198 QRect body(header.left(),
00199 int(header.bottom()+headermargin*dpiy),
00200 int(metrics.width() - 2*margins*dpix),
00201 int(metrics.height() - header.height()-headermargin*dpiy-pagenumberbox*dpiy-2*margins*dpiy));
00202
00203 QRect pagenumber(int(body.right()-pagenumberbox*dpix), body.bottom(),
00204 int(pagenumberbox*dpix), int(pagenumberbox*dpiy));
00205
00206 QFont font( "times", 12 );
00207 QPen pen(black, 3);
00208
00209 Q_ASSERT(partmemoform);
00210 Q_ASSERT(partmemoform->memo);
00211 QString text=partmemoform->memo->text();
00212
00213
00214
00215 QRect view( body );
00216 int page = 1;
00217 do {
00218 p.setPen(pen);
00219 p.setFont(font);
00220 p.drawText(header, Qt::AlignLeft | Qt::WordBreak, bib);
00221 p.drawLine(header.left(), int(header.bottom()+headermargin*dpiy/2), header.right(), int(header.bottom()+headermargin*dpiy/2));
00222
00223 QString mytext=text;
00224 int margin=text.length();
00225 do {
00226
00227 QSimpleRichText richText( mytext, font, partmemoform->memo->context(), partmemoform->memo->styleSheet(), partmemoform->memo->mimeSourceFactory());
00228 richText.setWidth(&p, body.width());
00229 qDebug("PartMemo::print(): richText.height()="+QString().setNum(richText.height()));
00230 qDebug("PartMemo::print(): body.height()="+QString().setNum(body.height()));
00231 qDebug("PartMemo::print(): body.height()-grace*dpiy="+QString().setNum(int(body.height()-grace*dpiy)));
00232 qDebug("PartMemo::print(): margin="+QString().setNum(margin));
00233
00234 margin/=2;
00235 if(richText.height()>body.height())
00236 mytext=mytext.left(mytext.findRev(QRegExp("\\s|^"), mytext.length()-margin));
00237 else if(int(richText.height()<body.height()-grace*dpiy) && text.length()>mytext.length())
00238 mytext+=text.mid(mytext.length(), text.find(QRegExp("\\s|$"), mytext.length()+margin)-mytext.length());
00239 else break;
00240 }
00241 while(true);
00242
00243 qDebug("PartMemo::print(): text ok, mytext="+mytext);
00244
00245 text=text.right(text.length()-mytext.length());
00246 QSimpleRichText richText( mytext, font, partmemoform->memo->context(), partmemoform->memo->styleSheet(), partmemoform->memo->mimeSourceFactory());
00247 richText.setWidth(&p, body.width());
00248 richText.draw( &p, body.left(), body.top(), body, colorGroup() );
00249
00250 p.setFont( font );
00251 p.drawText(pagenumber, Qt::AlignHCenter|Qt::AlignVCenter, QString::number(page));
00252
00253 if(text.isEmpty()) break;
00254
00255 printer.newPage();
00256 page++;
00257
00258 } while(true);
00259 }
00260 }