xref: /AOO41X/main/svx/source/tbxctrls/fillctrl.cxx (revision 4689730ce39795730cf88050013c1780e66ef76e)
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                         XGradientListSharedPtr aGradientList(XPropertyListFactory::CreateSharedXGradientList(String::CreateFromAscii("TmpList")));
333 
334                         aGradientList->Insert(pEntry);
335                         aGradientList->SetDirty(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                         }
343                     }
344                     // NEU
345                 }
346                 else
347                     pFillAttrLB->SetNoSelection();
348             }
349             break;
350 
351             case XFILL_HATCH:
352             {
353                 if ( pHatchItem )
354                 {
355                     String aString( pHatchItem->GetName() );
356                     pFillAttrLB->SelectEntry( aString );
357                     // NEU
358                     // Pruefen, ob Eintrag nicht in der Liste ist
359                     if( pFillAttrLB->GetSelectEntry() != aString )
360                     {
361                         sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
362                         String aTmpStr;
363                         if( nCount > 0 )
364                         {
365                             //Letzter Eintrag wird auf temporaeren Eintrag geprueft
366                             aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
367                             if(  aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
368                                  aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
369                             {
370                                 pFillAttrLB->RemoveEntry( nCount - 1 );
371                             }
372                         }
373                         aTmpStr = TMP_STR_BEGIN;
374                         aTmpStr += aString;
375                         aTmpStr += TMP_STR_END;
376 
377                         XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr );
378                         XHatchListSharedPtr aHatchList(XPropertyListFactory::CreateSharedXHatchList(String::CreateFromAscii("TmpList")));
379 
380                         aHatchList->Insert( pEntry );
381                         aHatchList->SetDirty( sal_False );
382                         const Bitmap aBmp = aHatchList->GetUiBitmap( 0 );
383 
384                         if( !aBmp.IsEmpty() )
385                         {
386                             ( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), aBmp );
387                             pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
388                         }
389                     }
390                     // NEU
391                 }
392                 else
393                     pFillAttrLB->SetNoSelection();
394             }
395             break;
396 
397             case XFILL_BITMAP:
398             {
399                 if ( pBitmapItem )
400                     // &&
401                     // SfxObjectShell::Current()    &&
402                     // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) )
403                 {
404                     String aString( pBitmapItem->GetName() );
405                     // Bitmap aBitmap( pBitmapItem->GetValue() );
406 
407                     // SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
408                     //  SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) );
409                     pFillAttrLB->SelectEntry( aString );
410                     // NEU
411                     // Pruefen, ob Eintrag nicht in der Liste ist
412                     if( pFillAttrLB->GetSelectEntry() != aString )
413                     {
414                         sal_uInt16 nCount = pFillAttrLB->GetEntryCount();
415                         String aTmpStr;
416                         if( nCount > 0 )
417                         {
418                             //Letzter Eintrag wird auf temporaeren Eintrag geprueft
419                             aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
420                             if(  aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
421                                  aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
422                             {
423                                 pFillAttrLB->RemoveEntry( nCount - 1 );
424                             }
425                         }
426                         aTmpStr = TMP_STR_BEGIN;
427                         aTmpStr += aString;
428                         aTmpStr += TMP_STR_END;
429 
430                         XBitmapListSharedPtr aNew(XPropertyListFactory::CreateSharedXBitmapList(String::CreateFromAscii("TmpList")));
431                         aNew->Insert(new XBitmapEntry(pBitmapItem->GetGraphicObject(), aTmpStr));
432                         aNew->SetDirty(false);
433 
434                         pFillAttrLB->Fill( aNew );
435                         pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
436                     }
437                     // NEU
438                 }
439                 else
440                     pFillAttrLB->SetNoSelection();
441             }
442             break;
443 
444             default:
445                 DBG_ERROR( "Nicht unterstuetzter Flaechentyp" );
446             break;
447         }
448     }
449 
450     if( pState && pStyleItem )
451     {
452         XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue();
453 
454         // Die Listen haben sich geaendert ?
455         if( pState->ISA( SvxColorTableItem ) &&
456             eXFS == XFILL_SOLID )
457         {
458             ::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() );
459             pFillAttrLB->Clear();
460             pFillAttrLB->Fill( ( (SvxColorTableItem*)pState )->GetColorTable() );
461             pFillAttrLB->SelectEntry( aTmpColor );
462         }
463         if( pState->ISA( SvxGradientListItem ) &&
464             eXFS == XFILL_GRADIENT )
465         {
466             String aString( pFillAttrLB->GetSelectEntry() );
467             pFillAttrLB->Clear();
468             pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() );
469             pFillAttrLB->SelectEntry( aString );
470         }
471         if( pState->ISA( SvxHatchListItem ) &&
472             eXFS == XFILL_HATCH )
473         {
474             String aString( pFillAttrLB->GetSelectEntry() );
475             pFillAttrLB->Clear();
476             pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() );
477             pFillAttrLB->SelectEntry( aString );
478         }
479         if( pState->ISA( SvxBitmapListItem ) &&
480             eXFS == XFILL_BITMAP )
481         {
482             String aString( pFillAttrLB->GetSelectEntry() );
483             pFillAttrLB->Clear();
484             pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() );
485             pFillAttrLB->SelectEntry( aString );
486         }
487     }
488 }
489 
490 //========================================================================
491 
492 Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent )
493 {
494     if ( GetSlotId() == SID_ATTR_FILL_STYLE )
495     {
496         pFillControl = new FillControl( pParent );
497         // Damit dem FillControl das SvxFillToolBoxControl bekannt ist
498         // (und um kompatibel zu bleiben)
499         pFillControl->SetData( this );
500 
501         pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr;
502         pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType;
503 
504         pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX );
505         pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX );
506 
507         return pFillControl;
508     }
509     return NULL;
510 }
511 
512 /*************************************************************************
513 |*
514 |* FillControl
515 |*
516 \************************************************************************/
517 
518 FillControl::FillControl( Window* pParent, WinBits nStyle ) :
519     Window( pParent, nStyle | WB_DIALOGCONTROL ),
520     pLbFillType(new SvxFillTypeBox( this )),
521     aLogicalFillSize(40,80),
522     aLogicalAttrSize(50,80)
523 {
524     pLbFillAttr = new SvxFillAttrBox( this );
525     Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
526     Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
527     pLbFillType->SetSizePixel(aTypeSize);
528     pLbFillAttr->SetSizePixel(aAttrSize);
529     //to get the base height
530     aTypeSize = pLbFillType->GetSizePixel();
531     aAttrSize = pLbFillAttr->GetSizePixel();
532     Point aAttrPnt = pLbFillAttr->GetPosPixel();
533     SetSizePixel(
534         Size( aAttrPnt.X() + aAttrSize.Width(),
535               Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
536 
537     pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) );
538     pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) );
539 
540     aDelayTimer.SetTimeout( DELAY_TIMEOUT );
541     aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) );
542     aDelayTimer.Start();
543 }
544 
545 //------------------------------------------------------------------------
546 
547 FillControl::~FillControl()
548 {
549     delete pLbFillType;
550     delete pLbFillAttr;
551 }
552 
553 //------------------------------------------------------------------------
554 
555 IMPL_LINK_INLINE_START( FillControl, DelayHdl, Timer *, EMPTYARG )
556 {
557     SelectFillTypeHdl( NULL );
558     ( (SvxFillToolBoxControl*)GetData() )->updateStatus( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )));
559 //  ( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE );
560     return 0;
561 }
562 IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer )
563 
564 //------------------------------------------------------------------------
565 
566 IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox )
567 {
568     XFillStyle  eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
569 
570     // Spaeter sollte eine Optimierung derart erfolgen, dass die
571     // Listen, bzw. Tables nur dann geloescht und wieder aufgebaut
572     // werden, wenn sich die Listen, bzw. Tables tatsaechlich geaendert
573     // haben (in den LBs natuerlich).
574 
575     if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox )
576     {
577         // Damit wir in folgendem Fall einen Status anzeigen koennen:
578         // Ein Typ wurde ausgewaehlt aber kein Attribut.
579         // Die Selektion hat genau die gleichen Attribute wie die vorherige.
580 //      SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData();
581 //      if( pControlerItem )
582 //          pControlerItem->ClearCache();
583 
584         pLbFillAttr->Clear();
585         SfxObjectShell* pSh = SfxObjectShell::Current();
586 
587         switch( eXFS )
588         {
589             case XFILL_NONE:
590             {
591                 pLbFillType->Selected();
592                 SelectFillAttrHdl( pBox );
593                 pLbFillAttr->Disable();
594             }
595             break;
596 
597             case XFILL_SOLID:
598             {
599                 if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) )
600                 {
601                     SvxColorTableItem aItem( *(const SvxColorTableItem*)(
602                         pSh->GetItem( SID_COLOR_TABLE ) ) );
603                     pLbFillAttr->Enable();
604                     pLbFillAttr->Fill( aItem.GetColorTable() );
605                 }
606                 else
607                     pLbFillAttr->Disable();
608             }
609             break;
610 
611             case XFILL_GRADIENT:
612             {
613                 if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
614                 {
615                     SvxGradientListItem aItem( *(const SvxGradientListItem*)(
616                         pSh->GetItem( SID_GRADIENT_LIST ) ) );
617                     pLbFillAttr->Enable();
618                     pLbFillAttr->Fill( aItem.GetGradientList() );
619                 }
620                 else
621                     pLbFillAttr->Disable();
622             }
623             break;
624 
625             case XFILL_HATCH:
626             {
627                 if ( pSh && pSh->GetItem( SID_HATCH_LIST ) )
628                 {
629                     SvxHatchListItem aItem( *(const SvxHatchListItem*)(
630                         pSh->GetItem( SID_HATCH_LIST ) ) );
631                     pLbFillAttr->Enable();
632                     pLbFillAttr->Fill( aItem.GetHatchList() );
633                 }
634                 else
635                     pLbFillAttr->Disable();
636             }
637             break;
638 
639             case XFILL_BITMAP:
640             {
641                 if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) )
642                 {
643                     SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
644                         pSh->GetItem( SID_BITMAP_LIST ) ) );
645                     pLbFillAttr->Enable();
646                     pLbFillAttr->Fill( aItem.GetBitmapList() );
647                 }
648                 else
649                     pLbFillAttr->Disable();
650             }
651             break;
652         }
653 
654         if( eXFS != XFILL_NONE ) // Wurde schon erledigt
655         {
656             if ( pBox )
657                 pLbFillType->Selected();
658 
659             // release focus
660             if ( pBox && pLbFillType->IsRelease() )
661             {
662                 SfxViewShell* pViewShell = SfxViewShell::Current();
663                 if( pViewShell && pViewShell->GetWindow() )
664                     pViewShell->GetWindow()->GrabFocus();
665             }
666         }
667     }
668     return 0;
669 }
670 
671 //------------------------------------------------------------------------
672 
673 IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox )
674 {
675     XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
676     XFillStyleItem aXFillStyleItem( eXFS );
677     sal_Bool bAction = pBox && !pLbFillAttr->IsTravelSelect();
678 
679     SfxObjectShell* pSh = SfxObjectShell::Current();
680     if ( bAction )
681     {
682         Any a;
683         Sequence< PropertyValue > aArgs( 1 );
684 
685         // First set the style
686         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ));
687         aXFillStyleItem.QueryValue(  a );
688         aArgs[0].Value = a;
689         ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( sal_True );
690         ((SvxFillToolBoxControl*)GetData())->Dispatch(
691             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )), aArgs );
692         ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( sal_False );
693 
694         switch( eXFS )
695         {
696             case XFILL_NONE:
697             {
698             }
699             break;
700 
701             case XFILL_SOLID:
702             {
703                 // NEU
704                 //Eintrag wird auf temporaere Farbe geprueft
705                 String aTmpStr = pLbFillAttr->GetSelectEntry();
706                 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
707                 {
708                     aTmpStr.Erase( aTmpStr.Len()-1, 1 );
709                     aTmpStr.Erase( 0, 1 );
710                 }
711 
712                 XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() );
713 
714                 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ));
715                 aXFillColorItem.QueryValue( a );
716                 aArgs[0].Value = a;
717                 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )),
718                                                                aArgs );
719             }
720             break;
721             case XFILL_GRADIENT:
722             {
723                 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
724 
725                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
726                 {
727                     SvxGradientListItem aItem(
728                         *(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) );
729 
730                     if ( nPos < aItem.GetGradientList()->Count() )  // kein temp. Eintrag ?
731                     {
732                         XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient();
733                         XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient );
734 
735                         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ));
736                         aXFillGradientItem.QueryValue( a );
737                         aArgs[0].Value = a;
738                         ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )),
739                                                                        aArgs );
740                     }
741                 }
742             }
743             break;
744 
745             case XFILL_HATCH:
746             {
747                 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
748 
749                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) )
750                 {
751                     SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) );
752 
753                     if ( nPos < aItem.GetHatchList()->Count() )  // kein temp. Eintrag ?
754                     {
755                         XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch();
756                         XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch );
757 
758                         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ));
759                         aXFillHatchItem.QueryValue( a );
760                         aArgs[0].Value = a;
761                         ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )),
762                                                                        aArgs );
763                     }
764                 }
765             }
766             break;
767 
768             case XFILL_BITMAP:
769             {
770                 sal_uInt16 nPos = pLbFillAttr->GetSelectEntryPos();
771 
772                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) )
773                 {
774                     SvxBitmapListItem aItem(
775                         *(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) );
776 
777                     if ( nPos < aItem.GetBitmapList()->Count() )  // kein temp. Eintrag ?
778                     {
779                         const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
780                         const XFillBitmapItem aXFillBitmapItem(pLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
781 
782                         aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmap" ));
783                         aXFillBitmapItem.QueryValue( a );
784                         aArgs[0].Value = a;
785                         ((SvxFillToolBoxControl*)GetData())->Dispatch(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:FillBitmap")), aArgs);
786                     }
787                 }
788             }
789             break;
790         }
791 
792         // release focus
793         if ( pLbFillAttr->IsRelease()  && pBox )
794         {
795             SfxViewShell* pViewShell = SfxViewShell::Current();
796             if( pViewShell && pViewShell->GetWindow() )
797             {
798                 pViewShell->GetWindow()->GrabFocus();
799             }
800         }
801     }
802 
803     return 0;
804 }
805 
806 //------------------------------------------------------------------------
807 
808 void FillControl::Resize()
809 {
810     // Breite der beiden ListBoxen nicht 1/2 : 1/2, sondern 2/5 : 3/5
811     long nW = GetOutputSizePixel().Width() / 5;
812     long nH = 180;
813     long nSep = 0; // war vorher 4
814 
815     pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) );
816     pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) );
817 }
818 /* -----------------------------08.03.2002 15:04------------------------------
819 
820  ---------------------------------------------------------------------------*/
821 
822 void FillControl::DataChanged( const DataChangedEvent& rDCEvt )
823 {
824     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
825          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
826     {
827         Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
828         Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
829         pLbFillType->SetSizePixel(aTypeSize);
830         pLbFillAttr->SetSizePixel(aAttrSize);
831         //to get the base height
832         aTypeSize = pLbFillType->GetSizePixel();
833         aAttrSize = pLbFillAttr->GetSizePixel();
834         Point aAttrPnt = pLbFillAttr->GetPosPixel();
835 
836         SetSizePixel(
837             Size( aAttrPnt.X() + aAttrSize.Width(),
838                 Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
839     }
840     Window::DataChanged( rDCEvt );
841 }
842 
843