Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
4430 cbradney 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
*/
8 paul 7
/***************************************************************************
8
                          util.cpp  -  description
9
                             -------------------
10
    begin                : Fri Sep 14 2001
11
    copyright            : (C) 2001 by Franz Schmid
12
    email                : Franz.Schmid@altmuehlnet.de
13
 ***************************************************************************/
14
 
15
/***************************************************************************
16
 *                                                                         *
17
 *   This program is free software; you can redistribute it and/or modify  *
18
 *   it under the terms of the GNU General Public License as published by  *
19
 *   the Free Software Foundation; either version 2 of the License, or     *
20
 *   (at your option) any later version.                                   *
21
 *                                                                         *
22
 ***************************************************************************/
9 Franz 23
 
10203 cbradney 24
 
25
#include <QBitmap>
9535 fschmid 26
#include <QByteArray>
10203 cbradney 27
#include <QCheckBox>
28
#include <QDomElement>
29
#include <QFile>
30
#include <QFileInfo>
9363 fschmid 31
#include <QImageReader>
10203 cbradney 32
#include <QList>
33
#include <QPixmap>
34
#include <QWidget>
10223 cbradney 35
#include <QDir>
10692 fschmid 36
#include <QCryptographicHash>
6125 cbradney 37
 
8 paul 38
#include <cmath>
6140 jghali 39
#include <algorithm>
10203 cbradney 40
 
41
#include "util.h"
42
 
10601 mrdocs 43
#include "scpainter.h"
2702 craig 44
#include "scconfig.h"
10601 mrdocs 45
#include "pageitem_textframe.h"
2702 craig 46
 
2730 cbradney 47
#if defined(_WIN32)
48
#if defined(_MSC_VER)
49
#define __STDC__ 1 // hack to get md5_buffer correctly identified
50
#endif
3810 cbradney 51
#include <valarray>
2730 cbradney 52
#include <windows.h>
53
#endif
54
 
10692 fschmid 55
// #include "md5.h"
2730 cbradney 56
 
3733 cbradney 57
#include "commonstrings.h"
10203 cbradney 58
#include "prefsmanager.h"
10006 cbradney 59
#include <QProcess>
3733 cbradney 60
#include "scmessagebox.h"
5351 cbradney 61
#include "scpixmapcache.h"
3733 cbradney 62
#include "scpaths.h"
128 Franz 63
 
10246 cbradney 64
extern "C"
1555 fschmid 65
{
201 Franz 66
#define XMD_H           // shut JPEGlib up
67
#if defined(Q_OS_UNIXWARE)
68
#  define HAVE_BOOLEAN  // libjpeg under Unixware seems to need this
69
#endif
70
#include <jpeglib.h>
71
#include <jerror.h>
72
#undef HAVE_STDLIB_H
73
#ifdef const
74
#  undef const          // remove crazy C hackery in jconfig.h
75
#endif
76
}
77
 
6125 cbradney 78
#include "pageitem.h"
214 Franz 79
#include "scribus.h"
6125 cbradney 80
#include "scribusdoc.h"
81
#include "scribusview.h"
8022 jghali 82
#include <zlib.h>
8 paul 83
 
3205 craig 84
 
10246 cbradney 85
using namespace std;
690 cbradney 86
 
10246 cbradney 87
void sDebug(QString message)
3240 fschmid 88
{
10592 fschmid 89
        qDebug("%s", message.toAscii().constData());
3240 fschmid 90
}
91
 
10006 cbradney 92
int System(const QString exename, const QStringList & args, const QString fileStdErr, const QString fileStdOut)
204 Franz 93
{
10592 fschmid 94
        QProcess proc;
11021 jghali 95
        if (!fileStdOut.isEmpty())
96
                proc.setStandardOutputFile(fileStdOut);
97
        if (!fileStdErr.isEmpty())
98
                proc.setStandardErrorFile(fileStdErr);
99
        proc.start(exename, args);
10592 fschmid 100
        if (proc.waitForStarted(5000))
4194 fschmid 101
        {
10592 fschmid 102
                while (!proc.waitForFinished(5000))
103
                {
104
                        qApp->processEvents();
4924 cbradney 105
                }
4194 fschmid 106
        }
10592 fschmid 107
        int ex = proc.exitCode();
204 Franz 108
        return ex;
109
}
110
 
2885 fschmid 111
// On Windows, return short path name, else return longPath;
112
QString getShortPathName(QString longPath)
113
{
4505 cbradney 114
        QString shortPath(longPath);
2885 fschmid 115
#if defined _WIN32
116
        QFileInfo fInfo(longPath);
10304 jghali 117
        if (fInfo.exists())
2885 fschmid 118
        {
10304 jghali 119
                WCHAR shortName[MAX_PATH + 1];
2885 fschmid 120
                // An error should not be blocking as ERROR_INVALID_PARAMETER can simply mean
121
                // that volume does not support 8.3 filenames, so return longPath in this case
10304 jghali 122
                QString nativePath = QDir::convertSeparators(longPath);
123
                int ret = GetShortPathNameW((LPCWSTR) nativePath.utf16(), shortName, MAX_PATH);
124
                if (ret != ERROR_INVALID_PARAMETER && ret < MAX_PATH)
125
                        shortPath = QString::fromUtf16((const ushort*) shortName);
2885 fschmid 126
        }
127
#endif
128
        return shortPath;
129
}
130
 
