Subversion Repositories Scribus

Rev

Rev 9137 | 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
*/
3 paul 7
/***************************************************************************
8
                          customfdialog.cpp  -  description
9
                             -------------------
10
    begin                : Fri Nov 30 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
 ***************************************************************************/
23
 
24
#include "customfdialog.h"
25
#include "customfdialog.moc"
26
#include <qpixmap.h>
27
#include <qpainter.h>
28
#include <qfileinfo.h>
29
#include <qdir.h>
30
#include <qdom.h>
15 Franz 31
#include <qtextcodec.h>
5781 cbradney 32
 
33
#include "cmsettings.h"
3543 avox 34
#include "sccombobox.h"
1555 fschmid 35
#include "scribusstructs.h"
2004 fschmid 36
#include "scimage.h"
4631 cbradney 37
#include "util.h"
2534 craig 38
 
3 paul 39
extern QString DocDir;
40
 
41
ImIconProvider::ImIconProvider(QWidget *pa) : QFileIconProvider(pa)
42
{
161 Franz 43
        fmts.clear();
7420 fschmid 44
        QString tmp[] = {"eps", "epsi", "gif", "png", "jpg", "jpeg", "xpm", "tif", "tiff", "bmp", "pbm", "pgm", "ppm", "xbm", "xpm", "psd", "pat"};
167 Franz 45
        size_t array = sizeof(tmp) / sizeof(*tmp);
46
        for (uint a = 0; a < array; ++a)
47
                fmts += tmp[a];
9137 cbradney 48
        imagepm = loadIcon("16/image-x-generic.png");
161 Franz 49
        pspm = loadIcon("postscript.png");
50
        txtpm = loadIcon("txt.png");
51
        docpm = loadIcon("doc.png");
52
        pdfpm = loadIcon("pdf.png");
867 fschmid 53
        oosxdpm = loadIcon("ooo_draw.png");
54
        oosxwpm = loadIcon("ooo_writer.png");
55
        vectorpm = loadIcon("vectorgfx.png");
3 paul 56
}
57
 
58
const QPixmap * ImIconProvider::pixmap(const QFileInfo &fi)
59
{
60
        QString ext = fi.extension(false).lower();
61
        if (fmts.contains(ext))
62
                return &imagepm;
63
        else
161 Franz 64
        {
867 fschmid 65
                ext = fi.extension(true).lower();
66
                if (ext.endsWith("ps"))
3 paul 67
                        return &pspm;
867 fschmid 68
                if (ext.endsWith("txt"))
3 paul 69
                        return &txtpm;
867 fschmid 70
                if (ext.endsWith("scd") || ext.endsWith("scd.gz"))
3 paul 71
                        return &docpm;
867 fschmid 72
                if (ext.endsWith("sla") || ext.endsWith("sla.gz"))
3 paul 73
                        return &docpm;
867 fschmid 74
                if (ext.endsWith("pdf"))
3 paul 75
                        return &pdfpm;
867 fschmid 76
                if (ext.endsWith("sxd"))
77
                        return &oosxdpm;
78
                if (ext.endsWith("sxw"))
79
                        return &oosxwpm;
80
                if (ext.endsWith("svg") || ext.endsWith("svgz"))
81
                        return &vectorpm;
3 paul 82
                return QFileIconProvider::pixmap(fi);
161 Franz 83
        }
3 paul 84
}
85
 
86
FDialogPreview::FDialogPreview(QWidget *pa) : QLabel(pa)
87
{
88
        setAlignment(AlignLeft | AlignTop);
89
        setMinimumSize( QSize( 100, 100 ) );
867 fschmid 90
        setMaximumSize( QSize( 300, 300 ) );
3 paul 91
        setScaledContents( false );
92
        setEraseColor( white );
93
        setFrameShape( QLabel::WinPanel );
94
        setFrameShadow( QLabel::Sunken );
311 Franz 95
        updtPix();
3 paul 96
}
97
 
