Subversion Repositories Scribus

Rev

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

Rev Author Line No. Line
15015 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
*/
7
 
15047 cbradney 8
#include <QCheckBox>
9
#include <QComboBox>
10
#include <QMessageBox>
11
 
15015 cbradney 12
#include "prefs_documentsections.h"
15047 cbradney 13
#include "commonstrings.h"
15015 cbradney 14
#include "prefsstructs.h"
15021 cbradney 15
#include "scribusdoc.h"
22971 jghali 16
#include "ui/numformatcombo.h"
19605 jghali 17
#include "ui/scmessagebox.h"
15015 cbradney 18
 
15021 cbradney 19
Prefs_DocumentSections::Prefs_DocumentSections(QWidget* parent, ScribusDoc* doc)
15047 cbradney 20
        : Prefs_Pane(parent),
20884 jghali 21
        m_doc(doc), m_maxPageIndex(0)
15015 cbradney 22
{
23
        setupUi(this);
24
        languageChange();
15047 cbradney 25
        connect(sectionsTable, SIGNAL(cellChanged(int,int)), this, SLOT(tableItemChanged(int,int)));
26
        connect(addButton, SIGNAL(clicked()), this, SLOT(addEntry()));
27
        connect(deleteButton, SIGNAL(clicked()), this, SLOT(deleteEntry()));
15015 cbradney 28
}
29
 
30
Prefs_DocumentSections::~Prefs_DocumentSections()
31
{
32
}
33
 
34
void Prefs_DocumentSections::languageChange()
35
{
36
}
37
 
38
void Prefs_DocumentSections::restoreDefaults(struct ApplicationPrefs *prefsData)
39
{
22970 jghali 40
        m_localSections = prefsData->docSectionMap;
41
        m_maxPageIndex = m_doc->DocPages.count()-1;
21075 craig 42
        m_styles.clear();
21682 jghali 43
        m_styles = getFormatList();
21075 craig 44
        m_styles << CommonStrings::tr_None;
20526 craig 45
//      styles << tr("1, 2, 3, ...") << tr("i, ii, iii, ...") << tr("I, II, III, ...") << tr("a, b, c, ...") << tr("A, B, C, ...") << tr("*") << tr("CJK") << CommonStrings::tr_None;
15047 cbradney 46
 
47
        updateTable();
15015 cbradney 48
}
49
 
50
void Prefs_DocumentSections::saveGuiToPrefs(struct ApplicationPrefs *prefsData) const
51
{
21075 craig 52
        prefsData->docSectionMap=m_localSections;
15015 cbradney 53
}
54
 
15047 cbradney 55
void Prefs_DocumentSections::updateTable()
56
{
21075 craig 57
        sectionsTable->setRowCount(m_localSections.count());
15047 cbradney 58
        int row=0;
22723 jghali 59
        for (DocumentSectionMap::Iterator it = m_localSections.begin(); it!= m_localSections.end(); ++it)
15047 cbradney 60
        {
61
                uint i=0;
62
                //Name
22970 jghali 63
                QTableWidgetItem *item0 = new QTableWidgetItem(it->name);
15534 craig 64
                sectionsTable->setItem(row, i++, item0);
15047 cbradney 65
                //Active
19262 craig 66
                QTableWidgetItem *item1 = new QTableWidgetItem();;
22970 jghali 67
                item1->setCheckState(it->active ? Qt::Checked : Qt::Unchecked);
19262 craig 68
                sectionsTable->setItem(row, i++, item1);
69
                //Reversed
70
                QTableWidgetItem *item2 = new QTableWidgetItem();
22970 jghali 71
                item2->setCheckState(it->reversed ? Qt::Checked : Qt::Unchecked);
19262 craig 72
                sectionsTable->setItem(row, i++, item2);
15047 cbradney 73
                //FromIndex
22970 jghali 74
                QTableWidgetItem *item3 = new QTableWidgetItem(QString::number(it->fromindex + 1));
19262 craig 75
                sectionsTable->setItem(row, i++, item3);
15534 craig 76
                //ToIndex
22970 jghali 77
                QTableWidgetItem *item4 = new QTableWidgetItem(QString::number(it->toindex + 1));
19262 craig 78
                sectionsTable->setItem(row, i++, item4);
15047 cbradney 79
                //Style
22971 jghali 80
                NumFormatCombo *item5 = new NumFormatCombo(nullptr, true);
21075 craig 81
                item5->addItems(m_styles);
19262 craig 82
                sectionsTable->setCellWidget(row, i++, item5);
22971 jghali 83
                item5->setCurrentFormat(it->type);
15047 cbradney 84
                //Start Page Number
22970 jghali 85
                QTableWidgetItem *item6 = new QTableWidgetItem(QString::number(it->sectionstartindex));
19262 craig 86
                sectionsTable->setItem(row, i++, item6);
15047 cbradney 87
                //End Page Number
88
                /*
22970 jghali 89
                QTableItem *item7 = new QTableItem(sectionsTable, QTableItem::WhenCurrent, QString::number(it->sectionstartindex + it->toindex - it->fromindex));
15047 cbradney 90
                item7->setEnabled(false);
91
                sectionsTable->setItem(row, i++, item7);
92
                */
15534 craig 93
                //Field Width
22970 jghali 94
                QTableWidgetItem *item7 = new QTableWidgetItem(QString::number(it->pageNumberWidth));
19262 craig 95
                sectionsTable->setItem(row, i++, item7);
15534 craig 96
                //Fill Char
22970 jghali 97
                QTableWidgetItem *item8 = new QTableWidgetItem(QString(it->pageNumberFillChar));
19262 craig 98
                sectionsTable->setItem(row, i++, item8);
15534 craig 99
                //
22970 jghali 100
                QTableWidgetItem *t = sectionsTable->verticalHeaderItem(row);
101
                if (t != nullptr)
15047 cbradney 102
                        t->setText(QString("%1").arg(row));
103
                row++;
104
        }
22970 jghali 105
        deleteButton->setEnabled(m_localSections.count() > 1);
15047 cbradney 106
}
107
 
