Subversion Repositories Scribus

Rev

Rev 8483 | 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.
*/

/***************************************************************************
 *                                                                         *
 *   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 <qstring.h>
#include <qstringlist.h>
#include <qdom.h>
#include <qdir.h>
#include <qfile.h>
#include <qvariant.h>
#include <qpushbutton.h>
#include <qheader.h>
#include <qlistview.h>
#include <qlabel.h>
#include <qspinbox.h>
#include <qcheckbox.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>

#include "loremipsum.h"
#include "loremipsum.moc"

#include "langmgr.h"
#include "pageitem.h"
#include "scribus.h"
#include "scribusdoc.h"
#include "scribusview.h"
#include "scpaths.h"
#include "selection.h"
#include "prefsmanager.h"
#include "commonstrings.h"
#include "hyphenator.h"
#include "util.h"
// #include "gtparagraphstyle.h"
// #include "gtframestyle.h"
// #include "gtwriter.h"

QString getLoremLocation(QString fname)
{
        return QDir::convertSeparators(ScPaths::instance().shareDir() + "/loremipsum/" + fname);
}

LoremParser::LoremParser(QString fname)
{
        name = author = url = "n/a";
        correct = false;
        QDomDocument doc("loremdoc");
        QFile file(getLoremLocation(fname));
        if (!file.open(IO_ReadOnly))
                return;
        if (!doc.setContent(&file))
        {
                file.close();
                return;
        }
        file.close();

        QDomElement docElement = doc.documentElement();

        QDomNode node = docElement.firstChild();
        while(!node.isNull())
        {
                QDomElement element = node.toElement();
                if(!element.isNull())
                {
                        if (element.tagName() == "name")
                                name = element.text();
                        if (element.tagName() == "author")
                                author = element.text();
                        if (element.tagName() == "url")
                                url = element.text();
                        if (element.tagName() == "p")
                                loremIpsum.append(element.text().simplifyWhiteSpace());
                }
                node = node.nextSibling();
        }
        if (name != "n/a")
                correct = true;
}

QString LoremParser::createLorem(uint parCount)
{
        if (parCount < 1)
                return QString::null;
        // first paragraph is always the same
        QString lorem(loremIpsum[0]);
        if (!loremIpsum.isEmpty())
                for (uint i = 1; i < parCount + 1; ++i)
                        lorem += loremIpsum[rand()%loremIpsum.count()] + SpecialChars::PARSEP;
        return lorem.stripWhiteSpace();
}


LoremManager::LoremManager(ScribusDoc* doc, QWidget* parent, const char* name, bool modal, WFlags fl)
        : QDialog( parent, name, modal, fl )
{
        m_Doc=doc;
        if ( !name )
                setName( "LoremManager" );
        LoremManagerLayout = new QGridLayout( this, 1, 1, 11, 6, "LoremManagerLayout");

        layout3 = new QVBoxLayout( 0, 0, 6, "layout3");

        loremList = new QListView( this, "loremList" );
        loremList->addColumn( tr( "Select Lorem Ipsum" ) );
        loremList->setRootIsDecorated(true);
        layout3->addWidget( loremList );

        layout2 = new QHBoxLayout( 0, 0, 6, "layout2");

        paraLabel = new QLabel( this, "paraLabel" );
        layout2->addWidget( paraLabel );

        paraBox = new QSpinBox( this, "paraBox" );
        paraBox->setMinValue( 1 );
        paraBox->setValue(PrefsManager::instance()->appPrefs.paragraphsLI);
        layout2->addWidget( paraBox );
        paraSpacer = new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
        layout2->addItem( paraSpacer );
        layout3->addLayout( layout2 );

        layout1 = new QHBoxLayout( 0, 0, 6, "layout1");
        buttonSpacer = new QSpacerItem( 40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
        layout1->addItem( buttonSpacer );

        okButton = new QPushButton( this, "okButton" );
        layout1->addWidget( okButton );

        cancelButton = new QPushButton( this, "cancelButton" );
        layout1->addWidget( cancelButton );
        layout3->addLayout( layout1 );

        LoremManagerLayout->addLayout( layout3, 0, 0 );
        languageChange();
        resize( QSize(439, 364).expandedTo(minimumSizeHint()) );
        clearWState( WState_Polished );

        // reading lorems
        QDir d(getLoremLocation(QString::null), "*.xml");

        const QFileInfoList *list = d.entryInfoList();
        QFileInfoListIterator it(*list);
        QFileInfo *fi=0;
        langmgr=new LanguageManager();
        langmgr->init(false);
       
        while ( (fi = it.current()) != 0 )
        {
                if (langmgr->getLangFromAbbrev(fi->baseName(), false).isEmpty())
                {
                        ++it;
                        continue;
                }
                LoremParser *parser = new LoremParser(fi->fileName());
                if (!parser->correct)
                {
                        delete parser;
                        ++it;
                        continue;
                }
                availableLorems[parser->name] = fi->fileName();
                QListViewItem *item = new QListViewItem(loremList);
                if (parser->name=="la")
                        item->setText(0,standardloremtext);
                else
                        item->setText(0, langmgr->getLangFromAbbrev(parser->name, true));
                new QListViewItem(item, tr("Author:") + " " + parser->author);
                new QListViewItem(item, tr("Get More:") + " " + parser->url);
                new QListViewItem(item, tr("XML File:") + " " + fi->fileName());
                loremList->insertItem(item);
                ++it;
                delete parser;
        }

        // signals and slots connections
        connect( okButton, SIGNAL( clicked() ), this, SLOT( okButton_clicked() ) );
        connect( cancelButton, SIGNAL( clicked() ), this, SLOT( cancelButton_clicked() ) );
        connect( loremList, SIGNAL(doubleClicked(QListViewItem *, const QPoint &, int)), this, SLOT(okButton_clicked()));
}

LoremManager::~LoremManager()
{
        delete langmgr;
}

void LoremManager::languageChange()
{
        setCaption( tr( "Lorem Ipsum" ) );
        paraLabel->setText( tr( "Paragraphs:" ) );
        okButton->setText( CommonStrings::tr_OK );
        okButton->setAccel( QKeySequence( tr( "Alt+O" ) ) );
        cancelButton->setText( CommonStrings::tr_Cancel );
        cancelButton->setAccel( QKeySequence( tr( "Alt+C" ) ) );
        standardloremtext = tr("Standard Lorem Ipsum");
}

void LoremManager::okButton_clicked()
{
        // only top level items are taken
        QListViewItem *li;
        if (loremList->currentItem()->parent() == 0)
                li = loremList->currentItem();
        else
                li = loremList->currentItem()->parent();
        QString name;
        if (li->text(0)==standardloremtext)
                name="la";
        else
                name=langmgr->getAbbrevFromLang(li->text(0), true, false);
               
        insertLoremIpsum(availableLorems[name], paraBox->value());
        accept();
}

void LoremManager::cancelButton_clicked()
{
        reject();
}

void LoremManager::insertLoremIpsum(QString name, int paraCount)
{
        //CB: Avox please make insertText for text frame to nuke all this
        // is it really applied?
//      bool done = false;

        for (uint i = 0; i < m_Doc->m_Selection->count(); ++i)
        {
                PageItem* currItem=m_Doc->m_Selection->itemAt(i);
                if (currItem == NULL)
                        continue;
                if (!currItem->asTextFrame())
                        continue;
                if (currItem->itemText.length() != 0)
                {
                        m_Doc->itemSelection_ClearItem();
                        /* ClearItem() doesn't return true or false so
                        the following test has to be done */

                        if (currItem->itemText.length() != 0)
                                continue;
                }
                LoremParser *lp = new LoremParser(name);
                if (lp == NULL)
                {
                        qDebug("LoremManager::okButton_clicked() *lp == NULL");
                        return;
                }

