Subversion Repositories Scribus

Rev

Rev 4631 | Rev 5345 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
For general Scribus (>=1.3.2) copyright and licensing information please refer
to the COPYING file provided with the program. Following this notice may exist
a copyright and/or license notice that predates the release of Scribus 1.3.2
for which a new license (GPL+exception) is in place.
*/

/***************************************************************************
                          customfdialog.cpp  -  description
                             -------------------
    begin                : Fri Nov 30 2001
    copyright            : (C) 2001 by Franz Schmid
    email                : Franz.Schmid@altmuehlnet.de
 ***************************************************************************/


/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/


#include "customfdialog.h"
#include "customfdialog.moc"
#include <qpixmap.h>
#include <qpainter.h>
#include <qfileinfo.h>
#include <qdir.h>
#include <qdom.h>
#include <qtextcodec.h>
#include "sccombobox.h"
#include "scribusstructs.h"
#include "scimage.h"
#include "util.h"

extern QString DocDir;

ImIconProvider::ImIconProvider(QWidget *pa) : QFileIconProvider(pa)
{
        fmts.clear();
        QString tmp[] = {"eps", "gif", "png", "jpg", "jpeg", "xpm", "tif", "tiff", "bmp", "pbm", "pgm", "ppm", "xbm", "xpm", "psd"};
        size_t array = sizeof(tmp) / sizeof(*tmp);
        for (uint a = 0; a < array; ++a)
                fmts += tmp[a];
        imagepm = loadIcon("image.png");
        pspm = loadIcon("postscript.png");
        txtpm = loadIcon("txt.png");
        docpm = loadIcon("doc.png");
        pdfpm = loadIcon("pdf.png");
        oosxdpm = loadIcon("ooo_draw.png");
        oosxwpm = loadIcon("ooo_writer.png");
        vectorpm = loadIcon("vectorgfx.png");
}

const QPixmap * ImIconProvider::pixmap(const QFileInfo &fi)
{
        QString ext = fi.extension(false).lower();
        if (fmts.contains(ext))
                return &imagepm;
        else
        {
                ext = fi.extension(true).lower();
                if (ext.endsWith("ps"))
                        return &pspm;
                if (ext.endsWith("txt"))
                        return &txtpm;
                if (ext.endsWith("scd") || ext.endsWith("scd.gz"))
                        return &docpm;
                if (ext.endsWith("sla") || ext.endsWith("sla.gz"))
                        return &docpm;
                if (ext.endsWith("pdf"))
                        return &pdfpm;
                if (ext.endsWith("sxd"))
                        return &oosxdpm;
                if (ext.endsWith("sxw"))
                        return &oosxwpm;
                if (ext.endsWith("svg") || ext.endsWith("svgz"))
                        return &vectorpm;
                return QFileIconProvider::pixmap(fi);
        }
}

FDialogPreview::FDialogPreview(QWidget *pa) : QLabel(pa)
{
        setAlignment(AlignLeft | AlignTop);
        setMinimumSize( QSize( 100, 100 ) );
        setMaximumSize( QSize( 300, 300 ) );
        setScaledContents( false );
        setEraseColor( white );
        setFrameShape( QLabel::WinPanel );
        setFrameShadow( QLabel::Sunken );
        updtPix();
}

void FDialogPreview::updtPix()
{
        QPixmap pm;
        QRect inside = contentsRect();
        pm = QPixmap(inside.width(), inside.height());
        pm.fill(white);
        setPixmap(pm);
}