204 Franz 131
int copyFile(QString source, QString target)
132
{
11217 jghali 133
        int bytesread, error = -1;
204 Franz 134
        if ((source.isNull()) || (target.isNull()))
135
                return -1;
136
        if (source == target)
137
                return -1;
138
        QFile s(source);
139
        if (!s.exists())
140
                return -1;
6125 cbradney 141
        QFile t(target);
10592 fschmid 142
        QByteArray bb( 65536, ' ' );
11217 jghali 143
        if (bb.size() <= 0) // Check for memory allocation failure
144
                return -1;
8501 cbradney 145
        if (s.open(QIODevice::ReadOnly))
204 Franz 146
        {
8501 cbradney 147
                if (t.open(QIODevice::WriteOnly))
204 Franz 148
                {
10592 fschmid 149
                        bytesread = s.read( bb.data(), bb.size() );
4193 craig 150
                        while( bytesread > 0 )
151
                        {
10592 fschmid 152
                                t.write( bb.data(), bytesread );
153
                                bytesread = s.read( bb.data(), bb.size() );
4193 craig 154
                        }
11217 jghali 155
                        if (s.error() == QFile::NoError && t.error() == QFile::NoError)
156
                                error = 0;
204 Franz 157
                        t.close();
158
                }
4193 craig 159
                s.close();
204 Franz 160
        }
11217 jghali 161
        return error;
204 Franz 162
}
163
 
164
int moveFile(QString source, QString target)
165
{
166
        if ((source.isNull()) || (target.isNull()))
167
                return -1;
168
        if (source == target)
169
                return -1;
170
        copyFile(source, target);
2921 fschmid 171
        QFile::remove(source);
204 Franz 172
        return 0;
173
}
174
 
8 paul 175
QString GetAttr(QDomElement *el, QString at, QString def)
176
{
177
        return el->attribute(at, def);
178
}
179
 
1109 fschmid 180
 
3158 craig 181
// Legacy implementation of LoadText with incorrect
182
// handling of unicode data. This should be retired.
183
// Use loadRawText instead.
184
// FIXME XXX
185
//
690 cbradney 186
bool loadText(QString filename, QString *Buffer)
8 paul 187
{
690 cbradney 188
        QFile f(filename);
8 paul 189
        QFileInfo fi(f);
190
        if (!fi.exists())
191
                return false;
167 Franz 192
        bool ret;
10592 fschmid 193
        QByteArray bb(f.size(), ' ');
8501 cbradney 194
        if (f.open(QIODevice::ReadOnly))
167 Franz 195
        {
10592 fschmid 196
                f.read(bb.data(), f.size());
8 paul 197
                f.close();
8546 cbradney 198
                for (int posi = 0; posi < bb.size(); ++posi)
3027 fschmid 199
                        *Buffer += QChar(bb[posi]);
3497 avox 200
                /*
201
                int len = bb.size();
202
                int oldLen = Buffer->length();
203
                Buffer->setLength( oldLen + len + 1);
204
                // digged into Qt 3.3 sources to find that. Might break in Qt 4 -- AV
205
                unsigned short * ucsString = const_cast<unsigned short *>(Buffer->ucs2()) + oldLen;
206
                char * data = bb.data();
207
                for (uint posi = 0; posi < len; ++posi)
10200 cbradney 208
                *ucsString++ = *data++;
3497 avox 209
                *ucsString = 0;
10200 cbradney 210
                */
8 paul 211
                ret = true;
167 Franz 212
        }
8 paul 213
        else
214
                ret = false;
215
        return ret;
216
}
217
 
9535 fschmid 218
bool loadRawText(const QString & filename, QByteArray & buf)
3158 craig 219
{
220
        bool ret = false;
221
        QFile f(filename);
222
        QFileInfo fi(f);
223
        if (fi.exists())
224
        {
10592 fschmid 225
                QByteArray tempBuf(f.size() + 1, ' ');
8501 cbradney 226
                if (f.open(QIODevice::ReadOnly))
3158 craig 227
                {
10592 fschmid 228
                        unsigned int bytesRead = f.read(tempBuf.data(), f.size());
3646 craig 229
                        tempBuf[bytesRead] = '\0';
3158 craig 230
                        ret = bytesRead == f.size();
231
                        if (ret)
232
                                buf = tempBuf; // sharing makes this efficient
233
                }
234
        }
235
        if (f.isOpen())
236
                f.close();
237
        return ret;
238
}
239
 
5234 fschmid 240
bool loadRawBytes(const QString & filename, QByteArray & buf)
241
{
242
        bool ret = false;
243
        QFile f(filename);
244
        QFileInfo fi(f);
245
        if (fi.exists())
246
        {
10592 fschmid 247
                QByteArray tempBuf(f.size(), ' ');
8501 cbradney 248
                if (f.open(QIODevice::ReadOnly))
5234 fschmid 249
                {
10592 fschmid 250
                        unsigned int bytesRead = f.read(tempBuf.data(), f.size());
5234 fschmid 251
                        ret = bytesRead == f.size();
252
                        if (ret)
253
                                buf = tempBuf; // sharing makes this efficient
254
                }
255
        }
256
        if (f.isOpen())
257
                f.close();
258
        return ret;
259
}
260
 