108
void Prefs_DocumentSections::tableItemChanged( int row, int col )
109
{
22970 jghali 110
        bool outOfRange = false;
15047 cbradney 111
        uint newDocPageSpec;
112
        switch (col)
113
        {
22638 craig 114
                case 0:
22970 jghali 115
                        m_localSections[row].name = sectionsTable->item(row, col)->text();
22638 craig 116
                        break;
117
                case 1:
22970 jghali 118
                        m_localSections[row].active = (sectionsTable->item(row, col)->checkState() == Qt::Checked);
22638 craig 119
                        break;
120
                case 2:
22970 jghali 121
                        m_localSections[row].reversed = (sectionsTable->item(row, col)->checkState() == Qt::Checked);
22638 craig 122
                        break;
123
                case 3:
124
                case 4:
125
                        // Validate to/from page specification before conversion to an index
126
                        //!!!   There is still a problem here if m_maxPageIndex == MAX_UINT ;)
22970 jghali 127
                        newDocPageSpec = sectionsTable->item(row, col)->text().toUInt();
128
                        if (newDocPageSpec == 0)
15047 cbradney 129
                        {
22970 jghali 130
                                newDocPageSpec = 1;
131
                                outOfRange = true;
22638 craig 132
                        }
22970 jghali 133
                        else if (newDocPageSpec > m_maxPageIndex+1)
134
                        {
135
                                newDocPageSpec = m_maxPageIndex + 1;
136
                                outOfRange = true;
137
                        }
22638 craig 138
                        // Now, since newDocPageSpec >= 1, convert to index
139
                        --newDocPageSpec;
22970 jghali 140
                        if (col == 3)
141
                                m_localSections[row].fromindex = newDocPageSpec;
22638 craig 142
                        else
22970 jghali 143
                                m_localSections[row].toindex = newDocPageSpec;
22638 craig 144
                        break;
145
                case 5:
146
                        {
22971 jghali 147
                                NumFormatCombo* qcti = dynamic_cast<NumFormatCombo*>(sectionsTable->cellWidget(row,col));
22970 jghali 148
                                if (qcti != nullptr)
22971 jghali 149
                                        m_localSections[row].type = qcti->currentFormat();
22638 craig 150
                        }
151
                        break;
152
                case 6:
153
                        m_localSections[row].sectionstartindex = sectionsTable->item(row, col)->text().toUInt();;
154
                        break;
155
                case 7:
156
                        m_localSections[row].pageNumberWidth = sectionsTable->item(row, col)->text().toInt();
157
                        break;
158
                case 8:
159
                        {
160
                                QString ch=sectionsTable->item(row, col)->text();
22970 jghali 161
                                if (ch.length() > 0)
162
                                        m_localSections[row].pageNumberFillChar = ch.at(0);
15047 cbradney 163
                                else
22970 jghali 164
                                        m_localSections[row].pageNumberFillChar = QChar();
15047 cbradney 165
                        }
22638 craig 166
                        break;
167
                default:
168
                        break;
15047 cbradney 169
        }
170
 
171
        if (outOfRange)
172
        {
173
                updateTable();
20884 jghali 174
                ScMessageBox::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>");
15047 cbradney 175
        }
176
}
177
 
