office-gobmx/svx/source/tbxctrls/tbunocontroller.cxx
Noel Grandin 610b2b94b3 remove unnecessary use of OUString constructor when assigning
change code like
   aStr = OUString("xxxx");
to
   aStr = "xxxx";

Change-Id: Ib981a5cc735677ec5dba76ef9279a107d22e99d4
2013-11-19 10:29:31 +02:00

415 lines
13 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* 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 .
*/
#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 <osl/mutex.hxx>
#include <comphelper/processfactory.hxx>
#include <cppuhelper/supportsservice.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;
OUString m_aCurText;
Size m_aLogicalSize;
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 ( true ),
m_xDispatchProvider ( _rDispatchProvider ),
m_xFrame ( _xFrame )
{
SetSizePixel( LogicToPixel( m_aLogicalSize, MAP_APPFONT ));
SetValue( 0 );
SetText( "" );
}
// -----------------------------------------------------------------------
void SvxFontSizeBox_Impl::ReleaseFocus_Impl()
{
if ( !m_bRelease )
{
m_bRelease = 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 = "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( "" );
}
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.isEmpty() )
{
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 = 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< uno::XComponentContext >& rxContext )
: svt::ToolboxController( rxContext,
uno::Reference< frame::XFrame >(),
OUString( ".uno:FontHeight" ) ),
m_pBox( NULL )
{
addStatusListener( OUString( ".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 OUString& ServiceName )
throw(uno::RuntimeException)
{
return cppu::supportsService(this, ServiceName);
}
OUString SAL_CALL FontHeightToolBoxControl::getImplementationName()
throw( uno::RuntimeException )
{
return getImplementationName_Static();
}
uno::Sequence< OUString > SAL_CALL FontHeightToolBoxControl::getSupportedServiceNames( )
throw( uno::RuntimeException )
{
return getSupportedServiceNames_Static();
}
uno::Sequence< OUString > FontHeightToolBoxControl::getSupportedServiceNames_Static()
throw()
{
uno::Sequence< OUString > aSNS( 1 );
aSNS.getArray()[0] = "com.sun.star.frame.ToolbarController";
return aSNS;
}
// XComponent
void SAL_CALL FontHeightToolBoxControl::dispose()
throw (uno::RuntimeException)
{
svt::ToolboxController::dispose();
SolarMutexGuard aSolarMutexGuard;
delete m_pBox;
m_pBox = 0;
}
// XStatusListener
void SAL_CALL FontHeightToolBoxControl::statusChanged(
const frame::FeatureStateEvent& rEvent )
throw ( uno::RuntimeException )
{
if ( m_pBox )
{
SolarMutexGuard aSolarMutexGuard;
if ( rEvent.FeatureURL.Path == "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 == "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 )
{
SolarMutexGuard aSolarMutexGuard;
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 = ".uno:FontHeight";
xURLTransformer->parseStrict( aURL );
xDispatch = xDispatchProvider->queryDispatch( aURL, 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( comphelper::getComponentContext(rSMgr) );
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */