1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #include "precompiled_reportdesign.hxx" 28 #include "toolboxcontroller.hxx" 29 #include <com/sun/star/ui/ImageType.hpp> 30 #include <com/sun/star/frame/XDispatchProvider.hpp> 31 #include <com/sun/star/beans/PropertyValue.hpp> 32 #include <toolkit/helper/vclunohelper.hxx> 33 #include <vcl/menu.hxx> 34 #include <com/sun/star/ui/XUIConfigurationManager.hpp> 35 #include <com/sun/star/ui/XModuleUIConfigurationManagerSupplier.hpp> 36 #include <com/sun/star/ui/XImageManager.hpp> 37 #include <com/sun/star/ui/ImageType.hpp> 38 #include <com/sun/star/graphic/XGraphic.hpp> 39 #include <com/sun/star/util/Color.hpp> 40 #include <vcl/svapp.hxx> 41 #include <vcl/toolbox.hxx> 42 #include <svtools/miscopt.hxx> 43 #include <unotools/moduleoptions.hxx> 44 #include <svtools/menuoptions.hxx> 45 #include <vos/mutex.hxx> 46 #include <svx/svxids.hrc> 47 #define ITEMID_COLOR 1 48 #define ITEMID_BRUSH 2 49 #define ITEMID_FONT 3 50 #define ITEMID_FONTHEIGHT 4 51 #include <editeng/fontitem.hxx> 52 #include <editeng/fhgtitem.hxx> 53 #include <svx/tbcontrl.hxx> 54 #include <editeng/colritem.hxx> 55 #include <svx/tbxcustomshapes.hxx> 56 57 #include <comphelper/sequence.hxx> 58 59 #include <memory> 60 61 namespace rptui 62 { 63 using namespace svt; 64 using namespace com::sun::star; 65 using namespace com::sun::star::uno; 66 using namespace com::sun::star::beans; 67 using namespace com::sun::star::lang; 68 using namespace frame; 69 using namespace util; 70 using namespace ui; 71 72 ::rtl::OUString SAL_CALL OToolboxController::getImplementationName() throw( RuntimeException ) 73 { 74 return getImplementationName_Static(); 75 } 76 77 //------------------------------------------------------------------------------ 78 ::rtl::OUString OToolboxController::getImplementationName_Static() throw( RuntimeException ) 79 { 80 return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.comp.ReportToolboxController")); 81 } 82 //------------------------------------------------------------------------------ 83 Sequence< ::rtl::OUString> OToolboxController::getSupportedServiceNames_Static(void) throw( RuntimeException ) 84 { 85 Sequence< ::rtl::OUString> aSupported(1); 86 aSupported.getArray()[0] = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.ReportToolboxController")); 87 return aSupported; 88 } 89 // ----------------------------------------------------------------------------- 90 ::sal_Bool SAL_CALL OToolboxController::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException) 91 { 92 return ::comphelper::existsValue(ServiceName,getSupportedServiceNames_Static()); 93 } 94 //------------------------------------------------------------------------- 95 Sequence< ::rtl::OUString> SAL_CALL OToolboxController::getSupportedServiceNames() throw(RuntimeException) 96 { 97 return getSupportedServiceNames_Static(); 98 } 99 // ------------------------------------------------------------------------- 100 Reference< XInterface > OToolboxController::create(Reference< XComponentContext > const & xContext) 101 { 102 return *(new OToolboxController(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY))); 103 } 104 // ----------------------------------------------------------------------------- 105 DBG_NAME(rpt_OToolboxController) 106 OToolboxController::OToolboxController(const Reference< XMultiServiceFactory >& _rxORB) 107 : m_pToolbarController(NULL) 108 ,m_nToolBoxId(1) 109 ,m_nSlotId(0) 110 { 111 DBG_CTOR(rpt_OToolboxController,NULL); 112 osl_incrementInterlockedCount(&m_refCount); 113 m_xServiceManager = _rxORB; 114 osl_decrementInterlockedCount(&m_refCount); 115 116 } 117 // ----------------------------------------------------------------------------- 118 OToolboxController::~OToolboxController() 119 { 120 DBG_DTOR(rpt_OToolboxController,NULL); 121 } 122 // ----------------------------------------------------------------------------- 123 // XInterface 124 Any SAL_CALL OToolboxController::queryInterface( const Type& _rType ) throw (RuntimeException) 125 { 126 Any aReturn = ToolboxController::queryInterface(_rType); 127 if (!aReturn.hasValue()) 128 aReturn = TToolboxController_BASE::queryInterface(_rType); 129 return aReturn; 130 } 131 // ----------------------------------------------------------------------------- 132 void SAL_CALL OToolboxController::acquire() throw () 133 { 134 ToolboxController::acquire(); 135 } 136 // ----------------------------------------------------------------------------- 137 void SAL_CALL OToolboxController::release() throw () 138 { 139 ToolboxController::release(); 140 } 141 // ----------------------------------------------------------------------------- 142 void SAL_CALL OToolboxController::initialize( const Sequence< Any >& _rArguments ) throw (Exception, RuntimeException) 143 { 144 ToolboxController::initialize(_rArguments); 145 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 146 ::osl::MutexGuard aGuard(m_aMutex); 147 148 ToolBox* pToolBox = static_cast<ToolBox*>(VCLUnoHelper::GetWindow(getParent())); 149 if ( pToolBox ) 150 { 151 const sal_uInt16 nCount = pToolBox->GetItemCount(); 152 for (sal_uInt16 nPos = 0; nPos < nCount; ++nPos) 153 { 154 const sal_uInt16 nItemId = pToolBox->GetItemId(nPos); 155 if ( pToolBox->GetItemCommand(nItemId) == String(m_aCommandURL) ) 156 { 157 m_nToolBoxId = nItemId; 158 break; 159 } 160 } 161 if ( m_aCommandURL.equalsAscii(".uno:BasicShapes") ) 162 { 163 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:BasicShapes")),sal_True)); 164 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxTbxCtlCustomShapes(m_nSlotId = SID_DRAWTBX_CS_BASIC,m_nToolBoxId,*pToolBox)); 165 } 166 else if ( m_aCommandURL.equalsAscii(".uno:SymbolShapes") ) 167 { 168 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:SymbolShapes")),sal_True)); 169 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxTbxCtlCustomShapes(m_nSlotId = SID_DRAWTBX_CS_SYMBOL,m_nToolBoxId,*pToolBox)); 170 } 171 else if ( m_aCommandURL.equalsAscii(".uno:ArrowShapes") ) 172 { 173 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:ArrowShapes")),sal_True)); 174 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxTbxCtlCustomShapes(m_nSlotId = SID_DRAWTBX_CS_ARROW,m_nToolBoxId,*pToolBox)); 175 } 176 else if ( m_aCommandURL.equalsAscii(".uno:FlowChartShapes") ) 177 { 178 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:FlowChartShapes")),sal_True)); 179 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxTbxCtlCustomShapes(m_nSlotId = SID_DRAWTBX_CS_FLOWCHART,m_nToolBoxId,*pToolBox)); 180 } 181 else if ( m_aCommandURL.equalsAscii(".uno:CalloutShapes") ) 182 { 183 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:CalloutShapes")),sal_True)); 184 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxTbxCtlCustomShapes(m_nSlotId = SID_DRAWTBX_CS_CALLOUT,m_nToolBoxId,*pToolBox)); 185 } 186 else if ( m_aCommandURL.equalsAscii(".uno:StarShapes") ) 187 { 188 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:StarShapes")),sal_True)); 189 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxTbxCtlCustomShapes(m_nSlotId = SID_DRAWTBX_CS_STAR,m_nToolBoxId,*pToolBox)); 190 } 191 else if ( m_aCommandURL.equalsAscii(".uno:CharFontName") ) 192 { 193 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:CharFontName")),sal_True)); 194 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxFontNameToolBoxControl/*SvxStyleToolBoxControl*/(m_nSlotId = SID_ATTR_CHAR_FONT,m_nToolBoxId,*pToolBox)); 195 } 196 else if ( m_aCommandURL.equalsAscii(".uno:FontColor") || m_aCommandURL.equalsAscii(".uno:Color") ) 197 { 198 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:FontColor")),sal_True)); 199 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:Color")),sal_True)); 200 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxFontColorExtToolBoxControl/*SvxFontColorToolBoxControl*/(m_nSlotId = SID_ATTR_CHAR_COLOR2,m_nToolBoxId,*pToolBox)); 201 } 202 else 203 { 204 m_aStates.insert(TCommandState::value_type(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".uno:BackgroundColor")),sal_True)); 205 m_pToolbarController = TToolbarHelper::createFromQuery(new SvxColorToolBoxControl(m_nSlotId = SID_BACKGROUND_COLOR,m_nToolBoxId,*pToolBox)); 206 } 207 208 TCommandState::iterator aIter = m_aStates.begin(); 209 for (; aIter != m_aStates.end(); ++aIter) 210 addStatusListener(aIter->first); 211 212 if ( m_pToolbarController.is() ) 213 m_pToolbarController->initialize(_rArguments); 214 // check if paste special is allowed, when not don't add DROPDOWN 215 pToolBox->SetItemBits(m_nToolBoxId,pToolBox->GetItemBits(m_nToolBoxId) | TIB_DROPDOWN); 216 } 217 } 218 // ----------------------------------------------------------------------------- 219 void SAL_CALL OToolboxController::statusChanged( const FeatureStateEvent& Event ) throw ( RuntimeException ) 220 { 221 ::osl::MutexGuard aGuard(m_aMutex); 222 TCommandState::iterator aFind = m_aStates.find( Event.FeatureURL.Complete ); 223 if ( aFind != m_aStates.end() ) 224 { 225 aFind->second = Event.IsEnabled; 226 if ( m_pToolbarController.is() ) 227 { 228 // All other status events will be processed here 229 sal_Bool bSetCheckmark = sal_False; 230 sal_Bool bCheckmark = sal_False; 231 //m_pToolbarController->GetToolBox().Enable(Event.IsEnabled); 232 ToolBox& rTb = m_pToolbarController->GetToolBox(); 233 for ( sal_uInt16 i = 0; i < rTb.GetItemCount(); i++ ) 234 { 235 sal_uInt16 nId = rTb.GetItemId( i ); 236 if ( nId == 0 ) 237 continue; 238 239 rtl::OUString aCmd = rTb.GetItemCommand( nId ); 240 if ( aCmd == Event.FeatureURL.Complete ) 241 { 242 // Enable/disable item 243 rTb.EnableItem( nId, Event.IsEnabled ); 244 245 // Checkmark 246 if ( Event.State >>= bCheckmark ) 247 bSetCheckmark = sal_True; 248 249 if ( bSetCheckmark ) 250 rTb.CheckItem( nId, bCheckmark ); 251 else 252 { 253 rtl::OUString aItemText; 254 255 if ( Event.State >>= aItemText ) 256 rTb.SetItemText( nId, aItemText ); 257 } 258 } 259 } 260 261 switch(m_nSlotId) 262 { 263 case SID_ATTR_CHAR_COLOR2: 264 case SID_BACKGROUND_COLOR: 265 { 266 util::Color nColor(COL_TRANSPARENT); 267 Event.State >>= nColor; 268 ::Color aGcc3WorkaroundTemporary( nColor); 269 SvxColorItem aColorItem(aGcc3WorkaroundTemporary,1); 270 if ( SID_ATTR_CHAR_COLOR2 == m_nSlotId ) 271 static_cast<SvxFontColorExtToolBoxControl*>(m_pToolbarController.get())->StateChanged(m_nSlotId,Event.IsEnabled ? SFX_ITEM_SET : SFX_ITEM_DISABLED,&aColorItem); 272 else 273 static_cast<SvxColorToolBoxControl*>(m_pToolbarController.get())->StateChanged(m_nSlotId,Event.IsEnabled ? SFX_ITEM_SET : SFX_ITEM_DISABLED,&aColorItem); 274 } 275 break; 276 case SID_ATTR_CHAR_FONT: 277 { 278 SvxFontItem aItem(ITEMID_FONT); 279 aItem.PutValue(Event.State); 280 static_cast<SvxFontNameToolBoxControl*>(m_pToolbarController.get())->StateChanged(m_nSlotId,Event.IsEnabled ? SFX_ITEM_AVAILABLE : SFX_ITEM_DISABLED,&aItem); 281 } 282 break; 283 } 284 } 285 } 286 } 287 // ----------------------------------------------------------------------------- 288 Reference< awt::XWindow > SAL_CALL OToolboxController::createPopupWindow() throw (RuntimeException) 289 { 290 // execute the menu 291 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 292 ::osl::MutexGuard aGuard(m_aMutex); 293 294 Reference< awt::XWindow > xRet; 295 if ( m_pToolbarController.is() ) 296 xRet = m_pToolbarController.getRef()->createPopupWindow(); 297 298 return xRet; 299 } 300 // ----------------------------------------------------------------------------- 301 ::sal_Bool SAL_CALL OToolboxController::opensSubToolbar() throw (uno::RuntimeException) 302 { 303 return m_nSlotId == SID_DRAWTBX_CS_BASIC; 304 } 305 // ----------------------------------------------------------------------------- 306 ::rtl::OUString SAL_CALL OToolboxController::getSubToolbarName() throw (uno::RuntimeException) 307 { 308 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 309 ::osl::MutexGuard aGuard(m_aMutex); 310 uno::Reference< frame::XSubToolbarController> xSub(m_pToolbarController.getRef(),uno::UNO_QUERY); 311 if ( xSub.is() ) 312 return xSub->getSubToolbarName(); 313 return ::rtl::OUString(); 314 } 315 // ----------------------------------------------------------------------------- 316 void SAL_CALL OToolboxController::functionSelected( const ::rtl::OUString& rCommand ) throw (uno::RuntimeException) 317 { 318 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 319 ::osl::MutexGuard aGuard(m_aMutex); 320 321 uno::Reference< frame::XSubToolbarController> xSub(m_pToolbarController.getRef(),uno::UNO_QUERY); 322 if ( xSub.is() ) 323 { 324 xSub->functionSelected(m_aCommandURL = rCommand); 325 } 326 } 327 // ----------------------------------------------------------------------------- 328 void SAL_CALL OToolboxController::updateImage( ) throw (uno::RuntimeException) 329 { 330 vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() ); 331 ::osl::MutexGuard aGuard(m_aMutex); 332 333 uno::Reference< frame::XSubToolbarController> xSub(m_pToolbarController.getRef(),uno::UNO_QUERY); 334 if ( xSub.is() ) 335 xSub->updateImage(); 336 } 337 // ----------------------------------------------------------------------------- 338 uno::Reference< awt::XWindow > SAL_CALL OToolboxController::createItemWindow( const uno::Reference< awt::XWindow >& _xParent) 339 throw (uno::RuntimeException) 340 { 341 uno::Reference< awt::XWindow > xWindow; 342 if ( m_pToolbarController.is() ) 343 { 344 switch(m_nSlotId) 345 { 346 case SID_ATTR_CHAR_FONT: 347 xWindow = VCLUnoHelper::GetInterface(static_cast<SvxFontNameToolBoxControl*>(m_pToolbarController.get())->CreateItemWindow(VCLUnoHelper::GetWindow(_xParent))); 348 break; 349 default: 350 ; 351 } 352 } 353 return xWindow; 354 } 355 // ----------------------------------------------------------------------------- 356 //.......................................................................... 357 } // rptui 358 //.......................................................................... 359 360 361