1*efeef26fSAndrew Rist /**************************************************************
2*efeef26fSAndrew Rist *
3*efeef26fSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist * or more contributor license agreements. See the NOTICE file
5*efeef26fSAndrew Rist * distributed with this work for additional information
6*efeef26fSAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*efeef26fSAndrew Rist * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist * with the License. You may obtain a copy of the License at
10*efeef26fSAndrew Rist *
11*efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*efeef26fSAndrew Rist * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist * KIND, either express or implied. See the License for the
17*efeef26fSAndrew Rist * specific language governing permissions and limitations
18*efeef26fSAndrew Rist * under the License.
19*efeef26fSAndrew Rist *
20*efeef26fSAndrew Rist *************************************************************/
21*efeef26fSAndrew Rist
22*efeef26fSAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <tools/ref.hxx>
28cdf0e10cSrcweir
29cdf0e10cSrcweir #include <hintids.hxx>
30cdf0e10cSrcweir #include <fesh.hxx>
31cdf0e10cSrcweir #include <doc.hxx>
32cdf0e10cSrcweir #include <IDocumentUndoRedo.hxx>
33cdf0e10cSrcweir #include <pagefrm.hxx>
34cdf0e10cSrcweir #include <rootfrm.hxx>
35cdf0e10cSrcweir #include <cntfrm.hxx>
36cdf0e10cSrcweir #include <pam.hxx>
37cdf0e10cSrcweir #include <fmtpdsc.hxx>
38cdf0e10cSrcweir #include <pagedesc.hxx>
39cdf0e10cSrcweir #include <tabfrm.hxx>
40cdf0e10cSrcweir #include <edimp.hxx>
41cdf0e10cSrcweir #include <SwStyleNameMapper.hxx>
42cdf0e10cSrcweir
43cdf0e10cSrcweir /*************************************************************************
44cdf0e10cSrcweir |*
45cdf0e10cSrcweir |* SwFEShell::GetPageDescCnt()
46cdf0e10cSrcweir |*
47cdf0e10cSrcweir |* Ersterstellung MA 25. Jan. 93
48cdf0e10cSrcweir |* Letzte Aenderung MA 25. Jan. 93
49cdf0e10cSrcweir |*
50cdf0e10cSrcweir |*************************************************************************/
51cdf0e10cSrcweir
GetPageDescCnt() const52cdf0e10cSrcweir sal_uInt16 SwFEShell::GetPageDescCnt() const
53cdf0e10cSrcweir {
54cdf0e10cSrcweir return GetDoc()->GetPageDescCnt();
55cdf0e10cSrcweir }
56cdf0e10cSrcweir
57cdf0e10cSrcweir /*************************************************************************
58cdf0e10cSrcweir |*
59cdf0e10cSrcweir |* SwFEShell::ChgCurPageDesc()
60cdf0e10cSrcweir |*
61cdf0e10cSrcweir |* Ersterstellung ST ??
62cdf0e10cSrcweir |* Letzte Aenderung MA 01. Aug. 94
63cdf0e10cSrcweir |*
64cdf0e10cSrcweir |*************************************************************************/
65cdf0e10cSrcweir
ChgCurPageDesc(const SwPageDesc & rDesc)66cdf0e10cSrcweir void SwFEShell::ChgCurPageDesc( const SwPageDesc& rDesc )
67cdf0e10cSrcweir {
68cdf0e10cSrcweir #ifdef DBG_UTIL
69cdf0e10cSrcweir //Die SS veraendert keinen PageDesc, sondern setzt nur das Attribut.
70cdf0e10cSrcweir //Der Pagedesc muss im Dokument vorhanden sein!
71cdf0e10cSrcweir sal_Bool bFound = sal_False;
72cdf0e10cSrcweir for ( sal_uInt16 nTst = 0; nTst < GetPageDescCnt(); ++nTst )
73cdf0e10cSrcweir if ( &rDesc == &GetPageDesc( nTst ) )
74cdf0e10cSrcweir bFound = sal_True;
75cdf0e10cSrcweir ASSERT( bFound, "ChgCurPageDesc mit ungueltigem Descriptor." );
76cdf0e10cSrcweir #endif
77cdf0e10cSrcweir
78cdf0e10cSrcweir StartAllAction();
79cdf0e10cSrcweir
80cdf0e10cSrcweir SwPageFrm *pPage = GetCurrFrm()->FindPageFrm();
81cdf0e10cSrcweir const SwFrm *pFlow = 0;
82cdf0e10cSrcweir sal_uInt16 nPageNmOffset = 0;
83cdf0e10cSrcweir
84cdf0e10cSrcweir ASSERT( !GetCrsr()->HasMark(), "ChgCurPageDesc nur ohne Selektion!");
85cdf0e10cSrcweir
86cdf0e10cSrcweir SET_CURR_SHELL( this );
87cdf0e10cSrcweir while ( pPage )
88cdf0e10cSrcweir {
89cdf0e10cSrcweir pFlow = pPage->FindFirstBodyCntnt();
90cdf0e10cSrcweir if ( pFlow )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir if ( pFlow->IsInTab() )
93cdf0e10cSrcweir pFlow = pFlow->FindTabFrm();
94cdf0e10cSrcweir const SwFmtPageDesc& rPgDesc = pFlow->GetAttrSet()->GetPageDesc();
95cdf0e10cSrcweir if( rPgDesc.GetPageDesc() )
96cdf0e10cSrcweir {
97cdf0e10cSrcweir // wir haben ihn den Schlingel
98cdf0e10cSrcweir nPageNmOffset = rPgDesc.GetNumOffset();
99cdf0e10cSrcweir break;
100cdf0e10cSrcweir }
101cdf0e10cSrcweir }
102cdf0e10cSrcweir pPage = (SwPageFrm*) pPage->GetPrev();
103cdf0e10cSrcweir }
104cdf0e10cSrcweir if ( !pPage )
105cdf0e10cSrcweir {
106cdf0e10cSrcweir pPage = (SwPageFrm*) (GetLayout()->Lower());
107cdf0e10cSrcweir pFlow = pPage->FindFirstBodyCntnt();
108cdf0e10cSrcweir if ( !pFlow )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir pPage = (SwPageFrm*)pPage->GetNext();
111cdf0e10cSrcweir pFlow = pPage->FindFirstBodyCntnt();
112cdf0e10cSrcweir ASSERT( pFlow, "Dokuemnt ohne Inhalt?!?" );
113cdf0e10cSrcweir }
114cdf0e10cSrcweir }
115cdf0e10cSrcweir
116cdf0e10cSrcweir // Seitennummer mitnehmen
117cdf0e10cSrcweir SwFmtPageDesc aNew( &rDesc );
118cdf0e10cSrcweir aNew.SetNumOffset( nPageNmOffset );
119cdf0e10cSrcweir
120cdf0e10cSrcweir if ( pFlow->IsInTab() )
121cdf0e10cSrcweir GetDoc()->SetAttr( aNew, *(SwFmt*)pFlow->FindTabFrm()->GetFmt() );
122cdf0e10cSrcweir else
123cdf0e10cSrcweir {
124cdf0e10cSrcweir SwPaM aPaM( *((SwCntntFrm*)pFlow)->GetNode() );
125cdf0e10cSrcweir GetDoc()->InsertPoolItem( aPaM, aNew, 0 );
126cdf0e10cSrcweir }
127cdf0e10cSrcweir EndAllActionAndCall();
128cdf0e10cSrcweir }
129cdf0e10cSrcweir
130cdf0e10cSrcweir /*************************************************************************
131cdf0e10cSrcweir |*
132cdf0e10cSrcweir |* SwFEShell::ChgPageDesc()
133cdf0e10cSrcweir |*
134cdf0e10cSrcweir |* Ersterstellung MA 25. Jan. 93
135cdf0e10cSrcweir |* Letzte Aenderung MA 24. Jan. 95
136cdf0e10cSrcweir |*
137cdf0e10cSrcweir |*************************************************************************/
138cdf0e10cSrcweir
ChgPageDesc(sal_uInt16 i,const SwPageDesc & rChged)139cdf0e10cSrcweir void SwFEShell::ChgPageDesc( sal_uInt16 i, const SwPageDesc &rChged )
140cdf0e10cSrcweir {
141cdf0e10cSrcweir StartAllAction();
142cdf0e10cSrcweir SET_CURR_SHELL( this );
143cdf0e10cSrcweir //Fix i64842: because Undo has a very special way to handle header/footer content
144cdf0e10cSrcweir // we have to copy the page descriptor before calling ChgPageDesc.
145cdf0e10cSrcweir SwPageDesc aDesc( rChged );
146cdf0e10cSrcweir {
147cdf0e10cSrcweir ::sw::UndoGuard const undoGuard(GetDoc()->GetIDocumentUndoRedo());
148cdf0e10cSrcweir GetDoc()->CopyPageDesc(rChged, aDesc);
149cdf0e10cSrcweir }
150cdf0e10cSrcweir GetDoc()->ChgPageDesc( i, aDesc );
151cdf0e10cSrcweir EndAllActionAndCall();
152cdf0e10cSrcweir }
153cdf0e10cSrcweir
154cdf0e10cSrcweir /*************************************************************************
155cdf0e10cSrcweir |*
156cdf0e10cSrcweir |* SwFEShell::GetPageDesc(), GetCurPageDesc()
157cdf0e10cSrcweir |*
158cdf0e10cSrcweir |* Ersterstellung MA 25. Jan. 93
159cdf0e10cSrcweir |* Letzte Aenderung MA 23. Apr. 93
160cdf0e10cSrcweir |
161cdf0e10cSrcweir |*************************************************************************/
162cdf0e10cSrcweir
GetPageDesc(sal_uInt16 i) const163cdf0e10cSrcweir const SwPageDesc& SwFEShell::GetPageDesc( sal_uInt16 i ) const
164cdf0e10cSrcweir {
165cdf0e10cSrcweir return const_cast<const SwDoc *>(GetDoc())->GetPageDesc( i );
166cdf0e10cSrcweir }
167cdf0e10cSrcweir
FindPageDescByName(const String & rName,sal_Bool bGetFromPool,sal_uInt16 * pPos)168cdf0e10cSrcweir SwPageDesc* SwFEShell::FindPageDescByName( const String& rName,
169cdf0e10cSrcweir sal_Bool bGetFromPool,
170cdf0e10cSrcweir sal_uInt16* pPos )
171cdf0e10cSrcweir {
172cdf0e10cSrcweir SwPageDesc* pDesc = GetDoc()->FindPageDescByName( rName, pPos );
173cdf0e10cSrcweir if( !pDesc && bGetFromPool )
174cdf0e10cSrcweir {
175cdf0e10cSrcweir sal_uInt16 nPoolId = SwStyleNameMapper::GetPoolIdFromUIName( rName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC );
176cdf0e10cSrcweir if( USHRT_MAX != nPoolId &&
177cdf0e10cSrcweir 0 != (pDesc = GetDoc()->GetPageDescFromPool( nPoolId ))
178cdf0e10cSrcweir && pPos )
179cdf0e10cSrcweir // werden immer hinten angehaengt
180cdf0e10cSrcweir *pPos = GetDoc()->GetPageDescCnt() - 1 ;
181cdf0e10cSrcweir }
182cdf0e10cSrcweir return pDesc;
183cdf0e10cSrcweir }
184cdf0e10cSrcweir
GetMousePageDesc(const Point & rPt) const185cdf0e10cSrcweir sal_uInt16 SwFEShell::GetMousePageDesc( const Point &rPt ) const
186cdf0e10cSrcweir {
187cdf0e10cSrcweir if( GetLayout() )
188cdf0e10cSrcweir {
189cdf0e10cSrcweir const SwPageFrm* pPage =
190cdf0e10cSrcweir static_cast<const SwPageFrm*>( GetLayout()->Lower() );
191cdf0e10cSrcweir if( pPage )
192cdf0e10cSrcweir {
193cdf0e10cSrcweir while( pPage->GetNext() && rPt.Y() > pPage->Frm().Bottom() )
194cdf0e10cSrcweir pPage = static_cast<const SwPageFrm*>( pPage->GetNext() );
195cdf0e10cSrcweir SwDoc *pMyDoc = GetDoc();
196cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < GetDoc()->GetPageDescCnt(); ++i )
197cdf0e10cSrcweir {
198cdf0e10cSrcweir if ( pPage->GetPageDesc() == &const_cast<const SwDoc *>(pMyDoc)
199cdf0e10cSrcweir ->GetPageDesc(i) )
200cdf0e10cSrcweir return i;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir }
203cdf0e10cSrcweir }
204cdf0e10cSrcweir return 0;
205cdf0e10cSrcweir }
206cdf0e10cSrcweir
GetCurPageDesc(const sal_Bool bCalcFrm) const207cdf0e10cSrcweir sal_uInt16 SwFEShell::GetCurPageDesc( const sal_Bool bCalcFrm ) const
208cdf0e10cSrcweir {
209cdf0e10cSrcweir const SwFrm *pFrm = GetCurrFrm( bCalcFrm );
210cdf0e10cSrcweir if ( pFrm )
211cdf0e10cSrcweir {
212cdf0e10cSrcweir const SwPageFrm *pPage = pFrm->FindPageFrm();
213cdf0e10cSrcweir if ( pPage )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir SwDoc *pMyDoc = GetDoc();
216cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < GetDoc()->GetPageDescCnt(); ++i )
217cdf0e10cSrcweir {
218cdf0e10cSrcweir if ( pPage->GetPageDesc() == &const_cast<const SwDoc *>(pMyDoc)
219cdf0e10cSrcweir ->GetPageDesc(i) )
220cdf0e10cSrcweir return i;
221cdf0e10cSrcweir }
222cdf0e10cSrcweir }
223cdf0e10cSrcweir }
224cdf0e10cSrcweir return 0;
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir // if inside all selection only one PageDesc, return this.
228cdf0e10cSrcweir // Otherwise return 0 pointer
GetSelectedPageDescs() const229cdf0e10cSrcweir const SwPageDesc* SwFEShell::GetSelectedPageDescs() const
230cdf0e10cSrcweir {
231cdf0e10cSrcweir const SwCntntNode* pCNd;
232cdf0e10cSrcweir const SwFrm* pMkFrm, *pPtFrm;
233cdf0e10cSrcweir const SwPageDesc* pFnd, *pRetDesc = (SwPageDesc*)0xffffffff;
234cdf0e10cSrcweir const Point aNulPt;
235cdf0e10cSrcweir
236cdf0e10cSrcweir FOREACHPAM_START(this)
237cdf0e10cSrcweir
238cdf0e10cSrcweir if( 0 != (pCNd = PCURCRSR->GetCntntNode() ) &&
239cdf0e10cSrcweir 0 != ( pPtFrm = pCNd->getLayoutFrm( GetLayout(), &aNulPt, 0, sal_False )) )
240cdf0e10cSrcweir pPtFrm = pPtFrm->FindPageFrm();
241cdf0e10cSrcweir else
242cdf0e10cSrcweir pPtFrm = 0;
243cdf0e10cSrcweir
244cdf0e10cSrcweir if( PCURCRSR->HasMark() &&
245cdf0e10cSrcweir 0 != (pCNd = PCURCRSR->GetCntntNode( sal_False ) ) &&
246cdf0e10cSrcweir 0 != ( pMkFrm = pCNd->getLayoutFrm( GetLayout(), &aNulPt, 0, sal_False )) )
247cdf0e10cSrcweir pMkFrm = pMkFrm->FindPageFrm();
248cdf0e10cSrcweir else
249cdf0e10cSrcweir pMkFrm = pPtFrm;
250cdf0e10cSrcweir
251cdf0e10cSrcweir
252cdf0e10cSrcweir if( !pMkFrm || !pPtFrm )
253cdf0e10cSrcweir pFnd = 0;
254cdf0e10cSrcweir else if( pMkFrm == pPtFrm )
255cdf0e10cSrcweir pFnd = ((SwPageFrm*)pMkFrm)->GetPageDesc();
256cdf0e10cSrcweir else
257cdf0e10cSrcweir {
258cdf0e10cSrcweir // swap pointer if PtFrm before MkFrm
259cdf0e10cSrcweir if( ((SwPageFrm*)pMkFrm)->GetPhyPageNum() >
260cdf0e10cSrcweir ((SwPageFrm*)pPtFrm)->GetPhyPageNum() )
261cdf0e10cSrcweir {
262cdf0e10cSrcweir const SwFrm* pTmp = pMkFrm; pMkFrm = pPtFrm; pPtFrm = pTmp;
263cdf0e10cSrcweir }
264cdf0e10cSrcweir
265cdf0e10cSrcweir // now check from MkFrm to PtFrm for equal PageDescs
266cdf0e10cSrcweir pFnd = ((SwPageFrm*)pMkFrm)->GetPageDesc();
267cdf0e10cSrcweir while( pFnd && pMkFrm != pPtFrm )
268cdf0e10cSrcweir {
269cdf0e10cSrcweir pMkFrm = pMkFrm->GetNext();
270cdf0e10cSrcweir if( !pMkFrm || pFnd != ((SwPageFrm*)pMkFrm)->GetPageDesc() )
271cdf0e10cSrcweir pFnd = 0;
272cdf0e10cSrcweir }
273cdf0e10cSrcweir }
274cdf0e10cSrcweir
275cdf0e10cSrcweir if( (SwPageDesc*)0xffffffff == pRetDesc )
276cdf0e10cSrcweir pRetDesc = pFnd;
277cdf0e10cSrcweir else if( pFnd != pRetDesc )
278cdf0e10cSrcweir {
279cdf0e10cSrcweir pRetDesc = 0;
280cdf0e10cSrcweir break;
281cdf0e10cSrcweir }
282cdf0e10cSrcweir
283cdf0e10cSrcweir FOREACHPAM_END()
284cdf0e10cSrcweir
285cdf0e10cSrcweir return pRetDesc;
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
288cdf0e10cSrcweir
289cdf0e10cSrcweir
290