8 paul 261
 
262
QString CompressStr(QString *in)
263
{
264
        QString out = "";
10592 fschmid 265
        QByteArray bb(in->length(), ' ');
9997 jghali 266
        if (bb.size() == in->length())
3158 craig 267
        {
9997 jghali 268
                for (int ax = 0; ax < in->length(); ++ax)
269
                {
270
                        // bb.insert(ax, in->at(ax)); JG monstruously inefficient due to frequent memory reallocation
271
                        bb[ax] = in->at(ax).cell();
272
                        assert(in->at(ax).row() == 0);
273
                }
10018 fschmid 274
                uLong exlen = (uLong)(bb.size() * 0.001 + 16) + bb.size();
10592 fschmid 275
                QByteArray bc(exlen, ' ');
10018 fschmid 276
                if( bc.size() == static_cast<qint32>(exlen) )
9997 jghali 277
                {
278
                        int errcode = compress2((Byte *)bc.data(), &exlen, (Byte *)bb.data(), uLong(bb.size()), 9);
279
                        if (errcode != Z_OK)
280
                        {
281
                                qDebug("compress2 failed with code %i", errcode);
282
                                out = *in;
283
                        }
284
                        else {
285
                                for (uint cl = 0; cl < exlen; ++cl)
286
                                        out += QChar(bc[cl]);
287
                        }
288
                }
289
                else
290
                {
291
                        qDebug("insufficient memory to allocate %i bytes", in->length());
292
                        out = *in;
293
                }
294
        }
295
        else
296
        {
297
                qDebug("insufficient memory to allocate %i bytes", in->length());
2295 cbradney 298
                out = *in;
299
        }
8 paul 300
        return out;
301
}
302
 
11317 jghali 303
QByteArray CompressArray(const QByteArray& in)
5234 fschmid 304
{
305
        QByteArray out;
11317 jghali 306
        uLong exlen = uint(in.size() * 0.001 + 16) + in.size();
10592 fschmid 307
        QByteArray temp(exlen, ' ');
11317 jghali 308
        int errcode = compress2((Byte *)temp.data(), &exlen, (Byte *)in.data(), uLong(in.size()), 9);
309
        if (errcode == Z_OK)
5234 fschmid 310
        {
311
                temp.resize(exlen);
312
                out = temp;
313
        }
11317 jghali 314
        else
315
                qDebug("compress2 failed with code %i", errcode);
5234 fschmid 316
        return out;
317
}
318
 
11107 jghali 319
char *toAscii85( quint32 value, bool& allZero )
320
{
321
        int digit, i;
322
        static char asciiVal[6];
323
        allZero = true;
324
    for (i = 0; i < 5; ++i)
325
        {
326
                digit = value % 85;
327
                if (digit != 0)
328
                        allZero = false;
329
                asciiVal[4-i] = digit + 33;
330
                value = (value - digit) / 85;
331
    }
332
        asciiVal[5] = 0;
333
        return asciiVal;
334
}
335
 
8 paul 336
char *toHex( uchar u )
337
{
1555 fschmid 338
        static char hexVal[3];
339
        int i = 1;
340
        while ( i >= 0 )
167 Franz 341
        {
342
                ushort hex = (u & 0x000f);
343
                if ( hex < 0x0a )
1555 fschmid 344
                        hexVal[i] = '0'+hex;
167 Franz 345
                else
1555 fschmid 346
                        hexVal[i] = 'A'+(hex-0x0a);
167 Franz 347
                u = u >> 4;
1555 fschmid 348
                i--;
349
        }
350
        hexVal[2] = '\0';
351
        return hexVal;
8 paul 352
}
353
 
354
QString String2Hex(QString *in, bool lang)
355
{
356
        int i = 0;
8546 cbradney 357
        QString out("");
358
        for( int xi = 0; xi < in->length(); ++xi )
167 Franz 359
        {
8663 subik 360
                // Qt4 .cell() added ???
8799 jghali 361
                out += toHex(QChar(in->at(xi)).cell());
8 paul 362
                ++i;
363
                if ((i>40) && (lang))
167 Franz 364
                {
8 paul 365
                        out += '\n';
366
                        i=0;
367
                }
167 Franz 368
        }
8 paul 369
        return out;
370
}
371
 
372
QByteArray ComputeMD5Sum(QByteArray *in)
373
{
10692 fschmid 374
        return QCryptographicHash::hash(*in, QCryptographicHash::Md5);
375
//      QByteArray MDsum(16, ' ');
376
//      md5_buffer (in->data(), in->size(), reinterpret_cast<void*>(MDsum.data()));
377
//      return MDsum;
8 paul 378
}
379
 
10259 jghali 380
QString Path2Relative(QString Path, const QString& baseDir)
19 Franz 381
{
10259 jghali 382
        QDir d(baseDir);
9717 fschmid 383
        return d.relativeFilePath(Path);
10200 cbradney 384
}
3089 fschmid 385
 
