Subversion Repositories Scribus

Rev

Rev 19222 | Rev 19250 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
18228 fschmid 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
#include <QByteArray>
9
#include <QCursor>
10
#include <QDrag>
11
#include <QFile>
12
#include <QList>
13
#include <QMimeData>
14
#include <QRegExp>
15
#include <QStack>
18549 fschmid 16
#include <QTextDocument>
18228 fschmid 17
#include <QDebug>
18
 
19
#include <cstdlib>
20
 
19095 craig 21
#include "importpub.h"
19235 fschmid 22
#include "../revenge/rawpainter.h"
23
#include <libmspub/libmspub.h>
19095 craig 24
 
18228 fschmid 25
#include "commonstrings.h"
18251 fschmid 26
#include "fileloader.h"
18228 fschmid 27
#include "loadsaveplugin.h"
28
#include "pagesize.h"
29
#include "prefscontext.h"
30
#include "prefsfile.h"
31
#include "prefsmanager.h"
32
#include "prefstable.h"
33
#include "rawimage.h"
34
#include "scclocale.h"
35
#include "sccolorengine.h"
36
#include "scconfig.h"
37
#include "scmimedata.h"
38
#include "scpaths.h"
39
#include "scpattern.h"
40
#include "scribus.h"
41
#include "scribusXml.h"
42
#include "scribuscore.h"
19095 craig 43
#include "scribusdoc.h"
44
#include "scribusview.h"
18228 fschmid 45
#include "sctextstream.h"
46
#include "selection.h"
19095 craig 47
#include "ui/customfdialog.h"
48
#include "ui/missing.h"
49
#include "ui/multiprogressdialog.h"
50
#include "ui/propertiespalette.h"
18228 fschmid 51
#include "undomanager.h"
52
#include "util.h"
53
#include "util_formats.h"
54
#include "util_icon.h"
55
#include "util_math.h"
56
 
19095 craig 57
 
18228 fschmid 58
extern SCRIBUS_API ScribusQApp * ScQApp;
59
 
60
PubPlug::PubPlug(ScribusDoc* doc, int flags)
61
{
62
        tmpSel=new Selection(this, false);
63
        m_Doc=doc;
64
        importerFlags = flags;
65
        interactive = (flags & LoadSavePlugin::lfInteractive);
66
        progressDialog = NULL;
67
}
68
 
69
QImage PubPlug::readThumbnail(QString fName)
70
{
71
        QFileInfo fi = QFileInfo(fName);
72
        double b, h;
73
        b = PrefsManager::instance()->appPrefs.docSetupPrefs.pageWidth;
74
        h = PrefsManager::instance()->appPrefs.docSetupPrefs.pageHeight;
75
        docWidth = b;
76
        docHeight = h;
77
        progressDialog = NULL;
78
        m_Doc = new ScribusDoc();
79
        m_Doc->setup(0, 1, 1, 1, 1, "Custom", "Custom");
80
        m_Doc->setPage(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false);
81
        m_Doc->addPage(0);
82
        m_Doc->setGUI(false, ScCore->primaryMainWindow(), 0);
83
        baseX = m_Doc->currentPage()->xOffset();
84
        baseY = m_Doc->currentPage()->yOffset();
85
        Elements.clear();
86
        m_Doc->setLoading(true);
87
        m_Doc->DoDrawing = false;
88
        m_Doc->scMW()->setScriptRunning(true);
89
        QString CurDirP = QDir::currentPath();
90
        QDir::setCurrent(fi.path());
91
        if (convert(fName))
92
        {
93
                tmpSel->clear();
94
                QDir::setCurrent(CurDirP);
95
                if (Elements.count() > 1)
96
                        m_Doc->groupObjectsList(Elements);
97
                m_Doc->DoDrawing = true;
98
                m_Doc->m_Selection->delaySignalsOn();
99
                QImage tmpImage;
100
                if (Elements.count() > 0)
101
                {
102
                        for (int dre=0; dre<Elements.count(); ++dre)
103
                        {
104
                                tmpSel->addItem(Elements.at(dre), true);
105
                        }
106
                        tmpSel->setGroupRect();
107
                        double xs = tmpSel->width();
108
                        double ys = tmpSel->height();
109
                        tmpImage = Elements.at(0)->DrawObj_toImage(500);
110
                        tmpImage.setText("XSize", QString("%1").arg(xs));
111
                        tmpImage.setText("YSize", QString("%1").arg(ys));
112
                }
113
                m_Doc->scMW()->setScriptRunning(false);
114
                m_Doc->setLoading(false);
115
                m_Doc->m_Selection->delaySignalsOff();
116
                delete m_Doc;
117
                return tmpImage;
118
        }
119
        else
120
        {
121
                QDir::setCurrent(CurDirP);
122
                m_Doc->DoDrawing = true;
123
                m_Doc->scMW()->setScriptRunning(false);
124
                delete m_Doc;
125
        }
126
        return QImage();
127
}
128
 
