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

Generated by: LCOV version 1.10