10259 jghali 386
QString Relative2Path(QString File, const QString& baseDir)
387
{
388
        QString   absPath;
389
        QFileInfo fi(File);
390
        if (File.isEmpty())
391
                absPath = File;
392
        else if (fi.isRelative())
167 Franz 393
        {
10259 jghali 394
                QDir d(baseDir);
395
                absPath = d.absoluteFilePath(File);
396
                absPath = QDir::cleanPath(absPath);
397
        }
10200 cbradney 398
        else
10259 jghali 399
                absPath = File;
400
        return absPath;
10200 cbradney 401
}
3089 fschmid 402
 
90 Franz 403
/***************************************************************************
404
    begin                : Wed Oct 29 2003
405
    copyright            : (C) 2003 The Scribus Team
406
    email                : paul@all-the-johnsons.co.uk
407
 ***************************************************************************/
408
// check if the file exists, if it does, ask if they're sure
409
// return true if they're sure, else return false;
410
 
411
bool overwrite(QWidget *parent, QString filename)
412
{
167 Franz 413
        bool retval = true;
414
        QFileInfo fi(filename);
415
        if (fi.exists())
1555 fschmid 416
        {
7152 jghali 417
                QString fn = QDir::convertSeparators(filename);
9706 cbradney 418
                int t = QMessageBox::warning(parent, QObject::tr("File exists"),
10200 cbradney 419
                                                                         "<qt>"+ QObject::tr("A file named '%1' already exists.<br/>Do you want to replace it with the file you are saving?").arg(fn) +"</qt>",
420
                                                                                         QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Cancel);
9422 fschmid 421
                if (t == QMessageBox::Cancel)
90 Franz 422
                        retval = false;
1555 fschmid 423
        }
424
        return retval;
90 Franz 425
}
124 Franz 426
 
1957 cbradney 427
void WordAndPara(PageItem* currItem, int *w, int *p, int *c, int *wN, int *pN, int *cN)
125 Franz 428
{
429
        QChar Dat = QChar(32);
430
        int para = 0;
431
        int ww = 0;
432
        int cc = 0;
433
        int paraN = 0;
434
        int wwN = 0;
435
        int ccN = 0;
436
        bool first = true;
1957 cbradney 437
        PageItem *nextItem = currItem;
438
        PageItem *nbl = currItem;
439
        while (nextItem != 0)
167 Franz 440
        {
7994 avox 441
                if (nextItem->prevInChain() != 0)
442
                        nextItem = nextItem->prevInChain();
125 Franz 443
                else
444
                        break;
167 Franz 445
        }
1957 cbradney 446
        while (nextItem != 0)
167 Franz 447
        {
8562 jghali 448
                for (int a = qMax(nextItem->firstInFrame(),0); a <= nextItem->lastInFrame() && a < nextItem->itemText.length(); ++a)
1555 fschmid 449
                {
5184 avox 450
                        QChar b = nextItem->itemText.text(a);
5732 avox 451
                        if (b == SpecialChars::PARSEP)
167 Franz 452
                        {
5732 avox 453
                                para++;
167 Franz 454
                        }
125 Franz 455
                        if ((!b.isLetterOrNumber()) && (Dat.isLetterOrNumber()) && (!first))
167 Franz 456
                        {
5732 avox 457
                                ww++;
167 Franz 458
                        }
5732 avox 459
                        cc++;
1555 fschmid 460
                        Dat = b;
125 Franz 461
                        first = false;
1555 fschmid 462
                }
1957 cbradney 463
                nbl = nextItem;
7994 avox 464
                nextItem = nextItem->nextInChain();
167 Franz 465
        }
5732 avox 466
        if (nbl->frameOverflows()) {
125 Franz 467
                paraN++;
5736 avox 468
                for (int a = nbl->lastInFrame()+1; a < nbl->itemText.length(); ++a)
5732 avox 469
                {
5736 avox 470
                        QChar b = nbl->itemText.text(a);
5732 avox 471
                        if (b == SpecialChars::PARSEP)
472
                        {
473
                                paraN++;
474
                        }
475
                        if ((!b.isLetterOrNumber()) && (Dat.isLetterOrNumber()) && (!first))
476
                        {
477
                                wwN++;
478
                        }
479
                        ccN++;
480
                        Dat = b;
481
                        first = false;
482
                }
483
        }              
484
        else {
125 Franz 485
                para++;
5732 avox 486
        }
125 Franz 487
        if (Dat.isLetterOrNumber())
167 Franz 488
        {
5559 avox 489
                if (nbl->frameOverflows())
125 Franz 490
                        wwN++;
491
                else
492
                        ww++;
167 Franz 493
        }
125 Franz 494
        *w = ww;
495
        *p = para;
496
        *c = cc;
497
        *wN = wwN;
498
        *pN = paraN;
499
        *cN = ccN;
500
}
203 Franz 501
 
