| /************************************************************** | 
 |  * | 
 |  * Licensed to the Apache Software Foundation (ASF) under one | 
 |  * or more contributor license agreements.  See the NOTICE file | 
 |  * distributed with this work for additional information | 
 |  * regarding copyright ownership.  The ASF licenses this file | 
 |  * to you under the Apache License, Version 2.0 (the | 
 |  * "License"); you may not use this file except in compliance | 
 |  * with the License.  You may obtain a copy of the License at | 
 |  * | 
 |  *   http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, | 
 |  * software distributed under the License is distributed on an | 
 |  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 |  * KIND, either express or implied.  See the License for the | 
 |  * specific language governing permissions and limitations | 
 |  * under the License. | 
 |  * | 
 |  *************************************************************/ | 
 |  | 
 |  | 
 |  | 
 | // MARKER(update_precomp.py): autogen include statement, do not remove | 
 | #include "precompiled_svx.hxx" | 
 |  | 
 | #include "tbunocontroller.hxx" | 
 |  | 
 | #include <com/sun/star/frame/status/FontHeight.hpp> | 
 | #include <com/sun/star/frame/XDispatchProvider.hpp> | 
 | #include <com/sun/star/beans/PropertyValue.hpp> | 
 |  | 
 | #include <vcl/svapp.hxx> | 
 | #include <vcl/window.hxx> | 
 | #include <toolkit/helper/vclunohelper.hxx> | 
 | #include <svtools/ctrltool.hxx> | 
 | #include <svtools/ctrlbox.hxx> | 
 | #include <vos/mutex.hxx> | 
 |  | 
 | #include <memory> | 
 |  | 
 | #define LOGICAL_EDIT_HEIGHT         12 | 
 |  | 
 | using namespace ::com::sun::star; | 
 |  | 
 | namespace svx | 
 | { | 
 |  | 
 | class FontHeightToolBoxControl; | 
 | class SvxFontSizeBox_Impl : public FontSizeBox | 
 | { | 
 | public: | 
 |                         SvxFontSizeBox_Impl( Window* pParent, | 
 |                                              const uno::Reference< frame::XDispatchProvider >& rDispatchProvider, | 
 |                                              const uno::Reference< frame::XFrame >& _xFrame, | 
 | 										     FontHeightToolBoxControl& rCtrl ); | 
 |  | 
 |     void                statusChanged_Impl( long nHeight, bool bErase = false ); | 
 |     void                UpdateFont( const ::com::sun::star::awt::FontDescriptor& rCurrentFont ); | 
 |  | 
 |     virtual long		Notify( NotifyEvent& rNEvt ); | 
 |  | 
 | protected: | 
 | 	virtual void        Select(); | 
 |     virtual void        DataChanged( const DataChangedEvent& rDCEvt ); | 
 |  | 
 | private: | 
 | 	FontHeightToolBoxControl*	               m_pCtrl; | 
 | 	String							           m_aCurText; | 
 |     Size                                       m_aLogicalSize; | 
 | 	sal_Bool							           m_bRelease; | 
 |     uno::Reference< frame::XDispatchProvider > m_xDispatchProvider; | 
 |     uno::Reference< frame::XFrame >            m_xFrame; | 
 |     uno::Reference< awt::XWindow >             m_xOldFocusWindow; | 
 |  | 
 | 	void				ReleaseFocus_Impl(); | 
 | }; | 
 |  | 
 | //======================================================================== | 
 | // class SvxFontSizeBox_Impl -------------------------------------------------- | 
 | //======================================================================== | 
 |  | 
 | SvxFontSizeBox_Impl::SvxFontSizeBox_Impl( | 
 |     Window*                                           _pParent, | 
 |     const uno::Reference< frame::XDispatchProvider >& _rDispatchProvider, | 
 |     const uno::Reference< frame::XFrame >&            _xFrame, | 
 |     FontHeightToolBoxControl&                         _rCtrl ) : | 
 |  | 
 | 	FontSizeBox( _pParent, WinBits( WB_DROPDOWN ) ), | 
 |  | 
 | 	m_pCtrl		        ( &_rCtrl ), | 
 |     m_aLogicalSize      ( 30,100 ), | 
 | 	m_bRelease	        ( sal_True ), | 
 |     m_xDispatchProvider ( _rDispatchProvider ), | 
 |     m_xFrame            ( _xFrame ) | 
 | { | 
 |     SetSizePixel( LogicToPixel( m_aLogicalSize, MAP_APPFONT )); | 
 | 	SetValue( 0 ); | 
 | 	SetText( String() ); | 
 | } | 
 |  | 
 | // ----------------------------------------------------------------------- | 
 |  | 
 | void SvxFontSizeBox_Impl::ReleaseFocus_Impl() | 
 | { | 
 | 	if ( !m_bRelease ) | 
 | 	{ | 
 | 		m_bRelease = sal_True; | 
 | 		return; | 
 |     } | 
 |  | 
 |     if ( m_xFrame.is() && m_xFrame->getContainerWindow().is() ) | 
 |         m_xFrame->getContainerWindow()->setFocus(); | 
 | } | 
 |  | 
 | // ----------------------------------------------------------------------- | 
 |  | 
 | void SvxFontSizeBox_Impl::Select() | 
 | { | 
 | 	FontSizeBox::Select(); | 
 |  | 
 | 	if ( !IsTravelSelect() ) | 
 | 	{ | 
 | 		sal_Int64 nSelVal = GetValue(); | 
 | 		float fSelVal     = float( nSelVal ) / 10; | 
 |  | 
 |         uno::Sequence< beans::PropertyValue > aArgs( 1 ); | 
 |         aArgs[0].Name  = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "FontHeight.Height" )); | 
 |         aArgs[0].Value = uno::makeAny( fSelVal ); | 
 |  | 
 |         /*  #i33380# DR 2004-09-03 Moved the following line above the Dispatch() call. | 
 |             This instance may be deleted in the meantime (i.e. when a dialog is opened | 
 |             while in Dispatch()), accessing members will crash in this case. */ | 
 |         ReleaseFocus_Impl(); | 
 |  | 
 |         m_pCtrl->dispatchCommand( aArgs ); | 
 | 	} | 
 | } | 
 |  | 
 | // ----------------------------------------------------------------------- | 
 |  | 
 | void SvxFontSizeBox_Impl::statusChanged_Impl( long nPoint, bool bErase ) | 
 | { | 
 | 	if ( !bErase ) | 
 | 	{ | 
 | 		// Metric Umrechnen | 
 |         long nVal = nPoint; | 
 |  | 
 | 		// ge"andert => neuen Wert setzen | 
 | 		if ( GetValue() != nVal ) | 
 | 			SetValue( nVal ); | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		// Wert in der Anzeige l"oschen | 
 | 		SetValue( -1L ); | 
 | 		SetText( String() ); | 
 | 	} | 
 |     SaveValue(); | 
 | } | 
 |  | 
 | // ----------------------------------------------------------------------- | 
 |  | 
 | void SvxFontSizeBox_Impl::UpdateFont( const ::com::sun::star::awt::FontDescriptor& rCurrentFont ) | 
 | { | 
 | 	// Sizes-Liste auff"ullen | 
 | 	sal_Int64 nOldVal = GetValue(); // alten Wert merken | 
 |     const FontList* _pFontList = NULL; | 
 |     ::std::auto_ptr<FontList> aHold( new FontList( this )); | 
 |     _pFontList = aHold.get(); | 
 |  | 
 |     if ( rCurrentFont.Name.getLength() > 0 ) | 
 | 	{ | 
 |         FontInfo _aFontInfo; | 
 |         _aFontInfo.SetName( rCurrentFont.Name ); | 
 |         _aFontInfo.SetStyleName( rCurrentFont.StyleName ); | 
 |         _aFontInfo.SetHeight( rCurrentFont.Height ); | 
 |         Fill( &_aFontInfo, _pFontList ); | 
 | 	} | 
 | 	else | 
 | 	{ | 
 | 		Fill( NULL, _pFontList ); | 
 | 	} | 
 | 	SetValue( nOldVal ); // alten Wert wiederherstellen | 
 | 	m_aCurText = GetText(); // zum R"ucksetzen bei ESC merken | 
 | } | 
 |  | 
 | // ----------------------------------------------------------------------- | 
 |  | 
 | long SvxFontSizeBox_Impl::Notify( NotifyEvent& rNEvt ) | 
 | { | 
 | 	long nHandled = 0; | 
 |  | 
 | 	if ( rNEvt.GetType() == EVENT_KEYINPUT ) | 
 | 	{ | 
 | 		sal_uInt16 nCode = rNEvt.GetKeyEvent()->GetKeyCode().GetCode(); | 
 |  | 
 | 		switch ( nCode ) | 
 | 		{ | 
 | 			case KEY_RETURN: | 
 | 			case KEY_TAB: | 
 | 			{ | 
 | 				if ( KEY_TAB == nCode ) | 
 | 					m_bRelease = sal_False; | 
 | 				else | 
 | 					nHandled = 1; | 
 | 				Select(); | 
 | 				break; | 
 | 			} | 
 |  | 
 | 			case KEY_ESCAPE: | 
 | 				SetText( m_aCurText ); | 
 | 				ReleaseFocus_Impl(); | 
 | 				nHandled = 1; | 
 | 				break; | 
 | 		} | 
 | 	} | 
 |     else if( EVENT_LOSEFOCUS == rNEvt.GetType() ) | 
 | 	{ | 
 | 		Window* pFocusWin = Application::GetFocusWindow(); | 
 | 		if(!HasFocus() && GetSubEdit() != pFocusWin) | 
 | 			SetText(GetSavedValue()); | 
 | 	} | 
 |  | 
 |     return nHandled ? nHandled : FontSizeBox::Notify( rNEvt ); | 
 | } | 
 |  | 
 | // --------------------------------------------------------------------------- | 
 |  | 
 | void SvxFontSizeBox_Impl::DataChanged( const DataChangedEvent& rDCEvt ) | 
 | { | 
 | 	if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && | 
 |          (rDCEvt.GetFlags() & SETTINGS_STYLE) ) | 
 |     { | 
 |         SetSizePixel( LogicToPixel( m_aLogicalSize, MAP_APPFONT )); | 
 |         Size aDropSize( m_aLogicalSize.Width(), LOGICAL_EDIT_HEIGHT ); | 
 |         SetDropDownSizePixel( LogicToPixel( aDropSize, MAP_APPFONT )); | 
 |     } | 
 |  | 
 |     FontSizeBox::DataChanged( rDCEvt ); | 
 | } | 
 |  | 
 | //======================================================================== | 
 | // class FontHeightToolBoxControl | 
 | //======================================================================== | 
 |  | 
 | FontHeightToolBoxControl::FontHeightToolBoxControl( | 
 |     const uno::Reference< lang::XMultiServiceFactory >& rServiceManager ) : | 
 |     svt::ToolboxController( rServiceManager, | 
 |                             uno::Reference< frame::XFrame >(), | 
 |                             ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontHeight" )) ), | 
 |     m_pBox( NULL ) | 
 | { | 
 |     addStatusListener( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CharFontName" ))); | 
 | } | 
 |  | 
 | FontHeightToolBoxControl::~FontHeightToolBoxControl() | 
 | { | 
 | } | 
 |  | 
 | // XInterface | 
 | ::com::sun::star::uno::Any SAL_CALL FontHeightToolBoxControl::queryInterface( const ::com::sun::star::uno::Type& aType ) | 
 | throw (::com::sun::star::uno::RuntimeException) | 
 | { | 
 |     uno::Any a = ToolboxController::queryInterface( aType ); | 
 |     if ( a.hasValue() ) | 
 |         return a; | 
 |  | 
 |     return ::cppu::queryInterface( aType, static_cast< lang::XServiceInfo* >( this )); | 
 | } | 
 |  | 
 | void SAL_CALL FontHeightToolBoxControl::acquire() throw () | 
 | { | 
 |     ToolboxController::acquire(); | 
 | } | 
 |  | 
 | void SAL_CALL FontHeightToolBoxControl::release() throw () | 
 | { | 
 |     ToolboxController::release(); | 
 | } | 
 |  | 
 | // XServiceInfo | 
 | sal_Bool SAL_CALL FontHeightToolBoxControl::supportsService( const ::rtl::OUString& ServiceName ) | 
 | throw(uno::RuntimeException) | 
 | { | 
 |     const uno::Sequence< ::rtl::OUString > aSNL( getSupportedServiceNames() ); | 
 |     const ::rtl::OUString * pArray = aSNL.getConstArray(); | 
 |  | 
 |     for( sal_Int32 i = 0; i < aSNL.getLength(); i++ ) | 
 |         if( pArray[i] == ServiceName ) | 
 |             return true; | 
 |  | 
 |     return false; | 
 | } | 
 |  | 
 | ::rtl::OUString SAL_CALL FontHeightToolBoxControl::getImplementationName() | 
 | throw( uno::RuntimeException ) | 
 | { | 
 | 	return getImplementationName_Static(); | 
 | } | 
 |  | 
 | uno::Sequence< ::rtl::OUString > SAL_CALL FontHeightToolBoxControl::getSupportedServiceNames(  ) | 
 | throw( uno::RuntimeException ) | 
 | { | 
 |     return getSupportedServiceNames_Static(); | 
 | } | 
 |  | 
 | uno::Sequence< ::rtl::OUString > FontHeightToolBoxControl::getSupportedServiceNames_Static() | 
 | throw() | 
 | { | 
 |     uno::Sequence< ::rtl::OUString > aSNS( 1 ); | 
 |     aSNS.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.frame.ToolbarController" )); | 
 |     return aSNS; | 
 | } | 
 |  | 
 | // XComponent | 
 | void SAL_CALL FontHeightToolBoxControl::dispose() | 
 | throw (uno::RuntimeException) | 
 | { | 
 |     svt::ToolboxController::dispose(); | 
 |  | 
 |     vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); | 
 |     delete m_pBox; | 
 |     m_pBox = 0; | 
 | } | 
 |  | 
 | // XStatusListener | 
 | void SAL_CALL FontHeightToolBoxControl::statusChanged( | 
 |     const frame::FeatureStateEvent& rEvent ) | 
 | throw ( uno::RuntimeException ) | 
 | { | 
 |     if ( m_pBox ) | 
 |     { | 
 |         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); | 
 |         if ( rEvent.FeatureURL.Path.equalsAscii( "FontHeight" )) | 
 |         { | 
 | 	        if ( rEvent.IsEnabled ) | 
 | 	        { | 
 |                 m_pBox->Enable(); | 
 |                 frame::status::FontHeight aFontHeight; | 
 |                 if ( rEvent.State >>= aFontHeight ) | 
 |                     m_pBox->statusChanged_Impl( long( 10. * aFontHeight.Height ), false ); | 
 |                 else | 
 |                     m_pBox->statusChanged_Impl( long( -1 ), true ); | 
 |             } | 
 |             else | 
 |                 m_pBox->Disable(); | 
 |         } | 
 |         else if ( rEvent.FeatureURL.Path.equalsAscii( "CharFontName" )) | 
 |         { | 
 |             if ( rEvent.State >>= m_aCurrentFont ) | 
 |                 m_pBox->UpdateFont( m_aCurrentFont ); | 
 |         } | 
 |     } | 
 | } | 
 |  | 
 | // XToolbarController | 
 | void SAL_CALL FontHeightToolBoxControl::execute( sal_Int16 /*KeyModifier*/ ) | 
 | throw (::com::sun::star::uno::RuntimeException) | 
 | { | 
 | } | 
 |  | 
 | void SAL_CALL FontHeightToolBoxControl::click() | 
 | throw (::com::sun::star::uno::RuntimeException) | 
 | { | 
 | } | 
 |  | 
 | void SAL_CALL FontHeightToolBoxControl::doubleClick() | 
 | throw (::com::sun::star::uno::RuntimeException) | 
 | { | 
 | } | 
 |  | 
 | uno::Reference< awt::XWindow > SAL_CALL FontHeightToolBoxControl::createPopupWindow() | 
 | throw (::com::sun::star::uno::RuntimeException) | 
 | { | 
 |     return uno::Reference< awt::XWindow >(); | 
 | } | 
 |  | 
 | uno::Reference< awt::XWindow > SAL_CALL FontHeightToolBoxControl::createItemWindow( | 
 |     const uno::Reference< awt::XWindow >& Parent ) | 
 |     throw (::com::sun::star::uno::RuntimeException) | 
 | { | 
 |     uno::Reference< awt::XWindow > xItemWindow; | 
 |     uno::Reference< awt::XWindow > xParent( Parent ); | 
 |  | 
 |     Window* pParent = VCLUnoHelper::GetWindow( xParent ); | 
 |     if ( pParent ) | 
 |     { | 
 |         vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); | 
 |         m_pBox = new SvxFontSizeBox_Impl( | 
 |                         pParent, | 
 |                         uno::Reference< frame::XDispatchProvider >( m_xFrame, uno::UNO_QUERY ), | 
 |                         m_xFrame, | 
 |                         *this ); | 
 |         xItemWindow = VCLUnoHelper::GetInterface( m_pBox ); | 
 |     } | 
 |  | 
 |     return xItemWindow; | 
 | } | 
 |  | 
 | void FontHeightToolBoxControl::dispatchCommand( | 
 |     const uno::Sequence< beans::PropertyValue >& rArgs ) | 
 | { | 
 |     uno::Reference< frame::XDispatchProvider > xDispatchProvider( m_xFrame, uno::UNO_QUERY ); | 
 |     if ( xDispatchProvider.is() ) | 
 |     { | 
 |         util::URL                               aURL; | 
 |         uno::Reference< frame::XDispatch >      xDispatch; | 
 |         uno::Reference< util::XURLTransformer > xURLTransformer = getURLTransformer(); | 
 |  | 
 |         aURL.Complete = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FontHeight" )); | 
 |         xURLTransformer->parseStrict( aURL ); | 
 |         xDispatch = xDispatchProvider->queryDispatch( aURL, ::rtl::OUString(), 0 ); | 
 |         if ( xDispatch.is() ) | 
 |             xDispatch->dispatch( aURL, rArgs ); | 
 |     } | 
 | } | 
 |  | 
 | uno::Reference< uno::XInterface > SAL_CALL FontHeightToolBoxControl_createInstance( | 
 |     const uno::Reference< lang::XMultiServiceFactory >& rSMgr ) | 
 | { | 
 | 	return *new FontHeightToolBoxControl( rSMgr ); | 
 | } | 
 |  | 
 | } |