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 "importps.h"
10 #include "importpsplugin.h"
11 
12 #include "prefscontext.h"
13 #include "prefsfile.h"
14 #include "prefsmanager.h"
15 #include "scconfig.h"
16 #include "scpage.h"
17 #include "scraction.h"
18 #include "scribuscore.h"
19 #include "undomanager.h"
20 #include "util_formats.h"
21 
22 #include "ui/customfdialog.h"
23 #include "ui/scmwmenumanager.h"
24 
importps_getPluginAPIVersion()25 int importps_getPluginAPIVersion()
26 {
27 	return PLUGIN_API_VERSION;
28 }
29 
importps_getPlugin()30 ScPlugin* importps_getPlugin()
31 {
32 	ImportPSPlugin* plug = new ImportPSPlugin();
33 	Q_CHECK_PTR(plug);
34 	return plug;
35 }
36 
importps_freePlugin(ScPlugin * plugin)37 void importps_freePlugin(ScPlugin* plugin)
38 {
39 	ImportPSPlugin* plug = dynamic_cast<ImportPSPlugin*>(plugin);
40 	Q_ASSERT(plug);
41 	delete plug;
42 }
43 
ImportPSPlugin()44 ImportPSPlugin::ImportPSPlugin() : LoadSavePlugin(),
45 	importAction(new ScrAction(ScrAction::DLL, "", 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 	languageChange();
50 	registerFormats();
51 }
52 /*
53 void ImportPSPlugin::addToMainWindowMenu(ScribusMainWindow *mw)
54 {
55 	importAction->setEnabled(true);
56 	connect( importAction, SIGNAL(triggered()), SLOT(import()) );
57 	mw->scrMenuMgr->addMenuItem(importAction, "FileImport");
58 }
59 */
languageChange()60 void ImportPSPlugin::languageChange()
61 {
62 	importAction->setText( tr("Import PostScript..."));
63 	// (Re)register file format support
64 	//unregisterAll();
65 	//registerFormats();
66 }
67 
~ImportPSPlugin()68 ImportPSPlugin::~ImportPSPlugin()
69 {
70 	unregisterAll();
71 };
72 
fullTrName() const73 const QString ImportPSPlugin::fullTrName() const
74 {
75 	return QObject::tr("PostScript Importer");
76 }
77 
78 
getAboutData() const79 const ScActionPlugin::AboutData* ImportPSPlugin::getAboutData() const
80 {
81 	AboutData* about = new AboutData;
82 	about->authors = "Franz Schmid <franz@scribus.info>";
83 	about->shortDescription = tr("Imports PostScript Files");
84 	about->description = tr("Imports most PostScript files into the current document,\nconverting 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 ImportPSPlugin::deleteAboutData(const AboutData* about) const
91 {
92 	Q_ASSERT(about);
93 	delete about;
94 }
95 
registerFormats()96 void ImportPSPlugin::registerFormats()
97 {
98 	if (!ScCore->haveGS())
99 		return;
100 	FileFormat fmt(this);
101 	fmt.trName = FormatsManager::instance()->nameOfFormat(FormatsManager::EPS); // Human readable name
102 	fmt.formatId = 0;
103 	fmt.filter = FormatsManager::instance()->extensionsForFormat(FormatsManager::EPS);// QFileDialog filter
104 	fmt.fileExtensions = QStringList() << "eps" << "epsf" << "epsi" << "eps2" << "eps3" << "epi" << "ept";
105 	fmt.load = true;
106 	fmt.save = false;
107 	fmt.mimeTypes = FormatsManager::instance()->mimetypeOfFormat(FormatsManager::EPS); // MIME types
108 	fmt.priority = 64; // Priority
109 	registerFormat(fmt);
110 
111 	FileFormat fmt2(this);
112 	fmt2.trName = FormatsManager::instance()->nameOfFormat(FormatsManager::PS); // Human readable name
113 	fmt2.formatId = 0;
114 	fmt2.filter = FormatsManager::instance()->extensionsForFormat(FormatsManager::PS);// QFileDialog filter
115 	fmt2.fileExtensions = QStringList() << "ps";
116 	fmt2.load = true;
117 	fmt2.save = false;
118 	fmt2.mimeTypes = FormatsManager::instance()->mimetypeOfFormat(FormatsManager::PS); // MIME types
119 	fmt2.priority = 64; // Priority
120 	registerFormat(fmt2);
121 
122 	FileFormat fmt3(this);
123 	fmt3.trName = FormatsManager::instance()->nameOfFormat(FormatsManager::PDF); // Human readable name
124 	fmt3.formatId = 0;
125 	fmt3.filter = FormatsManager::instance()->extensionsForFormat(FormatsManager::PDF);// QFileDialog filter
126 	fmt3.fileExtensions = QStringList() << "pdf";
127 	fmt3.load = true;
128 	fmt3.save = false;
129 	fmt3.mimeTypes = FormatsManager::instance()->mimetypeOfFormat(FormatsManager::PDF); // MIME types
130 	fmt3.priority = 64; // Priority
131 	registerFormat(fmt3);
132 }
133 
fileSupported(QIODevice *,const QString & fileName) const134 bool ImportPSPlugin::fileSupported(QIODevice* /* file */, const QString & fileName) const
135 {
136 	// TODO: check for %!PS-Adobe
137 	return true;
138 }
139 
loadFile(const QString & fileName,const FileFormat &,int flags,int)140 bool ImportPSPlugin::loadFile(const QString & fileName, const FileFormat &, int flags, int /*index*/)
141 {
142 	// There's only one format to handle, so we just call import(...)
143 	return import(fileName, flags);
144 }
145 
import(QString fileName,int flags)146 bool ImportPSPlugin::import(QString fileName, int flags)
147 {
148 	if (!checkFlags(flags))
149 		return false;
150 	if( fileName.isEmpty() )
151 	{
152 		flags |= lfInteractive;
153 		PrefsContext* prefs = PrefsManager::instance()->prefsFile->getPluginContext("importps");
154 		QString wdir = prefs->get("wdir", ".");
155 		CustomFDialog diaf(ScCore->primaryMainWindow(), wdir, QObject::tr("Open"), FormatsManager::instance()->fileDialogFormatList(FormatsManager::EPS|FormatsManager::PS));
156 		if (diaf.exec())
157 		{
158 			fileName = diaf.selectedFile();
159 			prefs->set("wdir", fileName.left(fileName.lastIndexOf("/")));
160 		}
161 		else
162 			return true;
163 	}
164 	m_Doc=ScCore->primaryMainWindow()->doc;
165 	UndoTransaction activeTransaction;
166 	bool emptyDoc = (m_Doc == nullptr);
167 	bool hasCurrentPage = (m_Doc && m_Doc->currentPage());
168 	TransactionSettings trSettings;
169 	trSettings.targetName   = hasCurrentPage ? m_Doc->currentPage()->getUName() : "";
170 	trSettings.targetPixmap = Um::IImageFrame;
171 	trSettings.actionName   = Um::ImportEPS;
172 	trSettings.description  = fileName;
173 	trSettings.actionPixmap = Um::IEPS;
174 	if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
175 		UndoManager::instance()->setUndoEnabled(false);
176 	if (UndoManager::undoEnabled())
177 		activeTransaction = UndoManager::instance()->beginTransaction(trSettings);
178 	EPSPlug *dia = new EPSPlug(m_Doc, flags);
179 	Q_CHECK_PTR(dia);
180 	dia->import(fileName, trSettings, flags);
181 	if (activeTransaction)
182 		activeTransaction.commit();
183 	if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
184 		UndoManager::instance()->setUndoEnabled(true);
185 	delete dia;
186 	return true;
187 }
188