LCOV - code coverage report
Current view: top level - svx/source/tbxctrls - tbcontrl.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 661 1404 47.1 %
Date: 2015-06-13 12:38:46 Functions: 81 160 50.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 <utility>
      22             : 
      23             : #include <tools/color.hxx>
      24             : #include <svl/poolitem.hxx>
      25             : #include <svl/eitem.hxx>
      26             : #include <svl/itemset.hxx>
      27             : #include <vcl/toolbox.hxx>
      28             : #include <vcl/bmpacc.hxx>
      29             : #include <vcl/menubtn.hxx>
      30             : #include <svtools/valueset.hxx>
      31             : #include <svtools/ctrlbox.hxx>
      32             : #include <svl/style.hxx>
      33             : #include <svtools/ctrltool.hxx>
      34             : #include <svtools/borderhelper.hxx>
      35             : #include <svl/stritem.hxx>
      36             : #include <sfx2/tplpitem.hxx>
      37             : #include <sfx2/dispatch.hxx>
      38             : #include <sfx2/viewsh.hxx>
      39             : #include <sfx2/docfac.hxx>
      40             : #include <sfx2/templdlg.hxx>
      41             : #include <svl/isethint.hxx>
      42             : #include <sfx2/querystatus.hxx>
      43             : #include <sfx2/sfxstatuslistener.hxx>
      44             : #include <tools/urlobj.hxx>
      45             : #include <sfx2/childwin.hxx>
      46             : #include <sfx2/viewfrm.hxx>
      47             : #include <unotools/fontoptions.hxx>
      48             : #include <vcl/mnemonic.hxx>
      49             : #include <vcl/svapp.hxx>
      50             : #include <vcl/settings.hxx>
      51             : #include <svl/smplhint.hxx>
      52             : #include <svtools/colorcfg.hxx>
      53             : #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
      54             : #include <com/sun/star/lang/XServiceInfo.hpp>
      55             : #include <com/sun/star/beans/XPropertySet.hpp>
      56             : #include <com/sun/star/frame/status/ItemStatus.hpp>
      57             : #include <svx/dialogs.hrc>
      58             : #include <svx/svxitems.hrc>
      59             : #include "helpid.hrc"
      60             : #include <sfx2/htmlmode.hxx>
      61             : #include <sfx2/sidebar/Sidebar.hxx>
      62             : #include <sfx2/sidebar/SidebarToolBox.hxx>
      63             : #include <svx/xtable.hxx>
      64             : #include <editeng/fontitem.hxx>
      65             : #include <editeng/fhgtitem.hxx>
      66             : #include <editeng/boxitem.hxx>
      67             : #include <editeng/charreliefitem.hxx>
      68             : #include <editeng/contouritem.hxx>
      69             : #include <editeng/colritem.hxx>
      70             : #include <editeng/crossedoutitem.hxx>
      71             : #include <editeng/emphasismarkitem.hxx>
      72             : #include <editeng/flstitem.hxx>
      73             : #include <editeng/lineitem.hxx>
      74             : #include <editeng/postitem.hxx>
      75             : #include <editeng/shdditem.hxx>
      76             : #include <editeng/udlnitem.hxx>
      77             : #include <editeng/wghtitem.hxx>
      78             : #include <editeng/svxfont.hxx>
      79             : #include <editeng/cmapitem.hxx>
      80             : #include "svx/drawitem.hxx"
      81             : #include <svx/tbcontrl.hxx>
      82             : #include "svx/dlgutil.hxx"
      83             : #include <svx/dialmgr.hxx>
      84             : #include "colorwindow.hxx"
      85             : #include <memory>
      86             : 
      87             : #include <svx/framelink.hxx>
      88             : #include <svx/tbxcolorupdate.hxx>
      89             : #include <editeng/eerdll.hxx>
      90             : #include <editeng/editrids.hrc>
      91             : #include <svx/xlnclit.hxx>
      92             : #include <svx/xfillit0.hxx>
      93             : #include <svx/xflclit.hxx>
      94             : 
      95             : #define MAX_MRU_FONTNAME_ENTRIES    5
      96             : 
      97             : // don't make more than 15 entries visible at once
      98             : #define MAX_STYLES_ENTRIES          static_cast< sal_uInt16 >( 15 )
      99             : 
     100             : static void lcl_CalcSizeValueSet( vcl::Window &rWin, ValueSet &rValueSet, const Size &aItemSize );
     101             : 
     102             : // namespaces
     103             : using namespace ::editeng;
     104             : using namespace ::com::sun::star;
     105             : using namespace ::com::sun::star::uno;
     106             : using namespace ::com::sun::star::frame;
     107             : using namespace ::com::sun::star::beans;
     108             : using namespace ::com::sun::star::lang;
     109             : 
     110         629 : SFX_IMPL_TOOLBOX_CONTROL( SvxStyleToolBoxControl, SfxTemplateItem );
     111        1118 : SFX_IMPL_TOOLBOX_CONTROL( SvxFontNameToolBoxControl, SvxFontItem );
     112         287 : SFX_IMPL_TOOLBOX_CONTROL( SvxFrameToolBoxControl, SvxBoxItem );
     113         287 : SFX_IMPL_TOOLBOX_CONTROL( SvxFrameLineStyleToolBoxControl, SvxLineItem );
     114           0 : SFX_IMPL_TOOLBOX_CONTROL( SvxSimpleUndoRedoController, SfxStringItem );
     115             : 
     116             : class SvxStyleBox_Impl : public ComboBox
     117             : {
     118             :     using Window::IsVisible;
     119             : public:
     120             :     SvxStyleBox_Impl( vcl::Window* pParent, const OUString& rCommand, SfxStyleFamily eFamily, const Reference< XDispatchProvider >& rDispatchProvider,
     121             :                         const Reference< XFrame >& _xFrame,const OUString& rClearFormatKey, const OUString& rMoreKey, bool bInSpecialMode );
     122             :     virtual ~SvxStyleBox_Impl();
     123             :     virtual void dispose() SAL_OVERRIDE;
     124             : 
     125             :     void            SetFamily( SfxStyleFamily eNewFamily );
     126        1509 :     bool            IsVisible() const { return bVisible; }
     127             : 
     128             :     virtual bool    PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
     129             :     virtual bool    Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
     130             :     virtual void    DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
     131             :     virtual void    StateChanged( StateChangedType nStateChange ) SAL_OVERRIDE;
     132             : 
     133             :     virtual void    UserDraw( const UserDrawEvent& rUDEvt ) SAL_OVERRIDE;
     134             : 
     135         497 :     void            SetVisibilityListener( const Link<>& aVisListener ) { aVisibilityListener = aVisListener; }
     136             : 
     137         495 :     void            SetDefaultStyle( const OUString& rDefault ) { sDefaultStyle = rDefault; }
     138             : 
     139             :     void            CalcOptimalExtraUserWidth();
     140             : 
     141             : protected:
     142             :     virtual void    Select() SAL_OVERRIDE;
     143             : 
     144             : private:
     145             :     SfxStyleFamily                  eStyleFamily;
     146             :     sal_uInt16                      nCurSel;
     147             :     bool                            bRelease;
     148             :     Size                            aLogicalSize;
     149             :     Link<>                          aVisibilityListener;
     150             :     bool                            bVisible;
     151             :     Reference< XDispatchProvider >  m_xDispatchProvider;
     152             :     Reference< XFrame >             m_xFrame;
     153             :     OUString                        m_aCommand;
     154             :     OUString                        aClearFormatKey;
     155             :     OUString                        aMoreKey;
     156             :     OUString                        sDefaultStyle;
     157             :     bool                            bInSpecialMode;
     158             :     VclPtr<MenuButton>              m_pButtons[MAX_STYLES_ENTRIES];
     159             :     PopupMenu                       m_aMenu;
     160             : 
     161             :     void            ReleaseFocus();
     162             :     static Color    TestColorsVisible(const Color &FontCol, const Color &BackCol);
     163             :     static void     UserDrawEntry(const UserDrawEvent& rUDEvt, const OUString &rStyleName);
     164             :     void            SetupEntry(sal_uInt16 nItem, const Rectangle& rRect, OutputDevice *pDevice, const OUString &rStyleName, bool bIsNotSelected);
     165             :     static bool     AdjustFontForItemHeight(OutputDevice* pDevice, Rectangle& rTextRect, long nHeight);
     166             :     DECL_LINK( MenuSelectHdl, Menu * );
     167             : };
     168             : 
     169             : class SvxFontNameBox_Impl : public FontNameBox
     170             : {
     171             :     using Window::Update;
     172             : private:
     173             :     const FontList*                pFontList;
     174             :     ::std::unique_ptr<FontList>    m_aOwnFontList;
     175             :     vcl::Font                      aCurFont;
     176             :     Size                           aLogicalSize;
     177             :     OUString                       aCurText;
     178             :     sal_uInt16                     nFtCount;
     179             :     bool                           bRelease;
     180             :     Reference< XDispatchProvider > m_xDispatchProvider;
     181             :     Reference< XFrame >            m_xFrame;
     182             :     bool            mbEndPreview;
     183             : 
     184             :     void            ReleaseFocus_Impl();
     185             :     void            EnableControls_Impl();
     186             : 
     187           0 :     void            EndPreview()
     188             :     {
     189           0 :         Sequence< PropertyValue > aArgs;
     190             :         SfxToolBoxControl::Dispatch( m_xDispatchProvider,
     191             :                                          OUString( ".uno:CharEndPreviewFontName" ),
     192           0 :                                          aArgs );
     193           0 :     }
     194             :     DECL_DLLPRIVATE_LINK( CheckAndMarkUnknownFont, VclWindowEvent* );
     195             : 
     196             :     void            SetOptimalSize();
     197             : 
     198             : protected:
     199             :     virtual void    Select() SAL_OVERRIDE;
     200             :     virtual void    DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
     201             : 
     202             : public:
     203             :     SvxFontNameBox_Impl( vcl::Window* pParent, const Reference< XDispatchProvider >& rDispatchProvider,const Reference< XFrame >& _xFrame
     204             :         , WinBits nStyle = WB_SORT
     205             :         );
     206             :     virtual ~SvxFontNameBox_Impl();
     207             :     virtual void dispose() SAL_OVERRIDE;
     208             : 
     209             :     void            FillList();
     210             :     void            Update( const SvxFontItem* pFontItem );
     211           3 :     sal_uInt16      GetListCount() { return nFtCount; }
     212         986 :     void            Clear() { FontNameBox::Clear(); nFtCount = 0; }
     213         981 :     void            Fill( const FontList* pList )
     214         981 :                         { FontNameBox::Fill( pList );
     215         981 :                           nFtCount = pList->GetFontNameCount(); }
     216             :     virtual void    UserDraw( const UserDrawEvent& rUDEvt ) SAL_OVERRIDE;
     217             :     virtual bool    PreNotify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
     218             :     virtual bool    Notify( NotifyEvent& rNEvt ) SAL_OVERRIDE;
     219             :     virtual Reference< ::com::sun::star::accessibility::XAccessible > CreateAccessible() SAL_OVERRIDE;
     220           0 :     void     SetOwnFontList(::std::unique_ptr<FontList> && _aOwnFontList) { m_aOwnFontList = std::move(_aOwnFontList); }
     221             : };
     222             : 
     223             : // SelectHdl needs the Modifiers, get them in MouseButtonUp
     224           0 : class SvxFrmValueSet_Impl : public ValueSet
     225             : {
     226             :     sal_uInt16          nModifier;
     227             :     virtual void    MouseButtonUp( const MouseEvent& rMEvt ) SAL_OVERRIDE;
     228             : public:
     229           0 :     SvxFrmValueSet_Impl(vcl::Window* pParent,  WinBits nWinStyle)
     230           0 :         : ValueSet(pParent, nWinStyle), nModifier(0) {}
     231           0 :     sal_uInt16          GetModifier() const {return nModifier;}
     232             : 
     233             : };
     234             : 
     235           0 : void SvxFrmValueSet_Impl::MouseButtonUp( const MouseEvent& rMEvt )
     236             : {
     237           0 :     nModifier = rMEvt.GetModifier();
     238           0 :     ValueSet::MouseButtonUp(rMEvt);
     239           0 : }
     240             : 
     241             : class SvxFrameWindow_Impl : public SfxPopupWindow
     242             : {
     243             :     using FloatingWindow::StateChanged;
     244             : 
     245             : private:
     246             :     VclPtr<SvxFrmValueSet_Impl> aFrameSet;
     247             :     ImageList                   aImgList;
     248             :     bool                        bParagraphMode;
     249             : 
     250             :     DECL_LINK( SelectHdl, void * );
     251             : 
     252             : protected:
     253             :     virtual void    Resize() SAL_OVERRIDE;
     254             :     virtual bool    Close() SAL_OVERRIDE;
     255             :     virtual vcl::Window* GetPreferredKeyInputWindow() SAL_OVERRIDE;
     256             :     virtual void    GetFocus() SAL_OVERRIDE;
     257             : 
     258             : public:
     259             :     SvxFrameWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow );
     260             :     virtual ~SvxFrameWindow_Impl();
     261             :     virtual void dispose() SAL_OVERRIDE;
     262             : 
     263             :     void            StartSelection();
     264             : 
     265             :     virtual void    StateChanged( sal_uInt16 nSID, SfxItemState eState,
     266             :                                   const SfxPoolItem* pState ) SAL_OVERRIDE;
     267             :     virtual VclPtr<SfxPopupWindow> Clone() const SAL_OVERRIDE;
     268             :     virtual void    DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
     269             : };
     270             : 
     271             : class SvxLineWindow_Impl : public SfxPopupWindow
     272             : {
     273             : private:
     274             :     VclPtr<LineListBox> m_aLineStyleLb;
     275             :     bool                m_bIsWriter;
     276             : 
     277             :     DECL_LINK( SelectHdl, void * );
     278             : 
     279             : protected:
     280             :     virtual void    Resize() SAL_OVERRIDE;
     281             :     virtual bool    Close() SAL_OVERRIDE;
     282             :     virtual vcl::Window* GetPreferredKeyInputWindow() SAL_OVERRIDE;
     283             :     virtual void    GetFocus() SAL_OVERRIDE;
     284             :     virtual void    DataChanged( const DataChangedEvent& rDCEvt ) SAL_OVERRIDE;
     285             : public:
     286             :     SvxLineWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow );
     287           0 :     virtual ~SvxLineWindow_Impl() { disposeOnce(); }
     288           0 :     virtual void dispose() SAL_OVERRIDE { m_aLineStyleLb.disposeAndClear(); SfxPopupWindow::dispose(); }
     289             :     virtual VclPtr<SfxPopupWindow> Clone() const SAL_OVERRIDE;
     290             : };
     291             : 
     292             : class SvxStyleToolBoxControl;
     293             : 
     294        4970 : class SfxStyleControllerItem_Impl : public SfxStatusListener
     295             : {
     296             :     public:
     297             :         SfxStyleControllerItem_Impl( const Reference< XDispatchProvider >& rDispatchProvider,
     298             :                                      sal_uInt16 nSlotId,
     299             :                                      const OUString& rCommand,
     300             :                                      SvxStyleToolBoxControl& rTbxCtl );
     301             : 
     302             :     protected:
     303             :         virtual void StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState ) SAL_OVERRIDE;
     304             : 
     305             :     private:
     306             :         SvxStyleToolBoxControl& rControl;
     307             : };
     308             : 
     309             : #define BUTTON_WIDTH 20
     310             : #define ITEM_HEIGHT 30
     311             : 
     312         497 : SvxStyleBox_Impl::SvxStyleBox_Impl(vcl::Window* pParent,
     313             :                                    const OUString& rCommand,
     314             :                                    SfxStyleFamily eFamily,
     315             :                                    const Reference< XDispatchProvider >& rDispatchProvider,
     316             :                                    const Reference< XFrame >& _xFrame,
     317             :                                    const OUString& rClearFormatKey,
     318             :                                    const OUString& rMoreKey,
     319             :                                    bool bInSpec)
     320         497 :     : ComboBox( pParent, SVX_RES( RID_SVXTBX_STYLE ) )
     321             :     , eStyleFamily( eFamily )
     322             :     , nCurSel(0)
     323             :     , bRelease( true )
     324             :     , bVisible(false)
     325             :     , m_xDispatchProvider( rDispatchProvider )
     326             :     , m_xFrame(_xFrame)
     327             :     , m_aCommand( rCommand )
     328             :     , aClearFormatKey( rClearFormatKey )
     329             :     , aMoreKey( rMoreKey )
     330             :     , bInSpecialMode( bInSpec )
     331         497 :     , m_aMenu ( SVX_RES( RID_SVX_STYLE_MENU ) )
     332             : {
     333         497 :     m_aMenu.SetSelectHdl( LINK( this, SvxStyleBox_Impl, MenuSelectHdl ) );
     334        7952 :     for(int i = 0; i < MAX_STYLES_ENTRIES; i++)
     335        7455 :         m_pButtons[i] = NULL;
     336         497 :     aLogicalSize = PixelToLogic( GetSizePixel(), MAP_APPFONT );
     337         497 :     EnableAutocomplete( true );
     338         497 :     EnableUserDraw( true );
     339         497 :     SetUserItemSize( Size( 0, ITEM_HEIGHT ) );
     340         497 : }
     341             : 
     342        1491 : SvxStyleBox_Impl::~SvxStyleBox_Impl()
     343             : {
     344         497 :     disposeOnce();
     345         994 : }
     346             : 
     347         497 : void SvxStyleBox_Impl::dispose()
     348             : {
     349        7952 :     for(int i = 0; i < MAX_STYLES_ENTRIES; i++)
     350             :     {
     351        7455 :         m_pButtons[i].disposeAndClear();
     352             :     }
     353         497 :     ComboBox::dispose();
     354         497 : }
     355             : 
     356           0 : void SvxStyleBox_Impl::ReleaseFocus()
     357             : {
     358           0 :     if ( !bRelease )
     359             :     {
     360           0 :         bRelease = true;
     361           0 :         return;
     362             :     }
     363           0 :     if ( m_xFrame.is() && m_xFrame->getContainerWindow().is() )
     364           0 :         m_xFrame->getContainerWindow()->setFocus();
     365             : }
     366             : 
     367           0 : IMPL_LINK( SvxStyleBox_Impl, MenuSelectHdl, Menu*, pMenu)
     368             : {
     369           0 :     OUString sEntry = OUString( GetSelectEntry() );
     370           0 :     ReleaseFocus(); // It must be after getting entry pos!
     371           0 :     Sequence< PropertyValue > aArgs( 2 );
     372           0 :     aArgs[0].Name   = "Param";
     373           0 :     aArgs[0].Value  = makeAny( sEntry );
     374           0 :     aArgs[1].Name   = "Family";
     375           0 :     aArgs[1].Value  = makeAny( sal_Int16( eStyleFamily ));
     376             : 
     377           0 :     sal_uInt16 nMenuId = pMenu->GetCurItemId();
     378           0 :     switch(nMenuId) {
     379             :         case RID_SVX_UPDATE_STYLE:
     380             :         {
     381             :             SfxToolBoxControl::Dispatch( m_xDispatchProvider,
     382           0 :                 OUString( ".uno:StyleUpdateByExample" ), aArgs );
     383           0 :             break;
     384             :         }
     385             :         case RID_SVX_MODIFY_STYLE:
     386             :         {
     387             :             SfxToolBoxControl::Dispatch( m_xDispatchProvider,
     388           0 :                 OUString( ".uno:EditStyle" ), aArgs );
     389           0 :             break;
     390             :         }
     391             :     }
     392           0 :     return 0;
     393             : }
     394             : 
     395           0 : void SvxStyleBox_Impl::Select()
     396             : {
     397             :     // Tell base class about selection so that AT get informed about it.
     398           0 :     ComboBox::Select();
     399             : 
     400           0 :     if ( !IsTravelSelect() )
     401             :     {
     402           0 :         OUString aSearchEntry( GetText() );
     403           0 :         bool bDoIt = true, bClear = false;
     404           0 :         if( bInSpecialMode )
     405             :         {
     406           0 :             if( aSearchEntry == aClearFormatKey && GetSelectEntryPos() == 0 )
     407             :             {
     408           0 :                 aSearchEntry = sDefaultStyle;
     409           0 :                 bClear = true;
     410             :                 //not only apply default style but also call 'ClearFormatting'
     411           0 :                 Sequence< PropertyValue > aEmptyVals;
     412             :                 SfxToolBoxControl::Dispatch( m_xDispatchProvider, OUString(".uno:ResetAttributes"),
     413           0 :                     aEmptyVals);
     414             :             }
     415           0 :             else if( aSearchEntry == aMoreKey && GetSelectEntryPos() == ( GetEntryCount() - 1 ) )
     416             :             {
     417           0 :                 SfxViewFrame* pViewFrm = SfxViewFrame::Current();
     418             :                 DBG_ASSERT( pViewFrm, "SvxStyleBox_Impl::Select(): no viewframe" );
     419           0 :                 pViewFrm->ShowChildWindow( SID_SIDEBAR );
     420             :                 ::sfx2::sidebar::Sidebar::ShowPanel("StyleListPanel",
     421           0 :                                                     pViewFrm->GetFrame().GetFrameInterface());
     422           0 :                 bDoIt = false;
     423             :             }
     424             :         }
     425             : 
     426             :         //Do we need to create a new style?
     427           0 :         SfxObjectShell *pShell = SfxObjectShell::Current();
     428           0 :         SfxStyleSheetBasePool* pPool = pShell->GetStyleSheetPool();
     429           0 :         SfxStyleSheetBase* pStyle = NULL;
     430             : 
     431           0 :         bool bCreateNew = false;
     432             : 
     433           0 :         if ( pPool )
     434             :         {
     435           0 :             pPool->SetSearchMask( eStyleFamily, SFXSTYLEBIT_ALL );
     436             : 
     437           0 :             pStyle = pPool->First();
     438           0 :             while ( pStyle && OUString( pStyle->GetName() ) != aSearchEntry )
     439           0 :                 pStyle = pPool->Next();
     440             :         }
     441             : 
     442           0 :         if ( !pStyle )
     443             :         {
     444             :             // cannot find the style for whatever reason
     445             :             // therefore create a new style
     446           0 :             bCreateNew = true;
     447             :         }
     448             : 
     449             :         /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
     450             :             This instance may be deleted in the meantime (i.e. when a dialog is opened
     451             :             while in Dispatch()), accessing members will crash in this case. */
     452           0 :         ReleaseFocus();
     453             : 
     454           0 :         if( bDoIt )
     455             :         {
     456           0 :             if ( bClear )
     457           0 :                 SetText( aSearchEntry );
     458           0 :             SaveValue();
     459             : 
     460           0 :             Sequence< PropertyValue > aArgs( 2 );
     461           0 :             aArgs[0].Value  = makeAny( OUString( aSearchEntry ) );
     462           0 :             aArgs[1].Name   = "Family";
     463           0 :             aArgs[1].Value  = makeAny( sal_Int16( eStyleFamily ));
     464           0 :             if( bCreateNew )
     465             :             {
     466           0 :                 aArgs[0].Name   = "Param";
     467           0 :                 SfxToolBoxControl::Dispatch( m_xDispatchProvider, OUString(".uno:StyleNewByExample"), aArgs);
     468             :             }
     469             :             else
     470             :             {
     471           0 :                 aArgs[0].Name   = "Template";
     472           0 :                 SfxToolBoxControl::Dispatch( m_xDispatchProvider, m_aCommand, aArgs );
     473           0 :             }
     474           0 :         }
     475             :     }
     476           0 : }
     477             : 
     478        4703 : void SvxStyleBox_Impl::SetFamily( SfxStyleFamily eNewFamily )
     479             : {
     480        4703 :     eStyleFamily = eNewFamily;
     481        4703 : }
     482             : 
     483           3 : bool SvxStyleBox_Impl::PreNotify( NotifyEvent& rNEvt )
     484             : {
     485           3 :     MouseNotifyEvent nType = rNEvt.GetType();
     486             : 
     487           3 :     if ( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType )
     488           2 :         nCurSel = GetSelectEntryPos();
     489           1 :     else if ( MouseNotifyEvent::LOSEFOCUS == nType )
     490             :     {
     491             :         // don't handle before our Select() is called
     492           1 :         if ( !HasFocus() && !HasChildPathFocus() )
     493           0 :             SetText( GetSavedValue() );
     494             :     }
     495           3 :     return ComboBox::PreNotify( rNEvt );
     496             : }
     497             : 
     498         997 : bool SvxStyleBox_Impl::Notify( NotifyEvent& rNEvt )
     499             : {
     500         997 :     bool nHandled = false;
     501             : 
     502         997 :     if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
     503             :     {
     504           0 :         sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
     505             : 
     506           0 :         switch ( nCode )
     507             :         {
     508             :             case KEY_CONTEXTMENU:
     509             :             {
     510           0 :                 if(IsInDropDown())
     511             :                 {
     512           0 :                     sal_uInt16 nItem = GetSelectEntryPos() - 1;
     513           0 :                     if(nItem < MAX_STYLES_ENTRIES)
     514           0 :                         m_pButtons[nItem]->ExecuteMenu();
     515           0 :                     nHandled = true;
     516             :                 }
     517           0 :                 break;
     518             :             }
     519             :             case KEY_RETURN:
     520             :             case KEY_TAB:
     521             :             {
     522           0 :                 if ( KEY_TAB == nCode )
     523           0 :                     bRelease = false;
     524             :                 else
     525           0 :                     nHandled = true;
     526           0 :                 Select();
     527           0 :                 break;
     528             :             }
     529             : 
     530             :             case KEY_ESCAPE:
     531           0 :                 SelectEntryPos( nCurSel );
     532           0 :                 ReleaseFocus();
     533           0 :                 nHandled = true;
     534           0 :                 break;
     535             :         }
     536             :     }
     537         997 :     return nHandled || ComboBox::Notify( rNEvt );
     538             : }
     539             : 
     540           0 : void SvxStyleBox_Impl::DataChanged( const DataChangedEvent& rDCEvt )
     541             : {
     542           0 :     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
     543           0 :          (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     544             :     {
     545           0 :         SetSizePixel(LogicToPixel(aLogicalSize, MAP_APPFONT));
     546             :     }
     547             : 
     548           0 :     ComboBox::DataChanged( rDCEvt );
     549           0 : }
     550             : 
     551       19469 : void SvxStyleBox_Impl::StateChanged( StateChangedType nStateChange )
     552             : {
     553       19469 :     ComboBox::StateChanged( nStateChange );
     554             : 
     555       19469 :     if ( nStateChange == StateChangedType::Visible )
     556             :     {
     557         339 :         bVisible = IsReallyVisible();
     558         339 :         if ( aVisibilityListener.IsSet() )
     559         339 :             aVisibilityListener.Call( this );
     560             :     }
     561       19130 :     else if ( nStateChange == StateChangedType::InitShow )
     562             :     {
     563         339 :         bVisible = true;
     564         339 :         if ( aVisibilityListener.IsSet() )
     565         339 :             aVisibilityListener.Call( this );
     566             :     }
     567       19469 : }
     568             : 
     569       37521 : bool SvxStyleBox_Impl::AdjustFontForItemHeight(OutputDevice* pDevice, Rectangle& rTextRect, long nHeight)
     570             : {
     571       37521 :     if (rTextRect.Bottom() > nHeight)
     572             :     {
     573             :         // the text does not fit, adjust the font size
     574        4366 :         double ratio = static_cast< double >( nHeight ) / rTextRect.Bottom();
     575        4366 :         vcl::Font aFont(pDevice->GetFont());
     576        4366 :         Size aPixelSize(aFont.GetSize());
     577        4366 :         aPixelSize.Width() *= ratio;
     578        4366 :         aPixelSize.Height() *= ratio;
     579        4366 :         aFont.SetSize(aPixelSize);
     580        4366 :         pDevice->SetFont(aFont);
     581        4366 :         return true;
     582             :     }
     583       33155 :     return false;
     584             : }
     585             : 
     586          26 : void SvxStyleBox_Impl::UserDrawEntry(const UserDrawEvent& rUDEvt, const OUString &rStyleName)
     587             : {
     588          26 :     OutputDevice *pDevice = rUDEvt.GetDevice();
     589             : 
     590             :     // IMG_TXT_DISTANCE in ilstbox.hxx is 6, then 1 is added as
     591             :     // nBorder, and we are adding 1 in order to look better when
     592             :     // italics is present
     593          26 :     const int nLeftDistance = 8;
     594             : 
     595          26 :     Rectangle aTextRect;
     596          26 :     pDevice->GetTextBoundRect(aTextRect, rStyleName);
     597             : 
     598          26 :     Point aPos( rUDEvt.GetRect().TopLeft() );
     599          26 :     aPos.X() += nLeftDistance;
     600             : 
     601          26 :     if (!AdjustFontForItemHeight(pDevice, aTextRect, rUDEvt.GetRect().GetHeight()))
     602          24 :         aPos.Y() += ( rUDEvt.GetRect().GetHeight() - aTextRect.Bottom() ) / 2;
     603             : 
     604          26 :     pDevice->DrawText(aPos, rStyleName);
     605          26 : }
     606             : 
     607       37521 : void SvxStyleBox_Impl::SetupEntry(sal_uInt16 nItem, const Rectangle& rRect, OutputDevice* pDevice, const OUString& rStyleName, bool bIsNotSelected)
     608             : {
     609       37521 :     unsigned int nId = rRect.GetHeight() != 0 ? (rRect.getY() / rRect.GetHeight()) : MAX_STYLES_ENTRIES;
     610       37521 :     if (nItem == 0 || nItem == GetEntryCount() - 1)
     611             :     {
     612           6 :         if(nId < MAX_STYLES_ENTRIES && m_pButtons[nId])
     613           0 :             m_pButtons[nId]->Hide();
     614             :     }
     615             :     else
     616             :     {
     617       37515 :         SfxObjectShell *pShell = SfxObjectShell::Current();
     618       37515 :         SfxStyleSheetBasePool* pPool = pShell->GetStyleSheetPool();
     619       37515 :         SfxStyleSheetBase* pStyle = NULL;
     620             : 
     621       37515 :         if ( pPool )
     622             :         {
     623       37515 :             pPool->SetSearchMask( eStyleFamily, SFXSTYLEBIT_ALL );
     624             : 
     625       37515 :             pStyle = pPool->First();
     626      381452 :             while (pStyle && pStyle->GetName() != rStyleName)
     627      306422 :                 pStyle = pPool->Next();
     628             :         }
     629             : 
     630       37515 :         if (pStyle )
     631             :         {
     632       35156 :             const SfxItemSet& aItemSet = pStyle->GetItemSet();
     633             : 
     634       35156 :             const SvxFontItem *pFontItem = static_cast< const SvxFontItem* >( aItemSet.GetItem( SID_ATTR_CHAR_FONT ) );
     635       35156 :             const SvxFontHeightItem *pFontHeightItem = static_cast< const SvxFontHeightItem* >( aItemSet.GetItem( SID_ATTR_CHAR_FONTHEIGHT ) );
     636             : 
     637       35156 :             if ( pFontItem && pFontHeightItem )
     638             :             {
     639       35156 :                 Size aFontSize( 0, pFontHeightItem->GetHeight() );
     640       35156 :                 Size aPixelSize( pDevice->LogicToPixel( aFontSize, pShell->GetMapUnit() ) );
     641             : 
     642             :                 // setup the font properties
     643       35156 :                 SvxFont aFont;
     644       35156 :                 aFont.SetName(pFontItem->GetFamilyName());
     645       35156 :                 aFont.SetStyleName(pFontItem->GetStyleName());
     646       35156 :                 aFont.SetSize(aPixelSize);
     647             : 
     648       35156 :                 const SfxPoolItem *pItem = aItemSet.GetItem( SID_ATTR_CHAR_WEIGHT );
     649       35156 :                 if ( pItem )
     650       35156 :                     aFont.SetWeight( static_cast< const SvxWeightItem* >( pItem )->GetWeight() );
     651             : 
     652       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_POSTURE );
     653       35156 :                 if ( pItem )
     654       35156 :                     aFont.SetItalic( static_cast< const SvxPostureItem* >( pItem )->GetPosture() );
     655             : 
     656       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_CONTOUR );
     657       35156 :                 if ( pItem )
     658       35156 :                     aFont.SetOutline( static_cast< const SvxContourItem* >( pItem )->GetValue() );
     659             : 
     660       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_SHADOWED );
     661       35156 :                 if ( pItem )
     662       35156 :                     aFont.SetShadow( static_cast< const SvxShadowedItem* >( pItem )->GetValue() );
     663             : 
     664       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_RELIEF );
     665       35156 :                 if ( pItem )
     666       35156 :                     aFont.SetRelief( static_cast< FontRelief >( static_cast< const SvxCharReliefItem* >( pItem )->GetValue() ) );
     667             : 
     668       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_UNDERLINE );
     669       35156 :                 if ( pItem )
     670       35156 :                     aFont.SetUnderline( static_cast< const SvxUnderlineItem* >( pItem )->GetLineStyle() );
     671             : 
     672       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_OVERLINE );
     673       35156 :                 if ( pItem )
     674       35156 :                     aFont.SetOverline( static_cast< FontUnderline >( static_cast< const SvxOverlineItem* >( pItem )->GetValue() ) );
     675             : 
     676       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_STRIKEOUT );
     677       35156 :                 if ( pItem )
     678       35156 :                     aFont.SetStrikeout( static_cast< const SvxCrossedOutItem* >( pItem )->GetStrikeout() );
     679             : 
     680       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_CASEMAP );
     681       35156 :                 if ( pItem )
     682       35156 :                     aFont.SetCaseMap(static_cast<const SvxCaseMapItem*>(pItem)->GetCaseMap());
     683             : 
     684       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_EMPHASISMARK );
     685       35156 :                 if ( pItem )
     686       35156 :                     aFont.SetEmphasisMark( static_cast< const SvxEmphasisMarkItem* >( pItem )->GetEmphasisMark() );
     687             : 
     688             :                 // setup the device & draw
     689       70312 :                 vcl::Font aOldFont( pDevice->GetFont() );
     690             : 
     691       35156 :                 Color aFontCol = COL_AUTO, aBackCol = COL_AUTO;
     692             : 
     693       35156 :                 pDevice->SetFont( aFont );
     694             : 
     695       35156 :                 pItem = aItemSet.GetItem( SID_ATTR_CHAR_COLOR );
     696             :                 // text color, when nothing is selected
     697       35156 :                 if ( (NULL != pItem) && bIsNotSelected)
     698       35152 :                     aFontCol = Color( static_cast< const SvxColorItem* >( pItem )->GetValue() );
     699             : 
     700       35156 :                 sal_uInt16 style = drawing::FillStyle_NONE;
     701             :                 // which kind of Fill style is selected
     702       35156 :                 pItem = aItemSet.GetItem( XATTR_FILLSTYLE );
     703             :                 // only when ok and not selected
     704       35156 :                 if ( (NULL != pItem) && bIsNotSelected)
     705       35152 :                     style = static_cast< const XFillStyleItem* >( pItem )->GetValue();
     706             : 
     707       35156 :                 switch(style)
     708             :                 {
     709             :                     case drawing::FillStyle_SOLID:
     710             :                     {
     711             :                         // set background color
     712           0 :                         pItem = aItemSet.GetItem( XATTR_FILLCOLOR );
     713           0 :                         if ( NULL != pItem )
     714           0 :                             aBackCol = Color( static_cast< const XFillColorItem* >( pItem )->GetColorValue() );
     715             : 
     716           0 :                         if ( aBackCol != COL_AUTO )
     717             :                         {
     718           0 :                             pDevice->SetFillColor( aBackCol );
     719           0 :                             pDevice->DrawRect(rRect);
     720             :                         }
     721             :                     }
     722           0 :                     break;
     723             : 
     724             :                     //TODO Draw the other background styles: gradient, hatching and bitmap
     725             :                 }
     726             : 
     727             :                 // when the font and background color are too similar, adjust the Font-Color
     728       35156 :                 if( (aFontCol != COL_AUTO) || (aBackCol != COL_AUTO) )
     729           0 :                     aFontCol = TestColorsVisible(aFontCol, (aBackCol != COL_AUTO) ? aBackCol : pDevice->GetBackground().GetColor());
     730             : 
     731             :                 // set text color
     732       35156 :                 if ( aFontCol != COL_AUTO )
     733           0 :                     pDevice->SetTextColor( aFontCol );
     734             : 
     735             :                 // handle the push-button
     736       35156 :                 if (bIsNotSelected)
     737             :                 {
     738       35152 :                     if (nId < MAX_STYLES_ENTRIES && m_pButtons[nId])
     739           0 :                         m_pButtons[nId]->Hide();
     740             :                 }
     741             :                 else
     742             :                 {
     743           4 :                     if (nId < MAX_STYLES_ENTRIES)
     744             :                     {
     745           4 :                         if(m_pButtons[nId] == nullptr)
     746             :                         {
     747           1 :                             m_pButtons[nId] = VclPtr<MenuButton>::Create(static_cast<vcl::Window*>(pDevice), WB_FLATBUTTON | WB_NOPOINTERFOCUS);
     748           1 :                             m_pButtons[nId]->SetSizePixel(Size(BUTTON_WIDTH, rRect.GetHeight()));
     749           1 :                             m_pButtons[nId]->SetPopupMenu(&m_aMenu);
     750             :                         }
     751           4 :                         m_pButtons[nId]->SetPosPixel(Point(rRect.GetWidth() - BUTTON_WIDTH, rRect.getY()));
     752           4 :                         m_pButtons[nId]->Show();
     753             :                     }
     754       35156 :                 }
     755             :             }
     756             :         }
     757             :     }
     758       37521 : }
     759             : 
     760          26 : void SvxStyleBox_Impl::UserDraw( const UserDrawEvent& rUDEvt )
     761             : {
     762          26 :     sal_uInt16 nItem = rUDEvt.GetItemId();
     763          26 :     OUString aStyleName( GetEntry( nItem ) );
     764             : 
     765          26 :     OutputDevice *pDevice = rUDEvt.GetDevice();
     766          26 :     pDevice->Push(PushFlags::FILLCOLOR | PushFlags::FONT | PushFlags::TEXTCOLOR);
     767             : 
     768          26 :     const Rectangle& rRect(rUDEvt.GetRect());
     769          26 :     bool bIsNotSelected = rUDEvt.GetItemId() != GetSelectEntryPos();
     770             : 
     771          26 :     SetupEntry(nItem, rRect, pDevice, aStyleName, bIsNotSelected);
     772             : 
     773          26 :     UserDrawEntry(rUDEvt, aStyleName);
     774             : 
     775          26 :     pDevice->Pop();
     776             :     // draw separator, if present
     777          26 :     DrawEntry( rUDEvt, false, false );
     778          26 : }
     779             : 
     780        4703 : void SvxStyleBox_Impl::CalcOptimalExtraUserWidth()
     781             : {
     782        4703 :     long nMaxNormalFontWidth = 0;
     783        4703 :     sal_Int32 nEntryCount = GetEntryCount();
     784       51600 :     for (sal_Int32 i = 0; i < nEntryCount; ++i)
     785             :     {
     786       46897 :         OUString sStyleName(GetEntry(i));
     787       46897 :         Rectangle aTextRectForDefaultFont;
     788       46897 :         GetTextBoundRect(aTextRectForDefaultFont, sStyleName);
     789             : 
     790       46897 :         const long nWidth = aTextRectForDefaultFont.GetWidth();
     791             : 
     792       46897 :         nMaxNormalFontWidth = std::max(nWidth, nMaxNormalFontWidth);
     793       46897 :     }
     794             : 
     795        4703 :     long nMaxUserDrawFontWidth = nMaxNormalFontWidth;
     796       42198 :     for (sal_Int32 i = 1; i < nEntryCount-1; ++i)
     797             :     {
     798       37495 :         OUString sStyleName(GetEntry(i));
     799             : 
     800       37495 :         Push(PushFlags::FILLCOLOR | PushFlags::FONT | PushFlags::TEXTCOLOR);
     801       37495 :         SetupEntry(i, Rectangle(0, 0, RECT_MAX, ITEM_HEIGHT), this, sStyleName, true);
     802       37495 :         Rectangle aTextRectForActualFont;
     803       37495 :         GetTextBoundRect(aTextRectForActualFont, sStyleName);
     804       37495 :         if (AdjustFontForItemHeight(this, aTextRectForActualFont, ITEM_HEIGHT))
     805             :         {
     806             :             //Font didn't fit, so it was changed, refetch with final font size
     807        4364 :             GetTextBoundRect(aTextRectForActualFont, sStyleName);
     808             :         }
     809       37495 :         Pop();
     810             : 
     811       37495 :         const long nWidth = aTextRectForActualFont.GetWidth() + BUTTON_WIDTH;
     812             : 
     813       37495 :         nMaxUserDrawFontWidth = std::max(nWidth, nMaxUserDrawFontWidth);
     814       37495 :     }
     815             : 
     816        4703 :     SetUserItemSize(Size(nMaxUserDrawFontWidth - nMaxNormalFontWidth, ITEM_HEIGHT));
     817        4703 : }
     818             : 
     819             : // test is the color between Font- and background-color to be identify
     820             : // return is always the Font-Color
     821             : //        when both light or dark, change the Contrast
     822             : //        in other case do not change the origin color
     823             : //        when the color is R=G=B=128 the DecreaseContast make 128 the need a exception
     824           0 : Color SvxStyleBox_Impl::TestColorsVisible(const Color &FontCol, const Color &BackCol)
     825             : {
     826           0 :     const sal_uInt8  ChgVal = 60;       // increase/decrease the Contrast
     827             : 
     828           0 :     Color  retCol = FontCol;
     829           0 :     if ((FontCol.IsDark() == BackCol.IsDark()) && (FontCol.IsBright() == BackCol.IsBright()))
     830             :     {
     831           0 :         sal_uInt8 lumi = retCol.GetLuminance();
     832             : 
     833           0 :         if((lumi > 120) && (lumi < 140))
     834           0 :             retCol.DecreaseLuminance(ChgVal / 2);
     835             :         else
     836           0 :             retCol.DecreaseContrast(ChgVal);
     837             :     }
     838             : 
     839           0 :     return retCol;
     840             : }
     841             : 
     842             : 
     843             : 
     844         984 : static bool lcl_GetDocFontList( const FontList** ppFontList, SvxFontNameBox_Impl* pBox )
     845             : {
     846         984 :     bool bChanged = false;
     847         984 :     const SfxObjectShell* pDocSh = SfxObjectShell::Current();
     848         984 :     const SvxFontListItem* pFontListItem = NULL;
     849             : 
     850         984 :     if ( pDocSh )
     851             :         pFontListItem =
     852         984 :             static_cast<const SvxFontListItem*>(pDocSh->GetItem( SID_ATTR_CHAR_FONTLIST ));
     853             :     else
     854             :     {
     855           0 :         ::std::unique_ptr<FontList> aFontList(new FontList( pBox ));
     856           0 :         *ppFontList = aFontList.get();
     857           0 :         pBox->SetOwnFontList(std::move(aFontList));
     858           0 :         bChanged = true;
     859             :     }
     860             : 
     861         984 :     if ( pFontListItem )
     862             :     {
     863         984 :         const FontList* pNewFontList = pFontListItem->GetFontList();
     864             :         DBG_ASSERT( pNewFontList, "Doc-FontList not available!" );
     865             : 
     866             :         // No old list, but a new list
     867         984 :         if ( !*ppFontList && pNewFontList )
     868             :         {
     869             :             // => take over
     870         981 :             *ppFontList = pNewFontList;
     871         981 :             bChanged = true;
     872             :         }
     873             :         else
     874             :         {
     875             :             // Comparing the font lists is not perfect.
     876             :             // When you change the font list in the Doc, you can track
     877             :             // changes here only on the Listbox, because ppFontList
     878             :             // has already been updated.
     879             :             bChanged =
     880           6 :                 ( ( *ppFontList != pNewFontList ) ||
     881           6 :                   pBox->GetListCount() != pNewFontList->GetFontNameCount() );
     882             :             // HACK: Comparing is incomplete
     883             : 
     884           3 :             if ( bChanged )
     885           0 :                 *ppFontList = pNewFontList;
     886             :         }
     887             : 
     888         984 :         if ( pBox )
     889         984 :             pBox->Enable();
     890             :     }
     891           0 :     else if ( pBox && ( pDocSh || ( !pDocSh && !ppFontList )))
     892             :     {
     893             :         // Disable box only when we have a SfxObjectShell and didn't get a font list OR
     894             :         // we don't have a SfxObjectShell and no current font list.
     895             :         // It's possible that we currently have no SfxObjectShell, but a current font list.
     896             :         // See #i58471: When a user set the focus into the font name combo box and opens
     897             :         // the help window with F1. After closing the help window, we disable the font name
     898             :         // combo box. The SfxObjectShell::Current() method returns in that case zero. But the
     899             :         // font list hasn't changed and therefore the combo box shouldn't be disabled!
     900           0 :         pBox->Disable();
     901             :     }
     902             : 
     903             :     // Fill the FontBox, also the new list if necessary
     904         984 :     if ( pBox && bChanged )
     905             :     {
     906         981 :         if ( *ppFontList )
     907         981 :             pBox->Fill( *ppFontList );
     908             :         else
     909           0 :             pBox->Clear();
     910             :     }
     911         984 :     return bChanged;
     912             : }
     913             : 
     914         986 : SvxFontNameBox_Impl::SvxFontNameBox_Impl( vcl::Window* pParent, const Reference< XDispatchProvider >& rDispatchProvider,const Reference< XFrame >& _xFrame, WinBits nStyle ) :
     915             : 
     916             :     FontNameBox        ( pParent, nStyle | WinBits( WB_DROPDOWN | WB_AUTOHSCROLL ) ),
     917             :     pFontList          ( NULL ),
     918             :     aLogicalSize       ( 60,160 ),
     919             :     nFtCount           ( 0 ),
     920             :     bRelease           ( true ),
     921             :     m_xDispatchProvider( rDispatchProvider ),
     922             :     m_xFrame (_xFrame),
     923         986 :     mbEndPreview(false)
     924             : {
     925         986 :     SetOptimalSize();
     926         986 :     EnableControls_Impl();
     927         986 :     GetSubEdit()->AddEventListener( LINK( this, SvxFontNameBox_Impl, CheckAndMarkUnknownFont ));
     928         986 : }
     929             : 
     930        2958 : SvxFontNameBox_Impl::~SvxFontNameBox_Impl()
     931             : {
     932         986 :     disposeOnce();
     933        1972 : }
     934             : 
     935         986 : void SvxFontNameBox_Impl::dispose()
     936             : {
     937         986 :     GetSubEdit()->RemoveEventListener( LINK( this, SvxFontNameBox_Impl, CheckAndMarkUnknownFont ));
     938         986 :     FontNameBox::dispose();
     939         986 : }
     940             : 
     941           1 : void SvxFontNameBox_Impl::FillList()
     942             : {
     943             :     // Save old Selection, set back in the end
     944           1 :     Selection aOldSel = GetSelection();
     945             :     // Did Doc-Fontlist change?
     946           1 :     lcl_GetDocFontList( &pFontList, this );
     947           1 :     aCurText = GetText();
     948           1 :     SetSelection( aOldSel );
     949           1 : }
     950             : 
     951       10022 : IMPL_LINK( SvxFontNameBox_Impl, CheckAndMarkUnknownFont, VclWindowEvent*, event )
     952             : {
     953        5011 :     if( event->GetId() != VCLEVENT_EDIT_MODIFY )
     954        4028 :         return 0;
     955         983 :     OUString fontname = GetSubEdit()->GetText();
     956         983 :     lcl_GetDocFontList( &pFontList, this );
     957             :     // If the font is unknown, show it in italic.
     958        1966 :     vcl::Font font = GetControlFont();
     959         983 :     if( pFontList != NULL && pFontList->IsAvailable( fontname ))
     960             :     {
     961         977 :         if( font.GetItalic() != ITALIC_NONE )
     962             :         {
     963           0 :             font.SetItalic( ITALIC_NONE );
     964           0 :             SetControlFont( font );
     965           0 :             SetQuickHelpText( SVX_RESSTR( RID_SVXSTR_CHARFONTNAME ));
     966             :         }
     967             :     }
     968             :     else
     969             :     {
     970           6 :         if( font.GetItalic() != ITALIC_NORMAL )
     971             :         {
     972           6 :             font.SetItalic( ITALIC_NORMAL );
     973           6 :             SetControlFont( font );
     974           6 :             SetQuickHelpText( SVX_RESSTR( RID_SVXSTR_CHARFONTNAME_NOTAVAILABLE ));
     975             :         }
     976             :     }
     977        1966 :     return 0;
     978             : }
     979             : 
     980        1678 : void SvxFontNameBox_Impl::Update( const SvxFontItem* pFontItem )
     981             : {
     982        1678 :     if ( pFontItem )
     983             :     {
     984        1673 :         aCurFont.SetName        ( pFontItem->GetFamilyName() );
     985        1673 :         aCurFont.SetFamily      ( pFontItem->GetFamily() );
     986        1673 :         aCurFont.SetStyleName   ( pFontItem->GetStyleName() );
     987        1673 :         aCurFont.SetPitch       ( pFontItem->GetPitch() );
     988        1673 :         aCurFont.SetCharSet     ( pFontItem->GetCharSet() );
     989             :     }
     990        1678 :     OUString aCurName = aCurFont.GetName();
     991        1678 :     if ( GetText() != aCurName )
     992         983 :         SetText( aCurName );
     993        1678 : }
     994             : 
     995           0 : bool SvxFontNameBox_Impl::PreNotify( NotifyEvent& rNEvt )
     996             : {
     997           0 :     MouseNotifyEvent nType = rNEvt.GetType();
     998             : 
     999           0 :     if ( MouseNotifyEvent::MOUSEBUTTONDOWN == nType || MouseNotifyEvent::GETFOCUS == nType )
    1000             :     {
    1001           0 :         EnableControls_Impl();
    1002           0 :         FillList();
    1003             :     }
    1004           0 :     return FontNameBox::PreNotify( rNEvt );
    1005             : }
    1006             : 
    1007        1972 : bool SvxFontNameBox_Impl::Notify( NotifyEvent& rNEvt )
    1008             : {
    1009        1972 :     bool nHandled = false;
    1010        1972 :     mbEndPreview = false;
    1011        1972 :     if ( rNEvt.GetType() == MouseNotifyEvent::KEYUP )
    1012           0 :         mbEndPreview = true;
    1013             : 
    1014        1972 :     if ( rNEvt.GetType() == MouseNotifyEvent::KEYINPUT )
    1015             :     {
    1016           0 :         sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
    1017             : 
    1018           0 :         switch ( nCode )
    1019             :         {
    1020             :             case KEY_RETURN:
    1021             :             case KEY_TAB:
    1022             :             {
    1023           0 :                 if ( KEY_TAB == nCode )
    1024           0 :                     bRelease = false;
    1025             :                 else
    1026           0 :                     nHandled = true;
    1027           0 :                 Select();
    1028           0 :                 break;
    1029             :             }
    1030             : 
    1031             :             case KEY_ESCAPE:
    1032           0 :                 SetText( aCurText );
    1033           0 :                 ReleaseFocus_Impl();
    1034           0 :                 EndPreview();
    1035           0 :                 break;
    1036             :         }
    1037             :     }
    1038        1972 :     else if ( MouseNotifyEvent::LOSEFOCUS == rNEvt.GetType() )
    1039             :     {
    1040           0 :         vcl::Window* pFocusWin = Application::GetFocusWindow();
    1041           0 :         if ( !HasFocus() && GetSubEdit() != pFocusWin )
    1042           0 :             SetText( GetSavedValue() );
    1043             :         // send EndPreview
    1044           0 :         EndPreview();
    1045             :     }
    1046             : 
    1047        1972 :     return nHandled || FontNameBox::Notify( rNEvt );
    1048             : }
    1049             : 
    1050         986 : void SvxFontNameBox_Impl::SetOptimalSize()
    1051             : {
    1052         986 :     Size aSize(LogicToPixel(aLogicalSize, MAP_APPFONT));
    1053         986 :     set_width_request(aSize.Width());
    1054         986 :     set_height_request(aSize.Height());
    1055         986 :     SetSizePixel(aSize);
    1056         986 : }
    1057             : 
    1058           0 : void SvxFontNameBox_Impl::DataChanged( const DataChangedEvent& rDCEvt )
    1059             : {
    1060           0 :     if ( (rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
    1061           0 :          (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
    1062             :     {
    1063           0 :         SetOptimalSize();
    1064             :     }
    1065           0 :     else if ( ( rDCEvt.GetType() == DataChangedEventType::FONTS ) ||
    1066           0 :               ( rDCEvt.GetType() == DataChangedEventType::DISPLAY ) )
    1067             :     {
    1068             :         // The old font list in shell has likely been destroyed at this point, so we need to get
    1069             :         // the new one before doing anything further.
    1070           0 :         lcl_GetDocFontList( &pFontList, this );
    1071             :     }
    1072             : 
    1073           0 :     FontNameBox::DataChanged( rDCEvt );
    1074           0 : }
    1075             : 
    1076           0 : void SvxFontNameBox_Impl::ReleaseFocus_Impl()
    1077             : {
    1078           0 :     if ( !bRelease )
    1079             :     {
    1080           0 :         bRelease = true;
    1081           0 :         return;
    1082             :     }
    1083           0 :     if ( m_xFrame.is() && m_xFrame->getContainerWindow().is() )
    1084           0 :         m_xFrame->getContainerWindow()->setFocus();
    1085             : }
    1086             : 
    1087         986 : void SvxFontNameBox_Impl::EnableControls_Impl()
    1088             : {
    1089         986 :     SvtFontOptions aFontOpt;
    1090         986 :     bool bEnable = aFontOpt.IsFontHistoryEnabled();
    1091         986 :     sal_uInt16 nEntries = bEnable ? MAX_MRU_FONTNAME_ENTRIES : 0;
    1092         986 :     if ( GetMaxMRUCount() != nEntries )
    1093             :     {
    1094             :         // refill in the next GetFocus-Handler
    1095         986 :         pFontList = NULL;
    1096         986 :         Clear();
    1097         986 :         SetMaxMRUCount( nEntries );
    1098             :     }
    1099             : 
    1100         986 :     bEnable = aFontOpt.IsFontWYSIWYGEnabled();
    1101         986 :     EnableWYSIWYG( bEnable );
    1102         986 : }
    1103             : 
    1104           0 : void SvxFontNameBox_Impl::UserDraw( const UserDrawEvent& rUDEvt )
    1105             : {
    1106           0 :     FontNameBox::UserDraw( rUDEvt );
    1107             : 
    1108             :     // Hack - GetStyle now contains the currently
    1109             :     // selected item in the list box
    1110             :     // ItemId contains the id of the current item to draw
    1111             :     // or select
    1112           0 :     if (  rUDEvt.GetItemId() == rUDEvt.GetStyle() )
    1113             :     {
    1114           0 :         OUString fontName(GetText());
    1115           0 :         if (IsInDropDown())
    1116             :         {
    1117             :             /*
    1118             :              * when in dropdown mode the selected item should be
    1119             :              * used and not the current selection
    1120             :              */
    1121           0 :              fontName = GetEntry(rUDEvt.GetItemId());
    1122             :         }
    1123           0 :         Sequence< PropertyValue > aArgs( 1 );
    1124             :         vcl::FontInfo aInfo( pFontList->Get( fontName,
    1125             :             aCurFont.GetWeight(),
    1126           0 :             aCurFont.GetItalic() ) );
    1127             : 
    1128             :         SvxFontItem aFontItem( aInfo.GetFamily(),
    1129           0 :             aInfo.GetName(),
    1130           0 :             aInfo.GetStyleName(),
    1131             :             aInfo.GetPitch(),
    1132           0 :             aInfo.GetCharSet(),
    1133           0 :             SID_ATTR_CHAR_FONT );
    1134           0 :         aFontItem.QueryValue( aArgs[0].Value );
    1135           0 :         aArgs[0].Name   = "CharPreviewFontName";
    1136             :         SfxToolBoxControl::Dispatch( m_xDispatchProvider,
    1137             :             OUString( ".uno:CharPreviewFontName" ),
    1138           0 :                 aArgs );
    1139             :     }
    1140           0 : }
    1141             : 
    1142           0 : void SvxFontNameBox_Impl::Select()
    1143             : {
    1144           0 :     FontNameBox::Select();
    1145             : 
    1146           0 :     Sequence< PropertyValue > aArgs( 1 );
    1147           0 :     std::unique_ptr<SvxFontItem> pFontItem;
    1148           0 :     if ( pFontList )
    1149             :     {
    1150           0 :         vcl::FontInfo aInfo( pFontList->Get( GetText(),
    1151             :             aCurFont.GetWeight(),
    1152           0 :             aCurFont.GetItalic() ) );
    1153           0 :         aCurFont = aInfo;
    1154             : 
    1155             :         pFontItem.reset( new SvxFontItem( aInfo.GetFamily(),
    1156             :             aInfo.GetName(),
    1157             :             aInfo.GetStyleName(),
    1158             :             aInfo.GetPitch(),
    1159           0 :             aInfo.GetCharSet(),
    1160           0 :             SID_ATTR_CHAR_FONT ) );
    1161             : 
    1162           0 :         Any a;
    1163           0 :         pFontItem->QueryValue( a );
    1164           0 :         aArgs[0].Value  = a;
    1165             :     }
    1166           0 :     if ( !IsTravelSelect() )
    1167             :     {
    1168             :         //  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
    1169             :         //  This instance may be deleted in the meantime (i.e. when a dialog is opened
    1170             :         //  while in Dispatch()), accessing members will crash in this case.
    1171           0 :         ReleaseFocus_Impl();
    1172           0 :         EndPreview();
    1173           0 :         if ( pFontItem.get() )
    1174             :         {
    1175           0 :             aArgs[0].Name   = "CharFontName";
    1176             :             SfxToolBoxControl::Dispatch( m_xDispatchProvider,
    1177             :                                          OUString( ".uno:CharFontName" ),
    1178           0 :                                          aArgs );
    1179             :         }
    1180             :     }
    1181             :     else
    1182             :     {
    1183           0 :         if ( mbEndPreview )
    1184             :         {
    1185           0 :             EndPreview();
    1186           0 :             return;
    1187             :         }
    1188           0 :         if ( pFontItem.get() )
    1189             :         {
    1190           0 :             aArgs[0].Name   = "CharPreviewFontName";
    1191             :             SfxToolBoxControl::Dispatch( m_xDispatchProvider,
    1192             :                                          OUString( ".uno:CharPreviewFontName" ),
    1193           0 :                                          aArgs );
    1194             :         }
    1195           0 :     }
    1196             : }
    1197             : 
    1198             : #ifndef WB_NO_DIRECTSELECT
    1199             : #define WB_NO_DIRECTSELECT      ((WinBits)0x04000000)
    1200             : #endif
    1201             : 
    1202             : 
    1203           0 : SvxColorWindow_Impl::SvxColorWindow_Impl( const OUString&            rCommand,
    1204             :                                           PaletteManager&            rPaletteManager,
    1205             :                                           BorderColorStatus&         rBorderColorStatus,
    1206             :                                           sal_uInt16                 nSlotId,
    1207             :                                           const Reference< XFrame >& rFrame,
    1208             :                                           const OUString&            rWndTitle,
    1209             :                                           vcl::Window*                    pParentWindow ):
    1210             : 
    1211             :     SfxPopupWindow( nSlotId, pParentWindow,
    1212             :                     "palette_popup_window", "svx/ui/colorwindow.ui",
    1213             :                     rFrame ),
    1214             :     theSlotId( nSlotId ),
    1215             :     maCommand( rCommand ),
    1216             :     mrPaletteManager( rPaletteManager ),
    1217           0 :     mrBorderColorStatus( rBorderColorStatus )
    1218             : {
    1219           0 :     get(mpPaletteListBox,     "palette_listbox");
    1220           0 :     get(mpButtonAutoColor,    "auto_color_button");
    1221           0 :     get(mpButtonPicker,       "color_picker_button");
    1222           0 :     get(mpColorSet,           "colorset");
    1223           0 :     get(mpRecentColorSet,     "recent_colorset");
    1224           0 :     get(mpAutomaticSeparator, "separator4");
    1225             : 
    1226           0 :     mpColorSet->SetStyle( WinBits(WB_FLATVALUESET | WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT | WB_TABSTOP) );
    1227           0 :     mpRecentColorSet->SetStyle( WinBits(WB_FLATVALUESET | WB_ITEMBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT | WB_TABSTOP) );
    1228             : 
    1229           0 :     switch ( theSlotId )
    1230             :     {
    1231             :         case SID_ATTR_CHAR_COLOR_BACKGROUND:
    1232             :         case SID_BACKGROUND_COLOR:
    1233             :         case SID_ATTR_CHAR_BACK_COLOR:
    1234             :         {
    1235           0 :             mpButtonAutoColor->SetText( SVX_RESSTR( RID_SVXSTR_TRANSPARENT ) );
    1236           0 :             mpColorSet->SetAccessibleName( SVX_RESSTR( RID_SVXSTR_BACKGROUND ) );
    1237           0 :             break;
    1238             :         }
    1239             :         case SID_ATTR_CHAR_COLOR:
    1240             :         case SID_ATTR_CHAR_COLOR2:
    1241             :         case SID_EXTRUSION_3D_COLOR:
    1242             :         {
    1243             :             SfxPoolItem* pDummy;
    1244             : 
    1245           0 :             Reference< XDispatchProvider > aDisp( GetFrame()->getController(), UNO_QUERY );
    1246             :             SfxQueryStatus aQueryStatus( aDisp,
    1247             :                                          SID_ATTR_AUTO_COLOR_INVALID,
    1248           0 :                                          OUString( ".uno:AutoColorInvalid" ));
    1249           0 :             SfxItemState eState = aQueryStatus.QueryState( pDummy );
    1250           0 :             if( (SfxItemState::DEFAULT > eState) || ( SID_EXTRUSION_3D_COLOR == theSlotId ) )
    1251             :             {
    1252           0 :                 mpButtonAutoColor->SetText( SVX_RESSTR( RID_SVXSTR_AUTOMATIC ) );
    1253           0 :                 mpColorSet->SetAccessibleName( SVX_RESSTR( RID_SVXSTR_TEXTCOLOR ) );
    1254             :             }
    1255           0 :             break;
    1256             :         }
    1257             :         case SID_FRAME_LINECOLOR:
    1258             :         {
    1259           0 :             mpButtonAutoColor->Hide();
    1260           0 :             mpAutomaticSeparator->Hide();
    1261           0 :             mpColorSet->SetAccessibleName( SVX_RESSTR( RID_SVXSTR_FRAME_COLOR ) );
    1262           0 :             break;
    1263             :         }
    1264             :         case SID_ATTR_LINE_COLOR:
    1265             :         {
    1266           0 :             mpButtonAutoColor->Hide();
    1267           0 :             mpAutomaticSeparator->Hide();
    1268           0 :             mpColorSet->SetAccessibleName( SVX_RESSTR( RID_SVXSTR_LINECOLOR ) );
    1269           0 :             break;
    1270             :         }
    1271             :         case SID_ATTR_FILL_COLOR:
    1272             :         {
    1273           0 :             mpButtonAutoColor->Hide();
    1274           0 :             mpAutomaticSeparator->Hide();
    1275           0 :             mpColorSet->SetAccessibleName( SVX_RESSTR( RID_SVXSTR_FILLCOLOR ) );
    1276           0 :             break;
    1277             :         }
    1278             :     }
    1279             : 
    1280           0 :     mpPaletteListBox->SetStyle( mpPaletteListBox->GetStyle() | WB_BORDER | WB_AUTOSIZE );
    1281           0 :     mpPaletteListBox->SetSelectHdl( LINK( this, SvxColorWindow_Impl, SelectPaletteHdl ) );
    1282           0 :     mpPaletteListBox->AdaptDropDownLineCountToMaximum();
    1283           0 :     std::vector<OUString> aPaletteList = mrPaletteManager.GetPaletteList();
    1284           0 :     for( std::vector<OUString>::iterator it = aPaletteList.begin(); it != aPaletteList.end(); ++it )
    1285             :     {
    1286           0 :         mpPaletteListBox->InsertEntry( *it );
    1287             :     }
    1288           0 :     mpPaletteListBox->SelectEntryPos(mrPaletteManager.GetPalette(), true);
    1289             : 
    1290           0 :     mpButtonAutoColor->SetClickHdl( LINK( this, SvxColorWindow_Impl, AutoColorClickHdl ) );
    1291           0 :     mpButtonPicker->SetClickHdl( LINK( this, SvxColorWindow_Impl, OpenPickerClickHdl ) );
    1292             : 
    1293           0 :     mpColorSet->SetSelectHdl( LINK( this, SvxColorWindow_Impl, SelectHdl ) );
    1294           0 :     mpRecentColorSet->SetSelectHdl( LINK( this, SvxColorWindow_Impl, SelectHdl ) );
    1295           0 :     SetHelpId( HID_POPUP_COLOR );
    1296           0 :     mpColorSet->SetHelpId( HID_POPUP_COLOR_CTRL );
    1297           0 :     SetText( rWndTitle );
    1298             : 
    1299           0 :     mrPaletteManager.ReloadColorSet(*mpColorSet);
    1300           0 :     mpColorSet->layoutToGivenHeight(mpColorSet->GetSizePixel().Height(), mrPaletteManager.GetColorCount());
    1301             : 
    1302           0 :     mrPaletteManager.ReloadRecentColorSet(*mpRecentColorSet);
    1303           0 :     mpRecentColorSet->SetLineCount( 1 );
    1304           0 :     Size aSize = mpRecentColorSet->layoutAllVisible(mrPaletteManager.GetRecentColorCount());
    1305           0 :     mpRecentColorSet->set_height_request(aSize.Height());
    1306           0 :     mpRecentColorSet->set_width_request(aSize.Width());
    1307             : 
    1308           0 :     AddStatusListener( ".uno:ColorTableState" );
    1309           0 :     AddStatusListener( maCommand );
    1310           0 :     if ( maCommand == ".uno:FrameLineColor" )
    1311             :     {
    1312           0 :         AddStatusListener( ".uno:BorderTLBR" );
    1313           0 :         AddStatusListener( ".uno:BorderBLTR" );
    1314           0 :     }
    1315           0 : }
    1316             : 
    1317           0 : SvxColorWindow_Impl::~SvxColorWindow_Impl()
    1318             : {
    1319           0 :     disposeOnce();
    1320           0 : }
    1321             : 
    1322           0 : void SvxColorWindow_Impl::dispose()
    1323             : {
    1324           0 :     mpColorSet.clear();
    1325           0 :     mpRecentColorSet.clear();
    1326           0 :     mpPaletteListBox.clear();
    1327           0 :     mpButtonAutoColor.clear();
    1328           0 :     mpButtonPicker.clear();
    1329           0 :     mpAutomaticSeparator.clear();
    1330           0 :     SfxPopupWindow::dispose();
    1331           0 : }
    1332             : 
    1333           0 : void SvxColorWindow_Impl::KeyInput( const KeyEvent& rKEvt )
    1334             : {
    1335           0 :     mpColorSet->KeyInput(rKEvt);
    1336           0 : }
    1337             : 
    1338           0 : VclPtr<SfxPopupWindow> SvxColorWindow_Impl::Clone() const
    1339             : {
    1340           0 :     return VclPtr<SvxColorWindow_Impl>::Create( maCommand, mrPaletteManager, mrBorderColorStatus, theSlotId, GetFrame(), GetText(), GetParent() );
    1341             : }
    1342             : 
    1343           0 : IMPL_LINK(SvxColorWindow_Impl, SelectHdl, SvxColorValueSet*, pColorSet)
    1344             : {
    1345           0 :     Color aColor = pColorSet->GetItemColor( pColorSet->GetSelectItemId() );
    1346             :     /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() calls.
    1347             :         This instance may be deleted in the meantime (i.e. when a dialog is opened
    1348             :         while in Dispatch()), accessing members will crash in this case. */
    1349           0 :     pColorSet->SetNoSelection();
    1350             : 
    1351           0 :     if ( pColorSet != mpRecentColorSet )
    1352             :     {
    1353           0 :          mrPaletteManager.AddRecentColor( aColor );
    1354           0 :          if ( !IsInPopupMode() )
    1355           0 :             mrPaletteManager.ReloadRecentColorSet( *mpRecentColorSet );
    1356             :     }
    1357             : 
    1358           0 :     if ( IsInPopupMode() )
    1359           0 :         EndPopupMode();
    1360             : 
    1361           0 :     if ( maSelectedLink.IsSet() )
    1362           0 :         maSelectedLink.Call(&aColor);
    1363             : 
    1364           0 :     PaletteManager::DispatchColorCommand(maCommand, aColor);
    1365           0 :     return 0;
    1366             : }
    1367             : 
    1368           0 : IMPL_LINK_NOARG(SvxColorWindow_Impl, SelectPaletteHdl)
    1369             : {
    1370           0 :     sal_Int32 nPos = mpPaletteListBox->GetSelectEntryPos();
    1371           0 :     mrPaletteManager.SetPalette( nPos );
    1372           0 :     mrPaletteManager.ReloadColorSet(*mpColorSet);
    1373           0 :     mpColorSet->layoutToGivenHeight(mpColorSet->GetSizePixel().Height(), mrPaletteManager.GetColorCount());
    1374           0 :     return 0;
    1375             : }
    1376             : 
    1377           0 : IMPL_LINK_NOARG(SvxColorWindow_Impl, AutoColorClickHdl)
    1378             : {
    1379           0 :     Color aColor;
    1380           0 :     switch ( theSlotId )
    1381             :     {
    1382             :         case SID_ATTR_CHAR_COLOR_BACKGROUND:
    1383             :         case SID_BACKGROUND_COLOR:
    1384             :         case SID_ATTR_CHAR_BACK_COLOR:
    1385             :         {
    1386           0 :             aColor = COL_TRANSPARENT;
    1387           0 :             break;
    1388             :         }
    1389             :         case SID_ATTR_CHAR_COLOR:
    1390             :         case SID_ATTR_CHAR_COLOR2:
    1391             :         case SID_EXTRUSION_3D_COLOR:
    1392             :         {
    1393           0 :             aColor = COL_AUTO;
    1394           0 :             break;
    1395             :         }
    1396             :     }
    1397             : 
    1398           0 :     mpRecentColorSet->SetNoSelection();
    1399             : 
    1400           0 :     if ( IsInPopupMode() )
    1401           0 :         EndPopupMode();
    1402             : 
    1403           0 :     if ( maSelectedLink.IsSet() )
    1404           0 :         maSelectedLink.Call(&aColor);
    1405             : 
    1406           0 :     PaletteManager::DispatchColorCommand(maCommand, aColor);
    1407           0 :     return 0;
    1408             : }
    1409             : 
    1410           0 : IMPL_LINK_NOARG(SvxColorWindow_Impl, OpenPickerClickHdl)
    1411             : {
    1412           0 :     if ( IsInPopupMode() )
    1413           0 :         EndPopupMode();
    1414           0 :     mrPaletteManager.PopupColorPicker(maCommand);
    1415           0 :     return 0;
    1416             : }
    1417             : 
    1418           0 : void SvxColorWindow_Impl::Resize()
    1419             : {
    1420           0 : }
    1421             : 
    1422           0 : void SvxColorWindow_Impl::StartSelection()
    1423             : {
    1424           0 :     mpColorSet->StartSelection();
    1425           0 : }
    1426             : 
    1427           0 : bool SvxColorWindow_Impl::Close()
    1428             : {
    1429           0 :     return SfxPopupWindow::Close();
    1430             : }
    1431             : 
    1432           0 : void SvxColorWindow_Impl::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
    1433             : {
    1434           0 :     if ( nSID == SID_COLOR_TABLE )
    1435             :     {
    1436           0 :         if ( SfxItemState::DEFAULT == eState && mrPaletteManager.GetPalette() == 0 )
    1437             :         {
    1438           0 :             mrPaletteManager.ReloadColorSet(*mpColorSet);
    1439           0 :             mpColorSet->layoutToGivenHeight(mpColorSet->GetSizePixel().Height(), mrPaletteManager.GetColorCount());
    1440             :         }
    1441             :     }
    1442             :     else
    1443             :     {
    1444           0 :         mpColorSet->SetNoSelection();
    1445           0 :         Color aColor( COL_TRANSPARENT );
    1446             : 
    1447           0 :         if ( nSID == SID_FRAME_LINECOLOR
    1448           0 :           || nSID == SID_ATTR_BORDER_DIAG_TLBR
    1449           0 :           || nSID == SID_ATTR_BORDER_DIAG_BLTR )
    1450             :         {
    1451           0 :             mrBorderColorStatus.StateChanged( nSID, eState, pState );
    1452           0 :             aColor = mrBorderColorStatus.GetColor();
    1453             :         }
    1454           0 :         else if ( SfxItemState::DEFAULT <= eState && pState )
    1455             :         {
    1456           0 :             if ( pState->ISA( SvxColorItem ) )
    1457           0 :                 aColor = static_cast<const SvxColorItem*>(pState)->GetValue();
    1458           0 :             else if ( pState->ISA( XLineColorItem ) )
    1459           0 :                 aColor = static_cast<const XLineColorItem*>(pState)->GetColorValue();
    1460           0 :             else if ( pState->ISA( XFillColorItem ) )
    1461           0 :                 aColor = static_cast<const XFillColorItem*>(pState)->GetColorValue();
    1462           0 :             else if ( pState->ISA( SvxBackgroundColorItem ) )
    1463           0 :                 aColor = static_cast<const SvxBackgroundColorItem*>(pState)->GetValue();
    1464             :         }
    1465             : 
    1466           0 :         if ( aColor == COL_TRANSPARENT )
    1467           0 :             return;
    1468             : 
    1469           0 :         for ( size_t i = 1; i <= mpColorSet->GetItemCount(); ++i )
    1470             :         {
    1471           0 :             if ( aColor == mpColorSet->GetItemColor(i) )
    1472             :             {
    1473           0 :                 mpColorSet->SelectItem(i);
    1474           0 :                 break;
    1475             :             }
    1476             :         }
    1477             :     }
    1478             : }
    1479             : 
    1480             : 
    1481        3448 : BorderColorStatus::BorderColorStatus() :
    1482             :     maColor( COL_TRANSPARENT ),
    1483             :     maTLBRColor( COL_TRANSPARENT ),
    1484        3448 :     maBLTRColor( COL_TRANSPARENT )
    1485             : {
    1486        3448 : }
    1487             : 
    1488        3448 : BorderColorStatus::~BorderColorStatus()
    1489             : {
    1490        3448 : }
    1491             : 
    1492         723 : void BorderColorStatus::StateChanged( sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem *pState )
    1493             : {
    1494         723 :     if ( SfxItemState::DEFAULT <= eState && pState )
    1495             :     {
    1496         708 :         if ( nSID == SID_FRAME_LINECOLOR && pState->ISA( SvxColorItem ) )
    1497             :         {
    1498         236 :             maColor = static_cast< const SvxColorItem* >(pState)->GetValue();
    1499             :         }
    1500         472 :         else if ( pState->ISA( SvxLineItem ) )
    1501             :         {
    1502         472 :             const SvxBorderLine* pLine = static_cast< const SvxLineItem* >(pState)->GetLine();
    1503         472 :             Color aColor ( COL_TRANSPARENT );
    1504         472 :             if ( pLine )
    1505           0 :                 aColor = pLine->GetColor();
    1506             : 
    1507         472 :             if ( nSID == SID_ATTR_BORDER_DIAG_TLBR )
    1508         236 :                 maTLBRColor = aColor;
    1509         236 :             else if ( nSID == SID_ATTR_BORDER_DIAG_BLTR )
    1510         236 :                 maBLTRColor = aColor;
    1511         708 :         }
    1512             :     }
    1513          15 :     else if ( nSID == SID_FRAME_LINECOLOR )
    1514           5 :         maColor = COL_TRANSPARENT;
    1515          10 :     else if ( nSID == SID_ATTR_BORDER_DIAG_TLBR )
    1516           5 :         maTLBRColor = COL_TRANSPARENT;
    1517           5 :     else if ( nSID == SID_ATTR_BORDER_DIAG_BLTR )
    1518           5 :         maBLTRColor = COL_TRANSPARENT;
    1519         723 : }
    1520             : 
    1521         723 : Color BorderColorStatus::GetColor()
    1522             : {
    1523         723 :     bool bHasColor = maColor != COL_TRANSPARENT;
    1524         723 :     bool bHasTLBRColor = maTLBRColor != COL_TRANSPARENT;
    1525         723 :     bool bHasBLTRColor = maBLTRColor != COL_TRANSPARENT;
    1526             : 
    1527         723 :     if ( !bHasColor && bHasTLBRColor && !bHasBLTRColor )
    1528           0 :         return maTLBRColor;
    1529         723 :     else if ( !bHasColor && !bHasTLBRColor && bHasBLTRColor )
    1530           0 :         return maBLTRColor;
    1531         723 :     else if ( bHasColor && bHasTLBRColor && !bHasBLTRColor )
    1532             :     {
    1533           0 :         if ( maColor == maTLBRColor )
    1534           0 :             return maColor;
    1535             :         else
    1536           0 :             return maBLTRColor;
    1537             :     }
    1538         723 :     else if ( bHasColor && !bHasTLBRColor && bHasBLTRColor )
    1539             :     {
    1540           0 :         if ( maColor == maBLTRColor )
    1541           0 :             return maColor;
    1542             :         else
    1543           0 :             return maTLBRColor;
    1544             :     }
    1545         723 :     else if ( !bHasColor && bHasTLBRColor && bHasBLTRColor )
    1546             :     {
    1547           0 :         if ( maTLBRColor == maBLTRColor )
    1548           0 :             return maTLBRColor;
    1549             :         else
    1550           0 :             return maColor;
    1551             :     }
    1552         723 :     else if ( bHasColor && bHasTLBRColor && bHasBLTRColor )
    1553             :     {
    1554           0 :         if ( maColor == maTLBRColor && maColor == maBLTRColor )
    1555           0 :             return maColor;
    1556             :         else
    1557           0 :             return COL_TRANSPARENT;
    1558             :     }
    1559         723 :     return maColor;
    1560             : }
    1561             : 
    1562             : 
    1563           0 : SvxFrameWindow_Impl::SvxFrameWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow ) :
    1564             :     SfxPopupWindow( nId, rFrame, pParentWindow, WinBits( WB_STDPOPUP | WB_OWNERDRAWDECORATION ) ),
    1565             :     aFrameSet   ( VclPtr<SvxFrmValueSet_Impl>::Create(this, WinBits( WB_ITEMBORDER | WB_DOUBLEBORDER | WB_3DLOOK | WB_NO_DIRECTSELECT )) ),
    1566           0 :     bParagraphMode(false)
    1567             : {
    1568           0 :     BindListener();
    1569           0 :     AddStatusListener(OUString(".uno:BorderReducedMode"));
    1570           0 :     aImgList = ImageList( SVX_RES( RID_SVXIL_FRAME ) );
    1571             : 
    1572           0 :     if( pParentWindow->GetDPIScaleFactor() > 1 )
    1573             :     {
    1574           0 :         for (short i = 0; i < aImgList.GetImageCount(); i++)
    1575             :         {
    1576           0 :             OUString rImageName = aImgList.GetImageName(i);
    1577           0 :             BitmapEx b = aImgList.GetImage(rImageName).GetBitmapEx();
    1578           0 :             b.Scale(pParentWindow->GetDPIScaleFactor(), pParentWindow->GetDPIScaleFactor());
    1579           0 :             aImgList.ReplaceImage(rImageName, Image(b));
    1580           0 :         }
    1581             :     }
    1582             : 
    1583             :     /*
    1584             :      *  1       2        3         4
    1585             :      *  -------------------------------------
    1586             :      *  NONE    LEFT     RIGHT     LEFTRIGHT
    1587             :      *  TOP     BOTTOM   TOPBOTTOM OUTER
    1588             :      *  -------------------------------------
    1589             :      *  HOR     HORINNER VERINNER   ALL         <- can be switched of via bParagraphMode
    1590             :      */
    1591             : 
    1592           0 :     sal_uInt16 i = 0;
    1593             : 
    1594           0 :     for ( i=1; i<9; i++ )
    1595           0 :         aFrameSet->InsertItem( i, aImgList.GetImage(i) );
    1596             : 
    1597             :     //bParagraphMode should have been set in StateChanged
    1598           0 :     if ( !bParagraphMode )
    1599           0 :         for ( i = 9; i < 13; i++ )
    1600           0 :             aFrameSet->InsertItem( i, aImgList.GetImage(i) );
    1601             : 
    1602           0 :     aFrameSet->SetColCount( 4 );
    1603           0 :     aFrameSet->SetSelectHdl( LINK( this, SvxFrameWindow_Impl, SelectHdl ) );
    1604             : 
    1605           0 :     lcl_CalcSizeValueSet( *this, *aFrameSet.get(), Size( 20 * pParentWindow->GetDPIScaleFactor(), 20 * pParentWindow->GetDPIScaleFactor() ));
    1606             : 
    1607           0 :     SetHelpId( HID_POPUP_FRAME );
    1608           0 :     SetText( SVX_RESSTR(RID_SVXSTR_FRAME) );
    1609           0 :     aFrameSet->SetAccessibleName( SVX_RESSTR(RID_SVXSTR_FRAME) );
    1610           0 :     aFrameSet->Show();
    1611           0 : }
    1612             : 
    1613           0 : SvxFrameWindow_Impl::~SvxFrameWindow_Impl()
    1614             : {
    1615           0 :     disposeOnce();
    1616           0 : }
    1617             : 
    1618           0 : void SvxFrameWindow_Impl::dispose()
    1619             : {
    1620           0 :     UnbindListener();
    1621           0 :     aFrameSet.disposeAndClear();
    1622           0 :     SfxPopupWindow::dispose();
    1623           0 : }
    1624             : 
    1625           0 : VclPtr<SfxPopupWindow> SvxFrameWindow_Impl::Clone() const
    1626             : {
    1627             :     //! HACK: How do I get the Paragraph mode?
    1628           0 :     return VclPtr<SvxFrameWindow_Impl>::Create( GetId(), GetFrame(), GetParent() );
    1629             : }
    1630             : 
    1631           0 : vcl::Window* SvxFrameWindow_Impl::GetPreferredKeyInputWindow()
    1632             : {
    1633           0 :     return aFrameSet.get();
    1634             : }
    1635             : 
    1636           0 : void SvxFrameWindow_Impl::GetFocus()
    1637             : {
    1638           0 :     aFrameSet->GrabFocus();
    1639           0 : }
    1640             : 
    1641           0 : void SvxFrameWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
    1642             : {
    1643           0 :     SfxPopupWindow::DataChanged( rDCEvt );
    1644             : 
    1645           0 :     if( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
    1646             :     {
    1647           0 :         aImgList = ImageList( SVX_RES( RID_SVXIL_FRAME ) );
    1648             : 
    1649           0 :         sal_uInt16  nNumOfItems = aFrameSet->GetItemCount();
    1650             : 
    1651           0 :         for( sal_uInt16 i = 1 ; i <= nNumOfItems ; ++i )
    1652           0 :             aFrameSet->SetItemImage( i, aImgList.GetImage( i ) );
    1653             :     }
    1654           0 : }
    1655             : 
    1656             : #define FRM_VALID_LEFT      0x01
    1657             : #define FRM_VALID_RIGHT     0x02
    1658             : #define FRM_VALID_TOP       0x04
    1659             : #define FRM_VALID_BOTTOM    0x08
    1660             : #define FRM_VALID_HINNER    0x10
    1661             : #define FRM_VALID_VINNER    0x20
    1662             : #define FRM_VALID_OUTER     0x0f
    1663             : #define FRM_VALID_ALL       0xff
    1664             : 
    1665             : // By default unset lines remain unchanged.
    1666             : // Via Shift unset lines are reset
    1667             : 
    1668           0 : IMPL_LINK_NOARG(SvxFrameWindow_Impl, SelectHdl)
    1669             : {
    1670           0 :     SvxBoxItem          aBorderOuter( SID_ATTR_BORDER_OUTER );
    1671           0 :     SvxBoxInfoItem      aBorderInner( SID_ATTR_BORDER_INNER );
    1672           0 :     SvxBorderLine       theDefLine;
    1673           0 :     SvxBorderLine       *pLeft = 0,
    1674           0 :                         *pRight = 0,
    1675           0 :                         *pTop = 0,
    1676           0 :                         *pBottom = 0;
    1677           0 :     sal_uInt16              nSel = aFrameSet->GetSelectItemId();
    1678           0 :     sal_uInt16              nModifier = aFrameSet->GetModifier();
    1679           0 :     sal_uInt8               nValidFlags = 0;
    1680             : 
    1681           0 :     theDefLine.GuessLinesWidths(theDefLine.GetBorderLineStyle(),
    1682           0 :             DEF_LINE_WIDTH_0);
    1683           0 :     switch ( nSel )
    1684             :     {
    1685           0 :         case 1: nValidFlags |= FRM_VALID_ALL;
    1686           0 :         break;  // NONE
    1687           0 :         case 2: pLeft = &theDefLine;
    1688           0 :                 nValidFlags |= FRM_VALID_LEFT;
    1689           0 :         break;  // LEFT
    1690           0 :         case 3: pRight = &theDefLine;
    1691           0 :                 nValidFlags |= FRM_VALID_RIGHT;
    1692           0 :         break;  // RIGHT
    1693           0 :         case 4: pLeft = pRight = &theDefLine;
    1694           0 :                 nValidFlags |=  FRM_VALID_RIGHT|FRM_VALID_LEFT;
    1695           0 :         break;  // LEFTRIGHT
    1696           0 :         case 5: pTop = &theDefLine;
    1697           0 :                 nValidFlags |= FRM_VALID_TOP;
    1698           0 :         break;  // TOP
    1699           0 :         case 6: pBottom = &theDefLine;
    1700           0 :                 nValidFlags |= FRM_VALID_BOTTOM;
    1701           0 :         break;  // BOTTOM
    1702           0 :         case 7: pTop =  pBottom = &theDefLine;
    1703           0 :                 nValidFlags |= FRM_VALID_BOTTOM|FRM_VALID_TOP;
    1704           0 :         break;  // TOPBOTTOM
    1705           0 :         case 8: pLeft = pRight = pTop = pBottom = &theDefLine;
    1706           0 :                 nValidFlags |= FRM_VALID_OUTER;
    1707           0 :         break;  // OUTER
    1708             : 
    1709             :         // Inner Table:
    1710             :         case 9: // HOR
    1711           0 :             pTop = pBottom = &theDefLine;
    1712           0 :             aBorderInner.SetLine( &theDefLine, SvxBoxInfoItemLine::HORI );
    1713           0 :             aBorderInner.SetLine( NULL, SvxBoxInfoItemLine::VERT );
    1714           0 :             nValidFlags |= FRM_VALID_HINNER|FRM_VALID_TOP|FRM_VALID_BOTTOM;
    1715           0 :             break;
    1716             : 
    1717             :         case 10: // HORINNER
    1718           0 :             pLeft = pRight = pTop = pBottom = &theDefLine;
    1719           0 :             aBorderInner.SetLine( &theDefLine, SvxBoxInfoItemLine::HORI );
    1720           0 :             aBorderInner.SetLine( NULL, SvxBoxInfoItemLine::VERT );
    1721           0 :             nValidFlags |= FRM_VALID_RIGHT|FRM_VALID_LEFT|FRM_VALID_HINNER|FRM_VALID_TOP|FRM_VALID_BOTTOM;
    1722           0 :             break;
    1723             : 
    1724             :         case 11: // VERINNER
    1725           0 :             pLeft = pRight = pTop = pBottom = &theDefLine;
    1726           0 :             aBorderInner.SetLine( NULL, SvxBoxInfoItemLine::HORI );
    1727           0 :             aBorderInner.SetLine( &theDefLine, SvxBoxInfoItemLine::VERT );
    1728           0 :             nValidFlags |= FRM_VALID_RIGHT|FRM_VALID_LEFT|FRM_VALID_VINNER|FRM_VALID_TOP|FRM_VALID_BOTTOM;
    1729           0 :         break;
    1730             : 
    1731             :         case 12: // ALL
    1732           0 :             pLeft = pRight = pTop = pBottom = &theDefLine;
    1733           0 :             aBorderInner.SetLine( &theDefLine, SvxBoxInfoItemLine::HORI );
    1734           0 :             aBorderInner.SetLine( &theDefLine, SvxBoxInfoItemLine::VERT );
    1735           0 :             nValidFlags |= FRM_VALID_ALL;
    1736           0 :             break;
    1737             : 
    1738             :         default:
    1739           0 :         break;
    1740             :     }
    1741           0 :     aBorderOuter.SetLine( pLeft, SvxBoxItemLine::LEFT );
    1742           0 :     aBorderOuter.SetLine( pRight, SvxBoxItemLine::RIGHT );
    1743           0 :     aBorderOuter.SetLine( pTop, SvxBoxItemLine::TOP );
    1744           0 :     aBorderOuter.SetLine( pBottom, SvxBoxItemLine::BOTTOM );
    1745             : 
    1746           0 :     if(nModifier == KEY_SHIFT)
    1747           0 :         nValidFlags |= FRM_VALID_ALL;
    1748           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::TOP,       0 != (nValidFlags&FRM_VALID_TOP ));
    1749           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::BOTTOM,    0 != (nValidFlags&FRM_VALID_BOTTOM ));
    1750           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::LEFT,      0 != (nValidFlags&FRM_VALID_LEFT));
    1751           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::RIGHT,     0 != (nValidFlags&FRM_VALID_RIGHT ));
    1752           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::HORI,      0 != (nValidFlags&FRM_VALID_HINNER ));
    1753           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::VERT,      0 != (nValidFlags&FRM_VALID_VINNER));
    1754           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::DISTANCE,  true );
    1755           0 :     aBorderInner.SetValid( SvxBoxInfoItemValidFlags::DISABLE,   false );
    1756             : 
    1757           0 :     if ( IsInPopupMode() )
    1758           0 :         EndPopupMode();
    1759             : 
    1760           0 :     Any a;
    1761           0 :     Sequence< PropertyValue > aArgs( 2 );
    1762           0 :     aArgs[0].Name = "OuterBorder";
    1763           0 :     aBorderOuter.QueryValue( a );
    1764           0 :     aArgs[0].Value = a;
    1765           0 :     aArgs[1].Name = "InnerBorder";
    1766           0 :     aBorderInner.QueryValue( a );
    1767           0 :     aArgs[1].Value = a;
    1768             : 
    1769             :     /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call.
    1770             :         This instance may be deleted in the meantime (i.e. when a dialog is opened
    1771             :         while in Dispatch()), accessing members will crash in this case. */
    1772           0 :     aFrameSet->SetNoSelection();
    1773             : 
    1774           0 :     SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
    1775             :                                  OUString( ".uno:SetBorderStyle" ),
    1776           0 :                                  aArgs );
    1777           0 :     return 0;
    1778             : }
    1779             : 
    1780           0 : void SvxFrameWindow_Impl::Resize()
    1781             : {
    1782           0 :     const Size aSize(this->GetOutputSizePixel());
    1783           0 :     aFrameSet->SetPosSizePixel(Point(2,2), Size(aSize.Width() - 4, aSize.Height() - 4));
    1784           0 : }
    1785             : 
    1786           0 : void SvxFrameWindow_Impl::StateChanged(
    1787             :     sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
    1788             : {
    1789           0 :     if ( pState && nSID == SID_BORDER_REDUCED_MODE)
    1790             :     {
    1791           0 :         const SfxBoolItem* pItem = PTR_CAST( SfxBoolItem, pState );
    1792             : 
    1793           0 :         if ( pItem )
    1794             :         {
    1795           0 :             bParagraphMode = pItem->GetValue();
    1796             :             //initial calls mustn't insert or remove elements
    1797           0 :             if(aFrameSet->GetItemCount())
    1798             :             {
    1799           0 :                 bool bTableMode = ( aFrameSet->GetItemCount() == 12 );
    1800           0 :                 bool bResize    = false;
    1801             : 
    1802           0 :                 if ( bTableMode && bParagraphMode )
    1803             :                 {
    1804           0 :                     for ( sal_uInt16 i = 9; i < 13; i++ )
    1805           0 :                         aFrameSet->RemoveItem(i);
    1806           0 :                     bResize = true;
    1807             :                 }
    1808           0 :                 else if ( !bTableMode && !bParagraphMode )
    1809             :                 {
    1810           0 :                     for ( sal_uInt16 i = 9; i < 13; i++ )
    1811           0 :                         aFrameSet->InsertItem( i, aImgList.GetImage(i) );
    1812           0 :                     bResize = true;
    1813             :                 }
    1814             : 
    1815           0 :                 if ( bResize )
    1816             :                 {
    1817           0 :                     lcl_CalcSizeValueSet( *this, *aFrameSet.get(), Size( 20, 20 ));
    1818             :                 }
    1819             :             }
    1820             :         }
    1821             :     }
    1822           0 :     SfxPopupWindow::StateChanged( nSID, eState, pState );
    1823           0 : }
    1824             : 
    1825           0 : void SvxFrameWindow_Impl::StartSelection()
    1826             : {
    1827           0 :     aFrameSet->StartSelection();
    1828           0 : }
    1829             : 
    1830           0 : bool SvxFrameWindow_Impl::Close()
    1831             : {
    1832           0 :     return SfxPopupWindow::Close();
    1833             : }
    1834             : 
    1835           0 : static Color lcl_mediumColor( Color aMain, Color /*aDefault*/ )
    1836             : {
    1837           0 :     return SvxBorderLine::threeDMediumColor( aMain );
    1838             : }
    1839             : 
    1840           0 : SvxLineWindow_Impl::SvxLineWindow_Impl( sal_uInt16 nId, const Reference< XFrame >& rFrame, vcl::Window* pParentWindow ) :
    1841             : 
    1842             :     SfxPopupWindow( nId, rFrame, pParentWindow, WinBits( WB_STDPOPUP | WB_OWNERDRAWDECORATION | WB_AUTOSIZE ) ),
    1843           0 :     m_aLineStyleLb( VclPtr<LineListBox>::Create(this) )
    1844             : {
    1845             :     try
    1846             :     {
    1847           0 :         Reference< lang::XServiceInfo > xServices( rFrame->getController()->getModel(), UNO_QUERY_THROW );
    1848           0 :         m_bIsWriter = xServices->supportsService("com.sun.star.text.TextDocument");
    1849             :     }
    1850           0 :     catch(const uno::Exception& )
    1851             :     {
    1852             :     }
    1853             : 
    1854           0 :     m_aLineStyleLb->setPosSizePixel( 2, 2, 110, 140 );
    1855           0 :     SetOutputSizePixel( Size( 114, 144 ) );
    1856             : 
    1857           0 :     m_aLineStyleLb->SetSourceUnit( FUNIT_TWIP );
    1858           0 :     m_aLineStyleLb->SetNone( SVX_RESSTR(RID_SVXSTR_NONE) );
    1859             : 
    1860             :     using namespace table::BorderLineStyle;
    1861           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( SOLID ), SOLID );
    1862           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( DOTTED ), DOTTED );
    1863           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( DASHED ), DASHED );
    1864             : 
    1865             :     // Double lines
    1866           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( DOUBLE ), DOUBLE );
    1867           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( THINTHICK_SMALLGAP ), THINTHICK_SMALLGAP, 20 );
    1868           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( THINTHICK_MEDIUMGAP ), THINTHICK_MEDIUMGAP );
    1869           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( THINTHICK_LARGEGAP ), THINTHICK_LARGEGAP );
    1870           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( THICKTHIN_SMALLGAP ), THICKTHIN_SMALLGAP, 20 );
    1871           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( THICKTHIN_MEDIUMGAP ), THICKTHIN_MEDIUMGAP );
    1872           0 :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( THICKTHIN_LARGEGAP ), THICKTHIN_LARGEGAP );
    1873             : 
    1874             :     // Engraved / Embossed
    1875             :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( EMBOSSED ), EMBOSSED, 15,
    1876             :             &SvxBorderLine::threeDLightColor, &SvxBorderLine::threeDDarkColor,
    1877           0 :             &lcl_mediumColor );
    1878             :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( ENGRAVED ), ENGRAVED, 15,
    1879             :             &SvxBorderLine::threeDDarkColor, &SvxBorderLine::threeDLightColor,
    1880           0 :             &lcl_mediumColor );
    1881             : 
    1882             :     // Inset / Outset
    1883             :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( OUTSET ), OUTSET, 10,
    1884           0 :            &SvxBorderLine::lightColor, &SvxBorderLine::darkColor );
    1885             :     m_aLineStyleLb->InsertEntry( SvxBorderLine::getWidthImpl( INSET ), INSET, 10,
    1886           0 :            &SvxBorderLine::darkColor, &SvxBorderLine::lightColor );
    1887           0 :     m_aLineStyleLb->SetWidth( 20 ); // 1pt by default
    1888             : 
    1889           0 :     m_aLineStyleLb->SetSelectHdl( LINK( this, SvxLineWindow_Impl, SelectHdl ) );
    1890             : 
    1891           0 :     SetHelpId( HID_POPUP_LINE );
    1892           0 :     SetText( SVX_RESSTR(RID_SVXSTR_FRAME_STYLE) );
    1893           0 :     m_aLineStyleLb->Show();
    1894           0 : }
    1895             : 
    1896           0 : VclPtr<SfxPopupWindow> SvxLineWindow_Impl::Clone() const
    1897             : {
    1898           0 :     return VclPtr<SvxLineWindow_Impl>::Create( GetId(), GetFrame(), GetParent() );
    1899             : }
    1900             : 
    1901           0 : IMPL_LINK_NOARG(SvxLineWindow_Impl, SelectHdl)
    1902             : {
    1903           0 :     SvxLineItem     aLineItem( SID_FRAME_LINESTYLE );
    1904           0 :     SvxBorderStyle  nStyle = SvxBorderStyle( m_aLineStyleLb->GetSelectEntryStyle() );
    1905             : 
    1906           0 :     if ( m_aLineStyleLb->GetSelectEntryPos( ) > 0 )
    1907             :     {
    1908           0 :         SvxBorderLine aTmp;
    1909           0 :         aTmp.SetBorderLineStyle( nStyle );
    1910           0 :         aTmp.SetWidth( 20 ); // TODO Make it depend on a width field
    1911           0 :         aLineItem.SetLine( &aTmp );
    1912             :     }
    1913             :     else
    1914           0 :         aLineItem.SetLine( NULL );
    1915             : 
    1916           0 :     if ( IsInPopupMode() )
    1917           0 :         EndPopupMode();
    1918             : 
    1919           0 :     Any a;
    1920           0 :     Sequence< PropertyValue > aArgs( 1 );
    1921           0 :     aArgs[0].Name = "LineStyle";
    1922           0 :     aLineItem.QueryValue( a, m_bIsWriter ? CONVERT_TWIPS : 0 );
    1923           0 :     aArgs[0].Value = a;
    1924             : 
    1925           0 :     SfxToolBoxControl::Dispatch( Reference< XDispatchProvider >( GetFrame()->getController(), UNO_QUERY ),
    1926             :                                  OUString( ".uno:LineStyle" ),
    1927           0 :                                  aArgs );
    1928           0 :     return 0;
    1929             : }
    1930             : 
    1931           0 : void SvxLineWindow_Impl::Resize()
    1932             : {
    1933           0 :     m_aLineStyleLb->Resize();
    1934           0 : }
    1935             : 
    1936           0 : bool SvxLineWindow_Impl::Close()
    1937             : {
    1938           0 :     return SfxPopupWindow::Close();
    1939             : }
    1940             : 
    1941           0 : vcl::Window* SvxLineWindow_Impl::GetPreferredKeyInputWindow()
    1942             : {
    1943           0 :     return m_aLineStyleLb.get();
    1944             : }
    1945             : 
    1946           0 : void SvxLineWindow_Impl::GetFocus()
    1947             : {
    1948           0 :     m_aLineStyleLb->GrabFocus();
    1949           0 : }
    1950             : 
    1951           0 : void SvxLineWindow_Impl::DataChanged( const DataChangedEvent& rDCEvt )
    1952             : {
    1953           0 :     SfxPopupWindow::DataChanged( rDCEvt );
    1954             : #if 0
    1955             :     if( ( rDCEvt.GetType() == DataChangedEventType::SETTINGS ) && ( rDCEvt.GetFlags() & AllSettingsFlags::STYLE ) )
    1956             :     {
    1957             :         CreateBitmaps();
    1958             :         Invalidate();
    1959             :     }
    1960             : #endif
    1961           0 : }
    1962             : 
    1963        2485 : SfxStyleControllerItem_Impl::SfxStyleControllerItem_Impl(
    1964             :     const Reference< XDispatchProvider >& rDispatchProvider,
    1965             :     sal_uInt16                                nSlotId,      // Family-ID
    1966             :     const OUString&                  rCommand,     // .uno: command bound to this item
    1967             :     SvxStyleToolBoxControl&               rTbxCtl )     // controller instance, which the item is assigned to.
    1968             :     :   SfxStatusListener( rDispatchProvider, nSlotId, rCommand ),
    1969        2485 :         rControl( rTbxCtl )
    1970             : {
    1971        2485 : }
    1972             : 
    1973        3763 : void SfxStyleControllerItem_Impl::StateChanged(
    1974             :     sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
    1975             : {
    1976        3763 :     switch ( GetId() )
    1977             :     {
    1978             :         case SID_STYLE_FAMILY1:
    1979             :         case SID_STYLE_FAMILY2:
    1980             :         case SID_STYLE_FAMILY3:
    1981             :         case SID_STYLE_FAMILY4:
    1982             :         case SID_STYLE_FAMILY5:
    1983             :         {
    1984        3763 :             const sal_uInt16 nIdx = GetId() - SID_STYLE_FAMILY_START;
    1985             : 
    1986        3763 :             if ( SfxItemState::DEFAULT == eState )
    1987             :             {
    1988             :                 const SfxTemplateItem* pStateItem =
    1989        2820 :                     PTR_CAST( SfxTemplateItem, pState );
    1990             :                 DBG_ASSERT( pStateItem != NULL, "SfxTemplateItem expected" );
    1991        2820 :                 rControl.SetFamilyState( nIdx, pStateItem );
    1992             :             }
    1993             :             else
    1994         943 :                 rControl.SetFamilyState( nIdx, NULL );
    1995        3763 :             break;
    1996             :         }
    1997             :     }
    1998        3763 : }
    1999             : 
    2000         497 : struct SvxStyleToolBoxControl::Impl
    2001             : {
    2002             :     OUString                     aClearForm;
    2003             :     OUString                     aMore;
    2004             :     ::std::vector< OUString >    aDefaultStyles;
    2005             :     bool                     bSpecModeWriter;
    2006             :     bool                     bSpecModeCalc;
    2007             : 
    2008         497 :     inline Impl()
    2009         497 :         :aClearForm         ( SVX_RESSTR( RID_SVXSTR_CLEARFORM ) )
    2010         497 :         ,aMore              ( SVX_RESSTR( RID_SVXSTR_MORE_STYLES ) )
    2011             :         ,bSpecModeWriter    ( false )
    2012         994 :         ,bSpecModeCalc      ( false )
    2013             :     {
    2014             : 
    2015             : 
    2016         497 :     }
    2017         497 :     void InitializeStyles(Reference < frame::XModel > xModel)
    2018             :     {
    2019             :         //now convert the default style names to the localized names
    2020             :         try
    2021             :         {
    2022         497 :             Reference< style::XStyleFamiliesSupplier > xStylesSupplier( xModel, UNO_QUERY_THROW );
    2023         994 :             Reference< lang::XServiceInfo > xServices( xModel, UNO_QUERY_THROW );
    2024         497 :             bSpecModeWriter = xServices->supportsService("com.sun.star.text.TextDocument");
    2025         497 :             if(bSpecModeWriter)
    2026             :             {
    2027         341 :                 Reference<container::XNameAccess> xParaStyles;
    2028         682 :                     xStylesSupplier->getStyleFamilies()->getByName("ParagraphStyles") >>=
    2029         341 :                     xParaStyles;
    2030             :                 static const sal_Char* aWriterStyles[] =
    2031             :                 {
    2032             :                     "Text body",
    2033             :                     "Quotations",
    2034             :                     "Title",
    2035             :                     "Subtitle",
    2036             :                     "Heading 1",
    2037             :                     "Heading 2",
    2038             :                     "Heading 3"
    2039             :                 };
    2040        2728 :                 for( sal_uInt32 nStyle = 0; nStyle < sizeof( aWriterStyles ) / sizeof( sal_Char*); ++nStyle )
    2041             :                 {
    2042             :                     try
    2043             :                     {
    2044        2387 :                         Reference< beans::XPropertySet > xStyle;
    2045        2387 :                         xParaStyles->getByName( OUString::createFromAscii( aWriterStyles[nStyle] )) >>= xStyle;
    2046        4774 :                         OUString sName;
    2047        2387 :                         xStyle->getPropertyValue("DisplayName") >>= sName;
    2048        2387 :                         if( !sName.isEmpty() )
    2049        4774 :                             aDefaultStyles.push_back(sName);
    2050             :                     }
    2051           0 :                     catch( const uno::Exception& )
    2052             :                     {}
    2053         341 :                 }
    2054             : 
    2055             :             }
    2056         312 :             else if( (
    2057         156 :                 bSpecModeCalc = xServices->supportsService(OUString(
    2058         312 :                     "com.sun.star.sheet.SpreadsheetDocument"))))
    2059             :             {
    2060             :                 static const sal_Char* aCalcStyles[] =
    2061             :                 {
    2062             :                     "Default",
    2063             :                     "Heading1",
    2064             :                     "Result",
    2065             :                     "Result2"
    2066             :                 };
    2067         154 :                 Reference<container::XNameAccess> xCellStyles;
    2068         308 :                     xStylesSupplier->getStyleFamilies()->getByName(
    2069         308 :                         OUString("CellStyles")) >>=
    2070         154 :                         xCellStyles;
    2071         770 :                 for( sal_uInt32 nStyle = 0; nStyle < sizeof( aCalcStyles ) / sizeof( sal_Char*); ++nStyle )
    2072             :                 {
    2073             :                     try
    2074             :                     {
    2075         616 :                         const OUString sStyleName( OUString::createFromAscii( aCalcStyles[nStyle] ) );
    2076         616 :                         if( xCellStyles->hasByName( sStyleName ) )
    2077             :                         {
    2078         616 :                             Reference< beans::XPropertySet > xStyle( xCellStyles->getByName( sStyleName), UNO_QUERY_THROW );
    2079        1232 :                             OUString sName;
    2080         616 :                             xStyle->getPropertyValue("DisplayName") >>= sName;
    2081         616 :                             if( !sName.isEmpty() )
    2082        1232 :                                 aDefaultStyles.push_back(sName);
    2083         616 :                         }
    2084             :                     }
    2085           0 :                     catch( const uno::Exception& )
    2086             :                     {}
    2087         154 :                 }
    2088         497 :             }
    2089             :         }
    2090           0 :         catch(const uno::Exception& )
    2091             :         {
    2092             :             OSL_FAIL("error while initializing style names");
    2093             :         }
    2094         497 :     }
    2095             : };
    2096             : 
    2097             : // mapping table from bound items. BE CAREFUL this table must be in the
    2098             : // same order as the uno commands bound to the slots SID_STYLE_FAMILY1..n
    2099             : // MAX_FAMILIES must also be correctly set!
    2100             : static const char* StyleSlotToStyleCommand[MAX_FAMILIES] =
    2101             : {
    2102             :     ".uno:CharStyle",
    2103             :     ".uno:ParaStyle",
    2104             :     ".uno:FrameStyle",
    2105             :     ".uno:PageStyle",
    2106             :     ".uno:TemplateFamily5"
    2107             : };
    2108             : 
    2109         497 : SvxStyleToolBoxControl::SvxStyleToolBoxControl(
    2110             :     sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx )
    2111             :     :   SfxToolBoxControl   ( nSlotId, nId, rTbx ),
    2112         497 :         pImpl               ( new Impl ),
    2113             :         pStyleSheetPool     ( NULL ),
    2114         994 :         nActFamily          ( 0xffff )
    2115             : {
    2116        2982 :     for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
    2117             :     {
    2118        2485 :         pBoundItems[i] = 0;
    2119        2485 :         m_xBoundItems[i].clear();
    2120        2485 :         pFamilyState[i]  = NULL;
    2121             :     }
    2122         497 : }
    2123             : 
    2124         994 : SvxStyleToolBoxControl::~SvxStyleToolBoxControl()
    2125             : {
    2126         994 : }
    2127             : 
    2128         497 : void SAL_CALL SvxStyleToolBoxControl::initialize( const Sequence< Any >& aArguments )
    2129             : throw ( Exception, RuntimeException, std::exception)
    2130             : {
    2131         497 :     SfxToolBoxControl::initialize( aArguments );
    2132             : 
    2133             :     // After initialize we should have a valid frame member where we can retrieve our
    2134             :     // dispatch provider.
    2135         497 :     if ( m_xFrame.is() )
    2136             :     {
    2137         497 :         pImpl->InitializeStyles(m_xFrame->getController()->getModel());
    2138         497 :         Reference< XDispatchProvider > xDispatchProvider( m_xFrame->getController(), UNO_QUERY );
    2139        2982 :         for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
    2140             :         {
    2141        2485 :             pBoundItems[i]   = new SfxStyleControllerItem_Impl( xDispatchProvider,
    2142             :                                                                 SID_STYLE_FAMILY_START + i,
    2143             :                                                                 OUString::createFromAscii( StyleSlotToStyleCommand[i] ),
    2144        4970 :                                                                 *this );
    2145        2485 :             m_xBoundItems[i] = Reference< XComponent >( static_cast< OWeakObject* >( pBoundItems[i] ), UNO_QUERY );
    2146        2485 :             pFamilyState[i]  = NULL;
    2147         497 :         }
    2148             :     }
    2149         497 : }
    2150             : 
    2151             : // XComponent
    2152         497 : void SAL_CALL SvxStyleToolBoxControl::dispose()
    2153             :     throw (css::uno::RuntimeException, std::exception)
    2154             : {
    2155         497 :     SfxToolBoxControl::dispose();
    2156             : 
    2157        2982 :     for( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
    2158             :     {
    2159        2485 :         if ( m_xBoundItems[i].is() )
    2160             :         {
    2161             :             try
    2162             :             {
    2163        2485 :                 m_xBoundItems[i]->dispose();
    2164             :             }
    2165           0 :             catch ( Exception& )
    2166             :             {
    2167             :             }
    2168             : 
    2169        2485 :             m_xBoundItems[i].clear();
    2170        2485 :             pBoundItems[i] = 0;
    2171             :         }
    2172        2485 :         delete pFamilyState[i];
    2173        2485 :         pFamilyState[i] = NULL;
    2174             :     }
    2175         497 :     pStyleSheetPool = NULL;
    2176         497 :     pImpl.reset();
    2177         497 : }
    2178             : 
    2179         492 : void SAL_CALL SvxStyleToolBoxControl::update() throw (RuntimeException, std::exception)
    2180             : {
    2181             :     // Do nothing, we will start binding our listener when we are visible.
    2182             :     // See link SvxStyleToolBoxControl::VisibilityNotification.
    2183         492 :     SvxStyleBox_Impl* pBox = static_cast<SvxStyleBox_Impl*>(GetToolBox().GetItemWindow( GetId() ));
    2184         492 :     if ( pBox->IsVisible() )
    2185             :     {
    2186        2028 :         for ( int i=0; i<MAX_FAMILIES; i++ )
    2187        1690 :             pBoundItems [i]->ReBind();
    2188             : 
    2189         338 :         bindListener();
    2190             :     }
    2191         492 : }
    2192             : 
    2193        4703 : SfxStyleFamily SvxStyleToolBoxControl::GetActFamily()
    2194             : {
    2195        4703 :     switch ( nActFamily-1 + SID_STYLE_FAMILY_START )
    2196             :     {
    2197           0 :         case SID_STYLE_FAMILY1: return SFX_STYLE_FAMILY_CHAR;
    2198        4364 :         case SID_STYLE_FAMILY2: return SFX_STYLE_FAMILY_PARA;
    2199         339 :         case SID_STYLE_FAMILY3: return SFX_STYLE_FAMILY_FRAME;
    2200           0 :         case SID_STYLE_FAMILY4: return SFX_STYLE_FAMILY_PAGE;
    2201           0 :         case SID_STYLE_FAMILY5: return SFX_STYLE_FAMILY_PSEUDO;
    2202             :         default:
    2203             :             OSL_FAIL( "unknown style family" );
    2204           0 :             break;
    2205             :     }
    2206           0 :     return SFX_STYLE_FAMILY_PARA;
    2207             : }
    2208             : 
    2209        4703 : void SvxStyleToolBoxControl::FillStyleBox()
    2210             : {
    2211        4703 :     SvxStyleBox_Impl* pBox = static_cast<SvxStyleBox_Impl*>(GetToolBox().GetItemWindow( GetId() ));
    2212             : 
    2213             :     DBG_ASSERT( pStyleSheetPool, "StyleSheetPool not found!" );
    2214             :     DBG_ASSERT( pBox,            "Control not found!" );
    2215             : 
    2216        4703 :     if ( pStyleSheetPool && pBox && nActFamily!=0xffff )
    2217             :     {
    2218        4703 :         const SfxStyleFamily    eFamily     = GetActFamily();
    2219        4703 :         sal_uInt16              nCount      = pStyleSheetPool->Count();
    2220        4703 :         SfxStyleSheetBase*      pStyle      = NULL;
    2221        4703 :         bool                    bDoFill     = false;
    2222             : 
    2223        4703 :         pStyleSheetPool->SetSearchMask( eFamily, SFXSTYLEBIT_USED );
    2224             : 
    2225             :         // Check whether fill is necessary
    2226        4703 :         pStyle = pStyleSheetPool->First();
    2227             :         //!!! TODO: This condition isn't right any longer, because we always show some default entries
    2228             :         //!!! so the list doesn't show the count
    2229        4703 :         if ( nCount != pBox->GetEntryCount() )
    2230             :         {
    2231        4698 :             bDoFill = true;
    2232             :         }
    2233             :         else
    2234             :         {
    2235           5 :             sal_uInt16 i= 0;
    2236          15 :             while ( pStyle && !bDoFill )
    2237             :             {
    2238           5 :                 bDoFill = ( pBox->GetEntry(i) != pStyle->GetName() );
    2239           5 :                 pStyle = pStyleSheetPool->Next();
    2240           5 :                 i++;
    2241             :             }
    2242             :         }
    2243             : 
    2244        4703 :         if ( bDoFill )
    2245             :         {
    2246        4703 :             pBox->SetUpdateMode( false );
    2247        4703 :             pBox->Clear();
    2248             : 
    2249             :             {
    2250             :                 sal_uInt16  _i;
    2251        4703 :                 sal_uInt32  nCnt = pImpl->aDefaultStyles.size();
    2252             : 
    2253        4703 :                 pStyle = pStyleSheetPool->First();
    2254             : 
    2255        4703 :                 if( pImpl->bSpecModeWriter || pImpl->bSpecModeCalc )
    2256             :                 {
    2257       13995 :                     while ( pStyle )
    2258             :                     {
    2259             :                         // sort out default styles
    2260        4619 :                         bool bInsert = true;
    2261        4619 :                         OUString aName( pStyle->GetName() );
    2262       36889 :                         for( _i = 0 ; _i < nCnt ; ++_i )
    2263             :                         {
    2264       32279 :                             if( pImpl->aDefaultStyles[_i] == aName )
    2265             :                             {
    2266           9 :                                 bInsert = false;
    2267           9 :                                 break;
    2268             :                             }
    2269             :                         }
    2270             : 
    2271        4619 :                         if( bInsert )
    2272        4610 :                             pBox->InsertEntry( aName );
    2273        4619 :                         pStyle = pStyleSheetPool->Next();
    2274        4619 :                     }
    2275             :                 }
    2276             :                 else
    2277             :                 {
    2278         125 :                     while ( pStyle )
    2279             :                     {
    2280          95 :                         pBox->InsertEntry( pStyle->GetName() );
    2281          95 :                         pStyle = pStyleSheetPool->Next();
    2282             :                     }
    2283             :                 }
    2284             :             }
    2285             : 
    2286        4703 :             if( pImpl->bSpecModeWriter || pImpl->bSpecModeCalc )
    2287             :             {
    2288             :                 // disable sort to preserve special order
    2289        4688 :                 WinBits nWinBits = pBox->GetStyle();
    2290        4688 :                 nWinBits &= ~WB_SORT;
    2291        4688 :                 pBox->SetStyle( nWinBits );
    2292             : 
    2293             :                 // insert default styles
    2294             :                 sal_uInt16  _i;
    2295        4688 :                 sal_uInt32  nCnt = pImpl->aDefaultStyles.size();
    2296        4688 :                 sal_uInt16 nPos = 1;
    2297       37504 :                 for( _i = 0 ; _i < nCnt ; ++_i )
    2298             :                 {
    2299       32816 :                     pBox->InsertEntry( pImpl->aDefaultStyles[_i], nPos );
    2300       32816 :                     ++nPos;
    2301             :                 }
    2302             : 
    2303        4688 :                 pBox->InsertEntry( pImpl->aClearForm, 0 );
    2304        4688 :                 pBox->SetSeparatorPos( 0 );
    2305             : 
    2306        4688 :                 pBox->InsertEntry( pImpl->aMore );
    2307             : 
    2308             :                 // enable sort again
    2309        4688 :                 nWinBits |= WB_SORT;
    2310        4688 :                 pBox->SetStyle( nWinBits );
    2311             :             }
    2312             : 
    2313        4703 :             pBox->SetUpdateMode( true );
    2314        4703 :             pBox->SetFamily( eFamily );
    2315             : 
    2316             :             sal_uInt16 nLines = static_cast<sal_uInt16>(
    2317        4703 :                     std::min( pBox->GetEntryCount(), static_cast<sal_Int32>(MAX_STYLES_ENTRIES)));
    2318        4703 :             pBox->SetDropDownLineCount( nLines );
    2319             : 
    2320        4703 :             pBox->CalcOptimalExtraUserWidth();
    2321             :         }
    2322             :     }
    2323        4703 : }
    2324             : 
    2325        4364 : void SvxStyleToolBoxControl::SelectStyle( const OUString& rStyleName )
    2326             : {
    2327        4364 :     SvxStyleBox_Impl* pBox = static_cast<SvxStyleBox_Impl*>(GetToolBox().GetItemWindow( GetId() ));
    2328             :     DBG_ASSERT( pBox, "Control not found!" );
    2329             : 
    2330        4364 :     if ( pBox )
    2331             :     {
    2332        4364 :         OUString aStrSel( pBox->GetText() );
    2333             : 
    2334        4364 :         if ( !rStyleName.isEmpty() )
    2335             :         {
    2336        4364 :             if ( rStyleName != aStrSel )
    2337         343 :                 pBox->SetText( rStyleName );
    2338             :         }
    2339             :         else
    2340           0 :             pBox->SetNoSelection();
    2341        4364 :         pBox->SaveValue();
    2342             :     }
    2343        4364 : }
    2344             : 
    2345        4703 : void SvxStyleToolBoxControl::Update()
    2346             : {
    2347        4703 :     SfxStyleSheetBasePool*  pPool     = NULL;
    2348        4703 :     SfxObjectShell*         pDocShell = SfxObjectShell::Current();
    2349             : 
    2350        4703 :     if ( pDocShell )
    2351        4703 :         pPool = pDocShell->GetStyleSheetPool();
    2352             : 
    2353             :     sal_uInt16 i;
    2354        4703 :     for ( i=0; i<MAX_FAMILIES; i++ )
    2355        4703 :         if( pFamilyState[i] )
    2356        4703 :             break;
    2357             : 
    2358        4703 :     if ( i==MAX_FAMILIES || !pPool )
    2359             :     {
    2360           0 :         pStyleSheetPool = pPool;
    2361        4703 :         return;
    2362             :     }
    2363             : 
    2364             : 
    2365        4703 :     const SfxTemplateItem* pItem = NULL;
    2366             : 
    2367        4703 :     if ( nActFamily == 0xffff || 0 == (pItem = pFamilyState[nActFamily-1]) )
    2368             :     // Current range not within allowed ranges or default
    2369             :     {
    2370         678 :         pStyleSheetPool = pPool;
    2371         678 :         nActFamily      = 2;
    2372             : 
    2373         678 :         pItem = pFamilyState[nActFamily-1];
    2374         678 :         if ( !pItem )
    2375             :         {
    2376         339 :             nActFamily++;
    2377         339 :             pItem = pFamilyState[nActFamily-1];
    2378             :         }
    2379             : 
    2380             :         if ( !pItem )
    2381             :         {
    2382             :             DBG_WARNING( "Unknown Family" ); // can happen
    2383             :         }
    2384             :     }
    2385        4025 :     else if ( pPool != pStyleSheetPool )
    2386           4 :         pStyleSheetPool = pPool;
    2387             : 
    2388        4703 :     FillStyleBox(); // Decides by itself whether Fill is needed
    2389             : 
    2390        4703 :     if ( pItem )
    2391        4364 :         SelectStyle( pItem->GetStyleName() );
    2392             : }
    2393             : 
    2394        3763 : void SvxStyleToolBoxControl::SetFamilyState( sal_uInt16 nIdx,
    2395             :                                              const SfxTemplateItem* pItem )
    2396             : {
    2397        3763 :     delete pFamilyState[nIdx];
    2398        3763 :     pFamilyState[nIdx] = NULL;
    2399             : 
    2400        3763 :     if ( pItem )
    2401        2820 :         pFamilyState[nIdx] = new SfxTemplateItem( *pItem );
    2402             : 
    2403        3763 :     Update();
    2404        3763 : }
    2405             : 
    2406        1356 : IMPL_LINK_NOARG(SvxStyleToolBoxControl, VisibilityNotification)
    2407             : {
    2408             :     // Call ReBind() && UnBind() according to visibility
    2409         678 :     SvxStyleBox_Impl* pBox = static_cast<SvxStyleBox_Impl*>( GetToolBox().GetItemWindow( GetId() ));
    2410             : 
    2411         678 :     if ( pBox && pBox->IsVisible() && !isBound() )
    2412             :     {
    2413        2034 :         for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
    2414        1695 :             pBoundItems [i]->ReBind();
    2415             : 
    2416         339 :         bindListener();
    2417             :     }
    2418         339 :     else if ( (!pBox || !pBox->IsVisible()) && isBound() )
    2419             :     {
    2420           0 :         for ( sal_uInt16 i=0; i<MAX_FAMILIES; i++ )
    2421           0 :             pBoundItems[i]->UnBind();
    2422           0 :         unbindListener();
    2423             :     }
    2424             : 
    2425         678 :     return 0;
    2426             : }
    2427             : 
    2428         940 : void SvxStyleToolBoxControl::StateChanged(
    2429             :     sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
    2430             : {
    2431         940 :     sal_uInt16       nId    = GetId();
    2432         940 :     ToolBox&     rTbx   = GetToolBox();
    2433         940 :     SvxStyleBox_Impl* pBox   = static_cast<SvxStyleBox_Impl*>(rTbx.GetItemWindow( nId ));
    2434         940 :     TriState     eTri   = TRISTATE_FALSE;
    2435             : 
    2436             :     DBG_ASSERT( pBox, "Control not found!" );
    2437             : 
    2438         940 :     if ( SfxItemState::DISABLED == eState )
    2439           0 :         pBox->Disable();
    2440             :     else
    2441         940 :         pBox->Enable();
    2442             : 
    2443         940 :     rTbx.EnableItem( nId, SfxItemState::DISABLED != eState );
    2444             : 
    2445         940 :     switch ( eState )
    2446             :     {
    2447             :         case SfxItemState::DEFAULT:
    2448         940 :             eTri = static_cast<const SfxTemplateItem*>(pState)->GetValue()
    2449             :                         ? TRISTATE_TRUE
    2450         940 :                         : TRISTATE_FALSE;
    2451         940 :             break;
    2452             : 
    2453             :         case SfxItemState::DONTCARE:
    2454           0 :             eTri = TRISTATE_INDET;
    2455           0 :             break;
    2456             : 
    2457             :         default:
    2458           0 :             break;
    2459             :     }
    2460             : 
    2461         940 :     rTbx.SetItemState( nId, eTri );
    2462             : 
    2463         940 :     if ( SfxItemState::DISABLED != eState )
    2464         940 :         Update();
    2465         940 : }
    2466             : 
    2467         497 : VclPtr<vcl::Window> SvxStyleToolBoxControl::CreateItemWindow( vcl::Window *pParent )
    2468             : {
    2469             :     VclPtrInstance<SvxStyleBox_Impl> pBox( pParent,
    2470             :                                            OUString( ".uno:StyleApply" ),
    2471             :                                            SFX_STYLE_FAMILY_PARA,
    2472         497 :                                            Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
    2473             :                                            m_xFrame,
    2474         497 :                                            pImpl->aClearForm,
    2475         497 :                                            pImpl->aMore,
    2476        1988 :                                            pImpl->bSpecModeWriter || pImpl->bSpecModeCalc );
    2477         497 :     if( !pImpl->aDefaultStyles.empty())
    2478         495 :         pBox->SetDefaultStyle( pImpl->aDefaultStyles[0] );
    2479             :     // Set visibility listener to bind/unbind controller
    2480         497 :     pBox->SetVisibilityListener( LINK( this, SvxStyleToolBoxControl, VisibilityNotification ));
    2481             : 
    2482         497 :     return pBox.get();
    2483             : }
    2484             : 
    2485         986 : SvxFontNameToolBoxControl::SvxFontNameToolBoxControl(
    2486             :                                             sal_uInt16          nSlotId,
    2487             :                                             sal_uInt16          nId,
    2488             :                                             ToolBox&        rTbx )
    2489         986 :     :   SfxToolBoxControl( nSlotId, nId, rTbx )
    2490             : {
    2491         986 : }
    2492             : 
    2493        1678 : void SvxFontNameToolBoxControl::StateChanged(
    2494             :     sal_uInt16 , SfxItemState eState, const SfxPoolItem* pState )
    2495             : {
    2496        1678 :     sal_uInt16               nId    = GetId();
    2497        1678 :     ToolBox&             rTbx   = GetToolBox();
    2498        1678 :     SvxFontNameBox_Impl* pBox   = static_cast<SvxFontNameBox_Impl*>(rTbx.GetItemWindow( nId ));
    2499             : 
    2500             :     DBG_ASSERT( pBox, "Control not found!" );
    2501             : 
    2502        1678 :     if ( SfxItemState::DISABLED == eState )
    2503             :     {
    2504           5 :         pBox->Disable();
    2505           5 :         pBox->Update( nullptr );
    2506             :     }
    2507             :     else
    2508             :     {
    2509        1673 :         pBox->Enable();
    2510             : 
    2511        1673 :         if ( SfxItemState::DEFAULT == eState )
    2512             :         {
    2513        1673 :             const SvxFontItem* pFontItem = dynamic_cast< const SvxFontItem* >( pState );
    2514             : 
    2515             :             DBG_ASSERT( pFontItem, "svx::SvxFontNameToolBoxControl::StateChanged(), wrong item type!" );
    2516        1673 :             if( pFontItem )
    2517        1673 :                 pBox->Update( pFontItem );
    2518             :         }
    2519             :         else
    2520           0 :             pBox->SetText( "" );
    2521        1673 :         pBox->SaveValue();
    2522             :     }
    2523             : 
    2524        1678 :     rTbx.EnableItem( nId, SfxItemState::DISABLED != eState );
    2525        1678 : }
    2526             : 
    2527         986 : VclPtr<vcl::Window> SvxFontNameToolBoxControl::CreateItemWindow( vcl::Window *pParent )
    2528             : {
    2529             :     VclPtrInstance<SvxFontNameBox_Impl> pBox( pParent,
    2530         986 :                                               Reference< XDispatchProvider >( m_xFrame->getController(), UNO_QUERY ),
    2531        1972 :                                               m_xFrame,0);
    2532         986 :     return pBox.get();
    2533             : }
    2534             : 
    2535             : /* Note:
    2536             :    The initial color shown on the button is set in /core/svx/source/tbxctrls/tbxcolorupdate.cxx
    2537             :    (ToolboxButtonColorUpdater::ToolboxButtonColorUpdater()) .
    2538             :    The initial color used by the button is set in /core/svx/source/tbxcntrls/tbcontrl.cxx
    2539             :    (SvxColorToolBoxControl::SvxColorToolBoxControl())
    2540             :    and in case of writer for text(background)color also in /core/sw/source/uibase/docvw/edtwin.cxx
    2541             :    (SwEditWin::m_aTextBackColor and SwEditWin::m_aTextColor)
    2542             :  */
    2543             : 
    2544        3448 : SvxColorToolBoxControl::SvxColorToolBoxControl(
    2545             :     sal_uInt16 nSlotId,
    2546             :     sal_uInt16 nId,
    2547             :     ToolBox& rTbx ) :
    2548        3448 :     SfxToolBoxControl( nSlotId, nId, rTbx )
    2549             : {
    2550        3448 :     if ( dynamic_cast< sfx2::sidebar::SidebarToolBox* >(&rTbx) )
    2551        1855 :         bSidebarType = true;
    2552             :     else
    2553        1593 :         bSidebarType = false;
    2554             : 
    2555             :     // The following commands are available at the various modules
    2556        3448 :     switch( nSlotId )
    2557             :     {
    2558             :         case SID_ATTR_CHAR_COLOR:
    2559         643 :             addStatusListener( OUString( ".uno:Color" ));
    2560         643 :             mPaletteManager.SetLastColor( COL_RED );
    2561         643 :             bSidebarType = false;
    2562         643 :             break;
    2563             : 
    2564             :         case SID_ATTR_CHAR_COLOR2:
    2565         680 :             addStatusListener( OUString( ".uno:CharColorExt" ));
    2566         680 :             mPaletteManager.SetLastColor( COL_RED );
    2567         680 :             bSidebarType = false;
    2568         680 :             break;
    2569             : 
    2570             :         case SID_BACKGROUND_COLOR:
    2571         986 :             addStatusListener( OUString( ".uno:BackgroundColor" ));
    2572         986 :             mPaletteManager.SetLastColor( COL_YELLOW );
    2573         986 :             break;
    2574             : 
    2575             :         case SID_ATTR_CHAR_COLOR_BACKGROUND:
    2576         680 :             addStatusListener( OUString( ".uno:CharBackgroundExt" ));
    2577         680 :             mPaletteManager.SetLastColor( COL_YELLOW );
    2578         680 :             bSidebarType = false;
    2579         680 :             break;
    2580             : 
    2581             :         case SID_ATTR_CHAR_BACK_COLOR:
    2582           1 :             addStatusListener( OUString( ".uno:CharBackColor" ));
    2583           1 :             mPaletteManager.SetLastColor( COL_YELLOW );
    2584           1 :             break;
    2585             : 
    2586             :         case SID_FRAME_LINECOLOR:
    2587         306 :             addStatusListener( OUString( ".uno:FrameLineColor" ));
    2588         306 :             addStatusListener( OUString( ".uno:BorderTLBR" ));
    2589         306 :             addStatusListener( OUString( ".uno:BorderBLTR" ));
    2590         306 :             mPaletteManager.SetLastColor( COL_BLUE );
    2591         306 :             break;
    2592             : 
    2593             :         case SID_EXTRUSION_3D_COLOR:
    2594           0 :             addStatusListener( OUString( ".uno:Extrusion3DColor"));
    2595           0 :             break;
    2596             : 
    2597             :         case SID_ATTR_LINE_COLOR:
    2598          51 :             addStatusListener( OUString( ".uno:XLineColor" ));
    2599          51 :             mPaletteManager.SetLastColor( COL_BLACK );
    2600          51 :             break;
    2601             : 
    2602             :         case SID_ATTR_FILL_COLOR:
    2603         101 :             addStatusListener( OUString( ".uno:FillColor" ));
    2604         101 :             mPaletteManager.SetLastColor( COL_DEFAULT_SHAPE_FILLING );
    2605         101 :             break;
    2606             :     }
    2607             : 
    2608        3448 :     if ( bSidebarType )
    2609         692 :         rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
    2610             :     else
    2611        2756 :         rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWN | rTbx.GetItemBits( nId ) );
    2612             : 
    2613        3448 :     m_xBtnUpdater.reset( new svx::ToolboxButtonColorUpdater( nSlotId, nId, &GetToolBox() ) );
    2614        3448 :     mPaletteManager.SetBtnUpdater( m_xBtnUpdater.get() );
    2615        3448 : }
    2616             : 
    2617        6896 : SvxColorToolBoxControl::~SvxColorToolBoxControl()
    2618             : {
    2619        6896 : }
    2620             : 
    2621           0 : SfxPopupWindowType SvxColorToolBoxControl::GetPopupWindowType() const
    2622             : {
    2623           0 :     return SfxPopupWindowType::ONTIMEOUT;
    2624             : }
    2625             : 
    2626           0 : VclPtr<SfxPopupWindow> SvxColorToolBoxControl::CreatePopupWindow()
    2627             : {
    2628             :     SvxColorWindow_Impl* pColorWin =
    2629             :         VclPtr<SvxColorWindow_Impl>::Create(
    2630             : 
    2631             :                             m_aCommandURL,
    2632             :                             mPaletteManager,
    2633             :                             maBorderColorStatus,
    2634           0 :                             GetSlotId(),
    2635             :                             m_xFrame,
    2636           0 :                             SVX_RESSTR( RID_SVXITEMS_EXTRAS_CHARCOLOR ),
    2637           0 :                             &GetToolBox() );
    2638             : 
    2639           0 :     switch( GetSlotId() )
    2640             :     {
    2641             :         case SID_ATTR_CHAR_COLOR_BACKGROUND :
    2642           0 :             pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_EXTRAS_CHARBACKGROUND ) );
    2643           0 :             break;
    2644             : 
    2645             :         case SID_BACKGROUND_COLOR :
    2646           0 :             pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_BACKGROUND ) );
    2647           0 :             break;
    2648             : 
    2649             :         case SID_ATTR_CHAR_BACK_COLOR :
    2650           0 :             pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_CHAR_BACK_COLOR ) );
    2651           0 :             break;
    2652             : 
    2653             :         case SID_FRAME_LINECOLOR:
    2654           0 :             pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_FRAME_COLOR ) );
    2655           0 :             break;
    2656             : 
    2657             :         case SID_EXTRUSION_3D_COLOR:
    2658           0 :             pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_EXTRUSION_COLOR ) );
    2659           0 :             break;
    2660             : 
    2661             :         case SID_ATTR_LINE_COLOR:
    2662           0 :             pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_LINECOLOR ) );
    2663           0 :             break;
    2664             : 
    2665             :         case SID_ATTR_FILL_COLOR:
    2666           0 :             pColorWin->SetText( SVX_RESSTR( RID_SVXSTR_FILLCOLOR ) );
    2667           0 :             break;
    2668             :     }
    2669             : 
    2670           0 :     pColorWin->StartPopupMode( &GetToolBox(),
    2671           0 :         FloatWinPopupFlags::AllowTearOff|FloatWinPopupFlags::NoAppFocusClose );
    2672           0 :     pColorWin->StartSelection();
    2673           0 :     SetPopupWindow( pColorWin );
    2674           0 :     if ( !bSidebarType )
    2675           0 :         pColorWin->SetSelectedHdl( LINK( this, SvxColorToolBoxControl, SelectedHdl ) );
    2676           0 :     return pColorWin;
    2677             : }
    2678             : 
    2679           0 : IMPL_LINK(SvxColorToolBoxControl, SelectedHdl, Color*, pColor)
    2680             : {
    2681           0 :     m_xBtnUpdater->Update( *pColor );
    2682           0 :     mPaletteManager.SetLastColor( *pColor );
    2683           0 :     return 0;
    2684             : }
    2685             : 
    2686        9226 : void SvxColorToolBoxControl::StateChanged(
    2687             :     sal_uInt16 nSID, SfxItemState eState, const SfxPoolItem* pState )
    2688             : {
    2689        9226 :     if ( nSID == SID_ATTR_CHAR_COLOR_EXT || nSID == SID_ATTR_CHAR_COLOR_BACKGROUND_EXT )
    2690        2390 :         SfxToolBoxControl::StateChanged( nSID, eState, pState );
    2691        6836 :     else if ( bSidebarType )
    2692             :     {
    2693        1650 :         Color aColor( COL_TRANSPARENT );
    2694             : 
    2695        1650 :         if ( nSID == SID_FRAME_LINECOLOR
    2696        1409 :           || nSID == SID_ATTR_BORDER_DIAG_TLBR
    2697        1168 :           || nSID == SID_ATTR_BORDER_DIAG_BLTR )
    2698             :         {
    2699         723 :             maBorderColorStatus.StateChanged( nSID, eState, pState );
    2700         723 :             aColor = maBorderColorStatus.GetColor();
    2701             :         }
    2702         927 :         else if ( SfxItemState::DEFAULT <= eState && pState )
    2703             :         {
    2704         922 :             if ( pState->ISA( SvxColorItem ) )
    2705         833 :                 aColor = static_cast< const SvxColorItem* >(pState)->GetValue();
    2706          89 :             else if ( pState->ISA( XLineColorItem ) )
    2707           1 :                 aColor = static_cast< const XLineColorItem* >(pState)->GetColorValue();
    2708          88 :             else if ( pState->ISA( XFillColorItem ) )
    2709          88 :                 aColor = static_cast< const XFillColorItem* >(pState)->GetColorValue();
    2710             :         }
    2711        1650 :         m_xBtnUpdater->Update( aColor );
    2712             :     }
    2713        9226 : }
    2714             : 
    2715           0 : void SvxColorToolBoxControl::Select(sal_uInt16 /*nSelectModifier*/)
    2716             : {
    2717           0 :     if ( bSidebarType )
    2718             :     {
    2719             :         // Open the popup also when Enter key is pressed.
    2720           0 :         css::uno::Reference< css::awt::XWindow > xWin = createPopupWindow();
    2721           0 :         if ( xWin.is() )
    2722           0 :             xWin->setFocus();
    2723           0 :         return;
    2724             :     }
    2725             : 
    2726           0 :     OUString aCommand;
    2727           0 :     OUString aParamName;
    2728             : 
    2729           0 :     switch( GetSlotId() )
    2730             :     {
    2731             :         case SID_ATTR_CHAR_COLOR2 :
    2732           0 :             aCommand    = ".uno:CharColorExt";
    2733           0 :             aParamName  = "FontColor";
    2734           0 :             break;
    2735             : 
    2736             :         case SID_ATTR_CHAR_COLOR  :
    2737           0 :             aCommand    = ".uno:Color";
    2738           0 :             aParamName  = "Color";
    2739           0 :             break;
    2740             : 
    2741             :         case SID_BACKGROUND_COLOR :
    2742           0 :             aCommand    = ".uno:BackgroundColor";
    2743           0 :             aParamName  = "BackgroundColor";
    2744           0 :             break;
    2745             : 
    2746             :         case SID_ATTR_CHAR_COLOR_BACKGROUND :
    2747           0 :             aCommand    = ".uno:CharBackgroundExt";
    2748           0 :             aParamName  = "BackColor";
    2749           0 :             break;
    2750             : 
    2751             :         case SID_ATTR_CHAR_BACK_COLOR :
    2752           0 :             aCommand    = ".uno:CharBackColor";
    2753           0 :             aParamName  = "CharBackColor";
    2754           0 :             break;
    2755             : 
    2756             :         case SID_FRAME_LINECOLOR  :
    2757           0 :             aCommand    = ".uno:FrameLineColor";
    2758           0 :             aParamName  = "FrameLineColor";
    2759           0 :             break;
    2760             : 
    2761             :         case SID_EXTRUSION_3D_COLOR:
    2762           0 :             aCommand    = ".uno:Extrusion3DColor";
    2763           0 :             aParamName  = "Extrusion3DColor";
    2764           0 :             break;
    2765             : 
    2766             :         case SID_ATTR_LINE_COLOR:
    2767           0 :             aCommand    = ".uno:XLineColor";
    2768           0 :             aParamName  = "XLineColor";
    2769           0 :             break;
    2770             : 
    2771             :         case SID_ATTR_FILL_COLOR:
    2772           0 :             aCommand    = ".uno:FillColor";
    2773           0 :             aParamName  = "FillColor";
    2774           0 :             break;
    2775             :     }
    2776             : 
    2777           0 :     Sequence< PropertyValue > aArgs( 1 );
    2778           0 :     aArgs[0].Name  = aParamName;
    2779           0 :     aArgs[0].Value = makeAny( (sal_uInt32)( mPaletteManager.GetLastColor().GetColor() ));
    2780           0 :     Dispatch( aCommand, aArgs );
    2781             : }
    2782             : 
    2783        3448 : SfxToolBoxControl* SvxColorToolBoxControl::CreateImpl( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox &rTbx )
    2784             : {
    2785        3448 :     return new SvxColorToolBoxControl( nSlotId, nId, rTbx );
    2786             : }
    2787             : 
    2788         910 : void SvxColorToolBoxControl::RegisterControl(sal_uInt16 nSlotId, SfxModule *pMod)
    2789             : {
    2790         910 :     if ( nSlotId == SID_ATTR_LINE_COLOR )
    2791         132 :         SfxToolBoxControl::RegisterToolBoxControl( pMod, new SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, TYPE(XLineColorItem), nSlotId ) );
    2792         778 :     else if ( nSlotId == SID_ATTR_FILL_COLOR )
    2793         132 :         SfxToolBoxControl::RegisterToolBoxControl( pMod, new SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, TYPE(XFillColorItem), nSlotId ) );
    2794         646 :     else if ( nSlotId == SID_ATTR_CHAR_BACK_COLOR )
    2795          21 :         SfxToolBoxControl::RegisterToolBoxControl( pMod, new SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, TYPE(SvxBackgroundColorItem), nSlotId ) );
    2796             :     else
    2797         625 :         SfxToolBoxControl::RegisterToolBoxControl( pMod, new SfxTbxCtrlFactory( SvxColorToolBoxControl::CreateImpl, TYPE(SvxColorItem), nSlotId ) );
    2798         910 : }
    2799             : 
    2800             : // class SvxFrameToolBoxControl --------------------------------------------
    2801             : 
    2802         155 : SvxFrameToolBoxControl::SvxFrameToolBoxControl(
    2803             :     sal_uInt16      nSlotId,
    2804             :     sal_uInt16      nId,
    2805             :     ToolBox&    rTbx )
    2806         155 :     :   SfxToolBoxControl( nSlotId, nId, rTbx )
    2807             : {
    2808         155 :     rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
    2809         155 : }
    2810             : 
    2811           0 : SfxPopupWindowType SvxFrameToolBoxControl::GetPopupWindowType() const
    2812             : {
    2813           0 :     return SfxPopupWindowType::ONCLICK;
    2814             : }
    2815             : 
    2816           0 : VclPtr<SfxPopupWindow> SvxFrameToolBoxControl::CreatePopupWindow()
    2817             : {
    2818             :     VclPtr<SvxFrameWindow_Impl> pFrameWin = VclPtr<SvxFrameWindow_Impl>::Create(
    2819           0 :                                         GetSlotId(), m_xFrame, &GetToolBox() );
    2820             : 
    2821           0 :     pFrameWin->StartPopupMode( &GetToolBox(),
    2822             :                                FloatWinPopupFlags::GrabFocus |
    2823           0 :                                FloatWinPopupFlags::AllowTearOff |
    2824           0 :                                FloatWinPopupFlags::NoAppFocusClose );
    2825           0 :     pFrameWin->StartSelection();
    2826           0 :     SetPopupWindow( pFrameWin );
    2827             : 
    2828           0 :     return pFrameWin;
    2829             : }
    2830             : 
    2831         241 : void SvxFrameToolBoxControl::StateChanged(
    2832             :     sal_uInt16, SfxItemState eState, const SfxPoolItem*  )
    2833             : {
    2834         241 :     sal_uInt16                  nId     = GetId();
    2835         241 :     ToolBox&                rTbx    = GetToolBox();
    2836             : 
    2837         241 :     rTbx.EnableItem( nId, SfxItemState::DISABLED != eState );
    2838             :     rTbx.SetItemState( nId, (SfxItemState::DONTCARE == eState)
    2839             :                             ? TRISTATE_INDET
    2840         241 :                             : TRISTATE_FALSE );
    2841         241 : }
    2842             : 
    2843         155 : SvxFrameLineStyleToolBoxControl::SvxFrameLineStyleToolBoxControl(
    2844             :     sal_uInt16          nSlotId,
    2845             :     sal_uInt16          nId,
    2846             :     ToolBox&        rTbx )
    2847             : 
    2848         155 :     :    SfxToolBoxControl( nSlotId, nId, rTbx )
    2849             : {
    2850         155 :     rTbx.SetItemBits( nId, ToolBoxItemBits::DROPDOWNONLY | rTbx.GetItemBits( nId ) );
    2851         155 : }
    2852             : 
    2853           0 : SfxPopupWindowType SvxFrameLineStyleToolBoxControl::GetPopupWindowType() const
    2854             : {
    2855           0 :     return SfxPopupWindowType::ONCLICK;
    2856             : }
    2857             : 
    2858           0 : VclPtr<SfxPopupWindow> SvxFrameLineStyleToolBoxControl::CreatePopupWindow()
    2859             : {
    2860           0 :     VclPtr<SvxLineWindow_Impl> pLineWin = VclPtr<SvxLineWindow_Impl>::Create( GetSlotId(), m_xFrame, &GetToolBox() );
    2861           0 :     pLineWin->StartPopupMode( &GetToolBox(),
    2862             :                               FloatWinPopupFlags::GrabFocus |
    2863           0 :                               FloatWinPopupFlags::AllowTearOff |
    2864           0 :                               FloatWinPopupFlags::NoAppFocusClose );
    2865           0 :     SetPopupWindow( pLineWin );
    2866             : 
    2867           0 :     return pLineWin;
    2868             : }
    2869             : 
    2870         241 : void SvxFrameLineStyleToolBoxControl::StateChanged(
    2871             :     sal_uInt16 , SfxItemState eState, const SfxPoolItem*  )
    2872             : {
    2873         241 :     sal_uInt16       nId    = GetId();
    2874         241 :     ToolBox&     rTbx   = GetToolBox();
    2875             : 
    2876         241 :     rTbx.EnableItem( nId, SfxItemState::DISABLED != eState );
    2877             :     rTbx.SetItemState( nId, (SfxItemState::DONTCARE == eState)
    2878             :                                 ? TRISTATE_INDET
    2879         241 :                                 : TRISTATE_FALSE );
    2880         241 : }
    2881             : 
    2882           0 : SvxSimpleUndoRedoController::SvxSimpleUndoRedoController( sal_uInt16 nSlotId, sal_uInt16 nId, ToolBox& rTbx  )
    2883           0 :     :SfxToolBoxControl( nSlotId, nId, rTbx )
    2884             : {
    2885           0 :     aDefaultText = rTbx.GetItemText( nId );
    2886           0 : }
    2887             : 
    2888           0 : SvxSimpleUndoRedoController::~SvxSimpleUndoRedoController()
    2889             : {
    2890           0 : }
    2891             : 
    2892           0 : void SvxSimpleUndoRedoController::StateChanged( sal_uInt16, SfxItemState eState, const SfxPoolItem* pState )
    2893             : {
    2894           0 :     const SfxStringItem* pItem = PTR_CAST( SfxStringItem, pState );
    2895           0 :     ToolBox& rBox = GetToolBox();
    2896           0 :     if ( pItem && eState != SfxItemState::DISABLED )
    2897             :     {
    2898           0 :         OUString aNewText( MnemonicGenerator::EraseAllMnemonicChars( pItem->GetValue() ) );
    2899           0 :         rBox.SetQuickHelpText( GetId(), aNewText );
    2900             :     }
    2901           0 :     if ( eState == SfxItemState::DISABLED )
    2902           0 :         rBox.SetQuickHelpText( GetId(), aDefaultText );
    2903           0 :     rBox.EnableItem( GetId(), eState != SfxItemState::DISABLED );
    2904           0 : }
    2905             : 
    2906             : 
    2907             : 
    2908           0 : static void lcl_CalcSizeValueSet( vcl::Window &rWin, ValueSet &rValueSet, const Size &aItemSize )
    2909             : {
    2910           0 :     Size aSize = rValueSet.CalcWindowSizePixel( aItemSize );
    2911           0 :     aSize.Width()  += 4;
    2912           0 :     aSize.Height() += 4;
    2913           0 :     rWin.SetOutputSizePixel( aSize );
    2914           0 : }
    2915             : 
    2916           1 : Reference< ::com::sun::star::accessibility::XAccessible > SvxFontNameBox_Impl::CreateAccessible()
    2917             : {
    2918           1 :     FillList();
    2919           1 :     return FontNameBox::CreateAccessible();
    2920         435 : }
    2921             : 
    2922             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11