178
void Prefs_DocumentSections::addEntry()
179
{
180
        int currRow=sectionsTable->currentRow();
181
        bool found=false;
21075 craig 182
        DocumentSectionMap::Iterator it = m_localSections.begin();
15047 cbradney 183
        int count=0;
22970 jghali 184
        for (; it != m_localSections.end(); ++it)
15047 cbradney 185
        {
22970 jghali 186
                if(count == currRow)
15047 cbradney 187
                {
22970 jghali 188
                        found = true;
15047 cbradney 189
                        break;
190
                }
191
                ++count;
192
        }
193
        if (!found) //End of map, just append
194
        {
195
                struct DocumentSection blank;
22970 jghali 196
                uint count = m_localSections.count();
197
                blank.number = count;
198
                blank.name = QString::number(count);
199
                blank.fromindex = m_maxPageIndex+1;
200
                blank.toindex = m_maxPageIndex+1;
201
                blank.type = Type_1_2_3;
202
                blank.sectionstartindex = 1;
203
                blank.reversed = false;
204
                blank.active = true;
23004 jghali 205
                blank.pageNumberWidth = 0;
21075 craig 206
                m_localSections.insert(count, blank);
15047 cbradney 207
        }
208
        else
209
        {
210
                //Now, copy to a temp map
21075 craig 211
                DocumentSectionMap tempSections(m_localSections);
212
                m_localSections.clear();
15047 cbradney 213
                //Copy the temp map entries over. When we find the number of the current row, also insert a new entry.
22970 jghali 214
                uint i = 0;
22723 jghali 215
                for (DocumentSectionMap::Iterator it2 = tempSections.begin(); it2!= tempSections.end(); ++it2)
15047 cbradney 216
                {
22970 jghali 217
                        it2.value().number = i;
21075 craig 218
                        m_localSections.insert(i, it2.value());
15047 cbradney 219
 
22970 jghali 220
                        if (it->number == i)
15047 cbradney 221
                        {
222
                                struct DocumentSection blank;
22970 jghali 223
                                blank.number = ++i;
224
                                blank.name = QString::number(i);
225
                                blank.fromindex = it->toindex+1+1;
226
                                blank.toindex = it->toindex+2+1;
227
                                blank.type = Type_1_2_3;
228
                                blank.sectionstartindex = 1;
229
                                blank.reversed = false;
230
                                blank.active = true;
23004 jghali 231
                                blank.pageNumberWidth = 0;
21075 craig 232
                                m_localSections.insert(i, blank);
15047 cbradney 233
                        }
234
                        ++i;
235
                }
236
        }
237
        updateTable();
238
}
239
 
240
void Prefs_DocumentSections::deleteEntry()
241
{
242
        int currRow=sectionsTable->currentRow();
21075 craig 243
        if (currRow==0 && m_localSections.count()==1)
15047 cbradney 244
                return;
245
        bool found=false;
21075 craig 246
        DocumentSectionMap::Iterator it = m_localSections.begin();
15047 cbradney 247
        int count=0;
22723 jghali 248
        for (; it!= m_localSections.end(); ++it)
15047 cbradney 249
        {
250
                if(count==currRow)
251
                {
252
                        found=true;
253
                        break;
254
                }
255
                ++count;
256
        }
257
        if (found)
258
        {
259
                //If we arent at the start, copy the toindex of the current item
260
                //to the toindex of the previous item
21075 craig 261
                if (it!=m_localSections.begin())
15047 cbradney 262
                {
263
                        DocumentSectionMap::Iterator it2(it);
264
                        (*--it2).toindex=(*it).toindex;
265
                }
266
                //Delete the currently selected entry
21075 craig 267
                m_localSections.erase(it);
15047 cbradney 268
                //Now, copy to a temp map and reinsert with consecutive keys again
21075 craig 269
                DocumentSectionMap tempSections(m_localSections);
270
                m_localSections.clear();
15047 cbradney 271
                uint i=0;
272
                it = tempSections.begin();
22723 jghali 273
                for (; it!= tempSections.end(); ++it)
15047 cbradney 274
                {
275
                        it.value().number=i;
21075 craig 276
                        m_localSections.insert(i++, it.value());
15047 cbradney 277
                }
21075 craig 278
                int newCount=m_localSections.count();
15047 cbradney 279
                //int preIndex=qMax(currentIndex-1, 0);
21075 craig 280
                m_localSections[0].fromindex=0;
281
                m_localSections[newCount-1].toindex = m_maxPageIndex;
15047 cbradney 282
                updateTable();
283
        }
284
}