Subversion Repositories Scribus

Rev

Rev 1807 | Rev 1915 | 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 <qimage.h>
21
#include <qpixmap.h>
22
#include <qpainter.h>
23
#include <qfileinfo.h>
24
#include <qdir.h>
25
#include <qdom.h>
15 Franz 26
#include <qtextcodec.h>
1555 fschmid 27
#include "scribusstructs.h"
28
extern QImage LoadPicture(QString fn, QString Prof, int rend, bool useEmbedded, bool useProf, int requestType, int gsRes, bool *realCMYK = 0, ImageInfoRecord *info = 0);
3 paul 29
extern bool loadText(QString nam, QString *Buffer);
30
extern QPixmap loadIcon(QString nam);
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 = "";
1798 fschmid 103
        ImageInfoRecord imgInfo;
1807 fschmid 104
        imgInfo.valid = false;
105
        imgInfo.clipPath = "";
106
        imgInfo.PDSpathData.clear();
107
        imgInfo.layerInfo.clear();
108
        imgInfo.isRequest = false;
109
        imgInfo.colorspace = 0;
3 paul 110
        QFileInfo fi = QFileInfo(name);
111
        if (fi.isDir())
112
                return;
311 Franz 113
        updtPix();
114
        int w = pixmap()->width();
115
        int h = pixmap()->height();
1505 fschmid 116
        bool mode = false;
1798 fschmid 117
        QImage im = LoadPicture(name, "", 0, false, false, 1, 72, &mode, &imgInfo);
867 fschmid 118
        if (!im.isNull())
161 Franz 119
        {
867 fschmid 120
                int ix = im.width();
121
                int iy = im.height();
1505 fschmid 122
                int xres = qRound(im.dotsPerMeterX() * 0.0254);
123
                int yres = qRound(im.dotsPerMeterY() * 0.0254);
867 fschmid 124
                QString tmp = "";
125
                QString tmp2 = "";
1505 fschmid 126
                if ((im.width() > w-5) || (im.height() > h-44))
161 Franz 127
                {
867 fschmid 128
                        QImage im2;
129
                        double sx = im.width() / static_cast<double>(w-5);
1505 fschmid 130
                        double sy = im.height() / static_cast<double>(h-44);
867 fschmid 131
                        im2 = sy < sx ?  im.smoothScale(qRound(im.width() / sx), qRound(im.height() / sx)) :
132
                                                                im.smoothScale(qRound(im.width() / sy), qRound(im.height() / sy));
133
                        im = im2;
134
                        im2.detach();
3 paul 135
                }
867 fschmid 136
                QPainter p;
137
                pixmap()->fill(white);
138
                p.begin(pixmap());
139
                p.drawImage(0, 0, im);
1505 fschmid 140
                p.drawText(2, h-29, tr("Size:")+" "+tmp.setNum(ix)+" x "+tmp2.setNum(iy));
141
                p.drawText(2, h-17, tr("Resolution:")+" "+tmp.setNum(xres)+" x "+tmp2.setNum(yres)+" "+ tr("DPI"));
142
                QString cSpace;
143
                QString ext = fi.extension(false).lower();
144
                if ((ext == "pdf") || (ext == "eps") || (ext == "ps"))
145
                        cSpace = tr("Unknown");
1798 fschmid 146
                else
147
                {
148
                        switch (imgInfo.colorspace)
149
                        {
150
                                case 0:
151
                                        cSpace = tr("RGB");
152
                                        break;
153
                                case 1:
154
                                        cSpace = tr("CMYK");
155
                                        break;
156
                                case 2:
157
                                        cSpace = tr("Grayscale");
158
                                        break;
159
                        }
160
                }
1505 fschmid 161
                p.drawText(2, h-5, tr("Colorspace:")+" "+cSpace);
867 fschmid 162
                p.end();
163
                repaint();
161 Franz 164
        }
3 paul 165
        else
