summaryrefslogtreecommitdiffstats
path: root/scribus/tocgenerator.cpp
diff options
context:
space:
mode:
authorcraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
committercraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
commit7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch)
tree4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/tocgenerator.cpp
downloadscribus-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/tocgenerator.cpp')
-rw-r--r--scribus/tocgenerator.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/scribus/tocgenerator.cpp b/scribus/tocgenerator.cpp
new file mode 100644
index 0000000..9241bc8
--- /dev/null
+++ b/scribus/tocgenerator.cpp
@@ -0,0 +1,158 @@
+/*
+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.
+*/
+/***************************************************************************
+ begin : Jun 2005
+ copyright : (C) 2005 by Craig Bradney
+ email : cbradney@zip.com.au
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * 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 "tocgenerator.h"
+
+#include <QMap>
+#include <QString>
+
+#include "gtframestyle.h"
+#include "gtparagraphstyle.h"
+#include "gtwriter.h"
+#include "page.h"
+#include "pageitem.h"
+#include "pagestructs.h"
+#include "scribusdoc.h"
+
+TOCGenerator::TOCGenerator(QObject *parent, ScribusDoc *doc) : QObject(parent)
+{
+ currDoc=doc;
+}
+
+
+TOCGenerator::~TOCGenerator()
+{
+}
+
+void TOCGenerator::setDoc(ScribusDoc *doc)
+{
+ currDoc=doc;
+}
+
+PageItem* TOCGenerator::findTargetFrame(const QString &targetFrameName)
+{
+ PageItem* targetFrame=NULL;
+ if (currDoc!=NULL)
+ {
+ for (int d = 0; d < currDoc->DocItems.count(); ++d)
+ {
+ if (currDoc->DocItems.at(d) !=NULL )
+ {
+ if (currDoc->DocItems.at(d)->itemType()==PageItem::TextFrame && currDoc->DocItems.at(d)->itemName()==targetFrameName)
+ {
+ targetFrame=currDoc->DocItems.at(d);
+ break;
+ }
+ }
+ }
+ }
+ return targetFrame;
+}
+
+void TOCGenerator::generateDefault()
+{
+ if (currDoc==NULL)
+ return;
+ Q_ASSERT(!currDoc->masterPageMode());
+ for(ToCSetupVector::Iterator tocSetupIt = currDoc->docToCSetups.begin(); tocSetupIt != currDoc->docToCSetups.end(); ++tocSetupIt )
+ {
+ PageItem* tocFrame = findTargetFrame(tocSetupIt->frameName);
+ if (tocFrame == NULL)
+ continue;
+
+ PageItem *currentDocItem;
+ QMap<QString, QString> tocMap;
+
+ uint *pageCounter = new uint[currDoc->DocPages.count()];
+ if (pageCounter == NULL)
+ return;
+ uint pageNumberWidth = QString("%1").arg(currDoc->DocPages.count()).length();
+ for (int i = 0;i < currDoc->DocPages.count();++i)
+ pageCounter[i] = 0;
+
+ for (int d = 0; d < currDoc->DocItems.count(); ++d)
+ {
+ currentDocItem = currDoc->DocItems.at(d);
+ if (currentDocItem == NULL)
+ continue;
+ //Item not on a page, continue
+ if (currentDocItem->OwnPage == -1)
+ continue;
+ //If we dont want to list non printing frames and this one is set to not print, continue
+ if (!tocSetupIt->listNonPrintingFrames && !currentDocItem->printEnabled())
+ continue;
+
+ ObjectAttribute objAttr;
+ QList<ObjectAttribute> objAttrs = currentDocItem->getObjectAttributes(tocSetupIt->itemAttrName);
+ if (objAttrs.count() <= 0)
+ continue;
+
+ QString pageID = QString("%1").arg(currentDocItem->OwnPage + currDoc->FirstPnum, pageNumberWidth);
+ QString sectionID = currDoc->getSectionPageNumberForPageIndex(currentDocItem->OwnPage);
+
+ for (int i = 0; i < objAttrs.count(); ++i)
+ {
+ objAttr = objAttrs.at(i);
+ if (objAttr.name.isNull())
+ continue;
+
+ //The key is generated to produce a sequence of numbers for the page numbers
+ //First is the page of the item
+ //Second is an incremented counter for the item so multiple per page works
+ //Third is the section based page number which is actually used in the TOC.
+ QString tocID = QString("%1").arg(pageCounter[currentDocItem->OwnPage]++, 2 , 10, QChar('0'));
+ QString key = QString("%1,%2,%3").arg(pageID).arg(tocID).arg(sectionID);
+ tocMap.insert(key, objAttr.value);
+ }
+ }
+
+ //Set up the gtWriter instance with the selected paragraph style
+ gtWriter writer(false, tocFrame);
+ writer.setUpdateParagraphStyles(false);
+ writer.setOverridePStyleFont(false);
+ gtFrameStyle* fstyle = writer.getDefaultStyle();
+ gtParagraphStyle* pstyle = new gtParagraphStyle(*fstyle);
+ pstyle->setName(tocSetupIt->textStyle);
+ writer.setParagraphStyle(pstyle);
+
+ QString oldTocPage=QString::null;
+ for (QMap<QString, QString>::Iterator tocIt = tocMap.begin(); tocIt != tocMap.end();++tocIt)
+ {
+ QString tocPage(tocIt.key().section( ',', 2, 2 ).trimmed());
+ QString tocLine;
+ //Start with text or numbers
+ if (tocSetupIt->pageLocation == End || tocSetupIt->pageLocation == NotShown)
+ tocLine = tocIt.value();
+ if (tocSetupIt->pageLocation == Beginning && oldTocPage != tocPage)
+ tocLine = tocPage;
+ //Add in the tab for the leaders
+ tocLine += "\t";
+ //End with text or numbers
+ if (tocSetupIt->pageLocation == Beginning)
+ tocLine += tocIt.value();
+ if (tocSetupIt->pageLocation == End && oldTocPage != tocPage)
+ tocLine += tocPage;
+ tocLine += "\n";
+ writer.append(tocLine);
+ }
+
+ delete[] pageCounter;
+ }
+}