xref: /aoo42x/main/svx/source/tbxctrls/fillctrl.cxx (revision 97e8a929)
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 
29 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers
30 #include <sfx2/app.hxx>
31 #include <sfx2/dispatch.hxx>
32 #include <sfx2/objsh.hxx>
33 #include <sfx2/viewsh.hxx>
34 #include <rtl/ustring.hxx>
35 
36 #include <svx/dialogs.hrc>
37 
38 #define DELAY_TIMEOUT			300
39 
40 #define TMP_STR_BEGIN	'['
41 #define TMP_STR_END		']'
42 
43 #include "svx/drawitem.hxx"
44 #include "svx/xattr.hxx"
45 #include <svx/xtable.hxx>
46 #include <svx/fillctrl.hxx>
47 #include <svx/itemwin.hxx>
48 #include <svx/dialmgr.hxx>
49 #include "helpid.hrc"
50 
51 using namespace ::com::sun::star::uno;
52 using namespace ::com::sun::star::util;
53 using namespace ::com::sun::star::beans;
54 using namespace ::com::sun::star::frame;
55 using namespace ::com::sun::star::lang;
56 
57 SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem );
58 
59 /*************************************************************************
60 |*
61 |* SvxFillToolBoxControl
62 |*
63 \************************************************************************/
64 
65 SvxFillToolBoxControl::SvxFillToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
66 	SfxToolBoxControl( nSlotId, nId, rTbx ),
67 
68 	pStyleItem		( NULL ),
69 	pColorItem		( NULL ),
70 	pGradientItem	( NULL ),
71 	pHatchItem		( NULL ),
72 	pBitmapItem		( NULL ),
73 	pFillControl	( NULL ),
74 	pFillTypeLB		( NULL ),
75 	pFillAttrLB		( NULL ),
76 	bUpdate			( sal_False ),
77     bIgnoreStatusUpdate( sal_False ),
78     eLastXFS        ( XFILL_NONE )
79 {
80     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )));
81     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )));
82     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )));
83     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillBitmap" )));
84     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
85     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GradientListState" )));
86     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:HatchListState" )));
87     addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BitmapListState" )));
88 }
89 
90 //========================================================================
91 
92 SvxFillToolBoxControl::~SvxFillToolBoxControl()
93 {
94 	delete pStyleItem;
95 	delete pColorItem;
96 	delete pGradientItem;
97 	delete pHatchItem;
98 	delete pBitmapItem;
99 }
100 
101 //========================================================================
102 
103 void SvxFillToolBoxControl::StateChanged(
104 
105 	sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
106 
107 {
108 	bool bEnableControls = sal_False;
109 
110     if ( bIgnoreStatusUpdate )
111         return;
112 
113 	if( eState == SFX_ITEM_DISABLED )
114 	{
115 		if( nSID == SID_ATTR_FILL_STYLE )
116 		{
117 			pFillTypeLB->Disable();
118 			pFillTypeLB->SetNoSelection();
119 		}
120 		pFillAttrLB->Disable();
121 		pFillAttrLB->SetNoSelection();
122 	}
123 	else
124 	{
125 		if ( SFX_ITEM_AVAILABLE == eState )
126 		{
127 			if( nSID == SID_ATTR_FILL_STYLE )
128 			{
129 				delete pStyleItem;
130 				pStyleItem = (XFillStyleItem*) pState->Clone();
131 				pFillTypeLB->Enable();
132 			}
133 			else if( pStyleItem )
134 			{
135 				XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
136 
137 				if( nSID == SID_ATTR_FILL_COLOR )
138 				{
139 					delete pColorItem;
140 					pColorItem = (XFillColorItem*) pState->Clone();
141 
142 					if( eXFS == XFILL_SOLID )
143 						bEnableControls = sal_True;
144 				}
145 				else if( nSID == SID_ATTR_FILL_GRADIENT )
146 				{
147 					delete pGradientItem;
148 					pGradientItem = (XFillGradientItem*) pState->Clone();
149 
150 					if( eXFS == XFILL_GRADIENT )
151 						bEnableControls = sal_True;
152 				}
153 				else if( nSID == SID_ATTR_FILL_HATCH )
154 				{
155 					delete pHatchItem;
156 					pHatchItem = (XFillHatchItem*) pState->Clone();
157 
158 					if( eXFS == XFILL_HATCH )
159 						bEnableControls = sal_True;
160 				}
161 				else if( nSID == SID_ATTR_FILL_BITMAP )
162 				{
163 					delete pBitmapItem;
164 					pBitmapItem = (XFillBitmapItem*) pState->Clone();
165 
166 					if( eXFS == XFILL_BITMAP )
167 						bEnableControls = sal_True;
168 				}
169 			}
170 
171             if( pStyleItem )
172             {
173                 // ensure that the correct entry is selected in pFillTypeLB. It
174                 // might have been changed by nSID == SID_ATTR_FILL_STYLE, but
175                 // it might also be in an in-between state when user had started to
176                 // change fillstyle, but not yet changed fillvalue for new style
177                 // and when nSID == SID_ATTR_FILL_COLOR/SID_ATTR_FILL_GRADIENT/
178                 // SID_ATTR_FILL_HATCH/SID_ATTR_FILL_BITMAP value change is triggered
179                 eLastXFS = pFillTypeLB->GetSelectEntryPos();
180                 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
181 
182                 if(eLastXFS != eXFS)
183                 {
184                     bUpdate = sal_True;
185                     pFillTypeLB->SelectEntryPos( sal::static_int_cast< sal_uInt16 >( eXFS ) );
186                 }
187 
188                 pFillAttrLB->Enable();
189             }
190 
191             if( bEnableControls )
192 			{
193 				//pFillTypeLB->Enable();
194 				pFillAttrLB->Enable();
195 
196 				bUpdate = sal_True;
197 			}
198 
199             Update( pState );
200         }
201 		else
202 		{
203 			// leerer oder uneindeutiger Status
204 			if( nSID == SID_ATTR_FILL_STYLE )
205 			{
206 				pFillTypeLB->SetNoSelection();
207 				pFillAttrLB->Disable();
208 				pFillAttrLB->SetNoSelection();
209 				bUpdate = sal_False;
210 			}
211 			else
212 			{
213 				XFillStyle eXFS = XFILL_NONE;
214 				if( pStyleItem )
215 					eXFS = (XFillStyle)pStyleItem->GetValue();
216 				if( !pStyleItem ||
217 					( nSID == SID_ATTR_FILL_COLOR	 && eXFS == XFILL_SOLID ) ||
218 					( nSID == SID_ATTR_FILL_GRADIENT && eXFS == XFILL_GRADIENT ) ||
219 					( nSID == SID_ATTR_FILL_HATCH 	 && eXFS == XFILL_HATCH ) ||
220 					( nSID == SID_ATTR_FILL_BITMAP 	 && eXFS == XFILL_BITMAP ) )
221 				{
222 					pFillAttrLB->SetNoSelection();
223 					//bUpdate = sal_False;
224 				}
225 			}
226 		}
227 	}
228 }
229 
230 //========================================================================
231 
232 void SvxFillToolBoxControl::IgnoreStatusUpdate( sal_Bool bSet )
233 {
234     bIgnoreStatusUpdate = bSet;
235 }
236 
237 //========================================================================
238 
239 void SvxFillToolBoxControl::Update( const SfxPoolItem* pState )
240 {
241 	if ( pStyleItem && pState && bUpdate )
242 	{
243 		bUpdate = sal_False;
244 
245 		XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
246 
247 		// Pruefen, ob Fuellstil schon vorher aktiv war
248 		//if( eTmpXFS != eXFS )
249 		if( (XFillStyle) eLastXFS != eXFS )
250 			pFillControl->SelectFillTypeHdl( NULL );
251 			//eLastXFS = eXFS;
252 
253 		switch( eXFS )
254 		{
255 			case XFILL_NONE:
256 			break;
257 
258 			case XFILL_SOLID:
259 			{
260 				if ( pColorItem )
261 				{
262 					String aString( pColorItem->GetName() );
263                     ::Color aColor = pColorItem->GetColorValue();
264 
265 					pFillAttrLB->SelectEntry( aString );
266 
267 					if ( pFillAttrLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ||
268 						 pFillAttrLB->GetSelectEntryColor() != aColor )
269 						pFillAttrLB->SelectEntry( aColor );
270 
271 					// NEU
272 					// Pruefen, ob Eintrag nicht in der Liste ist
273 					if( pFillAttrLB->GetSelectEntryPos() ==
274 						LISTBOX_ENTRY_NOTFOUND ||
275 						pFillAttrLB->GetSelectEntryColor() != aColor )
276 					{
277 						sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
278 						String aTmpStr;
279 						if( nCount > 0 )
280 						{
281 							//Letzter Eintrag wird auf temporaere Farbe geprueft
282 							aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
283 							if(  aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
284 								 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
285 							{
286 								pFillAttrLB->RemoveEntry( nCount - 1 );
287 							}
288 						}
289 						aTmpStr = TMP_STR_BEGIN;
290 						aTmpStr += aString;
291 						aTmpStr += TMP_STR_END;
292 
293 						//pFillAttrLB->SetUpdateMode( sal_False );
294 						sal_uInt16 nPos = pFillAttrLB->InsertEntry( aColor, aTmpStr );
295 						//pFillAttrLB->SetUpdateMode( sal_True );
296 						pFillAttrLB->SelectEntryPos( nPos );
297 					}
298 					// NEU
299 				}
300 				else
301 					pFillAttrLB->SetNoSelection();
302 			}
303 			break;
304 
305 			case XFILL_GRADIENT:
306 			{
307 				if ( pGradientItem )
308 				{
309 					String aString( pGradientItem->GetName() );
310 					pFillAttrLB->SelectEntry( aString );
311 					// NEU
312 					// Pruefen, ob Eintrag nicht in der Liste ist
313 					if( pFillAttrLB->GetSelectEntry() != aString )
314 					{
315 						sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
316 						String aTmpStr;
317 						if( nCount > 0 )
318 						{
319 							//Letzter Eintrag wird auf temporaeren Eintrag geprueft
320 							aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
321 							if(  aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
322 								 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
323 							{
324 								pFillAttrLB->RemoveEntry( nCount - 1 );
325 							}
326 						}
327 						aTmpStr = TMP_STR_BEGIN;
328 						aTmpStr += aString;
329 						aTmpStr += TMP_STR_END;
330 
331 						XGradientEntry* pEntry = new XGradientEntry( pGradientItem->GetGradientValue(), aTmpStr );
332 						String aEmptyString = String();
333  						XGradientList aGradientList( aEmptyString );
334 						aGradientList.Insert( pEntry );
335 						aGradientList.SetDirty( sal_False );
336 						const Bitmap aBmp = aGradientList.GetUiBitmap( 0 );
337 
338 						if( !aBmp.IsEmpty() )
339 						{
340 							( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), aBmp );
341 							pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
342 							//delete pBmp;
343 						}
344 
345 						aGradientList.Remove( 0 );
346 						delete pEntry;
347 					}
348 					// NEU
349 				}
350 				else
351 					pFillAttrLB->SetNoSelection();
352 			}
353 			break;
354 
355 			case XFILL_HATCH:
356 			{
357 				if ( pHatchItem )
358 				{
359 					String aString( pHatchItem->GetName() );
360 					pFillAttrLB->SelectEntry( aString );
361 					// NEU
362 					// Pruefen, ob Eintrag nicht in der Liste ist
363 					if( pFillAttrLB->GetSelectEntry() != aString )
364 					{
365 						sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
366 						String aTmpStr;
367 						if( nCount > 0 )
368 						{
369 							//Letzter Eintrag wird auf temporaeren Eintrag geprueft
370 							aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
371 							if(  aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
372 								 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
373 							{
374 								pFillAttrLB->RemoveEntry( nCount - 1 );
375 							}
376 						}
377 						aTmpStr = TMP_STR_BEGIN;
378 						aTmpStr += aString;
379 						aTmpStr += TMP_STR_END;
380 
381 						XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr );
382 						String aEmptyString = String();
383 						XHatchList aHatchList( aEmptyString );
384 						aHatchList.Insert( pEntry );
385 						aHatchList.SetDirty( sal_False );
386 						const Bitmap aBmp = aHatchList.GetUiBitmap( 0 );
387 
388 						if( !aBmp.IsEmpty() )
389 						{
390 							( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), aBmp );
391 							pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
392 							//delete pBmp;
393 						}
394 
395 						aHatchList.Remove( 0 );
396 						delete pEntry;
397 					}
398 					// NEU
399 				}
400 				else
401 					pFillAttrLB->SetNoSelection();
402 			}
403 			break;
404 
405 			case XFILL_BITMAP:
406 			{
407 				if ( pBitmapItem )
408 					// &&
409 					// SfxObjectShell::Current() 	&&
410 					// SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) )
411 				{
412 					String aString( pBitmapItem->GetName() );
413 					// Bitmap aBitmap( pBitmapItem->GetValue() );
414 
415 					// SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
416 					// 	SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) );
417 					pFillAttrLB->SelectEntry( aString );
418 					// NEU
419 					// Pruefen, ob Eintrag nicht in der Liste ist
420 					if( pFillAttrLB->GetSelectEntry() != aString )
421 					{
422 						sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
423 						String aTmpStr;
424 						if( nCount > 0 )
425 						{
426 							//Letzter Eintrag wird auf temporaeren Eintrag geprueft
427 							aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
428 							if(  aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
429 								 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
430 							{
431 								pFillAttrLB->RemoveEntry( nCount - 1 );
432 							}
433 						}
434 						aTmpStr = TMP_STR_BEGIN;
435 						aTmpStr += aString;
436 						aTmpStr += TMP_STR_END;
437 
438 						XBitmapEntry* pEntry = new XBitmapEntry(pBitmapItem->GetGraphicObject(), aTmpStr);
439 						XBitmapList aBitmapList( String::CreateFromAscii("TmpList") );
440 						aBitmapList.Insert( pEntry );
441 						aBitmapList.SetDirty( sal_False );
442 						pFillAttrLB->Fill( &aBitmapList );
443 						pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
444 						aBitmapList.Remove( 0 );
445 						delete pEntry;
446 					}
447 					// NEU
448 				}
449 				else
450 					pFillAttrLB->SetNoSelection();
451 			}
452 			break;
453 
454 			default:
455 				DBG_ERROR( "Nicht unterstuetzter Flaechentyp" );
456 			break;
457 		}
458 	}
459 
460 	if( pState && pStyleItem )
461 	{
462 		XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue();
463 
464 		// Die Listen haben sich geaendert ?
465 		if( pState->ISA( SvxColorTableItem ) &&
466 			eXFS == XFILL_SOLID )
467 		{
468 			::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() );
469 			pFillAttrLB->Clear();
470 			pFillAttrLB->Fill( ( (SvxColorTableItem*)pState )->GetColorTable() );
471 			pFillAttrLB->SelectEntry( aTmpColor );
472 		}
473 		if( pState->ISA( SvxGradientListItem ) &&
474 			eXFS == XFILL_GRADIENT )
475 		{
476 			String aString( pFillAttrLB->GetSelectEntry() );
477 			pFillAttrLB->Clear();
478 			pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() );
479 			pFillAttrLB->SelectEntry( aString );
480 		}
481 		if( pState->ISA( SvxHatchListItem ) &&
482 			eXFS == XFILL_HATCH )
483 		{
484 			String aString( pFillAttrLB->GetSelectEntry() );
485 			pFillAttrLB->Clear();
486 			pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() );
487 			pFillAttrLB->SelectEntry( aString );
488 		}
489 		if( pState->ISA( SvxBitmapListItem ) &&
490 			eXFS == XFILL_BITMAP )
491 		{
492 			String aString( pFillAttrLB->GetSelectEntry() );
493 			pFillAttrLB->Clear();
494 			pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() );
495 			pFillAttrLB->SelectEntry( aString );
496 		}
497 	}
498 }
499 
500 //========================================================================
501 
502 Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent )
503 {
504 	if ( GetSlotId() == SID_ATTR_FILL_STYLE )
505 	{
506 		pFillControl = new FillControl( pParent );
507 		// Damit dem FillControl das SvxFillToolBoxControl bekannt ist
508 		// (und um kompatibel zu bleiben)
509 		pFillControl->SetData( this );
510 
511 		pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr;
512 		pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType;
513 
514 		pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX );
515 		pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX );
516 
517 		return pFillControl;
518 	}
519 	return NULL;
520 }
521 
522 /*************************************************************************
523 |*
524 |* FillControl
525 |*
526 \************************************************************************/
527 
528 FillControl::FillControl( Window* pParent, WinBits nStyle ) :
529     Window( pParent, nStyle | WB_DIALOGCONTROL ),
530     pLbFillType(new SvxFillTypeBox( this )),
531     aLogicalFillSize(40,80),
532     aLogicalAttrSize(50,80)
533 {
534     pLbFillAttr = new SvxFillAttrBox( this );
535     Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
536     Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
537     pLbFillType->SetSizePixel(aTypeSize);
538     pLbFillAttr->SetSizePixel(aAttrSize);
539     //to get the base height
540     aTypeSize = pLbFillType->GetSizePixel();
541     aAttrSize = pLbFillAttr->GetSizePixel();
542     Point aAttrPnt = pLbFillAttr->GetPosPixel();
543 	SetSizePixel(
544 		Size( aAttrPnt.X() + aAttrSize.Width(),
545 			  Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
546 
547 	pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) );
548 	pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) );
549 
550 	aDelayTimer.SetTimeout( DELAY_TIMEOUT );
551 	aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) );
552 	aDelayTimer.Start();
553 }
554 
555 //------------------------------------------------------------------------
556 
557 FillControl::~FillControl()
558 {
559 	delete pLbFillType;
560 	delete pLbFillAttr;
561 }
562 
563 //------------------------------------------------------------------------
564 
565 IMPL_LINK_INLINE_START( FillControl, DelayHdl, Timer *, EMPTYARG )
566 {
567 	SelectFillTypeHdl( NULL );
568     ( (SvxFillToolBoxControl*)GetData() )->updateStatus( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )));
569 //	( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE );
570 	return 0;
571 }
572 IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer )
573 
574 //------------------------------------------------------------------------
575 
576 IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox )
577 {
578 	XFillStyle  eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
579 
580 	// Spaeter sollte eine Optimierung derart erfolgen, dass die
581 	// Listen, bzw. Tables nur dann geloescht und wieder aufgebaut
582 	// werden, wenn sich die Listen, bzw. Tables tatsaechlich geaendert
583 	// haben (in den LBs natuerlich).
584 
585 	if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox )
586 	{
587 		// Damit wir in folgendem Fall einen Status anzeigen koennen:
588 		// Ein Typ wurde ausgewaehlt aber kein Attribut.
589 		// Die Selektion hat genau die gleichen Attribute wie die vorherige.
590 //		SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData();
591 //		if( pControlerItem )
592 //			pControlerItem->ClearCache();
593 
594 		pLbFillAttr->Clear();
595 		SfxObjectShell* pSh = SfxObjectShell::Current();
596 
597 		switch( eXFS )
598 		{
599 			case XFILL_NONE:
600 			{
601 				pLbFillType->Selected();
602 				SelectFillAttrHdl( pBox );
603 				pLbFillAttr->Disable();
604 			}
605 			break;
606 
607 			case XFILL_SOLID:
608 			{
609 				if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) )
610 				{
611 					SvxColorTableItem aItem( *(const SvxColorTableItem*)(
612 						pSh->GetItem( SID_COLOR_TABLE ) ) );
613 					pLbFillAttr->Enable();
614 					pLbFillAttr->Fill( aItem.GetColorTable() );
615 				}
616 				else
617 					pLbFillAttr->Disable();
618 			}
619 			break;
620 
621 			case XFILL_GRADIENT:
622 			{
623 				if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
624 				{
625 					SvxGradientListItem aItem( *(const SvxGradientListItem*)(
626 						pSh->GetItem( SID_GRADIENT_LIST ) ) );
627 					pLbFillAttr->Enable();
628 					pLbFillAttr->Fill( aItem.GetGradientList() );
629 				}
630 				else
631 					pLbFillAttr->Disable();
632 			}
633 			break;
634 
635 			case XFILL_HATCH:
636 			{
637 				if ( pSh && pSh->GetItem( SID_HATCH_LIST ) )
638 				{
639 					SvxHatchListItem aItem( *(const SvxHatchListItem*)(
640 						pSh->GetItem( SID_HATCH_LIST ) ) );
641 					pLbFillAttr->Enable();
642 					pLbFillAttr->Fill( aItem.GetHatchList() );
643 				}
644 				else
645 					pLbFillAttr->Disable();
646 			}
647 			break;
648 
649 			case XFILL_BITMAP:
650 			{
651 				if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) )
652 				{
653 					SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
654 						pSh->GetItem( SID_BITMAP_LIST ) ) );
655 					pLbFillAttr->Enable();
656 					pLbFillAttr->Fill( aItem.GetBitmapList() );
657 				}
658 				else
659 					pLbFillAttr->Disable();
660 			}
661 			break;
662 		}
663 
664 		if( eXFS != XFILL_NONE ) // Wurde schon erledigt
665 		{
666 			if ( pBox )
667 				pLbFillType->Selected();
668 
669 			// release focus
670             if ( pBox && pLbFillType->IsRelease() )
671 			{
672 				SfxViewShell* pViewShell = SfxViewShell::Current();
673 				if( pViewShell && pViewShell->GetWindow() )
674 					pViewShell->GetWindow()->GrabFocus();
675 			}
676 		}
677     }
678 	return 0;
679 }
680 
681 //------------------------------------------------------------------------
682 
683 IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox )
684 {
685 	XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
686 	XFillStyleItem aXFillStyleItem( eXFS );
687 	sal_Bool bAction = pBox && !pLbFillAttr->IsTravelSelect();
688 
689 	SfxObjectShell* pSh = SfxObjectShell::Current();
690     if ( bAction )
691     {
692         Any a;
693         Sequence< PropertyValue > aArgs( 1 );
694 
695         // First set the style
696         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ));
697         aXFillStyleItem.QueryValue(  a );
698         aArgs[0].Value = a;
699         ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( sal_True );
700         ((SvxFillToolBoxControl*)GetData())->Dispatch(
701             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )), aArgs );
702         ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( sal_False );
703 
704         switch( eXFS )
705         {
706             case XFILL_NONE:
707             {
708             }
709             break;
710 
711             case XFILL_SOLID:
712             {
713                 // NEU
714                 //Eintrag wird auf temporaere Farbe geprueft
715                 String aTmpStr = pLbFillAttr->GetSelectEntry();
716                 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
717                 {
718                     aTmpStr.Erase( aTmpStr.Len()-1, 1 );
719                     aTmpStr.Erase( 0, 1 );
720                 }
721 
722                 XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() );
723 
724                 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ));
725                 aXFillColorItem.QueryValue( a );
726                 aArgs[0].Value = a;
727                 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )),
728                                                                aArgs );
729             }
730             break;
731             case XFILL_GRADIENT:
732             {
733                 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
734 
735                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
736                 {
737                     SvxGradientListItem aItem(
738                         *(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) );
739 
740                     if ( nPos < aItem.GetGradientList()->Count() )  // kein temp. Eintrag ?
741                     {
742                         XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient();
743                         XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient );
744 
745                         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ));
746                         aXFillGradientItem.QueryValue( a );
747                         aArgs[0].Value = a;
748                         ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )),
749                                                                        aArgs );
750                     }
751                 }
752             }
753             break;
754 
755             case XFILL_HATCH:
756             {
757                 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
758 
759                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) )
760                 {
761                     SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) );
762 
763                     if ( nPos < aItem.GetHatchList()->Count() )  // kein temp. Eintrag ?
764                     {
765                         XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch();
766                         XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch );
767 
768                         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ));
769                         aXFillHatchItem.QueryValue( a );
770                         aArgs[0].Value = a;
771                         ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )),
772                                                                        aArgs );
773                     }
774                 }
775             }
776             break;
777 
778             case XFILL_BITMAP:
779             {
780                 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
781 
782                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) )
783                 {
784                     SvxBitmapListItem aItem(
785                         *(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) );
786 
787                     if ( nPos < aItem.GetBitmapList()->Count() )  // kein temp. Eintrag ?
788                     {
789                         const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
790                         const XFillBitmapItem aXFillBitmapItem(pLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
791 
792                         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmap" ));
793                         aXFillBitmapItem.QueryValue( a );
794                         aArgs[0].Value = a;
795                         ((SvxFillToolBoxControl*)GetData())->Dispatch(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:FillBitmap")), aArgs);
796                     }
797                 }
798             }
799             break;
800         }
801 
802         // release focus
803         if ( pLbFillAttr->IsRelease()  && pBox )
804 		{
805 			SfxViewShell* pViewShell = SfxViewShell::Current();
806 			if( pViewShell && pViewShell->GetWindow() )
807 			{
808 	            pViewShell->GetWindow()->GrabFocus();
809 			}
810 		}
811     }
812 
813     return 0;
814 }
815 
816 //------------------------------------------------------------------------
817 
818 void FillControl::Resize()
819 {
820 	// Breite der beiden ListBoxen nicht 1/2 : 1/2, sondern 2/5 : 3/5
821 	long nW = GetOutputSizePixel().Width() / 5;
822 	long nH = 180;
823 	long nSep = 0; // war vorher 4
824 
825 	pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) );
826 	pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) );
827 }
828 /* -----------------------------08.03.2002 15:04------------------------------
829 
830  ---------------------------------------------------------------------------*/
831 
832 void FillControl::DataChanged( const DataChangedEvent& rDCEvt )
833 {
834 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
835          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
836     {
837         Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
838         Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
839         pLbFillType->SetSizePixel(aTypeSize);
840         pLbFillAttr->SetSizePixel(aAttrSize);
841         //to get the base height
842         aTypeSize = pLbFillType->GetSizePixel();
843         aAttrSize = pLbFillAttr->GetSizePixel();
844         Point aAttrPnt = pLbFillAttr->GetPosPixel();
845 
846         SetSizePixel(
847             Size( aAttrPnt.X() + aAttrSize.Width(),
848                 Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
849     }
850     Window::DataChanged( rDCEvt );
851 }
852 
853