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