void FDialogPreview::GenPreview(QString name)
{
        QPixmap pm;
        QString Buffer = "";
        QFileInfo fi = QFileInfo(name);
        if (fi.isDir())
                return;
        updtPix();
        int w = pixmap()->width();
        int h = pixmap()->height();
        bool mode = false;
        QString ext = fi.extension(false).lower();
        QStringList formats;
        formats = QStringList::fromStrList(QImageIO::inputFormats());
        formats.append("jpg");
#ifdef HAVE_TIFF
        formats.append("tif");
        formats.append("tiff");
#endif
        formats.append("psd");
        formats.append("eps");
        formats.append("pdf");
        formats.append("ps");
        QString allFormats = formats.join( " " );
        formats.clear();
        allFormats = allFormats.lower();
        formats = QStringList::split( " ", allFormats );
        if (formats.contains(ext))
        {
                ScImage im;
                if (im.LoadPicture(name, "", 0, false, false, 4, 72, &mode))
                {
                        int ix,iy;
                        if ((im.imgInfo.exifDataValid) && (!im.imgInfo.exifInfo.thumbnail.isNull()))
                        {
                                ix = im.imgInfo.exifInfo.width;
                                iy = im.imgInfo.exifInfo.height;
                        }
                        else
                        {
                                ix = im.width();
                                iy = im.height();
                        }
                        int xres = im.imgInfo.xres;
                        int yres = im.imgInfo.yres;
                        QString tmp = "";
                        QString tmp2 = "";
                        QImage im2;
                        if ((ix > w-5) || (iy > h-44))
                        {
                                double sx = im.width() / static_cast<double>(w-5);
                                double sy = im.height() / static_cast<double>(h-44);
                                im2 = sy < sx ?  im.smoothScale(qRound(im.width() / sx), qRound(im.height() / sx)) :
                                                 im.smoothScale(qRound(im.width() / sy), qRound(im.height() / sy));
                        }
                        else
                                im2 = im.copy();
                        QPainter p;
                        pixmap()->fill(white);
                        p.begin(pixmap());
                        p.drawImage(0, 0, im2);
                        p.drawText(2, h-29, tr("Size:")+" "+tmp.setNum(ix)+" x "+tmp2.setNum(iy));
                        p.drawText(2, h-17, tr("Resolution:")+" "+tmp.setNum(xres)+" x "+tmp2.setNum(yres)+" "+ tr("DPI"));
                        QString cSpace;
                        if ((ext == "pdf") || (ext == "eps") || (ext == "ps"))
                                cSpace = tr("Unknown");
                        else
                        {
                                switch (im.imgInfo.colorspace)
                                {
                                        case 0:
                                                cSpace = tr("RGB");
                                                break;
                                        case 1:
                                                cSpace = tr("CMYK");
                                                break;
                                        case 2:
                                                cSpace = tr("Grayscale");
                                                break;
                                }
                        }
                        p.drawText(2, h-5, tr("Colorspace:")+" "+cSpace);
                        p.end();
                        repaint();
                }
        }
        else
        {
                if (loadText(name, &Buffer))
                {
                        if (Buffer.startsWith("<SCRIBUS"))
                        {
                                QDomDocument docu("scridoc");
                                if(!docu.setContent(Buffer))
                                        return;
                                QDomElement elem=docu.documentElement();
                                if ((elem.tagName() != "SCRIBUS") && (elem.tagName() != "SCRIBUSUTF8") && (elem.tagName() != "SCRIBUSUTF8NEW"))
                                        return;
                                QDomNode DOC=elem.firstChild();
                                QDomElement dc=DOC.toElement();
                                QString Tit = tr("Title:")+" ";
                                QString ti2 = dc.attribute("TITLE");
                                if (ti2.isEmpty())
                                        ti2= tr("No Title");
                                Tit += ti2+"\n";
                                QString Aut = tr("Author:")+" ";
                                QString au2 = dc.attribute("AUTHOR");
                                if (au2.isEmpty())
                                        au2 = tr("Unknown");
                                Aut += au2;
                                setText( tr("Scribus Document")+"\n\n"+Tit+Aut);
                        }
                        else  if ((ext == "txt") || (ext == "html") || (ext == "xml"))
                                setText(Buffer.left(200));
                }
        }
}

void FDialogPreview::previewUrl( const QUrl &url )
{
        if (url.isLocalFile())
                GenPreview(url.path());
}

