merge the formfield patch from ooo-build
[ooovba.git] / svx / source / tbxctrls / fillctrl.cxx
blob0c2163e9ee7ea4384f635692bc086dadb8b11743
1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: fillctrl.cxx,v $
10 * $Revision: 1.20 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svx.hxx"
34 // include ---------------------------------------------------------------
36 #include <string> // HACK: prevent conflict between STLPORT and Workshop headers
37 #include <sfx2/app.hxx>
38 #include <sfx2/dispatch.hxx>
39 #include <sfx2/objsh.hxx>
40 #include <sfx2/viewsh.hxx>
41 #include <rtl/ustring.hxx>
43 #include <svx/dialogs.hrc>
45 #define DELAY_TIMEOUT 300
47 #define TMP_STR_BEGIN '['
48 #define TMP_STR_END ']'
50 #include "drawitem.hxx"
51 #include "xattr.hxx"
52 #include <svx/xtable.hxx>
53 #include <svx/fillctrl.hxx>
54 #include <svx/itemwin.hxx>
55 #include <svx/dialmgr.hxx>
56 #include "helpid.hrc"
58 using namespace ::com::sun::star::uno;
59 using namespace ::com::sun::star::util;
60 using namespace ::com::sun::star::beans;
61 using namespace ::com::sun::star::frame;
62 using namespace ::com::sun::star::lang;
64 SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem );
66 /*************************************************************************
68 |* SvxFillToolBoxControl
70 \************************************************************************/
72 SvxFillToolBoxControl::SvxFillToolBoxControl( USHORT nSlotId, USHORT nId, ToolBox& rTbx ) :
73 SfxToolBoxControl( nSlotId, nId, rTbx ),
75 pStyleItem ( NULL ),
76 pColorItem ( NULL ),
77 pGradientItem ( NULL ),
78 pHatchItem ( NULL ),
79 pBitmapItem ( NULL ),
80 pFillControl ( NULL ),
81 pFillTypeLB ( NULL ),
82 pFillAttrLB ( NULL ),
83 bUpdate ( FALSE ),
84 bIgnoreStatusUpdate( FALSE ),
85 eLastXFS ( XFILL_NONE )
87 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )));
88 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )));
89 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )));
90 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillBitmap" )));
91 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ColorTableState" )));
92 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:GradientListState" )));
93 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:HatchListState" )));
94 addStatusListener( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BitmapListState" )));
97 //========================================================================
99 SvxFillToolBoxControl::~SvxFillToolBoxControl()
101 delete pStyleItem;
102 delete pColorItem;
103 delete pGradientItem;
104 delete pHatchItem;
105 delete pBitmapItem;
108 //========================================================================
110 void SvxFillToolBoxControl::StateChanged(
112 USHORT nSID, SfxItemState eState, const SfxPoolItem* pState )
115 FASTBOOL bEnableControls = FALSE;
117 if ( bIgnoreStatusUpdate )
118 return;
120 if( eState == SFX_ITEM_DISABLED )
122 if( nSID == SID_ATTR_FILL_STYLE )
124 pFillTypeLB->Disable();
125 pFillTypeLB->SetNoSelection();
127 pFillAttrLB->Disable();
128 pFillAttrLB->SetNoSelection();
130 else
132 if ( SFX_ITEM_AVAILABLE == eState )
134 if( nSID == SID_ATTR_FILL_STYLE )
136 delete pStyleItem;
137 pStyleItem = (XFillStyleItem*) pState->Clone();
138 pFillTypeLB->Enable();
140 eLastXFS = pFillTypeLB->GetSelectEntryPos();
141 bUpdate = TRUE;
143 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
144 pFillTypeLB->SelectEntryPos(
145 sal::static_int_cast< USHORT >( eXFS ) );
146 pFillAttrLB->Enable();
148 else if( pStyleItem )
150 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
152 if( nSID == SID_ATTR_FILL_COLOR )
154 delete pColorItem;
155 pColorItem = (XFillColorItem*) pState->Clone();
157 if( eXFS == XFILL_SOLID )
158 bEnableControls = TRUE;
160 else if( nSID == SID_ATTR_FILL_GRADIENT )
162 delete pGradientItem;
163 pGradientItem = (XFillGradientItem*) pState->Clone();
165 if( eXFS == XFILL_GRADIENT )
166 bEnableControls = TRUE;
168 else if( nSID == SID_ATTR_FILL_HATCH )
170 delete pHatchItem;
171 pHatchItem = (XFillHatchItem*) pState->Clone();
173 if( eXFS == XFILL_HATCH )
174 bEnableControls = TRUE;
176 else if( nSID == SID_ATTR_FILL_BITMAP )
178 delete pBitmapItem;
179 pBitmapItem = (XFillBitmapItem*) pState->Clone();
181 if( eXFS == XFILL_BITMAP )
182 bEnableControls = TRUE;
185 if( bEnableControls )
187 //pFillTypeLB->Enable();
188 pFillAttrLB->Enable();
190 bUpdate = TRUE;
193 Update( pState );
195 else
197 // leerer oder uneindeutiger Status
198 if( nSID == SID_ATTR_FILL_STYLE )
200 pFillTypeLB->SetNoSelection();
201 pFillAttrLB->Disable();
202 pFillAttrLB->SetNoSelection();
203 bUpdate = FALSE;
205 else
207 XFillStyle eXFS = XFILL_NONE;
208 if( pStyleItem )
209 eXFS = (XFillStyle)pStyleItem->GetValue();
210 if( !pStyleItem ||
211 ( nSID == SID_ATTR_FILL_COLOR && eXFS == XFILL_SOLID ) ||
212 ( nSID == SID_ATTR_FILL_GRADIENT && eXFS == XFILL_GRADIENT ) ||
213 ( nSID == SID_ATTR_FILL_HATCH && eXFS == XFILL_HATCH ) ||
214 ( nSID == SID_ATTR_FILL_BITMAP && eXFS == XFILL_BITMAP ) )
216 pFillAttrLB->SetNoSelection();
217 //bUpdate = FALSE;
224 //========================================================================
226 void SvxFillToolBoxControl::IgnoreStatusUpdate( sal_Bool bSet )
228 bIgnoreStatusUpdate = bSet;
231 //========================================================================
233 void SvxFillToolBoxControl::Update( const SfxPoolItem* pState )
235 if ( pStyleItem && pState && bUpdate )
237 bUpdate = FALSE;
239 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
241 // Pruefen, ob Fuellstil schon vorher aktiv war
242 //if( eTmpXFS != eXFS )
243 if( (XFillStyle) eLastXFS != eXFS )
244 pFillControl->SelectFillTypeHdl( NULL );
245 //eLastXFS = eXFS;
247 switch( eXFS )
249 case XFILL_NONE:
250 break;
252 case XFILL_SOLID:
254 if ( pColorItem )
256 String aString( pColorItem->GetName() );
257 ::Color aColor = pColorItem->GetColorValue();
259 pFillAttrLB->SelectEntry( aString );
261 if ( pFillAttrLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ||
262 pFillAttrLB->GetSelectEntryColor() != aColor )
263 pFillAttrLB->SelectEntry( aColor );
265 // NEU
266 // Pruefen, ob Eintrag nicht in der Liste ist
267 if( pFillAttrLB->GetSelectEntryPos() ==
268 LISTBOX_ENTRY_NOTFOUND ||
269 pFillAttrLB->GetSelectEntryColor() != aColor )
271 USHORT nCount = pFillAttrLB->GetEntryCount();
272 String aTmpStr;
273 if( nCount > 0 )
275 //Letzter Eintrag wird auf temporaere Farbe geprueft
276 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
277 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
278 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
280 pFillAttrLB->RemoveEntry( nCount - 1 );
283 aTmpStr = TMP_STR_BEGIN;
284 aTmpStr += aString;
285 aTmpStr += TMP_STR_END;
287 //pFillAttrLB->SetUpdateMode( FALSE );
288 USHORT nPos = pFillAttrLB->InsertEntry( aColor, aTmpStr );
289 //pFillAttrLB->SetUpdateMode( TRUE );
290 pFillAttrLB->SelectEntryPos( nPos );
292 // NEU
294 else
295 pFillAttrLB->SetNoSelection();
297 break;
299 case XFILL_GRADIENT:
301 if ( pGradientItem )
303 String aString( pGradientItem->GetName() );
304 pFillAttrLB->SelectEntry( aString );
305 // NEU
306 // Pruefen, ob Eintrag nicht in der Liste ist
307 if( pFillAttrLB->GetSelectEntry() != aString )
309 USHORT nCount = pFillAttrLB->GetEntryCount();
310 String aTmpStr;
311 if( nCount > 0 )
313 //Letzter Eintrag wird auf temporaeren Eintrag geprueft
314 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
315 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
316 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
318 pFillAttrLB->RemoveEntry( nCount - 1 );
321 aTmpStr = TMP_STR_BEGIN;
322 aTmpStr += aString;
323 aTmpStr += TMP_STR_END;
325 XGradientEntry* pEntry = new XGradientEntry( pGradientItem->GetGradientValue(), aTmpStr );
326 String aEmptyString = String();
327 XGradientList aGradientList( aEmptyString );
328 aGradientList.Insert( pEntry );
329 aGradientList.SetDirty( FALSE );
330 Bitmap* pBmp = aGradientList.CreateBitmapForUI( 0 );
332 if( pBmp )
334 ( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), *pBmp );
335 pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
336 delete pBmp;
339 aGradientList.Remove( 0 );
340 delete pEntry;
342 // NEU
344 else
345 pFillAttrLB->SetNoSelection();
347 break;
349 case XFILL_HATCH:
351 if ( pHatchItem )
353 String aString( pHatchItem->GetName() );
354 pFillAttrLB->SelectEntry( aString );
355 // NEU
356 // Pruefen, ob Eintrag nicht in der Liste ist
357 if( pFillAttrLB->GetSelectEntry() != aString )
359 USHORT nCount = pFillAttrLB->GetEntryCount();
360 String aTmpStr;
361 if( nCount > 0 )
363 //Letzter Eintrag wird auf temporaeren Eintrag geprueft
364 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
365 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
366 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
368 pFillAttrLB->RemoveEntry( nCount - 1 );
371 aTmpStr = TMP_STR_BEGIN;
372 aTmpStr += aString;
373 aTmpStr += TMP_STR_END;
375 XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr );
376 String aEmptyString = String();
377 XHatchList aHatchList( aEmptyString );
378 aHatchList.Insert( pEntry );
379 aHatchList.SetDirty( FALSE );
380 Bitmap* pBmp = aHatchList.CreateBitmapForUI( 0 );
382 if( pBmp )
384 ( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), *pBmp );
385 pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
386 delete pBmp;
389 aHatchList.Remove( 0 );
390 delete pEntry;
392 // NEU
394 else
395 pFillAttrLB->SetNoSelection();
397 break;
399 case XFILL_BITMAP:
401 if ( pBitmapItem )
402 // &&
403 // SfxObjectShell::Current() &&
404 // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) )
406 String aString( pBitmapItem->GetName() );
407 // Bitmap aBitmap( pBitmapItem->GetValue() );
409 // SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
410 // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) );
411 pFillAttrLB->SelectEntry( aString );
412 // NEU
413 // Pruefen, ob Eintrag nicht in der Liste ist
414 if( pFillAttrLB->GetSelectEntry() != aString )
416 USHORT nCount = pFillAttrLB->GetEntryCount();
417 String aTmpStr;
418 if( nCount > 0 )
420 //Letzter Eintrag wird auf temporaeren Eintrag geprueft
421 aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
422 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN &&
423 aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
425 pFillAttrLB->RemoveEntry( nCount - 1 );
428 aTmpStr = TMP_STR_BEGIN;
429 aTmpStr += aString;
430 aTmpStr += TMP_STR_END;
432 XBitmapEntry* pEntry = new XBitmapEntry( pBitmapItem->GetBitmapValue(), aTmpStr );
433 XBitmapList aBitmapList( String::CreateFromAscii("TmpList") );
434 aBitmapList.Insert( pEntry );
435 aBitmapList.SetDirty( FALSE );
436 //Bitmap* pBmp = aBitmapList.GetBitmap( 0 );
437 //( (ListBox*)pFillAttrLB )->InsertEntry( pEntry->GetName(), *pBmp );
438 pFillAttrLB->Fill( &aBitmapList );
439 pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
440 aBitmapList.Remove( 0 );
441 delete pEntry;
443 // NEU
445 else
446 pFillAttrLB->SetNoSelection();
448 break;
450 default:
451 DBG_ERROR( "Nicht unterstuetzter Flaechentyp" );
452 break;
456 if( pState && pStyleItem )
458 XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue();
460 // Die Listen haben sich geaendert ?
461 if( pState->ISA( SvxColorTableItem ) &&
462 eXFS == XFILL_SOLID )
464 ::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() );
465 pFillAttrLB->Clear();
466 pFillAttrLB->Fill( ( (SvxColorTableItem*)pState )->GetColorTable() );
467 pFillAttrLB->SelectEntry( aTmpColor );
469 if( pState->ISA( SvxGradientListItem ) &&
470 eXFS == XFILL_GRADIENT )
472 String aString( pFillAttrLB->GetSelectEntry() );
473 pFillAttrLB->Clear();
474 pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() );
475 pFillAttrLB->SelectEntry( aString );
477 if( pState->ISA( SvxHatchListItem ) &&
478 eXFS == XFILL_HATCH )
480 String aString( pFillAttrLB->GetSelectEntry() );
481 pFillAttrLB->Clear();
482 pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() );
483 pFillAttrLB->SelectEntry( aString );
485 if( pState->ISA( SvxBitmapListItem ) &&
486 eXFS == XFILL_BITMAP )
488 String aString( pFillAttrLB->GetSelectEntry() );
489 pFillAttrLB->Clear();
490 pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() );
491 pFillAttrLB->SelectEntry( aString );
496 //========================================================================
498 Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent )
500 if ( GetSlotId() == SID_ATTR_FILL_STYLE )
502 pFillControl = new FillControl( pParent );
503 // Damit dem FillControl das SvxFillToolBoxControl bekannt ist
504 // (und um kompatibel zu bleiben)
505 pFillControl->SetData( this );
507 pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr;
508 pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType;
510 pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX );
511 pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX );
513 return pFillControl;
515 return NULL;
518 /*************************************************************************
520 |* FillControl
522 \************************************************************************/
524 FillControl::FillControl( Window* pParent, WinBits nStyle ) :
525 Window( pParent, nStyle | WB_DIALOGCONTROL ),
526 pLbFillType(new SvxFillTypeBox( this )),
527 aLogicalFillSize(40,80),
528 aLogicalAttrSize(50,80)
530 pLbFillAttr = new SvxFillAttrBox( this );
531 Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
532 Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
533 pLbFillType->SetSizePixel(aTypeSize);
534 pLbFillAttr->SetSizePixel(aAttrSize);
535 //to get the base height
536 aTypeSize = pLbFillType->GetSizePixel();
537 aAttrSize = pLbFillAttr->GetSizePixel();
538 Point aAttrPnt = pLbFillAttr->GetPosPixel();
539 SetSizePixel(
540 Size( aAttrPnt.X() + aAttrSize.Width(),
541 Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
543 pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) );
544 pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) );
546 aDelayTimer.SetTimeout( DELAY_TIMEOUT );
547 aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) );
548 aDelayTimer.Start();
551 //------------------------------------------------------------------------
553 FillControl::~FillControl()
555 delete pLbFillType;
556 delete pLbFillAttr;
559 //------------------------------------------------------------------------
561 IMPL_LINK_INLINE_START( FillControl, DelayHdl, Timer *, EMPTYARG )
563 SelectFillTypeHdl( NULL );
564 ( (SvxFillToolBoxControl*)GetData() )->updateStatus( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )));
565 // ( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE );
566 return 0;
568 IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer )
570 //------------------------------------------------------------------------
572 IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox )
574 XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
576 // Spaeter sollte eine Optimierung derart erfolgen, dass die
577 // Listen, bzw. Tables nur dann geloescht und wieder aufgebaut
578 // werden, wenn sich die Listen, bzw. Tables tatsaechlich geaendert
579 // haben (in den LBs natuerlich).
581 if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox )
583 // Damit wir in folgendem Fall einen Status anzeigen koennen:
584 // Ein Typ wurde ausgewaehlt aber kein Attribut.
585 // Die Selektion hat genau die gleichen Attribute wie die vorherige.
586 // SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData();
587 // if( pControlerItem )
588 // pControlerItem->ClearCache();
590 pLbFillAttr->Clear();
591 SfxObjectShell* pSh = SfxObjectShell::Current();
593 switch( eXFS )
595 case XFILL_NONE:
597 pLbFillType->Selected();
598 SelectFillAttrHdl( pBox );
599 pLbFillAttr->Disable();
601 break;
603 case XFILL_SOLID:
605 if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) )
607 SvxColorTableItem aItem( *(const SvxColorTableItem*)(
608 pSh->GetItem( SID_COLOR_TABLE ) ) );
609 pLbFillAttr->Enable();
610 pLbFillAttr->Fill( aItem.GetColorTable() );
612 else
613 pLbFillAttr->Disable();
615 break;
617 case XFILL_GRADIENT:
619 if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
621 SvxGradientListItem aItem( *(const SvxGradientListItem*)(
622 pSh->GetItem( SID_GRADIENT_LIST ) ) );
623 pLbFillAttr->Enable();
624 pLbFillAttr->Fill( aItem.GetGradientList() );
626 else
627 pLbFillAttr->Disable();
629 break;
631 case XFILL_HATCH:
633 if ( pSh && pSh->GetItem( SID_HATCH_LIST ) )
635 SvxHatchListItem aItem( *(const SvxHatchListItem*)(
636 pSh->GetItem( SID_HATCH_LIST ) ) );
637 pLbFillAttr->Enable();
638 pLbFillAttr->Fill( aItem.GetHatchList() );
640 else
641 pLbFillAttr->Disable();
643 break;
645 case XFILL_BITMAP:
647 if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) )
649 SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
650 pSh->GetItem( SID_BITMAP_LIST ) ) );
651 pLbFillAttr->Enable();
652 pLbFillAttr->Fill( aItem.GetBitmapList() );
654 else
655 pLbFillAttr->Disable();
657 break;
660 if( eXFS != XFILL_NONE ) // Wurde schon erledigt
662 if ( pBox )
663 pLbFillType->Selected();
665 // release focus
666 if ( pBox && pLbFillType->IsRelease() )
668 SfxViewShell* pViewShell = SfxViewShell::Current();
669 if( pViewShell && pViewShell->GetWindow() )
670 pViewShell->GetWindow()->GrabFocus();
674 return 0;
677 //------------------------------------------------------------------------
679 IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox )
681 XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
682 XFillStyleItem aXFillStyleItem( eXFS );
683 BOOL bAction = pBox && !pLbFillAttr->IsTravelSelect();
685 SfxObjectShell* pSh = SfxObjectShell::Current();
686 if ( bAction )
688 Any a;
689 Sequence< PropertyValue > aArgs( 1 );
691 // First set the style
692 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillStyle" ));
693 aXFillStyleItem.QueryValue( a );
694 aArgs[0].Value = a;
695 ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( TRUE );
696 ((SvxFillToolBoxControl*)GetData())->Dispatch(
697 ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillStyle" )), aArgs );
698 ( (SvxFillToolBoxControl*)GetData() )->IgnoreStatusUpdate( FALSE );
700 switch( eXFS )
702 case XFILL_NONE:
705 break;
707 case XFILL_SOLID:
709 // NEU
710 //Eintrag wird auf temporaere Farbe geprueft
711 String aTmpStr = pLbFillAttr->GetSelectEntry();
712 if( aTmpStr.GetChar(0) == TMP_STR_BEGIN && aTmpStr.GetChar(aTmpStr.Len()-1) == TMP_STR_END )
714 aTmpStr.Erase( aTmpStr.Len()-1, 1 );
715 aTmpStr.Erase( 0, 1 );
718 XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() );
720 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillColor" ));
721 aXFillColorItem.QueryValue( a );
722 aArgs[0].Value = a;
723 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillColor" )),
724 aArgs );
726 break;
727 case XFILL_GRADIENT:
729 USHORT nPos = pLbFillAttr->GetSelectEntryPos();
731 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
733 SvxGradientListItem aItem(
734 *(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) );
736 if ( nPos < aItem.GetGradientList()->Count() ) // kein temp. Eintrag ?
738 XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient();
739 XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient );
741 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillGradient" ));
742 aXFillGradientItem.QueryValue( a );
743 aArgs[0].Value = a;
744 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillGradient" )),
745 aArgs );
749 break;
751 case XFILL_HATCH:
753 USHORT nPos = pLbFillAttr->GetSelectEntryPos();
755 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) )
757 SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) );
759 if ( nPos < aItem.GetHatchList()->Count() ) // kein temp. Eintrag ?
761 XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch();
762 XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch );
764 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillHatch" ));
765 aXFillHatchItem.QueryValue( a );
766 aArgs[0].Value = a;
767 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillHatch" )),
768 aArgs );
772 break;
774 case XFILL_BITMAP:
776 USHORT nPos = pLbFillAttr->GetSelectEntryPos();
778 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) )
780 SvxBitmapListItem aItem(
781 *(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) );
783 if ( nPos < aItem.GetBitmapList()->Count() ) // kein temp. Eintrag ?
785 XOBitmap aXOBitmap = aItem.GetBitmapList()->GetBitmap( nPos )->GetXBitmap();
786 XFillBitmapItem aXFillBitmapItem( pLbFillAttr->GetSelectEntry(), aXOBitmap );
788 aArgs[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FillBitmap" ));
789 aXFillBitmapItem.QueryValue( a );
790 aArgs[0].Value = a;
791 ((SvxFillToolBoxControl*)GetData())->Dispatch( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FillBitmap" )),
792 aArgs );
796 break;
799 // release focus
800 if ( pLbFillAttr->IsRelease() && pBox )
802 SfxViewShell* pViewShell = SfxViewShell::Current();
803 if( pViewShell && pViewShell->GetWindow() )
805 pViewShell->GetWindow()->GrabFocus();
810 return 0;
813 //------------------------------------------------------------------------
815 void FillControl::Resize()
817 // Breite der beiden ListBoxen nicht 1/2 : 1/2, sondern 2/5 : 3/5
818 long nW = GetOutputSizePixel().Width() / 5;
819 long nH = 180;
820 long nSep = 0; // war vorher 4
822 pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) );
823 pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) );
825 /* -----------------------------08.03.2002 15:04------------------------------
827 ---------------------------------------------------------------------------*/
829 void FillControl::DataChanged( const DataChangedEvent& rDCEvt )
831 if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
832 (rDCEvt.GetFlags() & SETTINGS_STYLE) )
834 Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
835 Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
836 pLbFillType->SetSizePixel(aTypeSize);
837 pLbFillAttr->SetSizePixel(aAttrSize);
838 //to get the base height
839 aTypeSize = pLbFillType->GetSizePixel();
840 aAttrSize = pLbFillAttr->GetSizePixel();
841 Point aAttrPnt = pLbFillAttr->GetPosPixel();
843 SetSizePixel(
844 Size( aAttrPnt.X() + aAttrSize.Width(),
845 Max( aAttrSize.Height(), aTypeSize.Height() ) ) );
847 Window::DataChanged( rDCEvt );