sdk-examples/trunk/cpp/components/StatusbarController/SelectionModeStatusbarController/SelectionModeStatusbarController.cxx (203 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 "SelectionModeStatusbarController.hxx"
#include "macros.hxx"
#include "defines.hxx"
#include <com/sun/star/beans/NamedValue.hpp>
#include <com/sun/star/awt/Command.hpp>
#include <com/sun/star/awt/XPopupMenu.hpp>
#include <com/sun/star/awt/PopupMenuDirection.hpp>
#include <map>
using namespace framework::statusbar_controller_selectionmode;
using namespace com::sun::star::uno;
using namespace com::sun::star::awt;
using namespace com::sun::star::frame;
using namespace com::sun::star::beans;
using rtl::OUString;
namespace
{
static OUString st_SelectionModeCmd = OUSTR_COMMAND_UNO_SELMODE;
typedef std::pair< OUString, OUString > SelectionInfo;
typedef std::map< SelectionMode, SelectionInfo > SelectionMap;
struct StaticSelectionMapInit
{
SelectionMap *
operator()()
{
static SelectionMap aMap;
lcl_InitMap( aMap );
return &aMap;
}
private:
void lcl_InitMap( SelectionMap &aMap )
{
aMap.insert( SelectionMap::value_type( SEL_MODE_STD, SelectionInfo( C2U( "STD" ), C2U( "Standard selection mode" ) ) ) );
aMap.insert( SelectionMap::value_type( SEL_MODE_EXT, SelectionInfo( C2U( "EXT" ), C2U( "Extended selection mode" ) ) ) );
aMap.insert( SelectionMap::value_type( SEL_MODE_ADD, SelectionInfo( C2U( "ADD" ), C2U( "Additional selection mode" ) ) ) );
aMap.insert( SelectionMap::value_type( SEL_MODE_BLK, SelectionInfo( C2U( "BLK" ), C2U( "Block selection mode" ) ) ) );
}
};
struct StaticSelectionModeInfo
: public rtl::StaticAggregate< SelectionMap, StaticSelectionMapInit > {};
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;
}
};
}
SelectionModeStatusbarController::SelectionModeStatusbarController(
const Reference< XComponentContext> &rxContext )
: SelectionModeStatusbarController_Base()
, m_bEnabled( false )
, m_bSelectionModeEnabled( false )
, m_eSelectionMode( SEL_MODE_STD )
{
OSL_TRACE( "sbctlselmode::SelectionModeStatusbarController::SelectionModeStatusbarController" );
m_xContext = rxContext;
}
SelectionModeStatusbarController::~SelectionModeStatusbarController( )
{
OSL_TRACE( "sbctlselmode::SelectionModeStatusbarController::~SelectionModeStatusbarController" );
}
void SAL_CALL
SelectionModeStatusbarController::statusChanged(
const FeatureStateEvent &aFeatureState )
throw ( RuntimeException )
{
OSL_TRACE( "sbctlselmode::SelectionModeStatusbarController::statusChanged" );
osl::ResettableMutexGuard aGuard( m_aMutex );
if ( aFeatureState.FeatureURL.Complete.equals( st_SelectionModeCmd ) )
{
if ( ( m_bSelectionModeEnabled = aFeatureState.IsEnabled ) )
{
sal_Int32 nValue( 0 );
aFeatureState.State >>= nValue;
m_eSelectionMode = SelectionMode( nValue );
const SelectionMap &aSelInfoMap = *StaticSelectionModeInfo::get();
const SelectionMap::const_iterator it = aSelInfoMap.find( m_eSelectionMode );
if ( it != aSelInfoMap.end() )
{
const SelectionInfo &aInfo = it->second;
m_xStatusbarItem->setText( aInfo.first );
m_xStatusbarItem->setQuickHelpText( aInfo.second );
m_xStatusbarItem->setAccessibleName( aInfo.second );
}
}
}
}
void SAL_CALL
SelectionModeStatusbarController::initialize(
const Sequence< Any > &aArguments )
throw ( Exception, RuntimeException )
{
SelectionModeStatusbarController_Base::initialize( aArguments );
osl::MutexGuard aGuard( m_aMutex );
m_aListenerMap.insert( URLToDispatchMap::value_type( st_SelectionModeCmd, Reference< XDispatch >() ) );
}
void SAL_CALL
SelectionModeStatusbarController::command(
const Point &aPos,
::sal_Int32 nCommand,
::sal_Bool /*bMouseEvent*/,
const Any &/*aData*/ )
throw ( RuntimeException )
{
if ( nCommand & Command::CONTEXTMENU )
{
ExecutePopupMenu( aPos );
}
}
void SAL_CALL
SelectionModeStatusbarController::click( const Point &aPos )
throw ( RuntimeException )
{
ExecutePopupMenu( aPos );
}
void SelectionModeStatusbarController::ExecutePopupMenu( const Point &aPos )
{
osl::ClearableMutexGuard aGuard( m_aMutex );
if ( !m_bSelectionModeEnabled || !m_xFrame.is() )
return;
try
{
Reference< XPopupMenu > xPopupMenu(
m_xContext->getServiceManager()->createInstanceWithContext(
OUSTR_SERVICENAME_POPUPMENU, m_xContext ),
UNO_QUERY );
if ( !xPopupMenu.is() )
return;
const SelectionMap &aMap = *StaticSelectionModeInfo::get();
sal_Int16 nPos = 0;
const sal_Int16 nIdOffset = 100;
for ( SelectionMap::const_iterator it = aMap.begin(); it != aMap.end(); nPos++, it++ )
{
const SelectionMode eMode = it->first;
const SelectionInfo &aInfo = it->second;
xPopupMenu->insertItem( nIdOffset + sal_Int16( eMode ), aInfo.second, 0, nPos );
}
xPopupMenu->checkItem( nIdOffset + m_eSelectionMode, sal_True );
Reference< XWindowPeer > xParent( m_xStatusbarWindow, UNO_QUERY );
const sal_Int16 nSelId = xPopupMenu->execute( xParent, aPos, PopupMenuDirection::EXECUTE_UP );
if ( nSelId )
{
Sequence< PropertyValue > aArgs( 1 );
aArgs[0].Name = C2U( "SelectionMode" );
aArgs[0].Value <<= sal_Int32( nSelId - nIdOffset );
Execute( st_SelectionModeCmd, aArgs );
}
}
catch ( ... )
{}
}
OUString SAL_CALL
SelectionModeStatusbarController::getImplementationName( )
throw ( RuntimeException )
{
return getImplementationName_static();
}
::sal_Bool SAL_CALL
SelectionModeStatusbarController::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
SelectionModeStatusbarController::getSupportedServiceNames( )
throw ( RuntimeException )
{
return getSupportedServiceNames_static();
}
Reference< XInterface >
SelectionModeStatusbarController::Create(
const Reference< XComponentContext > &rxContext )
throw ( Exception )
{
OSL_TRACE( "sbctlselmode::SelectionModeStatusbarController::Create" );
return Reference< XInterface >( static_cast< cppu::OWeakObject *>( new SelectionModeStatusbarController( rxContext ) ) );
}
Sequence< OUString >
SelectionModeStatusbarController::getSupportedServiceNames_static( )
{
return StaticSupportedServices::get();
}
OUString
SelectionModeStatusbarController::getImplementationName_static( )
{
static OUString st_ImplName( RTL_CONSTASCII_USTRINGPARAM( STATUSBAR_CONTROLLER_IMPL_NAME ) );
return st_ImplName;
}