xref: /AOO41X/main/sw/source/core/fields/ddefld.cxx (revision efeef26f81c84063fb0a91bde3856d4a51172d90)
1*efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*efeef26fSAndrew Rist  * distributed with this work for additional information
6*efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9*efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15*efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17*efeef26fSAndrew Rist  * specific language governing permissions and limitations
18*efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*efeef26fSAndrew Rist  *************************************************************/
21*efeef26fSAndrew Rist 
22*efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <sfx2/linkmgr.hxx>
29cdf0e10cSrcweir #include <doc.hxx>
30cdf0e10cSrcweir #include <editsh.hxx>
31cdf0e10cSrcweir #include <errhdl.hxx>
32cdf0e10cSrcweir #include <ndtxt.hxx>
33cdf0e10cSrcweir #include <fmtfld.hxx>
34cdf0e10cSrcweir #include <txtfld.hxx>
35cdf0e10cSrcweir #include <ddefld.hxx>
36cdf0e10cSrcweir #include <swtable.hxx>
37cdf0e10cSrcweir #include <swbaslnk.hxx>
38cdf0e10cSrcweir #include <swddetbl.hxx>
39cdf0e10cSrcweir #include <unofldmid.h>
40cdf0e10cSrcweir #include <hints.hxx>
41cdf0e10cSrcweir 
42cdf0e10cSrcweir using rtl::OUString;
43cdf0e10cSrcweir using namespace ::com::sun::star;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir #define DDE_TXT_ENCODING 	gsl_getSystemTextEncoding()
46cdf0e10cSrcweir 
47cdf0e10cSrcweir /*--------------------------------------------------------------------
48cdf0e10cSrcweir 	Beschreibung: Globale Variablen
49cdf0e10cSrcweir  --------------------------------------------------------------------*/
50cdf0e10cSrcweir 
51cdf0e10cSrcweir class SwIntrnlRefLink : public SwBaseLink
52cdf0e10cSrcweir {
53cdf0e10cSrcweir 	SwDDEFieldType& rFldType;
54cdf0e10cSrcweir public:
SwIntrnlRefLink(SwDDEFieldType & rType,sal_uInt16 nUpdateType,sal_uInt16 nFmt)55cdf0e10cSrcweir 	SwIntrnlRefLink( SwDDEFieldType& rType, sal_uInt16 nUpdateType, sal_uInt16 nFmt )
56cdf0e10cSrcweir 		: SwBaseLink( nUpdateType, nFmt ),
57cdf0e10cSrcweir 		rFldType( rType )
58cdf0e10cSrcweir 	{}
59cdf0e10cSrcweir 
60cdf0e10cSrcweir 	virtual void Closed();
61cdf0e10cSrcweir 	virtual void DataChanged( const String& rMimeType,
62cdf0e10cSrcweir                                 const uno::Any & rValue );
63cdf0e10cSrcweir 
64cdf0e10cSrcweir 	virtual const SwNode* GetAnchor() const;
65cdf0e10cSrcweir 	virtual sal_Bool IsInRange( sal_uLong nSttNd, sal_uLong nEndNd, xub_StrLen nStt = 0,
66cdf0e10cSrcweir 							xub_StrLen nEnd = STRING_NOTFOUND ) const;
67cdf0e10cSrcweir };
68cdf0e10cSrcweir 
69cdf0e10cSrcweir 
DataChanged(const String & rMimeType,const uno::Any & rValue)70cdf0e10cSrcweir void SwIntrnlRefLink::DataChanged( const String& rMimeType,
71cdf0e10cSrcweir                                 const uno::Any & rValue )
72cdf0e10cSrcweir {
73cdf0e10cSrcweir 	switch( SotExchange::GetFormatIdFromMimeType( rMimeType ) )
74cdf0e10cSrcweir 	{
75cdf0e10cSrcweir 	case FORMAT_STRING:
76cdf0e10cSrcweir 		if( !IsNoDataFlag() )
77cdf0e10cSrcweir 		{
78cdf0e10cSrcweir             uno::Sequence< sal_Int8 > aSeq;
79cdf0e10cSrcweir 			rValue >>= aSeq;
80cdf0e10cSrcweir 			String sStr( (sal_Char*)aSeq.getConstArray(), static_cast<xub_StrLen>(aSeq.getLength()),
81cdf0e10cSrcweir 							   DDE_TXT_ENCODING	 );
82cdf0e10cSrcweir 
83cdf0e10cSrcweir 			// CR-LF am Ende entfernen, ist ueberfluessig!
84cdf0e10cSrcweir 			xub_StrLen n = sStr.Len();
85cdf0e10cSrcweir 			while( n && 0 == sStr.GetChar( n-1 ) )
86cdf0e10cSrcweir 				--n;
87cdf0e10cSrcweir 			if( n && 0x0a == sStr.GetChar( n-1 ) )
88cdf0e10cSrcweir 				--n;
89cdf0e10cSrcweir 			if( n && 0x0d == sStr.GetChar( n-1 ) )
90cdf0e10cSrcweir 				--n;
91cdf0e10cSrcweir 
92cdf0e10cSrcweir 			sal_Bool bDel = n != sStr.Len();
93cdf0e10cSrcweir 			if( bDel )
94cdf0e10cSrcweir 				sStr.Erase( n );
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 			rFldType.SetExpansion( sStr );
97cdf0e10cSrcweir 			// erst Expansion setzen! (sonst wird das Flag geloescht!)
98cdf0e10cSrcweir 			rFldType.SetCRLFDelFlag( bDel );
99cdf0e10cSrcweir 		}
100cdf0e10cSrcweir 		break;
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	// weitere Formate ...
103cdf0e10cSrcweir 	default:
104cdf0e10cSrcweir 		return;
105cdf0e10cSrcweir 	}
106cdf0e10cSrcweir 
107cdf0e10cSrcweir 	ASSERT( rFldType.GetDoc(), "Kein pDoc" );
108cdf0e10cSrcweir 
109cdf0e10cSrcweir 	// keine Abhaengigen mehr?
110cdf0e10cSrcweir 	if( rFldType.GetDepends() && !rFldType.IsModifyLocked() && !ChkNoDataFlag() )
111cdf0e10cSrcweir 	{
112cdf0e10cSrcweir 		ViewShell* pSh;
113cdf0e10cSrcweir 		SwEditShell* pESh = rFldType.GetDoc()->GetEditShell( &pSh );
114cdf0e10cSrcweir 
115cdf0e10cSrcweir 		// dann suchen wir uns mal alle Felder. Wird kein gueltiges
116cdf0e10cSrcweir 		// gefunden, dann Disconnecten wir uns!
117cdf0e10cSrcweir 		SwMsgPoolItem aUpdateDDE( RES_UPDATEDDETBL );
118cdf0e10cSrcweir 		int bCallModify = sal_False;
119cdf0e10cSrcweir 		rFldType.LockModify();
120cdf0e10cSrcweir 
121cdf0e10cSrcweir 		SwClientIter aIter( rFldType );     // TODO
122cdf0e10cSrcweir 		SwClient * pLast = aIter.GoStart();
123cdf0e10cSrcweir 		if( pLast ) 	// konnte zum Anfang gesprungen werden ??
124cdf0e10cSrcweir 			do {
125cdf0e10cSrcweir 				// eine DDE-Tabelle oder ein DDE-FeldAttribut im Text
126cdf0e10cSrcweir 				if( !pLast->IsA( TYPE( SwFmtFld ) ) ||
127cdf0e10cSrcweir 					((SwFmtFld*)pLast)->GetTxtFld() )
128cdf0e10cSrcweir 				{
129cdf0e10cSrcweir 					if( !bCallModify )
130cdf0e10cSrcweir 					{
131cdf0e10cSrcweir 						if( pESh )
132cdf0e10cSrcweir 							pESh->StartAllAction();
133cdf0e10cSrcweir 						else if( pSh )
134cdf0e10cSrcweir 							pSh->StartAction();
135cdf0e10cSrcweir 					}
136cdf0e10cSrcweir 					pLast->ModifyNotification( 0, &aUpdateDDE );
137cdf0e10cSrcweir 					bCallModify = sal_True;
138cdf0e10cSrcweir 				}
1392f121198SMathias Bauer 			} while( 0 != ( pLast = ++aIter ));
140cdf0e10cSrcweir 
141cdf0e10cSrcweir 		rFldType.UnlockModify();
142cdf0e10cSrcweir 
143cdf0e10cSrcweir 		if( bCallModify )
144cdf0e10cSrcweir 		{
145cdf0e10cSrcweir 			if( pESh )
146cdf0e10cSrcweir 				pESh->EndAllAction();
147cdf0e10cSrcweir 			else if( pSh )
148cdf0e10cSrcweir 				pSh->EndAction();
149cdf0e10cSrcweir 
150cdf0e10cSrcweir 			if( pSh )
151cdf0e10cSrcweir 				pSh->GetDoc()->SetModified();
152cdf0e10cSrcweir 		}
153cdf0e10cSrcweir 	}
154cdf0e10cSrcweir }
155cdf0e10cSrcweir 
Closed()156cdf0e10cSrcweir void SwIntrnlRefLink::Closed()
157cdf0e10cSrcweir {
158cdf0e10cSrcweir 	if( rFldType.GetDoc() && !rFldType.GetDoc()->IsInDtor() )
159cdf0e10cSrcweir 	{
160cdf0e10cSrcweir 		// Advise verabschiedet sich, alle Felder in Text umwandeln ?
161cdf0e10cSrcweir 		ViewShell* pSh;
162cdf0e10cSrcweir 		SwEditShell* pESh = rFldType.GetDoc()->GetEditShell( &pSh );
163cdf0e10cSrcweir 		if( pESh )
164cdf0e10cSrcweir 		{
165cdf0e10cSrcweir 			pESh->StartAllAction();
166cdf0e10cSrcweir 			pESh->FieldToText( &rFldType );
167cdf0e10cSrcweir 			pESh->EndAllAction();
168cdf0e10cSrcweir 		}
169cdf0e10cSrcweir 		else
170cdf0e10cSrcweir 		{
171cdf0e10cSrcweir 			pSh->StartAction();
172cdf0e10cSrcweir 			// am Doc aufrufen ??
173cdf0e10cSrcweir 			pSh->EndAction();
174cdf0e10cSrcweir 		}
175cdf0e10cSrcweir 	}
176cdf0e10cSrcweir 	SvBaseLink::Closed();
177cdf0e10cSrcweir }
178cdf0e10cSrcweir 
GetAnchor() const179cdf0e10cSrcweir const SwNode* SwIntrnlRefLink::GetAnchor() const
180cdf0e10cSrcweir {
181cdf0e10cSrcweir 	// hier sollte irgend ein Anchor aus dem normalen Nodes-Array reichen
182cdf0e10cSrcweir 	const SwNode* pNd = 0;
183cdf0e10cSrcweir 	SwClientIter aIter( rFldType );     // TODO
184cdf0e10cSrcweir 	SwClient * pLast = aIter.GoStart();
185cdf0e10cSrcweir 	if( pLast ) 	// konnte zum Anfang gesprungen werden ??
186cdf0e10cSrcweir 		do {
187cdf0e10cSrcweir 			// eine DDE-Tabelle oder ein DDE-FeldAttribut im Text
188cdf0e10cSrcweir 			if( !pLast->IsA( TYPE( SwFmtFld ) ))
189cdf0e10cSrcweir 			{
190cdf0e10cSrcweir 				SwDepend* pDep = (SwDepend*)pLast;
191cdf0e10cSrcweir 				SwDDETable* pDDETbl = (SwDDETable*)pDep->GetToTell();
192cdf0e10cSrcweir 				pNd = pDDETbl->GetTabSortBoxes()[0]->GetSttNd();
193cdf0e10cSrcweir 			}
194cdf0e10cSrcweir 			else if( ((SwFmtFld*)pLast)->GetTxtFld() )
195cdf0e10cSrcweir 				pNd = ((SwFmtFld*)pLast)->GetTxtFld()->GetpTxtNode();
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 			if( pNd && &rFldType.GetDoc()->GetNodes() == &pNd->GetNodes() )
198cdf0e10cSrcweir 				break;
199cdf0e10cSrcweir 			pNd = 0;
2002f121198SMathias Bauer 		} while( 0 != ( pLast = ++aIter ));
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	return pNd;
203cdf0e10cSrcweir }
204cdf0e10cSrcweir 
IsInRange(sal_uLong nSttNd,sal_uLong nEndNd,xub_StrLen nStt,xub_StrLen nEnd) const205cdf0e10cSrcweir sal_Bool SwIntrnlRefLink::IsInRange( sal_uLong nSttNd, sal_uLong nEndNd,
206cdf0e10cSrcweir 								xub_StrLen nStt, xub_StrLen nEnd ) const
207cdf0e10cSrcweir {
208cdf0e10cSrcweir 	// hier sollte irgend ein Anchor aus dem normalen Nodes-Array reichen
209cdf0e10cSrcweir 	SwNodes* pNds = &rFldType.GetDoc()->GetNodes();
210cdf0e10cSrcweir 	SwClientIter aIter( rFldType );         // TODO
211cdf0e10cSrcweir 	SwClient * pLast = aIter.GoStart();
212cdf0e10cSrcweir 	if( pLast ) 	// konnte zum Anfang gesprungen werden ??
213cdf0e10cSrcweir 		do {
214cdf0e10cSrcweir 			// eine DDE-Tabelle oder ein DDE-FeldAttribut im Text
215cdf0e10cSrcweir 			if( !pLast->IsA( TYPE( SwFmtFld ) ))
216cdf0e10cSrcweir 			{
217cdf0e10cSrcweir 				SwDepend* pDep = (SwDepend*)pLast;
218cdf0e10cSrcweir 				SwDDETable* pDDETbl = (SwDDETable*)pDep->GetToTell();
219cdf0e10cSrcweir 				const SwTableNode* pTblNd = pDDETbl->GetTabSortBoxes()[0]->
220cdf0e10cSrcweir 								GetSttNd()->FindTableNode();
221cdf0e10cSrcweir 				if( pTblNd->GetNodes().IsDocNodes() &&
222cdf0e10cSrcweir 					nSttNd < pTblNd->EndOfSectionIndex() &&
223cdf0e10cSrcweir 					nEndNd > pTblNd->GetIndex() )
224cdf0e10cSrcweir 					return sal_True;
225cdf0e10cSrcweir 			}
226cdf0e10cSrcweir 			else if( ((SwFmtFld*)pLast)->GetTxtFld() )
227cdf0e10cSrcweir 			{
228cdf0e10cSrcweir 				const SwTxtFld* pTFld = ((SwFmtFld*)pLast)->GetTxtFld();
229cdf0e10cSrcweir 				const SwTxtNode* pNd = pTFld->GetpTxtNode();
230cdf0e10cSrcweir 				if( pNd && pNds == &pNd->GetNodes() )
231cdf0e10cSrcweir 				{
232cdf0e10cSrcweir 					sal_uLong nNdPos = pNd->GetIndex();
233cdf0e10cSrcweir 					if( nSttNd <= nNdPos && nNdPos <= nEndNd &&
234cdf0e10cSrcweir 						( nNdPos != nSttNd || *pTFld->GetStart() >= nStt ) &&
235cdf0e10cSrcweir 						( nNdPos != nEndNd || *pTFld->GetStart() < nEnd ))
236cdf0e10cSrcweir 						return sal_True;
237cdf0e10cSrcweir 				}
238cdf0e10cSrcweir 			}
2392f121198SMathias Bauer 		} while( 0 != ( pLast = ++aIter ));
240cdf0e10cSrcweir 
241cdf0e10cSrcweir 	return sal_False;
242cdf0e10cSrcweir }
243cdf0e10cSrcweir 
SwDDEFieldType(const String & rName,const String & rCmd,sal_uInt16 nUpdateType)244cdf0e10cSrcweir SwDDEFieldType::SwDDEFieldType(const String& rName,
245cdf0e10cSrcweir 								const String& rCmd, sal_uInt16 nUpdateType )
246cdf0e10cSrcweir 	: SwFieldType( RES_DDEFLD ),
247cdf0e10cSrcweir 	aName( rName ), pDoc( 0 ), nRefCnt( 0 )
248cdf0e10cSrcweir {
249cdf0e10cSrcweir 	bCRLFFlag = bDeleted = sal_False;
250cdf0e10cSrcweir 	refLink = new SwIntrnlRefLink( *this, nUpdateType, FORMAT_STRING );
251cdf0e10cSrcweir 	SetCmd( rCmd );
252cdf0e10cSrcweir }
253cdf0e10cSrcweir 
~SwDDEFieldType()254cdf0e10cSrcweir SwDDEFieldType::~SwDDEFieldType()
255cdf0e10cSrcweir {
256cdf0e10cSrcweir 	if( pDoc && !pDoc->IsInDtor() )
257cdf0e10cSrcweir 		pDoc->GetLinkManager().Remove( refLink );
258cdf0e10cSrcweir 	refLink->Disconnect();
259cdf0e10cSrcweir }
260cdf0e10cSrcweir 
Copy() const261cdf0e10cSrcweir SwFieldType* SwDDEFieldType::Copy() const
262cdf0e10cSrcweir {
263cdf0e10cSrcweir 	SwDDEFieldType* pType = new SwDDEFieldType( aName, GetCmd(), GetType() );
264cdf0e10cSrcweir 	pType->aExpansion = aExpansion;
265cdf0e10cSrcweir 	pType->bCRLFFlag = bCRLFFlag;
266cdf0e10cSrcweir 	pType->bDeleted = bDeleted;
267cdf0e10cSrcweir 	pType->SetDoc( pDoc );
268cdf0e10cSrcweir 	return pType;
269cdf0e10cSrcweir }
270cdf0e10cSrcweir 
GetName() const271cdf0e10cSrcweir const String& SwDDEFieldType::GetName() const
272cdf0e10cSrcweir {
273cdf0e10cSrcweir 	return aName;
274cdf0e10cSrcweir }
275cdf0e10cSrcweir 
SetCmd(const String & rStr)276cdf0e10cSrcweir void SwDDEFieldType::SetCmd( const String& rStr )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir 	String sCmd( rStr );
279cdf0e10cSrcweir 	xub_StrLen nPos;
280cdf0e10cSrcweir 	while( STRING_NOTFOUND != (nPos = sCmd.SearchAscii( "  " )) )
281cdf0e10cSrcweir 		sCmd.Erase( nPos, 1 );
282cdf0e10cSrcweir 	refLink->SetLinkSourceName( sCmd );
283cdf0e10cSrcweir }
284cdf0e10cSrcweir 
GetCmd() const285cdf0e10cSrcweir String SwDDEFieldType::GetCmd() const
286cdf0e10cSrcweir {
287cdf0e10cSrcweir 	return refLink->GetLinkSourceName();
288cdf0e10cSrcweir }
289cdf0e10cSrcweir 
SetDoc(SwDoc * pNewDoc)290cdf0e10cSrcweir void SwDDEFieldType::SetDoc( SwDoc* pNewDoc )
291cdf0e10cSrcweir {
292cdf0e10cSrcweir 	if( pNewDoc == pDoc )
293cdf0e10cSrcweir 		return;
294cdf0e10cSrcweir 
295cdf0e10cSrcweir 	if( pDoc && refLink.Is() )
296cdf0e10cSrcweir 	{
297cdf0e10cSrcweir 		ASSERT( !nRefCnt, "wie kommen die Referenzen rueber?" );
298cdf0e10cSrcweir 		pDoc->GetLinkManager().Remove( refLink );
299cdf0e10cSrcweir 	}
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 	pDoc = pNewDoc;
302cdf0e10cSrcweir 	if( pDoc && nRefCnt )
303cdf0e10cSrcweir 	{
304cdf0e10cSrcweir 		refLink->SetVisible( pDoc->IsVisibleLinks() );
305cdf0e10cSrcweir 		pDoc->GetLinkManager().InsertDDELink( refLink );
306cdf0e10cSrcweir 	}
307cdf0e10cSrcweir }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 
_RefCntChgd()310cdf0e10cSrcweir void SwDDEFieldType::_RefCntChgd()
311cdf0e10cSrcweir {
312cdf0e10cSrcweir 	if( nRefCnt )
313cdf0e10cSrcweir 	{
314cdf0e10cSrcweir 		refLink->SetVisible( pDoc->IsVisibleLinks() );
315cdf0e10cSrcweir 		pDoc->GetLinkManager().InsertDDELink( refLink );
316cdf0e10cSrcweir 		if( pDoc->GetCurrentViewShell() )	//swmod 071108//swmod 071225
317cdf0e10cSrcweir 			UpdateNow();
318cdf0e10cSrcweir 	}
319cdf0e10cSrcweir 	else
320cdf0e10cSrcweir 	{
321cdf0e10cSrcweir 		Disconnect();
322cdf0e10cSrcweir 		pDoc->GetLinkManager().Remove( refLink );
323cdf0e10cSrcweir 	}
324cdf0e10cSrcweir }
325cdf0e10cSrcweir /* -----------------------------28.08.00 16:23--------------------------------
326cdf0e10cSrcweir 
327cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
QueryValue(uno::Any & rVal,sal_uInt16 nWhichId) const328cdf0e10cSrcweir sal_Bool SwDDEFieldType::QueryValue( uno::Any& rVal, sal_uInt16 nWhichId ) const
329cdf0e10cSrcweir {
330cdf0e10cSrcweir 	sal_uInt8 nPart = 0;
331cdf0e10cSrcweir     switch( nWhichId )
332cdf0e10cSrcweir 	{
333cdf0e10cSrcweir 	case FIELD_PROP_PAR2:      nPart = 3; break;
334cdf0e10cSrcweir 	case FIELD_PROP_PAR4:      nPart = 2; break;
335cdf0e10cSrcweir 	case FIELD_PROP_SUBTYPE:   nPart = 1; break;
336cdf0e10cSrcweir 	case FIELD_PROP_BOOL1:
337cdf0e10cSrcweir 		{
338cdf0e10cSrcweir             sal_Bool bSet = GetType() == sfx2::LINKUPDATE_ALWAYS ? sal_True : sal_False;
339cdf0e10cSrcweir 			rVal.setValue(&bSet, ::getBooleanCppuType());
340cdf0e10cSrcweir 		}
341cdf0e10cSrcweir 		break;
342cdf0e10cSrcweir     case FIELD_PROP_PAR5:
343cdf0e10cSrcweir         rVal <<= ::rtl::OUString(aExpansion);
344cdf0e10cSrcweir     break;
345cdf0e10cSrcweir 	default:
346cdf0e10cSrcweir 		DBG_ERROR("illegal property");
347cdf0e10cSrcweir 	}
348cdf0e10cSrcweir 	if( nPart )
349cdf0e10cSrcweir         rVal <<= OUString(GetCmd().GetToken(nPart-1, sfx2::cTokenSeperator));
350cdf0e10cSrcweir 	return sal_True;
351cdf0e10cSrcweir }
352cdf0e10cSrcweir /* -----------------------------28.08.00 16:23--------------------------------
353cdf0e10cSrcweir 
354cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
PutValue(const uno::Any & rVal,sal_uInt16 nWhichId)355cdf0e10cSrcweir sal_Bool SwDDEFieldType::PutValue( const uno::Any& rVal, sal_uInt16 nWhichId )
356cdf0e10cSrcweir {
357cdf0e10cSrcweir 	sal_uInt8 nPart = 0;
358cdf0e10cSrcweir     switch( nWhichId )
359cdf0e10cSrcweir 	{
360cdf0e10cSrcweir 	case FIELD_PROP_PAR2:      nPart = 3; break;
361cdf0e10cSrcweir 	case FIELD_PROP_PAR4:      nPart = 2; break;
362cdf0e10cSrcweir 	case FIELD_PROP_SUBTYPE:   nPart = 1; break;
363cdf0e10cSrcweir 	case FIELD_PROP_BOOL1:
364cdf0e10cSrcweir         SetType( static_cast<sal_uInt16>(*(sal_Bool*)rVal.getValue() ?
365cdf0e10cSrcweir                                      sfx2::LINKUPDATE_ALWAYS :
366cdf0e10cSrcweir                                      sfx2::LINKUPDATE_ONCALL ) );
367cdf0e10cSrcweir 		break;
368cdf0e10cSrcweir     case FIELD_PROP_PAR5:
369cdf0e10cSrcweir     {
370cdf0e10cSrcweir         ::rtl::OUString sTemp;
371cdf0e10cSrcweir         rVal >>= sTemp;
372cdf0e10cSrcweir         aExpansion = sTemp;
373cdf0e10cSrcweir     }
374cdf0e10cSrcweir     break;
375cdf0e10cSrcweir 	default:
376cdf0e10cSrcweir 		DBG_ERROR("illegal property");
377cdf0e10cSrcweir 	}
378cdf0e10cSrcweir 	if( nPart )
379cdf0e10cSrcweir 	{
380cdf0e10cSrcweir 		String sTmp, sCmd( GetCmd() );
381cdf0e10cSrcweir         while(3 > sCmd.GetTokenCount(sfx2::cTokenSeperator))
382cdf0e10cSrcweir             sCmd += sfx2::cTokenSeperator;
383cdf0e10cSrcweir         sCmd.SetToken( nPart-1, sfx2::cTokenSeperator, ::GetString( rVal, sTmp ) );
384cdf0e10cSrcweir 		SetCmd( sCmd );
385cdf0e10cSrcweir 	}
386cdf0e10cSrcweir 	return sal_True;
387cdf0e10cSrcweir }
388cdf0e10cSrcweir /* ---------------------------------------------------------------------------
389cdf0e10cSrcweir 
390cdf0e10cSrcweir  ---------------------------------------------------------------------------*/
SwDDEField(SwDDEFieldType * pInitType)391cdf0e10cSrcweir SwDDEField::SwDDEField( SwDDEFieldType* pInitType )
392cdf0e10cSrcweir 	: SwField(pInitType)
393cdf0e10cSrcweir {
394cdf0e10cSrcweir }
395cdf0e10cSrcweir 
~SwDDEField()396cdf0e10cSrcweir SwDDEField::~SwDDEField()
397cdf0e10cSrcweir {
398cdf0e10cSrcweir 	if( GetTyp()->IsLastDepend() )
399cdf0e10cSrcweir 		((SwDDEFieldType*)GetTyp())->Disconnect();
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
Expand() const402cdf0e10cSrcweir String SwDDEField::Expand() const
403cdf0e10cSrcweir {
404cdf0e10cSrcweir 	xub_StrLen nPos;
405cdf0e10cSrcweir 	String aStr( ((SwDDEFieldType*)GetTyp())->GetExpansion() );
406cdf0e10cSrcweir 
407cdf0e10cSrcweir 	aStr.EraseAllChars( '\r' );
408cdf0e10cSrcweir 	while( (nPos = aStr.Search( '\t' )) != STRING_NOTFOUND )
409cdf0e10cSrcweir 		aStr.SetChar( nPos, ' ' );
410cdf0e10cSrcweir 	while( (nPos = aStr.Search( '\n' )) != STRING_NOTFOUND )
411cdf0e10cSrcweir 		aStr.SetChar( nPos, '|' );
412cdf0e10cSrcweir 	if( aStr.Len() && ( aStr.GetChar( aStr.Len()-1 ) == '|') )
413cdf0e10cSrcweir 		aStr.Erase( aStr.Len()-1, 1 );
414cdf0e10cSrcweir 	return aStr;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir 
Copy() const417cdf0e10cSrcweir SwField* SwDDEField::Copy() const
418cdf0e10cSrcweir {
419cdf0e10cSrcweir 	return new SwDDEField((SwDDEFieldType*)GetTyp());
420cdf0e10cSrcweir }
421cdf0e10cSrcweir 
422cdf0e10cSrcweir /*--------------------------------------------------------------------
423cdf0e10cSrcweir 	Beschreibung: Parameter des Typen erfragen
424cdf0e10cSrcweir 				  Name
425cdf0e10cSrcweir  --------------------------------------------------------------------*/
GetPar1() const426cdf0e10cSrcweir const String& SwDDEField::GetPar1() const
427cdf0e10cSrcweir {
428cdf0e10cSrcweir 	return ((SwDDEFieldType*)GetTyp())->GetName();
429cdf0e10cSrcweir }
430cdf0e10cSrcweir 
431cdf0e10cSrcweir /*--------------------------------------------------------------------
432cdf0e10cSrcweir 	Beschreibung: Parameter des Typen erfragen
433cdf0e10cSrcweir 				  Commando
434cdf0e10cSrcweir  --------------------------------------------------------------------*/
GetPar2() const435cdf0e10cSrcweir String SwDDEField::GetPar2() const
436cdf0e10cSrcweir {
437cdf0e10cSrcweir 	return ((SwDDEFieldType*)GetTyp())->GetCmd();
438cdf0e10cSrcweir }
439cdf0e10cSrcweir 
SetPar2(const String & rStr)440cdf0e10cSrcweir void SwDDEField::SetPar2(const String& rStr)
441cdf0e10cSrcweir {
442cdf0e10cSrcweir 	((SwDDEFieldType*)GetTyp())->SetCmd(rStr);
443cdf0e10cSrcweir }
444cdf0e10cSrcweir 
445