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