blob: 785c4aa670f012e140ffea9de9c6ed3f7d7331a6 [file] [log] [blame]
/**************************************************************
*
* 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_chart2.hxx"
#include "ShapeToolbarController.hxx"
#include <vos/mutex.hxx>
#include <comphelper/sequence.hxx>
#include <vcl/svapp.hxx>
#include <vcl/toolbox.hxx>
#include <toolkit/helper/vclunohelper.hxx>
#include <svx/svxids.hrc>
#include <svx/tbxcustomshapes.hxx>
using namespace com::sun::star;
using ::com::sun::star::uno::Reference;
using ::com::sun::star::uno::Sequence;
//.............................................................................
namespace chart
{
//.............................................................................
::rtl::OUString ShapeToolbarController::getImplementationName() throw (uno::RuntimeException)
{
return getImplementationName_Static();
}
::rtl::OUString ShapeToolbarController::getImplementationName_Static() throw (uno::RuntimeException)
{
return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.ShapeToolbarController" ) );
}
Sequence< ::rtl::OUString > ShapeToolbarController::getSupportedServiceNames_Static() throw (uno::RuntimeException)
{
Sequence< ::rtl::OUString > aSupported(1);
aSupported.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.ShapeToolbarController" ) );
return aSupported;
}
::sal_Bool ShapeToolbarController::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException)
{
return ::comphelper::existsValue( ServiceName, getSupportedServiceNames_Static() );
}
Sequence< ::rtl::OUString> ShapeToolbarController::getSupportedServiceNames() throw (uno::RuntimeException)
{
return getSupportedServiceNames_Static();
}
Reference< uno::XInterface > ShapeToolbarController::create( const Reference< uno::XComponentContext >& xContext )
{
return *( new ShapeToolbarController( Reference< lang::XMultiServiceFactory >( xContext->getServiceManager(), uno::UNO_QUERY ) ) );
}
ShapeToolbarController::ShapeToolbarController( const Reference< lang::XMultiServiceFactory >& rxFact )
:m_pToolbarController( NULL )
,m_nToolBoxId( 1 )
,m_nSlotId( 0 )
{
osl_incrementInterlockedCount( &m_refCount );
m_xServiceManager = rxFact;
osl_decrementInterlockedCount( &m_refCount );
}
ShapeToolbarController::~ShapeToolbarController()
{
}
// ::com::sun::star::uno::XInterface
uno::Any ShapeToolbarController::queryInterface( const uno::Type& rType ) throw (uno::RuntimeException)
{
uno::Any aReturn = ToolboxController::queryInterface( rType );
if ( !aReturn.hasValue() )
{
aReturn = ShapeToolbarController_Base::queryInterface( rType );
}
return aReturn;
}
void ShapeToolbarController::acquire() throw ()
{
ToolboxController::acquire();
}
void ShapeToolbarController::release() throw ()
{
ToolboxController::release();
}
// ::com::sun::star::lang::XInitialization
void ShapeToolbarController::initialize( const Sequence< uno::Any >& rArguments ) throw (uno::Exception, uno::RuntimeException)
{
ToolboxController::initialize( rArguments );
::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard( m_aMutex );
ToolBox* pToolBox = static_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ) );
if ( pToolBox )
{
const sal_uInt16 nCount = pToolBox->GetItemCount();
for ( sal_uInt16 nPos = 0; nPos < nCount; ++nPos )
{
const sal_uInt16 nItemId = pToolBox->GetItemId( nPos );
if ( pToolBox->GetItemCommand( nItemId ) == String( m_aCommandURL ) )
{
m_nToolBoxId = nItemId;
break;
}
}
if ( m_aCommandURL.equalsAscii( ".uno:BasicShapes" ) )
{
m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BasicShapes" ) ), sal_True ) );
m_nSlotId = SID_DRAWTBX_CS_BASIC;
m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) );
}
else if ( m_aCommandURL.equalsAscii( ".uno:SymbolShapes" ) )
{
m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SymbolShapes" ) ), sal_True ) );
m_nSlotId = SID_DRAWTBX_CS_SYMBOL;
m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) );
}
else if ( m_aCommandURL.equalsAscii( ".uno:ArrowShapes" ) )
{
m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ArrowShapes" ) ), sal_True ) );
m_nSlotId = SID_DRAWTBX_CS_ARROW;
m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox) );
}
else if ( m_aCommandURL.equalsAscii( ".uno:FlowChartShapes" ) )
{
m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FlowChartShapes" ) ), sal_True ) );
m_nSlotId = SID_DRAWTBX_CS_FLOWCHART;
m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) );
}
else if ( m_aCommandURL.equalsAscii( ".uno:CalloutShapes" ) )
{
m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CalloutShapes" ) ), sal_True ) );
m_nSlotId = SID_DRAWTBX_CS_CALLOUT;
m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) );
}
else if ( m_aCommandURL.equalsAscii( ".uno:StarShapes" ) )
{
m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StarShapes" ) ), sal_True ) );
m_nSlotId = SID_DRAWTBX_CS_STAR;
m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) );
}
for ( TCommandState::iterator aIter( m_aStates.begin() ); aIter != m_aStates.end(); ++aIter )
{
addStatusListener( aIter->first );
}
if ( m_pToolbarController.is() )
{
m_pToolbarController->initialize( rArguments );
}
// check if paste special is allowed, when not don't add DROPDOWN
pToolBox->SetItemBits( m_nToolBoxId, pToolBox->GetItemBits( m_nToolBoxId ) | TIB_DROPDOWN );
}
}
// ::com::sun::star::frame::XStatusListener
void ShapeToolbarController::statusChanged( const frame::FeatureStateEvent& Event ) throw ( uno::RuntimeException )
{
::osl::MutexGuard aGuard( m_aMutex );
TCommandState::iterator aFind = m_aStates.find( Event.FeatureURL.Complete );
if ( aFind != m_aStates.end() )
{
aFind->second = Event.IsEnabled;
if ( m_pToolbarController.is() )
{
sal_Bool bCheckmark = sal_False;
ToolBox& rTb = m_pToolbarController->GetToolBox();
for ( sal_uInt16 i = 0; i < rTb.GetItemCount(); ++i )
{
sal_uInt16 nId = rTb.GetItemId( i );
if ( nId == 0 )
{
continue;
}
::rtl::OUString aCmd = rTb.GetItemCommand( nId );
if ( aCmd == Event.FeatureURL.Complete )
{
rTb.EnableItem( nId, Event.IsEnabled );
if ( Event.State >>= bCheckmark )
{
rTb.CheckItem( nId, bCheckmark );
}
else
{
::rtl::OUString aItemText;
if ( Event.State >>= aItemText )
{
rTb.SetItemText( nId, aItemText );
}
}
}
}
}
}
}
// ::com::sun::star::frame::XToolbarController
Reference< awt::XWindow > ShapeToolbarController::createPopupWindow() throw (uno::RuntimeException)
{
::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard( m_aMutex );
Reference< awt::XWindow > xRet;
if ( m_pToolbarController.is() )
{
xRet = m_pToolbarController.getRef()->createPopupWindow();
}
return xRet;
}
// ::com::sun::star::frame::XSubToolbarController
::sal_Bool ShapeToolbarController::opensSubToolbar() throw (uno::RuntimeException)
{
return ( m_nSlotId == SID_DRAWTBX_CS_BASIC ||
m_nSlotId == SID_DRAWTBX_CS_SYMBOL ||
m_nSlotId == SID_DRAWTBX_CS_ARROW ||
m_nSlotId == SID_DRAWTBX_CS_FLOWCHART ||
m_nSlotId == SID_DRAWTBX_CS_CALLOUT ||
m_nSlotId == SID_DRAWTBX_CS_STAR );
}
::rtl::OUString ShapeToolbarController::getSubToolbarName() throw (uno::RuntimeException)
{
::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard(m_aMutex);
uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY );
if ( xSub.is() )
{
return xSub->getSubToolbarName();
}
return ::rtl::OUString();
}
void ShapeToolbarController::functionSelected( const ::rtl::OUString& rCommand ) throw (uno::RuntimeException)
{
::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard( m_aMutex );
uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY );
if ( xSub.is() )
{
m_aCommandURL = rCommand;
xSub->functionSelected( rCommand );
}
}
void ShapeToolbarController::updateImage() throw (uno::RuntimeException)
{
::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
::osl::MutexGuard aGuard( m_aMutex );
uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY );
if ( xSub.is() )
{
xSub->updateImage();
}
}
//.............................................................................
} // namespace chart
//.............................................................................