xref: /aoo41x/main/cui/source/tabpages/tpshadow.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_cui.hxx"
30 
31 // include ---------------------------------------------------------------
32 #include <tools/shl.hxx>
33 #include <sfx2/app.hxx>
34 #include <sfx2/module.hxx>
35 #include <svx/dialogs.hrc>
36 
37 #define _SVX_TPSHADOW_CXX
38 
39 #include "svx/xattr.hxx"
40 #include <svx/xpool.hxx>
41 #include <cuires.hrc>
42 #include "tabarea.hrc"
43 #include <svx/svdattr.hxx>
44 #include "svx/drawitem.hxx"
45 #include "cuitabarea.hxx"
46 #include <dialmgr.hxx>
47 #include "svx/dlgutil.hxx"
48 #include <cuitabline.hxx>
49 #include "paragrph.hrc"
50 #include <svx/xlineit0.hxx>
51 #include <sfx2/request.hxx> //add CHINA001
52 
53 #define DLGWIN this->GetParent()->GetParent()
54 
55 // static ----------------------------------------------------------------
56 
57 static sal_uInt16 pShadowRanges[] =
58 {
59 	SDRATTR_SHADOWCOLOR,
60 	SDRATTR_SHADOWTRANSPARENCE,
61 	SID_ATTR_FILL_SHADOW,
62 	SID_ATTR_FILL_SHADOW,
63 	0
64 };
65 
66 /*************************************************************************
67 |*
68 |*	Dialog zum Aendern des Schattens
69 |*
70 \************************************************************************/
71 
72 SvxShadowTabPage::SvxShadowTabPage( Window* pParent, const SfxItemSet& rInAttrs ) :
73 
74 	SvxTabPage			( pParent, CUI_RES( RID_SVXPAGE_SHADOW ), rInAttrs ),
75 
76     aFlProp             ( this, CUI_RES( FL_PROP ) ),
77     aTsbShowShadow      ( this, CUI_RES( TSB_SHOW_SHADOW ) ),
78     aFtPosition         ( this, CUI_RES( FT_POSITION ) ),
79     aCtlPosition        ( this, CUI_RES( CTL_POSITION ) ),
80 	aFtDistance			( this, CUI_RES( FT_DISTANCE ) ),
81 	aMtrDistance		( this, CUI_RES( MTR_FLD_DISTANCE ) ),
82 	aFtShadowColor		( this, CUI_RES( FT_SHADOW_COLOR ) ),
83 	aLbShadowColor		( this, CUI_RES( LB_SHADOW_COLOR ) ),
84 	aFtTransparent      ( this, CUI_RES( FT_TRANSPARENT ) ),
85 	aMtrTransparent      ( this, CUI_RES( MTR_SHADOW_TRANSPARENT ) ),
86     aCtlXRectPreview    ( this, CUI_RES( CTL_COLOR_PREVIEW ) ),
87 	rOutAttrs			( rInAttrs ),
88     pColorTab( NULL ),
89     bDisable            ( sal_False ),
90     pXPool              ( (XOutdevItemPool*) rInAttrs.GetPool() ),
91     aXFillAttr          ( pXPool ),
92     rXFSet              ( aXFillAttr.GetItemSet() )
93 {
94 	FreeResource();
95 
96 	// diese Page braucht ExchangeSupport
97 	SetExchangeSupport();
98 
99 	// Metrik einstellen
100 	FieldUnit eFUnit = GetModuleFieldUnit( rInAttrs );
101 
102 	switch ( eFUnit )
103 	{
104 		case FUNIT_M:
105 		case FUNIT_KM:
106 			eFUnit = FUNIT_MM;
107 			break;
108         default: ;//prevent warning
109 	}
110 	SetFieldUnit( aMtrDistance, eFUnit );
111 
112 	// PoolUnit ermitteln
113 	SfxItemPool* pPool = rOutAttrs.GetPool();
114 	DBG_ASSERT( pPool, "Wo ist der Pool?" );
115 	ePoolUnit = pPool->GetMetric( SDRATTR_SHADOWXDIST );
116 
117 	// Setzen des Output-Devices
118 	XFillStyle eXFS = XFILL_SOLID;
119 	if( rOutAttrs.GetItemState( XATTR_FILLSTYLE ) != SFX_ITEM_DONTCARE )
120 	{
121 		eXFS = (XFillStyle) ( ( ( const XFillStyleItem& ) rOutAttrs.
122 								Get( GetWhich( XATTR_FILLSTYLE ) ) ).GetValue() );
123 		switch( eXFS )
124 		{
125 			//case XFILL_NONE: --> NICHTS
126 
127 			case XFILL_SOLID:
128 				if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLCOLOR ) )
129 				{
130 					XFillColorItem aColorItem( ( const XFillColorItem& )
131 										rOutAttrs.Get( XATTR_FILLCOLOR ) );
132 					rXFSet.Put( aColorItem );
133 				}
134 			break;
135 
136 			case XFILL_GRADIENT:
137 				if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLGRADIENT ) )
138 				{
139 					XFillGradientItem aGradientItem( ( ( const XFillGradientItem& )
140 											rOutAttrs.Get( XATTR_FILLGRADIENT ) ) );
141 					rXFSet.Put( aGradientItem );
142 				}
143 			break;
144 
145 			case XFILL_HATCH:
146 				if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLHATCH ) )
147 				{
148 					XFillHatchItem aHatchItem( ( ( const XFillHatchItem& )
149 									rOutAttrs.Get( XATTR_FILLHATCH ) ) );
150 					rXFSet.Put( aHatchItem );
151 				}
152 			break;
153 
154 			case XFILL_BITMAP:
155 			{
156 				if( SFX_ITEM_DONTCARE != rOutAttrs.GetItemState( XATTR_FILLBITMAP ) )
157 				{
158 					XFillBitmapItem aBitmapItem( ( const XFillBitmapItem& )
159 										rOutAttrs.Get( XATTR_FILLBITMAP ) );
160 					rXFSet.Put( aBitmapItem );
161 				}
162 			}
163 			break;
164             case XFILL_NONE : break;
165 		}
166 	}
167 	else
168 	{
169 		rXFSet.Put( XFillColorItem( String(), COL_LIGHTRED ) );
170 	}
171 
172     if(XFILL_NONE == eXFS)
173     {
174         // #i96350#
175         // fallback to solid fillmode when no fill mode is provided to have
176         // a reasonable shadow preview. The used color will be a set one or
177         // the default (currently blue8)
178         eXFS = XFILL_SOLID;
179     }
180 
181 	rXFSet.Put( XFillStyleItem( eXFS ) );
182 	aCtlXRectPreview.SetRectangleAttributes(aXFillAttr.GetItemSet());
183 	//aCtlXRectPreview.SetFillAttr( aXFillAttr );
184 
185 	aTsbShowShadow.SetClickHdl( LINK( this, SvxShadowTabPage, ClickShadowHdl_Impl ) );
186 	Link aLink = LINK( this, SvxShadowTabPage, ModifyShadowHdl_Impl );
187 	aLbShadowColor.SetSelectHdl( aLink );
188 	aMtrTransparent.SetModifyHdl( aLink );
189 	aMtrDistance.SetModifyHdl( aLink );
190 
191 	aCtlXRectPreview.SetAccessibleName(String(CUI_RES(STR_EXAMPLE)));
192 	aCtlPosition.SetAccessibleRelationMemberOf( &aFlProp );
193 }
194 
195 // -----------------------------------------------------------------------
196 
197 void SvxShadowTabPage::Construct()
198 {
199 	// Farbtabelle fuellen
200 	aLbShadowColor.Fill( pColorTab );
201 
202 	if( bDisable )
203 	{
204 		aTsbShowShadow.Disable();
205 		aFtPosition.Disable();
206 		aCtlPosition.Disable();
207 		aFtDistance.Disable();
208 		aMtrDistance.Disable();
209 		aFtShadowColor.Disable();
210 		aLbShadowColor.Disable();
211 		aFtTransparent.Disable();
212 		aMtrTransparent.Disable();
213 	}
214 }
215 
216 // -----------------------------------------------------------------------
217 
218 void SvxShadowTabPage::ActivatePage( const SfxItemSet& rSet )
219 {
220 	sal_uInt16 nPos;
221 	sal_uInt16 nCount;
222 	//add CHINA001 Begin
223 	SFX_ITEMSET_ARG (&rSet,pPageTypeItem,SfxUInt16Item,SID_PAGE_TYPE,sal_False);
224 	if (pPageTypeItem)
225 		SetPageType(pPageTypeItem->GetValue());
226 	//add CHINA001 end
227 	if( nDlgType == 0 ) //CHINA001 // Flaechen-Dialogif( *pDlgType == 0 ) // Flaechen-Dialog
228 	{
229 		if( pColorTab )
230 		{
231 			// ColorTable
232 			if( *pnColorTableState & CT_CHANGED ||
233 				*pnColorTableState & CT_MODIFIED )
234 			{
235 				if( *pnColorTableState & CT_CHANGED )
236 				{
237 					SvxAreaTabDialog* pArea = dynamic_cast< SvxAreaTabDialog* >( DLGWIN );
238 					if( pArea )
239 					{
240 						pColorTab = pArea->GetNewColorTable();
241 					}
242 					else
243 					{
244 						SvxLineTabDialog* pLine = dynamic_cast< SvxLineTabDialog* >( DLGWIN );
245 						if( pLine )
246 							pColorTab = pLine->GetNewColorTable();
247 					}
248 				}
249 
250 				// aLbShadowColor
251 				nPos = aLbShadowColor.GetSelectEntryPos();
252 				aLbShadowColor.Clear();
253 				aLbShadowColor.Fill( pColorTab );
254 				nCount = aLbShadowColor.GetEntryCount();
255 				if( nCount == 0 )
256 					; // Dieser Fall sollte nicht auftreten
257 				else if( nCount <= nPos )
258 					aLbShadowColor.SelectEntryPos( 0 );
259 				else
260 					aLbShadowColor.SelectEntryPos( nPos );
261 
262 				ModifyShadowHdl_Impl( this );
263 			}
264 			nPageType = PT_SHADOW;//CHINA001 *pPageType = PT_SHADOW;
265 		}
266 	}
267 }
268 
269 // -----------------------------------------------------------------------
270 
271 int SvxShadowTabPage::DeactivatePage( SfxItemSet* _pSet )
272 {
273     if( _pSet )
274         FillItemSet( *_pSet );
275 
276 	return( LEAVE_PAGE );
277 }
278 
279 // -----------------------------------------------------------------------
280 
281 sal_Bool SvxShadowTabPage::FillItemSet( SfxItemSet& rAttrs )
282 {
283 	const SfxPoolItem*	pOld = NULL;
284 	sal_Bool				bModified = sal_False;
285 
286 	if( !bDisable )
287 	{
288 		// Schatten
289 		TriState eState = aTsbShowShadow.GetState();
290 		if( eState != aTsbShowShadow.GetSavedValue() )
291 		{
292 			SdrShadowItem aItem( sal::static_int_cast< sal_Bool >( eState ) );
293 			pOld = GetOldItem( rAttrs, SDRATTR_SHADOW );
294 			if ( !pOld || !( *(const SdrShadowItem*)pOld == aItem ) )
295 			{
296 				rAttrs.Put( aItem );
297 				bModified = sal_True;
298 			}
299 		}
300 
301 		// Schatten-Entfernung
302 		// Etwas umstaendliche Abfrage, ob etwas geaendert wurde,
303 		// da Items nicht direkt auf Controls abbildbar sind
304 		sal_Int32 nX = 0L, nY = 0L;
305 		sal_Int32 nXY = GetCoreValue( aMtrDistance, ePoolUnit );
306 
307 		switch( aCtlPosition.GetActualRP() )
308 		{
309 			case RP_LT: nX = nY = -nXY; 	 break;
310 			case RP_MT: nY = -nXY;			 break;
311 			case RP_RT: nX = nXY; nY = -nXY; break;
312 			case RP_LM: nX = -nXY;			 break;
313 			case RP_RM: nX = nXY;			 break;
314 			case RP_LB: nX = -nXY; nY = nXY; break;
315 			case RP_MB: nY = nXY; 			 break;
316 			case RP_RB: nX = nY = nXY; 		 break;
317             case RP_MM: break;
318 		}
319 
320 		// Wenn die Werte des Schattenabstanden==SFX_ITEM_DONTCARE und der angezeigte
321 		// String im entspr. MetricField=="", dann w�rde der Vergleich zw. alten und
322 		// neuen Distance-Werte ein falsches Ergebnis liefern, da in so einem Fall die
323 		// neuen Distance-Werte den Default-Werten des MetricField entspr�chen !!!!
324 		if ( !aMtrDistance.IsEmptyFieldValue()                                  ||
325 			 rOutAttrs.GetItemState( SDRATTR_SHADOWXDIST ) != SFX_ITEM_DONTCARE ||
326 			 rOutAttrs.GetItemState( SDRATTR_SHADOWYDIST ) != SFX_ITEM_DONTCARE    )
327 		{
328 			sal_Int32 nOldX = 9876543; // Unmoeglicher Wert, entspr. DontCare
329 			sal_Int32 nOldY = 9876543;
330 			if( rOutAttrs.GetItemState( SDRATTR_SHADOWXDIST ) != SFX_ITEM_DONTCARE &&
331 				rOutAttrs.GetItemState( SDRATTR_SHADOWYDIST ) != SFX_ITEM_DONTCARE )
332 			{
333 				nOldX = ( ( const SdrShadowXDistItem& ) rOutAttrs.
334 									Get( SDRATTR_SHADOWXDIST ) ).GetValue();
335 				nOldY = ( ( const SdrShadowYDistItem& ) rOutAttrs.
336 									Get( SDRATTR_SHADOWYDIST ) ).GetValue();
337 			}
338 			SdrShadowXDistItem aXItem( nX );
339 			pOld = GetOldItem( rAttrs, SDRATTR_SHADOWXDIST );
340 			if ( nX != nOldX &&
341 				( !pOld || !( *(const SdrShadowXDistItem*)pOld == aXItem ) ) )
342 			{
343 				rAttrs.Put( aXItem );
344 				bModified = sal_True;
345 			}
346 			SdrShadowYDistItem aYItem( nY );
347 			pOld = GetOldItem( rAttrs, SDRATTR_SHADOWYDIST );
348 			if ( nY != nOldY &&
349 				( !pOld || !( *(const SdrShadowYDistItem*)pOld == aYItem ) ) )
350 			{
351 				rAttrs.Put( aYItem );
352 				bModified = sal_True;
353 			}
354 		}
355 
356 		// ShadowColor
357 		sal_uInt16 nPos = aLbShadowColor.GetSelectEntryPos();
358 		if( nPos != LISTBOX_ENTRY_NOTFOUND &&
359 			nPos != aLbShadowColor.GetSavedValue() )
360 		{
361 			SdrShadowColorItem aItem( aLbShadowColor.GetSelectEntry(),
362 									aLbShadowColor.GetSelectEntryColor() );
363 			pOld = GetOldItem( rAttrs, SDRATTR_SHADOWCOLOR );
364 			if ( !pOld || !( *(const SdrShadowColorItem*)pOld == aItem ) )
365 			{
366 				rAttrs.Put( aItem );
367 				bModified = sal_True;
368 			}
369 		}
370 
371 		// Transparenz
372 		sal_uInt16 nVal = (sal_uInt16)aMtrTransparent.GetValue();
373 		if( nVal != (sal_uInt16)aMtrTransparent.GetSavedValue().ToInt32() )
374 		{
375 			SdrShadowTransparenceItem aItem( nVal );
376 			pOld = GetOldItem( rAttrs, SDRATTR_SHADOWTRANSPARENCE );
377 			if ( !pOld || !( *(const SdrShadowTransparenceItem*)pOld == aItem ) )
378 			{
379 				rAttrs.Put( aItem );
380 				bModified = sal_True;
381 			}
382 		}
383 	}
384 	//add CHINA001  begin
385 	rAttrs.Put (CntUInt16Item(SID_PAGE_TYPE,nPageType));
386 	//add CHINA001  end
387 	return( bModified );
388 }
389 
390 // -----------------------------------------------------------------------
391 
392 void SvxShadowTabPage::Reset( const SfxItemSet& rAttrs )
393 {
394 	if( !bDisable )
395 	{
396 		// Alle Objekte koennen einen Schatten besitzen
397 		// z.Z. gibt es nur 8 m�gliche Positionen den Schatten zu setzen
398 
399 		// Ist Schatten gesetzt?
400 		if( rAttrs.GetItemState( SDRATTR_SHADOW ) != SFX_ITEM_DONTCARE )
401 		{
402 			aTsbShowShadow.EnableTriState( sal_False );
403 
404 			if( ( ( const SdrShadowItem& ) rAttrs.Get( SDRATTR_SHADOW ) ).GetValue() )
405 				aTsbShowShadow.SetState( STATE_CHECK );
406 			else
407 			{
408 				aTsbShowShadow.SetState( STATE_NOCHECK );
409 			}
410 		}
411 		else
412 			aTsbShowShadow.SetState( STATE_DONTKNOW );
413 
414 		// Entfernung (nur 8 moegliche Positionen), deshalb
415 		// wird nur ein Item ausgewertet
416 
417 		if( rAttrs.GetItemState( SDRATTR_SHADOWXDIST ) != SFX_ITEM_DONTCARE &&
418 			rAttrs.GetItemState( SDRATTR_SHADOWYDIST ) != SFX_ITEM_DONTCARE )
419 		{
420 			sal_Int32 nX = ( ( const SdrShadowXDistItem& ) rAttrs.Get( SDRATTR_SHADOWXDIST ) ).GetValue();
421 			sal_Int32 nY = ( ( const SdrShadowYDistItem& ) rAttrs.Get( SDRATTR_SHADOWYDIST ) ).GetValue();
422 
423 			if( nX != 0 )
424 				SetMetricValue( aMtrDistance, nX < 0L ? -nX : nX, ePoolUnit );
425 			else
426 				SetMetricValue( aMtrDistance, nY < 0L ? -nY : nY, ePoolUnit );
427 
428 			// Setzen des Schatten-Controls
429 			if	   ( nX <  0L && nY <  0L ) aCtlPosition.SetActualRP( RP_LT );
430 			else if( nX == 0L && nY <  0L ) aCtlPosition.SetActualRP( RP_MT );
431 			else if( nX >  0L && nY <  0L ) aCtlPosition.SetActualRP( RP_RT );
432 			else if( nX <  0L && nY == 0L ) aCtlPosition.SetActualRP( RP_LM );
433 			// Mittelpunkt gibt es nicht mehr
434 			else if( nX == 0L && nY == 0L ) aCtlPosition.SetActualRP( RP_RB );
435 			else if( nX >  0L && nY == 0L ) aCtlPosition.SetActualRP( RP_RM );
436 			else if( nX <  0L && nY >  0L ) aCtlPosition.SetActualRP( RP_LB );
437 			else if( nX == 0L && nY >  0L ) aCtlPosition.SetActualRP( RP_MB );
438 			else if( nX >  0L && nY >  0L ) aCtlPosition.SetActualRP( RP_RB );
439 		}
440 		else
441 		{
442 			// determine default-distance
443 			SfxItemPool* pPool = rOutAttrs.GetPool();
444 			SdrShadowXDistItem* pXDistItem = (SdrShadowXDistItem*)&pPool->GetDefaultItem (SDRATTR_SHADOWXDIST);
445 			SdrShadowYDistItem* pYDistItem = (SdrShadowYDistItem*)&pPool->GetDefaultItem (SDRATTR_SHADOWYDIST);
446 			if (pXDistItem && pYDistItem)
447 			{
448 				sal_Int32 nX = pXDistItem->GetValue();
449 				sal_Int32 nY = pYDistItem->GetValue();
450 				if( nX != 0 )
451 					SetMetricValue( aMtrDistance, nX < 0L ? -nX : nX, ePoolUnit );
452 				else
453 					SetMetricValue( aMtrDistance, nY < 0L ? -nY : nY, ePoolUnit );
454 			}
455 
456 			// Tristate, z.B. mehrer Objekte wurden markiert, wovon einige einen Schatten besitzen, einige nicht.
457 			// Der anzuzeigende Text des MetricFields wird auf "" gesetzt und dient in der Methode FillItemSet
458 			// als Erkennungszeichen daf�r, das der Distance-Wert NICHT ver�ndert wurde !!!!
459 			aMtrDistance.SetText( String() );
460 			aCtlPosition.SetActualRP( RP_MM );
461 		}
462 
463 		// SchattenFarbe:
464 		if( rAttrs.GetItemState( SDRATTR_SHADOWCOLOR ) != SFX_ITEM_DONTCARE )
465 		{
466 			aLbShadowColor.SelectEntry( ( ( const SdrShadowColorItem& ) rAttrs.Get( SDRATTR_SHADOWCOLOR ) ).GetColorValue() );
467 		}
468 		else
469 			aLbShadowColor.SetNoSelection();
470 
471 		// Transparenz
472 		if( rAttrs.GetItemState( SDRATTR_SHADOWTRANSPARENCE ) != SFX_ITEM_DONTCARE )
473 		{
474 			sal_uInt16 nTransp = ( ( const SdrShadowTransparenceItem& ) rAttrs.Get( SDRATTR_SHADOWTRANSPARENCE ) ).GetValue();
475 			aMtrTransparent.SetValue( nTransp );
476 		}
477 		else
478 			aMtrTransparent.SetText( String() );
479 
480 		// Werte sichern
481 		//aCtlPosition
482 		aMtrDistance.SaveValue();
483 		aLbShadowColor.SaveValue();
484 		aTsbShowShadow.SaveValue();
485 
486 		// #66832# This field was not saved, but used to determine changes.
487 		// Why? Seems to be the error.
488 		// It IS the error.
489 		aMtrTransparent.SaveValue();
490 
491 		ClickShadowHdl_Impl( NULL );
492 		ModifyShadowHdl_Impl( NULL );
493 	}
494 }
495 
496 // -----------------------------------------------------------------------
497 
498 SfxTabPage* SvxShadowTabPage::Create( Window* pWindow,
499 				const SfxItemSet& rAttrs )
500 {
501 	return( new SvxShadowTabPage( pWindow, rAttrs ) );
502 }
503 
504 //------------------------------------------------------------------------
505 
506 sal_uInt16*	SvxShadowTabPage::GetRanges()
507 {
508 	return( pShadowRanges );
509 }
510 
511 //------------------------------------------------------------------------
512 
513 IMPL_LINK( SvxShadowTabPage, ClickShadowHdl_Impl, void *, EMPTYARG )
514 {
515 	if( aTsbShowShadow.GetState() == STATE_NOCHECK )
516 	{
517 		aFtPosition.Disable();
518 		aCtlPosition.Disable();
519 		aFtDistance.Disable();
520 		aMtrDistance.Disable();
521 		aFtShadowColor.Disable();
522 		aLbShadowColor.Disable();
523 		aFtTransparent.Disable();
524 		aMtrTransparent.Disable();
525 	}
526 	else
527 	{
528 		aFtPosition.Enable();
529 		aCtlPosition.Enable();
530 		aFtDistance.Enable();
531 		aMtrDistance.Enable();
532 		aFtShadowColor.Enable();
533 		aLbShadowColor.Enable();
534 		aFtTransparent.Enable();
535 		aMtrTransparent.Enable();
536 	}
537 	aCtlPosition.Invalidate();
538 
539 	ModifyShadowHdl_Impl( NULL );
540 
541 	return( 0L );
542 }
543 
544 //------------------------------------------------------------------------
545 
546 IMPL_LINK( SvxShadowTabPage, ModifyShadowHdl_Impl, void *, EMPTYARG )
547 {
548 	if( aTsbShowShadow.GetState() == STATE_CHECK )
549 		rXFSet.Put( XFillStyleItem( XFILL_SOLID ) );
550 	else
551 		rXFSet.Put( XFillStyleItem( XFILL_NONE ) );
552 
553 	sal_uInt16 nPos = aLbShadowColor.GetSelectEntryPos();
554 	if( nPos != LISTBOX_ENTRY_NOTFOUND )
555 	{
556 		rXFSet.Put( XFillColorItem( String(),
557 						aLbShadowColor.GetSelectEntryColor() ) );
558 	}
559 	sal_uInt16 nVal = (sal_uInt16)aMtrTransparent.GetValue();
560 	XFillTransparenceItem aItem( nVal );
561 	rXFSet.Put( XFillTransparenceItem( aItem ) );
562 
563 	// Schatten-Entfernung
564 	sal_Int32 nX = 0L, nY = 0L;
565 	sal_Int32 nXY = GetCoreValue( aMtrDistance, ePoolUnit );
566 	switch( aCtlPosition.GetActualRP() )
567 	{
568 		case RP_LT: nX = nY = -nXY; 	 break;
569 		case RP_MT: nY = -nXY;			 break;
570 		case RP_RT: nX = nXY; nY = -nXY; break;
571 		case RP_LM: nX = -nXY;			 break;
572 		case RP_RM: nX = nXY;			 break;
573 		case RP_LB: nX = -nXY; nY = nXY; break;
574 		case RP_MB: nY = nXY; 			 break;
575 		case RP_RB: nX = nY = nXY; 		 break;
576         case RP_MM: break;
577     }
578 
579     aCtlXRectPreview.SetShadowPosition(Point(nX, nY));
580 
581 	aCtlXRectPreview.SetShadowAttributes(aXFillAttr.GetItemSet());
582 	//aCtlXRectPreview.SetFillAttr( aXFillAttr );
583 	aCtlXRectPreview.Invalidate();
584 
585 	return( 0L );
586 }
587 
588 //------------------------------------------------------------------------
589 
590 void SvxShadowTabPage::PointChanged( Window* pWindow, RECT_POINT eRcPt )
591 {
592 	eRP = eRcPt;
593 
594 	// Schatten neu zeichnen
595 	ModifyShadowHdl_Impl( pWindow );
596 }
597 
598 void SvxShadowTabPage::PageCreated (SfxAllItemSet aSet) //add CHINA001
599 {
600 	SFX_ITEMSET_ARG (&aSet,pColorTabItem,SvxColorTableItem,SID_COLOR_TABLE,sal_False);
601 	SFX_ITEMSET_ARG (&aSet,pPageTypeItem,SfxUInt16Item,SID_PAGE_TYPE,sal_False);
602 	SFX_ITEMSET_ARG (&aSet,pDlgTypeItem,SfxUInt16Item,SID_DLG_TYPE,sal_False);
603 
604 
605 	if (pColorTabItem)
606 		SetColorTable(pColorTabItem->GetColorTable());
607 	if (pPageTypeItem)
608 		SetPageType(pPageTypeItem->GetValue());
609 	if (pDlgTypeItem)
610 		SetDlgType(pDlgTypeItem->GetValue());
611 	Construct();
612 }
613