diff options
| author | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
|---|---|---|
| committer | craig <craig@11d20701-8431-0410-a711-e3c959e3b870> | 2012-01-01 11:40:09 +0000 |
| commit | 7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch) | |
| tree | 4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/loremipsum.cpp | |
| download | scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip | |
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/loremipsum.cpp')
| -rw-r--r-- | scribus/loremipsum.cpp | 365 |
1 files changed, 365 insertions, 0 deletions
diff --git a/scribus/loremipsum.cpp b/scribus/loremipsum.cpp new file mode 100644 index 0000000..124755b --- /dev/null +++ b/scribus/loremipsum.cpp @@ -0,0 +1,365 @@ +/* +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 "loremipsum.h" + +#include <QDir> +#include <QDomDocument> +#include <QEvent> +#include <QFile> +#include <QGridLayout> +#include <QHBoxLayout> +#include <QHeaderView> +#include <QLabel> +#include <QPushButton> +#include <QSpacerItem> +#include <QSpinBox> +#include <QCheckBox> +#include <QString> +#include <QStringList> +#include <QTreeWidget> +#include <QTreeWidgetItem> +#include <QVBoxLayout> + + +#include "langmgr.h" +#include "pageitem.h" +#include "pageitem_textframe.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_icon.h" + +QString getLoremLocation(QString fname) +{ + return QDir::toNativeSeparators(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(QIODevice::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") + { + QString txt = element.text().simplified(); + txt.replace(SpecialChars::OLD_NBSPACE, SpecialChars::NBSPACE); + txt.replace(SpecialChars::OLD_NBHYPHEN, SpecialChars::NBHYPHEN); + loremIpsum.append(txt); + } + } + node = node.nextSibling(); + } + if (name != "n/a") + correct = true; +} + +QString LoremParser::createLorem(uint parCount, bool random) +{ + if (parCount < 1) + return QString::null; + // first paragraph is always the same + QString lorem = ""; + if (!loremIpsum.isEmpty()) + lorem = loremIpsum[0]; + if (parCount > 1) + { + if (!loremIpsum.isEmpty()) + { + if (random) + { + for (uint i = 1; i < parCount; ++i) + lorem += SpecialChars::PARSEP + loremIpsum[rand()%loremIpsum.count()]; + } + else + { + int maxParagraph = loremIpsum.count()-1; + int currentParagraph = 1; + if (maxParagraph != 0) + { + for (uint i = 1; i < parCount; ++i) + { + lorem += SpecialChars::PARSEP + loremIpsum[currentParagraph]; + currentParagraph++; + if (currentParagraph > maxParagraph) + currentParagraph = 0; + } + } + } + } + } + return lorem.trimmed(); +} + + +LoremManager::LoremManager(ScribusDoc* doc, QWidget* parent) : QDialog( parent ) +{ + m_Doc=doc; + setModal(true); + setWindowTitle( tr( "Lorem Ipsum" ) ); + setWindowIcon(QIcon(loadIcon ( "AppIcon.png" ))); + LoremManagerLayout = new QGridLayout(this) ; + LoremManagerLayout->setMargin(10); + LoremManagerLayout->setSpacing(5); + + layout3 = new QVBoxLayout; + layout3->setMargin(0); + layout3->setSpacing(5); + + loremList = new QTreeWidget( this ); + loremList->setRootIsDecorated(true); + loremList->setColumnCount(1); + loremList->setHeaderLabel( tr("Select Lorem Ipsum")); + loremList->header()->setClickable( false ); + loremList->header()->setResizeMode( QHeaderView::ResizeToContents ); + loremList->setSelectionMode(QAbstractItemView::SingleSelection); + layout3->addWidget( loremList ); + + layout2 = new QHBoxLayout; + layout2->setMargin(0); + layout2->setSpacing(5); + + paraLabel = new QLabel( this ); + layout2->addWidget( paraLabel ); + + paraBox = new QSpinBox( this ); + paraBox->setMinimum( 1 ); + paraBox->setValue(PrefsManager::instance()->appPrefs.paragraphsLI); + layout2->addWidget( paraBox ); + randomCheckBox = new QCheckBox(this); + randomCheckBox->setChecked(true); + layout2->addWidget( randomCheckBox ); + paraSpacer = new QSpacerItem( 2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum ); + layout2->addItem( paraSpacer ); + layout3->addLayout( layout2 ); + + layout1 = new QHBoxLayout; + layout1->setMargin(0); + layout1->setSpacing(5); + buttonSpacer = new QSpacerItem( 2, 2, QSizePolicy::Expanding, QSizePolicy::Minimum ); + layout1->addItem( buttonSpacer ); + + okButton = new QPushButton( this ); + layout1->addWidget( okButton ); + + cancelButton = new QPushButton( this ); + layout1->addWidget( cancelButton ); + layout3->addLayout( layout1 ); + + LoremManagerLayout->addLayout( layout3, 0, 0 ); + languageChange(); + + // reading lorems + QDir d(getLoremLocation(QString::null), "*.xml"); + + QFileInfoList list = d.entryInfoList(); + QListIterator<QFileInfo> it(list); + QFileInfo fi; + LanguageManager * langmgr( LanguageManager::instance() ); +// langmgr->init(false); + + while (it.hasNext()) + { + fi = it.next(); + if (langmgr->getLangFromAbbrev(fi.baseName(), false).isEmpty()) + continue; + LoremParser *parser = new LoremParser(fi.fileName()); + if (!parser->correct) + { + delete parser; + continue; + } + availableLorems[parser->name] = fi.fileName(); + QTreeWidgetItem *item = new QTreeWidgetItem(loremList); + if (parser->name=="la") + item->setText(0, standardloremtext); + else + item->setText(0, langmgr->getLangFromAbbrev(parser->name, true)); + QTreeWidgetItem *subItem; + subItem = new QTreeWidgetItem(item); + subItem->setText(0, tr("Author:") + " " + parser->author); + subItem = new QTreeWidgetItem(item); + subItem->setText(0, tr("Get More:") + " " + parser->url); + subItem = new QTreeWidgetItem(item); + subItem->setText(0, tr("XML File:") + " " + fi.fileName()); + delete parser; + } + loremList->sortItems(0, Qt::AscendingOrder); + loremList->setSortingEnabled(false); + resize( QSize(320, 340).expandedTo(minimumSizeHint()) ); + QList<QTreeWidgetItem *> defItem; + defItem.clear(); + defItem = loremList->findItems(langmgr->getTransLangFromLang(m_Doc->Language), Qt::MatchExactly); + if (defItem.count() == 0) + defItem = loremList->findItems(standardloremtext, Qt::MatchExactly); + if (defItem.count() != 0) + { + loremList->setCurrentItem(defItem[0]); + defItem[0]->setSelected(true); + } + // signals and slots connections + connect( okButton, SIGNAL( clicked() ), this, SLOT( okButton_clicked() ) ); + connect( cancelButton, SIGNAL( clicked() ), this, SLOT( cancelButton_clicked() ) ); + connect( loremList, SIGNAL(itemDoubleClicked(QTreeWidgetItem *, int)), this, SLOT(okButton_clicked())); + +} + +LoremManager::~LoremManager() +{ +// delete langmgr; +} + +void LoremManager::changeEvent(QEvent *e) +{ + if (e->type() == QEvent::LanguageChange) + { + languageChange(); + } + else + QWidget::changeEvent(e); +} + +void LoremManager::languageChange() +{ + setWindowTitle( tr( "Lorem Ipsum" ) ); + paraLabel->setText( tr( "Paragraphs:" ) ); + randomCheckBox->setText( tr("Random Paragraphs")); + okButton->setText( CommonStrings::tr_OK ); + okButton->setShortcut( QKeySequence( tr( "Alt+O" ) ) ); + cancelButton->setText( CommonStrings::tr_Cancel ); + cancelButton->setShortcut( QKeySequence( tr( "Alt+C" ) ) ); + standardloremtext = tr("Standard Lorem Ipsum"); + paraBox->setToolTip( tr( "Number of paragraphs of selected sample text to insert" ) ); + loremList->setToolTip( tr( "List of languages available to insert sample text in" ) ); +} + +void LoremManager::okButton_clicked() +{ + // only top level items are taken + QTreeWidgetItem *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=LanguageManager::instance()->getAbbrevFromLang(li->text(0), true, false); + + insertLoremIpsum(availableLorems[name], paraBox->value(), randomCheckBox->isChecked()); + accept(); +} + +void LoremManager::cancelButton_clicked() +{ + reject(); +} + +void LoremManager::insertLoremIpsum(QString name, int paraCount, bool random) +{ + //CB: Avox please make insertText for text frame to nuke all this + // is it really applied? +// bool done = false; + + for (int 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) + { + currItem->itemTextSaxed = currItem->getItemTextSaxed(PageItem::FRAME); + 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.: + QString Lorip = lp->createLorem(paraCount, random); + currItem->itemText.insertChars(0, Lorip); + if (currItem->itemTextSaxed.isEmpty()) + currItem->asTextFrame()->updateUndo(PageItem::INS,Lorip); + else + currItem->asTextFrame()->updateUndo(PageItem::REPSAX, currItem->getTextSaxed(Lorip)); + 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); + currItem->invalidateLayout(); + } +// if (done) +// { + m_Doc->regionsChanged()->update(QRectF()); + m_Doc->changed(); +// } +} |
