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_dbaccess.hxx"
26 #ifndef DBAUI_FIELDDESCRIPTIONS_HXX
27 #include "FieldDescriptions.hxx"
28 #endif
29 #ifndef _TOOLS_DEBUG_HXX
30 #include <tools/debug.hxx>
31 #endif
32 #ifndef TOOLS_DIAGNOSE_EX_H
33 #include <tools/diagnose_ex.h>
34 #endif
35 #ifndef _DBU_TBL_HRC_
36 #include "dbu_tbl.hrc"
37 #endif
38 #ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
39 #include <com/sun/star/sdbc/ColumnValue.hpp>
40 #endif
41 #ifndef DBACCESS_SHARED_DBUSTRINGS_HRC
42 #include "dbustrings.hrc"
43 #endif
44 #ifndef _COMPHELPER_TYPES_HXX_
45 #include <comphelper/types.hxx>
46 #endif
47 #ifndef _COMPHELPER_EXTRACT_HXX_
48 #include <comphelper/extract.hxx>
49 #endif
50 #ifndef DBAUI_TOOLS_HXX
51 #include "UITools.hxx"
52 #endif
53 #ifndef _COM_SUN_STAR_UTIL_NUMBERFORMAT_HPP_
54 #include <com/sun/star/util/NumberFormat.hpp>
55 #endif
56 
57 #define DEFAULT_VARCHAR_PRECSION	50
58 #define DEFAULT_OTHER_PRECSION		16
59 #define DEFAULT_NUMERIC_PRECSION	5
60 #define DEFAULT_NUMERIC_SCALE		0
61 
62 
63 using namespace dbaui;
64 using namespace ::com::sun::star::sdbc;
65 using namespace ::com::sun::star::uno;
66 using namespace ::com::sun::star::beans;
67 using namespace ::com::sun::star::util;
68 
69 //========================================================================
70 // class OFieldDescription
71 //========================================================================
DBG_NAME(OFieldDescription)72 DBG_NAME(OFieldDescription)
73 //------------------------------------------------------------------------------
74 OFieldDescription::OFieldDescription()
75     :m_pType()
76 	,m_nType(DataType::VARCHAR)
77 	,m_nPrecision(0)
78 	,m_nScale(0)
79 	,m_nIsNullable(ColumnValue::NULLABLE)
80     ,m_nFormatKey(0)
81 	,m_eHorJustify(SVX_HOR_JUSTIFY_STANDARD)
82 	,m_bIsAutoIncrement(sal_False)
83     ,m_bIsPrimaryKey(sal_False)
84 	,m_bIsCurrency(sal_False)
85 	,m_bHidden(sal_False)
86 {
87 	DBG_CTOR(OFieldDescription,NULL);
88 }
89 //------------------------------------------------------------------------------
OFieldDescription(const OFieldDescription & rDescr)90 OFieldDescription::OFieldDescription( const OFieldDescription& rDescr )
91     :m_aDefaultValue(rDescr.m_aDefaultValue)
92     ,m_aControlDefault(rDescr.m_aControlDefault)
93     ,m_aWidth(rDescr.m_aWidth)
94     ,m_aRelativePosition(rDescr.m_aRelativePosition)
95     ,m_pType(rDescr.m_pType)
96     ,m_xDest(rDescr.m_xDest)
97     ,m_xDestInfo(rDescr.m_xDestInfo)
98     ,m_sName(rDescr.m_sName)
99     ,m_sTypeName(rDescr.m_sTypeName)
100     ,m_sDescription(rDescr.m_sDescription)
101     ,m_sAutoIncrementValue(rDescr.m_sAutoIncrementValue)
102     ,m_nType(rDescr.m_nType)
103     ,m_nPrecision(rDescr.m_nPrecision)
104     ,m_nScale(rDescr.m_nScale)
105     ,m_nIsNullable(rDescr.m_nIsNullable)
106     ,m_nFormatKey(rDescr.m_nFormatKey)
107     ,m_eHorJustify(rDescr.m_eHorJustify)
108     ,m_bIsAutoIncrement(rDescr.m_bIsAutoIncrement)
109     ,m_bIsPrimaryKey(rDescr.m_bIsPrimaryKey)
110     ,m_bIsCurrency(rDescr.m_bIsCurrency)
111     ,m_bHidden(rDescr.m_bHidden)
112 {
113     DBG_CTOR(OFieldDescription,NULL);
114 }
115 
116 //------------------------------------------------------------------------------
~OFieldDescription()117 OFieldDescription::~OFieldDescription()
118 {
119 	DBG_DTOR(OFieldDescription,NULL);
120 }
121 //------------------------------------------------------------------------------
OFieldDescription(const Reference<XPropertySet> & xAffectedCol,sal_Bool _bUseAsDest)122 OFieldDescription::OFieldDescription(const Reference< XPropertySet >& xAffectedCol,sal_Bool _bUseAsDest)
123     :m_pType()
124 	,m_nType(DataType::VARCHAR)
125 	,m_nPrecision(0)
126 	,m_nScale(0)
127 	,m_nIsNullable(ColumnValue::NULLABLE)
128 	,m_nFormatKey(0)
129 	,m_eHorJustify(SVX_HOR_JUSTIFY_STANDARD)
130 	,m_bIsAutoIncrement(sal_False)
131     ,m_bIsPrimaryKey(sal_False)
132     ,m_bIsCurrency(sal_False)
133     ,m_bHidden(sal_False)
134 {
135 	DBG_CTOR(OFieldDescription,NULL);
136 	OSL_ENSURE(xAffectedCol.is(),"PropetySet can notbe null!");
137 	if ( xAffectedCol.is() )
138 	{
139 		if ( _bUseAsDest )
140 		{
141 			m_xDest = xAffectedCol;
142 			m_xDestInfo = xAffectedCol->getPropertySetInfo();;
143 		}
144 		else
145 		{
146 			try
147 			{
148 				Reference<XPropertySetInfo> xPropSetInfo = xAffectedCol->getPropertySetInfo();
149 				if(xPropSetInfo->hasPropertyByName(PROPERTY_NAME))
150 					SetName(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_NAME)));
151 				if(xPropSetInfo->hasPropertyByName(PROPERTY_DESCRIPTION))
152 					SetDescription(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_DESCRIPTION)));
153                 if(xPropSetInfo->hasPropertyByName(PROPERTY_HELPTEXT))
154                 {
155                     ::rtl::OUString sHelpText;
156                     xAffectedCol->getPropertyValue(PROPERTY_HELPTEXT) >>= sHelpText;
157 					SetHelpText(sHelpText);
158                 }
159 				if(xPropSetInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE))
160 					SetDefaultValue( xAffectedCol->getPropertyValue(PROPERTY_DEFAULTVALUE) );
161 
162 				if(xPropSetInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT))
163 					SetControlDefault( xAffectedCol->getPropertyValue(PROPERTY_CONTROLDEFAULT) );
164 
165 				if(xPropSetInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION))
166 					SetAutoIncrementValue(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_AUTOINCREMENTCREATION)));
167 				if(xPropSetInfo->hasPropertyByName(PROPERTY_TYPE))
168 					SetTypeValue(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_TYPE)));
169                 if (xPropSetInfo->hasPropertyByName(PROPERTY_TYPENAME))
170 					SetTypeName(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_TYPENAME)));
171 				if(xPropSetInfo->hasPropertyByName(PROPERTY_PRECISION))
172 					SetPrecision(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_PRECISION)));
173 				if(xPropSetInfo->hasPropertyByName(PROPERTY_SCALE))
174 					SetScale(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_SCALE)));
175 				if(xPropSetInfo->hasPropertyByName(PROPERTY_ISNULLABLE))
176 					SetIsNullable(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_ISNULLABLE)));
177 				if(xPropSetInfo->hasPropertyByName(PROPERTY_FORMATKEY))
178                 {
179                     const Any aValue = xAffectedCol->getPropertyValue(PROPERTY_FORMATKEY);
180                     if ( aValue.hasValue() )
181 					    SetFormatKey(::comphelper::getINT32(aValue));
182                 }
183 				if(xPropSetInfo->hasPropertyByName(PROPERTY_RELATIVEPOSITION))
184 					m_aRelativePosition = xAffectedCol->getPropertyValue(PROPERTY_RELATIVEPOSITION);
185 				if(xPropSetInfo->hasPropertyByName(PROPERTY_WIDTH))
186 					m_aWidth = xAffectedCol->getPropertyValue(PROPERTY_WIDTH);
187 				if(xPropSetInfo->hasPropertyByName(PROPERTY_HIDDEN))
188 					xAffectedCol->getPropertyValue(PROPERTY_HIDDEN) >>= m_bHidden;
189 				if(xPropSetInfo->hasPropertyByName(PROPERTY_ALIGN))
190                 {
191                     const Any aValue = xAffectedCol->getPropertyValue(PROPERTY_ALIGN);
192                     if ( aValue.hasValue() )
193 					    SetHorJustify( ::dbaui::mapTextJustify(::comphelper::getINT32(aValue)));
194                 }
195 				if(xPropSetInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT))
196 					SetAutoIncrement(::cppu::any2bool(xAffectedCol->getPropertyValue(PROPERTY_ISAUTOINCREMENT)));
197 			}
198 			catch(const Exception&)
199 			{
200                 DBG_UNHANDLED_EXCEPTION();
201 			}
202 		}
203 	}
204 }
205 // -----------------------------------------------------------------------------
FillFromTypeInfo(const TOTypeInfoSP & _pType,sal_Bool _bForce,sal_Bool _bReset)206 void OFieldDescription::FillFromTypeInfo(const TOTypeInfoSP& _pType,sal_Bool _bForce,sal_Bool _bReset)
207 {
208 	TOTypeInfoSP pOldType = getTypeInfo();
209 	if ( _pType != pOldType )
210 	{
211 		// reset type depending information
212 		if ( _bReset )
213 		{
214 			SetFormatKey(0);
215 			SetControlDefault(Any());
216 		}
217 
218 		sal_Bool bForce = _bForce || pOldType.get() == NULL || pOldType->nType != _pType->nType;
219 		switch ( _pType->nType )
220 		{
221 			case DataType::CHAR:
222 			case DataType::VARCHAR:
223 				if ( bForce )
224 				{
225 					sal_Int32 nPrec = DEFAULT_VARCHAR_PRECSION;
226 					if ( GetPrecision() )
227 						nPrec = GetPrecision();
228 					SetPrecision(::std::min<sal_Int32>(nPrec,_pType->nPrecision));
229 				}
230 				break;
231             case DataType::TIMESTAMP:
232                 if ( bForce && _pType->nMaximumScale)
233 				{
234 					SetScale(::std::min<sal_Int32>(GetScale() ? GetScale() : DEFAULT_NUMERIC_SCALE,_pType->nMaximumScale));
235 				}
236                 break;
237 			default:
238 				if ( bForce )
239 				{
240 					sal_Int32 nPrec = DEFAULT_OTHER_PRECSION;
241 					switch ( _pType->nType )
242 					{
243 						case DataType::BIT:
244 						case DataType::BLOB:
245 						case DataType::CLOB:
246 							nPrec = _pType->nPrecision;
247 							break;
248 						default:
249 							if ( GetPrecision() )
250 								nPrec = GetPrecision();
251 							break;
252 					}
253 
254 					if ( _pType->nPrecision )
255 						SetPrecision(::std::min<sal_Int32>(nPrec ? nPrec : DEFAULT_NUMERIC_PRECSION,_pType->nPrecision));
256 					if ( _pType->nMaximumScale )
257 						SetScale(::std::min<sal_Int32>(GetScale() ? GetScale() : DEFAULT_NUMERIC_SCALE,_pType->nMaximumScale));
258 				}
259 		}
260 		if ( !_pType->aCreateParams.getLength() )
261 		{
262 			SetPrecision(_pType->nPrecision);
263 			SetScale(_pType->nMinimumScale);
264 		}
265 		if ( !_pType->bNullable && IsNullable() )
266 			SetIsNullable(ColumnValue::NO_NULLS);
267 		if ( !_pType->bAutoIncrement && IsAutoIncrement() )
268 			SetAutoIncrement(sal_False);
269 		SetCurrency( _pType->bCurrency );
270 		SetType(_pType);
271 		SetTypeName(_pType->aTypeName);
272 	}
273 }
274 // -----------------------------------------------------------------------------
SetName(const::rtl::OUString & _rName)275 void OFieldDescription::SetName(const ::rtl::OUString& _rName)
276 {
277 	try
278 	{
279 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_NAME) )
280 			m_xDest->setPropertyValue(PROPERTY_NAME,makeAny(_rName));
281 		else
282 			m_sName = _rName;
283 	}
284 	catch(const Exception& )
285 	{
286         DBG_UNHANDLED_EXCEPTION();
287 	}
288 }
289 // -----------------------------------------------------------------------------
SetHelpText(const::rtl::OUString & _sHelpText)290 void OFieldDescription::SetHelpText(const ::rtl::OUString& _sHelpText)
291 {
292     try
293 	{
294 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
295 			m_xDest->setPropertyValue(PROPERTY_HELPTEXT,makeAny(_sHelpText));
296 		else
297 			m_sHelpText = _sHelpText;
298 	}
299 	catch(const Exception& )
300 	{
301         DBG_UNHANDLED_EXCEPTION();
302 	}
303 }
304 // -----------------------------------------------------------------------------
SetDescription(const::rtl::OUString & _rDescription)305 void OFieldDescription::SetDescription(const ::rtl::OUString& _rDescription)
306 {
307 	try
308 	{
309 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DESCRIPTION) )
310 			m_xDest->setPropertyValue(PROPERTY_DESCRIPTION,makeAny(_rDescription));
311 		else
312 			m_sDescription = _rDescription;
313 	}
314 	catch(const Exception& )
315 	{
316         DBG_UNHANDLED_EXCEPTION();
317 	}
318 }
319 // -----------------------------------------------------------------------------
SetDefaultValue(const Any & _rDefaultValue)320 void OFieldDescription::SetDefaultValue(const Any& _rDefaultValue)
321 {
322 	try
323 	{
324 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE) )
325 			m_xDest->setPropertyValue(PROPERTY_DEFAULTVALUE,makeAny(_rDefaultValue));
326 		else
327 			m_aDefaultValue = _rDefaultValue;
328 	}
329 	catch( const Exception& )
330 	{
331         DBG_UNHANDLED_EXCEPTION();
332 	}
333 }
334 // -----------------------------------------------------------------------------
SetControlDefault(const Any & _rControlDefault)335 void OFieldDescription::SetControlDefault(const Any& _rControlDefault)
336 {
337 	try
338 	{
339 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
340 			m_xDest->setPropertyValue(PROPERTY_CONTROLDEFAULT,makeAny(_rControlDefault));
341 		else
342 			m_aControlDefault = _rControlDefault;
343 	}
344 	catch( const Exception& )
345 	{
346         DBG_UNHANDLED_EXCEPTION();
347 	}
348 }
349 // -----------------------------------------------------------------------------
SetAutoIncrementValue(const::rtl::OUString & _sAutoIncValue)350 void OFieldDescription::SetAutoIncrementValue(const ::rtl::OUString& _sAutoIncValue)
351 {
352 	try
353 	{
354 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) )
355 			m_xDest->setPropertyValue(PROPERTY_AUTOINCREMENTCREATION,makeAny(_sAutoIncValue));
356 		else
357 			m_sAutoIncrementValue = _sAutoIncValue;
358 	}
359 	catch( const Exception& )
360 	{
361         DBG_UNHANDLED_EXCEPTION();
362 	}
363 }
364 // -----------------------------------------------------------------------------
SetType(TOTypeInfoSP _pType)365 void OFieldDescription::SetType(TOTypeInfoSP _pType)
366 {
367 	m_pType = _pType;
368 	if ( m_pType.get() )
369 	{
370 		try
371 		{
372 			if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
373 				m_xDest->setPropertyValue(PROPERTY_TYPE,makeAny(m_pType->nType));
374 			else
375 				m_nType = m_pType->nType;
376 		}
377 	    catch( const Exception& )
378 	    {
379             DBG_UNHANDLED_EXCEPTION();
380 	    }
381 	}
382 }
383 // -----------------------------------------------------------------------------
SetTypeValue(sal_Int32 _nType)384 void OFieldDescription::SetTypeValue(sal_Int32 _nType)
385 {
386 	try
387 	{
388 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
389 			m_xDest->setPropertyValue(PROPERTY_TYPE,makeAny(_nType));
390 		else
391 		{
392 			m_nType = _nType;
393 			OSL_ENSURE(!m_pType.get(),"Invalid call here!");
394 		}
395 	}
396 	catch( const Exception& )
397 	{
398         DBG_UNHANDLED_EXCEPTION();
399 	}
400 }
401 // -----------------------------------------------------------------------------
SetPrecision(const sal_Int32 & _rPrecision)402 void OFieldDescription::SetPrecision(const sal_Int32& _rPrecision)
403 {
404 	try
405 	{
406 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_PRECISION) )
407 			m_xDest->setPropertyValue(PROPERTY_PRECISION,makeAny(_rPrecision));
408 		else
409 			m_nPrecision = _rPrecision;
410 	}
411 	catch( const Exception& )
412 	{
413         DBG_UNHANDLED_EXCEPTION();
414 	}
415 }
416 // -----------------------------------------------------------------------------
SetScale(const sal_Int32 & _rScale)417 void OFieldDescription::SetScale(const sal_Int32& _rScale)
418 {
419 	try
420 	{
421 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_SCALE) )
422 			m_xDest->setPropertyValue(PROPERTY_SCALE,makeAny(_rScale));
423 		else
424 			m_nScale = _rScale;
425 	}
426 	catch( const Exception& )
427 	{
428         DBG_UNHANDLED_EXCEPTION();
429 	}
430 }
431 // -----------------------------------------------------------------------------
SetIsNullable(const sal_Int32 & _rIsNullable)432 void OFieldDescription::SetIsNullable(const sal_Int32& _rIsNullable)
433 {
434 	try
435 	{
436 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
437 			m_xDest->setPropertyValue(PROPERTY_ISNULLABLE,makeAny(_rIsNullable));
438 		else
439 			m_nIsNullable = _rIsNullable;
440 	}
441 	catch( const Exception& )
442 	{
443         DBG_UNHANDLED_EXCEPTION();
444 	}
445 }
446 // -----------------------------------------------------------------------------
SetFormatKey(const sal_Int32 & _rFormatKey)447 void OFieldDescription::SetFormatKey(const sal_Int32& _rFormatKey)
448 {
449 	try
450 	{
451 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
452 			m_xDest->setPropertyValue(PROPERTY_FORMATKEY,makeAny(_rFormatKey));
453 		else
454 			m_nFormatKey = _rFormatKey;
455 	}
456 	catch( const Exception& )
457 	{
458         DBG_UNHANDLED_EXCEPTION();
459 	}
460 }
461 // -----------------------------------------------------------------------------
SetHorJustify(const SvxCellHorJustify & _rHorJustify)462 void OFieldDescription::SetHorJustify(const SvxCellHorJustify& _rHorJustify)
463 {
464 	try
465 	{
466 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ALIGN) )
467 			m_xDest->setPropertyValue(PROPERTY_ALIGN,makeAny( dbaui::mapTextAllign(_rHorJustify)));
468 		else
469 			m_eHorJustify = _rHorJustify;
470 	}
471 	catch( const Exception& )
472 	{
473         DBG_UNHANDLED_EXCEPTION();
474 	}
475 }
476 // -----------------------------------------------------------------------------
SetAutoIncrement(sal_Bool _bAuto)477 void OFieldDescription::SetAutoIncrement(sal_Bool _bAuto)
478 {
479 	try
480 	{
481 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT) )
482 			m_xDest->setPropertyValue(PROPERTY_ISAUTOINCREMENT,makeAny(_bAuto));
483 		else
484 			m_bIsAutoIncrement = _bAuto;
485 	}
486 	catch( const Exception& )
487 	{
488         DBG_UNHANDLED_EXCEPTION();
489 	}
490 }
491 // -----------------------------------------------------------------------------
SetPrimaryKey(sal_Bool _bPKey)492 void OFieldDescription::SetPrimaryKey(sal_Bool _bPKey)
493 {
494 	m_bIsPrimaryKey = _bPKey;
495 	if ( _bPKey )
496 		SetIsNullable(::com::sun::star::sdbc::ColumnValue::NO_NULLS);
497 }
498 // -----------------------------------------------------------------------------
SetCurrency(sal_Bool _bIsCurrency)499 void OFieldDescription::SetCurrency(sal_Bool _bIsCurrency)
500 {
501 	m_bIsCurrency = _bIsCurrency;
502 }
503 // -----------------------------------------------------------------------------
504 
GetName() const505 ::rtl::OUString				OFieldDescription::GetName()				const
506 {
507 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_NAME) )
508 		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_NAME));
509 	else
510 		return m_sName;
511 }
512 // -----------------------------------------------------------------------------
GetDescription() const513 ::rtl::OUString				OFieldDescription::GetDescription()			const
514 {
515 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DESCRIPTION) )
516 		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_DESCRIPTION));
517 	else
518 		return m_sDescription;
519 }
520 // -----------------------------------------------------------------------------
GetHelpText() const521 ::rtl::OUString				OFieldDescription::GetHelpText()			const
522 {
523 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
524 		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_HELPTEXT));
525 	else
526 		return m_sHelpText;
527 }
528 // -----------------------------------------------------------------------------
GetControlDefault() const529 ::com::sun::star::uno::Any	OFieldDescription::GetControlDefault()		const
530 {
531 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
532 		return m_xDest->getPropertyValue(PROPERTY_CONTROLDEFAULT);
533 	else
534 		return m_aControlDefault;
535 }
536 // -----------------------------------------------------------------------------
GetAutoIncrementValue() const537 ::rtl::OUString				OFieldDescription::GetAutoIncrementValue()	const
538 {
539 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) )
540 		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_AUTOINCREMENTCREATION));
541 	else
542 		return m_sAutoIncrementValue;
543 }
544 // -----------------------------------------------------------------------------
GetType() const545 sal_Int32					OFieldDescription::GetType()				const
546 {
547 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
548 		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_TYPE));
549 	else
550 		return m_pType.get() ? m_pType->nType : m_nType;
551 }
552 // -----------------------------------------------------------------------------
GetTypeName() const553 ::rtl::OUString             OFieldDescription::GetTypeName()			const
554 {
555 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPENAME) )
556 		return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_TYPENAME));
557 	else
558 		return m_pType.get() ? m_pType->aTypeName : m_sTypeName;
559 }
560 // -----------------------------------------------------------------------------
GetPrecision() const561 sal_Int32					OFieldDescription::GetPrecision()			const
562 {
563     sal_Int32 nPrec = m_nPrecision;
564     if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_PRECISION) )
565 		nPrec = ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_PRECISION));
566 
567     TOTypeInfoSP pTypeInfo = getTypeInfo();
568     if ( pTypeInfo )
569     {
570 	    switch ( pTypeInfo->nType )
571 	    {
572             case DataType::TINYINT:
573             case DataType::SMALLINT:
574 		    case DataType::INTEGER:
575             case DataType::BIGINT:
576                 if ( !nPrec )
577                     nPrec = pTypeInfo->nPrecision;
578                 break;
579         } // switch ( pTypeInfo->nType )
580     }
581 
582 	return nPrec;
583 }
584 // -----------------------------------------------------------------------------
GetScale() const585 sal_Int32					OFieldDescription::GetScale()				const
586 {
587 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_SCALE) )
588 		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_SCALE));
589 	else
590 		return m_nScale;
591 }
592 // -----------------------------------------------------------------------------
GetIsNullable() const593 sal_Int32					OFieldDescription::GetIsNullable()			const
594 {
595 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
596 		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ISNULLABLE));
597 	else
598 		return m_nIsNullable;
599 }
600 // -----------------------------------------------------------------------------
GetFormatKey() const601 sal_Int32					OFieldDescription::GetFormatKey()			const
602 {
603 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
604 		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_FORMATKEY));
605 	else
606 		return m_nFormatKey;
607 }
608 // -----------------------------------------------------------------------------
GetHorJustify() const609 SvxCellHorJustify			OFieldDescription::GetHorJustify()			const
610 {
611 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ALIGN) )
612 		return ::dbaui::mapTextJustify(::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ALIGN)));
613 	else
614 		return m_eHorJustify;
615 }
616 // -----------------------------------------------------------------------------
getTypeInfo() const617 TOTypeInfoSP				OFieldDescription::getTypeInfo()			const
618 {
619 	return m_pType;
620 }
621 // -----------------------------------------------------------------------------
getSpecialTypeInfo() const622 TOTypeInfoSP				OFieldDescription::getSpecialTypeInfo()	const
623 {
624     TOTypeInfoSP pSpecialType( new OTypeInfo() );
625     *pSpecialType = *m_pType;
626     pSpecialType->nPrecision = GetPrecision();
627     pSpecialType->nMaximumScale = static_cast<sal_Int16>(GetScale());
628     pSpecialType->bAutoIncrement = IsAutoIncrement(); // http://dba.openoffice.org/issues/show_bug.cgi?id=115398 fixed by ludob
629     return pSpecialType;
630 }
631 // -----------------------------------------------------------------------------
IsAutoIncrement() const632 sal_Bool					OFieldDescription::IsAutoIncrement()		const
633 {
634 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT) )
635 		return ::cppu::any2bool(m_xDest->getPropertyValue(PROPERTY_ISAUTOINCREMENT));
636 	else
637 		return m_bIsAutoIncrement;
638 }
639 // -----------------------------------------------------------------------------
IsPrimaryKey() const640 sal_Bool					OFieldDescription::IsPrimaryKey()			const
641 {
642 	return m_bIsPrimaryKey;
643 }
644 // -----------------------------------------------------------------------------
IsCurrency() const645 sal_Bool					OFieldDescription::IsCurrency()				const
646 {
647 		return m_bIsCurrency;
648 }
649 // -----------------------------------------------------------------------------
IsNullable() const650 sal_Bool					OFieldDescription::IsNullable()				const
651 {
652 	if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
653 		return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ISNULLABLE)) == ::com::sun::star::sdbc::ColumnValue::NULLABLE;
654 	else
655 		return m_nIsNullable == ::com::sun::star::sdbc::ColumnValue::NULLABLE;
656 }
657 // -----------------------------------------------------------------------------
SetTypeName(const::rtl::OUString & _sTypeName)658 void OFieldDescription::SetTypeName(const ::rtl::OUString& _sTypeName)
659 {
660 	try
661 	{
662 		if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPENAME) )
663 			m_xDest->setPropertyValue(PROPERTY_TYPENAME,makeAny(_sTypeName));
664 		else
665 			m_sTypeName = _sTypeName;
666 	}
667 	catch( const Exception& )
668 	{
669         DBG_UNHANDLED_EXCEPTION();
670 	}
671 }
672 // -----------------------------------------------------------------------------
copyColumnSettingsTo(const Reference<XPropertySet> & _rxColumn)673 void OFieldDescription::copyColumnSettingsTo(const Reference< XPropertySet >& _rxColumn)
674 {
675 	if ( _rxColumn.is() )
676 	{
677 		Reference<XPropertySetInfo> xInfo = _rxColumn->getPropertySetInfo();
678 
679 		if ( GetFormatKey() != NumberFormat::ALL && xInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
680 			_rxColumn->setPropertyValue(PROPERTY_FORMATKEY,makeAny(GetFormatKey()));
681 		if ( GetHorJustify() != SVX_HOR_JUSTIFY_STANDARD && xInfo->hasPropertyByName(PROPERTY_ALIGN) )
682 			_rxColumn->setPropertyValue(PROPERTY_ALIGN,makeAny(dbaui::mapTextAllign(GetHorJustify())));
683 		if ( GetHelpText().getLength() && xInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
684 			_rxColumn->setPropertyValue(PROPERTY_HELPTEXT,makeAny(GetHelpText()));
685 		if ( GetControlDefault().hasValue() && xInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
686 			_rxColumn->setPropertyValue(PROPERTY_CONTROLDEFAULT,GetControlDefault());
687 
688 		if(xInfo->hasPropertyByName(PROPERTY_RELATIVEPOSITION))
689 			_rxColumn->setPropertyValue(PROPERTY_RELATIVEPOSITION,m_aRelativePosition);
690 		if(xInfo->hasPropertyByName(PROPERTY_WIDTH))
691 			_rxColumn->setPropertyValue(PROPERTY_WIDTH,m_aWidth);
692 		if(xInfo->hasPropertyByName(PROPERTY_HIDDEN))
693 			_rxColumn->setPropertyValue(PROPERTY_HIDDEN,makeAny(m_bHidden));
694 	}
695 }
696 // -----------------------------------------------------------------------------
697