1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: viewsh.cxx,v $
10 * $Revision: 1.87.42.1 $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_sw.hxx"
35 #define _SVX_PARAITEM_HXX
36 #define _SVX_TEXTITEM_HXX
38 #include <com/sun/star/accessibility/XAccessible.hpp>
40 #include <sfx2/viewfrm.hxx>
41 #include <sfx2/progress.hxx>
42 #include <svx/srchdlg.hxx>
43 #include <svx/svdobj.hxx>
44 #include <sfx2/viewsh.hxx>
46 //#include <tools/shl.hxx>
49 #include <swmodule.hxx>
52 #include <rootfrm.hxx>
53 #include <pagefrm.hxx>
55 #include <viewimp.hxx>
56 #include <frmtool.hxx>
57 #include <viewopt.hxx>
59 #include <swregion.hxx>
61 #include <fmtfsize.hxx>
62 #include <docufld.hxx>
66 #include <fntcache.hxx>
67 #include <ptqueue.hxx>
72 #include <pagedesc.hxx>
74 #include <ndindex.hxx>
76 #include <svtools/colorcfg.hxx>
77 #include <svtools/accessibilityoptions.hxx>
78 #include <accessibilityoptions.hxx>
80 #include <statstr.hrc>
83 #include <comcore.hrc>
85 // OD 14.01.2003 #103492#
86 #include <pagepreviewlayout.hxx>
87 // --> OD 2004-05-24 #i28701#
88 #include <sortedobjs.hxx>
89 #include <anchoredobject.hxx>
92 #include "../../ui/inc/view.hxx"
93 #include <PostItMgr.hxx>
94 #include <vcl/virdev.hxx>
96 #include <vcl/svapp.hxx>
99 #include <svx/sdrpaintwindow.hxx>
101 BOOL
ViewShell::bLstAct
= FALSE
;
102 ShellResource
*ViewShell::pShellRes
= 0;
103 Window
*ViewShell::pCareWindow
= 0;
104 BitmapEx
* ViewShell::pErrorBmp
= NULL
;
105 BitmapEx
* ViewShell::pReplaceBmp
= NULL
;
107 BOOL bInSizeNotify
= FALSE
;
111 TYPEINIT0(ViewShell
);
113 using namespace ::com::sun::star
;
115 //////////////////////////////////////////////////////////////////////////////
116 // #i72754# 2nd set of Pre/PostPaints
117 // This time it uses the lock counter mnPrePostPaintCount to allow only one activation
118 // and deactivation and mpPrePostOutDev to remember the OutDev from the BeginDrawLayers
119 // call. That way, all places where paint take place can be handled the same way, even
120 // when calling other paint methods. This is the case at the places where SW paints
121 // buffered into VDevs to avoid flicker. Tis is in general problematic and should be
122 // solved once using the BufferedOutput functionality of the DrawView.
124 void ViewShell::PrePaint()
126 // forward PrePaint event from VCL Window to DrawingLayer
129 Imp()->GetDrawView()->PrePaint();
133 void ViewShell::DLPrePaint2(const Region
& rRegion
)
135 if(0L == mnPrePostPaintCount
)
137 // #i75172# ensure DrawView to use DrawingLayer bufferings
138 if ( !HasDrawView() )
141 // Prefer window; if tot available, get pOut (e.g. printer)
142 mpPrePostOutDev
= (GetWin() ? GetWin() : GetOut());
144 // #i74769# use SdrPaintWindow now direct
145 mpTargetPaintWindow
= Imp()->GetDrawView()->BeginDrawLayers(mpPrePostOutDev
, rRegion
);
146 OSL_ENSURE(mpTargetPaintWindow
, "BeginDrawLayers: Got no SdrPaintWindow (!)");
148 // #i74769# if prerender, save OutDev and redirect to PreRenderDevice
149 if(mpTargetPaintWindow
->GetPreRenderDevice())
151 mpBufferedOut
= pOut
;
152 pOut
= &(mpTargetPaintWindow
->GetTargetOutputDevice());
155 // remember original paint MapMode for wrapped FlyFrame paints
156 maPrePostMapMode
= pOut
->GetMapMode();
159 mnPrePostPaintCount
++;
162 void ViewShell::DLPostPaint2(bool bPaintFormLayer
)
164 OSL_ENSURE(mnPrePostPaintCount
> 0L, "ViewShell::DLPostPaint2: Pre/PostPaint encapsulation broken (!)");
165 mnPrePostPaintCount
--;
167 if((0L == mnPrePostPaintCount
) && (0 != mpTargetPaintWindow
))
169 // #i74769# restore buffered OutDev
170 if(mpTargetPaintWindow
->GetPreRenderDevice())
172 pOut
= mpBufferedOut
;
175 // #i74769# use SdrPaintWindow now direct
176 Imp()->GetDrawView()->EndDrawLayers(*mpTargetPaintWindow
, bPaintFormLayer
);
177 mpTargetPaintWindow
= 0;
181 //////////////////////////////////////////////////////////////////////////////
183 /******************************************************************************
185 |* ViewShell::ImplEndAction()
187 |* Letzte Aenderung MA 04. Sep. 96
189 ******************************************************************************/
191 void ViewShell::ImplEndAction( const BOOL bIdleEnd
)
193 //Fuer den Drucker gibt es hier nichts zu tun.
194 if ( !GetWin() || IsPreView() )
203 //Laeuft hiermit das EndAction der Letzten Shell im Ring?
204 ViewShell::bLstAct
= TRUE
;
205 ViewShell
*pSh
= (ViewShell
*)this->GetNext();
206 while ( pSh
!= this )
207 { if ( pSh
->ActionPend() )
208 { ViewShell::bLstAct
= FALSE
;
212 pSh
= (ViewShell
*)pSh
->GetNext();
215 const bool bIsShellForCheckViewLayout
= ( this == GetLayout()->GetCurrShell() );
217 SET_CURR_SHELL( this );
218 if ( Imp()->HasDrawView() && !Imp()->GetDrawView()->areMarkHandlesHidden() )
219 Imp()->StartAction();
221 if ( Imp()->GetRegion() && Imp()->GetRegion()->GetOrigin() != VisArea() )
224 const BOOL bExtraData
= ::IsExtraData( GetDoc() );
228 if ( Imp()->IsNextScroll() && !bExtraData
)
233 Imp()->bScroll
= FALSE
;
234 Imp()->SetNextScroll();
235 Imp()->ResetScroll();
237 SwLayAction
aAction( GetLayout(), Imp() );
238 aAction
.SetComplete( FALSE
);
240 aAction
.SetPaint( FALSE
);
241 aAction
.SetInputType( INPUT_KEYBOARD
);
246 if ( bIsShellForCheckViewLayout
)
247 GetLayout()->CheckViewLayout( GetViewOptions(), &aVisArea
);
249 //Wenn wir selbst keine Paints erzeugen, so warten wir auf das Paint
250 //vom System. Dann ist das Clipping korrekt gesetzt; Beispiel: verschieben
251 //eines DrawObjektes.
252 if ( Imp()->GetRegion() || Imp()->GetScrollRects() ||
253 aInvalidRect
.HasArea() || bExtraData
)
257 BOOL bPaintsFromSystem
= aInvalidRect
.HasArea();
259 if ( aInvalidRect
.HasArea() )
261 if ( bPaintsFromSystem
)
262 Imp()->AddPaintRect( aInvalidRect
);
265 bPaintsFromSystem
= TRUE
;
269 SwRegionRects
*pRegion
= Imp()->GetRegion();
271 //JP 27.11.97: wer die Selection hided, muss sie aber auch
272 // wieder Showen. Sonst gibt es Paintfehler!
273 // z.B.: addional Mode, Seite vertikal hab zu sehen, in der
274 // Mitte eine Selektion und mit einem anderen Cursor an linken
275 // rechten Rand springen. Ohne ShowCrsr verschwindet die
277 BOOL bShowCrsr
= (pRegion
|| Imp()->GetScrollRects()) &&
278 IsA( TYPE(SwCrsrShell
) );
280 ((SwCrsrShell
*)this)->HideCrsrs();
283 if ( bPaintsFromSystem
&& Imp()->pScrolledArea
)
284 Imp()->FlushScrolledArea();
288 SwRootFrm
* pLayout
= GetLayout();
290 Imp()->pRegion
= NULL
;
292 //Erst Invert dann Compress, niemals andersherum!
297 VirtualDevice
*pVout
= 0;
298 while ( pRegion
->Count() )
300 SwRect
aRect( (*pRegion
)[ pRegion
->Count() - 1 ] );
301 pRegion
->Remove( pRegion
->Count() - 1 );
304 if ( IsEndActionByVirDev() )
306 //virtuelles device erzeugen und einstellen.
308 pVout
= new VirtualDevice( *GetOut() );
309 MapMode
aMapMode( GetOut()->GetMapMode() );
310 pVout
->SetMapMode( aMapMode
);
314 Rectangle
aTmp1( aRect
.SVRect() );
315 aTmp1
= GetOut()->LogicToPixel( aTmp1
);
316 Rectangle
aTmp2( GetOut()->PixelToLogic( aTmp1
) );
317 if ( aTmp2
.Left() > aRect
.Left() )
318 aTmp1
.Left() = Max( 0L, aTmp1
.Left() - 1L );
319 if ( aTmp2
.Top() > aRect
.Top() )
320 aTmp1
.Top() = Max( 0L, aTmp1
.Top() - 1L );
323 aTmp1
= GetOut()->PixelToLogic( aTmp1
);
324 aRect
= SwRect( aTmp1
);
326 const Size
aTmp( pVout
->GetOutputSize() );
327 if ( aTmp
.Height() < aRect
.Height() ||
328 aTmp
.Width() < aRect
.Width() )
330 bSizeOK
= pVout
->SetOutputSize( aRect
.SSize() );
336 // --> OD 2007-07-26 #i79947#
337 // #i72754# start Pre/PostPaint encapsulation before pOut is changed to the buffering VDev
338 const Region
aRepaintRegion(aRect
.SVRect());
339 DLPrePaint2(aRepaintRegion
);
342 OutputDevice
*pOld
= GetOut();
343 pVout
->SetLineColor( pOld
->GetLineColor() );
344 pVout
->SetFillColor( pOld
->GetFillColor() );
345 Point
aOrigin( aRect
.Pos() );
346 aOrigin
.X() = -aOrigin
.X(); aOrigin
.Y() = -aOrigin
.Y();
347 aMapMode
.SetOrigin( aOrigin
);
348 pVout
->SetMapMode( aMapMode
);
351 if ( bPaintsFromSystem
)
352 PaintDesktop( aRect
);
353 pLayout
->Paint( aRect
);
354 pOld
->DrawOutDev( aRect
.Pos(), aRect
.SSize(),
355 aRect
.Pos(), aRect
.SSize(), *pVout
);
358 // #i72754# end Pre/PostPaint encapsulation when pOut is back and content is painted
364 // #i75172# begin DrawingLayer paint
365 // need to do begin/end DrawingLayer preparation for each single rectangle of the
366 // repaint region. I already tried to prepare only once for the whole Region. This
367 // seems to work (and does technically) but fails with transparent objects. Since the
368 // region given to BeginDarwLayers() defines the clip region for DrawingLayer paint,
369 // transparent objects in the single rectangles will indeed be painted multiple times.
370 DLPrePaint2(Region(aRect
.SVRect()));
372 if ( bPaintsFromSystem
)
373 PaintDesktop( aRect
);
374 pLayout
->Paint( aRect
);
376 // #i75172# end DrawingLayer paint
386 ((SwCrsrShell
*)this)->ShowCrsrs( TRUE
);
397 bInEndAction
= FALSE
;
398 ViewShell::bLstAct
= FALSE
;
402 //Damit sich die automatischen Scrollbars auch richtig anordnen k?nnen
403 //muessen wir die Aktion hier kuenstlich beenden (EndAction loesst ein
404 //Notify aus, und das muss Start-/EndAction rufen um die Scrollbars
411 // test option 'No Scroll' suppresses the automatic repair of the scrolled area
412 if ( !GetViewOptions()->IsTest8() )
414 if ( Imp()->IsScrolled() )
415 Imp()->RestartScrollTimer();
417 if( Imp()->IsAccessible() )
418 Imp()->FireAccessibleEvents();
421 /******************************************************************************
423 |* ViewShell::ImplStartAction()
425 |* Ersterstellung MA 25. Jul. 94
426 |* Letzte Aenderung MA 25. Jul. 94
428 ******************************************************************************/
430 void ViewShell::ImplStartAction()
433 Imp()->StartAction();
437 /******************************************************************************
439 |* ViewShell::ImplLockPaint(), ImplUnlockPaint()
441 |* Ersterstellung MA 11. Jun. 96
442 |* Letzte Aenderung MA 11. Jun. 96
444 ******************************************************************************/
446 void ViewShell::ImplLockPaint()
448 if ( GetWin() && GetWin()->IsVisible() )
449 GetWin()->EnablePaint( FALSE
); //Auch die Controls abklemmen.
454 void ViewShell::ImplUnlockPaint( BOOL bVirDev
)
456 SET_CURR_SHELL( this );
457 if ( GetWin() && GetWin()->IsVisible() )
459 if ( (bInSizeNotify
|| bVirDev
) && VisArea().HasArea() )
461 //Refresh mit virtuellem Device um das Flackern zu verhindern.
462 VirtualDevice
*pVout
= new VirtualDevice( *pOut
);
463 pVout
->SetMapMode( pOut
->GetMapMode() );
464 Size
aSize( VisArea().SSize() );
467 if( pVout
->SetOutputSize( aSize
) )
469 GetWin()->EnablePaint( TRUE
);
470 GetWin()->Validate();
472 Imp()->UnlockPaint();
473 pVout
->SetLineColor( pOut
->GetLineColor() );
474 pVout
->SetFillColor( pOut
->GetFillColor() );
476 // #i72754# start Pre/PostPaint encapsulation before pOut is changed to the buffering VDev
477 const Region
aRepaintRegion(VisArea().SVRect());
478 DLPrePaint2(aRepaintRegion
);
480 OutputDevice
*pOld
= pOut
;
482 Paint( VisArea().SVRect() );
484 pOut
->DrawOutDev( VisArea().Pos(), aSize
,
485 VisArea().Pos(), aSize
, *pVout
);
487 // #i72754# end Pre/PostPaint encapsulation when pOut is back and content is painted
492 Imp()->UnlockPaint();
493 GetWin()->EnablePaint( TRUE
);
494 GetWin()->Invalidate( INVALIDATE_CHILDREN
);
500 Imp()->UnlockPaint();
501 GetWin()->EnablePaint( TRUE
);
502 GetWin()->Invalidate( INVALIDATE_CHILDREN
);
506 Imp()->UnlockPaint();
509 /******************************************************************************
511 |* ViewShell::AddPaintRect()
513 |* Ersterstellung MA ??
514 |* Letzte Aenderung MA 09. Feb. 97
516 ******************************************************************************/
518 BOOL
ViewShell::AddPaintRect( const SwRect
& rRect
)
521 ViewShell
*pSh
= this;
524 if ( pSh
->IsPreView() && pSh
->GetWin() )
525 // pSh->GetWin()->Invalidate();
526 ::RepaintPagePreview( pSh
, rRect
);
528 bRet
|= pSh
->Imp()->AddPaintRect( rRect
);
529 pSh
= (ViewShell
*)pSh
->GetNext();
531 } while ( pSh
!= this );
535 /******************************************************************************
537 |* ViewShell::InvalidateWindows()
539 |* Ersterstellung MA ??
540 |* Letzte Aenderung MA 09. Feb. 97
542 ******************************************************************************/
544 void ViewShell::InvalidateWindows( const SwRect
&rRect
)
546 if ( !Imp()->IsCalcLayoutProgress() )
548 ViewShell
*pSh
= this;
553 if ( pSh
->IsPreView() )
554 // pSh->GetWin()->Invalidate();
555 ::RepaintPagePreview( pSh
, rRect
);
556 else if ( pSh
->VisArea().IsOver( rRect
) )
557 pSh
->GetWin()->Invalidate( rRect
.SVRect() );
559 pSh
= (ViewShell
*)pSh
->GetNext();
561 } while ( pSh
!= this );
565 /******************************************************************************
567 |* ViewShell::MakeVisible()
569 |* Ersterstellung MA ??
570 |* Letzte Aenderung AMA 10. Okt. 95
572 ******************************************************************************/
574 void ViewShell::MakeVisible( const SwRect
&rRect
)
576 if ( !VisArea().IsInside( rRect
) || IsScrollMDI( this, rRect
) || GetCareWin(*this) )
578 if ( !IsViewLocked() )
582 const SwFrm
* pRoot
= GetDoc()->GetRootFrm();
586 nOldH
= pRoot
->Frm().Height();
588 ScrollMDI( this, rRect
, USHRT_MAX
, USHRT_MAX
);
590 } while( nOldH
!= pRoot
->Frm().Height() && nLoopCnt
-- );
595 //MA: 04. Nov. 94, braucht doch keiner oder??
596 ASSERT( !this, "MakeVisible fuer Drucker wird doch gebraucht?" );
604 /******************************************************************************
606 |* ViewShell::CareChildWindow()
608 |* Ersterstellung AMA 10. Okt. 95
609 |* Letzte Aenderung AMA 10. Okt. 95
611 ******************************************************************************/
613 Window
* ViewShell::CareChildWin(ViewShell
& rVSh
)
615 if(rVSh
.pSfxViewShell
)
617 const USHORT nId
= SvxSearchDialogWrapper::GetChildWindowId();
618 SfxViewFrame
* pVFrame
= rVSh
.pSfxViewShell
->GetViewFrame();
619 const SfxChildWindow
* pChWin
= pVFrame
->GetChildWindow( nId
);
620 Window
*pWin
= pChWin
? pChWin
->GetWindow() : NULL
;
621 if ( pWin
&& pWin
->IsVisible() )
627 /******************************************************************************
629 |* ViewShell::GetPagePos()
631 |* Ersterstellung MA ??
632 |* Letzte Aenderung MA 04. Aug. 93
634 ******************************************************************************/
636 Point
ViewShell::GetPagePos( USHORT nPageNum
) const
638 return GetLayout()->GetPagePos( nPageNum
);
641 /******************************************************************************
643 |* ViewShell::GetNumPages()
645 |* Ersterstellung MA ??
646 |* Letzte Aenderung MA 20. Apr. 94
648 ******************************************************************************/
650 USHORT
ViewShell::GetNumPages()
652 //Es kann sein, das noch kein Layout existiert weil die Methode vom
653 //Root-Ctor gerufen wird.
654 return GetLayout() ? GetLayout()->GetPageNum() : 0;
657 sal_Bool
ViewShell::IsDummyPage( USHORT nPageNum
) const
659 return GetLayout() ? GetLayout()->IsDummyPage( nPageNum
) : 0;
662 /*************************************************************************
664 |* ViewShell::UpdateFlds()
666 |* Ersterstellung BP 04.05.92
667 |* Beschreibung erzwingt ein Update fuer jedes Feld
669 |* UpdateFlds benachrichtigt alle Felder mit pNewHt.
670 |* Wenn pNewHt == 0 ist (default), wird der Feldtyp verschickt.
672 *************************************************************************/
674 void ViewShell::UpdateFlds(BOOL bCloseDB
)
676 SET_CURR_SHELL( this );
678 BOOL bCrsr
= ISA(SwCrsrShell
);
680 ((SwCrsrShell
*)this)->StartAction();
684 GetDoc()->UpdateFlds(0, bCloseDB
);
687 ((SwCrsrShell
*)this)->EndAction();
692 // update all charts, for that exists any table
693 void ViewShell::UpdateAllCharts()
695 SET_CURR_SHELL( this );
696 // Start-/EndAction handled in the SwDoc-Method!
697 GetDoc()->UpdateAllCharts();
700 BOOL
ViewShell::HasCharts() const
703 const SwStartNode
*pStNd
;
704 SwNodeIndex
aIdx( *GetDoc()->GetNodes().GetEndOfAutotext().
705 StartOfSectionNode(), 1 );
706 while ( 0 != (pStNd
= aIdx
.GetNode().GetStartNode()) )
709 const SwOLENode
*pNd
= aIdx
.GetNode().GetOLENode();
710 if( pNd
&& pNd
->GetChartTblName().Len() )
719 /*************************************************************************
721 |* ViewShell::LayoutIdle()
723 |* Ersterstellung MA 26. May. 92
724 |* Letzte Aenderung OG 19. Mar. 96
726 *************************************************************************/
728 void ViewShell::LayoutIdle()
731 //fuer TCV-Version: Ende der Startphase des Programmes
734 if( !pOpt
->IsIdle() || !GetWin() ||
735 ( Imp()->HasDrawView() && Imp()->GetDrawView()->IsDragObj() ) )
738 //Kein Idle wenn gerade gedruckt wird.
739 ViewShell
*pSh
= this;
741 { if ( !pSh
->GetWin() )
743 pSh
= (ViewShell
*)pSh
->GetNext();
745 } while ( pSh
!= this );
747 SET_CURR_SHELL( this );
750 // Wenn Test5 gedrueckt ist, wird der IdleFormatierer abgeknipst.
751 if( pOpt
->IsTest5() )
756 DBG_PROFSTART( LayoutIdle
);
758 //Cache vorbereiten und restaurieren, damit er nicht versaut wird.
759 SwSaveSetLRUOfst
aSave( *SwTxtFrm::GetTxtCache(),
760 SwTxtFrm::GetTxtCache()->GetCurMax() - 50 );
761 // #125243# there are lots of stacktraces indicating that Imp() returns NULL
762 // this ViewShell seems to be invalid - but it's not clear why
763 // this return is only a workaround!
764 DBG_ASSERT(Imp(), "ViewShell already deleted?");
767 SwLayIdle
aIdle( GetLayout(), Imp() );
768 DBG_PROFSTOP( LayoutIdle
);
772 /*************************************************************************
774 |* DOCUMENT COMPATIBILITY FLAGS
776 *************************************************************************/
778 void lcl_InvalidateAllCntnt( ViewShell
& rSh
, BYTE nInv
)
780 BOOL bCrsr
= rSh
.ISA(SwCrsrShell
);
782 ((SwCrsrShell
&)rSh
).StartAction();
785 rSh
.GetLayout()->InvalidateAllCntnt( nInv
);
787 ((SwCrsrShell
&)rSh
).EndAction();
791 rSh
.GetDoc()->SetModified();
794 /** local method to invalidate/re-calculate positions of floating screen
795 objects (Writer fly frame and drawing objects), which are anchored
796 to paragraph or to character.
798 OD 2004-03-16 #i11860#
802 void lcl_InvalidateAllObjPos( ViewShell
&_rSh
)
804 const bool bIsCrsrShell
= _rSh
.ISA(SwCrsrShell
);
806 static_cast<SwCrsrShell
&>(_rSh
).StartAction();
810 _rSh
.GetLayout()->InvalidateAllObjPos();
813 static_cast<SwCrsrShell
&>(_rSh
).EndAction();
817 _rSh
.GetDoc()->SetModified();
820 void ViewShell::SetParaSpaceMax( bool bNew
)
822 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
823 if( pIDSA
->get(IDocumentSettingAccess::PARA_SPACE_MAX
) != bNew
)
825 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
826 pIDSA
->set(IDocumentSettingAccess::PARA_SPACE_MAX
, bNew
);
827 const BYTE nInv
= INV_PRTAREA
| INV_TABLE
| INV_SECTION
;
828 lcl_InvalidateAllCntnt( *this, nInv
);
832 void ViewShell::SetParaSpaceMaxAtPages( bool bNew
)
834 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
835 if( pIDSA
->get(IDocumentSettingAccess::PARA_SPACE_MAX_AT_PAGES
) != bNew
)
837 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
838 pIDSA
->set(IDocumentSettingAccess::PARA_SPACE_MAX_AT_PAGES
, bNew
);
839 const BYTE nInv
= INV_PRTAREA
| INV_TABLE
| INV_SECTION
;
840 lcl_InvalidateAllCntnt( *this, nInv
);
844 void ViewShell::SetTabCompat( bool bNew
)
846 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
847 if( pIDSA
->get(IDocumentSettingAccess::TAB_COMPAT
) != bNew
)
849 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
850 pIDSA
->set(IDocumentSettingAccess::TAB_COMPAT
, bNew
);
851 const BYTE nInv
= INV_PRTAREA
| INV_SIZE
| INV_TABLE
| INV_SECTION
;
852 lcl_InvalidateAllCntnt( *this, nInv
);
856 /*-- 29.11.2007 09:03:18---------------------------------------------------
857 //#i24363# tab stops relative to indent
858 -----------------------------------------------------------------------*/
859 void ViewShell::SetTabsRelativeToIndent(bool bNew
)
861 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
862 if( pIDSA
->get(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT
) != bNew
)
864 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
865 pIDSA
->set(IDocumentSettingAccess::TABS_RELATIVE_TO_INDENT
, bNew
);
866 const BYTE nInv
= INV_PRTAREA
| INV_SIZE
| INV_TABLE
| INV_SECTION
;
867 lcl_InvalidateAllCntnt( *this, nInv
);
871 void ViewShell::SetAddExtLeading( bool bNew
)
873 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
874 if ( pIDSA
->get(IDocumentSettingAccess::ADD_EXT_LEADING
) != bNew
)
876 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
877 pIDSA
->set(IDocumentSettingAccess::ADD_EXT_LEADING
, bNew
);
878 SdrModel
* pTmpDrawModel
= getIDocumentDrawModelAccess()->GetDrawModel();
880 pTmpDrawModel
->SetAddExtLeading( bNew
);
881 const BYTE nInv
= INV_PRTAREA
| INV_SIZE
| INV_TABLE
| INV_SECTION
;
882 lcl_InvalidateAllCntnt( *this, nInv
);
886 void ViewShell::SetUseVirDev( bool bNewVirtual
)
888 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
889 if ( pIDSA
->get(IDocumentSettingAccess::USE_VIRTUAL_DEVICE
) != bNewVirtual
)
891 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
892 // this sets the flag at the document and calls PrtDataChanged
893 IDocumentDeviceAccess
* pIDDA
= getIDocumentDeviceAccess();
894 pIDDA
->setReferenceDeviceType( bNewVirtual
, true );
898 // OD 2004-02-16 #106629# - control, if paragraph and table spacing is added
899 // at bottom of table cells
900 void ViewShell::SetAddParaSpacingToTableCells( bool _bAddParaSpacingToTableCells
)
902 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
903 if ( pIDSA
->get(IDocumentSettingAccess::ADD_PARA_SPACING_TO_TABLE_CELLS
) != _bAddParaSpacingToTableCells
)
905 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
906 pIDSA
->set(IDocumentSettingAccess::ADD_PARA_SPACING_TO_TABLE_CELLS
, _bAddParaSpacingToTableCells
);
907 const BYTE nInv
= INV_PRTAREA
;
908 lcl_InvalidateAllCntnt( *this, nInv
);
912 // OD 06.01.2004 #i11859# - control, if former formatting of text lines with
913 // proportional line spacing is used or not.
914 void ViewShell::SetUseFormerLineSpacing( bool _bUseFormerLineSpacing
)
916 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
917 if ( pIDSA
->get(IDocumentSettingAccess::OLD_LINE_SPACING
) != _bUseFormerLineSpacing
)
919 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
920 pIDSA
->set(IDocumentSettingAccess::OLD_LINE_SPACING
, _bUseFormerLineSpacing
);
921 const BYTE nInv
= INV_PRTAREA
;
922 lcl_InvalidateAllCntnt( *this, nInv
);
926 // OD 2004-03-12 #i11860# - control, if former object positioning is used or not.
927 void ViewShell::SetUseFormerObjectPositioning( bool _bUseFormerObjPos
)
929 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
930 if ( pIDSA
->get(IDocumentSettingAccess::USE_FORMER_OBJECT_POS
) != _bUseFormerObjPos
)
932 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
933 pIDSA
->set(IDocumentSettingAccess::USE_FORMER_OBJECT_POS
, _bUseFormerObjPos
);
934 lcl_InvalidateAllObjPos( *this );
938 // OD 2004-05-05 #i28701#
939 void ViewShell::SetConsiderWrapOnObjPos( bool _bConsiderWrapOnObjPos
)
941 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
942 if ( pIDSA
->get(IDocumentSettingAccess::CONSIDER_WRAP_ON_OBJECT_POSITION
) != _bConsiderWrapOnObjPos
)
944 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
945 pIDSA
->set(IDocumentSettingAccess::CONSIDER_WRAP_ON_OBJECT_POSITION
, _bConsiderWrapOnObjPos
);
946 lcl_InvalidateAllObjPos( *this );
951 void ViewShell::SetUseFormerTextWrapping( bool _bUseFormerTextWrapping
)
953 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
954 if ( pIDSA
->get(IDocumentSettingAccess::USE_FORMER_TEXT_WRAPPING
) != _bUseFormerTextWrapping
)
956 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
957 pIDSA
->set(IDocumentSettingAccess::USE_FORMER_TEXT_WRAPPING
, _bUseFormerTextWrapping
);
958 const BYTE nInv
= INV_PRTAREA
| INV_SIZE
| INV_TABLE
| INV_SECTION
;
959 lcl_InvalidateAllCntnt( *this, nInv
);
964 // -> PB 2007-06-11 #i45491#
965 void ViewShell::SetDoNotJustifyLinesWithManualBreak( bool _bDoNotJustifyLinesWithManualBreak
)
967 IDocumentSettingAccess
* pIDSA
= getIDocumentSettingAccess();
968 if ( pIDSA
->get(IDocumentSettingAccess::DO_NOT_JUSTIFY_LINES_WITH_MANUAL_BREAK
) != _bDoNotJustifyLinesWithManualBreak
)
970 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
971 pIDSA
->set(IDocumentSettingAccess::DO_NOT_JUSTIFY_LINES_WITH_MANUAL_BREAK
, _bDoNotJustifyLinesWithManualBreak
);
972 const BYTE nInv
= INV_PRTAREA
| INV_SIZE
| INV_TABLE
| INV_SECTION
;
973 lcl_InvalidateAllCntnt( *this, nInv
);
978 /******************************************************************************
980 |* ViewShell::Reformat
982 |* Ersterstellung BP ???
983 |* Letzte Aenderung MA 13. Feb. 98
985 ******************************************************************************/
987 void ViewShell::Reformat()
989 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
991 // Wir gehen auf Nummer sicher:
992 // Wir muessen die alten Fontinformationen wegschmeissen,
993 // wenn die Druckeraufloesung oder der Zoomfaktor sich aendert.
994 // Init() und Reformat() sind die sichersten Stellen.
1001 if( GetLayout()->IsCallbackActionEnabled() )
1005 GetLayout()->InvalidateAllCntnt( INV_SIZE
| INV_POS
| INV_PRTAREA
);
1010 void ViewShell::ChgNumberDigits()
1012 SdrModel
* pTmpDrawModel
= getIDocumentDrawModelAccess()->GetDrawModel();
1013 if ( pTmpDrawModel
)
1014 pTmpDrawModel
->ReformatAllTextObjects();
1018 /******************************************************************************
1020 |* ViewShell::CalcLayout()
1021 |* Vollstaendige Formatierung von Layout und Inhalt.
1023 |* Ersterstellung MA 31. Jan. 94
1024 |* Letzte Aenderung MA 08. Oct. 96
1026 ******************************************************************************/
1028 void ViewShell::CalcLayout()
1030 SET_CURR_SHELL( this );
1031 SwWait
aWait( *GetDoc()->GetDocShell(), TRUE
);
1033 //Cache vorbereiten und restaurieren, damit er nicht versaut wird.
1034 SwSaveSetLRUOfst
aSaveLRU( *SwTxtFrm::GetTxtCache(),
1035 SwTxtFrm::GetTxtCache()->GetCurMax() - 50 );
1037 //Progress einschalten wenn noch keiner Lauft.
1038 const BOOL bEndProgress
= SfxProgress::GetActiveProgress( GetDoc()->GetDocShell() ) == 0;
1041 USHORT nEndPage
= GetLayout()->GetPageNum();
1042 nEndPage
+= nEndPage
* 10 / 100;
1043 ::StartProgress( STR_STATSTR_REFORMAT
, 0, nEndPage
, GetDoc()->GetDocShell() );
1046 SwLayAction
aAction( GetLayout(), Imp() );
1047 aAction
.SetPaint( FALSE
);
1048 aAction
.SetStatBar( TRUE
);
1049 aAction
.SetCalcLayout( TRUE
);
1050 aAction
.SetReschedule( TRUE
);
1051 GetDoc()->LockExpFlds();
1053 GetDoc()->UnlockExpFlds();
1055 //Das SetNewFldLst() am Doc wurde unterbunden und muss nachgeholt
1056 //werden (siehe flowfrm.cxx, txtfld.cxx)
1057 if ( aAction
.IsExpFlds() )
1060 aAction
.SetPaint( FALSE
);
1061 aAction
.SetStatBar( TRUE
);
1062 aAction
.SetReschedule( TRUE
);
1064 SwDocPosUpdate
aMsgHnt( 0 );
1065 GetDoc()->UpdatePageFlds( &aMsgHnt
);
1066 GetDoc()->UpdateExpFlds(NULL
, true);
1071 if ( VisArea().HasArea() )
1072 InvalidateWindows( VisArea() );
1074 ::EndProgress( GetDoc()->GetDocShell() );
1077 /******************************************************************************
1079 |* ViewShell::SetFirstVisPageInvalid()
1081 |* Ersterstellung MA 19. May. 94
1082 |* Letzte Aenderung MA 19. May. 94
1084 ******************************************************************************/
1086 void ViewShell::SetFirstVisPageInvalid()
1088 ViewShell
*pSh
= this;
1090 { pSh
->Imp()->SetFirstVisPageInvalid();
1091 pSh
= (ViewShell
*)pSh
->GetNext();
1093 } while ( pSh
!= this );
1096 /******************************************************************************
1098 |* ViewShell::SizeChgNotify()
1100 |* Ersterstellung MA ??
1101 |* Letzte Aenderung MA 17. Sep. 96
1103 ******************************************************************************/
1105 void ViewShell::SizeChgNotify()
1108 bDocSizeChgd
= TRUE
;
1109 else if( ActionPend() || Imp()->IsCalcLayoutProgress() || bPaintInProgress
)
1111 bDocSizeChgd
= TRUE
;
1113 if ( !Imp()->IsCalcLayoutProgress() && ISA( SwCrsrShell
) )
1115 const SwFrm
*pCnt
= ((SwCrsrShell
*)this)->GetCurrFrm( FALSE
);
1116 const SwPageFrm
*pPage
;
1117 if ( pCnt
&& 0 != (pPage
= pCnt
->FindPageFrm()) )
1119 USHORT nVirtNum
= pPage
->GetVirtPageNum();
1120 const SvxNumberType
& rNum
= pPage
->GetPageDesc()->GetNumType();
1121 String sDisplay
= rNum
.GetNumStr( nVirtNum
);
1122 PageNumNotify( this, pCnt
->GetPhyPageNum(), nVirtNum
, sDisplay
);
1128 bDocSizeChgd
= FALSE
;
1129 ::SizeNotify( this, GetDocSize() );
1133 /******************************************************************************
1135 |* ViewShell::VisPortChgd()
1137 |* Ersterstellung MA ??
1138 |* Letzte Aenderung MA 22. Jul. 96
1140 ******************************************************************************/
1142 void ViewShell::VisPortChgd( const SwRect
&rRect
)
1144 ASSERT( GetWin(), "VisPortChgd ohne Window." );
1146 if ( rRect
== VisArea() )
1152 //Da Rescheduled doch schon wieder irgendwo einer?
1153 ASSERT( !this, "Scroll waehrend einer EndAction." );
1157 //Ersteinmal die alte sichtbare Seite holen, dann braucht nacher nicht
1158 //lange gesucht werden.
1159 const SwFrm
*pOldPage
= Imp()->GetFirstVisPage();
1161 const SwRect
aPrevArea( VisArea() );
1162 const BOOL bFull
= aPrevArea
.IsEmpty();
1164 SetFirstVisPageInvalid();
1166 //Wenn noch eine PaintRegion herumsteht und sich die VisArea geaendert hat,
1167 //so ist die PaintRegion spaetestens jetzt obsolete. Die PaintRegion kann
1168 //vom RootFrm::Paint erzeugt worden sein.
1169 if ( !bInEndAction
&&
1170 Imp()->GetRegion() && Imp()->GetRegion()->GetOrigin() != VisArea() )
1171 Imp()->DelRegions();
1173 SET_CURR_SHELL( this );
1175 //SwSaveHdl aSaveHdl( Imp() );
1177 bool bScrolled
= false;
1179 SwPostItMgr
* pPostItMgr
= GetPostItMgr();
1182 GetWin()->Invalidate();
1185 // Betrag ausrechnen, um den gescrolled werden muss.
1186 const long nXDiff
= aPrevArea
.Left() - VisArea().Left();
1187 const long nYDiff
= aPrevArea
.Top() - VisArea().Top();
1189 if( !nXDiff
&& !getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE
) &&
1190 (!Imp()->HasDrawView() || !Imp()->GetDrawView()->IsGridVisible() ) )
1192 //Falls moeglich die Wiese nicht mit Scrollen.
1193 //Also linke und rechte Kante des Scrollbereiches auf die
1195 const SwPageFrm
*pPage
= (SwPageFrm
*)GetDoc()->GetRootFrm()->Lower();
1196 if ( pPage
->Frm().Top() > pOldPage
->Frm().Top() )
1197 pPage
= (SwPageFrm
*)pOldPage
;
1198 SwRect
aBoth( VisArea() );
1199 aBoth
.Union( aPrevArea
);
1200 const SwTwips nBottom
= aBoth
.Bottom();
1201 SwTwips nMinLeft
= LONG_MAX
;
1202 SwTwips nMaxRight
= 0;
1204 const SwTwips nSidebarWidth
= pPostItMgr
&& pPostItMgr
->ShowNotes() && pPostItMgr
->HasNotes() ?
1205 pPostItMgr
->GetSidebarWidth() + pPostItMgr
->GetSidebarBorderWidth() :
1207 const bool bBookMode
= GetViewOptions()->IsViewLayoutBookMode();
1209 while ( pPage
&& pPage
->Frm().Top() <= nBottom
)
1211 SwRect
aPageRect( pPage
->Frm() );
1214 const SwPageFrm
& rFormatPage
= static_cast<const SwPageFrm
*>(pPage
)->GetFormatPage();
1215 aPageRect
.SSize() = rFormatPage
.Frm().SSize();
1218 if ( aPageRect
.IsOver( aBoth
) )
1220 // OD 12.02.2003 #i9719#, #105645# - consider new border
1222 const SwTwips nBorderWidth
=
1223 GetOut()->PixelToLogic( Size( pPage
->BorderPxWidth(), 0 ) ).Width();
1224 const SwTwips nShadowWidth
=
1225 GetOut()->PixelToLogic( Size( pPage
->ShadowPxWidth(), 0 ) ).Width();
1227 SwTwips nPageLeft
= 0;
1228 SwTwips nPageRight
= 0;
1229 if (pPage
->MarginSide())
1231 nPageLeft
= aPageRect
.Left() - nBorderWidth
- nSidebarWidth
;
1232 nPageRight
= aPageRect
.Right() + nBorderWidth
+ nShadowWidth
;
1236 // OD 03.03.2003 #107927# - use correct datatype
1237 nPageLeft
= aPageRect
.Left() - nBorderWidth
;
1238 nPageRight
= aPageRect
.Right() + nBorderWidth
+ nShadowWidth
+ nSidebarWidth
;
1240 if( nPageLeft
< nMinLeft
)
1241 nMinLeft
= nPageLeft
;
1242 if( nPageRight
> nMaxRight
)
1243 nMaxRight
= nPageRight
;
1244 //Zus. auf die Zeichenobjekte abgleichen.
1245 //Einen Ofst beruecksichtigen, weil die Objekte u.U.
1246 //selektiert sind und die Henkel dann hinausstehen.
1247 if ( pPage
->GetSortedObjs() )
1249 const long nOfst
= GetOut()->PixelToLogic(
1250 Size(Imp()->GetDrawView()->GetMarkHdlSizePixel()/2,0)).Width();
1252 i
< pPage
->GetSortedObjs()->Count(); ++i
)
1254 SwAnchoredObject
* pObj
= (*pPage
->GetSortedObjs())[i
];
1255 const Rectangle
&rBound
= pObj
->GetObjRect().SVRect();
1256 // OD 03.03.2003 #107927# - use correct datatype
1257 const SwTwips nL
= Max( 0L, rBound
.Left() - nOfst
);
1258 if ( nL
< nMinLeft
)
1260 if( rBound
.Right() + nOfst
> nMaxRight
)
1261 nMaxRight
= rBound
.Right() + nOfst
;
1265 pPage
= (SwPageFrm
*)pPage
->GetNext();
1267 Rectangle
aRect( aPrevArea
.SVRect() );
1268 aRect
.Left() = nMinLeft
;
1269 aRect
.Right() = nMaxRight
;
1270 if( VisArea().IsOver( aPrevArea
) && !nLockPaint
)
1273 aVisArea
.Pos() = aPrevArea
.Pos();
1274 if ( SmoothScroll( nXDiff
, nYDiff
, &aRect
) )
1276 aVisArea
.Pos() = rRect
.Pos();
1279 GetWin()->Invalidate( aRect
);
1281 else if ( !nLockPaint
) //Wird im UnLock erledigt
1283 if( VisArea().IsOver( aPrevArea
) )
1286 aVisArea
.Pos() = aPrevArea
.Pos();
1287 if ( SmoothScroll( nXDiff
, nYDiff
, 0 ) )
1289 aVisArea
.Pos() = rRect
.Pos();
1292 GetWin()->Invalidate();
1296 Point
aPt( VisArea().Pos() );
1297 aPt
.X() = -aPt
.X(); aPt
.Y() = -aPt
.Y();
1298 MapMode
aMapMode( GetWin()->GetMapMode() );
1299 aMapMode
.SetOrigin( aPt
);
1300 GetWin()->SetMapMode( aMapMode
);
1301 if ( HasDrawView() )
1303 Imp()->GetDrawView()->VisAreaChanged( GetWin() );
1304 Imp()->GetDrawView()->SetActualWin( GetWin() );
1306 Imp()->bPaintInScroll
= TRUE
;
1308 Imp()->bPaintInScroll
= FALSE
;
1310 if ( !bScrolled
&& pPostItMgr
&& pPostItMgr
->HasNotes() && pPostItMgr
->ShowNotes() )
1311 pPostItMgr
->CorrectPositions();
1313 if( Imp()->IsAccessible() )
1314 Imp()->UpdateAccessible();
1318 /******************************************************************************
1320 |* ViewShell::SmoothScroll()
1322 |* Ersterstellung MA 04. Jul. 96
1323 |* Letzte Aenderung MA 25. Mar. 97
1325 ******************************************************************************/
1327 BOOL
ViewShell::SmoothScroll( long lXDiff
, long lYDiff
, const Rectangle
*pRect
)
1329 const ULONG nColCnt
= pOut
->GetColorCount();
1330 long lMult
= 1, lMax
= LONG_MAX
;
1331 if ( nColCnt
== 65536 )
1336 if ( nColCnt
== 16777216 )
1341 else if ( nColCnt
== 1 )
1347 // #i75172# isolated static conditions
1348 const bool bOnlyYScroll(!lXDiff
&& Abs(lYDiff
) != 0 && Abs(lYDiff
) < lMax
);
1349 const bool bAllowedWithChildWindows(GetWin()->GetWindowClipRegionPixel(WINDOW_GETCLIPREGION_NOCHILDREN
|WINDOW_GETCLIPREGION_NULL
).IsNull());
1350 // --> OD 2009-08-12 #i98766# - disable smooth scrolling for Mac port builds
1352 const bool bSmoothScrollAllowed(false);
1353 (void) bOnlyYScroll
;
1354 (void) bAllowedWithChildWindows
;
1356 const bool bSmoothScrollAllowed(bOnlyYScroll
&& bEnableSmooth
&& GetViewOptions()->IsSmoothScroll() && bAllowedWithChildWindows
);
1359 const bool bIAmCursorShell(ISA(SwCrsrShell
));
1360 (void) bIAmCursorShell
;
1362 // #i75172# with selection on overlay, smooth scroll should be allowed with it
1363 const bool bAllowedForSelection(true || (bIAmCursorShell
&& !((SwCrsrShell
*)this)->HasSelection()));
1365 // #i75172# with cursors on overlay, smooth scroll should be allowed with it
1366 const bool bAllowedForMultipleCursors(true || (bIAmCursorShell
&& ((SwCrsrShell
*)this)->GetCrsrCnt() < 2));
1368 if(bSmoothScrollAllowed
&& bAllowedForSelection
&& bAllowedForMultipleCursors
)
1370 Imp()->bStopSmooth
= FALSE
;
1372 const SwRect
aOldVis( VisArea() );
1374 //Virtuelles Device erzeugen und einstellen.
1375 const Size aPixSz
= GetWin()->PixelToLogic(Size(1,1));
1376 VirtualDevice
*pVout
= new VirtualDevice( *GetWin() );
1377 pVout
->SetLineColor( GetWin()->GetLineColor() );
1378 pVout
->SetFillColor( GetWin()->GetFillColor() );
1379 MapMode
aMapMode( GetWin()->GetMapMode() );
1380 pVout
->SetMapMode( aMapMode
);
1381 Size
aSize( aVisArea
.Width()+2*aPixSz
.Width(), Abs(lYDiff
)+(2*aPixSz
.Height()) );
1383 aSize
.Width() = Min(aSize
.Width(), pRect
->GetWidth()+2*aPixSz
.Width());
1384 if ( pVout
->SetOutputSize( aSize
) )
1388 //Ersteinmal alles neue in das VirDev Painten.
1389 SwRect
aRect( VisArea() );
1390 aRect
.Height( aSize
.Height() );
1393 aRect
.Pos().X() = Max(aRect
.Left(),pRect
->Left()-aPixSz
.Width());
1394 aRect
.Right( Min(aRect
.Right()+2*aPixSz
.Width(), pRect
->Right()+aPixSz
.Width()));
1397 aRect
.SSize().Width() += 2*aPixSz
.Width();
1398 aRect
.Pos().Y() = lYDiff
< 0 ? aOldVis
.Bottom() - aPixSz
.Height()
1399 : aRect
.Top() - aSize
.Height() + aPixSz
.Height();
1400 aRect
.Pos().X() = Max( 0L, aRect
.Left()-aPixSz
.Width() );
1401 aRect
.Pos() = GetWin()->PixelToLogic( GetWin()->LogicToPixel( aRect
.Pos()));
1402 aRect
.SSize()= GetWin()->PixelToLogic( GetWin()->LogicToPixel( aRect
.SSize()));
1404 const Point
aPt( -aRect
.Left(), -aRect
.Top() );
1405 aMapMode
.SetOrigin( aPt
);
1406 pVout
->SetMapMode( aMapMode
);
1407 OutputDevice
*pOld
= pOut
;
1411 // #i75172# To get a clean repaint, a new ObjectContact is needed here. Without, the
1412 // repaint would not be correct since it would use the wrong DrawPage visible region.
1413 // This repaint IS about painting something currently outside the visible part (!).
1414 // For that purpose, AddWindowToPaintView is used which creates a new SdrPageViewWindow
1415 // and all the necessary stuff. It's not cheap, but necessary here. Alone because repaint
1416 // target really is NOT the current window.
1417 // Also will automatically NOT use PreRendering and overlay (since target is VirtualDevice)
1420 SdrView
* pDrawView
= GetDrawView();
1421 pDrawView
->AddWindowToPaintView(pVout
);
1423 // clear pWin during DLPrePaint2 to get paint preparation for pOut, but set it again
1424 // immediately afterwards. There are many decisions in SW which imply that Printing
1425 // is used when pWin == 0 (wrong but widely used).
1426 Window
* pOldWin
= pWin
;
1428 DLPrePaint2(Region(aRect
.SVRect()));
1432 PaintDesktop( aRect
);
1433 ViewShell::bLstAct
= TRUE
;
1434 GetLayout()->Paint( aRect
);
1435 ViewShell::bLstAct
= FALSE
;
1437 // end paint and destroy ObjectContact again
1439 pDrawView
->DeleteWindowFromPaintView(pVout
);
1441 // temporary debug paint checking...
1442 static bool bDoSaveForVisualControl(false);
1443 if(bDoSaveForVisualControl
)
1445 const bool bMapModeWasEnabledVDev(pVout
->IsMapModeEnabled());
1446 pVout
->EnableMapMode(false);
1447 const Bitmap
aBitmap(pVout
->GetBitmap(Point(), pVout
->GetOutputSizePixel()));
1448 const String
aTmpString(ByteString( "c:\\test.bmp" ), RTL_TEXTENCODING_UTF8
);
1449 SvFileStream
aNew(aTmpString
, STREAM_WRITE
|STREAM_TRUNC
);
1451 pVout
->EnableMapMode(bMapModeWasEnabledVDev
);
1458 //Jetzt Stueckchenweise schieben und die neuen Pixel aus dem
1461 // ??????????????????????
1462 // or is it better to get the scrollfactor from the User
1464 // ??????????????????????
1465 long lMaDelta
= aPixSz
.Height();
1466 if ( Abs(lYDiff
) > ( aVisArea
.Height() / 3 ) )
1474 lMaDelta
= -lMaDelta
;
1476 long lDiff
= lYDiff
;
1480 if ( Imp()->bStopSmooth
|| Abs(lDiff
) <= Abs(lMaDelta
) )
1491 const SwRect aTmpOldVis
= VisArea();
1492 aVisArea
.Pos().Y() -= lScroll
;
1493 aVisArea
.Pos() = GetWin()->PixelToLogic( GetWin()->LogicToPixel( VisArea().Pos()));
1494 lScroll
= aTmpOldVis
.Top() - VisArea().Top();
1497 Rectangle
aTmp( aTmpOldVis
.SVRect() );
1498 aTmp
.Left() = pRect
->Left();
1499 aTmp
.Right()= pRect
->Right();
1500 GetWin()->Scroll( 0, lScroll
, aTmp
, SCROLL_CHILDREN
);
1503 GetWin()->Scroll( 0, lScroll
, SCROLL_CHILDREN
);
1505 const Point
aTmpPt( -VisArea().Left(), -VisArea().Top() );
1506 MapMode
aTmpMapMode( GetWin()->GetMapMode() );
1507 aTmpMapMode
.SetOrigin( aTmpPt
);
1508 GetWin()->SetMapMode( aTmpMapMode
);
1510 if ( Imp()->HasDrawView() )
1511 Imp()->GetDrawView()->VisAreaChanged( GetWin() );
1513 SetFirstVisPageInvalid();
1514 if ( !Imp()->bStopSmooth
)
1516 const bool bScrollDirectionIsUp(lScroll
> 0);
1517 Imp()->aSmoothRect
= VisArea();
1519 if(bScrollDirectionIsUp
)
1521 Imp()->aSmoothRect
.Bottom( VisArea().Top() + lScroll
+ aPixSz
.Height());
1525 Imp()->aSmoothRect
.Top( VisArea().Bottom() + lScroll
- aPixSz
.Height());
1528 Imp()->bSmoothUpdate
= TRUE
;
1530 Imp()->bSmoothUpdate
= FALSE
;
1532 if(!Imp()->bStopSmooth
)
1534 static bool bDoItOnPixels(true);
1537 // start paint on logic base
1538 const Rectangle
aTargetLogic(Imp()->aSmoothRect
.SVRect());
1539 DLPrePaint2(Region(aTargetLogic
));
1541 // get target rectangle in discrete pixels
1542 OutputDevice
& rTargetDevice
= mpTargetPaintWindow
->GetTargetOutputDevice();
1543 const Rectangle
aTargetPixel(rTargetDevice
.LogicToPixel(aTargetLogic
));
1545 // get source top-left in discrete pixels
1546 const Point
aSourceTopLeft(pVout
->LogicToPixel(aTargetLogic
.TopLeft()));
1548 // switch off MapModes
1549 const bool bMapModeWasEnabledDest(rTargetDevice
.IsMapModeEnabled());
1550 const bool bMapModeWasEnabledSource(pVout
->IsMapModeEnabled());
1551 rTargetDevice
.EnableMapMode(false);
1552 pVout
->EnableMapMode(false);
1555 static bool bTestDirectToWindowPaint(false);
1556 if(bTestDirectToWindowPaint
)
1558 const bool bMapModeWasEnabledWin(GetWin()->IsMapModeEnabled());
1559 GetWin()->EnableMapMode(false);
1561 GetWin()->DrawOutDev(
1562 aTargetPixel
.TopLeft(), aTargetPixel
.GetSize(), // dest
1563 aSourceTopLeft
, aTargetPixel
.GetSize(), // source
1566 GetWin()->EnableMapMode(bMapModeWasEnabledWin
);
1569 rTargetDevice
.DrawOutDev(
1570 aTargetPixel
.TopLeft(), aTargetPixel
.GetSize(), // dest
1571 aSourceTopLeft
, aTargetPixel
.GetSize(), // source
1575 rTargetDevice
.EnableMapMode(bMapModeWasEnabledDest
);
1576 pVout
->EnableMapMode(bMapModeWasEnabledSource
);
1578 // end paint on logoc base
1583 Rectangle
aRectangle(Imp()->aSmoothRect
.SVRect());
1584 aRectangle
.Left() -= aPixSz
.Width();
1585 aRectangle
.Right() += aPixSz
.Width();
1586 aRectangle
.Top() -= aPixSz
.Height();
1587 aRectangle
.Bottom() += aPixSz
.Height();
1588 const Point
aUpdateTopLeft(aRectangle
.TopLeft());
1589 const Size
aUpdateSize(aRectangle
.GetSize());
1591 // #i75172# the part getting visible needs to be handled like a repaint.
1592 // For that, start with DLPrePaint2 and the correct Rectangle
1593 DLPrePaint2(Region(aRectangle
));
1595 static bool bTestDirectToWindowPaint(false);
1596 if(bTestDirectToWindowPaint
)
1598 GetWin()->DrawOutDev(aUpdateTopLeft
, aUpdateSize
, aUpdateTopLeft
, aUpdateSize
, *pVout
);
1601 mpTargetPaintWindow
->GetTargetOutputDevice().DrawOutDev(aUpdateTopLeft
, aUpdateSize
, aUpdateTopLeft
, aUpdateSize
, *pVout
);
1603 // #i75172# Corret repaint end
1604 // Note: This also correcty creates the overlay, thus smooth scroll will
1605 // also be allowed now wth selection (see big IF above)
1615 if ( !Imp()->bStopSmooth
)
1617 SetFirstVisPageInvalid();
1623 aVisArea
.Pos().X() -= lXDiff
;
1624 aVisArea
.Pos().Y() -= lYDiff
;
1626 GetWin()->Scroll( lXDiff
, lYDiff
, *pRect
, SCROLL_CHILDREN
);
1628 GetWin()->Scroll( lXDiff
, lYDiff
, SCROLL_CHILDREN
);
1632 /******************************************************************************
1634 |* ViewShell::PaintDesktop()
1636 |* Ersterstellung MA 16. Dec. 93
1637 |* Letzte Aenderung MA 30. Nov. 95
1639 ******************************************************************************/
1641 void ViewShell::PaintDesktop( const SwRect
&rRect
)
1643 if ( !GetWin() && !GetOut()->GetConnectMetaFile() )
1644 return; //Fuer den Drucker tun wir hier nix
1646 //Sonderfaelle abfangen, damit es nicht gar so ueberraschend aussieht.
1647 //Kann z.B. waehrend des Idle'ns zwischenzeitlich auftreten.
1648 //Die Rechtecke neben den Seiten muessen wir leider auf jedenfall Painten,
1649 //den diese werden spaeter beim VisPortChgd ausgespart.
1650 BOOL bBorderOnly
= FALSE
;
1651 const SwRootFrm
*pRoot
= GetDoc()->GetRootFrm();
1652 if ( rRect
.Top() > pRoot
->Frm().Bottom() )
1654 const SwFrm
*pPg
= pRoot
->Lower();
1655 while ( pPg
&& pPg
->GetNext() )
1656 pPg
= pPg
->GetNext();
1657 if ( !pPg
|| !pPg
->Frm().IsOver( VisArea() ) )
1661 const bool bBookMode
= GetViewOptions()->IsViewLayoutBookMode();
1663 SwRegionRects
aRegion( rRect
);
1665 //mod #i6193: remove sidebar area to avoid flickering
1666 const SwPostItMgr
* pPostItMgr
= GetPostItMgr();
1667 const SwTwips nSidebarWidth
= pPostItMgr
&& pPostItMgr
->HasNotes() && pPostItMgr
->ShowNotes() ?
1668 pPostItMgr
->GetSidebarWidth() + pPostItMgr
->GetSidebarBorderWidth() :
1673 const SwFrm
*pPage
= pRoot
->Lower();
1674 SwRect
aLeft( rRect
), aRight( rRect
);
1677 long nTmp
= pPage
->Frm().Left();
1678 if ( nTmp
< aLeft
.Right() )
1679 aLeft
.Right( nTmp
);
1680 nTmp
= pPage
->Frm().Right();
1681 if ( nTmp
> aRight
.Left() )
1683 aRight
.Left( nTmp
+ nSidebarWidth
);
1685 pPage
= pPage
->GetNext();
1687 aRegion
.Remove( 0, aRegion
.Count() );
1688 if ( aLeft
.HasArea() )
1689 aRegion
.Insert( aLeft
, 0 );
1690 if ( aRight
.HasArea() )
1691 aRegion
.Insert( aRight
, 1 );
1695 const SwFrm
*pPage
= Imp()->GetFirstVisPage();
1696 const SwTwips nBottom
= rRect
.Bottom();
1697 //const SwTwips nRight = rRect.Right();
1698 while ( pPage
&& aRegion
.Count() &&
1699 (pPage
->Frm().Top() <= nBottom
) ) // PAGES01 && (pPage->Frm().Left() <= nRight))
1701 SwRect
aPageRect( pPage
->Frm() );
1704 const SwPageFrm
& rFormatPage
= static_cast<const SwPageFrm
*>(pPage
)->GetFormatPage();
1705 aPageRect
.SSize() = rFormatPage
.Frm().SSize();
1708 const bool bSidebarRight
= !static_cast<const SwPageFrm
*>(pPage
)->MarginSide();
1709 aPageRect
.Pos().X() -= bSidebarRight
? 0 : nSidebarWidth
;
1710 aPageRect
.SSize().Width() += nSidebarWidth
;
1712 if ( aPageRect
.IsOver( rRect
) )
1713 aRegion
-= aPageRect
;
1715 pPage
= pPage
->GetNext();
1718 if ( aRegion
.Count() )
1719 _PaintDesktop( aRegion
);
1723 // PaintDesktop gesplittet, dieser Teil wird auch von PreViewPage benutzt
1724 void ViewShell::_PaintDesktop( const SwRegionRects
&rRegion
)
1726 // OD 2004-04-23 #116347#
1727 GetOut()->Push( PUSH_FILLCOLOR
|PUSH_LINECOLOR
);
1728 GetOut()->SetLineColor();
1730 for ( USHORT i
= 0; i
< rRegion
.Count(); ++i
)
1732 const Rectangle
aRectangle(rRegion
[i
].SVRect());
1735 // Here we have a real Problem. On the one hand we have the buffering for paint
1736 // and overlay which needs an embracing pair of DLPrePaint2/DLPostPaint2 calls,
1737 // on the other hand the MapMode is not set correctly when this code is executed.
1738 // This is done in the users of this method, for each SWpage before painting it.
1739 // Since the MapMode is not correct here, the call to DLPostPaint2 will paint
1740 // existing FormControls due to the current MapMode.
1742 // There are basically three solutions for this:
1744 // (1) Set the MapMode correct, move the background painting to the users of
1747 // (2) Do no DLPrePaint2/DLPostPaint2 here; no SdrObjects are allowed to lie in
1748 // the desktop region. Disadvantage: the desktop will not be part of the
1749 // buffers, e.g. overlay. Thus, as soon as overlay will be used over the
1750 // desktop, it will not work.
1752 // (3) expand DLPostPaint2 with a flag to signal if FormControl paints shall
1755 // Currently, (3) will be the best possible solution. It will keep overlay and
1756 // buffering intact and work without MapMode for single pages. In the medium
1757 // to long run, (1) will need to be used and the bool bPaintFormLayer needs
1758 // to be removed again
1760 // #i68597# inform Drawinglayer about display change
1761 DLPrePaint2(Region(aRectangle
));
1763 // #i75172# needed to move line/Fill color setters into loop since DLPrePaint2
1764 // may exchange GetOut(), that's it's purpose. This happens e.g. at print preview.
1765 GetOut()->SetFillColor( SwViewOption::GetAppBackgroundColor());
1766 GetOut()->SetLineColor();
1767 GetOut()->DrawRect(aRectangle
);
1769 DLPostPaint2(false);
1775 /******************************************************************************
1777 |* ViewShell::CheckInvalidForPaint()
1779 |* Ersterstellung MA 19. May. 94
1780 |* Letzte Aenderung MA 09. Jun. 94
1782 ******************************************************************************/
1784 BOOL
ViewShell::CheckInvalidForPaint( const SwRect
&rRect
)
1789 const SwPageFrm
*pPage
= Imp()->GetFirstVisPage();
1790 const SwTwips nBottom
= VisArea().Bottom();
1791 const SwTwips nRight
= VisArea().Right();
1793 while ( !bRet
&& pPage
&& !((pPage
->Frm().Top() > nBottom
) ||
1794 (pPage
->Frm().Left() > nRight
)))
1796 if ( pPage
->IsInvalid() || pPage
->IsInvalidFly() )
1798 pPage
= (SwPageFrm
*)pPage
->GetNext();
1803 //Start/EndAction wuerden hier leider nix helfen, weil das Paint vom
1804 //GUI 'reinkam und somit ein Clipping gesetzt ist gegen das wir nicht
1806 //Ergo: Alles selbst machen (siehe ImplEndAction())
1807 if ( Imp()->GetRegion() && Imp()->GetRegion()->GetOrigin() != VisArea())
1808 Imp()->DelRegions();
1810 Imp()->ResetScroll();
1811 SwLayAction
aAction( GetLayout(), Imp() );
1812 aAction
.SetComplete( FALSE
);
1813 // We increment the action counter to avoid a recursive call of actions
1814 // e.g. from a SwFEShell::RequestObjectResize(..) in bug 95829.
1815 // A recursive call of actions is no good idea because the inner action
1816 // can't format frames which are locked by the outer action. This may
1817 // cause and endless loop.
1822 SwRegionRects
*pRegion
= Imp()->GetRegion();
1823 if ( pRegion
&& aAction
.IsBrowseActionStop() )
1825 //Nur dann interessant, wenn sich im sichtbaren Bereich etwas
1828 for ( USHORT i
= 0; i
< pRegion
->Count(); ++i
)
1830 const SwRect
&rTmp
= (*pRegion
)[i
];
1831 if ( FALSE
== (bStop
= rTmp
.IsOver( VisArea() )) )
1836 Imp()->DelRegions();
1843 //Erst Invert dann Compress, niemals andersherum!
1845 pRegion
->Compress();
1847 if ( pRegion
->Count() )
1849 SwRegionRects
aRegion( rRect
);
1850 for ( USHORT i
= 0; i
< pRegion
->Count(); ++i
)
1851 { const SwRect
&rTmp
= (*pRegion
)[i
];
1852 if ( !rRect
.IsInside( rTmp
) )
1854 InvalidateWindows( rTmp
);
1855 if ( rTmp
.IsOver( VisArea() ) )
1863 for ( USHORT i
= 0; i
< aRegion
.Count(); ++i
)
1864 GetWin()->Invalidate( aRegion
[i
].SVRect() );
1866 if ( rRect
!= VisArea() )
1868 //rRect == VisArea ist der spezialfall fuer neu bzw.
1869 //Shift-Ctrl-R, dafuer sollte es nicht notwendig sein
1870 //das Rechteck nocheinmal in Dokumentkoordinaten v
1872 if ( aInvalidRect
.IsEmpty() )
1873 aInvalidRect
= rRect
;
1875 aInvalidRect
.Union( rRect
);
1881 Imp()->DelRegions();
1889 /******************************************************************************
1891 |* ViewShell::Paint()
1893 |* Ersterstellung MA ??
1894 |* Letzte Aenderung MA 17. Sep. 96
1896 ******************************************************************************/
1898 void ViewShell::Paint(const Rectangle
&rRect
)
1902 if ( Imp()->bSmoothUpdate
)
1904 SwRect
aTmp( rRect
);
1905 if ( !Imp()->aSmoothRect
.IsInside( aTmp
) )
1906 Imp()->bStopSmooth
= TRUE
;
1909 Imp()->aSmoothRect
= aTmp
;
1917 if ( SwRootFrm::IsInPaint() )
1919 //Waehrend der Ausgabe einer Seite beim Druckvorgang wird das
1921 SwPaintQueue::Add( this, SwRect( rRect
) );
1925 //MA 30. Jul. 95: fix(16787): mit !nStartAction versuche ich mal mich gegen
1926 //fehlerhaften Code an anderen Stellen zu wehren. Hoffentlich fuehrt das
1927 //nicht zu Problemen!?
1928 if ( bPaintWorks
&& !nStartAction
)
1930 if( GetWin() && GetWin()->IsVisible() )
1932 //Wenn mit dem Paint ein Bereich betroffen ist, der vorher gescrolled
1933 //wurde, so wiederholen wir das Paint mit dem Gesamtbereich. Nur so
1934 //koennen wir sicherstellen, das (nicht mal kurzfristig) durch das Paint
1935 //keine Alignmentfehler sichtbar werden.
1936 SwRect
aRect( rRect
);
1937 if ( Imp()->IsScrolled() && Imp()->FlushScrolledArea( aRect
) )
1939 GetWin()->Invalidate( aRect
.SVRect() );
1943 if ( bPaintInProgress
) //Schutz gegen doppelte Paints!
1945 GetWin()->Invalidate( rRect
);
1949 bPaintInProgress
= TRUE
;
1950 SET_CURR_SHELL( this );
1951 SwRootFrm::SetNoVirDev( TRUE
);
1953 //Wir wollen nicht staendig hin und her Clippen, wir verlassen
1954 //uns darauf, das sich alle auf das Rechteck beschraeken und
1955 //brauchen das Clipping hier nur einmalig einkalkulieren. Das
1956 //ClipRect wird hier einmal entfernt und nicht Restauriert, denn
1957 //von aussen braucht es sowieso keiner mehr.
1958 //Nicht wenn wir ein MetaFile aufzeichnen.
1959 if( !GetOut()->GetConnectMetaFile() && GetOut()->IsClipRegion())
1960 GetOut()->SetClipRegion();
1964 //Falls sinnvoll gleich das alte InvalidRect verarbeiten bzw.
1966 if ( aRect
.IsInside( aInvalidRect
) )
1968 ViewShell::bLstAct
= TRUE
;
1969 GetLayout()->Paint( aRect
);
1970 ViewShell::bLstAct
= FALSE
;
1974 //SwSaveHdl *pSaveHdl = 0;
1975 //if ( Imp()->HasDrawView() )
1976 // pSaveHdl = new SwSaveHdl( Imp() );
1978 //Wenn eine der sichtbaren Seiten noch irgendetwas zum Repaint
1979 //angemeldet hat, so muessen Repaints ausgeloest werden.
1980 if ( !CheckInvalidForPaint( aRect
) )
1982 // --> OD 2009-08-12 #i101192#
1983 // start Pre/PostPaint encapsulation to avoid screen blinking
1984 const Region
aRepaintRegion(aRect
.SVRect());
1985 DLPrePaint2(aRepaintRegion
);
1987 PaintDesktop( aRect
);
1988 //Falls sinnvoll gleich das alte InvalidRect verarbeiten bzw.
1990 if ( aRect
.IsInside( aInvalidRect
) )
1992 ViewShell::bLstAct
= TRUE
;
1993 GetLayout()->Paint( aRect
);
1994 ViewShell::bLstAct
= FALSE
;
1995 // --> OD 2009-08-12 #i101192#
1996 // end Pre/PostPaint encapsulation
2003 SwRootFrm::SetNoVirDev( FALSE
);
2004 bPaintInProgress
= FALSE
;
2010 if ( aInvalidRect
.IsEmpty() )
2011 aInvalidRect
= SwRect( rRect
);
2013 aInvalidRect
.Union( SwRect( rRect
) );
2015 if ( bInEndAction
&& GetWin() )
2017 Region
aRegion( GetWin()->GetPaintRegion() );
2018 RegionHandle
hHdl( aRegion
.BeginEnumRects() );
2020 while ( aRegion
.GetNextEnumRect( hHdl
, aRect
) )
2021 Imp()->AddPaintRect( aRect
);
2022 aRegion
.EndEnumRects( hHdl
);
2024 else if ( SfxProgress::GetActiveProgress( GetDoc()->GetDocShell() ) &&
2025 GetOut() == GetWin() )
2028 const Region
aDLRegion(rRect
);
2029 DLPrePaint2(aDLRegion
);
2031 // OD 2004-04-23 #116347#
2032 pOut
->Push( PUSH_FILLCOLOR
|PUSH_LINECOLOR
);
2033 pOut
->SetFillColor( Imp()->GetRetoucheColor() );
2034 pOut
->SetLineColor();
2035 pOut
->DrawRect( rRect
);
2044 /******************************************************************************
2046 |* ViewShell::SetBrowseBorder()
2048 |* Ersterstellung AMA 20. Aug. 96
2049 |* Letzte Aenderung AMA 20. Aug. 96
2051 ******************************************************************************/
2053 void ViewShell::SetBrowseBorder( const Size
& rNew
)
2055 if( rNew
!= aBrowseBorder
)
2057 aBrowseBorder
= rNew
;
2058 if ( aVisArea
.HasArea() )
2059 CheckBrowseView( FALSE
);
2063 const Size
& ViewShell::GetBrowseBorder() const
2065 return aBrowseBorder
;
2068 sal_Int32
ViewShell::GetBrowseWidth() const
2070 const SwPostItMgr
* pPostItMgr
= GetPostItMgr();
2071 if ( pPostItMgr
&& pPostItMgr
->HasNotes() && pPostItMgr
->ShowNotes() )
2073 Size
aBorder( aBrowseBorder
);
2074 aBorder
.Width() += aBrowseBorder
.Width();
2075 aBorder
.Width() += pPostItMgr
->GetSidebarWidth(true) + pPostItMgr
->GetSidebarBorderWidth(true);
2076 return aVisArea
.Width() - GetOut()->PixelToLogic(aBorder
).Width();
2079 return aVisArea
.Width() - 2 * GetOut()->PixelToLogic(aBrowseBorder
).Width();
2082 /******************************************************************************
2084 |* ViewShell::CheckBrowseView()
2086 |* Ersterstellung MA 04. Mar. 96
2087 |* Letzte Aenderung MA 04. Jul. 96
2089 ******************************************************************************/
2091 void ViewShell::CheckBrowseView( BOOL bBrowseChgd
)
2093 if ( !bBrowseChgd
&&
2094 !getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE
) )
2097 SET_CURR_SHELL( this );
2099 ASSERT( GetLayout(), "Layout not ready" );
2101 // Wenn das Layout noch nicht einmal eine Hoehe hat,
2102 // ist sowieso nichts formatiert.
2103 // Dann eruebrigt sich die Invalidierung
2104 // Falsch, z.B. beim Anlegen einer neuen View wird der Inhalt eingef?gt
2105 // und formatiert (trotz einer leeren VisArea). Hier muessen deshalb
2106 // die Seiten zur Formatierung angeregt werden.
2107 if( !GetLayout()->Frm().Height() )
2109 SwFrm
* pPage
= GetLayout()->Lower();
2112 pPage
->_InvalidateSize();
2113 pPage
= pPage
->GetNext();
2121 SwPageFrm
*pPg
= (SwPageFrm
*)GetLayout()->Lower();
2123 { pPg
->InvalidateSize();
2124 pPg
->_InvalidatePrt();
2125 pPg
->InvaPercentLowers();
2128 pPg
->PrepareHeader();
2129 pPg
->PrepareFooter();
2131 pPg
= (SwPageFrm
*)pPg
->GetNext();
2134 // Wenn sich die Groessenverhaeltnise im BrowseModus aendern,
2135 // muss die Position und PrtArea der Cntnt- und Tab-Frames invalidiert werden.
2136 BYTE nInv
= INV_PRTAREA
| INV_TABLE
| INV_POS
;
2137 // Beim BrowseModus-Wechsel benoetigen die CntntFrms
2138 // wg. der Drucker/Bildschirmformatierung eine Size-Invalidierung
2140 nInv
|= INV_SIZE
| INV_DIRECTION
;
2142 GetLayout()->InvalidateAllCntnt( nInv
);
2144 SwFrm::CheckPageDescs( (SwPageFrm
*)GetLayout()->Lower() );
2150 /*************************************************************************
2152 |* ViewShell::GetLayout()
2153 |* ViewShell::GetNodes()
2155 |* Ersterstellung OK 26. May. 92
2156 |* Letzte Aenderung MA 16. Sep. 93
2158 *************************************************************************/
2160 SwRootFrm
*ViewShell::GetLayout() const
2162 return GetDoc()->GetRootFrm();
2165 OutputDevice
& ViewShell::GetRefDev() const
2167 OutputDevice
* pTmpOut
= 0;
2169 getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE
) &&
2170 !GetViewOptions()->IsPrtFormat() )
2172 else if ( 0 != mpTmpRef
)
2175 pTmpOut
= GetDoc()->getReferenceDevice( true );
2180 const SwNodes
& ViewShell::GetNodes() const
2182 return pDoc
->GetNodes();
2186 void ViewShell::DrawSelChanged()
2191 Size
ViewShell::GetDocSize() const
2194 const SwRootFrm
* pRoot
= GetLayout();
2196 aSz
= pRoot
->Frm().SSize();
2202 SfxItemPool
& ViewShell::GetAttrPool()
2204 return GetDoc()->GetAttrPool();
2207 /******************************************************************************
2209 |* ViewShell::ApplyViewOptions(), ImplApplyViewOptions()
2211 |* Ersterstellung ??
2212 |* Letzte Aenderung MA 03. Mar. 98
2214 ******************************************************************************/
2216 void ViewShell::ApplyViewOptions( const SwViewOption
&rOpt
)
2219 ViewShell
*pSh
= this;
2221 { pSh
->StartAction();
2222 pSh
= (ViewShell
*)pSh
->GetNext();
2223 } while ( pSh
!= this );
2225 ImplApplyViewOptions( rOpt
);
2227 //Einige Aenderungen muessen synchronisiert werden.
2228 pSh
= (ViewShell
*)this->GetNext();
2229 while ( pSh
!= this )
2231 SwViewOption
aOpt( *pSh
->GetViewOptions() );
2232 aOpt
.SetFldName( rOpt
.IsFldName() );
2233 aOpt
.SetShowHiddenField( rOpt
.IsShowHiddenField() );
2234 aOpt
.SetShowHiddenPara( rOpt
.IsShowHiddenPara() );
2235 aOpt
.SetShowHiddenChar( rOpt
.IsShowHiddenChar() );
2236 aOpt
.SetViewLayoutBookMode( rOpt
.IsViewLayoutBookMode() );
2237 aOpt
.SetViewLayoutColumns( rOpt
.GetViewLayoutColumns() );
2238 aOpt
.SetPostIts(rOpt
.IsPostIts());
2239 if ( !(aOpt
== *pSh
->GetViewOptions()) )
2240 pSh
->ImplApplyViewOptions( aOpt
);
2241 pSh
= (ViewShell
*)pSh
->GetNext();
2247 pSh
= (ViewShell
*)pSh
->GetNext();
2248 } while ( pSh
!= this );
2252 void ViewShell::ImplApplyViewOptions( const SwViewOption
&rOpt
)
2254 ASSERT( !(*pOpt
== rOpt
), "ViewShell::ApplyViewOptions: ");
2256 Window
*pMyWin
= GetWin();
2259 ASSERT( pMyWin
, "ViewShell::ApplyViewOptions: no window" );
2263 SET_CURR_SHELL( this );
2265 BOOL bReformat
= FALSE
;
2267 if( pOpt
->IsShowHiddenField() != rOpt
.IsShowHiddenField() )
2269 ((SwHiddenTxtFieldType
*)pDoc
->GetSysFldType( RES_HIDDENTXTFLD
))->
2270 SetHiddenFlag( !rOpt
.IsShowHiddenField() );
2273 if ( pOpt
->IsShowHiddenPara() != rOpt
.IsShowHiddenPara() )
2275 SwHiddenParaFieldType
* pFldType
= (SwHiddenParaFieldType
*)GetDoc()->
2276 GetSysFldType(RES_HIDDENPARAFLD
);
2277 if( pFldType
&& pFldType
->GetDepends() )
2279 SwMsgPoolItem
aHnt( RES_HIDDENPARA_PRINT
);
2280 pFldType
->Modify( &aHnt
, 0);
2284 if ( !bReformat
&& pOpt
->IsShowHiddenChar() != rOpt
.IsShowHiddenChar() )
2286 bReformat
= GetDoc()->ContainsHiddenChars();
2289 // bReformat wird TRUE, wenn ...
2290 // - Feldnamen anzeigen oder nicht ...
2291 // ( - SwEndPortion muessen _nicht_ mehr generiert werden. )
2292 // - Das Window ist natuerlich was ganz anderes als der Drucker...
2293 bReformat
= bReformat
|| pOpt
->IsFldName() != rOpt
.IsFldName();
2295 // Der Mapmode wird veraendert, Minima/Maxima werden von der UI beachtet
2296 if( pOpt
->GetZoom() != rOpt
.GetZoom() && !IsPreView() )
2298 MapMode
aMode( pMyWin
->GetMapMode() );
2299 Fraction
aNewFactor( rOpt
.GetZoom(), 100 );
2300 aMode
.SetScaleX( aNewFactor
);
2301 aMode
.SetScaleY( aNewFactor
);
2302 pMyWin
->SetMapMode( aMode
);
2303 // Wenn kein ReferenzDevice (Drucker) zum Formatieren benutzt wird,
2304 // sondern der Bildschirm, muss bei Zoomfaktoraenderung neu formatiert
2306 if( getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE
) )
2310 if ( getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE
) &&
2311 pOpt
->IsPrtFormat() != rOpt
.IsPrtFormat() )
2314 if ( HasDrawView() || rOpt
.IsGridVisible() )
2316 if ( !HasDrawView() )
2319 SwDrawView
*pDView
= Imp()->GetDrawView();
2320 if ( pDView
->IsDragStripes() != rOpt
.IsCrossHair() )
2321 pDView
->SetDragStripes( rOpt
.IsCrossHair() );
2323 if ( pDView
->IsGridSnap() != rOpt
.IsSnap() )
2324 pDView
->SetGridSnap( rOpt
.IsSnap() );
2326 if ( pDView
->IsGridVisible() != rOpt
.IsGridVisible() )
2327 pDView
->SetGridVisible( rOpt
.IsGridVisible() );
2329 const Size
&rSz
= rOpt
.GetSnapSize();
2330 pDView
->SetGridCoarse( rSz
);
2333 ( rSz
.Width() ? rSz
.Width() / (rOpt
.GetDivisionX()+1) : 0,
2334 rSz
.Height()? rSz
.Height()/ (rOpt
.GetDivisionY()+1) : 0);
2335 pDView
->SetGridFine( aFSize
);
2336 Fraction
aSnGrWdtX(rSz
.Width(), rOpt
.GetDivisionX() + 1);
2337 Fraction
aSnGrWdtY(rSz
.Height(), rOpt
.GetDivisionY() + 1);
2338 pDView
->SetSnapGridWidth( aSnGrWdtX
, aSnGrWdtY
);
2340 if ( pOpt
->IsSolidMarkHdl() != rOpt
.IsSolidMarkHdl() )
2341 pDView
->SetSolidMarkHdl( rOpt
.IsSolidMarkHdl() );
2343 // it's a JOE interface !
2344 if ( pOpt
->IsBigMarkHdl() != rOpt
.IsBigMarkHdl() )
2345 pDView
->SetMarkHdlSizePixel(rOpt
.IsBigMarkHdl() ? 9 : 7);
2348 BOOL bOnlineSpellChgd
= pOpt
->IsOnlineSpell() != rOpt
.IsOnlineSpell();
2350 *pOpt
= rOpt
; // Erst jetzt werden die Options uebernommen.
2351 pOpt
->SetUIOptions(rOpt
);
2353 pDoc
->set(IDocumentSettingAccess::HTML_MODE
, 0 != ::GetHtmlMode(pDoc
->GetDocShell()));
2355 pMyWin
->Invalidate();
2358 // Es hilft alles nichts, wir muessen an alle CntntFrms ein
2359 // Prepare verschicken, wir formatieren neu:
2365 if( bOnlineSpellChgd
)
2367 ViewShell
*pSh
= (ViewShell
*)this->GetNext();
2368 BOOL bOnlineSpl
= rOpt
.IsOnlineSpell();
2369 while( pSh
!= this )
2370 { pSh
->pOpt
->SetOnlineSpell( bOnlineSpl
);
2371 Window
*pTmpWin
= pSh
->GetWin();
2373 pTmpWin
->Invalidate();
2374 pSh
= (ViewShell
*)pSh
->GetNext();
2380 /******************************************************************************
2382 |* ViewShell::SetUIOptions()
2384 |* Ersterstellung OS 29.07.96
2385 |* Letzte Aenderung OS 29.07.96
2387 ******************************************************************************/
2389 void ViewShell::SetUIOptions( const SwViewOption
&rOpt
)
2391 pOpt
->SetUIOptions(rOpt
);
2392 //the API-Flag of the view options is set but never reset
2393 //it is required to set scroll bars in readonly documents
2394 if(rOpt
.IsStarOneSetting())
2395 pOpt
->SetStarOneSetting(TRUE
);
2397 pOpt
->SetSymbolFont(rOpt
.GetSymbolFont());
2400 /******************************************************************************
2402 |* ViewShell::SetReadonly()
2404 |* Ersterstellung OS 05.09.96
2405 |* Letzte Aenderung MA 12. Feb. 97
2407 ******************************************************************************/
2409 void ViewShell::SetReadonlyOption(BOOL bSet
)
2411 //JP 01.02.99: bei ReadOnly Flag richtig abfragen und ggfs. neu
2412 // formatieren; Bug 61335
2414 // Schalten wir gerade von Readonly auf Bearbeiten um?
2415 if( bSet
!= pOpt
->IsReadonly() )
2417 // damit die Flags richtig erfragt werden koennen.
2418 pOpt
->SetReadonly( FALSE
);
2420 BOOL bReformat
= pOpt
->IsFldName();
2422 pOpt
->SetReadonly( bSet
);
2429 GetWin()->Invalidate();
2432 else if ( GetWin() )
2433 GetWin()->Invalidate();
2434 if( Imp()->IsAccessible() )
2435 Imp()->InvalidateAccessibleEditableState( sal_False
);
2438 /* -----------------28.08.2003 15:45-----------------
2440 --------------------------------------------------*/
2441 void ViewShell::SetPDFExportOption(sal_Bool bSet
)
2443 if( bSet
!= pOpt
->IsPDFExport() )
2446 getIDocumentSettingAccess()->get(IDocumentSettingAccess::BROWSE_MODE
) )
2447 pOpt
->SetPrtFormat( TRUE
);
2448 pOpt
->SetPDFExport(bSet
);
2451 /* -----------------------------2002/07/31 17:06------------------------------
2453 ---------------------------------------------------------------------------*/
2454 void ViewShell::SetReadonlySelectionOption(sal_Bool bSet
)
2456 if( bSet
!= pOpt
->IsSelectionInReadonly() )
2458 pOpt
->SetSelectionInReadonly(bSet
);
2461 /******************************************************************************
2463 |* ViewShell::SetPrtFormatOption()
2465 |* Ersterstellung AMA 10. Sep. 97
2466 |* Letzte Aenderung AMA 10. Sep. 97
2468 ******************************************************************************/
2470 void ViewShell::SetPrtFormatOption( BOOL bSet
)
2472 pOpt
->SetPrtFormat( bSet
);
2475 /******************************************************************************
2477 |* ViewShell::UISizeNotify()
2479 |* Ersterstellung MA 14. Jan. 97
2480 |* Letzte Aenderung MA 14. Jan. 97
2482 ******************************************************************************/
2485 void ViewShell::UISizeNotify()
2489 bDocSizeChgd
= FALSE
;
2490 BOOL bOld
= bInSizeNotify
;
2491 bInSizeNotify
= TRUE
;
2492 ::SizeNotify( this, GetDocSize() );
2493 bInSizeNotify
= bOld
;
2498 void ViewShell::SetRestoreActions(USHORT nSet
)
2500 DBG_ASSERT(!GetRestoreActions()||!nSet
, "mehrfaches Restore der Actions ?");
2501 Imp()->SetRestoreActions(nSet
);
2503 USHORT
ViewShell::GetRestoreActions() const
2505 return Imp()->GetRestoreActions();
2508 BOOL
ViewShell::IsNewLayout() const
2510 return GetLayout()->IsNewLayout();
2513 uno::Reference
< ::com::sun::star::accessibility::XAccessible
> ViewShell::CreateAccessible()
2515 uno::Reference
< ::com::sun::star::accessibility::XAccessible
> xAcc
;
2517 SwDoc
*pMyDoc
= GetDoc();
2519 // We require a layout and an XModel to be accessible.
2520 ASSERT( pMyDoc
->GetRootFrm(), "no layout, no access" );
2521 ASSERT( GetWin(), "no window, no access" );
2523 if( pMyDoc
->GetRootFrm() && GetWin() )
2524 xAcc
= Imp()->GetAccessibleMap().GetDocumentView();
2529 uno::Reference
< ::com::sun::star::accessibility::XAccessible
>
2530 ViewShell::CreateAccessiblePreview()
2532 DBG_ASSERT( IsPreView(),
2533 "Can't create accessible preview for non-preview ViewShell" );
2535 // We require a layout and an XModel to be accessible.
2536 ASSERT( pDoc
->GetRootFrm(), "no layout, no access" );
2537 ASSERT( GetWin(), "no window, no access" );
2539 // OD 15.01.2003 #103492# - add condition <IsPreView()>
2540 if ( IsPreView() && pDoc
->GetRootFrm() && GetWin() )
2542 // OD 14.01.2003 #103492# - adjustment for new method signature
2543 return Imp()->GetAccessibleMap().GetDocumentPreview(
2544 PagePreviewLayout()->maPrevwPages
,
2545 GetWin()->GetMapMode().GetScaleX(),
2546 pDoc
->GetRootFrm()->GetPageByPageNum( PagePreviewLayout()->mnSelectedPageNum
),
2547 PagePreviewLayout()->maWinSize
);
2552 void ViewShell::InvalidateAccessibleFocus()
2554 if( Imp()->IsAccessible() )
2555 Imp()->GetAccessibleMap().InvalidateFocus();
2558 /** invalidate CONTENT_FLOWS_FROM/_TO relation for paragraphs
2560 OD 2005-12-01 #i27138#
2564 void ViewShell::InvalidateAccessibleParaFlowRelation( const SwTxtFrm
* _pFromTxtFrm
,
2565 const SwTxtFrm
* _pToTxtFrm
)
2567 if ( GetLayout() && GetLayout()->IsAnyShellAccessible() )
2569 Imp()->_InvalidateAccessibleParaFlowRelation( _pFromTxtFrm
, _pToTxtFrm
);
2573 /** invalidate text selection for paragraphs
2575 OD 2005-12-12 #i27301#
2579 void ViewShell::InvalidateAccessibleParaTextSelection()
2581 if ( GetLayout() && GetLayout()->IsAnyShellAccessible() )
2583 Imp()->_InvalidateAccessibleParaTextSelection();
2587 /** invalidate attributes for paragraphs
2589 OD 2009-01-06 #i88069#
2593 void ViewShell::InvalidateAccessibleParaAttrs( const SwTxtFrm
& rTxtFrm
)
2595 if ( GetLayout() && GetLayout()->IsAnyShellAccessible() )
2597 Imp()->_InvalidateAccessibleParaAttrs( rTxtFrm
);
2601 /* -----------------------------06.05.2002 13:23------------------------------
2603 ---------------------------------------------------------------------------*/
2604 void ViewShell::ApplyAccessiblityOptions(SvtAccessibilityOptions
& rAccessibilityOptions
)
2606 if(pOpt
->IsPagePreview() && !rAccessibilityOptions
.GetIsForPagePreviews())
2608 pAccOptions
->SetAlwaysAutoColor(sal_False
);
2609 pAccOptions
->SetStopAnimatedGraphics(sal_False
);
2610 pAccOptions
->SetStopAnimatedText(sal_False
);
2614 pAccOptions
->SetAlwaysAutoColor(rAccessibilityOptions
.GetIsAutomaticFontColor());
2615 pAccOptions
->SetStopAnimatedGraphics(! rAccessibilityOptions
.GetIsAllowAnimatedGraphics());
2616 pAccOptions
->SetStopAnimatedText(! rAccessibilityOptions
.GetIsAllowAnimatedText());
2618 // --> FME 2004-06-29 #114856# Formular view
2619 // Always set this option, not only if document is read-only:
2620 pOpt
->SetSelectionInReadonly(rAccessibilityOptions
.IsSelectionInReadonly());
2624 ShellResource
* ViewShell::GetShellRes()
2629 void ViewShell::SetCareWin( Window
* pNew
)
2635 // --> FME 2004-06-15 #i12836# enhanced pdf export
2636 sal_Int32
ViewShell::GetPageNumAndSetOffsetForPDF( OutputDevice
& rOut
, const SwRect
& rRect
) const
2638 ASSERT( GetLayout(), "GetPageNumAndSetOffsetForPDF assumes presence of layout" )
2640 sal_Int32 nRet
= -1;
2642 // --> FME 2005-01-07 #i40059# Position out of bounds:
2643 SwRect
aRect( rRect
);
2644 aRect
.Pos().X() = Max( aRect
.Left(), GetLayout()->Frm().Left() );
2647 const SwPageFrm
* pPage
= GetLayout()->GetPageAtPos( aRect
.Center() );
2650 ASSERT( pPage
, "GetPageNumAndSetOffsetForPDF: No page found" )
2652 Point
aOffset( pPage
->Frm().Pos() );
2653 aOffset
.X() = -aOffset
.X();
2654 aOffset
.Y() = -aOffset
.Y();
2656 MapMode
aMapMode( rOut
.GetMapMode() );
2657 aMapMode
.SetOrigin( aOffset
);
2658 rOut
.SetMapMode( aMapMode
);
2660 nRet
= pPage
->GetPhyPageNum() - 1;
2667 // --> PB 2007-05-30 #146850#
2668 const BitmapEx
& ViewShell::GetReplacementBitmap( bool bIsErrorState
)
2671 USHORT nResId
= 0, nHCResId
= 0;
2675 nResId
= RID_GRAPHIC_ERRORBMP
;
2676 nHCResId
= RID_GRAPHIC_ERRORBMP_HC
;
2680 ppRet
= &pReplaceBmp
;
2681 nResId
= RID_GRAPHIC_REPLACEBMP
;
2682 nHCResId
= RID_GRAPHIC_REPLACEBMP_HC
;
2688 Application::GetSettings().GetStyleSettings().GetWindowColor().IsDark()
2689 ? nHCResId
: nResId
;
2690 *ppRet
= new BitmapEx( SW_RES( nBmpResId
) );
2695 void ViewShell::DeleteReplacementBitmaps()
2697 DELETEZ( pErrorBmp
);
2698 DELETEZ( pReplaceBmp
);
2702 SwPostItMgr
* ViewShell::GetPostItMgr()
2704 SwView
* pView
= GetDoc()->GetDocShell() ? GetDoc()->GetDocShell()->GetView() : 0;
2706 return pView
->GetPostItMgr();
2712 * Document Interface Access
2714 const IDocumentSettingAccess
* ViewShell::getIDocumentSettingAccess() const { return pDoc
; }
2715 IDocumentSettingAccess
* ViewShell::getIDocumentSettingAccess() { return pDoc
; }
2716 const IDocumentDeviceAccess
* ViewShell::getIDocumentDeviceAccess() const { return pDoc
; }
2717 IDocumentDeviceAccess
* ViewShell::getIDocumentDeviceAccess() { return pDoc
; }
2718 const IDocumentMarkAccess
* ViewShell::getIDocumentMarkAccess() const { return pDoc
->getIDocumentMarkAccess(); }
2719 IDocumentMarkAccess
* ViewShell::getIDocumentMarkAccess() { return pDoc
->getIDocumentMarkAccess(); }
2720 const IDocumentDrawModelAccess
* ViewShell::getIDocumentDrawModelAccess() const { return pDoc
; }
2721 IDocumentDrawModelAccess
* ViewShell::getIDocumentDrawModelAccess() { return pDoc
; }
2722 const IDocumentRedlineAccess
* ViewShell::getIDocumentRedlineAccess() const { return pDoc
; }
2723 IDocumentRedlineAccess
* ViewShell::getIDocumentRedlineAccess() { return pDoc
; }
2724 const IDocumentLayoutAccess
* ViewShell::getIDocumentLayoutAccess() const { return pDoc
; }
2725 IDocumentLayoutAccess
* ViewShell::getIDocumentLayoutAccess() { return pDoc
; }
2726 const IDocumentFieldsAccess
* ViewShell::getIDocumentFieldsAccess() const { return pDoc
; }
2727 IDocumentContentOperations
* ViewShell::getIDocumentContentOperations() { return pDoc
; }
2728 IDocumentStylePoolAccess
* ViewShell::getIDocumentStylePoolAccess() { return pDoc
; }
2729 const IDocumentStatistics
* ViewShell::getIDocumentStatistics() const { return pDoc
; }
2730 IDocumentUndoRedo
* ViewShell::getIDocumentUndoRedoAccess() { return pDoc
; }
2731 // --> OD 2007-11-14 #i83479#
2732 const IDocumentListItems
* ViewShell::getIDocumentListItemsAccess() const
2736 const IDocumentOutlineNodes
* ViewShell::getIDocumentOutlineNodesAccess() const