~ubuntu-branches/ubuntu/saucy/libwpd/saucy

« back to all changes in this revision

Viewing changes to src/lib/WPXPageSpan.cpp

  • Committer: Package Import Robot
  • Author(s): Rene Engelhard
  • Date: 2011-11-29 23:31:13 UTC
  • mfrom: (1.2.5)
  • Revision ID: package-import@ubuntu.com-20111129233113-xdtwca9h0y6wdxst
Tags: 0.9.4-1
New upstream release

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
1
2
/* libwpd
2
3
 * Copyright (C) 2002 William Lachance (wrlach@gmail.com)
3
4
 * Copyright (C) 2002 Marc Maurer (uwog@uwog.net)
4
5
 * Copyright (C) 2006-2007 Fridrich Strba (fridrich.strba@bluewin.ch)
5
 
 *  
 
6
 *
6
7
 * This library is free software; you can redistribute it and/or
7
8
 * modify it under the terms of the GNU Library General Public
8
9
 * License as published by the Free Software Foundation; either
20
21
 * For further information visit http://libwpd.sourceforge.net
21
22
 */
22
23
 
23
 
/* "This product is not manufactured, approved, or supported by 
 
24
/* "This product is not manufactured, approved, or supported by
24
25
 * Corel Corporation or Corel Corporation Limited."
25
26
 */
26
27
 
35
36
const uint8_t DUMMY_INTERNAL_HEADER_FOOTER = 16;
36
37
 
37
38
// precondition: 0 <= headerFooterType <= 3 (i.e.: we don't handle watermarks here)
38
 
WPXHeaderFooter::WPXHeaderFooter(const WPXHeaderFooterType headerFooterType, const WPXHeaderFooterOccurence occurence, 
39
 
                                 const uint8_t internalType, const WPXSubDocument * subDocument, WPXTableList tableList) :
 
39
WPXHeaderFooter::WPXHeaderFooter(const WPXHeaderFooterType headerFooterType, const WPXHeaderFooterOccurence occurence,
 
40
                                 const uint8_t internalType, const WPXSubDocument *subDocument, WPXTableList tableList) :
40
41
        m_type(headerFooterType),
41
42
        m_occurence(occurence),
42
43
        m_internalType(internalType),
45
46
{
46
47
}
47
48
 
48
 
WPXHeaderFooter::WPXHeaderFooter(const WPXHeaderFooterType headerFooterType, const WPXHeaderFooterOccurence occurence, 
49
 
                                 const uint8_t internalType, const WPXSubDocument * subDocument) :
 
49
WPXHeaderFooter::WPXHeaderFooter(const WPXHeaderFooterType headerFooterType, const WPXHeaderFooterOccurence occurence,
 
50
                                 const uint8_t internalType, const WPXSubDocument *subDocument) :
50
51
        m_type(headerFooterType),
51
52
        m_occurence(occurence),
52
53
        m_internalType(internalType),
64
65
{
65
66
}
66
67
 
67
 
WPXHeaderFooter& WPXHeaderFooter::operator=(const WPXHeaderFooter &headerFooter)
 
68
WPXHeaderFooter &WPXHeaderFooter::operator=(const WPXHeaderFooter &headerFooter)
68
69
{
69
70
        m_type = headerFooter.getType();
70
71
        m_occurence = headerFooter.getOccurence();
120
121
        m_pageSpan(page.getPageSpan())
121
122
{
122
123
        for (uint8_t i=0; i<WPX_NUM_HEADER_FOOTER_TYPES; i++)
123
 
                m_isHeaderFooterSuppressed[i] = page.getHeaderFooterSuppression(i);     
 
124
                m_isHeaderFooterSuppressed[i] = page.getHeaderFooterSuppression(i);
124
125
}
125
126
 
126
127
// NB: this is not a literal "clone" function: it is contingent on the side margins that are passed,
144
145
        m_pageSpan(page.getPageSpan())
145
146
{
146
147
        for (int i=0; i<WPX_NUM_HEADER_FOOTER_TYPES; i++)
147
 
                m_isHeaderFooterSuppressed[i] = false;  
 
148
                m_isHeaderFooterSuppressed[i] = false;
148
149
}
149
150
 
150
151
WPXPageSpan::~WPXPageSpan()
152
153
}
153
154
 
