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 <float.h>
21 : #include <sfx2/app.hxx>
22 : #include <svl/zforlist.hxx>
23 : #include <svx/pageitem.hxx>
24 : #include <svx/dataaccessdescriptor.hxx>
25 : #include <com/sun/star/sdbc/DataType.hpp>
26 : #include <fmtfld.hxx>
27 : #include <txtfld.hxx>
28 : #include <doc.hxx>
29 : #include <IDocumentFieldsAccess.hxx>
30 : #include <docary.hxx>
31 : #include <frame.hxx>
32 : #include <fldbas.hxx>
33 : #include <pam.hxx>
34 : #include <ndtxt.hxx>
35 : #include <dbfld.hxx>
36 : #include <dbmgr.hxx>
37 : #include <docfld.hxx>
38 : #include <expfld.hxx>
39 : #include <txtatr.hxx>
40 : #include <unofldmid.h>
41 : #include <calbck.hxx>
42 :
43 : using namespace ::com::sun::star::sdbc;
44 : using namespace ::com::sun::star;
45 :
46 : /// replace database separator by dots for display
47 663 : static OUString lcl_DBTrennConv(const OUString& aContent)
48 : {
49 663 : return aContent.replaceAll(OUString(DB_DELIM), OUString('.'));
50 : }
51 :
52 : // database field type
53 :
54 211 : SwDBFieldType::SwDBFieldType(SwDoc* pDocPtr, const OUString& rNam, const SwDBData& rDBData ) :
55 : SwValueFieldType( pDocPtr, RES_DBFLD ),
56 : aDBData(rDBData),
57 : sName(rNam),
58 : sColumn(rNam),
59 211 : nRefCnt(0)
60 : {
61 211 : if(!aDBData.sDataSource.isEmpty() || !aDBData.sCommand.isEmpty())
62 : {
63 418 : sName = aDBData.sDataSource
64 418 : + OUString(DB_DELIM)
65 627 : + aDBData.sCommand
66 836 : + OUString(DB_DELIM)
67 836 : + sName;
68 : }
69 211 : }
70 :
71 350 : SwDBFieldType::~SwDBFieldType()
72 : {
73 350 : }
74 :
75 139 : SwFieldType* SwDBFieldType::Copy() const
76 : {
77 139 : SwDBFieldType* pTmp = new SwDBFieldType(GetDoc(), sColumn, aDBData);
78 139 : return pTmp;
79 : }
80 :
81 771 : OUString SwDBFieldType::GetName() const
82 : {
83 771 : return sName;
84 : }
85 :
86 562 : void SwDBFieldType::ReleaseRef()
87 : {
88 : OSL_ENSURE(nRefCnt > 0, "RefCount < 0!");
89 :
90 562 : if (--nRefCnt <= 0)
91 : {
92 138 : size_t nPos = GetDoc()->getIDocumentFieldsAccess().GetFieldTypes()->GetPos(this);
93 :
94 138 : if (nPos != SIZE_MAX)
95 : {
96 108 : GetDoc()->getIDocumentFieldsAccess().RemoveFieldType(nPos);
97 108 : delete this;
98 : }
99 : }
100 562 : }
101 :
102 253 : bool SwDBFieldType::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
103 : {
104 253 : switch( nWhichId )
105 : {
106 : case FIELD_PROP_PAR1:
107 64 : rAny <<= aDBData.sDataSource;
108 64 : break;
109 : case FIELD_PROP_PAR2:
110 63 : rAny <<= aDBData.sCommand;
111 63 : break;
112 : case FIELD_PROP_PAR3:
113 63 : rAny <<= sColumn;
114 63 : break;
115 : case FIELD_PROP_SHORT1:
116 63 : rAny <<= aDBData.nCommandType;
117 63 : break;
118 : default:
119 : OSL_FAIL("illegal property");
120 : }
121 253 : return true;
122 : }
123 :
124 73 : bool SwDBFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
125 : {
126 73 : switch( nWhichId )
127 : {
128 : case FIELD_PROP_PAR1:
129 1 : rAny >>= aDBData.sDataSource;
130 1 : break;
131 : case FIELD_PROP_PAR2:
132 1 : rAny >>= aDBData.sCommand;
133 1 : break;
134 : case FIELD_PROP_PAR3:
135 : {
136 1 : OUString sTmp;
137 1 : rAny >>= sTmp;
138 1 : if( sTmp != sColumn )
139 : {
140 1 : sColumn = sTmp;
141 1 : SwIterator<SwFormatField,SwFieldType> aIter( *this );
142 1 : SwFormatField* pFormatField = aIter.First();
143 2 : while(pFormatField)
144 : {
145 : // field in Undo?
146 0 : SwTextField *pTextField = pFormatField->GetTextField();
147 0 : if(pTextField && pTextField->GetTextNode().GetNodes().IsDocNodes() )
148 : {
149 0 : SwDBField* pDBField = static_cast<SwDBField*>(pFormatField->GetField());
150 0 : pDBField->ClearInitialized();
151 0 : pDBField->InitContent();
152 : }
153 0 : pFormatField = aIter.Next();
154 1 : }
155 1 : }
156 : }
157 1 : break;
158 : case FIELD_PROP_SHORT1:
159 70 : rAny >>= aDBData.nCommandType;
160 70 : break;
161 : default:
162 : OSL_FAIL("illegal property");
163 : }
164 73 : return true;
165 : }
166 :
167 : // database field
168 :
169 491 : SwDBField::SwDBField(SwDBFieldType* pTyp, sal_uLong nFormat)
170 : : SwValueField(pTyp, nFormat),
171 : nSubType(0),
172 : bIsInBodyText(true),
173 : bValidValue(false),
174 491 : bInitialized(false)
175 : {
176 491 : if (GetTyp())
177 491 : static_cast<SwDBFieldType*>(GetTyp())->AddRef();
178 491 : InitContent();
179 491 : }
180 :
181 1473 : SwDBField::~SwDBField()
182 : {
183 491 : if (GetTyp())
184 491 : static_cast<SwDBFieldType*>(GetTyp())->ReleaseRef();
185 982 : }
186 :
187 491 : void SwDBField::InitContent()
188 : {
189 491 : if (!IsInitialized())
190 : {
191 491 : aContent = "<" + static_cast<const SwDBFieldType*>(GetTyp())->GetColumnName() + ">";
192 : }
193 491 : }
194 :
195 72 : void SwDBField::InitContent(const OUString& rExpansion)
196 : {
197 72 : if (rExpansion.startsWith("<") && rExpansion.endsWith(">"))
198 : {
199 0 : const OUString sColumn( rExpansion.copy( 1, rExpansion.getLength() - 2 ) );
200 0 : if( ::GetAppCmpStrIgnore().isEqual( sColumn,
201 0 : static_cast<SwDBFieldType *>(GetTyp())->GetColumnName() ))
202 : {
203 0 : InitContent();
204 72 : return;
205 0 : }
206 : }
207 72 : SetExpansion( rExpansion );
208 : }
209 :
210 663 : OUString SwDBField::Expand() const
211 : {
212 663 : if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
213 663 : return lcl_DBTrennConv(aContent);
214 0 : return OUString();
215 : }
216 :
217 419 : SwField* SwDBField::Copy() const
218 : {
219 419 : SwDBField *pTmp = new SwDBField(static_cast<SwDBFieldType*>(GetTyp()), GetFormat());
220 419 : pTmp->aContent = aContent;
221 419 : pTmp->bIsInBodyText = bIsInBodyText;
222 419 : pTmp->bValidValue = bValidValue;
223 419 : pTmp->bInitialized = bInitialized;
224 419 : pTmp->nSubType = nSubType;
225 419 : pTmp->SetValue(GetValue());
226 419 : pTmp->sFieldCode = sFieldCode;
227 :
228 419 : return pTmp;
229 : }
230 :
231 0 : OUString SwDBField::GetFieldName() const
232 : {
233 0 : const OUString rDBName = static_cast<SwDBFieldType*>(GetTyp())->GetName();
234 :
235 0 : OUString sContent( rDBName.getToken(0, DB_DELIM) );
236 :
237 0 : if (sContent.getLength() > 1)
238 : {
239 : sContent += OUString(DB_DELIM)
240 0 : + rDBName.getToken(1, DB_DELIM)
241 0 : + OUString(DB_DELIM)
242 0 : + rDBName.getToken(2, DB_DELIM);
243 : }
244 0 : return lcl_DBTrennConv(sContent);
245 : }
246 :
247 0 : void SwDBField::ChgValue( double d, bool bVal )
248 : {
249 0 : bValidValue = bVal;
250 0 : SetValue(d);
251 :
252 0 : if( bValidValue )
253 0 : aContent = static_cast<SwValueFieldType*>(GetTyp())->ExpandValue(d, GetFormat(), GetLanguage());
254 0 : }
255 :
256 71 : SwFieldType* SwDBField::ChgTyp( SwFieldType* pNewType )
257 : {
258 71 : SwFieldType* pOld = SwValueField::ChgTyp( pNewType );
259 :
260 71 : static_cast<SwDBFieldType*>(pNewType)->AddRef();
261 71 : static_cast<SwDBFieldType*>(pOld)->ReleaseRef();
262 :
263 71 : return pOld;
264 : }
265 :
266 620 : bool SwDBField::FormatValue( SvNumberFormatter* pDocFormatter, OUString &aString, sal_uInt32 nFormat,
267 : double &aNumber, sal_Int32 nColumnType, SwDBField *pField )
268 : {
269 620 : bool bValidValue = false;
270 :
271 620 : if( DBL_MAX != aNumber )
272 : {
273 0 : if( DataType::DATE == nColumnType || DataType::TIME == nColumnType ||
274 : DataType::TIMESTAMP == nColumnType )
275 : {
276 0 : Date aStandard( 1, 1, 1900 );
277 0 : if( *pDocFormatter->GetNullDate() != aStandard )
278 0 : aNumber += (aStandard - *pDocFormatter->GetNullDate());
279 : }
280 0 : bValidValue = true;
281 0 : if( pField )
282 0 : pField->SetValue( aNumber );
283 : }
284 : else
285 : {
286 620 : SwSbxValue aVal;
287 620 : aVal.PutString( aString );
288 :
289 620 : if (aVal.IsNumeric())
290 : {
291 0 : if( pField )
292 0 : pField->SetValue(aVal.GetDouble());
293 : else
294 0 : aNumber = aVal.GetDouble();
295 :
296 0 : if (nFormat && nFormat != SAL_MAX_UINT32 && !pDocFormatter->IsTextFormat(nFormat))
297 0 : bValidValue = true; // because of bug #60339 not for all strings
298 : }
299 : else
300 : {
301 : // if string length > 0 then true, else false
302 620 : if( pField )
303 60 : pField->SetValue(aString.isEmpty() ? 0 : 1);
304 : else
305 560 : aNumber = aString.isEmpty() ? 0 : 1;
306 620 : }
307 : }
308 :
309 620 : return bValidValue;
310 : }
311 :
312 : /// get current field value and cache it
313 118 : void SwDBField::Evaluate()
314 : {
315 118 : SwDBManager* pMgr = GetDoc()->GetDBManager();
316 :
317 : // first delete
318 118 : bValidValue = false;
319 118 : double nValue = DBL_MAX;
320 118 : const SwDBData& aTmpData = GetDBData();
321 :
322 118 : if(!pMgr || !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, true))
323 176 : return ;
324 :
325 60 : sal_uInt32 nFormat = 0;
326 :
327 : // search corresponding column name
328 60 : OUString aColNm( static_cast<SwDBFieldType*>(GetTyp())->GetColumnName() );
329 :
330 60 : SvNumberFormatter* pDocFormatter = GetDoc()->GetNumberFormatter();
331 60 : pMgr->GetMergeColumnCnt(aColNm, GetLanguage(), aContent, &nValue);
332 60 : if( !( nSubType & nsSwExtendedSubType::SUB_OWN_FMT ) )
333 : SetFormat( nFormat = pMgr->GetColumnFormat( aTmpData.sDataSource, aTmpData.sCommand,
334 60 : aColNm, pDocFormatter, GetLanguage() ));
335 :
336 60 : sal_Int32 nColumnType = nValue == DBL_MAX
337 : ? 0
338 60 : : pMgr->GetColumnType(aTmpData.sDataSource, aTmpData.sCommand, aColNm);
339 :
340 60 : bValidValue = FormatValue( pDocFormatter, aContent, nFormat, nValue, nColumnType, this );
341 :
342 60 : if( DBL_MAX != nValue )
343 0 : aContent = static_cast<SwValueFieldType*>(GetTyp())->ExpandValue(nValue, GetFormat(), GetLanguage());
344 :
345 60 : bInitialized = true;
346 : }
347 :
348 : /// get name
349 0 : OUString SwDBField::GetPar1() const
350 : {
351 0 : return static_cast<const SwDBFieldType*>(GetTyp())->GetName();
352 : }
353 :
354 984 : sal_uInt16 SwDBField::GetSubType() const
355 : {
356 984 : return nSubType;
357 : }
358 :
359 141 : void SwDBField::SetSubType(sal_uInt16 nType)
360 : {
361 141 : nSubType = nType;
362 141 : }
363 :
364 240 : bool SwDBField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
365 : {
366 240 : switch( nWhichId )
367 : {
368 : case FIELD_PROP_BOOL1:
369 120 : rAny <<= 0 == (GetSubType()&nsSwExtendedSubType::SUB_OWN_FMT);
370 120 : break;
371 : case FIELD_PROP_BOOL2:
372 60 : rAny <<= 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
373 60 : break;
374 : case FIELD_PROP_FORMAT:
375 60 : rAny <<= (sal_Int32)GetFormat();
376 60 : break;
377 : case FIELD_PROP_PAR1:
378 0 : rAny <<= aContent;
379 0 : break;
380 : case FIELD_PROP_PAR2:
381 0 : rAny <<= sFieldCode;
382 0 : break;
383 : default:
384 : OSL_FAIL("illegal property");
385 : }
386 240 : return true;
387 : }
388 :
389 138 : bool SwDBField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
390 : {
391 138 : switch( nWhichId )
392 : {
393 : case FIELD_PROP_BOOL1:
394 69 : if( *static_cast<sal_Bool const *>(rAny.getValue()) )
395 69 : SetSubType(GetSubType()&~nsSwExtendedSubType::SUB_OWN_FMT);
396 : else
397 0 : SetSubType(GetSubType()|nsSwExtendedSubType::SUB_OWN_FMT);
398 69 : break;
399 : case FIELD_PROP_BOOL2:
400 : {
401 0 : sal_uInt16 nSubTyp = GetSubType();
402 0 : bool bVisible = false;
403 0 : if(!(rAny >>= bVisible))
404 0 : return false;
405 0 : if(bVisible)
406 0 : nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
407 : else
408 0 : nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
409 0 : SetSubType(nSubTyp);
410 : //invalidate text node
411 0 : if(GetTyp())
412 : {
413 0 : SwIterator<SwFormatField,SwFieldType> aIter( *GetTyp() );
414 0 : SwFormatField* pFormatField = aIter.First();
415 0 : while(pFormatField)
416 : {
417 0 : SwTextField *pTextField = pFormatField->GetTextField();
418 0 : if(pTextField && static_cast<SwDBField*>(pFormatField->GetField()) == this )
419 : {
420 : //notify the change
421 0 : pTextField->NotifyContentChange(*pFormatField);
422 0 : break;
423 : }
424 0 : pFormatField = aIter.Next();
425 0 : }
426 : }
427 : }
428 0 : break;
429 : case FIELD_PROP_FORMAT:
430 : {
431 0 : sal_Int32 nTemp = 0;
432 0 : rAny >>= nTemp;
433 0 : SetFormat(nTemp);
434 : }
435 0 : break;
436 : case FIELD_PROP_PAR1:
437 69 : rAny >>= aContent;
438 69 : break;
439 : case FIELD_PROP_PAR2:
440 0 : rAny >>= sFieldCode;
441 0 : break;
442 : default:
443 : OSL_FAIL("illegal property");
444 : }
445 138 : return true;
446 : }
447 :
448 : // base class for all further database fields
449 :
450 0 : SwDBNameInfField::SwDBNameInfField(SwFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFormat) :
451 : SwField(pTyp, nFormat),
452 : aDBData(rDBData),
453 0 : nSubType(0)
454 : {
455 0 : }
456 :
457 0 : SwDBData SwDBNameInfField::GetDBData(SwDoc* pDoc)
458 : {
459 0 : SwDBData aRet;
460 0 : if(!aDBData.sDataSource.isEmpty())
461 0 : aRet = aDBData;
462 : else
463 0 : aRet = pDoc->GetDBData();
464 0 : return aRet;
465 : }
466 :
467 0 : void SwDBNameInfField::SetDBData(const SwDBData & rDBData)
468 : {
469 0 : aDBData = rDBData;
470 0 : }
471 :
472 0 : OUString SwDBNameInfField::GetFieldName() const
473 : {
474 0 : OUString sStr( SwField::GetFieldName() );
475 0 : if (!aDBData.sDataSource.isEmpty())
476 : {
477 : sStr += ":"
478 0 : + aDBData.sDataSource
479 0 : + OUString(DB_DELIM)
480 0 : + aDBData.sCommand;
481 : }
482 0 : return lcl_DBTrennConv(sStr);
483 : }
484 :
485 0 : bool SwDBNameInfField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
486 : {
487 0 : switch( nWhichId )
488 : {
489 : case FIELD_PROP_PAR1:
490 0 : rAny <<= aDBData.sDataSource;
491 0 : break;
492 : case FIELD_PROP_PAR2:
493 0 : rAny <<= aDBData.sCommand;
494 0 : break;
495 : case FIELD_PROP_SHORT1:
496 0 : rAny <<= aDBData.nCommandType;
497 0 : break;
498 : case FIELD_PROP_BOOL2:
499 0 : rAny <<= 0 == (GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE);
500 0 : break;
501 : default:
502 : OSL_FAIL("illegal property");
503 : }
504 0 : return true;
505 : }
506 :
507 0 : bool SwDBNameInfField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
508 : {
509 0 : switch( nWhichId )
510 : {
511 : case FIELD_PROP_PAR1:
512 0 : rAny >>= aDBData.sDataSource;
513 0 : break;
514 : case FIELD_PROP_PAR2:
515 0 : rAny >>= aDBData.sCommand;
516 0 : break;
517 : case FIELD_PROP_SHORT1:
518 0 : rAny >>= aDBData.nCommandType;
519 0 : break;
520 : case FIELD_PROP_BOOL2:
521 : {
522 0 : sal_uInt16 nSubTyp = GetSubType();
523 0 : bool bVisible = false;
524 0 : if(!(rAny >>= bVisible))
525 0 : return false;
526 0 : if(bVisible)
527 0 : nSubTyp &= ~nsSwExtendedSubType::SUB_INVISIBLE;
528 : else
529 0 : nSubTyp |= nsSwExtendedSubType::SUB_INVISIBLE;
530 0 : SetSubType(nSubTyp);
531 : }
532 0 : break;
533 : default:
534 : OSL_FAIL("illegal property");
535 : }
536 0 : return true;
537 : }
538 :
539 0 : sal_uInt16 SwDBNameInfField::GetSubType() const
540 : {
541 0 : return nSubType;
542 : }
543 :
544 0 : void SwDBNameInfField::SetSubType(sal_uInt16 nType)
545 : {
546 0 : nSubType = nType;
547 0 : }
548 :
549 : // next dataset
550 :
551 2958 : SwDBNextSetFieldType::SwDBNextSetFieldType()
552 2958 : : SwFieldType( RES_DBNEXTSETFLD )
553 : {
554 2958 : }
555 :
556 0 : SwFieldType* SwDBNextSetFieldType::Copy() const
557 : {
558 0 : SwDBNextSetFieldType* pTmp = new SwDBNextSetFieldType();
559 0 : return pTmp;
560 : }
561 :
562 : // SwDBSetField
563 :
564 0 : SwDBNextSetField::SwDBNextSetField(SwDBNextSetFieldType* pTyp,
565 : const OUString& rCond,
566 : const OUString& ,
567 : const SwDBData& rDBData) :
568 0 : SwDBNameInfField(pTyp, rDBData), aCond(rCond), bCondValid(true)
569 0 : {}
570 :
571 0 : OUString SwDBNextSetField::Expand() const
572 : {
573 0 : return OUString();
574 : }
575 :
576 0 : SwField* SwDBNextSetField::Copy() const
577 : {
578 0 : SwDBNextSetField *pTmp = new SwDBNextSetField(static_cast<SwDBNextSetFieldType*>(GetTyp()),
579 0 : aCond, OUString(), GetDBData());
580 0 : pTmp->SetSubType(GetSubType());
581 0 : pTmp->bCondValid = bCondValid;
582 0 : return pTmp;
583 : }
584 :
585 0 : void SwDBNextSetField::Evaluate(SwDoc* pDoc)
586 : {
587 0 : SwDBManager* pMgr = pDoc->GetDBManager();
588 0 : const SwDBData& rData = GetDBData();
589 0 : if( !bCondValid ||
590 0 : !pMgr || !pMgr->IsDataSourceOpen(rData.sDataSource, rData.sCommand, false))
591 0 : return ;
592 0 : pMgr->ToNextRecord(rData.sDataSource, rData.sCommand);
593 : }
594 :
595 : /// get condition
596 0 : OUString SwDBNextSetField::GetPar1() const
597 : {
598 0 : return aCond;
599 : }
600 :
601 : /// set condition
602 0 : void SwDBNextSetField::SetPar1(const OUString& rStr)
603 : {
604 0 : aCond = rStr;
605 0 : }
606 :
607 0 : bool SwDBNextSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
608 : {
609 0 : bool bRet = true;
610 0 : switch( nWhichId )
611 : {
612 : case FIELD_PROP_PAR3:
613 0 : rAny <<= aCond;
614 0 : break;
615 : default:
616 0 : bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
617 : }
618 0 : return bRet;
619 : }
620 :
621 0 : bool SwDBNextSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
622 : {
623 0 : bool bRet = true;
624 0 : switch( nWhichId )
625 : {
626 : case FIELD_PROP_PAR3:
627 0 : rAny >>= aCond;
628 0 : break;
629 : default:
630 0 : bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
631 : }
632 0 : return bRet;
633 : }
634 :
635 : // dataset with certain ID
636 :
637 2958 : SwDBNumSetFieldType::SwDBNumSetFieldType() :
638 2958 : SwFieldType( RES_DBNUMSETFLD )
639 : {
640 2958 : }
641 :
642 0 : SwFieldType* SwDBNumSetFieldType::Copy() const
643 : {
644 0 : SwDBNumSetFieldType* pTmp = new SwDBNumSetFieldType();
645 0 : return pTmp;
646 : }
647 :
648 0 : SwDBNumSetField::SwDBNumSetField(SwDBNumSetFieldType* pTyp,
649 : const OUString& rCond,
650 : const OUString& rDBNum,
651 : const SwDBData& rDBData) :
652 : SwDBNameInfField(pTyp, rDBData),
653 : aCond(rCond),
654 : aPar2(rDBNum),
655 0 : bCondValid(true)
656 0 : {}
657 :
658 0 : OUString SwDBNumSetField::Expand() const
659 : {
660 0 : return OUString();
661 : }
662 :
663 0 : SwField* SwDBNumSetField::Copy() const
664 : {
665 0 : SwDBNumSetField *pTmp = new SwDBNumSetField(static_cast<SwDBNumSetFieldType*>(GetTyp()),
666 0 : aCond, aPar2, GetDBData());
667 0 : pTmp->bCondValid = bCondValid;
668 0 : pTmp->SetSubType(GetSubType());
669 0 : return pTmp;
670 : }
671 :
672 0 : void SwDBNumSetField::Evaluate(SwDoc* pDoc)
673 : {
674 0 : SwDBManager* pMgr = pDoc->GetDBManager();
675 0 : const SwDBData& aTmpData = GetDBData();
676 :
677 0 : if( bCondValid && pMgr && pMgr->IsInMerge() &&
678 0 : pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, true))
679 : { // condition OK -> adjust current Set
680 0 : pMgr->ToRecordId(std::max((sal_uInt16)aPar2.toInt32(), sal_uInt16(1))-1);
681 : }
682 0 : }
683 :
684 : /// get LogDBName
685 0 : OUString SwDBNumSetField::GetPar1() const
686 : {
687 0 : return aCond;
688 : }
689 :
690 : /// set LogDBName
691 0 : void SwDBNumSetField::SetPar1(const OUString& rStr)
692 : {
693 0 : aCond = rStr;
694 0 : }
695 :
696 : /// get condition
697 0 : OUString SwDBNumSetField::GetPar2() const
698 : {
699 0 : return aPar2;
700 : }
701 :
702 : /// set condition
703 0 : void SwDBNumSetField::SetPar2(const OUString& rStr)
704 : {
705 0 : aPar2 = rStr;
706 0 : }
707 :
708 0 : bool SwDBNumSetField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
709 : {
710 0 : bool bRet = true;
711 0 : switch( nWhichId )
712 : {
713 : case FIELD_PROP_PAR3:
714 0 : rAny <<= aCond;
715 0 : break;
716 : case FIELD_PROP_FORMAT:
717 0 : rAny <<= aPar2.toInt32();
718 0 : break;
719 : default:
720 0 : bRet = SwDBNameInfField::QueryValue(rAny, nWhichId );
721 : }
722 0 : return bRet;
723 : }
724 :
725 0 : bool SwDBNumSetField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
726 : {
727 0 : bool bRet = true;
728 0 : switch( nWhichId )
729 : {
730 : case FIELD_PROP_PAR3:
731 0 : rAny >>= aCond;
732 0 : break;
733 : case FIELD_PROP_FORMAT:
734 : {
735 0 : sal_Int32 nVal = 0;
736 0 : rAny >>= nVal;
737 0 : aPar2 = OUString::number(nVal);
738 : }
739 0 : break;
740 : default:
741 0 : bRet = SwDBNameInfField::PutValue(rAny, nWhichId );
742 : }
743 0 : return bRet;
744 : }
745 :
746 2958 : SwDBNameFieldType::SwDBNameFieldType(SwDoc* pDocument)
747 2958 : : SwFieldType( RES_DBNAMEFLD )
748 : {
749 2958 : pDoc = pDocument;
750 2958 : }
751 :
752 0 : OUString SwDBNameFieldType::Expand(sal_uLong ) const
753 : {
754 0 : const SwDBData aData = pDoc->GetDBData();
755 0 : return aData.sDataSource + "." + aData.sCommand;
756 : }
757 :
758 0 : SwFieldType* SwDBNameFieldType::Copy() const
759 : {
760 0 : SwDBNameFieldType *pTmp = new SwDBNameFieldType(pDoc);
761 0 : return pTmp;
762 : }
763 :
764 : // name of the connected database
765 :
766 0 : SwDBNameField::SwDBNameField(SwDBNameFieldType* pTyp, const SwDBData& rDBData, sal_uLong nFormat)
767 0 : : SwDBNameInfField(pTyp, rDBData, nFormat)
768 0 : {}
769 :
770 0 : OUString SwDBNameField::Expand() const
771 : {
772 0 : if(0 ==(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE))
773 0 : return static_cast<SwDBNameFieldType*>(GetTyp())->Expand(GetFormat());
774 0 : return OUString();
775 : }
776 :
777 0 : SwField* SwDBNameField::Copy() const
778 : {
779 0 : SwDBNameField *pTmp = new SwDBNameField(static_cast<SwDBNameFieldType*>(GetTyp()), GetDBData());
780 0 : pTmp->ChangeFormat(GetFormat());
781 0 : pTmp->SetLanguage(GetLanguage());
782 0 : pTmp->SetSubType(GetSubType());
783 0 : return pTmp;
784 : }
785 :
786 0 : bool SwDBNameField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
787 : {
788 0 : return SwDBNameInfField::QueryValue(rAny, nWhichId );
789 : }
790 :
791 0 : bool SwDBNameField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
792 : {
793 0 : return SwDBNameInfField::PutValue(rAny, nWhichId );
794 : }
795 :
796 2958 : SwDBSetNumberFieldType::SwDBSetNumberFieldType()
797 2958 : : SwFieldType( RES_DBSETNUMBERFLD )
798 : {
799 2958 : }
800 :
801 0 : SwFieldType* SwDBSetNumberFieldType::Copy() const
802 : {
803 0 : SwDBSetNumberFieldType *pTmp = new SwDBSetNumberFieldType;
804 0 : return pTmp;
805 : }
806 :
807 : // set-number of the connected database
808 :
809 0 : SwDBSetNumberField::SwDBSetNumberField(SwDBSetNumberFieldType* pTyp,
810 : const SwDBData& rDBData,
811 : sal_uLong nFormat)
812 0 : : SwDBNameInfField(pTyp, rDBData, nFormat), nNumber(0)
813 0 : {}
814 :
815 0 : OUString SwDBSetNumberField::Expand() const
816 : {
817 0 : if(0 !=(GetSubType() & nsSwExtendedSubType::SUB_INVISIBLE) || nNumber == 0)
818 0 : return OUString();
819 0 : return FormatNumber(nNumber, GetFormat());
820 : }
821 :
822 0 : void SwDBSetNumberField::Evaluate(SwDoc* pDoc)
823 : {
824 0 : SwDBManager* pMgr = pDoc->GetDBManager();
825 :
826 0 : const SwDBData& aTmpData = GetDBData();
827 0 : if (!pMgr || !pMgr->IsInMerge() ||
828 0 : !pMgr->IsDataSourceOpen(aTmpData.sDataSource, aTmpData.sCommand, false))
829 0 : return;
830 0 : nNumber = pMgr->GetSelectedRecordId();
831 : }
832 :
833 0 : SwField* SwDBSetNumberField::Copy() const
834 : {
835 : SwDBSetNumberField *pTmp =
836 0 : new SwDBSetNumberField(static_cast<SwDBSetNumberFieldType*>(GetTyp()), GetDBData(), GetFormat());
837 0 : pTmp->SetLanguage(GetLanguage());
838 0 : pTmp->SetSetNumber(nNumber);
839 0 : pTmp->SetSubType(GetSubType());
840 0 : return pTmp;
841 : }
842 :
843 0 : bool SwDBSetNumberField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
844 : {
845 0 : bool bRet = true;
846 0 : switch( nWhichId )
847 : {
848 : case FIELD_PROP_USHORT1:
849 0 : rAny <<= (sal_Int16)GetFormat();
850 0 : break;
851 : case FIELD_PROP_FORMAT:
852 0 : rAny <<= nNumber;
853 0 : break;
854 : default:
855 0 : bRet = SwDBNameInfField::QueryValue( rAny, nWhichId );
856 : }
857 0 : return bRet;
858 : }
859 :
860 0 : bool SwDBSetNumberField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
861 : {
862 0 : bool bRet = true;
863 0 : switch( nWhichId )
864 : {
865 : case FIELD_PROP_USHORT1:
866 : {
867 0 : sal_Int16 nSet = 0;
868 0 : rAny >>= nSet;
869 0 : if(nSet < (sal_Int16) SVX_NUMBER_NONE )
870 0 : SetFormat(nSet);
871 : else {
872 : }
873 : }
874 0 : break;
875 : case FIELD_PROP_FORMAT:
876 0 : rAny >>= nNumber;
877 0 : break;
878 : default:
879 0 : bRet = SwDBNameInfField::PutValue( rAny, nWhichId );
880 : }
881 0 : return bRet;
882 177 : }
883 :
884 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|