Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
2441 cbradney 1
/***************************************************************************
2
    begin                : Jun 2005
3
    copyright            : (C) 2005 by Craig Bradney
4
    email                : cbradney@zip.com.au
5
 ***************************************************************************/
6
 
7
/***************************************************************************
8
 *                                                                         *
9
 *   This program is free software; you can redistribute it and/or modify  *
10
 *   it under the terms of the GNU General Public License as published by  *
11
 *   the Free Software Foundation; either version 2 of the License, or     *
12
 *   (at your option) any later version.                                   *
13
 *                                                                         *
14
 ***************************************************************************/
15
#include "tocgenerator.h"
16
#include "tocgenerator.moc"
17
 
18
#include <qmap.h>
19
#include <qstring.h>
20
 
21
#include "scribusdoc.h"
22
#include "pagestructs.h"
23
#include "pageitem.h"
24
#include "gtwriter.h"
25
 
26
 
27
TOCGenerator::TOCGenerator(QObject *parent, const char *name, ScribusDoc *doc) : QObject(parent, name)
28
{
29
        currDoc=doc;
30
}
31
 
32
 
33
TOCGenerator::~TOCGenerator()
34
{
35
}
36
 
37
void TOCGenerator::setDoc(ScribusDoc *doc)
38
{
39
        currDoc=doc;
40
}
41
 
2445 cbradney 42
PageItem* TOCGenerator::findTargetFrame(const QString &targetFrameName)
2441 cbradney 43
{
2445 cbradney 44
        PageItem* targetFrame=NULL;
45
        if (currDoc!=NULL)
2441 cbradney 46
        {
2445 cbradney 47
                for (uint d = 0; d < currDoc->DocItems.count(); ++d)
2441 cbradney 48
                {
49
                        if (currDoc->DocItems.at(d) !=NULL )
50
                        {
2445 cbradney 51
                                if (currDoc->DocItems.at(d)->itemType()==PageItem::TextFrame && currDoc->DocItems.at(d)->itemName()==targetFrameName)
2441 cbradney 52
                                {
2445 cbradney 53
                                        targetFrame=currDoc->DocItems.at(d);
54
                                        break;
2441 cbradney 55
                                }
56
                        }
57
                }
2445 cbradney 58
        }
59
        return targetFrame;
60
}
61
 
62
void TOCGenerator::generateDefault()
63
{
64
        if (currDoc==NULL)
65
                return;
66
        for(ToCSetupVector::Iterator tocSetupIt = currDoc->docToCSetups.begin() ; tocSetupIt != currDoc->docToCSetups.end(); ++tocSetupIt )
67
        {
68
                PageItem* tocFrame=findTargetFrame((*tocSetupIt).frameName);
69
                if (tocFrame!=NULL)
2441 cbradney 70
                {
71
                        PageItem *currentDocItem;
72
                        QMap<QString, QString> tocMap;
73
                        tocMap.clear();
74
                        uint pageCounter[currDoc->pageCount];
2446 cbradney 75
                        uint pageNumberWidth=QString("%1").arg(currDoc->pageCount).length();
2441 cbradney 76
                        for (int i=0;i<=currDoc->pageCount;++i)
77
                                pageCounter[i]=0;
78
                        unsigned int maxDataWidth=0;
79
                        for (uint d = 0; d < currDoc->DocItems.count(); ++d)
80
                        {
81
                                currentDocItem = currDoc->DocItems.at(d);
82
                                if (currentDocItem!=NULL)
83
                                {
84
                                        //Item not on a page, continue
85
                                        if (currentDocItem->OwnPage==-1)
86
                                                continue;
87
                                        ObjectAttribute objattr=currentDocItem->getObjectAttribute((*tocSetupIt).itemAttrName);
88
                                        if (objattr.name!=QString::null)
89
                                        {
90
                                                //TODO Handle docs with non consecutive page numbers when that is possible
2446 cbradney 91
                                                QString key=QString("%1,%2").arg(currentDocItem->OwnPage + currDoc->FirstPnum, pageNumberWidth).arg(pageCounter[currentDocItem->OwnPage]++);
2441 cbradney 92
                                                tocMap.insert(key, objattr.value);
93
                                                if (objattr.value.length()>maxDataWidth)
94
                                                        maxDataWidth=objattr.value.length();
95
                                        }
96
                                }
97
                        }
98
                        gtWriter* writer = new gtWriter(false, tocFrame);
99
                        QString oldTocPage=QString::null;
100
                        for (QMap<QString, QString>::Iterator tocIt=tocMap.begin();tocIt!=tocMap.end();++tocIt)
101
                        {
2446 cbradney 102
                                QString tocPage = tocIt.key().section( ',', 0, 0 ).stripWhiteSpace();
103
                                QString tocLine;
104
                                //Start with text or numbers
105
                                if ((*tocSetupIt).pageLocation==End || (*tocSetupIt).pageLocation==NotShown)
106
                                        tocLine = tocIt.data();
107
                                if ((*tocSetupIt).pageLocation==Beginning && oldTocPage!=tocPage)
108
                                        tocLine = tocPage;
109
                                //Add in the tab for the leaders
110
                                tocLine+="\t";
111
                                //End with text or numbers
112
                                if ((*tocSetupIt).pageLocation==Beginning)
113
                                        tocLine += tocIt.data();
114
                                if ((*tocSetupIt).pageLocation==End && oldTocPage!=tocPage)
115
                                        tocLine += tocPage;
116
                                tocLine += "\n";
2441 cbradney 117
                                writer->append(tocLine);
118
                        }
119
                        if (writer!=NULL)
120
                                delete writer;
121
                }
122
        }
123
}