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

Generated by: LCOV version 1.10