311 Franz 98
void FDialogPreview::updtPix()
99
{
100
        QPixmap pm;
101
        QRect inside = contentsRect();
102
        pm = QPixmap(inside.width(), inside.height());
103
        pm.fill(white);
104
        setPixmap(pm);
105
}
106
 
3 paul 107
void FDialogPreview::GenPreview(QString name)
108
{
109
        QPixmap pm;
110
        QString Buffer = "";
111
        QFileInfo fi = QFileInfo(name);
112
        if (fi.isDir())
113
                return;
311 Franz 114
        updtPix();
115
        int w = pixmap()->width();
116
        int h = pixmap()->height();
1505 fschmid 117
        bool mode = false;
1915 fschmid 118
        QString ext = fi.extension(false).lower();
119
        QStringList formats;
120
        formats = QStringList::fromStrList(QImageIO::inputFormats());
121
        formats.append("jpg");
122
        formats.append("tif");
123
        formats.append("tiff");
124
        formats.append("psd");
125
        formats.append("eps");
7420 fschmid 126
        formats.append("epsi");
1915 fschmid 127
        formats.append("pdf");
128
        formats.append("ps");
6412 fschmid 129
        formats.append("pat");
1915 fschmid 130
        QString allFormats = formats.join( " " );
131
        formats.clear();
132
        allFormats = allFormats.lower();
133
        formats = QStringList::split( " ", allFormats );
6808 fschmid 134
        if (ext.isEmpty())
135
                ext = getImageType(name);
1915 fschmid 136
        if (formats.contains(ext))
161 Franz 137
        {
2004 fschmid 138
                ScImage im;
5781 cbradney 139
                //No doc to send data anyway, so no doc to get into scimage.
5959 jghali 140
                CMSettings cms(0, "", 0);
141
                if (im.LoadPicture(name, cms, false, false, ScImage::Thumbnail, 72, &mode))
161 Franz 142
                {
3703 fschmid 143
                        int ix,iy;
144
                        if ((im.imgInfo.exifDataValid) && (!im.imgInfo.exifInfo.thumbnail.isNull()))
145
                        {
3706 fschmid 146
                                ix = im.imgInfo.exifInfo.width;
147
                                iy = im.imgInfo.exifInfo.height;
3703 fschmid 148
                        }
149
                        else
150
                        {
151
                                ix = im.width();
152
                                iy = im.height();
153
                        }
2004 fschmid 154
                        int xres = im.imgInfo.xres;
155
                        int yres = im.imgInfo.yres;
1915 fschmid 156
                        QString tmp = "";
157
                        QString tmp2 = "";
2004 fschmid 158
                        QImage im2;
3703 fschmid 159
                        if ((ix > w-5) || (iy > h-44))
1798 fschmid 160
                        {
1915 fschmid 161
                                double sx = im.width() / static_cast<double>(w-5);
162
                                double sy = im.height() / static_cast<double>(h-44);
163
                                im2 = sy < sx ?  im.smoothScale(qRound(im.width() / sx), qRound(im.height() / sx)) :
3703 fschmid 164
                                                 im.smoothScale(qRound(im.width() / sy), qRound(im.height() / sy));
1798 fschmid 165
                        }
2004 fschmid 166
                        else
5593 avox 167
                                im2 = im.qImage(); // no need to copy
1915 fschmid 168
                        QPainter p;
6020 fschmid 169
                        QBrush b(QColor(205,205,205), loadIcon("testfill.png"));
1915 fschmid 170
                        p.begin(pixmap());
6020 fschmid 171
                        p.fillRect(0, 0, w, h-44, b);
172
                        p.fillRect(0, h-44, w, 44, QColor(255, 255, 255));
173
                        p.drawImage((w - im2.width()) / 2, (h - 44 - im2.height()) / 2, im2);
1915 fschmid 174
                        p.drawText(2, h-29, tr("Size:")+" "+tmp.setNum(ix)+" x "+tmp2.setNum(iy));
175
                        p.drawText(2, h-17, tr("Resolution:")+" "+tmp.setNum(xres)+" x "+tmp2.setNum(yres)+" "+ tr("DPI"));
176
                        QString cSpace;
7420 fschmid 177
                        if (((ext == "pdf") || (ext == "eps") || (ext == "epsi") || (ext == "ps")) && (im.imgInfo.type != 7))
1915 fschmid 178
                                cSpace = tr("Unknown");
179
                        else
180
                        {
2004 fschmid 181
                                switch (im.imgInfo.colorspace)
1915 fschmid 182
                                {
183
                                        case 0:
184
                                                cSpace = tr("RGB");
185
                                                break;
186
                                        case 1:
187
                                                cSpace = tr("CMYK");
188
                                                break;
189
                                        case 2:
190
                                                cSpace = tr("Grayscale");
191
                                                break;
6010 fschmid 192
                                        case 3:
193
                                                cSpace = tr("Duotone");
194
                                                break;
1915 fschmid 195
                                }
196
                        }
197
                        p.drawText(2, h-5, tr("Colorspace:")+" "+cSpace);
198
                        p.end();
199
                        repaint();
1798 fschmid 200
                }
161 Franz 201
        }
3 paul 202
        else
161 Franz 203
        {
204
                if (loadText(name, &Buffer))
3 paul 205
                {
161 Franz 206
                        if (Buffer.startsWith("<SCRIBUS"))
3 paul 207
                        {
208
                                QDomDocument docu("scridoc");
209
                                if(!docu.setContent(Buffer))
210
                                        return;
211
                                QDomElement elem=docu.documentElement();
1915 fschmid 212
                                if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8") && (elem.tagName() != "SCRIBUSUTF8NEW"))
3 paul 213
                                        return;
214
                                QDomNode DOC=elem.firstChild();
215
                                QDomElement dc=DOC.toElement();
216
                                QString Tit = tr("Title:")+" ";
217
                                QString ti2 = dc.attribute("TITLE");
2877 cbradney 218
                                if (ti2.isEmpty())
3 paul 219
                                        ti2= tr("No Title");
220
                                Tit += ti2+"\n";
221
                                QString Aut = tr("Author:")+" ";
222
                                QString au2 = dc.attribute("AUTHOR");
2877 cbradney 223
                                if (au2.isEmpty())
3 paul 224
                                        au2 = tr("Unknown");
225
                                Aut += au2;
340 Franz 226
                                setText( tr("Scribus Document")+"\n\n"+Tit+Aut);
161 Franz 227
                        }
1915 fschmid 228
                        else  if ((ext == "txt") || (ext == "html") || (ext == "xml"))
3 paul 229
                                setText(Buffer.left(200));
230
                }
161 Franz 231
        }
4182 subik 232
}
3 paul 233
 
