Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
3201 subik 1
#include "collect4output.h"
2
#include "collect4output.moc"
3
 
4
#include "scribus.h"
5
#include "scribusapp.h"
6
#include "util.h"
7
#include "prefscontext.h"
8
#include "prefsfile.h"
9
#include "prefsmanager.h"
10
#include "commonstrings.h"
11
#include "undomanager.h"
12
#include "filewatcher.h"
13
#include "pageitem.h"
3251 craig 14
#include "scraction.h"
3597 subik 15
#include "scraction.h"
3201 subik 16
 
17
#include <qmessagebox.h>
18
#include <qstring.h>
19
#include <qmap.h>
20
#include <qdir.h>
21
 
22
extern ScribusQApp* ScQApp;
23
 
24
 
3205 craig 25
 
3201 subik 26
CollectForOutput::CollectForOutput(bool withFonts, bool compressDoc)
27
        : QObject(ScQApp, 0)
28
{
29
        outputDirectory = QString();
30
        compressDoc = compressDoc;
31
        withFonts = withFonts;
32
        dirs = PrefsManager::instance()->prefsFile->getContext("dirs");
33
        collectedFiles.clear();
34
}
35
 
36
bool CollectForOutput::newDirDialog()
37
{
38
        QString curDir = QDir::currentDirPath();
39
        if (ScQApp->usingGUI())
40
        {
41
                QString wdir = ".";
42
                QString prefsDocDir = PrefsManager::instance()->documentDir();
43
                if (!prefsDocDir.isEmpty())
44
                        wdir = dirs->get("collect", prefsDocDir);
45
                else
46
                        wdir = dirs->get("collect", ".");
47
                outputDirectory = ScApp->CFileDialog(wdir, tr("Choose a Directory"), "", "", false, false, false, false, true, &compressDoc, &withFonts);
48
        }
49
        if (outputDirectory.isEmpty())
50
                return false;
3597 subik 51
        outputDirectory += "/";
3201 subik 52
        return true;
53
}
54
 
55
QString CollectForOutput::collect()
56
{
3597 subik 57
        if (!newDirDialog())
3201 subik 58
                return "";
3599 fschmid 59
        ScApp->fileWatcher->forceScan();
60
        ScApp->fileWatcher->stop();
61
        if(outputDirectory.right(1) != "/")
62
                outputDirectory += "/";
63
        dirs->set("collect", outputDirectory.left(outputDirectory.findRev("/",-2)));
3201 subik 64
        ScApp->mainWindowStatusLabel->setText(tr("Collecting..."));
65
        if (!collectItems())
66
        {
3597 subik 67
                QMessageBox::warning(ScApp, tr("Warning"), "<qt>" + tr("Cannot collect all files for output for file:\n%1").arg(newName) + "</qt>", CommonStrings::tr_OK);
3201 subik 68
                return "";
69
        }
3599 fschmid 70
        if (!collectDocument())
71
                return "";
3201 subik 72
        collectFonts();
3597 subik 73
        if (!collectDocument())
74
        {
75
                QMessageBox::warning(ScApp, CommonStrings::trWarning, "<qt>" + tr("Cannot collect  the file: \n%1").arg(newName) + "</qt>", CommonStrings::tr_OK);
76
                return "";
77
        }
3201 subik 78
        QDir::setCurrent(outputDirectory);
3565 cbradney 79
        ScApp->updateActiveWindowCaption(newName);
3201 subik 80
        UndoManager::instance()->renameStack(newName);
81
        ScApp->scrActions["fileSave"]->setEnabled(false);
82
        ScApp->scrActions["fileRevert"]->setEnabled(false);
83
        ScApp->updateRecent(newName);
84
        ScApp->mainWindowStatusLabel->setText("");
85
        ScApp->mainWindowProgressBar->reset();
86
        ScApp->fileWatcher->start();
87
        collectedFiles.clear();
88
        return newName;
89
}
90
 
91
bool CollectForOutput::collectDocument()
92
{
93
        QFileInfo fi = QFileInfo(outputDirectory);
94
        newName = outputDirectory;
95
        if (!fi.exists())
96
                return false;
97
        if (!fi.isDir() || !fi.isWritable())
98
                return false;
99
 
100
        if (ScApp->doc->hasName)
101
        {
102
                QFileInfo fis(ScApp->doc->DocName);
103
                newName += fis.fileName();
104
        }
105
        else
106
                newName += ScApp->doc->DocName+".sla";
107
 
108
        ScApp->doc->hasName = true;
109
        if (compressDoc)
110
        {
111
                if (!newName.endsWith(".gz"))
112
                        newName += ".gz";
113
                else
114
                {
115
                        if (newName.endsWith(".gz"))
116
                                newName = newName.remove(".gz");
117
                }
118
        }
119
 
120
        if (!overwrite(ScApp, newName))
121
                return false;
3597 subik 122
        if (!ScApp->DoFileSave(newName))
3201 subik 123
                return false;
124
        return true;
125
}
126
 
