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_rptui.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 
getImplementationName()68 ::rtl::OUString SAL_CALL OToolboxController::getImplementationName() throw( RuntimeException )
69 {
70 	return getImplementationName_Static();
71 }
72 
73 //------------------------------------------------------------------------------
getImplementationName_Static()74 ::rtl::OUString OToolboxController::getImplementationName_Static() throw( RuntimeException )
75 {
76 	return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.report.comp.ReportToolboxController"));
77 }
78 //------------------------------------------------------------------------------
getSupportedServiceNames_Static(void)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 // -----------------------------------------------------------------------------
supportsService(const::rtl::OUString & ServiceName)86 ::sal_Bool SAL_CALL OToolboxController::supportsService( const ::rtl::OUString& ServiceName ) throw (uno::RuntimeException)
87 {
88     return ::comphelper::existsValue(ServiceName,getSupportedServiceNames_Static());
89 }
90 //-------------------------------------------------------------------------
getSupportedServiceNames()91 Sequence< ::rtl::OUString> SAL_CALL OToolboxController::getSupportedServiceNames() throw(RuntimeException)
92 {
93 	return getSupportedServiceNames_Static();
94 }
95 // -------------------------------------------------------------------------
create(Reference<XComponentContext> const & xContext)96 Reference< XInterface > OToolboxController::create(Reference< XComponentContext > const & xContext)
97 {
98 	return *(new OToolboxController(Reference< XMultiServiceFactory >(xContext->getServiceManager(),UNO_QUERY)));
99 }
100 // -----------------------------------------------------------------------------
DBG_NAME(rpt_OToolboxController)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 // -----------------------------------------------------------------------------
~OToolboxController()114 OToolboxController::~OToolboxController()
115 {
116     DBG_DTOR(rpt_OToolboxController,NULL);
117 }
118 // -----------------------------------------------------------------------------
119 // XInterface
queryInterface(const Type & _rType)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 // -----------------------------------------------------------------------------
acquire()128 void SAL_CALL OToolboxController::acquire() throw ()
129 {
130 	ToolboxController::acquire();
131 }
132 // -----------------------------------------------------------------------------
release()133 void SAL_CALL OToolboxController::release() throw ()
134 {
135 	ToolboxController::release();
136 }
137 // -----------------------------------------------------------------------------
initialize(const Sequence<Any> & _rArguments)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 // -----------------------------------------------------------------------------
statusChanged(const FeatureStateEvent & Event)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 // -----------------------------------------------------------------------------
createPopupWindow()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 // -----------------------------------------------------------------------------
opensSubToolbar()297 ::sal_Bool SAL_CALL OToolboxController::opensSubToolbar() throw (uno::RuntimeException)
298 {
299     return m_nSlotId == SID_DRAWTBX_CS_BASIC;
300 }
301 // -----------------------------------------------------------------------------
getSubToolbarName()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 // -----------------------------------------------------------------------------
functionSelected(const::rtl::OUString & rCommand)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 // -----------------------------------------------------------------------------
updateImage()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 // -----------------------------------------------------------------------------
createItemWindow(const uno::Reference<awt::XWindow> & _xParent)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