Subversion Repositories Scribus

Rev

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

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