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