Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

partmemo.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *                                                                         *
00003  *   partmemo.cpp                                                                  *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   Read the file COPYING for details.                                    *
00011  *                                                                         *
00012  *   copyright: (C) 2003 by Jan Mueller                                    *
00013  *   email: janmueller7@hotmail.com                                        *
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     //    qDebug("PartMemo::print(): text="+text);
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         // qDebug("PartMemo::print(): mytext="+mytext);
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 }

Generated on Sat Mar 27 19:20:42 2004 for Literature by doxygen 1.3.6-20040222