xref: /trunk/main/sd/source/ui/view/sdview4.cxx (revision 1ecadb572e7010ff3b3382ad9bf179dbc6efadbb)
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_sd.hxx"
30 
31 #include "View.hxx"
32 #include <unotools/localfilehelper.hxx>
33 #include <sfx2/request.hxx>
34 #include <sfx2/docfilt.hxx>
35 #include <sfx2/fcontnr.hxx>
36 #include <sfx2/docfile.hxx>
37 #include <vcl/msgbox.hxx>
38 #include <svl/urlbmk.hxx>
39 #include <svx/svdpagv.hxx>
40 #include <svx/xfillit.hxx>
41 #include <svx/svdundo.hxx>
42 #include <svx/xoutbmp.hxx>
43 #include <svx/svdograf.hxx>
44 #include <svx/svdomedia.hxx>
45 #include <svx/svdoole2.hxx>
46 #include <sot/storage.hxx>
47 #include <sfx2/app.hxx>
48 #include <avmedia/mediawindow.hxx>
49 #include <svtools/ehdl.hxx>
50 #include <svtools/sfxecode.hxx>
51 #include <svtools/filter.hxx>
52 #include "app.hrc"
53 #include "Window.hxx"
54 #include "DrawDocShell.hxx"
55 #include "DrawViewShell.hxx"
56 #include "fuinsfil.hxx"
57 #include "drawdoc.hxx"
58 #include "sdresid.hxx"
59 #include "strings.hrc"
60 #include "imapinfo.hxx"
61 #include "sdpage.hxx"
62 #include "view/SlideSorterView.hxx"
63 #include "undo/undoobjects.hxx"
64 
65 #include <comphelper/processfactory.hxx>
66 #include <com/sun/star/embed/ElementModes.hpp>
67 #include <com/sun/star/embed/XEmbedPersist.hpp>
68 #include <com/sun/star/embed/Aspects.hpp>
69 #include <com/sun/star/embed/NoVisualAreaSizeException.hpp>
70 #include <svtools/soerr.hxx>
71 
72 #include <sfx2/ipclient.hxx>
73 
74 using namespace com::sun::star;
75 
76 namespace sd {
77 
78 #ifdef _MSC_VER
79 #pragma optimize ( "", off )
80 #endif
81 
82 /*************************************************************************
83 |*
84 |* Graphik einfuegen
85 |* Wird ein leeres Graphikobjekt uebergeben, so wird dieses gefuellt.
86 |* Andernfalls wird ein an der gegebenen Position vorhandenes Objekt
87 |* gefuellt. Ist an der Position kein Objekt vorhanden, so wird ein neues
88 |* Objekt erzeugt und ein Pointer auf dieses Objekt zurueckgegeben.
89 |*
90 \************************************************************************/
91 
92 SdrGrafObj* View::InsertGraphic( const Graphic& rGraphic, sal_Int8& rAction,
93                                    const Point& rPos, SdrObject* pObj, ImageMap* pImageMap )
94 {
95     SdrEndTextEdit();
96     mnAction = rAction;
97 
98     // Liegt ein Objekt an der Position rPos?
99     SdrGrafObj*     pNewGrafObj = NULL;
100     SdrPageView*    pPV = GetSdrPageView();
101     SdrObject*      pPickObj = pObj;
102     const bool bOnMaster = pPV && pPV->GetPage() && pPV->GetPage()->IsMasterPage();
103 
104     if(pPV && this->ISA(::sd::slidesorter::view::SlideSorterView))
105     {
106         if(!pPV->GetPageRect().IsInside(rPos))
107             pPV = 0L;
108     }
109 
110     if( !pPickObj && pPV )
111     {
112         SdrPageView* pPageView = pPV;
113         PickObj(rPos, getHitTolLog(), pPickObj, pPageView);
114     }
115 
116     if( mnAction == DND_ACTION_LINK && pPickObj && pPV )
117     {
118         const bool bIsGraphic = pPickObj->ISA( SdrGrafObj );
119         if( bIsGraphic || (pObj->IsEmptyPresObj() && !bOnMaster) )
120         {
121             if( IsUndoEnabled() )
122                 BegUndo(String(SdResId(STR_INSERTGRAPHIC)));
123 
124             SdPage* pPage = (SdPage*) pPickObj->GetPage();
125 
126             if( bIsGraphic )
127             {
128                 // Das Objekt wird mit der Bitmap gefuellt
129                 pNewGrafObj = (SdrGrafObj*) pPickObj->Clone();
130                 pNewGrafObj->SetGraphic(rGraphic);
131             }
132             else
133             {
134                 pNewGrafObj = new SdrGrafObj( rGraphic, pPickObj->GetLogicRect() );
135                 pNewGrafObj->SetEmptyPresObj(sal_True);
136             }
137 
138             if ( pNewGrafObj->IsEmptyPresObj() )
139             {
140                 Rectangle aRect( pNewGrafObj->GetLogicRect() );
141                 pNewGrafObj->AdjustToMaxRect( aRect, sal_False );
142                 pNewGrafObj->SetOutlinerParaObject(NULL);
143                 pNewGrafObj->SetEmptyPresObj(sal_False);
144             }
145 
146             if (pPage && pPage->IsPresObj(pPickObj))
147             {
148                 // Neues PresObj in die Liste eintragen
149                 pPage->InsertPresObj( pNewGrafObj, PRESOBJ_GRAPHIC );
150                 pNewGrafObj->SetUserCall(pPickObj->GetUserCall());
151             }
152 
153             if (pImageMap)
154                 pNewGrafObj->InsertUserData(new SdIMapInfo(*pImageMap));
155 
156             ReplaceObjectAtView(pPickObj, *pPV, pNewGrafObj); // maybe ReplaceObjectAtView
157 
158             if( IsUndoEnabled() )
159                 EndUndo();
160         }
161         else if (pPickObj->IsClosedObj() && !pPickObj->ISA(SdrOle2Obj))
162         {
163             /******************************************************************
164             * Das Objekt wird mit der Graphik gefuellt
165             ******************************************************************/
166             if( IsUndoEnabled() )
167             {
168                 BegUndo(String(SdResId(STR_UNDO_DRAGDROP)));
169                 AddUndo(GetModel()->GetSdrUndoFactory().CreateUndoAttrObject(*pPickObj));
170                 EndUndo();
171             }
172 
173             XOBitmap aXOBitmap( rGraphic.GetBitmap() );
174             SfxItemSet aSet(mpDocSh->GetPool(), XATTR_FILLSTYLE, XATTR_FILLBITMAP);
175             aSet.Put(XFillStyleItem(XFILL_BITMAP));
176             aSet.Put(XFillBitmapItem(&mpDocSh->GetPool(), aXOBitmap));
177             pPickObj->SetMergedItemSetAndBroadcast(aSet);
178         }
179     }
180     else if ( pPV )
181     {
182         // create  new object
183         Size aSize;
184 
185         if ( rGraphic.GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
186         {
187             ::OutputDevice* pOutDev = 0;
188             if( mpViewSh )
189                 pOutDev = mpViewSh->GetActiveWindow();
190 
191             if( !pOutDev )
192                 pOutDev = Application::GetDefaultDevice();
193 
194             if( pOutDev )
195                 aSize = pOutDev->PixelToLogic( rGraphic.GetPrefSize(), MAP_100TH_MM );
196         }
197         else
198         {
199             aSize = OutputDevice::LogicToLogic( rGraphic.GetPrefSize(),
200                                                 rGraphic.GetPrefMapMode(),
201                                                 MapMode( MAP_100TH_MM ) );
202         }
203 
204         pNewGrafObj = new SdrGrafObj( rGraphic, Rectangle( rPos, aSize ) );
205         SdrPage* pPage = pPV->GetPage();
206         Size aPageSize( pPage->GetSize() );
207         aPageSize.Width()  -= pPage->GetLftBorder() + pPage->GetRgtBorder();
208         aPageSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder();
209         pNewGrafObj->AdjustToMaxRect( Rectangle( Point(), aPageSize ), sal_True );
210 //      pNewGrafObj->AdjustToMaxRect( Rectangle( pPV->GetOffset(), aPageSize ), sal_True );
211 
212         sal_uLong   nOptions = SDRINSERT_SETDEFLAYER;
213         sal_Bool    bIsPresTarget = sal_False;
214 
215         if ((mpViewSh
216                 && mpViewSh->GetViewShell()!=NULL
217                 && mpViewSh->GetViewShell()->GetIPClient()
218                 && mpViewSh->GetViewShell()->GetIPClient()->IsObjectInPlaceActive())
219             || this->ISA(::sd::slidesorter::view::SlideSorterView))
220             nOptions |= SDRINSERT_DONTMARK;
221 
222         if( ( mnAction & DND_ACTION_MOVE ) && pPickObj && (pPickObj->IsEmptyPresObj() || pPickObj->GetUserCall()) )
223         {
224             SdPage* pP = static_cast< SdPage* >( pPickObj->GetPage() );
225 
226             if ( pP && pP->IsMasterPage() )
227                 bIsPresTarget = pP->IsPresObj(pPickObj);
228         }
229 
230         if( ( mnAction & DND_ACTION_MOVE ) && pPickObj && !bIsPresTarget )
231         {
232             // replace object
233             if (pImageMap)
234                 pNewGrafObj->InsertUserData(new SdIMapInfo(*pImageMap));
235 
236             Rectangle aPickObjRect(pPickObj->GetCurrentBoundRect());
237             Size aPickObjSize(aPickObjRect.GetSize());
238             Rectangle aObjRect(pNewGrafObj->GetCurrentBoundRect());
239             Size aObjSize(aObjRect.GetSize());
240 
241             Fraction aScaleWidth(aPickObjSize.Width(), aObjSize.Width());
242             Fraction aScaleHeight(aPickObjSize.Height(), aObjSize.Height());
243             pNewGrafObj->NbcResize(aObjRect.TopLeft(), aScaleWidth, aScaleHeight);
244 
245             Point aVec = aPickObjRect.TopLeft() - aObjRect.TopLeft();
246             pNewGrafObj->NbcMove(Size(aVec.X(), aVec.Y()));
247 
248             const bool bUndo = IsUndoEnabled();
249 
250             if( bUndo )
251                 BegUndo(String(SdResId(STR_UNDO_DRAGDROP)));
252             pNewGrafObj->NbcSetLayer(pPickObj->GetLayer());
253             SdrPage* pP = pPV->GetPage();
254             pP->InsertObject(pNewGrafObj);
255             if( bUndo )
256             {
257                 AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoNewObject(*pNewGrafObj));
258                 AddUndo(mpDoc->GetSdrUndoFactory().CreateUndoDeleteObject(*pPickObj));
259             }
260             pP->RemoveObject(pPickObj->GetOrdNum());
261 
262             if( bUndo )
263             {
264                 EndUndo();
265             }
266             else
267             {
268                 SdrObject::Free(pPickObj);
269             }
270             mnAction = DND_ACTION_COPY;
271         }
272         else
273         {
274             InsertObjectAtView(pNewGrafObj, *pPV, nOptions);
275 
276             if( pImageMap )
277                 pNewGrafObj->InsertUserData(new SdIMapInfo(*pImageMap));
278         }
279     }
280 
281     rAction = mnAction;
282 
283     return pNewGrafObj;
284 }
285 
286 // -----------------------------------------------------------------------------
287 
288 SdrMediaObj* View::InsertMediaURL( const rtl::OUString& rMediaURL, sal_Int8& rAction,
289                                    const Point& rPos, const Size& rSize )
290 {
291     SdrEndTextEdit();
292     mnAction = rAction;
293 
294     SdrMediaObj*    pNewMediaObj = NULL;
295     SdrPageView*    pPV = GetSdrPageView();
296     SdrObject*      pPickObj = GetEmptyPresentationObject( PRESOBJ_MEDIA );
297 
298     if(pPV && this->ISA(::sd::slidesorter::view::SlideSorterView ))
299     {
300         if(!pPV->GetPageRect().IsInside(rPos))
301             pPV = 0L;
302     }
303 
304     if( !pPickObj && pPV )
305     {
306         SdrPageView* pPageView = pPV;
307         PickObj(rPos, getHitTolLog(), pPickObj, pPageView);
308     }
309 
310     if( mnAction == DND_ACTION_LINK && pPickObj && pPV && pPickObj->ISA( SdrMediaObj ) )
311     {
312         pNewMediaObj = static_cast< SdrMediaObj* >( pPickObj->Clone() );
313         pNewMediaObj->setURL( rMediaURL );
314 
315         BegUndo(String(SdResId(STR_UNDO_DRAGDROP)));
316         ReplaceObjectAtView(pPickObj, *pPV, pNewMediaObj);
317         EndUndo();
318     }
319     else if( pPV )
320     {
321         Rectangle aRect( rPos, rSize );
322         if( pPickObj )
323             aRect = pPickObj->GetLogicRect();
324 
325 
326         pNewMediaObj = new SdrMediaObj( aRect );
327 
328         bool bIsPres = false;
329         if( pPickObj )
330         {
331             SdPage* pPage = static_cast< SdPage* >(pPickObj->GetPage());
332             bIsPres = pPage && pPage->IsPresObj(pPickObj);
333             if( bIsPres )
334             {
335                 pPage->InsertPresObj( pNewMediaObj, PRESOBJ_MEDIA );
336             }
337         }
338 
339         if( pPickObj )
340             ReplaceObjectAtView(pPickObj, *pPV, pNewMediaObj);
341         else
342             InsertObjectAtView( pNewMediaObj, *pPV, SDRINSERT_SETDEFLAYER );
343 
344         pNewMediaObj->setURL( rMediaURL );
345 
346         if( pPickObj )
347         {
348             pNewMediaObj->AdjustToMaxRect( pPickObj->GetLogicRect() );
349             if( bIsPres )
350                 pNewMediaObj->SetUserCall(pPickObj->GetUserCall());
351         }
352     }
353 
354     rAction = mnAction;
355 
356     return pNewMediaObj;
357 }
358 
359 /*************************************************************************
360 |*
361 |* Timer-Handler fuer InsertFile beim Drop()
362 |*
363 \************************************************************************/
364 
365 IMPL_LINK( View, DropInsertFileHdl, Timer*, EMPTYARG )
366 {
367     DBG_ASSERT( mpViewSh, "sd::View::DropInsertFileHdl(), I need a view shell to work!" );
368     if( !mpViewSh )
369         return 0;
370 
371     SfxErrorContext aEc( ERRCTX_ERROR, mpViewSh->GetActiveWindow(), RID_SO_ERRCTX );
372     ErrCode nError = 0;
373 
374     ::std::vector< String >::const_iterator aIter( maDropFileVector.begin() );
375 
376     while( (aIter != maDropFileVector.end()) && !nError )
377     {
378         String          aCurrentDropFile( *aIter );
379         INetURLObject   aURL( aCurrentDropFile );
380         sal_Bool            bOK = sal_False;
381 
382         if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
383         {
384             String aURLStr;
385             ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aCurrentDropFile, aURLStr );
386             aURL = INetURLObject( aURLStr );
387         }
388 
389         GraphicFilter*  pGraphicFilter = GraphicFilter::GetGraphicFilter();
390         Graphic         aGraphic;
391 
392         aCurrentDropFile = aURL.GetMainURL( INetURLObject::NO_DECODE );
393 
394         if( !::avmedia::MediaWindow::isMediaURL( aCurrentDropFile ) )
395         {
396             if( !pGraphicFilter->ImportGraphic( aGraphic, aURL ) )
397             {
398                 sal_Int8    nTempAction = ( aIter == maDropFileVector.begin() ) ? mnAction : 0;
399                 const bool bLink = ( ( nTempAction & DND_ACTION_LINK ) != 0 );
400                 SdrGrafObj* pGrafObj = InsertGraphic( aGraphic, nTempAction, maDropPos, NULL, NULL );
401 
402                 if( pGrafObj && bLink )
403                     pGrafObj->SetGraphicLink( aCurrentDropFile, String() );
404 
405                 // return action from first inserted graphic
406                 if( aIter == maDropFileVector.begin() )
407                     mnAction = nTempAction;
408 
409                 bOK = sal_True;
410             }
411             if( !bOK )
412             {
413                 const SfxFilter*        pFoundFilter = NULL;
414                 SfxMedium               aSfxMedium( aCurrentDropFile, STREAM_READ | STREAM_SHARE_DENYNONE, sal_False );
415                 ErrCode                 nErr = SFX_APP()->GetFilterMatcher().GuessFilter(  aSfxMedium, &pFoundFilter, SFX_FILTER_IMPORT, SFX_FILTER_NOTINSTALLED | SFX_FILTER_EXECUTABLE );
416 
417                 if( pFoundFilter && !nErr )
418                 {
419                     ::std::vector< String > aFilterVector;
420                     const String            aFilterName( pFoundFilter->GetFilterName() );
421                     String                  aLowerAsciiFileName( aCurrentDropFile );
422                     aLowerAsciiFileName.ToLowerAscii();
423 
424                     FuInsertFile::GetSupportedFilterVector( aFilterVector );
425 
426                     if( ( ::std::find( aFilterVector.begin(), aFilterVector.end(), pFoundFilter->GetMimeType() ) != aFilterVector.end() ) ||
427                         aFilterName.SearchAscii( "Text" ) != STRING_NOTFOUND ||
428                         aFilterName.SearchAscii( "Rich" ) != STRING_NOTFOUND ||
429                         aFilterName.SearchAscii( "RTF" ) != STRING_NOTFOUND ||
430                         aFilterName.SearchAscii( "HTML" ) != STRING_NOTFOUND ||
431                         aLowerAsciiFileName.SearchAscii(".sdd") != STRING_NOTFOUND ||
432                         aLowerAsciiFileName.SearchAscii(".sda") != STRING_NOTFOUND ||
433                         aLowerAsciiFileName.SearchAscii(".sxd") != STRING_NOTFOUND ||
434                         aLowerAsciiFileName.SearchAscii(".sxi") != STRING_NOTFOUND ||
435                         aLowerAsciiFileName.SearchAscii(".std") != STRING_NOTFOUND ||
436                         aLowerAsciiFileName.SearchAscii(".sti") != STRING_NOTFOUND )
437                     {
438                         ::sd::Window* pWin = mpViewSh->GetActiveWindow();
439                         SfxRequest      aReq(SID_INSERTFILE, 0, mpDoc->GetItemPool());
440                         SfxStringItem   aItem1( ID_VAL_DUMMY0, aCurrentDropFile ), aItem2( ID_VAL_DUMMY1, pFoundFilter->GetFilterName() );
441 
442                         aReq.AppendItem( aItem1 );
443                         aReq.AppendItem( aItem2 );
444                         FuInsertFile::Create( mpViewSh, pWin, this, mpDoc, aReq );
445                         bOK = sal_True;
446                     }
447                 }
448             }
449         }
450 
451         if( !bOK )
452         {
453             Size aPrefSize;
454 
455             if( ::avmedia::MediaWindow::isMediaURL( aCurrentDropFile ) &&
456                 ::avmedia::MediaWindow::isMediaURL( aCurrentDropFile, true, &aPrefSize ) )
457             {
458                 if( aPrefSize.Width() && aPrefSize.Height() )
459                 {
460                     ::sd::Window* pWin = mpViewSh->GetActiveWindow();
461 
462                     if( pWin )
463                         aPrefSize = pWin->PixelToLogic( aPrefSize, MAP_100TH_MM );
464                     else
465                         aPrefSize = Application::GetDefaultDevice()->PixelToLogic( aPrefSize, MAP_100TH_MM );
466                 }
467                 else
468                     aPrefSize  = Size( 5000, 5000 );
469 
470                 InsertMediaURL( aCurrentDropFile, mnAction, maDropPos, aPrefSize ) ;
471             }
472             else if( mnAction & DND_ACTION_LINK )
473                 static_cast< DrawViewShell* >( mpViewSh )->InsertURLButton( aCurrentDropFile, aCurrentDropFile, String(), &maDropPos );
474             else
475             {
476                 if( mpViewSh )
477                 {
478                     try
479                     {
480                         //TODO/MBA: testing
481                         ::rtl::OUString aName;
482                         uno::Sequence < beans::PropertyValue > aMedium(1);
483                         aMedium[0].Name = ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
484                         aMedium[0].Value <<= ::rtl::OUString( aCurrentDropFile );
485 
486                         uno::Reference < embed::XEmbeddedObject > xObj = mpDocSh->GetEmbeddedObjectContainer().
487                                 InsertEmbeddedObject( aMedium, aName );
488 
489                         uno::Reference < embed::XEmbedPersist > xPersist( xObj, uno::UNO_QUERY );
490                         if ( xPersist.is())
491                         {
492                             // TODO/LEAN: VisualArea access can switch the object to running state
493                             sal_Int64 nAspect = embed::Aspects::MSOLE_CONTENT;
494 
495                             xPersist->storeOwn();
496 
497                             awt::Size aSz;
498                             try
499                             {
500                                 aSz = xObj->getVisualAreaSize( nAspect );
501                             }
502                             catch( embed::NoVisualAreaSizeException& )
503                             {
504                                 // the default size will be set later
505                             }
506 
507                             Size        aSize( aSz.Width, aSz.Height );
508                             Rectangle   aRect;
509 
510                             if (!aSize.Width() || !aSize.Height())
511                             {
512                                 aSize.Width()   = 1410;
513                                 aSize.Height()  = 1000;
514                             }
515 
516                             aRect = Rectangle( maDropPos, aSize );
517 
518                             SdrOle2Obj* pOleObj = new SdrOle2Obj( svt::EmbeddedObjectRef( xObj, nAspect ), aName, aRect );
519                             sal_uLong       nOptions = SDRINSERT_SETDEFLAYER;
520 
521                             if (mpViewSh != NULL)
522                             {
523                                 OSL_ASSERT (mpViewSh->GetViewShell()!=NULL);
524                                 SfxInPlaceClient* pIpClient =
525                                     mpViewSh->GetViewShell()->GetIPClient();
526                                 if (pIpClient!=NULL && pIpClient->IsObjectInPlaceActive())
527                                     nOptions |= SDRINSERT_DONTMARK;
528                             }
529 
530                             InsertObjectAtView( pOleObj, *GetSdrPageView(), nOptions );
531                             pOleObj->SetLogicRect( aRect );
532                             aSz.Width = aRect.GetWidth();
533                             aSz.Height = aRect.GetHeight();
534                             xObj->setVisualAreaSize( nAspect,aSz );
535                         }
536                     }
537                     catch( uno::Exception& )
538                     {
539                         nError = ERRCODE_IO_GENERAL;
540                         // TODO/LATER: better error handling
541                     }
542                 }
543             }
544         }
545 
546         ++aIter;
547     }
548 
549     if( nError )
550         ErrorHandler::HandleError( nError );
551 
552     return nError;
553 }
554 
555 /*************************************************************************
556 |*
557 |* Timer-Handler fuer Errorhandling beim Drop()
558 |*
559 \************************************************************************/
560 
561 IMPL_LINK( View, DropErrorHdl, Timer*, EMPTYARG )
562 {
563     InfoBox( mpViewSh ? mpViewSh->GetActiveWindow() : 0, String(SdResId(STR_ACTION_NOTPOSSIBLE) ) ).Execute();
564     return 0;
565 }
566 
567 #ifdef _MSC_VER
568 #pragma optimize ( "", on )
569 #endif
570 
571 /*************************************************************************
572 |*
573 |* Redraw sperren oder erlauben
574 |*
575 \************************************************************************/
576 
577 void View::LockRedraw(sal_Bool bLock)
578 {
579     if (bLock)
580     {
581         mnLockRedrawSmph++;
582         DBG_ASSERT(mnLockRedrawSmph, "Ueberlauf im LockRedraw");
583     }
584     else
585     {
586         DBG_ASSERT(mnLockRedrawSmph, "Unterlauf im LockRedraw");
587         mnLockRedrawSmph--;
588 
589         // alle gespeicherten Redraws ausfuehren
590         if (!mnLockRedrawSmph)
591         {
592             while (mpLockedRedraws && mpLockedRedraws->Count())
593             {
594                 SdViewRedrawRec* pRec = (SdViewRedrawRec*)mpLockedRedraws->First();
595                 OutputDevice* pCurrentOut = pRec->mpOut;
596                 Rectangle aBoundRect(pRec->aRect);
597                 mpLockedRedraws->Remove(pRec);
598                 delete pRec;
599 
600                 pRec = (SdViewRedrawRec*)mpLockedRedraws->First();
601                 while (pRec)
602                 {
603                     if (pRec->mpOut == pCurrentOut)
604                     {
605                         aBoundRect.Union(pRec->aRect);
606                         mpLockedRedraws->Remove(pRec);
607                         delete pRec;
608                         pRec = (SdViewRedrawRec*)mpLockedRedraws->GetCurObject();
609                     }
610                     else
611                     {
612                         pRec = (SdViewRedrawRec*)mpLockedRedraws->Next();
613                     }
614                 }
615 
616                 CompleteRedraw(pCurrentOut, Region(aBoundRect));
617             }
618             delete mpLockedRedraws;
619             mpLockedRedraws = NULL;
620         }
621     }
622 }
623 
624 
625 
626 
627 /*************************************************************************
628 |*
629 |* StyleSheet aus der Sleketion besorgen
630 |*
631 \************************************************************************/
632 
633 SfxStyleSheet* View::GetStyleSheet() const
634 {
635     return SdrView::GetStyleSheet();
636 }
637 
638 } // end of namespace sd
639