1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 24 // MARKER(update_precomp.py): autogen include statement, do not remove 25 #include "precompiled_chart2.hxx" 26 27 #include "ShapeToolbarController.hxx" 28 29 #include <vos/mutex.hxx> 30 #include <comphelper/sequence.hxx> 31 #include <vcl/svapp.hxx> 32 #include <vcl/toolbox.hxx> 33 #include <toolkit/helper/vclunohelper.hxx> 34 #include <svx/svxids.hrc> 35 #include <svx/tbxcustomshapes.hxx> 36 37 38 using namespace com::sun::star; 39 40 using ::com::sun::star::uno::Reference; 41 using ::com::sun::star::uno::Sequence; 42 43 //............................................................................. 44 namespace chart 45 { 46 //............................................................................. 47 48 ::rtl::OUString ShapeToolbarController::getImplementationName() throw (uno::RuntimeException) 49 { 50 return getImplementationName_Static(); 51 } 52 53 ::rtl::OUString ShapeToolbarController::getImplementationName_Static() throw (uno::RuntimeException) 54 { 55 return ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.chart2.ShapeToolbarController" ) ); 56 } 57 58 Sequence< ::rtl::OUString > ShapeToolbarController::getSupportedServiceNames_Static() throw (uno::RuntimeException) 59 { 60 Sequence< ::rtl::OUString > aSupported(1); 61 aSupported.getArray()[0] = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.chart2.ShapeToolbarController" ) ); 62 return aSupported; 63 } 64 65 ::sal_Bool ShapeToolbarController::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException) 66 { 67 return ::comphelper::existsValue( ServiceName, getSupportedServiceNames_Static() ); 68 } 69 70 Sequence< ::rtl::OUString> ShapeToolbarController::getSupportedServiceNames() throw (uno::RuntimeException) 71 { 72 return getSupportedServiceNames_Static(); 73 } 74 75 Reference< uno::XInterface > ShapeToolbarController::create( const Reference< uno::XComponentContext >& xContext ) 76 { 77 return *( new ShapeToolbarController( Reference< lang::XMultiServiceFactory >( xContext->getServiceManager(), uno::UNO_QUERY ) ) ); 78 } 79 80 ShapeToolbarController::ShapeToolbarController( const Reference< lang::XMultiServiceFactory >& rxFact ) 81 :m_pToolbarController( NULL ) 82 ,m_nToolBoxId( 1 ) 83 ,m_nSlotId( 0 ) 84 { 85 osl_incrementInterlockedCount( &m_refCount ); 86 m_xServiceManager = rxFact; 87 osl_decrementInterlockedCount( &m_refCount ); 88 } 89 90 ShapeToolbarController::~ShapeToolbarController() 91 { 92 } 93 94 // ::com::sun::star::uno::XInterface 95 uno::Any ShapeToolbarController::queryInterface( const uno::Type& rType ) throw (uno::RuntimeException) 96 { 97 uno::Any aReturn = ToolboxController::queryInterface( rType ); 98 if ( !aReturn.hasValue() ) 99 { 100 aReturn = ShapeToolbarController_Base::queryInterface( rType ); 101 } 102 return aReturn; 103 } 104 105 void ShapeToolbarController::acquire() throw () 106 { 107 ToolboxController::acquire(); 108 } 109 110 void ShapeToolbarController::release() throw () 111 { 112 ToolboxController::release(); 113 } 114 115 // ::com::sun::star::lang::XInitialization 116 void ShapeToolbarController::initialize( const Sequence< uno::Any >& rArguments ) throw (uno::Exception, uno::RuntimeException) 117 { 118 ToolboxController::initialize( rArguments ); 119 ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 120 ::osl::MutexGuard aGuard( m_aMutex ); 121 122 ToolBox* pToolBox = static_cast< ToolBox* >( VCLUnoHelper::GetWindow( getParent() ) ); 123 if ( pToolBox ) 124 { 125 const sal_uInt16 nCount = pToolBox->GetItemCount(); 126 for ( sal_uInt16 nPos = 0; nPos < nCount; ++nPos ) 127 { 128 const sal_uInt16 nItemId = pToolBox->GetItemId( nPos ); 129 if ( pToolBox->GetItemCommand( nItemId ) == String( m_aCommandURL ) ) 130 { 131 m_nToolBoxId = nItemId; 132 break; 133 } 134 } 135 if ( m_aCommandURL.equalsAscii( ".uno:BasicShapes" ) ) 136 { 137 m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:BasicShapes" ) ), sal_True ) ); 138 m_nSlotId = SID_DRAWTBX_CS_BASIC; 139 m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); 140 } 141 else if ( m_aCommandURL.equalsAscii( ".uno:SymbolShapes" ) ) 142 { 143 m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:SymbolShapes" ) ), sal_True ) ); 144 m_nSlotId = SID_DRAWTBX_CS_SYMBOL; 145 m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); 146 } 147 else if ( m_aCommandURL.equalsAscii( ".uno:ArrowShapes" ) ) 148 { 149 m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:ArrowShapes" ) ), sal_True ) ); 150 m_nSlotId = SID_DRAWTBX_CS_ARROW; 151 m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox) ); 152 } 153 else if ( m_aCommandURL.equalsAscii( ".uno:FlowChartShapes" ) ) 154 { 155 m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:FlowChartShapes" ) ), sal_True ) ); 156 m_nSlotId = SID_DRAWTBX_CS_FLOWCHART; 157 m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); 158 } 159 else if ( m_aCommandURL.equalsAscii( ".uno:CalloutShapes" ) ) 160 { 161 m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:CalloutShapes" ) ), sal_True ) ); 162 m_nSlotId = SID_DRAWTBX_CS_CALLOUT; 163 m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); 164 } 165 else if ( m_aCommandURL.equalsAscii( ".uno:StarShapes" ) ) 166 { 167 m_aStates.insert( TCommandState::value_type( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( ".uno:StarShapes" ) ), sal_True ) ); 168 m_nSlotId = SID_DRAWTBX_CS_STAR; 169 m_pToolbarController = TToolbarHelper::createFromQuery( new SvxTbxCtlCustomShapes( m_nSlotId, m_nToolBoxId, *pToolBox ) ); 170 } 171 172 for ( TCommandState::iterator aIter( m_aStates.begin() ); aIter != m_aStates.end(); ++aIter ) 173 { 174 addStatusListener( aIter->first ); 175 } 176 177 if ( m_pToolbarController.is() ) 178 { 179 m_pToolbarController->initialize( rArguments ); 180 } 181 182 // check if paste special is allowed, when not don't add DROPDOWN 183 pToolBox->SetItemBits( m_nToolBoxId, pToolBox->GetItemBits( m_nToolBoxId ) | TIB_DROPDOWN ); 184 } 185 } 186 187 // ::com::sun::star::frame::XStatusListener 188 void ShapeToolbarController::statusChanged( const frame::FeatureStateEvent& Event ) throw ( uno::RuntimeException ) 189 { 190 ::osl::MutexGuard aGuard( m_aMutex ); 191 TCommandState::iterator aFind = m_aStates.find( Event.FeatureURL.Complete ); 192 if ( aFind != m_aStates.end() ) 193 { 194 aFind->second = Event.IsEnabled; 195 if ( m_pToolbarController.is() ) 196 { 197 sal_Bool bCheckmark = sal_False; 198 ToolBox& rTb = m_pToolbarController->GetToolBox(); 199 200 for ( sal_uInt16 i = 0; i < rTb.GetItemCount(); ++i ) 201 { 202 sal_uInt16 nId = rTb.GetItemId( i ); 203 if ( nId == 0 ) 204 { 205 continue; 206 } 207 ::rtl::OUString aCmd = rTb.GetItemCommand( nId ); 208 if ( aCmd == Event.FeatureURL.Complete ) 209 { 210 rTb.EnableItem( nId, Event.IsEnabled ); 211 if ( Event.State >>= bCheckmark ) 212 { 213 rTb.CheckItem( nId, bCheckmark ); 214 } 215 else 216 { 217 ::rtl::OUString aItemText; 218 if ( Event.State >>= aItemText ) 219 { 220 rTb.SetItemText( nId, aItemText ); 221 } 222 } 223 } 224 } 225 } 226 } 227 } 228 229 // ::com::sun::star::frame::XToolbarController 230 Reference< awt::XWindow > ShapeToolbarController::createPopupWindow() throw (uno::RuntimeException) 231 { 232 ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 233 ::osl::MutexGuard aGuard( m_aMutex ); 234 235 Reference< awt::XWindow > xRet; 236 if ( m_pToolbarController.is() ) 237 { 238 xRet = m_pToolbarController.getRef()->createPopupWindow(); 239 } 240 241 return xRet; 242 } 243 244 // ::com::sun::star::frame::XSubToolbarController 245 ::sal_Bool ShapeToolbarController::opensSubToolbar() throw (uno::RuntimeException) 246 { 247 return ( m_nSlotId == SID_DRAWTBX_CS_BASIC || 248 m_nSlotId == SID_DRAWTBX_CS_SYMBOL || 249 m_nSlotId == SID_DRAWTBX_CS_ARROW || 250 m_nSlotId == SID_DRAWTBX_CS_FLOWCHART || 251 m_nSlotId == SID_DRAWTBX_CS_CALLOUT || 252 m_nSlotId == SID_DRAWTBX_CS_STAR ); 253 } 254 255 ::rtl::OUString ShapeToolbarController::getSubToolbarName() throw (uno::RuntimeException) 256 { 257 ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 258 ::osl::MutexGuard aGuard(m_aMutex); 259 uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY ); 260 if ( xSub.is() ) 261 { 262 return xSub->getSubToolbarName(); 263 } 264 return ::rtl::OUString(); 265 } 266 267 void ShapeToolbarController::functionSelected( const ::rtl::OUString& rCommand ) throw (uno::RuntimeException) 268 { 269 ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 270 ::osl::MutexGuard aGuard( m_aMutex ); 271 272 uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY ); 273 if ( xSub.is() ) 274 { 275 m_aCommandURL = rCommand; 276 xSub->functionSelected( rCommand ); 277 } 278 } 279 280 void ShapeToolbarController::updateImage() throw (uno::RuntimeException) 281 { 282 ::vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 283 ::osl::MutexGuard aGuard( m_aMutex ); 284 285 uno::Reference< frame::XSubToolbarController > xSub( m_pToolbarController.getRef(), uno::UNO_QUERY ); 286 if ( xSub.is() ) 287 { 288 xSub->updateImage(); 289 } 290 } 291 292 //............................................................................. 293 } // namespace chart 294 //............................................................................. 295