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 #include "commonstrings.h"
8 
9 #include "importcdr.h"
10 #include "importcdrplugin.h"
11 #include "prefscontext.h"
12 #include "prefsfile.h"
13 #include "prefsmanager.h"
14 #include "scpage.h"
15 #include "scraction.h"
16 #include "scribuscore.h"
17 #include "undomanager.h"
18 #include "util_formats.h"
19 
20 #include "ui/customfdialog.h"
21 #include "ui/scmessagebox.h"
22 #include "ui/scmwmenumanager.h"
23 #include <QMessageBox>
24 
importcdr_getPluginAPIVersion()25 int importcdr_getPluginAPIVersion()
26 {
27 	return PLUGIN_API_VERSION;
28 }
29 
importcdr_getPlugin()30 ScPlugin* importcdr_getPlugin()
31 {
32 	ImportCdrPlugin* plug = new ImportCdrPlugin();
33 	Q_CHECK_PTR(plug);
34 	return plug;
35 }
36 
importcdr_freePlugin(ScPlugin * plugin)37 void importcdr_freePlugin(ScPlugin* plugin)
38 {
39 	ImportCdrPlugin* plug = qobject_cast<ImportCdrPlugin*>(plugin);
40 	Q_ASSERT(plug);
41 	delete plug;
42 }
43 
ImportCdrPlugin()44 ImportCdrPlugin::ImportCdrPlugin() :
45 	importAction(new ScrAction(ScrAction::DLL, QPixmap(), QPixmap(), "", QKeySequence(), this))
46 {
47 	// Set action info in languageChange, so we only have to do it in one
48 	// place. This includes registering file format support.
49 	registerFormats();
50 	languageChange();
51 }
52 
languageChange()53 void ImportCdrPlugin::languageChange()
54 {
55 	importAction->setText( tr("Import Corel Draw..."));
56 	FileFormat* fmt = getFormatByExt("cdr");
57 	fmt->trName = tr("Corel Draw");
58 	fmt->filter = tr("Corel Draw (*.ccx *.CCX *.cdr *.CDR *.cdt *.CDT *.cmx *.CMX)");
59 }
60 
~ImportCdrPlugin()61 ImportCdrPlugin::~ImportCdrPlugin()
62 {
63 	unregisterAll();
64 }
65 
fullTrName() const66 QString ImportCdrPlugin::fullTrName() const
67 {
68 	return QObject::tr("Corel Draw Importer");
69 }
70 
71 
getAboutData() const72 const ScActionPlugin::AboutData* ImportCdrPlugin::getAboutData() const
73 {
74 	AboutData* about = new AboutData;
75 	about->authors = "Franz Schmid <franz@scribus.info>";
76 	about->shortDescription = tr("Imports Corel Draw Files");
77 	about->description = tr("Imports most Corel Draw files into the current document, converting their vector data into Scribus objects.");
78 	about->license = "GPL";
79 	Q_CHECK_PTR(about);
80 	return about;
81 }
82 
deleteAboutData(const AboutData * about) const83 void ImportCdrPlugin::deleteAboutData(const AboutData* about) const
84 {
85 	Q_ASSERT(about);
86 	delete about;
87 }
88 
registerFormats()89 void ImportCdrPlugin::registerFormats()
90 {
91 	FileFormat fmt(this);
92 	fmt.trName = tr("Corel Draw");
93 	fmt.filter = tr("Corel Draw (*.ccx *.CCX *.cdr *.CDR *.cdt *.CDT *.cmx *.CMX)");
94 	fmt.formatId = 0;
95 	fmt.fileExtensions = QStringList() << "ccx" << "cdr" << "cdt" << "cmx";
96 	fmt.load = true;
97 	fmt.save = false;
98 	fmt.thumb = true;
99 	fmt.colorReading = true;
100 	fmt.mimeTypes = QStringList();
101 	fmt.mimeTypes.append("application/x-coreldraw");
102 	fmt.priority = 64; // Priority
103 	registerFormat(fmt);
104 }
105 
fileSupported(QIODevice *,const QString & fileName) const106 bool ImportCdrPlugin::fileSupported(QIODevice* /* file */, const QString & fileName) const
107 {
108 	return true;
109 }
110 
loadFile(const QString & fileName,const FileFormat &,int flags,int)111 bool ImportCdrPlugin::loadFile(const QString & fileName, const FileFormat &, int flags, int /*index*/)
112 {
113 	// There's only one format to handle, so we just call import(...)
114 	return import(fileName, flags);
115 }
116 
import(QString fileName,int flags)117 bool ImportCdrPlugin::import(QString fileName, int flags)
118 {
119 	if (!checkFlags(flags))
120 		return false;
121 	if (fileName.isEmpty())
122 	{
123 		flags |= lfInteractive;
124 		PrefsContext* prefs = PrefsManager::instance().prefsFile->getPluginContext("importcdr");
125 		QString wdir = prefs->get("wdir", ".");
126 		CustomFDialog diaf(ScCore->primaryMainWindow(), wdir, QObject::tr("Open"), tr("All Supported Formats")+" (*.cdr *.CDR);;All Files (*)");
127 		if (diaf.exec())
128 		{
129 			fileName = diaf.selectedFile();
130 			prefs->set("wdir", fileName.left(fileName.lastIndexOf("/")));
131 		}
132 		else
133 			return true;
134 	}
135 	m_Doc=ScCore->primaryMainWindow()->doc;
136 	UndoTransaction activeTransaction;
137 	bool emptyDoc = (m_Doc == nullptr);
138 	bool hasCurrentPage = (m_Doc && m_Doc->currentPage());
139 	TransactionSettings trSettings;
140 	trSettings.targetName   = hasCurrentPage ? m_Doc->currentPage()->getUName() : "";
141 	trSettings.targetPixmap = Um::IImageFrame;
142 	trSettings.actionName   = Um::ImportCDR;
143 	trSettings.description  = fileName;
144 	trSettings.actionPixmap = Um::IXFIG;
145 	if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
146 		UndoManager::instance()->setUndoEnabled(false);
147 	if (UndoManager::undoEnabled())
148 		activeTransaction = UndoManager::instance()->beginTransaction(trSettings);
149 	CdrPlug *dia = new CdrPlug(m_Doc, flags);
150 	Q_CHECK_PTR(dia);
151 	if (!dia->import(fileName, trSettings, flags, !(flags & lfScripted)))
152 	{
153 		ScribusMainWindow* mw=(m_Doc==nullptr) ? ScCore->primaryMainWindow() : m_Doc->scMW();
154 		//Import per Uniconverter
155 		qDebug() << "ERROR: Parsing with libcdr failed! Trying now Uniconverter.";
156 		const FileFormat *fmt = LoadSavePlugin::getFormatByExt("cdt");
157 		if (!fmt)
158 		{
159 			ScMessageBox::warning(mw, CommonStrings::trWarning, tr("The Uniconverter Import plugin could not be found"));
160 			return false;
161 		}
162 		flags &= ~LoadSavePlugin::lfCreateDoc;
163 		flags |= LoadSavePlugin::lfInsertPage;
164 		if (!fmt->loadFile(fileName, flags))
165 		{
166 			if (flags & LoadSavePlugin::lfCreateDoc)
167 			{
168 				ScMessageBox::warning(mw, CommonStrings::trWarning, tr("Parsing failed!\n\nPlease submit your file (if possible) to the\nDocument Liberation Project http://www.documentliberation.org"));
169 			}
170 			return false;
171 		}
172 	}
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 ImportCdrPlugin::readThumbnail(const QString& fileName)
182 {
183 	if (fileName.isEmpty())
184 		return QImage();
185 	UndoManager::instance()->setUndoEnabled(false);
186 	m_Doc = nullptr;
187 	CdrPlug *dia = new CdrPlug(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