Subversion Repositories Scribus

Rev

Rev 7123 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
4430 cbradney 1
/*
2
For general Scribus (>=1.3.2) copyright and licensing information please refer
3
to the COPYING file provided with the program. Following this notice may exist
4
a copyright and/or license notice that predates the release of Scribus 1.3.2
5
for which a new license (GPL+exception) is in place.
6
*/
4028 cbradney 7
/***************************************************************************
8
*   Copyright (C) 2005 by Craig Bradney                                   *
9
*   cbradney@zip.com.au                                                   *
10
*                                                                         *
11
*   This program is free software; you can redistribute it and/or modify  *
12
*   it under the terms of the GNU General Public License as published by  *
13
*   the Free Software Foundation; either version 2 of the License, or     *
14
*   (at your option) any later version.                                   *
15
*                                                                         *
16
*   This program is distributed in the hope that it will be useful,       *
17
*   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
18
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
19
*   GNU General Public License for more details.                          *
20
*                                                                         *
21
*   You should have received a copy of the GNU General Public License     *
22
*   along with this program; if not, write to the                         *
23
*   Free Software Foundation, Inc.,                                       *
24
*   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
25
***************************************************************************/
26
 
3760 cbradney 27
#include "docsections.h"
28
#include "docsections.moc"
29
 
30
// This class implements only the non-GUI parts of the
31
// Document Sections dialog. Please use Qt Designer on
32
// ui/docsectionsbase.ui if you need to modify the layout,
33
// widget properties, etc.
34
 
4475 cbradney 35
#include <qmessagebox.h>
36
#include <qpushbutton.h>
3760 cbradney 37
#include <qtable.h>
3770 cbradney 38
#include <qtooltip.h>
3760 cbradney 39
 
8439 cbradney 40
#include "commonstrings.h"
3760 cbradney 41
#include "pagestructs.h"
42
 
4485 cbradney 43
 
3760 cbradney 44
DocSections::DocSections( QWidget* parent )
45
        : DocSectionsBase( parent, "DocSections" )
46
{
47
        languageChange();
48
        connect( sectionsTable, SIGNAL(valueChanged(int, int)), this, SLOT(tableItemChanged(int, int)));
49
        connect( addButton, SIGNAL(clicked()), this, SLOT(addEntry()));
50
        connect( deleteButton, SIGNAL(clicked()), this, SLOT(deleteEntry()));
51
}
52
 
53
DocSections::~DocSections()
54
{
55
}
56
 
57
void DocSections::languageChange()
58
{
3770 cbradney 59
        QToolTip::add(addButton, "<qt>"+ tr("Add a page numbering section to the document. The new section will be added after the currently selected section.") + "</qt>");
60
        QToolTip::add(deleteButton, "<qt>"+ tr("Delete the currently selected section.") + "</qt>");
4559 cbradney 61
        QToolTip::add(sectionsTable, "<qt>"+ tr("<b>Name:</b> Optional name for section eg. Index<br/>"
62
                                                                                        "<b>Shown:</b> Select to show the page numbers in this section if there is one or more text frames setup to do so.<br/>"
63
                                                                                        "<b>From:</b> The page index for this section to start at.<br/>"
64
                                                                                        "<b>To:</b> The page index for this section to stop at.<br/>"
65
                                                                                        "<b>Style:</b> Select the page number style to be used.<br/>"
66
                                                                                        "<b>Start:</b> The index within the Style's range to star at. Eg. If Start=2 and Style=a,b,c, ..., the numbers will begin at b. For the first section in the document this replaces the older First Page Number in the new file window.") +"</qt>");
3760 cbradney 67
}
68
 
3770 cbradney 69
void DocSections::setup(const DocumentSectionMap docSections, int maxPageIndex)
3760 cbradney 70
{
3770 cbradney 71
        localSections=docSections;
72
        m_maxpageindex=maxPageIndex;
3760 cbradney 73
 
8439 cbradney 74
        styles << tr("1, 2, 3, ...") << tr("i, ii, iii, ...") << tr("I, II, III, ...") << tr("a, b, c, ...") << tr("A, B, C, ...") << CommonStrings::tr_None;
3760 cbradney 75
 
76
        updateTable();
77
}
78
 