690 cbradney 502
void ReOrderText(ScribusDoc *currentDoc, ScribusView *view)
203 Franz 503
{
4593 cbradney 504
        double savScale = view->scale();
2380 cbradney 505
        view->setScale(1.0);
690 cbradney 506
        currentDoc->RePos = true;
9319 fschmid 507
        QImage pgPix(10, 10, QImage::Format_ARGB32);
10840 avox 508
        QRect rd; // = QRect(0,0,9,9);
203 Franz 509
        ScPainter *painter = new ScPainter(&pgPix, pgPix.width(), pgPix.height());
9903 fschmid 510
        for (int azz=0; azz<currentDoc->MasterItems.count(); ++azz)
203 Franz 511
        {
1957 cbradney 512
                PageItem *currItem = currentDoc->MasterItems.at(azz);
513
                if (currItem->itemType() == PageItem::PathText)
514
                        currItem->DrawObj(painter, rd);
203 Franz 515
        }
9903 fschmid 516
        for (int azz=0; azz<currentDoc->Items->count(); ++azz)
203 Franz 517
        {
3727 cbradney 518
                PageItem *currItem = currentDoc->Items->at(azz);
7145 jghali 519
                if (currItem->itemType() == PageItem::TextFrame)
520
                        currItem->asTextFrame()->layout();
521
                else if (currItem->itemType() == PageItem::PathText)
1957 cbradney 522
                        currItem->DrawObj(painter, rd);
203 Franz 523
        }
690 cbradney 524
        currentDoc->RePos = false;
2380 cbradney 525
        view->setScale(savScale);
203 Franz 526
        delete painter;
527
}
447 cbradney 528
 
4449 subik 529
/*! \brief Helper function for sorting in sortQStringList.
530
\author 10/06/2004 - pv
4645 subik 531
\param s1 first string
532
\param s2 second string
447 cbradney 533
\retval bool t/f related s1>s2
534
 */
535
bool compareQStrings(QString s1, QString s2)
536
{
537
        if (QString::localeAwareCompare(s1, s2) >= 0)
2680 cbradney 538
                return false;
539
        return true;
447 cbradney 540
}
541
 
542
QStringList sortQStringList(QStringList aList)
543
{
544
        std::vector<QString> sortList;
545
        QStringList retList;
546
        QStringList::Iterator it;
547
        for (it = aList.begin(); it != aList.end(); ++it)
548
                sortList.push_back(*it);
549
        std::sort(sortList.begin(), sortList.end(), compareQStrings);
456 fschmid 550
        for(uint i = 0; i < sortList.size(); i++)
447 cbradney 551
                retList.append(sortList[i]);
552
        return retList;
553
}
517 fschmid 554
 
2834 cbradney 555
QString checkFileExtension(const QString &currName, const QString &extension)
556
{
557
        QString newName(currName);
558
        //If filename ends with a period, just add the extension
559
        if (newName.right(1)==".")
560
        {
10398 cbradney 561
                newName+=extension.toLower();
2834 cbradney 562
                return newName;
563
        }
564
        //If filename doesnt end with the period+extension, add it on
10398 cbradney 565
        QString dotExt("." + extension.toLower());
10592 fschmid 566
        if (!newName.endsWith(dotExt, Qt::CaseInsensitive))
2834 cbradney 567
                newName+=dotExt;
568
        return newName;
569
}
2907 subik 570
 
5781 cbradney 571
QString getFileNameByPage(ScribusDoc* currDoc, uint pageNo, QString extension)
2907 subik 572
{
9791 jghali 573
        uint number = pageNo + currDoc->FirstPnum;
5781 cbradney 574
        QString defaultName = currDoc->DocName;
2907 subik 575
        if (defaultName.isNull())
576
                defaultName = "export";
577
        else
578
        {
579
                QFileInfo fi(defaultName);
10469 cbradney 580
                defaultName = fi.completeBaseName();
2907 subik 581
        }
9791 jghali 582
        return QString("%1-%2%3.%4").arg(defaultName).arg(QObject::tr("page", "page export")).arg(number, 3, 10, QChar('0')).arg(extension);
2907 subik 583
}
3689 cbradney 584
 
3757 cbradney 585
const QString getStringFromSequence(DocumentSectionType type, uint position)
586
{
587
        QString retVal("");
588
        switch( type )
589
        {
3778 cbradney 590
                case Type_1_2_3:
591
                        retVal=QString::number(position);
592
                        break;
3757 cbradney 593
                case Type_A_B_C:
10398 cbradney 594
                        retVal=numberToLetterSequence(position).toUpper();
3778 cbradney 595
                        break;
3757 cbradney 596
                case Type_a_b_c:
3778 cbradney 597
                        retVal=numberToLetterSequence(position);
3757 cbradney 598
                        break;
599
                case Type_I_II_III:
600
                        retVal=arabicToRoman(position);
601
                        break;
602
                case Type_i_ii_iii:
603
                        //well, for lower case people will want that, even if its "wrong"
604
                        //ie, X=10, x=10000
10398 cbradney 605
                        retVal=arabicToRoman(position).toLower();
3757 cbradney 606
                        break;
8439 cbradney 607
                case Type_None:
608
                        break;
3757 cbradney 609
                default:
610
                        break;
611
        }
612
        return retVal;
613
}
614
 
615
const QString numberToLetterSequence(uint i)
616
{
617
        QString retVal("");
618
        unsigned digits = 1;
619
        unsigned offset = 0;
620
        uint column=i;
621
        --column;
622
 
623
        if( column > 4058115285U ) return  QString("@");
624
 
625
        for( unsigned limit = 26; column >= limit+offset; limit *= 26, digits++ )
626
                offset += limit;
627
 
628
        for( unsigned c = column - offset; digits; --digits, c/=26 )
629
                retVal.prepend( QChar( 'a' + (c%26) ) );
630
        return retVal;
631
}
632
 
