00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
00049
00050
00051
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
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)
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;
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