161 Franz 166
        {
167
                if (loadText(name, &Buffer))
3 paul 168
                {
161 Franz 169
                        if (Buffer.startsWith("<SCRIBUS"))
3 paul 170
                        {
171
                                QDomDocument docu("scridoc");
172
                                if(!docu.setContent(Buffer))
173
                                        return;
174
                                QDomElement elem=docu.documentElement();
175
                                if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8"))
176
                                        return;
177
                                QDomNode DOC=elem.firstChild();
178
                                QDomElement dc=DOC.toElement();
179
                                QString Tit = tr("Title:")+" ";
180
                                QString ti2 = dc.attribute("TITLE");
181
                                if (ti2 == "")
182
                                        ti2= tr("No Title");
183
                                Tit += ti2+"\n";
184
                                QString Aut = tr("Author:")+" ";
185
                                QString au2 = dc.attribute("AUTHOR");
186
                                if (au2 == "")
187
                                        au2 = tr("Unknown");
188
                                Aut += au2;
340 Franz 189
                                setText( tr("Scribus Document")+"\n\n"+Tit+Aut);
161 Franz 190
                        }
3 paul 191
                        else
192
                                setText(Buffer.left(200));
193
                }
161 Franz 194
        }
3 paul 195
}      
196
 
197
void FDialogPreview::previewUrl( const QUrl &url )
198
{
199
        if (url.isLocalFile())
200
                GenPreview(url.path());
201
}
202
 
415 Franz 203
CustomFDialog::CustomFDialog(QWidget *pa, QString wDir, QString cap, QString filter,
204
                             bool Pre, bool mod, bool comp, bool cod, bool dirOnly)
205
                             : QFileDialog(QString::null, filter, pa, 0, true)
3 paul 206
{
83 Franz 207
        setIcon(loadIcon("AppIcon.png"));
3 paul 208
        setCaption(cap);
415 Franz 209
        cDir = QDir(wDir);
3 paul 210
        setDir(cDir);
211
        setIconProvider(new ImIconProvider(this));
311 Franz 212
        FDialogPreview *pw;
310 Franz 213
        if (dirOnly)
161 Franz 214
        {
3 paul 215
                Layout = new QFrame(this);
216
                Layout1 = new QHBoxLayout(Layout);
310 Franz 217
                Layout1->setSpacing( 0 );
3 paul 218
                Layout1->setMargin( 0 );
340 Franz 219
                SaveZip = new QCheckBox(tr( "&Compress File" ), Layout, "test");
310 Franz 220
                Layout1->addWidget(SaveZip, Qt::AlignLeft);
3 paul 221
                QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
310 Franz 222
                Layout1->addItem( spacer );
223
                addWidgets(0, Layout, 0);
224
                LayoutC = new QFrame(this);
225
                Layout1C = new QHBoxLayout(LayoutC);
226
                Layout1C->setSpacing( 0 );
227
                Layout1C->setMargin( 0 );
340 Franz 228
                WFonts = new QCheckBox(tr( "&Include Fonts" ), LayoutC, "test");
310 Franz 229
                Layout1C->addWidget(WFonts, Qt::AlignLeft);
230
                QSpacerItem* spacer2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
231
                Layout1C->addItem( spacer2 );
232
                addWidgets(0, LayoutC, 0);
233
                setMode(QFileDialog::DirectoryOnly);
161 Franz 234
        }
3 paul 235
        else
161 Franz 236
        {
310 Franz 237
                setContentsPreviewEnabled( true );
311 Franz 238
                pw = new FDialogPreview( this );
310 Franz 239
                setContentsPreview( pw, pw );
3 paul 240
                if (comp)
161 Franz 241
                {
310 Franz 242
                        Layout = new QFrame(this);
243
                        Layout1 = new QHBoxLayout(Layout);
244
                        Layout1->setSpacing( 6 );
245
                        Layout1->setMargin( 0 );
340 Franz 246
                        SaveZip = new QCheckBox(tr( "&Compress File" ), Layout, "test");
310 Franz 247
                        Layout1->addWidget(SaveZip);
248
                        QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
249
                        Layout1->addItem( spacer );
250
                }
251
                if (mod)
252
                        setMode(QFileDialog::ExistingFile);
253
                else
254
                {
255
                        setMode(QFileDialog::AnyFile);
256
                        if (comp)
257
                                addWidgets(0, Layout, 0);
258
                }
259
                if (cod)
260
                {
261
                        LayoutC = new QFrame(this);
262
                        Layout1C = new QHBoxLayout(LayoutC);
263
                        Layout1C->setSpacing( 0 );
264
                        Layout1C->setMargin( 4 );
265
                        TxCodeT = new QLabel(this);
266
                        TxCodeT->setText( tr("Encoding:"));
267
                        TxCodeM = new QComboBox(true, LayoutC, "Cod");
268
                        TxCodeM->setEditable(false);
617 cbradney 269
                        QString tmp_txc[] = {"ISO 8859-1", "ISO 8859-2", "ISO 8859-3", "ISO 8859-4", "ISO 8859-5", "ISO 8859-6",
310 Franz 270
                                                                "ISO 8859-7", "ISO 8859-8", "ISO 8859-9", "ISO 8859-10", "ISO 8859-13", "ISO 8859-14",
271
                                                                "ISO 8859-15", "utf8", "KOI8-R", "KOI8-U", "CP1250", "CP1251", "CP1252", "CP1253",
1165 cbradney 272
                                                                "CP1254", "CP1255", "CP1256", "CP1257", "Apple Roman"};
310 Franz 273
                        size_t array = sizeof(tmp_txc) / sizeof(*tmp_txc);
274
                        for (uint a = 0; a < array; ++a)
275
                                TxCodeM->insertItem(tmp_txc[a]);
276
                        QString localEn = QTextCodec::codecForLocale()->name();
277
                        bool hasIt = false;
278
                        for (int cc = 0; cc < TxCodeM->count(); ++cc)
15 Franz 279
                        {
310 Franz 280
                                if (TxCodeM->text(cc) == localEn)
281
                                {
282
                                        TxCodeM->setCurrentItem(cc);
283
                                        hasIt = true;
284
                                        break;
285
                                }
15 Franz 286
                        }
310 Franz 287
                        if (!hasIt)
288
                        {
289
                                TxCodeM->insertItem(localEn);
290
                                TxCodeM->setCurrentItem(TxCodeM->count()-1);
291
                        }
292
                        TxCodeM->setMinimumSize(QSize(200, 0));
293
                        Layout1C->addWidget(TxCodeM);
294
                        QSpacerItem* spacer2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
295
                        Layout1C->addItem( spacer2 );
296
                        addWidgets(TxCodeT, LayoutC, 0);
161 Franz 297
                }
310 Franz 298
                setPreviewMode(Pre ? QFileDialog::Contents : QFileDialog::NoPreview );
299
                setViewMode( QFileDialog::List );
300
                if (comp)
301
                        connect(SaveZip, SIGNAL(clicked()), this, SLOT(HandleComp()));
161 Franz 302
        }
3 paul 303
        HomeB = new QToolButton(this);
304
        HomeB->setIconSet(loadIcon("gohome.png"));
112 Franz 305
        HomeB->setTextLabel( tr("Moves to your Document Directory.\nThis can be set in the Preferences."));
3 paul 306
        connect(HomeB, SIGNAL(clicked()), this, SLOT(slotHome()));
307
        addToolButton(HomeB);
308
}
309
 