234
void FDialogPreview::previewUrl( const QUrl &url )
235
{
236
        if (url.isLocalFile())
6269 jghali 237
        {
238
                QFileInfo finfo(url.path());
239
                if (filePath != finfo.filePath())
240
                {
241
                        filePath = finfo.filePath();
242
                        GenPreview(url.path());
243
                }
244
        }
3 paul 245
}
246
 
5846 jghali 247
CustomFDialog::CustomFDialog(QWidget *parent, QString wDir, QString caption, QString filter, int flags)
248
                        : QFileDialog(QString::null, filter, parent, 0, true), optionFlags(flags)
3 paul 249
{
83 Franz 250
        setIcon(loadIcon("AppIcon.png"));
4182 subik 251
        setCaption(caption);
415 Franz 252
        cDir = QDir(wDir);
3 paul 253
        setDir(cDir);
254
        setIconProvider(new ImIconProvider(this));
311 Franz 255
        FDialogPreview *pw;
5846 jghali 256
        if (flags & fdDirectoriesOnly)
161 Franz 257
        {
3 paul 258
                Layout = new QFrame(this);
259
                Layout1 = new QHBoxLayout(Layout);
310 Franz 260
                Layout1->setSpacing( 0 );
3 paul 261
                Layout1->setMargin( 0 );
2397 cbradney 262
                SaveZip = new QCheckBox( tr( "&Compress File" ), Layout, "test");
310 Franz 263
                Layout1->addWidget(SaveZip, Qt::AlignLeft);
3 paul 264
                QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
310 Franz 265
                Layout1->addItem( spacer );
266
                addWidgets(0, Layout, 0);
267
                LayoutC = new QFrame(this);
268
                Layout1C = new QHBoxLayout(LayoutC);
269
                Layout1C->setSpacing( 0 );
270
                Layout1C->setMargin( 0 );
5843 jghali 271
                WithFonts = new QCheckBox( tr( "&Include Fonts" ), LayoutC, "WithFonts");
272
                Layout1C->addWidget(WithFonts, Qt::AlignLeft);
273
                WithProfiles = new QCheckBox( tr( "&Include ICC Profiles" ), LayoutC, "WithProfiles");
274
                Layout1C->addWidget(WithProfiles, Qt::AlignLeft);
310 Franz 275
                QSpacerItem* spacer2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
276
                Layout1C->addItem( spacer2 );
277
                addWidgets(0, LayoutC, 0);
278
                setMode(QFileDialog::DirectoryOnly);
161 Franz 279
        }
3 paul 280
        else
161 Franz 281
        {
310 Franz 282
                setContentsPreviewEnabled( true );
311 Franz 283
                pw = new FDialogPreview( this );
310 Franz 284
                setContentsPreview( pw, pw );
5846 jghali 285
                if (flags & fdCompressFile)
161 Franz 286
                {
310 Franz 287
                        Layout = new QFrame(this);
288
                        Layout1 = new QHBoxLayout(Layout);
289
                        Layout1->setSpacing( 6 );
290
                        Layout1->setMargin( 0 );
2397 cbradney 291
                        SaveZip = new QCheckBox( tr( "&Compress File" ), Layout, "test");
310 Franz 292
                        Layout1->addWidget(SaveZip);
293
                        QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
294
                        Layout1->addItem( spacer );
295
                }
5846 jghali 296
                if (flags & fdExistingFiles)
310 Franz 297
                        setMode(QFileDialog::ExistingFile);
298
                else
299
                {
300
                        setMode(QFileDialog::AnyFile);
5846 jghali 301
                        if (flags & fdCompressFile)
310 Franz 302
                                addWidgets(0, Layout, 0);
303
                }
5846 jghali 304
                if (flags & fdShowCodecs)
310 Franz 305
                {
306
                        LayoutC = new QFrame(this);
307
                        Layout1C = new QHBoxLayout(LayoutC);
308
                        Layout1C->setSpacing( 0 );
309
                        Layout1C->setMargin( 4 );
310
                        TxCodeT = new QLabel(this);
311
                        TxCodeT->setText( tr("Encoding:"));
3543 avox 312
                        TxCodeM = new ScComboBox(true, LayoutC, "Cod");
310 Franz 313
                        TxCodeM->setEditable(false);
4182 subik 314
                        QString tmp_txc[] = {"ISO 8859-1", "ISO 8859-2", "ISO 8859-3",
315
                                                                "ISO 8859-4", "ISO 8859-5", "ISO 8859-6",
316
                                                                "ISO 8859-7", "ISO 8859-8", "ISO 8859-9",
317
                                                                "ISO 8859-10", "ISO 8859-13", "ISO 8859-14",
7358 fschmid 318
                                                                "ISO 8859-15", "UTF-8", "UTF-16", "KOI8-R", "KOI8-U",
4182 subik 319
                                                                "CP1250", "CP1251", "CP1252", "CP1253",
320
                                                                "CP1254", "CP1255", "CP1256", "CP1257",
321
                                                                "Apple Roman"};
310 Franz 322
                        size_t array = sizeof(tmp_txc) / sizeof(*tmp_txc);
323
                        for (uint a = 0; a < array; ++a)
324
                                TxCodeM->insertItem(tmp_txc[a]);
325
                        QString localEn = QTextCodec::codecForLocale()->name();
7358 fschmid 326
                        if (localEn == "ISO-10646-UCS-2")
327
                                localEn = "UTF-16";
310 Franz 328
                        bool hasIt = false;
329
                        for (int cc = 0; cc < TxCodeM->count(); ++cc)
15 Franz 330
                        {
310 Franz 331
                                if (TxCodeM->text(cc) == localEn)
332
                                {
333
                                        TxCodeM->setCurrentItem(cc);
334
                                        hasIt = true;
335
                                        break;
336
                                }
15 Franz 337
                        }
310 Franz 338
                        if (!hasIt)
339
                        {
340
                                TxCodeM->insertItem(localEn);
341
                                TxCodeM->setCurrentItem(TxCodeM->count()-1);
342
                        }
343
                        TxCodeM->setMinimumSize(QSize(200, 0));
344
                        Layout1C->addWidget(TxCodeM);
345
                        QSpacerItem* spacer2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
346
                        Layout1C->addItem( spacer2 );
347
                        addWidgets(TxCodeT, LayoutC, 0);
161 Franz 348
                }
5846 jghali 349
                setPreviewMode((flags & fdShowPreview) ? QFileDialog::Contents : QFileDialog::NoPreview );
310 Franz 350
                setViewMode( QFileDialog::List );
5846 jghali 351
                if (flags & fdCompressFile)
4182 subik 352
                        connect(SaveZip, SIGNAL(clicked()), this, SLOT(handleCompress()));
161 Franz 353
        }
3 paul 354
        HomeB = new QToolButton(this);
9157 cbradney 355
        HomeB->setIconSet(loadIcon("16/go-home.png"));
4879 cbradney 356
        #ifdef _WIN32
4499 cbradney 357
        HomeB->setAutoRaise(true);
4879 cbradney 358
        #endif
112 Franz 359
        HomeB->setTextLabel( tr("Moves to your Document Directory.\nThis can be set in the Preferences."));
3 paul 360
        connect(HomeB, SIGNAL(clicked()), this, SLOT(slotHome()));
361
        addToolButton(HomeB);
4182 subik 362
        // default init
363
        extZip = "gz";
3 paul 364
}
365
 
