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