xref: /aoo41x/main/svx/source/dialog/hdft.cxx (revision f6e50924)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 // include ---------------------------------------------------------------
28 #include <tools/shl.hxx>
29 #include <svl/itemiter.hxx>
30 #include <sfx2/app.hxx>
31 #include <sfx2/objsh.hxx>
32 #include <sfx2/module.hxx>
33 #include <vcl/msgbox.hxx>
34 #include <vcl/graph.hxx>
35 
36 #include <sfx2/sfxsids.hrc>
37 #include <svx/svxids.hrc>
38 #include <svx/dialogs.hrc>
39 #include "hdft.hrc"
40 #include <svl/intitem.hxx>
41 
42 #define _SVX_HDFT_CXX
43 
44 #include <svx/hdft.hxx>
45 #include <svx/pageitem.hxx>
46 //CHINA001 #include "bbdlg.hxx"
47 #include "svx/dlgutil.hxx"
48 #include <svx/dialmgr.hxx>
49 #include "svx/htmlmode.hxx"
50 
51 #include <editeng/brshitem.hxx>
52 #include <editeng/lrspitem.hxx>
53 #include <editeng/ulspitem.hxx>
54 #include <editeng/shaditem.hxx>
55 #include <editeng/sizeitem.hxx>
56 #include <editeng/boxitem.hxx>
57 
58 #include <svx/svxdlg.hxx> //CHINA001
59 #include <svx/dialogs.hrc> //CHINA001
60 // static ----------------------------------------------------------------
61 
62 // --> OD 2004-06-18 #i19922#
63 //static const long MINBODY = 284;            // 0,5cm in twips aufgerundet
64 static const long MINBODY = 56;  // 1mm in twips rounded
65 
66 // default distance to Header or footer
67 static const long DEF_DIST_WRITER = 500;	// 5mm (Writer)
68 static const long DEF_DIST_CALC = 250;		// 2,5mm (Calc)
69 
70 static sal_uInt16 pRanges[] =
71 {
72 	SID_ATTR_BRUSH,			 SID_ATTR_BRUSH,
73 	SID_ATTR_BORDER_OUTER,	 SID_ATTR_BORDER_OUTER,
74 	SID_ATTR_BORDER_INNER,	 SID_ATTR_BORDER_INNER,
75 	SID_ATTR_BORDER_SHADOW,	 SID_ATTR_BORDER_SHADOW,
76 	SID_ATTR_LRSPACE,		 SID_ATTR_LRSPACE,
77 	SID_ATTR_ULSPACE,		 SID_ATTR_ULSPACE,
78 	SID_ATTR_PAGE_SIZE,		 SID_ATTR_PAGE_SIZE,
79 	SID_ATTR_PAGE_HEADERSET, SID_ATTR_PAGE_HEADERSET,
80 	SID_ATTR_PAGE_FOOTERSET, SID_ATTR_PAGE_FOOTERSET,
81 	SID_ATTR_PAGE_ON,		 SID_ATTR_PAGE_ON,
82 	SID_ATTR_PAGE_DYNAMIC,	 SID_ATTR_PAGE_DYNAMIC,
83 	SID_ATTR_PAGE_SHARED,	 SID_ATTR_PAGE_SHARED,
84     SID_ATTR_HDFT_DYNAMIC_SPACING, SID_ATTR_HDFT_DYNAMIC_SPACING,
85 	0
86 };
87 
88 /*--------------------------------------------------------------------
89 	Beschreibung:
90  --------------------------------------------------------------------*/
91 
92 // gibt den Bereich der Which-Werte zurueck
93 
94 
95 sal_uInt16* SvxHeaderPage::GetRanges()
96 {
97 	return pRanges;
98 }
99 
100 //------------------------------------------------------------------------
101 
102 SfxTabPage* SvxHeaderPage::Create( Window* pParent, const SfxItemSet& rSet )
103 {
104 	return new SvxHeaderPage( pParent, rSet );
105 }
106 
107 //------------------------------------------------------------------------
108 
109 sal_uInt16* SvxFooterPage::GetRanges()
110 {
111 	return pRanges;
112 }
113 
114 // -----------------------------------------------------------------------
115 
116 SfxTabPage* SvxFooterPage::Create( Window* pParent, const SfxItemSet& rSet )
117 {
118 	return new SvxFooterPage( pParent, rSet );
119 }
120 
121 // -----------------------------------------------------------------------
122 
123 SvxHeaderPage::SvxHeaderPage( Window* pParent, const SfxItemSet& rAttr ) :
124 
125 	SvxHFPage( pParent, RID_SVXPAGE_HEADER, rAttr, SID_ATTR_PAGE_HEADERSET )
126 
127 {
128 }
129 
130 // -----------------------------------------------------------------------
131 
132 SvxFooterPage::SvxFooterPage( Window* pParent, const SfxItemSet& rAttr ) :
133 
134 	SvxHFPage( pParent, RID_SVXPAGE_FOOTER, rAttr, SID_ATTR_PAGE_FOOTERSET )
135 
136 {
137 }
138 
139 // -----------------------------------------------------------------------
140 
141 SvxHFPage::SvxHFPage( Window* pParent, sal_uInt16 nResId, const SfxItemSet& rAttr, sal_uInt16 nSetId ) :
142 
143 	SfxTabPage( pParent, SVX_RES( nResId ), rAttr ),
144 
145     aFrm            ( this, SVX_RES( FL_FRAME ) ),
146 	aTurnOnBox		( this, SVX_RES( CB_TURNON ) ),
147     aCntSharedBox   ( this, SVX_RES( CB_SHARED ) ),
148     aLMLbl          ( this, SVX_RES( FT_LMARGIN ) ),
149     aLMEdit         ( this, SVX_RES( ED_LMARGIN ) ),
150     aRMLbl          ( this, SVX_RES( FT_RMARGIN ) ),
151     aRMEdit         ( this, SVX_RES( ED_RMARGIN ) ),
152     aDistFT         ( this, SVX_RES( FT_DIST ) ),
153 	aDistEdit		( this, SVX_RES( ED_DIST ) ),
154     aDynSpacingCB   ( this, SVX_RES( CB_DYNSPACING ) ),
155     aHeightFT       ( this, SVX_RES( FT_HEIGHT ) ),
156 	aHeightEdit		( this, SVX_RES( ED_HEIGHT ) ),
157 	aHeightDynBtn	( this, SVX_RES( CB_HEIGHT_DYN ) ),
158 	aBspWin			( this, SVX_RES( WN_BSP ) ),
159 	aBackgroundBtn	( this, SVX_RES( BTN_EXTRAS ) ),
160 
161     nId                         ( nSetId ),
162     pBBSet                      ( NULL ),
163     bDisableQueryBox            ( sal_False ),
164 	bEnableBackgroundSelector	( sal_True )
165 
166 {
167 	InitHandler();
168     aBspWin.EnableRTL( sal_False );
169 
170 	// diese Page braucht ExchangeSupport
171 	SetExchangeSupport();
172 
173 	FreeResource();
174 
175 	// Metrik einstellen
176 	FieldUnit eFUnit = GetModuleFieldUnit( rAttr );
177 	SetFieldUnit( aDistEdit, eFUnit );
178 	SetFieldUnit( aHeightEdit, eFUnit );
179 	SetFieldUnit( aLMEdit, eFUnit );
180 	SetFieldUnit( aRMEdit, eFUnit );
181 
182 	aTurnOnBox.SetAccessibleRelationMemberOf( &aFrm );
183 	aCntSharedBox.SetAccessibleRelationMemberOf( &aFrm );
184 	aLMLbl.SetAccessibleRelationMemberOf( &aFrm );
185 	aLMEdit.SetAccessibleRelationMemberOf( &aFrm );
186 	aRMLbl.SetAccessibleRelationMemberOf( &aFrm );
187 	aRMEdit.SetAccessibleRelationMemberOf( &aFrm );
188 	aDistFT.SetAccessibleRelationMemberOf( &aFrm );
189 	aDistEdit.SetAccessibleRelationMemberOf( &aFrm );
190 	aDynSpacingCB.SetAccessibleRelationMemberOf( &aFrm );
191 	aHeightFT.SetAccessibleRelationMemberOf( &aFrm );
192 	aHeightEdit.SetAccessibleRelationMemberOf( &aFrm );
193 	aHeightDynBtn.SetAccessibleRelationMemberOf( &aFrm );
194 	aBackgroundBtn.SetAccessibleRelationMemberOf(&aFrm);
195 }
196 
197 // -----------------------------------------------------------------------
198 
199 SvxHFPage::~SvxHFPage()
200 {
201 	delete pBBSet;
202 }
203 
204 // -----------------------------------------------------------------------
205 
206 sal_Bool SvxHFPage::FillItemSet( SfxItemSet& rSet )
207 {
208 	const sal_uInt16		nWSize		= GetWhich( SID_ATTR_PAGE_SIZE );
209 	const sal_uInt16		nWLRSpace	= GetWhich( SID_ATTR_LRSPACE );
210 	const sal_uInt16		nWULSpace	= GetWhich( SID_ATTR_ULSPACE );
211 	const sal_uInt16		nWOn		= GetWhich( SID_ATTR_PAGE_ON );
212 	const sal_uInt16		nWDynamic	= GetWhich( SID_ATTR_PAGE_DYNAMIC );
213     const sal_uInt16        nWDynSpacing = GetWhich( SID_ATTR_HDFT_DYNAMIC_SPACING );
214 	const sal_uInt16		nWShared	= GetWhich( SID_ATTR_PAGE_SHARED );
215 	const sal_uInt16		nWBrush		= GetWhich( SID_ATTR_BRUSH );
216 	const sal_uInt16		nWBox		= GetWhich( SID_ATTR_BORDER_OUTER );
217 	const sal_uInt16		nWBoxInfo	= GetWhich( SID_ATTR_BORDER_INNER );
218 	const sal_uInt16		nWShadow	= GetWhich( SID_ATTR_BORDER_SHADOW );
219 	const sal_uInt16		aWhichTab[] = { nWSize,		nWSize,
220 										nWLRSpace,	nWLRSpace,
221 										nWULSpace,	nWULSpace,
222 										nWOn,		nWOn,
223 										nWDynamic,	nWDynamic,
224 										nWShared,	nWShared,
225 										nWBrush,	nWBrush,
226 										nWBoxInfo,	nWBoxInfo,
227 										nWBox,		nWBox,
228 										nWShadow,	nWShadow,
229                                         nWDynSpacing, nWDynSpacing,
230 										0 };
231 	const SfxItemSet&	rOldSet		= GetItemSet();
232 	SfxItemPool*		pPool		= rOldSet.GetPool();
233 	DBG_ASSERT( pPool, "no pool :-(" );
234 	SfxMapUnit			eUnit		= pPool->GetMetric( nWSize );
235 	SfxItemSet			aSet		( *pPool, aWhichTab );
236 
237 	//--------------------------------------------------------------------
238 
239 	aSet.Put( SfxBoolItem( nWOn,	  aTurnOnBox.IsChecked() ) );
240 	aSet.Put( SfxBoolItem( nWDynamic, aHeightDynBtn.IsChecked() ) );
241 	aSet.Put( SfxBoolItem( nWShared,  aCntSharedBox.IsChecked() ) );
242     if(aDynSpacingCB.IsVisible() && SFX_WHICH_MAX > nWDynSpacing)
243     {
244         SfxBoolItem* pBoolItem = (SfxBoolItem*)pPool->GetDefaultItem(nWDynSpacing).Clone();
245         pBoolItem->SetValue(aDynSpacingCB.IsChecked());
246         aSet.Put(*pBoolItem);
247         delete pBoolItem;
248     }
249 
250 	// Groesse
251 	SvxSizeItem aSizeItem( (const SvxSizeItem&)rOldSet.Get( nWSize ) );
252 	Size		aSize( aSizeItem.GetSize() );
253 	long		nDist = GetCoreValue( aDistEdit, eUnit );
254 	long		nH	  = GetCoreValue( aHeightEdit, eUnit );
255 
256 	// fixe Hoehe?
257 //	if ( !aHeightDynBtn.IsChecked() )
258 		nH += nDist; // dann Abstand dazu addieren
259 	aSize.Height() = nH;
260 	aSizeItem.SetSize( aSize );
261 	aSet.Put( aSizeItem );
262 
263 	// Raender
264 	SvxLRSpaceItem aLR( nWLRSpace );
265 	aLR.SetLeft( (sal_uInt16)GetCoreValue( aLMEdit, eUnit ) );
266 	aLR.SetRight( (sal_uInt16)GetCoreValue( aRMEdit, eUnit ) );
267 	aSet.Put( aLR );
268 
269 	SvxULSpaceItem aUL( nWULSpace );
270 	if ( nId == SID_ATTR_PAGE_HEADERSET )
271 		aUL.SetLower( (sal_uInt16)nDist );
272 	else
273 		aUL.SetUpper( (sal_uInt16)nDist );
274 	aSet.Put( aUL );
275 
276 	// Hintergrund und Umrandung?
277 	if ( pBBSet )
278 		aSet.Put( *pBBSet );
279 	else
280 	{
281         const SfxItemSet* _pSet;
282 		const SfxPoolItem* pItem;
283 
284 		if ( SFX_ITEM_SET ==
285 			 GetItemSet().GetItemState( GetWhich( nId ), sal_False, &pItem ) )
286 		{
287             _pSet = &( (SvxSetItem*)pItem )->GetItemSet();
288 
289             if ( _pSet->GetItemState( nWBrush ) == SFX_ITEM_SET )
290                 aSet.Put( (const SvxBrushItem&)_pSet->Get( nWBrush ) );
291             if ( _pSet->GetItemState( nWBoxInfo ) == SFX_ITEM_SET )
292                 aSet.Put( (const SvxBoxInfoItem&)_pSet->Get( nWBoxInfo ) );
293             if ( _pSet->GetItemState( nWBox ) == SFX_ITEM_SET )
294                 aSet.Put( (const SvxBoxItem&)_pSet->Get( nWBox ) );
295             if ( _pSet->GetItemState( nWShadow ) == SFX_ITEM_SET )
296                 aSet.Put( (const SvxShadowItem&)_pSet->Get( nWShadow ) );
297 		}
298 	}
299 
300 	// Das SetItem wegschreiben
301 	SvxSetItem aSetItem( GetWhich( nId ), aSet );
302 	rSet.Put( aSetItem );
303 
304 	return sal_True;
305 }
306 
307 // -----------------------------------------------------------------------
308 void SvxHFPage::Reset( const SfxItemSet& rSet )
309 {
310 	ActivatePage( rSet );
311 	ResetBackground_Impl( rSet );
312 
313 	SfxItemPool* pPool = GetItemSet().GetPool();
314 	DBG_ASSERT( pPool, "Wo ist der Pool" );
315 	SfxMapUnit eUnit = pPool->GetMetric( GetWhich( SID_ATTR_PAGE_SIZE ) );
316 
317 	// Kopf-/Fusszeilen-Attribute auswerten
318 	//
319 	const SvxSetItem* pSetItem = 0;
320 
321 	if ( SFX_ITEM_SET == rSet.GetItemState( GetWhich(nId), sal_False,
322 											(const SfxPoolItem**)&pSetItem ) )
323 	{
324 		const SfxItemSet& rHeaderSet = pSetItem->GetItemSet();
325 		const SfxBoolItem& rHeaderOn =
326 			(const SfxBoolItem&)rHeaderSet.Get(GetWhich(SID_ATTR_PAGE_ON));
327 
328 		aTurnOnBox.Check(rHeaderOn.GetValue());
329 
330 		if ( rHeaderOn.GetValue() )
331 		{
332 			const SfxBoolItem& rDynamic =
333 				(const SfxBoolItem&)rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_DYNAMIC ) );
334 			const SfxBoolItem& rShared =
335 				(const SfxBoolItem&)rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_SHARED ) );
336 			const SvxSizeItem& rSize =
337 				(const SvxSizeItem&)rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_SIZE ) );
338 			const SvxULSpaceItem& rUL =
339 				(const SvxULSpaceItem&)rHeaderSet.Get( GetWhich( SID_ATTR_ULSPACE ) );
340 			const SvxLRSpaceItem& rLR =
341 				(const SvxLRSpaceItem&)rHeaderSet.Get( GetWhich( SID_ATTR_LRSPACE ) );
342             if(aDynSpacingCB.IsVisible())
343             {
344                 const SfxBoolItem& rDynSpacing =
345                     (const SfxBoolItem&)rHeaderSet.Get(GetWhich(SID_ATTR_HDFT_DYNAMIC_SPACING));
346                 aDynSpacingCB.Check(rDynSpacing.GetValue());
347             }
348 
349 
350             if ( nId == SID_ATTR_PAGE_HEADERSET )
351 			{	// Kopfzeile
352 				SetMetricValue( aDistEdit, rUL.GetLower(), eUnit );
353 				SetMetricValue( aHeightEdit, rSize.GetSize().Height() - rUL.GetLower(), eUnit );
354 			}
355 			else
356 			{	// Fusszeile
357 				SetMetricValue( aDistEdit, rUL.GetUpper(), eUnit );
358 				SetMetricValue( aHeightEdit, rSize.GetSize().Height() - rUL.GetUpper(), eUnit );
359 			}
360 
361 			aHeightDynBtn.Check(rDynamic.GetValue());
362 			SetMetricValue( aLMEdit, rLR.GetLeft(), eUnit );
363 			SetMetricValue( aRMEdit, rLR.GetRight(), eUnit );
364 			aCntSharedBox.Check(rShared.GetValue());
365 		}
366 		else
367 			pSetItem = 0;
368 	}
369 	else
370 	{
371 		// defaults for distance and height
372 		long nDefaultDist = DEF_DIST_WRITER;
373 		const SfxPoolItem* pExt1 = GetItem( rSet, SID_ATTR_PAGE_EXT1 );
374 		const SfxPoolItem* pExt2 = GetItem( rSet, SID_ATTR_PAGE_EXT2 );
375 
376 		if ( pExt1 && pExt1->ISA(SfxBoolItem) && pExt2 && pExt2->ISA(SfxBoolItem) )
377 			nDefaultDist = DEF_DIST_CALC;
378 
379 		SetMetricValue( aDistEdit, nDefaultDist, SFX_MAPUNIT_100TH_MM );
380 		SetMetricValue( aHeightEdit, 500, SFX_MAPUNIT_100TH_MM );
381 	}
382 
383 	if ( !pSetItem )
384 	{
385 		aTurnOnBox.Check( sal_False );
386 		aHeightDynBtn.Check( sal_True );
387 		aCntSharedBox.Check( sal_True );
388 	}
389 
390 	TurnOnHdl(0);
391 
392 	aTurnOnBox.SaveValue();
393 	aDistEdit.SaveValue();
394 	aHeightEdit.SaveValue();
395 	aHeightDynBtn.SaveValue();
396 	aLMEdit.SaveValue();
397 	aRMEdit.SaveValue();
398 	aCntSharedBox.SaveValue();
399 	RangeHdl( 0 );
400 
401 	sal_uInt16 nHtmlMode = 0;
402 	const SfxPoolItem* pItem = 0;
403 	SfxObjectShell* pShell;
404 	if(SFX_ITEM_SET == rSet.GetItemState(SID_HTML_MODE, sal_False, &pItem) ||
405 		( 0 != (pShell = SfxObjectShell::Current()) &&
406 					0 != (pItem = pShell->GetItem(SID_HTML_MODE))))
407 	{
408 		nHtmlMode = ((SfxUInt16Item*)pItem)->GetValue();
409 		if(nHtmlMode && HTMLMODE_ON)
410 		{
411 			aCntSharedBox.Hide();
412 			aBackgroundBtn.Hide();
413 		}
414 	}
415 
416 }
417 
418 /*--------------------------------------------------------------------
419 	Beschreibung:	Handler initialisieren
420  --------------------------------------------------------------------*/
421 
422 void SvxHFPage::InitHandler()
423 {
424 	aTurnOnBox.SetClickHdl(LINK(this, 	SvxHFPage, TurnOnHdl));
425 	aDistEdit.SetModifyHdl(LINK(this, 	SvxHFPage, DistModify));
426 	aDistEdit.SetLoseFocusHdl(LINK(this, SvxHFPage, RangeHdl));
427 
428 	aHeightEdit.SetModifyHdl(LINK(this, 	SvxHFPage, HeightModify));
429 	aHeightEdit.SetLoseFocusHdl(LINK(this,SvxHFPage,RangeHdl));
430 
431 	aLMEdit.SetModifyHdl(LINK(this, 		SvxHFPage, BorderModify));
432 	aLMEdit.SetLoseFocusHdl(LINK(this,	SvxHFPage, RangeHdl));
433 	aRMEdit.SetModifyHdl(LINK(this, 		SvxHFPage, BorderModify));
434 	aRMEdit.SetLoseFocusHdl(LINK(this,	SvxHFPage, RangeHdl));
435 	aBackgroundBtn.SetClickHdl(LINK(this,SvxHFPage, BackgroundHdl));
436 }
437 
438 /*--------------------------------------------------------------------
439 	Beschreibung:	Ein/aus
440  --------------------------------------------------------------------*/
441 
442 IMPL_LINK( SvxHFPage, TurnOnHdl, CheckBox *, pBox )
443 {
444 	if ( aTurnOnBox.IsChecked() )
445 	{
446 		aDistFT.Enable();
447 		aDistEdit.Enable();
448         aDynSpacingCB.Enable();
449 		aHeightFT.Enable();
450 		aHeightEdit.Enable();
451 		aHeightDynBtn.Enable();
452 		aLMLbl.Enable();
453 		aLMEdit.Enable();
454 		aRMLbl.Enable();
455 		aRMEdit.Enable();
456 
457 		sal_uInt16 nUsage = aBspWin.GetUsage();
458 
459 		if( nUsage == SVX_PAGE_RIGHT || nUsage == SVX_PAGE_LEFT )
460 			aCntSharedBox.Disable();
461 		else
462 			aCntSharedBox.Enable();
463 		aBackgroundBtn.Enable();
464 	}
465 	else
466 	{
467 		sal_Bool bDelete = sal_True;
468 
469 		if ( !bDisableQueryBox && pBox && aTurnOnBox.GetSavedValue() == sal_True )
470 			bDelete = ( QueryBox( this, SVX_RES( RID_SVXQBX_DELETE_HEADFOOT ) ).Execute() == RET_YES );
471 
472 		if ( bDelete )
473 		{
474 			aDistFT.Disable();
475 			aDistEdit.Disable();
476             aDynSpacingCB.Enable(sal_False);
477             aHeightFT.Disable();
478 			aHeightEdit.Disable();
479 			aHeightDynBtn.Disable();
480 
481 			aLMLbl.Disable();
482 			aLMEdit.Disable();
483 			aRMLbl.Disable();
484 			aRMEdit.Disable();
485 
486 			aCntSharedBox.Disable();
487 			aBackgroundBtn.Disable();
488 		}
489 		else
490 			aTurnOnBox.Check();
491 	}
492 	UpdateExample();
493 	return 0;
494 }
495 
496 /*--------------------------------------------------------------------
497 	Beschreibung:	Abstand im Bsp Modifizieren
498  --------------------------------------------------------------------*/
499 
500 IMPL_LINK_INLINE_START( SvxHFPage, DistModify, MetricField *, EMPTYARG )
501 {
502 	UpdateExample();
503 	return 0;
504 }
505 IMPL_LINK_INLINE_END( SvxHFPage, DistModify, MetricField *, EMPTYARG )
506 
507 IMPL_LINK_INLINE_START( SvxHFPage, HeightModify, MetricField *, EMPTYARG )
508 {
509 	UpdateExample();
510 
511 	return 0;
512 }
513 IMPL_LINK_INLINE_END( SvxHFPage, HeightModify, MetricField *, EMPTYARG )
514 
515 /*--------------------------------------------------------------------
516 	Beschreibung: Raender einstellen
517  --------------------------------------------------------------------*/
518 
519 IMPL_LINK_INLINE_START( SvxHFPage, BorderModify, MetricField *, EMPTYARG )
520 {
521 	UpdateExample();
522 	return 0;
523 }
524 IMPL_LINK_INLINE_END( SvxHFPage, BorderModify, MetricField *, EMPTYARG )
525 
526 /*--------------------------------------------------------------------
527 	Beschreibung:	Hintergrund
528  --------------------------------------------------------------------*/
529 
530 IMPL_LINK( SvxHFPage, BackgroundHdl, Button *, EMPTYARG )
531 {
532 	if ( !pBBSet )
533 	{
534 		// nur die n"otigen Items f"uer Umrandung und Hintergrund benutzen
535 		sal_uInt16 nBrush = GetWhich( SID_ATTR_BRUSH );
536 		sal_uInt16 nOuter = GetWhich( SID_ATTR_BORDER_OUTER );
537 		sal_uInt16 nInner = GetWhich( SID_ATTR_BORDER_INNER, sal_False );
538 		sal_uInt16 nShadow = GetWhich( SID_ATTR_BORDER_SHADOW );
539 
540 		// einen leeren Set erzeugenc
541 		pBBSet = new SfxItemSet( *GetItemSet().GetPool(), nBrush, nBrush,
542 								 nOuter, nOuter, nInner, nInner,
543 								 nShadow, nShadow, 0 );
544 		const SfxPoolItem* pItem;
545 
546 		if ( SFX_ITEM_SET ==
547 			 GetItemSet().GetItemState( GetWhich( nId ), sal_False, &pItem ) )
548 			// wenn es schon einen gesetzen Set gibt, dann diesen benutzen
549 			pBBSet->Put( ( (SvxSetItem*)pItem)->GetItemSet() );
550 
551 		if ( SFX_ITEM_SET ==
552 			 GetItemSet().GetItemState( nInner, sal_False, &pItem ) )
553 			// das gesetze InfoItem wird immer ben"otigt
554 			pBBSet->Put( *pItem );
555 	}
556 
557 	//CHINA001 SvxBorderBackgroundDlg* pDlg =
558 //CHINA001 		new SvxBorderBackgroundDlg( this, *pBBSet, bEnableBackgroundSelector );
559 	SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
560 	if(pFact)
561 	{
562 		SfxAbstractTabDialog* pDlg = pFact->CreateSvxBorderBackgroundDlg( this, *pBBSet, bEnableBackgroundSelector );
563 		DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
564 		if ( pDlg->Execute() == RET_OK && pDlg->GetOutputItemSet() )
565 		{
566 			SfxItemIter aIter( *pDlg->GetOutputItemSet() );
567 			const SfxPoolItem* pItem = aIter.FirstItem();
568 
569 			while ( pItem )
570 			{
571 				if ( !IsInvalidItem( pItem ) )
572 					pBBSet->Put( *pItem );
573 				pItem = aIter.NextItem();
574 			}
575 
576 			//----------------------------------------------------------------
577 
578 			sal_uInt16 nWhich = GetWhich( SID_ATTR_BRUSH );
579 
580 			if ( pBBSet->GetItemState( nWhich ) == SFX_ITEM_SET )
581 			{
582 				const SvxBrushItem& rItem = (const SvxBrushItem&)pBBSet->Get( nWhich );
583 				if ( nId == SID_ATTR_PAGE_HEADERSET )
584 					aBspWin.SetHdColor( rItem.GetColor() );
585 				else
586 					aBspWin.SetFtColor( rItem.GetColor() );
587 			}
588 
589 			//----------------------------------------------------------------
590 
591 			nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
592 
593 			if ( pBBSet->GetItemState( nWhich ) == SFX_ITEM_SET )
594 			{
595 				const SvxBoxItem& rItem = (const SvxBoxItem&)pBBSet->Get( nWhich );
596 
597 				if ( nId == SID_ATTR_PAGE_HEADERSET )
598 					aBspWin.SetHdBorder( rItem );
599 				else
600 					aBspWin.SetFtBorder( rItem );
601 			}
602 
603 			UpdateExample();
604 		}
605 	delete pDlg;
606 	}
607 	return 0;
608 }
609 
610 /*--------------------------------------------------------------------
611 	Beschreibung:	Bsp
612  --------------------------------------------------------------------*/
613 
614 void SvxHFPage::UpdateExample()
615 {
616 	if ( nId == SID_ATTR_PAGE_HEADERSET )
617 	{
618 		aBspWin.SetHeader( aTurnOnBox.IsChecked() );
619 		aBspWin.SetHdHeight( GetCoreValue( aHeightEdit, SFX_MAPUNIT_TWIP ) );
620 		aBspWin.SetHdDist( GetCoreValue( aDistEdit, SFX_MAPUNIT_TWIP ) );
621 		aBspWin.SetHdLeft( GetCoreValue( aLMEdit, SFX_MAPUNIT_TWIP ) );
622 		aBspWin.SetHdRight( GetCoreValue( aRMEdit, SFX_MAPUNIT_TWIP ) );
623 	}
624 	else
625 	{
626 		aBspWin.SetFooter( aTurnOnBox.IsChecked() );
627 		aBspWin.SetFtHeight( GetCoreValue( aHeightEdit, SFX_MAPUNIT_TWIP ) );
628 		aBspWin.SetFtDist( GetCoreValue( aDistEdit, SFX_MAPUNIT_TWIP ) );
629 		aBspWin.SetFtLeft( GetCoreValue( aLMEdit, SFX_MAPUNIT_TWIP ) );
630 		aBspWin.SetFtRight( GetCoreValue( aRMEdit, SFX_MAPUNIT_TWIP ) );
631 	}
632 	aBspWin.Invalidate();
633 }
634 
635 /*--------------------------------------------------------------------
636 	Beschreibung: Hintergrund im Beispiel setzen
637  --------------------------------------------------------------------*/
638 
639 void SvxHFPage::ResetBackground_Impl( const SfxItemSet& rSet )
640 {
641 	sal_uInt16 nWhich = GetWhich( SID_ATTR_PAGE_HEADERSET );
642 
643 	if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
644 	{
645 		const SvxSetItem& rSetItem =
646 			(const SvxSetItem&)rSet.Get( nWhich, sal_False );
647 		const SfxItemSet& rTmpSet = rSetItem.GetItemSet();
648 		const SfxBoolItem& rOn =
649 			(const SfxBoolItem&)rTmpSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
650 
651 		if ( rOn.GetValue() )
652 		{
653 			nWhich = GetWhich( SID_ATTR_BRUSH );
654 
655 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
656 			{
657 				const SvxBrushItem& rItem = (const SvxBrushItem&)rTmpSet.Get( nWhich );
658 				aBspWin.SetHdColor( rItem.GetColor() );
659 			}
660 			nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
661 
662 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
663 			{
664 				const SvxBoxItem& rItem =
665 					(const SvxBoxItem&)rTmpSet.Get( nWhich );
666 				aBspWin.SetHdBorder( rItem );
667 			}
668 		}
669 	}
670 
671 	nWhich = GetWhich( SID_ATTR_PAGE_FOOTERSET );
672 
673 	if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
674 	{
675 		const SvxSetItem& rSetItem =
676 			(const SvxSetItem&)rSet.Get( nWhich, sal_False );
677 		const SfxItemSet& rTmpSet = rSetItem.GetItemSet();
678 		const SfxBoolItem& rOn =
679 			(const SfxBoolItem&)rTmpSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
680 
681 		if ( rOn.GetValue() )
682 		{
683 			nWhich = GetWhich( SID_ATTR_BRUSH );
684 
685 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
686 			{
687 				const SvxBrushItem& rItem = (const SvxBrushItem&)rTmpSet.Get( nWhich );
688 				aBspWin.SetFtColor( rItem.GetColor() );
689 			}
690 			nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
691 
692 			if ( rTmpSet.GetItemState( nWhich ) == SFX_ITEM_SET )
693 			{
694 				const SvxBoxItem& rItem =
695 					(const SvxBoxItem&)rTmpSet.Get( nWhich );
696 				aBspWin.SetFtBorder( rItem );
697 			}
698 		}
699 	}
700 	nWhich = GetWhich( SID_ATTR_BRUSH );
701 
702 	if ( rSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
703 	{
704 		const SvxBrushItem& rItem = (const SvxBrushItem&)rSet.Get( nWhich );
705 		aBspWin.SetColor( rItem.GetColor() );
706 		const Graphic* pGrf = rItem.GetGraphic();
707 
708 		if ( pGrf )
709 		{
710 			Bitmap aBitmap = pGrf->GetBitmap();
711 			aBspWin.SetBitmap( &aBitmap );
712 		}
713 		else
714 			aBspWin.SetBitmap( NULL );
715 	}
716 	nWhich = GetWhich( SID_ATTR_BORDER_OUTER );
717 
718 	if ( rSet.GetItemState( nWhich ) >= SFX_ITEM_AVAILABLE )
719 	{
720 		const SvxBoxItem& rItem = (const SvxBoxItem&)rSet.Get( nWhich );
721 		aBspWin.SetBorder( rItem );
722 	}
723 }
724 
725 /*--------------------------------------------------------------------
726 	Beschreibung:
727  --------------------------------------------------------------------*/
728 
729 void SvxHFPage::ActivatePage( const SfxItemSet& rSet )
730 {
731 	const SfxPoolItem* pItem = GetItem( rSet, SID_ATTR_LRSPACE );
732 
733 	if ( pItem )
734 	{
735 		// linken und rechten Rand einstellen
736 		const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)*pItem;
737 
738 		aBspWin.SetLeft( rLRSpace.GetLeft() );
739 		aBspWin.SetRight( rLRSpace.GetRight() );
740 	}
741 	else
742 	{
743 		aBspWin.SetLeft( 0 );
744 		aBspWin.SetRight( 0 );
745 	}
746 
747 	pItem = GetItem( rSet, SID_ATTR_ULSPACE );
748 
749 	if ( pItem )
750 	{
751 		// oberen und unteren Rand einstellen
752 		const SvxULSpaceItem& rULSpace = (const SvxULSpaceItem&)*pItem;
753 
754 		aBspWin.SetTop( rULSpace.GetUpper() );
755 		aBspWin.SetBottom( rULSpace.GetLower() );
756 	}
757 	else
758 	{
759 		aBspWin.SetTop( 0 );
760 		aBspWin.SetBottom( 0 );
761 	}
762 
763 	sal_uInt16 nUsage = SVX_PAGE_ALL;
764 	pItem = GetItem( rSet, SID_ATTR_PAGE );
765 
766 	if ( pItem )
767 		nUsage = ( (const SvxPageItem*)pItem )->GetPageUsage();
768 
769 	aBspWin.SetUsage( nUsage );
770 
771 	if ( SVX_PAGE_RIGHT == nUsage || SVX_PAGE_LEFT == nUsage )
772 		aCntSharedBox.Disable();
773 	else
774 		aCntSharedBox.Enable();
775 	pItem = GetItem( rSet, SID_ATTR_PAGE_SIZE );
776 
777 	if ( pItem )
778 	{
779 		// Orientation und Size aus dem PageItem
780 		const SvxSizeItem& rSize = (const SvxSizeItem&)*pItem;
781 		// die Groesse ist ggf. schon geswappt (Querformat)
782 		aBspWin.SetSize( rSize.GetSize() );
783 	}
784 
785 	// Kopfzeilen-Attribute auswerten
786 	const SvxSetItem* pSetItem = 0;
787 
788 	if ( SFX_ITEM_SET == rSet.GetItemState( GetWhich( SID_ATTR_PAGE_HEADERSET ),
789 											sal_False,
790 											(const SfxPoolItem**)&pSetItem ) )
791 	{
792 		const SfxItemSet& rHeaderSet = pSetItem->GetItemSet();
793 		const SfxBoolItem& rHeaderOn =
794 			(const SfxBoolItem&)rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
795 
796 		if ( rHeaderOn.GetValue() )
797 		{
798 			const SvxSizeItem& rSize = (const SvxSizeItem&)
799 				rHeaderSet.Get( GetWhich( SID_ATTR_PAGE_SIZE ) );
800 			const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)
801 				rHeaderSet.Get( GetWhich(SID_ATTR_ULSPACE ) );
802 			const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)
803 				rHeaderSet.Get( GetWhich( SID_ATTR_LRSPACE ) );
804 			long nDist = rUL.GetLower();
805 
806 			aBspWin.SetHdHeight( rSize.GetSize().Height() - nDist );
807 			aBspWin.SetHdDist( nDist );
808 			aBspWin.SetHdLeft( rLR.GetLeft() );
809 			aBspWin.SetHdRight( rLR.GetRight() );
810 			aBspWin.SetHeader( sal_True );
811 		}
812 		else
813 			pSetItem = 0;
814 	}
815 
816 	if ( !pSetItem )
817 	{
818 		aBspWin.SetHeader( sal_False );
819 
820 		if ( SID_ATTR_PAGE_HEADERSET == nId )
821 			aCntSharedBox.Disable();
822 	}
823 	pSetItem = 0;
824 
825 	if ( SFX_ITEM_SET == rSet.GetItemState( GetWhich( SID_ATTR_PAGE_FOOTERSET ),
826 											sal_False,
827 											(const SfxPoolItem**)&pSetItem ) )
828 	{
829 		const SfxItemSet& rFooterSet = pSetItem->GetItemSet();
830 		const SfxBoolItem& rFooterOn =
831 			(const SfxBoolItem&)rFooterSet.Get( GetWhich( SID_ATTR_PAGE_ON ) );
832 
833 		if ( rFooterOn.GetValue() )
834 		{
835 			const SvxSizeItem& rSize = (const SvxSizeItem&)
836 				rFooterSet.Get( GetWhich( SID_ATTR_PAGE_SIZE ) );
837 			const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)
838 				rFooterSet.Get( GetWhich( SID_ATTR_ULSPACE ) );
839 			const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)
840 				rFooterSet.Get( GetWhich( SID_ATTR_LRSPACE ) );
841 			long nDist = rUL.GetUpper();
842 
843 			aBspWin.SetFtHeight( rSize.GetSize().Height() - nDist );
844 			aBspWin.SetFtDist( nDist );
845 			aBspWin.SetFtLeft( rLR.GetLeft() );
846 			aBspWin.SetFtRight( rLR.GetRight() );
847 			aBspWin.SetFooter( sal_True );
848 		}
849 		else
850 			pSetItem = 0;
851 	}
852 
853 	if ( !pSetItem )
854 	{
855 		aBspWin.SetFooter( sal_False );
856 
857 		if ( SID_ATTR_PAGE_FOOTERSET == nId )
858 			aCntSharedBox.Disable();
859 	}
860 
861 	pItem = GetItem( rSet, SID_ATTR_PAGE_EXT1 );
862 
863 	if ( pItem && pItem->ISA(SfxBoolItem) )
864 	{
865 		aBspWin.SetTable( sal_True );
866 		aBspWin.SetHorz( ( (SfxBoolItem*)pItem )->GetValue() );
867 	}
868 
869 	pItem = GetItem( rSet, SID_ATTR_PAGE_EXT2 );
870 
871 	if ( pItem && pItem->ISA(SfxBoolItem) )
872 	{
873 		aBspWin.SetTable( sal_True );
874 		aBspWin.SetVert( ( (SfxBoolItem*)pItem )->GetValue() );
875 	}
876 	ResetBackground_Impl( rSet );
877 	RangeHdl( 0 );
878 }
879 
880 /*--------------------------------------------------------------------
881 	Beschreibung:
882  --------------------------------------------------------------------*/
883 
884 int SvxHFPage::DeactivatePage( SfxItemSet* _pSet )
885 {
886     if ( _pSet )
887         FillItemSet( *_pSet );
888 	return LEAVE_PAGE;
889 }
890 
891 /*--------------------------------------------------------------------
892 	Beschreibung:	Berech
893  --------------------------------------------------------------------*/
894 
895 IMPL_LINK( SvxHFPage, RangeHdl, Edit *, EMPTYARG )
896 {
897 	long nHHeight = aBspWin.GetHdHeight();
898 	long nHDist   = aBspWin.GetHdDist();
899 
900 	long nFHeight = aBspWin.GetFtHeight();
901 	long nFDist   = aBspWin.GetFtDist();
902 
903 	long nHeight = Max( (long)MINBODY,
904 		static_cast<long>(aHeightEdit.Denormalize( aHeightEdit.GetValue( FUNIT_TWIP ) ) ) );
905 	long nDist   = aTurnOnBox.IsChecked() ?
906 		static_cast<long>(aDistEdit.Denormalize( aDistEdit.GetValue( FUNIT_TWIP ) )) : 0;
907 
908 	long nMin;
909 	long nMax;
910 
911 	if ( nId == SID_ATTR_PAGE_HEADERSET )
912 	{
913 		nHHeight = nHeight;
914 		nHDist   = nDist;
915 	}
916 	else
917 	{
918 		nFHeight = nHeight;
919 		nFDist 	 = nDist;
920 	}
921 
922 	// Aktuelle Werte der Seitenraender
923 	long nBT = aBspWin.GetTop();
924 	long nBB = aBspWin.GetBottom();
925 	long nBL = aBspWin.GetLeft();
926 	long nBR = aBspWin.GetRight();
927 
928 	long nH  = aBspWin.GetSize().Height();
929 	long nW  = aBspWin.GetSize().Width();
930 
931 	// Grenzen
932 	if ( nId == SID_ATTR_PAGE_HEADERSET )
933 	{
934 		// Header
935 		nMin = ( nH - nBB - nBT ) / 5; // 20%
936 		nMax = Max( nH - nMin - nHDist - nFDist - nFHeight - nBB - nBT,
937 					nMin );
938 		aHeightEdit.SetMax( aHeightEdit.Normalize( nMax ), FUNIT_TWIP );
939 		nMin = ( nH - nBB - nBT ) / 5; // 20%
940 		nDist = Max( nH - nMin - nHHeight - nFDist - nFHeight - nBB - nBT,
941 					 long(0) );
942 		aDistEdit.SetMax( aDistEdit.Normalize( nDist ), FUNIT_TWIP );
943 	}
944 	else
945 	{
946 		// Footer
947 		nMin = ( nH - nBT - nBB ) / 5; // 20%
948 		nMax = Max( nH - nMin - nFDist - nHDist - nHHeight - nBT - nBB,
949 					nMin );
950 		aHeightEdit.SetMax( aHeightEdit.Normalize( nMax ), FUNIT_TWIP );
951         nMin = ( nH - nBT - nBB ) / 5; // 20%
952 		nDist = Max( nH - nMin - nFHeight - nHDist - nHHeight - nBT - nBB,
953 					 long(0) );
954 		aDistEdit.SetMax( aDistEdit.Normalize( nDist ), FUNIT_TWIP );
955 	}
956 
957 	// Einzuege beschraenken
958 	nMax = nW - nBL - nBR -
959 		   static_cast<long>(aRMEdit.Denormalize( aRMEdit.GetValue( FUNIT_TWIP ) )) - MINBODY;
960 	aLMEdit.SetMax( aLMEdit.Normalize( nMax ), FUNIT_TWIP );
961 
962 	nMax = nW - nBL - nBR -
963 		   static_cast<long>(aLMEdit.Denormalize( aLMEdit.GetValue( FUNIT_TWIP ) )) - MINBODY;
964 	aRMEdit.SetMax( aLMEdit.Normalize( nMax ), FUNIT_TWIP );
965 	return 0;
966 }
967 /* -----------------------------26.08.2002 12:49------------------------------
968 
969  ---------------------------------------------------------------------------*/
970 void lcl_Move(Window& rWin, sal_Int32 nDiff)
971 {
972 	Point aPos(rWin.GetPosPixel());
973 	aPos.Y() -= nDiff;
974 	rWin.SetPosPixel(aPos);
975 }
976 void SvxHFPage::EnableDynamicSpacing()
977 {
978     aDynSpacingCB.Show();
979     //move all following controls
980     Window* aMoveWindows[] =
981     {
982         &aHeightFT,
983         &aHeightEdit,
984         &aHeightDynBtn,
985         &aBackgroundBtn,
986         0
987     };
988     sal_Int32 nOffset = aTurnOnBox.GetPosPixel().Y() - aCntSharedBox.GetPosPixel().Y();
989     sal_Int32 nIdx = 0;
990     while(aMoveWindows[nIdx])
991         lcl_Move(*aMoveWindows[nIdx++], nOffset);
992 }
993 
994