79
void DocSections::updateTable()
80
{
81
        sectionsTable->setNumRows(localSections.count());
82
        int row=0;
83
        for(DocumentSectionMap::Iterator it = localSections.begin(); it!= localSections.end(); ++it)
84
        {
85
                uint i=0;
86
                //Name
87
                QTableItem *item1 = new QTableItem(sectionsTable, QTableItem::WhenCurrent, (*it).name);
88
                sectionsTable->setItem(row, i++, item1);
3762 cbradney 89
                //Active
90
                QCheckTableItem *item2 = new QCheckTableItem(sectionsTable,"");
91
                item2->setChecked((*it).active);
92
                sectionsTable->setItem(row, i++, item2);
3760 cbradney 93
                //FromIndex
4475 cbradney 94
                QTableItem *item3 = new QTableItem(sectionsTable, QTableItem::WhenCurrent, QString::number((*it).fromindex+1));
3762 cbradney 95
                sectionsTable->setItem(row, i++, item3);
3760 cbradney 96
                //ToIndex
4475 cbradney 97
                QTableItem *item4 = new QTableItem(sectionsTable, QTableItem::WhenCurrent, QString::number((*it).toindex+1));
3762 cbradney 98
                sectionsTable->setItem(row, i++, item4);
3760 cbradney 99
                //Style
3762 cbradney 100
                QComboTableItem *item5 = new QComboTableItem(sectionsTable, styles);
101
                sectionsTable->setItem(row, i++, item5);
8439 cbradney 102
                if ((*it).type==Type_None)
103
                        item5->setCurrentItem(styles.count()-1);
104
                else
105
                        item5->setCurrentItem((*it).type);
3760 cbradney 106
                //Start Page Number
3762 cbradney 107
                QTableItem *item6 = new QTableItem(sectionsTable, QTableItem::WhenCurrent, QString::number((*it).sectionstartindex));
108
                sectionsTable->setItem(row, i++, item6);
3760 cbradney 109
                //End Page Number
4008 cbradney 110
                /*
3766 cbradney 111
                QTableItem *item7 = new QTableItem(sectionsTable, QTableItem::WhenCurrent, QString::number((*it).sectionstartindex + (*it).toindex - (*it).fromindex));
112
                item7->setEnabled(false);
3762 cbradney 113
                sectionsTable->setItem(row, i++, item7);
4008 cbradney 114
                */
3760 cbradney 115
                sectionsTable->verticalHeader()->setLabel(row, QString("%1").arg(row));
116
                row++;
117
        }
4475 cbradney 118
        for (int i=0;i<6;++i)
119
                sectionsTable->adjustColumn(i);
3760 cbradney 120
        deleteButton->setEnabled(localSections.count()>1);
121
}
122
 
123
void DocSections::tableItemChanged( int row, int col )
124
{
4475 cbradney 125
        bool outOfRange=false;
5280 cbradney 126
        uint newDocPageSpec;
127
 
3760 cbradney 128
        switch (col)
129
        {
130
        case 0:
131
                localSections[row].name=sectionsTable->text(row, col);
132
                break;
133
        case 1:
3762 cbradney 134
                localSections[row].active=static_cast<QCheckTableItem*>(sectionsTable->item(row, col))->isChecked();
135
                break;
136
        case 2:
5280 cbradney 137
        case 3:
138
                // Validate to/from page specification before conversion to an index
139
                //!!!   There is still a problem here if m_maxpageindex == MAX_UINT ;)
140
                newDocPageSpec=sectionsTable->text(row, col).toUInt();
141
                if (newDocPageSpec==0)
4475 cbradney 142
                {
5280 cbradney 143
                        newDocPageSpec=1;
4475 cbradney 144
                        outOfRange=true;
145
                }
146
                else
5280 cbradney 147
                if (newDocPageSpec>m_maxpageindex+1)
4475 cbradney 148
                {
5280 cbradney 149
                        newDocPageSpec=m_maxpageindex+1;
4475 cbradney 150
                        outOfRange=true;
151
                }
5280 cbradney 152
                // Now, since newDocPageSpec >= 1, convert to index
153
                --newDocPageSpec;
154
                if (col==2)
155
                        localSections[row].fromindex=newDocPageSpec;
4475 cbradney 156
                else
5280 cbradney 157
                        localSections[row].toindex=newDocPageSpec;
3760 cbradney 158
                break;
3762 cbradney 159
        case 4:
3760 cbradney 160
                {
161
                        QComboTableItem* qcti=dynamic_cast<QComboTableItem*>(sectionsTable->item(row,col));
162
                        if (qcti!=NULL)
163
                        {
164
                                uint index=qcti->currentItem();
8439 cbradney 165
                                if (index<styles.count()-1)
3760 cbradney 166
                                        localSections[row].type=(DocumentSectionType)index;
8439 cbradney 167
                                else
168
                                        if (index==styles.count()-1)
169
                                        localSections[row].type=Type_None;
3760 cbradney 170
                        }
171
                }
172
                break;
3762 cbradney 173
        case 5:
3760 cbradney 174
                localSections[row].sectionstartindex=sectionsTable->text(row, col).toUInt();
175
                break;
176
        default:
177
                break;
178
        }
4475 cbradney 179
 
180
        if (outOfRange)
181
        {
182
                updateTable();
7123 fschmid 183
                QMessageBox::warning(parentWidget(), tr("Page Number Out Of Bounds"),"<qt>"+ tr("The value you have entered is outside the range of page numbers in the current document (%1-%2).").arg(1).arg(m_maxpageindex+1)+"</qt>",QMessageBox::Ok,QMessageBox::NoButton,QMessageBox::NoButton);
4475 cbradney 184
        }
3760 cbradney 185
}
186
 
