Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 :
21 : #include "navbarcontrol.hxx"
22 : #include "frm_strings.hxx"
23 : #include "FormComponent.hxx"
24 : #include "componenttools.hxx"
25 : #include "navtoolbar.hxx"
26 : #include "commandimageprovider.hxx"
27 : #include "commanddescriptionprovider.hxx"
28 :
29 : #include <com/sun/star/awt/XView.hpp>
30 : #include <com/sun/star/awt/PosSize.hpp>
31 : #include <com/sun/star/form/runtime/FormFeature.hpp>
32 : #include <com/sun/star/awt/XControlModel.hpp>
33 : #include <com/sun/star/graphic/XGraphic.hpp>
34 :
35 : #include <comphelper/processfactory.hxx>
36 : #include <tools/debug.hxx>
37 : #include <tools/diagnose_ex.h>
38 : #include <vcl/svapp.hxx>
39 : #include <vcl/settings.hxx>
40 :
41 :
42 : namespace frm
43 : {
44 :
45 : using namespace ::com::sun::star::uno;
46 : using namespace ::com::sun::star::beans;
47 : using namespace ::com::sun::star::awt;
48 : using namespace ::com::sun::star::lang;
49 : using namespace ::com::sun::star::frame;
50 : using namespace ::com::sun::star::graphic;
51 : namespace FormFeature = ::com::sun::star::form::runtime::FormFeature;
52 :
53 : #define FORWARD_TO_PEER_1( unoInterface, method, param1 ) \
54 : Reference< unoInterface > xTypedPeer( getPeer(), UNO_QUERY ); \
55 : if ( xTypedPeer.is() ) \
56 : { \
57 : xTypedPeer->method( param1 ); \
58 : }
59 :
60 10 : ONavigationBarControl::ONavigationBarControl( const Reference< XComponentContext >& _rxORB)
61 10 : :UnoControl(), m_xContext(_rxORB)
62 : {
63 10 : }
64 :
65 :
66 20 : ONavigationBarControl::~ONavigationBarControl()
67 : {
68 20 : }
69 :
70 :
71 0 : IMPLEMENT_FORWARD_XTYPEPROVIDER2( ONavigationBarControl, UnoControl, ONavigationBarControl_Base )
72 :
73 :
74 1154 : Any SAL_CALL ONavigationBarControl::queryAggregation( const Type& _rType ) throw ( RuntimeException, std::exception )
75 : {
76 1154 : Any aReturn = UnoControl::queryAggregation( _rType );
77 :
78 1154 : if ( !aReturn.hasValue() )
79 9 : aReturn = ONavigationBarControl_Base::queryInterface( _rType );
80 :
81 1154 : return aReturn;
82 : }
83 :
84 :
85 : namespace
86 : {
87 :
88 18 : static WinBits lcl_getWinBits_nothrow( const Reference< XControlModel >& _rxModel )
89 : {
90 18 : WinBits nBits = 0;
91 : try
92 : {
93 18 : Reference< XPropertySet > xProps( _rxModel, UNO_QUERY );
94 18 : if ( xProps.is() )
95 : {
96 18 : sal_Int16 nBorder = 0;
97 18 : xProps->getPropertyValue( PROPERTY_BORDER ) >>= nBorder;
98 18 : if ( nBorder )
99 9 : nBits |= WB_BORDER;
100 :
101 18 : bool bTabStop = false;
102 18 : if ( xProps->getPropertyValue( PROPERTY_TABSTOP ) >>= bTabStop )
103 0 : nBits |= ( bTabStop ? WB_TABSTOP : WB_NOTABSTOP );
104 18 : }
105 : }
106 0 : catch( const Exception& )
107 : {
108 : DBG_UNHANDLED_EXCEPTION();
109 : }
110 18 : return nBits;
111 : }
112 : }
113 :
114 :
115 19 : void SAL_CALL ONavigationBarControl::createPeer( const Reference< XToolkit >& /*_rToolkit*/, const Reference< XWindowPeer >& _rParentPeer ) throw( RuntimeException, std::exception )
116 : {
117 19 : SolarMutexGuard aGuard;
118 :
119 19 : if (!getPeer().is())
120 : {
121 18 : mbCreatingPeer = true;
122 :
123 : // determine the VLC window for the parent
124 18 : vcl::Window* pParentWin = NULL;
125 18 : if ( _rParentPeer.is() )
126 : {
127 18 : VCLXWindow* pParentXWin = VCLXWindow::GetImplementation( _rParentPeer );
128 18 : if ( pParentXWin )
129 18 : pParentWin = pParentXWin->GetWindow();
130 : DBG_ASSERT( pParentWin, "ONavigationBarControl::createPeer: could not obtain the VCL-level parent window!" );
131 : }
132 :
133 : // create the peer
134 18 : ONavigationBarPeer* pPeer = ONavigationBarPeer::Create( m_xContext, pParentWin, getModel() );
135 : assert(pPeer && "ONavigationBarControl::createPeer: invalid peer returned!");
136 : // by definition, the returned component is acquired once
137 18 : pPeer->release();
138 :
139 : // announce the peer to the base class
140 18 : setPeer( pPeer );
141 :
142 : // initialize ourself (and thus the peer) with the model properties
143 18 : updateFromModel();
144 :
145 18 : Reference< XView > xPeerView( getPeer(), UNO_QUERY );
146 18 : if ( xPeerView.is() )
147 : {
148 18 : xPeerView->setZoom( maComponentInfos.nZoomX, maComponentInfos.nZoomY );
149 18 : xPeerView->setGraphics( mxGraphics );
150 : }
151 :
152 : // a lot of initial settings from our component infos
153 18 : setPosSize( maComponentInfos.nX, maComponentInfos.nY, maComponentInfos.nWidth, maComponentInfos.nHeight, PosSize::POSSIZE );
154 :
155 18 : pPeer->setVisible ( maComponentInfos.bVisible && !mbDesignMode );
156 18 : pPeer->setEnable ( maComponentInfos.bEnable );
157 18 : pPeer->setDesignMode( mbDesignMode );
158 :
159 18 : peerCreated();
160 :
161 18 : mbCreatingPeer = false;
162 19 : }
163 19 : }
164 :
165 :
166 1 : OUString SAL_CALL ONavigationBarControl::getImplementationName() throw( RuntimeException, std::exception )
167 : {
168 1 : return getImplementationName_Static();
169 : }
170 :
171 :
172 1 : Sequence< OUString > SAL_CALL ONavigationBarControl::getSupportedServiceNames() throw( RuntimeException, std::exception )
173 : {
174 1 : return getSupportedServiceNames_Static();
175 : }
176 :
177 :
178 1 : OUString SAL_CALL ONavigationBarControl::getImplementationName_Static()
179 : {
180 1 : return OUString( "com.sun.star.comp.form.ONavigationBarControl" );
181 : }
182 :
183 :
184 1 : Sequence< OUString > SAL_CALL ONavigationBarControl::getSupportedServiceNames_Static()
185 : {
186 1 : Sequence< OUString > aServices( 2 );
187 1 : aServices[ 0 ] = "com.sun.star.awt.UnoControl";
188 1 : aServices[ 1 ] = "com.sun.star.form.control.NavigationToolBar";
189 1 : return aServices;
190 : }
191 :
192 :
193 0 : void SAL_CALL ONavigationBarControl::registerDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& _rxInterceptor ) throw (RuntimeException, std::exception)
194 : {
195 0 : FORWARD_TO_PEER_1( XDispatchProviderInterception, registerDispatchProviderInterceptor, _rxInterceptor );
196 0 : }
197 :
198 :
199 0 : void SAL_CALL ONavigationBarControl::releaseDispatchProviderInterceptor( const Reference< XDispatchProviderInterceptor >& _rxInterceptor ) throw (RuntimeException, std::exception)
200 : {
201 0 : FORWARD_TO_PEER_1( XDispatchProviderInterception, releaseDispatchProviderInterceptor, _rxInterceptor );
202 0 : }
203 :
204 :
205 11 : void SAL_CALL ONavigationBarControl::setDesignMode( sal_Bool _bOn ) throw( RuntimeException, std::exception )
206 : {
207 11 : UnoControl::setDesignMode( _bOn );
208 11 : FORWARD_TO_PEER_1( XVclWindowPeer, setDesignMode, _bOn );
209 11 : }
210 :
211 :
212 : // ONavigationBarPeer
213 :
214 :
215 18 : ONavigationBarPeer* ONavigationBarPeer::Create( const Reference< XComponentContext >& _rxORB,
216 : vcl::Window* _pParentWindow, const Reference< XControlModel >& _rxModel )
217 : {
218 : DBG_TESTSOLARMUTEX();
219 :
220 : // the peer itself
221 18 : ONavigationBarPeer* pPeer = new ONavigationBarPeer( _rxORB );
222 18 : pPeer->acquire(); // by definition, the returned object is acquired once
223 :
224 : // the VCL control for the peer
225 18 : Reference< XModel > xContextDocument( getXModel( _rxModel ) );
226 : VclPtrInstance<NavigationToolBar> pNavBar(
227 : _pParentWindow,
228 18 : lcl_getWinBits_nothrow( _rxModel ),
229 : createDocumentCommandImageProvider( _rxORB, xContextDocument ),
230 : createDocumentCommandDescriptionProvider( _rxORB, xContextDocument )
231 54 : );
232 :
233 : // some knittings
234 18 : pNavBar->setDispatcher( pPeer );
235 18 : pNavBar->SetComponentInterface( pPeer );
236 :
237 : // we want a faster repeating rate for the slots in this
238 : // toolbox
239 36 : AllSettings aSettings = pNavBar->GetSettings();
240 36 : MouseSettings aMouseSettings = aSettings.GetMouseSettings();
241 18 : aMouseSettings.SetButtonRepeat( 10 );
242 18 : aSettings.SetMouseSettings( aMouseSettings );
243 18 : pNavBar->SetSettings( aSettings, true );
244 :
245 : // outta here
246 36 : return pPeer;
247 : }
248 :
249 :
250 18 : ONavigationBarPeer::ONavigationBarPeer( const Reference< XComponentContext >& _rxORB )
251 18 : :OFormNavigationHelper( _rxORB )
252 : {
253 18 : }
254 :
255 :
256 36 : ONavigationBarPeer::~ONavigationBarPeer()
257 : {
258 36 : }
259 :
260 :
261 53883 : IMPLEMENT_FORWARD_XINTERFACE2( ONavigationBarPeer, VCLXWindow, OFormNavigationHelper )
262 :
263 :
264 0 : IMPLEMENT_FORWARD_XTYPEPROVIDER2( ONavigationBarPeer, VCLXWindow, OFormNavigationHelper )
265 :
266 :
267 36 : void SAL_CALL ONavigationBarPeer::dispose( ) throw( RuntimeException, std::exception )
268 : {
269 36 : VCLXWindow::dispose();
270 36 : OFormNavigationHelper::dispose();
271 36 : }
272 :
273 :
274 1001 : void SAL_CALL ONavigationBarPeer::setProperty( const OUString& _rPropertyName, const Any& _rValue ) throw( RuntimeException, std::exception )
275 : {
276 1001 : SolarMutexGuard aGuard;
277 :
278 2002 : VclPtr< NavigationToolBar > pNavBar = GetAs< NavigationToolBar >();
279 1001 : if ( !pNavBar )
280 : {
281 0 : VCLXWindow::setProperty( _rPropertyName, _rValue );
282 1001 : return;
283 : }
284 :
285 1001 : bool bVoid = !_rValue.hasValue();
286 :
287 1001 : bool bBoolValue = false;
288 1001 : sal_Int32 nColor = COL_TRANSPARENT;
289 :
290 : // TODO: more generic mechanisms for this (the grid control implementation,
291 : // when used herein, will do the same stuff for lot of these)
292 :
293 1001 : if ( _rPropertyName == PROPERTY_BACKGROUNDCOLOR )
294 : {
295 18 : Wallpaper aTest = pNavBar->GetBackground();
296 18 : if ( bVoid )
297 : {
298 18 : pNavBar->SetBackground( pNavBar->GetSettings().GetStyleSettings().GetFaceColor() );
299 18 : pNavBar->SetControlBackground();
300 : }
301 : else
302 : {
303 0 : OSL_VERIFY( _rValue >>= nColor );
304 0 : Color aColor( nColor );
305 0 : pNavBar->SetBackground( aColor );
306 0 : pNavBar->SetControlBackground( aColor );
307 18 : }
308 : }
309 983 : else if ( _rPropertyName == PROPERTY_TEXTLINECOLOR )
310 : {
311 18 : if ( bVoid )
312 : {
313 18 : pNavBar->SetTextLineColor();
314 : }
315 : else
316 : {
317 0 : OSL_VERIFY( _rValue >>= nColor );
318 0 : pNavBar->SetTextLineColor( nColor );
319 : }
320 : }
321 965 : else if ( _rPropertyName == PROPERTY_ICONSIZE )
322 : {
323 26 : sal_Int16 nInt16Value = 0;
324 26 : OSL_VERIFY( _rValue >>= nInt16Value );
325 26 : pNavBar->SetImageSize( nInt16Value ? NavigationToolBar::eLarge : NavigationToolBar::eSmall );
326 : }
327 939 : else if ( _rPropertyName == PROPERTY_SHOW_POSITION )
328 : {
329 26 : OSL_VERIFY( _rValue >>= bBoolValue );
330 26 : pNavBar->ShowFunctionGroup( NavigationToolBar::ePosition, bBoolValue );
331 : }
332 913 : else if ( _rPropertyName == PROPERTY_SHOW_NAVIGATION )
333 : {
334 26 : OSL_VERIFY( _rValue >>= bBoolValue );
335 26 : pNavBar->ShowFunctionGroup( NavigationToolBar::eNavigation, bBoolValue );
336 : }
337 887 : else if ( _rPropertyName == PROPERTY_SHOW_RECORDACTIONS )
338 : {
339 26 : OSL_VERIFY( _rValue >>= bBoolValue );
340 26 : pNavBar->ShowFunctionGroup( NavigationToolBar::eRecordActions, bBoolValue );
341 : }
342 861 : else if ( _rPropertyName == PROPERTY_SHOW_FILTERSORT )
343 : {
344 27 : OSL_VERIFY( _rValue >>= bBoolValue );
345 27 : pNavBar->ShowFunctionGroup( NavigationToolBar::eFilterSort, bBoolValue );
346 : }
347 : else
348 : {
349 834 : VCLXWindow::setProperty( _rPropertyName, _rValue );
350 1001 : }
351 : }
352 :
353 :
354 0 : Any SAL_CALL ONavigationBarPeer::getProperty( const OUString& _rPropertyName ) throw( RuntimeException, std::exception )
355 : {
356 0 : SolarMutexGuard aGuard;
357 :
358 0 : Any aReturn;
359 0 : VclPtr< NavigationToolBar > pNavBar = GetAs< NavigationToolBar >();
360 :
361 0 : if ( _rPropertyName == PROPERTY_BACKGROUNDCOLOR )
362 : {
363 0 : aReturn <<= (sal_Int32)pNavBar->GetControlBackground().GetColor();
364 : }
365 0 : else if ( _rPropertyName == PROPERTY_TEXTLINECOLOR )
366 : {
367 0 : aReturn <<= (sal_Int32)pNavBar->GetTextLineColor().GetColor();
368 : }
369 0 : else if ( _rPropertyName == PROPERTY_ICONSIZE )
370 : {
371 0 : sal_Int16 nIconType = ( NavigationToolBar::eLarge == pNavBar->GetImageSize() )
372 0 : ? 1 : 0;
373 0 : aReturn <<= nIconType;
374 : }
375 0 : else if ( _rPropertyName == PROPERTY_SHOW_POSITION )
376 : {
377 0 : aReturn <<= pNavBar->IsFunctionGroupVisible( NavigationToolBar::ePosition );
378 : }
379 0 : else if ( _rPropertyName == PROPERTY_SHOW_NAVIGATION )
380 : {
381 0 : aReturn <<= pNavBar->IsFunctionGroupVisible( NavigationToolBar::eNavigation );
382 : }
383 0 : else if ( _rPropertyName == PROPERTY_SHOW_RECORDACTIONS )
384 : {
385 0 : aReturn <<= pNavBar->IsFunctionGroupVisible( NavigationToolBar::eRecordActions );
386 : }
387 0 : else if ( _rPropertyName == PROPERTY_SHOW_FILTERSORT )
388 : {
389 0 : aReturn <<= pNavBar->IsFunctionGroupVisible( NavigationToolBar::eFilterSort );
390 : }
391 : else
392 0 : aReturn = VCLXWindow::getProperty( _rPropertyName );
393 :
394 0 : return aReturn;
395 : }
396 :
397 :
398 0 : void ONavigationBarPeer::interceptorsChanged( )
399 : {
400 0 : if ( isDesignMode() )
401 : // not interested in if we're in design mode
402 0 : return;
403 :
404 0 : OFormNavigationHelper::interceptorsChanged();
405 : }
406 :
407 :
408 0 : void ONavigationBarPeer::featureStateChanged( sal_Int16 _nFeatureId, bool _bEnabled )
409 : {
410 : // enable this button on the toolbox
411 0 : VclPtr< NavigationToolBar > pNavBar = GetAs< NavigationToolBar >();
412 0 : if ( pNavBar )
413 : {
414 0 : pNavBar->enableFeature( _nFeatureId, _bEnabled );
415 :
416 : // is it a feature with additional state information?
417 0 : if ( _nFeatureId == FormFeature::ToggleApplyFilter )
418 : { // additional boolean state
419 0 : pNavBar->checkFeature( _nFeatureId, getBooleanState( _nFeatureId ) );
420 : }
421 0 : else if ( _nFeatureId == FormFeature::TotalRecords )
422 : {
423 0 : pNavBar->setFeatureText( _nFeatureId, getStringState( _nFeatureId ) );
424 : }
425 0 : else if ( _nFeatureId == FormFeature::MoveAbsolute )
426 : {
427 0 : pNavBar->setFeatureText( _nFeatureId, OUString::number(getIntegerState(_nFeatureId)) );
428 : }
429 : }
430 :
431 : // base class
432 0 : OFormNavigationHelper::featureStateChanged( _nFeatureId, _bEnabled );
433 0 : }
434 :
435 :
436 461 : void ONavigationBarPeer::allFeatureStatesChanged( )
437 : {
438 : // force the control to update it's states
439 461 : VclPtr< NavigationToolBar > pNavBar = GetAs< NavigationToolBar >();
440 461 : if ( pNavBar )
441 425 : pNavBar->setDispatcher( this );
442 :
443 : // base class
444 461 : OFormNavigationHelper::allFeatureStatesChanged( );
445 461 : }
446 :
447 :
448 9303 : bool ONavigationBarPeer::isEnabled( sal_Int16 _nFeatureId ) const
449 : {
450 9303 : if ( const_cast< ONavigationBarPeer* >( this )->isDesignMode() )
451 8904 : return false;
452 :
453 399 : return OFormNavigationHelper::isEnabled( _nFeatureId );
454 : }
455 :
456 :
457 425 : void SAL_CALL ONavigationBarPeer::setDesignMode( sal_Bool _bOn ) throw( RuntimeException, std::exception )
458 : {
459 425 : VCLXWindow::setDesignMode( _bOn );
460 :
461 425 : if ( _bOn )
462 424 : disconnectDispatchers();
463 : else
464 1 : connectDispatchers();
465 : // this will connect if not already connected and just update else
466 425 : }
467 :
468 :
469 0 : void SAL_CALL ONavigationBarPeer::disposing( const EventObject& _rSource ) throw (RuntimeException, std::exception)
470 : {
471 0 : VCLXWindow::disposing( _rSource );
472 0 : OFormNavigationHelper::disposing( _rSource );
473 0 : }
474 :
475 :
476 1 : void ONavigationBarPeer::getSupportedFeatures( ::std::vector< sal_Int16 >& _rFeatureIds )
477 : {
478 1 : _rFeatureIds.push_back( FormFeature::MoveAbsolute );
479 1 : _rFeatureIds.push_back( FormFeature::TotalRecords );
480 1 : _rFeatureIds.push_back( FormFeature::MoveToFirst );
481 1 : _rFeatureIds.push_back( FormFeature::MoveToPrevious );
482 1 : _rFeatureIds.push_back( FormFeature::MoveToNext );
483 1 : _rFeatureIds.push_back( FormFeature::MoveToLast );
484 1 : _rFeatureIds.push_back( FormFeature::SaveRecordChanges );
485 1 : _rFeatureIds.push_back( FormFeature::UndoRecordChanges );
486 1 : _rFeatureIds.push_back( FormFeature::MoveToInsertRow );
487 1 : _rFeatureIds.push_back( FormFeature::DeleteRecord );
488 1 : _rFeatureIds.push_back( FormFeature::ReloadForm );
489 1 : _rFeatureIds.push_back( FormFeature::RefreshCurrentControl );
490 1 : _rFeatureIds.push_back( FormFeature::SortAscending );
491 1 : _rFeatureIds.push_back( FormFeature::SortDescending );
492 1 : _rFeatureIds.push_back( FormFeature::InteractiveSort );
493 1 : _rFeatureIds.push_back( FormFeature::AutoFilter );
494 1 : _rFeatureIds.push_back( FormFeature::InteractiveFilter );
495 1 : _rFeatureIds.push_back( FormFeature::ToggleApplyFilter );
496 1 : _rFeatureIds.push_back( FormFeature::RemoveFilterAndSort );
497 1 : }
498 :
499 : } // namespace frm
500 :
501 :
502 : extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface* SAL_CALL
503 10 : com_sun_star_comp_form_ONavigationBarControl_get_implementation (css::uno::XComponentContext* context,
504 : css::uno::Sequence<css::uno::Any> const &)
505 : {
506 10 : return cppu::acquire(new frm::ONavigationBarControl(context));
507 138 : }
508 :
509 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|