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