1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <tools/shl.hxx>
21 #include <sfx2/app.hxx>
22 #include <sfx2/module.hxx>
23 #include <svx/dialogs.hrc>
25 #include "svx/xattr.hxx"
26 #include <svx/xpool.hxx>
28 #include "tabarea.hrc"
29 #include <svx/svdattr.hxx>
30 #include "svx/drawitem.hxx"
31 #include "cuitabarea.hxx"
32 #include <dialmgr.hxx>
33 #include "svx/dlgutil.hxx"
34 #include <cuitabline.hxx>
35 #include "paragrph.hrc"
36 #include <svx/xlineit0.hxx>
37 #include <sfx2/request.hxx>
39 static sal_uInt16 pShadowRanges
[] =
42 SDRATTR_SHADOWTRANSPARENCE
,
48 SvxShadowTabPage::SvxShadowTabPage( Window
* pParent
, const SfxItemSet
& rInAttrs
) :
50 SvxTabPage ( pParent
, CUI_RES( RID_SVXPAGE_SHADOW
), rInAttrs
),
52 aFlProp ( this, CUI_RES( FL_PROP
) ),
53 aTsbShowShadow ( this, CUI_RES( TSB_SHOW_SHADOW
) ),
54 aFtPosition ( this, CUI_RES( FT_POSITION
) ),
55 aCtlPosition ( this, CUI_RES( CTL_POSITION
) ),
56 aFtDistance ( this, CUI_RES( FT_DISTANCE
) ),
57 aMtrDistance ( this, CUI_RES( MTR_FLD_DISTANCE
) ),
58 aFtShadowColor ( this, CUI_RES( FT_SHADOW_COLOR
) ),
59 aLbShadowColor ( this, CUI_RES( LB_SHADOW_COLOR
) ),
60 aFtTransparent ( this, CUI_RES( FT_TRANSPARENT
) ),
61 aMtrTransparent ( this, CUI_RES( MTR_SHADOW_TRANSPARENT
) ),
62 aCtlXRectPreview ( this, CUI_RES( CTL_COLOR_PREVIEW
) ),
63 rOutAttrs ( rInAttrs
),
68 bDisable ( sal_False
),
69 pXPool ( (XOutdevItemPool
*) rInAttrs
.GetPool() ),
70 aXFillAttr ( pXPool
),
71 rXFSet ( aXFillAttr
.GetItemSet() )
75 // this page needs ExchangeSupport
79 FieldUnit eFUnit
= GetModuleFieldUnit( rInAttrs
);
87 default: ;//prevent warning
89 SetFieldUnit( aMtrDistance
, eFUnit
);
92 SfxItemPool
* pPool
= rOutAttrs
.GetPool();
93 DBG_ASSERT( pPool
, "Wo ist der Pool?" );
94 ePoolUnit
= pPool
->GetMetric( SDRATTR_SHADOWXDIST
);
96 // setting the output device
97 XFillStyle eXFS
= XFILL_SOLID
;
98 if( rOutAttrs
.GetItemState( XATTR_FILLSTYLE
) != SFX_ITEM_DONTCARE
)
100 eXFS
= (XFillStyle
) ( ( ( const XFillStyleItem
& ) rOutAttrs
.
101 Get( GetWhich( XATTR_FILLSTYLE
) ) ).GetValue() );
104 //case XFILL_NONE: --> NOTHING
107 if( SFX_ITEM_DONTCARE
!= rOutAttrs
.GetItemState( XATTR_FILLCOLOR
) )
109 XFillColorItem
aColorItem( ( const XFillColorItem
& )
110 rOutAttrs
.Get( XATTR_FILLCOLOR
) );
111 rXFSet
.Put( aColorItem
);
116 if( SFX_ITEM_DONTCARE
!= rOutAttrs
.GetItemState( XATTR_FILLGRADIENT
) )
118 XFillGradientItem
aGradientItem( ( ( const XFillGradientItem
& )
119 rOutAttrs
.Get( XATTR_FILLGRADIENT
) ) );
120 rXFSet
.Put( aGradientItem
);
125 if( SFX_ITEM_DONTCARE
!= rOutAttrs
.GetItemState( XATTR_FILLHATCH
) )
127 XFillHatchItem
aHatchItem( ( ( const XFillHatchItem
& )
128 rOutAttrs
.Get( XATTR_FILLHATCH
) ) );
129 rXFSet
.Put( aHatchItem
);
135 if( SFX_ITEM_DONTCARE
!= rOutAttrs
.GetItemState( XATTR_FILLBITMAP
) )
137 XFillBitmapItem
aBitmapItem( ( const XFillBitmapItem
& )
138 rOutAttrs
.Get( XATTR_FILLBITMAP
) );
139 rXFSet
.Put( aBitmapItem
);
143 case XFILL_NONE
: break;
148 rXFSet
.Put( XFillColorItem( String(), COL_LIGHTRED
) );
151 if(XFILL_NONE
== eXFS
)
154 // fallback to solid fillmode when no fill mode is provided to have
155 // a reasonable shadow preview. The used color will be a set one or
156 // the default (currently blue8)
160 rXFSet
.Put( XFillStyleItem( eXFS
) );
161 aCtlXRectPreview
.SetRectangleAttributes(aXFillAttr
.GetItemSet());
162 //aCtlXRectPreview.SetFillAttr( aXFillAttr );
164 aTsbShowShadow
.SetClickHdl( LINK( this, SvxShadowTabPage
, ClickShadowHdl_Impl
) );
165 Link aLink
= LINK( this, SvxShadowTabPage
, ModifyShadowHdl_Impl
);
166 aLbShadowColor
.SetSelectHdl( aLink
);
167 aMtrTransparent
.SetModifyHdl( aLink
);
168 aMtrDistance
.SetModifyHdl( aLink
);
170 aCtlXRectPreview
.SetAccessibleName(String(CUI_RES(STR_EXAMPLE
)));
171 aCtlPosition
.SetAccessibleRelationMemberOf( &aFlProp
);
174 // -----------------------------------------------------------------------
176 void SvxShadowTabPage::Construct()
178 aLbShadowColor
.Fill( pColorList
);
182 aTsbShowShadow
.Disable();
183 aFtPosition
.Disable();
184 aCtlPosition
.Disable();
185 aFtDistance
.Disable();
186 aMtrDistance
.Disable();
187 aFtShadowColor
.Disable();
188 aLbShadowColor
.Disable();
189 aFtTransparent
.Disable();
190 aMtrTransparent
.Disable();
194 // -----------------------------------------------------------------------
196 void SvxShadowTabPage::ActivatePage( const SfxItemSet
& rSet
)
201 SFX_ITEMSET_ARG (&rSet
,pPageTypeItem
,SfxUInt16Item
,SID_PAGE_TYPE
,sal_False
);
203 SetPageType(pPageTypeItem
->GetValue());
207 if( pColorList
.is() )
210 if( *pnColorListState
& CT_CHANGED
||
211 *pnColorListState
& CT_MODIFIED
)
213 if( *pnColorListState
& CT_CHANGED
)
215 SvxAreaTabDialog
* pArea
= dynamic_cast< SvxAreaTabDialog
* >( GetParentDialog() );
218 pColorList
= pArea
->GetNewColorList();
222 SvxLineTabDialog
* pLine
= dynamic_cast< SvxLineTabDialog
* >( GetParentDialog() );
224 pColorList
= pLine
->GetNewColorList();
228 aCtlXRectPreview
.SetRectangleAttributes(rSet
);
230 nPos
= aLbShadowColor
.GetSelectEntryPos();
231 aLbShadowColor
.Clear();
232 aLbShadowColor
.Fill( pColorList
);
233 nCount
= aLbShadowColor
.GetEntryCount();
235 ; // this case should not occur
236 else if( nCount
<= nPos
)
237 aLbShadowColor
.SelectEntryPos( 0 );
239 aLbShadowColor
.SelectEntryPos( nPos
);
241 ModifyShadowHdl_Impl( this );
243 nPageType
= PT_SHADOW
;
248 // -----------------------------------------------------------------------
250 int SvxShadowTabPage::DeactivatePage( SfxItemSet
* _pSet
)
253 FillItemSet( *_pSet
);
255 return( LEAVE_PAGE
);
258 // -----------------------------------------------------------------------
260 sal_Bool
SvxShadowTabPage::FillItemSet( SfxItemSet
& rAttrs
)
262 const SfxPoolItem
* pOld
= NULL
;
263 sal_Bool bModified
= sal_False
;
267 TriState eState
= aTsbShowShadow
.GetState();
268 if( eState
!= aTsbShowShadow
.GetSavedValue() )
270 SdrShadowItem
aItem( sal::static_int_cast
< sal_Bool
>( eState
) );
271 pOld
= GetOldItem( rAttrs
, SDRATTR_SHADOW
);
272 if ( !pOld
|| !( *(const SdrShadowItem
*)pOld
== aItem
) )
275 bModified
= sal_True
;
280 // a bit intricate inquiry whether there was something changed,
281 // as the items can't be displayed directly on controls
282 sal_Int32 nX
= 0L, nY
= 0L;
283 sal_Int32 nXY
= GetCoreValue( aMtrDistance
, ePoolUnit
);
285 switch( aCtlPosition
.GetActualRP() )
287 case RP_LT
: nX
= nY
= -nXY
; break;
288 case RP_MT
: nY
= -nXY
; break;
289 case RP_RT
: nX
= nXY
; nY
= -nXY
; break;
290 case RP_LM
: nX
= -nXY
; break;
291 case RP_RM
: nX
= nXY
; break;
292 case RP_LB
: nX
= -nXY
; nY
= nXY
; break;
293 case RP_MB
: nY
= nXY
; break;
294 case RP_RB
: nX
= nY
= nXY
; break;
298 // If the values of the shadow distances==SFX_ITEM_DONTCARE and the displayed
299 // string in the respective MetricField=="", then the comparison of the old
300 // and the new distance values would return a wrong result because in such a
301 // case the new distance values would matche the default values of the MetricField !!!!
302 if ( !aMtrDistance
.IsEmptyFieldValue() ||
303 rOutAttrs
.GetItemState( SDRATTR_SHADOWXDIST
) != SFX_ITEM_DONTCARE
||
304 rOutAttrs
.GetItemState( SDRATTR_SHADOWYDIST
) != SFX_ITEM_DONTCARE
)
306 sal_Int32 nOldX
= 9876543; // impossible value, so DontCare
307 sal_Int32 nOldY
= 9876543;
308 if( rOutAttrs
.GetItemState( SDRATTR_SHADOWXDIST
) != SFX_ITEM_DONTCARE
&&
309 rOutAttrs
.GetItemState( SDRATTR_SHADOWYDIST
) != SFX_ITEM_DONTCARE
)
311 nOldX
= ( ( const SdrShadowXDistItem
& ) rOutAttrs
.
312 Get( SDRATTR_SHADOWXDIST
) ).GetValue();
313 nOldY
= ( ( const SdrShadowYDistItem
& ) rOutAttrs
.
314 Get( SDRATTR_SHADOWYDIST
) ).GetValue();
316 SdrShadowXDistItem
aXItem( nX
);
317 pOld
= GetOldItem( rAttrs
, SDRATTR_SHADOWXDIST
);
319 ( !pOld
|| !( *(const SdrShadowXDistItem
*)pOld
== aXItem
) ) )
321 rAttrs
.Put( aXItem
);
322 bModified
= sal_True
;
324 SdrShadowYDistItem
aYItem( nY
);
325 pOld
= GetOldItem( rAttrs
, SDRATTR_SHADOWYDIST
);
327 ( !pOld
|| !( *(const SdrShadowYDistItem
*)pOld
== aYItem
) ) )
329 rAttrs
.Put( aYItem
);
330 bModified
= sal_True
;
335 sal_uInt16 nPos
= aLbShadowColor
.GetSelectEntryPos();
336 if( nPos
!= LISTBOX_ENTRY_NOTFOUND
&&
337 nPos
!= aLbShadowColor
.GetSavedValue() )
339 SdrShadowColorItem
aItem(aLbShadowColor
.GetSelectEntryColor());
340 pOld
= GetOldItem( rAttrs
, SDRATTR_SHADOWCOLOR
);
341 if ( !pOld
|| !( *(const SdrShadowColorItem
*)pOld
== aItem
) )
344 bModified
= sal_True
;
349 sal_uInt16 nVal
= (sal_uInt16
)aMtrTransparent
.GetValue();
350 if( nVal
!= (sal_uInt16
)aMtrTransparent
.GetSavedValue().toInt32() )
352 SdrShadowTransparenceItem
aItem( nVal
);
353 pOld
= GetOldItem( rAttrs
, SDRATTR_SHADOWTRANSPARENCE
);
354 if ( !pOld
|| !( *(const SdrShadowTransparenceItem
*)pOld
== aItem
) )
357 bModified
= sal_True
;
362 rAttrs
.Put (CntUInt16Item(SID_PAGE_TYPE
,nPageType
));
367 // -----------------------------------------------------------------------
369 void SvxShadowTabPage::Reset( const SfxItemSet
& rAttrs
)
373 // all objects can have a shadow
374 // at the moment there are only 8 possible positions where a shadow can be set
376 // has a shadow been set?
377 if( rAttrs
.GetItemState( SDRATTR_SHADOW
) != SFX_ITEM_DONTCARE
)
379 aTsbShowShadow
.EnableTriState( sal_False
);
381 if( ( ( const SdrShadowItem
& ) rAttrs
.Get( SDRATTR_SHADOW
) ).GetValue() )
382 aTsbShowShadow
.SetState( STATE_CHECK
);
385 aTsbShowShadow
.SetState( STATE_NOCHECK
);
389 aTsbShowShadow
.SetState( STATE_DONTKNOW
);
391 // distance (only 8 possible positions),
392 // so there is only one item evaluated
394 if( rAttrs
.GetItemState( SDRATTR_SHADOWXDIST
) != SFX_ITEM_DONTCARE
&&
395 rAttrs
.GetItemState( SDRATTR_SHADOWYDIST
) != SFX_ITEM_DONTCARE
)
397 sal_Int32 nX
= ( ( const SdrShadowXDistItem
& ) rAttrs
.Get( SDRATTR_SHADOWXDIST
) ).GetValue();
398 sal_Int32 nY
= ( ( const SdrShadowYDistItem
& ) rAttrs
.Get( SDRATTR_SHADOWYDIST
) ).GetValue();
401 SetMetricValue( aMtrDistance
, nX
< 0L ? -nX
: nX
, ePoolUnit
);
403 SetMetricValue( aMtrDistance
, nY
< 0L ? -nY
: nY
, ePoolUnit
);
405 // setting the shadow control
406 if ( nX
< 0L && nY
< 0L ) aCtlPosition
.SetActualRP( RP_LT
);
407 else if( nX
== 0L && nY
< 0L ) aCtlPosition
.SetActualRP( RP_MT
);
408 else if( nX
> 0L && nY
< 0L ) aCtlPosition
.SetActualRP( RP_RT
);
409 else if( nX
< 0L && nY
== 0L ) aCtlPosition
.SetActualRP( RP_LM
);
410 // there's no center point anymore
411 else if( nX
== 0L && nY
== 0L ) aCtlPosition
.SetActualRP( RP_RB
);
412 else if( nX
> 0L && nY
== 0L ) aCtlPosition
.SetActualRP( RP_RM
);
413 else if( nX
< 0L && nY
> 0L ) aCtlPosition
.SetActualRP( RP_LB
);
414 else if( nX
== 0L && nY
> 0L ) aCtlPosition
.SetActualRP( RP_MB
);
415 else if( nX
> 0L && nY
> 0L ) aCtlPosition
.SetActualRP( RP_RB
);
419 // determine default-distance
420 SfxItemPool
* pPool
= rOutAttrs
.GetPool();
421 SdrShadowXDistItem
* pXDistItem
= (SdrShadowXDistItem
*)&pPool
->GetDefaultItem (SDRATTR_SHADOWXDIST
);
422 SdrShadowYDistItem
* pYDistItem
= (SdrShadowYDistItem
*)&pPool
->GetDefaultItem (SDRATTR_SHADOWYDIST
);
423 if (pXDistItem
&& pYDistItem
)
425 sal_Int32 nX
= pXDistItem
->GetValue();
426 sal_Int32 nY
= pYDistItem
->GetValue();
428 SetMetricValue( aMtrDistance
, nX
< 0L ? -nX
: nX
, ePoolUnit
);
430 SetMetricValue( aMtrDistance
, nY
< 0L ? -nY
: nY
, ePoolUnit
);
433 // Tristate, e. g. multiple objects have been marked of which some have a shadow and some don't.
434 // The text (which shall be displayed) of the MetricFields is set to "" and serves as an
435 // identification in the method FillItemSet for the fact that the distance value was NOT changed !!!!
436 aMtrDistance
.SetText( String() );
437 aCtlPosition
.SetActualRP( RP_MM
);
440 if( rAttrs
.GetItemState( SDRATTR_SHADOWCOLOR
) != SFX_ITEM_DONTCARE
)
442 aLbShadowColor
.SelectEntry( ( ( const SdrShadowColorItem
& ) rAttrs
.Get( SDRATTR_SHADOWCOLOR
) ).GetColorValue() );
445 aLbShadowColor
.SetNoSelection();
447 if( rAttrs
.GetItemState( SDRATTR_SHADOWTRANSPARENCE
) != SFX_ITEM_DONTCARE
)
449 sal_uInt16 nTransp
= ( ( const SdrShadowTransparenceItem
& ) rAttrs
.Get( SDRATTR_SHADOWTRANSPARENCE
) ).GetValue();
450 aMtrTransparent
.SetValue( nTransp
);
453 aMtrTransparent
.SetText( String() );
456 aMtrDistance
.SaveValue();
457 aLbShadowColor
.SaveValue();
458 aTsbShowShadow
.SaveValue();
460 // #66832# This field was not saved, but used to determine changes.
461 // Why? Seems to be the error.
463 aMtrTransparent
.SaveValue();
465 ClickShadowHdl_Impl( NULL
);
466 ModifyShadowHdl_Impl( NULL
);
470 // -----------------------------------------------------------------------
472 SfxTabPage
* SvxShadowTabPage::Create( Window
* pWindow
,
473 const SfxItemSet
& rAttrs
)
475 return( new SvxShadowTabPage( pWindow
, rAttrs
) );
478 //------------------------------------------------------------------------
480 sal_uInt16
* SvxShadowTabPage::GetRanges()
482 return( pShadowRanges
);
485 //------------------------------------------------------------------------
487 IMPL_LINK_NOARG(SvxShadowTabPage
, ClickShadowHdl_Impl
)
489 if( aTsbShowShadow
.GetState() == STATE_NOCHECK
)
491 aFtPosition
.Disable();
492 aCtlPosition
.Disable();
493 aFtDistance
.Disable();
494 aMtrDistance
.Disable();
495 aFtShadowColor
.Disable();
496 aLbShadowColor
.Disable();
497 aFtTransparent
.Disable();
498 aMtrTransparent
.Disable();
502 aFtPosition
.Enable();
503 aCtlPosition
.Enable();
504 aFtDistance
.Enable();
505 aMtrDistance
.Enable();
506 aFtShadowColor
.Enable();
507 aLbShadowColor
.Enable();
508 aFtTransparent
.Enable();
509 aMtrTransparent
.Enable();
511 aCtlPosition
.Invalidate();
513 ModifyShadowHdl_Impl( NULL
);
518 //------------------------------------------------------------------------
520 IMPL_LINK_NOARG(SvxShadowTabPage
, ModifyShadowHdl_Impl
)
522 if( aTsbShowShadow
.GetState() == STATE_CHECK
)
523 rXFSet
.Put( XFillStyleItem( XFILL_SOLID
) );
525 rXFSet
.Put( XFillStyleItem( XFILL_NONE
) );
527 sal_uInt16 nPos
= aLbShadowColor
.GetSelectEntryPos();
528 if( nPos
!= LISTBOX_ENTRY_NOTFOUND
)
530 rXFSet
.Put( XFillColorItem( String(),
531 aLbShadowColor
.GetSelectEntryColor() ) );
533 sal_uInt16 nVal
= (sal_uInt16
)aMtrTransparent
.GetValue();
534 XFillTransparenceItem
aItem( nVal
);
535 rXFSet
.Put( XFillTransparenceItem( aItem
) );
538 sal_Int32 nX
= 0L, nY
= 0L;
539 sal_Int32 nXY
= GetCoreValue( aMtrDistance
, ePoolUnit
);
540 switch( aCtlPosition
.GetActualRP() )
542 case RP_LT
: nX
= nY
= -nXY
; break;
543 case RP_MT
: nY
= -nXY
; break;
544 case RP_RT
: nX
= nXY
; nY
= -nXY
; break;
545 case RP_LM
: nX
= -nXY
; break;
546 case RP_RM
: nX
= nXY
; break;
547 case RP_LB
: nX
= -nXY
; nY
= nXY
; break;
548 case RP_MB
: nY
= nXY
; break;
549 case RP_RB
: nX
= nY
= nXY
; break;
553 aCtlXRectPreview
.SetShadowPosition(Point(nX
, nY
));
555 aCtlXRectPreview
.SetShadowAttributes(aXFillAttr
.GetItemSet());
556 //aCtlXRectPreview.SetFillAttr( aXFillAttr );
557 aCtlXRectPreview
.Invalidate();
562 //------------------------------------------------------------------------
564 void SvxShadowTabPage::PointChanged( Window
* pWindow
, RECT_POINT eRcPt
)
569 ModifyShadowHdl_Impl( pWindow
);
572 void SvxShadowTabPage::PageCreated (SfxAllItemSet aSet
)
574 SFX_ITEMSET_ARG (&aSet
,pColorListItem
,SvxColorListItem
,SID_COLOR_TABLE
,sal_False
);
575 SFX_ITEMSET_ARG (&aSet
,pPageTypeItem
,SfxUInt16Item
,SID_PAGE_TYPE
,sal_False
);
576 SFX_ITEMSET_ARG (&aSet
,pDlgTypeItem
,SfxUInt16Item
,SID_DLG_TYPE
,sal_False
);
579 SetColorList(pColorListItem
->GetColorList());
581 SetPageType(pPageTypeItem
->GetValue());
583 SetDlgType(pDlgTypeItem
->GetValue());
587 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */