1*6d739b60SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*6d739b60SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*6d739b60SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*6d739b60SAndrew Rist * distributed with this work for additional information
6*6d739b60SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*6d739b60SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*6d739b60SAndrew Rist * "License"); you may not use this file except in compliance
9*6d739b60SAndrew Rist * with the License. You may obtain a copy of the License at
10*6d739b60SAndrew Rist *
11*6d739b60SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*6d739b60SAndrew Rist *
13*6d739b60SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*6d739b60SAndrew Rist * software distributed under the License is distributed on an
15*6d739b60SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*6d739b60SAndrew Rist * KIND, either express or implied. See the License for the
17*6d739b60SAndrew Rist * specific language governing permissions and limitations
18*6d739b60SAndrew Rist * under the License.
19*6d739b60SAndrew Rist *
20*6d739b60SAndrew Rist *************************************************************/
21*6d739b60SAndrew Rist
22*6d739b60SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_framework.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <stdio.h>
28cdf0e10cSrcweir #include <wchar.h>
29cdf0e10cSrcweir
30cdf0e10cSrcweir #ifndef __FRAMEWORK_UIELEMENT_SPINFIELDTOOLBARCONTROLLER_HXX
31cdf0e10cSrcweir #include "uielement/spinfieldtoolbarcontroller.hxx"
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir
34cdf0e10cSrcweir //_________________________________________________________________________________________________________________
35cdf0e10cSrcweir // my own includes
36cdf0e10cSrcweir //_________________________________________________________________________________________________________________
37cdf0e10cSrcweir
38cdf0e10cSrcweir #ifndef __FRAMEWORK_TOOLBAR_HXX_
39cdf0e10cSrcweir #include "uielement/toolbar.hxx"
40cdf0e10cSrcweir #endif
41cdf0e10cSrcweir
42cdf0e10cSrcweir //_________________________________________________________________________________________________________________
43cdf0e10cSrcweir // interface includes
44cdf0e10cSrcweir //_________________________________________________________________________________________________________________
45cdf0e10cSrcweir #include <com/sun/star/util/XURLTransformer.hpp>
46cdf0e10cSrcweir #include <com/sun/star/frame/XDispatchProvider.hpp>
47cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
48cdf0e10cSrcweir #include <com/sun/star/frame/status/ItemStatus.hpp>
49cdf0e10cSrcweir #include <com/sun/star/frame/status/ItemState.hpp>
50cdf0e10cSrcweir #include <com/sun/star/frame/status/Visibility.hpp>
51cdf0e10cSrcweir #include <com/sun/star/frame/XControlNotificationListener.hpp>
52cdf0e10cSrcweir
53cdf0e10cSrcweir //_________________________________________________________________________________________________________________
54cdf0e10cSrcweir // other includes
55cdf0e10cSrcweir //_________________________________________________________________________________________________________________
56cdf0e10cSrcweir #include <svtools/toolboxcontroller.hxx>
57cdf0e10cSrcweir #include <vos/mutex.hxx>
58cdf0e10cSrcweir #include <vcl/svapp.hxx>
59cdf0e10cSrcweir #ifndef _VCL_MNEMONIC_HXX_
60cdf0e10cSrcweir #include <vcl/mnemonic.hxx>
61cdf0e10cSrcweir #endif
62cdf0e10cSrcweir #include <tools/urlobj.hxx>
63cdf0e10cSrcweir #ifdef WINNT
64cdf0e10cSrcweir #include <systools/win32/snprintf.h>
65cdf0e10cSrcweir #endif
66cdf0e10cSrcweir
67cdf0e10cSrcweir using namespace ::com::sun::star;
68cdf0e10cSrcweir using namespace ::com::sun::star::uno;
69cdf0e10cSrcweir using namespace ::com::sun::star::beans;
70cdf0e10cSrcweir using namespace ::com::sun::star::lang;
71cdf0e10cSrcweir using namespace ::com::sun::star::frame;
72cdf0e10cSrcweir using namespace ::com::sun::star::frame::status;
73cdf0e10cSrcweir using namespace ::com::sun::star::util;
74cdf0e10cSrcweir
75cdf0e10cSrcweir namespace framework
76cdf0e10cSrcweir {
77cdf0e10cSrcweir
78cdf0e10cSrcweir // ------------------------------------------------------------------
79cdf0e10cSrcweir
80cdf0e10cSrcweir // Wrapper class to notify controller about events from combobox.
81cdf0e10cSrcweir // Unfortunaltly the events are notifed through virtual methods instead
82cdf0e10cSrcweir // of Listeners.
83cdf0e10cSrcweir
84cdf0e10cSrcweir class SpinfieldControl : public SpinField
85cdf0e10cSrcweir {
86cdf0e10cSrcweir public:
87cdf0e10cSrcweir SpinfieldControl( Window* pParent, WinBits nStyle, ISpinfieldListener* pSpinFieldListener );
88cdf0e10cSrcweir virtual ~SpinfieldControl();
89cdf0e10cSrcweir
90cdf0e10cSrcweir virtual void Up();
91cdf0e10cSrcweir virtual void Down();
92cdf0e10cSrcweir virtual void First();
93cdf0e10cSrcweir virtual void Last();
94cdf0e10cSrcweir virtual void KeyInput( const ::KeyEvent& rKEvt );
95cdf0e10cSrcweir virtual void Modify();
96cdf0e10cSrcweir virtual void GetFocus();
97cdf0e10cSrcweir virtual void LoseFocus();
98cdf0e10cSrcweir virtual void StateChanged( StateChangedType nType );
99cdf0e10cSrcweir virtual void DataChanged( const DataChangedEvent& rDCEvt );
100cdf0e10cSrcweir virtual long PreNotify( NotifyEvent& rNEvt );
101cdf0e10cSrcweir
102cdf0e10cSrcweir private:
103cdf0e10cSrcweir ISpinfieldListener* m_pSpinFieldListener;
104cdf0e10cSrcweir };
105cdf0e10cSrcweir
SpinfieldControl(Window * pParent,WinBits nStyle,ISpinfieldListener * pSpinFieldListener)106cdf0e10cSrcweir SpinfieldControl::SpinfieldControl( Window* pParent, WinBits nStyle, ISpinfieldListener* pSpinFieldListener ) :
107cdf0e10cSrcweir SpinField( pParent, nStyle )
108cdf0e10cSrcweir , m_pSpinFieldListener( pSpinFieldListener )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir }
111cdf0e10cSrcweir
~SpinfieldControl()112cdf0e10cSrcweir SpinfieldControl::~SpinfieldControl()
113cdf0e10cSrcweir {
114cdf0e10cSrcweir m_pSpinFieldListener = 0;
115cdf0e10cSrcweir }
116cdf0e10cSrcweir
Up()117cdf0e10cSrcweir void SpinfieldControl::Up()
118cdf0e10cSrcweir {
119cdf0e10cSrcweir SpinField::Up();
120cdf0e10cSrcweir if ( m_pSpinFieldListener )
121cdf0e10cSrcweir m_pSpinFieldListener->Up();
122cdf0e10cSrcweir }
123cdf0e10cSrcweir
Down()124cdf0e10cSrcweir void SpinfieldControl::Down()
125cdf0e10cSrcweir {
126cdf0e10cSrcweir SpinField::Down();
127cdf0e10cSrcweir if ( m_pSpinFieldListener )
128cdf0e10cSrcweir m_pSpinFieldListener->Down();
129cdf0e10cSrcweir }
130cdf0e10cSrcweir
First()131cdf0e10cSrcweir void SpinfieldControl::First()
132cdf0e10cSrcweir {
133cdf0e10cSrcweir SpinField::First();
134cdf0e10cSrcweir if ( m_pSpinFieldListener )
135cdf0e10cSrcweir m_pSpinFieldListener->First();
136cdf0e10cSrcweir }
137cdf0e10cSrcweir
Last()138cdf0e10cSrcweir void SpinfieldControl::Last()
139cdf0e10cSrcweir {
140cdf0e10cSrcweir SpinField::First();
141cdf0e10cSrcweir if ( m_pSpinFieldListener )
142cdf0e10cSrcweir m_pSpinFieldListener->Last();
143cdf0e10cSrcweir }
144cdf0e10cSrcweir
KeyInput(const::KeyEvent & rKEvt)145cdf0e10cSrcweir void SpinfieldControl::KeyInput( const ::KeyEvent& rKEvt )
146cdf0e10cSrcweir {
147cdf0e10cSrcweir SpinField::KeyInput( rKEvt );
148cdf0e10cSrcweir if ( m_pSpinFieldListener )
149cdf0e10cSrcweir m_pSpinFieldListener->KeyInput( rKEvt );
150cdf0e10cSrcweir }
151cdf0e10cSrcweir
Modify()152cdf0e10cSrcweir void SpinfieldControl::Modify()
153cdf0e10cSrcweir {
154cdf0e10cSrcweir SpinField::Modify();
155cdf0e10cSrcweir if ( m_pSpinFieldListener )
156cdf0e10cSrcweir m_pSpinFieldListener->Modify();
157cdf0e10cSrcweir }
158cdf0e10cSrcweir
GetFocus()159cdf0e10cSrcweir void SpinfieldControl::GetFocus()
160cdf0e10cSrcweir {
161cdf0e10cSrcweir SpinField::GetFocus();
162cdf0e10cSrcweir if ( m_pSpinFieldListener )
163cdf0e10cSrcweir m_pSpinFieldListener->GetFocus();
164cdf0e10cSrcweir }
165cdf0e10cSrcweir
LoseFocus()166cdf0e10cSrcweir void SpinfieldControl::LoseFocus()
167cdf0e10cSrcweir {
168cdf0e10cSrcweir SpinField::GetFocus();
169cdf0e10cSrcweir if ( m_pSpinFieldListener )
170cdf0e10cSrcweir m_pSpinFieldListener->GetFocus();
171cdf0e10cSrcweir }
172cdf0e10cSrcweir
StateChanged(StateChangedType nType)173cdf0e10cSrcweir void SpinfieldControl::StateChanged( StateChangedType nType )
174cdf0e10cSrcweir {
175cdf0e10cSrcweir SpinField::StateChanged( nType );
176cdf0e10cSrcweir if ( m_pSpinFieldListener )
177cdf0e10cSrcweir m_pSpinFieldListener->StateChanged( nType );
178cdf0e10cSrcweir }
179cdf0e10cSrcweir
DataChanged(const DataChangedEvent & rDCEvt)180cdf0e10cSrcweir void SpinfieldControl::DataChanged( const DataChangedEvent& rDCEvt )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir SpinField::DataChanged( rDCEvt );
183cdf0e10cSrcweir if ( m_pSpinFieldListener )
184cdf0e10cSrcweir m_pSpinFieldListener->DataChanged( rDCEvt );
185cdf0e10cSrcweir }
186cdf0e10cSrcweir
PreNotify(NotifyEvent & rNEvt)187cdf0e10cSrcweir long SpinfieldControl::PreNotify( NotifyEvent& rNEvt )
188cdf0e10cSrcweir {
189cdf0e10cSrcweir long nRet( 0 );
190cdf0e10cSrcweir if ( m_pSpinFieldListener )
191cdf0e10cSrcweir nRet = m_pSpinFieldListener->PreNotify( rNEvt );
192cdf0e10cSrcweir if ( nRet == 0 )
193cdf0e10cSrcweir nRet = SpinField::PreNotify( rNEvt );
194cdf0e10cSrcweir
195cdf0e10cSrcweir return nRet;
196cdf0e10cSrcweir }
197cdf0e10cSrcweir
198cdf0e10cSrcweir // ------------------------------------------------------------------
199cdf0e10cSrcweir
SpinfieldToolbarController(const Reference<XMultiServiceFactory> & rServiceManager,const Reference<XFrame> & rFrame,ToolBox * pToolbar,sal_uInt16 nID,sal_Int32 nWidth,const::rtl::OUString & aCommand)200cdf0e10cSrcweir SpinfieldToolbarController::SpinfieldToolbarController(
201cdf0e10cSrcweir const Reference< XMultiServiceFactory >& rServiceManager,
202cdf0e10cSrcweir const Reference< XFrame >& rFrame,
203cdf0e10cSrcweir ToolBox* pToolbar,
204cdf0e10cSrcweir sal_uInt16 nID,
205cdf0e10cSrcweir sal_Int32 nWidth,
206cdf0e10cSrcweir const ::rtl::OUString& aCommand ) :
207cdf0e10cSrcweir ComplexToolbarController( rServiceManager, rFrame, pToolbar, nID, aCommand )
208cdf0e10cSrcweir , m_bFloat( false )
209cdf0e10cSrcweir , m_bMaxSet( false )
210cdf0e10cSrcweir , m_bMinSet( false )
211cdf0e10cSrcweir , m_nMax( 0.0 )
212cdf0e10cSrcweir , m_nMin( 0.0 )
213cdf0e10cSrcweir , m_nValue( 0.0 )
214cdf0e10cSrcweir , m_nStep( 0.0 )
215cdf0e10cSrcweir , m_pSpinfieldControl( 0 )
216cdf0e10cSrcweir {
217cdf0e10cSrcweir m_pSpinfieldControl = new SpinfieldControl( m_pToolbar, WB_SPIN|WB_BORDER, this );
218cdf0e10cSrcweir if ( nWidth == 0 )
219cdf0e10cSrcweir nWidth = 100;
220cdf0e10cSrcweir
221cdf0e10cSrcweir // Calculate height of the spin field according to the application font height
222cdf0e10cSrcweir sal_Int32 nHeight = getFontSizePixel( m_pSpinfieldControl ) + 5 + 1;
223cdf0e10cSrcweir
224cdf0e10cSrcweir m_pSpinfieldControl->SetSizePixel( ::Size( nWidth, nHeight ));
225cdf0e10cSrcweir m_pToolbar->SetItemWindow( m_nID, m_pSpinfieldControl );
226cdf0e10cSrcweir }
227cdf0e10cSrcweir
228cdf0e10cSrcweir // ------------------------------------------------------------------
229cdf0e10cSrcweir
~SpinfieldToolbarController()230cdf0e10cSrcweir SpinfieldToolbarController::~SpinfieldToolbarController()
231cdf0e10cSrcweir {
232cdf0e10cSrcweir }
233cdf0e10cSrcweir
234cdf0e10cSrcweir // ------------------------------------------------------------------
235cdf0e10cSrcweir
dispose()236cdf0e10cSrcweir void SAL_CALL SpinfieldToolbarController::dispose()
237cdf0e10cSrcweir throw ( RuntimeException )
238cdf0e10cSrcweir {
239cdf0e10cSrcweir vos::OGuard aSolarMutexGuard( Application::GetSolarMutex() );
240cdf0e10cSrcweir
241cdf0e10cSrcweir m_pToolbar->SetItemWindow( m_nID, 0 );
242cdf0e10cSrcweir delete m_pSpinfieldControl;
243cdf0e10cSrcweir
244cdf0e10cSrcweir ComplexToolbarController::dispose();
245cdf0e10cSrcweir
246cdf0e10cSrcweir m_pSpinfieldControl = 0;
247cdf0e10cSrcweir }
248cdf0e10cSrcweir
249cdf0e10cSrcweir // ------------------------------------------------------------------
getExecuteArgs(sal_Int16 KeyModifier) const250cdf0e10cSrcweir Sequence<PropertyValue> SpinfieldToolbarController::getExecuteArgs(sal_Int16 KeyModifier) const
251cdf0e10cSrcweir {
252cdf0e10cSrcweir Sequence<PropertyValue> aArgs( 2 );
253cdf0e10cSrcweir ::rtl::OUString aSpinfieldText = m_pSpinfieldControl->GetText();
254cdf0e10cSrcweir
255cdf0e10cSrcweir // Add key modifier to argument list
256cdf0e10cSrcweir aArgs[0].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "KeyModifier" ));
257cdf0e10cSrcweir aArgs[0].Value <<= KeyModifier;
258cdf0e10cSrcweir aArgs[1].Name = rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "Value" ));
259cdf0e10cSrcweir if ( m_bFloat )
260cdf0e10cSrcweir aArgs[1].Value <<= aSpinfieldText.toDouble();
261cdf0e10cSrcweir else
262cdf0e10cSrcweir aArgs[1].Value <<= aSpinfieldText.toInt32();
263cdf0e10cSrcweir return aArgs;
264cdf0e10cSrcweir }
265cdf0e10cSrcweir
266cdf0e10cSrcweir // ------------------------------------------------------------------
267cdf0e10cSrcweir
Up()268cdf0e10cSrcweir void SpinfieldToolbarController::Up()
269cdf0e10cSrcweir {
270cdf0e10cSrcweir double nValue = m_nValue + m_nStep;
271cdf0e10cSrcweir if ( m_bMaxSet && nValue > m_nMax )
272cdf0e10cSrcweir return;
273cdf0e10cSrcweir
274cdf0e10cSrcweir m_nValue = nValue;
275cdf0e10cSrcweir
276cdf0e10cSrcweir rtl::OUString aText = impl_formatOutputString( m_nValue );
277cdf0e10cSrcweir m_pSpinfieldControl->SetText( aText );
278cdf0e10cSrcweir execute( 0 );
279cdf0e10cSrcweir }
280cdf0e10cSrcweir
Down()281cdf0e10cSrcweir void SpinfieldToolbarController::Down()
282cdf0e10cSrcweir {
283cdf0e10cSrcweir double nValue = m_nValue - m_nStep;
284cdf0e10cSrcweir if ( m_bMinSet && nValue < m_nMin )
285cdf0e10cSrcweir return;
286cdf0e10cSrcweir
287cdf0e10cSrcweir m_nValue = nValue;
288cdf0e10cSrcweir
289cdf0e10cSrcweir rtl::OUString aText = impl_formatOutputString( m_nValue );
290cdf0e10cSrcweir m_pSpinfieldControl->SetText( aText );
291cdf0e10cSrcweir execute( 0 );
292cdf0e10cSrcweir }
293cdf0e10cSrcweir
First()294cdf0e10cSrcweir void SpinfieldToolbarController::First()
295cdf0e10cSrcweir {
296cdf0e10cSrcweir if ( m_bMinSet )
297cdf0e10cSrcweir {
298cdf0e10cSrcweir m_nValue = m_nMin;
299cdf0e10cSrcweir
300cdf0e10cSrcweir rtl::OUString aText = impl_formatOutputString( m_nValue );
301cdf0e10cSrcweir m_pSpinfieldControl->SetText( aText );
302cdf0e10cSrcweir execute( 0 );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir }
305cdf0e10cSrcweir
Last()306cdf0e10cSrcweir void SpinfieldToolbarController::Last()
307cdf0e10cSrcweir {
308cdf0e10cSrcweir if ( m_bMaxSet )
309cdf0e10cSrcweir {
310cdf0e10cSrcweir m_nValue = m_nMax;
311cdf0e10cSrcweir
312cdf0e10cSrcweir rtl::OUString aText = impl_formatOutputString( m_nValue );
313cdf0e10cSrcweir m_pSpinfieldControl->SetText( aText );
314cdf0e10cSrcweir execute( 0 );
315cdf0e10cSrcweir }
316cdf0e10cSrcweir }
317cdf0e10cSrcweir
Modify()318cdf0e10cSrcweir void SpinfieldToolbarController::Modify()
319cdf0e10cSrcweir {
320cdf0e10cSrcweir notifyTextChanged( m_pSpinfieldControl->GetText() );
321cdf0e10cSrcweir }
322cdf0e10cSrcweir
KeyInput(const::KeyEvent &)323cdf0e10cSrcweir void SpinfieldToolbarController::KeyInput( const ::KeyEvent& /*rKEvt*/ )
324cdf0e10cSrcweir {
325cdf0e10cSrcweir }
326cdf0e10cSrcweir
GetFocus()327cdf0e10cSrcweir void SpinfieldToolbarController::GetFocus()
328cdf0e10cSrcweir {
329cdf0e10cSrcweir notifyFocusGet();
330cdf0e10cSrcweir }
331cdf0e10cSrcweir
LoseFocus()332cdf0e10cSrcweir void SpinfieldToolbarController::LoseFocus()
333cdf0e10cSrcweir {
334cdf0e10cSrcweir notifyFocusLost();
335cdf0e10cSrcweir }
336cdf0e10cSrcweir
StateChanged(StateChangedType)337cdf0e10cSrcweir void SpinfieldToolbarController::StateChanged( StateChangedType /*nType*/ )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir }
340cdf0e10cSrcweir
DataChanged(const DataChangedEvent &)341cdf0e10cSrcweir void SpinfieldToolbarController::DataChanged( const DataChangedEvent& /*rDCEvt*/ )
342cdf0e10cSrcweir {
343cdf0e10cSrcweir }
344cdf0e10cSrcweir
PreNotify(NotifyEvent & rNEvt)345cdf0e10cSrcweir long SpinfieldToolbarController::PreNotify( NotifyEvent& rNEvt )
346cdf0e10cSrcweir {
347cdf0e10cSrcweir if( rNEvt.GetType() == EVENT_KEYINPUT )
348cdf0e10cSrcweir {
349cdf0e10cSrcweir const ::KeyEvent* pKeyEvent = rNEvt.GetKeyEvent();
350cdf0e10cSrcweir const KeyCode& rKeyCode = pKeyEvent->GetKeyCode();
351cdf0e10cSrcweir if(( rKeyCode.GetModifier() | rKeyCode.GetCode()) == KEY_RETURN )
352cdf0e10cSrcweir {
353cdf0e10cSrcweir // Call execute only with non-empty text
354cdf0e10cSrcweir if ( m_pSpinfieldControl->GetText().Len() > 0 )
355cdf0e10cSrcweir execute( rKeyCode.GetModifier() );
356cdf0e10cSrcweir return 1;
357cdf0e10cSrcweir }
358cdf0e10cSrcweir }
359cdf0e10cSrcweir
360cdf0e10cSrcweir return 0;
361cdf0e10cSrcweir }
362cdf0e10cSrcweir
363cdf0e10cSrcweir // --------------------------------------------------------
364cdf0e10cSrcweir
executeControlCommand(const::com::sun::star::frame::ControlCommand & rControlCommand)365cdf0e10cSrcweir void SpinfieldToolbarController::executeControlCommand( const ::com::sun::star::frame::ControlCommand& rControlCommand )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir rtl::OUString aValue;
368cdf0e10cSrcweir rtl::OUString aMax;
369cdf0e10cSrcweir rtl::OUString aMin;
370cdf0e10cSrcweir rtl::OUString aStep;
371cdf0e10cSrcweir bool bFloatValue( false );
372cdf0e10cSrcweir
373cdf0e10cSrcweir if ( rControlCommand.Command.equalsAsciiL( "SetStep", 7 ))
374cdf0e10cSrcweir {
375cdf0e10cSrcweir for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
376cdf0e10cSrcweir {
377cdf0e10cSrcweir sal_Int32 nValue;
378cdf0e10cSrcweir double fValue;
379cdf0e10cSrcweir bool bFloat( false );
380cdf0e10cSrcweir
381cdf0e10cSrcweir if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Step", 4 ))
382cdf0e10cSrcweir {
383cdf0e10cSrcweir if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
384cdf0e10cSrcweir aStep = bFloat ? ::rtl::OUString::valueOf( fValue ) :
385cdf0e10cSrcweir ::rtl::OUString::valueOf( nValue );
386cdf0e10cSrcweir break;
387cdf0e10cSrcweir }
388cdf0e10cSrcweir }
389cdf0e10cSrcweir }
390cdf0e10cSrcweir else if ( rControlCommand.Command.equalsAsciiL( "SetValue", 8 ))
391cdf0e10cSrcweir {
392cdf0e10cSrcweir for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
393cdf0e10cSrcweir {
394cdf0e10cSrcweir if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "Value", 5 ))
395cdf0e10cSrcweir {
396cdf0e10cSrcweir sal_Int32 nValue;
397cdf0e10cSrcweir double fValue;
398cdf0e10cSrcweir bool bFloat( false );
399cdf0e10cSrcweir
400cdf0e10cSrcweir if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
401cdf0e10cSrcweir {
402cdf0e10cSrcweir aValue = bFloat ? ::rtl::OUString::valueOf( fValue ) : ::rtl::OUString::valueOf( nValue );
403cdf0e10cSrcweir bFloatValue = bFloat;
404cdf0e10cSrcweir }
405cdf0e10cSrcweir break;
406cdf0e10cSrcweir }
407cdf0e10cSrcweir }
408cdf0e10cSrcweir }
409cdf0e10cSrcweir else if ( rControlCommand.Command.equalsAsciiL( "SetValues", 9 ))
410cdf0e10cSrcweir {
411cdf0e10cSrcweir for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
412cdf0e10cSrcweir {
413cdf0e10cSrcweir sal_Int32 nValue;
414cdf0e10cSrcweir double fValue;
415cdf0e10cSrcweir bool bFloat( false );
416cdf0e10cSrcweir
417cdf0e10cSrcweir rtl::OUString aName = rControlCommand.Arguments[i].Name;
418cdf0e10cSrcweir if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
419cdf0e10cSrcweir {
420cdf0e10cSrcweir if ( aName.equalsAsciiL( "Value", 5 ))
421cdf0e10cSrcweir {
422cdf0e10cSrcweir aValue = bFloat ? ::rtl::OUString::valueOf( fValue ) : ::rtl::OUString::valueOf( nValue );
423cdf0e10cSrcweir bFloatValue = bFloat;
424cdf0e10cSrcweir }
425cdf0e10cSrcweir else if ( aName.equalsAsciiL( "Step", 4 ))
426cdf0e10cSrcweir aStep = bFloat ? ::rtl::OUString::valueOf( fValue ) :
427cdf0e10cSrcweir ::rtl::OUString::valueOf( nValue );
428cdf0e10cSrcweir else if ( aName.equalsAsciiL( "LowerLimit", 10 ))
429cdf0e10cSrcweir aMin = bFloat ? ::rtl::OUString::valueOf( fValue ) :
430cdf0e10cSrcweir ::rtl::OUString::valueOf( nValue );
431cdf0e10cSrcweir else if ( aName.equalsAsciiL( "UpperLimit", 10 ))
432cdf0e10cSrcweir aMax = bFloat ? ::rtl::OUString::valueOf( fValue ) :
433cdf0e10cSrcweir ::rtl::OUString::valueOf( nValue );
434cdf0e10cSrcweir }
435cdf0e10cSrcweir else if ( aName.equalsAsciiL( "OutputFormat", 12 ))
436cdf0e10cSrcweir rControlCommand.Arguments[i].Value >>= m_aOutFormat;
437cdf0e10cSrcweir }
438cdf0e10cSrcweir }
439cdf0e10cSrcweir else if ( rControlCommand.Command.equalsAsciiL( "SetLowerLimit", 13 ))
440cdf0e10cSrcweir {
441cdf0e10cSrcweir for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
442cdf0e10cSrcweir {
443cdf0e10cSrcweir sal_Int32 nValue;
444cdf0e10cSrcweir double fValue;
445cdf0e10cSrcweir bool bFloat( false );
446cdf0e10cSrcweir
447cdf0e10cSrcweir if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "LowerLimit", 10 ))
448cdf0e10cSrcweir {
449cdf0e10cSrcweir if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
450cdf0e10cSrcweir aMin = bFloat ? ::rtl::OUString::valueOf( fValue ) :
451cdf0e10cSrcweir ::rtl::OUString::valueOf( nValue );
452cdf0e10cSrcweir break;
453cdf0e10cSrcweir }
454cdf0e10cSrcweir }
455cdf0e10cSrcweir }
456cdf0e10cSrcweir else if ( rControlCommand.Command.equalsAsciiL( "SetUpperLimit", 13 ))
457cdf0e10cSrcweir {
458cdf0e10cSrcweir for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
459cdf0e10cSrcweir {
460cdf0e10cSrcweir sal_Int32 nValue;
461cdf0e10cSrcweir double fValue;
462cdf0e10cSrcweir bool bFloat( false );
463cdf0e10cSrcweir
464cdf0e10cSrcweir if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "UpperLimit", 10 ))
465cdf0e10cSrcweir {
466cdf0e10cSrcweir if ( impl_getValue( rControlCommand.Arguments[i].Value, nValue, fValue, bFloat ))
467cdf0e10cSrcweir aMax = bFloat ? ::rtl::OUString::valueOf( fValue ) :
468cdf0e10cSrcweir ::rtl::OUString::valueOf( nValue );
469cdf0e10cSrcweir break;
470cdf0e10cSrcweir }
471cdf0e10cSrcweir }
472cdf0e10cSrcweir }
473cdf0e10cSrcweir else if ( rControlCommand.Command.equalsAsciiL( "SetOutputFormat", 15 ))
474cdf0e10cSrcweir {
475cdf0e10cSrcweir for ( sal_Int32 i = 0; i < rControlCommand.Arguments.getLength(); i++ )
476cdf0e10cSrcweir {
477cdf0e10cSrcweir if ( rControlCommand.Arguments[i].Name.equalsAsciiL( "OutputFormat", 10 ))
478cdf0e10cSrcweir {
479cdf0e10cSrcweir rControlCommand.Arguments[i].Value >>= m_aOutFormat;
480cdf0e10cSrcweir break;
481cdf0e10cSrcweir }
482cdf0e10cSrcweir }
483cdf0e10cSrcweir }
484cdf0e10cSrcweir
485cdf0e10cSrcweir // Check values and set members
486cdf0e10cSrcweir if ( aValue.getLength() > 0 )
487cdf0e10cSrcweir {
488cdf0e10cSrcweir m_bFloat = bFloatValue;
489cdf0e10cSrcweir m_nValue = aValue.toDouble();
490cdf0e10cSrcweir
491cdf0e10cSrcweir rtl::OUString aOutString = impl_formatOutputString( m_nValue );
492cdf0e10cSrcweir m_pSpinfieldControl->SetText( aOutString );
493cdf0e10cSrcweir notifyTextChanged( aOutString );
494cdf0e10cSrcweir }
495cdf0e10cSrcweir if ( aMax.getLength() > 0 )
496cdf0e10cSrcweir {
497cdf0e10cSrcweir m_nMax = aMax.toDouble();
498cdf0e10cSrcweir m_bMaxSet = true;
499cdf0e10cSrcweir }
500cdf0e10cSrcweir if ( aMin.getLength() > 0 )
501cdf0e10cSrcweir {
502cdf0e10cSrcweir m_nMin = aMin.toDouble();
503cdf0e10cSrcweir m_bMinSet = true;
504cdf0e10cSrcweir }
505cdf0e10cSrcweir if ( aStep.getLength() > 0 )
506cdf0e10cSrcweir m_nStep = aStep.toDouble();
507cdf0e10cSrcweir }
508cdf0e10cSrcweir
impl_getValue(const Any & rAny,sal_Int32 & nValue,double & fValue,bool & bFloat)509cdf0e10cSrcweir bool SpinfieldToolbarController::impl_getValue(
510cdf0e10cSrcweir const Any& rAny, sal_Int32& nValue, double& fValue, bool& bFloat )
511cdf0e10cSrcweir {
512cdf0e10cSrcweir using ::com::sun::star::uno::TypeClass;
513cdf0e10cSrcweir
514cdf0e10cSrcweir bool bValueValid( false );
515cdf0e10cSrcweir
516cdf0e10cSrcweir bFloat = false;
517cdf0e10cSrcweir TypeClass aTypeClass = rAny.getValueTypeClass();
518cdf0e10cSrcweir if (( aTypeClass == TypeClass( typelib_TypeClass_LONG )) ||
519cdf0e10cSrcweir ( aTypeClass == TypeClass( typelib_TypeClass_SHORT )) ||
520cdf0e10cSrcweir ( aTypeClass == TypeClass( typelib_TypeClass_BYTE )))
521cdf0e10cSrcweir bValueValid = rAny >>= nValue;
522cdf0e10cSrcweir else if (( aTypeClass == TypeClass( typelib_TypeClass_FLOAT )) ||
523cdf0e10cSrcweir ( aTypeClass == TypeClass( typelib_TypeClass_DOUBLE )))
524cdf0e10cSrcweir {
525cdf0e10cSrcweir bValueValid = rAny >>= fValue;
526cdf0e10cSrcweir bFloat = true;
527cdf0e10cSrcweir }
528cdf0e10cSrcweir
529cdf0e10cSrcweir return bValueValid;
530cdf0e10cSrcweir }
531cdf0e10cSrcweir
impl_formatOutputString(double fValue)532cdf0e10cSrcweir rtl::OUString SpinfieldToolbarController::impl_formatOutputString( double fValue )
533cdf0e10cSrcweir {
534cdf0e10cSrcweir if ( m_aOutFormat.getLength() == 0 )
535cdf0e10cSrcweir {
536cdf0e10cSrcweir if ( m_bFloat )
537cdf0e10cSrcweir return rtl::OUString::valueOf( fValue );
538cdf0e10cSrcweir else
539cdf0e10cSrcweir return rtl::OUString::valueOf( sal_Int32( fValue ));
540cdf0e10cSrcweir }
541cdf0e10cSrcweir else
542cdf0e10cSrcweir {
543cdf0e10cSrcweir #ifdef WNT
544cdf0e10cSrcweir sal_Unicode aBuffer[128];
545cdf0e10cSrcweir
546cdf0e10cSrcweir aBuffer[0] = 0;
547cdf0e10cSrcweir if ( m_bFloat )
548cdf0e10cSrcweir snwprintf( reinterpret_cast<wchar_t *>(aBuffer), 128, reinterpret_cast<const wchar_t *>(m_aOutFormat.getStr()), fValue );
549cdf0e10cSrcweir else
550cdf0e10cSrcweir snwprintf( reinterpret_cast<wchar_t *>(aBuffer), 128, reinterpret_cast<const wchar_t *>(m_aOutFormat.getStr()), sal_Int32( fValue ));
551cdf0e10cSrcweir
552cdf0e10cSrcweir sal_Int32 nSize = rtl_ustr_getLength( aBuffer );
553cdf0e10cSrcweir return rtl::OUString( aBuffer, nSize );
554cdf0e10cSrcweir #else
555cdf0e10cSrcweir // Currently we have no support for a format string using sal_Unicode. wchar_t
556cdf0e10cSrcweir // is 32 bit on Unix platform!
557cdf0e10cSrcweir char aBuffer[128];
558cdf0e10cSrcweir
559cdf0e10cSrcweir ::rtl::OString aFormat = OUStringToOString( m_aOutFormat, osl_getThreadTextEncoding() );
560cdf0e10cSrcweir if ( m_bFloat )
561cdf0e10cSrcweir snprintf( aBuffer, 128, aFormat.getStr(), fValue );
562cdf0e10cSrcweir else
563cdf0e10cSrcweir snprintf( aBuffer, 128, aFormat.getStr(), static_cast<long>( fValue ));
564cdf0e10cSrcweir
565cdf0e10cSrcweir sal_Int32 nSize = strlen( aBuffer );
566cdf0e10cSrcweir rtl::OString aTmp( aBuffer, nSize );
567cdf0e10cSrcweir return rtl::OStringToOUString( aTmp, osl_getThreadTextEncoding() );
568cdf0e10cSrcweir #endif
569cdf0e10cSrcweir }
570cdf0e10cSrcweir }
571cdf0e10cSrcweir
572cdf0e10cSrcweir } // namespace
573cdf0e10cSrcweir
574