Subversion Repositories Scribus

Rev

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