633
const QString arabicToRoman(uint i)
634
{
635
        QString roman("");
636
        int arabic = i;
637
        while (arabic - 1000000 >= 0){
10200 cbradney 638
                roman += "m";
639
                arabic -= 1000000;
3757 cbradney 640
        }
641
        while (arabic - 900000 >= 0){
10200 cbradney 642
                roman += "cm";
643
                arabic -= 900000;
3757 cbradney 644
        }
645
        while (arabic - 500000 >= 0){
10200 cbradney 646
                roman += "d";
647
                arabic -= 500000;
3757 cbradney 648
        }
649
        while (arabic - 400000 >= 0){
10200 cbradney 650
                roman += "cd";
651
                arabic -= 400000;
3757 cbradney 652
        }
653
        while (arabic - 100000 >= 0){
10200 cbradney 654
                roman += "c";
655
                arabic -= 100000;
3757 cbradney 656
        }
657
        while (arabic - 90000 >= 0){
10200 cbradney 658
                roman += "xc";
659
                arabic -= 90000;
3757 cbradney 660
        }
661
        while (arabic - 50000 >= 0){
10200 cbradney 662
                roman += "l";
663
                arabic -= 50000;
3757 cbradney 664
        }
665
        while (arabic - 40000 >= 0){
10200 cbradney 666
                roman += "xl";
667
                arabic -= 40000;
3757 cbradney 668
        }
669
        while (arabic - 10000 >= 0){
10200 cbradney 670
                roman += "x";
671
                arabic -= 10000;
3757 cbradney 672
        }
673
        while (arabic - 9000 >= 0){
10200 cbradney 674
                roman += "Mx";
675
                arabic -= 9000;
3757 cbradney 676
        }
677
        while (arabic - 5000 >= 0){
10200 cbradney 678
                roman += "v";
679
                arabic -= 5000;
3757 cbradney 680
        }
681
        while (arabic - 4000 >= 0){
10200 cbradney 682
                roman += "Mv";
683
                arabic -= 4000;
3757 cbradney 684
        }
685
        while (arabic - 1000 >= 0){
10200 cbradney 686
                roman += "M";
687
                arabic -= 1000;
3757 cbradney 688
        }
689
        while (arabic - 900 >= 0){
10200 cbradney 690
                roman += "CM";
691
                arabic -= 900;
3757 cbradney 692
        }
693
        while (arabic - 500 >= 0){
10200 cbradney 694
                roman += "D";
695
                arabic -= 500;
3757 cbradney 696
        }
697
        while (arabic - 400 >= 0){
10200 cbradney 698
                roman += "CD";
699
                arabic -= 400;
3757 cbradney 700
        }
701
        while (arabic - 100 >= 0){
10200 cbradney 702
                roman += "C";
703
                arabic -= 100;
3757 cbradney 704
        }
705
        while (arabic - 90 >= 0){
10200 cbradney 706
                roman += "XC";
707
                arabic -= 90;
3757 cbradney 708
        }
709
        while (arabic - 50 >= 0){
10200 cbradney 710
                roman += "L";
711
                arabic -= 50;
3757 cbradney 712
        }
713
        while (arabic - 40 >= 0){
10200 cbradney 714
                roman += "XL";
715
                arabic -= 40;
3757 cbradney 716
        }
717
        while (arabic - 10 >= 0){
10200 cbradney 718
                roman += "X";
719
                arabic -= 10;
3757 cbradney 720
        }
721
        while (arabic - 9 >= 0){
10200 cbradney 722
                roman += "IX";
723
                arabic -= 9;
3757 cbradney 724
        }
725
        while (arabic - 5 >= 0){
10200 cbradney 726
                roman += "V";
727
                arabic -= 5;
3757 cbradney 728
        }
729
        while (arabic - 4 >= 0){
10200 cbradney 730
                roman += "IV";
731
                arabic -= 4;
3757 cbradney 732
        }
733
        while (arabic - 1 >= 0){
10200 cbradney 734
                roman += "I";
735
                arabic -= 1;
3757 cbradney 736
        }
737
        return roman;
3776 cbradney 738
}
3784 cbradney 739
 
740
//CB Moved from scribus.cpp
741
void parsePagesString(QString pages, std::vector<int>* pageNs, int sourcePageCount)
742
{
743
        QString tmp(pages);
744
        QString token;
745
        int from, to, pageNr;
746
        do
747
        {
10517 cbradney 748
                if (tmp.indexOf(",") == -1)
3784 cbradney 749
                {
750
                        token = tmp;
751
                        tmp = "";
752
                }
753
                else
754
                {
10517 cbradney 755
                        token = tmp.left(tmp.indexOf(","));
756
                        tmp = tmp.right(tmp.length() - tmp.indexOf(",") - 1);
3784 cbradney 757
                }
758
 
10394 cbradney 759
                token = token.trimmed();
3784 cbradney 760
                if (token == "*") // Import all source doc pages
761
                {
762
                        for (int i = 1; i <= sourcePageCount; ++i)
763
                                pageNs->push_back(i);
764
                }
10517 cbradney 765
                else if (token.indexOf("-") != -1) // import a range of source doc pages
3784 cbradney 766
                {
10517 cbradney 767
                        from = QString(token.left(token.indexOf("-"))).toInt();
768
                        to = QString(token.right(token.length() - token.indexOf("-") - 1)).toInt();
3784 cbradney 769
                        if ((from != 0) && (to != 0))
770
                        {
771
                                if (from > sourcePageCount)
772
                                        from = sourcePageCount;
773
                                if (to > sourcePageCount)
774
                                        to = sourcePageCount;
775
                                if (from == to)
776
                                        pageNs->push_back(to);
777
                                else if (from < to)
778
                                {
779
                                        for (int i = from; i <= to; ++i)
780
                                                pageNs->push_back(i);
781
                                }
782
                                else
783
                                {
784
                                        for (int i = from; i >= to; --i)
785
                                                pageNs->push_back(i);
786
                                }
787
                        }
788
                }
789
                else // import single source doc page
790
                {
791
                        pageNr = token.toInt();
792
                        if ((pageNr > 0) && (pageNr <= sourcePageCount))
793
                                pageNs->push_back(pageNr);
794
                }
795
        } while (!tmp.isEmpty());
3793 cbradney 796
}
5184 avox 797
 
