1*e1f63238SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*e1f63238SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*e1f63238SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*e1f63238SAndrew Rist * distributed with this work for additional information
6*e1f63238SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*e1f63238SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*e1f63238SAndrew Rist * "License"); you may not use this file except in compliance
9*e1f63238SAndrew Rist * with the License. You may obtain a copy of the License at
10cdf0e10cSrcweir *
11*e1f63238SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir *
13*e1f63238SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*e1f63238SAndrew Rist * software distributed under the License is distributed on an
15*e1f63238SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*e1f63238SAndrew Rist * KIND, either express or implied. See the License for the
17*e1f63238SAndrew Rist * specific language governing permissions and limitations
18*e1f63238SAndrew Rist * under the License.
19cdf0e10cSrcweir *
20*e1f63238SAndrew Rist *************************************************************/
21*e1f63238SAndrew Rist
22*e1f63238SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_basic.hxx"
26cdf0e10cSrcweir #include <tools/stream.hxx>
27cdf0e10cSrcweir #include <basic/sbx.hxx>
28cdf0e10cSrcweir #include "runtime.hxx"
29cdf0e10cSrcweir #include <vector>
30cdf0e10cSrcweir using namespace std;
31cdf0e10cSrcweir
32cdf0e10cSrcweir struct SbxDim { // eine Array-Dimension:
33cdf0e10cSrcweir SbxDim* pNext; // Link
34cdf0e10cSrcweir sal_Int32 nLbound, nUbound; // Begrenzungen
35cdf0e10cSrcweir sal_Int32 nSize; // Anzahl Elemente
36cdf0e10cSrcweir };
37cdf0e10cSrcweir
38cdf0e10cSrcweir class SbxVarEntry : public SbxVariableRef {
39cdf0e10cSrcweir public:
40cdf0e10cSrcweir XubString* pAlias;
SbxVarEntry()41cdf0e10cSrcweir SbxVarEntry() : SbxVariableRef(), pAlias( NULL ) {}
~SbxVarEntry()42cdf0e10cSrcweir ~SbxVarEntry() { delete pAlias; }
43cdf0e10cSrcweir };
44cdf0e10cSrcweir
45cdf0e10cSrcweir typedef SbxVarEntry* SbxVarEntryPtr;
46cdf0e10cSrcweir typedef vector< SbxVarEntryPtr > SbxVarEntryPtrVector;
47cdf0e10cSrcweir class SbxVarRefs : public SbxVarEntryPtrVector
48cdf0e10cSrcweir {
49cdf0e10cSrcweir public:
SbxVarRefs(void)50cdf0e10cSrcweir SbxVarRefs( void ) {}
51cdf0e10cSrcweir };
52cdf0e10cSrcweir
53cdf0e10cSrcweir
TYPEINIT1(SbxArray,SbxBase)54cdf0e10cSrcweir TYPEINIT1(SbxArray,SbxBase)
55cdf0e10cSrcweir TYPEINIT1(SbxDimArray,SbxArray)
56cdf0e10cSrcweir
57cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
58cdf0e10cSrcweir //
59cdf0e10cSrcweir // SbxArray
60cdf0e10cSrcweir //
61cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
62cdf0e10cSrcweir
63cdf0e10cSrcweir SbxArray::SbxArray( SbxDataType t ) : SbxBase()
64cdf0e10cSrcweir {
65cdf0e10cSrcweir pData = new SbxVarRefs;
66cdf0e10cSrcweir eType = t;
67cdf0e10cSrcweir if( t != SbxVARIANT )
68cdf0e10cSrcweir SetFlag( SBX_FIXED );
69cdf0e10cSrcweir }
70cdf0e10cSrcweir
SbxArray(const SbxArray & rArray)71cdf0e10cSrcweir SbxArray::SbxArray( const SbxArray& rArray ) :
72cdf0e10cSrcweir SvRefBase( rArray ), SbxBase()
73cdf0e10cSrcweir {
74cdf0e10cSrcweir pData = new SbxVarRefs;
75cdf0e10cSrcweir if( rArray.eType != SbxVARIANT )
76cdf0e10cSrcweir SetFlag( SBX_FIXED );
77cdf0e10cSrcweir *this = rArray;
78cdf0e10cSrcweir }
79cdf0e10cSrcweir
operator =(const SbxArray & rArray)80cdf0e10cSrcweir SbxArray& SbxArray::operator=( const SbxArray& rArray )
81cdf0e10cSrcweir {
82cdf0e10cSrcweir if( &rArray != this )
83cdf0e10cSrcweir {
84cdf0e10cSrcweir eType = rArray.eType;
85cdf0e10cSrcweir Clear();
86cdf0e10cSrcweir SbxVarRefs* pSrc = rArray.pData;
87cdf0e10cSrcweir for( sal_uInt32 i = 0; i < pSrc->size(); i++ )
88cdf0e10cSrcweir {
89cdf0e10cSrcweir SbxVarEntryPtr pSrcRef = (*pSrc)[i];
90cdf0e10cSrcweir const SbxVariable* pSrc_ = *pSrcRef;
91cdf0e10cSrcweir if( !pSrc_ )
92cdf0e10cSrcweir continue;
93cdf0e10cSrcweir SbxVarEntryPtr pDstRef = new SbxVarEntry;
94cdf0e10cSrcweir *((SbxVariableRef*) pDstRef) = *((SbxVariableRef*) pSrcRef);
95cdf0e10cSrcweir if( pSrcRef->pAlias )
96cdf0e10cSrcweir pDstRef->pAlias = new XubString( *pSrcRef->pAlias );
97cdf0e10cSrcweir if( eType != SbxVARIANT )
98cdf0e10cSrcweir // Keine Objekte konvertieren
99cdf0e10cSrcweir if( eType != SbxOBJECT || pSrc_->GetClass() != SbxCLASS_OBJECT )
100cdf0e10cSrcweir ((SbxVariable*) pSrc_)->Convert( eType );
101cdf0e10cSrcweir pData->push_back( pDstRef );
102cdf0e10cSrcweir }
103cdf0e10cSrcweir }
104cdf0e10cSrcweir return *this;
105cdf0e10cSrcweir }
106cdf0e10cSrcweir
~SbxArray()107cdf0e10cSrcweir SbxArray::~SbxArray()
108cdf0e10cSrcweir {
109cdf0e10cSrcweir Clear();
110cdf0e10cSrcweir delete pData;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
GetType() const113cdf0e10cSrcweir SbxDataType SbxArray::GetType() const
114cdf0e10cSrcweir {
115cdf0e10cSrcweir return (SbxDataType) ( eType | SbxARRAY );
116cdf0e10cSrcweir }
117cdf0e10cSrcweir
GetClass() const118cdf0e10cSrcweir SbxClassType SbxArray::GetClass() const
119cdf0e10cSrcweir {
120cdf0e10cSrcweir return SbxCLASS_ARRAY;
121cdf0e10cSrcweir }
122cdf0e10cSrcweir
Clear()123cdf0e10cSrcweir void SbxArray::Clear()
124cdf0e10cSrcweir {
125cdf0e10cSrcweir sal_uInt32 nSize = pData->size();
126cdf0e10cSrcweir for( sal_uInt32 i = 0 ; i < nSize ; i++ )
127cdf0e10cSrcweir {
128cdf0e10cSrcweir SbxVarEntry* pEntry = (*pData)[i];
129cdf0e10cSrcweir delete pEntry;
130cdf0e10cSrcweir }
131cdf0e10cSrcweir pData->clear();
132cdf0e10cSrcweir }
133cdf0e10cSrcweir
Count32() const134cdf0e10cSrcweir sal_uInt32 SbxArray::Count32() const
135cdf0e10cSrcweir {
136cdf0e10cSrcweir return pData->size();
137cdf0e10cSrcweir }
138cdf0e10cSrcweir
Count() const139cdf0e10cSrcweir sal_uInt16 SbxArray::Count() const
140cdf0e10cSrcweir {
141cdf0e10cSrcweir sal_uInt32 nCount = pData->size();
142cdf0e10cSrcweir DBG_ASSERT( nCount <= SBX_MAXINDEX, "SBX: Array-Index > SBX_MAXINDEX" );
143cdf0e10cSrcweir return (sal_uInt16)nCount;
144cdf0e10cSrcweir }
145cdf0e10cSrcweir
GetRef32(sal_uInt32 nIdx)146cdf0e10cSrcweir SbxVariableRef& SbxArray::GetRef32( sal_uInt32 nIdx )
147cdf0e10cSrcweir {
148cdf0e10cSrcweir // Array ggf. vergroessern
149cdf0e10cSrcweir DBG_ASSERT( nIdx <= SBX_MAXINDEX32, "SBX: Array-Index > SBX_MAXINDEX32" );
150cdf0e10cSrcweir // Very Hot Fix
151cdf0e10cSrcweir if( nIdx > SBX_MAXINDEX32 )
152cdf0e10cSrcweir {
153cdf0e10cSrcweir SetError( SbxERR_BOUNDS );
154cdf0e10cSrcweir nIdx = 0;
155cdf0e10cSrcweir }
156cdf0e10cSrcweir while( pData->size() <= nIdx )
157cdf0e10cSrcweir {
158cdf0e10cSrcweir const SbxVarEntryPtr p = new SbxVarEntry;
159cdf0e10cSrcweir pData->push_back( p );
160cdf0e10cSrcweir }
161cdf0e10cSrcweir return *((*pData)[nIdx]);
162cdf0e10cSrcweir }
163cdf0e10cSrcweir
GetRef(sal_uInt16 nIdx)164cdf0e10cSrcweir SbxVariableRef& SbxArray::GetRef( sal_uInt16 nIdx )
165cdf0e10cSrcweir {
166cdf0e10cSrcweir // Array ggf. vergroessern
167cdf0e10cSrcweir DBG_ASSERT( nIdx <= SBX_MAXINDEX, "SBX: Array-Index > SBX_MAXINDEX" );
168cdf0e10cSrcweir // Very Hot Fix
169cdf0e10cSrcweir if( nIdx > SBX_MAXINDEX )
170cdf0e10cSrcweir {
171cdf0e10cSrcweir SetError( SbxERR_BOUNDS );
172cdf0e10cSrcweir nIdx = 0;
173cdf0e10cSrcweir }
174cdf0e10cSrcweir while( pData->size() <= nIdx )
175cdf0e10cSrcweir {
176cdf0e10cSrcweir const SbxVarEntryPtr p = new SbxVarEntry;
177cdf0e10cSrcweir pData->push_back( p );
178cdf0e10cSrcweir }
179cdf0e10cSrcweir return *((*pData)[nIdx]);
180cdf0e10cSrcweir }
181cdf0e10cSrcweir
Get32(sal_uInt32 nIdx)182cdf0e10cSrcweir SbxVariable* SbxArray::Get32( sal_uInt32 nIdx )
183cdf0e10cSrcweir {
184cdf0e10cSrcweir if( !CanRead() )
185cdf0e10cSrcweir {
186cdf0e10cSrcweir SetError( SbxERR_PROP_WRITEONLY );
187cdf0e10cSrcweir return NULL;
188cdf0e10cSrcweir }
189cdf0e10cSrcweir SbxVariableRef& rRef = GetRef32( nIdx );
190cdf0e10cSrcweir
191cdf0e10cSrcweir if ( !rRef.Is() )
192cdf0e10cSrcweir rRef = new SbxVariable( eType );
193cdf0e10cSrcweir #ifdef DBG_UTIL
194cdf0e10cSrcweir else
195cdf0e10cSrcweir DBG_CHKOBJ( rRef, SbxBase, 0 );
196cdf0e10cSrcweir #endif
197cdf0e10cSrcweir
198cdf0e10cSrcweir return rRef;
199cdf0e10cSrcweir }
200cdf0e10cSrcweir
Get(sal_uInt16 nIdx)201cdf0e10cSrcweir SbxVariable* SbxArray::Get( sal_uInt16 nIdx )
202cdf0e10cSrcweir {
203cdf0e10cSrcweir if( !CanRead() )
204cdf0e10cSrcweir {
205cdf0e10cSrcweir SetError( SbxERR_PROP_WRITEONLY );
206cdf0e10cSrcweir return NULL;
207cdf0e10cSrcweir }
208cdf0e10cSrcweir SbxVariableRef& rRef = GetRef( nIdx );
209cdf0e10cSrcweir
210cdf0e10cSrcweir if ( !rRef.Is() )
211cdf0e10cSrcweir rRef = new SbxVariable( eType );
212cdf0e10cSrcweir #ifdef DBG_UTIL
213cdf0e10cSrcweir else
214cdf0e10cSrcweir DBG_CHKOBJ( rRef, SbxBase, 0 );
215cdf0e10cSrcweir #endif
216cdf0e10cSrcweir
217cdf0e10cSrcweir return rRef;
218cdf0e10cSrcweir }
219cdf0e10cSrcweir
Put32(SbxVariable * pVar,sal_uInt32 nIdx)220cdf0e10cSrcweir void SbxArray::Put32( SbxVariable* pVar, sal_uInt32 nIdx )
221cdf0e10cSrcweir {
222cdf0e10cSrcweir if( !CanWrite() )
223cdf0e10cSrcweir SetError( SbxERR_PROP_READONLY );
224cdf0e10cSrcweir else
225cdf0e10cSrcweir {
226cdf0e10cSrcweir if( pVar )
227cdf0e10cSrcweir if( eType != SbxVARIANT )
228cdf0e10cSrcweir // Keine Objekte konvertieren
229cdf0e10cSrcweir if( eType != SbxOBJECT || pVar->GetClass() != SbxCLASS_OBJECT )
230cdf0e10cSrcweir pVar->Convert( eType );
231cdf0e10cSrcweir SbxVariableRef& rRef = GetRef32( nIdx );
232cdf0e10cSrcweir if( (SbxVariable*) rRef != pVar )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir rRef = pVar;
235cdf0e10cSrcweir SetFlag( SBX_MODIFIED );
236cdf0e10cSrcweir }
237cdf0e10cSrcweir }
238cdf0e10cSrcweir }
239cdf0e10cSrcweir
Put(SbxVariable * pVar,sal_uInt16 nIdx)240cdf0e10cSrcweir void SbxArray::Put( SbxVariable* pVar, sal_uInt16 nIdx )
241cdf0e10cSrcweir {
242cdf0e10cSrcweir if( !CanWrite() )
243cdf0e10cSrcweir SetError( SbxERR_PROP_READONLY );
244cdf0e10cSrcweir else
245cdf0e10cSrcweir {
246cdf0e10cSrcweir if( pVar )
247cdf0e10cSrcweir if( eType != SbxVARIANT )
248cdf0e10cSrcweir // Keine Objekte konvertieren
249cdf0e10cSrcweir if( eType != SbxOBJECT || pVar->GetClass() != SbxCLASS_OBJECT )
250cdf0e10cSrcweir pVar->Convert( eType );
251cdf0e10cSrcweir SbxVariableRef& rRef = GetRef( nIdx );
252cdf0e10cSrcweir if( (SbxVariable*) rRef != pVar )
253cdf0e10cSrcweir {
254cdf0e10cSrcweir rRef = pVar;
255cdf0e10cSrcweir SetFlag( SBX_MODIFIED );
256cdf0e10cSrcweir }
257cdf0e10cSrcweir }
258cdf0e10cSrcweir }
259cdf0e10cSrcweir
GetAlias(sal_uInt16 nIdx)260cdf0e10cSrcweir const XubString& SbxArray::GetAlias( sal_uInt16 nIdx )
261cdf0e10cSrcweir {
262cdf0e10cSrcweir if( !CanRead() )
263cdf0e10cSrcweir {
264cdf0e10cSrcweir SetError( SbxERR_PROP_WRITEONLY );
265cdf0e10cSrcweir return String::EmptyString();
266cdf0e10cSrcweir }
267cdf0e10cSrcweir SbxVarEntry& rRef = (SbxVarEntry&) GetRef( nIdx );
268cdf0e10cSrcweir
269cdf0e10cSrcweir if ( !rRef.pAlias )
270cdf0e10cSrcweir return String::EmptyString();
271cdf0e10cSrcweir #ifdef DBG_UTIL
272cdf0e10cSrcweir else
273cdf0e10cSrcweir DBG_CHKOBJ( rRef, SbxBase, 0 );
274cdf0e10cSrcweir #endif
275cdf0e10cSrcweir
276cdf0e10cSrcweir return *rRef.pAlias;
277cdf0e10cSrcweir }
278cdf0e10cSrcweir
PutAlias(const XubString & rAlias,sal_uInt16 nIdx)279cdf0e10cSrcweir void SbxArray::PutAlias( const XubString& rAlias, sal_uInt16 nIdx )
280cdf0e10cSrcweir {
281cdf0e10cSrcweir if( !CanWrite() )
282cdf0e10cSrcweir SetError( SbxERR_PROP_READONLY );
283cdf0e10cSrcweir else
284cdf0e10cSrcweir {
285cdf0e10cSrcweir SbxVarEntry& rRef = (SbxVarEntry&) GetRef( nIdx );
286cdf0e10cSrcweir if( !rRef.pAlias )
287cdf0e10cSrcweir rRef.pAlias = new XubString( rAlias );
288cdf0e10cSrcweir else
289cdf0e10cSrcweir *rRef.pAlias = rAlias;
290cdf0e10cSrcweir }
291cdf0e10cSrcweir }
292cdf0e10cSrcweir
Insert32(SbxVariable * pVar,sal_uInt32 nIdx)293cdf0e10cSrcweir void SbxArray::Insert32( SbxVariable* pVar, sal_uInt32 nIdx )
294cdf0e10cSrcweir {
295cdf0e10cSrcweir DBG_ASSERT( pData->size() <= SBX_MAXINDEX32, "SBX: Array wird zu gross" );
296cdf0e10cSrcweir if( pData->size() > SBX_MAXINDEX32 )
297cdf0e10cSrcweir return;
298cdf0e10cSrcweir SbxVarEntryPtr p = new SbxVarEntry;
299cdf0e10cSrcweir *((SbxVariableRef*) p) = pVar;
300cdf0e10cSrcweir SbxVarEntryPtrVector::size_type nSize = pData->size();
301cdf0e10cSrcweir if( nIdx > nSize )
302cdf0e10cSrcweir nIdx = nSize;
303cdf0e10cSrcweir if( eType != SbxVARIANT && pVar )
304cdf0e10cSrcweir (*p)->Convert( eType );
305cdf0e10cSrcweir if( nIdx == nSize )
306cdf0e10cSrcweir {
307cdf0e10cSrcweir pData->push_back( p );
308cdf0e10cSrcweir }
309cdf0e10cSrcweir else
310cdf0e10cSrcweir {
311cdf0e10cSrcweir pData->insert( pData->begin() + nIdx, p );
312cdf0e10cSrcweir }
313cdf0e10cSrcweir SetFlag( SBX_MODIFIED );
314cdf0e10cSrcweir }
315cdf0e10cSrcweir
Insert(SbxVariable * pVar,sal_uInt16 nIdx)316cdf0e10cSrcweir void SbxArray::Insert( SbxVariable* pVar, sal_uInt16 nIdx )
317cdf0e10cSrcweir {
318cdf0e10cSrcweir DBG_ASSERT( pData->size() <= 0x3FF0, "SBX: Array wird zu gross" );
319cdf0e10cSrcweir if( pData->size() > 0x3FF0 )
320cdf0e10cSrcweir return;
321cdf0e10cSrcweir Insert32( pVar, nIdx );
322cdf0e10cSrcweir }
323cdf0e10cSrcweir
Remove32(sal_uInt32 nIdx)324cdf0e10cSrcweir void SbxArray::Remove32( sal_uInt32 nIdx )
325cdf0e10cSrcweir {
326cdf0e10cSrcweir if( nIdx < pData->size() )
327cdf0e10cSrcweir {
328cdf0e10cSrcweir SbxVariableRef* pRef = (*pData)[nIdx];
329cdf0e10cSrcweir pData->erase( pData->begin() + nIdx );
330cdf0e10cSrcweir delete pRef;
331cdf0e10cSrcweir SetFlag( SBX_MODIFIED );
332cdf0e10cSrcweir }
333cdf0e10cSrcweir }
334cdf0e10cSrcweir
Remove(sal_uInt16 nIdx)335cdf0e10cSrcweir void SbxArray::Remove( sal_uInt16 nIdx )
336cdf0e10cSrcweir {
337cdf0e10cSrcweir if( nIdx < pData->size() )
338cdf0e10cSrcweir {
339cdf0e10cSrcweir SbxVariableRef* pRef = (*pData)[nIdx];
340cdf0e10cSrcweir pData->erase( pData->begin() + nIdx );
341cdf0e10cSrcweir delete pRef;
342cdf0e10cSrcweir SetFlag( SBX_MODIFIED );
343cdf0e10cSrcweir }
344cdf0e10cSrcweir }
345cdf0e10cSrcweir
Remove(SbxVariable * pVar)346cdf0e10cSrcweir void SbxArray::Remove( SbxVariable* pVar )
347cdf0e10cSrcweir {
348cdf0e10cSrcweir if( pVar )
349cdf0e10cSrcweir {
350cdf0e10cSrcweir for( sal_uInt32 i = 0; i < pData->size(); i++ )
351cdf0e10cSrcweir {
352cdf0e10cSrcweir SbxVariableRef* pRef = (*pData)[i];
353cdf0e10cSrcweir // SbxVariableRef* pRef = pData->GetObject( i );
354cdf0e10cSrcweir if( *pRef == pVar )
355cdf0e10cSrcweir {
356cdf0e10cSrcweir Remove32( i ); break;
357cdf0e10cSrcweir }
358cdf0e10cSrcweir }
359cdf0e10cSrcweir }
360cdf0e10cSrcweir }
361cdf0e10cSrcweir
362cdf0e10cSrcweir // Uebernahme der Daten aus dem uebergebenen Array, wobei
363cdf0e10cSrcweir // gleichnamige Variable ueberschrieben werden.
364cdf0e10cSrcweir
Merge(SbxArray * p)365cdf0e10cSrcweir void SbxArray::Merge( SbxArray* p )
366cdf0e10cSrcweir {
367cdf0e10cSrcweir if( p )
368cdf0e10cSrcweir {
369cdf0e10cSrcweir sal_uInt32 nSize = p->Count();
370cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nSize; i++ )
371cdf0e10cSrcweir {
372cdf0e10cSrcweir SbxVarEntryPtr pRef1 = (*(p->pData))[i];
373cdf0e10cSrcweir // Ist das Element by name schon drin?
374cdf0e10cSrcweir // Dann ueberschreiben!
375cdf0e10cSrcweir SbxVariable* pVar = *pRef1;
376cdf0e10cSrcweir if( pVar )
377cdf0e10cSrcweir {
378cdf0e10cSrcweir XubString aName = pVar->GetName();
379cdf0e10cSrcweir sal_uInt16 nHash = pVar->GetHashCode();
380cdf0e10cSrcweir for( sal_uInt32 j = 0; j < pData->size(); j++ )
381cdf0e10cSrcweir {
382cdf0e10cSrcweir SbxVariableRef* pRef2 = (*pData)[j];
383cdf0e10cSrcweir if( (*pRef2)->GetHashCode() == nHash
384cdf0e10cSrcweir && (*pRef2)->GetName().EqualsIgnoreCaseAscii( aName ) )
385cdf0e10cSrcweir {
386cdf0e10cSrcweir *pRef2 = pVar; pRef1 = NULL;
387cdf0e10cSrcweir break;
388cdf0e10cSrcweir }
389cdf0e10cSrcweir }
390cdf0e10cSrcweir if( pRef1 )
391cdf0e10cSrcweir {
392cdf0e10cSrcweir SbxVarEntryPtr pRef = new SbxVarEntry;
393cdf0e10cSrcweir const SbxVarEntryPtr pTemp = pRef;
394cdf0e10cSrcweir pData->push_back( pTemp );
395cdf0e10cSrcweir *((SbxVariableRef*) pRef) = *((SbxVariableRef*) pRef1);
396cdf0e10cSrcweir if( pRef1->pAlias )
397cdf0e10cSrcweir pRef->pAlias = new XubString( *pRef1->pAlias );
398cdf0e10cSrcweir }
399cdf0e10cSrcweir }
400cdf0e10cSrcweir }
401cdf0e10cSrcweir }
402cdf0e10cSrcweir }
403cdf0e10cSrcweir
404cdf0e10cSrcweir // Suchen eines Elements ueber die Userdaten. Falls ein Element
405cdf0e10cSrcweir // ein Objekt ist, wird dieses ebenfalls durchsucht.
406cdf0e10cSrcweir
FindUserData(sal_uInt32 nData)407cdf0e10cSrcweir SbxVariable* SbxArray::FindUserData( sal_uInt32 nData )
408cdf0e10cSrcweir {
409cdf0e10cSrcweir SbxVariable* p = NULL;
410cdf0e10cSrcweir for( sal_uInt32 i = 0; i < pData->size(); i++ )
411cdf0e10cSrcweir {
412cdf0e10cSrcweir SbxVariableRef* pRef = (*pData)[i];
413cdf0e10cSrcweir SbxVariable* pVar = *pRef;
414cdf0e10cSrcweir if( pVar )
415cdf0e10cSrcweir {
416cdf0e10cSrcweir if( pVar->IsVisible() && pVar->GetUserData() == nData )
417cdf0e10cSrcweir {
418cdf0e10cSrcweir p = pVar;
419cdf0e10cSrcweir p->ResetFlag( SBX_EXTFOUND );
420cdf0e10cSrcweir break; // JSM 06.10.95
421cdf0e10cSrcweir }
422cdf0e10cSrcweir // Haben wir ein Array/Objekt mit Extended Search?
423cdf0e10cSrcweir else if( pVar->IsSet( SBX_EXTSEARCH ) )
424cdf0e10cSrcweir {
425cdf0e10cSrcweir switch( pVar->GetClass() )
426cdf0e10cSrcweir {
427cdf0e10cSrcweir case SbxCLASS_OBJECT:
428cdf0e10cSrcweir {
429cdf0e10cSrcweir // Objekte duerfen ihren Parent nicht durchsuchen
430cdf0e10cSrcweir sal_uInt16 nOld = pVar->GetFlags();
431cdf0e10cSrcweir pVar->ResetFlag( SBX_GBLSEARCH );
432cdf0e10cSrcweir p = ((SbxObject*) pVar)->FindUserData( nData );
433cdf0e10cSrcweir pVar->SetFlags( nOld );
434cdf0e10cSrcweir break;
435cdf0e10cSrcweir }
436cdf0e10cSrcweir case SbxCLASS_ARRAY:
437cdf0e10cSrcweir p = ((SbxArray*) pVar)->FindUserData( nData );
438cdf0e10cSrcweir break;
439cdf0e10cSrcweir default: break;
440cdf0e10cSrcweir }
441cdf0e10cSrcweir if( p )
442cdf0e10cSrcweir {
443cdf0e10cSrcweir p->SetFlag( SBX_EXTFOUND );
444cdf0e10cSrcweir break;
445cdf0e10cSrcweir }
446cdf0e10cSrcweir }
447cdf0e10cSrcweir }
448cdf0e10cSrcweir }
449cdf0e10cSrcweir return p;
450cdf0e10cSrcweir }
451cdf0e10cSrcweir
452cdf0e10cSrcweir // Suchen eines Elements ueber den Namen und den Typ. Falls ein Element
453cdf0e10cSrcweir // ein Objekt ist, wird dieses ebenfalls durchsucht.
454cdf0e10cSrcweir
Find(const XubString & rName,SbxClassType t)455cdf0e10cSrcweir SbxVariable* SbxArray::Find( const XubString& rName, SbxClassType t )
456cdf0e10cSrcweir {
457cdf0e10cSrcweir SbxVariable* p = NULL;
458cdf0e10cSrcweir sal_uInt32 nCount = pData->size();
459cdf0e10cSrcweir if( !nCount )
460cdf0e10cSrcweir return NULL;
461cdf0e10cSrcweir sal_Bool bExtSearch = IsSet( SBX_EXTSEARCH );
462cdf0e10cSrcweir sal_uInt16 nHash = SbxVariable::MakeHashCode( rName );
463cdf0e10cSrcweir for( sal_uInt32 i = 0; i < nCount; i++ )
464cdf0e10cSrcweir {
465cdf0e10cSrcweir SbxVariableRef* pRef = (*pData)[i];
466cdf0e10cSrcweir SbxVariable* pVar = *pRef;
467cdf0e10cSrcweir if( pVar && pVar->IsVisible() )
468cdf0e10cSrcweir {
469cdf0e10cSrcweir // Die ganz sichere Suche klappt auch, wenn es
470cdf0e10cSrcweir // keinen Hascode gibt!
471cdf0e10cSrcweir sal_uInt16 nVarHash = pVar->GetHashCode();
472cdf0e10cSrcweir if( ( !nVarHash || nVarHash == nHash )
473cdf0e10cSrcweir && ( t == SbxCLASS_DONTCARE || pVar->GetClass() == t )
474cdf0e10cSrcweir && ( pVar->GetName().EqualsIgnoreCaseAscii( rName ) ) )
475cdf0e10cSrcweir {
476cdf0e10cSrcweir p = pVar;
477cdf0e10cSrcweir p->ResetFlag( SBX_EXTFOUND );
478cdf0e10cSrcweir break;
479cdf0e10cSrcweir }
480cdf0e10cSrcweir // Haben wir ein Array/Objekt mit Extended Search?
481cdf0e10cSrcweir else if( bExtSearch && pVar->IsSet( SBX_EXTSEARCH ) )
482cdf0e10cSrcweir {
483cdf0e10cSrcweir switch( pVar->GetClass() )
484cdf0e10cSrcweir {
485cdf0e10cSrcweir case SbxCLASS_OBJECT:
486cdf0e10cSrcweir {
487cdf0e10cSrcweir // Objekte duerfen ihren Parent nicht durchsuchen
488cdf0e10cSrcweir sal_uInt16 nOld = pVar->GetFlags();
489cdf0e10cSrcweir pVar->ResetFlag( SBX_GBLSEARCH );
490cdf0e10cSrcweir p = ((SbxObject*) pVar)->Find( rName, t );
491cdf0e10cSrcweir pVar->SetFlags( nOld );
492cdf0e10cSrcweir break;
493cdf0e10cSrcweir }
494cdf0e10cSrcweir case SbxCLASS_ARRAY:
495cdf0e10cSrcweir p = ((SbxArray*) pVar)->Find( rName, t );
496cdf0e10cSrcweir break;
497cdf0e10cSrcweir default: break;
498cdf0e10cSrcweir }
499cdf0e10cSrcweir if( p )
500cdf0e10cSrcweir {
501cdf0e10cSrcweir p->SetFlag( SBX_EXTFOUND );
502cdf0e10cSrcweir break;
503cdf0e10cSrcweir }
504cdf0e10cSrcweir }
505cdf0e10cSrcweir }
506cdf0e10cSrcweir }
507cdf0e10cSrcweir return p;
508cdf0e10cSrcweir }
509cdf0e10cSrcweir
LoadData(SvStream & rStrm,sal_uInt16 nVer)510cdf0e10cSrcweir sal_Bool SbxArray::LoadData( SvStream& rStrm, sal_uInt16 nVer )
511cdf0e10cSrcweir {
512cdf0e10cSrcweir sal_uInt16 nElem;
513cdf0e10cSrcweir Clear();
514cdf0e10cSrcweir sal_Bool bRes = sal_True;
515cdf0e10cSrcweir sal_uInt16 f = nFlags;
516cdf0e10cSrcweir nFlags |= SBX_WRITE;
517cdf0e10cSrcweir rStrm >> nElem;
518cdf0e10cSrcweir nElem &= 0x7FFF;
519cdf0e10cSrcweir for( sal_uInt32 n = 0; n < nElem; n++ )
520cdf0e10cSrcweir {
521cdf0e10cSrcweir sal_uInt16 nIdx;
522cdf0e10cSrcweir rStrm >> nIdx;
523cdf0e10cSrcweir SbxVariable* pVar = (SbxVariable*) Load( rStrm );
524cdf0e10cSrcweir if( pVar )
525cdf0e10cSrcweir {
526cdf0e10cSrcweir SbxVariableRef& rRef = GetRef( nIdx );
527cdf0e10cSrcweir rRef = pVar;
528cdf0e10cSrcweir }
529cdf0e10cSrcweir else
530cdf0e10cSrcweir {
531cdf0e10cSrcweir bRes = sal_False; break;
532cdf0e10cSrcweir }
533cdf0e10cSrcweir }
534cdf0e10cSrcweir if( bRes )
535cdf0e10cSrcweir bRes = LoadPrivateData( rStrm, nVer );
536cdf0e10cSrcweir nFlags = f;
537cdf0e10cSrcweir return bRes;
538cdf0e10cSrcweir }
539cdf0e10cSrcweir
StoreData(SvStream & rStrm) const540cdf0e10cSrcweir sal_Bool SbxArray::StoreData( SvStream& rStrm ) const
541cdf0e10cSrcweir {
542cdf0e10cSrcweir sal_uInt32 nElem = 0;
543cdf0e10cSrcweir sal_uInt32 n;
544cdf0e10cSrcweir // Welche Elemente sind ueberhaupt definiert?
545cdf0e10cSrcweir for( n = 0; n < pData->size(); n++ )
546cdf0e10cSrcweir {
547cdf0e10cSrcweir SbxVariableRef* pRef = (*pData)[n];
548cdf0e10cSrcweir SbxVariable* p = *pRef;
549cdf0e10cSrcweir if( p && !( p->GetFlags() & SBX_DONTSTORE ) )
550cdf0e10cSrcweir nElem++;
551cdf0e10cSrcweir }
552cdf0e10cSrcweir rStrm << (sal_uInt16) nElem;
553cdf0e10cSrcweir for( n = 0; n < pData->size(); n++ )
554cdf0e10cSrcweir {
555cdf0e10cSrcweir SbxVariableRef* pRef = (*pData)[n];
556cdf0e10cSrcweir SbxVariable* p = *pRef;
557cdf0e10cSrcweir if( p && !( p->GetFlags() & SBX_DONTSTORE ) )
558cdf0e10cSrcweir {
559cdf0e10cSrcweir rStrm << (sal_uInt16) n;
560cdf0e10cSrcweir if( !p->Store( rStrm ) )
561cdf0e10cSrcweir return sal_False;
562cdf0e10cSrcweir }
563cdf0e10cSrcweir }
564cdf0e10cSrcweir return StorePrivateData( rStrm );
565cdf0e10cSrcweir }
566cdf0e10cSrcweir
567cdf0e10cSrcweir // #100883 Method to set method directly to parameter array
PutDirect(SbxVariable * pVar,sal_uInt32 nIdx)568cdf0e10cSrcweir void SbxArray::PutDirect( SbxVariable* pVar, sal_uInt32 nIdx )
569cdf0e10cSrcweir {
570cdf0e10cSrcweir SbxVariableRef& rRef = GetRef32( nIdx );
571cdf0e10cSrcweir rRef = pVar;
572cdf0e10cSrcweir }
573cdf0e10cSrcweir
574cdf0e10cSrcweir
575cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
576cdf0e10cSrcweir //
577cdf0e10cSrcweir // SbxArray
578cdf0e10cSrcweir //
579cdf0e10cSrcweir //////////////////////////////////////////////////////////////////////////
580cdf0e10cSrcweir
SbxDimArray(SbxDataType t)581cdf0e10cSrcweir SbxDimArray::SbxDimArray( SbxDataType t ) : SbxArray( t ), mbHasFixedSize( false )
582cdf0e10cSrcweir {
583cdf0e10cSrcweir pFirst = pLast = NULL;
584cdf0e10cSrcweir nDim = 0;
585cdf0e10cSrcweir }
586cdf0e10cSrcweir
SbxDimArray(const SbxDimArray & rArray)587cdf0e10cSrcweir SbxDimArray::SbxDimArray( const SbxDimArray& rArray )
588cdf0e10cSrcweir : SvRefBase( rArray ), SbxArray( rArray.eType )
589cdf0e10cSrcweir {
590cdf0e10cSrcweir pFirst = pLast = NULL;
591cdf0e10cSrcweir nDim = 0;
592cdf0e10cSrcweir *this = rArray;
593cdf0e10cSrcweir }
594cdf0e10cSrcweir
operator =(const SbxDimArray & rArray)595cdf0e10cSrcweir SbxDimArray& SbxDimArray::operator=( const SbxDimArray& rArray )
596cdf0e10cSrcweir {
597cdf0e10cSrcweir if( &rArray != this )
598cdf0e10cSrcweir {
599cdf0e10cSrcweir SbxArray::operator=( (const SbxArray&) rArray );
600cdf0e10cSrcweir SbxDim* p = rArray.pFirst;
601cdf0e10cSrcweir while( p )
602cdf0e10cSrcweir {
603cdf0e10cSrcweir AddDim32( p->nLbound, p->nUbound );
604cdf0e10cSrcweir p = p->pNext;
605cdf0e10cSrcweir }
606cdf0e10cSrcweir this->mbHasFixedSize = rArray.mbHasFixedSize;
607cdf0e10cSrcweir }
608cdf0e10cSrcweir return *this;
609cdf0e10cSrcweir }
610cdf0e10cSrcweir
~SbxDimArray()611cdf0e10cSrcweir SbxDimArray::~SbxDimArray()
612cdf0e10cSrcweir {
613cdf0e10cSrcweir Clear();
614cdf0e10cSrcweir }
615cdf0e10cSrcweir
Clear()616cdf0e10cSrcweir void SbxDimArray::Clear()
617cdf0e10cSrcweir {
618cdf0e10cSrcweir SbxDim* p = pFirst;
619cdf0e10cSrcweir while( p )
620cdf0e10cSrcweir {
621cdf0e10cSrcweir SbxDim* q = p->pNext;
622cdf0e10cSrcweir delete p;
623cdf0e10cSrcweir p = q;
624cdf0e10cSrcweir }
625cdf0e10cSrcweir pFirst = pLast = NULL;
626cdf0e10cSrcweir nDim = 0;
627cdf0e10cSrcweir }
628cdf0e10cSrcweir
629cdf0e10cSrcweir // Dimension hinzufuegen
630cdf0e10cSrcweir
AddDimImpl32(sal_Int32 lb,sal_Int32 ub,sal_Bool bAllowSize0)631cdf0e10cSrcweir void SbxDimArray::AddDimImpl32( sal_Int32 lb, sal_Int32 ub, sal_Bool bAllowSize0 )
632cdf0e10cSrcweir {
633cdf0e10cSrcweir SbxError eRes = SbxERR_OK;
634cdf0e10cSrcweir if( ub < lb && !bAllowSize0 )
635cdf0e10cSrcweir {
636cdf0e10cSrcweir eRes = SbxERR_BOUNDS;
637cdf0e10cSrcweir ub = lb;
638cdf0e10cSrcweir }
639cdf0e10cSrcweir SbxDim* p = new SbxDim;
640cdf0e10cSrcweir p->nLbound = lb;
641cdf0e10cSrcweir p->nUbound = ub;
642cdf0e10cSrcweir p->nSize = ub - lb + 1;
643cdf0e10cSrcweir p->pNext = NULL;
644cdf0e10cSrcweir if( !pFirst )
645cdf0e10cSrcweir pFirst = pLast = p;
646cdf0e10cSrcweir else
647cdf0e10cSrcweir pLast->pNext = p, pLast = p;
648cdf0e10cSrcweir nDim++;
649cdf0e10cSrcweir if( eRes )
650cdf0e10cSrcweir SetError( eRes );
651cdf0e10cSrcweir }
652cdf0e10cSrcweir
AddDim(short lb,short ub)653cdf0e10cSrcweir void SbxDimArray::AddDim( short lb, short ub )
654cdf0e10cSrcweir {
655cdf0e10cSrcweir AddDimImpl32( lb, ub, sal_False );
656cdf0e10cSrcweir }
657cdf0e10cSrcweir
unoAddDim(short lb,short ub)658cdf0e10cSrcweir void SbxDimArray::unoAddDim( short lb, short ub )
659cdf0e10cSrcweir {
660cdf0e10cSrcweir AddDimImpl32( lb, ub, sal_True );
661cdf0e10cSrcweir }
662cdf0e10cSrcweir
AddDim32(sal_Int32 lb,sal_Int32 ub)663cdf0e10cSrcweir void SbxDimArray::AddDim32( sal_Int32 lb, sal_Int32 ub )
664cdf0e10cSrcweir {
665cdf0e10cSrcweir AddDimImpl32( lb, ub, sal_False );
666cdf0e10cSrcweir }
667cdf0e10cSrcweir
unoAddDim32(sal_Int32 lb,sal_Int32 ub)668cdf0e10cSrcweir void SbxDimArray::unoAddDim32( sal_Int32 lb, sal_Int32 ub )
669cdf0e10cSrcweir {
670cdf0e10cSrcweir AddDimImpl32( lb, ub, sal_True );
671cdf0e10cSrcweir }
672cdf0e10cSrcweir
673cdf0e10cSrcweir
674cdf0e10cSrcweir // Dimensionsdaten auslesen
675cdf0e10cSrcweir
GetDim32(sal_Int32 n,sal_Int32 & rlb,sal_Int32 & rub) const676cdf0e10cSrcweir sal_Bool SbxDimArray::GetDim32( sal_Int32 n, sal_Int32& rlb, sal_Int32& rub ) const
677cdf0e10cSrcweir {
678cdf0e10cSrcweir if( n < 1 || n > nDim )
679cdf0e10cSrcweir {
680cdf0e10cSrcweir SetError( SbxERR_BOUNDS ); rub = rlb = 0; return sal_False;
681cdf0e10cSrcweir }
682cdf0e10cSrcweir SbxDim* p = pFirst;
683cdf0e10cSrcweir while( --n )
684cdf0e10cSrcweir p = p->pNext;
685cdf0e10cSrcweir rub = p->nUbound;
686cdf0e10cSrcweir rlb = p->nLbound;
687cdf0e10cSrcweir return sal_True;
688cdf0e10cSrcweir }
689cdf0e10cSrcweir
GetDim(short n,short & rlb,short & rub) const690cdf0e10cSrcweir sal_Bool SbxDimArray::GetDim( short n, short& rlb, short& rub ) const
691cdf0e10cSrcweir {
692cdf0e10cSrcweir sal_Int32 rlb32, rub32;
693cdf0e10cSrcweir sal_Bool bRet = GetDim32( n, rlb32, rub32 );
694cdf0e10cSrcweir if( bRet )
695cdf0e10cSrcweir {
696cdf0e10cSrcweir if( rlb32 < -SBX_MAXINDEX || rub32 > SBX_MAXINDEX )
697cdf0e10cSrcweir {
698cdf0e10cSrcweir SetError( SbxERR_BOUNDS );
699cdf0e10cSrcweir return sal_False;
700cdf0e10cSrcweir }
701cdf0e10cSrcweir rub = (short)rub32;
702cdf0e10cSrcweir rlb = (short)rlb32;
703cdf0e10cSrcweir }
704cdf0e10cSrcweir return bRet;
705cdf0e10cSrcweir }
706cdf0e10cSrcweir
707cdf0e10cSrcweir // Element-Ptr anhand einer Index-Liste
708cdf0e10cSrcweir
Offset32(const sal_Int32 * pIdx)709cdf0e10cSrcweir sal_uInt32 SbxDimArray::Offset32( const sal_Int32* pIdx )
710cdf0e10cSrcweir {
711cdf0e10cSrcweir sal_uInt32 nPos = 0;
712cdf0e10cSrcweir for( SbxDim* p = pFirst; p; p = p->pNext )
713cdf0e10cSrcweir {
714cdf0e10cSrcweir sal_Int32 nIdx = *pIdx++;
715cdf0e10cSrcweir if( nIdx < p->nLbound || nIdx > p->nUbound )
716cdf0e10cSrcweir {
717cdf0e10cSrcweir nPos = (sal_uInt32)SBX_MAXINDEX32 + 1; break;
718cdf0e10cSrcweir }
719cdf0e10cSrcweir nPos = nPos * p->nSize + nIdx - p->nLbound;
720cdf0e10cSrcweir }
721cdf0e10cSrcweir if( nDim == 0 || nPos > SBX_MAXINDEX32 )
722cdf0e10cSrcweir {
723cdf0e10cSrcweir SetError( SbxERR_BOUNDS ); nPos = 0;
724cdf0e10cSrcweir }
725cdf0e10cSrcweir return nPos;
726cdf0e10cSrcweir }
727cdf0e10cSrcweir
Offset(const short * pIdx)728cdf0e10cSrcweir sal_uInt16 SbxDimArray::Offset( const short* pIdx )
729cdf0e10cSrcweir {
730cdf0e10cSrcweir long nPos = 0;
731cdf0e10cSrcweir for( SbxDim* p = pFirst; p; p = p->pNext )
732cdf0e10cSrcweir {
733cdf0e10cSrcweir short nIdx = *pIdx++;
734cdf0e10cSrcweir if( nIdx < p->nLbound || nIdx > p->nUbound )
735cdf0e10cSrcweir {
736cdf0e10cSrcweir nPos = SBX_MAXINDEX + 1; break;
737cdf0e10cSrcweir }
738cdf0e10cSrcweir nPos = nPos * p->nSize + nIdx - p->nLbound;
739cdf0e10cSrcweir }
740cdf0e10cSrcweir if( nDim == 0 || nPos > SBX_MAXINDEX )
741cdf0e10cSrcweir {
742cdf0e10cSrcweir SetError( SbxERR_BOUNDS ); nPos = 0;
743cdf0e10cSrcweir }
744cdf0e10cSrcweir return (sal_uInt16) nPos;
745cdf0e10cSrcweir }
746cdf0e10cSrcweir
GetRef(const short * pIdx)747cdf0e10cSrcweir SbxVariableRef& SbxDimArray::GetRef( const short* pIdx )
748cdf0e10cSrcweir {
749cdf0e10cSrcweir return SbxArray::GetRef( Offset( pIdx ) );
750cdf0e10cSrcweir }
751cdf0e10cSrcweir
Get(const short * pIdx)752cdf0e10cSrcweir SbxVariable* SbxDimArray::Get( const short* pIdx )
753cdf0e10cSrcweir {
754cdf0e10cSrcweir return SbxArray::Get( Offset( pIdx ) );
755cdf0e10cSrcweir }
756cdf0e10cSrcweir
Put(SbxVariable * p,const short * pIdx)757cdf0e10cSrcweir void SbxDimArray::Put( SbxVariable* p, const short* pIdx )
758cdf0e10cSrcweir {
759cdf0e10cSrcweir SbxArray::Put( p, Offset( pIdx ) );
760cdf0e10cSrcweir }
761cdf0e10cSrcweir
GetRef32(const sal_Int32 * pIdx)762cdf0e10cSrcweir SbxVariableRef& SbxDimArray::GetRef32( const sal_Int32* pIdx )
763cdf0e10cSrcweir {
764cdf0e10cSrcweir return SbxArray::GetRef32( Offset32( pIdx ) );
765cdf0e10cSrcweir }
766cdf0e10cSrcweir
Get32(const sal_Int32 * pIdx)767cdf0e10cSrcweir SbxVariable* SbxDimArray::Get32( const sal_Int32* pIdx )
768cdf0e10cSrcweir {
769cdf0e10cSrcweir return SbxArray::Get32( Offset32( pIdx ) );
770cdf0e10cSrcweir }
771cdf0e10cSrcweir
Put32(SbxVariable * p,const sal_Int32 * pIdx)772cdf0e10cSrcweir void SbxDimArray::Put32( SbxVariable* p, const sal_Int32* pIdx )
773cdf0e10cSrcweir {
774cdf0e10cSrcweir SbxArray::Put32( p, Offset32( pIdx ) );
775cdf0e10cSrcweir }
776cdf0e10cSrcweir
777cdf0e10cSrcweir
778cdf0e10cSrcweir // Element-Nr anhand eines Parameter-Arrays
779cdf0e10cSrcweir
Offset32(SbxArray * pPar)780cdf0e10cSrcweir sal_uInt32 SbxDimArray::Offset32( SbxArray* pPar )
781cdf0e10cSrcweir {
782cdf0e10cSrcweir if( nDim == 0 || !pPar || ( ( nDim != ( pPar->Count() - 1 ) ) && SbiRuntime::isVBAEnabled() ) )
783cdf0e10cSrcweir {
784cdf0e10cSrcweir SetError( SbxERR_BOUNDS ); return 0;
785cdf0e10cSrcweir }
786cdf0e10cSrcweir sal_uInt32 nPos = 0;
787cdf0e10cSrcweir sal_uInt16 nOff = 1; // Nicht Element 0!
788cdf0e10cSrcweir for( SbxDim* p = pFirst; p && !IsError(); p = p->pNext )
789cdf0e10cSrcweir {
790cdf0e10cSrcweir sal_Int32 nIdx = pPar->Get( nOff++ )->GetLong();
791cdf0e10cSrcweir if( nIdx < p->nLbound || nIdx > p->nUbound )
792cdf0e10cSrcweir {
793cdf0e10cSrcweir nPos = (sal_uInt32) SBX_MAXINDEX32+1; break;
794cdf0e10cSrcweir }
795cdf0e10cSrcweir nPos = nPos * p->nSize + nIdx - p->nLbound;
796cdf0e10cSrcweir }
797cdf0e10cSrcweir if( nPos > (sal_uInt32) SBX_MAXINDEX32 )
798cdf0e10cSrcweir {
799cdf0e10cSrcweir SetError( SbxERR_BOUNDS ); nPos = 0;
800cdf0e10cSrcweir }
801cdf0e10cSrcweir return nPos;
802cdf0e10cSrcweir }
803cdf0e10cSrcweir
Offset(SbxArray * pPar)804cdf0e10cSrcweir sal_uInt16 SbxDimArray::Offset( SbxArray* pPar )
805cdf0e10cSrcweir {
806cdf0e10cSrcweir sal_uInt32 nPos = Offset32( pPar );
807cdf0e10cSrcweir if( nPos > (long) SBX_MAXINDEX )
808cdf0e10cSrcweir {
809cdf0e10cSrcweir SetError( SbxERR_BOUNDS ); nPos = 0;
810cdf0e10cSrcweir }
811cdf0e10cSrcweir return (sal_uInt16) nPos;
812cdf0e10cSrcweir }
813cdf0e10cSrcweir
GetRef(SbxArray * pPar)814cdf0e10cSrcweir SbxVariableRef& SbxDimArray::GetRef( SbxArray* pPar )
815cdf0e10cSrcweir {
816cdf0e10cSrcweir return SbxArray::GetRef32( Offset32( pPar ) );
817cdf0e10cSrcweir }
818cdf0e10cSrcweir
Get(SbxArray * pPar)819cdf0e10cSrcweir SbxVariable* SbxDimArray::Get( SbxArray* pPar )
820cdf0e10cSrcweir {
821cdf0e10cSrcweir return SbxArray::Get32( Offset32( pPar ) );
822cdf0e10cSrcweir }
823cdf0e10cSrcweir
Put(SbxVariable * p,SbxArray * pPar)824cdf0e10cSrcweir void SbxDimArray::Put( SbxVariable* p, SbxArray* pPar )
825cdf0e10cSrcweir {
826cdf0e10cSrcweir SbxArray::Put32( p, Offset32( pPar ) );
827cdf0e10cSrcweir }
828cdf0e10cSrcweir
LoadData(SvStream & rStrm,sal_uInt16 nVer)829cdf0e10cSrcweir sal_Bool SbxDimArray::LoadData( SvStream& rStrm, sal_uInt16 nVer )
830cdf0e10cSrcweir {
831cdf0e10cSrcweir short nDimension;
832cdf0e10cSrcweir rStrm >> nDimension;
833cdf0e10cSrcweir for( short i = 0; i < nDimension && rStrm.GetError() == SVSTREAM_OK; i++ )
834cdf0e10cSrcweir {
835cdf0e10cSrcweir sal_Int16 lb, ub;
836cdf0e10cSrcweir rStrm >> lb >> ub;
837cdf0e10cSrcweir AddDim( lb, ub );
838cdf0e10cSrcweir }
839cdf0e10cSrcweir return SbxArray::LoadData( rStrm, nVer );
840cdf0e10cSrcweir }
841cdf0e10cSrcweir
StoreData(SvStream & rStrm) const842cdf0e10cSrcweir sal_Bool SbxDimArray::StoreData( SvStream& rStrm ) const
843cdf0e10cSrcweir {
844cdf0e10cSrcweir rStrm << (sal_Int16) nDim;
845cdf0e10cSrcweir for( short i = 0; i < nDim; i++ )
846cdf0e10cSrcweir {
847cdf0e10cSrcweir short lb, ub;
848cdf0e10cSrcweir GetDim( i, lb, ub );
849cdf0e10cSrcweir rStrm << (sal_Int16) lb << (sal_Int16) ub;
850cdf0e10cSrcweir }
851cdf0e10cSrcweir return SbxArray::StoreData( rStrm );
852cdf0e10cSrcweir }
853cdf0e10cSrcweir
854