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