1*5b190011SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*5b190011SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*5b190011SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*5b190011SAndrew Rist * distributed with this work for additional information 6*5b190011SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*5b190011SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*5b190011SAndrew Rist * "License"); you may not use this file except in compliance 9*5b190011SAndrew Rist * with the License. You may obtain a copy of the License at 10*5b190011SAndrew Rist * 11*5b190011SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*5b190011SAndrew Rist * 13*5b190011SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*5b190011SAndrew Rist * software distributed under the License is distributed on an 15*5b190011SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*5b190011SAndrew Rist * KIND, either express or implied. See the License for the 17*5b190011SAndrew Rist * specific language governing permissions and limitations 18*5b190011SAndrew Rist * under the License. 19*5b190011SAndrew Rist * 20*5b190011SAndrew Rist *************************************************************/ 21*5b190011SAndrew Rist 22*5b190011SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_sd.hxx" 26cdf0e10cSrcweir #include <vcl/svapp.hxx> 27cdf0e10cSrcweir #include <vos/mutex.hxx> 28cdf0e10cSrcweir 29cdf0e10cSrcweir #include <svx/unoshape.hxx> 30cdf0e10cSrcweir #include <svx/svdpool.hxx> 31cdf0e10cSrcweir #include <svx/unoprov.hxx> 32cdf0e10cSrcweir #include <editeng/unotext.hxx> 33cdf0e10cSrcweir 34cdf0e10cSrcweir #include <comphelper/extract.hxx> 35cdf0e10cSrcweir #include <rtl/uuid.h> 36cdf0e10cSrcweir #include <rtl/memory.h> 37cdf0e10cSrcweir 38cdf0e10cSrcweir #include "unohelp.hxx" 39cdf0e10cSrcweir #include "unoprnms.hxx" 40cdf0e10cSrcweir #include "unosrch.hxx" 41cdf0e10cSrcweir 42cdf0e10cSrcweir using namespace ::vos; 43cdf0e10cSrcweir using namespace ::rtl; 44cdf0e10cSrcweir using namespace ::com::sun::star; 45cdf0e10cSrcweir 46cdf0e10cSrcweir #define WID_SEARCH_BACKWARDS 0 47cdf0e10cSrcweir #define WID_SEARCH_CASE 1 48cdf0e10cSrcweir #define WID_SEARCH_WORDS 2 49cdf0e10cSrcweir 50cdf0e10cSrcweir const SfxItemPropertyMapEntry* ImplGetSearchPropertyMap() 51cdf0e10cSrcweir { 52cdf0e10cSrcweir static const SfxItemPropertyMapEntry aSearchPropertyMap_Impl[] = 53cdf0e10cSrcweir { 54cdf0e10cSrcweir { MAP_CHAR_LEN(UNO_NAME_SEARCH_BACKWARDS), WID_SEARCH_BACKWARDS, &::getBooleanCppuType(), 0, 0 }, 55cdf0e10cSrcweir { MAP_CHAR_LEN(UNO_NAME_SEARCH_CASE), WID_SEARCH_CASE, &::getBooleanCppuType(), 0, 0 }, 56cdf0e10cSrcweir { MAP_CHAR_LEN(UNO_NAME_SEARCH_WORDS), WID_SEARCH_WORDS, &::getBooleanCppuType(), 0, 0 }, 57cdf0e10cSrcweir { 0,0,0,0,0,0} 58cdf0e10cSrcweir }; 59cdf0e10cSrcweir 60cdf0e10cSrcweir return aSearchPropertyMap_Impl; 61cdf0e10cSrcweir } 62cdf0e10cSrcweir 63cdf0e10cSrcweir class SearchContext_impl 64cdf0e10cSrcweir { 65cdf0e10cSrcweir uno::Reference< drawing::XShapes > mxShapes; 66cdf0e10cSrcweir sal_Int32 mnIndex; 67cdf0e10cSrcweir SearchContext_impl* mpParent; 68cdf0e10cSrcweir 69cdf0e10cSrcweir public: 70cdf0e10cSrcweir SearchContext_impl( uno::Reference< drawing::XShapes > xShapes, SearchContext_impl* pParent = NULL ) 71cdf0e10cSrcweir : mxShapes( xShapes ), mnIndex( -1 ), mpParent( pParent ) {} 72cdf0e10cSrcweir 73cdf0e10cSrcweir 74cdf0e10cSrcweir uno::Reference< drawing::XShape > firstShape() 75cdf0e10cSrcweir { 76cdf0e10cSrcweir mnIndex = -1; 77cdf0e10cSrcweir return nextShape(); 78cdf0e10cSrcweir } 79cdf0e10cSrcweir 80cdf0e10cSrcweir uno::Reference< drawing::XShape > nextShape() 81cdf0e10cSrcweir { 82cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 83cdf0e10cSrcweir mnIndex++; 84cdf0e10cSrcweir if( mxShapes.is() && mxShapes->getCount() > mnIndex ) 85cdf0e10cSrcweir { 86cdf0e10cSrcweir mxShapes->getByIndex( mnIndex ) >>= xShape; 87cdf0e10cSrcweir } 88cdf0e10cSrcweir return xShape; 89cdf0e10cSrcweir } 90cdf0e10cSrcweir 91cdf0e10cSrcweir SearchContext_impl* getParent() const { return mpParent; } 92cdf0e10cSrcweir }; 93cdf0e10cSrcweir 94cdf0e10cSrcweir /* ================================================================= */ 95cdf0e10cSrcweir /** this class implements a search or replace operation on a given 96cdf0e10cSrcweir page or a given sdrobj 97cdf0e10cSrcweir */ 98cdf0e10cSrcweir 99cdf0e10cSrcweir SdUnoSearchReplaceShape::SdUnoSearchReplaceShape( drawing::XDrawPage* pPage ) throw() 100cdf0e10cSrcweir { 101cdf0e10cSrcweir mpPage = pPage; 102cdf0e10cSrcweir } 103cdf0e10cSrcweir 104cdf0e10cSrcweir SdUnoSearchReplaceShape::~SdUnoSearchReplaceShape() throw() 105cdf0e10cSrcweir { 106cdf0e10cSrcweir } 107cdf0e10cSrcweir 108cdf0e10cSrcweir // util::XReplaceable 109cdf0e10cSrcweir uno::Reference< util::XReplaceDescriptor > SAL_CALL SdUnoSearchReplaceShape::createReplaceDescriptor() 110cdf0e10cSrcweir throw( uno::RuntimeException ) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir return new SdUnoSearchReplaceDescriptor(sal_True); 113cdf0e10cSrcweir } 114cdf0e10cSrcweir 115cdf0e10cSrcweir sal_Int32 SAL_CALL SdUnoSearchReplaceShape::replaceAll( const uno::Reference< util::XSearchDescriptor >& xDesc ) 116cdf0e10cSrcweir throw( uno::RuntimeException ) 117cdf0e10cSrcweir { 118cdf0e10cSrcweir SdUnoSearchReplaceDescriptor* pDescr = SdUnoSearchReplaceDescriptor::getImplementation( xDesc ); 119cdf0e10cSrcweir if( pDescr == NULL ) 120cdf0e10cSrcweir return 0; 121cdf0e10cSrcweir 122cdf0e10cSrcweir sal_Int32 nFound = 0; 123cdf0e10cSrcweir 124cdf0e10cSrcweir uno::Reference< drawing::XShapes > xShapes; 125cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 126cdf0e10cSrcweir 127cdf0e10cSrcweir SearchContext_impl* pContext = NULL; 128cdf0e10cSrcweir if(mpPage) 129cdf0e10cSrcweir { 130cdf0e10cSrcweir uno::Reference< drawing::XDrawPage > xPage( mpPage ); 131cdf0e10cSrcweir 132cdf0e10cSrcweir xPage->queryInterface( ITYPE( drawing::XShapes ) ) >>= xShapes; 133cdf0e10cSrcweir 134cdf0e10cSrcweir if( xShapes.is() && (xShapes->getCount() > 0) ) 135cdf0e10cSrcweir { 136cdf0e10cSrcweir pContext = new SearchContext_impl( xShapes ); 137cdf0e10cSrcweir xShape = pContext->firstShape(); 138cdf0e10cSrcweir } 139cdf0e10cSrcweir else 140cdf0e10cSrcweir { 141cdf0e10cSrcweir xShapes = NULL; 142cdf0e10cSrcweir } 143cdf0e10cSrcweir } 144cdf0e10cSrcweir else 145cdf0e10cSrcweir { 146cdf0e10cSrcweir xShape = mpShape; 147cdf0e10cSrcweir } 148cdf0e10cSrcweir 149cdf0e10cSrcweir while( xShape.is() ) 150cdf0e10cSrcweir { 151cdf0e10cSrcweir // replace in xShape 152cdf0e10cSrcweir uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY); 153cdf0e10cSrcweir uno::Reference< text::XTextRange > xRange(xText, uno::UNO_QUERY); 154cdf0e10cSrcweir uno::Reference< text::XTextRange > xFound; 155cdf0e10cSrcweir 156cdf0e10cSrcweir while( xRange.is() ) 157cdf0e10cSrcweir { 158cdf0e10cSrcweir xFound = Search( xRange, pDescr ); 159cdf0e10cSrcweir if( !xFound.is() ) 160cdf0e10cSrcweir break; 161cdf0e10cSrcweir 162cdf0e10cSrcweir xFound->setString( pDescr->getReplaceString() ); 163cdf0e10cSrcweir xRange = xFound->getEnd(); 164cdf0e10cSrcweir nFound++; 165cdf0e10cSrcweir } 166cdf0e10cSrcweir // done with xShape -> get next shape 167cdf0e10cSrcweir 168cdf0e10cSrcweir // test if its a group 169cdf0e10cSrcweir uno::Reference< drawing::XShapes > xGroupShape( xShape, uno::UNO_QUERY ); 170cdf0e10cSrcweir if( xGroupShape.is() && ( xGroupShape->getCount() > 0 ) ) 171cdf0e10cSrcweir { 172cdf0e10cSrcweir pContext = new SearchContext_impl( xGroupShape, pContext ); 173cdf0e10cSrcweir xShape = pContext->firstShape(); 174cdf0e10cSrcweir } 175cdf0e10cSrcweir else 176cdf0e10cSrcweir { 177cdf0e10cSrcweir if( pContext ) 178cdf0e10cSrcweir xShape = pContext->nextShape(); 179cdf0e10cSrcweir else 180cdf0e10cSrcweir xShape = NULL; 181cdf0e10cSrcweir } 182cdf0e10cSrcweir 183cdf0e10cSrcweir // test parent contexts for next shape if none 184cdf0e10cSrcweir // is found in the current context 185cdf0e10cSrcweir while( pContext && !xShape.is() ) 186cdf0e10cSrcweir { 187cdf0e10cSrcweir if( pContext->getParent() ) 188cdf0e10cSrcweir { 189cdf0e10cSrcweir SearchContext_impl* pOldContext = pContext; 190cdf0e10cSrcweir pContext = pContext->getParent(); 191cdf0e10cSrcweir delete pOldContext; 192cdf0e10cSrcweir xShape = pContext->nextShape(); 193cdf0e10cSrcweir } 194cdf0e10cSrcweir else 195cdf0e10cSrcweir { 196cdf0e10cSrcweir delete pContext; 197cdf0e10cSrcweir pContext = NULL; 198cdf0e10cSrcweir xShape = NULL; 199cdf0e10cSrcweir } 200cdf0e10cSrcweir } 201cdf0e10cSrcweir } 202cdf0e10cSrcweir 203cdf0e10cSrcweir return nFound; 204cdf0e10cSrcweir } 205cdf0e10cSrcweir 206cdf0e10cSrcweir // XSearchable 207cdf0e10cSrcweir uno::Reference< ::com::sun::star::util::XSearchDescriptor > SAL_CALL SdUnoSearchReplaceShape::createSearchDescriptor( ) 208cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 209cdf0e10cSrcweir { 210cdf0e10cSrcweir return new SdUnoSearchReplaceDescriptor(sal_False); 211cdf0e10cSrcweir } 212cdf0e10cSrcweir 213cdf0e10cSrcweir uno::Reference< ::com::sun::star::container::XIndexAccess > SAL_CALL SdUnoSearchReplaceShape::findAll( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XSearchDescriptor >& xDesc ) 214cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 215cdf0e10cSrcweir { 216cdf0e10cSrcweir SdUnoSearchReplaceDescriptor* pDescr = SdUnoSearchReplaceDescriptor::getImplementation( xDesc ); 217cdf0e10cSrcweir if( pDescr == NULL ) 218cdf0e10cSrcweir return uno::Reference< container::XIndexAccess > (); 219cdf0e10cSrcweir 220cdf0e10cSrcweir 221cdf0e10cSrcweir sal_Int32 nSequence = 32; 222cdf0e10cSrcweir sal_Int32 nFound = 0; 223cdf0e10cSrcweir 224cdf0e10cSrcweir uno::Sequence < uno::Reference< uno::XInterface > > aSeq( nSequence ); 225cdf0e10cSrcweir 226cdf0e10cSrcweir uno::Reference< uno::XInterface > * pArray = aSeq.getArray(); 227cdf0e10cSrcweir 228cdf0e10cSrcweir uno::Reference< drawing::XShapes > xShapes; 229cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 230cdf0e10cSrcweir 231cdf0e10cSrcweir SearchContext_impl* pContext = NULL; 232cdf0e10cSrcweir if(mpPage) 233cdf0e10cSrcweir { 234cdf0e10cSrcweir uno::Reference< drawing::XDrawPage > xPage( mpPage ); 235cdf0e10cSrcweir xPage->queryInterface( ITYPE( drawing::XShapes ) ) >>= xShapes; 236cdf0e10cSrcweir 237cdf0e10cSrcweir if( xShapes.is() && xShapes->getCount() > 0 ) 238cdf0e10cSrcweir { 239cdf0e10cSrcweir pContext = new SearchContext_impl( xShapes ); 240cdf0e10cSrcweir xShape = pContext->firstShape(); 241cdf0e10cSrcweir } 242cdf0e10cSrcweir else 243cdf0e10cSrcweir { 244cdf0e10cSrcweir xShapes = NULL; 245cdf0e10cSrcweir } 246cdf0e10cSrcweir } 247cdf0e10cSrcweir else 248cdf0e10cSrcweir { 249cdf0e10cSrcweir xShape = mpShape; 250cdf0e10cSrcweir } 251cdf0e10cSrcweir while( xShape.is() ) 252cdf0e10cSrcweir { 253cdf0e10cSrcweir // find in xShape 254cdf0e10cSrcweir uno::Reference< text::XText > xText(xShape, uno::UNO_QUERY); 255cdf0e10cSrcweir uno::Reference< text::XTextRange > xRange(xText, uno::UNO_QUERY); 256cdf0e10cSrcweir uno::Reference< text::XTextRange > xFound; 257cdf0e10cSrcweir 258cdf0e10cSrcweir while( xRange.is() ) 259cdf0e10cSrcweir { 260cdf0e10cSrcweir xFound = Search( xRange, pDescr ); 261cdf0e10cSrcweir if( !xFound.is() ) 262cdf0e10cSrcweir break; 263cdf0e10cSrcweir 264cdf0e10cSrcweir if( nFound >= nSequence ) 265cdf0e10cSrcweir { 266cdf0e10cSrcweir nSequence += 32; 267cdf0e10cSrcweir aSeq.realloc( nSequence ); 268cdf0e10cSrcweir pArray = aSeq.getArray(); 269cdf0e10cSrcweir } 270cdf0e10cSrcweir 271cdf0e10cSrcweir pArray[nFound++] = xFound; 272cdf0e10cSrcweir 273cdf0e10cSrcweir xRange = xFound->getEnd(); 274cdf0e10cSrcweir } 275cdf0e10cSrcweir // done with shape -> get next shape 276cdf0e10cSrcweir 277cdf0e10cSrcweir // test if its a group 278cdf0e10cSrcweir uno::Reference< drawing::XShapes > xGroupShape; 279cdf0e10cSrcweir uno::Any aAny( xShape->queryInterface( ITYPE( drawing::XShapes ))); 280cdf0e10cSrcweir 281cdf0e10cSrcweir if( (aAny >>= xGroupShape ) && xGroupShape->getCount() > 0 ) 282cdf0e10cSrcweir { 283cdf0e10cSrcweir pContext = new SearchContext_impl( xGroupShape, pContext ); 284cdf0e10cSrcweir xShape = pContext->firstShape(); 285cdf0e10cSrcweir } 286cdf0e10cSrcweir else 287cdf0e10cSrcweir { 288cdf0e10cSrcweir if( pContext ) 289cdf0e10cSrcweir xShape = pContext->nextShape(); 290cdf0e10cSrcweir else 291cdf0e10cSrcweir xShape = NULL; 292cdf0e10cSrcweir } 293cdf0e10cSrcweir 294cdf0e10cSrcweir // test parent contexts for next shape if none 295cdf0e10cSrcweir // is found in the current context 296cdf0e10cSrcweir while( pContext && !xShape.is() ) 297cdf0e10cSrcweir { 298cdf0e10cSrcweir if( pContext->getParent() ) 299cdf0e10cSrcweir { 300cdf0e10cSrcweir SearchContext_impl* pOldContext = pContext; 301cdf0e10cSrcweir pContext = pContext->getParent(); 302cdf0e10cSrcweir delete pOldContext; 303cdf0e10cSrcweir xShape = pContext->nextShape(); 304cdf0e10cSrcweir } 305cdf0e10cSrcweir else 306cdf0e10cSrcweir { 307cdf0e10cSrcweir delete pContext; 308cdf0e10cSrcweir pContext = NULL; 309cdf0e10cSrcweir xShape = NULL; 310cdf0e10cSrcweir } 311cdf0e10cSrcweir } 312cdf0e10cSrcweir } 313cdf0e10cSrcweir 314cdf0e10cSrcweir if( nFound != nSequence ) 315cdf0e10cSrcweir aSeq.realloc( nFound ); 316cdf0e10cSrcweir 317cdf0e10cSrcweir return (container::XIndexAccess*)new SdUnoFindAllAccess( aSeq ); 318cdf0e10cSrcweir } 319cdf0e10cSrcweir 320cdf0e10cSrcweir uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SdUnoSearchReplaceShape::findFirst( const ::com::sun::star::uno::Reference< ::com::sun::star::util::XSearchDescriptor >& xDesc ) 321cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 322cdf0e10cSrcweir { 323cdf0e10cSrcweir uno::Reference< text::XTextRange > xRange( GetCurrentShape(), uno::UNO_QUERY ); 324cdf0e10cSrcweir if( xRange.is() ) 325cdf0e10cSrcweir return findNext( xRange, xDesc ); 326cdf0e10cSrcweir 327cdf0e10cSrcweir return uno::Reference< uno::XInterface > (); 328cdf0e10cSrcweir } 329cdf0e10cSrcweir 330cdf0e10cSrcweir uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetCurrentShape() const throw() 331cdf0e10cSrcweir { 332cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 333cdf0e10cSrcweir 334cdf0e10cSrcweir if( mpPage ) 335cdf0e10cSrcweir { 336cdf0e10cSrcweir uno::Reference< drawing::XDrawPage > xPage( mpPage ); 337cdf0e10cSrcweir uno::Reference< container::XIndexAccess > xShapes( xPage, uno::UNO_QUERY ); 338cdf0e10cSrcweir if( xShapes.is() ) 339cdf0e10cSrcweir { 340cdf0e10cSrcweir if(xShapes->getCount() > 0) 341cdf0e10cSrcweir { 342cdf0e10cSrcweir xShapes->getByIndex(0) >>= xShape; 343cdf0e10cSrcweir } 344cdf0e10cSrcweir } 345cdf0e10cSrcweir } 346cdf0e10cSrcweir else if( mpShape ) 347cdf0e10cSrcweir { 348cdf0e10cSrcweir xShape = mpShape; 349cdf0e10cSrcweir } 350cdf0e10cSrcweir 351cdf0e10cSrcweir return xShape; 352cdf0e10cSrcweir 353cdf0e10cSrcweir } 354cdf0e10cSrcweir 355cdf0e10cSrcweir uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL SdUnoSearchReplaceShape::findNext( const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& xStartAt, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XSearchDescriptor >& xDesc ) 356cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 357cdf0e10cSrcweir { 358cdf0e10cSrcweir SdUnoSearchReplaceDescriptor* pDescr = SdUnoSearchReplaceDescriptor::getImplementation( xDesc ); 359cdf0e10cSrcweir 360cdf0e10cSrcweir uno::Reference< uno::XInterface > xFound; 361cdf0e10cSrcweir 362cdf0e10cSrcweir uno::Reference< text::XTextRange > xRange( xStartAt, uno::UNO_QUERY ); 363cdf0e10cSrcweir if(pDescr && xRange.is() ) 364cdf0e10cSrcweir { 365cdf0e10cSrcweir 366cdf0e10cSrcweir uno::Reference< text::XTextRange > xCurrentRange( xStartAt, uno::UNO_QUERY ); 367cdf0e10cSrcweir 368cdf0e10cSrcweir uno::Reference< drawing::XShape > xCurrentShape( GetShape( xCurrentRange ) ); 369cdf0e10cSrcweir 370cdf0e10cSrcweir while(!xFound.is() && xRange.is()) 371cdf0e10cSrcweir { 372cdf0e10cSrcweir xFound = Search( xRange, pDescr ); 373cdf0e10cSrcweir if(!xFound.is()) 374cdf0e10cSrcweir { 375cdf0e10cSrcweir // we need a new starting range now 376cdf0e10cSrcweir xRange = NULL; 377cdf0e10cSrcweir 378cdf0e10cSrcweir if(mpPage) 379cdf0e10cSrcweir { 380cdf0e10cSrcweir uno::Reference< drawing::XDrawPage > xPage( mpPage ); 381cdf0e10cSrcweir 382cdf0e10cSrcweir // we do a page wide search, so skip to the next shape here 383cdf0e10cSrcweir uno::Reference< container::XIndexAccess > xShapes( xPage, uno::UNO_QUERY ); 384cdf0e10cSrcweir 385cdf0e10cSrcweir // get next shape on our page 386cdf0e10cSrcweir if( xShapes.is() ) 387cdf0e10cSrcweir { 388cdf0e10cSrcweir uno::Reference< drawing::XShape > xFound2( GetNextShape( xShapes, xCurrentShape ) ); 389cdf0e10cSrcweir if( xFound2.is() && (xFound2.get() != xCurrentShape.get()) ) 390cdf0e10cSrcweir xCurrentShape = xFound2; 391cdf0e10cSrcweir else 392cdf0e10cSrcweir xCurrentShape = NULL; 393cdf0e10cSrcweir 394cdf0e10cSrcweir xCurrentShape->queryInterface( ITYPE( text::XTextRange ) ) >>= xRange; 395cdf0e10cSrcweir if(!(xCurrentShape.is() && (xRange.is()))) 396cdf0e10cSrcweir xRange = NULL; 397cdf0e10cSrcweir } 398cdf0e10cSrcweir } 399cdf0e10cSrcweir else 400cdf0e10cSrcweir { 401cdf0e10cSrcweir // we search only in this shape, so end search if we have 402cdf0e10cSrcweir // not found anything 403cdf0e10cSrcweir } 404cdf0e10cSrcweir } 405cdf0e10cSrcweir } 406cdf0e10cSrcweir } 407cdf0e10cSrcweir return xFound; 408cdf0e10cSrcweir } 409cdf0e10cSrcweir 410cdf0e10cSrcweir /** this method returns the shape that follows xCurrentShape in the shape collection xShapes. 411cdf0e10cSrcweir It steps recursive into groupshapes and returns the xCurrentShape if it is the last 412cdf0e10cSrcweir shape in this collection */ 413cdf0e10cSrcweir uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetNextShape( uno::Reference< container::XIndexAccess > xShapes, uno::Reference< drawing::XShape > xCurrentShape ) throw() 414cdf0e10cSrcweir { 415cdf0e10cSrcweir uno::Reference< drawing::XShape > xFound; 416cdf0e10cSrcweir uno::Any aAny; 417cdf0e10cSrcweir 418cdf0e10cSrcweir if(xShapes.is() && xCurrentShape.is()) 419cdf0e10cSrcweir { 420cdf0e10cSrcweir const sal_Int32 nCount = xShapes->getCount(); 421cdf0e10cSrcweir for( sal_Int32 i = 0; i < nCount; i++ ) 422cdf0e10cSrcweir { 423cdf0e10cSrcweir uno::Reference< drawing::XShape > xSearchShape; 424cdf0e10cSrcweir xShapes->getByIndex(i) >>= xSearchShape; 425cdf0e10cSrcweir 426cdf0e10cSrcweir if( xSearchShape.is() ) 427cdf0e10cSrcweir { 428cdf0e10cSrcweir uno::Reference< container::XIndexAccess > xGroup( xSearchShape, uno::UNO_QUERY ); 429cdf0e10cSrcweir 430cdf0e10cSrcweir if( xCurrentShape.get() == xSearchShape.get() ) 431cdf0e10cSrcweir { 432cdf0e10cSrcweir if( xGroup.is() && xGroup->getCount() > 0 ) 433cdf0e10cSrcweir { 434cdf0e10cSrcweir xGroup->getByIndex( 0 ) >>= xFound; 435cdf0e10cSrcweir } 436cdf0e10cSrcweir else 437cdf0e10cSrcweir { 438cdf0e10cSrcweir i++; 439cdf0e10cSrcweir if( i < nCount ) 440cdf0e10cSrcweir xShapes->getByIndex( i ) >>= xFound; 441cdf0e10cSrcweir else 442cdf0e10cSrcweir xFound = xCurrentShape; 443cdf0e10cSrcweir } 444cdf0e10cSrcweir 445cdf0e10cSrcweir break; 446cdf0e10cSrcweir } 447cdf0e10cSrcweir else if( xGroup.is() ) 448cdf0e10cSrcweir { 449cdf0e10cSrcweir xFound = GetNextShape( xGroup, xCurrentShape ); 450cdf0e10cSrcweir if( xFound.is() ) 451cdf0e10cSrcweir { 452cdf0e10cSrcweir if( xFound.get() == xCurrentShape.get() ) 453cdf0e10cSrcweir { 454cdf0e10cSrcweir // the current shape was found at the end of the group 455cdf0e10cSrcweir i++; 456cdf0e10cSrcweir if( i < nCount ) 457cdf0e10cSrcweir { 458cdf0e10cSrcweir xShapes->getByIndex(i) >>= xFound; 459cdf0e10cSrcweir } 460cdf0e10cSrcweir } 461cdf0e10cSrcweir break; 462cdf0e10cSrcweir } 463cdf0e10cSrcweir } 464cdf0e10cSrcweir } 465cdf0e10cSrcweir } 466cdf0e10cSrcweir } 467cdf0e10cSrcweir 468cdf0e10cSrcweir return xFound; 469cdf0e10cSrcweir } 470cdf0e10cSrcweir 471cdf0e10cSrcweir uno::Reference< text::XTextRange > SdUnoSearchReplaceShape::Search( uno::Reference< text::XTextRange > xText, SdUnoSearchReplaceDescriptor* pDescr ) throw() 472cdf0e10cSrcweir { 473cdf0e10cSrcweir if(!xText.is()) 474cdf0e10cSrcweir return uno::Reference< text::XTextRange > (); 475cdf0e10cSrcweir 476cdf0e10cSrcweir uno::Reference< text::XText > xParent( xText->getText() ); 477cdf0e10cSrcweir 478cdf0e10cSrcweir if( !xParent.is() ) 479cdf0e10cSrcweir { 480cdf0e10cSrcweir uno::Any aAny( xText->queryInterface( ITYPE( text::XText )) ); 481cdf0e10cSrcweir aAny >>= xParent; 482cdf0e10cSrcweir } 483cdf0e10cSrcweir 484cdf0e10cSrcweir const OUString aText( xParent->getString() ); 485cdf0e10cSrcweir 486cdf0e10cSrcweir const sal_Int32 nTextLen = aText.getLength(); 487cdf0e10cSrcweir 488cdf0e10cSrcweir sal_Int32* pConvertPos = new sal_Int32[nTextLen+2]; 489cdf0e10cSrcweir sal_Int32* pConvertPara = new sal_Int32[nTextLen+2]; 490cdf0e10cSrcweir 491cdf0e10cSrcweir int ndbg = 0; 492cdf0e10cSrcweir const sal_Unicode* pText = aText; 493cdf0e10cSrcweir 494cdf0e10cSrcweir sal_Int32* pPos = pConvertPos; 495cdf0e10cSrcweir sal_Int32* pPara = pConvertPara; 496cdf0e10cSrcweir 497cdf0e10cSrcweir sal_Int32 nLastPos = 0, nLastPara = 0; 498cdf0e10cSrcweir 499cdf0e10cSrcweir uno::Reference< container::XEnumerationAccess > xEnumAccess( xParent, uno::UNO_QUERY ); 500cdf0e10cSrcweir 501cdf0e10cSrcweir // first we fill the arrys with the position and paragraph for every character 502cdf0e10cSrcweir // inside the text 503cdf0e10cSrcweir if( xEnumAccess.is() ) 504cdf0e10cSrcweir { 505cdf0e10cSrcweir uno::Reference< container::XEnumeration > xParaEnum( xEnumAccess->createEnumeration() ); 506cdf0e10cSrcweir 507cdf0e10cSrcweir while(xParaEnum->hasMoreElements()) 508cdf0e10cSrcweir { 509cdf0e10cSrcweir uno::Reference< text::XTextContent > xParagraph( xParaEnum->nextElement(), uno::UNO_QUERY ); 510cdf0e10cSrcweir if( xParagraph.is() ) 511cdf0e10cSrcweir xEnumAccess.query( xParagraph ); 512cdf0e10cSrcweir else 513cdf0e10cSrcweir xEnumAccess.clear(); 514cdf0e10cSrcweir 515cdf0e10cSrcweir if( xEnumAccess.is() ) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir uno::Reference< container::XEnumeration > xPortionEnum( xEnumAccess->createEnumeration() ); 518cdf0e10cSrcweir if( xPortionEnum.is() ) 519cdf0e10cSrcweir { 520cdf0e10cSrcweir while(xPortionEnum->hasMoreElements()) 521cdf0e10cSrcweir { 522cdf0e10cSrcweir uno::Reference< text::XTextRange > xPortion( xPortionEnum->nextElement(), uno::UNO_QUERY ); 523cdf0e10cSrcweir if( xPortion.is() ) 524cdf0e10cSrcweir { 525cdf0e10cSrcweir const OUString aPortion( xPortion->getString() ); 526cdf0e10cSrcweir const sal_Int32 nLen = aPortion.getLength(); 527cdf0e10cSrcweir 528cdf0e10cSrcweir ESelection aStartSel( GetSelection( xPortion->getStart() ) ); 529cdf0e10cSrcweir ESelection aEndSel( GetSelection( xPortion->getEnd() ) ); 530cdf0e10cSrcweir 531cdf0e10cSrcweir // special case for empty portions with content or length one portions with content (fields) 532cdf0e10cSrcweir if( (aStartSel.nStartPos == aEndSel.nStartPos) || ( (aStartSel.nStartPos == (aEndSel.nStartPos - 1)) && (nLen > 1) ) ) 533cdf0e10cSrcweir { 534cdf0e10cSrcweir for( sal_Int32 i = 0; i < nLen; i++ ) 535cdf0e10cSrcweir { 536cdf0e10cSrcweir if( ndbg < (nTextLen+2) ) 537cdf0e10cSrcweir { 538cdf0e10cSrcweir *pPos++ = aStartSel.nStartPos; 539cdf0e10cSrcweir *pPara++ = aStartSel.nStartPara; 540cdf0e10cSrcweir 541cdf0e10cSrcweir ndbg += 1; 542cdf0e10cSrcweir pText++; 543cdf0e10cSrcweir } 544cdf0e10cSrcweir else 545cdf0e10cSrcweir { 546cdf0e10cSrcweir DBG_ERROR( "array overflow while searching" ); 547cdf0e10cSrcweir } 548cdf0e10cSrcweir } 549cdf0e10cSrcweir 550cdf0e10cSrcweir nLastPos = aStartSel.nStartPos; 551cdf0e10cSrcweir } 552cdf0e10cSrcweir // normal case 553cdf0e10cSrcweir else 554cdf0e10cSrcweir { 555cdf0e10cSrcweir for( sal_Int32 i = 0; i < nLen; i++ ) 556cdf0e10cSrcweir { 557cdf0e10cSrcweir if( ndbg < (nTextLen+2) ) 558cdf0e10cSrcweir { 559cdf0e10cSrcweir *pPos++ = aStartSel.nStartPos++; 560cdf0e10cSrcweir *pPara++ = aStartSel.nStartPara; 561cdf0e10cSrcweir 562cdf0e10cSrcweir ndbg += 1; 563cdf0e10cSrcweir pText++; 564cdf0e10cSrcweir } 565cdf0e10cSrcweir else 566cdf0e10cSrcweir { 567cdf0e10cSrcweir DBG_ERROR( "array overflow while searching" ); 568cdf0e10cSrcweir } 569cdf0e10cSrcweir } 570cdf0e10cSrcweir 571cdf0e10cSrcweir nLastPos = aStartSel.nStartPos - 1; 572cdf0e10cSrcweir DBG_ASSERT( aEndSel.nStartPos == aStartSel.nStartPos, "Search is not working" ); 573cdf0e10cSrcweir } 574cdf0e10cSrcweir nLastPara = aStartSel.nStartPara; 575cdf0e10cSrcweir } 576cdf0e10cSrcweir } 577cdf0e10cSrcweir } 578cdf0e10cSrcweir } 579cdf0e10cSrcweir 580cdf0e10cSrcweir if( ndbg < (nTextLen+2) ) 581cdf0e10cSrcweir { 582cdf0e10cSrcweir *pPos++ = nLastPos + 1; 583cdf0e10cSrcweir *pPara++ = nLastPara; 584cdf0e10cSrcweir 585cdf0e10cSrcweir ndbg += 1; 586cdf0e10cSrcweir pText++; 587cdf0e10cSrcweir } 588cdf0e10cSrcweir else 589cdf0e10cSrcweir { 590cdf0e10cSrcweir DBG_ERROR( "array overflow while searching" ); 591cdf0e10cSrcweir } 592cdf0e10cSrcweir } 593cdf0e10cSrcweir } 594cdf0e10cSrcweir 595cdf0e10cSrcweir uno::Reference< text::XText > xFound; 596cdf0e10cSrcweir ESelection aSel; 597cdf0e10cSrcweir 598cdf0e10cSrcweir uno::Reference< text::XTextRange > xRangeRef( xText, uno::UNO_QUERY ); 599cdf0e10cSrcweir if( xRangeRef.is() ) 600cdf0e10cSrcweir aSel = GetSelection( xRangeRef ); 601cdf0e10cSrcweir 602cdf0e10cSrcweir sal_Int32 nStartPos; 603cdf0e10cSrcweir sal_Int32 nEndPos = 0; 604cdf0e10cSrcweir for( nStartPos = 0; nStartPos < nTextLen; nStartPos++ ) 605cdf0e10cSrcweir { 606cdf0e10cSrcweir if( pConvertPara[nStartPos] == aSel.nStartPara && pConvertPos[nStartPos] == aSel.nStartPos ) 607cdf0e10cSrcweir break; 608cdf0e10cSrcweir } 609cdf0e10cSrcweir 610cdf0e10cSrcweir if( Search( aText, nStartPos, nEndPos, pDescr ) ) 611cdf0e10cSrcweir { 612cdf0e10cSrcweir if( nStartPos <= nTextLen && nEndPos <= nTextLen ) 613cdf0e10cSrcweir { 614cdf0e10cSrcweir ESelection aSelection( (sal_uInt16)pConvertPara[nStartPos], (sal_uInt16)pConvertPos[nStartPos], 615cdf0e10cSrcweir (sal_uInt16)pConvertPara[nEndPos], (sal_uInt16)pConvertPos[nEndPos] ); 616cdf0e10cSrcweir SvxUnoTextRange *pRange; 617cdf0e10cSrcweir 618cdf0e10cSrcweir SvxUnoTextBase* pParent = SvxUnoTextBase::getImplementation( xParent ); 619cdf0e10cSrcweir 620cdf0e10cSrcweir if(pParent) 621cdf0e10cSrcweir { 622cdf0e10cSrcweir pRange = new SvxUnoTextRange( *pParent ); 623cdf0e10cSrcweir xFound = (text::XText*)pRange; 624cdf0e10cSrcweir pRange->SetSelection(aSelection); 625cdf0e10cSrcweir 626cdf0e10cSrcweir // pDescr->SetStartPos( nEndPos ); 627cdf0e10cSrcweir } 628cdf0e10cSrcweir } 629cdf0e10cSrcweir else 630cdf0e10cSrcweir { 631cdf0e10cSrcweir DBG_ERROR("Array overflow while searching!"); 632cdf0e10cSrcweir } 633cdf0e10cSrcweir } 634cdf0e10cSrcweir 635cdf0e10cSrcweir delete[] pConvertPos; 636cdf0e10cSrcweir delete[] pConvertPara; 637cdf0e10cSrcweir 638cdf0e10cSrcweir return uno::Reference< text::XTextRange > ( xFound, uno::UNO_QUERY ); 639cdf0e10cSrcweir } 640cdf0e10cSrcweir 641cdf0e10cSrcweir sal_Bool SdUnoSearchReplaceShape::Search( const OUString& rText, sal_Int32& nStartPos, sal_Int32& nEndPos, SdUnoSearchReplaceDescriptor* pDescr ) throw() 642cdf0e10cSrcweir { 643cdf0e10cSrcweir OUString aSearchStr( pDescr->getSearchString() ); 644cdf0e10cSrcweir OUString aText( rText ); 645cdf0e10cSrcweir 646cdf0e10cSrcweir if( !pDescr->IsCaseSensitive() ) 647cdf0e10cSrcweir { 648cdf0e10cSrcweir aText.toAsciiLowerCase(); 649cdf0e10cSrcweir aSearchStr.toAsciiLowerCase(); 650cdf0e10cSrcweir } 651cdf0e10cSrcweir 652cdf0e10cSrcweir sal_Int32 nFound = aText.indexOf( aSearchStr, nStartPos ); 653cdf0e10cSrcweir if( nFound != -1 ) 654cdf0e10cSrcweir { 655cdf0e10cSrcweir nStartPos = nFound; 656cdf0e10cSrcweir nEndPos = nFound + aSearchStr.getLength(); 657cdf0e10cSrcweir 658cdf0e10cSrcweir if(pDescr->IsWords()) 659cdf0e10cSrcweir { 660cdf0e10cSrcweir if( (nStartPos > 0 && aText.getStr()[nStartPos-1] > ' ') || 661cdf0e10cSrcweir (nEndPos < aText.getLength() && aText.getStr()[nEndPos] > ' ') ) 662cdf0e10cSrcweir { 663cdf0e10cSrcweir nStartPos++; 664cdf0e10cSrcweir return Search( aText, nStartPos, nEndPos, pDescr ); 665cdf0e10cSrcweir } 666cdf0e10cSrcweir } 667cdf0e10cSrcweir 668cdf0e10cSrcweir return sal_True; 669cdf0e10cSrcweir } 670cdf0e10cSrcweir else 671cdf0e10cSrcweir return sal_False; 672cdf0e10cSrcweir } 673cdf0e10cSrcweir 674cdf0e10cSrcweir ESelection SdUnoSearchReplaceShape::GetSelection( uno::Reference< text::XTextRange > xTextRange ) throw() 675cdf0e10cSrcweir { 676cdf0e10cSrcweir ESelection aSel; 677cdf0e10cSrcweir SvxUnoTextRangeBase* pRange = SvxUnoTextRangeBase::getImplementation( xTextRange ); 678cdf0e10cSrcweir 679cdf0e10cSrcweir if(pRange) 680cdf0e10cSrcweir aSel = pRange->GetSelection(); 681cdf0e10cSrcweir 682cdf0e10cSrcweir return aSel; 683cdf0e10cSrcweir } 684cdf0e10cSrcweir 685cdf0e10cSrcweir uno::Reference< drawing::XShape > SdUnoSearchReplaceShape::GetShape( uno::Reference< text::XTextRange > xTextRange ) throw() 686cdf0e10cSrcweir { 687cdf0e10cSrcweir uno::Reference< drawing::XShape > xShape; 688cdf0e10cSrcweir 689cdf0e10cSrcweir if(xTextRange.is()) 690cdf0e10cSrcweir { 691cdf0e10cSrcweir uno::Reference< text::XText > xText( xTextRange->getText() ); 692cdf0e10cSrcweir 693cdf0e10cSrcweir if(xText.is()) 694cdf0e10cSrcweir { 695cdf0e10cSrcweir do 696cdf0e10cSrcweir { 697cdf0e10cSrcweir xText->queryInterface( ITYPE( drawing::XShape )) >>= xShape; 698cdf0e10cSrcweir if(!xShape.is()) 699cdf0e10cSrcweir { 700cdf0e10cSrcweir uno::Reference< text::XText > xParent( xText->getText() ); 701cdf0e10cSrcweir if(!xParent.is() || xText.get() == xParent.get()) 702cdf0e10cSrcweir return xShape; 703cdf0e10cSrcweir 704cdf0e10cSrcweir xText = xParent; 705cdf0e10cSrcweir } 706cdf0e10cSrcweir } while( !xShape.is() ); 707cdf0e10cSrcweir } 708cdf0e10cSrcweir } 709cdf0e10cSrcweir 710cdf0e10cSrcweir return xShape; 711cdf0e10cSrcweir } 712cdf0e10cSrcweir 713cdf0e10cSrcweir /* ================================================================= */ 714cdf0e10cSrcweir /** this class holds the parameters and status of a search or replace 715cdf0e10cSrcweir operation performed by class SdUnoSearchReplaceShape 716cdf0e10cSrcweir */ 717cdf0e10cSrcweir 718cdf0e10cSrcweir UNO3_GETIMPLEMENTATION_IMPL( SdUnoSearchReplaceDescriptor ); 719cdf0e10cSrcweir 720cdf0e10cSrcweir SdUnoSearchReplaceDescriptor::SdUnoSearchReplaceDescriptor( sal_Bool bReplace ) throw() 721cdf0e10cSrcweir { 722cdf0e10cSrcweir mpPropSet = new SvxItemPropertySet(ImplGetSearchPropertyMap(), SdrObject::GetGlobalDrawObjectItemPool()); 723cdf0e10cSrcweir 724cdf0e10cSrcweir mbBackwards = sal_False; 725cdf0e10cSrcweir mbCaseSensitive = sal_False; 726cdf0e10cSrcweir mbWords = sal_False; 727cdf0e10cSrcweir 728cdf0e10cSrcweir mbReplace = bReplace; 729cdf0e10cSrcweir } 730cdf0e10cSrcweir 731cdf0e10cSrcweir SdUnoSearchReplaceDescriptor::~SdUnoSearchReplaceDescriptor() throw() 732cdf0e10cSrcweir { 733cdf0e10cSrcweir delete mpPropSet; 734cdf0e10cSrcweir } 735cdf0e10cSrcweir 736cdf0e10cSrcweir // XSearchDescriptor 737cdf0e10cSrcweir OUString SAL_CALL SdUnoSearchReplaceDescriptor::getSearchString() 738cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 739cdf0e10cSrcweir { 740cdf0e10cSrcweir return maSearchStr; 741cdf0e10cSrcweir } 742cdf0e10cSrcweir 743cdf0e10cSrcweir void SAL_CALL SdUnoSearchReplaceDescriptor::setSearchString( const OUString& aString ) 744cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 745cdf0e10cSrcweir { 746cdf0e10cSrcweir maSearchStr = aString; 747cdf0e10cSrcweir } 748cdf0e10cSrcweir 749cdf0e10cSrcweir // XReplaceDescriptor 750cdf0e10cSrcweir OUString SAL_CALL SdUnoSearchReplaceDescriptor::getReplaceString() 751cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 752cdf0e10cSrcweir { 753cdf0e10cSrcweir return maReplaceStr; 754cdf0e10cSrcweir } 755cdf0e10cSrcweir 756cdf0e10cSrcweir void SAL_CALL SdUnoSearchReplaceDescriptor::setReplaceString( const ::rtl::OUString& aReplaceString ) 757cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 758cdf0e10cSrcweir { 759cdf0e10cSrcweir maReplaceStr = aReplaceString; 760cdf0e10cSrcweir } 761cdf0e10cSrcweir 762cdf0e10cSrcweir // XPropertySet 763cdf0e10cSrcweir uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL SdUnoSearchReplaceDescriptor::getPropertySetInfo() 764cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 765cdf0e10cSrcweir { 766cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() ); 767cdf0e10cSrcweir return mpPropSet->getPropertySetInfo(); 768cdf0e10cSrcweir } 769cdf0e10cSrcweir 770cdf0e10cSrcweir void SAL_CALL SdUnoSearchReplaceDescriptor::setPropertyValue( const ::rtl::OUString& aPropertyName, const ::com::sun::star::uno::Any& aValue ) 771cdf0e10cSrcweir throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::beans::PropertyVetoException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 772cdf0e10cSrcweir { 773cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() ); 774cdf0e10cSrcweir 775cdf0e10cSrcweir const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(aPropertyName); 776cdf0e10cSrcweir 777cdf0e10cSrcweir sal_Bool bOk = sal_False; 778cdf0e10cSrcweir 779cdf0e10cSrcweir switch( pEntry ? pEntry->nWID : -1 ) 780cdf0e10cSrcweir { 781cdf0e10cSrcweir case WID_SEARCH_BACKWARDS: 782cdf0e10cSrcweir bOk = (aValue >>= mbBackwards); 783cdf0e10cSrcweir break; 784cdf0e10cSrcweir case WID_SEARCH_CASE: 785cdf0e10cSrcweir bOk = (aValue >>= mbCaseSensitive); 786cdf0e10cSrcweir break; 787cdf0e10cSrcweir case WID_SEARCH_WORDS: 788cdf0e10cSrcweir bOk = (aValue >>= mbWords); 789cdf0e10cSrcweir break; 790cdf0e10cSrcweir default: 791cdf0e10cSrcweir throw beans::UnknownPropertyException(); 792cdf0e10cSrcweir } 793cdf0e10cSrcweir 794cdf0e10cSrcweir if( !bOk ) 795cdf0e10cSrcweir throw lang::IllegalArgumentException(); 796cdf0e10cSrcweir } 797cdf0e10cSrcweir 798cdf0e10cSrcweir uno::Any SAL_CALL SdUnoSearchReplaceDescriptor::getPropertyValue( const ::rtl::OUString& PropertyName ) 799cdf0e10cSrcweir throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 800cdf0e10cSrcweir { 801cdf0e10cSrcweir OGuard aGuard( Application::GetSolarMutex() ); 802cdf0e10cSrcweir 803cdf0e10cSrcweir uno::Any aAny; 804cdf0e10cSrcweir 805cdf0e10cSrcweir const SfxItemPropertySimpleEntry* pEntry = mpPropSet->getPropertyMapEntry(PropertyName); 806cdf0e10cSrcweir 807cdf0e10cSrcweir switch( pEntry ? pEntry->nWID : -1 ) 808cdf0e10cSrcweir { 809cdf0e10cSrcweir case WID_SEARCH_BACKWARDS: 810cdf0e10cSrcweir aAny <<= (sal_Bool)mbBackwards; 811cdf0e10cSrcweir break; 812cdf0e10cSrcweir case WID_SEARCH_CASE: 813cdf0e10cSrcweir aAny <<= (sal_Bool)mbCaseSensitive; 814cdf0e10cSrcweir break; 815cdf0e10cSrcweir case WID_SEARCH_WORDS: 816cdf0e10cSrcweir aAny <<= (sal_Bool)mbWords; 817cdf0e10cSrcweir break; 818cdf0e10cSrcweir default: 819cdf0e10cSrcweir throw beans::UnknownPropertyException(); 820cdf0e10cSrcweir } 821cdf0e10cSrcweir 822cdf0e10cSrcweir return aAny; 823cdf0e10cSrcweir } 824cdf0e10cSrcweir 825cdf0e10cSrcweir void SAL_CALL SdUnoSearchReplaceDescriptor::addPropertyChangeListener( const ::rtl::OUString& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) {} 826cdf0e10cSrcweir void SAL_CALL SdUnoSearchReplaceDescriptor::removePropertyChangeListener( const ::rtl::OUString& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertyChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) {} 827cdf0e10cSrcweir void SAL_CALL SdUnoSearchReplaceDescriptor::addVetoableChangeListener( const ::rtl::OUString& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) {} 828cdf0e10cSrcweir void SAL_CALL SdUnoSearchReplaceDescriptor::removeVetoableChangeListener( const ::rtl::OUString& , const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XVetoableChangeListener >& ) throw(::com::sun::star::beans::UnknownPropertyException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) {} 829cdf0e10cSrcweir 830cdf0e10cSrcweir 831cdf0e10cSrcweir /* ================================================================= */ 832cdf0e10cSrcweir 833cdf0e10cSrcweir SdUnoFindAllAccess::SdUnoFindAllAccess( uno::Sequence< uno::Reference< uno::XInterface > >& rSequence ) throw() 834cdf0e10cSrcweir :maSequence( rSequence ) 835cdf0e10cSrcweir { 836cdf0e10cSrcweir } 837cdf0e10cSrcweir 838cdf0e10cSrcweir SdUnoFindAllAccess::~SdUnoFindAllAccess() throw() 839cdf0e10cSrcweir { 840cdf0e10cSrcweir } 841cdf0e10cSrcweir 842cdf0e10cSrcweir // XElementAccess 843cdf0e10cSrcweir uno::Type SAL_CALL SdUnoFindAllAccess::getElementType() 844cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 845cdf0e10cSrcweir { 846cdf0e10cSrcweir return ITYPE( text::XTextRange ); 847cdf0e10cSrcweir } 848cdf0e10cSrcweir 849cdf0e10cSrcweir sal_Bool SAL_CALL SdUnoFindAllAccess::hasElements() 850cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 851cdf0e10cSrcweir { 852cdf0e10cSrcweir return maSequence.getLength() > 0; 853cdf0e10cSrcweir } 854cdf0e10cSrcweir 855cdf0e10cSrcweir // XIndexAccess 856cdf0e10cSrcweir sal_Int32 SAL_CALL SdUnoFindAllAccess::getCount() 857cdf0e10cSrcweir throw(::com::sun::star::uno::RuntimeException) 858cdf0e10cSrcweir { 859cdf0e10cSrcweir return maSequence.getLength(); 860cdf0e10cSrcweir } 861cdf0e10cSrcweir 862cdf0e10cSrcweir uno::Any SAL_CALL SdUnoFindAllAccess::getByIndex( sal_Int32 Index ) 863cdf0e10cSrcweir throw(::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::WrappedTargetException, ::com::sun::star::uno::RuntimeException) 864cdf0e10cSrcweir { 865cdf0e10cSrcweir uno::Any aAny; 866cdf0e10cSrcweir 867cdf0e10cSrcweir if( Index < 0 || Index >= getCount() ) 868cdf0e10cSrcweir throw lang::IndexOutOfBoundsException(); 869cdf0e10cSrcweir 870cdf0e10cSrcweir const uno::Reference< uno::XInterface > *pRefs = maSequence.getConstArray(); 871cdf0e10cSrcweir if(pRefs) 872cdf0e10cSrcweir aAny <<= pRefs[ Index ]; 873cdf0e10cSrcweir return aAny; 874cdf0e10cSrcweir } 875cdf0e10cSrcweir 876