1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7
8 #include "scrapbookpalette.h"
9
10 #include <QAction>
11 #include <QApplication>
12 #include <QByteArray>
13 #include <QCursor>
14 #include <QDataStream>
15 #include <QDomDocument>
16 #include <QDrag>
17 #include <QDropEvent>
18 #include <QEvent>
19 #include <QFile>
20 #include <QFileDialog>
21 #include <QFileInfo>
22 #include <QHBoxLayout>
23 #include <QKeyEvent>
24 #include <QMenu>
25 #include <QMessageBox>
26 #include <QMimeData>
27 #include <QPainter>
28 #include <QPixmap>
29 #include <QProgressDialog>
30 #include <QSet>
31 #include <QSignalMapper>
32 #include <QSpacerItem>
33 #include <QToolBox>
34 #include <QToolButton>
35 #include <QToolTip>
36 #include <QUrl>
37 #include <QVBoxLayout>
38
39 #include "cmsettings.h"
40 #include "commonstrings.h"
41 #include "fileloader.h"
42 #include "filewatcher.h"
43 #include "iconmanager.h"
44 #include "loadsaveplugin.h"
45 #include "plugins/formatidlist.h"
46 #include "prefsfile.h"
47 #include "prefsmanager.h"
48 #include "query.h"
49 #include "scimage.h"
50 #include "scpaths.h"
51 #include "scpreview.h"
52 #include "scribusapp.h"
53 #include "scribuscore.h"
54 #include "util.h"
55 #include "util_color.h"
56 #include "util_file.h"
57 #include "util_formats.h"
58
59 //CB TODO bring in the prefsManager instance locally here too
60
61 /* The Scrapbook View Class
62 * inherited from QListWidget */
BibView(QWidget * parent)63 BibView::BibView(QWidget* parent) : QListWidget(parent)
64 {
65 setDragEnabled(true);
66 setViewMode(QListView::IconMode);
67 setFlow(QListView::LeftToRight);
68 // setSortingEnabled(true);
69 setWrapping(true);
70 setAcceptDrops(true);
71 setDropIndicatorShown(true);
72 setDragDropMode(QAbstractItemView::DragDrop);
73 setResizeMode(QListView::Adjust);
74 setSelectionMode(QAbstractItemView::SingleSelection);
75 setContextMenuPolicy(Qt::CustomContextMenu);
76 setIconSize(QSize(60, 60));
77 setGridSize(QSize(70, 80));
78 setSpacing(10);
79 setTextElideMode(Qt::ElideMiddle);
80 objectMap.clear();
81 ScFilename = "";
82 visibleName = "";
83 canWrite = true;
84 }
85
startDrag(Qt::DropActions supportedActions)86 void BibView::startDrag(Qt::DropActions supportedActions)
87 {
88 QStringList vectorFiles = LoadSavePlugin::getExtensionsForPreview(FORMATID_FIRSTUSER);
89 QString formatD(FormatsManager::instance()->extensionListForFormat(FormatsManager::RASTORIMAGES, 1));
90 QStringList rasterFiles = formatD.split("|");
91 QString dt = objectMap[currentItem()->text()].Data;
92 QFileInfo fi(dt);
93 QMimeData *mimeData = new QMimeData;
94 QList<QUrl> urlList;
95 if (fi.suffix().toLower() == "sce")
96 {
97 if (fi.exists())
98 {
99 QUrl ur = QUrl::fromLocalFile(dt);
100 urlList.append(ur);
101 mimeData->setUrls(urlList);
102 }
103 }
104 else if ((vectorFiles.contains(fi.suffix().toLower())) || (rasterFiles.contains(fi.suffix().toLower())))
105 {
106 if (fi.exists())
107 {
108 QUrl ur = QUrl::fromLocalFile(dt);
109 urlList.append(ur);
110 mimeData->setUrls(urlList);
111 }
112 }
113 QDrag *drag = new QDrag(this);
114 drag->setMimeData(mimeData);
115 drag->setPixmap(objectMap[currentItem()->text()].Preview);
116 drag->exec(Qt::CopyAction);
117 clearSelection();
118 }
119
dragEnterEvent(QDragEnterEvent * e)120 void BibView::dragEnterEvent(QDragEnterEvent *e)
121 {
122 if (e->source() == this)
123 e->ignore();
124 else
125 e->acceptProposedAction();
126 }
127
dragMoveEvent(QDragMoveEvent * e)128 void BibView::dragMoveEvent(QDragMoveEvent *e)
129 {
130 if (e->source() == this)
131 e->ignore();
132 else
133 e->acceptProposedAction();
134 }
135
dropEvent(QDropEvent * e)136 void BibView::dropEvent(QDropEvent *e)
137 {
138 if (e->mimeData()->hasText())
139 {
140 e->acceptProposedAction();
141 if (e->source() == this)
142 return;
143 QString text = e->mimeData()->text();
144 int startElemPos = text.leftRef(512).indexOf("<SCRIBUSELEM");
145 if (startElemPos >= 0)
146 emit objDropped(text);
147 }
148 else if (e->mimeData()->hasFormat("text/uri-list"))
149 {
150 QStringList vectorFiles = LoadSavePlugin::getExtensionsForPreview(FORMATID_FIRSTUSER);
151 QString formatD(FormatsManager::instance()->extensionListForFormat(FormatsManager::RASTORIMAGES, 1));
152 QStringList rasterFiles = formatD.split("|");
153 QList<QUrl> fileUrls = e->mimeData()->urls();
154 e->acceptProposedAction();
155 for (int i = 0; i < fileUrls.count(); ++i)
156 {
157 QUrl url(fileUrls[i] );
158 QFileInfo fi(url.path());
159 if (vectorFiles.contains(fi.suffix().toLower()))
160 {
161 FileLoader *fileLoader = new FileLoader(url.path());
162 int testResult = fileLoader->testFile();
163 delete fileLoader;
164 if ((testResult != -1) && (testResult >= FORMATID_FIRSTUSER) && (fi.exists()))
165 emit fileDropped(url.path(), testResult);
166 }
167 else if (rasterFiles.contains(fi.suffix().toLower()))
168 emit fileDropped(url.path(), 9999);
169 }
170 }
171 else
172 e->ignore();
173 }
174
addObject(const QString & name,const QString & daten,const QPixmap & Bild,bool isDir,bool isRaster,bool isVector)175 void BibView::addObject(const QString& name, const QString& daten, const QPixmap& Bild, bool isDir, bool isRaster, bool isVector)
176 {
177 struct Elem DrElem;
178 DrElem.isDir = isDir;
179 DrElem.isRaster = isRaster;
180 DrElem.isVector = isVector;
181 DrElem.Data = daten;
182 DrElem.Preview = Bild;
183 objectMap.insert(name, DrElem);
184 }
185
checkForImg(const QDomElement & elem,bool & hasImage)186 void BibView::checkForImg(const QDomElement& elem, bool &hasImage)
187 {
188 QDomNode node = elem.firstChild();
189 while (!node.isNull())
190 {
191 QDomElement pg = node.toElement();
192 if (pg.tagName() == "PAGEOBJECT")
193 {
194 PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
195 if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
196 {
197 QString Pfile = pg.attribute("PFILE");
198 QString Pfile2 = pg.attribute("PFILE2","");
199 QString Pfile3 = pg.attribute("PFILE3","");
200 if (!Pfile.isEmpty())
201 hasImage = true;
202 if (!Pfile2.isEmpty())
203 hasImage = true;
204 if (!Pfile3.isEmpty())
205 hasImage = true;
206 }
207 else if (PType == PageItem::OSGFrame)
208 {
209 QString Pfile = pg.attribute("modelFile");
210 if (!Pfile.isEmpty())
211 hasImage = true;
212 }
213 else if (PType == PageItem::Group)
214 checkForImg(pg, hasImage);
215 if (hasImage)
216 break;
217 }
218 node = node.nextSibling();
219 }
220 }
221
checkAndChange(const QString & text,const QString & nam,const QString & dir)222 void BibView::checkAndChange(const QString& text, const QString& nam, const QString& dir)
223 {
224 bool hasImage = false;
225 QDomDocument docu("scridoc");
226 docu.setContent(text);
227 QDomElement elem = docu.documentElement();
228 QDomNode node = elem.firstChild();
229 while (!node.isNull())
230 {
231 QDomElement pg = node.toElement();
232 if (pg.tagName() == "ITEM")
233 {
234 PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
235 if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
236 {
237 QString Pfile = pg.attribute("PFILE");
238 QString Pfile2 = pg.attribute("PFILE2","");
239 QString Pfile3 = pg.attribute("PFILE3","");
240 if (!Pfile.isEmpty())
241 hasImage = true;
242 if (!Pfile2.isEmpty())
243 hasImage = true;
244 if (!Pfile3.isEmpty())
245 hasImage = true;
246 }
247 else if (PType == PageItem::OSGFrame)
248 {
249 QString Pfile = pg.attribute("modelFile");
250 if (!Pfile.isEmpty())
251 hasImage = true;
252 }
253 else if (PType == PageItem::Group)
254 checkForImg(pg, hasImage);
255 if (hasImage)
256 break;
257 }
258 node = node.nextSibling();
259 }
260 QFileInfo fid(nam);
261 if (hasImage)
262 {
263 QDir dd = QDir(dir);
264 dd.mkdir(QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName())));
265 }
266 QString source = "";
267 QString fileDir = ScPaths::applicationDataDir();
268 bool first = true;
269 node = elem.firstChild();
270 while (!node.isNull())
271 {
272 QDomElement pg = node.toElement();
273 if (pg.tagName() == "ITEM")
274 {
275 if (first)
276 pg.setAttribute("ANNAME", fid.baseName());
277 first = false;
278 PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
279 if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
280 {
281 QString Pfile = pg.attribute("PFILE");
282 if (!Pfile.isEmpty())
283 {
284 QFileInfo fi(Pfile);
285 if (fi.isAbsolute())
286 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile));
287 else
288 {
289 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile)));
290 source = pfi2.absoluteFilePath();
291 }
292 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
293 copyFile(source, target);
294 pg.setAttribute("PFILE", fid.baseName() + "/" + fi.fileName());
295 }
296 QString Pfile2 = pg.attribute("PFILE2","");
297 if (!Pfile2.isEmpty())
298 {
299 QFileInfo fi(Pfile2);
300 if (fi.isAbsolute())
301 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile2));
302 else
303 {
304 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile2)));
305 source = pfi2.absoluteFilePath();
306 }
307 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
308 copyFile(source, target);
309 pg.setAttribute("PFILE2", fid.baseName() + "/" + fi.fileName());
310 }
311 QString Pfile3 = pg.attribute("PFILE3","");
312 if (!Pfile3.isEmpty())
313 {
314 QFileInfo fi(Pfile3);
315 if (fi.isAbsolute())
316 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile3));
317 else
318 {
319 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile3)));
320 source = pfi2.absoluteFilePath();
321 }
322 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
323 copyFile(source, target);
324 pg.setAttribute("PFILE3", fid.baseName() + "/" + fi.fileName());
325 }
326 pg.setAttribute("relativePaths", 1);
327 }
328 else if (PType == PageItem::OSGFrame)
329 {
330 QString Pfile = pg.attribute("modelFile");
331 if (!Pfile.isEmpty())
332 {
333 QFileInfo fi(Pfile);
334 if (fi.isAbsolute())
335 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile));
336 else
337 {
338 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile)));
339 source = pfi2.absoluteFilePath();
340 }
341 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
342 copyFile(source, target);
343 pg.setAttribute("modelFile", fid.baseName() + "/" + fi.fileName());
344 }
345 }
346 else if (PType == PageItem::Group)
347 {
348 checkAndChangeGroups(pg, dir, fid);
349 }
350 }
351 node = node.nextSibling();
352 }
353 QFile f(nam);
354 if (!f.open(QIODevice::WriteOnly))
355 return ;
356 QDataStream s;
357 QByteArray cs = docu.toByteArray();
358 s.setDevice(&f);
359 s.writeRawData(cs.data(), cs.length());
360 f.close();
361 }
362
checkAndChangeGroups(const QDomElement & elem,const QString & dir,const QFileInfo & fid)363 void BibView::checkAndChangeGroups(const QDomElement& elem, const QString& dir, const QFileInfo& fid)
364 {
365 QString source;
366 QString fileDir = ScPaths::applicationDataDir();
367 QDomNode node = elem.firstChild();
368 while (!node.isNull())
369 {
370 QDomElement pg = node.toElement();
371 if (pg.tagName() == "PAGEOBJECT")
372 {
373 PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
374 if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
375 {
376 QString Pfile = pg.attribute("PFILE");
377 if (!Pfile.isEmpty())
378 {
379 QFileInfo fi(Pfile);
380 if (fi.isAbsolute())
381 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile));
382 else
383 {
384 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile)));
385 source = pfi2.absoluteFilePath();
386 }
387 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
388 copyFile(source, target);
389 pg.setAttribute("PFILE", fid.baseName() + "/" + fi.fileName());
390 }
391 QString Pfile2 = pg.attribute("PFILE2","");
392 if (!Pfile2.isEmpty())
393 {
394 QFileInfo fi(Pfile2);
395 if (fi.isAbsolute())
396 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile2));
397 else
398 {
399 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile2)));
400 source = pfi2.absoluteFilePath();
401 }
402 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
403 copyFile(source, target);
404 pg.setAttribute("PFILE2", fid.baseName() + "/" + fi.fileName());
405 }
406 QString Pfile3 = pg.attribute("PFILE3","");
407 if (!Pfile3.isEmpty())
408 {
409 QFileInfo fi(Pfile3);
410 if (fi.isAbsolute())
411 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile3));
412 else
413 {
414 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile3)));
415 source = pfi2.absoluteFilePath();
416 }
417 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
418 copyFile(source, target);
419 pg.setAttribute("PFILE3", fid.baseName() + "/" + fi.fileName());
420 }
421 pg.setAttribute("relativePaths", 1);
422 }
423 else if (PType == PageItem::OSGFrame)
424 {
425 QString Pfile = pg.attribute("modelFile");
426 if (!Pfile.isEmpty())
427 {
428 QFileInfo fi(Pfile);
429 if (fi.isAbsolute())
430 source = QDir::cleanPath(QDir::toNativeSeparators(Pfile));
431 else
432 {
433 QFileInfo pfi2(QDir::cleanPath(QDir::toNativeSeparators(fileDir+"/"+Pfile)));
434 source = pfi2.absoluteFilePath();
435 }
436 QString target = QDir::cleanPath(QDir::toNativeSeparators(dir + "/" + fid.baseName() + "/" + fi.fileName()));
437 copyFile(source, target);
438 pg.setAttribute("modelFile", fid.baseName() + "/" + fi.fileName());
439 }
440 }
441 else if (PType == PageItem::Group)
442 {
443 checkAndChangeGroups(pg, dir, fid);
444 }
445 }
446 node = node.nextSibling();
447 }
448 }
449
readOldContents(const QString & name,const QString & newName)450 void BibView::readOldContents(const QString& name, const QString& newName)
451 {
452 bool isUtf8 = false;
453 QDomDocument docu("scridoc");
454 QString ff;
455 QByteArray cf;
456 if (!loadRawText(name, cf))
457 return;
458 if (cf.left(17) == "<SCRIBUSSCRAPUTF8")
459 {
460 ff = QString::fromUtf8(cf.data());
461 isUtf8 = true;
462 }
463 else
464 ff = QString::fromLocal8Bit(cf.data());
465 if (!docu.setContent(ff))
466 return;
467 QDomElement elem = docu.documentElement();
468 if ((elem.tagName() != "SCRIBUSSCRAP") && (elem.tagName() != "SCRIBUSSCRAPUTF8"))
469 return;
470 QDomNode node = elem.firstChild();
471 while (!node.isNull())
472 {
473 QDomElement dc=node.toElement();
474 if (dc.tagName()=="OBJEKT")
475 {
476 QFile fi(QDir::cleanPath(QDir::toNativeSeparators(newName + "/" + dc.attribute("NAME", nullptr) + ".sce")));
477 if (!fi.open(QIODevice::WriteOnly))
478 continue ;
479 QDataStream s(&fi);
480 QString fn = dc.attribute("DATA", nullptr);
481 cf = isUtf8? fn.toUtf8() : fn.toLocal8Bit();
482 s.writeRawData(cf.data(), cf.length());
483 fi.close();
484 }
485 node = node.nextSibling();
486 }
487 }
488
readContents(const QString & name)489 void BibView::readContents(const QString& name)
490 {
491 int fileCount = 0;
492 int readCount = 0;
493 QSet<QString> vectorFound;
494 QSet<QString> rasterFound;
495
496 clear();
497 objectMap.clear();
498
499 QString dirPath = QDir::cleanPath(QDir::toNativeSeparators(name));
500 while ((dirPath.length() > 1) && dirPath.endsWith("/"))
501 dirPath.chop(1);
502
503 QDir thumbs(dirPath);
504 if (thumbs.exists())
505 {
506 if ((canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
507 thumbs.mkdir(".ScribusThumbs");
508 thumbs.cd(".ScribusThumbs");
509 }
510 QDir dd(dirPath, "*", QDir::Name, QDir::Dirs | QDir::NoDotAndDotDot | QDir::Readable | QDir::NoSymLinks);
511 fileCount += dd.count();
512 QDir d(dirPath, "*.sce", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
513 fileCount += d.count();
514 QStringList vectorFiles = LoadSavePlugin::getExtensionsForPreview(FORMATID_FIRSTUSER);
515 for (int v = 0; v < vectorFiles.count(); v++)
516 {
517 QString ext = "*." + vectorFiles[v];
518 QDir d4(dirPath, ext, QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
519 fileCount += d4.count();
520 if (d4.count() > 0)
521 vectorFound.insert(vectorFiles[v]);
522 }
523 QString formatD(FormatsManager::instance()->extensionListForFormat(FormatsManager::RASTORIMAGES, 1));
524 QStringList rasterFiles = formatD.split("|");
525 for (int v = 0; v < rasterFiles.count(); v++)
526 {
527 QString ext = "*." + rasterFiles[v];
528 QDir d5(dirPath, ext, QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
529 fileCount += d5.count();
530 if (d5.count() > 0)
531 rasterFound.insert(rasterFiles[v]);
532 }
533 QProgressDialog *pgDia = nullptr;
534 QStringList previewFiles;
535 previewFiles.clear();
536 if (ScCore->initialized())
537 {
538 pgDia = new QProgressDialog("Reading Files...", QString(), 0, fileCount, this);
539 pgDia->setWindowModality(Qt::WindowModal);
540 }
541 if ((dd.exists()) && (dd.count() != 0))
542 {
543 for (uint dc = 0; dc < dd.count(); ++dc)
544 {
545 if (pgDia)
546 {
547 pgDia->setValue(readCount);
548 readCount++;
549 }
550 if (dd[dc].compare(".ScribusThumbs", Qt::CaseInsensitive) == 0)
551 continue;
552 QPixmap pm = IconManager::instance().loadPixmap("folder.png");
553 addObject(dd[dc], "", pm, true);
554 }
555 }
556 if ((d.exists()) && (d.count() != 0))
557 {
558 for (uint dc = 0; dc < d.count(); ++dc)
559 {
560 if (pgDia)
561 {
562 pgDia->setValue(readCount);
563 readCount++;
564 }
565 QPixmap pm;
566 QByteArray cf;
567 if (!loadRawText(QDir::cleanPath(dirPath + "/" + d[dc]), cf))
568 continue;
569 QFileInfo fi(QDir::cleanPath(dirPath + "/" + d[dc]));
570 QString filePath = QDir::cleanPath(QDir::toNativeSeparators(fi.path()));
571 bool pngExists = QFile::exists(filePath + "/.ScribusThumbs/" + fi.baseName() + ".png");
572 if (pngExists)
573 pm.load(filePath + "/.ScribusThumbs/" + fi.baseName() + ".png");
574 else
575 {
576 pngExists = QFile::exists(filePath + "/" + fi.baseName() + ".png");
577 if (pngExists)
578 pm.load(filePath + "/" + fi.baseName() + ".png");
579 else
580 {
581 QString f;
582 if (cf.left(16) == "<SCRIBUSELEMUTF8")
583 f = QString::fromUtf8(cf.data());
584 else
585 f = cf.data();
586 ScPreview *pre = new ScPreview();
587 pm = QPixmap::fromImage(pre->createPreview(f));
588 if ((canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
589 pm.save(filePath + "/.ScribusThumbs/" + fi.baseName() + ".png", "PNG");
590 delete pre;
591 }
592 }
593 previewFiles.append(fi.baseName() + ".png");
594 addObject(fi.baseName(), QDir::cleanPath(dirPath + "/" + d[dc]), pm);
595 }
596 }
597 for (int v = 0; v < vectorFiles.count(); v++)
598 {
599 if (!vectorFound.contains(vectorFiles[v]))
600 continue;
601 QString ext = "*." + vectorFiles[v];
602 QDir d4(dirPath, ext, QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
603 if ((!d4.exists()) || (d4.count() <= 0))
604 continue;
605 for (uint dc = 0; dc < d4.count(); ++dc)
606 {
607 if (pgDia)
608 {
609 pgDia->setValue(readCount);
610 readCount++;
611 }
612 QPixmap pm;
613 QFileInfo fi(QDir::cleanPath(dirPath + "/" + d4[dc]));
614 QString filePath = QDir::cleanPath(QDir::toNativeSeparators(fi.path()));
615 bool pngExists = QFile::exists(filePath + "/.ScribusThumbs/" + fi.fileName() + ".png");
616 if (pngExists)
617 pm.load(filePath + "/.ScribusThumbs/" + fi.fileName() + ".png");
618 else
619 {
620 FileLoader *fileLoader = new FileLoader(QDir::cleanPath(dirPath + "/" + d4[dc]));
621 int testResult = fileLoader->testFile();
622 delete fileLoader;
623 if ((testResult != -1) && (testResult >= FORMATID_FIRSTUSER))
624 {
625 const FileFormat * fmt = LoadSavePlugin::getFormatById(testResult);
626 if (fmt)
627 {
628 QImage im = fmt->readThumbnail(dirPath + "/" + d4[dc]);
629 im = im.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
630 if ((canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
631 im.save(filePath + "/.ScribusThumbs/" + fi.fileName() + ".png", "PNG");
632 pm = QPixmap::fromImage(im);
633 }
634 }
635 }
636 addObject(fi.fileName(), QDir::cleanPath(dirPath + "/" + d4[dc]), pm, false, false, true);
637 }
638 }
639 for (int v = 0; v < rasterFiles.count(); v++)
640 {
641 if (!rasterFound.contains(rasterFiles[v]))
642 continue;
643 QString ext = "*." + rasterFiles[v];
644 QDir d5(dirPath, ext, QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
645 if ((!d5.exists()) || (d5.count() <= 0))
646 continue;
647 for (uint dc = 0; dc < d5.count(); ++dc)
648 {
649 if (pgDia)
650 {
651 pgDia->setValue(readCount);
652 readCount++;
653 }
654 if (previewFiles.contains(d5[dc]))
655 continue;
656 QPixmap pm;
657 QFileInfo fi(QDir::cleanPath(dirPath + "/" + d5[dc]));
658 QString filePath = QDir::cleanPath(QDir::toNativeSeparators(fi.path()));
659 bool pngExists = QFile::exists(filePath + "/.ScribusThumbs/" + fi.fileName() + ".png");
660 if (pngExists)
661 pm.load(filePath + "/.ScribusThumbs/" + fi.fileName() + ".png");
662 else
663 {
664 bool mode = false;
665 ScImage im;
666 CMSettings cms(nullptr, "", Intent_Perceptual);
667 cms.allowColorManagement(false);
668 if (im.loadPicture(dirPath + "/" + d5[dc], 1, cms, ScImage::Thumbnail, 72, &mode))
669 {
670 QImage img = im.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
671 if ((canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
672 img.save(filePath + "/.ScribusThumbs/" + fi.fileName() + ".png", "PNG");
673 pm = QPixmap::fromImage(img);
674 }
675 }
676 addObject(fi.fileName(), QDir::cleanPath(dirPath + "/" + d5[dc]), pm, false, true);
677 }
678 }
679 if (pgDia)
680 {
681 pgDia->setValue(fileCount);
682 delete pgDia;
683 }
684 QMap<QString,Elem>::Iterator itf;
685 for (itf = objectMap.begin(); itf != objectMap.end(); ++itf)
686 {
687 if (itf.value().isDir)
688 {
689 QPixmap pm(60, 60);
690 pm.fill(palette().color(QPalette::Base));
691 QPainter p;
692 p.begin(&pm);
693 p.drawPixmap(30 - itf.value().Preview.width() / 2, 30 - itf.value().Preview.height() / 2, itf.value().Preview);
694 p.end();
695 QListWidgetItem *item = new QListWidgetItem(QIcon(pm), itf.key(), this);
696 item->setToolTip(itf.key());
697 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
698 itf.value().widgetItem = item;
699 }
700 }
701 for (itf = objectMap.begin(); itf != objectMap.end(); ++itf)
702 {
703 if (!itf.value().isDir)
704 {
705 itf.value().Preview = itf.value().Preview.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
706 QPixmap pm(60, 60);
707 pm.fill(palette().color(QPalette::Base));
708 QPainter p;
709 p.begin(&pm);
710 p.drawPixmap(30 - itf.value().Preview.width() / 2, 30 - itf.value().Preview.height() / 2, itf.value().Preview);
711 p.end();
712 QListWidgetItem *item = new QListWidgetItem(QIcon(pm), itf.key(), this);
713 item->setToolTip(itf.key());
714 itf.value().widgetItem = item;
715 }
716 }
717 }
718
719 /* This is the main Dialog-Class for the Scrapbook */
Biblio(QWidget * parent)720 Biblio::Biblio(QWidget* parent) : ScDockPalette(parent, "Sclib", Qt::WindowFlags())
721 {
722 setObjectName(QString::fromLocal8Bit("Sclib"));
723 setMinimumSize( QSize(220, 240) );
724 setSizePolicy( QSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum));
725 containerWidget = new QWidget(this);
726 BiblioLayout = new QVBoxLayout( containerWidget );
727 BiblioLayout->setSpacing(3);
728 BiblioLayout->setContentsMargins(3, 3, 3, 3);
729
730 buttonLayout = new QHBoxLayout;
731 buttonLayout->setSpacing(3);
732 buttonLayout->setContentsMargins(0, 0, 0, 0);
733 newButton = new QToolButton(this);
734 newButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
735 newButton->setIcon(IconManager::instance().loadPixmap("16/document-new.png"));
736 newButton->setIconSize(QSize(16, 16));
737 upButton = new QToolButton(this);
738 upButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
739 upButton->setIcon(IconManager::instance().loadPixmap("16/go-up.png"));
740 upButton->setIconSize(QSize(16, 16));
741 importButton = new QToolButton(this);
742 importButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
743 importButton->setIcon(IconManager::instance().loadPixmap("compfile16.png"));
744 importButton->setIconSize(QSize(16, 16));
745 closeButton = new QToolButton(this);
746 closeButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
747 closeButton->setIcon(IconManager::instance().loadPixmap("16/close.png"));
748 closeButton->setIconSize(QSize(16, 16));
749 configButton = new QToolButton(this);
750 configButton->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
751
752 configMenue = new QMenu();
753 conf_HideDirs = configMenue->addAction( tr("Hide Directories"));
754 conf_HideDirs->setCheckable(true);
755 conf_HideDirs->setChecked(false);
756 conf_HideImages = configMenue->addAction( tr("Hide Images"));
757 conf_HideImages->setCheckable(true);
758 conf_HideImages->setChecked(false);
759 conf_HideVectors = configMenue->addAction( tr("Hide Vector files"));
760 conf_HideVectors->setCheckable(true);
761 conf_HideVectors->setChecked(false);
762 configMenue->addSeparator();
763 conf_OpenMode = configMenue->addAction( tr("Open Directories in a new tab"));
764 conf_OpenMode->setCheckable(true);
765 conf_OpenMode->setChecked(false);
766 configButton->setMenu(configMenue);
767 configButton->setPopupMode(QToolButton::InstantPopup);
768 buttonLayout->addWidget( newButton );
769 buttonLayout->addWidget( upButton );
770 buttonLayout->addWidget( importButton );
771 buttonLayout->addWidget( closeButton );
772 QSpacerItem* spacer = new QSpacerItem( 1, 1, QSizePolicy::Expanding, QSizePolicy::Minimum );
773 buttonLayout->addItem( spacer );
774 buttonLayout->addWidget( configButton );
775 BiblioLayout->addLayout( buttonLayout );
776
777 Frame3 = new QToolBox( this );
778 activeBView = new BibView(this);
779 Frame3->addItem(activeBView, tr("Main"));
780 activeBView->visibleName = tr("Main");
781 tempBView = new BibView(this);
782 Frame3->addItem(tempBView, tr("Copied Items"));
783 tempBView->visibleName = tr("Copied Items");
784 m_tempCount = 0;
785 actItem = nullptr;
786 BiblioLayout->addWidget( Frame3 );
787 setWidget( containerWidget );
788
789 languageChange();
790 m_prefs = PrefsManager::instance().prefsFile->getContext("Scrapbook");
791 conf_HideDirs->setChecked(m_prefs->getBool("hideDirs", false));
792 conf_HideImages->setChecked(m_prefs->getBool("hideImages", false));
793 conf_HideVectors->setChecked(m_prefs->getBool("hideVectors", false));
794 conf_OpenMode->setChecked(m_prefs->getBool("openMode", false));
795
796 connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
797
798 connect(newButton, SIGNAL(clicked()), this, SLOT(newLib()));
799 connect(upButton, SIGNAL(clicked()), this, SLOT(goOneDirUp()));
800 connect(importButton, SIGNAL(clicked()), this, SLOT(Import()));
801 connect(closeButton, SIGNAL(clicked()), this, SLOT(closeLib()));
802 connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
803 connect(configMenue, SIGNAL(triggered(QAction *)), this, SLOT(updateView()));
804 }
805
setOpenScrapbooks(QStringList & fileNames)806 void Biblio::setOpenScrapbooks(QStringList &fileNames)
807 {
808 disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
809 disconnect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
810 disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
811 disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
812 disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
813 for (int rd = 0; rd < fileNames.count(); ++rd)
814 {
815 QString fileName = fileNames[rd];
816 if (fileName.isEmpty())
817 continue;
818 QDir d(fileName);
819 activeBView = new BibView(this);
820 QFileInfo fd(fileName);
821 activeBView->canWrite = fd.isWritable();
822 activeBView->setAcceptDrops(activeBView->canWrite);
823 if (activeBView->canWrite)
824 Frame3->addItem(activeBView, d.dirName());
825 else
826 Frame3->addItem(activeBView, IconManager::instance().loadIcon("16/lock.png"), d.dirName());
827 activeBView->readContents(fileName);
828 activeBView->ScFilename = fileName;
829 activeBView->visibleName = d.dirName();
830 ScCore->fileWatcher->addDir(d.absolutePath(), true);
831 activeBView->scrollToTop();
832 }
833 activeBView = (BibView*)Frame3->widget(0);
834 Frame3->setCurrentIndex(0);
835 upButton->setEnabled(false);
836 updateView();
837 connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
838 connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
839 connect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
840 connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
841 connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
842 }
843
getOpenScrapbooks()844 QStringList Biblio::getOpenScrapbooks()
845 {
846 QStringList ret;
847 ret.clear();
848 if (Frame3->count() > 2) // omit the first 2 Tabs since they contain the main and temp scrapbook
849 {
850 for (int a = 2; a < Frame3->count(); a++)
851 {
852 BibView* bv = (BibView*)Frame3->widget(a);
853 ret.append(bv->ScFilename);
854 }
855 }
856 return ret;
857 }
858
getOpenScrapbooksNames()859 QStringList Biblio::getOpenScrapbooksNames()
860 {
861 QStringList ret;
862 ret.clear();
863 for (int a = 0; a < Frame3->count(); a++)
864 {
865 BibView* bv = (BibView*)Frame3->widget(a);
866 ret.append(bv->visibleName);
867 }
868 return ret;
869 }
870
setScrapbookFileName(const QString & fileName)871 void Biblio::setScrapbookFileName(const QString& fileName)
872 {
873 activeBView->ScFilename=fileName;
874 }
875
getScrapbookFileName()876 const QString& Biblio::getScrapbookFileName()
877 {
878 return activeBView->ScFilename;
879 }
880
objectCount()881 int Biblio::objectCount()
882 {
883 return activeBView->objectMap.count();
884 }
885
tempHasContents()886 bool Biblio::tempHasContents()
887 {
888 return (!tempBView->objectMap.isEmpty());
889 }
890
readOldContents(const QString & fileName,const QString & newName)891 void Biblio::readOldContents(const QString& fileName, const QString& newName)
892 {
893 activeBView->readOldContents(fileName, newName);
894 activeBView->scrollToTop();
895 }
896
readContents(const QString & fileName)897 void Biblio::readContents(const QString& fileName)
898 {
899 activeBView->readContents(fileName);
900 }
901
readTempContents(const QString & fileName)902 void Biblio::readTempContents(const QString& fileName)
903 {
904 tempBView->readContents(fileName);
905 tempBView->ScFilename = fileName;
906 m_tempCount = tempBView->objectMap.count();
907 }
908
installEventFilter(QObject * filterObj)909 void Biblio::installEventFilter(QObject *filterObj)
910 {
911 // ScrPaletteBase::installEventFilter(filterObj);
912 activeBView->installEventFilter(filterObj);
913 tempBView->installEventFilter(filterObj);
914 }
915
updateView()916 void Biblio::updateView()
917 {
918 for (int a = 0; a < Frame3->count(); a++)
919 {
920 BibView* bv = (BibView*)Frame3->widget(a);
921 QMap<QString, BibView::Elem>::Iterator itf;
922 for (itf = bv->objectMap.begin(); itf != bv->objectMap.end(); ++itf)
923 {
924 if (itf.value().isDir)
925 itf.value().widgetItem->setHidden(conf_HideDirs->isChecked());
926 if (itf.value().isRaster)
927 itf.value().widgetItem->setHidden(conf_HideImages->isChecked());
928 if (itf.value().isVector)
929 itf.value().widgetItem->setHidden(conf_HideVectors->isChecked());
930 }
931 }
932 m_prefs->set("hideDirs", conf_HideDirs->isChecked());
933 m_prefs->set("hideImages", conf_HideImages->isChecked());
934 m_prefs->set("hideVectors", conf_HideVectors->isChecked());
935 m_prefs->set("openMode", conf_OpenMode->isChecked());
936 }
937
newLib()938 void Biblio::newLib()
939 {
940 PrefsContext* dirs = PrefsManager::instance().prefsFile->getContext("dirs");
941 QString fileName = QFileDialog::getExistingDirectory(this, tr("Choose a Scrapbook Directory"), dirs->get("scrap_load", "."));
942 if (fileName.isEmpty())
943 return;
944
945 for (int a = 0; a < Frame3->count(); a++)
946 {
947 BibView* bv = (BibView*)Frame3->widget(a);
948 if (fileName == bv->ScFilename)
949 return;
950 }
951 disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
952 disconnect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
953 disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
954 disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
955 disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
956 QDir d(fileName);
957 activeBView = new BibView(this);
958 QFileInfo fd(fileName);
959 activeBView->canWrite = fd.isWritable();
960 activeBView->setAcceptDrops(activeBView->canWrite);
961 if (activeBView->canWrite)
962 Frame3->addItem(activeBView, d.dirName());
963 else
964 Frame3->addItem(activeBView, IconManager::instance().loadIcon("16/lock.png"), d.dirName());
965 activeBView->readContents(fileName);
966 activeBView->ScFilename = fileName;
967 activeBView->visibleName = d.dirName();
968 Frame3->setCurrentWidget(activeBView);
969 ScCore->fileWatcher->addDir(d.absolutePath(), true);
970 d.cdUp();
971 dirs->set("scrap_load", d.absolutePath());
972 activeBView->scrollToTop();
973 upButton->setEnabled(!((Frame3->currentIndex() == 0) || (Frame3->currentIndex() == 1)));
974 updateView();
975 connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
976 connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
977 connect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
978 connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
979 connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(handleDoubleClick(QListWidgetItem*)));
980 emit scrapbookListChanged();
981 }
982
Import()983 void Biblio::Import()
984 {
985 PrefsContext* dirs = PrefsManager::instance().prefsFile->getContext("dirs");
986 QString s = QFileDialog::getOpenFileName(this,
987 tr("Choose a scrapbook file to import"),
988 dirs->get("old_scrap_load", "."),
989 tr("Scrapbook (*.scs *.SCS)"));
990
991 if (!s.isEmpty())
992 {
993 dirs->set("old_scrap_load", s.left(s.lastIndexOf(QDir::toNativeSeparators("/"))));
994
995 QFileInfo scrapbookFileInfoO = QFileInfo(s);
996 if (scrapbookFileInfoO.exists())
997 {
998 readOldContents(s, activeBView->ScFilename);
999 readContents(activeBView->ScFilename);
1000 }
1001 activeBView->scrollToTop();
1002 updateView();
1003 }
1004 }
1005
closeLib()1006 void Biblio::closeLib()
1007 {
1008 if (Frame3->count() == 2)
1009 close();
1010 if ((Frame3->currentIndex() == 0) || (Frame3->currentIndex() == 1))
1011 return;
1012
1013 disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
1014 disconnect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
1015 disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
1016 disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
1017 disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
1018 QFileInfo fi(activeBView->ScFilename);
1019 ScCore->fileWatcher->removeDir(fi.absolutePath());
1020 Frame3->removeItem(Frame3->indexOf(activeBView));
1021 delete activeBView; // currently disabled as the whole TabWidget vanishes when executing that delete????? -> seems to be fixed in Qt-4.3.3
1022 activeBView = (BibView*)Frame3->widget(0);
1023 Frame3->setCurrentIndex(0);
1024 upButton->setEnabled(!((Frame3->currentIndex() == 0) || (Frame3->currentIndex() == 1)));
1025 connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
1026 connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
1027 connect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
1028 connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
1029 connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
1030 emit scrapbookListChanged();
1031 }
1032
libChanged(int index)1033 void Biblio::libChanged(int index)
1034 {
1035 disconnect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
1036 disconnect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
1037 disconnect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
1038 disconnect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
1039 activeBView = (BibView*)Frame3->widget(index);
1040 upButton->setEnabled(!((Frame3->currentIndex() == 0) || (Frame3->currentIndex() == 1)));
1041 connect(activeBView, SIGNAL(objDropped(QString)), this, SLOT(objFromMenu(QString)));
1042 connect(activeBView, SIGNAL(fileDropped(QString, int)), this, SLOT(objFromFile(QString, int)));
1043 connect(activeBView, SIGNAL(customContextMenuRequested (const QPoint &)), this, SLOT(handleMouse(QPoint)));
1044 connect(activeBView, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(handleDoubleClick(QListWidgetItem *)));
1045 }
1046
closeOnDel(const QString & libName)1047 void Biblio::closeOnDel(const QString& libName)
1048 {
1049 BibView* bv = nullptr;
1050 int libIndex = 0;
1051 for (int a = 0; a < Frame3->count(); a++)
1052 {
1053 bv = (BibView*)Frame3->widget(a);
1054 if (libName == bv->ScFilename)
1055 {
1056 libIndex = a;
1057 break;
1058 }
1059 }
1060 if ((libIndex == 0) || (libIndex == 1))
1061 return;
1062 if (bv == activeBView)
1063 closeLib();
1064 else
1065 {
1066 disconnect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
1067 QFileInfo fi(bv->ScFilename);
1068 ScCore->fileWatcher->removeDir(fi.absolutePath());
1069 Frame3->removeItem(Frame3->indexOf(bv));
1070 delete bv;
1071 connect(Frame3, SIGNAL(currentChanged(int)), this, SLOT(libChanged(int )));
1072 }
1073 }
1074
reloadLib(const QString & fileName)1075 void Biblio::reloadLib(const QString& fileName)
1076 {
1077 for (int a = 0; a < Frame3->count(); a++)
1078 {
1079 BibView* bv = (BibView*)Frame3->widget(a);
1080 if (bv->ScFilename == fileName)
1081 {
1082 bv->readContents(fileName);
1083 bv->ScFilename = fileName;
1084 QDir d(fileName);
1085 if (a > 1)
1086 bv->visibleName = d.dirName();
1087 bv->scrollToTop();
1088 }
1089 }
1090 updateView();
1091 }
1092
handleDoubleClick(QListWidgetItem * ite)1093 void Biblio::handleDoubleClick(QListWidgetItem *ite)
1094 {
1095 if (activeBView->objectMap[ite->text()].isDir)
1096 {
1097 QFileInfo fi(activeBView->ScFilename);
1098 ScCore->fileWatcher->removeDir(fi.absolutePath());
1099 QString fileName = activeBView->ScFilename + "/" + ite->text();
1100 QDir d(fileName);
1101 QFileInfo fd(fileName);
1102 if (conf_OpenMode->isChecked())
1103 {
1104 activeBView = new BibView(this);
1105 if (fd.isWritable())
1106 Frame3->addItem(activeBView, d.dirName());
1107 else
1108 Frame3->addItem(activeBView, IconManager::instance().loadIcon("16/lock.png"), d.dirName());
1109 }
1110 activeBView->canWrite = fd.isWritable();
1111 activeBView->setAcceptDrops(activeBView->canWrite);
1112 activeBView->readContents(fileName);
1113 activeBView->ScFilename = fileName;
1114 activeBView->visibleName = d.dirName();
1115 Frame3->setItemText(Frame3->indexOf(activeBView), d.dirName());
1116 if (!activeBView->canWrite)
1117 Frame3->setItemIcon(Frame3->indexOf(activeBView), IconManager::instance().loadIcon("16/lock.png"));
1118 ScCore->fileWatcher->addDir(d.absolutePath(), true);
1119 d.cdUp();
1120 PrefsContext* dirs = PrefsManager::instance().prefsFile->getContext("dirs");
1121 dirs->set("scrap_load", d.absolutePath());
1122 activeBView->scrollToTop();
1123 updateView();
1124 }
1125 else
1126 {
1127 emit pasteToActualPage(ite->text());
1128 activeBView->clearSelection();
1129 actItem = nullptr;
1130 }
1131 }
1132
goOneDirUp()1133 void Biblio::goOneDirUp()
1134 {
1135 QFileInfo fi(activeBView->ScFilename);
1136 ScCore->fileWatcher->removeDir(fi.absolutePath());
1137 QDir d(activeBView->ScFilename);
1138 d.cdUp();
1139 QString fileName = d.absolutePath();
1140 QFileInfo fd(fileName);
1141 activeBView->canWrite = fd.isWritable();
1142 activeBView->setAcceptDrops(activeBView->canWrite);
1143 activeBView->readContents(fileName);
1144 activeBView->ScFilename = fileName;
1145 activeBView->visibleName = d.dirName();
1146 Frame3->setItemText(Frame3->indexOf(activeBView), d.dirName());
1147 if (!activeBView->canWrite)
1148 Frame3->setItemIcon(Frame3->indexOf(activeBView), IconManager::instance().loadIcon("16/lock.png"));
1149 ScCore->fileWatcher->addDir(d.absolutePath(), true);
1150 d.cdUp();
1151 PrefsContext* dirs = PrefsManager::instance().prefsFile->getContext("dirs");
1152 dirs->set("scrap_load", d.absolutePath());
1153 activeBView->scrollToTop();
1154 updateView();
1155 }
1156
handlePasteToPage()1157 void Biblio::handlePasteToPage()
1158 {
1159 emit pasteToActualPage(actItem->text());
1160 activeBView->clearSelection();
1161 actItem = nullptr;
1162 }
1163
handleMouse(QPoint p)1164 void Biblio::handleMouse(QPoint p)
1165 {
1166 // #12359 : stop the file watcher here as it may run and trigger regeneration of
1167 // scrapbook content, hence invalidating actItem while context menu is executing.
1168 ScCore->fileWatcher->stop();
1169 QListWidgetItem *ite = activeBView->itemAt(p);
1170 if (ite != nullptr)
1171 {
1172 actItem = ite;
1173 QMenu *pmenu = new QMenu();
1174 QAction* renAct;
1175 QAction* delAct;
1176 QAction* pasteAct = pmenu->addAction( tr("Paste to Page"));
1177 connect(pasteAct, SIGNAL(triggered()), this, SLOT(handlePasteToPage()));
1178 if (activeBView->canWrite)
1179 {
1180 renAct = pmenu->addAction( tr("Rename"));
1181 connect(renAct, SIGNAL(triggered()), this, SLOT(renameObj()));
1182 delAct = pmenu->addAction( tr("Delete"));
1183 connect(delAct, SIGNAL(triggered()), this, SLOT(deleteObj()));
1184 }
1185 QSignalMapper *signalMapper = new QSignalMapper(this);
1186 connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(copyObj(int)));
1187 QMenu *pmenu2 = new QMenu( tr("Copy To:"));
1188 QMenu *pmenu3 = new QMenu( tr("Move To:"));
1189 QSignalMapper *signalMapper2 = new QSignalMapper(this);
1190 connect(signalMapper2, SIGNAL(mapped(int)), this, SLOT(moveObj(int)));
1191 for (int a = 0; a < Frame3->count(); a++)
1192 {
1193 BibView* bv = (BibView*)Frame3->widget(a);
1194 if ((bv == activeBView) || (!bv->canWrite))
1195 continue;
1196 QAction *action = pmenu2->addAction(Frame3->itemText(Frame3->indexOf(Frame3->widget(a))));
1197 connect(action, SIGNAL(triggered()), signalMapper, SLOT(map()));
1198 signalMapper->setMapping(action, a);
1199 if (activeBView->canWrite)
1200 {
1201 QAction *action2 = pmenu3->addAction(Frame3->itemText(Frame3->indexOf(Frame3->widget(a))));
1202 connect(action2, SIGNAL(triggered()), signalMapper2, SLOT(map()));
1203 signalMapper2->setMapping(action2, a);
1204 }
1205 }
1206 pmenu->addMenu(pmenu2);
1207 if (activeBView->canWrite)
1208 pmenu->addMenu(pmenu3);
1209 pmenu->exec(QCursor::pos());
1210 delete pmenu;
1211 delete pmenu2;
1212 delete signalMapper;
1213 if (activeBView->canWrite)
1214 {
1215 delete pmenu3;
1216 delete signalMapper2;
1217 }
1218 }
1219 else
1220 {
1221 QMenu *pmenu = new QMenu();
1222 QAction* closeAct = pmenu->addAction( tr("Close"));
1223 if ((activeBView->canWrite) && (activeBView->objectMap.count() != 0))
1224 {
1225 QAction* delAct = pmenu->addAction( tr("Delete Contents"));
1226 connect(delAct, SIGNAL(triggered()), this, SLOT(deleteAllObj()));
1227 }
1228 connect(closeAct, SIGNAL(triggered()), this, SLOT(closeLib()));
1229 pmenu->exec(QCursor::pos());
1230 delete pmenu;
1231 }
1232 activeBView->clearSelection();
1233 actItem = nullptr;
1234 ScCore->fileWatcher->start();
1235 }
1236
copyObj(int id)1237 bool Biblio::copyObj(int id)
1238 {
1239 QListWidgetItem *ite = actItem;
1240 QString nam = ite->text();
1241 BibView* bv = (BibView*)Frame3->widget(id);
1242 if (bv->objectMap.contains(nam))
1243 {
1244 Query dia(this, "tt", 1, tr("&Name:"), tr("New Entry"));
1245 dia.setValidator(QRegExp("[\\w()]+"));
1246 dia.setEditText(nam, true);
1247 dia.setTestList(activeBView->objectMap.keys());
1248 if (dia.exec())
1249 nam = dia.getEditText();
1250 else
1251 return false;
1252 }
1253 QPixmap pm;
1254 QByteArray cf;
1255 if (!loadRawText(QDir::cleanPath(activeBView->objectMap[ite->text()].Data), cf))
1256 return false;
1257 pm = activeBView->objectMap[ite->text()].Preview;
1258 QString dt = activeBView->objectMap[ite->text()].Data;
1259 QDir thumbs(bv->ScFilename);
1260 if (thumbs.exists())
1261 {
1262 if ((bv->canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
1263 thumbs.mkdir(".ScribusThumbs");
1264 }
1265 QFileInfo fi(dt);
1266 QFile f(QDir::cleanPath(QDir::toNativeSeparators(bv->ScFilename + "/" + nam + "." + fi.completeSuffix().toLower())));
1267 if (!f.open(QIODevice::WriteOnly))
1268 return false;
1269 QDataStream s;
1270 s.setDevice(&f);
1271 s.writeRawData(cf.data(), cf.length());
1272 f.close();
1273 bv->addObject(nam, QDir::cleanPath(QDir::toNativeSeparators(bv->ScFilename + "/" + nam + "." + fi.completeSuffix().toLower())), pm);
1274 pm.save(QDir::cleanPath(QDir::toNativeSeparators(bv->ScFilename + "/.ScribusThumbs/" + nam +".png")), "PNG");
1275 QFileInfo fiD(QDir::toNativeSeparators(activeBView->ScFilename + "/" + fi.baseName()));
1276 if ((fiD.exists()) && (fiD.isDir()))
1277 {
1278 QDir dd = QDir(QDir::cleanPath(QDir::toNativeSeparators(bv->ScFilename)));
1279 dd.mkdir(QDir::cleanPath(QDir::toNativeSeparators(bv->ScFilename + "/" + nam)));
1280 QDir d(QDir::toNativeSeparators(activeBView->ScFilename + "/" + fi.baseName()), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1281 if ((d.exists()) && (d.count() != 0))
1282 {
1283 for (uint dc = 0; dc < d.count(); ++dc)
1284 {
1285 QString source = QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + fi.baseName() + "/" + d[dc]));
1286 QString target = QDir::cleanPath(QDir::toNativeSeparators(bv->ScFilename + "/" + nam + "/" + d[dc]));
1287 copyFile(source, target);
1288 }
1289 }
1290 if (fiD.baseName() != nam)
1291 adjustReferences(QDir::toNativeSeparators(bv->ScFilename + "/" + nam + "." + fi.completeSuffix().toLower()));
1292 }
1293 pm = pm.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
1294 QPixmap pm2(60, 60);
1295 pm2.fill(palette().color(QPalette::Base));
1296 QPainter p;
1297 p.begin(&pm2);
1298 p.drawPixmap(30 - pm.width() / 2, 30 - pm.height() / 2, pm);
1299 p.end();
1300 QListWidgetItem *item = new QListWidgetItem(QIcon(pm), nam, bv);
1301 item->setToolTip(nam);
1302 bv->objectMap[nam].widgetItem = item;
1303 if (bv == tempBView)
1304 {
1305 m_tempCount++;
1306 if (tempBView->objectMap.count() > PrefsManager::instance().appPrefs.scrapbookPrefs.numScrapbookCopies)
1307 {
1308 QMap<QString,BibView::Elem>::Iterator it;
1309 it = tempBView->objectMap.begin();
1310 QFile f(it.value().Data);
1311 f.remove();
1312 QFileInfo fi(QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1313 if (fi.exists())
1314 {
1315 QFile f2(QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1316 f2.remove();
1317 }
1318 QFileInfo fiD(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()));
1319 if ((fiD.exists()) && (fiD.isDir()))
1320 {
1321 QDir dd = QDir(QDir::toNativeSeparators(tempBView->ScFilename));
1322 QDir d(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1323 if ((d.exists()) && (d.count() != 0))
1324 {
1325 for (uint dc = 0; dc < d.count(); ++dc)
1326 {
1327 QFile::remove(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key() + "/" + d[dc]));
1328 }
1329 }
1330 dd.rmdir(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()));
1331 }
1332 QString name = it.key();
1333 tempBView->objectMap.erase(it);
1334 QList<QListWidgetItem *> itL = tempBView->findItems(name, Qt::MatchExactly);
1335 if (itL.count() > 0)
1336 {
1337 ite = itL.at(0);
1338 delete tempBView->takeItem(tempBView->row(ite));
1339 }
1340 }
1341 emit updateRecentMenue();
1342 }
1343 return true;
1344 }
1345
moveObj(int id)1346 void Biblio::moveObj(int id)
1347 {
1348 if (copyObj(id))
1349 {
1350 deleteObj();
1351 }
1352 }
1353
deleteObj()1354 void Biblio::deleteObj()
1355 {
1356 if (!activeBView->canWrite)
1357 return;
1358 QListWidgetItem *ite = actItem;
1359 QString name = ite->text();
1360 QFile::remove(activeBView->objectMap[name].Data);
1361 QFileInfo fi(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + name + ".png"));
1362 if (fi.exists())
1363 QFile::remove(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + name + ".png"));
1364 QFileInfo fiD(QDir::toNativeSeparators(activeBView->ScFilename + "/" + name));
1365 if ((fiD.exists()) && (fiD.isDir()))
1366 {
1367 QDir dd = QDir(QDir::toNativeSeparators(activeBView->ScFilename));
1368 QDir d(QDir::toNativeSeparators(activeBView->ScFilename + "/" + name), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1369 if ((d.exists()) && (d.count() != 0))
1370 {
1371 for (uint dc = 0; dc < d.count(); ++dc)
1372 {
1373 QFile::remove(QDir::toNativeSeparators(activeBView->ScFilename + "/" + name + "/" + d[dc]));
1374 }
1375 }
1376 dd.rmdir(name);
1377 }
1378 activeBView->objectMap.remove(name);
1379 delete activeBView->takeItem(activeBView->row(ite));
1380 if (activeBView == tempBView)
1381 emit updateRecentMenue();
1382 actItem = nullptr;
1383 }
1384
deleteAllObj()1385 void Biblio::deleteAllObj()
1386 {
1387 if (!activeBView->canWrite)
1388 return;
1389 int t = ScMessageBox::warning(this, CommonStrings::trWarning, tr("Do you really want to delete all entries?"),
1390 QMessageBox::Yes | QMessageBox::No,
1391 QMessageBox::No, // GUI default
1392 QMessageBox::Yes); // batch default
1393 if (t == QMessageBox::No)
1394 return;
1395 QMap<QString,BibView::Elem>::Iterator it;
1396 for (it = activeBView->objectMap.begin(); it != activeBView->objectMap.end(); ++it)
1397 {
1398 QFile f(it.value().Data);
1399 f.remove();
1400 QFileInfo fi(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1401 if (fi.exists())
1402 {
1403 QFile f2(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1404 f2.remove();
1405 }
1406 QFileInfo fiD(QDir::toNativeSeparators(activeBView->ScFilename + "/" + it.key()));
1407 if ((fiD.exists()) && (fiD.isDir()))
1408 {
1409 QDir dd = QDir(QDir::toNativeSeparators(activeBView->ScFilename));
1410 QDir d(QDir::toNativeSeparators(activeBView->ScFilename + "/" + it.key()), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1411 if ((d.exists()) && (d.count() != 0))
1412 {
1413 for (uint dc = 0; dc < d.count(); ++dc)
1414 {
1415 QFile::remove(QDir::toNativeSeparators(activeBView->ScFilename + "/" + it.key() + "/" + d[dc]));
1416 }
1417 }
1418 dd.rmdir(QDir::toNativeSeparators(activeBView->ScFilename + "/" + it.key()));
1419 }
1420 }
1421 activeBView->clear();
1422 activeBView->objectMap.clear();
1423 if (activeBView == tempBView)
1424 emit updateRecentMenue();
1425 actItem = nullptr;
1426 }
1427
renameObj()1428 void Biblio::renameObj()
1429 {
1430 if (!activeBView->canWrite)
1431 return;
1432 QString nam;
1433 QString objData;
1434 QPixmap objPreview;
1435 QListWidgetItem *ite = actItem;
1436 QString oldName = ite->text();
1437 Query dia(this, "tt", 1, tr("&Name:"), tr("New Name"));
1438 dia.setValidator(QRegExp("[\\w()]+"));
1439 dia.setEditText(ite->text(), true);
1440 dia.setTestList(activeBView->objectMap.keys());
1441 if (dia.exec())
1442 nam = dia.getEditText();
1443 else
1444 return;
1445 ite->setText(nam);
1446 ite->setToolTip(nam);
1447 objData = activeBView->objectMap[oldName].Data;
1448 objPreview = activeBView->objectMap[oldName].Preview;
1449 QDir d = QDir();
1450 d.rename(objData, QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + ite->text() + ".sce")));
1451 QFileInfo fi(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + oldName + ".png"));
1452 if (fi.exists())
1453 d.rename(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + oldName + ".png"), QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + ite->text() + ".png")));
1454 QFileInfo fiD(QDir::toNativeSeparators(activeBView->ScFilename + "/" + oldName));
1455 if ((fiD.exists()) && (fiD.isDir()))
1456 {
1457 QDir d = QDir();
1458 d.rename(QDir::toNativeSeparators(activeBView->ScFilename + "/" + oldName), QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + ite->text())));
1459 adjustReferences(QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + ite->text() + ".sce")));
1460 }
1461 activeBView->objectMap.remove(oldName);
1462 activeBView->addObject(ite->text(), QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + ite->text() + ".sce")), objPreview);
1463 if (activeBView == tempBView)
1464 emit updateRecentMenue();
1465 }
1466
adjustReferences(const QString & nam)1467 void Biblio::adjustReferences(const QString& nam)
1468 {
1469 QByteArray cf;
1470 if (loadRawText(nam, cf))
1471 {
1472 QString f;
1473 if (cf.left(16) == "<SCRIBUSELEMUTF8")
1474 f = QString::fromUtf8(cf.data());
1475 else
1476 f = cf.data();
1477 QDomDocument docu("scridoc");
1478 docu.setContent(f);
1479 QDomElement elem = docu.documentElement();
1480 QDomNode node = elem.firstChild();
1481 QFileInfo fid(nam);
1482 while (!node.isNull())
1483 {
1484 QDomElement pg = node.toElement();
1485 if (pg.tagName() == "ITEM")
1486 {
1487 PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
1488 if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
1489 {
1490 QString Pfile = pg.attribute("PFILE");
1491 if (!Pfile.isEmpty())
1492 {
1493 QFileInfo fi(Pfile);
1494 pg.setAttribute("PFILE", fid.baseName() + "/" + fi.fileName());
1495 }
1496 QString Pfile2 = pg.attribute("PFILE2","");
1497 if (!Pfile2.isEmpty())
1498 {
1499 QFileInfo fi(Pfile2);
1500 pg.setAttribute("PFILE2", fid.baseName() + "/" + fi.fileName());
1501 }
1502 QString Pfile3 = pg.attribute("PFILE3","");
1503 if (!Pfile3.isEmpty())
1504 {
1505 QFileInfo fi(Pfile3);
1506 pg.setAttribute("PFILE3", fid.baseName() + "/" + fi.fileName());
1507 }
1508 pg.setAttribute("relativePaths", 1);
1509 }
1510 else if (PType == PageItem::OSGFrame)
1511 {
1512 QString Pfile = pg.attribute("modelFile");
1513 if (!Pfile.isEmpty())
1514 {
1515 QFileInfo fi(Pfile);
1516 pg.setAttribute("modelFile", fid.baseName() + "/" + fi.fileName());
1517 }
1518 }
1519 else if (PType == PageItem::Group)
1520 {
1521 adjustReferencesGroups(pg, fid);
1522 }
1523 }
1524 node = node.nextSibling();
1525 }
1526 QFile fl(nam);
1527 if (!fl.open(QIODevice::WriteOnly))
1528 return ;
1529 QDataStream s;
1530 QByteArray cs = docu.toByteArray();
1531 s.setDevice(&fl);
1532 s.writeRawData(cs.data(), cs.length());
1533 fl.close();
1534 }
1535 }
1536
adjustReferencesGroups(const QDomElement & elem,const QFileInfo & fid)1537 void Biblio::adjustReferencesGroups(const QDomElement& elem, const QFileInfo& fid)
1538 {
1539 QDomNode node = elem.firstChild();
1540 while (!node.isNull())
1541 {
1542 QDomElement pg = node.toElement();
1543 if (pg.tagName() == "PAGEOBJECT")
1544 {
1545 PageItem::ItemType PType = static_cast<PageItem::ItemType>(pg.attribute("PTYPE").toInt());
1546 if ((PType == PageItem::ImageFrame) || (PType == PageItem::TextFrame))
1547 {
1548 QString Pfile = pg.attribute("PFILE");
1549 if (!Pfile.isEmpty())
1550 {
1551 QFileInfo fi(Pfile);
1552 pg.setAttribute("PFILE", fid.baseName() + "/" + fi.fileName());
1553 }
1554 QString Pfile2 = pg.attribute("PFILE2","");
1555 if (!Pfile2.isEmpty())
1556 {
1557 QFileInfo fi(Pfile2);
1558 pg.setAttribute("PFILE2", fid.baseName() + "/" + fi.fileName());
1559 }
1560 QString Pfile3 = pg.attribute("PFILE3","");
1561 if (!Pfile3.isEmpty())
1562 {
1563 QFileInfo fi(Pfile3);
1564 pg.setAttribute("PFILE3", fid.baseName() + "/" + fi.fileName());
1565 }
1566 pg.setAttribute("relativePaths", 1);
1567 }
1568 else if (PType == PageItem::OSGFrame)
1569 {
1570 QString Pfile = pg.attribute("modelFile");
1571 if (!Pfile.isEmpty())
1572 {
1573 QFileInfo fi(Pfile);
1574 pg.setAttribute("modelFile", fid.baseName() + "/" + fi.fileName());
1575 }
1576 }
1577 else if (PType == PageItem::Group)
1578 {
1579 adjustReferencesGroups(pg, fid);
1580 }
1581 }
1582 node = node.nextSibling();
1583 }
1584 }
1585
getObjectName(QString & text)1586 QString Biblio::getObjectName(QString &text)
1587 {
1588 QDomDocument docu("scridoc");
1589 docu.setContent(text);
1590 QDomElement elem = docu.documentElement();
1591 QDomNode node = elem.firstChild();
1592 QString result = "";
1593 while (!node.isNull())
1594 {
1595 QDomElement pg = node.toElement();
1596 if (pg.tagName() == "ITEM")
1597 {
1598 result = pg.attribute("ANNAME");
1599 break;
1600 }
1601 node = node.nextSibling();
1602 }
1603 return result;
1604 }
1605
objFromFile(const QString & path,int testResult)1606 void Biblio::objFromFile(const QString& path, int testResult)
1607 {
1608 if (!activeBView->canWrite)
1609 return;
1610 bool isImage = false;
1611 bool isVector = false;
1612 QString tmp;
1613 QFileInfo fi(path);
1614 if (!fi.exists())
1615 return;
1616
1617 QString nam = fi.baseName();
1618 if (Frame3->currentIndex() == 1)
1619 {
1620 if (activeBView->objectMap.contains(nam))
1621 nam += "("+ tmp.setNum(m_tempCount) + ")";
1622 m_tempCount++;
1623 }
1624 else
1625 {
1626 if (activeBView->objectMap.contains(nam))
1627 nam += "("+ tmp.setNum(m_tempCount) + ")";
1628 }
1629 Query dia(this, "tt", true, tr("&Name:"), tr("New Entry"));
1630 dia.setValidator(QRegExp("[\\w()]+"));
1631 dia.setEditText(nam, true);
1632 dia.setTestList(activeBView->objectMap.keys());
1633 if (dia.exec())
1634 nam = dia.getEditText();
1635 else
1636 return;
1637 QImage img;
1638 if (testResult == 9999)
1639 {
1640 bool mode = false;
1641 ScImage im;
1642 CMSettings cms(nullptr, "", Intent_Perceptual);
1643 cms.allowColorManagement(false);
1644 if (im.loadPicture(path, 1, cms, ScImage::Thumbnail, 72, &mode))
1645 img = im.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
1646 isImage = true;
1647 }
1648 else
1649 {
1650 const FileFormat * fmt = LoadSavePlugin::getFormatById(testResult);
1651 if (fmt)
1652 {
1653 img = fmt->readThumbnail(path);
1654 img = img.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
1655 }
1656 isVector = true;
1657 }
1658 QByteArray cf;
1659 if (!loadRawText(path, cf))
1660 return;
1661 QPixmap pm = QPixmap::fromImage(img);
1662 QFile f(QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + nam + "." + fi.completeSuffix())));
1663 if (!f.open(QIODevice::WriteOnly))
1664 return;
1665 QDataStream s;
1666 s.setDevice(&f);
1667 s.writeRawData(cf.data(), cf.length());
1668 f.close();
1669 if (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews)
1670 {
1671 QDir thumbs(activeBView->ScFilename);
1672 if (thumbs.exists())
1673 {
1674 if ((activeBView->canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
1675 thumbs.mkdir(".ScribusThumbs");
1676 }
1677 img.save(QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + nam +".png")), "PNG");
1678 }
1679 activeBView->addObject(nam, QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + nam + "." + fi.completeSuffix())), pm, false, isImage, isVector);
1680 QPixmap pm2(60, 60);
1681 pm2.fill(palette().color(QPalette::Base));
1682 QPainter p;
1683 p.begin(&pm2);
1684 p.drawPixmap(30 - pm.width() / 2, 30 - pm.height() / 2, pm);
1685 p.end();
1686 QListWidgetItem *item = new QListWidgetItem(QIcon(pm2), nam, activeBView);
1687 item->setToolTip(nam);
1688 activeBView->objectMap[nam].widgetItem = item;
1689 if (isImage)
1690 item->setHidden(conf_HideImages->isChecked());
1691 if (isVector)
1692 item->setHidden(conf_HideVectors->isChecked());
1693 if (Frame3->currentIndex() == 1)
1694 {
1695 if (tempBView->objectMap.count() > PrefsManager::instance().appPrefs.scrapbookPrefs.numScrapbookCopies)
1696 {
1697 QMap<QString,BibView::Elem>::Iterator it;
1698 it = tempBView->objectMap.begin();
1699 QFile f(it.value().Data);
1700 f.remove();
1701 QFileInfo fi(QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1702 if (fi.exists())
1703 {
1704 QFile f2(QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1705 f2.remove();
1706 }
1707 QFileInfo fiD(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()));
1708 if ((fiD.exists()) && (fiD.isDir()))
1709 {
1710 QDir dd = QDir(QDir::toNativeSeparators(tempBView->ScFilename));
1711 QDir d(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1712 if ((d.exists()) && (d.count() != 0))
1713 {
1714 for (uint dc = 0; dc < d.count(); ++dc)
1715 {
1716 QFile::remove(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key() + "/" + d[dc]));
1717 }
1718 }
1719 dd.rmdir(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()));
1720 }
1721 QString name = it.key();
1722 tempBView->objectMap.erase(it);
1723 QList<QListWidgetItem *> itL = tempBView->findItems(name, Qt::MatchExactly);
1724 if (itL.count() > 0)
1725 {
1726 QListWidgetItem *ite = itL.at(0);
1727 delete tempBView->takeItem(tempBView->row(ite));
1728 }
1729 }
1730 emit updateRecentMenue();
1731 }
1732 reloadLib(activeBView->ScFilename);
1733 }
1734
objFromMenu(QString text)1735 void Biblio::objFromMenu(QString text)
1736 {
1737 QString nam = "";
1738 QString tmp;
1739 if (!activeBView->canWrite)
1740 return;
1741 nam = getObjectName(text);
1742 if (Frame3->currentIndex() == 1)
1743 {
1744 if (nam.isEmpty())
1745 nam = tr("Object") + tmp.setNum(m_tempCount);
1746 if (activeBView->objectMap.contains(nam))
1747 nam += "("+ tmp.setNum(m_tempCount) + ")";
1748 m_tempCount++;
1749 }
1750 else
1751 {
1752 if (nam.isEmpty())
1753 nam = tr("Object") + tmp.setNum(activeBView->objectMap.count());
1754 if (activeBView->objectMap.contains(nam))
1755 nam += "("+ tmp.setNum(m_tempCount) + ")";
1756 }
1757 Query dia(this, "tt", 1, tr("&Name:"), tr("New Entry"));
1758 dia.setValidator(QRegExp("[\\w()]+"));
1759 dia.setEditText(nam, true);
1760 dia.setTestList(activeBView->objectMap.keys());
1761 if (dia.exec())
1762 nam = dia.getEditText();
1763 else
1764 return;
1765 QString ff = text;
1766 activeBView->checkAndChange(ff, QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + nam + ".sce")), QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename)));
1767 ScPreview *pre = new ScPreview();
1768 QPixmap pm = QPixmap::fromImage(pre->createPreview(ff));
1769 activeBView->addObject(nam, QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/" + nam + ".sce")), pm);
1770 if (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews)
1771 {
1772 QDir thumbs(activeBView->ScFilename);
1773 if (thumbs.exists())
1774 {
1775 if ((activeBView->canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
1776 thumbs.mkdir(".ScribusThumbs");
1777 }
1778 pm.save(QDir::cleanPath(QDir::toNativeSeparators(activeBView->ScFilename + "/.ScribusThumbs/" + nam +".png")), "PNG");
1779 }
1780 pm = pm.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
1781 QPixmap pm2(60, 60);
1782 pm2.fill(palette().color(QPalette::Base));
1783 QPainter p;
1784 p.begin(&pm2);
1785 p.drawPixmap(30 - pm.width() / 2, 30 - pm.height() / 2, pm);
1786 p.end();
1787 QListWidgetItem *item = new QListWidgetItem(QIcon(pm2), nam, activeBView);
1788 item->setToolTip(nam);
1789 activeBView->objectMap[nam].widgetItem = item;
1790 delete pre;
1791
1792 if (Frame3->currentIndex() == 1)
1793 {
1794 if (tempBView->objectMap.count() > PrefsManager::instance().appPrefs.scrapbookPrefs.numScrapbookCopies)
1795 {
1796 QMap<QString,BibView::Elem>::Iterator it;
1797 it = tempBView->objectMap.begin();
1798 QFile f(it.value().Data);
1799 f.remove();
1800 QFileInfo fi(QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1801 if (fi.exists())
1802 {
1803 QFile f2(QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/" + it.key() + ".png"));
1804 f2.remove();
1805 }
1806 QFileInfo fiD(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()));
1807 if ((fiD.exists()) && (fiD.isDir()))
1808 {
1809 QDir dd = QDir(QDir::toNativeSeparators(tempBView->ScFilename));
1810 QDir d(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1811 if ((d.exists()) && (d.count() != 0))
1812 {
1813 for (uint dc = 0; dc < d.count(); ++dc)
1814 {
1815 QFile::remove(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key() + "/" + d[dc]));
1816 }
1817 }
1818 dd.rmdir(QDir::toNativeSeparators(tempBView->ScFilename + "/" + it.key()));
1819 }
1820 QString name = it.key();
1821 tempBView->objectMap.erase(it);
1822 QList<QListWidgetItem *> itL = tempBView->findItems(name, Qt::MatchExactly);
1823 if (itL.count() > 0)
1824 {
1825 QListWidgetItem *ite = itL.at(0);
1826 delete tempBView->takeItem(tempBView->row(ite));
1827 }
1828 }
1829 emit updateRecentMenue();
1830 reloadLib(activeBView->ScFilename);
1831 }
1832 }
1833
objFromCopyAction(const QString & text,const QString & name)1834 void Biblio::objFromCopyAction(const QString& text, const QString& name)
1835 {
1836 // Something is bad with temp scrapbook directory, either it does not exists
1837 // or is unreadeable, do not attempt to create temp scrapbook items in such case,
1838 // they may end up in root directory or drive
1839 if (tempBView->ScFilename.isEmpty())
1840 return;
1841 QString nativeTempScrapPath = QDir::toNativeSeparators(tempBView->ScFilename + "/");
1842 QString nativeTempThumbsPath = QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/");
1843
1844 QString tmp;
1845 QString nam = name;
1846 if (nam.isEmpty())
1847 nam = tr("Object") + tmp.setNum(m_tempCount);
1848 if (tempBView->objectMap.contains(nam))
1849 nam += "("+ tmp.setNum(m_tempCount) + ")";
1850 m_tempCount++;
1851 tempBView->checkAndChange(text, QDir::cleanPath(nativeTempScrapPath + nam + ".sce"), QDir::cleanPath(QDir::toNativeSeparators(tempBView->ScFilename)));
1852 ScPreview *pre = new ScPreview();
1853 QPixmap pm = QPixmap::fromImage(pre->createPreview(text));
1854 tempBView->addObject(nam, QDir::cleanPath(nativeTempScrapPath + nam + ".sce"), pm);
1855 if (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews)
1856 {
1857 QDir thumbs(tempBView->ScFilename);
1858 if (thumbs.exists())
1859 {
1860 if ((tempBView->canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
1861 thumbs.mkdir(".ScribusThumbs");
1862 }
1863 pm.save(QDir::cleanPath(nativeTempThumbsPath + nam +".png"), "PNG");
1864 }
1865 pm = pm.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
1866 QPixmap pm2(60, 60);
1867 pm2.fill(palette().color(QPalette::Base));
1868 QPainter p;
1869 p.begin(&pm2);
1870 p.drawPixmap(30 - pm.width() / 2, 30 - pm.height() / 2, pm);
1871 p.end();
1872 QListWidgetItem *item = new QListWidgetItem(QIcon(pm2), nam, tempBView);
1873 item->setToolTip(nam);
1874 tempBView->objectMap[nam].widgetItem = item;
1875 delete pre;
1876 if (tempBView->objectMap.count() > PrefsManager::instance().appPrefs.scrapbookPrefs.numScrapbookCopies)
1877 {
1878 QMap<QString,BibView::Elem>::Iterator it;
1879 it = tempBView->objectMap.begin();
1880 QFile f(it.value().Data);
1881 f.remove();
1882 QFileInfo fi(nativeTempThumbsPath + it.key() + ".png");
1883 if (fi.exists())
1884 {
1885 QFile f2(nativeTempThumbsPath + it.key() + ".png");
1886 f2.remove();
1887 }
1888 QFileInfo fiD(nativeTempScrapPath + it.key());
1889 if ((fiD.exists()) && (fiD.isDir()))
1890 {
1891 QDir dd = QDir(QDir::toNativeSeparators(tempBView->ScFilename));
1892 QDir d(nativeTempScrapPath + it.key(), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1893 if ((d.exists()) && (d.count() != 0))
1894 {
1895 for (uint dc = 0; dc < d.count(); ++dc)
1896 {
1897 QFile::remove(nativeTempScrapPath + it.key() + "/" + d[dc]);
1898 }
1899 }
1900 dd.rmdir(nativeTempScrapPath + it.key());
1901 }
1902 QString name = it.key();
1903 tempBView->objectMap.erase(it);
1904 QList<QListWidgetItem *> itL = tempBView->findItems(name, Qt::MatchExactly);
1905 if (itL.count() > 0)
1906 {
1907 QListWidgetItem *ite = itL.at(0);
1908 delete tempBView->takeItem(tempBView->row(ite));
1909 }
1910 }
1911 reloadLib(tempBView->ScFilename);
1912 }
1913
objFromMainMenu(QString text,int scrapID)1914 void Biblio::objFromMainMenu(QString text, int scrapID)
1915 {
1916 QString nam;
1917 QString tmp;
1918 int scID = scrapID;
1919 if (scID > 0)
1920 scID++;
1921 BibView* actBView = (BibView*)Frame3->widget(scID);
1922 if (!actBView->canWrite)
1923 return;
1924 nam = getObjectName(text);
1925 if (nam.isEmpty())
1926 nam = tr("Object") + tmp.setNum(actBView->objectMap.count());
1927 if (actBView->objectMap.contains(nam))
1928 nam += "("+ tmp.setNum(m_tempCount) + ")";
1929 Query dia(this, "tt", 1, tr("&Name:"), tr("New Entry"));
1930 dia.setValidator(QRegExp("[\\w()]+"));
1931 dia.setEditText(nam, true);
1932 dia.setTestList(activeBView->objectMap.keys());
1933 if (dia.exec())
1934 nam = dia.getEditText();
1935 else
1936 return;
1937 QString ff = text;
1938 actBView->checkAndChange(ff, QDir::cleanPath(QDir::toNativeSeparators(actBView->ScFilename + "/" + nam + ".sce")), QDir::cleanPath(QDir::toNativeSeparators(actBView->ScFilename)));
1939 ScPreview *pre = new ScPreview();
1940 QPixmap pm = QPixmap::fromImage(pre->createPreview(ff));
1941 actBView->addObject(nam, QDir::cleanPath(QDir::toNativeSeparators(actBView->ScFilename + "/" + nam + ".sce")), pm);
1942 if (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews)
1943 {
1944 QDir thumbs(actBView->ScFilename);
1945 if (thumbs.exists())
1946 {
1947 if ((actBView->canWrite) && (PrefsManager::instance().appPrefs.scrapbookPrefs.writePreviews))
1948 thumbs.mkdir(".ScribusThumbs");
1949 }
1950 pm.save(QDir::cleanPath(QDir::toNativeSeparators(actBView->ScFilename + "/.ScribusThumbs/" + nam +".png")), "PNG");
1951 }
1952 pm = pm.scaled(60, 60, Qt::KeepAspectRatio, Qt::SmoothTransformation);
1953 QPixmap pm2(60, 60);
1954 pm2.fill(palette().color(QPalette::Base));
1955 QPainter p;
1956 p.begin(&pm2);
1957 p.drawPixmap(30 - pm.width() / 2, 30 - pm.height() / 2, pm);
1958 p.end();
1959 QListWidgetItem *item = new QListWidgetItem(QIcon(pm2), nam, actBView);
1960 item->setToolTip(nam);
1961 actBView->objectMap[nam].widgetItem = item;
1962 delete pre;
1963 reloadLib(actBView->ScFilename);
1964 }
1965
cleanUpTemp()1966 void Biblio::cleanUpTemp()
1967 {
1968 // Something is bad with temp scrapbook directory, either it does not exists
1969 // or is unreadeable, do not attempt to delete files in such case
1970 if (tempBView->ScFilename.isEmpty())
1971 return;
1972 QString nativeScrapPath = QDir::toNativeSeparators(tempBView->ScFilename + "/");
1973 QString nativeThumbsPath = QDir::toNativeSeparators(tempBView->ScFilename + "/.ScribusThumbs/");
1974
1975 QMap<QString,BibView::Elem>::Iterator it;
1976 for (it = tempBView->objectMap.begin(); it != tempBView->objectMap.end(); ++it)
1977 {
1978 QFile f(it.value().Data);
1979 f.remove();
1980 QFileInfo fi1(nativeScrapPath + it.key() + ".png");
1981 if (fi1.exists())
1982 {
1983 QFile f2(nativeScrapPath + it.key() + ".png");
1984 f2.remove();
1985 }
1986 QFileInfo fi2(nativeThumbsPath + it.key() + ".png");
1987 if (fi2.exists())
1988 {
1989 QFile f2(nativeThumbsPath + it.key() + ".png");
1990 f2.remove();
1991 }
1992 QFileInfo fiD(nativeScrapPath + it.key());
1993 if ((fiD.exists()) && (fiD.isDir()))
1994 {
1995 QDir dd = QDir(QDir::toNativeSeparators(tempBView->ScFilename));
1996 QDir d(nativeScrapPath + it.key(), "*", QDir::Name, QDir::Files | QDir::Readable | QDir::NoSymLinks);
1997 if ((d.exists()) && (d.count() != 0))
1998 {
1999 for (uint dc = 0; dc < d.count(); ++dc)
2000 QFile::remove(nativeScrapPath + it.key() + "/" + d[dc]);
2001 }
2002 dd.rmdir(nativeScrapPath + it.key());
2003 }
2004 }
2005 }
2006
changeEvent(QEvent * e)2007 void Biblio::changeEvent(QEvent *e)
2008 {
2009 if (e->type() == QEvent::LanguageChange)
2010 languageChange();
2011 else
2012 ScDockPalette::changeEvent(e);
2013 }
2014
iconSetChange()2015 void Biblio::iconSetChange()
2016 {
2017 IconManager& iconManager = IconManager::instance();
2018
2019 newButton->setIcon(iconManager.loadPixmap("16/document-new.png"));
2020 newButton->setIconSize(QSize(16, 16));
2021
2022 upButton->setIcon(iconManager.loadPixmap("16/go-up.png"));
2023 upButton->setIconSize(QSize(16, 16));
2024
2025 importButton->setIcon(iconManager.loadPixmap("compfile16.png"));
2026 importButton->setIconSize(QSize(16, 16));
2027
2028 closeButton->setIcon(iconManager.loadPixmap("16/close.png"));
2029 closeButton->setIconSize(QSize(16, 16));
2030
2031 configButton->setIcon(iconManager.loadPixmap("16/configure.png"));
2032 configButton->setIconSize(QSize(16, 16));
2033 }
2034
languageChange()2035 void Biblio::languageChange()
2036 {
2037 setWindowTitle( tr( "Scrapbook" ) );
2038 newButton->setToolTip( tr( "Create a new scrapbook page" ) );
2039 upButton->setToolTip( tr( "Go up one Directory" ) );
2040 importButton->setToolTip( tr( "Import a scrapbook file from Scribus <=1.3.2" ) );
2041 closeButton->setToolTip( tr( "Close the selected scrapbook" ) );
2042 configButton->setToolTip( tr( "Configure the scrapbook" ) );
2043 conf_HideDirs->setText( tr("Hide Directories"));
2044 conf_HideImages->setText( tr("Hide Images"));
2045 conf_HideVectors->setText( tr("Hide Vector files"));
2046 conf_OpenMode->setText( tr("Open Directories in a new tab"));
2047
2048 int index = Frame3->indexOf(activeBView);
2049 if (index >= 0)
2050 {
2051 Frame3->setItemText(index, tr("Main") );
2052 activeBView->visibleName = tr("Main");
2053 }
2054
2055 index = Frame3->indexOf(tempBView);
2056 if (index >= 0)
2057 {
2058 Frame3->setItemText(index, tr("Copied Items"));
2059 tempBView->visibleName = tr("Copied Items");
2060 }
2061 }
2062