xref: /trunk/main/reportdesign/source/ui/misc/toolboxcontroller.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
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