CustomFDialog::CustomFDialog(QWidget *parent, QString wDir, QString caption,
                                                         QString filter, bool preview,
                                                         bool existing, bool compress,
                                                         bool codec, bool dirOnly)
                        : QFileDialog(QString::null, filter, parent, 0, true)
{
        setIcon(loadIcon("AppIcon.png"));
        setCaption(caption);
        cDir = QDir(wDir);
        setDir(cDir);
        setIconProvider(new ImIconProvider(this));
        FDialogPreview *pw;
        if (dirOnly)
        {
                Layout = new QFrame(this);
                Layout1 = new QHBoxLayout(Layout);
                Layout1->setSpacing( 0 );
                Layout1->setMargin( 0 );
                SaveZip = new QCheckBox( tr( "&Compress File" ), Layout, "test");
                Layout1->addWidget(SaveZip, Qt::AlignLeft);
                QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
                Layout1->addItem( spacer );
                addWidgets(0, Layout, 0);
                LayoutC = new QFrame(this);
                Layout1C = new QHBoxLayout(LayoutC);
                Layout1C->setSpacing( 0 );
                Layout1C->setMargin( 0 );
                WFonts = new QCheckBox( tr( "&Include Fonts" ), LayoutC, "test");
                Layout1C->addWidget(WFonts, Qt::AlignLeft);
                QSpacerItem* spacer2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
                Layout1C->addItem( spacer2 );
                addWidgets(0, LayoutC, 0);
                setMode(QFileDialog::DirectoryOnly);
        }
        else
        {
                setContentsPreviewEnabled( true );
                pw = new FDialogPreview( this );
                setContentsPreview( pw, pw );
                if (compress)
                {
                        Layout = new QFrame(this);
                        Layout1 = new QHBoxLayout(Layout);
                        Layout1->setSpacing( 6 );
                        Layout1->setMargin( 0 );
                        SaveZip = new QCheckBox( tr( "&Compress File" ), Layout, "test");
                        Layout1->addWidget(SaveZip);
                        QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
                        Layout1->addItem( spacer );
                }
                if (existing)
                        setMode(QFileDialog::ExistingFile);
                else
                {
                        setMode(QFileDialog::AnyFile);
                        if (compress)
                                addWidgets(0, Layout, 0);
                }
                if (codec)
                {
                        LayoutC = new QFrame(this);
                        Layout1C = new QHBoxLayout(LayoutC);
                        Layout1C->setSpacing( 0 );
                        Layout1C->setMargin( 4 );
                        TxCodeT = new QLabel(this);
                        TxCodeT->setText( tr("Encoding:"));
                        TxCodeM = new ScComboBox(true, LayoutC, "Cod");
                        TxCodeM->setEditable(false);
                        QString tmp_txc[] = {"ISO 8859-1", "ISO 8859-2", "ISO 8859-3",
                                                                "ISO 8859-4", "ISO 8859-5", "ISO 8859-6",
                                                                "ISO 8859-7", "ISO 8859-8", "ISO 8859-9",
                                                                "ISO 8859-10", "ISO 8859-13", "ISO 8859-14",
                                                                "ISO 8859-15", "utf8", "KOI8-R", "KOI8-U",
                                                                "CP1250", "CP1251", "CP1252", "CP1253",
                                                                "CP1254", "CP1255", "CP1256", "CP1257",
                                                                "Apple Roman"};
                        size_t array = sizeof(tmp_txc) / sizeof(*tmp_txc);
                        for (uint a = 0; a < array; ++a)
                                TxCodeM->insertItem(tmp_txc[a]);
                        QString localEn = QTextCodec::codecForLocale()->name();
                        bool hasIt = false;
                        for (int cc = 0; cc < TxCodeM->count(); ++cc)
                        {
                                if (TxCodeM->text(cc) == localEn)
                                {
                                        TxCodeM->setCurrentItem(cc);
                                        hasIt = true;
                                        break;
                                }
                        }
                        if (!hasIt)
                        {
                                TxCodeM->insertItem(localEn);
                                TxCodeM->setCurrentItem(TxCodeM->count()-1);
                        }
                        TxCodeM->setMinimumSize(QSize(200, 0));
                        Layout1C->addWidget(TxCodeM);
                        QSpacerItem* spacer2 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
                        Layout1C->addItem( spacer2 );
                        addWidgets(TxCodeT, LayoutC, 0);
                }
                setPreviewMode(preview ? QFileDialog::Contents : QFileDialog::NoPreview );
                setViewMode( QFileDialog::List );
                if (compress)
                        connect(SaveZip, SIGNAL(clicked()), this, SLOT(handleCompress()));
        }
        HomeB = new QToolButton(this);
        HomeB->setIconSet(loadIcon("gohome.png"));
        #ifdef _WIN32
        HomeB->setAutoRaise(true);
        #endif
        HomeB->setTextLabel( tr("Moves to your Document Directory.\nThis can be set in the Preferences."));
        connect(HomeB, SIGNAL(clicked()), this, SLOT(slotHome()));
        addToolButton(HomeB);
        // default init
        extZip = "gz";
}

CustomFDialog::~CustomFDialog()
{
        setIconProvider(0);
        cDir.setCurrent(dir()->path());
}

void CustomFDialog::slotHome()
{
        setDir(QDir(DocDir));
}

void CustomFDialog::handleCompress()
{
        QFileInfo tmp;
        tmp.setFile(selectedFile());
        QString e(tmp.extension());

        if (SaveZip->isChecked())
        {
                if (e != extZip)
                        tmp.setFile(tmp.baseName() + "." + extZip);
        }
        else
        {
                if (e != ext)
                        tmp.setFile(tmp.baseName() + "." + ext);
        }
        setSelection(tmp.fileName());
}

void CustomFDialog::setExtension(QString e)
{
        ext = e;
}

QString CustomFDialog::extension()
{
        return ext;
}

void CustomFDialog::setZipExtension(QString e)
{
        extZip = e;
}

QString CustomFDialog::zipExtension()
{
        return extZip;
}