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 							 -------------------
9 	begin                : Sat Jan 14 2012
10 	copyright            : (C) 2012 by Franz Schmid
11 	email                : Franz.Schmid@altmuehlnet.de
12  ***************************************************************************/
13 #include "commonstrings.h"
14 
15 #include "importidml.h"
16 #include "importidmlplugin.h"
17 #include "prefscontext.h"
18 #include "prefsfile.h"
19 #include "prefsmanager.h"
20 #include "scpage.h"
21 #include "scraction.h"
22 #include "scribuscore.h"
23 #include "undomanager.h"
24 #include "util_formats.h"
25 
26 #include "ui/customfdialog.h"
27 #include "ui/scmwmenumanager.h"
28 
importidml_getPluginAPIVersion()29 int importidml_getPluginAPIVersion()
30 {
31 	return PLUGIN_API_VERSION;
32 }
33 
importidml_getPlugin()34 ScPlugin* importidml_getPlugin()
35 {
36 	ImportIdmlPlugin* plug = new ImportIdmlPlugin();
37 	Q_CHECK_PTR(plug);
38 	return plug;
39 }
40 
importidml_freePlugin(ScPlugin * plugin)41 void importidml_freePlugin(ScPlugin* plugin)
42 {
43 	ImportIdmlPlugin* plug = qobject_cast<ImportIdmlPlugin*>(plugin);
44 	Q_ASSERT(plug);
45 	delete plug;
46 }
47 
ImportIdmlPlugin()48 ImportIdmlPlugin::ImportIdmlPlugin() :
49 	importAction(new ScrAction(ScrAction::DLL, "", QKeySequence(), this))
50 {
51 	// Set action info in languageChange, so we only have to do it in one
52 	// place. This includes registering file format support.
53 	registerFormats();
54 	languageChange();
55 }
56 
languageChange()57 void ImportIdmlPlugin::languageChange()
58 {
59 	importAction->setText( tr("Import Idml..."));
60 	FileFormat* fmt = getFormatByExt("idml");
61 	fmt->trName = tr("Adobe InDesign IDML");
62 	fmt->filter = tr("Adobe InDesign IDML (*.idml *.IDML)");
63 	FileFormat* fmt2 = getFormatByExt("idms");
64 	fmt2->trName = tr("Adobe InDesign IDMS");
65 	fmt2->filter = tr("Adobe InDesign IDMS (*.idms *.IDMS)");
66 }
67 
~ImportIdmlPlugin()68 ImportIdmlPlugin::~ImportIdmlPlugin()
69 {
70 	unregisterAll();
71 }
72 
fullTrName() const73 QString ImportIdmlPlugin::fullTrName() const
74 {
75 	return QObject::tr("Idml Importer");
76 }
77 
78 
getAboutData() const79 const ScActionPlugin::AboutData* ImportIdmlPlugin::getAboutData() const
80 {
81 	AboutData* about = new AboutData;
82 	about->authors = "Franz Schmid <franz@scribus.info>";
83 	about->shortDescription = tr("Imports IDML Files");
84 	about->description = tr("Imports most IDML files into the current document, converting their vector data into Scribus objects.");
85 	about->license = "GPL";
86 	Q_CHECK_PTR(about);
87 	return about;
88 }
89 
deleteAboutData(const AboutData * about) const90 void ImportIdmlPlugin::deleteAboutData(const AboutData* about) const
91 {
92 	Q_ASSERT(about);
93 	delete about;
94 }
95 
registerFormats()96 void ImportIdmlPlugin::registerFormats()
97 {
98 	FileFormat fmt(this);
99 	fmt.trName = tr("Adobe InDesign IDML");
100 	fmt.filter = tr("Adobe InDesign IDML (*.idml *.IDML)");
101 	fmt.formatId = 0;
102 	fmt.fileExtensions = QStringList() << "idml";
103 	fmt.load = true;
104 	fmt.save = false;
105 	fmt.thumb = true;
106 	fmt.colorReading = true;
107 	fmt.mimeTypes = QStringList();
108 	fmt.mimeTypes.append("application/vnd.adobe.indesign-idml-package");
109 	fmt.priority = 64; // Priority
110 	registerFormat(fmt);
111 
112 	FileFormat fmt2(this);
113 	fmt2.trName = tr("Adobe InDesign IDMS");
114 	fmt2.filter = tr("Adobe InDesign IDMS (*.idms *.IDMS)");
115 	fmt2.formatId = 0;
116 	fmt2.fileExtensions = QStringList() << "idms";
117 	fmt2.load = true;
118 	fmt2.save = false;
119 	fmt2.thumb = true;
120 	fmt2.colorReading = true;
121 	fmt2.mimeTypes = QStringList();
122 	fmt2.mimeTypes.append("application/vnd.adobe.indesign-idms");
123 	fmt2.priority = 64; // Priority
124 	registerFormat(fmt2);
125 }
126 
fileSupported(QIODevice *,const QString & fileName) const127 bool ImportIdmlPlugin::fileSupported(QIODevice* /* file */, const QString & fileName) const
128 {
129 	return true;
130 }
131 
loadFile(const QString & fileName,const FileFormat &,int flags,int)132 bool ImportIdmlPlugin::loadFile(const QString & fileName, const FileFormat &, int flags, int /*index*/)
133 {
134 	// There's only one format to handle, so we just call import(...)
135 	return import(fileName, flags);
136 }
137 
import(QString fileName,int flags)138 bool ImportIdmlPlugin::import(QString fileName, int flags)
139 {
140 	if (!checkFlags(flags))
141 		return false;
142 	if (fileName.isEmpty())
143 	{
144 		flags |= lfInteractive;
145 		PrefsContext* prefs = PrefsManager::instance().prefsFile->getPluginContext("importidml");
146 		QString wdir = prefs->get("wdir", ".");
147 		CustomFDialog diaf(ScCore->primaryMainWindow(), wdir, QObject::tr("Open"), tr("All Supported Formats")+" (*.idml *.IDML *.idms *.IDMS);;All Files (*)");
148 		if (diaf.exec())
149 		{
150 			fileName = diaf.selectedFile();
151 			prefs->set("wdir", fileName.left(fileName.lastIndexOf("/")));
152 		}
153 		else
154 			return true;
155 	}
156 	m_Doc=ScCore->primaryMainWindow()->doc;
157 	UndoTransaction activeTransaction;
158 	bool emptyDoc = (m_Doc == nullptr);
159 	bool hasCurrentPage = (m_Doc && m_Doc->currentPage());
160 	TransactionSettings trSettings;
161 	trSettings.targetName   = hasCurrentPage ? m_Doc->currentPage()->getUName() : "";
162 	trSettings.targetPixmap = Um::IImageFrame;
163 	trSettings.actionName   = Um::ImportIDML;
164 	trSettings.description  = fileName;
165 	trSettings.actionPixmap = Um::IXFIG;
166 	if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
167 		UndoManager::instance()->setUndoEnabled(false);
168 	if (UndoManager::undoEnabled())
169 		activeTransaction = UndoManager::instance()->beginTransaction(trSettings);
170 	IdmlPlug *dia = new IdmlPlug(m_Doc, flags);
171 	Q_CHECK_PTR(dia);
172 	dia->import(fileName, trSettings, flags, !(flags & lfScripted));
173 	if (activeTransaction)
174 		activeTransaction.commit();
175 	if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
176 		UndoManager::instance()->setUndoEnabled(true);
177 	delete dia;
178 	return true;
179 }
180 
readThumbnail(const QString & fileName)181 QImage ImportIdmlPlugin::readThumbnail(const QString& fileName)
182 {
183 	if (fileName.isEmpty())
184 		return QImage();
185 	UndoManager::instance()->setUndoEnabled(false);
186 	m_Doc = nullptr;
187 	IdmlPlug *dia = new IdmlPlug(m_Doc, lfCreateThumbnail);
188 	Q_CHECK_PTR(dia);
189 	QImage ret = dia->readThumbnail(fileName);
190 	UndoManager::instance()->setUndoEnabled(true);
191 	delete dia;
192 	return ret;
193 }
194 
readColors(const QString & fileName,ColorList & colors)195 bool ImportIdmlPlugin::readColors(const QString& fileName, ColorList &colors)
196 {
197 	if (fileName.isEmpty())
198 		return false;
199 	UndoManager::instance()->setUndoEnabled(false);
200 	m_Doc = nullptr;
201 	IdmlPlug *dia = new IdmlPlug(m_Doc, lfCreateThumbnail);
202 	Q_CHECK_PTR(dia);
203 	bool ret = dia->readColors(fileName, colors);
204 	UndoManager::instance()->setUndoEnabled(true);
205 	delete dia;
206 	return ret;
207 }
208