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