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