129
bool PubPlug::import(QString fNameIn, const TransactionSettings& trSettings, int flags, bool showProgress)
130
{
131
        QString fName = fNameIn;
132
        bool success = false;
133
        interactive = (flags & LoadSavePlugin::lfInteractive);
134
        importerFlags = flags;
135
        cancel = false;
136
        double b, h;
137
        bool ret = false;
138
        QFileInfo fi = QFileInfo(fName);
139
        if ( !ScCore->usingGUI() )
140
        {
141
                interactive = false;
142
                showProgress = false;
143
        }
144
        if ( showProgress )
145
        {
146
                ScribusMainWindow* mw=(m_Doc==0) ? ScCore->primaryMainWindow() : m_Doc->scMW();
147
                progressDialog = new MultiProgressDialog( tr("Importing: %1").arg(fi.fileName()), CommonStrings::tr_Cancel, mw );
148
                QStringList barNames, barTexts;
149
                barNames << "GI";
150
                barTexts << tr("Analyzing File:");
151
                QList<bool> barsNumeric;
152
                barsNumeric << false;
153
                progressDialog->addExtraProgressBars(barNames, barTexts, barsNumeric);
154
                progressDialog->setOverallTotalSteps(3);
155
                progressDialog->setOverallProgress(0);
156
                progressDialog->setProgress("GI", 0);
157
                progressDialog->show();
158
                connect(progressDialog, SIGNAL(canceled()), this, SLOT(cancelRequested()));
159
                qApp->processEvents();
160
        }
161
        else
162
                progressDialog = NULL;
163
/* Set default Page to size defined in Preferences */
164
        b = 0.0;
165
        h = 0.0;
166
        if (progressDialog)
167
        {
168
                progressDialog->setOverallProgress(1);
169
                qApp->processEvents();
170
        }
171
        if (b == 0.0)
172
                b = PrefsManager::instance()->appPrefs.docSetupPrefs.pageWidth;
173
        if (h == 0.0)
174
                h = PrefsManager::instance()->appPrefs.docSetupPrefs.pageHeight;
175
        docWidth = b;
176
        docHeight = h;
177
        baseX = 0;
178
        baseY = 0;
179
        if (!interactive || (flags & LoadSavePlugin::lfInsertPage))
180
        {
181
                m_Doc->setPage(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false);
182
                m_Doc->addPage(0);
183
                m_Doc->view()->addPage(0, true);
184
                baseX = 0;
185
                baseY = 0;
186
        }
187
        else
188
        {
189
                if (!m_Doc || (flags & LoadSavePlugin::lfCreateDoc))
190
                {
191
                        m_Doc=ScCore->primaryMainWindow()->doFileNew(docWidth, docHeight, 0, 0, 0, 0, 0, 0, false, false, 0, false, 0, 1, "Custom", true);
192
                        ScCore->primaryMainWindow()->HaveNewDoc();
193
                        ret = true;
194
                        baseX = 0;
195
                        baseY = 0;
196
                        baseX = m_Doc->currentPage()->xOffset();
197
                        baseY = m_Doc->currentPage()->yOffset();
198
                }
199
        }
200
        if ((!ret) && (interactive))
201
        {
202
                baseX = m_Doc->currentPage()->xOffset();
203
                baseY = m_Doc->currentPage()->yOffset();
204
        }
205
        if ((ret) || (!interactive))
206
        {
207
                if (docWidth > docHeight)
208
                        m_Doc->setPageOrientation(1);
209
                else
210
                        m_Doc->setPageOrientation(0);
211
                m_Doc->setPageSize("Custom");
212
        }
213
        if (!(flags & LoadSavePlugin::lfLoadAsPattern))
214
                m_Doc->view()->Deselect();
215
        Elements.clear();
216
        m_Doc->setLoading(true);
217
        m_Doc->DoDrawing = false;
218
        if (!(flags & LoadSavePlugin::lfLoadAsPattern))
219
                m_Doc->view()->updatesOn(false);
220
        m_Doc->scMW()->setScriptRunning(true);
221
        qApp->setOverrideCursor(QCursor(Qt::WaitCursor));
222
        QString CurDirP = QDir::currentPath();
223
        QDir::setCurrent(fi.path());
224
        if (convert(fName))
225
        {
226
                tmpSel->clear();
227
                QDir::setCurrent(CurDirP);
228
                if ((Elements.count() > 1) && (!(importerFlags & LoadSavePlugin::lfCreateDoc)))
229
                        m_Doc->groupObjectsList(Elements);
230
                m_Doc->DoDrawing = true;
231
                m_Doc->scMW()->setScriptRunning(false);
232
                m_Doc->setLoading(false);
233
                qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
234
                if ((Elements.count() > 0) && (!ret) && (interactive))
235
                {
236
                        if (flags & LoadSavePlugin::lfScripted)
237
                        {
238
                                bool loadF = m_Doc->isLoading();
239
                                m_Doc->setLoading(false);
240
                                m_Doc->changed();
241
                                m_Doc->setLoading(loadF);
242
                                if (!(flags & LoadSavePlugin::lfLoadAsPattern))
243
                                {
244
                                        m_Doc->m_Selection->delaySignalsOn();
245
                                        for (int dre=0; dre<Elements.count(); ++dre)
246
                                        {
247
                                                m_Doc->m_Selection->addItem(Elements.at(dre), true);
248
                                        }
249
                                        m_Doc->m_Selection->delaySignalsOff();
250
                                        m_Doc->m_Selection->setGroupRect();
251
                                        m_Doc->view()->updatesOn(true);
252
                                }
253
                        }
254
                        else
255
                        {
256
                                m_Doc->DragP = true;
257
                                m_Doc->DraggedElem = 0;
258
                                m_Doc->DragElements.clear();
259
                                m_Doc->m_Selection->delaySignalsOn();
260
                                for (int dre=0; dre<Elements.count(); ++dre)
261
                                {
262
                                        tmpSel->addItem(Elements.at(dre), true);
263
                                }
264
                                tmpSel->setGroupRect();
265
                                ScElemMimeData* md = ScriXmlDoc::WriteToMimeData(m_Doc, tmpSel);
266
                                m_Doc->itemSelection_DeleteItem(tmpSel);
267
                                m_Doc->view()->updatesOn(true);
268
                                if (importedPatterns.count() != 0)
269
                                {
270
                                        for (int cd = 0; cd < importedPatterns.count(); cd++)
271
                                        {
272
                                                m_Doc->docPatterns.remove(importedPatterns[cd]);
273
                                        }
274
                                }
275
                                if (importedColors.count() != 0)
276
                                {
277
                                        for (int cd = 0; cd < importedColors.count(); cd++)
278
                                        {
279
                                                m_Doc->PageColors.remove(importedColors[cd]);
280
                                        }
281
                                }
282
                                m_Doc->m_Selection->delaySignalsOff();
283
                                // We must copy the TransationSettings object as it is owned
284
                                // by handleObjectImport method afterwards
285
                                TransactionSettings* transacSettings = new TransactionSettings(trSettings);
286
                                m_Doc->view()->handleObjectImport(md, transacSettings);
287
                                m_Doc->DragP = false;
288
                                m_Doc->DraggedElem = 0;
289
                                m_Doc->DragElements.clear();
290
                        }
291
                }
292
                else
293
                {
294
                        m_Doc->changed();
295
                        m_Doc->reformPages();
296
                        if (!(flags & LoadSavePlugin::lfLoadAsPattern))
297
                                m_Doc->view()->updatesOn(true);
298
                }
299
                success = true;
300
        }
301
        else
302
        {
303
                QDir::setCurrent(CurDirP);
304
                m_Doc->DoDrawing = true;
305
                m_Doc->scMW()->setScriptRunning(false);
306
                m_Doc->view()->updatesOn(true);
307
                qApp->changeOverrideCursor(QCursor(Qt::ArrowCursor));
308
        }
309
        if (interactive)
310
                m_Doc->setLoading(false);
311
        //CB If we have a gui we must refresh it if we have used the progressbar
312
        if (!(flags & LoadSavePlugin::lfLoadAsPattern))
313
        {
314
                if ((showProgress) && (!interactive))
315
                        m_Doc->view()->DrawNew();
316
        }
317
        qApp->restoreOverrideCursor();
318
        return success;
319
}
320
 
