xref: /trunk/main/sw/source/core/doc/notxtfrm.cxx (revision a7185797e047c8f52864528f1019933e924bbbe5)
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 // MARKER(update_precomp.py): autogen include statement, do not remove
23 #include "precompiled_sw.hxx"
24 
25 #include <hintids.hxx>
26 #include <tools/urlobj.hxx>
27 #include <vcl/print.hxx>
28 #include <vcl/virdev.hxx>
29 #include <vcl/svapp.hxx>
30 #include <svtools/imapobj.hxx>
31 #include <svtools/imap.hxx>
32 #include <svl/urihelper.hxx>
33 #include <svtools/soerr.hxx>
34 #include <sfx2/progress.hxx>
35 #include <sfx2/docfile.hxx>
36 #include <sfx2/printer.hxx>
37 #include <editeng/udlnitem.hxx>
38 #include <editeng/colritem.hxx>
39 #include <svx/xoutbmp.hxx>
40 #include <vcl/window.hxx>
41 #include <fmturl.hxx>
42 #include <fmtsrnd.hxx>
43 #include <frmfmt.hxx>
44 #include <swrect.hxx>
45 #include <fesh.hxx>
46 #include <doc.hxx>
47 #include <flyfrm.hxx>
48 #include <frmtool.hxx>
49 #include <viewopt.hxx>
50 #include <viewimp.hxx>
51 #include <pam.hxx>
52 #include <hints.hxx>
53 #include <rootfrm.hxx>
54 #include <dflyobj.hxx>
55 #include <pagefrm.hxx>
56 #include <notxtfrm.hxx>
57 #include <grfatr.hxx>
58 #include <charatr.hxx>
59 #include <fmtornt.hxx>
60 #include <ndnotxt.hxx>
61 #include <ndgrf.hxx>
62 #include <ndole.hxx>
63 #include <swregion.hxx>
64 #include <poolfmt.hxx>
65 #include <mdiexp.hxx>
66 #include <swwait.hxx>
67 #include <comcore.hrc>
68 #include <accessibilityoptions.hxx>
69 #include <com/sun/star/embed/EmbedMisc.hpp>
70 #include <com/sun/star/embed/EmbedStates.hpp>
71 #include <svtools/embedhlp.hxx>
72 #include <svx/charthelper.hxx>
73 #include <dview.hxx>
74 #include <basegfx/matrix/b2dhommatrix.hxx>
75 #include <svx/sdr/contact/objectcontacttools.hxx>
76 #include <drawinglayer/processor2d/baseprocessor2d.hxx>
77 #include <basegfx/matrix/b2dhommatrixtools.hxx>
78 #include <drawinglayer/processor2d/processor2dtools.hxx>
79 
80 using namespace com::sun::star;
81 
82 #define DEFTEXTSIZE  12
83 
84 extern void ClrContourCache( const SdrObject *pObj ); // TxtFly.Cxx
85 
86 
87 inline sal_Bool GetRealURL( const SwGrfNode& rNd, String& rTxt )
88 {
89     sal_Bool bRet = rNd.GetFileFilterNms( &rTxt, 0 );
90     if( bRet )
91         rTxt = URIHelper::removePassword( rTxt, INetURLObject::WAS_ENCODED,
92                                         INetURLObject::DECODE_UNAMBIGUOUS);
93     return bRet;
94 }
95 
96 void lcl_PaintReplacement( const SwRect &rRect, const String &rText,
97                            const ViewShell &rSh, const SwNoTxtFrm *pFrm,
98                            sal_Bool bDefect )
99 {
100     static Font *pFont = 0;
101     if ( !pFont )
102     {
103         pFont = new Font();
104         pFont->SetWeight( WEIGHT_BOLD );
105         pFont->SetStyleName( aEmptyStr );
106         pFont->SetName( String::CreateFromAscii(
107                             RTL_CONSTASCII_STRINGPARAM( "Arial Unicode" )));
108         pFont->SetFamily( FAMILY_SWISS );
109         pFont->SetTransparent( sal_True );
110     }
111 
112     Color aCol( COL_RED );
113     FontUnderline eUnderline = UNDERLINE_NONE;
114     const SwFmtURL &rURL = pFrm->FindFlyFrm()->GetFmt()->GetURL();
115     if( rURL.GetURL().Len() || rURL.GetMap() )
116     {
117         sal_Bool bVisited = sal_False;
118         if ( rURL.GetMap() )
119         {
120             ImageMap *pMap = (ImageMap*)rURL.GetMap();
121             for( sal_uInt16 i = 0; i < pMap->GetIMapObjectCount(); i++ )
122             {
123                 IMapObject *pObj = pMap->GetIMapObject( i );
124                 if( rSh.GetDoc()->IsVisitedURL( pObj->GetURL() ) )
125                 {
126                     bVisited = sal_True;
127                     break;
128                 }
129             }
130         }
131         else if ( rURL.GetURL().Len() )
132             bVisited = rSh.GetDoc()->IsVisitedURL( rURL.GetURL() );
133 
134         SwFmt *pFmt = rSh.GetDoc()->GetFmtFromPool( static_cast<sal_uInt16>
135             (bVisited ? RES_POOLCHR_INET_VISIT : RES_POOLCHR_INET_NORMAL ) );
136         aCol = pFmt->GetColor().GetValue();
137         eUnderline = pFmt->GetUnderline().GetLineStyle();
138     }
139 
140     pFont->SetUnderline( eUnderline );
141     pFont->SetColor( aCol );
142 
143     const BitmapEx& rBmp = ViewShell::GetReplacementBitmap( bDefect != sal_False );
144     Graphic::DrawEx( rSh.GetOut(), rText, *pFont, rBmp, rRect.Pos(), rRect.SSize() );
145 }
146 
147 /*************************************************************************
148 |*
149 |*    SwGrfFrm::SwGrfFrm(ViewShell * const,SwGrfNode *)
150 |*
151 |*    Beschreibung
152 |*    Ersterstellung    JP 05.03.91
153 |*    Letzte Aenderung  MA 03. Mar. 93
154 |*
155 *************************************************************************/
156 
157 
158 SwNoTxtFrm::SwNoTxtFrm(SwNoTxtNode * const pNode, SwFrm* pSib )
159     : SwCntntFrm( pNode, pSib )
160 {
161     InitCtor();
162 }
163 
164 // Initialisierung: z.Zt. Eintragen des Frames im Cache
165 
166 
167 void SwNoTxtFrm::InitCtor()
168 {
169     nType = FRMC_NOTXT;
170     // Das Gewicht der Grafik ist 0, wenn sie noch nicht
171     // gelesen ist, < 0, wenn ein Lesefehler auftrat und
172     // Ersatzdarstellung angewendet werden musste und >0,
173     // wenn sie zur Verfuegung steht.
174     nWeight = 0;
175 }
176 
177 /*************************************************************************
178 |*
179 |*    SwNoTxtNode::MakeFrm()
180 |*
181 |*    Beschreibung
182 |*    Ersterstellung    JP 05.03.91
183 |*    Letzte Aenderung  MA 03. Mar. 93
184 |*
185 *************************************************************************/
186 
187 
188 SwCntntFrm *SwNoTxtNode::MakeFrm( SwFrm* pSib )
189 {
190     return new SwNoTxtFrm(this, pSib);
191 }
192 
193 /*************************************************************************
194 |*
195 |*    SwNoTxtFrm::~SwNoTxtFrm()
196 |*
197 |*    Beschreibung
198 |*    Ersterstellung    JP 05.03.91
199 |*    Letzte Aenderung  MA 30. Apr. 96
200 |*
201 *************************************************************************/
202 
203 SwNoTxtFrm::~SwNoTxtFrm()
204 {
205     StopAnimation();
206 }
207 
208 /*************************************************************************
209 |*
210 |*    void SwNoTxtFrm::Modify( SwHint * pOld, SwHint * pNew )
211 |*
212 |*    Beschreibung
213 |*    Ersterstellung    JP 05.03.91
214 |*    Letzte Aenderung  JP 05.03.91
215 |*
216 *************************************************************************/
217 
218 void SetOutDev( ViewShell *pSh, OutputDevice *pOut )
219 {
220     pSh->pOut = pOut;
221 }
222 
223 
224 
225 
226 void lcl_ClearArea( const SwFrm &rFrm,
227                     OutputDevice &rOut, const SwRect& rPtArea,
228                     const SwRect &rGrfArea )
229 {
230     SwRegionRects aRegion( rPtArea, 4, 4 );
231     aRegion -= rGrfArea;
232 
233     if ( aRegion.Count() )
234     {
235         const SvxBrushItem *pItem; const Color *pCol; SwRect aOrigRect;
236         if ( rFrm.GetBackgroundBrush( pItem, pCol, aOrigRect, sal_False ) )
237             for( sal_uInt16 i = 0; i < aRegion.Count(); ++i )
238                 ::DrawGraphic( pItem, &rOut, aOrigRect, aRegion[i] );
239         else
240         {
241             // OD 2004-04-23 #116347#
242             rOut.Push( PUSH_FILLCOLOR|PUSH_LINECOLOR );
243             rOut.SetFillColor( rFrm.getRootFrm()->GetCurrShell()->Imp()->GetRetoucheColor());
244             rOut.SetLineColor();
245             for( sal_uInt16 i = 0; i < aRegion.Count(); ++i )
246                 rOut.DrawRect( aRegion[i].SVRect() );
247             rOut.Pop();
248         }
249     }
250 }
251 
252 /*************************************************************************
253 |*
254 |*    void SwNoTxtFrm::Paint()
255 |*
256 |*    Beschreibung
257 |*    Ersterstellung    JP 05.03.91
258 |*    Letzte Aenderung  MA 10. Jan. 97
259 |*
260 *************************************************************************/
261 
262 void SwNoTxtFrm::Paint(SwRect const& rRect, SwPrintData const*const) const
263 {
264     if ( Frm().IsEmpty() )
265         return;
266 
267     const ViewShell* pSh = getRootFrm()->GetCurrShell();
268     if( !pSh->GetViewOptions()->IsGraphic() )
269     {
270         StopAnimation();
271         // OD 10.01.2003 #i6467# - no paint of placeholder for page preview
272         if ( pSh->GetWin() && !pSh->IsPreView() )
273         {
274             const SwNoTxtNode* pNd = GetNode()->GetNoTxtNode();
275             String aTxt( pNd->GetTitle() );
276             if ( !aTxt.Len() && pNd->IsGrfNode() )
277                 GetRealURL( *(SwGrfNode*)pNd, aTxt );
278             if( !aTxt.Len() )
279                 aTxt = FindFlyFrm()->GetFmt()->GetName();
280             lcl_PaintReplacement( Frm(), aTxt, *pSh, this, sal_False );
281         }
282         return;
283     }
284 
285     if( pSh->GetAccessibilityOptions()->IsStopAnimatedGraphics() ||
286     // --> FME 2004-06-21 #i9684# Stop animation during printing/pdf export
287        !pSh->GetWin() )
288     // <--
289         StopAnimation();
290 
291     SfxProgress::EnterLock(); //Keine Progress-Reschedules im Paint (SwapIn)
292 
293     OutputDevice *pOut = pSh->GetOut();
294     pOut->Push();
295     sal_Bool bClip = sal_True;
296     PolyPolygon aPoly;
297 
298     SwNoTxtNode& rNoTNd = *(SwNoTxtNode*)GetNode();
299     SwGrfNode* pGrfNd = rNoTNd.GetGrfNode();
300     if( pGrfNd )
301         pGrfNd->SetFrameInPaint( sal_True );
302 
303     // OD 16.04.2003 #i13147# - add 2nd parameter with value <sal_True> to
304     // method call <FindFlyFrm().GetContour(..)> to indicate that it is called
305     // for paint in order to avoid load of the intrinsic graphic.
306     if ( ( !pOut->GetConnectMetaFile() ||
307            !pSh->GetWin() ) &&
308          FindFlyFrm()->GetContour( aPoly, sal_True )
309        )
310     {
311         pOut->SetClipRegion( aPoly );
312         bClip = sal_False;
313     }
314 
315     SwRect aOrigPaint( rRect );
316     if ( HasAnimation() && pSh->GetWin() )
317     {
318         aOrigPaint = Frm(); aOrigPaint += Prt().Pos();
319     }
320 
321     SwRect aGrfArea( Frm() );
322     SwRect aPaintArea( aGrfArea );
323     aPaintArea._Intersection( aOrigPaint );
324 
325     SwRect aNormal( Frm().Pos() + Prt().Pos(), Prt().SSize() );
326     aNormal.Justify(); //Normalisiertes Rechteck fuer die Vergleiche
327 
328     if( aPaintArea.IsOver( aNormal ) )
329     {
330         // berechne die 4 zu loeschenden Rechtecke
331         if( pSh->GetWin() )
332             ::lcl_ClearArea( *this, *pSh->GetOut(), aPaintArea, aNormal );
333 
334         // in der Schnittmenge vom PaintBereich und der Bitmap liegt
335         // der absolut sichtbare Bereich vom Frame
336         aPaintArea._Intersection( aNormal );
337 
338         if ( bClip )
339             pOut->IntersectClipRegion( aPaintArea.SVRect() );
340         /// OD 25.09.2002 #99739# - delete unused 3rd parameter
341         PaintPicture( pOut, aGrfArea );
342     }
343     else
344         // wenn nicht sichtbar, loesche einfach den angegebenen Bereich
345         lcl_ClearArea( *this, *pSh->GetOut(), aPaintArea, SwRect() );
346     if( pGrfNd )
347         pGrfNd->SetFrameInPaint( sal_False );
348 
349     pOut->Pop();
350     SfxProgress::LeaveLock();
351 }
352 
353 /*************************************************************************
354 |*
355 |*    void lcl_CalcRect( Point & aPt, Size & aDim,
356 |*                   sal_uInt16 nMirror )
357 |*
358 |*    Beschreibung      Errechne die Position und die Groesse der Grafik im
359 |*                      Frame, entsprechen der aktuellen Grafik-Attribute
360 |*
361 |*    Parameter         Point&  die Position im Frame  ( auch Return-Wert )
362 |*                      Size&   die Groesse der Grafik ( auch Return-Wert )
363 |*                      MirrorGrf   akt. Spiegelungs-Attribut
364 |*    Ersterstellung    JP 04.03.91
365 |*    Letzte Aenderung  JP 31.08.94
366 |*
367 *************************************************************************/
368 
369 
370 void lcl_CalcRect( Point& rPt, Size& rDim, sal_uInt16 nMirror )
371 {
372     if( nMirror == RES_MIRROR_GRAPH_VERT || nMirror == RES_MIRROR_GRAPH_BOTH )
373     {
374         rPt.X() += rDim.Width() -1;
375         rDim.Width() = -rDim.Width();
376     }
377 
378     if( nMirror == RES_MIRROR_GRAPH_HOR || nMirror == RES_MIRROR_GRAPH_BOTH )
379     {
380         rPt.Y() += rDim.Height() -1;
381         rDim.Height() = -rDim.Height();
382     }
383 }
384 
385 /*************************************************************************
386 |*
387 |*    void SwNoTxtFrm::GetGrfArea()
388 |*
389 |*    Beschreibung      Errechne die Position und die Groesse der Bitmap
390 |*                      innerhalb des uebergebenem Rechtecks.
391 |*
392 |*    Ersterstellung    JP 03.09.91
393 |*    Letzte Aenderung  MA 11. Oct. 94
394 |*
395 *************************************************************************/
396 
397 void SwNoTxtFrm::GetGrfArea( SwRect &rRect, SwRect* pOrigRect,
398                              sal_Bool ) const
399 {
400     // JP 23.01.2001: currently only used for scaling, cropping and mirroring
401     // the contour of graphics!
402     //                  all other is handled by the GraphicObject
403 
404     //In rRect wird das sichbare Rechteck der Grafik gesteckt.
405     //In pOrigRect werden Pos+Size der Gesamtgrafik gesteck.
406 
407     const SwAttrSet& rAttrSet = GetNode()->GetSwAttrSet();
408     const SwCropGrf& rCrop = rAttrSet.GetCropGrf();
409     sal_uInt16 nMirror = rAttrSet.GetMirrorGrf().GetValue();
410 
411     if( rAttrSet.GetMirrorGrf().IsGrfToggle() )
412     {
413         if( !(FindPageFrm()->GetVirtPageNum() % 2) )
414         {
415             switch ( nMirror )
416             {
417                 case RES_MIRROR_GRAPH_DONT: nMirror = RES_MIRROR_GRAPH_VERT; break;
418                 case RES_MIRROR_GRAPH_VERT: nMirror = RES_MIRROR_GRAPH_DONT; break;
419                 case RES_MIRROR_GRAPH_HOR: nMirror = RES_MIRROR_GRAPH_BOTH; break;
420                 default: nMirror = RES_MIRROR_GRAPH_HOR; break;
421             }
422         }
423     }
424 
425     //Grafik wird vom Node eingelesen falls notwendig. Kann aber schiefgehen.
426     long nLeftCrop, nRightCrop, nTopCrop, nBottomCrop;
427     Size aOrigSz( ((SwNoTxtNode*)GetNode())->GetTwipSize() );
428     if ( !aOrigSz.Width() )
429     {
430         aOrigSz.Width() = Prt().Width();
431         nLeftCrop  = -rCrop.GetLeft();
432         nRightCrop = -rCrop.GetRight();
433     }
434     else
435     {
436         nLeftCrop = Max( aOrigSz.Width() -
437                             (rCrop.GetRight() + rCrop.GetLeft()), long(1) );
438         const double nScale = double(Prt().Width())  / double(nLeftCrop);
439         nLeftCrop  = long(nScale * -rCrop.GetLeft() );
440         nRightCrop = long(nScale * -rCrop.GetRight() );
441     }
442 
443     // crop values have to be mirrored too
444     if( nMirror == RES_MIRROR_GRAPH_VERT || nMirror == RES_MIRROR_GRAPH_BOTH )
445     {
446         long nTmpCrop = nLeftCrop;
447         nLeftCrop = nRightCrop;
448         nRightCrop= nTmpCrop;
449     }
450 
451     if( !aOrigSz.Height() )
452     {
453         aOrigSz.Height() = Prt().Height();
454         nTopCrop   = -rCrop.GetTop();
455         nBottomCrop= -rCrop.GetBottom();
456     }
457     else
458     {
459         nTopCrop = Max( aOrigSz.Height() - (rCrop.GetTop() + rCrop.GetBottom()), long(1) );
460         const double nScale = double(Prt().Height()) / double(nTopCrop);
461         nTopCrop   = long(nScale * -rCrop.GetTop() );
462         nBottomCrop= long(nScale * -rCrop.GetBottom() );
463     }
464 
465     // crop values have to be mirrored too
466     if( nMirror == RES_MIRROR_GRAPH_HOR || nMirror == RES_MIRROR_GRAPH_BOTH )
467     {
468         long nTmpCrop = nTopCrop;
469         nTopCrop   = nBottomCrop;
470         nBottomCrop= nTmpCrop;
471     }
472 
473     Size  aVisSz( Prt().SSize() );
474     Size  aGrfSz( aVisSz );
475     Point aVisPt( Frm().Pos() + Prt().Pos() );
476     Point aGrfPt( aVisPt );
477 
478     //Erst das 'sichtbare' Rect einstellen.
479     if ( nLeftCrop > 0 )
480     {
481         aVisPt.X()  += nLeftCrop;
482         aVisSz.Width() -= nLeftCrop;
483     }
484     if ( nTopCrop > 0 )
485     {
486         aVisPt.Y()   += nTopCrop;
487         aVisSz.Height() -= nTopCrop;
488     }
489     if ( nRightCrop > 0 )
490         aVisSz.Width() -= nRightCrop;
491     if ( nBottomCrop > 0 )
492         aVisSz.Height() -= nBottomCrop;
493 
494     rRect.Pos  ( aVisPt );
495     rRect.SSize( aVisSz );
496 
497     //Ggf. Die Gesamtgrafik berechnen
498     if ( pOrigRect )
499     {
500         Size aTmpSz( aGrfSz );
501         aGrfPt.X()    += nLeftCrop;
502         aTmpSz.Width() -= nLeftCrop + nRightCrop;
503         aGrfPt.Y()      += nTopCrop;
504         aTmpSz.Height()-= nTopCrop + nBottomCrop;
505 
506         if( RES_MIRROR_GRAPH_DONT != nMirror )
507             lcl_CalcRect( aGrfPt, aTmpSz, nMirror );
508 
509         pOrigRect->Pos  ( aGrfPt );
510         pOrigRect->SSize( aTmpSz );
511     }
512 }
513 
514 /*************************************************************************
515 |*
516 |*    Size SwNoTxtFrm::GetSize()
517 |*
518 |*    Beschreibung      Gebe die Groesse des umgebenen FLys und
519 |*                      damit die der Grafik zurueck.
520 |*    Ersterstellung    JP 04.03.91
521 |*    Letzte Aenderung  JP 31.08.94
522 |*
523 *************************************************************************/
524 
525 
526 const Size& SwNoTxtFrm::GetSize() const
527 {
528     // gebe die Groesse des Frames zurueck
529     const SwFrm *pFly = FindFlyFrm();
530     if( !pFly )
531         pFly = this;
532     return pFly->Prt().SSize();
533 }
534 
535 /*************************************************************************
536 |*
537 |*    SwNoTxtFrm::MakeAll()
538 |*
539 |*    Ersterstellung    MA 29. Nov. 96
540 |*    Letzte Aenderung  MA 29. Nov. 96
541 |*
542 *************************************************************************/
543 
544 
545 void SwNoTxtFrm::MakeAll()
546 {
547     SwCntntNotify aNotify( this );
548     SwBorderAttrAccess aAccess( SwFrm::GetCache(), this );
549     const SwBorderAttrs &rAttrs = *aAccess.Get();
550 
551     while ( !bValidPos || !bValidSize || !bValidPrtArea )
552     {
553         MakePos();
554 
555         if ( !bValidSize )
556             Frm().Width( GetUpper()->Prt().Width() );
557 
558         MakePrtArea( rAttrs );
559 
560         if ( !bValidSize )
561         {   bValidSize = sal_True;
562             Format();
563         }
564     }
565 }
566 
567 /*************************************************************************
568 |*
569 |*    SwNoTxtFrm::Format()
570 |*
571 |*    Beschreibung      Errechne die Groesse der Bitmap, wenn noetig
572 |*    Ersterstellung    JP 11.03.91
573 |*    Letzte Aenderung  MA 13. Mar. 96
574 |*
575 *************************************************************************/
576 
577 
578 void SwNoTxtFrm::Format( const SwBorderAttrs * )
579 {
580     const Size aNewSize( GetSize() );
581 
582     // hat sich die Hoehe geaendert?
583     SwTwips nChgHght = IsVertical() ?
584         (SwTwips)(aNewSize.Width() - Prt().Width()) :
585         (SwTwips)(aNewSize.Height() - Prt().Height());
586     if( nChgHght > 0)
587         Grow( nChgHght );
588     else if( nChgHght < 0)
589         Shrink( Min(Prt().Height(), -nChgHght) );
590 }
591 
592 /*************************************************************************
593 |*
594 |*    SwNoTxtFrm::GetCharRect()
595 |*
596 |*    Beschreibung
597 |*    Ersterstellung    SS 29-Apr-1991
598 |*    Letzte Aenderung  MA 10. Oct. 94
599 |*
600 |*************************************************************************/
601 
602 
603 sal_Bool SwNoTxtFrm::GetCharRect( SwRect &rRect, const SwPosition& rPos,
604                               SwCrsrMoveState *pCMS ) const
605 {
606     if ( &rPos.nNode.GetNode() != (SwNode*)GetNode() )
607         return sal_False;
608 
609     Calc();
610     SwRect aFrameRect( Frm() );
611     rRect = aFrameRect;
612     rRect.Pos( Frm().Pos() + Prt().Pos() );
613     rRect.SSize( Prt().SSize() );
614 
615     rRect.Justify();
616 
617     // liegt die Bitmap ueberhaupt im sichtbaren Berich ?
618     if( !aFrameRect.IsOver( rRect ) )
619     {
620         // wenn nicht dann steht der Cursor auf dem Frame
621         rRect = aFrameRect;
622         rRect.Width( 1 );
623     }
624     else
625         rRect._Intersection( aFrameRect );
626 
627     if ( pCMS )
628     {
629         if ( pCMS->bRealHeight )
630         {
631             pCMS->aRealHeight.Y() = rRect.Height();
632             pCMS->aRealHeight.X() = 0;
633         }
634     }
635 
636     return sal_True;
637 }
638 
639 
640 sal_Bool SwNoTxtFrm::GetCrsrOfst(SwPosition* pPos, Point& ,
641                              SwCrsrMoveState* ) const
642 {
643     SwCntntNode* pCNd = (SwCntntNode*)GetNode();
644     pPos->nNode = *pCNd;
645     pPos->nContent.Assign( pCNd, 0 );
646     return sal_True;
647 }
648 
649 #define CLEARCACHE( pNd ) {\
650     (pNd)->ReleaseGraphicFromCache();\
651     SwFlyFrm* pFly = FindFlyFrm();\
652     if( pFly && pFly->GetFmt()->GetSurround().IsContour() )\
653     {\
654         ClrContourCache( pFly->GetVirtDrawObj() );\
655         pFly->NotifyBackground( FindPageFrm(), Prt(), PREP_FLY_ATTR_CHG );\
656     }\
657 }
658 
659 void SwNoTxtFrm::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew )
660 {
661     sal_uInt16 nWhich = pNew ? pNew->Which() : pOld ? pOld->Which() : 0;
662 
663     // --> OD 2007-03-06 #i73788#
664     // no <SwCntntFrm::Modify(..)> for RES_LINKED_GRAPHIC_STREAM_ARRIVED
665     if ( RES_GRAPHIC_PIECE_ARRIVED != nWhich &&
666          RES_GRAPHIC_ARRIVED != nWhich &&
667          RES_GRF_REREAD_AND_INCACHE != nWhich &&
668          RES_LINKED_GRAPHIC_STREAM_ARRIVED != nWhich )
669     // <--
670     {
671         SwCntntFrm::Modify( pOld, pNew );
672     }
673 
674     sal_Bool bComplete = sal_True;
675 
676     switch( nWhich )
677     {
678     case RES_OBJECTDYING:
679         break;
680 
681     case RES_GRF_REREAD_AND_INCACHE:
682         if( ND_GRFNODE == GetNode()->GetNodeType() )
683         {
684             bComplete = sal_False;
685             SwGrfNode* pNd = (SwGrfNode*) GetNode();
686 
687             ViewShell *pVSh = 0;
688             pNd->GetDoc()->GetEditShell( &pVSh );
689             if( pVSh )
690             {
691                 GraphicAttr aAttr;
692                 if( pNd->GetGrfObj().IsCached( pVSh->GetOut(), Point(),
693                             Prt().SSize(), &pNd->GetGraphicAttr( aAttr, this ) ))
694                 {
695                     ViewShell *pSh = pVSh;
696                     do {
697                         SET_CURR_SHELL( pSh );
698                         if( pSh->GetWin() )
699                         {
700                             if( pSh->IsPreView() )
701                                 ::RepaintPagePreview( pSh, Frm().SVRect() );
702                             else
703                                 pSh->GetWin()->Invalidate( Frm().SVRect() );
704                         }
705                     } while( pVSh != (pSh = (ViewShell*)pSh->GetNext() ));
706                 }
707                 else
708                     pNd->SwapIn();
709             }
710         }
711         break;
712 
713     case RES_UPDATE_ATTR:
714     case RES_FMT_CHG:
715         CLEARCACHE( (SwGrfNode*) GetNode() )
716         break;
717 
718     case RES_ATTRSET_CHG:
719         {
720             sal_uInt16 n;
721             for( n = RES_GRFATR_BEGIN; n < RES_GRFATR_END; ++n )
722                 if( SFX_ITEM_SET == ((SwAttrSetChg*)pOld)->GetChgSet()->
723                                 GetItemState( n, sal_False ))
724                 {
725                     CLEARCACHE( (SwGrfNode*) GetNode() )
726                     break;
727                 }
728             if( RES_GRFATR_END == n )           // not found
729                 return ;
730         }
731         break;
732 
733     case RES_GRAPHIC_PIECE_ARRIVED:
734     case RES_GRAPHIC_ARRIVED:
735     // --> OD 2007-03-06 #i73788#
736     // handle RES_LINKED_GRAPHIC_STREAM_ARRIVED as RES_GRAPHIC_ARRIVED
737     case RES_LINKED_GRAPHIC_STREAM_ARRIVED:
738     // <--
739         if ( GetNode()->GetNodeType() == ND_GRFNODE )
740         {
741             bComplete = sal_False;
742             SwGrfNode* pNd = (SwGrfNode*) GetNode();
743 
744             CLEARCACHE( pNd )
745 
746             SwRect aRect( Frm() );
747 
748             ViewShell *pVSh = 0;
749             pNd->GetDoc()->GetEditShell( &pVSh );
750             if( !pVSh )
751                 break;
752 
753             ViewShell *pSh = pVSh;
754             do {
755                 SET_CURR_SHELL( pSh );
756                 if( pSh->IsPreView() )
757                 {
758                     if( pSh->GetWin() )
759                         ::RepaintPagePreview( pSh, aRect );
760                 }
761                 else if ( pSh->VisArea().IsOver( aRect ) &&
762                    OUTDEV_WINDOW == pSh->GetOut()->GetOutDevType() )
763                 {
764                     // OD 27.11.2002 #105519# - invalidate instead of painting
765                     pSh->GetWin()->Invalidate( aRect.SVRect() );
766                 }
767 
768                 pSh = (ViewShell *)pSh->GetNext();
769             } while( pSh != pVSh );
770         }
771         break;
772 
773     default:
774         if ( !pNew || !isGRFATR(nWhich) )
775             return;
776     }
777 
778     if( bComplete )
779     {
780         InvalidatePrt();
781         SetCompletePaint();
782     }
783 }
784 
785 void lcl_correctlyAlignRect( SwRect& rAlignedGrfArea, const SwRect& rInArea, OutputDevice* pOut )
786 {
787 
788     if(!pOut)
789         return;
790     Rectangle aPxRect = pOut->LogicToPixel( rInArea.SVRect() );
791     Rectangle aNewPxRect( aPxRect );
792     while( aNewPxRect.Left() < aPxRect.Left() )
793     {
794         rAlignedGrfArea.Left( rAlignedGrfArea.Left()+1 );
795         aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
796     }
797     while( aNewPxRect.Top() < aPxRect.Top() )
798     {
799         rAlignedGrfArea.Top( rAlignedGrfArea.Top()+1 );
800         aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
801     }
802     while( aNewPxRect.Bottom() > aPxRect.Bottom() )
803     {
804         rAlignedGrfArea.Bottom( rAlignedGrfArea.Bottom()-1 );
805         aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
806     }
807     while( aNewPxRect.Right() > aPxRect.Right() )
808     {
809         rAlignedGrfArea.Right( rAlignedGrfArea.Right()-1 );
810         aNewPxRect = pOut->LogicToPixel( rAlignedGrfArea.SVRect() );
811     }
812 }
813 
814 bool paintUsingPrimitivesHelper(
815     OutputDevice& rOutputDevice,
816     const drawinglayer::primitive2d::Primitive2DSequence& rSequence,
817     const basegfx::B2DRange& rSourceRange,
818     const basegfx::B2DRange& rTargetRange,
819     const sal_Int32 nLeftCrop = 0,
820     const sal_Int32 nTopCrop = 0,
821     const sal_Int32 nRightCrop = 0,
822     const sal_Int32 nBottomCrop = 0,
823     const bool bMirrorX = false,
824     const bool bMirrorY = false)
825 {
826     const double fSourceWidth(rSourceRange.getWidth());
827     const double fSourceHeight(rSourceRange.getHeight());
828 
829     if(rSequence.hasElements() && !basegfx::fTools::equalZero(fSourceWidth) && !basegfx::fTools::equalZero(fSourceHeight))
830     {
831         // copy target range and apply evtl. cropping
832         basegfx::B2DRange aTargetRange(rTargetRange);
833 
834         if(nLeftCrop || nTopCrop || nRightCrop || nBottomCrop)
835         {
836             // calculate original TargetRange
837             const double fFactor100thmmToTwips(72.0 / 127.0);
838 
839             aTargetRange = basegfx::B2DRange(
840                 aTargetRange.getMinX() - (nLeftCrop * fFactor100thmmToTwips),
841                 aTargetRange.getMinY() - (nTopCrop * fFactor100thmmToTwips),
842                 aTargetRange.getMaxX() + (nRightCrop * fFactor100thmmToTwips),
843                 aTargetRange.getMaxY() + (nBottomCrop * fFactor100thmmToTwips));
844         }
845 
846         const double fTargetWidth(aTargetRange.getWidth());
847         const double fTargetHeight(aTargetRange.getHeight());
848 
849         if(!basegfx::fTools::equalZero(fTargetWidth) && !basegfx::fTools::equalZero(fTargetHeight))
850         {
851             // map graphic range to target range. This will automatically include
852             // tme mapping from Svg 1/100th mm content to twips since the target
853             // range is twips already
854             basegfx::B2DHomMatrix aMappingTransform(
855                 basegfx::tools::createTranslateB2DHomMatrix(
856                     -rSourceRange.getMinX(),
857                     -rSourceRange.getMinY()));
858 
859             aMappingTransform.scale(fTargetWidth / fSourceWidth, fTargetHeight / fSourceHeight);
860             aMappingTransform.translate(aTargetRange.getMinX(), aTargetRange.getMinY());
861 
862             // apply mirrorings
863             if(bMirrorX || bMirrorY)
864             {
865                 aMappingTransform.translate(-aTargetRange.getCenterX(), -aTargetRange.getCenterY());
866                 aMappingTransform.scale(bMirrorX ? -1.0 : 1.0, bMirrorY ? -1.0 : 1.0); // #119176# small typo with X/Y
867                 aMappingTransform.translate(aTargetRange.getCenterX(), aTargetRange.getCenterY());
868             }
869 
870             // Fill ViewInformation. Use MappingTransform here, so there is no need to
871             // embed the primitives to it. Use original TargetRange here so there is also
872             // no need to embed the primitives to a MaskPrimitive for cropping. This works
873             // only in this case where the graphic object cannot be rotated, though.
874             const drawinglayer::geometry::ViewInformation2D aViewInformation2D(
875                 aMappingTransform,
876                 rOutputDevice.GetViewTransformation(),
877                 aTargetRange,
878                 0,
879                 0.0,
880                 uno::Sequence< beans::PropertyValue >());
881 
882             // get a primitive processor for rendering
883             drawinglayer::processor2d::BaseProcessor2D* pProcessor2D = drawinglayer::processor2d::createProcessor2DFromOutputDevice(
884                 rOutputDevice,
885                 aViewInformation2D);
886 
887             if(pProcessor2D)
888             {
889                 // render and cleanup
890                 pProcessor2D->process(rSequence);
891                 delete pProcessor2D;
892                 return true;
893             }
894         }
895     }
896 
897     return false;
898 }
899 
900 // Ausgabe der Grafik. Hier wird entweder eine QuickDraw-Bmp oder
901 // eine Grafik vorausgesetzt. Ist nichts davon vorhanden, wird
902 // eine Ersatzdarstellung ausgegeben.
903 /// OD 25.09.2002 #99739# - delete unused 3rd parameter.
904 /// OD 25.09.2002 #99739# - use aligned rectangle for drawing graphic.
905 /// OD 25.09.2002 #99739# - pixel-align coordinations for drawing graphic.
906 void SwNoTxtFrm::PaintPicture( OutputDevice* pOut, const SwRect &rGrfArea ) const
907 {
908     ViewShell* pShell = getRootFrm()->GetCurrShell();
909 
910     SwNoTxtNode& rNoTNd = *(SwNoTxtNode*)GetNode();
911     SwGrfNode* pGrfNd = rNoTNd.GetGrfNode();
912     SwOLENode* pOLENd = rNoTNd.GetOLENode();
913 
914     const sal_Bool bPrn = pOut == rNoTNd.getIDocumentDeviceAccess()->getPrinter( false ) ||
915                           pOut->GetConnectMetaFile();
916 
917     const bool bIsChart = pOLENd && ChartHelper::IsChart( pOLENd->GetOLEObj().GetObject() );
918 
919     /// OD 25.09.2002 #99739# - calculate aligned rectangle from parameter <rGrfArea>.
920     ///     Use aligned rectangle <aAlignedGrfArea> instead of <rGrfArea> in
921     ///     the following code.
922     SwRect aAlignedGrfArea = rGrfArea;
923     ::SwAlignRect( aAlignedGrfArea,  pShell );
924 
925     if( !bIsChart )
926     {
927         /// OD 25.09.2002 #99739#
928         /// Because for drawing a graphic left-top-corner and size coordinations are
929         /// used, these coordinations have to be determined on pixel level.
930         ::SwAlignGrfRect( &aAlignedGrfArea, *pOut );
931     }
932     else //if( bIsChart )
933     {
934         //#i78025# charts own borders are not completely visible
935         //the above pixel correction is not correct - at least not for charts
936         //so a different pixel correction is choosen here
937         //this might be a good idea for all other OLE objects also,
938         //but as I cannot oversee the consequences I fix it only for charts for now
939         lcl_correctlyAlignRect( aAlignedGrfArea, rGrfArea, pOut );
940     }
941 
942     if( pGrfNd )
943     {
944         sal_Bool bForceSwap = sal_False, bContinue = sal_True;
945         const GraphicObject& rGrfObj = pGrfNd->GetGrfObj();
946 
947         GraphicAttr aGrfAttr;
948         pGrfNd->GetGraphicAttr( aGrfAttr, this );
949 
950         if( !bPrn )
951         {
952             // --> OD 2007-01-02 #i73788#
953             if ( pGrfNd->IsLinkedInputStreamReady() )
954             {
955                 pGrfNd->UpdateLinkWithInputStream();
956             }
957             // <--
958             // --> OD 2008-01-30 #i85717#
959             // --> OD 2008-07-21 #i90395# - check, if asynchronous retrieval
960             // if input stream for the graphic is possible
961 //            else if( GRAPHIC_DEFAULT == rGrfObj.GetType() &&
962             else if ( ( rGrfObj.GetType() == GRAPHIC_DEFAULT ||
963                         rGrfObj.GetType() == GRAPHIC_NONE ) &&
964                       pGrfNd->IsLinkedFile() &&
965                       pGrfNd->IsAsyncRetrieveInputStreamPossible() )
966             // <--
967             {
968                 Size aTmpSz;
969                 ::sfx2::SvLinkSource* pGrfObj = pGrfNd->GetLink()->GetObj();
970                 if( !pGrfObj ||
971                     !pGrfObj->IsDataComplete() ||
972                     !(aTmpSz = pGrfNd->GetTwipSize()).Width() ||
973                     !aTmpSz.Height() || !pGrfNd->GetAutoFmtLvl() )
974                 {
975                     // --> OD 2006-12-22 #i73788#
976                     pGrfNd->TriggerAsyncRetrieveInputStream();
977                     // <--
978                 }
979                 String aTxt( pGrfNd->GetTitle() );
980                 if ( !aTxt.Len() )
981                     GetRealURL( *pGrfNd, aTxt );
982                 ::lcl_PaintReplacement( aAlignedGrfArea, aTxt, *pShell, this, sal_False );
983                 bContinue = sal_False;
984             }
985             else if( rGrfObj.IsCached( pOut, aAlignedGrfArea.Pos(),
986                                     aAlignedGrfArea.SSize(), &aGrfAttr ))
987             {
988                 pGrfNd->DrawGraphicWithPDFHandling(*pOut,
989                     aAlignedGrfArea.Pos(), aAlignedGrfArea.SSize(),
990                     &aGrfAttr );
991                 bContinue = sal_False;
992             }
993         }
994 
995         if( bContinue )
996         {
997             const sal_Bool bSwapped = rGrfObj.IsSwappedOut();
998             const sal_Bool bSwappedIn = 0 != pGrfNd->SwapIn( bPrn );
999             if( bSwappedIn && rGrfObj.GetGraphic().IsSupportedGraphic())
1000             {
1001                 const sal_Bool bAnimate = rGrfObj.IsAnimated() &&
1002                                          !pShell->IsPreView() &&
1003                                          !pShell->GetAccessibilityOptions()->IsStopAnimatedGraphics() &&
1004                 // --> FME 2004-06-21 #i9684# Stop animation during printing/pdf export
1005                                           pShell->GetWin();
1006                 // <--
1007 
1008                 if( bAnimate &&
1009                     FindFlyFrm() != ::GetFlyFromMarked( 0, pShell ))
1010                 {
1011                     OutputDevice* pVout;
1012                     if( pOut == pShell->GetOut() && SwRootFrm::FlushVout() )
1013                         pVout = pOut, pOut = pShell->GetOut();
1014                     else if( pShell->GetWin() &&
1015                              OUTDEV_VIRDEV == pOut->GetOutDevType() )
1016                         pVout = pOut, pOut = pShell->GetWin();
1017                     else
1018                         pVout = 0;
1019 
1020                     ASSERT( OUTDEV_VIRDEV != pOut->GetOutDevType() ||
1021                             pShell->GetViewOptions()->IsPDFExport(),
1022                             "pOut sollte kein virtuelles Device sein" );
1023 
1024                     pGrfNd->StartGraphicAnimation(pOut, aAlignedGrfArea.Pos(),
1025                                         aAlignedGrfArea.SSize(), long(this),
1026                                         0, GRFMGR_DRAW_STANDARD, pVout );
1027                 }
1028                 else
1029                 {
1030                     const SvgDataPtr& rSvgDataPtr = rGrfObj.GetGraphic().getSvgData();
1031                     bool bDone(false);
1032 
1033                     if(rSvgDataPtr.get())
1034                     {
1035                         // Graphic is Svg and can be painted as primitives (vector graphic)
1036                         const basegfx::B2DRange aTargetRange(
1037                             aAlignedGrfArea.Left(), aAlignedGrfArea.Top(),
1038                             aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom());
1039                         const bool bCropped(aGrfAttr.IsCropped());
1040 
1041                         bDone = paintUsingPrimitivesHelper(
1042                             *pOut,
1043                             rSvgDataPtr->getPrimitive2DSequence(),
1044                             rSvgDataPtr->getRange(),
1045                             aTargetRange,
1046                             bCropped ? aGrfAttr.GetLeftCrop() : 0,
1047                             bCropped ? aGrfAttr.GetTopCrop() : 0,
1048                             bCropped ? aGrfAttr.GetRightCrop() : 0,
1049                             bCropped ? aGrfAttr.GetBottomCrop() : 0,
1050                             aGrfAttr.GetMirrorFlags() & BMP_MIRROR_HORZ,
1051                             aGrfAttr.GetMirrorFlags() & BMP_MIRROR_VERT);
1052                     }
1053 
1054                     if(!bDone)
1055                     {
1056                         // fallback paint, uses replacement image
1057                         pGrfNd->DrawGraphicWithPDFHandling(*pOut, aAlignedGrfArea.Pos(), aAlignedGrfArea.SSize(), &aGrfAttr);
1058                     }
1059                 }
1060             }
1061             else
1062             {
1063                 sal_uInt16 nResId = 0;
1064                 if( bSwappedIn )
1065                 {
1066                     if( GRAPHIC_NONE == rGrfObj.GetType() )
1067                         nResId = STR_COMCORE_READERROR;
1068                     else if ( !rGrfObj.GetGraphic().IsSupportedGraphic() )
1069                         nResId = STR_COMCORE_CANT_SHOW;
1070                 }
1071                 ((SwNoTxtFrm*)this)->nWeight = -1;
1072                 String aText;
1073                 if ( !nResId &&
1074                      !(aText = pGrfNd->GetTitle()).Len() &&
1075                      (!GetRealURL( *pGrfNd, aText ) || !aText.Len()))
1076                 {
1077                     nResId = STR_COMCORE_READERROR;
1078                 }
1079                 if ( nResId )
1080                     aText = SW_RESSTR( nResId );
1081 
1082                 ::lcl_PaintReplacement( aAlignedGrfArea, aText, *pShell, this, sal_True );
1083             }
1084 
1085             //Beim Drucken duerfen wir nicht die Grafiken sammeln...
1086             if( bSwapped && bPrn )
1087                 bForceSwap = sal_True;
1088         }
1089         if( bForceSwap )
1090             pGrfNd->SwapOut();
1091     }
1092     else // bIsChart || pOLENd
1093     {
1094         // --> OD 2009-03-05 #i99665#
1095         // Adjust AntiAliasing mode at output device for chart OLE
1096         const sal_uInt16 nFormerAntialiasingAtOutput( pOut->GetAntialiasing() );
1097         if ( pOLENd->IsChart() &&
1098                 pShell->Imp()->GetDrawView()->IsAntiAliasing() )
1099         {
1100             const sal_uInt16 nAntialiasingForChartOLE =
1101                     nFormerAntialiasingAtOutput | ANTIALIASING_PIXELSNAPHAIRLINE;
1102             pOut->SetAntialiasing( nAntialiasingForChartOLE );
1103         }
1104         // <--
1105 
1106         bool bDone(false);
1107 
1108         if(bIsChart)
1109         {
1110             const uno::Reference< frame::XModel > aXModel(pOLENd->GetOLEObj().GetOleRef()->getComponent(), uno::UNO_QUERY);
1111 
1112             if(aXModel.is())
1113             {
1114                 basegfx::B2DRange aSourceRange;
1115 
1116                 const drawinglayer::primitive2d::Primitive2DSequence aSequence(
1117                     ChartHelper::tryToGetChartContentAsPrimitive2DSequence(
1118                         aXModel,
1119                         aSourceRange));
1120 
1121                 if(aSequence.hasElements() && !aSourceRange.isEmpty())
1122                 {
1123                     const basegfx::B2DRange aTargetRange(
1124                         aAlignedGrfArea.Left(), aAlignedGrfArea.Top(),
1125                         aAlignedGrfArea.Right(), aAlignedGrfArea.Bottom());
1126 
1127                     bDone = paintUsingPrimitivesHelper(
1128                         *pOut,
1129                         aSequence,
1130                         aSourceRange,
1131                         aTargetRange);
1132                 }
1133             }
1134         }
1135 
1136         if(!bDone && pOLENd)
1137         {
1138             Point aPosition(aAlignedGrfArea.Pos());
1139             Size aSize(aAlignedGrfArea.SSize());
1140 
1141             // Im BrowseModus gibt es nicht unbedingt einen Drucker und
1142             // damit kein JobSetup, also legen wir eines an ...
1143             const JobSetup* pJobSetup = pOLENd->getIDocumentDeviceAccess()->getJobsetup();
1144             sal_Bool bDummyJobSetup = 0 == pJobSetup;
1145             if( bDummyJobSetup )
1146                 pJobSetup = new JobSetup();
1147 
1148             // #i42323#
1149             // The reason for #114233# is gone, so i remove it again
1150             //TODO/LATER: is it a problem that the JopSetup isn't used?
1151             //xRef->DoDraw( pOut, aAlignedGrfArea.Pos(), aAlignedGrfArea.SSize(), *pJobSetup );
1152 
1153             // get hi-contrast image, but never for printing
1154             Graphic* pGraphic = NULL;
1155             if (pOut && !bPrn && Application::GetSettings().GetStyleSettings().GetHighContrastMode() )
1156                 pGraphic = pOLENd->GetHCGraphic();
1157 
1158             // when it is not possible to get HC-representation, the original image should be used
1159             if ( !pGraphic )
1160                 pGraphic = pOLENd->GetGraphic();
1161 
1162             if ( pGraphic && pGraphic->GetType() != GRAPHIC_NONE )
1163             {
1164                 pGraphic->Draw( pOut, aPosition, aSize );
1165 
1166                 // shade the representation if the object is activated outplace
1167                 uno::Reference < embed::XEmbeddedObject > xObj = pOLENd->GetOLEObj().GetOleRef();
1168                 if ( xObj.is() && xObj->getCurrentState() == embed::EmbedStates::ACTIVE )
1169                 {
1170                     ::svt::EmbeddedObjectRef::DrawShading( Rectangle( aPosition, aSize ), pOut );
1171                 }
1172             }
1173             else
1174                 ::svt::EmbeddedObjectRef::DrawPaintReplacement( Rectangle( aPosition, aSize ), pOLENd->GetOLEObj().GetCurrentPersistName(), pOut );
1175 
1176             if( bDummyJobSetup )
1177                 delete pJobSetup;  // ... und raeumen wieder auf.
1178 
1179             sal_Int64 nMiscStatus = pOLENd->GetOLEObj().GetOleRef()->getStatus( pOLENd->GetAspect() );
1180             if ( !bPrn && pShell->ISA( SwCrsrShell ) &&
1181                     nMiscStatus & embed::EmbedMisc::MS_EMBED_ACTIVATEWHENVISIBLE )
1182             {
1183                 const SwFlyFrm *pFly = FindFlyFrm();
1184                 ASSERT( pFly, "OLE not in FlyFrm" );
1185                 ((SwFEShell*)pShell)->ConnectObj( pOLENd->GetOLEObj().GetObject(), pFly->Prt(), pFly->Frm());
1186             }
1187         }
1188 
1189         // --> OD 2009-03-05 #i99665#
1190         if ( pOLENd->IsChart() &&
1191                 pShell->Imp()->GetDrawView()->IsAntiAliasing() )
1192         {
1193             pOut->SetAntialiasing( nFormerAntialiasingAtOutput );
1194         }
1195         // <--
1196     }
1197 }
1198 
1199 
1200 sal_Bool SwNoTxtFrm::IsTransparent() const
1201 {
1202     const ViewShell* pSh = getRootFrm()->GetCurrShell();
1203     if ( !pSh || !pSh->GetViewOptions()->IsGraphic() )
1204         return sal_True;
1205 
1206     const SwGrfNode *pNd;
1207     if( 0 != (pNd = GetNode()->GetGrfNode()) )
1208         return pNd->IsTransparent();
1209 
1210     //#29381# OLE sind immer Transparent.
1211     return sal_True;
1212 }
1213 
1214 
1215 void SwNoTxtFrm::StopAnimation( OutputDevice* pOut ) const
1216 {
1217     //animierte Grafiken anhalten
1218     const SwGrfNode* pGrfNd = dynamic_cast< const SwGrfNode* >(GetNode()->GetGrfNode());
1219 
1220     if( pGrfNd && pGrfNd->IsAnimated() )
1221     {
1222         const_cast< SwGrfNode* >(pGrfNd)->StopGraphicAnimation( pOut, long(this) );
1223     }
1224 }
1225 
1226 
1227 sal_Bool SwNoTxtFrm::HasAnimation() const
1228 {
1229     const SwGrfNode* pGrfNd = GetNode()->GetGrfNode();
1230     return pGrfNd && pGrfNd->IsAnimated();
1231 }
1232 
1233 
1234 
1235