Subversion Repositories Scribus

Rev

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