187
void DocSections::addEntry()
188
{
3768 cbradney 189
        int currRow=sectionsTable->currentRow();
190
        bool found=false;
191
        DocumentSectionMap::Iterator it = localSections.begin();
192
        int count=0;
193
        for(; it!= localSections.end(); ++it)
194
        {
195
                if(count==currRow)
196
                {
197
                        found=true;
198
                        break;
199
                }
200
                ++count;
201
        }
202
        if (!found) //End of map, just append
203
        {
204
                struct DocumentSection blank;
205
                uint count=localSections.count();
206
                blank.number=count;
207
                blank.name=QString::number(count);
4475 cbradney 208
                blank.fromindex=m_maxpageindex+1;
209
                blank.toindex=m_maxpageindex+1;
3768 cbradney 210
                blank.type=Type_1_2_3;
211
                blank.sectionstartindex=1;
212
                blank.reversed=false;
213
                blank.active=true;
214
                localSections.insert(count, blank);
215
        }
216
        else
217
        {
218
                //Now, copy to a temp map
219
                DocumentSectionMap tempSections(localSections);
220
                localSections.clear();
221
                //Copy the temp map entries over. When we find the number of the current row, also insert a new entry.
222
                uint i=0;
223
                for(DocumentSectionMap::Iterator it2 = tempSections.begin(); it2!= tempSections.end(); ++it2)
224
                {
225
                        it2.data().number=i;
226
                        localSections.insert(i, it2.data());
227
 
228
                        if ((*it).number==i)
229
                        {
230
                                struct DocumentSection blank;
231
                                blank.number=++i;
232
                                blank.name=QString::number(i);
4475 cbradney 233
                                blank.fromindex=(*it).toindex+1+1;
234
                                blank.toindex=(*it).toindex+2+1;
3768 cbradney 235
                                blank.type=Type_1_2_3;
236
                                blank.sectionstartindex=1;
237
                                blank.reversed=false;
238
                                blank.active=true;
239
                                localSections.insert(i, blank);
240
                        }
241
                        ++i;
242
                }
243
        }
3760 cbradney 244
        updateTable();
245
}
246
 
247
void DocSections::deleteEntry()
248
{
249
        int currRow=sectionsTable->currentRow();
3765 cbradney 250
        if (currRow==0 && localSections.count()==1)
251
                return;
3760 cbradney 252
        bool found=false;
253
        DocumentSectionMap::Iterator it = localSections.begin();
254
        int count=0;
255
        for(; it!= localSections.end(); ++it)
256
        {
257
                if(count==currRow)
258
                {
259
                        found=true;
260
                        break;
261
                }
262
                ++count;
263
        }
264
        if (found)
265
        {
3766 cbradney 266
                //If we arent at the start, copy the toindex of the current item
267
                //to the toindex of the previous item
268
                if (it!=localSections.begin())
269
                {
270
                        DocumentSectionMap::Iterator it2(it);
271
                        (*--it2).toindex=(*it).toindex;
272
                }
273
                //Delete the currently selected entry
3765 cbradney 274
                localSections.remove(it);
3766 cbradney 275
                //Now, copy to a temp map and reinsert with consecutive keys again
3765 cbradney 276
                DocumentSectionMap tempSections(localSections);
277
                localSections.clear();
278
                uint i=0;
279
                it = tempSections.begin();
280
                for(; it!= tempSections.end(); ++it)
281
                {
282
                        it.data().number=i;
283
                        localSections.insert(i++, it.data());
284
                }
285
                int newCount=localSections.count();
286
                //int preIndex=QMAX(currentIndex-1, 0);
287
                localSections[0].fromindex=0;
3770 cbradney 288
                localSections[newCount-1].toindex=m_maxpageindex;
3760 cbradney 289
                updateTable();
290
        }
291
}
292
 
293
const DocumentSectionMap& DocSections::getNewSections()
294
{
295
        return localSections;
296
}