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