1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_extensions.hxx"
30 #include "usercontrol.hxx"
31 
32 /** === begin UNO includes === **/
33 #include <com/sun/star/inspection/PropertyControlType.hpp>
34 #include <com/sun/star/inspection/PropertyControlType.hpp>
35 /** === end UNO includes === **/
36 #include <svl/numuno.hxx>
37 #include <rtl/math.hxx>
38 #include <tools/debug.hxx>
39 #include <svl/zformat.hxx>
40 #include <connectivity/dbconversion.hxx>
41 #include <com/sun/star/util/Time.hpp>
42 #include "modulepcr.hxx"
43 #include "propresid.hrc"
44 
45 //............................................................................
46 namespace pcr
47 {
48 //............................................................................
49 
50     /** === begin UNO using === **/
51     using ::com::sun::star::uno::Any;
52     using ::com::sun::star::uno::Type;
53     using ::com::sun::star::beans::IllegalTypeException;
54     using ::com::sun::star::uno::RuntimeException;
55     /** === end UNO using === **/
56     namespace PropertyControlType = ::com::sun::star::inspection::PropertyControlType;
57 
58 	//==================================================================
59 	// NumberFormatSampleField
60 	//==================================================================
61 	//------------------------------------------------------------------
62 	long NumberFormatSampleField::PreNotify( NotifyEvent& rNEvt )
63 	{
64 		// want to handle two keys myself : Del/Backspace should empty the window (setting my prop to "standard" this way)
65 		if (EVENT_KEYINPUT == rNEvt.GetType())
66 		{
67 			sal_uInt16 nKey = rNEvt.GetKeyEvent()->GetKeyCode().GetCode();
68 
69 			if ((KEY_DELETE == nKey) || (KEY_BACKSPACE == nKey))
70 			{
71 				SetText( String() );
72                 if ( m_pHelper )
73 				    m_pHelper->ModifiedHdl( this );
74 				return 1;
75 			}
76 		}
77 
78         return BaseClass::PreNotify( rNEvt );
79 	}
80 
81 	//------------------------------------------------------------------
82 	void NumberFormatSampleField::SetFormatSupplier( const SvNumberFormatsSupplierObj* pSupplier )
83 	{
84 		if ( pSupplier )
85 		{
86 			TreatAsNumber( sal_True );
87 
88 			SvNumberFormatter* pFormatter = pSupplier->GetNumberFormatter();
89 			SetFormatter( pFormatter, sal_True );
90 			SetValue( 1234.56789 );
91 		}
92 		else
93 		{
94 			TreatAsNumber( sal_False );
95 			SetFormatter( NULL, sal_True );
96 			SetText( String() );
97 		}
98 	}
99 
100 	//==================================================================
101 	// OFormatSampleControl
102 	//==================================================================
103 	//------------------------------------------------------------------
104 	OFormatSampleControl::OFormatSampleControl( Window* pParent, WinBits nWinStyle )
105         :OFormatSampleControl_Base( PropertyControlType::Unknown, pParent, nWinStyle )
106 	{
107 	}
108 
109 	//------------------------------------------------------------------
110 	void SAL_CALL OFormatSampleControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException)
111 	{
112         sal_Int32 nFormatKey = 0;
113         if ( _rValue >>= nFormatKey )
114 		{
115 			// else set the new format key, the text will be reformatted
116             getTypedControlWindow()->SetFormatKey( nFormatKey );
117 
118             SvNumberFormatter* pNF = getTypedControlWindow()->GetFormatter();
119             const SvNumberformat* pEntry = pNF->GetEntry( nFormatKey );
120             OSL_ENSURE( pEntry, "OFormatSampleControl::setValue: invalid format entry!" );
121 
122             const bool bIsTextFormat = ( pEntry && pEntry->IsTextFormat() );
123             if ( bIsTextFormat )
124                 getTypedControlWindow()->SetText( String( PcrRes( RID_STR_TEXT_FORMAT ) ) );
125             else
126                 getTypedControlWindow()->SetValue( pEntry ? getPreviewValue( *pEntry ) : 1234.56789 );
127 		}
128         else
129 			getTypedControlWindow()->SetText( String() );
130 	}
131     //------------------------------------------------------------------
132     double OFormatSampleControl::getPreviewValue( const SvNumberformat& i_rEntry )
133     {
134         double nValue = 1234.56789;
135 		switch ( i_rEntry.GetType() & ~NUMBERFORMAT_DEFINED )
136 		{
137 			case NUMBERFORMAT_DATE:
138                 {
139                     Date aCurrentDate;
140 	                static ::com::sun::star::util::Date STANDARD_DB_DATE(30,12,1899);
141 	                nValue = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDate(static_cast<sal_Int32>(aCurrentDate.GetDate())),STANDARD_DB_DATE);
142                 }
143                 break;
144 			case NUMBERFORMAT_TIME:
145             case NUMBERFORMAT_DATETIME:
146                 {
147                     Time aCurrentTime;
148                     nValue = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toTime(aCurrentTime.GetTime()));
149                 }
150 				break;
151 			default:
152 				break;
153 		}
154         return nValue;
155     }
156 
157     //------------------------------------------------------------------
158     double OFormatSampleControl::getPreviewValue(SvNumberFormatter* _pNF,sal_Int32 _nFormatKey)
159     {
160         const SvNumberformat* pEntry = _pNF->GetEntry(_nFormatKey);
161         DBG_ASSERT( pEntry, "OFormattedNumericControl::SetFormatDescription: invalid format key!" );
162         double nValue = 1234.56789;
163 		if ( pEntry )
164             nValue = getPreviewValue( *pEntry );
165         return nValue;
166     }
167 	//------------------------------------------------------------------
168 	Any SAL_CALL OFormatSampleControl::getValue() throw (RuntimeException)
169 	{
170         Any aPropValue;
171 		if ( getTypedControlWindow()->GetText().Len() )
172             aPropValue <<= (sal_Int32)getTypedControlWindow()->GetFormatKey();
173         return aPropValue;
174 	}
175 
176 	//------------------------------------------------------------------
177     Type SAL_CALL OFormatSampleControl::getValueType() throw (RuntimeException)
178     {
179         return ::getCppuType( static_cast< sal_Int32* >( NULL ) );
180     }
181 
182 	//==================================================================
183 	// class OFormattedNumericControl
184 	//==================================================================
185 	DBG_NAME(OFormattedNumericControl);
186 	//------------------------------------------------------------------
187 	OFormattedNumericControl::OFormattedNumericControl( Window* pParent, WinBits nWinStyle )
188         :OFormattedNumericControl_Base( PropertyControlType::Unknown, pParent, nWinStyle )
189 	{
190 		DBG_CTOR(OFormattedNumericControl,NULL);
191 
192 		getTypedControlWindow()->TreatAsNumber(sal_True);
193 
194 		m_nLastDecimalDigits = getTypedControlWindow()->GetDecimalDigits();
195 	}
196 
197 	//------------------------------------------------------------------
198 	OFormattedNumericControl::~OFormattedNumericControl()
199 	{
200 		DBG_DTOR(OFormattedNumericControl,NULL);
201 	}
202 
203 	//------------------------------------------------------------------
204 	void SAL_CALL OFormattedNumericControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException)
205 	{
206         double nValue( 0 );
207         if ( _rValue >>= nValue )
208 			getTypedControlWindow()->SetValue( nValue );
209 		else
210 			getTypedControlWindow()->SetText(String());
211 	}
212 
213 	//------------------------------------------------------------------
214 	Any SAL_CALL OFormattedNumericControl::getValue() throw (RuntimeException)
215 	{
216         Any aPropValue;
217 		if ( getTypedControlWindow()->GetText().Len() )
218             aPropValue <<= (double)getTypedControlWindow()->GetValue();
219         return aPropValue;
220 	}
221 
222 	//------------------------------------------------------------------
223     Type SAL_CALL OFormattedNumericControl::getValueType() throw (RuntimeException)
224     {
225         return ::getCppuType( static_cast< double* >( NULL ) );
226     }
227 
228 	//------------------------------------------------------------------
229 	void OFormattedNumericControl::SetFormatDescription(const FormatDescription& rDesc)
230 	{
231 		sal_Bool bFallback = sal_True;
232 
233 		if (rDesc.pSupplier)
234 		{
235 			getTypedControlWindow()->TreatAsNumber(sal_True);
236 
237 			SvNumberFormatter* pFormatter = rDesc.pSupplier->GetNumberFormatter();
238 			if (pFormatter != getTypedControlWindow()->GetFormatter())
239 				getTypedControlWindow()->SetFormatter(pFormatter, sal_True);
240 			getTypedControlWindow()->SetFormatKey(rDesc.nKey);
241 
242 			const SvNumberformat* pEntry = getTypedControlWindow()->GetFormatter()->GetEntry(getTypedControlWindow()->GetFormatKey());
243 			DBG_ASSERT( pEntry, "OFormattedNumericControl::SetFormatDescription: invalid format key!" );
244 			if ( pEntry )
245 			{
246 				switch (pEntry->GetType() & ~NUMBERFORMAT_DEFINED)
247 				{
248 					case NUMBERFORMAT_NUMBER:
249 					case NUMBERFORMAT_CURRENCY:
250 					case NUMBERFORMAT_SCIENTIFIC:
251 					case NUMBERFORMAT_FRACTION:
252 					case NUMBERFORMAT_PERCENT:
253 						m_nLastDecimalDigits = getTypedControlWindow()->GetDecimalDigits();
254 						break;
255 					case NUMBERFORMAT_DATETIME:
256 					case NUMBERFORMAT_DATE:
257 					case NUMBERFORMAT_TIME:
258 						m_nLastDecimalDigits = 7;
259 						break;
260 					default:
261 						m_nLastDecimalDigits = 0;
262 						break;
263 				}
264 				bFallback = sal_False;
265 			}
266 
267 		}
268 
269 		if ( bFallback )
270 		{
271 			getTypedControlWindow()->TreatAsNumber(sal_False);
272 			getTypedControlWindow()->SetFormatter(NULL, sal_True);
273 			getTypedControlWindow()->SetText(String());
274 			m_nLastDecimalDigits = 0;
275 		}
276 	}
277 
278 	//========================================================================
279 	//= OFileUrlControl
280 	//========================================================================
281 	//------------------------------------------------------------------
282     OFileUrlControl::OFileUrlControl( Window* pParent, WinBits nWinStyle )
283         :OFileUrlControl_Base( PropertyControlType::Unknown, pParent, nWinStyle | WB_DROPDOWN )
284     {
285         getTypedControlWindow()->SetDropDownLineCount( 10 );
286         getTypedControlWindow()->SetPlaceHolder( String( PcrRes( RID_EMBED_IMAGE_PLACEHOLDER ) ) ) ;
287     }
288 
289 	//------------------------------------------------------------------
290     OFileUrlControl::~OFileUrlControl()
291     {
292     }
293 
294 	//------------------------------------------------------------------
295 	void SAL_CALL OFileUrlControl::setValue( const Any& _rValue ) throw (IllegalTypeException, RuntimeException)
296     {
297         ::rtl::OUString sURL;
298         if ( ( _rValue >>= sURL ) )
299         {
300             if ( sURL.indexOf( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "vnd.sun.star.GraphicObject:"  ) ) ) == 0  )
301                 getTypedControlWindow()->DisplayURL( getTypedControlWindow()->GetPlaceHolder() );
302             else
303                 getTypedControlWindow()->DisplayURL( sURL );
304         }
305         else
306             getTypedControlWindow()->SetText( String() );
307     }
308 
309 	//------------------------------------------------------------------
310 	Any SAL_CALL OFileUrlControl::getValue() throw (RuntimeException)
311     {
312         Any aPropValue;
313         if ( getTypedControlWindow()->GetText().Len() )
314             	aPropValue <<= (::rtl::OUString)getTypedControlWindow()->GetURL();
315         return aPropValue;
316     }
317 
318 	//------------------------------------------------------------------
319     Type SAL_CALL OFileUrlControl::getValueType() throw (RuntimeException)
320     {
321         return ::getCppuType( static_cast< ::rtl::OUString* >( NULL ) );
322     }
323 
324 	//========================================================================
325 	//= OTimeDurationControl
326 	//========================================================================
327 	//------------------------------------------------------------------
328     OTimeDurationControl::OTimeDurationControl( ::Window* pParent, WinBits nWinStyle )
329         :ONumericControl( pParent, nWinStyle )
330     {
331         getTypedControlWindow()->SetUnit( FUNIT_CUSTOM );
332         getTypedControlWindow()->SetCustomUnitText( String::CreateFromAscii( " ms" ) );
333         getTypedControlWindow()->SetCustomConvertHdl( LINK( this, OTimeDurationControl, OnCustomConvert ) );
334     }
335 
336 	//------------------------------------------------------------------
337     OTimeDurationControl::~OTimeDurationControl()
338     {
339     }
340 
341 	//------------------------------------------------------------------
342     ::sal_Int16 SAL_CALL OTimeDurationControl::getControlType() throw (::com::sun::star::uno::RuntimeException)
343     {
344         // don't use the base class'es method, it would claim we're a standard control, which
345         // we in fact aren't
346         return PropertyControlType::Unknown;
347     }
348 
349 	//------------------------------------------------------------------
350     IMPL_LINK( OTimeDurationControl, OnCustomConvert, MetricField*, /*pField*/ )
351     {
352         long nMultiplier = 1;
353         if ( getTypedControlWindow()->GetCurUnitText().EqualsIgnoreCaseAscii( "ms" ) )
354             nMultiplier = 1;
355         if ( getTypedControlWindow()->GetCurUnitText().EqualsIgnoreCaseAscii( "s" ) )
356             nMultiplier = 1000;
357         else if ( getTypedControlWindow()->GetCurUnitText().EqualsIgnoreCaseAscii( "m" ) )
358             nMultiplier = 1000 * 60;
359         else if ( getTypedControlWindow()->GetCurUnitText().EqualsIgnoreCaseAscii( "h" ) )
360             nMultiplier = 1000 * 60 * 60;
361 
362         getTypedControlWindow()->SetValue( getTypedControlWindow()->GetLastValue() * nMultiplier );
363 
364         return 0L;
365     }
366 
367 //............................................................................
368 } // namespace pcr
369 //............................................................................
370 
371