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 "navtoolbar.hxx"
22 : #include "frm_resource.hxx"
23 : #include "featuredispatcher.hxx"
24 : #include "frm_resource.hrc"
25 : #include "commandimageprovider.hxx"
26 : #include "commanddescriptionprovider.hxx"
27 :
28 : #include <com/sun/star/uno/Any.hxx>
29 : #include <com/sun/star/form/runtime/FormFeature.hpp>
30 :
31 : #include <sfx2/imgmgr.hxx>
32 : #include <vcl/fixed.hxx>
33 :
34 : #include <sal/macros.h>
35 :
36 : #define LID_RECORD_LABEL 1000
37 : #define LID_RECORD_FILLER 1001
38 :
39 :
40 : namespace frm
41 : {
42 :
43 :
44 : using ::com::sun::star::uno::makeAny;
45 : namespace FormFeature = ::com::sun::star::form::runtime::FormFeature;
46 :
47 :
48 :
49 : namespace
50 : {
51 2646 : static bool isArtificialItem( sal_Int16 _nFeatureId )
52 : {
53 : return ( _nFeatureId == LID_RECORD_LABEL )
54 2646 : || ( _nFeatureId == LID_RECORD_FILLER );
55 : }
56 :
57 348 : static OUString getLabelString( sal_uInt16 _nResId )
58 : {
59 348 : OUString sLabel( " " );
60 348 : sLabel += FRM_RES_STRING( _nResId );
61 348 : sLabel += " ";
62 348 : return sLabel;
63 : }
64 :
65 2394 : OUString lcl_getCommandURL( const sal_Int16 _nFormFeature )
66 : {
67 2394 : const sal_Char* pAsciiCommandName = NULL;
68 2394 : switch ( _nFormFeature )
69 : {
70 126 : case FormFeature::MoveAbsolute : pAsciiCommandName = "AbsoluteRecord"; break;
71 126 : case FormFeature::TotalRecords : pAsciiCommandName = "RecTotal"; break;
72 126 : case FormFeature::MoveToFirst : pAsciiCommandName = "FirstRecord"; break;
73 126 : case FormFeature::MoveToPrevious : pAsciiCommandName = "PrevRecord"; break;
74 126 : case FormFeature::MoveToNext : pAsciiCommandName = "NextRecord"; break;
75 126 : case FormFeature::MoveToLast : pAsciiCommandName = "LastRecord"; break;
76 126 : case FormFeature::SaveRecordChanges : pAsciiCommandName = "RecSave"; break;
77 126 : case FormFeature::UndoRecordChanges : pAsciiCommandName = "RecUndo"; break;
78 126 : case FormFeature::MoveToInsertRow : pAsciiCommandName = "NewRecord"; break;
79 126 : case FormFeature::DeleteRecord : pAsciiCommandName = "DeleteRecord"; break;
80 126 : case FormFeature::ReloadForm : pAsciiCommandName = "Refresh"; break;
81 126 : case FormFeature::RefreshCurrentControl : pAsciiCommandName = "RefreshFormControl"; break;
82 126 : case FormFeature::SortAscending : pAsciiCommandName = "Sortup"; break;
83 126 : case FormFeature::SortDescending : pAsciiCommandName = "SortDown"; break;
84 126 : case FormFeature::InteractiveSort : pAsciiCommandName = "OrderCrit"; break;
85 126 : case FormFeature::AutoFilter : pAsciiCommandName = "AutoFilter"; break;
86 126 : case FormFeature::InteractiveFilter : pAsciiCommandName = "FilterCrit"; break;
87 126 : case FormFeature::ToggleApplyFilter : pAsciiCommandName = "FormFiltered"; break;
88 126 : case FormFeature::RemoveFilterAndSort : pAsciiCommandName = "RemoveFilterSort"; break;
89 : }
90 2394 : if ( pAsciiCommandName != NULL )
91 2394 : return OUString( ".uno:" ) + OUString::createFromAscii( pAsciiCommandName );
92 :
93 : OSL_FAIL( "lcl_getCommandURL: unknown FormFeature!" );
94 0 : return OUString();
95 : }
96 : }
97 :
98 72 : class ImplNavToolBar : public ToolBox
99 : {
100 : protected:
101 : const IFeatureDispatcher* m_pDispatcher;
102 :
103 : public:
104 36 : ImplNavToolBar( vcl::Window* _pParent )
105 : :ToolBox( _pParent, WB_3DLOOK )
106 36 : ,m_pDispatcher( NULL )
107 : {
108 36 : }
109 :
110 270 : void setDispatcher( const IFeatureDispatcher* _pDispatcher )
111 : {
112 270 : m_pDispatcher = _pDispatcher;
113 270 : }
114 :
115 : protected:
116 : // ToolBox overridables
117 : virtual void Select() SAL_OVERRIDE;
118 :
119 : };
120 :
121 :
122 0 : void ImplNavToolBar::Select()
123 : {
124 0 : if ( m_pDispatcher )
125 : {
126 0 : if ( !m_pDispatcher->isEnabled( GetCurItemId() ) )
127 : // the toolbox is a little bit buggy: With ToolBoxItemBits::REPEAT, it sometimes
128 : // happens that a select is reported, even though the respective
129 : // item has just been disabled.
130 0 : return;
131 0 : m_pDispatcher->dispatch( GetCurItemId() );
132 : }
133 : }
134 :
135 36 : NavigationToolBar::NavigationToolBar( vcl::Window* _pParent, WinBits _nStyle, const PCommandImageProvider& _pImageProvider,
136 : const PCommandDescriptionProvider& _pDescriptionProvider )
137 : :Window( _pParent, _nStyle )
138 : ,m_pDispatcher( NULL )
139 : ,m_pImageProvider( _pImageProvider )
140 : ,m_pDescriptionProvider( _pDescriptionProvider )
141 : ,m_eImageSize( eSmall )
142 36 : ,m_pToolbar( NULL )
143 : {
144 36 : implInit( );
145 36 : }
146 :
147 :
148 108 : NavigationToolBar::~NavigationToolBar( )
149 : {
150 540 : for ( ::std::vector< vcl::Window* >::iterator loopChildWins = m_aChildWins.begin();
151 360 : loopChildWins != m_aChildWins.end();
152 : ++loopChildWins
153 : )
154 : {
155 144 : delete *loopChildWins;
156 : }
157 36 : delete m_pToolbar;
158 72 : }
159 :
160 :
161 270 : void NavigationToolBar::setDispatcher( const IFeatureDispatcher* _pDispatcher )
162 : {
163 270 : m_pDispatcher = _pDispatcher;
164 :
165 270 : m_pToolbar->setDispatcher( _pDispatcher );
166 :
167 270 : RecordPositionInput* pPositionWindow = static_cast< RecordPositionInput* >( m_pToolbar->GetItemWindow( FormFeature::MoveAbsolute ) );
168 : OSL_ENSURE( pPositionWindow, "NavigationToolBar::setDispatcher: can't forward the dispatcher to the position window!" );
169 270 : if ( pPositionWindow )
170 270 : pPositionWindow->setDispatcher( _pDispatcher );
171 :
172 270 : updateFeatureStates( );
173 270 : }
174 :
175 :
176 270 : void NavigationToolBar::updateFeatureStates( )
177 : {
178 6480 : for ( sal_uInt16 nPos = 0; nPos < m_pToolbar->GetItemCount(); ++nPos )
179 : {
180 6210 : sal_uInt16 nItemId = m_pToolbar->GetItemId( nPos );
181 :
182 6210 : if ( ( nItemId == LID_RECORD_LABEL ) || ( nItemId == LID_RECORD_FILLER ) )
183 540 : continue;
184 :
185 : // is this item enabled?
186 5670 : bool bEnabled = m_pDispatcher && m_pDispatcher->isEnabled( nItemId );
187 5670 : implEnableItem( nItemId, bEnabled );
188 : }
189 270 : }
190 :
191 :
192 5670 : void NavigationToolBar::implEnableItem( sal_uInt16 _nItemId, bool _bEnabled )
193 : {
194 5670 : m_pToolbar->EnableItem( _nItemId, _bEnabled );
195 :
196 5670 : if ( _nItemId == FormFeature::MoveAbsolute )
197 270 : m_pToolbar->EnableItem( LID_RECORD_LABEL, _bEnabled );
198 :
199 5670 : if ( _nItemId == FormFeature::TotalRecords )
200 270 : m_pToolbar->EnableItem( LID_RECORD_FILLER, _bEnabled );
201 5670 : }
202 :
203 :
204 0 : void NavigationToolBar::enableFeature( sal_Int16 _nFeatureId, bool _bEnabled )
205 : {
206 : DBG_ASSERT( m_pToolbar->GetItemPos( (sal_uInt16)_nFeatureId ) != TOOLBOX_ITEM_NOTFOUND,
207 : "NavigationToolBar::enableFeature: invalid id!" );
208 :
209 0 : implEnableItem( (sal_uInt16)_nFeatureId, _bEnabled );
210 0 : }
211 :
212 :
213 0 : void NavigationToolBar::checkFeature( sal_Int16 _nFeatureId, bool _bEnabled )
214 : {
215 : DBG_ASSERT( m_pToolbar->GetItemPos( (sal_uInt16)_nFeatureId ) != TOOLBOX_ITEM_NOTFOUND,
216 : "NavigationToolBar::checkFeature: invalid id!" );
217 :
218 0 : m_pToolbar->CheckItem( (sal_uInt16)_nFeatureId, _bEnabled );
219 0 : }
220 :
221 :
222 0 : void NavigationToolBar::setFeatureText( sal_Int16 _nFeatureId, const OUString& _rText )
223 : {
224 : DBG_ASSERT( m_pToolbar->GetItemPos( (sal_uInt16)_nFeatureId ) != TOOLBOX_ITEM_NOTFOUND,
225 : "NavigationToolBar::checkFeature: invalid id!" );
226 :
227 0 : vcl::Window* pItemWindow = m_pToolbar->GetItemWindow( (sal_uInt16)_nFeatureId );
228 0 : if ( pItemWindow )
229 0 : pItemWindow->SetText( _rText );
230 : else
231 0 : m_pToolbar->SetItemText( (sal_uInt16)_nFeatureId, _rText );
232 0 : }
233 :
234 :
235 36 : void NavigationToolBar::implInit( )
236 : {
237 36 : m_pToolbar = new ImplNavToolBar( this );
238 36 : m_pToolbar->SetOutStyle( TOOLBOX_STYLE_FLAT );
239 36 : m_pToolbar->Show();
240 :
241 : // need the SfxApplication for retrieving information about our
242 : // items. We could duplicate all the information here in our lib
243 : // (such as the item text and the image), but why should we?
244 :
245 : struct FeatureDescription
246 : {
247 : sal_uInt16 nId;
248 : bool bRepeat;
249 : bool bItemWindow;
250 : } aSupportedFeatures[] =
251 : {
252 : { LID_RECORD_LABEL, false, true },
253 : { FormFeature::MoveAbsolute, false, true },
254 : { LID_RECORD_FILLER, false, true },
255 : { FormFeature::TotalRecords, false, true },
256 : { FormFeature::MoveToFirst, true, false },
257 : { FormFeature::MoveToPrevious, true, false },
258 : { FormFeature::MoveToNext, true, false },
259 : { FormFeature::MoveToLast, true, false },
260 : { FormFeature::MoveToInsertRow, false, false },
261 : { 0, false, false },
262 : { FormFeature::SaveRecordChanges, false, false },
263 : { FormFeature::UndoRecordChanges, false, false },
264 : { FormFeature::DeleteRecord, false, false },
265 : { FormFeature::ReloadForm, false, false },
266 : { FormFeature::RefreshCurrentControl, false, false },
267 : { 0, false, false },
268 : { FormFeature::SortAscending, false, false },
269 : { FormFeature::SortDescending, false, false },
270 : { FormFeature::InteractiveSort, false, false },
271 : { FormFeature::AutoFilter, false, false },
272 : { FormFeature::InteractiveFilter, false, false },
273 : { FormFeature::ToggleApplyFilter, false, false },
274 : { FormFeature::RemoveFilterAndSort, false, false },
275 36 : };
276 :
277 36 : size_t nSupportedFeatures = SAL_N_ELEMENTS( aSupportedFeatures );
278 36 : FeatureDescription* pSupportedFeatures = aSupportedFeatures;
279 36 : FeatureDescription* pSupportedFeaturesEnd = aSupportedFeatures + nSupportedFeatures;
280 864 : for ( ; pSupportedFeatures < pSupportedFeaturesEnd; ++pSupportedFeatures )
281 : {
282 828 : if ( pSupportedFeatures->nId )
283 : { // it's _not_ a separator
284 :
285 : // insert the entry
286 756 : m_pToolbar->InsertItem( pSupportedFeatures->nId, OUString(), pSupportedFeatures->bRepeat ? ToolBoxItemBits::REPEAT : ToolBoxItemBits::NONE );
287 756 : m_pToolbar->SetQuickHelpText( pSupportedFeatures->nId, OUString() ); // TODO
288 :
289 756 : if ( !isArtificialItem( pSupportedFeatures->nId ) )
290 : {
291 684 : OUString sCommandURL( lcl_getCommandURL( pSupportedFeatures->nId ) );
292 684 : m_pToolbar->SetItemCommand( pSupportedFeatures->nId, sCommandURL );
293 684 : if ( m_pDescriptionProvider )
294 684 : m_pToolbar->SetQuickHelpText( pSupportedFeatures->nId, m_pDescriptionProvider->getCommandDescription( sCommandURL ) );
295 : }
296 :
297 756 : if ( pSupportedFeatures->bItemWindow )
298 : {
299 144 : vcl::Window* pItemWindow = NULL;
300 144 : if ( FormFeature::MoveAbsolute == pSupportedFeatures->nId )
301 : {
302 36 : pItemWindow = new RecordPositionInput( m_pToolbar );
303 36 : static_cast< RecordPositionInput* >( pItemWindow )->setDispatcher( m_pDispatcher );
304 : }
305 108 : else if ( LID_RECORD_FILLER == pSupportedFeatures->nId )
306 : {
307 36 : pItemWindow = new FixedText( m_pToolbar, WB_CENTER | WB_VCENTER );
308 36 : pItemWindow->SetBackground(Wallpaper(Color(COL_TRANSPARENT)));
309 : }
310 : else
311 : {
312 72 : pItemWindow = new FixedText( m_pToolbar, WB_VCENTER );
313 72 : pItemWindow->SetBackground();
314 72 : pItemWindow->SetPaintTransparent(true);
315 : }
316 144 : m_aChildWins.push_back( pItemWindow );
317 :
318 144 : switch ( pSupportedFeatures->nId )
319 : {
320 : case LID_RECORD_LABEL:
321 36 : pItemWindow->SetText( getLabelString( RID_STR_LABEL_RECORD ) );
322 36 : break;
323 :
324 : case LID_RECORD_FILLER:
325 36 : pItemWindow->SetText( getLabelString( RID_STR_LABEL_OF ) );
326 36 : break;
327 : }
328 :
329 144 : m_pToolbar->SetItemWindow( pSupportedFeatures->nId, pItemWindow );
330 : }
331 : }
332 : else
333 : { // a separator
334 72 : m_pToolbar->InsertSeparator( );
335 : }
336 : }
337 :
338 36 : forEachItemWindow( &NavigationToolBar::adjustItemWindowWidth, NULL );
339 :
340 36 : implUpdateImages();
341 36 : }
342 :
343 :
344 90 : void NavigationToolBar::implUpdateImages()
345 : {
346 : OSL_ENSURE( m_pImageProvider, "NavigationToolBar::implUpdateImages: no image provider => no images!" );
347 90 : if ( !m_pImageProvider )
348 90 : return;
349 :
350 90 : const sal_uInt16 nItemCount = m_pToolbar->GetItemCount();
351 :
352 : // collect the FormFeatures in the toolbar
353 : typedef ::std::vector< sal_Int16 > FormFeatures;
354 90 : FormFeatures aFormFeatures;
355 90 : aFormFeatures.reserve( nItemCount );
356 :
357 2160 : for ( sal_uInt16 i=0; i<nItemCount; ++i )
358 : {
359 2070 : sal_uInt16 nId = m_pToolbar->GetItemId( i );
360 2070 : if ( ( TOOLBOXITEM_BUTTON == m_pToolbar->GetItemType( i ) ) && !isArtificialItem( nId ) )
361 1710 : aFormFeatures.push_back( nId );
362 : }
363 :
364 : // translate them into command URLs
365 180 : CommandURLs aCommandURLs( aFormFeatures.size() );
366 5400 : for ( FormFeatures::const_iterator formFeature = aFormFeatures.begin();
367 3600 : formFeature != aFormFeatures.end();
368 : ++formFeature
369 : )
370 : {
371 1710 : aCommandURLs[ formFeature - aFormFeatures.begin() ] = lcl_getCommandURL( *formFeature );
372 : }
373 :
374 : // retrieve the images for the command URLs
375 180 : CommandImages aCommandImages = m_pImageProvider->getCommandImages( aCommandURLs, m_eImageSize == eLarge );
376 :
377 : // and set them at the toolbar
378 90 : CommandImages::const_iterator commandImage = aCommandImages.begin();
379 5400 : for ( FormFeatures::const_iterator formFeature = aFormFeatures.begin();
380 3600 : formFeature != aFormFeatures.end();
381 : ++formFeature, ++commandImage
382 : )
383 : {
384 1710 : m_pToolbar->SetItemImage( *formFeature, *commandImage );
385 : }
386 :
387 : // parts of our layout is dependent on the size of our icons
388 180 : Resize();
389 : }
390 :
391 :
392 52 : void NavigationToolBar::implSetImageSize( ImageSize _eSize )
393 : {
394 52 : if ( _eSize != m_eImageSize )
395 : {
396 18 : m_eImageSize = _eSize;
397 18 : implUpdateImages();
398 : }
399 52 : }
400 :
401 :
402 52 : void NavigationToolBar::SetImageSize( ImageSize _eSize )
403 : {
404 52 : implSetImageSize( _eSize );
405 52 : }
406 :
407 :
408 208 : void NavigationToolBar::ShowFunctionGroup( FunctionGroup _eGroup, bool _bShow )
409 : {
410 208 : const sal_uInt16* pGroupIds = NULL;
411 :
412 208 : switch ( _eGroup )
413 : {
414 : case ePosition:
415 : {
416 : static const sal_uInt16 aPositionIds[] = {
417 : LID_RECORD_LABEL, FormFeature::MoveAbsolute, LID_RECORD_FILLER, FormFeature::TotalRecords, 0
418 : };
419 52 : pGroupIds = aPositionIds;
420 : }
421 52 : break;
422 : case eNavigation:
423 : {
424 : static const sal_uInt16 aNavigationIds[] = {
425 : FormFeature::MoveToFirst, FormFeature::MoveToPrevious, FormFeature::MoveToNext, FormFeature::MoveToLast, FormFeature::MoveToInsertRow, 0
426 : };
427 52 : pGroupIds = aNavigationIds;
428 : }
429 52 : break;
430 : case eRecordActions:
431 : {
432 : static const sal_uInt16 aActionIds[] = {
433 : FormFeature::SaveRecordChanges, FormFeature::UndoRecordChanges, FormFeature::DeleteRecord, FormFeature::ReloadForm, FormFeature::RefreshCurrentControl, 0
434 : };
435 52 : pGroupIds = aActionIds;
436 : }
437 52 : break;
438 : case eFilterSort:
439 : {
440 : static const sal_uInt16 aFilterSortIds[] = {
441 : FormFeature::SortAscending, FormFeature::SortDescending, FormFeature::InteractiveSort, FormFeature::AutoFilter, FormFeature::InteractiveFilter, FormFeature::ToggleApplyFilter, FormFeature::RemoveFilterAndSort, 0
442 : };
443 52 : pGroupIds = aFilterSortIds;
444 : }
445 52 : break;
446 : default:
447 : OSL_FAIL( "NavigationToolBar::ShowFunctionGroup: invalid group id!" );
448 : }
449 :
450 208 : if ( pGroupIds )
451 1508 : while ( *pGroupIds )
452 1092 : m_pToolbar->ShowItem( *pGroupIds++, _bShow );
453 208 : }
454 :
455 :
456 0 : bool NavigationToolBar::IsFunctionGroupVisible( FunctionGroup _eGroup )
457 : {
458 0 : sal_uInt16 nIndicatorItem = 0;
459 0 : switch ( _eGroup )
460 : {
461 0 : case ePosition : nIndicatorItem = LID_RECORD_LABEL; break;
462 0 : case eNavigation : nIndicatorItem = FormFeature::MoveToFirst; break;
463 0 : case eRecordActions : nIndicatorItem = FormFeature::SaveRecordChanges; break;
464 0 : case eFilterSort : nIndicatorItem = FormFeature::SortAscending; break;
465 : default:
466 : OSL_FAIL( "NavigationToolBar::IsFunctionGroupVisible: invalid group id!" );
467 : }
468 :
469 0 : return m_pToolbar->IsItemVisible( nIndicatorItem );
470 : }
471 :
472 :
473 614 : void NavigationToolBar::StateChanged( StateChangedType nType )
474 : {
475 614 : Window::StateChanged( nType );
476 :
477 614 : switch ( nType )
478 : {
479 : case StateChangedType::ZOOM:
480 : // m_pToolbar->SetZoom( GetZoom() );
481 : // forEachItemWindow( setItemWindowZoom, NULL );
482 : // the ToolBox class is not zoomable at the moment, so
483 : // we better have no zoom at all instead of only half a zoom ...
484 0 : break;
485 :
486 : case StateChangedType::CONTROLFONT:
487 102 : forEachItemWindow( &NavigationToolBar::setItemControlFont, NULL );
488 102 : forEachItemWindow( &NavigationToolBar::adjustItemWindowWidth, NULL );
489 102 : break;
490 :
491 : case StateChangedType::CONTROLFOREGROUND:
492 0 : forEachItemWindow( &NavigationToolBar::setItemControlForeground, NULL );
493 0 : break;
494 :
495 : case StateChangedType::MIRRORING:
496 : {
497 90 : sal_Bool bIsRTLEnabled( IsRTLEnabled() );
498 90 : m_pToolbar->EnableRTL( bIsRTLEnabled );
499 90 : forEachItemWindow( &NavigationToolBar::enableItemRTL, &bIsRTLEnabled );
500 90 : Resize();
501 : }
502 90 : break;
503 : default:;
504 : }
505 614 : }
506 :
507 :
508 213 : void NavigationToolBar::Resize()
509 : {
510 : // resize/position the toolbox as a whole
511 213 : sal_Int32 nToolbarHeight = m_pToolbar->CalcWindowSizePixel().Height();
512 :
513 213 : sal_Int32 nMyHeight = GetOutputSizePixel().Height();
514 213 : m_pToolbar->SetPosSizePixel( Point( 0, ( nMyHeight - nToolbarHeight ) / 2 ),
515 426 : Size( GetSizePixel().Width(), nToolbarHeight ) );
516 :
517 213 : Window::Resize();
518 213 : }
519 :
520 :
521 36 : void NavigationToolBar::SetControlBackground()
522 : {
523 36 : Window::SetControlBackground();
524 36 : m_pToolbar->SetControlBackground();
525 36 : forEachItemWindow( &NavigationToolBar::setItemBackground, NULL );
526 :
527 36 : implUpdateImages();
528 36 : }
529 :
530 :
531 0 : void NavigationToolBar::SetControlBackground( const Color& _rColor )
532 : {
533 0 : Window::SetControlBackground( _rColor );
534 0 : m_pToolbar->SetControlBackground( _rColor );
535 0 : forEachItemWindow( &NavigationToolBar::setItemBackground, &_rColor );
536 :
537 0 : implUpdateImages();
538 0 : }
539 :
540 :
541 36 : void NavigationToolBar::SetTextLineColor( )
542 : {
543 36 : Window::SetTextLineColor( );
544 36 : m_pToolbar->SetTextLineColor( );
545 36 : forEachItemWindow( &NavigationToolBar::setTextLineColor, NULL );
546 36 : }
547 :
548 :
549 0 : void NavigationToolBar::SetTextLineColor( const Color& _rColor )
550 : {
551 0 : Window::SetTextLineColor( _rColor );
552 0 : m_pToolbar->SetTextLineColor( _rColor );
553 0 : forEachItemWindow( &NavigationToolBar::setTextLineColor, &_rColor );
554 0 : }
555 :
556 :
557 402 : void NavigationToolBar::forEachItemWindow( ItemWindowHandler _handler, const void* _pParam )
558 : {
559 9648 : for ( sal_uInt16 item = 0; item < m_pToolbar->GetItemCount(); ++item )
560 : {
561 9246 : sal_uInt16 nItemId = m_pToolbar->GetItemId( item );
562 9246 : vcl::Window* pItemWindow = m_pToolbar->GetItemWindow( nItemId );
563 9246 : if ( pItemWindow )
564 1608 : (this->*_handler)( nItemId, pItemWindow, _pParam );
565 : }
566 402 : }
567 :
568 :
569 144 : void NavigationToolBar::setItemBackground( sal_uInt16 /* _nItemId */, vcl::Window* _pItemWindow, const void* _pColor ) const
570 : {
571 144 : if ( _pColor )
572 0 : _pItemWindow->SetControlBackground( *static_cast< const Color* >( _pColor ) );
573 : else
574 144 : _pItemWindow->SetControlBackground();
575 144 : }
576 :
577 :
578 144 : void NavigationToolBar::setTextLineColor( sal_uInt16 /* _nItemId */, vcl::Window* _pItemWindow, const void* _pColor ) const
579 : {
580 144 : if ( _pColor )
581 0 : _pItemWindow->SetTextLineColor( *static_cast< const Color* >( _pColor ) );
582 : else
583 144 : _pItemWindow->SetTextLineColor();
584 144 : }
585 : #if 0
586 :
587 : void NavigationToolBar::setItemWindowZoom( sal_uInt16 /* _nItemId */, vcl::Window* _pItemWindow, const void* /* _pParam */ ) const
588 : {
589 : _pItemWindow->SetZoom( GetZoom() );
590 : _pItemWindow->SetZoomedPointFont( IsControlFont() ? GetControlFont() : GetPointFont() );
591 : }
592 : #endif
593 :
594 408 : void NavigationToolBar::setItemControlFont( sal_uInt16 /* _nItemId */, vcl::Window* _pItemWindow, const void* /* _pParam */ ) const
595 : {
596 408 : if ( IsControlFont() )
597 408 : _pItemWindow->SetControlFont( GetControlFont() );
598 : else
599 0 : _pItemWindow->SetControlFont( );
600 408 : }
601 :
602 :
603 0 : void NavigationToolBar::setItemControlForeground( sal_uInt16 /* _nItemId */, vcl::Window* _pItemWindow, const void* /* _pParam */ ) const
604 : {
605 0 : if ( IsControlForeground() )
606 0 : _pItemWindow->SetControlForeground( GetControlForeground() );
607 : else
608 0 : _pItemWindow->SetControlForeground( );
609 0 : _pItemWindow->SetTextColor( GetTextColor() );
610 0 : }
611 :
612 :
613 552 : void NavigationToolBar::adjustItemWindowWidth( sal_uInt16 _nItemId, vcl::Window* _pItemWindow, const void* /* _pParam */ ) const
614 : {
615 552 : OUString sItemText;
616 552 : switch ( _nItemId )
617 : {
618 : case LID_RECORD_LABEL:
619 138 : sItemText = getLabelString( RID_STR_LABEL_RECORD );
620 138 : break;
621 :
622 : case LID_RECORD_FILLER:
623 138 : sItemText = getLabelString( RID_STR_LABEL_OF );
624 138 : break;
625 :
626 : case FormFeature::MoveAbsolute:
627 138 : sItemText = "12345678";
628 138 : break;
629 :
630 : case FormFeature::TotalRecords:
631 138 : sItemText = "123456";
632 138 : break;
633 : }
634 :
635 552 : Size aSize( _pItemWindow->GetTextWidth( sItemText ), /* _pItemWindow->GetSizePixel( ).Height() */ _pItemWindow->GetTextHeight() + 4 );
636 552 : aSize.Width() += 6;
637 552 : _pItemWindow->SetSizePixel( aSize );
638 :
639 552 : m_pToolbar->SetItemWindow( _nItemId, _pItemWindow );
640 552 : }
641 :
642 :
643 360 : void NavigationToolBar::enableItemRTL( sal_uInt16 /*_nItemId*/, vcl::Window* _pItemWindow, const void* _pIsRTLEnabled ) const
644 : {
645 360 : _pItemWindow->EnableRTL( *static_cast< const sal_Bool* >( _pIsRTLEnabled ) );
646 360 : }
647 :
648 36 : RecordPositionInput::RecordPositionInput( vcl::Window* _pParent )
649 : :NumericField( _pParent, WB_BORDER | WB_VCENTER )
650 36 : ,m_pDispatcher( NULL )
651 : {
652 36 : SetMin( 1 );
653 36 : SetFirst( 1 );
654 36 : SetSpinSize( 1 );
655 36 : SetDecimalDigits( 0 );
656 36 : SetStrictFormat( true );
657 36 : SetBorderStyle( WindowBorderStyle::MONO );
658 36 : }
659 :
660 :
661 72 : RecordPositionInput::~RecordPositionInput()
662 : {
663 72 : }
664 :
665 :
666 306 : void RecordPositionInput::setDispatcher( const IFeatureDispatcher* _pDispatcher )
667 : {
668 306 : m_pDispatcher = _pDispatcher;
669 306 : }
670 :
671 :
672 0 : void RecordPositionInput::FirePosition( bool _bForce )
673 : {
674 0 : if ( _bForce || IsValueChangedFromSaved() )
675 : {
676 0 : sal_Int64 nRecord = GetValue();
677 0 : if ( nRecord < GetMin() || nRecord > GetMax() )
678 0 : return;
679 :
680 0 : if ( m_pDispatcher )
681 0 : m_pDispatcher->dispatchWithArgument( FormFeature::MoveAbsolute, "Position", makeAny( (sal_Int32)nRecord ) );
682 :
683 0 : SaveValue();
684 : }
685 : }
686 :
687 :
688 0 : void RecordPositionInput::LoseFocus()
689 : {
690 0 : FirePosition( false );
691 0 : }
692 :
693 :
694 0 : void RecordPositionInput::KeyInput( const KeyEvent& rKeyEvent )
695 : {
696 0 : if( rKeyEvent.GetKeyCode() == KEY_RETURN && !GetText().isEmpty() )
697 0 : FirePosition( true );
698 : else
699 0 : NumericField::KeyInput( rKeyEvent );
700 0 : }
701 :
702 :
703 :
704 192 : } // namespace frm
705 :
706 :
707 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|