798
 
799
int findParagraphStyle(ScribusDoc* doc, const ParagraphStyle& parStyle)
800
{
801
        bool named = !parStyle.name().isEmpty();
802
//qDebug(QString("looking up %1/ %2").arg(parStyle.name()).arg(parStyle.alignment())); 
803
        if (named) {
10400 subik 804
                for (int i=0; i < doc->paragraphStyles().count(); ++i)
5184 avox 805
                {
7442 avox 806
//qDebug(QString("%1 %2").arg(i).arg(doc->paragraphStyles()[i].name()));
807
                        if (parStyle.name() == doc->paragraphStyles()[i].name()) {
5184 avox 808
                                return i;
809
                        }
810
                }
811
                assert(false);
812
                return -1;
813
        }
814
        else {
6866 avox 815
                return -1;
5184 avox 816
        }
817
}
5557 subik 818
 
6044 tsoots 819
int findParagraphStyle(ScribusDoc* doc, const QString &name)
820
{
10400 subik 821
        for (int i=0; i < doc->paragraphStyles().count(); ++i)
6044 tsoots 822
        {
7442 avox 823
                if (name == doc->paragraphStyles()[i].name()) {
6044 tsoots 824
                        return i;
825
                }
826
        }
827
        assert(false);
828
        return -1;
829
}
830
 
5712 fschmid 831
 
5890 subik 832
void tDebug(QString message)
833
{
834
        QDateTime debugTime;
10592 fschmid 835
        qDebug("%s", QString("%1\t%2").arg(debugTime.currentDateTime().toString("hh:mm:ss:zzz")).arg(message).toAscii().constData());
5890 subik 836
}
6116 fschmid 837
 
9970 fschmid 838
 
9991 fschmid 839
QString readLinefromDataStream(QDataStream &s)
9970 fschmid 840
{
841
        QString ret = "";
9991 fschmid 842
        uchar charData;
9970 fschmid 843
        while (!s.atEnd())
844
        {
9991 fschmid 845
                s >> charData;
846
                if (charData == '\x0A')
847
                        break;
848
                if (charData == '\x0D')
9970 fschmid 849
                {
9991 fschmid 850
                        quint64 oldPos = s.device()->pos();
851
                        s >> charData;
852
                        if (charData != '\x0A')
853
                                s.device()->seek(oldPos);
9970 fschmid 854
                        break;
855
                }
9991 fschmid 856
                ret += QChar(charData);
9970 fschmid 857
        }
858
        return ret.trimmed();
859
}
10648 fschmid 860
 
861
void setCurrentComboItem(QComboBox *box, QString text)
862
{
863
        box->blockSignals(true);
864
        int ind = box->findText(text);
865
        if (ind > -1)
866
                box->setCurrentIndex(ind);
867
        box->blockSignals(false);
868
}
10988 fschmid 869
 
870
QString getDashString(int dashtype, double linewidth)
871
{
872
        QString Dt = QString::number(qMax(1.0*linewidth, 0.1));
873
        QString Sp = QString::number(qMax(2.0*linewidth, 0.1));
874
        QString Da = QString::number(qMax(4.0*linewidth, 0.1));
875
        QString tmp = "";
876
        switch (dashtype)
877
        {
878
                case 1:
879
                        break;
880
                case 2:
881
                        tmp += Da+" "+Sp;
882
                        break;
883
                case 3:
884
                        tmp += Dt+" "+Sp;
885
                        break;
886
                case 4:
887
                        tmp += Da+" "+Sp+" "+Dt+" "+Sp;
888
                        break;
889
                case 5:
890
                        tmp += Da+" "+Sp+" "+Dt+" "+Sp+" "+Dt+" "+Sp;
891
                        break;
892
// Additional line styles taken from Inkscape
11177 fschmid 893
                case 6:
10988 fschmid 894
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
895
                        break;
896
                case 7:
897
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(3.0 * linewidth, 0.01));
898
                        break;
899
                case 8:
900
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(4.0 * linewidth, 0.01));
901
                        break;
902
                case 9:
903
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(6.0 * linewidth, 0.01));
904
                        break;
905
                case 10:
906
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(8.0 * linewidth, 0.01));
907
                        break;