127
bool CollectForOutput::collectItems()
128
{
129
        if (ScApp->doc->masterPageMode)
130
                ScApp->doc->MasterPages = ScApp->doc->Pages;
131
        else
132
                ScApp->doc->DocPages = ScApp->doc->Pages;
133
        uint counter = 0;
134
        for (uint lc = 0; lc < 3; ++lc)
135
        {
136
                PageItem* ite;
137
                switch (lc)
138
                {
139
                        case 0:
140
                                counter = ScApp->doc->MasterItems.count();
141
                                break;
142
                        case 1:
143
                                counter = ScApp->doc->DocItems.count();
144
                                break;
145
                        case 2:
146
                                counter = ScApp->doc->FrameItems.count();
147
                                break;
148
                }
149
                for (uint b = 0; b < counter; ++b)
150
                {
151
                        switch (lc)
152
                        {
153
                                case 0:
154
                                        ite = ScApp->doc->MasterItems.at(b);
155
                                        break;
156
                                case 1:
157
                                        ite = ScApp->doc->DocItems.at(b);
158
                                        break;
159
                                case 2:
160
                                        ite = ScApp->doc->FrameItems.at(b);
161
                                        break;
162
                        }
163
                        if (ite->itemType() == PageItem::ImageFrame)
164
                        {
165
                                QFileInfo itf = QFileInfo(ite->Pfile);
166
                                if (itf.exists())
167
                                {
168
                                        QString oldFile = ite->Pfile;
3598 subik 169
                                        ite->Pfile = collectFile(oldFile, itf.fileName());
3201 subik 170
                                        if (ScApp->fileWatcherActive())
171
                                        {
172
                                                ScApp->fileWatcher->removeFile(oldFile);
3597 subik 173
                                                ScApp->fileWatcher->addFile(ite->Pfile);
3201 subik 174
                                        }
175
                                }
176
                        }
177
                        if (ite->itemType() == PageItem::TextFrame)
178
                        {
179
                                if (ite->isAnnotation)
180
                                {
181
                                        QFileInfo itf;
182
                                        if (!ite->Pfile.isEmpty())
183
                                        {
184
                                                itf = QFileInfo(ite->Pfile);
185
                                                if (itf.exists())
186
                                                {
187
                                                        QString oldFile = ite->Pfile;
3598 subik 188
                                                        ite->Pfile = collectFile(oldFile, itf.fileName());
3201 subik 189
                                                        if (ScApp->fileWatcherActive())
190
                                                        {
191
                                                                ScApp->fileWatcher->removeFile(oldFile);
3597 subik 192
                                                                ScApp->fileWatcher->addFile(ite->Pfile);
3201 subik 193
                                                        }
194
                                                }
195
                                        }
196
                                        if (!ite->Pfile2.isEmpty())
197
                                        {
198
                                                itf = QFileInfo(ite->Pfile2);
199
                                                if (itf.exists())
3598 subik 200
                                                        ite->Pfile2 = collectFile(ite->Pfile2, itf.fileName());
3201 subik 201
                                        }
202
                                        if (!ite->Pfile3.isEmpty())
203
                                        {
204
                                                itf = QFileInfo(ite->Pfile3);
205
                                                if (itf.exists())
3598 subik 206
                                                        ite->Pfile3 = collectFile(ite->Pfile3, itf.fileName());
3201 subik 207
                                        }
208
                                }
209
                        }
210
                }
211
        }
212
        return true;
213
}
214
 
215
bool CollectForOutput::collectFonts()
216
{
217
        if (!withFonts)
218
                return false;
219
 
220
        PrefsManager *prefsManager = PrefsManager::instance();
3544 avox 221
        QMap<QString,int>::Iterator it3;
222
        QMap<QString,int>::Iterator it3end = ScApp->doc->UsedFonts.end();
3201 subik 223
        for (it3 = ScApp->doc->UsedFonts.begin(); it3 != it3end; ++it3)
224
        {
3500 avox 225
                QFileInfo itf = QFileInfo(prefsManager->appPrefs.AvailFonts[it3.key()]->fontFilePath());
226
                copyFile(prefsManager->appPrefs.AvailFonts[it3.key()]->fontFilePath(), outputDirectory + itf.fileName());
3201 subik 227
        }
228
        return true;
229
}
230
 
231
QString CollectForOutput::collectFile(QString oldFile, QString newFile)
232
{
233
        uint cnt = 1;
234
        bool copy = true;
235
        while (collectedFiles.contains(newFile))
236
        {
237
                // overwrite only different sources
238
                if (collectedFiles[newFile] == oldFile)
239
                {
240
                        copy = false;
241
                        break;
242
                }
243
                QFileInfo fi(newFile);
244
                QString basename = fi.baseName().left(fi.baseName().findRev("_"));
3598 subik 245
                newFile = QString("%1_%2.%3").arg(basename).arg(cnt).arg(fi.extension());
3201 subik 246
                ++cnt;
247
        }
248
        if (copy)
249
                copyFile(oldFile, newFile);
250
        collectedFiles[newFile] = oldFile;
251
        return newFile;
252
}