xref: /AOO41X/main/svtools/source/uno/unoiface.cxx (revision 5900e8ec128faec89519683efce668ccd8cc6084)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svtools.hxx"
26 
27 #define _SVT_UNOIFACE_CXX
28 #include <tools/debug.hxx>
29 #include <vcl/svapp.hxx>
30 #include <svtools/svmedit.hxx>
31 #include <unoiface.hxx>
32 #include <svtools/filedlg.hxx>
33 #include <svtools/filectrl.hxx>
34 #include <svtools/roadmap.hxx>
35 #include <svtools/fixedhyper.hxx>
36 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
37 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
38 #include <com/sun/star/awt/LineEndFormat.hpp>
39 #include <comphelper/processfactory.hxx>
40 #include <toolkit/helper/convert.hxx>
41 #include <toolkit/helper/property.hxx>
42 #include <svtools/fmtfield.hxx>
43 #include <svl/numuno.hxx>
44 #include <svtools/calendar.hxx>
45 #include <svtools/prgsbar.hxx>
46 #include <svtools/svtreebx.hxx>
47 #include "treecontrolpeer.hxx"
48 #include "svtxgridcontrol.hxx"
49 #include <svtools/table/tablecontrol.hxx>
50 
51 namespace
52 {
lcl_setWinBits(Window * _pWindow,WinBits _nBits,sal_Bool _bSet)53     static void lcl_setWinBits( Window* _pWindow, WinBits _nBits, sal_Bool _bSet )
54     {
55         WinBits nStyle = _pWindow->GetStyle();
56         if ( _bSet )
57             nStyle |= _nBits;
58         else
59             nStyle &= ~_nBits;
60         _pWindow->SetStyle( nStyle );
61     }
62 }
63 
64 //  ----------------------------------------------------
65 //  help function for the toolkit...
66 //  ----------------------------------------------------
67 
68 extern "C" {
69 
CreateWindow(VCLXWindow ** ppNewComp,const::com::sun::star::awt::WindowDescriptor * pDescriptor,Window * pParent,WinBits nWinBits)70 SAL_DLLPUBLIC_EXPORT Window* CreateWindow( VCLXWindow** ppNewComp, const ::com::sun::star::awt::WindowDescriptor* pDescriptor, Window* pParent, WinBits nWinBits )
71 {
72     Window* pWindow = NULL;
73     String aServiceName( pDescriptor->WindowServiceName );
74     if ( aServiceName.EqualsIgnoreCaseAscii( "MultiLineEdit" ) )
75     {
76         if ( pParent )
77         {
78             pWindow = new MultiLineEdit( pParent, nWinBits|WB_IGNORETAB);
79             static_cast< MultiLineEdit* >( pWindow )->DisableSelectionOnFocus();
80             *ppNewComp = new VCLXMultiLineEdit;
81         }
82         else
83         {
84             *ppNewComp = NULL;
85             return NULL;
86         }
87     }
88     else if ( aServiceName.EqualsIgnoreCaseAscii( "FileControl" ) )
89     {
90         if ( pParent )
91         {
92             pWindow = new FileControl( pParent, nWinBits );
93             *ppNewComp = new VCLXFileControl;
94         }
95         else
96         {
97             *ppNewComp = NULL;
98             return NULL;
99         }
100     }
101     else if (aServiceName.EqualsIgnoreCaseAscii("FormattedField") )
102     {
103         pWindow = new FormattedField( pParent, nWinBits );
104         *ppNewComp = new SVTXFormattedField;
105     }
106     else if (aServiceName.EqualsIgnoreCaseAscii("NumericField") )
107     {
108         pWindow = new DoubleNumericField( pParent, nWinBits );
109         *ppNewComp = new SVTXNumericField;
110     }
111     else if (aServiceName.EqualsIgnoreCaseAscii("LongCurrencyField") )
112     {
113         pWindow = new DoubleCurrencyField( pParent, nWinBits );
114         *ppNewComp = new SVTXCurrencyField;
115     }
116     else if (aServiceName.EqualsIgnoreCaseAscii("datefield") )
117     {
118         pWindow = new CalendarField( pParent, nWinBits);
119         static_cast<CalendarField*>(pWindow)->EnableToday();
120         static_cast<CalendarField*>(pWindow)->EnableNone();
121         static_cast<CalendarField*>(pWindow)->EnableEmptyFieldValue( sal_True );
122         *ppNewComp = new SVTXDateField;
123         ((VCLXFormattedSpinField*)*ppNewComp)->SetFormatter( (FormatterBase*)(DateField*)pWindow );
124     }
125     else if (aServiceName.EqualsIgnoreCaseAscii("roadmap") )
126     {
127         pWindow = new ::svt::ORoadmap( pParent, WB_TABSTOP );
128         *ppNewComp = new SVTXRoadmap;
129     }
130     else if ( aServiceName.EqualsIgnoreCaseAscii( "ProgressBar" ) )
131     {
132         if ( pParent )
133         {
134             pWindow = new ProgressBar( pParent, nWinBits );
135             *ppNewComp = new VCLXProgressBar;
136         }
137         else
138         {
139             *ppNewComp = NULL;
140             return NULL;
141         }
142     }
143     else if ( aServiceName.EqualsIgnoreCaseAscii( "Tree" ) )
144     {
145         TreeControlPeer* pPeer = new TreeControlPeer;
146         *ppNewComp = pPeer;
147         pWindow = pPeer->createVclControl( pParent, nWinBits );
148     }
149     else if ( aServiceName.EqualsIgnoreCaseAscii( "FixedHyperlink" ) )
150     {
151         if ( pParent )
152         {
153             pWindow = new ::svt::FixedHyperlink( pParent, nWinBits );
154             *ppNewComp = new VCLXFixedHyperlink;
155         }
156         else
157         {
158             *ppNewComp = NULL;
159             return NULL;
160         }
161     }
162     else if ( aServiceName.EqualsIgnoreCaseAscii( "Grid" ) )
163     {
164         if ( pParent )
165         {
166             pWindow = new ::svt::table::TableControl(pParent, nWinBits);
167             *ppNewComp = new SVTXGridControl;
168         }
169         else
170         {
171             *ppNewComp = NULL;
172             return NULL;
173         }
174     }
175     return pWindow;
176 }
177 
178 }   // extern "C"
179 
180 //  ----------------------------------------------------
181 //  class VCLXMultiLineEdit
182 //  ----------------------------------------------------
VCLXMultiLineEdit()183 VCLXMultiLineEdit::VCLXMultiLineEdit()
184     :maTextListeners( *this )
185     ,meLineEndType( LINEEND_LF )    // default behavior before introducing this property: LF (unix-like)
186 {
187 }
188 
~VCLXMultiLineEdit()189 VCLXMultiLineEdit::~VCLXMultiLineEdit()
190 {
191 }
192 
queryInterface(const::com::sun::star::uno::Type & rType)193 ::com::sun::star::uno::Any VCLXMultiLineEdit::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
194 {
195     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
196                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextComponent*, this ),
197                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextArea*, this ),
198                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextLayoutConstrains*, this ),
199                                         SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) );
200     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
201 }
202 
203 // ::com::sun::star::lang::XTypeProvider
204 IMPL_XTYPEPROVIDER_START( VCLXMultiLineEdit )
205     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent>* ) NULL ),
206     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextArea>* ) NULL ),
207     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextLayoutConstrains>* ) NULL ),
208     VCLXWindow::getTypes()
209 IMPL_XTYPEPROVIDER_END
210 
211 void VCLXMultiLineEdit::addTextListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener > & l ) throw(::com::sun::star::uno::RuntimeException)
212 {
213     maTextListeners.addInterface( l );
214 }
215 
removeTextListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::XTextListener> & l)216 void VCLXMultiLineEdit::removeTextListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener > & l ) throw(::com::sun::star::uno::RuntimeException)
217 {
218     maTextListeners.removeInterface( l );
219 }
220 
setText(const::rtl::OUString & aText)221 void VCLXMultiLineEdit::setText( const ::rtl::OUString& aText ) throw(::com::sun::star::uno::RuntimeException)
222 {
223     ::vos::OGuard aGuard( GetMutex() );
224 
225     MultiLineEdit* pEdit = (MultiLineEdit*)GetWindow();
226     if ( pEdit )
227     {
228         pEdit->SetText( aText );
229 
230         // #107218# Call same listeners like VCL would do after user interaction
231         SetSynthesizingVCLEvent( sal_True );
232         pEdit->SetModifyFlag();
233         pEdit->Modify();
234         SetSynthesizingVCLEvent( sal_False );
235     }
236 }
237 
insertText(const::com::sun::star::awt::Selection & rSel,const::rtl::OUString & aText)238 void VCLXMultiLineEdit::insertText( const ::com::sun::star::awt::Selection& rSel, const ::rtl::OUString& aText ) throw(::com::sun::star::uno::RuntimeException)
239 {
240     ::vos::OGuard aGuard( GetMutex() );
241 
242     MultiLineEdit* pEdit = (MultiLineEdit*)GetWindow();
243     if ( pEdit )
244     {
245         setSelection( rSel );
246         pEdit->ReplaceSelected( aText );
247     }
248 }
249 
getText()250 ::rtl::OUString VCLXMultiLineEdit::getText() throw(::com::sun::star::uno::RuntimeException)
251 {
252     ::vos::OGuard aGuard( GetMutex() );
253 
254     ::rtl::OUString aText;
255     MultiLineEdit* pEdit = (MultiLineEdit*)GetWindow();
256     if ( pEdit )
257         aText = pEdit->GetText( meLineEndType );
258     return aText;
259 }
260 
getSelectedText()261 ::rtl::OUString VCLXMultiLineEdit::getSelectedText() throw(::com::sun::star::uno::RuntimeException)
262 {
263     ::vos::OGuard aGuard( GetMutex() );
264 
265     ::rtl::OUString aText;
266     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*) GetWindow();
267     if ( pMultiLineEdit)
268         aText = pMultiLineEdit->GetSelected( meLineEndType );
269     return aText;
270 
271 }
272 
setSelection(const::com::sun::star::awt::Selection & aSelection)273 void VCLXMultiLineEdit::setSelection( const ::com::sun::star::awt::Selection& aSelection ) throw(::com::sun::star::uno::RuntimeException)
274 {
275     ::vos::OGuard aGuard( GetMutex() );
276 
277     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*) GetWindow();
278     if ( pMultiLineEdit )
279     {
280         pMultiLineEdit->SetSelection( Selection( aSelection.Min, aSelection.Max ) );
281     }
282 }
283 
getSelection()284 ::com::sun::star::awt::Selection VCLXMultiLineEdit::getSelection() throw(::com::sun::star::uno::RuntimeException)
285 {
286     ::vos::OGuard aGuard( GetMutex() );
287 
288     ::com::sun::star::awt::Selection aSel;
289     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*) GetWindow();
290     if ( pMultiLineEdit )
291     {
292         aSel.Min = pMultiLineEdit->GetSelection().Min();
293         aSel.Max = pMultiLineEdit->GetSelection().Max();
294     }
295     return aSel;
296 }
297 
isEditable()298 sal_Bool VCLXMultiLineEdit::isEditable() throw(::com::sun::star::uno::RuntimeException)
299 {
300     ::vos::OGuard aGuard( GetMutex() );
301 
302     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*) GetWindow();
303     return ( pMultiLineEdit && !pMultiLineEdit->IsReadOnly() && pMultiLineEdit->IsEnabled() ) ? sal_True : sal_False;
304 }
305 
setEditable(sal_Bool bEditable)306 void VCLXMultiLineEdit::setEditable( sal_Bool bEditable ) throw(::com::sun::star::uno::RuntimeException)
307 {
308     ::vos::OGuard aGuard( GetMutex() );
309 
310     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*) GetWindow();
311     if ( pMultiLineEdit )
312         pMultiLineEdit->SetReadOnly( !bEditable );
313 }
314 
setMaxTextLen(sal_Int16 nLen)315 void VCLXMultiLineEdit::setMaxTextLen( sal_Int16 nLen ) throw(::com::sun::star::uno::RuntimeException)
316 {
317     ::vos::OGuard aGuard( GetMutex() );
318 
319     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*) GetWindow();
320     if ( pMultiLineEdit )
321         pMultiLineEdit->SetMaxTextLen( nLen );
322 }
323 
getMaxTextLen()324 sal_Int16 VCLXMultiLineEdit::getMaxTextLen() throw(::com::sun::star::uno::RuntimeException)
325 {
326     ::vos::OGuard aGuard( GetMutex() );
327 
328     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*) GetWindow();
329     return pMultiLineEdit ? (sal_Int16)pMultiLineEdit->GetMaxTextLen() : (sal_Int16)0;
330 }
331 
getTextLines()332 ::rtl::OUString VCLXMultiLineEdit::getTextLines() throw(::com::sun::star::uno::RuntimeException)
333 {
334     ::vos::OGuard aGuard( GetMutex() );
335 
336     ::rtl::OUString aText;
337     MultiLineEdit* pEdit = (MultiLineEdit*)GetWindow();
338     if ( pEdit )
339         aText = pEdit->GetTextLines( meLineEndType );
340     return aText;
341 }
342 
getMinimumSize()343 ::com::sun::star::awt::Size VCLXMultiLineEdit::getMinimumSize() throw(::com::sun::star::uno::RuntimeException)
344 {
345     ::vos::OGuard aGuard( GetMutex() );
346 
347     ::com::sun::star::awt::Size aSz;
348     MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
349     if ( pEdit )
350         aSz = AWTSize(pEdit->CalcMinimumSize());
351     return aSz;
352 }
353 
getPreferredSize()354 ::com::sun::star::awt::Size VCLXMultiLineEdit::getPreferredSize() throw(::com::sun::star::uno::RuntimeException)
355 {
356     return getMinimumSize();
357 }
358 
calcAdjustedSize(const::com::sun::star::awt::Size & rNewSize)359 ::com::sun::star::awt::Size VCLXMultiLineEdit::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
360 {
361     ::vos::OGuard aGuard( GetMutex() );
362 
363     ::com::sun::star::awt::Size aSz = rNewSize;
364     MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
365     if ( pEdit )
366         aSz = AWTSize(pEdit->CalcAdjustedSize( VCLSize(rNewSize )));
367     return aSz;
368 }
369 
getMinimumSize(sal_Int16 nCols,sal_Int16 nLines)370 ::com::sun::star::awt::Size VCLXMultiLineEdit::getMinimumSize( sal_Int16 nCols, sal_Int16 nLines ) throw(::com::sun::star::uno::RuntimeException)
371 {
372     ::vos::OGuard aGuard( GetMutex() );
373 
374     ::com::sun::star::awt::Size aSz;
375     MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
376     if ( pEdit )
377         aSz = AWTSize(pEdit->CalcSize( nCols, nLines ));
378     return aSz;
379 }
380 
getColumnsAndLines(sal_Int16 & nCols,sal_Int16 & nLines)381 void VCLXMultiLineEdit::getColumnsAndLines( sal_Int16& nCols, sal_Int16& nLines ) throw(::com::sun::star::uno::RuntimeException)
382 {
383     ::vos::OGuard aGuard( GetMutex() );
384 
385     nCols = nLines = 0;
386     MultiLineEdit* pEdit = (MultiLineEdit*) GetWindow();
387     if ( pEdit )
388     {
389         sal_uInt16 nC, nL;
390         pEdit->GetMaxVisColumnsAndLines( nC, nL );
391         nCols = nC;
392         nLines = nL;
393     }
394 }
395 
ProcessWindowEvent(const VclWindowEvent & rVclWindowEvent)396 void VCLXMultiLineEdit::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
397 {
398     switch ( rVclWindowEvent.GetId() )
399     {
400         case VCLEVENT_EDIT_MODIFY:
401         {
402             if ( maTextListeners.getLength() )
403             {
404                 ::com::sun::star::awt::TextEvent aEvent;
405                 aEvent.Source = (::cppu::OWeakObject*)this;
406                 maTextListeners.textChanged( aEvent );
407             }
408         }
409         break;
410         default:
411         {
412             VCLXWindow::ProcessWindowEvent( rVclWindowEvent );
413         }
414         break;
415     }
416 }
417 
setProperty(const::rtl::OUString & PropertyName,const::com::sun::star::uno::Any & Value)418 void VCLXMultiLineEdit::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
419 {
420     ::vos::OGuard aGuard( GetMutex() );
421 
422     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*)GetWindow();
423     if ( pMultiLineEdit )
424     {
425         sal_uInt16 nPropType = GetPropertyId( PropertyName );
426         switch ( nPropType )
427         {
428             case BASEPROPERTY_LINE_END_FORMAT:
429             {
430                 sal_Int16 nLineEndType = ::com::sun::star::awt::LineEndFormat::LINE_FEED;
431                 OSL_VERIFY( Value >>= nLineEndType );
432                 switch ( nLineEndType )
433                 {
434                 case ::com::sun::star::awt::LineEndFormat::CARRIAGE_RETURN:           meLineEndType = LINEEND_CR; break;
435                 case ::com::sun::star::awt::LineEndFormat::LINE_FEED:                 meLineEndType = LINEEND_LF; break;
436                 case ::com::sun::star::awt::LineEndFormat::CARRIAGE_RETURN_LINE_FEED: meLineEndType = LINEEND_CRLF; break;
437                 default: DBG_ERROR( "VCLXMultiLineEdit::setProperty: invalid line end value!" ); break;
438                 }
439             }
440             break;
441 
442             case BASEPROPERTY_READONLY:
443             {
444                 sal_Bool b = sal_Bool();
445                 if ( Value >>= b )
446                     pMultiLineEdit->SetReadOnly( b );
447             }
448             break;
449             case BASEPROPERTY_MAXTEXTLEN:
450             {
451                 sal_Int16 n = sal_Int16();
452                 if ( Value >>= n )
453                     pMultiLineEdit->SetMaxTextLen( n );
454             }
455             break;
456             case BASEPROPERTY_HIDEINACTIVESELECTION:
457             {
458                 sal_Bool b = sal_Bool();
459                 if ( Value >>= b )
460                 {
461                     pMultiLineEdit->EnableFocusSelectionHide( b );
462                     lcl_setWinBits( pMultiLineEdit, WB_NOHIDESELECTION, !b );
463                 }
464             }
465             break;
466             default:
467             {
468                 VCLXWindow::setProperty( PropertyName, Value );
469             }
470         }
471     }
472 }
473 
getProperty(const::rtl::OUString & PropertyName)474 ::com::sun::star::uno::Any VCLXMultiLineEdit::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
475 {
476     ::vos::OGuard aGuard( GetMutex() );
477 
478     ::com::sun::star::uno::Any aProp;
479     MultiLineEdit* pMultiLineEdit = (MultiLineEdit*)GetWindow();
480     if ( pMultiLineEdit )
481     {
482         sal_uInt16 nPropType = GetPropertyId( PropertyName );
483         switch ( nPropType )
484         {
485             case BASEPROPERTY_LINE_END_FORMAT:
486             {
487                 sal_Int16 nLineEndType = ::com::sun::star::awt::LineEndFormat::LINE_FEED;
488                 switch ( meLineEndType )
489                 {
490                 case LINEEND_CR:   nLineEndType = ::com::sun::star::awt::LineEndFormat::CARRIAGE_RETURN; break;
491                 case LINEEND_LF:   nLineEndType = ::com::sun::star::awt::LineEndFormat::LINE_FEED; break;
492                 case LINEEND_CRLF: nLineEndType = ::com::sun::star::awt::LineEndFormat::CARRIAGE_RETURN_LINE_FEED; break;
493                 default: DBG_ERROR( "VCLXMultiLineEdit::getProperty: invalid line end value!" ); break;
494                 }
495                 aProp <<= nLineEndType;
496             }
497             break;
498 
499             case BASEPROPERTY_READONLY:
500             {
501                 aProp <<= pMultiLineEdit->IsReadOnly();
502             }
503             break;
504             case BASEPROPERTY_MAXTEXTLEN:
505             {
506                 aProp <<= (sal_Int16) pMultiLineEdit->GetMaxTextLen();
507             }
508             break;
509             default:
510             {
511                 aProp <<= VCLXWindow::getProperty( PropertyName );
512             }
513         }
514     }
515     return aProp;
516 }
517 
setFocus()518 void SAL_CALL VCLXMultiLineEdit::setFocus(  ) throw(::com::sun::star::uno::RuntimeException)
519 {
520     ::vos::OGuard aGuard( GetMutex() );
521 
522     // don't grab the focus if we already have it. Reason is that the only thing which the edit
523     // does is forwarding the focus to it's text window. This text window then does a "select all".
524     // So if the text window already has the focus, and we give the focus to the multi line
525     // edit, then all which happens is that everything is selected.
526     // #i27072# - 2004-04-25 - fs@openoffice.org
527     if ( GetWindow() && !GetWindow()->HasChildPathFocus() )
528         GetWindow()->GrabFocus();
529 }
530 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)531 void VCLXMultiLineEdit::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
532 {
533     PushPropertyIds( rIds,
534                      // FIXME: elide duplication ?
535                      BASEPROPERTY_LINE_END_FORMAT,
536                      BASEPROPERTY_READONLY,
537                      BASEPROPERTY_MAXTEXTLEN,
538                      BASEPROPERTY_HIDEINACTIVESELECTION,
539                      0);
540     VCLXWindow::ImplGetPropertyIds( rIds, true );
541 
542 }
543 //  ----------------------------------------------------
544 //  class VCLXFileControl
545 //  ----------------------------------------------------
VCLXFileControl()546 VCLXFileControl::VCLXFileControl() : maTextListeners( *this )
547 {
548 }
549 
~VCLXFileControl()550 VCLXFileControl::~VCLXFileControl()
551 {
552     FileControl* pControl = (FileControl*) GetWindow();
553     if ( pControl )
554         pControl->GetEdit().SetModifyHdl( Link() );
555 }
556 
queryInterface(const::com::sun::star::uno::Type & rType)557 ::com::sun::star::uno::Any VCLXFileControl::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
558 {
559     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
560                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextComponent*, this ),
561                                         SAL_STATIC_CAST( ::com::sun::star::awt::XTextLayoutConstrains*, this ),
562                                         SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) );
563     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
564 }
565 
566 // ::com::sun::star::lang::XTypeProvider
567 IMPL_XTYPEPROVIDER_START( VCLXFileControl )
568     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextComponent>* ) NULL ),
569     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextLayoutConstrains>* ) NULL ),
570     VCLXWindow::getTypes()
571 IMPL_XTYPEPROVIDER_END
572 
573 void SAL_CALL VCLXFileControl::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
574 {
575     ::vos::OGuard aGuard( GetMutex() );
576 
577     FileControl* pControl = (FileControl*)GetWindow();
578     if ( pControl )
579     {
580         sal_uInt16 nPropType = GetPropertyId( PropertyName );
581         switch ( nPropType )
582         {
583         case BASEPROPERTY_HIDEINACTIVESELECTION:
584         {
585             sal_Bool bValue( sal_False );
586             OSL_VERIFY( Value >>= bValue );
587 
588             lcl_setWinBits( pControl, WB_NOHIDESELECTION, !bValue );
589             lcl_setWinBits( &pControl->GetEdit(), WB_NOHIDESELECTION, !bValue );
590         }
591         break;
592 
593         default:
594             VCLXWindow::setProperty( PropertyName, Value );
595             break;
596         }
597     }
598 }
599 
SetWindow(Window * pWindow)600 void VCLXFileControl::SetWindow( Window* pWindow )
601 {
602     FileControl* pPrevFileControl = dynamic_cast<FileControl*>( GetWindow() );
603     if ( pPrevFileControl )
604         pPrevFileControl->GetEdit().SetModifyHdl( Link() );
605 
606     FileControl* pNewFileControl = dynamic_cast<FileControl*>( pWindow );
607     if ( pNewFileControl )
608         pNewFileControl->GetEdit().SetModifyHdl( LINK( this, VCLXFileControl, ModifyHdl ) );
609 
610     VCLXWindow::SetWindow( pWindow );
611 }
612 
addTextListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::XTextListener> & l)613 void VCLXFileControl::addTextListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener > & l ) throw(::com::sun::star::uno::RuntimeException)
614 {
615     maTextListeners.addInterface( l );
616 }
617 
removeTextListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::XTextListener> & l)618 void VCLXFileControl::removeTextListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener > & l ) throw(::com::sun::star::uno::RuntimeException)
619 {
620     maTextListeners.removeInterface( l );
621 }
622 
setText(const::rtl::OUString & aText)623 void VCLXFileControl::setText( const ::rtl::OUString& aText ) throw(::com::sun::star::uno::RuntimeException)
624 {
625     ::vos::OGuard aGuard( GetMutex() );
626 
627     Window* pWindow = GetWindow();
628     if ( pWindow )
629     {
630         pWindow->SetText( aText );
631 
632         // In JAVA wird auch ein textChanged ausgeloest, in VCL nicht.
633         // ::com::sun::star::awt::Toolkit soll JAVA-komform sein...
634         ModifyHdl( NULL );
635     }
636 }
637 
insertText(const::com::sun::star::awt::Selection & rSel,const::rtl::OUString & aText)638 void VCLXFileControl::insertText( const ::com::sun::star::awt::Selection& rSel, const ::rtl::OUString& aText ) throw(::com::sun::star::uno::RuntimeException)
639 {
640     ::vos::OGuard aGuard( GetMutex() );
641 
642     FileControl* pFileControl = (FileControl*) GetWindow();
643     if ( pFileControl )
644     {
645         pFileControl->GetEdit().SetSelection( Selection( rSel.Min, rSel.Max ) );
646         pFileControl->GetEdit().ReplaceSelected( aText );
647     }
648 }
649 
getText()650 ::rtl::OUString VCLXFileControl::getText() throw(::com::sun::star::uno::RuntimeException)
651 {
652     ::vos::OGuard aGuard( GetMutex() );
653 
654     ::rtl::OUString aText;
655     Window* pWindow = GetWindow();
656     if ( pWindow )
657         aText = pWindow->GetText();
658     return aText;
659 }
660 
getSelectedText()661 ::rtl::OUString VCLXFileControl::getSelectedText() throw(::com::sun::star::uno::RuntimeException)
662 {
663     ::vos::OGuard aGuard( GetMutex() );
664 
665     ::rtl::OUString aText;
666     FileControl* pFileControl = (FileControl*) GetWindow();
667     if ( pFileControl)
668         aText = pFileControl->GetEdit().GetSelected();
669     return aText;
670 
671 }
672 
setSelection(const::com::sun::star::awt::Selection & aSelection)673 void VCLXFileControl::setSelection( const ::com::sun::star::awt::Selection& aSelection ) throw(::com::sun::star::uno::RuntimeException)
674 {
675     ::vos::OGuard aGuard( GetMutex() );
676 
677     FileControl* pFileControl = (FileControl*) GetWindow();
678     if ( pFileControl )
679         pFileControl->GetEdit().SetSelection( Selection( aSelection.Min, aSelection.Max ) );
680 }
681 
getSelection()682 ::com::sun::star::awt::Selection VCLXFileControl::getSelection() throw(::com::sun::star::uno::RuntimeException)
683 {
684     ::vos::OGuard aGuard( GetMutex() );
685 
686     ::com::sun::star::awt::Selection aSel;
687     FileControl* pFileControl = (FileControl*) GetWindow();
688     if ( pFileControl )
689     {
690         aSel.Min = pFileControl->GetEdit().GetSelection().Min();
691         aSel.Max = pFileControl->GetEdit().GetSelection().Max();
692     }
693     return aSel;
694 }
695 
isEditable()696 sal_Bool VCLXFileControl::isEditable() throw(::com::sun::star::uno::RuntimeException)
697 {
698     ::vos::OGuard aGuard( GetMutex() );
699 
700     FileControl* pFileControl = (FileControl*) GetWindow();
701     return ( pFileControl && !pFileControl->GetEdit().IsReadOnly() && pFileControl->GetEdit().IsEnabled() ) ? sal_True : sal_False;
702 }
703 
setEditable(sal_Bool bEditable)704 void VCLXFileControl::setEditable( sal_Bool bEditable ) throw(::com::sun::star::uno::RuntimeException)
705 {
706     ::vos::OGuard aGuard( GetMutex() );
707 
708     FileControl* pFileControl = (FileControl*) GetWindow();
709     if ( pFileControl )
710         pFileControl->GetEdit().SetReadOnly( !bEditable );
711 }
712 
setMaxTextLen(sal_Int16 nLen)713 void VCLXFileControl::setMaxTextLen( sal_Int16 nLen ) throw(::com::sun::star::uno::RuntimeException)
714 {
715     ::vos::OGuard aGuard( GetMutex() );
716 
717     FileControl* pFileControl = (FileControl*) GetWindow();
718     if ( pFileControl )
719         pFileControl->GetEdit().SetMaxTextLen( nLen );
720 }
721 
getMaxTextLen()722 sal_Int16 VCLXFileControl::getMaxTextLen() throw(::com::sun::star::uno::RuntimeException)
723 {
724     ::vos::OGuard aGuard( GetMutex() );
725 
726     FileControl* pFileControl = (FileControl*) GetWindow();
727     return pFileControl ? pFileControl->GetEdit().GetMaxTextLen() : 0;
728 }
729 
730 
IMPL_LINK(VCLXFileControl,ModifyHdl,Edit *,EMPTYARG)731 IMPL_LINK( VCLXFileControl, ModifyHdl, Edit*, EMPTYARG )
732 {
733     ::com::sun::star::awt::TextEvent aEvent;
734     aEvent.Source = (::cppu::OWeakObject*)this;
735     maTextListeners.textChanged( aEvent );
736 
737     return 1;
738 }
739 
getMinimumSize()740 ::com::sun::star::awt::Size VCLXFileControl::getMinimumSize() throw(::com::sun::star::uno::RuntimeException)
741 {
742     ::vos::OGuard aGuard( GetMutex() );
743 
744     ::com::sun::star::awt::Size aSz;
745     FileControl* pControl = (FileControl*) GetWindow();
746     if ( pControl )
747     {
748         Size aTmpSize = pControl->GetEdit().CalcMinimumSize();
749         aTmpSize.Width() += pControl->GetButton().CalcMinimumSize().Width();
750         aSz = AWTSize(pControl->CalcWindowSize( aTmpSize ));
751     }
752     return aSz;
753 }
754 
getPreferredSize()755 ::com::sun::star::awt::Size VCLXFileControl::getPreferredSize() throw(::com::sun::star::uno::RuntimeException)
756 {
757     ::com::sun::star::awt::Size aSz = getMinimumSize();
758     aSz.Height += 4;
759     return aSz;
760 }
761 
calcAdjustedSize(const::com::sun::star::awt::Size & rNewSize)762 ::com::sun::star::awt::Size VCLXFileControl::calcAdjustedSize( const ::com::sun::star::awt::Size& rNewSize ) throw(::com::sun::star::uno::RuntimeException)
763 {
764     ::vos::OGuard aGuard( GetMutex() );
765 
766     ::com::sun::star::awt::Size aSz =rNewSize;
767     FileControl* pControl = (FileControl*) GetWindow();
768     if ( pControl )
769     {
770         ::com::sun::star::awt::Size aMinSz = getMinimumSize();
771         if ( aSz.Height != aMinSz.Height )
772             aSz.Height = aMinSz.Height;
773     }
774     return aSz;
775 }
776 
getMinimumSize(sal_Int16 nCols,sal_Int16)777 ::com::sun::star::awt::Size VCLXFileControl::getMinimumSize( sal_Int16 nCols, sal_Int16 ) throw(::com::sun::star::uno::RuntimeException)
778 {
779     ::vos::OGuard aGuard( GetMutex() );
780 
781     ::com::sun::star::awt::Size aSz;
782     FileControl* pControl = (FileControl*) GetWindow();
783     if ( pControl )
784     {
785         aSz = AWTSize(pControl->GetEdit().CalcSize( nCols ));
786         aSz.Width += pControl->GetButton().CalcMinimumSize().Width();
787     }
788     return aSz;
789 }
790 
getColumnsAndLines(sal_Int16 & nCols,sal_Int16 & nLines)791 void VCLXFileControl::getColumnsAndLines( sal_Int16& nCols, sal_Int16& nLines ) throw(::com::sun::star::uno::RuntimeException)
792 {
793     ::vos::OGuard aGuard( GetMutex() );
794 
795     nCols = 0;
796     nLines = 1;
797     FileControl* pControl = (FileControl*) GetWindow();
798     if ( pControl )
799         nCols = (sal_Int16) pControl->GetEdit().GetMaxVisChars();
800 }
801 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)802 void VCLXFileControl::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
803 {
804     PushPropertyIds( rIds,
805                      // FIXME: elide duplication ?
806                      BASEPROPERTY_HIDEINACTIVESELECTION,
807                      0);
808     VCLXWindow::ImplGetPropertyIds( rIds, true );
809 }
810 
811 
812 //  ----------------------------------------------------
813 //  class SVTXFormattedField
814 //  ----------------------------------------------------
815 // --------------------------------------------------------------------------------------
SVTXFormattedField()816 SVTXFormattedField::SVTXFormattedField()
817     :m_pCurrentSupplier(NULL)
818     ,bIsStandardSupplier(sal_True)
819     ,nKeyToSetDelayed(-1)
820 {
821 }
822 
823 // --------------------------------------------------------------------------------------
~SVTXFormattedField()824 SVTXFormattedField::~SVTXFormattedField()
825 {
826     if (m_pCurrentSupplier)
827     {
828         m_pCurrentSupplier->release();
829         m_pCurrentSupplier = NULL;
830     }
831 }
832 
833 // --------------------------------------------------------------------------------------
SetWindow(Window * _pWindow)834 void SVTXFormattedField::SetWindow( Window* _pWindow )
835 {
836     VCLXSpinField::SetWindow(_pWindow);
837     if (GetFormattedField())
838         GetFormattedField()->SetAutoColor(sal_True);
839 }
840 
841 // --------------------------------------------------------------------------------------
setProperty(const::rtl::OUString & PropertyName,const::com::sun::star::uno::Any & Value)842 void SVTXFormattedField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
843 {
844     ::vos::OGuard aGuard( GetMutex() );
845 
846     FormattedField* pField = GetFormattedField();
847     if ( pField )
848     {
849         sal_uInt16 nPropType = GetPropertyId( PropertyName );
850         switch (nPropType)
851         {
852             case BASEPROPERTY_ENFORCE_FORMAT:
853             {
854                 sal_Bool bEnable( sal_True );
855                 if ( Value >>= bEnable )
856                     pField->EnableNotANumber( !bEnable );
857             }
858             break;
859 
860             case BASEPROPERTY_EFFECTIVE_MIN:
861             case BASEPROPERTY_VALUEMIN_DOUBLE:
862                 SetMinValue(Value);
863                 break;
864 
865             case BASEPROPERTY_EFFECTIVE_MAX:
866             case BASEPROPERTY_VALUEMAX_DOUBLE:
867                 SetMaxValue(Value);
868                 break;
869 
870             case BASEPROPERTY_EFFECTIVE_DEFAULT:
871                 SetDefaultValue(Value);
872                 break;
873 
874             case BASEPROPERTY_TREATASNUMBER:
875             {
876                 sal_Bool b = sal_Bool();
877                 if ( Value >>= b )
878                     SetTreatAsNumber(b);
879             }
880             break;
881 
882             case BASEPROPERTY_FORMATSSUPPLIER:
883                 if (!Value.hasValue())
884                     setFormatsSupplier(::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > (NULL));
885                 else
886                 {
887                     ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > xNFS;
888                     if ( Value >>= xNFS )
889                         setFormatsSupplier(xNFS);
890                 }
891                 break;
892             case BASEPROPERTY_FORMATKEY:
893                 if (!Value.hasValue())
894                     setFormatKey(0);
895                 else
896                 {
897                     sal_Int32 n = 0;
898                     if ( Value >>= n )
899                         setFormatKey(n);
900                 }
901                 break;
902 
903             case BASEPROPERTY_EFFECTIVE_VALUE:
904             case BASEPROPERTY_VALUE_DOUBLE:
905             {
906                 const ::com::sun::star::uno::TypeClass rTC = Value.getValueType().getTypeClass();
907                 if (rTC != ::com::sun::star::uno::TypeClass_STRING)
908                     // no string
909                     if (rTC != ::com::sun::star::uno::TypeClass_DOUBLE)
910                         // no double
911                         if (Value.hasValue())
912                         {   // but a value
913                             // try if it is something converitble
914                             sal_Int32 nValue = 0;
915                             if (!(Value >>= nValue))
916                                 throw ::com::sun::star::lang::IllegalArgumentException();
917                             SetValue(::com::sun::star::uno::makeAny((double)nValue));
918                             break;
919                         }
920 
921                 SetValue(Value);
922             }
923             break;
924             case BASEPROPERTY_VALUESTEP_DOUBLE:
925             {
926                 double d = 0.0;
927                 if ( Value >>= d )
928                     pField->SetSpinSize( d );
929                 else
930                 {
931                     sal_Int32 n = 0;
932                     if ( Value >>= n )
933                         pField->SetSpinSize( n );
934                 }
935             }
936             break;
937             case BASEPROPERTY_DECIMALACCURACY:
938             {
939                 sal_Int32 n = 0;
940                 if ( Value >>= n )
941                     pField->SetDecimalDigits( (sal_uInt16)n );
942             }
943             break;
944             case BASEPROPERTY_NUMSHOWTHOUSANDSEP:
945             {
946                     sal_Bool b = sal_Bool();
947                     if ( Value >>= b )
948                     pField->SetThousandsSep( b );
949             }
950             break;
951 
952             default:
953                 VCLXSpinField::setProperty( PropertyName, Value );
954         }
955 
956         if (BASEPROPERTY_TEXTCOLOR == nPropType)
957         {   // after setting a new text color, think again about the AutoColor flag of the control
958             // 17.05.2001 - 86859 - frank.schoenheit@germany.sun.com
959             pField->SetAutoColor(!Value.hasValue());
960         }
961     }
962     else
963         VCLXSpinField::setProperty( PropertyName, Value );
964 }
965 
966 // --------------------------------------------------------------------------------------
getProperty(const::rtl::OUString & PropertyName)967 ::com::sun::star::uno::Any SVTXFormattedField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
968 {
969     ::vos::OGuard aGuard( GetMutex() );
970 
971     ::com::sun::star::uno::Any aReturn;
972 
973     FormattedField* pField = GetFormattedField();
974     if ( pField )
975     {
976         sal_uInt16 nPropType = GetPropertyId( PropertyName );
977         switch (nPropType)
978         {
979             case BASEPROPERTY_EFFECTIVE_MIN:
980             case BASEPROPERTY_VALUEMIN_DOUBLE:
981                 aReturn <<= GetMinValue();
982                 break;
983 
984             case BASEPROPERTY_EFFECTIVE_MAX:
985             case BASEPROPERTY_VALUEMAX_DOUBLE:
986                 aReturn <<= GetMaxValue();
987                 break;
988 
989             case BASEPROPERTY_EFFECTIVE_DEFAULT:
990                 aReturn <<= GetDefaultValue();
991                 break;
992 
993             case BASEPROPERTY_TREATASNUMBER:
994                 aReturn <<= GetTreatAsNumber();
995                 break;
996 
997             case BASEPROPERTY_EFFECTIVE_VALUE:
998             case BASEPROPERTY_VALUE_DOUBLE:
999                 aReturn <<= GetValue();
1000                 break;
1001 
1002             case BASEPROPERTY_VALUESTEP_DOUBLE:
1003                 aReturn <<= pField->GetSpinSize();
1004                 break;
1005 
1006             case BASEPROPERTY_DECIMALACCURACY:
1007                 aReturn <<= pField->GetDecimalDigits();
1008                 break;
1009 
1010             case BASEPROPERTY_FORMATSSUPPLIER:
1011             {
1012                 if (!bIsStandardSupplier)
1013                 {   // ansonsten void
1014                     ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >  xSupplier = getFormatsSupplier();
1015                     aReturn <<= xSupplier;
1016                 }
1017             }
1018             break;
1019 
1020             case BASEPROPERTY_FORMATKEY:
1021             {
1022                 if (!bIsStandardSupplier)
1023                     aReturn <<= getFormatKey();
1024             }
1025             break;
1026 
1027             default:
1028                 aReturn <<= VCLXSpinField::getProperty(PropertyName);
1029         }
1030     }
1031     return aReturn;
1032 }
1033 
1034 // --------------------------------------------------------------------------------------
convertEffectiveValue(const::com::sun::star::uno::Any & rValue)1035 ::com::sun::star::uno::Any SVTXFormattedField::convertEffectiveValue(const ::com::sun::star::uno::Any& rValue)
1036 {
1037     ::com::sun::star::uno::Any aReturn;
1038 
1039     FormattedField* pField = GetFormattedField();
1040     if (!pField)
1041         return aReturn;
1042 
1043     switch (rValue.getValueType().getTypeClass())
1044     {
1045         case ::com::sun::star::uno::TypeClass_DOUBLE:
1046             if (pField->TreatingAsNumber())
1047             {
1048                 double d = 0.0;
1049                 rValue >>= d;
1050                 aReturn <<= d;
1051             }
1052             else
1053             {
1054                 SvNumberFormatter* pFormatter = pField->GetFormatter();
1055                 if (!pFormatter)
1056                     pFormatter = pField->StandardFormatter();
1057                     // should never fail
1058 
1059                 Color* pDum;
1060                 double d = 0.0;
1061                 rValue >>= d;
1062                 String sConverted;
1063                 pFormatter->GetOutputString(d, 0, sConverted, &pDum);
1064                 aReturn <<= ::rtl::OUString( sConverted );
1065             }
1066             break;
1067         case ::com::sun::star::uno::TypeClass_STRING:
1068         {
1069             ::rtl::OUString aStr;
1070             rValue >>= aStr;
1071             String sValue = aStr;
1072             if (pField->TreatingAsNumber())
1073             {
1074                 SvNumberFormatter* pFormatter = pField->GetFormatter();
1075                 if (!pFormatter)
1076                     pFormatter = pField->StandardFormatter();
1077 
1078                 double dVal;
1079                 sal_uInt32 nTestFormat(0);
1080                 if (!pFormatter->IsNumberFormat(sValue, nTestFormat, dVal))
1081                     aReturn.clear();
1082                 aReturn <<=dVal;
1083             }
1084             else
1085                 aReturn <<= aStr;
1086         }
1087         break;
1088         default:
1089             aReturn.clear();
1090             break;
1091     }
1092     return aReturn;
1093 }
1094 
1095 // --------------------------------------------------------------------------------------
SetMinValue(const::com::sun::star::uno::Any & rValue)1096 void SVTXFormattedField::SetMinValue(const ::com::sun::star::uno::Any& rValue)
1097 {
1098     FormattedField* pField = GetFormattedField();
1099     if (!pField)
1100         return;
1101 
1102     switch (rValue.getValueType().getTypeClass())
1103 
1104     {
1105         case ::com::sun::star::uno::TypeClass_DOUBLE:
1106         {
1107             double d = 0.0;
1108             rValue >>= d;
1109             pField->SetMinValue(d);
1110         }
1111             break;
1112         default:
1113             DBG_ASSERT(rValue.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID, "SVTXFormattedField::SetMinValue : invalid argument (an exception will be thrown) !");
1114             if ( rValue.getValueType().getTypeClass() != ::com::sun::star::uno::TypeClass_VOID )
1115 
1116             {
1117                 throw ::com::sun::star::lang::IllegalArgumentException();
1118             }
1119             pField->ClearMinValue();
1120             break;
1121     }
1122 }
1123 
1124 // --------------------------------------------------------------------------------------
GetMinValue()1125 ::com::sun::star::uno::Any SVTXFormattedField::GetMinValue()
1126 {
1127     FormattedField* pField = GetFormattedField();
1128     if (!pField || !pField->HasMinValue())
1129         return ::com::sun::star::uno::Any();
1130 
1131     ::com::sun::star::uno::Any aReturn;
1132     aReturn <<= pField->GetMinValue();
1133     return aReturn;
1134 }
1135 
1136 // --------------------------------------------------------------------------------------
SetMaxValue(const::com::sun::star::uno::Any & rValue)1137 void SVTXFormattedField::SetMaxValue(const ::com::sun::star::uno::Any& rValue)
1138 {
1139     FormattedField* pField = GetFormattedField();
1140     if (!pField)
1141         return;
1142 
1143     switch (rValue.getValueType().getTypeClass())
1144 
1145     {
1146         case ::com::sun::star::uno::TypeClass_DOUBLE:
1147         {
1148             double d = 0.0;
1149             rValue >>= d;
1150             pField->SetMaxValue(d);
1151         }
1152             break;
1153         default:
1154             if (rValue.getValueType().getTypeClass() != ::com::sun::star::uno::TypeClass_VOID)
1155 
1156             {
1157                 throw ::com::sun::star::lang::IllegalArgumentException();
1158             }
1159             pField->ClearMaxValue();
1160             break;
1161     }
1162 }
1163 
1164 // --------------------------------------------------------------------------------------
GetMaxValue()1165 ::com::sun::star::uno::Any SVTXFormattedField::GetMaxValue()
1166 {
1167     FormattedField* pField = GetFormattedField();
1168     if (!pField || !pField->HasMaxValue())
1169         return ::com::sun::star::uno::Any();
1170 
1171     ::com::sun::star::uno::Any aReturn;
1172     aReturn <<= pField->GetMaxValue();
1173     return aReturn;
1174 }
1175 
1176 // --------------------------------------------------------------------------------------
SetDefaultValue(const::com::sun::star::uno::Any & rValue)1177 void SVTXFormattedField::SetDefaultValue(const ::com::sun::star::uno::Any& rValue)
1178 {
1179     FormattedField* pField = GetFormattedField();
1180     if (!pField)
1181         return;
1182 
1183     ::com::sun::star::uno::Any aConverted = convertEffectiveValue(rValue);
1184 
1185     switch (aConverted.getValueType().getTypeClass())
1186 
1187     {
1188         case ::com::sun::star::uno::TypeClass_DOUBLE:
1189         {
1190             double d = 0.0;
1191             aConverted >>= d;
1192             pField->SetDefaultValue(d);
1193         }
1194         break;
1195         case ::com::sun::star::uno::TypeClass_STRING:
1196         {
1197             ::rtl::OUString aStr;
1198             aConverted >>= aStr;
1199             pField->SetDefaultText( aStr );
1200         }
1201         break;
1202         default:
1203             pField->EnableEmptyField(sal_True);
1204                 // nur noch void erlaubt
1205             break;
1206     }
1207 }
1208 
1209 // --------------------------------------------------------------------------------------
GetDefaultValue()1210 ::com::sun::star::uno::Any SVTXFormattedField::GetDefaultValue()
1211 {
1212     FormattedField* pField = GetFormattedField();
1213     if (!pField || pField->IsEmptyFieldEnabled())
1214         return ::com::sun::star::uno::Any();
1215 
1216     ::com::sun::star::uno::Any aReturn;
1217     if (pField->TreatingAsNumber())
1218         aReturn <<= pField->GetDefaultValue();
1219     else
1220         aReturn <<= ::rtl::OUString( pField->GetDefaultText() );
1221     return aReturn;
1222 }
1223 
1224 // --------------------------------------------------------------------------------------
GetTreatAsNumber()1225 sal_Bool SVTXFormattedField::GetTreatAsNumber()
1226 {
1227     FormattedField* pField = GetFormattedField();
1228     if (pField)
1229         return pField->TreatingAsNumber();
1230 
1231     return sal_True;
1232 }
1233 
1234 // --------------------------------------------------------------------------------------
SetTreatAsNumber(sal_Bool bSet)1235 void SVTXFormattedField::SetTreatAsNumber(sal_Bool bSet)
1236 {
1237     FormattedField* pField = GetFormattedField();
1238     if (pField)
1239         pField->TreatAsNumber(bSet);
1240 }
1241 
1242 // --------------------------------------------------------------------------------------
GetValue()1243 ::com::sun::star::uno::Any SVTXFormattedField::GetValue()
1244 {
1245     FormattedField* pField = GetFormattedField();
1246     if (!pField)
1247         return ::com::sun::star::uno::Any();
1248 
1249     ::com::sun::star::uno::Any aReturn;
1250     if (!pField->TreatingAsNumber())
1251     {
1252         ::rtl::OUString sText = pField->GetTextValue();
1253         aReturn <<= sText;
1254     }
1255     else
1256     {
1257         if (pField->GetText().Len())    // empty wird erst mal standardmaessig als void nach draussen gereicht
1258             aReturn <<= pField->GetValue();
1259     }
1260 
1261     return aReturn;
1262 }
1263 
1264 // --------------------------------------------------------------------------------------
SetValue(const::com::sun::star::uno::Any & rValue)1265 void SVTXFormattedField::SetValue(const ::com::sun::star::uno::Any& rValue)
1266 {
1267     FormattedField* pField = GetFormattedField();
1268     if (!pField)
1269         return;
1270 
1271     if (!rValue.hasValue())
1272     {
1273         pField->SetText(String());
1274     }
1275     else
1276     {
1277         if (rValue.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_DOUBLE )
1278         {
1279             double d = 0.0;
1280             rValue >>= d;
1281             pField->SetValue(d);
1282         }
1283         else
1284         {
1285             DBG_ASSERT(rValue.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_STRING, "SVTXFormattedField::SetValue : invalid argument !");
1286 
1287             ::rtl::OUString sText;
1288             rValue >>= sText;
1289             String aStr( sText );
1290             if (!pField->TreatingAsNumber())
1291                 pField->SetTextFormatted(aStr);
1292             else
1293                 pField->SetTextValue(aStr);
1294         }
1295     }
1296 //  NotifyTextListeners();
1297 }
1298 
1299 // --------------------------------------------------------------------------------------
getFormatsSupplier(void) const1300 ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >  SVTXFormattedField::getFormatsSupplier(void) const
1301 {
1302     return ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > ((::com::sun::star::util::XNumberFormatsSupplier*)m_pCurrentSupplier);
1303 }
1304 
1305 // --------------------------------------------------------------------------------------
setFormatsSupplier(const::com::sun::star::uno::Reference<::com::sun::star::util::XNumberFormatsSupplier> & xSupplier)1306 void SVTXFormattedField::setFormatsSupplier(const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier > & xSupplier)
1307 {
1308     FormattedField* pField = GetFormattedField();
1309 
1310     SvNumberFormatsSupplierObj* pNew = NULL;
1311     if (!xSupplier.is())
1312     {
1313         if (pField)
1314         {
1315             pNew = new SvNumberFormatsSupplierObj(pField->StandardFormatter());
1316             bIsStandardSupplier = sal_True;
1317         }
1318     }
1319     else
1320     {
1321         pNew = SvNumberFormatsSupplierObj::getImplementation(xSupplier);
1322         bIsStandardSupplier = sal_False;
1323     }
1324 
1325     if (!pNew)
1326         return;     // TODO : wie das behandeln ?
1327 
1328     if (m_pCurrentSupplier)
1329         m_pCurrentSupplier->release();
1330     m_pCurrentSupplier = pNew;
1331     m_pCurrentSupplier->acquire();
1332     if (pField)
1333     {
1334         // den aktuellen Value mit hinueberretten
1335         ::com::sun::star::uno::Any aCurrent = GetValue();
1336         pField->SetFormatter(m_pCurrentSupplier->GetNumberFormatter(), sal_False);
1337         if (nKeyToSetDelayed != -1)
1338         {
1339             pField->SetFormatKey(nKeyToSetDelayed);
1340             nKeyToSetDelayed = -1;
1341         }
1342         SetValue(aCurrent);
1343         NotifyTextListeners();
1344     }
1345 }
1346 
1347 // --------------------------------------------------------------------------------------
getFormatKey(void) const1348 sal_Int32 SVTXFormattedField::getFormatKey(void) const
1349 {
1350     FormattedField* pField = GetFormattedField();
1351     return pField ? pField->GetFormatKey() : 0;
1352 }
1353 
1354 // --------------------------------------------------------------------------------------
setFormatKey(sal_Int32 nKey)1355 void SVTXFormattedField::setFormatKey(sal_Int32 nKey)
1356 {
1357     FormattedField* pField = GetFormattedField();
1358     if (pField)
1359     {
1360         if (pField->GetFormatter())
1361             pField->SetFormatKey(nKey);
1362         else
1363         {   // Wahrscheinlich bin ich gerade in einem Block, in dem erst der Key und dann der Formatter gesetzt
1364             // wird, das passiert initial mit ziemlicher Sicherheit, da die Properties in alphabetischer Reihenfolge
1365             // gesetzt werden, und der FormatsSupplier nun mal vor dem FormatKey kommt
1366             nKeyToSetDelayed = nKey;
1367         }
1368         NotifyTextListeners();
1369     }
1370 }
1371 
1372 // --------------------------------------------------------------------------------------
NotifyTextListeners()1373 void SVTXFormattedField::NotifyTextListeners()
1374 {
1375     if ( GetTextListeners().getLength() )
1376     {
1377         ::com::sun::star::awt::TextEvent aEvent;
1378         aEvent.Source = (::cppu::OWeakObject*)this;
1379         GetTextListeners().textChanged( aEvent );
1380     }
1381 }
1382 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)1383 void SVTXFormattedField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
1384 {
1385     PushPropertyIds( rIds,
1386                      // FIXME: elide duplication ?
1387                      BASEPROPERTY_EFFECTIVE_MIN,
1388                      BASEPROPERTY_VALUEMIN_DOUBLE,
1389                      BASEPROPERTY_EFFECTIVE_MAX,
1390                      BASEPROPERTY_VALUEMAX_DOUBLE,
1391                      BASEPROPERTY_EFFECTIVE_DEFAULT,
1392                      BASEPROPERTY_TREATASNUMBER,
1393                      BASEPROPERTY_EFFECTIVE_VALUE,
1394                      BASEPROPERTY_VALUE_DOUBLE,
1395                      BASEPROPERTY_VALUESTEP_DOUBLE,
1396                      BASEPROPERTY_DECIMALACCURACY,
1397                      BASEPROPERTY_FORMATSSUPPLIER,
1398                      BASEPROPERTY_NUMSHOWTHOUSANDSEP,
1399                      BASEPROPERTY_FORMATKEY,
1400                      BASEPROPERTY_TREATASNUMBER,
1401                      BASEPROPERTY_ENFORCE_FORMAT,
1402                      0);
1403     VCLXWindow::ImplGetPropertyIds( rIds, true );
1404     VCLXSpinField::ImplGetPropertyIds( rIds );
1405 }
1406 
1407 
1408 //  ----------------------------------------------------
1409 //  class SVTXRoadmap
1410 //  ----------------------------------------------------
1411 
1412 using namespace svt;
1413 
1414 // --------------------------------------------------------------------------------------
SVTXRoadmap()1415 SVTXRoadmap::SVTXRoadmap() : maItemListeners( *this )
1416 {
1417 }
1418 
1419 // --------------------------------------------------------------------------------------
~SVTXRoadmap()1420 SVTXRoadmap::~SVTXRoadmap()
1421 {
1422 }
1423 
ProcessWindowEvent(const VclWindowEvent & rVclWindowEvent)1424 void SVTXRoadmap::ProcessWindowEvent( const VclWindowEvent& rVclWindowEvent )
1425 {
1426     switch ( rVclWindowEvent.GetId() )
1427     {
1428         case VCLEVENT_ROADMAP_ITEMSELECTED:
1429         {
1430             ::vos::OGuard aGuard( GetMutex() );
1431             ::svt::ORoadmap* pField = GetRoadmap();
1432             if ( pField )
1433             {
1434                 sal_Int16 CurItemID = pField->GetCurrentRoadmapItemID();
1435                 ::com::sun::star::awt::ItemEvent aEvent;
1436                 aEvent.Selected = CurItemID;
1437                 aEvent.Highlighted = CurItemID;
1438                 aEvent.ItemId = CurItemID;
1439                 maItemListeners.itemStateChanged( aEvent );
1440             }
1441         }
1442         break;
1443         default:
1444             SVTXRoadmap_Base::ProcessWindowEvent( rVclWindowEvent );
1445             break;
1446     }
1447 }
1448 
1449 
propertyChange(const::com::sun::star::beans::PropertyChangeEvent & evt)1450 void SVTXRoadmap::propertyChange( const ::com::sun::star::beans::PropertyChangeEvent& evt ) throw (::com::sun::star::uno::RuntimeException)
1451 {
1452     ::vos::OGuard aGuard( GetMutex() );
1453     ::svt::ORoadmap* pField = GetRoadmap();
1454     if ( pField )
1455     {
1456         ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xRoadmapItem;
1457         xRoadmapItem = evt.Source;
1458         sal_Int32 nID = 0;
1459         ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropertySet( xRoadmapItem, ::com::sun::star::uno::UNO_QUERY );
1460         ::com::sun::star::uno::Any aValue = xPropertySet->getPropertyValue(::rtl::OUString::createFromAscii( "ID" ));
1461         aValue >>= nID;
1462 
1463         ::com::sun::star::uno::Any rVal = evt.NewValue;
1464         evt.NewValue >>= rVal;
1465         ::rtl::OUString sPropertyName = evt.PropertyName;
1466         if ( sPropertyName.equals(::rtl::OUString::createFromAscii( "Enabled" ) ) )
1467         {
1468             sal_Bool bEnable = false;
1469             evt.NewValue >>= bEnable;
1470             pField->EnableRoadmapItem( (RoadmapTypes::ItemId)nID , bEnable );
1471         }
1472         else if ( sPropertyName.equals(::rtl::OUString::createFromAscii( "Label" ) ) )
1473         {
1474             ::rtl::OUString sLabel;
1475             evt.NewValue >>= sLabel;
1476             pField->ChangeRoadmapItemLabel( (RoadmapTypes::ItemId)nID , sLabel );
1477         }
1478         else if  ( sPropertyName.equals(::rtl::OUString::createFromAscii( "ID" ) ) )
1479         {
1480             sal_Int32 nNewID = 0;
1481             evt.NewValue >>= nNewID;
1482             evt.OldValue >>= nID;
1483             pField->ChangeRoadmapItemID( (RoadmapTypes::ItemId)nID, (RoadmapTypes::ItemId)nNewID );
1484         }
1485     //    else
1486             // Todo: handle Interactive appropriately
1487     }
1488 }
1489 
1490 
addItemListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::XItemListener> & l)1491 void SVTXRoadmap::addItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& l ) throw (::com::sun::star::uno::RuntimeException)
1492 {
1493     maItemListeners.addInterface( l );
1494 }
1495 
removeItemListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::XItemListener> & l)1496 void SVTXRoadmap::removeItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& l ) throw (::com::sun::star::uno::RuntimeException)
1497 {
1498     maItemListeners.removeInterface( l );
1499 }
1500 
GetRMItemData(const::com::sun::star::container::ContainerEvent & _rEvent)1501 RMItemData SVTXRoadmap::GetRMItemData( const ::com::sun::star::container::ContainerEvent& _rEvent )
1502 {
1503     RMItemData aCurRMItemData;
1504     ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > xRoadmapItem;
1505     _rEvent.Element >>= xRoadmapItem;
1506     ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xPropertySet( xRoadmapItem, ::com::sun::star::uno::UNO_QUERY );
1507     if ( xPropertySet.is() )
1508     {
1509         ::com::sun::star::uno::Any aValue = xPropertySet->getPropertyValue(::rtl::OUString::createFromAscii( "Label" ));
1510         aValue >>= aCurRMItemData.Label;
1511         aValue = xPropertySet->getPropertyValue(::rtl::OUString::createFromAscii( "ID" ));
1512         aValue >>= aCurRMItemData.n_ID;
1513         aValue = xPropertySet->getPropertyValue(::rtl::OUString::createFromAscii( "Enabled" ));
1514         aValue >>= aCurRMItemData.b_Enabled;
1515     }
1516     return aCurRMItemData;;
1517 }
1518 
elementInserted(const::com::sun::star::container::ContainerEvent & _rEvent)1519 void SVTXRoadmap::elementInserted( const ::com::sun::star::container::ContainerEvent& _rEvent )throw(::com::sun::star::uno::RuntimeException)
1520 {
1521     ::vos::OGuard aGuard( GetMutex() );
1522     ::svt::ORoadmap* pField = GetRoadmap();
1523     if ( pField )
1524     {
1525         RMItemData CurItemData = GetRMItemData(  _rEvent );
1526         sal_Int32 InsertIndex = 0;
1527         _rEvent.Accessor >>= InsertIndex;
1528         pField->InsertRoadmapItem( InsertIndex, CurItemData.Label, (RoadmapTypes::ItemId)CurItemData.n_ID, CurItemData.b_Enabled );
1529     }
1530 }
1531 
elementRemoved(const::com::sun::star::container::ContainerEvent & _rEvent)1532 void SVTXRoadmap::elementRemoved( const ::com::sun::star::container::ContainerEvent& _rEvent )throw(::com::sun::star::uno::RuntimeException)
1533 {
1534     ::vos::OGuard aGuard( GetMutex() );
1535     ::svt::ORoadmap* pField = GetRoadmap();
1536     if ( pField )
1537     {
1538         sal_Int32 DelIndex = 0;
1539         _rEvent.Accessor >>= DelIndex;
1540         pField->DeleteRoadmapItem(DelIndex);
1541 //        pField->GetCurrentRoadmapItem()
1542 //        setProperty(::rtl::OUString.createFromAscii( "CurrentItem" )aAny,
1543     }
1544 }
1545 
elementReplaced(const::com::sun::star::container::ContainerEvent & _rEvent)1546 void SVTXRoadmap::elementReplaced( const ::com::sun::star::container::ContainerEvent& _rEvent )throw(::com::sun::star::uno::RuntimeException)
1547 {
1548     ::vos::OGuard aGuard( GetMutex() );
1549     ::svt::ORoadmap* pField = GetRoadmap();
1550     if ( pField )
1551     {
1552         RMItemData CurItemData = GetRMItemData(  _rEvent );
1553         sal_Int32 ReplaceIndex = 0;
1554         _rEvent.Accessor >>= ReplaceIndex;
1555         pField->ReplaceRoadmapItem( ReplaceIndex, CurItemData.Label, (RoadmapTypes::ItemId)CurItemData.n_ID, CurItemData.b_Enabled );
1556     }
1557 }
1558 
1559 
1560 
1561 // --------------------------------------------------------------------------------------
setProperty(const::rtl::OUString & PropertyName,const::com::sun::star::uno::Any & Value)1562 void SVTXRoadmap::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
1563 {
1564     ::vos::OGuard aGuard( GetMutex() );
1565 
1566     ::svt::ORoadmap* pField = GetRoadmap();
1567     if ( pField )
1568     {
1569         sal_uInt16 nPropType = GetPropertyId( PropertyName );
1570         switch (nPropType)
1571         {
1572             case BASEPROPERTY_COMPLETE:
1573             {
1574                 sal_Bool b = false;
1575                 Value >>= b;
1576                 pField->SetRoadmapComplete( b);
1577             }
1578             break;
1579 
1580             case BASEPROPERTY_ACTIVATED:
1581             {
1582                 sal_Bool b = false;
1583                 Value >>= b;
1584                 pField->SetRoadmapInteractive( b);
1585             }
1586             break;
1587 
1588             case BASEPROPERTY_CURRENTITEMID:
1589             {
1590                 sal_Int32 nId = 0;
1591                 Value >>= nId;
1592                 pField->SelectRoadmapItemByID( (RoadmapTypes::ItemId)nId );
1593             }
1594             break;
1595 
1596             case BASEPROPERTY_TEXT:
1597             {
1598                 ::rtl::OUString aStr;
1599                 Value >>= aStr;
1600                 pField->SetText( aStr );
1601                 pField->Invalidate();
1602             }
1603             break;
1604 
1605             default:
1606                 SVTXRoadmap_Base::setProperty( PropertyName, Value );
1607                 break;
1608         }
1609 
1610     }
1611     else
1612         SVTXRoadmap_Base::setProperty( PropertyName, Value );
1613 }
1614 
1615 
1616 // --------------------------------------------------------------------------------------
getProperty(const::rtl::OUString & PropertyName)1617 ::com::sun::star::uno::Any SVTXRoadmap::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
1618 {
1619     ::vos::OGuard aGuard( GetMutex() );
1620 
1621     ::com::sun::star::uno::Any aReturn;
1622 
1623     ::svt::ORoadmap* pField = GetRoadmap();
1624     if ( pField )
1625     {
1626         sal_uInt16 nPropType = GetPropertyId( PropertyName );
1627         switch (nPropType)
1628         {
1629             case BASEPROPERTY_COMPLETE:
1630                 aReturn <<= pField->IsRoadmapComplete();
1631                 break;
1632             case BASEPROPERTY_ACTIVATED:
1633                 aReturn <<= pField->IsRoadmapInteractive();
1634                 break;
1635             case BASEPROPERTY_CURRENTITEMID:
1636                 aReturn <<= pField->GetCurrentRoadmapItemID();
1637                 break;
1638             default:
1639                 aReturn = SVTXRoadmap_Base::getProperty(PropertyName);
1640                 break;
1641         }
1642     }
1643     return aReturn;
1644 }
1645 
ImplSetNewImage()1646 void SVTXRoadmap::ImplSetNewImage()
1647 {
1648     OSL_PRECOND( GetWindow(), "SVTXRoadmap::ImplSetNewImage: window is required to be not-NULL!" );
1649     ::svt::ORoadmap* pButton = static_cast< ::svt::ORoadmap* >( GetWindow() );
1650     pButton->SetRoadmapBitmap( GetImage().GetBitmapEx() );
1651 }
1652 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)1653 void SVTXRoadmap::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
1654 {
1655     PushPropertyIds( rIds,
1656                      BASEPROPERTY_COMPLETE,
1657                      BASEPROPERTY_ACTIVATED,
1658                      BASEPROPERTY_CURRENTITEMID,
1659                      BASEPROPERTY_TEXT,
1660                      0);
1661     VCLXWindow::ImplGetPropertyIds( rIds, true );
1662     VCLXGraphicControl::ImplGetPropertyIds( rIds );
1663 }
1664 
1665 //  ----------------------------------------------------
1666 //  class SVTXNumericField
1667 //  ----------------------------------------------------
SVTXNumericField()1668 SVTXNumericField::SVTXNumericField()
1669 {
1670 }
1671 
~SVTXNumericField()1672 SVTXNumericField::~SVTXNumericField()
1673 {
1674 }
1675 
queryInterface(const::com::sun::star::uno::Type & rType)1676 ::com::sun::star::uno::Any SVTXNumericField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
1677 {
1678     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
1679                                         SAL_STATIC_CAST( ::com::sun::star::awt::XNumericField*, this ),
1680                                         SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) );
1681     return (aRet.hasValue() ? aRet : SVTXFormattedField::queryInterface( rType ));
1682 }
1683 
1684 // ::com::sun::star::lang::XTypeProvider
1685 IMPL_XTYPEPROVIDER_START( SVTXNumericField )
1686     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XNumericField>* ) NULL ),
1687     SVTXFormattedField::getTypes()
1688 IMPL_XTYPEPROVIDER_END
1689 
1690 
1691 void SVTXNumericField::setValue( double Value ) throw(::com::sun::star::uno::RuntimeException)
1692 {
1693     ::vos::OGuard aGuard( GetMutex() );
1694 
1695     FormattedField* pField = GetFormattedField();
1696     if ( pField )
1697         pField->SetValue( Value );
1698 }
1699 
getValue()1700 double SVTXNumericField::getValue() throw(::com::sun::star::uno::RuntimeException)
1701 {
1702     ::vos::OGuard aGuard( GetMutex() );
1703 
1704     FormattedField* pField = GetFormattedField();
1705     return pField ? pField->GetValue() : 0;
1706 }
1707 
setMin(double Value)1708 void SVTXNumericField::setMin( double Value ) throw(::com::sun::star::uno::RuntimeException)
1709 {
1710     ::vos::OGuard aGuard( GetMutex() );
1711 
1712     FormattedField* pField = GetFormattedField();
1713     if ( pField )
1714         pField->SetMinValue( Value );
1715 }
1716 
getMin()1717 double SVTXNumericField::getMin() throw(::com::sun::star::uno::RuntimeException)
1718 {
1719     ::vos::OGuard aGuard( GetMutex() );
1720 
1721     FormattedField* pField = GetFormattedField();
1722     return pField ? pField->GetMinValue() : 0;
1723 }
1724 
setMax(double Value)1725 void SVTXNumericField::setMax( double Value ) throw(::com::sun::star::uno::RuntimeException)
1726 {
1727     ::vos::OGuard aGuard( GetMutex() );
1728 
1729     FormattedField* pField = GetFormattedField();
1730     if ( pField )
1731         pField->SetMaxValue( Value );
1732 }
1733 
getMax()1734 double SVTXNumericField::getMax() throw(::com::sun::star::uno::RuntimeException)
1735 {
1736     ::vos::OGuard aGuard( GetMutex() );
1737 
1738     FormattedField* pField = GetFormattedField();
1739     return pField ? pField->GetMaxValue() : 0;
1740 }
1741 
setFirst(double Value)1742 void SVTXNumericField::setFirst( double Value ) throw(::com::sun::star::uno::RuntimeException)
1743 {
1744     ::vos::OGuard aGuard( GetMutex() );
1745 
1746     FormattedField* pField = GetFormattedField();
1747     if ( pField )
1748         pField->SetSpinFirst( Value );
1749 }
1750 
getFirst()1751 double SVTXNumericField::getFirst() throw(::com::sun::star::uno::RuntimeException)
1752 {
1753     ::vos::OGuard aGuard( GetMutex() );
1754 
1755     FormattedField* pField = GetFormattedField();
1756     return pField ? pField->GetSpinFirst() : 0;
1757 }
1758 
setLast(double Value)1759 void SVTXNumericField::setLast( double Value ) throw(::com::sun::star::uno::RuntimeException)
1760 {
1761     ::vos::OGuard aGuard( GetMutex() );
1762 
1763     FormattedField* pField = GetFormattedField();
1764     if ( pField )
1765         pField->SetSpinLast( Value );
1766 }
1767 
getLast()1768 double SVTXNumericField::getLast() throw(::com::sun::star::uno::RuntimeException)
1769 {
1770     ::vos::OGuard aGuard( GetMutex() );
1771 
1772     FormattedField* pField = GetFormattedField();
1773     return pField ? pField->GetSpinLast() : 0;
1774 }
1775 
setSpinSize(double Value)1776 void SVTXNumericField::setSpinSize( double Value ) throw(::com::sun::star::uno::RuntimeException)
1777 {
1778     ::vos::OGuard aGuard( GetMutex() );
1779 
1780     FormattedField* pField = GetFormattedField();
1781     if ( pField )
1782         pField->SetSpinSize( Value );
1783 }
1784 
getSpinSize()1785 double SVTXNumericField::getSpinSize() throw(::com::sun::star::uno::RuntimeException)
1786 {
1787     ::vos::OGuard aGuard( GetMutex() );
1788 
1789     FormattedField* pField = GetFormattedField();
1790     return pField ? pField->GetSpinSize() : 0;
1791 }
1792 
setDecimalDigits(sal_Int16 Value)1793 void SVTXNumericField::setDecimalDigits( sal_Int16 Value ) throw(::com::sun::star::uno::RuntimeException)
1794 {
1795     ::vos::OGuard aGuard( GetMutex() );
1796 
1797     FormattedField* pField = GetFormattedField();
1798     if ( pField )
1799         pField->SetDecimalDigits( Value );
1800 }
1801 
getDecimalDigits()1802 sal_Int16 SVTXNumericField::getDecimalDigits() throw(::com::sun::star::uno::RuntimeException)
1803 {
1804     ::vos::OGuard aGuard( GetMutex() );
1805 
1806     FormattedField* pField = GetFormattedField();
1807     return pField ? pField->GetDecimalDigits() : 0;
1808 }
1809 
setStrictFormat(sal_Bool bStrict)1810 void SVTXNumericField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
1811 {
1812     ::vos::OGuard aGuard( GetMutex() );
1813 
1814     FormattedField* pField = GetFormattedField();
1815     if ( pField )
1816         pField->SetStrictFormat( bStrict );
1817 }
1818 
isStrictFormat()1819 sal_Bool SVTXNumericField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
1820 {
1821     ::vos::OGuard aGuard( GetMutex() );
1822 
1823     FormattedField* pField = GetFormattedField();
1824     return pField ? pField->IsStrictFormat() : sal_False;
1825 }
1826 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)1827 void SVTXNumericField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
1828 {
1829     SVTXFormattedField::ImplGetPropertyIds( rIds );
1830 }
1831 
1832 //  ----------------------------------------------------
1833 //  class SVTXCurrencyField
1834 //  ----------------------------------------------------
SVTXCurrencyField()1835 SVTXCurrencyField::SVTXCurrencyField()
1836 {
1837 }
1838 
~SVTXCurrencyField()1839 SVTXCurrencyField::~SVTXCurrencyField()
1840 {
1841 }
1842 
queryInterface(const::com::sun::star::uno::Type & rType)1843 ::com::sun::star::uno::Any SVTXCurrencyField::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
1844 {
1845     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
1846                                         SAL_STATIC_CAST( ::com::sun::star::awt::XCurrencyField*, this ),
1847                                         SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) );
1848     return (aRet.hasValue() ? aRet : SVTXFormattedField::queryInterface( rType ));
1849 }
1850 
1851 // ::com::sun::star::lang::XTypeProvider
1852 IMPL_XTYPEPROVIDER_START( SVTXCurrencyField )
1853     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XCurrencyField>* ) NULL ),
1854     SVTXFormattedField::getTypes()
1855 IMPL_XTYPEPROVIDER_END
1856 
1857 void SVTXCurrencyField::setValue( double Value ) throw(::com::sun::star::uno::RuntimeException)
1858 {
1859     ::vos::OGuard aGuard( GetMutex() );
1860 
1861     FormattedField* pField = GetFormattedField();
1862     if ( pField )
1863         pField->SetValue( Value );
1864 }
1865 
getValue()1866 double SVTXCurrencyField::getValue() throw(::com::sun::star::uno::RuntimeException)
1867 {
1868     ::vos::OGuard aGuard( GetMutex() );
1869 
1870     FormattedField* pField = GetFormattedField();
1871     return pField ? pField->GetValue() : 0;
1872 }
1873 
setMin(double Value)1874 void SVTXCurrencyField::setMin( double Value ) throw(::com::sun::star::uno::RuntimeException)
1875 {
1876     ::vos::OGuard aGuard( GetMutex() );
1877 
1878     FormattedField* pField = GetFormattedField();
1879     if ( pField )
1880         pField->SetMinValue( Value );
1881 }
1882 
getMin()1883 double SVTXCurrencyField::getMin() throw(::com::sun::star::uno::RuntimeException)
1884 {
1885     ::vos::OGuard aGuard( GetMutex() );
1886 
1887     FormattedField* pField = GetFormattedField();
1888     return pField ? pField->GetMinValue() : 0;
1889 }
1890 
setMax(double Value)1891 void SVTXCurrencyField::setMax( double Value ) throw(::com::sun::star::uno::RuntimeException)
1892 {
1893     ::vos::OGuard aGuard( GetMutex() );
1894 
1895     FormattedField* pField = GetFormattedField();
1896     if ( pField )
1897         pField->SetMaxValue( Value );
1898 }
1899 
getMax()1900 double SVTXCurrencyField::getMax() throw(::com::sun::star::uno::RuntimeException)
1901 {
1902     ::vos::OGuard aGuard( GetMutex() );
1903 
1904     FormattedField* pField = GetFormattedField();
1905     return pField ? pField->GetMaxValue() : 0;
1906 }
1907 
setFirst(double Value)1908 void SVTXCurrencyField::setFirst( double Value ) throw(::com::sun::star::uno::RuntimeException)
1909 {
1910     ::vos::OGuard aGuard( GetMutex() );
1911 
1912     FormattedField* pField = GetFormattedField();
1913     if ( pField )
1914         pField->SetSpinFirst( Value );
1915 }
1916 
getFirst()1917 double SVTXCurrencyField::getFirst() throw(::com::sun::star::uno::RuntimeException)
1918 {
1919     ::vos::OGuard aGuard( GetMutex() );
1920 
1921     FormattedField* pField = GetFormattedField();
1922     return pField ? pField->GetSpinFirst() : 0;
1923 }
1924 
setLast(double Value)1925 void SVTXCurrencyField::setLast( double Value ) throw(::com::sun::star::uno::RuntimeException)
1926 {
1927     ::vos::OGuard aGuard( GetMutex() );
1928 
1929     FormattedField* pField = GetFormattedField();
1930     if ( pField )
1931         pField->SetSpinLast( Value );
1932 }
1933 
getLast()1934 double SVTXCurrencyField::getLast() throw(::com::sun::star::uno::RuntimeException)
1935 {
1936     ::vos::OGuard aGuard( GetMutex() );
1937 
1938     FormattedField* pField = GetFormattedField();
1939     return pField ? pField->GetSpinLast() : 0;
1940 }
1941 
setSpinSize(double Value)1942 void SVTXCurrencyField::setSpinSize( double Value ) throw(::com::sun::star::uno::RuntimeException)
1943 {
1944     ::vos::OGuard aGuard( GetMutex() );
1945 
1946     FormattedField* pField = GetFormattedField();
1947     if ( pField )
1948         pField->SetSpinSize( Value );
1949 }
1950 
getSpinSize()1951 double SVTXCurrencyField::getSpinSize() throw(::com::sun::star::uno::RuntimeException)
1952 {
1953     ::vos::OGuard aGuard( GetMutex() );
1954 
1955     FormattedField* pField = GetFormattedField();
1956     return pField ? pField->GetSpinSize() : 0;
1957 }
1958 
setDecimalDigits(sal_Int16 Value)1959 void SVTXCurrencyField::setDecimalDigits( sal_Int16 Value ) throw(::com::sun::star::uno::RuntimeException)
1960 {
1961     ::vos::OGuard aGuard( GetMutex() );
1962 
1963     FormattedField* pField = GetFormattedField();
1964     if ( pField )
1965         pField->SetDecimalDigits( Value );
1966 }
1967 
getDecimalDigits()1968 sal_Int16 SVTXCurrencyField::getDecimalDigits() throw(::com::sun::star::uno::RuntimeException)
1969 {
1970     ::vos::OGuard aGuard( GetMutex() );
1971 
1972     FormattedField* pField = GetFormattedField();
1973     return pField ? pField->GetDecimalDigits() : 0;
1974 }
1975 
setStrictFormat(sal_Bool bStrict)1976 void SVTXCurrencyField::setStrictFormat( sal_Bool bStrict ) throw(::com::sun::star::uno::RuntimeException)
1977 {
1978     ::vos::OGuard aGuard( GetMutex() );
1979 
1980     FormattedField* pField = GetFormattedField();
1981     if ( pField )
1982         pField->SetStrictFormat( bStrict );
1983 }
1984 
isStrictFormat()1985 sal_Bool SVTXCurrencyField::isStrictFormat() throw(::com::sun::star::uno::RuntimeException)
1986 {
1987     ::vos::OGuard aGuard( GetMutex() );
1988 
1989     FormattedField* pField = GetFormattedField();
1990     return pField ? pField->IsStrictFormat() : sal_False;
1991 }
1992 
setProperty(const::rtl::OUString & PropertyName,const::com::sun::star::uno::Any & Value)1993 void SVTXCurrencyField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
1994 {
1995     ::vos::OGuard aGuard( GetMutex() );
1996 
1997     ::com::sun::star::uno::Any aReturn;
1998 
1999     DoubleCurrencyField* pField = (DoubleCurrencyField*)GetFormattedField();
2000     if ( pField )
2001     {
2002 #ifdef DBG_UTIL
2003         String sAssertion( String::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "SVTXCurrencyField::setProperty(" ) ) );
2004         sAssertion += String( PropertyName );
2005         sAssertion.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ") : invalid value !" ) );
2006 #endif
2007         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2008         switch (nPropType)
2009         {
2010             case BASEPROPERTY_CURRENCYSYMBOL:
2011             {
2012                 ::rtl::OUString aStr;
2013                 Value >>= aStr;
2014                 pField->setCurrencySymbol( aStr );
2015             }
2016             break;
2017             case BASEPROPERTY_CURSYM_POSITION:
2018             {
2019                 sal_Bool b = false;
2020                 Value >>= b;
2021                 pField->setPrependCurrSym(b);
2022             }
2023             break;
2024 
2025             default:
2026                 SVTXFormattedField::setProperty(PropertyName, Value);
2027         }
2028     }
2029     else
2030         SVTXFormattedField::setProperty(PropertyName, Value);
2031 }
2032 
getProperty(const::rtl::OUString & PropertyName)2033 ::com::sun::star::uno::Any SVTXCurrencyField::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
2034 {
2035     ::vos::OGuard aGuard( GetMutex() );
2036 
2037     ::com::sun::star::uno::Any aReturn;
2038 
2039     DoubleCurrencyField* pField = (DoubleCurrencyField*)GetFormattedField();
2040     if ( pField )
2041     {
2042         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2043         switch (nPropType)
2044         {
2045             case BASEPROPERTY_CURRENCYSYMBOL:
2046             {
2047                 aReturn <<= ::rtl::OUString( pField->getCurrencySymbol() );
2048             }
2049             break;
2050             case BASEPROPERTY_CURSYM_POSITION:
2051             {
2052                 aReturn <<= pField->getPrependCurrSym();
2053             }
2054             break;
2055             default:
2056                 return SVTXFormattedField::getProperty(PropertyName);
2057         }
2058     }
2059     return SVTXFormattedField::getProperty(PropertyName);
2060 }
2061 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)2062 void SVTXCurrencyField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
2063 {
2064     PushPropertyIds( rIds,
2065                      BASEPROPERTY_CURRENCYSYMBOL,
2066                      BASEPROPERTY_CURSYM_POSITION,
2067                      0);
2068     SVTXFormattedField::ImplGetPropertyIds( rIds );
2069 }
2070 
2071 
2072 //  ----------------------------------------------------
2073 //  class VCLXProgressBar
2074 //  ----------------------------------------------------
2075 
VCLXProgressBar()2076 VCLXProgressBar::VCLXProgressBar()
2077             :m_nValue(0)
2078             ,m_nValueMin(0)
2079             ,m_nValueMax(100)
2080 {
2081 }
2082 
~VCLXProgressBar()2083 VCLXProgressBar::~VCLXProgressBar()
2084 {
2085 }
2086 
ImplUpdateValue()2087 void VCLXProgressBar::ImplUpdateValue()
2088 {
2089     ProgressBar* pProgressBar = (ProgressBar*) GetWindow();
2090     if ( pProgressBar )
2091     {
2092         sal_Int32 nVal;
2093         sal_Int32 nValMin;
2094         sal_Int32 nValMax;
2095 
2096         // check min and max
2097         if (m_nValueMin < m_nValueMax)
2098         {
2099             nValMin = m_nValueMin;
2100             nValMax = m_nValueMax;
2101         }
2102         else
2103         {
2104             nValMin = m_nValueMax;
2105             nValMax = m_nValueMin;
2106         }
2107 
2108         // check value
2109         if (m_nValue < nValMin)
2110         {
2111             nVal = nValMin;
2112         }
2113         else if (m_nValue > nValMax)
2114         {
2115             nVal = nValMax;
2116         }
2117         else
2118         {
2119             nVal = m_nValue;
2120         }
2121 
2122         // calculate percent
2123         sal_Int32 nPercent;
2124         if (nValMin != nValMax)
2125         {
2126             nPercent = 100 * (nVal - nValMin) / (nValMax - nValMin);
2127         }
2128         else
2129         {
2130             nPercent = 0;
2131         }
2132 
2133         // set progressbar value
2134         pProgressBar->SetValue( (sal_uInt16) nPercent );
2135     }
2136 }
2137 
2138 // ::com::sun::star::uno::XInterface
queryInterface(const::com::sun::star::uno::Type & rType)2139 ::com::sun::star::uno::Any VCLXProgressBar::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
2140 {
2141     ::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
2142                                         SAL_STATIC_CAST( ::com::sun::star::awt::XProgressBar*, this ),
2143                                         SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) );
2144     return (aRet.hasValue() ? aRet : VCLXWindow::queryInterface( rType ));
2145 }
2146 
2147 // ::com::sun::star::lang::XTypeProvider
2148 IMPL_XTYPEPROVIDER_START( VCLXProgressBar )
2149     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XProgressBar>* ) NULL ),
2150     VCLXWindow::getTypes()
2151 IMPL_XTYPEPROVIDER_END
2152 
2153 // ::com::sun::star::awt::XProgressBar
2154 void VCLXProgressBar::setForegroundColor( sal_Int32 nColor ) throw(::com::sun::star::uno::RuntimeException)
2155 {
2156     ::vos::OGuard aGuard( GetMutex() );
2157 
2158     Window* pWindow = GetWindow();
2159     if ( pWindow )
2160     {
2161         Color aColor( nColor );
2162         pWindow->SetControlForeground( aColor );
2163     }
2164 }
2165 
setBackgroundColor(sal_Int32 nColor)2166 void VCLXProgressBar::setBackgroundColor( sal_Int32 nColor ) throw(::com::sun::star::uno::RuntimeException)
2167 {
2168     ::vos::OGuard aGuard( GetMutex() );
2169 
2170     Window* pWindow = GetWindow();
2171     if ( pWindow )
2172     {
2173         Color aColor( nColor );
2174         pWindow->SetBackground( aColor );
2175         pWindow->SetControlBackground( aColor );
2176         pWindow->Invalidate();
2177     }
2178 }
2179 
setValue(sal_Int32 nValue)2180 void VCLXProgressBar::setValue( sal_Int32 nValue ) throw(::com::sun::star::uno::RuntimeException)
2181 {
2182     ::vos::OGuard aGuard( GetMutex() );
2183 
2184     m_nValue = nValue;
2185     ImplUpdateValue();
2186 }
2187 
setRange(sal_Int32 nMin,sal_Int32 nMax)2188 void VCLXProgressBar::setRange( sal_Int32 nMin, sal_Int32 nMax ) throw(::com::sun::star::uno::RuntimeException )
2189 {
2190     ::vos::OGuard aGuard( GetMutex() );
2191 
2192     if ( nMin < nMax )
2193     {
2194         // take correct min and max
2195         m_nValueMin = nMin;
2196         m_nValueMax = nMax;
2197     }
2198     else
2199     {
2200         // change min and max
2201         m_nValueMin = nMax;
2202         m_nValueMax = nMin;
2203     }
2204 
2205     ImplUpdateValue();
2206 }
2207 
getValue()2208 sal_Int32 VCLXProgressBar::getValue() throw(::com::sun::star::uno::RuntimeException)
2209 {
2210     ::vos::OGuard aGuard( GetMutex() );
2211 
2212     return m_nValue;
2213 }
2214 
2215 // ::com::sun::star::awt::VclWindowPeer
setProperty(const::rtl::OUString & PropertyName,const::com::sun::star::uno::Any & Value)2216 void VCLXProgressBar::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value) throw(::com::sun::star::uno::RuntimeException)
2217 {
2218     ::vos::OGuard aGuard( GetMutex() );
2219 
2220     ProgressBar* pProgressBar = (ProgressBar*)GetWindow();
2221     if ( pProgressBar )
2222     {
2223         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2224         switch ( nPropType )
2225         {
2226             case BASEPROPERTY_PROGRESSVALUE:
2227             {
2228                 if ( Value >>= m_nValue )
2229                     ImplUpdateValue();
2230             }
2231             break;
2232             case BASEPROPERTY_PROGRESSVALUE_MIN:
2233             {
2234                 if ( Value >>= m_nValueMin )
2235                     ImplUpdateValue();
2236             }
2237             break;
2238             case BASEPROPERTY_PROGRESSVALUE_MAX:
2239             {
2240                 if ( Value >>= m_nValueMax )
2241                     ImplUpdateValue();
2242             }
2243             break;
2244             case BASEPROPERTY_FILLCOLOR:
2245             {
2246                 Window* pWindow = GetWindow();
2247                 if ( pWindow )
2248                 {
2249                     sal_Bool bVoid = Value.getValueType().getTypeClass() == ::com::sun::star::uno::TypeClass_VOID;
2250 
2251                     if ( bVoid )
2252                     {
2253                         pWindow->SetControlForeground();
2254                     }
2255                     else
2256                     {
2257                         sal_Int32 nColor = 0;
2258                         if ( Value >>= nColor )
2259                         {
2260                             Color aColor( nColor );
2261                             pWindow->SetControlForeground( aColor );
2262                         }
2263                     }
2264                 }
2265             }
2266             break;
2267             default:
2268                 VCLXWindow::setProperty( PropertyName, Value );
2269                 break;
2270         }
2271     }
2272 }
2273 
getProperty(const::rtl::OUString & PropertyName)2274 ::com::sun::star::uno::Any VCLXProgressBar::getProperty( const ::rtl::OUString& PropertyName ) throw(::com::sun::star::uno::RuntimeException)
2275 {
2276     ::vos::OGuard aGuard( GetMutex() );
2277 
2278     ::com::sun::star::uno::Any aProp;
2279     ProgressBar* pProgressBar = (ProgressBar*)GetWindow();
2280     if ( pProgressBar )
2281     {
2282         sal_uInt16 nPropType = GetPropertyId( PropertyName );
2283         switch ( nPropType )
2284         {
2285             case BASEPROPERTY_PROGRESSVALUE:
2286             {
2287                 aProp <<= m_nValue;
2288             }
2289             break;
2290             case BASEPROPERTY_PROGRESSVALUE_MIN:
2291             {
2292                 aProp <<= m_nValueMin;
2293             }
2294             break;
2295             case BASEPROPERTY_PROGRESSVALUE_MAX:
2296             {
2297                 aProp <<= m_nValueMax;
2298             }
2299             break;
2300             default:
2301                 aProp <<= VCLXWindow::getProperty( PropertyName );
2302                 break;
2303         }
2304     }
2305     return aProp;
2306 }
2307 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)2308 void VCLXProgressBar::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
2309 {
2310     PushPropertyIds( rIds,
2311                      BASEPROPERTY_PROGRESSVALUE,
2312                      BASEPROPERTY_PROGRESSVALUE_MIN,
2313                      BASEPROPERTY_PROGRESSVALUE_MAX,
2314                      BASEPROPERTY_FILLCOLOR,
2315                      0);
2316     VCLXWindow::ImplGetPropertyIds( rIds, true );
2317 }
2318 
2319 
2320 //  ----------------------------------------------------
2321 //  class SVTXDateField
2322 //  ----------------------------------------------------
SVTXDateField()2323 SVTXDateField::SVTXDateField()
2324     :VCLXDateField()
2325 {
2326 }
2327 
~SVTXDateField()2328 SVTXDateField::~SVTXDateField()
2329 {
2330 }
2331 
setProperty(const::rtl::OUString & PropertyName,const::com::sun::star::uno::Any & Value)2332 void SAL_CALL SVTXDateField::setProperty( const ::rtl::OUString& PropertyName, const ::com::sun::star::uno::Any& Value ) throw(::com::sun::star::uno::RuntimeException)
2333 {
2334     VCLXDateField::setProperty( PropertyName, Value );
2335 
2336     // some properties need to be forwarded to the sub edit, too
2337     Edit* pSubEdit = GetWindow() ? static_cast< Edit* >( GetWindow() )->GetSubEdit() : NULL;
2338     if ( !pSubEdit )
2339         return;
2340 
2341     switch ( GetPropertyId( PropertyName ) )
2342     {
2343     case BASEPROPERTY_TEXTLINECOLOR:
2344         if ( !Value.hasValue() )
2345             pSubEdit->SetTextLineColor();
2346         else
2347         {
2348             sal_Int32 nColor = 0;
2349             if ( Value >>= nColor )
2350                 pSubEdit->SetTextLineColor( Color( nColor ) );
2351         }
2352         break;
2353     }
2354 }
2355 
ImplGetPropertyIds(std::list<sal_uInt16> & rIds)2356 void SVTXDateField::ImplGetPropertyIds( std::list< sal_uInt16 > &rIds )
2357 {
2358     PushPropertyIds( rIds,
2359                      BASEPROPERTY_TEXTLINECOLOR,
2360                      0);
2361     VCLXDateField::ImplGetPropertyIds( rIds );
2362 }
2363