908
                case 11:
909
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(12.0 * linewidth, 0.01));
910
                        break;
911
                case 12:
912
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(24.0 * linewidth, 0.01));
913
                        break;
914
                case 13:
915
                        tmp += QString("%1 %2").arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(48.0 * linewidth, 0.01));
916
                        break;
917
                case 14:
918
                        tmp += QString("%1 %2").arg(qMax(2.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
919
                        break;
920
                case 15:
921
                        tmp += QString("%1 %2").arg(qMax(3.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
922
                        break;
923
                case 16:
924
                        tmp += QString("%1 %2").arg(qMax(4.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
925
                        break;
926
                case 17:
927
                        tmp += QString("%1 %2").arg(qMax(6.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
928
                        break;
929
                case 18:
930
                        tmp += QString("%1 %2").arg(qMax(8.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
931
                        break;
932
                case 19:
11206 fschmid 933
                        tmp += QString("%1 %2").arg(qMax(10.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
10988 fschmid 934
                        break;
935
                case 20:
11206 fschmid 936
                        tmp += QString("%1 %2").arg(qMax(12.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
10988 fschmid 937
                        break;
938
                case 21:
939
                        tmp += QString("%1 %2").arg(qMax(2.0 * linewidth, 0.01)).arg(qMax(2.0 * linewidth, 0.01));
940
                        break;
941
                case 22:
942
                        tmp += QString("%1 %2").arg(qMax(3.0 * linewidth, 0.01)).arg(qMax(3.0 * linewidth, 0.01));
943
                        break;
944
                case 23:
945
                        tmp += QString("%1 %2").arg(qMax(4.0 * linewidth, 0.01)).arg(qMax(4.0 * linewidth, 0.01));
946
                        break;
947
                case 24:
948
                        tmp += QString("%1 %2").arg(qMax(6.0 * linewidth, 0.01)).arg(qMax(6.0 * linewidth, 0.01));
949
                        break;
950
                case 25:
951
                        tmp += QString("%1 %2").arg(qMax(8.0 * linewidth, 0.01)).arg(qMax(8.0 * linewidth, 0.01));
952
                        break;
953
                case 26:
11206 fschmid 954
                        tmp += QString("%1 %2").arg(qMax(10.0 * linewidth, 0.01)).arg(qMax(10.0 * linewidth, 0.01));
10988 fschmid 955
                        break;
956
                case 27:
11206 fschmid 957
                        tmp += QString("%1 %2").arg(qMax(12.0 * linewidth, 0.01)).arg(qMax(12.0 * linewidth, 0.01));
10988 fschmid 958
                        break;
959
                case 28:
960
                        tmp += QString("%1 %2").arg(qMax(2.0 * linewidth, 0.01)).arg(qMax(4.0 * linewidth, 0.01));
961
                        break;
962
                case 29:
963
                        tmp += QString("%1 %2").arg(qMax(2.0 * linewidth, 0.01)).arg(qMax(6.0 * linewidth, 0.01));
964
                        break;
965
                case 30:
966
                        tmp += QString("%1 %2").arg(qMax(6.0 * linewidth, 0.01)).arg(qMax(2.0 * linewidth, 0.01));
967
                        break;
968
                case 31:
969
                        tmp += QString("%1 %2").arg(qMax(4.0 * linewidth, 0.01)).arg(qMax(8.0 * linewidth, 0.01));
970
                        break;
971
                case 32:
972
                        tmp += QString("%1 %2").arg(qMax(8.0 * linewidth, 0.01)).arg(qMax(4.0 * linewidth, 0.01));
973
                        break;
974
                case 33:
975
                        tmp += QString("%1 %2 %3 %4").arg(qMax(2.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(0.5 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01));
976
                        break;
977
                case 34:
978
                        tmp += QString("%1 %2 %3 %4").arg(qMax(8.0 * linewidth, 0.01)).arg(qMax(2.0 * linewidth, 0.01)).arg(qMax(1.0 * linewidth, 0.01)).arg(qMax(2.0 * linewidth, 0.01));
979
                        break;
980
                case 35:
981
                        tmp += QString("%1 %2").arg(qMax(0.5 * linewidth, 0.01)).arg(qMax(0.5 * linewidth, 0.01));
982
                        break;
983
                case 36:
984
                        tmp += QString("%1 %2").arg(qMax(0.25 * linewidth, 0.01)).arg(qMax(0.25 * linewidth, 0.01));
985
                        break;
986
                case 37:
987
                        tmp += QString("%1 %2").arg(qMax(0.1 * linewidth, 0.01)).arg(qMax(0.1 * linewidth, 0.01));
11177 fschmid 988
                        break;
10988 fschmid 989
                default:
990
                        break;
991
        }
992
        return tmp;
993
}
994
 
995
void getDashArray(int dashtype, double linewidth, QList<double> &m_array)
996
{
997
        m_array.clear();
11182 fschmid 998
        if ((dashtype == 1) || (dashtype == 0))
10988 fschmid 999
                return;
1000
        QString tmp = getDashString(dashtype, linewidth);
1001
        QStringList dashes = tmp.split(" ");
1002
        for (int a = 0; a < dashes.size(); a++)
1003
        {
1004
                m_array.append(dashes[a].toDouble());
1005
        }
1006
}