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