update credits
[LibreOffice.git] / cui / source / tabpages / tpshadow.cxx
blob824bb8a76220691491a876a3a7be13528db320fa
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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>
27 #include <cuires.hrc>
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[] =
41 SDRATTR_SHADOWCOLOR,
42 SDRATTR_SHADOWTRANSPARENCE,
43 SID_ATTR_FILL_SHADOW,
44 SID_ATTR_FILL_SHADOW,
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 ),
64 eRP ( RP_LT ),
65 nPageType ( 0 ),
66 nDlgType ( 0 ),
67 pbAreaTP ( 0 ),
68 bDisable ( sal_False ),
69 pXPool ( (XOutdevItemPool*) rInAttrs.GetPool() ),
70 aXFillAttr ( pXPool ),
71 rXFSet ( aXFillAttr.GetItemSet() )
73 FreeResource();
75 // this page needs ExchangeSupport
76 SetExchangeSupport();
78 // adjust metric
79 FieldUnit eFUnit = GetModuleFieldUnit( rInAttrs );
81 switch ( eFUnit )
83 case FUNIT_M:
84 case FUNIT_KM:
85 eFUnit = FUNIT_MM;
86 break;
87 default: ;//prevent warning
89 SetFieldUnit( aMtrDistance, eFUnit );
91 // determine PoolUnit
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() );
102 switch( eXFS )
104 //case XFILL_NONE: --> NOTHING
106 case XFILL_SOLID:
107 if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLCOLOR ) )
109 XFillColorItem aColorItem( ( const XFillColorItem& )
110 rOutAttrs.Get( XATTR_FILLCOLOR ) );
111 rXFSet.Put( aColorItem );
113 break;
115 case XFILL_GRADIENT:
116 if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLGRADIENT ) )
118 XFillGradientItem aGradientItem( ( ( const XFillGradientItem& )
119 rOutAttrs.Get( XATTR_FILLGRADIENT ) ) );
120 rXFSet.Put( aGradientItem );
122 break;
124 case XFILL_HATCH:
125 if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLHATCH ) )
127 XFillHatchItem aHatchItem( ( ( const XFillHatchItem& )
128 rOutAttrs.Get( XATTR_FILLHATCH ) ) );
129 rXFSet.Put( aHatchItem );
131 break;
133 case XFILL_BITMAP:
135 if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLBITMAP ) )
137 XFillBitmapItem aBitmapItem( ( const XFillBitmapItem& )
138 rOutAttrs.Get( XATTR_FILLBITMAP ) );
139 rXFSet.Put( aBitmapItem );
142 break;
143 case XFILL_NONE : break;
146 else
148 rXFSet.Put( XFillColorItem( String(), COL_LIGHTRED ) );
151 if(XFILL_NONE == eXFS)
153 // #i96350#
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)
157 eXFS = XFILL_SOLID;
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 );
180 if( bDisable )
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 )
198 sal_uInt16 nPos;
199 sal_uInt16 nCount;
201 SFX_ITEMSET_ARG (&rSet,pPageTypeItem,SfxUInt16Item,SID_PAGE_TYPE,sal_False);
202 if (pPageTypeItem)
203 SetPageType(pPageTypeItem->GetValue());
205 if( nDlgType == 0 )
207 if( pColorList.is() )
209 // ColorList
210 if( *pnColorListState & CT_CHANGED ||
211 *pnColorListState & CT_MODIFIED )
213 if( *pnColorListState & CT_CHANGED )
215 SvxAreaTabDialog* pArea = dynamic_cast< SvxAreaTabDialog* >( GetParentDialog() );
216 if( pArea )
218 pColorList = pArea->GetNewColorList();
220 else
222 SvxLineTabDialog* pLine = dynamic_cast< SvxLineTabDialog* >( GetParentDialog() );
223 if( pLine )
224 pColorList = pLine->GetNewColorList();
228 aCtlXRectPreview.SetRectangleAttributes(rSet);
229 // aLbShadowColor
230 nPos = aLbShadowColor.GetSelectEntryPos();
231 aLbShadowColor.Clear();
232 aLbShadowColor.Fill( pColorList );
233 nCount = aLbShadowColor.GetEntryCount();
234 if( nCount == 0 )
235 ; // this case should not occur
236 else if( nCount <= nPos )
237 aLbShadowColor.SelectEntryPos( 0 );
238 else
239 aLbShadowColor.SelectEntryPos( nPos );
241 ModifyShadowHdl_Impl( this );
243 nPageType = PT_SHADOW;
248 // -----------------------------------------------------------------------
250 int SvxShadowTabPage::DeactivatePage( SfxItemSet* _pSet )
252 if( _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;
265 if( !bDisable )
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 ) )
274 rAttrs.Put( aItem );
275 bModified = sal_True;
279 // shadow removal
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;
295 case RP_MM: 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 );
318 if ( nX != nOldX &&
319 ( !pOld || !( *(const SdrShadowXDistItem*)pOld == aXItem ) ) )
321 rAttrs.Put( aXItem );
322 bModified = sal_True;
324 SdrShadowYDistItem aYItem( nY );
325 pOld = GetOldItem( rAttrs, SDRATTR_SHADOWYDIST );
326 if ( nY != nOldY &&
327 ( !pOld || !( *(const SdrShadowYDistItem*)pOld == aYItem ) ) )
329 rAttrs.Put( aYItem );
330 bModified = sal_True;
334 // ShadowColor
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 ) )
343 rAttrs.Put( aItem );
344 bModified = sal_True;
348 // transparency
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 ) )
356 rAttrs.Put( aItem );
357 bModified = sal_True;
362 rAttrs.Put (CntUInt16Item(SID_PAGE_TYPE,nPageType));
364 return( bModified );
367 // -----------------------------------------------------------------------
369 void SvxShadowTabPage::Reset( const SfxItemSet& rAttrs )
371 if( !bDisable )
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 );
383 else
385 aTsbShowShadow.SetState( STATE_NOCHECK );
388 else
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();
400 if( nX != 0 )
401 SetMetricValue( aMtrDistance, nX < 0L ? -nX : nX, ePoolUnit );
402 else
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 );
417 else
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();
427 if( nX != 0 )
428 SetMetricValue( aMtrDistance, nX < 0L ? -nX : nX, ePoolUnit );
429 else
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() );
444 else
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 );
452 else
453 aMtrTransparent.SetText( String() );
455 //aCtlPosition
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.
462 // It IS 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();
500 else
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 );
515 return( 0L );
518 //------------------------------------------------------------------------
520 IMPL_LINK_NOARG(SvxShadowTabPage, ModifyShadowHdl_Impl)
522 if( aTsbShowShadow.GetState() == STATE_CHECK )
523 rXFSet.Put( XFillStyleItem( XFILL_SOLID ) );
524 else
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 ) );
537 // shadow removal
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;
550 case RP_MM: break;
553 aCtlXRectPreview.SetShadowPosition(Point(nX, nY));
555 aCtlXRectPreview.SetShadowAttributes(aXFillAttr.GetItemSet());
556 //aCtlXRectPreview.SetFillAttr( aXFillAttr );
557 aCtlXRectPreview.Invalidate();
559 return( 0L );
562 //------------------------------------------------------------------------
564 void SvxShadowTabPage::PointChanged( Window* pWindow, RECT_POINT eRcPt )
566 eRP = eRcPt;
568 // repaint shadow
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);
578 if (pColorListItem)
579 SetColorList(pColorListItem->GetColorList());
580 if (pPageTypeItem)
581 SetPageType(pPageTypeItem->GetValue());
582 if (pDlgTypeItem)
583 SetDlgType(pDlgTypeItem->GetValue());
584 Construct();
587 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */