Scribus Developer Documentation - API
logo-pen

Scribus Developer Documentation - API

scrapbookpalette.cpp

Go to the documentation of this file.
00001 /*
00002 For general Scribus (>=1.3.2) copyright and licensing information please refer
00003 to the COPYING file provided with the program. Following this notice may exist
00004 a copyright and/or license notice that predates the release of Scribus 1.3.2
00005 for which a new license (GPL+exception) is in place.
00006 */
00007 /****************************************************************************
00008 ** Form implementation generated from reading ui file 'Bib.ui'
00009 **
00010 ** Created: Sun Oct 14 19:47:56 2001
00011 **
00012 ****************************************************************************/
00013 #include "scrapbookpalette.h"
00014 
00015 #include <QEvent>
00016 #include <QDataStream>
00017 #include <QApplication>
00018 #include <QHBoxLayout>
00019 #include <QVBoxLayout>
00020 #include <QSpacerItem>
00021 #include <QKeyEvent>
00022 #include <QByteArray>
00023 #include <QPixmap>
00024 #include <QFileDialog>
00025 #include <QUrl>
00026 #include <QDropEvent>
00027 #include <QMenu>
00028 #include <QAction>
00029 #include <QSignalMapper>
00030 #include <QFile>
00031 #include <QFileInfo>
00032 #include <QDomDocument>
00033 #include <QToolButton>
00034 #include <QCursor>
00035 #include <QToolBox>
00036 #include <QMessageBox>
00037 #include <QToolTip>
00038 #include <QPainter>
00039 
00040 #include "scpreview.h"
00041 #include "prefsfile.h"
00042 #include "util.h"
00043 #include "commonstrings.h"
00044 #include "prefsmanager.h"
00045 #include "stencilreader.h"
00046 #include "query.h"
00047 #include "util_icon.h"
00048 //CB TODO bring in the prefsManager instance locally here too
00049 
00050 /* The Scrapbook View Class
00051  * inherited from QListWidget */
00052 BibView::BibView(QWidget* parent) : QListWidget(parent)
00053 {
00054     setDragEnabled(true);
00055     setViewMode(QListView::IconMode);
00056     setFlow(QListView::LeftToRight);
00057     setSortingEnabled(true);
00058     setWrapping(true);
00059     setAcceptDrops(true);
00060     setDropIndicatorShown(true);
00061     setDragDropMode(QAbstractItemView::DragDrop);
00062     setResizeMode(QListView::Adjust);
00063     setSelectionMode(QAbstractItemView::SingleSelection);
00064     setContextMenuPolicy(Qt::CustomContextMenu);
00065     setIconSize(QSize(60, 60));
00066     objectMap.clear();
00067     ScFilename = "";
00068     canWrite = true;
00069 }
00070 
00071  void BibView::startDrag(Qt::DropActions supportedActions)
00072  {
00073     QString dt = objectMap[currentItem()->text()].Data;
00074     QFileInfo fi(dt);
00075     if (fi.suffix().toLower() == "sml")
00076     {
00077         QByteArray cf;
00078         loadRawText(dt, cf);
00079         QString f = QString::fromUtf8(cf.data());
00080         StencilReader *pre = new StencilReader();
00081         dt = pre->createObjects(f);
00082         delete pre;
00083     }
00084     else if (fi.suffix().toLower() == "shape")
00085     {
00086         QByteArray cf;
00087         loadRawText(dt, cf);
00088         QString f = QString::fromUtf8(cf.data());
00089         StencilReader *pre = new StencilReader();
00090         dt = pre->createShape(f);
00091         delete pre;
00092     }
00093     else if (fi.suffix().toLower() == "sce")
00094     {
00095         if ( fi.exists() )
00096         {
00097             QUrl ur(dt);
00098             dt = ur.toString();
00099         }
00100     }
00101     QMimeData *mimeData = new QMimeData;
00102     mimeData->setText(dt);
00103     QDrag *drag = new QDrag(this);
00104     drag->setMimeData(mimeData);
00105     drag->setPixmap(objectMap[currentItem()->text()].Preview);
00106     drag->exec(Qt::CopyAction);
00107     clearSelection();
00108  }
00109  
00110 void BibView::dragEnterEvent(QDragEnterEvent *e)
00111 {
00112     if (e->source() == this)
00113         e->ignore();
00114     else
00115         e->acceptProposedAction();
00116 }
00117 
00118 void BibView::dragMoveEvent(QDragMoveEvent *e)
00119 {
00120     if (e->source() == this)
00121         e->ignore();
00122     else
00123         e->acceptProposedAction();
00124 }
00125 
00126 void BibView::dropEvent(QDropEvent *e)
00127 {
00128     if (e->mimeData()->hasText())
00129     {
00130         e->acceptProposedAction();
00131         if (e->source() == this)
00132             return;
00133         QString nam, tmp = "";
00134         QString text = e->mimeData()->text();
00135         if (text.startsWith("<SCRIBUSELEM"))
00136             emit objDropped(text);
00137     }
00138     else
00139         e->ignore();
00140 }
00141 
00142 void BibView::AddObj(QString name, QString daten, QPixmap Bild)
00143 {
00144     struct Elem DrElem;
00145     DrElem.Data = daten;
00146     DrElem.Preview = Bild;
00147     objectMap.insert(name, DrElem);
00148 }
00149 
00150 void BibView::checkAndChange(QString &text, QString nam, QString dir)
00151 {
00152     QDomDocument docu("scridoc");
00153     docu.setContent(text);
00154     QDomElement elem = docu.documentElement();
00155     QDomNode DOC = elem.firstChild();
00156     bool hasImage = false;
00157     while(!DOC.isNull())
00158     {
00159         QDomElement pg = DOC.toElement();
00160         if(pg.tagName() == "ITEM")
00161         {
00162             PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
00163             if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
00164             {
00165                 QString Pfile = pg.attribute("PFILE");
00166                 QString Pfile2 = pg.attribute("PFILE2","");
00167                 QString Pfile3 = pg.attribute("PFILE3","");
00168                 if (!Pfile.isEmpty())
00169                     hasImage = true;
00170                 if (!Pfile2.isEmpty())
00171                     hasImage = true;
00172                 if (!Pfile3.isEmpty())
00173                     hasImage = true;
00174             }
00175         }
00176         DOC = DOC.nextSibling();
00177     }
00178     QFileInfo fid(nam);
00179     if (hasImage)
00180     {
00181         QDir dd = QDir(dir);
00182         dd.mkdir(QDir::cleanPath(QDir::convertSeparators(dir + "/" + fid.baseName())));
00183     }
00184     QString source = "";
00185     QString target = "";
00186     bool first = true;
00187     DOC = elem.firstChild();
00188     while(!DOC.isNull())
00189     {
00190         QDomElement pg = DOC.toElement();
00191         if(pg.tagName() == "ITEM")
00192         {
00193             if (first)
00194                 pg.setAttribute("ANNAME", fid.baseName());
00195             first = false;
00196             PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
00197             if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
00198             {
00199                 QString Pfile = pg.attribute("PFILE");
00200                 if (!Pfile.isEmpty())
00201                 {
00202                     if (static_cast<bool>(pg.attribute("relativePaths", "0").toInt()))
00203                     {
00204                         QFileInfo pfi2(QDir::cleanPath(QDir::convertSeparators(dir+"/"+Pfile)));
00205                         source = pfi2.absoluteFilePath();
00206                     }
00207                     else
00208                     {
00209                         QFileInfo fi(Pfile);
00210                         source = QDir::cleanPath(QDir::convertSeparators(QDir::homePath()+"/"+Pfile));
00211                     }
00212                     QFileInfo fi(Pfile);
00213                     QString target = QDir::cleanPath(QDir::convertSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
00214                     copyFile(source, target);
00215                     pg.setAttribute("PFILE", fid.baseName() + "/" + fi.fileName());
00216                 }
00217                 QString Pfile2 = pg.attribute("PFILE2","");
00218                 if (!Pfile2.isEmpty())
00219                 {
00220                     if (static_cast<bool>(pg.attribute("relativePaths", "0").toInt()))
00221                     {
00222                         QFileInfo pfi2(QDir::cleanPath(QDir::convertSeparators(dir+"/"+Pfile2)));
00223                         source = pfi2.absoluteFilePath();
00224                     }
00225                     else
00226                     {
00227                         QFileInfo fi(Pfile2);
00228                         source = QDir::cleanPath(QDir::convertSeparators(QDir::homePath()+"/"+Pfile));
00229                     }
00230                     QFileInfo fi(Pfile2);
00231                     QString target = QDir::cleanPath(QDir::convertSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
00232                     copyFile(source, target);
00233                     pg.setAttribute("PFILE2", fid.baseName() + "/" + fi.fileName());
00234                 }
00235                 QString Pfile3 = pg.attribute("PFILE3","");
00236                 if (!Pfile3.isEmpty())
00237                 {
00238                     if (static_cast<bool>(pg.attribute("relativePaths", "0").toInt()))
00239                     {
00240                         QFileInfo pfi2(QDir::cleanPath(QDir::convertSeparators(dir+"/"+Pfile3)));
00241                         source = pfi2.absoluteFilePath();
00242                     }
00243                     else
00244                     {
00245                         QFileInfo fi(Pfile3);
00246                         source = QDir::cleanPath(QDir::convertSeparators(QDir::homePath()+"/"+Pfile3));
00247                     }
00248                     QFileInfo fi(Pfile3);
00249                     QString target = QDir::cleanPath(QDir::convertSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
00250                     copyFile(source, target);
00251                     pg.setAttribute("PFILE3", fid.baseName() + "/" + fi.fileName());
00252                 }
00253                 pg.setAttribute("relativePaths", 1);
00254             }
00255         }
00256         DOC = DOC.nextSibling();
00257     }
00258     QFile f(nam);
00259     if(!f.open(QIODevice::WriteOnly))
00260         return ;
00261     QDataStream s;
00262     QByteArray cs = docu.toByteArray();
00263     s.setDevice(&f);
00264     s.writeRawData(cs.data(), cs.length());
00265     f.close();
00266 }
00267 
00268 void BibView::SaveContents(QString name, QString oldName)
00269 {
00270     QDir d(oldName, "*.sce", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
00271     if ((d.exists()) && (d.count() != 0))
00272     {
00273         for (uint dc = 0; dc < d.count(); ++dc)
00274         {
00275             QByteArray cf;
00276             if (!loadRawText(QDir::cleanPath(QDir::convertSeparators(oldName + "/" + d[dc])), cf))
00277                 continue;
00278             QString ff = QString::fromUtf8(cf.data());
00279             QPixmap pm;
00280             QFileInfo fi(QDir::cleanPath(QDir::convertSeparators(oldName + "/" + d[dc])));
00281             QFileInfo fi2(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00282             if (fi2.exists())
00283                 pm.load(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00284             else
00285             {
00286                 QString f;
00287                 if (cf.left(16) == "<SCRIBUSELEMUTF8")
00288                     f = QString::fromUtf8(cf.data());
00289                 else
00290                     f = cf.data();
00291                 ScPreview *pre = new ScPreview();
00292                 pm = pre->createPreview(f);
00293                 delete pre;
00294             }
00295             QFileInfo fi3(QDir::cleanPath(QDir::convertSeparators(name + "/" + d[dc])));
00296             pm.save(QDir::cleanPath(QDir::convertSeparators(fi3.path()+"/"+fi3.baseName()+".png")), "PNG");
00297             checkAndChange(ff, QDir::cleanPath(QDir::convertSeparators(name + "/" + d[dc])), QDir::cleanPath(QDir::convertSeparators(name)));
00298         }
00299     }
00300     QDir d2(oldName, "*.sml", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
00301     if ((d2.exists()) && (d2.count() != 0))
00302     {
00303         for (uint dc = 0; dc < d2.count(); ++dc)
00304         {
00305             QByteArray cf;
00306             if (!loadRawText(QDir::cleanPath(QDir::convertSeparators(oldName + "/" + d2[dc])), cf))
00307                 continue;
00308             QFile fil(QDir::cleanPath(QDir::convertSeparators(name + "/" + d2[dc])));
00309             if(!fil.open(QIODevice::WriteOnly))
00310                 continue ;
00311             QDataStream s(&fil);
00312             s.writeRawData(cf.data(), cf.length());
00313             fil.close();
00314             QPixmap pm;
00315             QFileInfo fi(QDir::cleanPath(QDir::convertSeparators(oldName + "/" + d2[dc])));
00316             QFileInfo fi2(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00317             if (fi2.exists())
00318                 pm.load(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00319             else
00320             {
00321                 QString f = QString::fromUtf8(cf.data());
00322                 StencilReader *pre = new StencilReader();
00323                 pm = pre->createPreview(f);
00324                 delete pre;
00325             }
00326             QFileInfo fi3(QDir::cleanPath(QDir::convertSeparators(name + "/" + d2[dc])));
00327             pm.save(QDir::cleanPath(QDir::convertSeparators(fi3.path()+"/"+fi3.baseName()+".png")), "PNG");
00328         }
00329     }
00330     QDir d3(name, "*.shape", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
00331     if ((d3.exists()) && (d3.count() != 0))
00332     {
00333         for (uint dc = 0; dc < d3.count(); ++dc)
00334         {
00335             QByteArray cf;
00336             if (!loadRawText(QDir::cleanPath(QDir::convertSeparators(oldName + "/" + d3[dc])), cf))
00337                 continue;
00338             QFile fil(QDir::cleanPath(QDir::convertSeparators(name + "/" + d3[dc])));
00339             if(!fil.open(QIODevice::WriteOnly))
00340                 continue ;
00341             QDataStream s(&fil);
00342             s.writeRawData(cf.data(), cf.length());
00343             fil.close();
00344             QPixmap pm;
00345             QFileInfo fi(QDir::cleanPath(QDir::convertSeparators(oldName + "/" + d3[dc])));
00346             QFileInfo fi2(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00347             if (fi2.exists())
00348                 pm.load(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00349             else
00350             {
00351                 QString f = QString::fromUtf8(cf.data());
00352                 StencilReader *pre = new StencilReader();
00353                 QString f2 = pre->createShape(f);
00354                 ScPreview *pre2 = new ScPreview();
00355                 pm = pre2->createPreview(f2);
00356                 delete pre;
00357                 delete pre2;
00358             }
00359             QFileInfo fi3(QDir::cleanPath(QDir::convertSeparators(name + "/" + d3[dc])));
00360             pm.save(QDir::cleanPath(QDir::convertSeparators(fi3.path()+"/"+fi3.baseName()+".png")), "PNG");
00361         }
00362     }
00363 }
00364 
00365 void BibView::ReadOldContents(QString name, QString newName)
00366 {
00367     bool isUtf8 = false;
00368     QDomDocument docu("scridoc");
00369     QString ff;
00370     QByteArray cf;
00371     if (!loadRawText(name, cf))
00372         return;
00373     if( cf.left(17) == "<SCRIBUSSCRAPUTF8")
00374     {
00375         ff = QString::fromUtf8(cf.data());
00376         isUtf8 = true;
00377     }
00378     else
00379         ff = QString::fromLocal8Bit(cf.data());
00380     if(!docu.setContent(ff))
00381         return;
00382     QDomElement elem=docu.documentElement();
00383     if ((elem.tagName() != "SCRIBUSSCRAP") && (elem.tagName() != "SCRIBUSSCRAPUTF8"))
00384         return;
00385     QDomNode DOC=elem.firstChild();
00386     while(!DOC.isNull())
00387     {
00388         QDomElement dc=DOC.toElement();
00389         if (dc.tagName()=="OBJEKT")
00390         {
00391             QFile fi(QDir::cleanPath(QDir::convertSeparators(newName + "/" + GetAttr(&dc, "NAME") + ".sce")));
00392             if(!fi.open(QIODevice::WriteOnly))
00393                 continue ;
00394             QDataStream s(&fi);
00395             QString fn = GetAttr(&dc, "DATA");
00396             cf = isUtf8? fn.toUtf8() : fn.toLocal8Bit();
00397             s.writeRawData(cf.data(), cf.length());
00398             fi.close();
00399         }
00400         DOC=DOC.nextSibling();
00401     }
00402 }
00403 
00404 void BibView::ReadContents(QString name)
00405 {
00406     clear();
00407     objectMap.clear();
00408     QString nd;
00409     if (name.endsWith(QDir::convertSeparators("/")))
00410         nd = name.left(name.length()-1);
00411     QDir d(name, "*.sce", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
00412     if ((d.exists()) && (d.count() != 0))
00413     {
00414         for (uint dc = 0; dc < d.count(); ++dc)
00415         {
00416             QPixmap pm;
00417             QByteArray cf;
00418             if (!loadRawText(QDir::cleanPath(QDir::convertSeparators(name + "/" + d[dc])), cf))
00419                 continue;
00420             QFileInfo fi(QDir::cleanPath(QDir::convertSeparators(name + "/" + d[dc])));
00421             QFileInfo fi2(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00422             if (fi2.exists())
00423                 pm.load(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00424             else
00425             {
00426                 QString f;
00427                 if (cf.left(16) == "<SCRIBUSELEMUTF8")
00428                     f = QString::fromUtf8(cf.data());
00429                 else
00430                     f = cf.data();
00431                 ScPreview *pre = new ScPreview();
00432                 pm = pre->createPreview(f);
00433                 if (canWrite)
00434                     pm.save(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")), "PNG");
00435                 delete pre;
00436             }
00437             AddObj(fi.baseName(), QDir::cleanPath(QDir::convertSeparators(name + "/" + d[dc])), pm);
00438         }
00439     }
00440     QDir d2(name, "*.sml", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
00441     if ((d2.exists()) && (d2.count() != 0))
00442     {
00443         for (uint dc = 0; dc < d2.count(); ++dc)
00444         {
00445             QPixmap pm;
00446             QByteArray cf;
00447             if (!loadRawText(QDir::cleanPath(QDir::convertSeparators(name + "/" + d2[dc])), cf))
00448                 continue;
00449             QFileInfo fi(QDir::cleanPath(QDir::convertSeparators(name + "/" + d2[dc])));
00450             QFileInfo fi2(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00451             if (fi2.exists())
00452                 pm.load(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00453             else
00454             {
00455                 QString f = QString::fromUtf8(cf.data());
00456                 StencilReader *pre = new StencilReader();
00457                 pm = pre->createPreview(f);
00458                 if (canWrite)
00459                     pm.save(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")), "PNG");
00460                 delete pre;
00461             }
00462             AddObj(fi.baseName(), QDir::cleanPath(QDir::convertSeparators(name + "/" + d2[dc])), pm);
00463         }
00464     }
00465     QDir d3(name, "*.shape", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
00466     if ((d3.exists()) && (d3.count() != 0))
00467     {
00468         for (uint dc = 0; dc < d3.count(); ++dc)
00469         {
00470             QPixmap pm;
00471             QByteArray cf;
00472             if (!loadRawText(QDir::cleanPath(QDir::convertSeparators(name + "/" + d3[dc])), cf))
00473                 continue;
00474             QFileInfo fi(QDir::cleanPath(QDir::convertSeparators(name + "/" + d3[dc])));
00475             QFileInfo fi2(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00476             QFileInfo fi2p(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".xpm")));
00477             if ((fi2.exists()) || (fi2p.exists()))
00478             {
00479                 if (fi2.exists())
00480                     pm.load(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")));
00481                 else
00482                     pm.load(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".xpm")));
00483             }
00484             else
00485             {
00486                 QString f = QString::fromUtf8(cf.data());
00487                 StencilReader *pre = new StencilReader();
00488                 QString f2 = pre->createShape(f);
00489                 ScPreview *pre2 = new ScPreview();
00490                 pm = pre2->createPreview(f2);
00491                 if (canWrite)
00492                     pm.save(QDir::cleanPath(QDir::convertSeparators(fi.path()+"/"+fi.baseName()+".png")), "PNG");
00493                 delete pre;
00494                 delete pre2;
00495             }
00496             AddObj(fi.baseName(), QDir::cleanPath(QDir::convertSeparators(name + "/" + d3[dc])), pm);
00497         }
00498     }
00499     QMap<QString,Elem>::Iterator itf;
00500     for (itf = objectMap.begin(); itf != objectMap.end(); ++itf)
00501     {
00502         if (itf.value().Preview.width() > 60)
00503             itf.value().Preview = itf.value().Preview.scaledToWidth(60, Qt::SmoothTransformation);
00504         if (itf.value().Preview.height() > 60)
00505             itf.value().Preview = itf.value().Preview.scaledToHeight(60, Qt::SmoothTransformation);
00506         QPixmap pm(60, 60);
00507         pm.fill(palette().color(QPalette::Base));
00508         QPainter p;
00509         p.begin(&pm);
00510         p.drawPixmap(30 - itf.value().Preview.width() / 2, 30 - itf.value().Preview.height() / 2, itf.value().Preview);
00511         p.end();
00512         new QListWidgetItem(QIcon(pm), itf.key(), this);
00513     }
00514     sortItems();
00515 }
00516 
00517 /* This is the main Dialog-Class for the Scrapbook */
00518 Biblio::Biblio( QWidget* parent) : ScrPaletteBase( parent, "Sclib", false, 0 )
00519 {
00520     resize( 230, 190 );
00521     BiblioLayout = new QVBoxLayout( this );
00522     BiblioLayout->setSpacing( 0 );
00523     BiblioLayout->setMargin( 0 );
00524 
00525     buttonLayout = new QHBoxLayout;
00526     buttonLayout->setSpacing( 5 );
00527     buttonLayout->setMargin( 0 );
00528     newButton = new QToolButton(this);
00529     newButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
00530     newButton->setIcon(loadIcon("16/document-new.png"));
00531     newButton->setIconSize(QSize(16, 16));
00532     loadButton = new QToolButton(this);
00533     loadButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
00534     loadButton->setIcon(loadIcon("16/document-open.png"));
00535     loadButton->setIconSize(QSize(16, 16));
00536     saveAsButton = new QToolButton(this);
00537     saveAsButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
00538     saveAsButton->setIcon(loadIcon("16/document-save-as.png"));
00539     saveAsButton->setIconSize(QSize(16, 16));
00540     importButton = new QToolButton(this);
00541     importButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
00542     importButton->setIcon(loadIcon("compfile16.png"));
00543     importButton->setIconSize(QSize(16, 16));
00544     closeButton = new QToolButton(this);
00545     closeButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
00546     closeButton->setIcon(loadIcon("16/close.png"));
00547     closeButton->setIconSize(QSize(16, 16));
00548     buttonLayout->addWidget( newButton );
00549     buttonLayout->addWidget( loadButton );
00550     buttonLayout->addWidget( saveAsButton );
00551     buttonLayout->addWidget( importButton );
00552     buttonLayout->addWidget( closeButton );
00553     QSpacerItem* spacer = new QSpacerItem( 1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum );
00554     buttonLayout->addItem( spacer );
00555     BiblioLayout->addLayout( buttonLayout );
00556 
00557     Frame3 = new QToolBox( this );
00558     activeBView = new BibView(this);
00559     Frame3->addItem(activeBView, tr("Main"));
00560     tempBView = new BibView(this);
00561     Frame3->addItem(tempBView, tr("Copied Items"));
00562     tempCount = 0;
00563     actItem = 0;
00564     BiblioLayout->addWidget( Frame3 );
00565 
00566     languageChange();
00567 
00568     connect(newButton, SIGNAL(clicked()), this, SLOT(NewLib()));
00569     connect(loadButton, SIGNAL(clicked()), this, SLOT(Load()));
00570     connect(saveAsButton, SIGNAL(clicked()), this, SLOT(SaveAs()));
00571     connect(importButton, SIGNAL(clicked()), this, SLOT(Import()));
00572     connect(closeButton, SIGNAL(clicked()), this, SLOT(closeLib()));
00573     connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00574 }
00575 
00576 void Biblio::setOpenScrapbooks(QStringList &fileNames)
00577 {
00578     disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00579     disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00580     disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00581     disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00582     for (int rd = 0; rd < fileNames.count(); ++rd)
00583     {
00584         QString fileName = fileNames[rd];
00585         if (!fileName.isEmpty())
00586         {
00587             QDir d(fileName);
00588             activeBView = new BibView(this);
00589             QFileInfo fd(fileName);
00590             activeBView->canWrite = fd.isWritable();
00591             activeBView->setAcceptDrops(activeBView->canWrite);
00592             if (activeBView->canWrite)
00593                 Frame3->addItem(activeBView, d.dirName());
00594             else
00595                 Frame3->addItem(activeBView, QIcon(loadIcon("16/lock.png")), d.dirName());
00596             activeBView->ReadContents(fileName);
00597             activeBView->ScFilename = fileName;
00598             activeBView->scrollToTop();
00599         }
00600     }
00601     activeBView = (BibView*)Frame3->widget(0);
00602     Frame3->setCurrentIndex(0);
00603     connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00604     connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00605     connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00606     connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00607 }
00608 
00609 QStringList Biblio::getOpenScrapbooks()
00610 {
00611     QStringList ret;
00612     ret.clear();
00613     if (Frame3->count() > 2) // omit the first 2 Tabs since they contain the main and temp scrapbook
00614     {
00615         for (int a = 2; a < Frame3->count(); a++)
00616         {
00617             BibView* bv = (BibView*)Frame3->widget(a);
00618             ret.append(bv->ScFilename);
00619         }
00620     }
00621     return ret;
00622 }
00623 
00624 void Biblio::setScrapbookFileName(QString fileName)
00625 {
00626     activeBView->ScFilename=fileName;
00627 }
00628 
00629 const QString Biblio::getScrapbookFileName()
00630 {
00631     return activeBView->ScFilename;
00632 }
00633 
00634 const int Biblio::objectCount()
00635 {
00636     return activeBView->objectMap.count();
00637 }
00638 
00639 void Biblio::readOldContents(QString fileName, QString newName)
00640 {
00641     activeBView->ReadOldContents(fileName, newName);
00642     activeBView->scrollToTop();
00643 }
00644 
00645 void Biblio::readContents(QString fileName)
00646 {
00647     activeBView->ReadContents(fileName);
00648 }
00649 
00650 void Biblio::readTempContents(QString fileName)
00651 {
00652     tempBView->ReadContents(fileName);
00653     tempBView->ScFilename = fileName;
00654     tempCount = tempBView->objectMap.count();
00655 }
00656 
00657 void Biblio::installEventFilter(QObject *filterObj)
00658 {
00659     ScrPaletteBase::installEventFilter(filterObj);
00660     activeBView->installEventFilter(filterObj);
00661     tempBView->installEventFilter(filterObj);
00662 }
00663 
00664 void Biblio::NewLib()
00665 {
00666     PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
00667     QString fileName = QFileDialog::getExistingDirectory(this, tr("Choose a Scrapbook Directory"), dirs->get("scrap_load", "."));
00668     if (!fileName.isEmpty())
00669     {
00670         for (int a = 0; a < Frame3->count(); a++)
00671         {
00672             BibView* bv = (BibView*)Frame3->widget(a);
00673             if (fileName == bv->ScFilename)
00674                 return;
00675         }
00676         disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00677         disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00678         disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00679         disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00680         QDir d(fileName);
00681         activeBView = new BibView(this);
00682         Frame3->addItem(activeBView, d.dirName());
00683         activeBView->ScFilename = fileName;
00684         Frame3->setCurrentWidget(activeBView);
00685         d.cdUp();
00686         dirs->set("scrap_load", d.absolutePath());
00687         connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00688         connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00689         connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00690         connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00691     }
00692 }
00693 
00694 void Biblio::Load()
00695 {
00696     PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
00697     QString fileName = QFileDialog::getExistingDirectory(this, tr("Choose a Scrapbook Directory"), dirs->get("scrap_load", "."));
00698     if (!fileName.isEmpty())
00699     {
00700         for (int a = 0; a < Frame3->count(); a++)
00701         {
00702             BibView* bv = (BibView*)Frame3->widget(a);
00703             if (fileName == bv->ScFilename)
00704                 return;
00705         }
00706         disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00707         disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00708         disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00709         disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00710         QDir d(fileName);
00711         activeBView = new BibView(this);
00712         QFileInfo fd(fileName);
00713         activeBView->canWrite = fd.isWritable();
00714         activeBView->setAcceptDrops(activeBView->canWrite);
00715         if (activeBView->canWrite)
00716             Frame3->addItem(activeBView, d.dirName());
00717         else
00718             Frame3->addItem(activeBView, QIcon(loadIcon("16/lock.png")), d.dirName());
00719         activeBView->ReadContents(fileName);
00720         activeBView->ScFilename = fileName;
00721         Frame3->setCurrentWidget(activeBView);
00722         d.cdUp();
00723         dirs->set("scrap_load", d.absolutePath());
00724         activeBView->scrollToTop();
00725         connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00726         connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00727         connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00728         connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00729     }
00730 }
00731 
00732 void Biblio::Import()
00733 {
00734     PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
00735     QString s = QFileDialog::getOpenFileName(this,
00736                                              tr("Choose a scrapbook file to import"),
00737                                              dirs->get("old_scrap_load", "."),
00738                                              tr("Scrapbook (*.scs *.SCS)"));
00739     
00740     if (!s.isEmpty())
00741     {
00742         dirs->set("old_scrap_load", s.left(s.lastIndexOf(QDir::convertSeparators("/"))));
00743         
00744         QString scrapbookFileO = s;
00745         QFileInfo scrapbookFileInfoO = QFileInfo(scrapbookFileO);
00746         if (scrapbookFileInfoO.exists())
00747         {
00748             readOldContents(scrapbookFileO, activeBView->ScFilename);
00749             readContents(activeBView->ScFilename);
00750         }
00751         activeBView->scrollToTop();
00752     }
00753 }
00754 
00755 void Biblio::SaveAs()
00756 {
00757     PrefsContext* dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
00758     QString fn = QFileDialog::getExistingDirectory(this, tr("Choose a Directory"), dirs->get("scrap_saveas", "."));
00759     if (!fn.isEmpty())
00760     {
00761         for (int a = 0; a < Frame3->count(); a++)
00762         {
00763             BibView* bv = (BibView*)Frame3->widget(a);
00764             if (fn == bv->ScFilename)
00765                 return;
00766         }
00767         QDir d(fn);
00768         dirs->set("scrap_saveas", fn);
00769         activeBView->SaveContents(fn, activeBView->ScFilename);
00770         d.cdUp();
00771         dirs->set("scrap_saveas", d.absolutePath());
00772     }
00773 }
00774 
00775 void Biblio::closeLib()
00776 {
00777     if (Frame3->count() == 2)
00778         close();
00779     if ((Frame3->currentIndex() == 0) || (Frame3->currentIndex() == 1))
00780         return;
00781     else
00782     {
00783         disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00784         disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00785         disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00786         disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00787         Frame3->removeItem(Frame3->indexOf(activeBView));
00788         delete activeBView;  // currently disabled as the whole TabWidget vanishes when executing that delete????? -> seems to be fixed in Qt-4.3.3
00789         activeBView = (BibView*)Frame3->widget(0);
00790         Frame3->setCurrentIndex(0);
00791         connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
00792         connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00793         connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00794         connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00795     }
00796 }
00797 
00798 void Biblio::libChanged(int index)
00799 {
00800     disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00801     disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00802     disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00803     activeBView = (BibView*)Frame3->widget(index);
00804     connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(ObjFromMenu(QString)));
00805     connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(HandleMouse(QPoint)));
00806     connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
00807 }
00808 
00809 void Biblio::handleDoubleClick(QListWidgetItem *ite)
00810 {
00811     emit pasteToActualPage(ite->text());
00812     activeBView->clearSelection();
00813     actItem = 0;
00814 }
00815 
00816 void Biblio::handlePasteToPage()
00817 {
00818     emit pasteToActualPage(actItem->text());
00819     activeBView->clearSelection();
00820     actItem = 0;
00821 }
00822 
00823 void Biblio::HandleMouse(QPoint p)
00824 {
00825     QListWidgetItem *ite = activeBView->itemAt(p);
00826     if (ite != 0)
00827     {
00828         actItem = ite;
00829         QMenu *pmenu = new QMenu();
00830         QAction* renAct;
00831         QAction* delAct;
00832         QAction* pasteAct = pmenu->addAction( tr("Paste to Page"));
00833         connect(pasteAct, SIGNAL(triggered()), this, SLOT(handlePasteToPage()));
00834         if (activeBView->canWrite)
00835         {
00836             renAct = pmenu->addAction( tr("Rename"));
00837             connect(renAct, SIGNAL(triggered()), this, SLOT(renameObj()));
00838             delAct = pmenu->addAction( tr("Delete"));
00839             connect(delAct, SIGNAL(triggered()), this, SLOT(deleteObj()));
00840         }
00841         QSignalMapper *signalMapper = new QSignalMapper(this);
00842         connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(copyObj(int)));
00843         QMenu *pmenu2 = new QMenu( tr("Copy To:"));
00844         QMenu *pmenu3 = new QMenu( tr("Move To:"));
00845         QSignalMapper *signalMapper2 = new QSignalMapper(this);
00846         connect(signalMapper2, SIGNAL(mapped(int)), this, SLOT(moveObj(int)));
00847         for (int a = 0; a < Frame3->count(); a++)
00848         {
00849             BibView* bv = (BibView*)Frame3->widget(a);
00850             if (bv != activeBView)
00851             {
00852                 if (bv->canWrite)
00853                 {
00854                     QAction *action = pmenu2->addAction(Frame3->itemText(Frame3->indexOf(Frame3->widget(a))));
00855                     connect(action, SIGNAL(triggered()), signalMapper, SLOT(map()));
00856                     signalMapper->setMapping(action, a);
00857                     if (activeBView->canWrite)
00858                     {
00859                         QAction *action2 = pmenu3->addAction(Frame3->itemText(Frame3->indexOf(Frame3->widget(a))));
00860                         connect(action2, SIGNAL(triggered()), signalMapper2, SLOT(map()));
00861                         signalMapper2->setMapping(action2, a);
00862                     }
00863                 }
00864             }
00865         }
00866         pmenu->addMenu(pmenu2);
00867         if (activeBView->canWrite)
00868             pmenu->addMenu(pmenu3);
00869         qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
00870         pmenu->exec(QCursor::pos());
00871         delete pmenu;
00872         delete pmenu2;
00873         delete signalMapper;
00874         if (activeBView->canWrite)
00875         {
00876             delete pmenu3;
00877             delete signalMapper2;
00878         }
00879     }
00880     else
00881     {
00882         QMenu *pmenu = new QMenu();
00883         QAction* delAct;
00884         QAction* saveAct;
00885         QAction* closeAct;
00886         if (activeBView->objectMap.count() != 0)
00887         {
00888             saveAct = pmenu->addAction( tr("Save as..."));
00889             connect(saveAct, SIGNAL(triggered()), this, SLOT(SaveAs()));
00890         }
00891         closeAct = pmenu->addAction( tr("Close"));
00892         if ((activeBView->canWrite) && (activeBView->objectMap.count() != 0))
00893         {
00894             delAct = pmenu->addAction( tr("Delete Contents"));
00895             connect(delAct, SIGNAL(triggered()), this, SLOT(deleteAllObj()));
00896         }
00897         connect(closeAct, SIGNAL(triggered()), this, SLOT(closeLib()));
00898         qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
00899         pmenu->exec(QCursor::pos());
00900         delete pmenu;
00901     }
00902     activeBView->clearSelection();
00903     actItem = 0;
00904 }
00905 
00906 bool Biblio::copyObj(int id)
00907 {
00908     QListWidgetItem *ite = actItem;
00909     QString nam = ite->text();
00910     BibView* bv = (BibView*)Frame3->widget(id);
00911     if (bv->objectMap.contains(nam))
00912     {
00913         Query *dia = new Query(this, "tt", 1, 0, tr("&Name:"), tr("New Entry"));
00914         dia->setEditText(nam, true);
00915         if (dia->exec())
00916         {
00917             nam = dia->getEditText();
00918             while (activeBView->objectMap.contains(nam))
00919             {
00920                 if (!dia->exec())
00921                 {
00922                     delete dia;
00923                     return false;
00924                 }
00925                 nam = dia->getEditText();
00926             }
00927         }
00928         else
00929         {
00930             delete dia;
00931             return false;
00932         }
00933     }
00934     QPixmap pm;
00935     QByteArray cf;
00936     if (!loadRawText(QDir::cleanPath(activeBView->objectMap[ite->text()].Data), cf))
00937         return false;
00938     pm = activeBView->objectMap[ite->text()].Preview;
00939     QString dt = activeBView->objectMap[ite->text()].Data;
00940     QFileInfo fi(dt);
00941     QFile f(QDir::cleanPath(QDir::convertSeparators(bv->ScFilename + "/" + nam + "." + fi.completeSuffix().toLower())));
00942     if(!f.open(QIODevice::WriteOnly))
00943         return false;
00944     QDataStream s;
00945     s.setDevice(&f);
00946     s.writeRawData(cf.data(), cf.length());
00947     f.close();
00948     bv->AddObj(nam, QDir::cleanPath(QDir::convertSeparators(bv->ScFilename + "/" + nam + "." + fi.completeSuffix().toLower())), pm);
00949     pm.save(QDir::cleanPath(QDir::convertSeparators(bv->ScFilename + "/" + nam +".png")), "PNG");
00950     QFileInfo fiD(QDir::convertSeparators(activeBView->ScFilename + "/" + fi.baseName()));
00951     if ((fiD.exists()) && (fiD.isDir()))
00952     {
00953         QDir dd = QDir(QDir::cleanPath(QDir::convertSeparators(bv->ScFilename)));
00954         dd.mkdir(QDir::cleanPath(QDir::convertSeparators(bv->ScFilename + "/" + nam)));
00955         QDir d(QDir::convertSeparators(activeBView->ScFilename + "/" + fi.baseName()), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
00956         if ((d.exists()) && (d.count() != 0))
00957         {
00958             for (uint dc = 0; dc < d.count(); ++dc)
00959             {
00960                 QString source = QDir::cleanPath(QDir::convertSeparators(activeBView->ScFilename + "/" + fi.baseName() + "/" + d[dc]));
00961                 QString target = QDir::cleanPath(QDir::convertSeparators(bv->ScFilename + "/" + nam + "/" + d[dc]));
00962                 copyFile(source, target);
00963             }
00964         }
00965         if (fiD.baseName() != nam)
00966             adjustReferences(QDir::convertSeparators(bv->ScFilename + "/" + nam + "." + fi.completeSuffix().toLower()));
00967     }
00968     if (pm.width() > 60)
00969         pm = pm.scaledToWidth(60, Qt::SmoothTransformation);
00970     if (pm.height() > 60)
00971         pm = pm.scaledToHeight(60, Qt::SmoothTransformation);
00972     QPixmap pm2(60, 60);
00973     pm2.fill(palette().color(QPalette::Base));
00974     QPainter p;
00975     p.begin(&pm2);
00976     p.drawPixmap(30 - pm.width() / 2, 30 - pm.height() / 2, pm);
00977     p.end();
00978     new QListWidgetItem(QIcon(pm), nam, bv);
00979     if (bv == tempBView)
00980     {
00981         tempCount++;
00982         if (tempBView->objectMap.count