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