Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <editeng/pbinitem.hxx>
21 : #include <editeng/ulspitem.hxx>
22 : #include <editeng/boxitem.hxx>
23 : #include <editeng/brushitem.hxx>
24 : #include <editeng/shaditem.hxx>
25 : #include <editeng/frmdiritem.hxx>
26 : #include <fmtclds.hxx>
27 : #include <fmtfsize.hxx>
28 : #include <pagefrm.hxx>
29 : #include <pagedesc.hxx>
30 : #include <swtable.hxx>
31 : #include <frmtool.hxx>
32 : #include <doc.hxx>
33 : #include <poolfmt.hrc>
34 : #include <IDocumentLayoutAccess.hxx>
35 : #include <IDocumentStylePoolAccess.hxx>
36 : #include <poolfmt.hxx>
37 : #include <switerator.hxx>
38 :
39 : using namespace ::com::sun::star;
40 :
41 6612 : SwPageDesc::SwPageDesc( const OUString& rName, SwFrmFmt *pFmt, SwDoc *pDc ) :
42 : SwModify( 0 ),
43 : aDescName( rName ),
44 6612 : aMaster( pDc->GetAttrPool(), rName, pFmt ),
45 6612 : aLeft( pDc->GetAttrPool(), rName, pFmt ),
46 6612 : m_FirstMaster( pDc->GetAttrPool(), rName, pFmt ),
47 6612 : m_FirstLeft( pDc->GetAttrPool(), rName, pFmt ),
48 : aDepend( this, 0 ),
49 : pFollow( this ),
50 : nRegHeight( 0 ),
51 : nRegAscent( 0 ),
52 : eUse( (UseOnPage)(nsUseOnPage::PD_ALL | nsUseOnPage::PD_HEADERSHARE | nsUseOnPage::PD_FOOTERSHARE | nsUseOnPage::PD_FIRSTSHARE ) ),
53 : bLandscape( false ),
54 : bHidden( false ),
55 33060 : aFtnInfo()
56 : {
57 6612 : }
58 :
59 11220 : SwPageDesc::SwPageDesc( const SwPageDesc &rCpy ) :
60 : SwModify( 0 ),
61 : aDescName( rCpy.GetName() ),
62 11220 : aNumType( rCpy.GetNumType() ),
63 11220 : aMaster( rCpy.GetMaster() ),
64 11220 : aLeft( rCpy.GetLeft() ),
65 11220 : m_FirstMaster( rCpy.GetFirstMaster() ),
66 11220 : m_FirstLeft( rCpy.GetFirstLeft() ),
67 11220 : aDepend( this, (SwModify*)rCpy.aDepend.GetRegisteredIn() ),
68 : pFollow( rCpy.pFollow ),
69 11220 : nRegHeight( rCpy.GetRegHeight() ),
70 11220 : nRegAscent( rCpy.GetRegAscent() ),
71 11220 : eUse( rCpy.ReadUseOn() ),
72 11220 : bLandscape( rCpy.GetLandscape() ),
73 11220 : bHidden( rCpy.IsHidden() ),
74 134640 : aFtnInfo( rCpy.GetFtnInfo() )
75 : {
76 11220 : }
77 :
78 602 : SwPageDesc & SwPageDesc::operator = (const SwPageDesc & rSrc)
79 : {
80 602 : aDescName = rSrc.aDescName;
81 602 : aNumType = rSrc.aNumType;
82 602 : aMaster = rSrc.aMaster;
83 602 : aLeft = rSrc.aLeft;
84 602 : m_FirstMaster = rSrc.m_FirstMaster;
85 602 : m_FirstLeft = rSrc.m_FirstLeft;
86 :
87 602 : if (rSrc.pFollow == &rSrc)
88 574 : pFollow = this;
89 : else
90 28 : pFollow = rSrc.pFollow;
91 :
92 602 : nRegHeight = rSrc.nRegHeight;
93 602 : nRegAscent = rSrc.nRegAscent;
94 602 : eUse = rSrc.eUse;
95 602 : bLandscape = rSrc.bLandscape;
96 602 : return *this;
97 : }
98 :
99 34948 : SwPageDesc::~SwPageDesc()
100 : {
101 34948 : }
102 :
103 : /// Only the margin is mirrored.
104 : /// Attributes like borders and so on are copied 1:1.
105 130 : void SwPageDesc::Mirror()
106 : {
107 : //Only the margins are mirrored, all other values are just copied.
108 130 : SvxLRSpaceItem aLR( RES_LR_SPACE );
109 130 : const SvxLRSpaceItem &rLR = aMaster.GetLRSpace();
110 130 : aLR.SetLeft( rLR.GetRight() );
111 130 : aLR.SetRight( rLR.GetLeft() );
112 :
113 130 : SfxItemSet aSet( *aMaster.GetAttrSet().GetPool(),
114 390 : aMaster.GetAttrSet().GetRanges() );
115 130 : aSet.Put( aLR );
116 130 : aSet.Put( aMaster.GetFrmSize() );
117 130 : aSet.Put( aMaster.GetPaperBin() );
118 130 : aSet.Put( aMaster.GetULSpace() );
119 130 : aSet.Put( aMaster.GetBox() );
120 130 : aSet.Put( aMaster.makeBackgroundBrushItem() );
121 130 : aSet.Put( aMaster.GetShadow() );
122 130 : aSet.Put( aMaster.GetCol() );
123 130 : aSet.Put( aMaster.GetFrmDir() ); // #112217#
124 260 : aLeft.SetFmtAttr( aSet );
125 130 : }
126 :
127 670 : void SwPageDesc::ResetAllAttr( bool bLeft )
128 : {
129 670 : SwFrmFmt& rFmt = bLeft ? GetLeft() : GetMaster();
130 :
131 : // #i73790# - method renamed
132 670 : rFmt.ResetAllFmtAttr();
133 670 : rFmt.SetFmtAttr( SvxFrameDirectionItem(FRMDIR_HORI_LEFT_TOP, RES_FRAMEDIR) );
134 670 : }
135 :
136 : // gets information from Modify
137 609 : bool SwPageDesc::GetInfo( SfxPoolItem & rInfo ) const
138 : {
139 609 : if( !aMaster.GetInfo( rInfo ) )
140 8 : return false; // found
141 601 : if ( !aLeft.GetInfo( rInfo ) )
142 4 : return false ;
143 597 : if ( !m_FirstMaster.GetInfo( rInfo ) )
144 96 : return false;
145 501 : return m_FirstLeft.GetInfo( rInfo );
146 : }
147 :
148 : /// set the style for the grid alignment
149 22028 : void SwPageDesc::SetRegisterFmtColl( const SwTxtFmtColl* pFmt )
150 : {
151 22028 : if( pFmt != GetRegisterFmtColl() )
152 : {
153 0 : if( pFmt )
154 0 : ((SwTxtFmtColl*)pFmt)->Add( &aDepend );
155 : else
156 0 : ((SwTxtFmtColl*)GetRegisterFmtColl())->Remove( &aDepend );
157 :
158 0 : RegisterChange();
159 : }
160 22028 : }
161 :
162 : /// retrieve the style for the grid alignment
163 59852 : const SwTxtFmtColl* SwPageDesc::GetRegisterFmtColl() const
164 : {
165 59852 : const SwModify* pReg = aDepend.GetRegisteredIn();
166 59852 : return (SwTxtFmtColl*)pReg;
167 : }
168 :
169 : /// notifie all affected page frames
170 0 : void SwPageDesc::RegisterChange()
171 : {
172 : // #117072# - During destruction of the document <SwDoc>
173 : // the page description is modified. Thus, do nothing, if the document
174 : // is in destruction respectively if no viewshell exists.
175 0 : SwDoc* pDoc = GetMaster().GetDoc();
176 0 : if ( !pDoc || pDoc->IsInDtor() )
177 : {
178 0 : return;
179 : }
180 0 : SwViewShell* pSh = pDoc->getIDocumentLayoutAccess().GetCurrentViewShell();
181 0 : if ( !pSh )
182 : {
183 0 : return;
184 : }
185 :
186 0 : nRegHeight = 0;
187 : {
188 0 : SwIterator<SwFrm,SwFmt> aIter( GetMaster() );
189 0 : for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
190 : {
191 0 : if( pLast->IsPageFrm() )
192 0 : ((SwPageFrm*)pLast)->PrepareRegisterChg();
193 0 : }
194 : }
195 : {
196 0 : SwIterator<SwFrm,SwFmt> aIter( GetLeft() );
197 0 : for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
198 : {
199 0 : if( pLast->IsPageFrm() )
200 0 : ((SwPageFrm*)pLast)->PrepareRegisterChg();
201 0 : }
202 : }
203 : {
204 0 : SwIterator<SwFrm,SwFmt> aIter( GetFirstMaster() );
205 0 : for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
206 : {
207 0 : if( pLast->IsPageFrm() )
208 0 : ((SwPageFrm*)pLast)->PrepareRegisterChg();
209 0 : }
210 : }
211 : {
212 0 : SwIterator<SwFrm,SwFmt> aIter( GetFirstLeft() );
213 0 : for( SwFrm* pLast = aIter.First(); pLast; pLast = aIter.Next() )
214 : {
215 0 : if( pLast->IsPageFrm() )
216 0 : ((SwPageFrm*)pLast)->PrepareRegisterChg();
217 0 : }
218 : }
219 : }
220 :
221 : /// special handling if the style of the grid alignment changes
222 0 : void SwPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
223 : {
224 0 : const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0;
225 0 : NotifyClients( pOld, pNew );
226 :
227 0 : if ( (RES_ATTRSET_CHG == nWhich) || (RES_FMT_CHG == nWhich)
228 0 : || isCHRATR(nWhich) || (RES_PARATR_LINESPACING == nWhich) )
229 : {
230 0 : RegisterChange();
231 : }
232 0 : }
233 :
234 494 : static const SwFrm* lcl_GetFrmOfNode( const SwNode& rNd )
235 : {
236 : SwModify* pMod;
237 494 : sal_uInt16 nFrmType = FRM_CNTNT;
238 :
239 494 : if( rNd.IsCntntNode() )
240 : {
241 482 : pMod = &(SwCntntNode&)rNd;
242 : }
243 12 : else if( rNd.IsTableNode() )
244 : {
245 12 : pMod = ((SwTableNode&)rNd).GetTable().GetFrmFmt();
246 12 : nFrmType = FRM_TAB;
247 : }
248 : else
249 0 : pMod = 0;
250 :
251 494 : Point aNullPt;
252 494 : return pMod ? ::GetFrmOfModify( 0, *pMod, nFrmType, &aNullPt, 0, false )
253 988 : : 0;
254 : }
255 :
256 194 : const SwPageDesc* SwPageDesc::GetPageDescOfNode(const SwNode& rNd)
257 : {
258 194 : const SwPageDesc* pRet = 0;
259 194 : const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd );
260 194 : if (pChkFrm && 0 != (pChkFrm = pChkFrm->FindPageFrm()))
261 194 : pRet = ((const SwPageFrm*)pChkFrm)->GetPageDesc();
262 194 : return pRet;
263 : }
264 :
265 218 : const SwFrmFmt* SwPageDesc::GetPageFmtOfNode( const SwNode& rNd,
266 : bool bCheckForThisPgDc ) const
267 : {
268 : // which PageDescFormat is valid for this node?
269 : const SwFrmFmt* pRet;
270 218 : const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd );
271 :
272 218 : if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() ))
273 : {
274 : const SwPageDesc* pPd = bCheckForThisPgDc ? this :
275 80 : ((SwPageFrm*)pChkFrm)->GetPageDesc();
276 80 : pRet = &pPd->GetMaster();
277 : OSL_ENSURE( ((SwPageFrm*)pChkFrm)->GetPageDesc() == pPd, "Wrong node for detection of page format!" );
278 : // this page is assigned to which format?
279 80 : if( !pChkFrm->KnowsFormat(*pRet) )
280 : {
281 78 : pRet = &pPd->GetLeft();
282 : OSL_ENSURE( pChkFrm->KnowsFormat(*pRet), "Wrong node for detection of page format!" );
283 : }
284 : }
285 : else
286 138 : pRet = &GetMaster();
287 218 : return pRet;
288 : }
289 :
290 82 : bool SwPageDesc::IsFollowNextPageOfNode( const SwNode& rNd ) const
291 : {
292 82 : bool bRet = false;
293 82 : if( GetFollow() && this != GetFollow() )
294 : {
295 82 : const SwFrm* pChkFrm = lcl_GetFrmOfNode( rNd );
296 246 : if( pChkFrm && 0 != ( pChkFrm = pChkFrm->FindPageFrm() ) &&
297 326 : pChkFrm->IsPageFrm() &&
298 158 : ( !pChkFrm->GetNext() || GetFollow() ==
299 38 : ((SwPageFrm*)pChkFrm->GetNext())->GetPageDesc() ))
300 : // the page on which the follow points was found
301 80 : bRet = true;
302 : }
303 82 : return bRet;
304 : }
305 :
306 5794 : SwFrmFmt *SwPageDesc::GetLeftFmt(bool const bFirst)
307 : {
308 5794 : return (nsUseOnPage::PD_LEFT & eUse)
309 : ? ((bFirst) ? &m_FirstLeft : &aLeft)
310 5794 : : 0;
311 : }
312 :
313 10054 : SwFrmFmt *SwPageDesc::GetRightFmt(bool const bFirst)
314 : {
315 10054 : return (nsUseOnPage::PD_RIGHT & eUse)
316 : ? ((bFirst) ? &m_FirstMaster : &aMaster)
317 10054 : : 0;
318 : }
319 :
320 106764 : bool SwPageDesc::IsFirstShared() const
321 : {
322 106764 : return (eUse & nsUseOnPage::PD_FIRSTSHARE) != 0;
323 : }
324 :
325 16616 : void SwPageDesc::ChgFirstShare( bool bNew )
326 : {
327 16616 : if ( bNew )
328 16400 : eUse = (UseOnPage) (eUse | nsUseOnPage::PD_FIRSTSHARE);
329 : else
330 216 : eUse = (UseOnPage) (eUse & nsUseOnPage::PD_NOFIRSTSHARE);
331 16616 : }
332 :
333 4052 : SwPageDesc* SwPageDesc::GetByName(SwDoc& rDoc, const OUString& rName)
334 : {
335 4052 : const sal_uInt16 nDCount = rDoc.GetPageDescCnt();
336 :
337 6808 : for( sal_uInt16 i = 0; i < nDCount; i++ )
338 : {
339 6800 : SwPageDesc* pDsc = &rDoc.GetPageDesc( i );
340 6800 : if(pDsc->GetName() == rName)
341 : {
342 4044 : return pDsc;
343 : }
344 : }
345 :
346 32 : for( sal_Int32 i = RC_POOLPAGEDESC_BEGIN; i <= STR_POOLPAGE_LANDSCAPE; ++i)
347 : {
348 32 : if (rName==SW_RESSTR(i))
349 : {
350 8 : return rDoc.getIDocumentStylePoolAccess().GetPageDescFromPool( static_cast< sal_uInt16 >(
351 8 : i - RC_POOLPAGEDESC_BEGIN + RES_POOLPAGE_BEGIN) );
352 : }
353 : }
354 :
355 0 : return 0;
356 : }
357 :
358 6612 : SwPageFtnInfo::SwPageFtnInfo() :
359 : nMaxHeight( 0 ),
360 : nLineWidth(10),
361 : eLineStyle( table::BorderLineStyle::SOLID ),
362 : aWidth( 25, 100 ),
363 : nTopDist( 57 ), //1mm
364 6612 : nBottomDist( 57 )
365 : {
366 6612 : eAdj = FRMDIR_HORI_RIGHT_TOP == GetDefaultFrameDirection(GetAppLanguage()) ?
367 : FTNADJ_RIGHT :
368 6612 : FTNADJ_LEFT;
369 6612 : }
370 :
371 106138 : SwPageFtnInfo::SwPageFtnInfo( const SwPageFtnInfo &rCpy ) :
372 106138 : nMaxHeight( rCpy.GetHeight() ),
373 : nLineWidth(rCpy.nLineWidth),
374 : eLineStyle(rCpy.eLineStyle),
375 : aLineColor(rCpy.aLineColor),
376 106138 : aWidth( rCpy.GetWidth() ),
377 106138 : eAdj( rCpy.GetAdj() ),
378 106138 : nTopDist( rCpy.GetTopDist() ),
379 424552 : nBottomDist( rCpy.GetBottomDist() )
380 : {
381 106138 : }
382 :
383 14664 : SwPageFtnInfo &SwPageFtnInfo::operator=( const SwPageFtnInfo& rCpy )
384 : {
385 14664 : nMaxHeight = rCpy.GetHeight();
386 14664 : nLineWidth = rCpy.nLineWidth;
387 14664 : eLineStyle = rCpy.eLineStyle;
388 14664 : aLineColor = rCpy.aLineColor;
389 14664 : aWidth = rCpy.GetWidth();
390 14664 : eAdj = rCpy.GetAdj();
391 14664 : nTopDist = rCpy.GetTopDist();
392 14664 : nBottomDist = rCpy.GetBottomDist();
393 14664 : return *this;
394 : }
395 :
396 31324 : bool SwPageFtnInfo::operator==( const SwPageFtnInfo& rCmp ) const
397 : {
398 62644 : return ( nMaxHeight == rCmp.GetHeight() &&
399 62624 : nLineWidth == rCmp.nLineWidth &&
400 62608 : eLineStyle == rCmp.eLineStyle &&
401 62608 : aLineColor == rCmp.aLineColor &&
402 54684 : aWidth == rCmp.GetWidth() &&
403 46756 : eAdj == rCmp.GetAdj() &&
404 78064 : nTopDist == rCmp.GetTopDist() &&
405 54688 : nBottomDist== rCmp.GetBottomDist() );
406 : }
407 :
408 602 : SwPageDescExt::SwPageDescExt(const SwPageDesc & rPageDesc, SwDoc * _pDoc)
409 602 : : aPageDesc(rPageDesc), pDoc(_pDoc)
410 : {
411 602 : SetPageDesc(rPageDesc);
412 602 : }
413 :
414 0 : SwPageDescExt::SwPageDescExt(const SwPageDescExt & rSrc)
415 0 : : aPageDesc(rSrc.aPageDesc), pDoc(rSrc.pDoc)
416 : {
417 0 : SetPageDesc(rSrc.aPageDesc);
418 0 : }
419 :
420 602 : SwPageDescExt::~SwPageDescExt()
421 : {
422 602 : }
423 :
424 960 : OUString SwPageDescExt::GetName() const
425 : {
426 960 : return aPageDesc.GetName();
427 : }
428 :
429 602 : void SwPageDescExt::SetPageDesc(const SwPageDesc & _aPageDesc)
430 : {
431 602 : aPageDesc = _aPageDesc;
432 :
433 602 : if (aPageDesc.GetFollow())
434 602 : sFollow = aPageDesc.GetFollow()->GetName();
435 602 : }
436 :
437 0 : SwPageDescExt & SwPageDescExt::operator = (const SwPageDesc & rSrc)
438 : {
439 0 : SetPageDesc(rSrc);
440 :
441 0 : return *this;
442 : }
443 :
444 0 : SwPageDescExt & SwPageDescExt::operator = (const SwPageDescExt & rSrc)
445 : {
446 0 : SetPageDesc(rSrc.aPageDesc);
447 :
448 0 : return *this;
449 : }
450 :
451 0 : SwPageDescExt::operator SwPageDesc() const
452 : {
453 0 : SwPageDesc aResult(aPageDesc);
454 :
455 0 : SwPageDesc * pPageDesc = pDoc->GetPageDesc(sFollow);
456 :
457 0 : if ( 0 != pPageDesc )
458 0 : aResult.SetFollow(pPageDesc);
459 :
460 0 : return aResult;
461 : }
462 :
463 10090 : SwPageDescs::~SwPageDescs()
464 : {
465 5045 : for(const_iterator it = begin(); it != end(); ++it)
466 0 : delete *it;
467 5315 : }
468 :
469 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|