Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : :
30 : : #include <hintids.hxx>
31 : : #include <unotools/collatorwrapper.hxx>
32 : : #include <unotools/charclass.hxx>
33 : : #include <editeng/unolingu.hxx>
34 : : #include <svx/pageitem.hxx>
35 : : #include <editeng/langitem.hxx>
36 : : #include <editeng/fontitem.hxx>
37 : : #include <com/sun/star/text/SetVariableType.hpp>
38 : : #include <unofield.hxx>
39 : : #include <frmfmt.hxx>
40 : : #include <fmtfld.hxx>
41 : : #include <txtfld.hxx>
42 : : #include <fmtanchr.hxx>
43 : : #include <txtftn.hxx>
44 : : #include <doc.hxx>
45 : : #include <layfrm.hxx>
46 : : #include <pagefrm.hxx>
47 : : #include <cntfrm.hxx>
48 : : #include <rootfrm.hxx>
49 : : #include <tabfrm.hxx>
50 : : #include <flyfrm.hxx>
51 : : #include <ftnfrm.hxx>
52 : : #include <rowfrm.hxx>
53 : : #include <expfld.hxx>
54 : : #include <usrfld.hxx>
55 : : #include <ndtxt.hxx>
56 : : #include <calc.hxx>
57 : : #include <pam.hxx>
58 : : #include <docfld.hxx>
59 : : #include <swcache.hxx>
60 : : #include <swtable.hxx>
61 : : #include <breakit.hxx>
62 : : #include <SwStyleNameMapper.hxx>
63 : : #include <unofldmid.h>
64 : : #include <numrule.hxx>
65 : : #include <switerator.hxx>
66 : :
67 : : using namespace ::com::sun::star;
68 : : using namespace ::com::sun::star::text;
69 : : using ::rtl::OUString;
70 : :
71 : : //-----------------------------------------------------------------------------
72 : 342 : sal_Int16 lcl_SubTypeToAPI(sal_uInt16 nSubType)
73 : : {
74 : 342 : sal_Int16 nRet = 0;
75 [ - + - + : 342 : switch(nSubType)
- ]
76 : : {
77 : : case nsSwGetSetExpType::GSE_EXPR:
78 : 0 : nRet = SetVariableType::VAR; // 0
79 : 0 : break;
80 : : case nsSwGetSetExpType::GSE_SEQ:
81 : 336 : nRet = SetVariableType::SEQUENCE; // 1
82 : 336 : break;
83 : : case nsSwGetSetExpType::GSE_FORMULA:
84 : 0 : nRet = SetVariableType::FORMULA; // 2
85 : 0 : break;
86 : : case nsSwGetSetExpType::GSE_STRING:
87 : 6 : nRet = SetVariableType::STRING; // 3
88 : 6 : break;
89 : : }
90 : 342 : return nRet;
91 : : }
92 : : //-----------------------------------------------------------------------------
93 : 3 : sal_Int32 lcl_APIToSubType(const uno::Any& rAny)
94 : : {
95 : 3 : sal_Int16 nVal = 0;
96 : 3 : rAny >>= nVal;
97 : 3 : sal_Int32 nSet = 0;
98 [ - - - + : 3 : switch(nVal)
- ]
99 : : {
100 : 0 : case SetVariableType::VAR: nSet = nsSwGetSetExpType::GSE_EXPR; break;
101 : 0 : case SetVariableType::SEQUENCE: nSet = nsSwGetSetExpType::GSE_SEQ; break;
102 : 0 : case SetVariableType::FORMULA: nSet = nsSwGetSetExpType::GSE_FORMULA; break;
103 : 3 : case SetVariableType::STRING: nSet = nsSwGetSetExpType::GSE_STRING; break;
104 : : default:
105 : : OSL_FAIL("wrong value");
106 : 0 : nSet = -1;
107 : : }
108 : 3 : return nSet;
109 : : }
110 : :
111 : : //-----------------------------------------------------------------------------
112 : :
113 : 18 : void ReplacePoint( String& rTmpName, sal_Bool bWithCommandType )
114 : : {
115 : : // replace first and last (if bWithCommandType: last two) dot Ersten und letzten Punkt ersetzen, da in Tabellennamen Punkte erlaubt sind
116 : : // since table names may contain dots
117 : :
118 : 18 : xub_StrLen nLen = rTmpName.Len();
119 : 18 : sal_Unicode *pStr = rTmpName.GetBufferAccess(), *pBackStr = pStr + nLen;
120 : :
121 [ - + ]: 18 : long nBackCount = bWithCommandType ? 2 : 1;
122 : : xub_StrLen i;
123 : :
124 [ + + ]: 72 : for( i = nLen; i; --i, pBackStr-- )
125 [ - + ]: 54 : if( '.' == *pBackStr )
126 : : {
127 : 0 : *pBackStr = DB_DELIM;
128 [ # # ]: 0 : if(!--nBackCount)
129 : 0 : break;
130 : : }
131 [ + + ]: 72 : for( i = 0; i < nLen; ++i, ++pStr )
132 [ - + ]: 54 : if( '.' == *pStr )
133 : : {
134 : 0 : *pStr = DB_DELIM;
135 : 0 : break;
136 : : }
137 : 18 : }
138 : :
139 : 0 : SwTxtNode* GetFirstTxtNode( const SwDoc& rDoc, SwPosition& rPos,
140 : : const SwCntntFrm *pCFrm, Point &rPt )
141 : : {
142 : 0 : SwTxtNode* pTxtNode = 0;
143 [ # # ]: 0 : if ( !pCFrm )
144 : : {
145 : 0 : const SwNodes& rNodes = rDoc.GetNodes();
146 : 0 : rPos.nNode = *rNodes.GetEndOfContent().StartOfSectionNode();
147 : : SwCntntNode* pCNd;
148 [ # # ][ # # ]: 0 : while( 0 != (pCNd = rNodes.GoNext( &rPos.nNode ) ) &&
[ # # ]
149 : 0 : 0 == ( pTxtNode = pCNd->GetTxtNode() ) )
150 : : ;
151 : : OSL_ENSURE( pTxtNode, "wo ist der 1.TextNode" );
152 [ # # ]: 0 : rPos.nContent.Assign( pTxtNode, 0 );
153 : : }
154 [ # # ]: 0 : else if ( !pCFrm->IsValid() )
155 : : {
156 : 0 : pTxtNode = (SwTxtNode*)pCFrm->GetNode();
157 : 0 : rPos.nNode = *pTxtNode;
158 [ # # ]: 0 : rPos.nContent.Assign( pTxtNode, 0 );
159 : : }
160 : : else
161 : : {
162 : 0 : pCFrm->GetCrsrOfst( &rPos, rPt );
163 : 0 : pTxtNode = rPos.nNode.GetNode().GetTxtNode();
164 : : }
165 : 0 : return pTxtNode;
166 : : }
167 : :
168 : 0 : const SwTxtNode* GetBodyTxtNode( const SwDoc& rDoc, SwPosition& rPos,
169 : : const SwFrm& rFrm )
170 : : {
171 : 0 : const SwLayoutFrm* pLayout = (SwLayoutFrm*)rFrm.GetUpper();
172 : 0 : const SwTxtNode* pTxtNode = 0;
173 : :
174 [ # # ]: 0 : while( pLayout )
175 : : {
176 [ # # ]: 0 : if( pLayout->IsFlyFrm() )
177 : : {
178 : : // hole das FlyFormat
179 : 0 : SwFrmFmt* pFlyFmt = ((SwFlyFrm*)pLayout)->GetFmt();
180 : : OSL_ENSURE( pFlyFmt, "kein FlyFormat gefunden, wo steht das Feld" );
181 : :
182 : 0 : const SwFmtAnchor &rAnchor = pFlyFmt->GetAnchor();
183 : :
184 [ # # ]: 0 : if( FLY_AT_FLY == rAnchor.GetAnchorId() )
185 : : {
186 : : // und der Fly muss irgendwo angehaengt sein, also
187 : : // den befragen
188 : 0 : pLayout = (SwLayoutFrm*)((SwFlyFrm*)pLayout)->GetAnchorFrm();
189 : 0 : continue;
190 : : }
191 [ # # # # : 0 : else if ((FLY_AT_PARA == rAnchor.GetAnchorId()) ||
# # ][ # # ]
192 : 0 : (FLY_AT_CHAR == rAnchor.GetAnchorId()) ||
193 : 0 : (FLY_AS_CHAR == rAnchor.GetAnchorId()))
194 : : {
195 : : OSL_ENSURE( rAnchor.GetCntntAnchor(), "keine gueltige Position" );
196 : 0 : rPos = *rAnchor.GetCntntAnchor();
197 : 0 : pTxtNode = rPos.nNode.GetNode().GetTxtNode();
198 [ # # ]: 0 : if ( FLY_AT_PARA == rAnchor.GetAnchorId() )
199 : : {
200 : : const_cast<SwTxtNode*>(pTxtNode)->MakeStartIndex(
201 : 0 : &rPos.nContent );
202 : : // oder doch besser das Ende vom (Anker-)TextNode nehmen ??
203 : : // ((SwTxtNode*)pTxtNode)->MakeEndIndex( &rPos.nContent );
204 : : }
205 : :
206 : : // noch nicht abbrechen, kann ja auch noch im
207 : : // Header/Footer/Footnote/Fly stehen !!
208 : 0 : pLayout = ((SwFlyFrm*)pLayout)->GetAnchorFrm()
209 [ # # ]: 0 : ? ((SwFlyFrm*)pLayout)->GetAnchorFrm()->GetUpper() : 0;
210 : 0 : continue;
211 : : }
212 : : else
213 : : {
214 : : pLayout->FindPageFrm()->GetCntntPosition(
215 : 0 : pLayout->Frm().Pos(), rPos );
216 : 0 : pTxtNode = rPos.nNode.GetNode().GetTxtNode();
217 : : }
218 : : }
219 [ # # ]: 0 : else if( pLayout->IsFtnFrm() )
220 : : {
221 : : // hole den Node vom Anker
222 : 0 : const SwTxtFtn* pFtn = ((SwFtnFrm*)pLayout)->GetAttr();
223 : 0 : pTxtNode = &pFtn->GetTxtNode();
224 : 0 : rPos.nNode = *pTxtNode;
225 : 0 : rPos.nContent = *pFtn->GetStart();
226 : : }
227 [ # # ][ # # ]: 0 : else if( pLayout->IsHeaderFrm() || pLayout->IsFooterFrm() )
[ # # ]
228 : : {
229 : : const SwCntntFrm* pCntFrm;
230 : 0 : const SwPageFrm* pPgFrm = pLayout->FindPageFrm();
231 [ # # ]: 0 : if( pLayout->IsHeaderFrm() )
232 : : {
233 : : const SwTabFrm *pTab;
234 [ # # ][ # # : 0 : if( 0 != ( pCntFrm = pPgFrm->FindFirstBodyCntnt()) &&
# # # # #
# ][ # # ]
235 : 0 : 0 != (pTab = pCntFrm->FindTabFrm()) && pTab->IsFollow() &&
236 : 0 : pTab->GetTable()->GetRowsToRepeat() > 0 &&
237 : 0 : pTab->IsInHeadline( *pCntFrm ) )
238 : : {
239 : : // take the next line
240 : 0 : const SwLayoutFrm* pRow = pTab->GetFirstNonHeadlineRow();
241 : 0 : pCntFrm = pRow->ContainsCntnt();
242 : : }
243 : : }
244 : : else
245 : 0 : pCntFrm = pPgFrm->FindLastBodyCntnt();
246 : :
247 [ # # ]: 0 : if( pCntFrm )
248 : : {
249 : 0 : pTxtNode = pCntFrm->GetNode()->GetTxtNode();
250 : 0 : rPos.nNode = *pTxtNode;
251 : 0 : ((SwTxtNode*)pTxtNode)->MakeEndIndex( &rPos.nContent );
252 : : }
253 : : else
254 : : {
255 : 0 : Point aPt( pLayout->Frm().Pos() );
256 : 0 : aPt.Y()++; // aus dem Header raus
257 [ # # ]: 0 : pCntFrm = pPgFrm->GetCntntPos( aPt, sal_False, sal_True, sal_False );
258 [ # # ]: 0 : pTxtNode = GetFirstTxtNode( rDoc, rPos, pCntFrm, aPt );
259 : : }
260 : : }
261 : : else
262 : : {
263 : 0 : pLayout = pLayout->GetUpper();
264 : 0 : continue;
265 : : }
266 : 0 : break; // gefunden und beende die Schleife
267 : : }
268 : 0 : return pTxtNode;
269 : : }
270 : :
271 : : /*--------------------------------------------------------------------
272 : : Beschreibung: SwSetExpFieldType by JP
273 : : --------------------------------------------------------------------*/
274 : :
275 : 1549 : SwGetExpFieldType::SwGetExpFieldType(SwDoc* pDc)
276 : 1549 : : SwValueFieldType( pDc, RES_GETEXPFLD )
277 : : {
278 : 1549 : }
279 : :
280 : 0 : SwFieldType* SwGetExpFieldType::Copy() const
281 : : {
282 [ # # ]: 0 : return new SwGetExpFieldType(GetDoc());
283 : : }
284 : :
285 : 1551 : void SwGetExpFieldType::Modify( const SfxPoolItem*, const SfxPoolItem* pNew )
286 : : {
287 [ + - ][ + - ]: 1551 : if( pNew && RES_DOCPOS_UPDATE == pNew->Which() )
[ + - ]
288 : 1551 : NotifyClients( 0, pNew );
289 : : // sonst nichts weiter expandieren
290 : 1551 : }
291 : :
292 : : /*--------------------------------------------------------------------
293 : : Beschreibung: SwGetExpField by JP
294 : : --------------------------------------------------------------------*/
295 : :
296 : 15 : SwGetExpField::SwGetExpField(SwGetExpFieldType* pTyp, const String& rFormel,
297 : : sal_uInt16 nSub, sal_uLong nFmt)
298 : : : SwFormulaField( pTyp, nFmt, 0.0 ),
299 : : bIsInBodyTxt( sal_True ),
300 : : nSubType(nSub),
301 [ + - ]: 15 : bLateInitialization( false )
302 : : {
303 [ + - ]: 15 : SetFormula( rFormel );
304 : 15 : }
305 : :
306 : 6 : String SwGetExpField::Expand() const
307 : : {
308 [ - + ]: 6 : if(nSubType & nsSwExtendedSubType::SUB_CMD)
309 : 0 : return GetFormula();
310 : : else
311 : 6 : return sExpand;
312 : : }
313 : :
314 : 0 : String SwGetExpField::GetFieldName() const
315 : : {
316 : : String aStr( SwFieldType::GetTypeStr(
317 : : static_cast<sal_uInt16>(((nsSwGetSetExpType::GSE_FORMULA & nSubType) != 0)
318 : : ? TYP_FORMELFLD
319 [ # # ]: 0 : : TYP_GETFLD ) ));
320 [ # # ]: 0 : aStr += ' ';
321 [ # # ][ # # ]: 0 : aStr += GetFormula();
[ # # ]
322 : 0 : return aStr;
323 : : }
324 : :
325 : 12 : SwField* SwGetExpField::Copy() const
326 : : {
327 : 12 : SwGetExpField *pTmp = new SwGetExpField((SwGetExpFieldType*)GetTyp(),
328 [ + - ][ + - ]: 12 : GetFormula(), nSubType, GetFormat());
329 : 12 : pTmp->SetLanguage(GetLanguage());
330 [ + - ]: 12 : pTmp->SwValueField::SetValue(GetValue());
331 : 12 : pTmp->sExpand = sExpand;
332 : 12 : pTmp->bIsInBodyTxt = bIsInBodyTxt;
333 : 12 : pTmp->SetAutomaticLanguage(IsAutomaticLanguage());
334 [ - + ]: 12 : if( bLateInitialization )
335 : 0 : pTmp->SetLateInitialization();
336 : :
337 : 12 : return pTmp;
338 : : }
339 : :
340 : 0 : void SwGetExpField::ChangeExpansion( const SwFrm& rFrm, const SwTxtFld& rFld )
341 : : {
342 [ # # ]: 0 : if( bIsInBodyTxt ) // nur Felder in Footer, Header, FootNote, Flys
343 : : return;
344 : :
345 : : OSL_ENSURE( !rFrm.IsInDocBody(), "Flag ist nicht richtig, Frame steht im DocBody" );
346 : :
347 : : // bestimme mal das Dokument (oder geht es noch einfacher?)
348 : 0 : const SwTxtNode* pTxtNode = &rFld.GetTxtNode();
349 : 0 : SwDoc& rDoc = *(SwDoc*)pTxtNode->GetDoc();
350 : :
351 : : // einen Index fuers bestimmen vom TextNode anlegen
352 [ # # ][ # # ]: 0 : SwPosition aPos( SwNodeIndex( rDoc.GetNodes() ) );
[ # # ][ # # ]
353 [ # # ]: 0 : pTxtNode = GetBodyTxtNode( rDoc, aPos, rFrm );
354 : :
355 : : // Wenn kein Layout vorhanden, kommt es in Kopf und Fusszeilen dazu
356 : : // das ChnageExpansion uebers Layout-Formatieren aufgerufen wird
357 : : // aber kein TxtNode vorhanden ist
358 : : //
359 [ # # ]: 0 : if(!pTxtNode)
360 : : return;
361 : : // #i82544#
362 [ # # ]: 0 : if( bLateInitialization )
363 : : {
364 [ # # ][ # # ]: 0 : SwFieldType* pSetExpFld = rDoc.GetFldType(RES_SETEXPFLD, GetFormula(), sal_False);
[ # # ]
365 [ # # ]: 0 : if( pSetExpFld )
366 : : {
367 : 0 : bLateInitialization = false;
368 [ # # ]: 0 : if( !(GetSubType() & nsSwGetSetExpType::GSE_STRING) &&
[ # # # # ]
[ # # ]
369 : 0 : static_cast< SwSetExpFieldType* >(pSetExpFld)->GetType() == nsSwGetSetExpType::GSE_STRING )
370 [ # # ]: 0 : SetSubType( nsSwGetSetExpType::GSE_STRING );
371 : : }
372 : : }
373 : :
374 [ # # ]: 0 : _SetGetExpFld aEndFld( aPos.nNode, &rFld, &aPos.nContent );
375 [ # # ][ # # ]: 0 : if(GetSubType() & nsSwGetSetExpType::GSE_STRING)
376 : : {
377 : : SwHash** ppHashTbl;
378 : : sal_uInt16 nSize;
379 [ # # ]: 0 : rDoc.FldsToExpand( ppHashTbl, nSize, aEndFld );
380 [ # # ][ # # ]: 0 : LookString( ppHashTbl, nSize, GetFormula(), sExpand );
[ # # ]
381 [ # # ]: 0 : ::DeleteHashTable( ppHashTbl, nSize ); // HashTabelle loeschen
382 : : }
383 : : else
384 : : {
385 : : // fuelle den Calculator mit den Werten
386 [ # # ]: 0 : SwCalc aCalc( rDoc );
387 [ # # ]: 0 : rDoc.FldsToCalc(aCalc, aEndFld);
388 : :
389 : : // Wert berechnen
390 [ # # ][ # # ]: 0 : SetValue(aCalc.Calculate(GetFormula()).GetDouble());
[ # # ][ # # ]
[ # # ][ # # ]
391 : :
392 : : // Auswertung nach Format
393 : 0 : sExpand = ((SwValueFieldType*)GetTyp())->ExpandValue(
394 [ # # # # ]: 0 : GetValue(), GetFormat(), GetLanguage());
[ # # ][ # # ]
[ # # ]
395 [ # # ][ # # ]: 0 : }
396 : : }
397 : :
398 : 0 : rtl::OUString SwGetExpField::GetPar2() const
399 : : {
400 [ # # ]: 0 : return GetFormula();
401 : : }
402 : :
403 : 0 : void SwGetExpField::SetPar2(const rtl::OUString& rStr)
404 : : {
405 [ # # ]: 0 : SetFormula(rStr);
406 : 0 : }
407 : :
408 : 3 : sal_uInt16 SwGetExpField::GetSubType() const
409 : : {
410 : 3 : return nSubType;
411 : : }
412 : :
413 : 0 : void SwGetExpField::SetSubType(sal_uInt16 nType)
414 : : {
415 : 0 : nSubType = nType;
416 : 0 : }
417 : :
418 : 15 : void SwGetExpField::SetLanguage(sal_uInt16 nLng)
419 : : {
420 [ - + ]: 15 : if (nSubType & nsSwExtendedSubType::SUB_CMD)
421 : 0 : SwField::SetLanguage(nLng);
422 : : else
423 : 15 : SwValueField::SetLanguage(nLng);
424 : 15 : }
425 : :
426 : 9 : bool SwGetExpField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
427 : : {
428 [ - - - + : 9 : switch( nWhichId )
+ - + - ]
429 : : {
430 : : case FIELD_PROP_DOUBLE:
431 [ # # ]: 0 : rAny <<= GetValue();
432 : 0 : break;
433 : : case FIELD_PROP_FORMAT:
434 [ # # ]: 0 : rAny <<= (sal_Int32)GetFormat();
435 : 0 : break;
436 : : case FIELD_PROP_USHORT1:
437 [ # # ]: 0 : rAny <<= (sal_Int16)nSubType;
438 : 0 : break;
439 : : case FIELD_PROP_PAR1:
440 [ + - ][ + - ]: 3 : rAny <<= OUString( GetFormula() );
441 : 3 : break;
442 : : case FIELD_PROP_SUBTYPE:
443 : : {
444 [ + - ]: 3 : sal_Int16 nRet = lcl_SubTypeToAPI(GetSubType() & 0xff);
445 [ + - ]: 3 : rAny <<= nRet;
446 : : }
447 : 3 : break;
448 : : case FIELD_PROP_BOOL2:
449 : : {
450 : 0 : sal_Bool bTmp = 0 != (nSubType & nsSwExtendedSubType::SUB_CMD);
451 [ # # ]: 0 : rAny.setValue(&bTmp, ::getBooleanCppuType());
452 : : }
453 : 0 : break;
454 : : case FIELD_PROP_PAR4:
455 [ + - ]: 3 : rAny <<= rtl::OUString(GetExpStr());
456 : 3 : break;
457 : : default:
458 : 0 : return SwField::QueryValue(rAny, nWhichId);
459 : : }
460 : 9 : return true;
461 : : }
462 : :
463 : 0 : bool SwGetExpField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
464 : : {
465 : 0 : sal_Int32 nTmp = 0;
466 [ # # ]: 0 : String sTmp;
467 [ # # # # : 0 : switch( nWhichId )
# # # # ]
468 : : {
469 : : case FIELD_PROP_DOUBLE:
470 [ # # ]: 0 : SwValueField::SetValue(*(double*) rAny.getValue());
471 : 0 : break;
472 : : case FIELD_PROP_FORMAT:
473 : 0 : rAny >>= nTmp;
474 : 0 : SetFormat(nTmp);
475 : 0 : break;
476 : : case FIELD_PROP_USHORT1:
477 : 0 : rAny >>= nTmp;
478 : 0 : nSubType = static_cast<sal_uInt16>(nTmp);
479 : 0 : break;
480 : : case FIELD_PROP_PAR1:
481 [ # # ][ # # ]: 0 : SetFormula( ::GetString( rAny, sTmp ));
482 : 0 : break;
483 : : case FIELD_PROP_SUBTYPE:
484 : 0 : nTmp = lcl_APIToSubType(rAny);
485 [ # # ]: 0 : if( nTmp >=0 )
486 [ # # ][ # # ]: 0 : SetSubType( static_cast<sal_uInt16>((GetSubType() & 0xff00) | nTmp));
487 : 0 : break;
488 : : case FIELD_PROP_BOOL2:
489 [ # # ]: 0 : if(*(sal_Bool*) rAny.getValue())
490 : 0 : nSubType |= nsSwExtendedSubType::SUB_CMD;
491 : : else
492 : 0 : nSubType &= (~nsSwExtendedSubType::SUB_CMD);
493 : 0 : break;
494 : : case FIELD_PROP_PAR4:
495 [ # # ][ # # ]: 0 : ChgExpStr(::GetString( rAny, sTmp ));
496 : 0 : break;
497 : : default:
498 [ # # ]: 0 : return SwField::PutValue(rAny, nWhichId);
499 : : }
500 [ # # ]: 0 : return true;
501 : : }
502 : :
503 : 6202 : SwSetExpFieldType::SwSetExpFieldType( SwDoc* pDc, const String& rName, sal_uInt16 nTyp )
504 : : : SwValueFieldType( pDc, RES_SETEXPFLD ),
505 : : sName( rName ),
506 : : pOutlChgNd( 0 ),
507 : : sDelim( rtl::OUString(".") ),
508 : : nType(nTyp), nLevel( UCHAR_MAX ),
509 [ + - ][ + - ]: 6202 : bDeleted( sal_False )
510 : : {
511 [ + + ]: 6202 : if( ( nsSwGetSetExpType::GSE_SEQ | nsSwGetSetExpType::GSE_STRING ) & nType )
512 : 6196 : EnableFormat(sal_False); // Numberformatter nicht einsetzen
513 : 6202 : }
514 : :
515 : 3 : SwFieldType* SwSetExpFieldType::Copy() const
516 : : {
517 [ + - ][ + - ]: 3 : SwSetExpFieldType* pNew = new SwSetExpFieldType(GetDoc(), sName, nType);
518 : 3 : pNew->bDeleted = bDeleted;
519 : 3 : pNew->sDelim = sDelim;
520 : 3 : pNew->nLevel = nLevel;
521 : :
522 : 3 : return pNew;
523 : : }
524 : :
525 : 2094 : const rtl::OUString& SwSetExpFieldType::GetName() const
526 : : {
527 : 2094 : return sName;
528 : : }
529 : :
530 : 0 : void SwSetExpFieldType::Modify( const SfxPoolItem*, const SfxPoolItem* )
531 : : {
532 : 0 : return; // nicht weiter expandieren
533 : : }
534 : :
535 : 0 : void SwSetExpFieldType::SetSeqFormat(sal_uLong nFmt)
536 : : {
537 [ # # ]: 0 : SwIterator<SwFmtFld,SwFieldType> aIter(*this);
538 [ # # ][ # # ]: 0 : for( SwFmtFld* pFld = aIter.First(); pFld; pFld = aIter.Next() )
[ # # ]
539 [ # # ][ # # ]: 0 : pFld->GetFld()->ChangeFormat( nFmt );
540 : 0 : }
541 : :
542 : 0 : sal_uLong SwSetExpFieldType::GetSeqFormat()
543 : : {
544 [ # # ]: 0 : if( !GetDepends() )
545 : 0 : return SVX_NUM_ARABIC;
546 : :
547 [ # # ]: 0 : SwField *pFld = ((SwFmtFld*)GetDepends())->GetFld();
548 : 0 : return pFld->GetFormat();
549 : : }
550 : :
551 : 0 : sal_uInt16 SwSetExpFieldType::SetSeqRefNo( SwSetExpField& rFld )
552 : : {
553 [ # # ][ # # ]: 0 : if( !GetDepends() || !(nsSwGetSetExpType::GSE_SEQ & nType) )
[ # # ]
554 : 0 : return USHRT_MAX;
555 : :
556 : : extern void InsertSort( std::vector<sal_uInt16>& rArr, sal_uInt16 nIdx, sal_uInt16* pInsPos = 0 );
557 [ # # ]: 0 : std::vector<sal_uInt16> aArr;
558 : :
559 : : sal_uInt16 n;
560 : :
561 : : // dann testmal, ob die Nummer schon vergeben ist oder ob eine neue
562 : : // bestimmt werden muss.
563 [ # # ]: 0 : SwIterator<SwFmtFld,SwFieldType> aIter( *this );
564 : : const SwTxtNode* pNd;
565 [ # # ][ # # ]: 0 : for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() )
[ # # ]
566 [ # # ]: 0 : if( pF->GetFld() != &rFld && pF->GetTxtFld() &&
[ # # # # ]
[ # # ][ # # ]
567 : 0 : 0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) &&
568 [ # # ]: 0 : pNd->GetNodes().IsDocNodes() )
569 [ # # ]: 0 : InsertSort( aArr, ((SwSetExpField*)pF->GetFld())->GetSeqNumber() );
570 : :
571 : :
572 : : // teste erstmal ob die Nummer schon vorhanden ist:
573 : 0 : sal_uInt16 nNum = rFld.GetSeqNumber();
574 [ # # ]: 0 : if( USHRT_MAX != nNum )
575 : : {
576 [ # # ]: 0 : for( n = 0; n < aArr.size(); ++n )
577 [ # # ][ # # ]: 0 : if( aArr[ n ] > nNum )
578 : 0 : return nNum; // nicht vorhanden -> also benutzen
579 [ # # ][ # # ]: 0 : else if( aArr[ n ] == nNum )
580 : 0 : break; // schon vorhanden -> neue erzeugen
581 : :
582 [ # # ]: 0 : if( n == aArr.size() )
583 : 0 : return nNum; // nicht vorhanden -> also benutzen
584 : : }
585 : :
586 : : // alle Nummern entsprechend geflag, also bestimme die richtige Nummer
587 [ # # ]: 0 : for( n = 0; n < aArr.size(); ++n )
588 [ # # ][ # # ]: 0 : if( n != aArr[ n ] )
589 : 0 : break;
590 : :
591 : 0 : rFld.SetSeqNumber( n );
592 [ # # ]: 0 : return n;
593 : : }
594 : :
595 : 0 : sal_uInt16 SwSetExpFieldType::GetSeqFldList( SwSeqFldList& rList )
596 : : {
597 : 0 : rList.Clear();
598 : :
599 [ # # ]: 0 : SwIterator<SwFmtFld,SwFieldType> aIter( *this );
600 : : const SwTxtNode* pNd;
601 [ # # ][ # # ]: 0 : for( SwFmtFld* pF = aIter.First(); pF; pF = aIter.Next() )
[ # # ]
602 [ # # # # ]: 0 : if( pF->GetTxtFld() &&
[ # # ][ # # ]
603 : 0 : 0 != ( pNd = pF->GetTxtFld()->GetpTxtNode() ) &&
604 [ # # ]: 0 : pNd->GetNodes().IsDocNodes() )
605 : : {
606 : : _SeqFldLstElem* pNew = new _SeqFldLstElem(
607 : : pNd->GetExpandTxt( 0, USHRT_MAX ),
608 [ # # ][ # # ]: 0 : ((SwSetExpField*)pF->GetFld())->GetSeqNumber() );
[ # # ][ # # ]
609 [ # # ]: 0 : rList.InsertSort( pNew );
610 : : }
611 : :
612 [ # # ]: 0 : return rList.Count();
613 : : }
614 : :
615 : :
616 : 0 : void SwSetExpFieldType::SetChapter( SwSetExpField& rFld, const SwNode& rNd )
617 : : {
618 : 0 : const SwTxtNode* pTxtNd = rNd.FindOutlineNodeOfLevel( nLevel );
619 [ # # ]: 0 : if( pTxtNd )
620 : : {
621 : 0 : SwNumRule * pRule = pTxtNd->GetNumRule();
622 : :
623 [ # # ]: 0 : if (pRule)
624 : : {
625 : : // --> OD 2005-11-02 #i51089 - TUNING#
626 [ # # ]: 0 : if ( pTxtNd->GetNum() )
627 : : {
628 : 0 : const SwNodeNum & aNum = *(pTxtNd->GetNum());
629 : :
630 : : // nur die Nummer besorgen, ohne Pre-/Post-fixstrings
631 [ # # ]: 0 : String sNumber( pRule->MakeNumString(aNum, sal_False ));
632 : :
633 [ # # ]: 0 : if( sNumber.Len() )
634 [ # # ][ # # ]: 0 : rFld.ChgExpStr( ( sNumber += sDelim ) += rFld.GetExpStr() );
[ # # ][ # # ]
635 : : }
636 : : else
637 : : {
638 : : OSL_FAIL( "<SwSetExpFieldType::SetChapter(..)> - text node with numbering rule, but without number. This is a serious defect -> inform OD" );
639 : : }
640 : : }
641 : : }
642 : 0 : }
643 : :
644 : 420 : bool SwSetExpFieldType::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
645 : : {
646 [ + - + - ]: 420 : switch( nWhichId )
647 : : {
648 : : case FIELD_PROP_SUBTYPE:
649 : : {
650 : 336 : sal_Int16 nRet = lcl_SubTypeToAPI(GetType());
651 [ + - ]: 336 : rAny <<= nRet;
652 : : }
653 : 336 : break;
654 : : case FIELD_PROP_PAR2:
655 [ # # ]: 0 : rAny <<= OUString(GetDelimiter());
656 : 0 : break;
657 : : case FIELD_PROP_SHORT1:
658 : : {
659 [ - + ]: 84 : sal_Int8 nRet = nLevel < MAXLEVEL? nLevel : -1;
660 [ + - ]: 84 : rAny <<= nRet;
661 : : }
662 : 84 : break;
663 : : default:
664 : : OSL_FAIL("illegal property");
665 : : }
666 : 420 : return true;
667 : : }
668 : :
669 : 255 : bool SwSetExpFieldType::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
670 : : {
671 [ + - + - ]: 255 : switch( nWhichId )
672 : : {
673 : : case FIELD_PROP_SUBTYPE:
674 : : {
675 : 3 : sal_Int32 nSet = lcl_APIToSubType(rAny);
676 [ + - ]: 3 : if(nSet >=0)
677 : 3 : SetType(static_cast<sal_uInt16>(nSet));
678 : : }
679 : 3 : break;
680 : : case FIELD_PROP_PAR2:
681 : : {
682 [ # # ]: 0 : String sTmp;
683 [ # # ][ # # ]: 0 : if( ::GetString( rAny, sTmp ).Len() )
684 [ # # ]: 0 : SetDelimiter( sTmp );
685 : : else
686 [ # # ][ # # ]: 0 : SetDelimiter(rtl::OUString(" "));
[ # # ][ # # ]
687 : : }
688 : 0 : break;
689 : : case FIELD_PROP_SHORT1:
690 : : {
691 : 252 : sal_Int8 nLvl = 0;
692 : 252 : rAny >>= nLvl;
693 [ # # ][ - + ]: 252 : if(nLvl < 0 || nLvl >= MAXLEVEL)
694 : 252 : SetOutlineLvl(UCHAR_MAX);
695 : : else
696 : 0 : SetOutlineLvl(nLvl);
697 : : }
698 : 252 : break;
699 : : default:
700 : : OSL_FAIL("illegal property");
701 : : }
702 : 255 : return true;
703 : : }
704 : :
705 : 0 : bool SwSeqFldList::InsertSort( _SeqFldLstElem* pNew )
706 : : {
707 [ # # ]: 0 : sal_Unicode* p = pNew->sDlgEntry.GetBufferAccess();
708 [ # # ]: 0 : while( *p )
709 : : {
710 [ # # ]: 0 : if( *p < 0x20 )
711 : 0 : *p = 0x20;
712 : 0 : ++p;
713 : : }
714 : :
715 : : sal_uInt16 nPos;
716 [ # # ]: 0 : bool bRet = SeekEntry( *pNew, &nPos );
717 [ # # ]: 0 : if( !bRet )
718 [ # # ][ # # ]: 0 : maData.insert( maData.begin() + nPos, pNew );
719 : 0 : return bRet;
720 : : }
721 : :
722 : 0 : bool SwSeqFldList::SeekEntry( const _SeqFldLstElem& rNew, sal_uInt16* pP ) const
723 : : {
724 : 0 : sal_uInt16 nO = maData.size(), nM, nU = 0;
725 [ # # ]: 0 : if( nO > 0 )
726 : : {
727 [ # # ]: 0 : CollatorWrapper & rCaseColl = ::GetAppCaseCollator(),
728 [ # # ]: 0 : & rColl = ::GetAppCollator();
729 [ # # ]: 0 : const CharClass& rCC = GetAppCharClass();
730 : :
731 : : //#59900# Die Sortierung soll die Nummer korrekt einordnen
732 : : //also "10" nach "9" und nicht "10" nach "1"
733 : 0 : const String& rTmp2 = rNew.sDlgEntry;
734 : 0 : xub_StrLen nFndPos2 = 0;
735 [ # # ]: 0 : String sNum2( rTmp2.GetToken( 0, ' ', nFndPos2 ));
736 [ # # ]: 0 : sal_Bool bIsNum2IsNumeric = rCC.isAsciiNumeric( sNum2 );
737 [ # # ][ # # ]: 0 : sal_Int32 nNum2 = bIsNum2IsNumeric ? sNum2.ToInt32() : 0;
738 : :
739 : 0 : nO--;
740 [ # # ]: 0 : while( nU <= nO )
741 : : {
742 : 0 : nM = nU + ( nO - nU ) / 2;
743 : :
744 : : //#59900# Die Sortierung soll die Nummer korrekt einordnen
745 : : //also "10" nach "9" und nicht "10" nach "1"
746 : 0 : const String& rTmp1 = maData[nM]->sDlgEntry;
747 : 0 : xub_StrLen nFndPos1 = 0;
748 [ # # ]: 0 : String sNum1( rTmp1.GetToken( 0, ' ', nFndPos1 ));
749 : : sal_Int32 nCmp;
750 : :
751 [ # # ][ # # ]: 0 : if( bIsNum2IsNumeric && rCC.isNumeric( sNum1 ) )
[ # # ][ # # ]
752 : : {
753 [ # # ]: 0 : sal_Int32 nNum1 = sNum1.ToInt32();
754 : 0 : nCmp = nNum2 - nNum1;
755 [ # # ]: 0 : if( 0 == nCmp )
756 : : nCmp = rCaseColl.compareString( rTmp2.Copy( nFndPos2 ),
757 [ # # ][ # # ]: 0 : rTmp1.Copy( nFndPos1 ));
[ # # ][ # # ]
[ # # ][ # # ]
[ # # ]
758 : : }
759 : : else
760 [ # # ][ # # ]: 0 : nCmp = rColl.compareString( rTmp2, rTmp1 );
[ # # ]
761 : :
762 [ # # ]: 0 : if( 0 == nCmp )
763 : : {
764 [ # # ]: 0 : if( pP ) *pP = nM;
765 : 0 : return true;
766 : : }
767 [ # # ]: 0 : else if( 0 < nCmp )
768 : 0 : nU = nM + 1;
769 [ # # ]: 0 : else if( nM == 0 )
770 : : break;
771 : : else
772 : 0 : nO = nM - 1;
773 [ # # ]: 0 : }
[ # # # ]
[ # # ][ # # ]
774 : : }
775 [ # # ]: 0 : if( pP ) *pP = nU;
776 : 0 : return false;
777 : : }
778 : :
779 : : /*--------------------------------------------------------------------
780 : : Beschreibung: SwSetExpField by JP
781 : : --------------------------------------------------------------------*/
782 : :
783 : 15 : SwSetExpField::SwSetExpField(SwSetExpFieldType* pTyp, const String& rFormel,
784 : : sal_uLong nFmt)
785 : : : SwFormulaField( pTyp, nFmt, 0.0 ), nSeqNo( USHRT_MAX ),
786 [ + - ][ + - ]: 15 : nSubType(0)
[ + - ]
787 : : {
788 [ + - ]: 15 : SetFormula(rFormel);
789 : : // SubType ignorieren !!!
790 : 15 : bInput = sal_False;
791 [ - + ]: 15 : if( IsSequenceFld() )
792 : : {
793 [ # # ]: 0 : SwValueField::SetValue(1.0);
794 [ # # ]: 0 : if( !rFormel.Len() )
795 : : {
796 [ # # ]: 0 : String sFormel(rFormel);
797 [ # # ][ # # ]: 0 : sFormel += pTyp->GetName();
798 [ # # ]: 0 : sFormel += '+';
799 [ # # ]: 0 : sFormel += '1';
800 [ # # ][ # # ]: 0 : SetFormula(sFormel);
801 : : }
802 : : }
803 : 15 : }
804 : :
805 : 6 : String SwSetExpField::Expand() const
806 : : {
807 : 6 : String aStr;
808 [ - + ]: 6 : if (nSubType & nsSwExtendedSubType::SUB_CMD)
809 : : { // Der CommandString ist gefragt
810 [ # # ][ # # ]: 0 : aStr = GetTyp()->GetName();
811 [ # # ]: 0 : aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " = " ));
812 [ # # ][ # # ]: 0 : aStr += GetFormula();
[ # # ]
813 : : }
814 [ - + ]: 6 : else if(!(nSubType & nsSwExtendedSubType::SUB_INVISIBLE))
815 : : { // Der Wert ist sichtbar
816 [ # # ]: 0 : aStr = sExpand;
817 : : }
818 : 6 : return aStr;
819 : : }
820 : :
821 : : /*--------------------------------------------------------------------
822 : : @return the field name
823 : : --------------------------------------------------------------------*/
824 : :
825 : 0 : String SwSetExpField::GetFieldName() const
826 : : {
827 : 0 : SwFldTypesEnum const nStrType( (IsSequenceFld())
828 : : ? TYP_SEQFLD
829 : : : (bInput)
830 : : ? TYP_SETINPFLD
831 [ # # ][ # # ]: 0 : : TYP_SETFLD );
832 : :
833 : 0 : String aStr( SwFieldType::GetTypeStr( static_cast<sal_uInt16>(nStrType) ) );
834 [ # # ]: 0 : aStr += ' ';
835 [ # # ][ # # ]: 0 : aStr += GetTyp()->GetName();
836 : :
837 : : // Sequence: without formula
838 [ # # ]: 0 : if (TYP_SEQFLD != nStrType)
839 : : {
840 [ # # ]: 0 : aStr.AppendAscii( RTL_CONSTASCII_STRINGPARAM( " = " ) );
841 [ # # ][ # # ]: 0 : aStr += GetFormula();
[ # # ]
842 : : }
843 : 0 : return aStr;
844 : : }
845 : :
846 : 12 : SwField* SwSetExpField::Copy() const
847 : : {
848 : 12 : SwSetExpField *pTmp = new SwSetExpField((SwSetExpFieldType*)GetTyp(),
849 [ + - ][ + - ]: 12 : GetFormula(), GetFormat());
850 [ + - ]: 12 : pTmp->SwValueField::SetValue(GetValue());
851 : 12 : pTmp->sExpand = sExpand;
852 : 12 : pTmp->SetAutomaticLanguage(IsAutomaticLanguage());
853 : 12 : pTmp->SetLanguage(GetLanguage());
854 : 12 : pTmp->aPText = aPText;
855 : 12 : pTmp->bInput = bInput;
856 : 12 : pTmp->nSeqNo = nSeqNo;
857 : 12 : pTmp->SetSubType(GetSubType());
858 : :
859 : 12 : return pTmp;
860 : : }
861 : :
862 : 15 : void SwSetExpField::SetSubType(sal_uInt16 nSub)
863 : : {
864 : 15 : ((SwSetExpFieldType*)GetTyp())->SetType(nSub & 0xff);
865 : 15 : nSubType = nSub & 0xff00;
866 : :
867 : : OSL_ENSURE( (nSub & 0xff) != 3, "SubType ist illegal!" );
868 : 15 : }
869 : :
870 : 18 : sal_uInt16 SwSetExpField::GetSubType() const
871 : : {
872 : 18 : return ((SwSetExpFieldType*)GetTyp())->GetType() | nSubType;
873 : : }
874 : :
875 : 0 : void SwSetExpField::SetValue( const double& rAny )
876 : : {
877 : 0 : SwValueField::SetValue(rAny);
878 : :
879 [ # # ]: 0 : if( IsSequenceFld() )
880 [ # # ]: 0 : sExpand = FormatNumber( (sal_uInt32)GetValue(), GetFormat() );
881 : : else
882 : 0 : sExpand = ((SwValueFieldType*)GetTyp())->ExpandValue( rAny,
883 [ # # ]: 0 : GetFormat(), GetLanguage());
884 : 0 : }
885 : :
886 : 0 : void SwGetExpField::SetValue( const double& rAny )
887 : : {
888 : 0 : SwValueField::SetValue(rAny);
889 : 0 : sExpand = ((SwValueFieldType*)GetTyp())->ExpandValue( rAny, GetFormat(),
890 [ # # ]: 0 : GetLanguage());
891 : 0 : }
892 : : /* --------------------------------------------------
893 : : Description: Find the index of the reference text
894 : : following the current field
895 : : nHint: search starting position after the current
896 : : field (or 0 if default)
897 : : --------------------------------------------------*/
898 : 0 : xub_StrLen SwGetExpField::GetReferenceTextPos( const SwFmtFld& rFmt, SwDoc& rDoc, unsigned nHint)
899 : : {
900 : : //
901 : 0 : const SwTxtFld* pTxtFld = rFmt.GetTxtFld();
902 : 0 : const SwTxtNode& rTxtNode = pTxtFld->GetTxtNode();
903 : : //
904 [ # # ]: 0 : xub_StrLen nRet = nHint ? nHint : *pTxtFld->GetStart() + 1;
905 [ # # ]: 0 : String sNodeText = rTxtNode.GetTxt();
906 [ # # ]: 0 : sNodeText.Erase(0, nRet);
907 [ # # ]: 0 : if(sNodeText.Len())
908 : : {
909 : : // now check if sNodeText starts with a non-alphanumeric character plus blanks
910 [ # # ][ # # ]: 0 : sal_uInt16 nSrcpt = pBreakIt->GetRealScriptOfText( sNodeText, 0 );
911 : :
912 : : static sal_uInt16 nIds[] =
913 : : {
914 : : RES_CHRATR_LANGUAGE, RES_CHRATR_LANGUAGE,
915 : : RES_CHRATR_FONT, RES_CHRATR_FONT,
916 : : RES_CHRATR_CJK_LANGUAGE, RES_CHRATR_CJK_LANGUAGE,
917 : : RES_CHRATR_CJK_FONT, RES_CHRATR_CJK_FONT,
918 : : RES_CHRATR_CTL_LANGUAGE, RES_CHRATR_CTL_LANGUAGE,
919 : : RES_CHRATR_CTL_FONT, RES_CHRATR_CTL_FONT,
920 : : 0, 0
921 : : };
922 [ # # ]: 0 : SwAttrSet aSet(rDoc.GetAttrPool(), nIds);
923 [ # # ]: 0 : rTxtNode.GetAttr(aSet, nRet, nRet+1);
924 : :
925 [ # # ]: 0 : if( RTL_TEXTENCODING_SYMBOL != ((SvxFontItem&)aSet.Get(
926 [ # # ][ # # ]: 0 : GetWhichOfScript( RES_CHRATR_FONT, nSrcpt )) ).GetCharSet() )
927 : : {
928 : : LanguageType eLang = ((SvxLanguageItem&)aSet.Get(
929 [ # # ][ # # ]: 0 : GetWhichOfScript( RES_CHRATR_LANGUAGE, nSrcpt )) ).GetLanguage();
930 [ # # ][ # # ]: 0 : CharClass aCC( SvxCreateLocale( eLang ));
931 : 0 : sal_Unicode c0 = sNodeText.GetChar(0);
932 [ # # ]: 0 : sal_Bool bIsAlphaNum = aCC.isAlphaNumeric( sNodeText, 0 );
933 [ # # ][ # # ]: 0 : if( !bIsAlphaNum ||
[ # # ]
934 : : (c0 == ' ' || c0 == '\t'))
935 : : {
936 : : // ignoring blanks
937 : 0 : nRet++;
938 : 0 : unsigned i = 1;
939 [ # # # # : 0 : while (i < sNodeText.Len() &&
# # ][ # # ]
940 : 0 : (sNodeText.GetChar(i) == ' ' ||
941 : 0 : sNodeText.GetChar(i) == '\t')
942 : : )
943 : 0 : nRet++, i++;
944 [ # # ]: 0 : }
945 [ # # ]: 0 : }
946 : : }
947 [ # # ]: 0 : return nRet;
948 : : }
949 : :
950 : :
951 : : /*--------------------------------------------------------------------
952 : : Beschreibung: Parameter setzen
953 : : --------------------------------------------------------------------*/
954 : :
955 : 0 : const rtl::OUString& SwSetExpField::GetPar1() const
956 : : {
957 : 0 : return ((const SwSetExpFieldType*)GetTyp())->GetName();
958 : : }
959 : :
960 : 0 : rtl::OUString SwSetExpField::GetPar2() const
961 : : {
962 : 0 : sal_uInt16 nType = ((SwSetExpFieldType*)GetTyp())->GetType();
963 : :
964 [ # # ]: 0 : if (nType & nsSwGetSetExpType::GSE_STRING)
965 [ # # ]: 0 : return GetFormula();
966 [ # # ]: 0 : return GetExpandedFormula();
967 : : }
968 : :
969 : 0 : void SwSetExpField::SetPar2(const rtl::OUString& rStr)
970 : : {
971 : 0 : sal_uInt16 nType = ((SwSetExpFieldType*)GetTyp())->GetType();
972 : :
973 [ # # ][ # # ]: 0 : if( !(nType & nsSwGetSetExpType::GSE_SEQ) || !rStr.isEmpty() )
[ # # ]
974 : : {
975 [ # # ]: 0 : if (nType & nsSwGetSetExpType::GSE_STRING)
976 [ # # ]: 0 : SetFormula(rStr);
977 : : else
978 [ # # ]: 0 : SetExpandedFormula(rStr);
979 : : }
980 : 0 : }
981 : :
982 : : /*--------------------------------------------------------------------
983 : : Beschreibung: Eingabefeld Type
984 : : ---------------------------------------------------------------------*/
985 : :
986 : 1549 : SwInputFieldType::SwInputFieldType( SwDoc* pD )
987 : 1549 : : SwFieldType( RES_INPUTFLD ), pDoc( pD )
988 : : {
989 : 1549 : }
990 : :
991 : 0 : SwFieldType* SwInputFieldType::Copy() const
992 : : {
993 [ # # ]: 0 : SwInputFieldType* pType = new SwInputFieldType( pDoc );
994 : 0 : return pType;
995 : : }
996 : :
997 : : /*--------------------------------------------------------------------
998 : : Beschreibung: Eingabefeld
999 : : --------------------------------------------------------------------*/
1000 : :
1001 : 14 : SwInputField::SwInputField(SwInputFieldType* pTyp, const String& rContent,
1002 : : const String& rPrompt, sal_uInt16 nSub, sal_uLong nFmt) :
1003 [ + - ][ + - ]: 14 : SwField(pTyp, nFmt), aContent(rContent), aPText(rPrompt), nSubType(nSub)
[ + - ][ + - ]
1004 : : {
1005 : 14 : }
1006 : :
1007 : 0 : String SwInputField::GetFieldName() const
1008 : : {
1009 : 0 : String aStr(SwField::GetFieldName());
1010 [ # # ]: 0 : if ((nSubType & 0x00ff) == INP_USR)
1011 : : {
1012 [ # # ][ # # ]: 0 : aStr += GetTyp()->GetName();
1013 [ # # ]: 0 : aStr += ' ';
1014 [ # # ]: 0 : aStr += aContent;
1015 : : }
1016 : 0 : return aStr;
1017 : : }
1018 : :
1019 : 12 : SwField* SwInputField::Copy() const
1020 : : {
1021 : 12 : SwInputField* pFld = new SwInputField((SwInputFieldType*)GetTyp(), aContent,
1022 [ + - ][ + - ]: 12 : aPText, GetSubType(), GetFormat());
[ + - ]
1023 : :
1024 : 12 : pFld->SetHelp(aHelp);
1025 : 12 : pFld->SetToolTip(aToolTip);
1026 : :
1027 : 12 : pFld->SetAutomaticLanguage(IsAutomaticLanguage());
1028 : 12 : return pFld;
1029 : : }
1030 : :
1031 : 8 : String SwInputField::Expand() const
1032 : : {
1033 : 8 : String sRet;
1034 [ + - ]: 8 : if((nSubType & 0x00ff) == INP_TXT)
1035 [ + - ]: 8 : sRet = aContent;
1036 : :
1037 [ # # ]: 0 : else if( (nSubType & 0x00ff) == INP_USR )
1038 : : {
1039 : : SwUserFieldType* pUserTyp = (SwUserFieldType*)
1040 : 0 : ((SwInputFieldType*)GetTyp())->GetDoc()->
1041 [ # # ][ # # ]: 0 : GetFldType( RES_USERFLD, aContent, false );
[ # # ]
1042 [ # # ]: 0 : if( pUserTyp )
1043 [ # # ][ # # ]: 0 : sRet = pUserTyp->GetContent();
[ # # ]
1044 : : }
1045 : 8 : return sRet;
1046 : : }
1047 : :
1048 : 6 : bool SwInputField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
1049 : : {
1050 [ + - - - : 6 : switch( nWhichId )
- ]
1051 : : {
1052 : : case FIELD_PROP_PAR1:
1053 [ + - ]: 6 : rAny <<= OUString( aContent );
1054 : 6 : break;
1055 : : case FIELD_PROP_PAR2:
1056 [ # # ]: 0 : rAny <<= OUString( aPText );
1057 : 0 : break;
1058 : : case FIELD_PROP_PAR3:
1059 [ # # ]: 0 : rAny <<= OUString( aHelp );
1060 : 0 : break;
1061 : : case FIELD_PROP_PAR4:
1062 [ # # ]: 0 : rAny <<= OUString( aToolTip );
1063 : 0 : break;
1064 : : default:
1065 : : OSL_FAIL("illegal property");
1066 : : }
1067 : 6 : return true;
1068 : : }
1069 : :
1070 : 2 : bool SwInputField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
1071 : : {
1072 [ + - - - : 2 : switch( nWhichId )
- ]
1073 : : {
1074 : : case FIELD_PROP_PAR1:
1075 : 2 : rAny >>= aContent;
1076 : 2 : break;
1077 : : case FIELD_PROP_PAR2:
1078 : 0 : ::GetString( rAny, aPText );
1079 : 0 : break;
1080 : : case FIELD_PROP_PAR3:
1081 : 0 : ::GetString( rAny, aHelp );
1082 : 0 : break;
1083 : : case FIELD_PROP_PAR4:
1084 : 0 : ::GetString( rAny, aToolTip );
1085 : 0 : break;
1086 : : default:
1087 : : OSL_FAIL("illegal property");
1088 : : }
1089 : 2 : return true;
1090 : : }
1091 : : /*--------------------------------------------------------------------
1092 : : Beschreibung: Bedingung setzen
1093 : : --------------------------------------------------------------------*/
1094 : :
1095 : 0 : void SwInputField::SetPar1(const rtl::OUString& rStr)
1096 : : {
1097 : 0 : aContent = rStr;
1098 : 0 : }
1099 : :
1100 : 0 : const rtl::OUString& SwInputField::GetPar1() const
1101 : : {
1102 : 0 : return aContent;
1103 : : }
1104 : :
1105 : : /*--------------------------------------------------------------------
1106 : : Beschreibung: True/False Text
1107 : : --------------------------------------------------------------------*/
1108 : :
1109 : 0 : void SwInputField::SetPar2(const rtl::OUString& rStr)
1110 : : {
1111 : 0 : aPText = rStr;
1112 : 0 : }
1113 : :
1114 : 0 : rtl::OUString SwInputField::GetPar2() const
1115 : : {
1116 : 0 : return aPText;
1117 : : }
1118 : :
1119 : 14 : void SwInputField::SetHelp(const String & rStr)
1120 : : {
1121 : 14 : aHelp = rStr;
1122 : 14 : }
1123 : :
1124 : 0 : String SwInputField::GetHelp() const
1125 : : {
1126 : 0 : return aHelp;
1127 : : }
1128 : :
1129 : 14 : void SwInputField::SetToolTip(const String & rStr)
1130 : : {
1131 : 14 : aToolTip = rStr;
1132 : 14 : }
1133 : :
1134 : 0 : String SwInputField::GetToolTip() const
1135 : : {
1136 : 0 : return aToolTip;
1137 : : }
1138 : :
1139 : 0 : sal_Bool SwInputField::isFormField() const
1140 : : {
1141 [ # # ][ # # ]: 0 : return aHelp.Len() > 0 || aToolTip.Len() > 0;
1142 : : }
1143 : :
1144 : 12 : sal_uInt16 SwInputField::GetSubType() const
1145 : : {
1146 : 12 : return nSubType;
1147 : : }
1148 : :
1149 : 0 : void SwInputField::SetSubType(sal_uInt16 nSub)
1150 : : {
1151 : 0 : nSubType = nSub;
1152 : 0 : }
1153 : :
1154 : 6 : bool SwSetExpField::QueryValue( uno::Any& rAny, sal_uInt16 nWhichId ) const
1155 : : {
1156 [ - - - - : 6 : switch( nWhichId )
- + - + -
- - - - ]
1157 : : {
1158 : : case FIELD_PROP_BOOL2:
1159 : : {
1160 : 0 : sal_Bool bVal = 0 == (nSubType & nsSwExtendedSubType::SUB_INVISIBLE);
1161 [ # # ]: 0 : rAny.setValue(&bVal, ::getBooleanCppuType());
1162 : : }
1163 : 0 : break;
1164 : : case FIELD_PROP_FORMAT:
1165 [ # # ]: 0 : rAny <<= (sal_Int32)GetFormat();
1166 : 0 : break;
1167 : : case FIELD_PROP_USHORT2:
1168 [ # # ]: 0 : rAny <<= (sal_Int16)GetFormat();
1169 : 0 : break;
1170 : : case FIELD_PROP_USHORT1:
1171 [ # # ]: 0 : rAny <<= (sal_Int16)nSeqNo;
1172 : 0 : break;
1173 : : case FIELD_PROP_PAR1:
1174 [ # # ][ # # ]: 0 : rAny <<= OUString ( SwStyleNameMapper::GetProgName(GetPar1(), nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ) );
[ # # ]
1175 : 0 : break;
1176 : : case FIELD_PROP_PAR2:
1177 : : {
1178 : : //I18N - if the formula contains only "TypeName+1"
1179 : : //and it's one of the initially created sequence fields
1180 : : //then the localized names has to be replaced by a programmatic name
1181 [ + - ][ + - ]: 3 : OUString sMyFormula = SwXFieldMaster::LocalizeFormula(*this, GetFormula(), sal_True);
[ + - ][ + - ]
1182 [ + - ]: 3 : rAny <<= OUString( sMyFormula );
1183 : : }
1184 : 3 : break;
1185 : : case FIELD_PROP_DOUBLE:
1186 [ # # ]: 0 : rAny <<= (double)GetValue();
1187 : 0 : break;
1188 : : case FIELD_PROP_SUBTYPE:
1189 : : {
1190 : 3 : sal_Int16 nRet = 0;
1191 [ + - ]: 3 : nRet = lcl_SubTypeToAPI(GetSubType() & 0xff);
1192 [ + - ]: 3 : rAny <<= nRet;
1193 : : }
1194 : 3 : break;
1195 : : case FIELD_PROP_PAR3:
1196 [ # # ]: 0 : rAny <<= OUString( aPText );
1197 : 0 : break;
1198 : : case FIELD_PROP_BOOL3:
1199 : : {
1200 : 0 : sal_Bool bTmp = 0 != (nSubType & nsSwExtendedSubType::SUB_CMD);
1201 [ # # ]: 0 : rAny.setValue(&bTmp, ::getBooleanCppuType());
1202 : : }
1203 : 0 : break;
1204 : : case FIELD_PROP_BOOL1:
1205 : : {
1206 : 0 : sal_Bool bTmp = GetInputFlag();
1207 [ # # ]: 0 : rAny.setValue(&bTmp, ::getBooleanCppuType());
1208 : : }
1209 : 0 : break;
1210 : : case FIELD_PROP_PAR4:
1211 [ # # ]: 0 : rAny <<= rtl::OUString(GetExpStr());
1212 : 0 : break;
1213 : : default:
1214 : 0 : return SwField::QueryValue(rAny, nWhichId);
1215 : : }
1216 : 6 : return true;
1217 : : }
1218 : :
1219 : 0 : bool SwSetExpField::PutValue( const uno::Any& rAny, sal_uInt16 nWhichId )
1220 : : {
1221 : 0 : sal_Int32 nTmp32 = 0;
1222 : 0 : sal_Int16 nTmp16 = 0;
1223 [ # # ]: 0 : String sTmp;
1224 [ # # # # : 0 : switch( nWhichId )
# # # # #
# # # # ]
1225 : : {
1226 : : case FIELD_PROP_BOOL2:
1227 [ # # ]: 0 : if(*(sal_Bool*)rAny.getValue())
1228 : 0 : nSubType &= ~nsSwExtendedSubType::SUB_INVISIBLE;
1229 : : else
1230 : 0 : nSubType |= nsSwExtendedSubType::SUB_INVISIBLE;
1231 : 0 : break;
1232 : : case FIELD_PROP_FORMAT:
1233 : 0 : rAny >>= nTmp32;
1234 : 0 : SetFormat(nTmp32);
1235 : 0 : break;
1236 : : case FIELD_PROP_USHORT2:
1237 : : {
1238 : 0 : rAny >>= nTmp16;
1239 [ # # ]: 0 : if(nTmp16 <= SVX_NUMBER_NONE )
1240 : 0 : SetFormat(nTmp16);
1241 : : else {
1242 : : }
1243 : : }
1244 : 0 : break;
1245 : : case FIELD_PROP_USHORT1:
1246 : 0 : rAny >>= nTmp16;
1247 : 0 : nSeqNo = nTmp16;
1248 : 0 : break;
1249 : : case FIELD_PROP_PAR1:
1250 : : SetPar1( SwStyleNameMapper::GetUIName(
1251 [ # # ][ # # ]: 0 : ::GetString( rAny, sTmp ), nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL ) );
[ # # ][ # # ]
1252 : 0 : break;
1253 : : case FIELD_PROP_PAR2:
1254 : : {
1255 : 0 : OUString uTmp;
1256 : 0 : rAny >>= uTmp;
1257 : : //I18N - if the formula contains only "TypeName+1"
1258 : : //and it's one of the initially created sequence fields
1259 : : //then the localized names has to be replaced by a programmatic name
1260 [ # # ]: 0 : OUString sMyFormula = SwXFieldMaster::LocalizeFormula(*this, uTmp, sal_False);
1261 [ # # ][ # # ]: 0 : SetFormula( sMyFormula );
[ # # ]
1262 : : }
1263 : 0 : break;
1264 : : case FIELD_PROP_DOUBLE:
1265 : : {
1266 : 0 : double fVal = 0.0;
1267 : 0 : rAny >>= fVal;
1268 [ # # ]: 0 : SetValue(fVal);
1269 : : }
1270 : 0 : break;
1271 : : case FIELD_PROP_SUBTYPE:
1272 : 0 : nTmp32 = lcl_APIToSubType(rAny);
1273 [ # # ]: 0 : if(nTmp32 >= 0)
1274 [ # # ][ # # ]: 0 : SetSubType(static_cast<sal_uInt16>((GetSubType() & 0xff00) | nTmp32));
1275 : 0 : break;
1276 : : case FIELD_PROP_PAR3:
1277 [ # # ]: 0 : ::GetString( rAny, aPText );
1278 : 0 : break;
1279 : : case FIELD_PROP_BOOL3:
1280 [ # # ]: 0 : if(*(sal_Bool*) rAny.getValue())
1281 : 0 : nSubType |= nsSwExtendedSubType::SUB_CMD;
1282 : : else
1283 : 0 : nSubType &= (~nsSwExtendedSubType::SUB_CMD);
1284 : 0 : break;
1285 : : case FIELD_PROP_BOOL1:
1286 : 0 : SetInputFlag(*(sal_Bool*) rAny.getValue());
1287 : 0 : break;
1288 : : case FIELD_PROP_PAR4:
1289 [ # # ][ # # ]: 0 : ChgExpStr( ::GetString( rAny, sTmp ));
1290 : 0 : break;
1291 : : default:
1292 [ # # ]: 0 : return SwField::PutValue(rAny, nWhichId);
1293 : : }
1294 [ # # ]: 0 : return true;
1295 : : }
1296 : :
1297 : :
1298 : :
1299 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|