sdk-examples/trunk/cpp/components/StatusbarController/ModifiedStatusbarController/ModifiedStatusbarController.cxx (202 lines of code) (raw):
/**************************************************************
*
* 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.
*
*************************************************************/
#include "ModifiedStatusbarController.hxx"
#include "defines.hxx"
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/graphic/XGraphicProvider.hpp>
#include <com/sun/star/graphic/GraphicType.hpp>
#include <com/sun/star/awt/ImageDrawMode.hpp>
using namespace framework::statusbar_controller_modified;
using namespace com::sun::star::uno;
using namespace com::sun::star::ui;
using namespace com::sun::star::awt;
using namespace com::sun::star::graphic;
using namespace com::sun::star::frame;
using namespace com::sun::star::beans;
using rtl::OUString;
namespace
{
static OUString st_ModifiedStatusCmd = OUSTR_COMMAND_UNO_MODIFIED_STATUS;
static Size st_GraphicSize;
struct StaticStatusGraphic
: public rtl::Static< Reference< XGraphic >, StaticStatusGraphic >
{
};
struct StaticSupportedServices
: public rtl::StaticWithInit< Sequence< OUString >, StaticSupportedServices >
{
Sequence< OUString >
operator( )( )
{
Sequence< OUString > aServices( 2 );
aServices[0] = C2U( STATUSBAR_CONTROLLER_SERVICE_NAME );
aServices[1] = C2U( "com.sun.star.frame.StatusbarController" );
return aServices;
}
};
}
ModifiedStatusbarController::ModifiedStatusbarController(
const Reference< XComponentContext> &rxContext )
: ModifiedStatusbarController_Base( )
, m_bEnabled( false )
, m_bModifiedStatusEnabled( false )
, m_bIsDocumentModified( false )
{
OSL_TRACE( "sbctlmodif::ModifiedStatusbarController::ModifiedStatusbarController" );
m_xContext = rxContext;
Reference< XGraphic > &xGraphic = StaticStatusGraphic::get( );
if ( !xGraphic.is( ) )
{
try
{
Reference< XGraphicProvider > xProvider(
m_xContext->getServiceManager( )->createInstanceWithContext(
OUSTR_SERVICENAME_GRAPHICPROVIDER, m_xContext ),
UNO_QUERY_THROW );
Sequence< PropertyValue > aMediaProps( 1 );
aMediaProps[0].Name = C2U( "URL" );
aMediaProps[0].Value <<= C2U( "vnd.sun.star.extension://" EXTENSION_IDENTIFIER "/images/statusbaricon.png" );
xGraphic.set( xProvider->queryGraphic( aMediaProps ) );
Reference< XPropertySet > xGraphicProps( xGraphic, UNO_QUERY_THROW );
xGraphicProps->getPropertyValue( C2U( "SizePixel" ) ) >>= st_GraphicSize;
OSL_ENSURE( st_GraphicSize.Height > 0 && st_GraphicSize.Width > 0, "Empty status bar graphic!" );
}
catch ( const Exception &e )
{
DISPLAY_EXCEPTION_ENSURE( ModifiedStatusbarController, ModifiedStatusbarController, e );
}
}
}
ModifiedStatusbarController::~ModifiedStatusbarController( )
{
OSL_TRACE( "sbctlmodif::ModifiedStatusbarController::~ModifiedStatusbarController" );
}
void SAL_CALL
ModifiedStatusbarController::statusChanged(
const FeatureStateEvent &aFeatureState )
throw ( RuntimeException )
{
OSL_TRACE( "sbctlmodif::ModifiedStatusbarController::statusChanged" );
osl::ResettableMutexGuard aGuard( m_aMutex );
if ( aFeatureState.FeatureURL.Complete.equals( st_ModifiedStatusCmd ) )
{
OUString sTip;
if ( ( m_bModifiedStatusEnabled = aFeatureState.IsEnabled ) )
{
OUString aStrValue;
if ( aFeatureState.State >>= aStrValue )
{
m_bIsDocumentModified = aStrValue.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "*" ) );
}
if ( m_bIsDocumentModified )
sTip = C2U( "The document is modified. Double-click to save it" );
else
sTip = C2U( "The document is not modified." );
}
m_xStatusbarItem->setQuickHelpText( sTip );
m_xStatusbarItem->setAccessibleName( sTip );
m_xStatusbarItem->repaint( );
}
}
void SAL_CALL
ModifiedStatusbarController::initialize(
const Sequence< Any > &aArguments )
throw ( Exception, RuntimeException )
{
OSL_TRACE( "sbctlmodif::ModifiedStatusbarController::initialize" );
ModifiedStatusbarController_Base::initialize( aArguments );
osl::MutexGuard aGuard( m_aMutex );
m_aListenerMap.insert( URLToDispatchMap::value_type( st_ModifiedStatusCmd, Reference< XDispatch > ( ) ) );
}
void SAL_CALL
ModifiedStatusbarController::paint(
const Reference< XGraphics > &xGraphics,
const Rectangle &rOutputRectangle,
::sal_Int32 /*nStyle*/ )
throw ( RuntimeException )
{
OSL_TRACE( "sbctlmodif::ModifiedStatusbarController::paint" );
Reference< XGraphic > &xGraphic = StaticStatusGraphic::get( );
Reference< XStatusbarItem> xSbItem;
osl::ClearableMutexGuard aGuard( m_aMutex );
xSbItem = m_xStatusbarItem;
bool bEnabled = m_bModifiedStatusEnabled && m_bIsDocumentModified;
aGuard.clear( );
if ( !xSbItem.is() || !xGraphics.is() )
return;
if ( xGraphic.is() && xGraphic->getType() != GraphicType::EMPTY )
{
sal_Int32 nOffset = xSbItem->getOffset( );
Point aPos;
aPos.X = ( rOutputRectangle.Width + nOffset ) / 2 - st_GraphicSize.Width / 2;
aPos.Y = rOutputRectangle.Height / 2 - st_GraphicSize.Height / 2;
xGraphics->drawImage( rOutputRectangle.X + aPos.X,
rOutputRectangle.Y + aPos.Y,
st_GraphicSize.Width,
st_GraphicSize.Height,
bEnabled ? ImageDrawMode::NONE : ImageDrawMode::DISABLE,
xGraphic );
}
else
{
xGraphics->clear( rOutputRectangle );
}
}
void SAL_CALL
ModifiedStatusbarController::doubleClick(
const Point &/*aPos*/ )
throw ( RuntimeException )
{
OSL_TRACE( "sbctlmodif::ModifiedStatusbarController::doubleClick" );
osl::ClearableMutexGuard aGuard( m_aMutex );
if ( !m_bIsDocumentModified )
return;
aGuard.clear( );
static const Sequence< PropertyValue > aDummyArgs;
Execute( OUSTR_COMMAND_UNO_SAVE, aDummyArgs );
}
OUString SAL_CALL
ModifiedStatusbarController::getImplementationName( )
throw ( RuntimeException )
{
return getImplementationName_static( );
}
::sal_Bool SAL_CALL
ModifiedStatusbarController::supportsService(
const OUString &ServiceName )
throw ( RuntimeException )
{
const Sequence< OUString > &aServices = StaticSupportedServices::get( );
for ( const OUString *pService = aServices.getConstArray( ),
*pEnd = pService + aServices.getLength( );
pService != pEnd;
pService++ )
{
if ( pService->equals( ServiceName ) )
return sal_True;
}
return sal_False;
}
Sequence< OUString > SAL_CALL
ModifiedStatusbarController::getSupportedServiceNames( )
throw ( RuntimeException )
{
return getSupportedServiceNames_static( );
}
Reference< XInterface >
ModifiedStatusbarController::Create(
const Reference< XComponentContext > &rxContext )
throw ( Exception )
{
OSL_TRACE( "sbctlmodif::ModifiedStatusbarController::Create" );
return Reference< XInterface > ( static_cast < cppu::OWeakObject * > ( new ModifiedStatusbarController( rxContext ) ) );
}
Sequence< OUString >
ModifiedStatusbarController::getSupportedServiceNames_static( )
{
return StaticSupportedServices::get( );
}
OUString
ModifiedStatusbarController::getImplementationName_static( )
{
static OUString st_ImplName( RTL_CONSTASCII_USTRINGPARAM( STATUSBAR_CONTROLLER_IMPL_NAME ) );
return st_ImplName;
}