366
CustomFDialog::~CustomFDialog()
367
{
368
        setIconProvider(0);
7649 cbradney 369
        const QDir* d(dir());
370
        cDir.setCurrent(d->path());
371
        delete d;
3 paul 372
}
373
 
374
void CustomFDialog::slotHome()
375
{
376
        setDir(QDir(DocDir));
377
}
378
 
4182 subik 379
void CustomFDialog::handleCompress()
3 paul 380
{
4182 subik 381
        QFileInfo tmp;
382
        tmp.setFile(selectedFile());
383
        QString e(tmp.extension());
6810 fschmid 384
        QStringList ex = QStringList::split(".", e);
385
        QString baseExt = "";
386
        for (uint a = 0; a < ex.count(); a++)
387
        {
388
                if ((ex[a] != "sla") && (ex[a] != "SLA") && (ex[a] != "gz") && (ex[a] != "GZ"))
389
                        baseExt += "."+ex[a];
390
        }
3 paul 391
        if (SaveZip->isChecked())
161 Franz 392
        {
4182 subik 393
                if (e != extZip)
6810 fschmid 394
                        tmp.setFile(tmp.baseName() + baseExt + "." + extZip);
161 Franz 395
        }
3 paul 396
        else
161 Franz 397
        {
4182 subik 398
                if (e != ext)
6810 fschmid 399
                        tmp.setFile(tmp.baseName() + baseExt + "." + ext);
161 Franz 400
        }
4182 subik 401
        setSelection(tmp.fileName());
3 paul 402
}
4182 subik 403
 
404
void CustomFDialog::setExtension(QString e)
405
{
406
        ext = e;
407
}
408
 
409
QString CustomFDialog::extension()
410
{
411
        return ext;
412
}
413
 
414
void CustomFDialog::setZipExtension(QString e)
415
{
416
        extZip = e;
417
}
418
 
419
QString CustomFDialog::zipExtension()
420
{
421
        return extZip;
422
}