xref: /trunk/main/sw/source/core/fields/authfld.cxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_sw.hxx"
30 
31 
32 #define _SVSTDARR_STRINGSDTOR
33 #define _SVSTDARR_USHORTS
34 #define _SVSTDARR_LONGS
35 #define _SVSTDARR_ULONGS
36 #include <hintids.hxx>
37 
38 #include <svl/svstdarr.hxx>
39 #include <editeng/unolingu.hxx>
40 #include <editeng/langitem.hxx>
41 #include <swtypes.hxx>
42 #include <tools/resid.hxx>
43 #include <comcore.hrc>
44 #include <authfld.hxx>
45 #include <expfld.hxx>
46 #include <pam.hxx>
47 #include <cntfrm.hxx>
48 #include <tox.hxx>
49 #include <txmsrt.hxx>
50 #include <doctxm.hxx>
51 #include <fmtfld.hxx>
52 #include <txtfld.hxx>
53 #include <ndtxt.hxx>
54 #include <doc.hxx>
55 #include <unofldmid.h>
56 #include <unoprnms.hxx>
57 #include <switerator.hxx>
58 #include <unomid.h>
59 
60 using namespace ::com::sun::star::uno;
61 using namespace ::com::sun::star::beans;
62 using namespace ::com::sun::star::lang;
63 using rtl::OUString;
64 
65 
66 typedef SwAuthEntry* SwAuthEntryPtr;
67 SV_DECL_PTRARR_DEL( SwAuthDataArr, SwAuthEntryPtr, 5, 5 )
68 SV_IMPL_PTRARR( SwAuthDataArr, SwAuthEntryPtr )
69 
70 
71 typedef SwTOXSortKey* TOXSortKeyPtr;
72 SV_DECL_PTRARR_DEL( SortKeyArr, TOXSortKeyPtr, 5, 5 )
73 SV_IMPL_PTRARR( SortKeyArr, TOXSortKeyPtr )
74 
75 
76 SwAuthEntry::SwAuthEntry(const SwAuthEntry& rCopy)
77     : nRefCount(0)
78 {
79     for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
80         aAuthFields[i] = rCopy.aAuthFields[i];
81 }
82 // --------------------------------------------------------
83 sal_Bool    SwAuthEntry::operator==(const SwAuthEntry& rComp)
84 {
85     for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
86         if(aAuthFields[i] != rComp.aAuthFields[i])
87             return sal_False;
88     return sal_True;
89 }
90 // --------------------------------------------------------
91 SwAuthorityFieldType::SwAuthorityFieldType(SwDoc* pDoc)
92     : SwFieldType( RES_AUTHORITY ),
93     m_pDoc(pDoc),
94     m_pDataArr(new SwAuthDataArr ),
95     m_pSequArr(new SvLongs(5, 5)),
96     m_pSortKeyArr(new SortKeyArr(3, 3)),
97     m_cPrefix('['),
98     m_cSuffix(']'),
99     m_bIsSequence(sal_False),
100     m_bSortByDocument(sal_True),
101     m_eLanguage((LanguageType)::GetAppLanguage())
102 {
103 }
104 
105 SwAuthorityFieldType::SwAuthorityFieldType( const SwAuthorityFieldType& rFType)
106     : SwFieldType( RES_AUTHORITY ),
107     m_pDataArr(new SwAuthDataArr ),
108     m_pSequArr(new SvLongs(5, 5)),
109     m_pSortKeyArr(new SortKeyArr(3, 3)),
110     m_cPrefix(rFType.m_cPrefix),
111     m_cSuffix(rFType.m_cSuffix),
112     m_bIsSequence(rFType.m_bIsSequence),
113     m_bSortByDocument(rFType.m_bSortByDocument),
114     m_eLanguage(rFType.m_eLanguage),
115     m_sSortAlgorithm(rFType.m_sSortAlgorithm)
116 {
117     for(sal_uInt16 i = 0; i < rFType.m_pSortKeyArr->Count(); i++)
118         m_pSortKeyArr->Insert((*rFType.m_pSortKeyArr)[i], i);
119 }
120 
121 SwAuthorityFieldType::~SwAuthorityFieldType()
122 {
123 //  DBG_ASSERT(!m_pDataArr->Count(), "Array is not empty");
124     m_pSortKeyArr->DeleteAndDestroy(0, m_pSortKeyArr->Count());
125     delete m_pSortKeyArr;
126     delete m_pSequArr;
127     delete m_pDataArr;
128 }
129 
130 SwFieldType*    SwAuthorityFieldType::Copy()  const
131 {
132     return new SwAuthorityFieldType(m_pDoc);
133 }
134 
135 void    SwAuthorityFieldType::RemoveField(long nHandle)
136 {
137 #ifdef DBG_UTIL
138     sal_Bool bRemoved = sal_False;
139 #endif
140     for(sal_uInt16 j = 0; j < m_pDataArr->Count(); j++)
141     {
142         SwAuthEntry* pTemp = m_pDataArr->GetObject(j);
143         long nRet = (long)(void*)pTemp;
144         if(nRet == nHandle)
145         {
146 #ifdef DBG_UTIL
147             bRemoved = sal_True;
148 #endif
149             pTemp->RemoveRef();
150             if(!pTemp->GetRefCount())
151             {
152                 m_pDataArr->DeleteAndDestroy(j, 1);
153                 //re-generate positions of the fields
154                 DelSequenceArray();
155             }
156             break;
157         }
158     }
159 #ifdef DBG_UTIL
160     DBG_ASSERT(bRemoved, "Field unknown" );
161 #endif
162 }
163 
164 long    SwAuthorityFieldType::AddField(const String& rFieldContents)
165 {
166     long nRet = 0;
167     SwAuthEntry* pEntry = new SwAuthEntry;
168     for( sal_uInt16 i = 0; i < AUTH_FIELD_END; ++i )
169         pEntry->SetAuthorField( (ToxAuthorityField)i,
170                         rFieldContents.GetToken( i, TOX_STYLE_DELIMITER ));
171 
172     for(sal_uInt16 j = 0; j < m_pDataArr->Count() && pEntry; j++)
173     {
174         SwAuthEntry* pTemp = m_pDataArr->GetObject(j);
175         if(*pTemp == *pEntry)
176         {
177             DELETEZ(pEntry);
178             nRet = (long)(void*)pTemp;
179             pTemp->AddRef();
180         }
181     }
182     //if it is a new Entry - insert
183     if(pEntry)
184     {
185         nRet = (long)(void*)pEntry;
186         pEntry->AddRef();
187         m_pDataArr->Insert(pEntry, m_pDataArr->Count());
188         //re-generate positions of the fields
189         DelSequenceArray();
190     }
191     return nRet;
192 }
193 
194 sal_Bool SwAuthorityFieldType::AddField(long nHandle)
195 {
196     sal_Bool bRet = sal_False;
197     for( sal_uInt16 j = 0; j < m_pDataArr->Count(); j++ )
198     {
199         SwAuthEntry* pTemp = m_pDataArr->GetObject(j);
200         long nTmp = (long)(void*)pTemp;
201         if( nTmp == nHandle )
202         {
203             bRet = sal_True;
204             pTemp->AddRef();
205             //re-generate positions of the fields
206             DelSequenceArray();
207             break;
208         }
209     }
210     DBG_ASSERT(bRet, "::AddField(long) failed");
211     return bRet;
212 }
213 
214 const SwAuthEntry*  SwAuthorityFieldType::GetEntryByHandle(long nHandle) const
215 {
216     const SwAuthEntry* pRet = 0;
217     for(sal_uInt16 j = 0; j < m_pDataArr->Count(); j++)
218     {
219         const SwAuthEntry* pTemp = m_pDataArr->GetObject(j);
220         long nTmp = (long)(void*)pTemp;
221         if( nTmp == nHandle )
222         {
223             pRet = pTemp;
224             break;
225         }
226     }
227     ASSERT( pRet, "invalid Handle" );
228     return pRet;
229 }
230 
231 void SwAuthorityFieldType::GetAllEntryIdentifiers(
232                 SvStringsDtor& rToFill )const
233 {
234     for(sal_uInt16 j = 0; j < m_pDataArr->Count(); j++)
235     {
236         SwAuthEntry* pTemp = m_pDataArr->GetObject(j);
237         rToFill.Insert( new String( pTemp->GetAuthorField(
238                     AUTH_FIELD_IDENTIFIER )), rToFill.Count() );
239     }
240 }
241 
242 const SwAuthEntry*  SwAuthorityFieldType::GetEntryByIdentifier(
243                                 const String& rIdentifier)const
244 {
245     const SwAuthEntry* pRet = 0;
246     for( sal_uInt16 j = 0; j < m_pDataArr->Count(); ++j )
247     {
248         const SwAuthEntry* pTemp = m_pDataArr->GetObject(j);
249         if( rIdentifier == pTemp->GetAuthorField( AUTH_FIELD_IDENTIFIER ))
250         {
251             pRet = pTemp;
252             break;
253         }
254     }
255     return pRet;
256 }
257 
258 bool SwAuthorityFieldType::ChangeEntryContent(const SwAuthEntry* pNewEntry)
259 {
260     bool bChanged = false;
261     for( sal_uInt16 j = 0; j < m_pDataArr->Count(); ++j )
262     {
263         SwAuthEntry* pTemp = m_pDataArr->GetObject(j);
264         if(pTemp->GetAuthorField(AUTH_FIELD_IDENTIFIER) ==
265                     pNewEntry->GetAuthorField(AUTH_FIELD_IDENTIFIER))
266         {
267             for(sal_uInt16 i = 0; i < AUTH_FIELD_END; i++)
268                 pTemp->SetAuthorField((ToxAuthorityField) i,
269                     pNewEntry->GetAuthorField((ToxAuthorityField)i));
270             bChanged = true;
271             break;
272         }
273     }
274     return bChanged;
275 }
276 
277 /*-------------------------------------------------------------------------
278   appends a new entry (if new) and returns the array position
279   -----------------------------------------------------------------------*/
280 sal_uInt16  SwAuthorityFieldType::AppendField( const SwAuthEntry& rInsert )
281 {
282     sal_uInt16 nRet = 0;
283     for( nRet = 0; nRet < m_pDataArr->Count(); ++nRet )
284     {
285         SwAuthEntry* pTemp = m_pDataArr->GetObject( nRet );
286         if( *pTemp == rInsert )
287         {
288             break;
289             //ref count unchanged
290         }
291     }
292 
293     //if it is a new Entry - insert
294     if( nRet == m_pDataArr->Count() )
295         m_pDataArr->Insert( new SwAuthEntry( rInsert ), nRet );
296 
297     return nRet;
298 }
299 
300 long    SwAuthorityFieldType::GetHandle(sal_uInt16 nPos)
301 {
302     long nRet = 0;
303     if( nPos < m_pDataArr->Count() )
304     {
305         SwAuthEntry* pTemp = m_pDataArr->GetObject(nPos);
306         nRet = (long)(void*)pTemp;
307     }
308     return nRet;
309 }
310 
311 sal_uInt16  SwAuthorityFieldType::GetSequencePos(long nHandle)
312 {
313     //find the field in a sorted array of handles,
314 #ifdef DBG_UTIL
315     sal_Bool bCurrentFieldWithoutTextNode = sal_False;
316 #endif
317     if(m_pSequArr->Count() && m_pSequArr->Count() != m_pDataArr->Count())
318         DelSequenceArray();
319     if(!m_pSequArr->Count())
320     {
321         SwTOXSortTabBases aSortArr;
322         SwIterator<SwFmtFld,SwFieldType> aIter( *this );
323 
324         SwTOXInternational aIntl(m_eLanguage, 0, m_sSortAlgorithm);
325 
326         for( SwFmtFld* pFmtFld = aIter.First(); pFmtFld; pFmtFld = aIter.Next() )
327         {
328             const SwTxtFld* pTxtFld = pFmtFld->GetTxtFld();
329             if(!pTxtFld || !pTxtFld->GetpTxtNode())
330             {
331 #ifdef DBG_UTIL
332                 if(nHandle == ((SwAuthorityField*)pFmtFld->GetFld())->GetHandle())
333                     bCurrentFieldWithoutTextNode = sal_True;
334 #endif
335                 continue;
336             }
337             const SwTxtNode& rFldTxtNode = pTxtFld->GetTxtNode();
338             SwPosition aFldPos(rFldTxtNode);
339             SwDoc& rDoc = *(SwDoc*)rFldTxtNode.GetDoc();
340             SwCntntFrm *pFrm = rFldTxtNode.getLayoutFrm( rDoc.GetCurrentLayout() );
341             const SwTxtNode* pTxtNode = 0;
342             if(pFrm && !pFrm->IsInDocBody())
343                 pTxtNode = GetBodyTxtNode( rDoc, aFldPos, *pFrm );
344             //if no text node could be found or the field is in the document
345             //body the directly available text node will be used
346             if(!pTxtNode)
347                 pTxtNode = &rFldTxtNode;
348             if( pTxtNode->GetTxt().Len() && pTxtNode->getLayoutFrm( rDoc.GetCurrentLayout() ) &&
349                 pTxtNode->GetNodes().IsDocNodes() )
350             {
351                 SwTOXAuthority* pNew = new SwTOXAuthority( *pTxtNode,
352                                                             *pFmtFld, aIntl );
353 
354                 for(short i = 0; i < aSortArr.Count(); ++i)
355                 {
356                     SwTOXSortTabBase* pOld = aSortArr[i];
357                     if(*pOld == *pNew)
358                     {
359                         //only the first occurence in the document
360                         //has to be in the array
361                         if(*pOld < *pNew)
362                             DELETEZ(pNew);
363                         else // remove the old content
364                             aSortArr.DeleteAndDestroy( i, 1 );
365                         break;
366                     }
367                 }
368                 //if it still exists - insert at the correct position
369                 if(pNew)
370                 {
371                     short j;
372 
373                     for( j = 0; j < aSortArr.Count(); ++j)
374                     {
375                         SwTOXSortTabBase* pOld = aSortArr[j];
376                         if(*pNew < *pOld)
377                             break;
378                     }
379                     aSortArr.Insert(pNew, j );
380                 }
381             }
382         }
383 
384         for(sal_uInt16 i = 0; i < aSortArr.Count(); i++)
385         {
386             const SwTOXSortTabBase& rBase = *aSortArr[i];
387             SwFmtFld& rFmtFld = ((SwTOXAuthority&)rBase).GetFldFmt();
388             SwAuthorityField* pAFld = (SwAuthorityField*)rFmtFld.GetFld();
389             m_pSequArr->Insert(pAFld->GetHandle(), i);
390         }
391         aSortArr.DeleteAndDestroy(0, aSortArr.Count());
392     }
393     //find nHandle
394     sal_uInt16 nRet = 0;
395     for(sal_uInt16 i = 0; i < m_pSequArr->Count(); i++)
396     {
397         if((*m_pSequArr)[i] == nHandle)
398         {
399             nRet = i + 1;
400             break;
401         }
402     }
403     ASSERT(bCurrentFieldWithoutTextNode || nRet, "Handle not found")
404     return nRet;
405 }
406 
407 sal_Bool    SwAuthorityFieldType::QueryValue( Any& rVal, sal_uInt16 nWhichId ) const
408 {
409     switch( nWhichId )
410     {
411     case FIELD_PROP_PAR1:
412     case FIELD_PROP_PAR2:
413         {
414             OUString sVal;
415             sal_Unicode uRet = FIELD_PROP_PAR1 == nWhichId ? m_cPrefix : m_cSuffix;
416             if(uRet)
417                 sVal = OUString(uRet);
418             rVal <<= sVal;
419         }
420         break;
421     case FIELD_PROP_PAR3:
422         rVal <<= OUString(GetSortAlgorithm());
423         break;
424 
425     case FIELD_PROP_BOOL1:
426     case FIELD_PROP_BOOL2:
427         {
428             sal_Bool bVal = FIELD_PROP_BOOL1 == nWhichId ? m_bIsSequence: m_bSortByDocument;
429             rVal.setValue(&bVal, ::getBooleanCppuType());
430         }
431         break;
432 
433     case FIELD_PROP_LOCALE:
434         rVal <<= SvxCreateLocale(GetLanguage());
435         break;
436 
437     case FIELD_PROP_PROP_SEQ:
438         {
439             Sequence<PropertyValues> aRet(m_pSortKeyArr->Count());
440             PropertyValues* pValues = aRet.getArray();
441             OUString sProp1( C2U(SW_PROP_NAME_STR(UNO_NAME_SORT_KEY)) ),
442                      sProp2( C2U(SW_PROP_NAME_STR(UNO_NAME_IS_SORT_ASCENDING)));
443             for(sal_uInt16 i = 0; i < m_pSortKeyArr->Count(); i++)
444             {
445                 const SwTOXSortKey* pKey = (*m_pSortKeyArr)[i];
446                 pValues[i].realloc(2);
447                 PropertyValue* pValue = pValues[i].getArray();
448                 pValue[0].Name = sProp1;
449                 pValue[0].Value <<= sal_Int16(pKey->eField);
450                 pValue[1].Name = sProp2;
451                 pValue[1].Value.setValue(&pKey->bSortAscending, ::getBooleanCppuType());
452             }
453             rVal <<= aRet;
454         }
455         break;
456     default:
457         DBG_ERROR("illegal property");
458     }
459     return sal_True;
460 }
461 
462 sal_Bool    SwAuthorityFieldType::PutValue( const Any& rAny, sal_uInt16 nWhichId )
463 {
464     sal_Bool bRet = sal_True;
465     String sTmp;
466     switch( nWhichId )
467     {
468     case FIELD_PROP_PAR1:
469     case FIELD_PROP_PAR2:
470     {
471         ::GetString( rAny, sTmp );
472         sal_Unicode uSet = sTmp.GetChar(0);
473         if( FIELD_PROP_PAR1 == nWhichId )
474             m_cPrefix = uSet;
475         else
476             m_cSuffix = uSet;
477     }
478     break;
479     case FIELD_PROP_PAR3:
480         SetSortAlgorithm( ::GetString( rAny, sTmp ));
481         break;
482 
483     case FIELD_PROP_BOOL1:
484         m_bIsSequence = *(sal_Bool*)rAny.getValue();
485         break;
486     case FIELD_PROP_BOOL2:
487         m_bSortByDocument = *(sal_Bool*)rAny.getValue();
488         break;
489 
490     case FIELD_PROP_LOCALE:
491         {
492             Locale aLocale;
493             if( 0 != (bRet = rAny >>= aLocale ))
494                 SetLanguage( SvxLocaleToLanguage( aLocale ));
495         }
496         break;
497 
498     case FIELD_PROP_PROP_SEQ:
499         {
500             Sequence<PropertyValues> aSeq;
501             if( 0 != (bRet = rAny >>= aSeq) )
502             {
503                 m_pSortKeyArr->DeleteAndDestroy(0, m_pSortKeyArr->Count());
504                 const PropertyValues* pValues = aSeq.getConstArray();
505                 for(sal_Int32 i = 0; i < aSeq.getLength() && i < USHRT_MAX / 4; i++)
506                 {
507                     const PropertyValue* pValue = pValues[i].getConstArray();
508                     SwTOXSortKey* pSortKey = new SwTOXSortKey;
509                     for(sal_Int32 j = 0; j < pValues[i].getLength(); j++)
510                     {
511                         if(pValue[j].Name.equalsAsciiL(SW_PROP_NAME(UNO_NAME_SORT_KEY)))
512                         {
513                             sal_Int16 nVal = -1; pValue[j].Value >>= nVal;
514                             if(nVal >= 0 && nVal < AUTH_FIELD_END)
515                                 pSortKey->eField = (ToxAuthorityField) nVal;
516                             else
517                                 bRet = sal_False;
518                         }
519                         else if(pValue[j].Name.equalsAsciiL(SW_PROP_NAME(UNO_NAME_IS_SORT_ASCENDING)))
520                         {
521                             pSortKey->bSortAscending = *(sal_Bool*)pValue[j].Value.getValue();
522                         }
523                     }
524                     m_pSortKeyArr->Insert(pSortKey, m_pSortKeyArr->Count());
525                 }
526             }
527         }
528         break;
529     default:
530         DBG_ERROR("illegal property");
531     }
532     return bRet;
533 }
534 
535 void SwAuthorityFieldType::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew )
536 {
537     //re-generate positions of the fields
538     DelSequenceArray();
539     NotifyClients( pOld, pNew );
540 }
541 
542 sal_uInt16 SwAuthorityFieldType::GetSortKeyCount() const
543 {
544     return m_pSortKeyArr->Count();
545 }
546 
547 const SwTOXSortKey*  SwAuthorityFieldType::GetSortKey(sal_uInt16 nIdx) const
548 {
549     SwTOXSortKey* pRet = 0;
550     if(m_pSortKeyArr->Count() > nIdx)
551         pRet = (*m_pSortKeyArr)[nIdx];
552     DBG_ASSERT(pRet, "Sort key not found");
553     return pRet;
554 }
555 
556 void SwAuthorityFieldType::SetSortKeys(sal_uInt16 nKeyCount, SwTOXSortKey aKeys[])
557 {
558     m_pSortKeyArr->DeleteAndDestroy(0, m_pSortKeyArr->Count());
559     sal_uInt16 nArrIdx = 0;
560     for(sal_uInt16 i = 0; i < nKeyCount; i++)
561         if(aKeys[i].eField < AUTH_FIELD_END)
562             m_pSortKeyArr->Insert(new SwTOXSortKey(aKeys[i]), nArrIdx++);
563 }
564 
565 SwAuthorityField::SwAuthorityField( SwAuthorityFieldType* pInitType,
566                                     const String& rFieldContents )
567     : SwField(pInitType),
568     m_nTempSequencePos( -1 )
569 {
570     m_nHandle = pInitType->AddField( rFieldContents );
571 }
572 
573 SwAuthorityField::SwAuthorityField( SwAuthorityFieldType* pInitType,
574                                                 long nSetHandle )
575     : SwField( pInitType ),
576     m_nHandle( nSetHandle ),
577     m_nTempSequencePos( -1 )
578 {
579     pInitType->AddField( m_nHandle );
580 }
581 
582 SwAuthorityField::~SwAuthorityField()
583 {
584     ((SwAuthorityFieldType* )GetTyp())->RemoveField(m_nHandle);
585 }
586 
587 String  SwAuthorityField::Expand() const
588 {
589     SwAuthorityFieldType* pAuthType = (SwAuthorityFieldType*)GetTyp();
590     String sRet;
591     if(pAuthType->GetPrefix())
592         sRet.Assign(pAuthType->GetPrefix());
593 
594     if( pAuthType->IsSequence() )
595     {
596        if(!pAuthType->GetDoc()->IsExpFldsLocked())
597            m_nTempSequencePos = pAuthType->GetSequencePos( m_nHandle );
598        if( m_nTempSequencePos >= 0 )
599            sRet += String::CreateFromInt32( m_nTempSequencePos );
600     }
601     else
602     {
603         const SwAuthEntry* pEntry = pAuthType->GetEntryByHandle(m_nHandle);
604         //TODO: Expand to: identifier, number sequence, ...
605         if(pEntry)
606             sRet += pEntry->GetAuthorField(AUTH_FIELD_IDENTIFIER);
607     }
608     if(pAuthType->GetSuffix())
609         sRet += pAuthType->GetSuffix();
610     return sRet;
611 }
612 
613 SwField* SwAuthorityField::Copy() const
614 {
615     SwAuthorityFieldType* pAuthType = (SwAuthorityFieldType*)GetTyp();
616     return new SwAuthorityField(pAuthType, m_nHandle);
617 }
618 
619 const String&   SwAuthorityField::GetFieldText(ToxAuthorityField eField) const
620 {
621     SwAuthorityFieldType* pAuthType = (SwAuthorityFieldType*)GetTyp();
622     const SwAuthEntry* pEntry = pAuthType->GetEntryByHandle( m_nHandle );
623     return pEntry->GetAuthorField( eField );
624 }
625 
626 void    SwAuthorityField::SetPar1(const String& rStr)
627 {
628     SwAuthorityFieldType* pInitType = (SwAuthorityFieldType* )GetTyp();
629     pInitType->RemoveField(m_nHandle);
630     m_nHandle = pInitType->AddField(rStr);
631 }
632 
633 String SwAuthorityField::GetDescription() const
634 {
635     return SW_RES(STR_AUTHORITY_ENTRY);
636 }
637 
638 
639 const char* aFieldNames[] =
640 {
641     "Identifier",
642     "BibiliographicType",
643     "Address",
644     "Annote",
645     "Author",
646     "Booktitle",
647     "Chapter",
648     "Edition",
649     "Editor",
650     "Howpublished",
651     "Institution",
652     "Journal",
653     "Month",
654     "Note",
655     "Number",
656     "Organizations",
657     "Pages",
658     "Publisher",
659     "School",
660     "Series",
661     "Title",
662     "Report_Type",
663     "Volume",
664     "Year",
665     "URL",
666     "Custom1",
667     "Custom2",
668     "Custom3",
669     "Custom4",
670     "Custom5",
671     "ISBN"
672 };
673 
674 sal_Bool    SwAuthorityField::QueryValue( Any& rAny, sal_uInt16 /*nWhichId*/ ) const
675 {
676     if(!GetTyp())
677         return sal_False;
678     const SwAuthEntry* pAuthEntry = ((SwAuthorityFieldType*)GetTyp())->GetEntryByHandle(m_nHandle);
679     if(!pAuthEntry)
680         return sal_False;
681     Sequence <PropertyValue> aRet(AUTH_FIELD_END);
682     PropertyValue* pValues = aRet.getArray();
683     for(sal_Int16 i = 0; i < AUTH_FIELD_END; i++)
684     {
685         pValues[i].Name = C2U(aFieldNames[i]);
686         const String& rField = pAuthEntry->GetAuthorField((ToxAuthorityField) i);
687         if(i == AUTH_FIELD_AUTHORITY_TYPE)
688             pValues[i].Value <<= sal_Int16(rField.ToInt32());
689         else
690             pValues[i].Value <<= OUString(rField);
691     }
692     rAny <<= aRet;
693     return sal_False;
694 }
695 
696 sal_Int16 lcl_Find(const OUString& rFieldName)
697 {
698     for(sal_Int16 i = 0; i < AUTH_FIELD_END; i++)
699         if(!rFieldName.compareToAscii(aFieldNames[i]))
700             return i;
701     return -1;
702 }
703 //----------------------------------------------------------------------------
704 sal_Bool    SwAuthorityField::PutValue( const Any& rAny, sal_uInt16 /*nWhichId*/ )
705 {
706     if(!GetTyp() || !((SwAuthorityFieldType*)GetTyp())->GetEntryByHandle(m_nHandle))
707         return sal_False;
708 
709     Sequence <PropertyValue> aParam;
710     if(!(rAny >>= aParam))
711         return sal_False;
712 
713     String sToSet;
714     sToSet.Fill(AUTH_FIELD_ISBN, TOX_STYLE_DELIMITER);
715     const PropertyValue* pParam = aParam.getConstArray();
716     for(sal_Int32 i = 0; i < aParam.getLength(); i++)
717     {
718         sal_Int16 nFound = lcl_Find(pParam[i].Name);
719         if(nFound >= 0)
720         {
721             OUString sContent;
722             if(AUTH_FIELD_AUTHORITY_TYPE == nFound)
723             {
724                 sal_Int16 nVal = 0;
725                 pParam[i].Value >>= nVal;
726                 sContent = OUString::valueOf((sal_Int32)nVal);
727             }
728             else
729                 pParam[i].Value >>= sContent;
730             sToSet.SetToken(nFound, TOX_STYLE_DELIMITER, sContent);
731         }
732     }
733 
734     ((SwAuthorityFieldType*)GetTyp())->RemoveField(m_nHandle);
735     m_nHandle = ((SwAuthorityFieldType*)GetTyp())->AddField(sToSet);
736 
737     return sal_False;
738 }
739 
740 SwFieldType* SwAuthorityField::ChgTyp( SwFieldType* pFldTyp )
741 {
742     SwAuthorityFieldType* pSrcTyp = (SwAuthorityFieldType*)GetTyp(),
743                         * pDstTyp = (SwAuthorityFieldType*)pFldTyp;
744     if( pSrcTyp != pDstTyp )
745     {
746 
747         const SwAuthEntry* pEntry = pSrcTyp->GetEntryByHandle( m_nHandle );
748         sal_uInt16 nHdlPos = pDstTyp->AppendField( *pEntry );
749         pSrcTyp->RemoveField( m_nHandle );
750         m_nHandle = pDstTyp->GetHandle( nHdlPos );
751         pDstTyp->AddField( m_nHandle );
752         SwField::ChgTyp( pFldTyp );
753     }
754     return pSrcTyp;
755 }
756 
757