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                           importcgmplugin.cpp  -  description
9                              -------------------
10     begin                : Wed Dez 23 2009
11     copyright            : (C) 2009 by Franz Schmid
12     email                : Franz.Schmid@altmuehlnet.de
13  ***************************************************************************/
14 #include "commonstrings.h"
15 
16 #include "importcgm.h"
17 #include "importcgmplugin.h"
18 #include "prefscontext.h"
19 #include "prefsfile.h"
20 #include "prefsmanager.h"
21 #include "scpage.h"
22 #include "scraction.h"
23 #include "scribuscore.h"
24 #include "undomanager.h"
25 #include "util_formats.h"
26 
27 #include "ui/customfdialog.h"
28 #include "ui/scmwmenumanager.h"
29 
importcgm_getPluginAPIVersion()30 int importcgm_getPluginAPIVersion()
31 {
32 	return PLUGIN_API_VERSION;
33 }
34 
importcgm_getPlugin()35 ScPlugin* importcgm_getPlugin()
36 {
37 	ImportCgmPlugin* plug = new ImportCgmPlugin();
38 	Q_CHECK_PTR(plug);
39 	return plug;
40 }
41 
importcgm_freePlugin(ScPlugin * plugin)42 void importcgm_freePlugin(ScPlugin* plugin)
43 {
44 	ImportCgmPlugin* plug = qobject_cast<ImportCgmPlugin*>(plugin);
45 	Q_ASSERT(plug);
46 	delete plug;
47 }
48 
ImportCgmPlugin()49 ImportCgmPlugin::ImportCgmPlugin() :
50 	importAction(new ScrAction(ScrAction::DLL, QPixmap(), QPixmap(), "", QKeySequence(), this))
51 {
52 	// Set action info in languageChange, so we only have to do it in one
53 	// place. This includes registering file format support.
54 	registerFormats();
55 	languageChange();
56 }
57 
languageChange()58 void ImportCgmPlugin::languageChange()
59 {
60 	importAction->setText( tr("Import Computer Graphics Metafile..."));
61 	FileFormat* fmt = getFormatByExt("cgm");
62 	fmt->trName = tr("Computer Graphics Metafile");
63 	fmt->filter = tr("Computer Graphics Metafile (*.cgm *.CGM)");
64 }
65 
~ImportCgmPlugin()66 ImportCgmPlugin::~ImportCgmPlugin()
67 {
68 	unregisterAll();
69 }
70 
fullTrName() const71 QString ImportCgmPlugin::fullTrName() const
72 {
73 	return QObject::tr("Cgm Importer");
74 }
75 
76 
getAboutData() const77 const ScActionPlugin::AboutData* ImportCgmPlugin::getAboutData() const
78 {
79 	AboutData* about = new AboutData;
80 	about->authors = "Franz Schmid <franz@scribus.info>";
81 	about->shortDescription = tr("Imports CGM Files");
82 	about->description = tr("Imports most binary CGM files into the current document, converting their vector data into Scribus objects.");
83 	about->license = "GPL";
84 	Q_CHECK_PTR(about);
85 	return about;
86 }
87 
deleteAboutData(const AboutData * about) const88 void ImportCgmPlugin::deleteAboutData(const AboutData* about) const
89 {
90 	Q_ASSERT(about);
91 	delete about;
92 }
93 
registerFormats()94 void ImportCgmPlugin::registerFormats()
95 {
96 	FileFormat fmt(this);
97 	fmt.trName = tr("CGM File"); // Human readable name
98 	fmt.formatId = 0;
99 	fmt.filter = tr("CGM File (*.cgm *.CGM)"); // QFileDialog filter
100 	fmt.fileExtensions = QStringList() << "cgm";
101 	fmt.load = true;
102 	fmt.save = false;
103 	fmt.thumb = true;
104 	fmt.mimeTypes = QStringList(); // MIME types
105 	fmt.priority = 64; // Priority
106 	registerFormat(fmt);
107 }
108 
fileSupported(QIODevice *,const QString & fileName) const109 bool ImportCgmPlugin::fileSupported(QIODevice* /* file */, const QString & fileName) const
110 {
111 	return true;
112 }
113 
loadFile(const QString & fileName,const FileFormat &,int flags,int)114 bool ImportCgmPlugin::loadFile(const QString & fileName, const FileFormat &, int flags, int /*index*/)
115 {
116 	// There's only one format to handle, so we just call import(...)
117 	return import(fileName, flags);
118 }
119 
import(QString fileName,int flags)120 bool ImportCgmPlugin::import(QString fileName, int flags)
121 {
122 	if (!checkFlags(flags))
123 		return false;
124 	if (fileName.isEmpty())
125 	{
126 		flags |= lfInteractive;
127 		PrefsContext* prefs = PrefsManager::instance().prefsFile->getPluginContext("importcgm");
128 		QString wdir = prefs->get("wdir", ".");
129 		CustomFDialog diaf(ScCore->primaryMainWindow(), wdir, QObject::tr("Open"), tr("All Supported Formats")+" (*.cgm *.CGM);;All Files (*)");
130 		if (diaf.exec())
131 		{
132 			fileName = diaf.selectedFile();
133 			prefs->set("wdir", fileName.left(fileName.lastIndexOf("/")));
134 		}
135 		else
136 			return true;
137 	}
138 	m_Doc=ScCore->primaryMainWindow()->doc;
139 	UndoTransaction activeTransaction;
140 	bool emptyDoc = (m_Doc == nullptr);
141 	bool hasCurrentPage = (m_Doc && m_Doc->currentPage());
142 	TransactionSettings trSettings;
143 	trSettings.targetName   = hasCurrentPage ? m_Doc->currentPage()->getUName() : "";
144 	trSettings.targetPixmap = Um::IImageFrame;
145 	trSettings.actionName   = Um::ImportCGM;
146 	trSettings.description  = fileName;
147 	trSettings.actionPixmap = Um::IXFIG;
148 	if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
149 		UndoManager::instance()->setUndoEnabled(false);
150 	if (UndoManager::undoEnabled())
151 		activeTransaction = UndoManager::instance()->beginTransaction(trSettings);
152 	CgmPlug *dia = new CgmPlug(m_Doc, flags);
153 	Q_CHECK_PTR(dia);
154 	dia->import(fileName, trSettings, flags, !(flags & lfScripted));
155 	if (activeTransaction)
156 		activeTransaction.commit();
157 	if (emptyDoc || !(flags & lfInteractive) || !(flags & lfScripted))
158 		UndoManager::instance()->setUndoEnabled(true);
159 	delete dia;
160 	return true;
161 }
162 
readThumbnail(const QString & fileName)163 QImage ImportCgmPlugin::readThumbnail(const QString& fileName)
164 {
165 	if (fileName.isEmpty())
166 		return QImage();
167 	UndoManager::instance()->setUndoEnabled(false);
168 	m_Doc = nullptr;
169 	CgmPlug *dia = new CgmPlug(m_Doc, lfCreateThumbnail);
170 	Q_CHECK_PTR(dia);
171 	QImage ret = dia->readThumbnail(fileName);
172 	UndoManager::instance()->setUndoEnabled(true);
173 	delete dia;
174 	return ret;
175 }
176