xref: /aoo41x/main/svl/source/items/aeitem.cxx (revision 40df464e)
1*40df464eSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*40df464eSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*40df464eSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*40df464eSAndrew Rist  * distributed with this work for additional information
6*40df464eSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*40df464eSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*40df464eSAndrew Rist  * "License"); you may not use this file except in compliance
9*40df464eSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*40df464eSAndrew Rist  *
11*40df464eSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*40df464eSAndrew Rist  *
13*40df464eSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*40df464eSAndrew Rist  * software distributed under the License is distributed on an
15*40df464eSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*40df464eSAndrew Rist  * KIND, either express or implied.  See the License for the
17*40df464eSAndrew Rist  * specific language governing permissions and limitations
18*40df464eSAndrew Rist  * under the License.
19*40df464eSAndrew Rist  *
20*40df464eSAndrew Rist  *************************************************************/
21*40df464eSAndrew Rist 
22*40df464eSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svl.hxx"
26cdf0e10cSrcweir #ifndef GCC
27cdf0e10cSrcweir #endif
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include <tools/string.hxx>
30cdf0e10cSrcweir 
31cdf0e10cSrcweir #define _SVSTDARR_USHORTS
32cdf0e10cSrcweir #include <svl/svstdarr.hxx>
33cdf0e10cSrcweir #include <svl/svarray.hxx>
34cdf0e10cSrcweir #include <svl/aeitem.hxx>
35cdf0e10cSrcweir 
36cdf0e10cSrcweir // STATIC DATA -----------------------------------------------------------
37cdf0e10cSrcweir 
38cdf0e10cSrcweir DBG_NAME(SfxAllEnumItem)
39cdf0e10cSrcweir 
40cdf0e10cSrcweir TYPEINIT1_AUTOFACTORY(SfxAllEnumItem, SfxEnumItem)
41cdf0e10cSrcweir 
42cdf0e10cSrcweir // -----------------------------------------------------------------------
43cdf0e10cSrcweir 
44cdf0e10cSrcweir struct SfxAllEnumValue_Impl
45cdf0e10cSrcweir {
46cdf0e10cSrcweir 	sal_uInt16 nValue;
47cdf0e10cSrcweir 	XubString aText;
48cdf0e10cSrcweir };
49cdf0e10cSrcweir 
50cdf0e10cSrcweir SV_DECL_PTRARR_DEL(SfxAllEnumValueArr, SfxAllEnumValue_Impl*, 0, 8)
SV_IMPL_PTRARR(SfxAllEnumValueArr,SfxAllEnumValue_Impl *)51cdf0e10cSrcweir SV_IMPL_PTRARR(SfxAllEnumValueArr, SfxAllEnumValue_Impl*)
52cdf0e10cSrcweir 
53cdf0e10cSrcweir // -----------------------------------------------------------------------
54cdf0e10cSrcweir 
55cdf0e10cSrcweir SfxAllEnumItem::SfxAllEnumItem() :
56cdf0e10cSrcweir     SfxEnumItem(),
57cdf0e10cSrcweir     pValues( 0 ),
58cdf0e10cSrcweir     pDisabledValues( 0 )
59cdf0e10cSrcweir {
60cdf0e10cSrcweir }
61cdf0e10cSrcweir 
SfxAllEnumItem(sal_uInt16 which,sal_uInt16 nVal,const XubString & rText)62cdf0e10cSrcweir SfxAllEnumItem::SfxAllEnumItem( sal_uInt16 which, sal_uInt16 nVal, const XubString &rText ):
63cdf0e10cSrcweir 	SfxEnumItem(which, nVal),
64cdf0e10cSrcweir 	pValues( 0 ),
65cdf0e10cSrcweir 	pDisabledValues( 0 )
66cdf0e10cSrcweir {
67cdf0e10cSrcweir 	DBG_CTOR(SfxAllEnumItem, 0);
68cdf0e10cSrcweir 	InsertValue( nVal, rText );
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
71cdf0e10cSrcweir // -----------------------------------------------------------------------
72cdf0e10cSrcweir 
SfxAllEnumItem(sal_uInt16 which,sal_uInt16 nVal)73cdf0e10cSrcweir SfxAllEnumItem::SfxAllEnumItem(sal_uInt16 which, sal_uInt16 nVal):
74cdf0e10cSrcweir 	SfxEnumItem(which, nVal),
75cdf0e10cSrcweir 	pValues( 0 ),
76cdf0e10cSrcweir 	pDisabledValues( 0 )
77cdf0e10cSrcweir {
78cdf0e10cSrcweir 	DBG_CTOR(SfxAllEnumItem, 0);
79cdf0e10cSrcweir 	InsertValue( nVal );
80cdf0e10cSrcweir }
81cdf0e10cSrcweir 
82cdf0e10cSrcweir // -----------------------------------------------------------------------
83cdf0e10cSrcweir 
SfxAllEnumItem(sal_uInt16 which,SvStream & rStream)84cdf0e10cSrcweir SfxAllEnumItem::SfxAllEnumItem( sal_uInt16 which, SvStream &rStream ):
85cdf0e10cSrcweir 	SfxEnumItem(which, rStream),
86cdf0e10cSrcweir 	pValues( 0 ),
87cdf0e10cSrcweir 	pDisabledValues( 0 )
88cdf0e10cSrcweir {
89cdf0e10cSrcweir 	DBG_CTOR(SfxAllEnumItem, 0);
90cdf0e10cSrcweir 	InsertValue( GetValue() );
91cdf0e10cSrcweir }
92cdf0e10cSrcweir 
93cdf0e10cSrcweir // -----------------------------------------------------------------------
94cdf0e10cSrcweir 
95cdf0e10cSrcweir 
SfxAllEnumItem(sal_uInt16 which)96cdf0e10cSrcweir SfxAllEnumItem::SfxAllEnumItem(sal_uInt16 which):
97cdf0e10cSrcweir 	SfxEnumItem(which, 0),
98cdf0e10cSrcweir 	pValues( 0 ),
99cdf0e10cSrcweir 	pDisabledValues( 0 )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir 	DBG_CTOR(SfxAllEnumItem, 0);
102cdf0e10cSrcweir }
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 
105cdf0e10cSrcweir // -----------------------------------------------------------------------
106cdf0e10cSrcweir 
SfxAllEnumItem(const SfxAllEnumItem & rCopy)107cdf0e10cSrcweir SfxAllEnumItem::SfxAllEnumItem(const SfxAllEnumItem &rCopy):
108cdf0e10cSrcweir 	SfxEnumItem(rCopy),
109cdf0e10cSrcweir 	pValues(0),
110cdf0e10cSrcweir 	pDisabledValues( 0 )
111cdf0e10cSrcweir {
112cdf0e10cSrcweir 	DBG_CTOR(SfxAllEnumItem, 0);
113cdf0e10cSrcweir 	if ( !rCopy.pValues )
114cdf0e10cSrcweir 		return;
115cdf0e10cSrcweir 
116cdf0e10cSrcweir 	pValues = new SfxAllEnumValueArr;
117cdf0e10cSrcweir 
118cdf0e10cSrcweir 	for ( sal_uInt16 nPos = 0; nPos < rCopy.pValues->Count(); ++nPos )
119cdf0e10cSrcweir 	{
120cdf0e10cSrcweir 		SfxAllEnumValue_Impl *pVal = new SfxAllEnumValue_Impl;
121cdf0e10cSrcweir 		pVal->nValue = rCopy.pValues->GetObject(nPos)->nValue;
122cdf0e10cSrcweir 		pVal->aText = rCopy.pValues->GetObject(nPos)->aText;
123cdf0e10cSrcweir 		const SfxAllEnumValue_Impl *pTemp = pVal;
124cdf0e10cSrcweir 		pValues->Insert( pTemp, nPos );
125cdf0e10cSrcweir 	}
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 	if( rCopy.pDisabledValues )
128cdf0e10cSrcweir 	{
129cdf0e10cSrcweir 		pDisabledValues = new SvUShorts;
130cdf0e10cSrcweir 		for ( sal_uInt16 nPos = 0; nPos < rCopy.pDisabledValues->Count(); ++nPos )
131cdf0e10cSrcweir 		{
132cdf0e10cSrcweir 			pDisabledValues->Insert( rCopy.pDisabledValues->GetObject(nPos),
133cdf0e10cSrcweir 									 nPos );
134cdf0e10cSrcweir 		}
135cdf0e10cSrcweir 	}
136cdf0e10cSrcweir }
137cdf0e10cSrcweir 
138cdf0e10cSrcweir // -----------------------------------------------------------------------
139cdf0e10cSrcweir 
~SfxAllEnumItem()140cdf0e10cSrcweir SfxAllEnumItem::~SfxAllEnumItem()
141cdf0e10cSrcweir {
142cdf0e10cSrcweir 	DBG_DTOR(SfxAllEnumItem, 0);
143cdf0e10cSrcweir 	delete pValues;
144cdf0e10cSrcweir 	delete pDisabledValues;
145cdf0e10cSrcweir }
146cdf0e10cSrcweir 
147cdf0e10cSrcweir // -----------------------------------------------------------------------
148cdf0e10cSrcweir 
GetValueCount() const149cdf0e10cSrcweir sal_uInt16 SfxAllEnumItem::GetValueCount() const
150cdf0e10cSrcweir {
151cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
152cdf0e10cSrcweir 	return pValues ? pValues->Count() : 0;
153cdf0e10cSrcweir }
154cdf0e10cSrcweir 
155cdf0e10cSrcweir // -----------------------------------------------------------------------
156cdf0e10cSrcweir 
GetValueTextByPos(sal_uInt16 nPos) const157cdf0e10cSrcweir XubString SfxAllEnumItem::GetValueTextByPos( sal_uInt16 nPos ) const
158cdf0e10cSrcweir {
159cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
160cdf0e10cSrcweir 	DBG_ASSERT( pValues && nPos < pValues->Count(), "enum overflow" );
161cdf0e10cSrcweir 	return pValues->GetObject(nPos)->aText;
162cdf0e10cSrcweir }
163cdf0e10cSrcweir 
164cdf0e10cSrcweir // -----------------------------------------------------------------------
165cdf0e10cSrcweir 
GetValueByPos(sal_uInt16 nPos) const166cdf0e10cSrcweir sal_uInt16 SfxAllEnumItem::GetValueByPos( sal_uInt16 nPos ) const
167cdf0e10cSrcweir {
168cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
169cdf0e10cSrcweir 	DBG_ASSERT( pValues && nPos < pValues->Count(), "enum overflow" );
170cdf0e10cSrcweir 	return pValues->GetObject(nPos)->nValue;
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir // -----------------------------------------------------------------------
174cdf0e10cSrcweir 
Clone(SfxItemPool *) const175cdf0e10cSrcweir SfxPoolItem* SfxAllEnumItem::Clone( SfxItemPool * ) const
176cdf0e10cSrcweir {
177cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
178cdf0e10cSrcweir 	return new SfxAllEnumItem(*this);
179cdf0e10cSrcweir }
180cdf0e10cSrcweir 
181cdf0e10cSrcweir // -----------------------------------------------------------------------
182cdf0e10cSrcweir 
Create(SvStream & rStream,sal_uInt16) const183cdf0e10cSrcweir SfxPoolItem* SfxAllEnumItem::Create( SvStream & rStream, sal_uInt16 ) const
184cdf0e10cSrcweir {
185cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
186cdf0e10cSrcweir 	return new SfxAllEnumItem( Which(), rStream );
187cdf0e10cSrcweir }
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 
190cdf0e10cSrcweir // -----------------------------------------------------------------------
191cdf0e10cSrcweir 
_GetPosByValue(sal_uInt16 nVal) const192cdf0e10cSrcweir sal_uInt16 SfxAllEnumItem::_GetPosByValue( sal_uInt16 nVal ) const
193cdf0e10cSrcweir 
194cdf0e10cSrcweir /*	[Beschreibung]
195cdf0e10cSrcweir 
196cdf0e10cSrcweir 	Im Ggs. zu <SfxEnumItemInterface::GetPosByValue(sal_uInt16)const> liefert
197cdf0e10cSrcweir 	diese interne Methode bei nicht vorhandenen Values die Position,
198cdf0e10cSrcweir 	an der der Wert liegen w"urde.
199cdf0e10cSrcweir */
200cdf0e10cSrcweir 
201cdf0e10cSrcweir {
202cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
203cdf0e10cSrcweir 
204cdf0e10cSrcweir 	if ( !pValues )
205cdf0e10cSrcweir 		return 0;
206cdf0e10cSrcweir 
207cdf0e10cSrcweir 	//!O: binaere Suche oder SortArray verwenden
208cdf0e10cSrcweir 	sal_uInt16 nPos;
209cdf0e10cSrcweir 	for ( nPos = 0; nPos < pValues->Count(); ++nPos )
210cdf0e10cSrcweir 		if ( pValues->GetObject(nPos)->nValue >= nVal )
211cdf0e10cSrcweir 			return nPos;
212cdf0e10cSrcweir 	return nPos;
213cdf0e10cSrcweir }
214cdf0e10cSrcweir 
215cdf0e10cSrcweir // -----------------------------------------------------------------------
216cdf0e10cSrcweir 
GetPosByValue(sal_uInt16 nValue) const217cdf0e10cSrcweir sal_uInt16 SfxAllEnumItem::GetPosByValue( sal_uInt16 nValue ) const
218cdf0e10cSrcweir 
219cdf0e10cSrcweir /*  [Beschreibung]
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 	Liefert im Gegensatz zu <SfxEnumItemInterface::GetPosByValue(sal_uInt16)const>
222cdf0e10cSrcweir 	immer nValue zur"uck, solange nicht mindestens ein Wert mit einer der
223cdf0e10cSrcweir 	Methoden <SfxAllEnumItem::InsertValue()> eingef"ugt wurde.
224cdf0e10cSrcweir */
225cdf0e10cSrcweir 
226cdf0e10cSrcweir {
227cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
228cdf0e10cSrcweir 
229cdf0e10cSrcweir 	if ( !pValues || !pValues->Count() )
230cdf0e10cSrcweir 		return nValue;
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 	return SfxEnumItem::GetPosByValue( nValue );
233cdf0e10cSrcweir }
234cdf0e10cSrcweir 
235cdf0e10cSrcweir // -----------------------------------------------------------------------
236cdf0e10cSrcweir 
InsertValue(sal_uInt16 nValue,const XubString & rValue)237cdf0e10cSrcweir void SfxAllEnumItem::InsertValue( sal_uInt16 nValue, const XubString &rValue )
238cdf0e10cSrcweir {
239cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
240cdf0e10cSrcweir 	SfxAllEnumValue_Impl *pVal = new SfxAllEnumValue_Impl;
241cdf0e10cSrcweir 	pVal->nValue = nValue;
242cdf0e10cSrcweir 	pVal->aText = rValue;
243cdf0e10cSrcweir 	const SfxAllEnumValue_Impl *pTemp = pVal;
244cdf0e10cSrcweir 	if ( !pValues )
245cdf0e10cSrcweir 		pValues = new SfxAllEnumValueArr;
246cdf0e10cSrcweir 	else if ( GetPosByValue( nValue ) != USHRT_MAX )
247cdf0e10cSrcweir 		// remove when exists
248cdf0e10cSrcweir 		RemoveValue( nValue );
249cdf0e10cSrcweir 	// then insert
250cdf0e10cSrcweir 	pValues->Insert( pTemp, _GetPosByValue(nValue) ); //! doppelte?!
251cdf0e10cSrcweir }
252cdf0e10cSrcweir 
253cdf0e10cSrcweir // -----------------------------------------------------------------------
254cdf0e10cSrcweir 
InsertValue(sal_uInt16 nValue)255cdf0e10cSrcweir void SfxAllEnumItem::InsertValue( sal_uInt16 nValue )
256cdf0e10cSrcweir {
257cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
258cdf0e10cSrcweir 	SfxAllEnumValue_Impl *pVal = new SfxAllEnumValue_Impl;
259cdf0e10cSrcweir 	pVal->nValue = nValue;
260cdf0e10cSrcweir 	pVal->aText = XubString::CreateFromInt32( nValue );
261cdf0e10cSrcweir 	const SfxAllEnumValue_Impl *pTemp = pVal;
262cdf0e10cSrcweir 	if ( !pValues )
263cdf0e10cSrcweir 		pValues = new SfxAllEnumValueArr;
264cdf0e10cSrcweir 
265cdf0e10cSrcweir 	pValues->Insert( pTemp, _GetPosByValue(nValue) ); //! doppelte?!
266cdf0e10cSrcweir }
267cdf0e10cSrcweir 
DisableValue(sal_uInt16 nValue)268cdf0e10cSrcweir void SfxAllEnumItem::DisableValue( sal_uInt16 nValue )
269cdf0e10cSrcweir {
270cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
271cdf0e10cSrcweir 	if ( !pDisabledValues )
272cdf0e10cSrcweir 		pDisabledValues = new SvUShorts;
273cdf0e10cSrcweir 
274cdf0e10cSrcweir 	pDisabledValues->Insert( nValue, pDisabledValues->Count() );
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
IsEnabled(sal_uInt16 nValue) const277cdf0e10cSrcweir sal_Bool SfxAllEnumItem::IsEnabled( sal_uInt16 nValue ) const
278cdf0e10cSrcweir {
279cdf0e10cSrcweir 	if ( pDisabledValues )
280cdf0e10cSrcweir 	{
281cdf0e10cSrcweir 		for ( sal_uInt16 i=0; i<pDisabledValues->Count(); i++ )
282cdf0e10cSrcweir 			if ( (*pDisabledValues)[i] == nValue )
283cdf0e10cSrcweir 				return sal_False;
284cdf0e10cSrcweir 	}
285cdf0e10cSrcweir 
286cdf0e10cSrcweir 	return sal_True;
287cdf0e10cSrcweir }
288cdf0e10cSrcweir 
289cdf0e10cSrcweir // -----------------------------------------------------------------------
290cdf0e10cSrcweir 
RemoveValue(sal_uInt16 nValue)291cdf0e10cSrcweir void SfxAllEnumItem::RemoveValue( sal_uInt16 nValue )
292cdf0e10cSrcweir {
293cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
294cdf0e10cSrcweir 	sal_uInt16 nPos = GetPosByValue(nValue);
295cdf0e10cSrcweir 	DBG_ASSERT( nPos != USHRT_MAX, "removing value not in enum" );
296cdf0e10cSrcweir 	pValues->Remove( nPos );
297cdf0e10cSrcweir }
298cdf0e10cSrcweir 
299cdf0e10cSrcweir // -----------------------------------------------------------------------
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 
RemoveAllValues()302cdf0e10cSrcweir void SfxAllEnumItem::RemoveAllValues()
303cdf0e10cSrcweir {
304cdf0e10cSrcweir 	DBG_CHKTHIS(SfxAllEnumItem, 0);
305cdf0e10cSrcweir 	if ( pValues )
306cdf0e10cSrcweir 		pValues->DeleteAndDestroy( 0, pValues->Count() );
307cdf0e10cSrcweir }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 
310cdf0e10cSrcweir 
311