Subversion Repositories Scribus

Rev

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

/***************************************************************************
    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 "tocgenerator.moc"

#include <qmap.h>
#include <qstring.h>

#include "scribusdoc.h"
#include "pagestructs.h"
#include "pageitem.h"
#include "gtwriter.h"


TOCGenerator::TOCGenerator(QObject *parent, const char *name, ScribusDoc *doc) : QObject(parent, name)
{
        currDoc=doc;
}


TOCGenerator::~TOCGenerator()
{
}

void TOCGenerator::setDoc(ScribusDoc *doc)
{
        currDoc=doc;
}

PageItem* TOCGenerator::findTargetFrame(const QString &targetFrameName)
{
        PageItem* targetFrame=NULL;
        if (currDoc!=NULL)
        {
                for (uint 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;
        for(ToCSetupVector::Iterator tocSetupIt = currDoc->docToCSetups.begin() ; tocSetupIt != currDoc->docToCSetups.end(); ++tocSetupIt )
        {
                PageItem* tocFrame=findTargetFrame((*tocSetupIt).frameName);
                if (tocFrame!=NULL)
                {
                        PageItem *currentDocItem;
                        QMap<QString, QString> tocMap;
                        tocMap.clear();
                        uint pageCounter[currDoc->pageCount];
                        uint pageNumberWidth=QString("%1").arg(currDoc->pageCount).length();
                        for (int i=0;i<=currDoc->pageCount;++i)
                                pageCounter[i]=0;
                        unsigned int maxDataWidth=0;
                        for (uint d = 0; d < currDoc->DocItems.count(); ++d)
                        {
                                currentDocItem = currDoc->DocItems.at(d);
                                if (currentDocItem!=NULL)
                                {
                                        //Item not on a page, continue
                                        if (currentDocItem->OwnPage==-1)
                                                continue;
                                        ObjectAttribute objattr=currentDocItem->getObjectAttribute((*tocSetupIt).itemAttrName);
                                        if (objattr.name!=QString::null)
                                        {
                                                //TODO Handle docs with non consecutive page numbers when that is possible
                                                QString key=QString("%1,%2").arg(currentDocItem->OwnPage + currDoc->FirstPnum, pageNumberWidth).arg(pageCounter[currentDocItem->OwnPage]++);
                                                tocMap.insert(key, objattr.value);
                                                if (objattr.value.length()>maxDataWidth)
                                                        maxDataWidth=objattr.value.length();
                                        }
                                }
                        }
                        gtWriter* writer = new gtWriter(false, tocFrame);
                        QString oldTocPage=QString::null;
                        for (QMap<QString, QString>::Iterator tocIt=tocMap.begin();tocIt!=tocMap.end();++tocIt)
                        {
                                QString tocPage = tocIt.key().section( ',', 0, 0 ).stripWhiteSpace();
                                QString tocLine;
                                //Start with text or numbers
                                if ((*tocSetupIt).pageLocation==End || (*tocSetupIt).pageLocation==NotShown)
                                        tocLine = tocIt.data();
                                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.data();
                                if ((*tocSetupIt).pageLocation==End && oldTocPage!=tocPage)
                                        tocLine += tocPage;
                                tocLine += "\n";
                                writer->append(tocLine);
                        }
                        if (writer!=NULL)
                                delete writer;
                }
        }
}