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