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