LCOV - code coverage report
Current view: top level - svx/source/tbxctrls - fillctrl.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 118 435 27.1 %
Date: 2015-06-13 12:38:46 Functions: 16 21 76.2 %
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 <sfx2/sidebar/SidebarToolBox.hxx>
      26             : #include <rtl/ustring.hxx>
      27             : #include <vcl/settings.hxx>
      28             : #include <vcl/toolbox.hxx>
      29             : #include <svx/dialogs.hrc>
      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             : #include <boost/scoped_ptr.hpp>
      42             : 
      43             : using namespace ::com::sun::star;
      44             : using namespace ::com::sun::star::uno;
      45             : using namespace ::com::sun::star::util;
      46             : using namespace ::com::sun::star::beans;
      47             : using namespace ::com::sun::star::frame;
      48             : using namespace ::com::sun::star::lang;
      49             : 
      50         182 : SFX_IMPL_TOOLBOX_CONTROL( SvxFillToolBoxControl, XFillStyleItem );
      51             : 
      52          50 : SvxFillToolBoxControl::SvxFillToolBoxControl(
      53             :     sal_uInt16 nSlotId,
      54             :     sal_uInt16 nId,
      55             :     ToolBox& rTbx )
      56             :     : SfxToolBoxControl( nSlotId, nId, rTbx )
      57             :     , mpStyleItem()
      58             :     , mpColorItem()
      59             :     , mpFillGradientItem()
      60             :     , mpHatchItem()
      61             :     , mpBitmapItem()
      62             :     , mpFillControl(0)
      63             :     , mpLbFillType(0)
      64             :     , mpLbFillAttr(0)
      65             :     , meLastXFS(static_cast<sal_uInt16>(-1))
      66             :     , mnLastPosGradient(0)
      67             :     , mnLastPosHatch(0)
      68          50 :     , mnLastPosBitmap(0)
      69             : {
      70          50 :     addStatusListener( OUString( ".uno:FillColor" ));
      71          50 :     addStatusListener( OUString( ".uno:FillGradient" ));
      72          50 :     addStatusListener( OUString( ".uno:FillHatch" ));
      73          50 :     addStatusListener( OUString( ".uno:FillBitmap" ));
      74          50 :     addStatusListener( OUString( ".uno:ColorTableState" ));
      75          50 :     addStatusListener( OUString( ".uno:GradientListState" ));
      76          50 :     addStatusListener( OUString( ".uno:HatchListState" ));
      77          50 :     addStatusListener( OUString( ".uno:BitmapListState" ));
      78          50 : }
      79             : 
      80         100 : SvxFillToolBoxControl::~SvxFillToolBoxControl()
      81             : {
      82         100 : }
      83             : 
      84         709 : void SvxFillToolBoxControl::StateChanged(
      85             :     sal_uInt16 nSID,
      86             :     SfxItemState eState,
      87             :     const SfxPoolItem* pState)
      88             : {
      89         709 :     const bool bDisabled(SfxItemState::DISABLED == eState);
      90             : 
      91         709 :     switch(nSID)
      92             :     {
      93             :         case SID_ATTR_FILL_STYLE:
      94             :         {
      95          79 :             if(bDisabled)
      96             :             {
      97           0 :                 mpLbFillType->Disable();
      98           0 :                 mpLbFillType->SetNoSelection();
      99           0 :                 mpLbFillAttr->Show();
     100           0 :                 mpLbFillAttr->Disable();
     101           0 :                 mpLbFillAttr->SetNoSelection();
     102           0 :                 mpToolBoxColor->Hide();
     103           0 :                 meLastXFS = static_cast<sal_uInt16>(-1);
     104           0 :                 mpStyleItem.reset();
     105             :             }
     106             : 
     107          79 :             if(eState >= SfxItemState::DEFAULT)
     108             :             {
     109          79 :                 const XFillStyleItem* pItem = dynamic_cast< const XFillStyleItem* >(pState);
     110             : 
     111          79 :                 if(pItem)
     112             :                 {
     113          79 :                     mpStyleItem.reset(dynamic_cast< XFillStyleItem* >(pItem->Clone()));
     114          79 :                     mpLbFillType->Enable();
     115          79 :                     drawing::FillStyle eXFS = (drawing::FillStyle)mpStyleItem->GetValue();
     116          79 :                     meLastXFS = eXFS;
     117          79 :                     mpLbFillType->SelectEntryPos(sal::static_int_cast< sal_Int32 >(eXFS));
     118             : 
     119          79 :                     if(drawing::FillStyle_NONE == eXFS)
     120             :                     {
     121           0 :                         mpLbFillAttr->SetNoSelection();
     122           0 :                         mpLbFillAttr->Disable();
     123             :                     }
     124             : 
     125          79 :                     Update();
     126          79 :                     break;
     127             :                 }
     128             :             }
     129             : 
     130           0 :             mpLbFillType->SetNoSelection();
     131           0 :             mpLbFillAttr->Show();
     132           0 :             mpLbFillAttr->Disable();
     133           0 :             mpLbFillAttr->SetNoSelection();
     134           0 :             mpToolBoxColor->Hide();
     135           0 :             meLastXFS = static_cast<sal_uInt16>(-1);
     136           0 :             mpStyleItem.reset();
     137           0 :             break;
     138             :         }
     139             :         case SID_ATTR_FILL_COLOR:
     140             :         {
     141          77 :             if(SfxItemState::DEFAULT == eState)
     142             :             {
     143          77 :                 mpColorItem.reset(pState ? static_cast<XFillColorItem*>(pState->Clone()) : 0);
     144             :             }
     145             : 
     146          77 :             if(mpStyleItem && drawing::FillStyle_SOLID == (drawing::FillStyle)mpStyleItem->GetValue())
     147             :             {
     148          77 :                 mpLbFillAttr->Hide();
     149          77 :                 mpToolBoxColor->Show();
     150             : 
     151          77 :                 Update();
     152             :             }
     153          77 :             break;
     154             :         }
     155             :         case SID_ATTR_FILL_GRADIENT:
     156             :         {
     157          79 :             if(SfxItemState::DEFAULT == eState)
     158             :             {
     159          79 :                 mpFillGradientItem.reset(pState ? static_cast<XFillGradientItem*>(pState->Clone()) : 0);
     160             :             }
     161             : 
     162          79 :             if(mpStyleItem && drawing::FillStyle_GRADIENT == (drawing::FillStyle)mpStyleItem->GetValue())
     163             :             {
     164           0 :                 mpLbFillAttr->Show();
     165           0 :                 mpToolBoxColor->Hide();
     166             : 
     167           0 :                 if(SfxItemState::DEFAULT == eState)
     168             :                 {
     169           0 :                     mpLbFillAttr->Enable();
     170           0 :                     Update();
     171             :                 }
     172           0 :                 else if(SfxItemState::DISABLED == eState )
     173             :                 {
     174           0 :                     mpLbFillAttr->Disable();
     175           0 :                     mpLbFillAttr->SetNoSelection();
     176             :                 }
     177             :                 else
     178             :                 {
     179           0 :                     mpLbFillAttr->SetNoSelection();
     180             :                 }
     181             :             }
     182          79 :             break;
     183             :         }
     184             :         case SID_ATTR_FILL_HATCH:
     185             :         {
     186          79 :             if(SfxItemState::DEFAULT == eState)
     187             :             {
     188          79 :                 mpHatchItem.reset(pState ? static_cast<XFillHatchItem*>(pState->Clone()) : 0);
     189             :             }
     190             : 
     191          79 :             if(mpStyleItem && drawing::FillStyle_HATCH == (drawing::FillStyle)mpStyleItem->GetValue())
     192             :             {
     193           0 :                 mpLbFillAttr->Show();
     194           0 :                 mpToolBoxColor->Hide();
     195             : 
     196           0 :                 if(SfxItemState::DEFAULT == eState)
     197             :                 {
     198           0 :                     mpLbFillAttr->Enable();
     199           0 :                     Update();
     200             :                 }
     201           0 :                 else if(SfxItemState::DISABLED == eState )
     202             :                 {
     203           0 :                     mpLbFillAttr->Disable();
     204           0 :                     mpLbFillAttr->SetNoSelection();
     205             :                 }
     206             :                 else
     207             :                 {
     208           0 :                     mpLbFillAttr->SetNoSelection();
     209             :                 }
     210             :             }
     211          79 :             break;
     212             :         }
     213             :         case SID_ATTR_FILL_BITMAP:
     214             :         {
     215          79 :             if(SfxItemState::DEFAULT == eState)
     216             :             {
     217          79 :                 mpBitmapItem.reset(pState ? static_cast<XFillBitmapItem*>(pState->Clone()) : 0);
     218             :             }
     219             : 
     220          79 :             if(mpStyleItem && drawing::FillStyle_BITMAP == (drawing::FillStyle)mpStyleItem->GetValue())
     221             :             {
     222           0 :                 mpLbFillAttr->Show();
     223           0 :                 mpToolBoxColor->Hide();
     224             : 
     225           0 :                 if(SfxItemState::DEFAULT == eState)
     226             :                 {
     227           0 :                     mpLbFillAttr->Enable();
     228           0 :                     Update();
     229             :                 }
     230           0 :                 else if(SfxItemState::DISABLED == eState )
     231             :                 {
     232           0 :                     mpLbFillAttr->Disable();
     233           0 :                     mpLbFillAttr->SetNoSelection();
     234             :                 }
     235             :                 else
     236             :                 {
     237           0 :                     mpLbFillAttr->SetNoSelection();
     238             :                 }
     239             :             }
     240          79 :             break;
     241             :         }
     242             :         case SID_GRADIENT_LIST:
     243             :         {
     244          79 :             if(SfxItemState::DEFAULT == eState)
     245             :             {
     246           0 :                 if(mpStyleItem && drawing::FillStyle_GRADIENT == (drawing::FillStyle)mpStyleItem->GetValue())
     247             :                 {
     248           0 :                     if(mpFillGradientItem)
     249             :                     {
     250           0 :                         const OUString aString( mpFillGradientItem->GetName() );
     251           0 :                         const SfxObjectShell* pSh = SfxObjectShell::Current();
     252           0 :                         const SvxGradientListItem aItem( *static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
     253             : 
     254           0 :                         mpLbFillAttr->Clear();
     255           0 :                         mpLbFillAttr->Enable();
     256           0 :                         mpLbFillAttr->Fill(aItem.GetGradientList());
     257           0 :                         mpLbFillAttr->SelectEntry(aString);
     258             :                     }
     259             :                     else
     260             :                     {
     261           0 :                         mpLbFillAttr->SetNoSelection();
     262             :                     }
     263             :                 }
     264             :             }
     265          79 :             break;
     266             :         }
     267             :         case SID_HATCH_LIST:
     268             :         {
     269          79 :             if(SfxItemState::DEFAULT == eState)
     270             :             {
     271           0 :                 if(mpStyleItem && drawing::FillStyle_HATCH == (drawing::FillStyle)mpStyleItem->GetValue())
     272             :                 {
     273           0 :                     if(mpHatchItem)
     274             :                     {
     275           0 :                         const OUString aString( mpHatchItem->GetName() );
     276           0 :                         const SfxObjectShell* pSh = SfxObjectShell::Current();
     277           0 :                         const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
     278             : 
     279           0 :                         mpLbFillAttr->Clear();
     280           0 :                         mpLbFillAttr->Enable();
     281           0 :                         mpLbFillAttr->Fill(aItem.GetHatchList());
     282           0 :                         mpLbFillAttr->SelectEntry(aString);
     283             :                     }
     284             :                     else
     285             :                     {
     286           0 :                         mpLbFillAttr->SetNoSelection();
     287             :                     }
     288             :                 }
     289             :             }
     290          79 :             break;
     291             :         }
     292             :         case SID_BITMAP_LIST:
     293             :         {
     294          79 :             if(SfxItemState::DEFAULT == eState)
     295             :             {
     296           0 :                 if(mpStyleItem && drawing::FillStyle_BITMAP == (drawing::FillStyle)mpStyleItem->GetValue())
     297             :                 {
     298           0 :                     if(mpBitmapItem)
     299             :                     {
     300           0 :                         const OUString aString( mpBitmapItem->GetName() );
     301           0 :                         const SfxObjectShell* pSh = SfxObjectShell::Current();
     302           0 :                         const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
     303             : 
     304           0 :                         mpLbFillAttr->Clear();
     305           0 :                         mpLbFillAttr->Enable();
     306           0 :                         mpLbFillAttr->Fill(aItem.GetBitmapList());
     307           0 :                         mpLbFillAttr->SelectEntry(aString);
     308             :                     }
     309             :                     else
     310             :                     {
     311           0 :                         mpLbFillAttr->SetNoSelection();
     312             :                     }
     313             :                 }
     314             :             }
     315          79 :             break;
     316             :         }
     317             :     }
     318         709 : }
     319             : 
     320         156 : void SvxFillToolBoxControl::Update()
     321             : {
     322         156 :     if(mpStyleItem)
     323             :     {
     324         156 :         const drawing::FillStyle eXFS = (drawing::FillStyle)mpStyleItem->GetValue();
     325         156 :         SfxObjectShell* pSh = SfxObjectShell::Current();
     326             : 
     327         156 :         switch( eXFS )
     328             :         {
     329             :             case drawing::FillStyle_NONE:
     330             :             {
     331           0 :                 mpLbFillAttr->Show();
     332           0 :                 mpToolBoxColor->Hide();
     333           0 :                 break;
     334             :             }
     335             :             case drawing::FillStyle_SOLID:
     336             :             {
     337         156 :                 if(mpColorItem)
     338             :                 {
     339         107 :                     mpLbFillAttr->Hide();
     340         107 :                     mpToolBoxColor->Show();
     341             :                 }
     342         156 :                 break;
     343             :             }
     344             :             case drawing::FillStyle_GRADIENT:
     345             :             {
     346           0 :                 mpLbFillAttr->Show();
     347           0 :                 mpToolBoxColor->Hide();
     348             : 
     349           0 :                 if(pSh && pSh->GetItem(SID_GRADIENT_LIST))
     350             :                 {
     351           0 :                     const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
     352           0 :                     mpLbFillAttr->Enable();
     353           0 :                     mpLbFillAttr->Clear();
     354           0 :                     mpLbFillAttr->Fill(aItem.GetGradientList());
     355             : 
     356           0 :                     if(mpFillGradientItem)
     357             :                     {
     358           0 :                         const OUString aString(mpFillGradientItem->GetName());
     359             : 
     360           0 :                         mpLbFillAttr->SelectEntry(aString);
     361             : 
     362             :                         // Check if the entry is not in the list
     363           0 :                         if (mpLbFillAttr->GetSelectEntry() != aString)
     364             :                         {
     365           0 :                             sal_Int32 nCount = mpLbFillAttr->GetEntryCount();
     366           0 :                             OUString aTmpStr;
     367           0 :                             if( nCount > 0 )
     368             :                             {
     369             :                                 // Last entry gets tested against temporary entry
     370           0 :                                 aTmpStr = mpLbFillAttr->GetEntry( nCount - 1 );
     371           0 :                                 if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
     372           0 :                                     aTmpStr.endsWith(TMP_STR_END) )
     373             :                                 {
     374           0 :                                     mpLbFillAttr->RemoveEntry(nCount - 1);
     375             :                                 }
     376             :                             }
     377           0 :                             aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
     378             : 
     379           0 :                             boost::scoped_ptr<XGradientEntry> pEntry(new XGradientEntry(mpFillGradientItem->GetGradientValue(), aTmpStr));
     380           0 :                             XGradientList aGradientList( "", ""/*TODO?*/ );
     381           0 :                             aGradientList.Insert( pEntry.get() );
     382           0 :                             aGradientList.SetDirty( false );
     383           0 :                             const Bitmap aBmp = aGradientList.GetUiBitmap( 0 );
     384             : 
     385           0 :                             if(!aBmp.IsEmpty())
     386             :                             {
     387           0 :                                 mpLbFillAttr->InsertEntry(pEntry->GetName(), Image(aBmp));
     388           0 :                                 mpLbFillAttr->SelectEntryPos(mpLbFillAttr->GetEntryCount() - 1);
     389             :                             }
     390             : 
     391           0 :                             aGradientList.Remove( 0 );
     392           0 :                         }
     393             : 
     394             :                     }
     395             :                     else
     396             :                     {
     397           0 :                         mpLbFillAttr->SetNoSelection();
     398           0 :                     }
     399             :                 }
     400             :                 else
     401             :                 {
     402           0 :                     mpLbFillAttr->SetNoSelection();
     403             :                 }
     404           0 :                 break;
     405             :             }
     406             :             case drawing::FillStyle_HATCH:
     407             :             {
     408           0 :                 mpLbFillAttr->Show();
     409           0 :                 mpToolBoxColor->Hide();
     410             : 
     411           0 :                 if(pSh && pSh->GetItem(SID_HATCH_LIST))
     412             :                 {
     413           0 :                     const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
     414           0 :                     mpLbFillAttr->Enable();
     415           0 :                     mpLbFillAttr->Clear();
     416           0 :                     mpLbFillAttr->Fill(aItem.GetHatchList());
     417             : 
     418           0 :                     if(mpHatchItem)
     419             :                     {
     420           0 :                         const OUString aString(mpHatchItem->GetName());
     421             : 
     422           0 :                         mpLbFillAttr->SelectEntry( aString );
     423             : 
     424             :                         // Check if the entry is not in the list
     425           0 :                         if( mpLbFillAttr->GetSelectEntry() != aString )
     426             :                         {
     427           0 :                             sal_uInt16 nCount = mpLbFillAttr->GetEntryCount();
     428           0 :                             OUString aTmpStr;
     429           0 :                             if( nCount > 0 )
     430             :                             {
     431             :                                 // Last entry gets tested against temporary entry
     432           0 :                                 aTmpStr = mpLbFillAttr->GetEntry( nCount - 1 );
     433           0 :                                 if(  aTmpStr.startsWith(TMP_STR_BEGIN) &&
     434           0 :                                      aTmpStr.endsWith(TMP_STR_END) )
     435             :                                 {
     436           0 :                                     mpLbFillAttr->RemoveEntry( nCount - 1 );
     437             :                                 }
     438             :                             }
     439           0 :                             aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
     440             : 
     441           0 :                             XHatchEntry* pEntry = new XHatchEntry(mpHatchItem->GetHatchValue(), aTmpStr);
     442           0 :                             XHatchList aHatchList( "", ""/*TODO?*/ );
     443           0 :                             aHatchList.Insert( pEntry );
     444           0 :                             aHatchList.SetDirty( false );
     445           0 :                             const Bitmap aBmp = aHatchList.GetUiBitmap( 0 );
     446             : 
     447           0 :                             if( !aBmp.IsEmpty() )
     448             :                             {
     449           0 :                                 mpLbFillAttr->InsertEntry(pEntry->GetName(), Image(aBmp));
     450           0 :                                 mpLbFillAttr->SelectEntryPos( mpLbFillAttr->GetEntryCount() - 1 );
     451             :                                 //delete pBmp;
     452             :                             }
     453             : 
     454           0 :                             aHatchList.Remove( 0 );
     455           0 :                             delete pEntry;
     456           0 :                         }
     457             :                     }
     458             :                     else
     459             :                     {
     460           0 :                         mpLbFillAttr->SetNoSelection();
     461           0 :                     }
     462             :                 }
     463             :                 else
     464             :                 {
     465           0 :                     mpLbFillAttr->SetNoSelection();
     466             :                 }
     467           0 :                 break;
     468             :             }
     469             :             case drawing::FillStyle_BITMAP:
     470             :             {
     471           0 :                 mpLbFillAttr->Show();
     472           0 :                 mpToolBoxColor->Hide();
     473             : 
     474           0 :                 if(pSh && pSh->GetItem(SID_BITMAP_LIST))
     475             :                 {
     476           0 :                     const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
     477           0 :                     mpLbFillAttr->Enable();
     478           0 :                     mpLbFillAttr->Clear();
     479           0 :                     mpLbFillAttr->Fill(aItem.GetBitmapList());
     480             : 
     481           0 :                     if(mpBitmapItem)
     482             :                     {
     483           0 :                         const OUString aString(mpBitmapItem->GetName());
     484             : 
     485           0 :                         mpLbFillAttr->SelectEntry(aString);
     486             : 
     487             :                         // Check if the entry is not in the list
     488           0 :                         if (mpLbFillAttr->GetSelectEntry() != aString)
     489             :                         {
     490           0 :                             sal_Int32 nCount = mpLbFillAttr->GetEntryCount();
     491           0 :                             OUString aTmpStr;
     492           0 :                             if( nCount > 0 )
     493             :                             {
     494             :                                 // Last entry gets tested against temporary entry
     495           0 :                                 aTmpStr = mpLbFillAttr->GetEntry(nCount - 1);
     496           0 :                                 if( aTmpStr.startsWith(TMP_STR_BEGIN) &&
     497           0 :                                     aTmpStr.endsWith(TMP_STR_END) )
     498             :                                 {
     499           0 :                                     mpLbFillAttr->RemoveEntry(nCount - 1);
     500             :                                 }
     501             :                             }
     502           0 :                             aTmpStr = TMP_STR_BEGIN + aString + TMP_STR_END;
     503             : 
     504           0 :                             boost::scoped_ptr<XBitmapEntry> pEntry(new XBitmapEntry(mpBitmapItem->GetGraphicObject(), aTmpStr));
     505             :                             XBitmapListRef xBitmapList =
     506             :                                 XPropertyList::AsBitmapList(
     507             :                                     XPropertyList::CreatePropertyList(
     508           0 :                                         XBITMAP_LIST, "TmpList", ""/*TODO?*/));
     509           0 :                             xBitmapList->Insert( pEntry.get() );
     510           0 :                             xBitmapList->SetDirty( false );
     511           0 :                             mpLbFillAttr->Fill( xBitmapList );
     512           0 :                             mpLbFillAttr->SelectEntryPos(mpLbFillAttr->GetEntryCount() - 1);
     513           0 :                             xBitmapList->Remove( 0 );
     514           0 :                         }
     515             : 
     516             :                     }
     517             :                     else
     518             :                     {
     519           0 :                         mpLbFillAttr->SetNoSelection();
     520           0 :                     }
     521             :                 }
     522             :                 else
     523             :                 {
     524           0 :                     mpLbFillAttr->SetNoSelection();
     525             :                 }
     526           0 :                 break;
     527             :             }
     528             :             default:
     529             :                 OSL_ENSURE(false, "Non supported FillType (!)");
     530           0 :             break;
     531             :         }
     532             :     }
     533             : 
     534         156 : }
     535             : 
     536          50 : VclPtr<vcl::Window> SvxFillToolBoxControl::CreateItemWindow(vcl::Window *pParent)
     537             : {
     538          50 :     if(GetSlotId() == SID_ATTR_FILL_STYLE)
     539             :     {
     540          50 :         mpFillControl.reset(VclPtr<FillControl>::Create(pParent));
     541             :         // Thus the FillControl is known by SvxFillToolBoxControl
     542             :         // (and in order to remain compatible)
     543          50 :         mpFillControl->SetData(this);
     544             : 
     545          50 :         mpLbFillType = mpFillControl->mpLbFillType;
     546          50 :         mpLbFillAttr = mpFillControl->mpLbFillAttr;
     547          50 :         mpToolBoxColor = mpFillControl->mpToolBoxColor;
     548          50 :         mpFillControl->Resize();
     549          50 :         mpToolBoxColor->InsertItem(".uno:FillColor", m_xFrame, ToolBoxItemBits::DROPDOWNONLY, Size(mpToolBoxColor->GetSizePixel().Width(), 0));
     550             : 
     551          50 :         mpLbFillAttr->SetUniqueId(HID_FILL_ATTR_LISTBOX);
     552          50 :         mpToolBoxColor->SetUniqueId(HID_FILL_ATTR_LISTBOX);
     553          50 :         mpLbFillType->SetUniqueId(HID_FILL_TYPE_LISTBOX);
     554             : 
     555          50 :         mpLbFillType->SetSelectHdl(LINK(this,SvxFillToolBoxControl,SelectFillTypeHdl));
     556          50 :         mpLbFillAttr->SetSelectHdl(LINK(this,SvxFillToolBoxControl,SelectFillAttrHdl));
     557             : 
     558          50 :         return mpFillControl.get();
     559             :     }
     560           0 :     return VclPtr<vcl::Window>();
     561             : }
     562             : 
     563          50 : FillControl::FillControl(vcl::Window* pParent,WinBits nStyle)
     564             :     : Window(pParent,nStyle | WB_DIALOGCONTROL)
     565             :     , mpLbFillType(VclPtr<SvxFillTypeBox>::Create(this))
     566             :     , mpToolBoxColor(VclPtr<sfx2::sidebar::SidebarToolBox>::Create(this))
     567          50 :     , mpLbFillAttr(VclPtr<SvxFillAttrBox>::Create(this))
     568             : {
     569          50 :     SetOptimalSize();
     570          50 : }
     571             : 
     572         150 : FillControl::~FillControl()
     573             : {
     574          50 :     disposeOnce();
     575         100 : }
     576             : 
     577          50 : void FillControl::dispose()
     578             : {
     579          50 :     mpLbFillType.disposeAndClear();
     580          50 :     mpToolBoxColor.disposeAndClear();
     581          50 :     mpLbFillAttr.disposeAndClear();
     582          50 :     vcl::Window::dispose();
     583          50 : }
     584             : 
     585           0 : IMPL_LINK(SvxFillToolBoxControl, SelectFillTypeHdl, ListBox *, pToolBox)
     586             : {
     587           0 :     const drawing::FillStyle eXFS = (drawing::FillStyle)mpLbFillType->GetSelectEntryPos();
     588             : 
     589           0 :     if((drawing::FillStyle)meLastXFS != eXFS)
     590             :     {
     591           0 :         mpLbFillAttr->Clear();
     592           0 :         SfxObjectShell* pSh = SfxObjectShell::Current();
     593           0 :         const XFillStyleItem aXFillStyleItem(eXFS);
     594             : 
     595             :         // #i122676# Do no longer trigger two Execute calls, one for SID_ATTR_FILL_STYLE
     596             :         // and one for setting the fill attribute itself, but add two SfxPoolItems to the
     597             :         // call to get just one action at the SdrObject and to create only one Undo action, too.
     598             :         // Checked that this works in all apps.
     599           0 :         switch( eXFS )
     600             :         {
     601             :             default:
     602             :             case drawing::FillStyle_NONE:
     603             :             {
     604           0 :                 mpLbFillAttr->Show();
     605           0 :                 mpToolBoxColor->Hide();
     606           0 :                 mpLbFillType->Selected();
     607           0 :                 mpLbFillAttr->Disable();
     608             : 
     609             :                 // #i122676# need to call a single SID_ATTR_FILL_STYLE change
     610             :                 SfxViewFrame::Current()->GetDispatcher()->Execute(
     611           0 :                     SID_ATTR_FILL_STYLE, SfxCallMode::RECORD, &aXFillStyleItem, 0L);
     612           0 :                 break;
     613             :             }
     614             :             case drawing::FillStyle_SOLID:
     615             :             {
     616           0 :                 mpLbFillAttr->Hide();
     617           0 :                 mpToolBoxColor->Show();
     618           0 :                 const OUString aTmpStr;
     619           0 :                 const ::Color aColor = mpColorItem->GetColorValue();
     620           0 :                 const XFillColorItem aXFillColorItem( aTmpStr, aColor );
     621             : 
     622             :                 // #i122676# change FillStyle and Color in one call
     623             :                 SfxViewFrame::Current()->GetDispatcher()->Execute(
     624           0 :                     SID_ATTR_FILL_COLOR, SfxCallMode::RECORD, &aXFillColorItem, &aXFillStyleItem, 0L);
     625           0 :                 break;
     626             :             }
     627             :             case drawing::FillStyle_GRADIENT:
     628             :             {
     629           0 :                 mpLbFillAttr->Show();
     630           0 :                 mpToolBoxColor->Hide();
     631             : 
     632           0 :                 if(pSh && pSh->GetItem(SID_GRADIENT_LIST))
     633             :                 {
     634           0 :                     if(!mpLbFillAttr->GetEntryCount())
     635             :                     {
     636           0 :                         const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
     637           0 :                         mpLbFillAttr->Enable();
     638           0 :                         mpLbFillAttr->Clear();
     639           0 :                         mpLbFillAttr->Fill(aItem.GetGradientList());
     640             :                     }
     641             : 
     642           0 :                     mpLbFillAttr->AdaptDropDownLineCountToMaximum();
     643             : 
     644           0 :                     if(LISTBOX_ENTRY_NOTFOUND != mnLastPosGradient)
     645             :                     {
     646           0 :                         const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
     647             : 
     648           0 :                         if(mnLastPosGradient < aItem.GetGradientList()->Count())
     649             :                         {
     650           0 :                             const XGradient aGradient = aItem.GetGradientList()->GetGradient(mnLastPosGradient)->GetGradient();
     651           0 :                             const XFillGradientItem aXFillGradientItem(mpLbFillAttr->GetEntry(mnLastPosGradient), aGradient);
     652             : 
     653             :                             // #i122676# change FillStyle and Gradient in one call
     654             :                             SfxViewFrame::Current()->GetDispatcher()->Execute(
     655           0 :                                 SID_ATTR_FILL_GRADIENT, SfxCallMode::RECORD, &aXFillGradientItem, &aXFillStyleItem, 0L);
     656           0 :                             mpLbFillAttr->SelectEntryPos(mnLastPosGradient);
     657           0 :                         }
     658             :                     }
     659             :                 }
     660             :                 else
     661             :                 {
     662           0 :                     mpLbFillAttr->Disable();
     663             :                 }
     664           0 :                 break;
     665             :             }
     666             :             case drawing::FillStyle_HATCH:
     667             :             {
     668           0 :                 mpLbFillAttr->Show();
     669           0 :                 mpToolBoxColor->Hide();
     670             : 
     671           0 :                 if(pSh && pSh->GetItem(SID_HATCH_LIST))
     672             :                 {
     673           0 :                     if(!mpLbFillAttr->GetEntryCount())
     674             :                     {
     675           0 :                         const SvxHatchListItem aItem( *static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
     676           0 :                         mpLbFillAttr->Enable();
     677           0 :                         mpLbFillAttr->Clear();
     678           0 :                         mpLbFillAttr->Fill(aItem.GetHatchList());
     679             :                     }
     680             : 
     681           0 :                     mpLbFillAttr->AdaptDropDownLineCountToMaximum();
     682             : 
     683           0 :                     if(LISTBOX_ENTRY_NOTFOUND != mnLastPosHatch)
     684             :                     {
     685           0 :                         const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
     686             : 
     687           0 :                         if(mnLastPosHatch < aItem.GetHatchList()->Count())
     688             :                         {
     689           0 :                             const XHatch aHatch = aItem.GetHatchList()->GetHatch(mnLastPosHatch)->GetHatch();
     690           0 :                             const XFillHatchItem aXFillHatchItem(mpLbFillAttr->GetSelectEntry(), aHatch);
     691             : 
     692             :                             // #i122676# change FillStyle and Hatch in one call
     693             :                             SfxViewFrame::Current()->GetDispatcher()->Execute(
     694           0 :                                 SID_ATTR_FILL_HATCH, SfxCallMode::RECORD, &aXFillHatchItem, &aXFillStyleItem, 0L);
     695           0 :                             mpLbFillAttr->SelectEntryPos(mnLastPosHatch);
     696           0 :                         }
     697             :                     }
     698             :                 }
     699             :                 else
     700             :                 {
     701           0 :                     mpLbFillAttr->Disable();
     702             :                 }
     703           0 :                 break;
     704             :             }
     705             :             case drawing::FillStyle_BITMAP:
     706             :             {
     707           0 :                 mpLbFillAttr->Show();
     708           0 :                 mpToolBoxColor->Hide();
     709             : 
     710           0 :                 if(pSh && pSh->GetItem(SID_BITMAP_LIST))
     711             :                 {
     712           0 :                     if(!mpLbFillAttr->GetEntryCount())
     713             :                     {
     714           0 :                         const SvxBitmapListItem aItem( *static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
     715           0 :                         mpLbFillAttr->Enable();
     716           0 :                         mpLbFillAttr->Clear();
     717           0 :                         mpLbFillAttr->Fill(aItem.GetBitmapList());
     718             :                     }
     719             : 
     720           0 :                     mpLbFillAttr->AdaptDropDownLineCountToMaximum();
     721             : 
     722           0 :                     if(LISTBOX_ENTRY_NOTFOUND != mnLastPosBitmap)
     723             :                     {
     724           0 :                         const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
     725             : 
     726           0 :                         if(mnLastPosBitmap < aItem.GetBitmapList()->Count())
     727             :                         {
     728           0 :                             const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(mnLastPosBitmap);
     729           0 :                             const XFillBitmapItem aXFillBitmapItem(mpLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
     730             : 
     731             :                             // #i122676# change FillStyle and Bitmap in one call
     732             :                             SfxViewFrame::Current()->GetDispatcher()->Execute(
     733           0 :                                 SID_ATTR_FILL_BITMAP, SfxCallMode::RECORD, &aXFillBitmapItem, &aXFillStyleItem, 0L);
     734           0 :                             mpLbFillAttr->SelectEntryPos(mnLastPosBitmap);
     735           0 :                         }
     736             :                     }
     737             :                 }
     738             :                 else
     739             :                 {
     740           0 :                     mpLbFillAttr->Disable();
     741             :                 }
     742           0 :                 break;
     743             :             }
     744             :         }
     745             : 
     746           0 :         meLastXFS = (sal_uInt16)eXFS;
     747             : 
     748           0 :         if(drawing::FillStyle_NONE != eXFS)
     749             :         {
     750           0 :             if(pToolBox)
     751             :             {
     752           0 :                 mpLbFillType->Selected();
     753             :             }
     754           0 :         }
     755             :     }
     756             : 
     757           0 :     return 0;
     758             : }
     759             : 
     760           0 : IMPL_LINK(SvxFillToolBoxControl, SelectFillAttrHdl, ListBox *, pToolBox)
     761             : {
     762           0 :     const drawing::FillStyle eXFS = (drawing::FillStyle)mpLbFillType->GetSelectEntryPos();
     763           0 :     const XFillStyleItem aXFillStyleItem(eXFS);
     764           0 :     SfxObjectShell* pSh = SfxObjectShell::Current();
     765             : 
     766           0 :     if(pToolBox)
     767             :     {
     768             :         // #i122676# dependent from bFillStyleChange, do execute a single or two
     769             :         // changes in one Execute call
     770           0 :         const bool bFillStyleChange((drawing::FillStyle) meLastXFS != eXFS);
     771             : 
     772           0 :         switch(eXFS)
     773             :         {
     774             :             case drawing::FillStyle_SOLID:
     775             :             {
     776           0 :                 if(bFillStyleChange)
     777             :                 {
     778             :                     // #i122676# Single FillStyle change call needed here
     779           0 :                     SfxViewFrame::Current()->GetDispatcher()->Execute(SID_ATTR_FILL_STYLE, SfxCallMode::RECORD, &aXFillStyleItem, 0L);
     780             :                 }
     781           0 :                 break;
     782             :             }
     783             :             case drawing::FillStyle_GRADIENT:
     784             :             {
     785           0 :                 sal_Int32 nPos = mpLbFillAttr->GetSelectEntryPos();
     786             : 
     787           0 :                 if(LISTBOX_ENTRY_NOTFOUND == nPos)
     788             :                 {
     789           0 :                     nPos = mnLastPosGradient;
     790             :                 }
     791             : 
     792           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nPos && pSh && pSh->GetItem(SID_GRADIENT_LIST))
     793             :                 {
     794           0 :                     const SvxGradientListItem aItem(*static_cast<const SvxGradientListItem*>(pSh->GetItem(SID_GRADIENT_LIST)));
     795             : 
     796           0 :                     if(nPos < aItem.GetGradientList()->Count())
     797             :                     {
     798           0 :                         const XGradient aGradient = aItem.GetGradientList()->GetGradient(nPos)->GetGradient();
     799           0 :                         const XFillGradientItem aXFillGradientItem(mpLbFillAttr->GetSelectEntry(), aGradient);
     800             : 
     801             :                         // #i122676# Change FillStale and Gradinet in one call
     802             :                         SfxViewFrame::Current()->GetDispatcher()->Execute(
     803             :                             SID_ATTR_FILL_GRADIENT, SfxCallMode::RECORD, &aXFillGradientItem,
     804           0 :                             bFillStyleChange ? &aXFillStyleItem : 0L, 0L);
     805           0 :                     }
     806             :                 }
     807             : 
     808           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nPos)
     809             :                 {
     810           0 :                     mnLastPosGradient = nPos;
     811             :                 }
     812           0 :                 break;
     813             :             }
     814             :             case drawing::FillStyle_HATCH:
     815             :             {
     816           0 :                 sal_Int32 nPos = mpLbFillAttr->GetSelectEntryPos();
     817             : 
     818           0 :                 if(LISTBOX_ENTRY_NOTFOUND == nPos)
     819             :                 {
     820           0 :                     nPos = mnLastPosHatch;
     821             :                 }
     822             : 
     823           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nPos && pSh && pSh->GetItem(SID_HATCH_LIST))
     824             :                 {
     825           0 :                     const SvxHatchListItem aItem(*static_cast<const SvxHatchListItem*>(pSh->GetItem(SID_HATCH_LIST)));
     826             : 
     827           0 :                     if(nPos < aItem.GetHatchList()->Count())
     828             :                     {
     829           0 :                         const XHatch aHatch = aItem.GetHatchList()->GetHatch(nPos)->GetHatch();
     830           0 :                         const XFillHatchItem aXFillHatchItem( mpLbFillAttr->GetSelectEntry(), aHatch);
     831             : 
     832             :                         // #i122676# Change FillStale and Hatch in one call
     833             :                         SfxViewFrame::Current()->GetDispatcher()->Execute(
     834             :                             SID_ATTR_FILL_HATCH, SfxCallMode::RECORD, &aXFillHatchItem,
     835           0 :                             bFillStyleChange ? &aXFillStyleItem : 0L, 0L);
     836           0 :                     }
     837             :                 }
     838             : 
     839           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nPos)
     840             :                 {
     841           0 :                     mnLastPosHatch = nPos;
     842             :                 }
     843           0 :                 break;
     844             :             }
     845             :             case drawing::FillStyle_BITMAP:
     846             :             {
     847           0 :                 sal_Int32 nPos = mpLbFillAttr->GetSelectEntryPos();
     848             : 
     849           0 :                 if(LISTBOX_ENTRY_NOTFOUND == nPos)
     850             :                 {
     851           0 :                     nPos = mnLastPosBitmap;
     852             :                 }
     853             : 
     854           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nPos && pSh && pSh->GetItem(SID_BITMAP_LIST))
     855             :                 {
     856           0 :                     const SvxBitmapListItem aItem(*static_cast<const SvxBitmapListItem*>(pSh->GetItem(SID_BITMAP_LIST)));
     857             : 
     858           0 :                     if(nPos < aItem.GetBitmapList()->Count())
     859             :                     {
     860           0 :                         const XBitmapEntry* pXBitmapEntry = aItem.GetBitmapList()->GetBitmap(nPos);
     861           0 :                         const XFillBitmapItem aXFillBitmapItem(mpLbFillAttr->GetSelectEntry(), pXBitmapEntry->GetGraphicObject());
     862             : 
     863             :                         // #i122676# Change FillStale and Bitmap in one call
     864             :                         SfxViewFrame::Current()->GetDispatcher()->Execute(
     865             :                             SID_ATTR_FILL_BITMAP, SfxCallMode::RECORD, &aXFillBitmapItem,
     866           0 :                             bFillStyleChange ? &aXFillStyleItem : 0L, 0L);
     867           0 :                     }
     868             :                 }
     869             : 
     870           0 :                 if(LISTBOX_ENTRY_NOTFOUND != nPos)
     871             :                 {
     872           0 :                     mnLastPosBitmap = nPos;
     873             :                 }
     874           0 :                 break;
     875             :             }
     876           0 :             default: break;
     877             :         }
     878             :     }
     879             : 
     880           0 :     return 0;
     881             : }
     882             : 
     883          50 : void FillControl::Resize()
     884             : {
     885             :     // Relative width of the two list boxes is 2/5 : 3/5
     886          50 :     Size aSize(GetOutputSizePixel());
     887          50 :     long nW = aSize.Width() / 5;
     888          50 :     long nH = aSize.Height();
     889             : 
     890          50 :     long nPrefHeight = mpLbFillType->get_preferred_size().Height();
     891          50 :     long nOffset = (nH - nPrefHeight)/2;
     892          50 :     mpLbFillType->SetPosSizePixel(Point(0, nOffset), Size(nW * 2, nPrefHeight));
     893          50 :     nPrefHeight = mpToolBoxColor->get_preferred_size().Height();
     894          50 :     nOffset = (nH - nPrefHeight)/2;
     895          50 :     mpToolBoxColor->SetPosSizePixel(Point(nW * 2, nOffset),Size(nW * 3, nPrefHeight));
     896          50 :     nPrefHeight = mpLbFillType->get_preferred_size().Height();
     897          50 :     nOffset = (nH - nPrefHeight)/2;
     898          50 :     mpLbFillAttr->SetPosSizePixel(Point(nW * 2, nOffset),Size(nW * 3, nPrefHeight));
     899          50 : }
     900             : 
     901          50 : void FillControl::SetOptimalSize()
     902             : {
     903          50 :     const Size aLogicalAttrSize(50,0);
     904          50 :     Size aSize(LogicToPixel(aLogicalAttrSize,MAP_APPFONT));
     905             : 
     906          50 :     Point aAttrPnt = mpLbFillAttr->GetPosPixel();
     907             : 
     908          50 :     aSize.Height() = std::max(aSize.Height(), mpLbFillType->get_preferred_size().Height());
     909          50 :     aSize.Height() = std::max(aSize.Height(), mpToolBoxColor->get_preferred_size().Height());
     910          50 :     aSize.Height() = std::max(aSize.Height(), mpLbFillAttr->get_preferred_size().Height());
     911             : 
     912          50 :     aSize.Width() = aAttrPnt.X() + aSize.Width();
     913             : 
     914          50 :     SetSizePixel(aSize);
     915          50 : }
     916             : 
     917           0 : void FillControl::DataChanged(const DataChangedEvent& rDCEvt)
     918             : {
     919           0 :     if((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
     920           0 :         (rDCEvt.GetFlags() & AllSettingsFlags::STYLE))
     921             :     {
     922           0 :         SetOptimalSize();
     923             :     }
     924           0 :     Window::DataChanged(rDCEvt);
     925         390 : }
     926             : 
     927             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11