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