#if 0          
//              Set up the gtWriter instance with the selected paragraph style
                gtWriter* writer = new gtWriter(false, currItem);
                if (writer != NULL)
                {
                                writer->setUpdateParagraphStyles(false);
                                writer->setOverridePStyleFont(false);
                                gtFrameStyle* fstyle = writer->getDefaultStyle();
                                gtParagraphStyle* pstyle = new gtParagraphStyle(*fstyle);
                                pstyle->setName(currItem->currentStyle().name());
                                writer->setParagraphStyle(pstyle);
                                done = true;
                                writer->append(lp->createLorem(paraCount));
                }
                delete writer;         
#endif
               
                // K.I.S.S.:
                currItem->itemText.insertChars(0, lp->createLorem(paraCount));
                delete lp;

                //if (ScMW->view->SelItem.at(i)->Doc->docHyphenator->AutoCheck)
                //      ScMW->view->SelItem.at(i)->Doc->docHyphenator->slotHyphenate(ScMW->view->SelItem.at(i));
                if (m_Doc->docHyphenator->AutoCheck)
                        m_Doc->docHyphenator->slotHyphenate(currItem);
        }
//      if (done)
//      {
//              m_Doc->view()->updateContents();
                m_Doc->view()->DrawNew();
                m_Doc->changed();
//      }
}