1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 28 // MARKER(update_precomp.py): autogen include statement, do not remove 29 #include "precompiled_svx.hxx" 30 #include <com/sun/star/uno/Sequence.hxx> 31 32 #include <svx/svdlayer.hxx> 33 #include <svx/svdmodel.hxx> // fuer Broadcasting 34 #include "svx/svdglob.hxx" // StringCache 35 #include "svx/svdstr.hrc" // Namen aus der Resource 36 37 //////////////////////////////////////////////////////////////////////////////////////////////////// 38 // SetOfByte 39 //////////////////////////////////////////////////////////////////////////////////////////////////// 40 41 sal_Bool SetOfByte::IsEmpty() const 42 { 43 for(sal_uInt16 i(0); i < 32; i++) 44 { 45 if(aData[i] != 0) 46 return sal_False; 47 } 48 49 return sal_True; 50 } 51 52 sal_Bool SetOfByte::IsFull() const 53 { 54 for(sal_uInt16 i(0); i < 32; i++) 55 { 56 if(aData[i] != 0xFF) 57 return sal_False; 58 } 59 60 return sal_True; 61 } 62 63 sal_uInt16 SetOfByte::GetSetCount() const 64 { 65 sal_uInt16 nRet(0); 66 67 for(sal_uInt16 i(0); i < 32; i++) 68 { 69 sal_uInt8 a(aData[i]); 70 71 if(a != 0) 72 { 73 if(a & 0x80) nRet++; 74 if(a & 0x40) nRet++; 75 if(a & 0x20) nRet++; 76 if(a & 0x10) nRet++; 77 if(a & 0x08) nRet++; 78 if(a & 0x04) nRet++; 79 if(a & 0x02) nRet++; 80 if(a & 0x01) nRet++; 81 } 82 } 83 84 return nRet; 85 } 86 87 sal_uInt8 SetOfByte::GetSetBit(sal_uInt16 nNum) const 88 { 89 nNum++; 90 sal_uInt16 i(0), j(0); 91 sal_uInt16 nRet(0); 92 93 while(j < nNum && i < 256) 94 { 95 if(IsSet(sal_uInt8(i))) 96 j++; 97 i++; 98 } 99 100 if(j == nNum) 101 nRet = i - 1; 102 103 return sal_uInt8(nRet); 104 } 105 106 sal_uInt16 SetOfByte::GetClearCount() const 107 { 108 return sal_uInt16(256 - GetSetCount()); 109 } 110 111 sal_uInt8 SetOfByte::GetClearBit(sal_uInt16 nNum) const 112 { 113 nNum++; 114 sal_uInt16 i(0), j(0); 115 sal_uInt16 nRet(0); 116 117 while(j < nNum && i < 256) 118 { 119 if(!IsSet(sal_uInt8(i))) 120 j++; 121 i++; 122 } 123 124 if(j == nNum) 125 nRet = i - 1; 126 127 return sal_uInt8(nRet); 128 } 129 130 void SetOfByte::operator&=(const SetOfByte& r2ndSet) 131 { 132 for(sal_uInt16 i(0); i < 32; i++) 133 { 134 aData[i] &= r2ndSet.aData[i]; 135 } 136 } 137 138 void SetOfByte::operator|=(const SetOfByte& r2ndSet) 139 { 140 for(sal_uInt16 i(0); i < 32; i++) 141 { 142 aData[i] |= r2ndSet.aData[i]; 143 } 144 } 145 146 /** initialize this set with a uno sequence of sal_Int8 147 */ 148 void SetOfByte::PutValue( const com::sun::star::uno::Any & rAny ) 149 { 150 com::sun::star::uno::Sequence< sal_Int8 > aSeq; 151 if( rAny >>= aSeq ) 152 { 153 sal_Int16 nCount = (sal_Int16)aSeq.getLength(); 154 if( nCount > 32 ) 155 nCount = 32; 156 157 sal_Int16 nIndex; 158 for( nIndex = 0; nIndex < nCount; nIndex++ ) 159 { 160 aData[nIndex] = static_cast<sal_uInt8>(aSeq[nIndex]); 161 } 162 163 for( ; nIndex < 32; nIndex++ ) 164 { 165 aData[nIndex] = 0; 166 } 167 } 168 } 169 170 /** returns a uno sequence of sal_Int8 171 */ 172 void SetOfByte::QueryValue( com::sun::star::uno::Any & rAny ) const 173 { 174 sal_Int16 nNumBytesSet = 0; 175 sal_Int16 nIndex; 176 for( nIndex = 31; nIndex >= 00; nIndex-- ) 177 { 178 if( 0 != aData[nIndex] ) 179 { 180 nNumBytesSet = nIndex + 1; 181 break; 182 } 183 } 184 185 com::sun::star::uno::Sequence< sal_Int8 > aSeq( nNumBytesSet ); 186 187 for( nIndex = 0; nIndex < nNumBytesSet; nIndex++ ) 188 { 189 aSeq[nIndex] = static_cast<sal_Int8>(aData[nIndex]); 190 } 191 192 rAny <<= aSeq; 193 } 194 195 //////////////////////////////////////////////////////////////////////////////////////////////////// 196 // SdrLayer 197 //////////////////////////////////////////////////////////////////////////////////////////////////// 198 199 void SdrLayer::SetStandardLayer(FASTBOOL bStd) 200 { 201 nType=(sal_uInt16)bStd; 202 if (bStd) { 203 aName=ImpGetResStr(STR_StandardLayerName); 204 } 205 if (pModel!=NULL) { 206 SdrHint aHint(HINT_LAYERCHG); 207 pModel->Broadcast(aHint); 208 pModel->SetChanged(); 209 } 210 } 211 212 void SdrLayer::SetName(const XubString& rNewName) 213 { 214 if(!rNewName.Equals(aName)) 215 { 216 aName = rNewName; 217 nType = 0; // Userdefined 218 219 if(pModel) 220 { 221 SdrHint aHint(HINT_LAYERCHG); 222 223 pModel->Broadcast(aHint); 224 pModel->SetChanged(); 225 } 226 } 227 } 228 229 bool SdrLayer::operator==(const SdrLayer& rCmpLayer) const 230 { 231 return (nID == rCmpLayer.nID 232 && nType == rCmpLayer.nType 233 && aName.Equals(rCmpLayer.aName)); 234 } 235 236 //////////////////////////////////////////////////////////////////////////////////////////////////// 237 // SdrLayerAdmin 238 //////////////////////////////////////////////////////////////////////////////////////////////////// 239 240 SdrLayerAdmin::SdrLayerAdmin(SdrLayerAdmin* pNewParent): 241 aLayer(1024,16,16), 242 aLSets(1024,16,16), 243 pModel(NULL) 244 { 245 sal_Char aTextControls[] = "Controls"; 246 aControlLayerName = String(aTextControls, sizeof(aTextControls-1)); 247 pParent=pNewParent; 248 } 249 250 SdrLayerAdmin::SdrLayerAdmin(const SdrLayerAdmin& rSrcLayerAdmin): 251 aLayer(1024,16,16), 252 aLSets(1024,16,16), 253 pParent(NULL), 254 pModel(NULL) 255 { 256 sal_Char aTextControls[] = "Controls"; 257 aControlLayerName = String(aTextControls, sizeof(aTextControls-1)); 258 *this = rSrcLayerAdmin; 259 } 260 261 SdrLayerAdmin::~SdrLayerAdmin() 262 { 263 ClearLayer(); 264 } 265 266 void SdrLayerAdmin::ClearLayer() 267 { 268 SdrLayer* pL; 269 pL=(SdrLayer*)aLayer.First(); 270 while (pL!=NULL) { 271 delete pL; 272 pL=(SdrLayer*)aLayer.Next(); 273 } 274 aLayer.Clear(); 275 } 276 277 const SdrLayerAdmin& SdrLayerAdmin::operator=(const SdrLayerAdmin& rSrcLayerAdmin) 278 { 279 ClearLayer(); 280 pParent=rSrcLayerAdmin.pParent; 281 sal_uInt16 i; 282 sal_uInt16 nAnz=rSrcLayerAdmin.GetLayerCount(); 283 for (i=0; i<nAnz; i++) { 284 aLayer.Insert(new SdrLayer(*rSrcLayerAdmin.GetLayer(i)),CONTAINER_APPEND); 285 } 286 return *this; 287 } 288 289 bool SdrLayerAdmin::operator==(const SdrLayerAdmin& rCmpLayerAdmin) const 290 { 291 if (pParent!=rCmpLayerAdmin.pParent || 292 aLayer.Count()!=rCmpLayerAdmin.aLayer.Count() || 293 aLSets.Count()!=rCmpLayerAdmin.aLSets.Count()) return sal_False; 294 FASTBOOL bOk=sal_True; 295 sal_uInt16 nAnz=GetLayerCount(); 296 sal_uInt16 i=0; 297 while (bOk && i<nAnz) { 298 bOk=*GetLayer(i)==*rCmpLayerAdmin.GetLayer(i); 299 i++; 300 } 301 return bOk; 302 } 303 304 void SdrLayerAdmin::SetModel(SdrModel* pNewModel) 305 { 306 if (pNewModel!=pModel) { 307 pModel=pNewModel; 308 sal_uInt16 nAnz=GetLayerCount(); 309 sal_uInt16 i; 310 for (i=0; i<nAnz; i++) { 311 GetLayer(i)->SetModel(pNewModel); 312 } 313 } 314 } 315 316 void SdrLayerAdmin::Broadcast() const 317 { 318 if (pModel!=NULL) { 319 SdrHint aHint(HINT_LAYERORDERCHG); 320 pModel->Broadcast(aHint); 321 pModel->SetChanged(); 322 } 323 } 324 325 SdrLayer* SdrLayerAdmin::RemoveLayer(sal_uInt16 nPos) 326 { 327 SdrLayer* pRetLayer=(SdrLayer*)(aLayer.Remove(nPos)); 328 Broadcast(); 329 return pRetLayer; 330 } 331 332 SdrLayer* SdrLayerAdmin::NewLayer(const XubString& rName, sal_uInt16 nPos) 333 { 334 SdrLayerID nID=GetUniqueLayerID(); 335 SdrLayer* pLay=new SdrLayer(nID,rName); 336 pLay->SetModel(pModel); 337 aLayer.Insert(pLay,nPos); 338 Broadcast(); 339 return pLay; 340 } 341 342 SdrLayer* SdrLayerAdmin::NewStandardLayer(sal_uInt16 nPos) 343 { 344 SdrLayerID nID=GetUniqueLayerID(); 345 SdrLayer* pLay=new SdrLayer(nID,String()); 346 pLay->SetStandardLayer(); 347 pLay->SetModel(pModel); 348 aLayer.Insert(pLay,nPos); 349 Broadcast(); 350 return pLay; 351 } 352 353 SdrLayer* SdrLayerAdmin::MoveLayer(sal_uInt16 nPos, sal_uInt16 nNewPos) 354 { 355 SdrLayer* pLayer=(SdrLayer*)(aLayer.Remove(nPos)); 356 if (pLayer!=NULL) { 357 aLayer.Insert(pLayer,nNewPos); 358 } 359 360 Broadcast(); 361 return pLayer; 362 } 363 364 void SdrLayerAdmin::MoveLayer(SdrLayer* pLayer, sal_uInt16 nNewPos) 365 { 366 sal_uIntPtr nPos=aLayer.GetPos(pLayer); 367 if (nPos!=CONTAINER_ENTRY_NOTFOUND) { 368 aLayer.Remove(nPos); 369 aLayer.Insert(pLayer,nNewPos); 370 Broadcast(); 371 } 372 } 373 374 sal_uInt16 SdrLayerAdmin::GetLayerPos(SdrLayer* pLayer) const 375 { 376 sal_uIntPtr nRet=SDRLAYER_NOTFOUND; 377 if (pLayer!=NULL) { 378 nRet=aLayer.GetPos(pLayer); 379 if (nRet==CONTAINER_ENTRY_NOTFOUND) { 380 nRet=SDRLAYER_NOTFOUND; 381 } 382 } 383 return sal_uInt16(nRet); 384 } 385 386 const SdrLayer* SdrLayerAdmin::GetLayer(const XubString& rName, FASTBOOL /*bInherited*/) const 387 { 388 sal_uInt16 i(0); 389 const SdrLayer* pLay = NULL; 390 391 while(i < GetLayerCount() && !pLay) 392 { 393 if(rName.Equals(GetLayer(i)->GetName())) 394 pLay = GetLayer(i); 395 else 396 i++; 397 } 398 399 if(!pLay && pParent) 400 { 401 pLay = pParent->GetLayer(rName, sal_True); 402 } 403 404 return pLay; 405 } 406 407 SdrLayerID SdrLayerAdmin::GetLayerID(const XubString& rName, FASTBOOL bInherited) const 408 { 409 SdrLayerID nRet=SDRLAYER_NOTFOUND; 410 const SdrLayer* pLay=GetLayer(rName,bInherited); 411 if (pLay!=NULL) nRet=pLay->GetID(); 412 return nRet; 413 } 414 415 const SdrLayer* SdrLayerAdmin::GetLayerPerID(sal_uInt16 nID) const 416 { 417 sal_uInt16 i=0; 418 const SdrLayer* pLay=NULL; 419 while (i<GetLayerCount() && pLay==NULL) { 420 if (nID==GetLayer(i)->GetID()) pLay=GetLayer(i); 421 else i++; 422 } 423 return pLay; 424 } 425 426 // Globale LayerID's beginnen mit 0 aufsteigend. 427 // Lokale LayerID's beginnen mit 254 absteigend. 428 // 255 ist reserviert fuer SDRLAYER_NOTFOUND 429 430 SdrLayerID SdrLayerAdmin::GetUniqueLayerID() const 431 { 432 SetOfByte aSet; 433 sal_Bool bDown = (pParent == NULL); 434 sal_uInt16 j; 435 for (j=0; j<GetLayerCount(); j++) 436 { 437 aSet.Set(GetLayer((sal_uInt16)j)->GetID()); 438 } 439 SdrLayerID i; 440 if (!bDown) 441 { 442 i=254; 443 while (i && aSet.IsSet(sal_uInt8(i))) 444 --i; 445 if (i == 0) 446 i=254; 447 } 448 else 449 { 450 i=0; 451 while (i<=254 && aSet.IsSet(sal_uInt8(i))) 452 i++; 453 if (i>254) 454 i=0; 455 } 456 return i; 457 } 458 459