Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include "FieldDescriptions.hxx"
21 : #include <tools/debug.hxx>
22 : #include <tools/diagnose_ex.h>
23 : #include "dbu_tbl.hrc"
24 : #include <com/sun/star/sdbc/ColumnValue.hpp>
25 : #include "dbustrings.hrc"
26 : #include <comphelper/types.hxx>
27 : #include <comphelper/extract.hxx>
28 : #include "UITools.hxx"
29 : #include <com/sun/star/util/NumberFormat.hpp>
30 :
31 : #define DEFAULT_VARCHAR_PRECISION 100
32 : #define DEFAULT_OTHER_PRECISION 16
33 : #define DEFAULT_NUMERIC_PRECISION 5
34 : #define DEFAULT_NUMERIC_SCALE 0
35 :
36 : using namespace dbaui;
37 : using namespace ::com::sun::star::sdbc;
38 : using namespace ::com::sun::star::uno;
39 : using namespace ::com::sun::star::beans;
40 : using namespace ::com::sun::star::util;
41 :
42 : // class OFieldDescription
43 0 : OFieldDescription::OFieldDescription()
44 : :m_pType()
45 : ,m_nType(DataType::VARCHAR)
46 : ,m_nPrecision(0)
47 : ,m_nScale(0)
48 : ,m_nIsNullable(ColumnValue::NULLABLE)
49 : ,m_nFormatKey(0)
50 : ,m_eHorJustify(SVX_HOR_JUSTIFY_STANDARD)
51 : ,m_bIsAutoIncrement(false)
52 : ,m_bIsPrimaryKey(false)
53 : ,m_bIsCurrency(false)
54 0 : ,m_bHidden(false)
55 : {
56 0 : }
57 :
58 0 : OFieldDescription::OFieldDescription( const OFieldDescription& rDescr )
59 : :m_aDefaultValue(rDescr.m_aDefaultValue)
60 : ,m_aControlDefault(rDescr.m_aControlDefault)
61 : ,m_aWidth(rDescr.m_aWidth)
62 : ,m_aRelativePosition(rDescr.m_aRelativePosition)
63 : ,m_pType(rDescr.m_pType)
64 : ,m_xDest(rDescr.m_xDest)
65 : ,m_xDestInfo(rDescr.m_xDestInfo)
66 : ,m_sName(rDescr.m_sName)
67 : ,m_sTypeName(rDescr.m_sTypeName)
68 : ,m_sDescription(rDescr.m_sDescription)
69 : ,m_sAutoIncrementValue(rDescr.m_sAutoIncrementValue)
70 : ,m_nType(rDescr.m_nType)
71 : ,m_nPrecision(rDescr.m_nPrecision)
72 : ,m_nScale(rDescr.m_nScale)
73 : ,m_nIsNullable(rDescr.m_nIsNullable)
74 : ,m_nFormatKey(rDescr.m_nFormatKey)
75 : ,m_eHorJustify(rDescr.m_eHorJustify)
76 : ,m_bIsAutoIncrement(rDescr.m_bIsAutoIncrement)
77 : ,m_bIsPrimaryKey(rDescr.m_bIsPrimaryKey)
78 : ,m_bIsCurrency(rDescr.m_bIsCurrency)
79 0 : ,m_bHidden(rDescr.m_bHidden)
80 : {
81 0 : }
82 :
83 0 : OFieldDescription::~OFieldDescription()
84 : {
85 0 : }
86 :
87 0 : OFieldDescription::OFieldDescription(const Reference< XPropertySet >& xAffectedCol,bool _bUseAsDest)
88 : :m_pType()
89 : ,m_nType(DataType::VARCHAR)
90 : ,m_nPrecision(0)
91 : ,m_nScale(0)
92 : ,m_nIsNullable(ColumnValue::NULLABLE)
93 : ,m_nFormatKey(0)
94 : ,m_eHorJustify(SVX_HOR_JUSTIFY_STANDARD)
95 : ,m_bIsAutoIncrement(false)
96 : ,m_bIsPrimaryKey(false)
97 : ,m_bIsCurrency(false)
98 0 : ,m_bHidden(false)
99 : {
100 : OSL_ENSURE(xAffectedCol.is(),"PropetySet can notbe null!");
101 0 : if ( xAffectedCol.is() )
102 : {
103 0 : if ( _bUseAsDest )
104 : {
105 0 : m_xDest = xAffectedCol;
106 0 : m_xDestInfo = xAffectedCol->getPropertySetInfo();
107 : }
108 : else
109 : {
110 : try
111 : {
112 0 : Reference<XPropertySetInfo> xPropSetInfo = xAffectedCol->getPropertySetInfo();
113 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_NAME))
114 0 : SetName(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_NAME)));
115 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_DESCRIPTION))
116 0 : SetDescription(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_DESCRIPTION)));
117 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_HELPTEXT))
118 : {
119 0 : OUString sHelpText;
120 0 : xAffectedCol->getPropertyValue(PROPERTY_HELPTEXT) >>= sHelpText;
121 0 : SetHelpText(sHelpText);
122 : }
123 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE))
124 0 : SetDefaultValue( xAffectedCol->getPropertyValue(PROPERTY_DEFAULTVALUE) );
125 :
126 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT))
127 0 : SetControlDefault( xAffectedCol->getPropertyValue(PROPERTY_CONTROLDEFAULT) );
128 :
129 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION))
130 0 : SetAutoIncrementValue(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_AUTOINCREMENTCREATION)));
131 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_TYPE))
132 0 : SetTypeValue(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_TYPE)));
133 0 : if (xPropSetInfo->hasPropertyByName(PROPERTY_TYPENAME))
134 0 : SetTypeName(::comphelper::getString(xAffectedCol->getPropertyValue(PROPERTY_TYPENAME)));
135 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_PRECISION))
136 0 : SetPrecision(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_PRECISION)));
137 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_SCALE))
138 0 : SetScale(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_SCALE)));
139 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_ISNULLABLE))
140 0 : SetIsNullable(::comphelper::getINT32(xAffectedCol->getPropertyValue(PROPERTY_ISNULLABLE)));
141 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_FORMATKEY))
142 : {
143 0 : const Any aValue = xAffectedCol->getPropertyValue(PROPERTY_FORMATKEY);
144 0 : if ( aValue.hasValue() )
145 0 : SetFormatKey(::comphelper::getINT32(aValue));
146 : }
147 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_RELATIVEPOSITION))
148 0 : m_aRelativePosition = xAffectedCol->getPropertyValue(PROPERTY_RELATIVEPOSITION);
149 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_WIDTH))
150 0 : m_aWidth = xAffectedCol->getPropertyValue(PROPERTY_WIDTH);
151 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_HIDDEN))
152 0 : xAffectedCol->getPropertyValue(PROPERTY_HIDDEN) >>= m_bHidden;
153 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_ALIGN))
154 : {
155 0 : const Any aValue = xAffectedCol->getPropertyValue(PROPERTY_ALIGN);
156 0 : if ( aValue.hasValue() )
157 0 : SetHorJustify( ::dbaui::mapTextJustify(::comphelper::getINT32(aValue)));
158 : }
159 0 : if(xPropSetInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT))
160 0 : SetAutoIncrement(::cppu::any2bool(xAffectedCol->getPropertyValue(PROPERTY_ISAUTOINCREMENT)));
161 : }
162 0 : catch(const Exception&)
163 : {
164 : DBG_UNHANDLED_EXCEPTION();
165 : }
166 : }
167 : }
168 0 : }
169 :
170 0 : void OFieldDescription::FillFromTypeInfo(const TOTypeInfoSP& _pType,bool _bForce,bool _bReset)
171 : {
172 0 : TOTypeInfoSP pOldType = getTypeInfo();
173 0 : if ( _pType != pOldType )
174 : {
175 : // reset type depending information
176 0 : if ( _bReset )
177 : {
178 0 : SetFormatKey(0);
179 0 : SetControlDefault(Any());
180 : }
181 :
182 0 : bool bForce = _bForce || pOldType.get() == NULL || pOldType->nType != _pType->nType;
183 0 : switch ( _pType->nType )
184 : {
185 : case DataType::CHAR:
186 : case DataType::VARCHAR:
187 0 : if ( bForce )
188 : {
189 0 : sal_Int32 nPrec = DEFAULT_VARCHAR_PRECISION;
190 0 : if ( GetPrecision() )
191 0 : nPrec = GetPrecision();
192 0 : SetPrecision(::std::min<sal_Int32>(nPrec,_pType->nPrecision));
193 : }
194 0 : break;
195 : case DataType::TIMESTAMP:
196 0 : if ( bForce && _pType->nMaximumScale)
197 : {
198 0 : SetScale(::std::min<sal_Int32>(GetScale() ? GetScale() : DEFAULT_NUMERIC_SCALE,_pType->nMaximumScale));
199 : }
200 0 : break;
201 : default:
202 0 : if ( bForce )
203 : {
204 0 : sal_Int32 nPrec = DEFAULT_OTHER_PRECISION;
205 0 : switch ( _pType->nType )
206 : {
207 : case DataType::BIT:
208 : case DataType::BLOB:
209 : case DataType::CLOB:
210 0 : nPrec = _pType->nPrecision;
211 0 : break;
212 : default:
213 0 : if ( GetPrecision() )
214 0 : nPrec = GetPrecision();
215 0 : break;
216 : }
217 :
218 0 : if ( _pType->nPrecision )
219 0 : SetPrecision(::std::min<sal_Int32>(nPrec ? nPrec : DEFAULT_NUMERIC_PRECISION,_pType->nPrecision));
220 0 : if ( _pType->nMaximumScale )
221 0 : SetScale(::std::min<sal_Int32>(GetScale() ? GetScale() : DEFAULT_NUMERIC_SCALE,_pType->nMaximumScale));
222 : }
223 : }
224 0 : if ( _pType->aCreateParams.isEmpty() )
225 : {
226 0 : SetPrecision(_pType->nPrecision);
227 0 : SetScale(_pType->nMinimumScale);
228 : }
229 0 : if ( !_pType->bNullable && IsNullable() )
230 0 : SetIsNullable(ColumnValue::NO_NULLS);
231 0 : if ( !_pType->bAutoIncrement && IsAutoIncrement() )
232 0 : SetAutoIncrement(false);
233 0 : SetCurrency( _pType->bCurrency );
234 0 : SetType(_pType);
235 0 : SetTypeName(_pType->aTypeName);
236 0 : }
237 0 : }
238 :
239 0 : void OFieldDescription::SetName(const OUString& _rName)
240 : {
241 : try
242 : {
243 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_NAME) )
244 0 : m_xDest->setPropertyValue(PROPERTY_NAME,makeAny(_rName));
245 : else
246 0 : m_sName = _rName;
247 : }
248 0 : catch(const Exception& )
249 : {
250 : DBG_UNHANDLED_EXCEPTION();
251 : }
252 0 : }
253 :
254 0 : void OFieldDescription::SetHelpText(const OUString& _sHelpText)
255 : {
256 : try
257 : {
258 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
259 0 : m_xDest->setPropertyValue(PROPERTY_HELPTEXT,makeAny(_sHelpText));
260 : else
261 0 : m_sHelpText = _sHelpText;
262 : }
263 0 : catch(const Exception& )
264 : {
265 : DBG_UNHANDLED_EXCEPTION();
266 : }
267 0 : }
268 :
269 0 : void OFieldDescription::SetDescription(const OUString& _rDescription)
270 : {
271 : try
272 : {
273 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DESCRIPTION) )
274 0 : m_xDest->setPropertyValue(PROPERTY_DESCRIPTION,makeAny(_rDescription));
275 : else
276 0 : m_sDescription = _rDescription;
277 : }
278 0 : catch(const Exception& )
279 : {
280 : DBG_UNHANDLED_EXCEPTION();
281 : }
282 0 : }
283 :
284 0 : void OFieldDescription::SetDefaultValue(const Any& _rDefaultValue)
285 : {
286 : try
287 : {
288 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DEFAULTVALUE) )
289 0 : m_xDest->setPropertyValue(PROPERTY_DEFAULTVALUE, _rDefaultValue);
290 : else
291 0 : m_aDefaultValue = _rDefaultValue;
292 : }
293 0 : catch( const Exception& )
294 : {
295 : DBG_UNHANDLED_EXCEPTION();
296 : }
297 0 : }
298 :
299 0 : void OFieldDescription::SetControlDefault(const Any& _rControlDefault)
300 : {
301 : try
302 : {
303 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
304 0 : m_xDest->setPropertyValue(PROPERTY_CONTROLDEFAULT, _rControlDefault);
305 : else
306 0 : m_aControlDefault = _rControlDefault;
307 : }
308 0 : catch( const Exception& )
309 : {
310 : DBG_UNHANDLED_EXCEPTION();
311 : }
312 0 : }
313 :
314 0 : void OFieldDescription::SetAutoIncrementValue(const OUString& _sAutoIncValue)
315 : {
316 : try
317 : {
318 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) )
319 0 : m_xDest->setPropertyValue(PROPERTY_AUTOINCREMENTCREATION,makeAny(_sAutoIncValue));
320 : else
321 0 : m_sAutoIncrementValue = _sAutoIncValue;
322 : }
323 0 : catch( const Exception& )
324 : {
325 : DBG_UNHANDLED_EXCEPTION();
326 : }
327 0 : }
328 :
329 0 : void OFieldDescription::SetType(TOTypeInfoSP _pType)
330 : {
331 0 : m_pType = _pType;
332 0 : if ( m_pType.get() )
333 : {
334 : try
335 : {
336 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
337 0 : m_xDest->setPropertyValue(PROPERTY_TYPE,makeAny(m_pType->nType));
338 : else
339 0 : m_nType = m_pType->nType;
340 : }
341 0 : catch( const Exception& )
342 : {
343 : DBG_UNHANDLED_EXCEPTION();
344 : }
345 : }
346 0 : }
347 :
348 0 : void OFieldDescription::SetTypeValue(sal_Int32 _nType)
349 : {
350 : try
351 : {
352 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
353 0 : m_xDest->setPropertyValue(PROPERTY_TYPE,makeAny(_nType));
354 : else
355 : {
356 0 : m_nType = _nType;
357 : OSL_ENSURE(!m_pType.get(),"Invalid call here!");
358 : }
359 : }
360 0 : catch( const Exception& )
361 : {
362 : DBG_UNHANDLED_EXCEPTION();
363 : }
364 0 : }
365 :
366 0 : void OFieldDescription::SetPrecision(const sal_Int32& _rPrecision)
367 : {
368 : try
369 : {
370 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_PRECISION) )
371 0 : m_xDest->setPropertyValue(PROPERTY_PRECISION,makeAny(_rPrecision));
372 : else
373 0 : m_nPrecision = _rPrecision;
374 : }
375 0 : catch( const Exception& )
376 : {
377 : DBG_UNHANDLED_EXCEPTION();
378 : }
379 0 : }
380 :
381 0 : void OFieldDescription::SetScale(const sal_Int32& _rScale)
382 : {
383 : try
384 : {
385 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_SCALE) )
386 0 : m_xDest->setPropertyValue(PROPERTY_SCALE,makeAny(_rScale));
387 : else
388 0 : m_nScale = _rScale;
389 : }
390 0 : catch( const Exception& )
391 : {
392 : DBG_UNHANDLED_EXCEPTION();
393 : }
394 0 : }
395 :
396 0 : void OFieldDescription::SetIsNullable(const sal_Int32& _rIsNullable)
397 : {
398 : try
399 : {
400 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
401 0 : m_xDest->setPropertyValue(PROPERTY_ISNULLABLE,makeAny(_rIsNullable));
402 : else
403 0 : m_nIsNullable = _rIsNullable;
404 : }
405 0 : catch( const Exception& )
406 : {
407 : DBG_UNHANDLED_EXCEPTION();
408 : }
409 0 : }
410 :
411 0 : void OFieldDescription::SetFormatKey(const sal_Int32& _rFormatKey)
412 : {
413 : try
414 : {
415 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
416 0 : m_xDest->setPropertyValue(PROPERTY_FORMATKEY,makeAny(_rFormatKey));
417 : else
418 0 : m_nFormatKey = _rFormatKey;
419 : }
420 0 : catch( const Exception& )
421 : {
422 : DBG_UNHANDLED_EXCEPTION();
423 : }
424 0 : }
425 :
426 0 : void OFieldDescription::SetHorJustify(const SvxCellHorJustify& _rHorJustify)
427 : {
428 : try
429 : {
430 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ALIGN) )
431 0 : m_xDest->setPropertyValue(PROPERTY_ALIGN,makeAny( dbaui::mapTextAllign(_rHorJustify)));
432 : else
433 0 : m_eHorJustify = _rHorJustify;
434 : }
435 0 : catch( const Exception& )
436 : {
437 : DBG_UNHANDLED_EXCEPTION();
438 : }
439 0 : }
440 :
441 0 : void OFieldDescription::SetAutoIncrement(bool _bAuto)
442 : {
443 : try
444 : {
445 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT) )
446 0 : m_xDest->setPropertyValue(PROPERTY_ISAUTOINCREMENT,makeAny(_bAuto));
447 : else
448 0 : m_bIsAutoIncrement = _bAuto;
449 : }
450 0 : catch( const Exception& )
451 : {
452 : DBG_UNHANDLED_EXCEPTION();
453 : }
454 0 : }
455 :
456 0 : void OFieldDescription::SetPrimaryKey(bool _bPKey)
457 : {
458 0 : m_bIsPrimaryKey = _bPKey;
459 0 : if ( _bPKey )
460 0 : SetIsNullable(::com::sun::star::sdbc::ColumnValue::NO_NULLS);
461 0 : }
462 :
463 0 : void OFieldDescription::SetCurrency(bool _bIsCurrency)
464 : {
465 0 : m_bIsCurrency = _bIsCurrency;
466 0 : }
467 :
468 0 : OUString OFieldDescription::GetName() const
469 : {
470 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_NAME) )
471 0 : return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_NAME));
472 : else
473 0 : return m_sName;
474 : }
475 :
476 0 : OUString OFieldDescription::GetDescription() const
477 : {
478 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_DESCRIPTION) )
479 0 : return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_DESCRIPTION));
480 : else
481 0 : return m_sDescription;
482 : }
483 :
484 0 : OUString OFieldDescription::GetHelpText() const
485 : {
486 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
487 0 : return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_HELPTEXT));
488 : else
489 0 : return m_sHelpText;
490 : }
491 :
492 0 : ::com::sun::star::uno::Any OFieldDescription::GetControlDefault() const
493 : {
494 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
495 0 : return m_xDest->getPropertyValue(PROPERTY_CONTROLDEFAULT);
496 : else
497 0 : return m_aControlDefault;
498 : }
499 :
500 0 : OUString OFieldDescription::GetAutoIncrementValue() const
501 : {
502 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_AUTOINCREMENTCREATION) )
503 0 : return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_AUTOINCREMENTCREATION));
504 : else
505 0 : return m_sAutoIncrementValue;
506 : }
507 :
508 0 : sal_Int32 OFieldDescription::GetType() const
509 : {
510 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPE) )
511 0 : return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_TYPE));
512 : else
513 0 : return m_pType.get() ? m_pType->nType : m_nType;
514 : }
515 :
516 0 : OUString OFieldDescription::GetTypeName() const
517 : {
518 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPENAME) )
519 0 : return ::comphelper::getString(m_xDest->getPropertyValue(PROPERTY_TYPENAME));
520 : else
521 0 : return m_pType.get() ? m_pType->aTypeName : m_sTypeName;
522 : }
523 :
524 0 : sal_Int32 OFieldDescription::GetPrecision() const
525 : {
526 0 : sal_Int32 nPrec = m_nPrecision;
527 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_PRECISION) )
528 0 : nPrec = ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_PRECISION));
529 :
530 0 : TOTypeInfoSP pTypeInfo = getTypeInfo();
531 0 : if ( pTypeInfo )
532 : {
533 0 : switch ( pTypeInfo->nType )
534 : {
535 : case DataType::TINYINT:
536 : case DataType::SMALLINT:
537 : case DataType::INTEGER:
538 : case DataType::BIGINT:
539 0 : if ( !nPrec )
540 0 : nPrec = pTypeInfo->nPrecision;
541 0 : break;
542 : }
543 : }
544 :
545 0 : return nPrec;
546 : }
547 :
548 0 : sal_Int32 OFieldDescription::GetScale() const
549 : {
550 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_SCALE) )
551 0 : return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_SCALE));
552 : else
553 0 : return m_nScale;
554 : }
555 :
556 0 : sal_Int32 OFieldDescription::GetIsNullable() const
557 : {
558 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
559 0 : return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ISNULLABLE));
560 : else
561 0 : return m_nIsNullable;
562 : }
563 :
564 0 : sal_Int32 OFieldDescription::GetFormatKey() const
565 : {
566 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
567 0 : return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_FORMATKEY));
568 : else
569 0 : return m_nFormatKey;
570 : }
571 :
572 0 : SvxCellHorJustify OFieldDescription::GetHorJustify() const
573 : {
574 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ALIGN) )
575 0 : return ::dbaui::mapTextJustify(::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ALIGN)));
576 : else
577 0 : return m_eHorJustify;
578 : }
579 :
580 :
581 0 : TOTypeInfoSP OFieldDescription::getSpecialTypeInfo() const
582 : {
583 0 : TOTypeInfoSP pSpecialType( new OTypeInfo() );
584 0 : *pSpecialType = *m_pType;
585 0 : pSpecialType->nPrecision = GetPrecision();
586 0 : pSpecialType->nMaximumScale = static_cast<sal_Int16>(GetScale());
587 0 : pSpecialType->bAutoIncrement = IsAutoIncrement(); // http://dba.openoffice.org/issues/show_bug.cgi?id=115398 fixed by ludob
588 0 : return pSpecialType;
589 : }
590 :
591 0 : bool OFieldDescription::IsAutoIncrement() const
592 : {
593 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISAUTOINCREMENT) )
594 0 : return ::cppu::any2bool(m_xDest->getPropertyValue(PROPERTY_ISAUTOINCREMENT));
595 : else
596 0 : return m_bIsAutoIncrement;
597 : }
598 :
599 :
600 :
601 0 : bool OFieldDescription::IsNullable() const
602 : {
603 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_ISNULLABLE) )
604 0 : return ::comphelper::getINT32(m_xDest->getPropertyValue(PROPERTY_ISNULLABLE)) == ::com::sun::star::sdbc::ColumnValue::NULLABLE;
605 : else
606 0 : return m_nIsNullable == ::com::sun::star::sdbc::ColumnValue::NULLABLE;
607 : }
608 :
609 0 : void OFieldDescription::SetTypeName(const OUString& _sTypeName)
610 : {
611 : try
612 : {
613 0 : if ( m_xDest.is() && m_xDestInfo->hasPropertyByName(PROPERTY_TYPENAME) )
614 0 : m_xDest->setPropertyValue(PROPERTY_TYPENAME,makeAny(_sTypeName));
615 : else
616 0 : m_sTypeName = _sTypeName;
617 : }
618 0 : catch( const Exception& )
619 : {
620 : DBG_UNHANDLED_EXCEPTION();
621 : }
622 0 : }
623 :
624 0 : void OFieldDescription::copyColumnSettingsTo(const Reference< XPropertySet >& _rxColumn)
625 : {
626 0 : if ( _rxColumn.is() )
627 : {
628 0 : Reference<XPropertySetInfo> xInfo = _rxColumn->getPropertySetInfo();
629 :
630 0 : if ( GetFormatKey() != NumberFormat::ALL && xInfo->hasPropertyByName(PROPERTY_FORMATKEY) )
631 0 : _rxColumn->setPropertyValue(PROPERTY_FORMATKEY,makeAny(GetFormatKey()));
632 0 : if ( GetHorJustify() != SVX_HOR_JUSTIFY_STANDARD && xInfo->hasPropertyByName(PROPERTY_ALIGN) )
633 0 : _rxColumn->setPropertyValue(PROPERTY_ALIGN,makeAny(dbaui::mapTextAllign(GetHorJustify())));
634 0 : if ( !GetHelpText().isEmpty() && xInfo->hasPropertyByName(PROPERTY_HELPTEXT) )
635 0 : _rxColumn->setPropertyValue(PROPERTY_HELPTEXT,makeAny(GetHelpText()));
636 0 : if ( GetControlDefault().hasValue() && xInfo->hasPropertyByName(PROPERTY_CONTROLDEFAULT) )
637 0 : _rxColumn->setPropertyValue(PROPERTY_CONTROLDEFAULT,GetControlDefault());
638 :
639 0 : if(xInfo->hasPropertyByName(PROPERTY_RELATIVEPOSITION))
640 0 : _rxColumn->setPropertyValue(PROPERTY_RELATIVEPOSITION,m_aRelativePosition);
641 0 : if(xInfo->hasPropertyByName(PROPERTY_WIDTH))
642 0 : _rxColumn->setPropertyValue(PROPERTY_WIDTH,m_aWidth);
643 0 : if(xInfo->hasPropertyByName(PROPERTY_HIDDEN))
644 0 : _rxColumn->setPropertyValue(PROPERTY_HIDDEN,makeAny(m_bHidden));
645 : }
646 0 : }
647 :
648 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|