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