| /************************************************************** |
| * |
| * 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 ); |
| } |
| |
| } |