LCOV - code coverage report
Current view: top level - svx/source/tbxctrls - fillctrl.cxx (source / functions) Hit Total Coverage
Test: commit e02a6cb2c3e2b23b203b422e4e0680877f232636 Lines: 0 378 0.0 %
Date: 2014-04-14 Functions: 0 21 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <string>
      21             : #include <sfx2/app.hxx>
      22             : #include <sfx2/dispatch.hxx>
      23             : #include <sfx2/objsh.hxx>
      24             : #include <sfx2/viewsh.hxx>
      25             : #include <rtl/ustring.hxx>
      26             : #include <vcl/settings.hxx>
      27             : #include <svx/dialogs.hrc>
      28             : 
      29             : #define DELAY_TIMEOUT           300
      30             : 
      31             : #define TMP_STR_BEGIN   "["
      32             : #define TMP_STR_END     "]"
      33             : 
      34             : #include "svx/drawitem.hxx"
      35             : #include "svx/xattr.hxx"
      36             : #include <svx/xtable.hxx>
      37             : #include <svx/fillctrl.hxx>
      38             : #include <svx/itemwin.hxx>
      39             : #include <svx/dialmgr.hxx>
      40             : #include "helpid.hrc"
      41             : 
      42             : using namespace ::com::sun::star::uno;
      43             : using namespace ::com::sun::star::util;
      44             : using namespace ::com::sun::star::beans;
      45             : using namespace ::com::sun::star::frame;
      46             : using namespace ::com::sun::star::lang;
      47             : 
      48           0 : SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem );
      49             : 
      50             : /*************************************************************************
      51             : |*
      52             : |* SvxFillToolBoxControl
      53             : |*
      54             : \************************************************************************/
      55             : 
      56           0 : SvxFillToolBoxControl::SvxFillToolBoxControl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx ) :
      57             :     SfxToolBoxControl( nSlotId, nId, rTbx ),
      58             : 
      59             :     pStyleItem      ( NULL ),
      60             :     pColorItem      ( NULL ),
      61             :     pGradientItem   ( NULL ),
      62             :     pHatchItem      ( NULL ),
      63             :     pBitmapItem     ( NULL ),
      64             :     pFillControl    ( NULL ),
      65             :     pFillTypeLB     ( NULL ),
      66             :     pFillAttrLB     ( NULL ),
      67             :     bUpdate         ( false ),
      68           0 :     eLastXFS        ( XFILL_NONE )
      69             : {
      70           0 :     addStatusListener( OUString( ".uno:FillColor" ));
      71           0 :     addStatusListener( OUString( ".uno:FillGradient" ));
      72           0 :     addStatusListener( OUString( ".uno:FillHatch" ));
      73           0 :     addStatusListener( OUString( ".uno:FillBitmap" ));
      74           0 :     addStatusListener( OUString( ".uno:ColorTableState" ));
      75           0 :     addStatusListener( OUString( ".uno:GradientListState" ));
      76           0 :     addStatusListener( OUString( ".uno:HatchListState" ));
      77           0 :     addStatusListener( OUString( ".uno:BitmapListState" ));
      78           0 : }
      79             : 
      80             : 
      81             : 
      82           0 : SvxFillToolBoxControl::~SvxFillToolBoxControl()
      83             : {
      84           0 :     delete pStyleItem;
      85           0 :     delete pColorItem;
      86           0 :     delete pGradientItem;
      87           0 :     delete pHatchItem;
      88           0 :     delete pBitmapItem;
      89           0 : }
      90             : 
      91             : 
      92             : 
      93           0 : void SvxFillToolBoxControl::StateChanged(
      94             : 
      95             :     sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
      96             : 
      97             : {
      98             : 
      99           0 :     if( eState == SFX_ITEM_DISABLED )
     100             :     {
     101           0 :         if( nSID == SID_ATTR_FILL_STYLE )
     102             :         {
     103           0 :             pFillTypeLB->Disable();
     104           0 :             pFillTypeLB->SetNoSelection();
     105             :         }
     106           0 :         pFillAttrLB->Disable();
     107           0 :         pFillAttrLB->SetNoSelection();
     108             :     }
     109             :     else
     110             :     {
     111           0 :         if ( SFX_ITEM_AVAILABLE == eState )
     112             :         {
     113           0 :             bool bEnableControls = false;
     114           0 :             if( nSID == SID_ATTR_FILL_STYLE )
     115             :             {
     116           0 :                 delete pStyleItem;
     117           0 :                 pStyleItem = (XFillStyleItem*) pState->Clone();
     118           0 :                 pFillTypeLB->Enable();
     119             :             }
     120           0 :             else if( pStyleItem )
     121             :             {
     122           0 :                 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
     123             : 
     124           0 :                 if( nSID == SID_ATTR_FILL_COLOR )
     125             :                 {
     126           0 :                     delete pColorItem;
     127           0 :                     pColorItem = (XFillColorItem*) pState->Clone();
     128             : 
     129           0 :                     if( eXFS == XFILL_SOLID )
     130           0 :                         bEnableControls = true;
     131             :                 }
     132           0 :                 else if( nSID == SID_ATTR_FILL_GRADIENT )
     133             :                 {
     134           0 :                     delete pGradientItem;
     135           0 :                     pGradientItem = (XFillGradientItem*) pState->Clone();
     136             : 
     137           0 :                     if( eXFS == XFILL_GRADIENT )
     138           0 :                         bEnableControls = true;
     139             :                 }
     140           0 :                 else if( nSID == SID_ATTR_FILL_HATCH )
     141             :                 {
     142           0 :                     delete pHatchItem;
     143           0 :                     pHatchItem = (XFillHatchItem*) pState->Clone();
     144             : 
     145           0 :                     if( eXFS == XFILL_HATCH )
     146           0 :                         bEnableControls = true;
     147             :                 }
     148           0 :                 else if( nSID == SID_ATTR_FILL_BITMAP )
     149             :                 {
     150           0 :                     delete pBitmapItem;
     151           0 :                     pBitmapItem = (XFillBitmapItem*) pState->Clone();
     152             : 
     153           0 :                     if( eXFS == XFILL_BITMAP )
     154           0 :                         bEnableControls = true;
     155             :                 }
     156             :             }
     157             : 
     158           0 :             if( pStyleItem )
     159             :             {
     160             :                 // ensure that the correct entry is selected in pFillTypeLB. It
     161             :                 // might have been changed by nSID == SID_ATTR_FILL_STYLE, but
     162             :                 // it might also be in an in-between state when user had started to
     163             :                 // change fillstyle, but not yet changed fillvalue for new style
     164             :                 // and when nSID == SID_ATTR_FILL_COLOR/SID_ATTR_FILL_GRADIENT/
     165             :                 // SID_ATTR_FILL_HATCH/SID_ATTR_FILL_BITMAP value change is triggered
     166           0 :                 eLastXFS = pFillTypeLB->GetSelectEntryPos();
     167           0 :                 XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
     168             : 
     169           0 :                 if(eLastXFS != eXFS)
     170             :                 {
     171           0 :                     bUpdate = true;
     172           0 :                     pFillTypeLB->SelectEntryPos( eXFS );
     173             :                 }
     174             : 
     175           0 :                 pFillAttrLB->Enable();
     176             :             }
     177             : 
     178           0 :             if( bEnableControls )
     179             :             {
     180             :                 //pFillTypeLB->Enable();
     181           0 :                 pFillAttrLB->Enable();
     182             : 
     183           0 :                 bUpdate = true;
     184             :             }
     185             : 
     186           0 :             Update( pState );
     187             :         }
     188             :         else
     189             :         {
     190             :             // empty or ambiguous status
     191           0 :             if( nSID == SID_ATTR_FILL_STYLE )
     192             :             {
     193           0 :                 pFillTypeLB->SetNoSelection();
     194           0 :                 pFillAttrLB->Disable();
     195           0 :                 pFillAttrLB->SetNoSelection();
     196           0 :                 bUpdate = false;
     197             :             }
     198             :             else
     199             :             {
     200           0 :                 XFillStyle eXFS = XFILL_NONE;
     201           0 :                 if( pStyleItem )
     202           0 :                     eXFS = (XFillStyle)pStyleItem->GetValue();
     203           0 :                 if( !pStyleItem ||
     204           0 :                     ( nSID == SID_ATTR_FILL_COLOR    && eXFS == XFILL_SOLID ) ||
     205           0 :                     ( nSID == SID_ATTR_FILL_GRADIENT && eXFS == XFILL_GRADIENT ) ||
     206           0 :                     ( nSID == SID_ATTR_FILL_HATCH    && eXFS == XFILL_HATCH ) ||
     207           0 :                     ( nSID == SID_ATTR_FILL_BITMAP   && eXFS == XFILL_BITMAP ) )
     208             :                 {
     209           0 :                     pFillAttrLB->SetNoSelection();
     210             :                     //bUpdate = sal_False;
     211             :                 }
     212             :             }
     213             :         }
     214             :     }
     215           0 : }
     216             : 
     217             : 
     218             : 
     219           0 : void SvxFillToolBoxControl::Update( const SfxPoolItem* pState )
     220             : {
     221           0 :     if ( pStyleItem && pState && bUpdate )
     222             :     {
     223           0 :         bUpdate = false;
     224             : 
     225           0 :         XFillStyle eXFS = (XFillStyle)pStyleItem->GetValue();
     226             : 
     227             :         // Check if the fill style was already active
     228             :         //if( eTmpXFS != eXFS )
     229           0 :         if( (XFillStyle) eLastXFS != eXFS )
     230           0 :             pFillControl->SelectFillTypeHdl( NULL );
     231             :             //eLastXFS = eXFS;
     232             : 
     233           0 :         switch( eXFS )
     234             :         {
     235             :             case XFILL_NONE:
     236           0 :             break;
     237             : 
     238             :             case XFILL_SOLID:
     239             :             {
     240           0 :                 if ( pColorItem )
     241             :                 {
     242           0 :                     OUString aString( pColorItem->GetName() );
     243           0 :                     ::Color aColor = pColorItem->GetColorValue();
     244             : 
     245           0 :                     pFillAttrLB->SelectEntry( aString );
     246             : 
     247           0 :                     if ( pFillAttrLB->GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ||
     248           0 :                          pFillAttrLB->GetSelectEntryColor() != aColor )
     249           0 :                         pFillAttrLB->SelectEntry( aColor );
     250             : 
     251             :                     // Check if the entry is not in the list
     252           0 :                     if( pFillAttrLB->GetSelectEntryPos() ==
     253           0 :                         LISTBOX_ENTRY_NOTFOUND ||
     254           0 :                         pFillAttrLB->GetSelectEntryColor() != aColor )
     255             :                     {
     256           0 :                         sal_Int32 nCount = pFillAttrLB->GetEntryCount();
     257           0 :                         OUString aTmpStr;
     258           0 :                         if( nCount > 0 )
     259             :                         {
     260             :                             // Last entry gets tested against temporary color
     261           0 :                             aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
     262           0 :                             if(  aTmpStr.startsWith(TMP_STR_BEGIN) &&
     263           0 :                                  aTmpStr.endsWith(TMP_STR_END) )
     264             :                             {
     265           0 :                                 pFillAttrLB->RemoveEntry( nCount - 1 );
     266             :                             }
     267             :                         }
     268           0 :                         aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
     269             : 
     270             :                         //pFillAttrLB->SetUpdateMode( sal_False );
     271           0 :                         sal_Int32 nPos = pFillAttrLB->InsertEntry( aColor, aTmpStr );
     272             :                         //pFillAttrLB->SetUpdateMode( sal_True );
     273           0 :                         pFillAttrLB->SelectEntryPos( nPos );
     274           0 :                     }
     275             :                 }
     276             :                 else
     277           0 :                     pFillAttrLB->SetNoSelection();
     278             :             }
     279           0 :             break;
     280             : 
     281             :             case XFILL_GRADIENT:
     282             :             {
     283           0 :                 if ( pGradientItem )
     284             :                 {
     285           0 :                     OUString aString( pGradientItem->GetName() );
     286           0 :                     pFillAttrLB->SelectEntry( aString );
     287             :                     // Check if the entry is not in the list
     288           0 :                     if( pFillAttrLB->GetSelectEntry() != aString )
     289             :                     {
     290           0 :                         sal_Int32 nCount = pFillAttrLB->GetEntryCount();
     291           0 :                         OUString aTmpStr;
     292           0 :                         if( nCount > 0 )
     293             :                         {
     294             :                             // Last entry gets tested against temporary entry
     295           0 :                             aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
     296           0 :                             if(  aTmpStr.startsWith(TMP_STR_BEGIN) &&
     297           0 :                                  aTmpStr.endsWith(TMP_STR_END) )
     298             :                             {
     299           0 :                                 pFillAttrLB->RemoveEntry( nCount - 1 );
     300             :                             }
     301             :                         }
     302           0 :                         aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
     303             : 
     304           0 :                         XGradientEntry* pEntry = new XGradientEntry( pGradientItem->GetGradientValue(), aTmpStr );
     305           0 :                         XGradientList aGradientList( "", ""/*TODO?*/ );
     306           0 :                         aGradientList.Insert( pEntry );
     307           0 :                         aGradientList.SetDirty( false );
     308           0 :                         const Bitmap aBmp = aGradientList.GetUiBitmap( 0 );
     309             : 
     310           0 :                         if( !aBmp.IsEmpty() )
     311             :                         {
     312           0 :                             pFillAttrLB->InsertEntry(pEntry->GetName(), Image(aBmp));
     313           0 :                             pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
     314             :                             //delete pBmp;
     315             :                         }
     316             : 
     317           0 :                         aGradientList.Remove( 0 );
     318           0 :                         delete pEntry;
     319           0 :                     }
     320             :                 }
     321             :                 else
     322           0 :                     pFillAttrLB->SetNoSelection();
     323             :             }
     324           0 :             break;
     325             : 
     326             :             case XFILL_HATCH:
     327             :             {
     328           0 :                 if ( pHatchItem )
     329             :                 {
     330           0 :                     OUString aString( pHatchItem->GetName() );
     331           0 :                     pFillAttrLB->SelectEntry( aString );
     332             :                     // Check if the entry is not in the list
     333           0 :                     if( pFillAttrLB->GetSelectEntry() != aString )
     334             :                     {
     335           0 :                         sal_Int32 nCount = pFillAttrLB->GetEntryCount();
     336           0 :                         OUString aTmpStr;
     337           0 :                         if( nCount > 0 )
     338             :                         {
     339             :                             // Last entry gets tested against temporary entry
     340           0 :                             aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
     341           0 :                             if(  aTmpStr.startsWith(TMP_STR_BEGIN) &&
     342           0 :                                  aTmpStr.endsWith(TMP_STR_END) )
     343             :                             {
     344           0 :                                 pFillAttrLB->RemoveEntry( nCount - 1 );
     345             :                             }
     346             :                         }
     347           0 :                         aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
     348             : 
     349           0 :                         XHatchEntry* pEntry = new XHatchEntry( pHatchItem->GetHatchValue(), aTmpStr );
     350           0 :                         XHatchList aHatchList( "", ""/*TODO?*/ );
     351           0 :                         aHatchList.Insert( pEntry );
     352           0 :                         aHatchList.SetDirty( false );
     353           0 :                         const Bitmap aBmp = aHatchList.GetUiBitmap( 0 );
     354             : 
     355           0 :                         if( !aBmp.IsEmpty() )
     356             :                         {
     357           0 :                             pFillAttrLB->InsertEntry(pEntry->GetName(), Image(aBmp));
     358           0 :                             pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
     359             :                             //delete pBmp;
     360             :                         }
     361             : 
     362           0 :                         aHatchList.Remove( 0 );
     363           0 :                         delete pEntry;
     364           0 :                     }
     365             :                 }
     366             :                 else
     367           0 :                     pFillAttrLB->SetNoSelection();
     368             :             }
     369           0 :             break;
     370             : 
     371             :             case XFILL_BITMAP:
     372             :             {
     373           0 :                 if ( pBitmapItem )
     374             :                     // &&
     375             :                     // SfxObjectShell::Current()    &&
     376             :                     // SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) )
     377             :                 {
     378           0 :                     OUString aString( pBitmapItem->GetName() );
     379             :                     // Bitmap aBitmap( pBitmapItem->GetValue() );
     380             : 
     381             :                     // SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
     382             :                     //  SfxObjectShell::Current()->GetItem( SID_BITMAP_LIST ) ) );
     383           0 :                     pFillAttrLB->SelectEntry( aString );
     384             :                     // Check if the entry is not in the list
     385           0 :                     if( pFillAttrLB->GetSelectEntry() != aString )
     386             :                     {
     387           0 :                         sal_Int32 nCount = pFillAttrLB->GetEntryCount();
     388           0 :                         OUString aTmpStr;
     389           0 :                         if( nCount > 0 )
     390             :                         {
     391             :                             // Last entry gets tested against temporary entry
     392           0 :                             aTmpStr = pFillAttrLB->GetEntry( nCount - 1 );
     393           0 :                             if(  aTmpStr.startsWith(TMP_STR_BEGIN) &&
     394           0 :                                  aTmpStr.endsWith(TMP_STR_END) )
     395             :                             {
     396           0 :                                 pFillAttrLB->RemoveEntry( nCount - 1 );
     397             :                             }
     398             :                         }
     399           0 :                         aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
     400             : 
     401           0 :                         XBitmapEntry* pEntry = new XBitmapEntry(pBitmapItem->GetGraphicObject(), aTmpStr);
     402             :                         XBitmapListRef xBitmapList =
     403             :                             XPropertyList::CreatePropertyList(XBITMAP_LIST,
     404           0 :                             OUString("TmpList"), ""/*TODO?*/)->AsBitmapList();
     405           0 :                         xBitmapList->Insert( pEntry );
     406           0 :                         xBitmapList->SetDirty( false );
     407           0 :                         pFillAttrLB->Fill( xBitmapList );
     408           0 :                         pFillAttrLB->SelectEntryPos( pFillAttrLB->GetEntryCount() - 1 );
     409           0 :                         xBitmapList->Remove( 0 );
     410           0 :                         delete pEntry;
     411           0 :                     }
     412             :                 }
     413             :                 else
     414           0 :                     pFillAttrLB->SetNoSelection();
     415             :             }
     416           0 :             break;
     417             : 
     418             :             default:
     419             :                 OSL_FAIL( "Unsupported fill type" );
     420           0 :             break;
     421             :         }
     422             :     }
     423             : 
     424           0 :     if( pState && pStyleItem )
     425             :     {
     426           0 :         XFillStyle eXFS = (XFillStyle) pStyleItem->GetValue();
     427             : 
     428             :         // Does the lists have changed?
     429           0 :         if( pState->ISA( SvxColorListItem ) &&
     430             :             eXFS == XFILL_SOLID )
     431             :         {
     432           0 :             ::Color aTmpColor( pFillAttrLB->GetSelectEntryColor() );
     433           0 :             pFillAttrLB->Clear();
     434           0 :             pFillAttrLB->Fill( ( (SvxColorListItem*)pState )->GetColorList() );
     435           0 :             pFillAttrLB->SelectEntry( aTmpColor );
     436             :         }
     437           0 :         if( pState->ISA( SvxGradientListItem ) &&
     438             :             eXFS == XFILL_GRADIENT )
     439             :         {
     440           0 :             OUString aString( pFillAttrLB->GetSelectEntry() );
     441           0 :             pFillAttrLB->Clear();
     442           0 :             pFillAttrLB->Fill( ( (SvxGradientListItem*)pState )->GetGradientList() );
     443           0 :             pFillAttrLB->SelectEntry( aString );
     444             :         }
     445           0 :         if( pState->ISA( SvxHatchListItem ) &&
     446             :             eXFS == XFILL_HATCH )
     447             :         {
     448           0 :             OUString aString( pFillAttrLB->GetSelectEntry() );
     449           0 :             pFillAttrLB->Clear();
     450           0 :             pFillAttrLB->Fill( ( (SvxHatchListItem*)pState )->GetHatchList() );
     451           0 :             pFillAttrLB->SelectEntry( aString );
     452             :         }
     453           0 :         if( pState->ISA( SvxBitmapListItem ) &&
     454             :             eXFS == XFILL_BITMAP )
     455             :         {
     456           0 :             OUString aString( pFillAttrLB->GetSelectEntry() );
     457           0 :             pFillAttrLB->Clear();
     458           0 :             pFillAttrLB->Fill( ( (SvxBitmapListItem*)pState )->GetBitmapList() );
     459           0 :             pFillAttrLB->SelectEntry( aString );
     460             :         }
     461             :     }
     462           0 : }
     463             : 
     464             : 
     465             : 
     466           0 : Window* SvxFillToolBoxControl::CreateItemWindow( Window *pParent )
     467             : {
     468           0 :     if ( GetSlotId() == SID_ATTR_FILL_STYLE )
     469             :     {
     470           0 :         pFillControl = new FillControl( pParent );
     471             :         // Thus the FillControl is known by SvxFillToolBoxControl
     472             :         // (and in order to remain compatible)
     473           0 :         pFillControl->SetData( this );
     474             : 
     475           0 :         pFillAttrLB = (SvxFillAttrBox*)pFillControl->pLbFillAttr;
     476           0 :         pFillTypeLB = (SvxFillTypeBox*)pFillControl->pLbFillType;
     477             : 
     478           0 :         pFillAttrLB->SetUniqueId( HID_FILL_ATTR_LISTBOX );
     479           0 :         pFillTypeLB->SetUniqueId( HID_FILL_TYPE_LISTBOX );
     480             : 
     481           0 :         return pFillControl;
     482             :     }
     483           0 :     return NULL;
     484             : }
     485             : 
     486             : /*************************************************************************
     487             : |*
     488             : |* FillControl
     489             : |*
     490             : \************************************************************************/
     491             : 
     492           0 : FillControl::FillControl( Window* pParent, WinBits nStyle ) :
     493             :     Window( pParent, nStyle | WB_DIALOGCONTROL ),
     494           0 :     pLbFillType(new SvxFillTypeBox( this )),
     495             :     aLogicalFillSize(40,80),
     496           0 :     aLogicalAttrSize(50,80)
     497             : {
     498           0 :     pLbFillAttr = new SvxFillAttrBox( this );
     499           0 :     Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
     500           0 :     Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
     501           0 :     pLbFillType->SetSizePixel(aTypeSize);
     502           0 :     pLbFillAttr->SetSizePixel(aAttrSize);
     503             :     //to get the base height
     504           0 :     aTypeSize = pLbFillType->GetSizePixel();
     505           0 :     aAttrSize = pLbFillAttr->GetSizePixel();
     506           0 :     Point aAttrPnt = pLbFillAttr->GetPosPixel();
     507             :     SetSizePixel(
     508           0 :         Size( aAttrPnt.X() + aAttrSize.Width(),
     509           0 :               std::max( aAttrSize.Height(), aTypeSize.Height() ) ) );
     510             : 
     511           0 :     pLbFillType->SetSelectHdl( LINK( this, FillControl, SelectFillTypeHdl ) );
     512           0 :     pLbFillAttr->SetSelectHdl( LINK( this, FillControl, SelectFillAttrHdl ) );
     513             : 
     514           0 :     aDelayTimer.SetTimeout( DELAY_TIMEOUT );
     515           0 :     aDelayTimer.SetTimeoutHdl( LINK( this, FillControl, DelayHdl ) );
     516           0 :     aDelayTimer.Start();
     517           0 : }
     518             : 
     519             : 
     520             : 
     521           0 : FillControl::~FillControl()
     522             : {
     523           0 :     delete pLbFillType;
     524           0 :     delete pLbFillAttr;
     525           0 : }
     526             : 
     527             : 
     528             : 
     529           0 : IMPL_LINK_NOARG_INLINE_START(FillControl, DelayHdl)
     530             : {
     531           0 :     SelectFillTypeHdl( NULL );
     532           0 :     ( (SvxFillToolBoxControl*)GetData() )->updateStatus( OUString( ".uno:FillStyle" ));
     533             : //  ( (SvxFillToolBoxControl*)GetData() )->GetBindings().Invalidate( SID_ATTR_FILL_STYLE );
     534           0 :     return 0;
     535             : }
     536           0 : IMPL_LINK_INLINE_END( FillControl, DelayHdl, Timer *, pTimer )
     537             : 
     538             : 
     539             : 
     540           0 : IMPL_LINK( FillControl, SelectFillTypeHdl, ListBox *, pBox )
     541             : {
     542           0 :     XFillStyle  eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
     543             : 
     544             :     // Later, an optimization should be accomplished,
     545             :     // that the lists or tables can only be deleted and rebuilt
     546             :     // when the lists, or tables have actually changed (in the LBs of course).
     547             : 
     548           0 :     if ( ( pBox && !pBox->IsTravelSelect() ) || !pBox )
     549             :     {
     550             :         // So that we can show a status in the following case:
     551             :         // One type was selected but no attribute.
     552             :         // The selection has exactly the same attributes as the previous one.
     553             : //      SvxFillToolBoxControl* pControlerItem = (SvxFillToolBoxControl*)GetData();
     554             : //      if( pControlerItem )
     555             : //          pControlerItem->ClearCache();
     556             : 
     557           0 :         pLbFillAttr->Clear();
     558           0 :         SfxObjectShell* pSh = SfxObjectShell::Current();
     559             : 
     560           0 :         switch( eXFS )
     561             :         {
     562             :             case XFILL_NONE:
     563             :             {
     564           0 :                 pLbFillType->Selected();
     565           0 :                 SelectFillAttrHdl( pBox );
     566           0 :                 pLbFillAttr->Disable();
     567             :             }
     568           0 :             break;
     569             : 
     570             :             case XFILL_SOLID:
     571             :             {
     572           0 :                 if ( pSh && pSh->GetItem( SID_COLOR_TABLE ) )
     573             :                 {
     574             :                     SvxColorListItem aItem( *(const SvxColorListItem*)(
     575           0 :                         pSh->GetItem( SID_COLOR_TABLE ) ) );
     576           0 :                     pLbFillAttr->Enable();
     577           0 :                     pLbFillAttr->Fill( aItem.GetColorList() );
     578             :                 }
     579             :                 else
     580           0 :                     pLbFillAttr->Disable();
     581             :             }
     582           0 :             break;
     583             : 
     584             :             case XFILL_GRADIENT:
     585             :             {
     586           0 :                 if ( pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
     587             :                 {
     588             :                     SvxGradientListItem aItem( *(const SvxGradientListItem*)(
     589           0 :                         pSh->GetItem( SID_GRADIENT_LIST ) ) );
     590           0 :                     pLbFillAttr->Enable();
     591           0 :                     pLbFillAttr->Fill( aItem.GetGradientList() );
     592             :                 }
     593             :                 else
     594           0 :                     pLbFillAttr->Disable();
     595             :             }
     596           0 :             break;
     597             : 
     598             :             case XFILL_HATCH:
     599             :             {
     600           0 :                 if ( pSh && pSh->GetItem( SID_HATCH_LIST ) )
     601             :                 {
     602             :                     SvxHatchListItem aItem( *(const SvxHatchListItem*)(
     603           0 :                         pSh->GetItem( SID_HATCH_LIST ) ) );
     604           0 :                     pLbFillAttr->Enable();
     605           0 :                     pLbFillAttr->Fill( aItem.GetHatchList() );
     606             :                 }
     607             :                 else
     608           0 :                     pLbFillAttr->Disable();
     609             :             }
     610           0 :             break;
     611             : 
     612             :             case XFILL_BITMAP:
     613             :             {
     614           0 :                 if ( pSh && pSh->GetItem( SID_BITMAP_LIST ) )
     615             :                 {
     616             :                     SvxBitmapListItem aItem( *(const SvxBitmapListItem*)(
     617           0 :                         pSh->GetItem( SID_BITMAP_LIST ) ) );
     618           0 :                     pLbFillAttr->Enable();
     619           0 :                     pLbFillAttr->Fill( aItem.GetBitmapList() );
     620             :                 }
     621             :                 else
     622           0 :                     pLbFillAttr->Disable();
     623             :             }
     624           0 :             break;
     625             :         }
     626             : 
     627           0 :         if( eXFS != XFILL_NONE ) // Has already been done
     628             :         {
     629           0 :             if ( pBox )
     630           0 :                 pLbFillType->Selected();
     631             : 
     632             :             // release focus
     633           0 :             if ( pBox && pLbFillType->IsRelease() )
     634             :             {
     635           0 :                 SfxViewShell* pViewShell = SfxViewShell::Current();
     636           0 :                 if( pViewShell && pViewShell->GetWindow() )
     637           0 :                     pViewShell->GetWindow()->GrabFocus();
     638             :             }
     639             :         }
     640             :     }
     641           0 :     return 0;
     642             : }
     643             : 
     644             : 
     645             : 
     646           0 : IMPL_LINK( FillControl, SelectFillAttrHdl, ListBox *, pBox )
     647             : {
     648           0 :     XFillStyle eXFS = (XFillStyle)pLbFillType->GetSelectEntryPos();
     649           0 :     XFillStyleItem aXFillStyleItem( eXFS );
     650           0 :     bool bAction = pBox && !pLbFillAttr->IsTravelSelect();
     651             : 
     652           0 :     SfxObjectShell* pSh = SfxObjectShell::Current();
     653           0 :     if ( bAction )
     654             :     {
     655           0 :         Any a;
     656           0 :         Sequence< PropertyValue > aArgs( 1 );
     657             : 
     658             :         // First set the style
     659           0 :         aArgs[0].Name = "FillStyle";
     660           0 :         aXFillStyleItem.QueryValue(  a );
     661           0 :         aArgs[0].Value = a;
     662           0 :         ((SvxFillToolBoxControl*)GetData())->Dispatch(
     663           0 :             OUString( ".uno:FillStyle" ), aArgs );
     664             : 
     665           0 :         switch( eXFS )
     666             :         {
     667             :             case XFILL_NONE:
     668             :             {
     669             :             }
     670           0 :             break;
     671             : 
     672             :             case XFILL_SOLID:
     673             :             {
     674             :                 // Entry gets tested against temporary color
     675           0 :                 OUString aTmpStr = pLbFillAttr->GetSelectEntry();
     676           0 :                 if( aTmpStr.startsWith(TMP_STR_BEGIN) && aTmpStr.endsWith(TMP_STR_END) )
     677             :                 {
     678           0 :                     aTmpStr = aTmpStr.copy(1, aTmpStr.getLength()-2);
     679             :                 }
     680             : 
     681           0 :                 XFillColorItem aXFillColorItem( aTmpStr, pLbFillAttr->GetSelectEntryColor() );
     682             : 
     683           0 :                 aArgs[0].Name = "FillColor";
     684           0 :                 aXFillColorItem.QueryValue( a );
     685           0 :                 aArgs[0].Value = a;
     686           0 :                 ((SvxFillToolBoxControl*)GetData())->Dispatch( ".uno:FillColor",
     687           0 :                                                                aArgs );
     688             :             }
     689           0 :             break;
     690             :             case XFILL_GRADIENT:
     691             :             {
     692           0 :                 sal_Int32 nPos = pLbFillAttr->GetSelectEntryPos();
     693             : 
     694           0 :                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_GRADIENT_LIST ) )
     695             :                 {
     696             :                     SvxGradientListItem aItem(
     697           0 :                         *(const SvxGradientListItem*)( pSh->GetItem( SID_GRADIENT_LIST ) ) );
     698             : 
     699           0 :                     if ( nPos < aItem.GetGradientList()->Count() )  // no temporary entry?
     700             :                     {
     701           0 :                         XGradient aGradient = aItem.GetGradientList()->GetGradient( nPos )->GetGradient();
     702           0 :                         XFillGradientItem aXFillGradientItem( pLbFillAttr->GetSelectEntry(), aGradient );
     703             : 
     704           0 :                         aArgs[0].Name = "FillGradient";
     705           0 :                         aXFillGradientItem.QueryValue( a );
     706           0 :                         aArgs[0].Value = a;
     707           0 :                         ((SvxFillToolBoxControl*)GetData())->Dispatch( OUString( ".uno:FillGradient" ),
     708           0 :                                                                        aArgs );
     709           0 :                     }
     710             :                 }
     711             :             }
     712           0 :             break;
     713             : 
     714             :             case XFILL_HATCH:
     715             :             {
     716           0 :                 sal_Int32 nPos = pLbFillAttr->GetSelectEntryPos();
     717             : 
     718           0 :                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_HATCH_LIST ) )
     719             :                 {
     720           0 :                     SvxHatchListItem aItem( *(const SvxHatchListItem*)( pSh->GetItem( SID_HATCH_LIST ) ) );
     721             : 
     722           0 :                     if ( nPos < aItem.GetHatchList()->Count() )  // no temporary entry?
     723             :                     {
     724           0 :                         XHatch aHatch = aItem.GetHatchList()->GetHatch( nPos )->GetHatch();
     725           0 :                         XFillHatchItem aXFillHatchItem( pLbFillAttr->GetSelectEntry(), aHatch );
     726             : 
     727           0 :                         aArgs[0].Name = "FillHatch";
     728           0 :                         aXFillHatchItem.QueryValue( a );
     729           0 :                         aArgs[0].Value = a;
     730           0 :                         ((SvxFillToolBoxControl*)GetData())->Dispatch( OUString( ".uno:FillHatch" ),
     731           0 :                                                                        aArgs );
     732           0 :                     }
     733             :                 }
     734             :             }
     735           0 :             break;
     736             : 
     737             :             case XFILL_BITMAP:
     738             :             {
     739           0 :                 sal_Int32 nPos = pLbFillAttr->GetSelectEntryPos();
     740             : 
     741           0 :                 if ( nPos != LISTBOX_ENTRY_NOTFOUND && pSh && pSh->GetItem( SID_BITMAP_LIST ) )
     742             :                 {
     743             :                     SvxBitmapListItem aItem(
     744           0 :                         *(const SvxBitmapListItem*)( pSh->GetItem( SID_BITMAP_LIST ) ) );
     745             : 
     746           0 :                     if ( nPos < aItem.GetBitmapList()->Count() )  // no temporary entry?
     747             :                     {
     748           0 :                         const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
     749           0 :                         const XFillBitmapItem aXFillBitmapItem(pLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
     750             : 
     751           0 :                         aArgs[0].Name = "FillBitmap";
     752           0 :                         aXFillBitmapItem.QueryValue( a );
     753           0 :                         aArgs[0].Value = a;
     754           0 :                         ((SvxFillToolBoxControl*)GetData())->Dispatch(OUString(".uno:FillBitmap"), aArgs);
     755           0 :                     }
     756             :                 }
     757             :             }
     758           0 :             break;
     759             :         }
     760             : 
     761             :         // release focus
     762           0 :         if ( pLbFillAttr->IsRelease()  && pBox )
     763             :         {
     764           0 :             SfxViewShell* pViewShell = SfxViewShell::Current();
     765           0 :             if( pViewShell && pViewShell->GetWindow() )
     766             :             {
     767           0 :                 pViewShell->GetWindow()->GrabFocus();
     768             :             }
     769           0 :         }
     770             :     }
     771             : 
     772           0 :     return 0;
     773             : }
     774             : 
     775             : 
     776             : 
     777           0 : void FillControl::Resize()
     778             : {
     779             :     // Width of the two list boxes not 1/2 : 1/2, but 2/5 : 3/5
     780           0 :     long nW = GetOutputSizePixel().Width() / 5;
     781           0 :     long nH = 180;
     782           0 :     long nSep = 0; // was previously 4
     783             : 
     784           0 :     pLbFillType->SetSizePixel( Size( nW * 2 - nSep, nH ) );
     785           0 :     pLbFillAttr->SetPosSizePixel( Point( nW * 2 + nSep, 0 ), Size( nW * 3 - nSep, nH ) );
     786           0 : }
     787             : 
     788           0 : void FillControl::DataChanged( const DataChangedEvent& rDCEvt )
     789             : {
     790           0 :     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
     791           0 :          (rDCEvt.GetFlags() & SETTINGS_STYLE) )
     792             :     {
     793           0 :         Size aTypeSize(LogicToPixel(aLogicalFillSize, MAP_APPFONT));
     794           0 :         Size aAttrSize(LogicToPixel(aLogicalAttrSize, MAP_APPFONT));
     795           0 :         pLbFillType->SetSizePixel(aTypeSize);
     796           0 :         pLbFillAttr->SetSizePixel(aAttrSize);
     797             :         //to get the base height
     798           0 :         aTypeSize = pLbFillType->GetSizePixel();
     799           0 :         aAttrSize = pLbFillAttr->GetSizePixel();
     800           0 :         Point aAttrPnt = pLbFillAttr->GetPosPixel();
     801             : 
     802             :         SetSizePixel(
     803           0 :             Size( aAttrPnt.X() + aAttrSize.Width(),
     804           0 :                 std::max( aAttrSize.Height(), aTypeSize.Height() ) ) );
     805             :     }
     806           0 :     Window::DataChanged( rDCEvt );
     807           0 : }
     808             : 
     809             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10