xref: /aoo41x/main/sw/source/core/frmedt/fedesc.cxx (revision efeef26f)
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