310
CustomFDialog::~CustomFDialog()
311
{
312
        setIconProvider(0);
313
        cDir.setCurrent(dir()->path());
314
}
315
 
316
void CustomFDialog::slotHome()
317
{
318
        setDir(QDir(DocDir));
319
}
320
 
321
void CustomFDialog::HandleComp()
322
{
323
        QString tmp;
324
        tmp = selectedFile();
325
        if (SaveZip->isChecked())
161 Franz 326
        {
3 paul 327
                if (tmp.right(3) != ".gz")
286 Franz 328
                {
329
//                      tmp = tmp + tmp.right(3) == "svg" ? "z" : ".gz";
330
                        if (tmp.right(3) == "svg")
68 Franz 331
                                tmp = tmp+"z";
332
                        else
333
                                tmp = tmp+".gz";
286 Franz 334
                }
3 paul 335
                setSelection(tmp);
161 Franz 336
        }
3 paul 337
        else
161 Franz 338
        {
3 paul 339
                int en = tmp.findRev(".gz");
340
                if (en > 0)
341
                        tmp.remove(en,3);
68 Franz 342
                else
161 Franz 343
                {
68 Franz 344
                        en = tmp.findRev("z");
345
                        if (en > 0)
346
                                tmp.remove(en,1);
3 paul 347
                }
161 Franz 348
        }
3 paul 349
        setSelection(tmp);
350
}