154
155
 
155
 
void WPXPageSpan::setHeaderFooter(const WPXHeaderFooterType type, const uint8_t headerFooterType, const WPXHeaderFooterOccurence occurence, 
156
 
                                  const  WPXSubDocument * subDocument, WPXTableList tableList)
 
156
void WPXPageSpan::setHeaderFooter(const WPXHeaderFooterType type, const uint8_t headerFooterType, const WPXHeaderFooterOccurence occurence,
 
157
                                  const  WPXSubDocument *subDocument, WPXTableList tableList)
157
158
{
158
159
        WPXHeaderFooter headerFooter(type, occurence, headerFooterType, subDocument, tableList);
159
 
        switch (occurence) 
 
160
        switch (occurence)
160
161
        {
161
162
        case ALL:
162
163
        case NEVER:
163
 
                _removeHeaderFooter(type, ODD); _removeHeaderFooter(type, EVEN); _removeHeaderFooter(type, ALL);
 
164
                _removeHeaderFooter(type, ODD);
 
165
                _removeHeaderFooter(type, EVEN);
 
166
                _removeHeaderFooter(type, ALL);
164
167
                break;
165
168
        case ODD:
166
 
                _removeHeaderFooter(type, ODD); _removeHeaderFooter(type, ALL);
 
169
                _removeHeaderFooter(type, ODD);
 
170
                _removeHeaderFooter(type, ALL);
167
171
                break;
168
172
        case EVEN:
169
 
                _removeHeaderFooter(type, EVEN); _removeHeaderFooter(type, ALL);
170
 
                break;          
 
173
                _removeHeaderFooter(type, EVEN);
 
174
                _removeHeaderFooter(type, ALL);
 
175
                break;
171
176
        }
172
177
 
173
178
        if ((occurence != NEVER) && (subDocument))
193
198
 
194
199
void WPXPageSpan::_removeHeaderFooter(WPXHeaderFooterType type, WPXHeaderFooterOccurence occurence)
195
200
{
196
 
        for (std::vector<WPXHeaderFooter>::iterator iter = m_headerFooterList.begin(); iter != m_headerFooterList.end(); iter++) 
 
201
        for (std::vector<WPXHeaderFooter>::iterator iter = m_headerFooterList.begin(); iter != m_headerFooterList.end(); iter++)
197
202
        {
198
 
                if ((*iter).getType() == type && (*iter).getOccurence() == occurence) {
 
203
                if ((*iter).getType() == type && (*iter).getOccurence() == occurence)
 
204
                {
199
205
                        WPD_DEBUG_MSG(("WordPerfect: Removing header/footer element of type: %i since it is identical to %i\n",(*iter).getType(), type));
200
206
                        m_headerFooterList.erase(iter);
201
207
                        return;
205
211
 
206
212
bool WPXPageSpan::_containsHeaderFooter(WPXHeaderFooterType type, WPXHeaderFooterOccurence occurence)
207
213
{
208
 
        for (std::vector<WPXHeaderFooter>::iterator iter = m_headerFooterList.begin(); iter != m_headerFooterList.end(); iter++) 
 
214
        for (std::vector<WPXHeaderFooter>::iterator iter = m_headerFooterList.begin(); iter != m_headerFooterList.end(); iter++)
209
215
        {
210
216
                if ((*iter).getType()==type && (*iter).getOccurence()==occurence)
211
217
                        return true;
216
222
 
217
223
inline bool operator==(const WPXHeaderFooter &headerFooter1, const WPXHeaderFooter &headerFooter2)
218
224
{
219
 
        return ((headerFooter1.getType() == headerFooter2.getType()) && 
220
 
                (headerFooter1.getSubDocument() == headerFooter2.getSubDocument()) &&
221
 
                (headerFooter1.getOccurence() == headerFooter2.getOccurence()) &&
222
 
                (headerFooter1.getInternalType() == headerFooter2.getInternalType()) );
 
225
        return ((headerFooter1.getType() == headerFooter2.getType()) &&
 
226
                (headerFooter1.getSubDocument() == headerFooter2.getSubDocument()) &&
 
227
                (headerFooter1.getOccurence() == headerFooter2.getOccurence()) &&
 
228
                (headerFooter1.getInternalType() == headerFooter2.getInternalType()) );
223
229
}
224
230
 
225
231
bool operator==(const WPXPageSpan &page1, const WPXPageSpan &page2)
226
232
{
227
233
        if ((page1.getMarginLeft() != page2.getMarginLeft()) || (page1.getMarginRight() != page2.getMarginRight()) ||
228
 
            (page1.getMarginTop() != page2.getMarginTop())|| (page1.getMarginBottom() != page2.getMarginBottom()))
 
234
                (page1.getMarginTop() != page2.getMarginTop())|| (page1.getMarginBottom() != page2.getMarginBottom()))
229
235
                return false;
230
236
 
231
 
        if (page1.getPageNumberPosition() != page2.getPageNumberPosition()) 
 
237
        if (page1.getPageNumberPosition() != page2.getPageNumberPosition())
232
238
                return false;
233
239
 
234
240
        if (page1.getPageNumberSuppression() != page2.getPageNumberSuppression())
235
241
                return false;
236
 
        
237
 
        if (page1.getPageNumberOverriden() != page2.getPageNumberOverriden() || 
238
 
                page1.getPageNumberOverride() != page2.getPageNumberOverride())
 
242
 
 
243
        if (page1.getPageNumberOverriden() != page2.getPageNumberOverriden() ||
 
244
                page1.getPageNumberOverride() != page2.getPageNumberOverride())
239
245
                return false;
240
246
 
241
247
        if (page1.getPageNumberingType() != page2.getPageNumberingType())
242
248
                return false;
243
249
 
244
250
        if (page1.getPageNumberingFontName() != page2.getPageNumberingFontName() ||
245
 
                page1.getPageNumberingFontSize() != page2.getPageNumberingFontSize())
 
251
                page1.getPageNumberingFontSize() != page2.getPageNumberingFontSize())
246
252
                return false;
247
253
 
248
 
        for (uint8_t i=0; i<WPX_NUM_HEADER_FOOTER_TYPES; i++) {
 
254
        for (uint8_t i=0; i<WPX_NUM_HEADER_FOOTER_TYPES; i++)
 
255
        {
249
256
                if (page1.getHeaderFooterSuppression(i) != page2.getHeaderFooterSuppression(i))
250
257
                        return false;
251
258
        }
253
260
        // NOTE: yes this is O(n^2): so what? n=4 at most
254
261
        const std::vector<WPXHeaderFooter> headerFooterList1 = page1.getHeaderFooterList();
255
262
        const std::vector<WPXHeaderFooter> headerFooterList2 = page2.getHeaderFooterList();
256
 
        std::vector<WPXHeaderFooter>::const_iterator iter1;             
257
 
        std::vector<WPXHeaderFooter>::const_iterator iter2;             
 
263
        std::vector<WPXHeaderFooter>::const_iterator iter1;
 
264
        std::vector<WPXHeaderFooter>::const_iterator iter2;
258
265
 
259
266
        for (iter1 = headerFooterList1.begin(); iter1 != headerFooterList1.end(); iter1++)
260
267
        {
261
268
                if (std::find(headerFooterList2.begin(), headerFooterList2.end(), (*iter1)) == headerFooterList2.end())
262
269
                        return false;
263
270
        }
264
 
        
 
271
 
265
272
        // If we came here, we know that every header/footer that is found in the first page span is in the second too.
266
273
        // But this is not enought for us to know whether the page spans are equal. Now we have to check in addition
267
274
        // whether every header/footer that is in the second one is in the first too. If someone wants to optimize this,
268
275
        // (s)he is most welcome :-)
269
 
        
 
276
 
270
277
        for (iter2 = headerFooterList2.begin(); iter2 != headerFooterList2.end(); iter2++)
271
278
        {
272
279
                if (std::find(headerFooterList1.begin(), headerFooterList1.end(), (*iter2)) == headerFooterList1.end())
273
280
                        return false;
274
281
        }
275
282
 
276
 
        
 
283
 
277
284
        WPD_DEBUG_MSG(("WordPerfect: WPXPageSpan == comparison finished, found no differences\n"));
278
285
 
279
286
        return true;
280
287
}
 
288
/* vim:set shiftwidth=4 softtabstop=4 noexpandtab: */