321
PubPlug::~PubPlug()
322
{
323
        if (progressDialog)
324
                delete progressDialog;
325
        delete tmpSel;
326
}
327
 
328
bool PubPlug::convert(QString fn)
329
{
330
        QString tmp;
331
        importedColors.clear();
332
        importedPatterns.clear();
333
        QFile file(fn);
334
        if ( !file.exists() )
335
        {
336
                qDebug() << "File " << QFile::encodeName(fn).data() << " does not exist" << endl;
337
                return false;
338
        }
19222 fschmid 339
#if HAVE_REVENGE
340
        librevenge::RVNGFileStream input(QFile::encodeName(fn).data());
341
#else
18228 fschmid 342
        WPXFileStream input(QFile::encodeName(fn).data());
19222 fschmid 343
#endif
18228 fschmid 344
        if (!libmspub::MSPUBDocument::isSupported(&input))
345
        {
346
                qDebug() << "ERROR: Unsupported file format!";
347
                return false;
348
        }
19235 fschmid 349
        RawPainter painter(m_Doc, baseX, baseY, docWidth, docHeight, importerFlags, &Elements, &importedColors, &importedPatterns, tmpSel, "pub");
350
        if (!libmspub::MSPUBDocument::parse(&input, &painter))
351
        {
352
                qDebug() << "ERROR: Parsing failed!";
353
                return false;
354
        }
18228 fschmid 355
        if (Elements.count() == 0)
356
        {
357
                if (importedColors.count() != 0)
358
                {
359
                        for (int cd = 0; cd < importedColors.count(); cd++)
360
                        {
361
                                m_Doc->PageColors.remove(importedColors[cd]);
362
                        }
363
                }
364
                if (importedPatterns.count() != 0)
365
                {
366
                        for (int cd = 0; cd < importedPatterns.count(); cd++)
367
                        {
368
                                m_Doc->docPatterns.remove(importedPatterns[cd]);
369
                        }
370
                }
371
        }
372
        if (progressDialog)
373
                progressDialog->close();
374
        return true;
375
}