summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdpntv.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/svdraw/svdpntv.cxx')
-rw-r--r--svx/source/svdraw/svdpntv.cxx1548
1 files changed, 1548 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdpntv.cxx b/svx/source/svdraw/svdpntv.cxx
new file mode 100644
index 000000000000..1d74ed119c33
--- /dev/null
+++ b/svx/source/svdraw/svdpntv.cxx
@@ -0,0 +1,1548 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_svx.hxx"
+#include <com/sun/star/awt/XWindow.hpp>
+#include <svx/svdpntv.hxx>
+#include <vcl/msgbox.hxx>
+#include <svx/sdrpaintwindow.hxx>
+#include <svtools/grfmgr.hxx>
+#include <svx/svdmodel.hxx>
+
+#ifdef DBG_UTIL
+#include <svdibrow.hxx>
+#endif
+#include <svx/svdpage.hxx>
+#include <svx/svdpagv.hxx>
+#include <svl/smplhint.hxx>
+
+#include <svx/svdpntv.hxx>
+#include <editeng/editdata.hxx>
+#include <svx/svdmrkv.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdmodel.hxx>
+#include <svx/svdundo.hxx>
+#include <svx/svdview.hxx>
+#include <svx/svdglue.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdograf.hxx>
+#include <svx/svdattrx.hxx>
+#include "svdibrow.hxx"
+#include "svx/svditer.hxx"
+#include <svx/svdouno.hxx>
+#include <svx/sdr/overlay/overlayobjectlist.hxx>
+#include <svx/sdr/overlay/overlayrollingrectangle.hxx>
+#include <svx/sdr/overlay/overlaymanager.hxx>
+#include <svx/svdglue.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdview.hxx>
+#include <svx/sxlayitm.hxx>
+#include <svl/itemiter.hxx>
+#include <editeng/eeitem.hxx>
+#include <svl/whiter.hxx>
+#include <svl/style.hxx>
+#include <svx/sdrpagewindow.hxx>
+#include <svx/svdouno.hxx>
+#include <vcl/svapp.hxx>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <com/sun/star/awt/XControl.hpp>
+
+// #i38135#
+#include <svx/sdr/contact/objectcontact.hxx>
+#include <svx/sdr/animation/objectanimator.hxx>
+#include <svx/sdr/contact/viewcontact.hxx>
+
+using namespace ::rtl;
+using namespace ::com::sun::star;
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// #114409#-3 Migrate Encirclement
+class ImplEncirclementOverlay
+{
+ // The OverlayObjects
+ ::sdr::overlay::OverlayObjectList maObjects;
+
+ // The remembered second position in logical coodinates
+ basegfx::B2DPoint maSecondPosition;
+
+public:
+ ImplEncirclementOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos);
+ ~ImplEncirclementOverlay();
+
+ void SetSecondPosition(const basegfx::B2DPoint& rNewPosition);
+};
+
+ImplEncirclementOverlay::ImplEncirclementOverlay(const SdrPaintView& rView, const basegfx::B2DPoint& rStartPos)
+: maSecondPosition(rStartPos)
+{
+ for(sal_uInt32 a(0L); a < rView.PaintWindowCount(); a++)
+ {
+ SdrPaintWindow* pCandidate = rView.GetPaintWindow(a);
+ ::sdr::overlay::OverlayManager* pTargetOverlay = pCandidate->GetOverlayManager();
+
+ if(pTargetOverlay)
+ {
+ ::sdr::overlay::OverlayRollingRectangleStriped* aNew = new ::sdr::overlay::OverlayRollingRectangleStriped(
+ rStartPos, rStartPos, false);
+ pTargetOverlay->add(*aNew);
+ maObjects.append(*aNew);
+ }
+ }
+}
+
+ImplEncirclementOverlay::~ImplEncirclementOverlay()
+{
+ // The OverlayObjects are cleared using the destructor of OverlayObjectList.
+ // That destructor calls clear() at the list which removes all objects from the
+ // OverlayManager and deletes them.
+}
+
+void ImplEncirclementOverlay::SetSecondPosition(const basegfx::B2DPoint& rNewPosition)
+{
+ if(rNewPosition != maSecondPosition)
+ {
+ // apply to OverlayObjects
+ for(sal_uInt32 a(0L); a < maObjects.count(); a++)
+ {
+ ::sdr::overlay::OverlayRollingRectangleStriped& rCandidate = (::sdr::overlay::OverlayRollingRectangleStriped&)maObjects.getOverlayObject(a);
+ rCandidate.setSecondPosition(rNewPosition);
+ }
+
+ // remember new position
+ maSecondPosition = rNewPosition;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// interface to SdrPaintWindow
+
+SdrPaintWindow* SdrPaintView::FindPaintWindow(const OutputDevice& rOut) const
+{
+ for(SdrPaintWindowVector::const_iterator a = maPaintWindows.begin(); a != maPaintWindows.end(); a++)
+ {
+ if(&((*a)->GetOutputDevice()) == &rOut)
+ {
+ return *a;
+ }
+ }
+
+ return 0L;
+}
+
+SdrPaintWindow* SdrPaintView::GetPaintWindow(sal_uInt32 nIndex) const
+{
+ if(nIndex < maPaintWindows.size())
+ {
+ return maPaintWindows[nIndex];
+ }
+
+ return 0L;
+}
+
+void SdrPaintView::AppendPaintWindow(SdrPaintWindow& rNew)
+{
+ maPaintWindows.push_back(&rNew);
+}
+
+SdrPaintWindow* SdrPaintView::RemovePaintWindow(SdrPaintWindow& rOld)
+{
+ SdrPaintWindow* pRetval = 0L;
+ const SdrPaintWindowVector::iterator aFindResult = ::std::find(maPaintWindows.begin(), maPaintWindows.end(), &rOld);
+
+ if(aFindResult != maPaintWindows.end())
+ {
+ // remember return value, aFindResult is no longer valid after deletion
+ pRetval = *aFindResult;
+ maPaintWindows.erase(aFindResult);
+ }
+
+ return pRetval;
+}
+
+OutputDevice* SdrPaintView::GetFirstOutputDevice() const
+{
+ if(PaintWindowCount())
+ {
+ return &(GetPaintWindow(0)->GetOutputDevice());
+ }
+
+ return 0L;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+TYPEINIT1( SvxViewHint, SfxHint );
+
+SvxViewHint::SvxViewHint (HintType eHintType)
+ : meHintType(eHintType)
+{
+}
+
+SvxViewHint::HintType SvxViewHint::GetHintType (void) const
+{
+ return meHintType;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+TYPEINIT2(SdrPaintView,SfxListener,SfxRepeatTarget);
+
+DBG_NAME(SdrPaintView);
+
+void SdrPaintView::ImpClearVars()
+{
+#ifdef DBG_UTIL
+ pItemBrowser=NULL;
+#endif
+ bPageVisible=TRUE;
+ bPageBorderVisible=TRUE;
+ bBordVisible=TRUE;
+ bGridVisible=TRUE;
+ bGridFront =FALSE;
+ bHlplVisible=TRUE;
+ bHlplFront =TRUE;
+ bGlueVisible=FALSE;
+ bGlueVisible2=FALSE;
+ bGlueVisible3=FALSE;
+ bGlueVisible4=FALSE;
+ bSwapAsynchron=FALSE;
+ bPrintPreview=FALSE;
+ mbPreviewRenderer=FALSE;
+
+ eAnimationMode = SDR_ANIMATION_ANIMATE;
+ bAnimationPause = FALSE;
+
+ nHitTolPix=2;
+ nMinMovPix=3;
+ nHitTolLog=0;
+ nMinMovLog=0;
+ pActualOutDev=NULL;
+ pDragWin=NULL;
+ bRestoreColors=TRUE;
+ pDefaultStyleSheet=NULL;
+ bSomeObjChgdFlag=FALSE;
+ nGraphicManagerDrawMode = GRFMGR_DRAW_STANDARD;
+ aComeBackTimer.SetTimeout(1);
+ aComeBackTimer.SetTimeoutHdl(LINK(this,SdrPaintView,ImpComeBackHdl));
+ String aNam; // System::GetUserName() just return an empty string
+
+ if (pMod)
+ SetDefaultStyleSheet(pMod->GetDefaultStyleSheet(), TRUE);
+
+ aNam.ToUpperAscii();
+
+ maGridColor = Color( COL_BLACK );
+ BrkEncirclement();
+}
+
+SdrPaintView::SdrPaintView(SdrModel* pModel1, OutputDevice* pOut)
+: mpEncirclementOverlay(0L),
+ mpPageView(0L),
+ aDefaultAttr(pModel1->GetItemPool()),
+ mbBufferedOutputAllowed(false),
+ mbBufferedOverlayAllowed(false),
+ mbPagePaintingAllowed(true),
+ mbHideOle(false),
+ mbHideChart(false),
+ mbHideDraw(false),
+ mbHideFormControl(false)
+{
+ DBG_CTOR(SdrPaintView,NULL);
+ pMod=pModel1;
+ ImpClearVars();
+
+ if(pOut)
+ {
+ AddWindowToPaintView(pOut);
+ }
+
+ // Flag zur Visualisierung von Gruppen
+ bVisualizeEnteredGroup = TRUE;
+
+ maColorConfig.AddListener(this);
+ onChangeColorConfig();
+}
+
+SdrPaintView::~SdrPaintView()
+{
+ DBG_DTOR(SdrPaintView,NULL);
+ if (pDefaultStyleSheet)
+ EndListening(*pDefaultStyleSheet);
+
+ maColorConfig.RemoveListener(this);
+ ClearPageView();
+
+#ifdef DBG_UTIL
+ if(pItemBrowser)
+ {
+ delete pItemBrowser;
+ }
+#endif
+
+ // delete existing SdrPaintWindows
+ while(maPaintWindows.size())
+ {
+ delete maPaintWindows.back();
+ maPaintWindows.pop_back();
+ }
+
+ // #114409#-3 Migrate HelpLine
+ BrkEncirclement();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void __EXPORT SdrPaintView::Notify(SfxBroadcaster& rBC, const SfxHint& rHint)
+{
+ //If the stylesheet has been destroyed
+ if (&rBC == pDefaultStyleSheet)
+ {
+ if (rHint.ISA(SfxSimpleHint) && ((const SfxSimpleHint&)rHint).GetId() == SFX_HINT_DYING)
+ pDefaultStyleSheet = NULL;
+ return;
+ }
+
+ BOOL bObjChg=!bSomeObjChgdFlag; // TRUE= auswerten fuer ComeBack-Timer
+ if (bObjChg) {
+ SdrHint* pSdrHint=PTR_CAST(SdrHint,&rHint);
+ if (pSdrHint!=NULL) {
+ SdrHintKind eKind=pSdrHint->GetKind();
+ if (eKind==HINT_OBJCHG || eKind==HINT_OBJINSERTED || eKind==HINT_OBJREMOVED) {
+ if (bObjChg) {
+ bSomeObjChgdFlag=TRUE;
+ aComeBackTimer.Start();
+ }
+ }
+ if (eKind==HINT_PAGEORDERCHG) {
+ const SdrPage* pPg=pSdrHint->GetPage();
+
+ if(pPg && !pPg->IsInserted())
+ {
+ if(mpPageView && mpPageView->GetPage() == pPg)
+ {
+ HideSdrPage();
+ }
+ }
+ }
+ }
+ }
+}
+
+void SdrPaintView::ConfigurationChanged( ::utl::ConfigurationBroadcaster* , sal_uInt32 )
+{
+ onChangeColorConfig();
+ InvalidateAllWin();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+IMPL_LINK_INLINE_START(SdrPaintView,ImpComeBackHdl,Timer*,EMPTYARG)
+{
+ if (bSomeObjChgdFlag) {
+ bSomeObjChgdFlag=FALSE;
+ ModelHasChanged();
+ }
+ return 0;
+}
+IMPL_LINK_INLINE_END(SdrPaintView,ImpComeBackHdl,Timer*,pTimer)
+
+void SdrPaintView::FlushComeBackTimer() const
+{
+ if (bSomeObjChgdFlag) {
+ // casting auf nonconst
+ ((SdrPaintView*)this)->ImpComeBackHdl(&((SdrPaintView*)this)->aComeBackTimer);
+ ((SdrPaintView*)this)->aComeBackTimer.Stop();
+ }
+}
+
+void SdrPaintView::ModelHasChanged()
+{
+ // Auch alle PageViews benachrichtigen
+ if(mpPageView && !mpPageView->GetPage()->IsInserted())
+ {
+ HideSdrPage();
+ }
+
+ // test mpPageView here again, HideSdrPage() may have invalidated it.
+ if(mpPageView)
+ {
+ mpPageView->ModelHasChanged();
+ }
+
+#ifdef DBG_UTIL
+ if(pItemBrowser)
+ {
+ pItemBrowser->SetDirty();
+ }
+#endif
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+BOOL SdrPaintView::IsAction() const
+{
+ return IsEncirclement();
+}
+
+void SdrPaintView::MovAction(const Point& rPnt)
+{
+ if (IsEncirclement())
+ {
+ MovEncirclement(rPnt);
+ }
+}
+
+void SdrPaintView::EndAction()
+{
+ if(IsEncirclement())
+ {
+ EndEncirclement();
+ }
+}
+
+void SdrPaintView::BckAction()
+{
+ BrkEncirclement();
+}
+
+void SdrPaintView::BrkAction()
+{
+ BrkEncirclement();
+}
+
+void SdrPaintView::TakeActionRect(Rectangle& rRect) const
+{
+ if(IsEncirclement())
+ {
+ rRect = Rectangle(aDragStat.GetStart(),aDragStat.GetNow());
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// info about TextEdit. Default is sal_False.
+bool SdrPaintView::IsTextEdit() const
+{
+ return false;
+}
+
+// info about TextEditPageView. Default is 0L.
+SdrPageView* SdrPaintView::GetTextEditPageView() const
+{
+ return 0L;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+USHORT SdrPaintView::ImpGetMinMovLogic(short nMinMov, const OutputDevice* pOut) const
+{
+ if (nMinMov>=0) return USHORT(nMinMov);
+ if (pOut==NULL)
+ {
+ pOut = GetFirstOutputDevice();
+ }
+ if (pOut!=NULL) {
+ return short(-pOut->PixelToLogic(Size(nMinMov,0)).Width());
+ } else {
+ return 0;
+ }
+}
+
+USHORT SdrPaintView::ImpGetHitTolLogic(short nHitTol, const OutputDevice* pOut) const
+{
+ if (nHitTol>=0) return USHORT(nHitTol);
+ if (pOut==NULL)
+ {
+ pOut = GetFirstOutputDevice();
+ }
+ if (pOut!=NULL) {
+ return short(-pOut->PixelToLogic(Size(nHitTol,0)).Width());
+ } else {
+ return 0;
+ }
+}
+
+void SdrPaintView::TheresNewMapMode()
+{
+ if (pActualOutDev!=NULL) {
+ nHitTolLog=(USHORT)((OutputDevice*)pActualOutDev)->PixelToLogic(Size(nHitTolPix,0)).Width();
+ nMinMovLog=(USHORT)((OutputDevice*)pActualOutDev)->PixelToLogic(Size(nMinMovPix,0)).Width();
+ }
+}
+
+void SdrPaintView::SetActualWin(const OutputDevice* pWin)
+{
+ pActualOutDev=pWin;
+ TheresNewMapMode();
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrPaintView::BegEncirclement(const Point& rPnt)
+{
+ BrkAction();
+
+ DBG_ASSERT(0L == mpEncirclementOverlay, "SdrSnapView::BegSetPageOrg: There exists a ImplPageOriginOverlay (!)");
+ basegfx::B2DPoint aStartPos(rPnt.X(), rPnt.Y());
+ mpEncirclementOverlay = new ImplEncirclementOverlay(*this, aStartPos);
+
+ aDragStat.Reset(rPnt);
+ aDragStat.SetMinMove(ImpGetMinMovLogic(-2,0L));
+ aDragStat.NextPoint();
+}
+
+void SdrPaintView::MovEncirclement(const Point& rPnt)
+{
+ if(IsEncirclement() && aDragStat.CheckMinMoved(rPnt))
+ {
+ aDragStat.NextMove(rPnt);
+
+ DBG_ASSERT(mpEncirclementOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
+ basegfx::B2DPoint aNewPos(rPnt.X(), rPnt.Y());
+ mpEncirclementOverlay->SetSecondPosition(aNewPos);
+ }
+}
+
+Rectangle SdrPaintView::EndEncirclement(sal_Bool bNoJustify)
+{
+ Rectangle aRetval;
+
+ if(IsEncirclement())
+ {
+ if(aDragStat.IsMinMoved())
+ {
+ aRetval = Rectangle(aDragStat.GetStart(), aDragStat.GetNow());
+
+ if(!bNoJustify)
+ {
+ aRetval.Justify();
+ }
+ }
+
+ // cleanup
+ BrkEncirclement();
+ }
+
+ return aRetval;
+}
+
+void SdrPaintView::BrkEncirclement()
+{
+ if(IsEncirclement())
+ {
+ DBG_ASSERT(mpEncirclementOverlay, "SdrSnapView::MovSetPageOrg: no ImplPageOriginOverlay (!)");
+ delete mpEncirclementOverlay;
+ mpEncirclementOverlay = 0L;
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrPaintView::ClearPageView()
+{
+ BrkAction();
+
+ if(mpPageView)
+ {
+ InvalidateAllWin();
+ delete mpPageView;
+ mpPageView = 0L;
+ }
+}
+
+SdrPageView* SdrPaintView::ShowSdrPage(SdrPage* pPage)
+{
+ if(pPage && (!mpPageView || mpPageView->GetPage() != pPage))
+ {
+ if(mpPageView)
+ {
+ InvalidateAllWin();
+ delete mpPageView;
+ }
+
+ mpPageView = new SdrPageView(pPage, *((SdrView*)this));
+ mpPageView->Show();
+ }
+
+ return mpPageView;
+}
+
+void SdrPaintView::HideSdrPage()
+{
+ if(mpPageView)
+ {
+ mpPageView->Hide();
+ delete mpPageView;
+ mpPageView = 0L;
+ }
+}
+
+void SdrPaintView::AddWindowToPaintView(OutputDevice* pNewWin)
+{
+ DBG_ASSERT(pNewWin, "SdrPaintView::AddWindowToPaintView: No OutputDevice(!)");
+ SdrPaintWindow* pNewPaintWindow = new SdrPaintWindow(*this, *pNewWin);
+ AppendPaintWindow(*pNewPaintWindow);
+
+ if(mpPageView)
+ {
+ mpPageView->AddPaintWindowToPageView(*pNewPaintWindow);
+ }
+
+#ifdef DBG_UTIL
+ if (pItemBrowser!=NULL)
+ pItemBrowser->ForceParent();
+#endif
+}
+
+void SdrPaintView::DeleteWindowFromPaintView(OutputDevice* pOldWin)
+{
+ DBG_ASSERT(pOldWin, "SdrPaintView::DeleteWindowFromPaintView: No OutputDevice(!)");
+ SdrPaintWindow* pCandidate = FindPaintWindow(*pOldWin);
+
+ if(pCandidate)
+ {
+ if(mpPageView)
+ {
+ mpPageView->RemovePaintWindowFromPageView(*pCandidate);
+ }
+
+ RemovePaintWindow(*pCandidate);
+ delete pCandidate;
+ }
+
+#ifdef DBG_UTIL
+ if (pItemBrowser!=NULL)
+ pItemBrowser->ForceParent();
+#endif
+}
+
+void SdrPaintView::SetLayerVisible(const XubString& rName, BOOL bShow)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetLayerVisible(rName,bShow);
+ }
+
+ InvalidateAllWin();
+}
+
+bool SdrPaintView::IsLayerVisible(const XubString& rName) const
+{
+ if(mpPageView)
+ {
+ return mpPageView->IsLayerVisible(rName);
+ }
+
+ return false;
+}
+
+void SdrPaintView::SetAllLayersVisible(BOOL bShow)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetAllLayersVisible(bShow);
+ }
+
+ InvalidateAllWin();
+}
+
+void SdrPaintView::SetLayerLocked(const XubString& rName, BOOL bLock)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetLayerLocked(rName,bLock);
+ }
+}
+
+bool SdrPaintView::IsLayerLocked(const XubString& rName) const
+{
+ if(mpPageView)
+ {
+ return mpPageView->IsLayerLocked(rName);
+ }
+
+ return false;
+}
+
+void SdrPaintView::SetAllLayersLocked(BOOL bLock)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetAllLayersLocked(bLock);
+ }
+}
+
+void SdrPaintView::SetLayerPrintable(const XubString& rName, BOOL bPrn)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetLayerPrintable(rName,bPrn);
+ }
+}
+
+bool SdrPaintView::IsLayerPrintable(const XubString& rName) const
+{
+ if(mpPageView)
+ {
+ return mpPageView->IsLayerPrintable(rName);
+ }
+
+ return false;
+}
+
+void SdrPaintView::SetAllLayersPrintable(BOOL bPrn)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetAllLayersPrintable(bPrn);
+ }
+}
+
+void SdrPaintView::PrePaint()
+{
+ if(mpPageView)
+ {
+ mpPageView->PrePaint();
+ }
+}
+
+void SdrPaintView::PostPaint()
+{
+ if(mpPageView)
+ {
+ mpPageView->PostPaint();
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// #define SVX_REPAINT_TIMER_TEST
+
+void SdrPaintView::CompleteRedraw(OutputDevice* pOut, const Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector)
+{
+#ifdef SVX_REPAINT_TIMER_TEST
+#define REMEMBERED_TIMES_COUNT (10)
+ static bool bDoTimerTest(false);
+ static bool bTimesInited(false);
+ static sal_uInt32 nRepeatCount(10L);
+ static double fLastTimes[REMEMBERED_TIMES_COUNT];
+ const sal_uInt32 nStartTime(Time::GetSystemTicks());
+ sal_uInt32 count(1L);
+ sal_uInt32 a;
+
+ if(bDoTimerTest)
+ {
+ count = nRepeatCount;
+ }
+
+ for(a = 0L; a < count; a++)
+ {
+#endif // SVX_REPAINT_TIMER_TEST
+
+ // #i74769# check if pOut is a win and has a ClipRegion. If Yes, the Region
+ // rReg may be made more granular (fine) with using it. Normally, rReg
+ // does come from Window::Paint() anyways and thus is based on a single
+ // rectangle which was derived from exactly that repaint region
+ Region aOptimizedRepaintRegion(rReg);
+
+ if(pOut && OUTDEV_WINDOW == pOut->GetOutDevType())
+ {
+ Window* pWindow = (Window*)pOut;
+
+ if(pWindow->IsInPaint())
+ {
+ if(!pWindow->GetPaintRegion().IsEmpty())
+ {
+ aOptimizedRepaintRegion.Intersect(pWindow->GetPaintRegion());
+
+#ifdef DBG_UTIL
+ // #i74769# test-paint repaint region
+ static bool bDoPaintForVisualControl(false);
+ if(bDoPaintForVisualControl)
+ {
+ RegionHandle aRegionHandle(aOptimizedRepaintRegion.BeginEnumRects());
+ Rectangle aRegionRectangle;
+
+ while(aOptimizedRepaintRegion.GetEnumRects(aRegionHandle, aRegionRectangle))
+ {
+ pWindow->SetLineColor(COL_LIGHTGREEN);
+ pWindow->SetFillColor();
+ pWindow->DrawRect(aRegionRectangle);
+ }
+
+ aOptimizedRepaintRegion.EndEnumRects(aRegionHandle);
+ }
+#endif
+ }
+ }
+ }
+
+ SdrPaintWindow* pPaintWindow = BeginCompleteRedraw(pOut);
+ OSL_ENSURE(pPaintWindow, "SdrPaintView::CompleteRedraw: No OutDev (!)");
+
+ DoCompleteRedraw(*pPaintWindow, aOptimizedRepaintRegion, pRedirector);
+ EndCompleteRedraw(*pPaintWindow, true);
+
+#ifdef SVX_REPAINT_TIMER_TEST
+ }
+
+ if(bDoTimerTest)
+ {
+ const sal_uInt32 nStopTime(Time::GetSystemTicks());
+ const sal_uInt32 nNeededTime(nStopTime - nStartTime);
+ const double fTimePerPaint((double)nNeededTime / (double)nRepeatCount);
+
+ if(!bTimesInited)
+ {
+ for(a = 0L; a < REMEMBERED_TIMES_COUNT; a++)
+ {
+ fLastTimes[a] = fTimePerPaint;
+ }
+
+ bTimesInited = true;
+ }
+ else
+ {
+ for(a = 1L; a < REMEMBERED_TIMES_COUNT; a++)
+ {
+ fLastTimes[a - 1L] = fLastTimes[a];
+ }
+
+ fLastTimes[REMEMBERED_TIMES_COUNT - 1L] = fTimePerPaint;
+ }
+
+ double fAddedTimes(0.0);
+
+ for(a = 0L; a < REMEMBERED_TIMES_COUNT; a++)
+ {
+ fAddedTimes += fLastTimes[a];
+ }
+
+ const double fAverageTimePerPaint(fAddedTimes / (double)REMEMBERED_TIMES_COUNT);
+
+ fprintf(stderr, "-----------(start result)----------\n");
+ fprintf(stderr, "StartTime : %u, StopTime: %u, NeededTime: %u, TimePerPaint: %f\n", nStartTime, nStopTime, nNeededTime, fTimePerPaint);
+ fprintf(stderr, "Remembered times: ");
+
+ for(a = 0L; a < REMEMBERED_TIMES_COUNT; a++)
+ {
+ fprintf(stderr, "%d: %f ", a, fLastTimes[a]);
+ }
+
+ fprintf(stderr, "\n");
+ fprintf(stderr, "AverageTimePerPaint: %f\n", fAverageTimePerPaint);
+ fprintf(stderr, "-----------(stop result)----------\n");
+ }
+#endif // SVX_REPAINT_TIMER_TEST
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// #i72889#
+
+SdrPaintWindow* SdrPaintView::BeginCompleteRedraw(OutputDevice* pOut)
+{
+ OSL_ENSURE(pOut, "SdrPaintView::BeginCompleteRedraw: No OutDev (!)");
+ SdrPaintWindow* pPaintWindow = FindPaintWindow(*pOut);
+
+ if(pPaintWindow)
+ {
+ // draw preprocessing, only for known devices
+ // prepare PreRendering
+ pPaintWindow->PreparePreRenderDevice();
+ }
+ else
+ {
+ // None of the known OutputDevices is the target of this paint, use
+ // a temporary SdrPaintWindow for this Redraw.
+ pPaintWindow = new SdrPaintWindow(*this, *pOut);
+ pPaintWindow->setTemporaryTarget(true);
+ }
+
+ return pPaintWindow;
+}
+
+void SdrPaintView::DoCompleteRedraw(SdrPaintWindow& rPaintWindow, const Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector)
+{
+ // redraw all PageViews with the target. This may expand the RedrawRegion
+ // at the PaintWindow, plus taking care of FormLayer expansion
+ if(mpPageView)
+ {
+ mpPageView->CompleteRedraw(rPaintWindow, rReg, pRedirector);
+ }
+}
+
+void SdrPaintView::EndCompleteRedraw(SdrPaintWindow& rPaintWindow, bool bPaintFormLayer)
+{
+ if(rPaintWindow.getTemporaryTarget())
+ {
+ // get rid of temp target again
+ delete (&rPaintWindow);
+ }
+ else
+ {
+ // draw postprocessing, only for known devices
+ // it is necessary to always paint FormLayer
+ if(bPaintFormLayer)
+ {
+ ImpFormLayerDrawing(rPaintWindow);
+ }
+
+ // look for active TextEdit. As long as this cannot be painted to a VDev,
+ // it cannot get part of buffering. In that case, output evtl. prerender
+ // early and paint text edit to window.
+ const bool bTextEditActive(IsTextEdit() && GetTextEditPageView());
+
+ if(bTextEditActive)
+ {
+ // output PreRendering and destroy it so that it is not used for FormLayer
+ // or overlay
+ rPaintWindow.OutputPreRenderDevice(rPaintWindow.GetRedrawRegion());
+
+ // draw old text edit stuff before overlay to have it as part of the background
+ // ATM. This will be changed to have the text editing on the overlay, bit it
+ // is not an easy thing to do, see BegTextEdit and the OutlinerView stuff used...
+ if(bTextEditActive)
+ {
+ ImpTextEditDrawing(rPaintWindow);
+ }
+
+ // draw Overlay directly to window. This will save the contents of the window
+ // in the RedrawRegion to the overlay background buffer, too.
+ // This may lead to problems when reading from the screen is slow from the
+ // graphics driver/graphiccard combination.
+ rPaintWindow.DrawOverlay(rPaintWindow.GetRedrawRegion(), false);
+ }
+ else
+ {
+ // draw Overlay, also to PreRender device if exists
+ rPaintWindow.DrawOverlay(rPaintWindow.GetRedrawRegion(), true);
+
+ // output PreRendering
+ rPaintWindow.OutputPreRenderDevice(rPaintWindow.GetRedrawRegion());
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+SdrPaintWindow* SdrPaintView::BeginDrawLayers(OutputDevice* pOut, const Region& rReg, bool bDisableIntersect)
+{
+ // #i74769# use BeginCompleteRedraw() as common base
+ SdrPaintWindow* pPaintWindow = BeginCompleteRedraw(pOut);
+ OSL_ENSURE(pPaintWindow, "SdrPaintView::BeginDrawLayers: No SdrPaintWindow (!)");
+
+ if(mpPageView)
+ {
+ SdrPageWindow* pKnownTarget = mpPageView->FindPageWindow(*pPaintWindow);
+
+ if(pKnownTarget)
+ {
+ // #i74769# check if pOut is a win and has a ClipRegion. If Yes, the Region
+ // rReg may be made more granular (fine) with using it. Normally, rReg
+ // does come from Window::Paint() anyways and thus is based on a single
+ // rectangle which was derived from exactly that repaint region
+ Region aOptimizedRepaintRegion(rReg);
+
+ // #i76114# Intersecting the region with the Window's paint region is disabled
+ // for print preview in Calc, because the intersection can be empty (if the paint
+ // region is outside of the table area of the page), and then no clip region
+ // would be set.
+ if(pOut && OUTDEV_WINDOW == pOut->GetOutDevType() && !bDisableIntersect)
+ {
+ Window* pWindow = (Window*)pOut;
+
+ if(pWindow->IsInPaint())
+ {
+ if(!pWindow->GetPaintRegion().IsEmpty())
+ {
+ aOptimizedRepaintRegion.Intersect(pWindow->GetPaintRegion());
+
+#ifdef DBG_UTIL
+ // #i74769# test-paint repaint region
+ static bool bDoPaintForVisualControl(false);
+ if(bDoPaintForVisualControl)
+ {
+ RegionHandle aRegionHandle(aOptimizedRepaintRegion.BeginEnumRects());
+ Rectangle aRegionRectangle;
+
+ while(aOptimizedRepaintRegion.GetEnumRects(aRegionHandle, aRegionRectangle))
+ {
+ pWindow->SetLineColor(COL_LIGHTGREEN);
+ pWindow->SetFillColor();
+ pWindow->DrawRect(aRegionRectangle);
+ }
+
+ aOptimizedRepaintRegion.EndEnumRects(aRegionHandle);
+ }
+#endif
+ }
+ }
+ }
+
+ // prepare redraw
+ pKnownTarget->PrepareRedraw(aOptimizedRepaintRegion);
+
+ // remember prepared SdrPageWindow
+ mpPageView->setPreparedPageWindow(pKnownTarget);
+ }
+ }
+
+ return pPaintWindow;
+}
+
+void SdrPaintView::EndDrawLayers(SdrPaintWindow& rPaintWindow, bool bPaintFormLayer)
+{
+ // #i74769# use EndCompleteRedraw() as common base
+ EndCompleteRedraw(rPaintWindow, bPaintFormLayer);
+
+ if(mpPageView)
+ {
+ // forget prepared SdrPageWindow
+ mpPageView->setPreparedPageWindow(0);
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrPaintView::ImpTextEditDrawing(SdrPaintWindow& rPaintWindow) const
+{
+ // draw old text edit stuff
+ if(IsTextEdit())
+ {
+ SdrPageView* pPageView = GetTextEditPageView();
+
+ if(pPageView)
+ {
+ // paint TextEdit directly to the destination OutDev
+ const Region& rRedrawRegion = rPaintWindow.GetRedrawRegion();
+ const Rectangle aCheckRect(rRedrawRegion.GetBoundRect());
+ pPageView->PaintOutlinerView(&rPaintWindow.GetOutputDevice(), aCheckRect);
+ }
+ }
+}
+
+void SdrPaintView::ImpFormLayerDrawing(SdrPaintWindow& rPaintWindow) const
+{
+ if(mpPageView)
+ {
+ SdrPageWindow* pKnownTarget = mpPageView->FindPageWindow(rPaintWindow);
+
+ if(pKnownTarget)
+ {
+ const SdrModel& rModel = *(GetModel());
+ const SdrLayerAdmin& rLayerAdmin = rModel.GetLayerAdmin();
+ const SdrLayerID nControlLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName(), sal_False);
+
+ // BUFFERED use GetTargetOutputDevice() now, it may be targeted to VDevs, too
+ // need to set PreparedPageWindow to make DrawLayer use the correct ObjectContact
+ mpPageView->setPreparedPageWindow(pKnownTarget);
+ mpPageView->DrawLayer(nControlLayerId, &rPaintWindow.GetTargetOutputDevice());
+ mpPageView->setPreparedPageWindow(0);
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+BOOL SdrPaintView::KeyInput(const KeyEvent& /*rKEvt*/, Window* /*pWin*/)
+{
+ return FALSE;
+}
+
+void SdrPaintView::GlueInvalidate() const
+{
+ const sal_uInt32 nWindowCount(PaintWindowCount());
+
+ for(sal_uInt32 nWinNum(0L); nWinNum < nWindowCount; nWinNum++)
+ {
+ SdrPaintWindow* pPaintWindow = GetPaintWindow(nWinNum);
+
+ if(pPaintWindow->OutputToWindow())
+ {
+ OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
+
+ if(mpPageView)
+ {
+ const SdrObjList* pOL=mpPageView->GetObjList();
+ ULONG nObjAnz=pOL->GetObjCount();
+ for (ULONG nObjNum=0; nObjNum<nObjAnz; nObjNum++) {
+ const SdrObject* pObj=pOL->GetObj(nObjNum);
+ const SdrGluePointList* pGPL=pObj->GetGluePointList();
+ if (pGPL!=NULL && pGPL->GetCount()!=0) {
+ pGPL->Invalidate((Window&)rOutDev, pObj);
+ }
+ }
+ }
+ }
+ }
+}
+
+void SdrPaintView::InvalidateAllWin()
+{
+ const sal_uInt32 nWindowCount(PaintWindowCount());
+
+ for(sal_uInt32 a(0L); a < nWindowCount; a++)
+ {
+ SdrPaintWindow* pPaintWindow = GetPaintWindow(a);
+
+ if(pPaintWindow->OutputToWindow())
+ {
+ InvalidateOneWin((Window&)pPaintWindow->GetOutputDevice());
+ }
+ }
+}
+
+void SdrPaintView::InvalidateAllWin(const Rectangle& rRect, BOOL bPlus1Pix)
+{
+ const sal_uInt32 nWindowCount(PaintWindowCount());
+
+ for(sal_uInt32 a(0L); a < nWindowCount; a++)
+ {
+ SdrPaintWindow* pPaintWindow = GetPaintWindow(a);
+
+ if(pPaintWindow->OutputToWindow())
+ {
+ OutputDevice& rOutDev = pPaintWindow->GetOutputDevice();
+ Rectangle aRect(rRect);
+
+ if(bPlus1Pix)
+ {
+ Size aPixSiz(1,1);
+ Size aSiz(rOutDev.PixelToLogic(aPixSiz));
+ aRect.Left ()-=aSiz.Width();
+ aRect.Top ()-=aSiz.Height();
+ aRect.Right ()+=aSiz.Width();
+ aRect.Bottom()+=aSiz.Height();
+ }
+
+ Point aOrg(rOutDev.GetMapMode().GetOrigin());
+ aOrg.X()=-aOrg.X(); aOrg.Y()=-aOrg.Y();
+ Rectangle aOutRect(aOrg, rOutDev.GetOutputSize());
+
+ if (aRect.IsOver(aOutRect))
+ {
+ InvalidateOneWin((Window&)rOutDev, aRect);
+ }
+ }
+ }
+}
+
+void SdrPaintView::InvalidateOneWin(Window& rWin)
+{
+ // #111096#
+ // do not erase background, that causes flicker (!)
+ rWin.Invalidate(INVALIDATE_NOERASE);
+}
+
+void SdrPaintView::InvalidateOneWin(Window& rWin, const Rectangle& rRect)
+{
+ // #111096#
+ // do not erase background, that causes flicker (!)
+ rWin.Invalidate(rRect, INVALIDATE_NOERASE);
+}
+
+void SdrPaintView::LeaveOneGroup()
+{
+ if(mpPageView)
+ {
+ mpPageView->LeaveOneGroup();
+ }
+}
+
+void SdrPaintView::LeaveAllGroup()
+{
+ if(mpPageView)
+ {
+ mpPageView->LeaveAllGroup();
+ }
+}
+
+bool SdrPaintView::IsGroupEntered() const
+{
+ if(mpPageView)
+ {
+ return (mpPageView->GetEnteredLevel() != 0);
+ }
+
+ return false;
+}
+
+void SdrPaintView::SetNotPersistDefaultAttr(const SfxItemSet& rAttr, BOOL /*bReplaceAll*/)
+{
+ // bReplaceAll hat hier keinerlei Wirkung
+ BOOL bMeasure=ISA(SdrView) && ((SdrView*)this)->IsMeasureTool();
+ const SfxPoolItem *pPoolItem=NULL;
+ if (rAttr.GetItemState(SDRATTR_LAYERID,TRUE,&pPoolItem)==SFX_ITEM_SET) {
+ SdrLayerID nLayerId=((const SdrLayerIdItem*)pPoolItem)->GetValue();
+ const SdrLayer* pLayer=pMod->GetLayerAdmin().GetLayerPerID(nLayerId);
+ if (pLayer!=NULL) {
+ if (bMeasure) aMeasureLayer=pLayer->GetName();
+ else aAktLayer=pLayer->GetName();
+ }
+ }
+ if (rAttr.GetItemState(SDRATTR_LAYERNAME,TRUE,&pPoolItem)==SFX_ITEM_SET) {
+ if (bMeasure) aMeasureLayer=((const SdrLayerNameItem*)pPoolItem)->GetValue();
+ else aAktLayer=((const SdrLayerNameItem*)pPoolItem)->GetValue();
+ }
+}
+
+void SdrPaintView::MergeNotPersistDefaultAttr(SfxItemSet& rAttr, BOOL /*bOnlyHardAttr*/) const
+{
+ // bOnlyHardAttr hat hier keinerlei Wirkung
+ BOOL bMeasure=ISA(SdrView) && ((SdrView*)this)->IsMeasureTool();
+ const XubString& aNam=bMeasure?aMeasureLayer:aAktLayer;
+ rAttr.Put(SdrLayerNameItem(aNam));
+ SdrLayerID nLayer=pMod->GetLayerAdmin().GetLayerID(aNam,TRUE);
+ if (nLayer!=SDRLAYER_NOTFOUND) {
+ rAttr.Put(SdrLayerIdItem(nLayer));
+ }
+}
+
+void SdrPaintView::SetDefaultAttr(const SfxItemSet& rAttr, BOOL bReplaceAll)
+{
+#ifdef DBG_UTIL
+ {
+ BOOL bHasEEFeatureItems=FALSE;
+ SfxItemIter aIter(rAttr);
+ const SfxPoolItem* pItem=aIter.FirstItem();
+ while (!bHasEEFeatureItems && pItem!=NULL) {
+ if (!IsInvalidItem(pItem)) {
+ USHORT nW=pItem->Which();
+ if (nW>=EE_FEATURE_START && nW<=EE_FEATURE_END) bHasEEFeatureItems=TRUE;
+ }
+ pItem=aIter.NextItem();
+ }
+
+ if(bHasEEFeatureItems)
+ {
+ String aMessage;
+ aMessage.AppendAscii("SdrPaintView::SetDefaultAttr(): Das setzen von EE_FEATURE-Items an der SdrView macht keinen Sinn! Es fuehrt nur zu Overhead und nicht mehr lesbaren Dokumenten.");
+ InfoBox(NULL, aMessage).Execute();
+ }
+ }
+#endif
+ if (bReplaceAll) aDefaultAttr.Set(rAttr);
+ else aDefaultAttr.Put(rAttr,FALSE); // FALSE= InvalidItems nicht als Default, sondern als "Loecher" betrachten
+ SetNotPersistDefaultAttr(rAttr,bReplaceAll);
+#ifdef DBG_UTIL
+ if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
+#endif
+}
+
+void SdrPaintView::SetDefaultStyleSheet(SfxStyleSheet* pStyleSheet, BOOL bDontRemoveHardAttr)
+{
+ if (pDefaultStyleSheet)
+ EndListening(*pDefaultStyleSheet);
+ pDefaultStyleSheet=pStyleSheet;
+ if (pDefaultStyleSheet)
+ StartListening(*pDefaultStyleSheet);
+
+ if (pStyleSheet!=NULL && !bDontRemoveHardAttr) {
+ SfxWhichIter aIter(pStyleSheet->GetItemSet());
+ USHORT nWhich=aIter.FirstWhich();
+ while (nWhich!=0) {
+ if (pStyleSheet->GetItemSet().GetItemState(nWhich,TRUE)==SFX_ITEM_SET) {
+ aDefaultAttr.ClearItem(nWhich);
+ }
+ nWhich=aIter.NextWhich();
+ }
+ }
+#ifdef DBG_UTIL
+ if (pItemBrowser!=NULL) pItemBrowser->SetDirty();
+#endif
+}
+
+/* new interface src537 */
+BOOL SdrPaintView::GetAttributes(SfxItemSet& rTargetSet, BOOL bOnlyHardAttr) const
+{
+ if(bOnlyHardAttr || !pDefaultStyleSheet)
+ {
+ rTargetSet.Put(aDefaultAttr, FALSE);
+ }
+ else
+ {
+ // sonst DefStyleSheet dazumergen
+ rTargetSet.Put(pDefaultStyleSheet->GetItemSet(), FALSE);
+ rTargetSet.Put(aDefaultAttr, FALSE);
+ }
+ MergeNotPersistDefaultAttr(rTargetSet, bOnlyHardAttr);
+ return TRUE;
+}
+
+BOOL SdrPaintView::SetAttributes(const SfxItemSet& rSet, BOOL bReplaceAll)
+{
+ SetDefaultAttr(rSet,bReplaceAll);
+ return TRUE;
+}
+
+SfxStyleSheet* SdrPaintView::GetStyleSheet() const // SfxStyleSheet* SdrPaintView::GetStyleSheet(BOOL& rOk) const
+{
+ //rOk=TRUE;
+ return GetDefaultStyleSheet();
+}
+
+BOOL SdrPaintView::SetStyleSheet(SfxStyleSheet* pStyleSheet, BOOL bDontRemoveHardAttr)
+{
+ SetDefaultStyleSheet(pStyleSheet,bDontRemoveHardAttr);
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef DBG_UTIL
+void SdrPaintView::ShowItemBrowser(BOOL bShow)
+{
+ if (bShow) {
+ if (pItemBrowser==NULL) {
+ pItemBrowser=new SdrItemBrowser(*(SdrView*)this);
+ pItemBrowser->SetFloatingMode(TRUE);
+ }
+ pItemBrowser->Show();
+ pItemBrowser->GrabFocus();
+ } else {
+ if (pItemBrowser!=NULL) {
+ pItemBrowser->Hide();
+ delete pItemBrowser;
+ pItemBrowser=NULL;
+ }
+ }
+}
+#endif
+
+void SdrPaintView::MakeVisible(const Rectangle& rRect, Window& rWin)
+{
+ MapMode aMap(rWin.GetMapMode());
+ Size aActualSize(rWin.GetOutputSize());
+
+ if( aActualSize.Height() > 0 && aActualSize.Width() > 0 )
+ {
+ Size aNewSize(rRect.GetSize());
+ BOOL bNewScale=FALSE;
+ BOOL bNeedMoreX=aNewSize.Width()>aActualSize.Width();
+ BOOL bNeedMoreY=aNewSize.Height()>aActualSize.Height();
+ if (bNeedMoreX || bNeedMoreY)
+ {
+ bNewScale=TRUE;
+ // Neuen MapMode (Size+Org) setzen und dabei alles invalidieren
+ Fraction aXFact(aNewSize.Width(),aActualSize.Width());
+ Fraction aYFact(aNewSize.Height(),aActualSize.Height());
+ if (aYFact>aXFact) aXFact=aYFact;
+ aXFact*=aMap.GetScaleX();
+ aXFact.ReduceInaccurate(10); // Um Ueberlaeufe und BigInt-Mapping zu vermeiden
+ aMap.SetScaleX(aXFact);
+ aMap.SetScaleY(aYFact);
+ rWin.SetMapMode(aMap);
+ aActualSize=rWin.GetOutputSize();
+ }
+ Point aOrg(aMap.GetOrigin());
+ long dx=0,dy=0;
+ long l=-aOrg.X();
+ long r=-aOrg.X()+aActualSize.Width()-1;
+ long o=-aOrg.Y();
+ long u=-aOrg.Y()+aActualSize.Height()-1;
+ if (l>rRect.Left()) dx=rRect.Left()-l;
+ else if (r<rRect.Right()) dx=rRect.Right()-r;
+ if (o>rRect.Top()) dy=rRect.Top()-o;
+ else if (u<rRect.Bottom()) dy=rRect.Bottom()-u;
+ aMap.SetOrigin(Point(aOrg.X()-dx,aOrg.Y()-dy));
+ if (!bNewScale) {
+ if (dx!=0 || dy!=0) {
+ rWin.Scroll(-dx,-dy);
+ rWin.SetMapMode(aMap);
+ rWin.Update();
+ }
+ } else {
+ rWin.SetMapMode(aMap);
+ InvalidateOneWin(rWin);
+ }
+ }
+}
+
+void SdrPaintView::DoConnect(SdrOle2Obj* /*pOleObj*/)
+{
+}
+
+void SdrPaintView::SetAnimationEnabled( BOOL bEnable )
+{
+ SetAnimationMode( bEnable ? SDR_ANIMATION_ANIMATE : SDR_ANIMATION_DISABLE );
+}
+
+void SdrPaintView::SetAnimationPause( bool bSet )
+{
+ if((bool)bAnimationPause != bSet)
+ {
+ bAnimationPause = bSet;
+
+ if(mpPageView)
+ {
+ for(sal_uInt32 b(0L); b < mpPageView->PageWindowCount(); b++)
+ {
+ const SdrPageWindow& rPageWindow = *(mpPageView->GetPageWindow(b));
+ sdr::contact::ObjectContact& rObjectContact = rPageWindow.GetObjectContact();
+ sdr::animation::primitiveAnimator& rAnimator = rObjectContact.getPrimitiveAnimator();
+
+ if(rAnimator.IsPaused() != bSet)
+ {
+ rAnimator.SetPaused(bSet);
+ }
+ }
+ }
+ }
+}
+
+void SdrPaintView::SetAnimationMode( const SdrAnimationMode eMode )
+{
+ eAnimationMode = eMode;
+}
+
+void SdrPaintView::VisAreaChanged(const OutputDevice* pOut)
+{
+ if(mpPageView)
+ {
+ if (pOut)
+ {
+ SdrPageWindow* pWindow = mpPageView->FindPageWindow(*((OutputDevice*)pOut));
+
+ if(pWindow)
+ {
+ VisAreaChanged(*pWindow);
+ }
+ }
+ else
+ {
+ for(sal_uInt32 a(0L); a < mpPageView->PageWindowCount(); a++)
+ {
+ VisAreaChanged(*mpPageView->GetPageWindow(a));
+ }
+ }
+ }
+}
+
+void SdrPaintView::VisAreaChanged(const SdrPageWindow& /*rWindow*/)
+{
+ // notify SfxListener
+ Broadcast(SvxViewHint(SvxViewHint::SVX_HINT_VIEWCHANGED));
+}
+
+const svtools::ColorConfig& SdrPaintView::getColorConfig() const
+{
+ return maColorConfig;
+}
+
+void SdrPaintView::onChangeColorConfig()
+{
+ SetGridColor( Color( maColorConfig.GetColorValue( svtools::DRAWGRID ).nColor ) );
+}
+
+void SdrPaintView::SetGridColor( Color aColor )
+{
+ maGridColor = aColor;
+}
+
+Color SdrPaintView::GetGridColor() const
+{
+ return maGridColor;
+}
+
+// #103834# Set background color for svx at SdrPageViews
+void SdrPaintView::SetApplicationBackgroundColor(Color aBackgroundColor)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetApplicationBackgroundColor(aBackgroundColor);
+ }
+}
+
+// #103911# Set document color for svx at SdrPageViews
+void SdrPaintView::SetApplicationDocumentColor(Color aDocumentColor)
+{
+ if(mpPageView)
+ {
+ mpPageView->SetApplicationDocumentColor(aDocumentColor);
+ }
+}
+
+// #114898#
+bool SdrPaintView::IsBufferedOutputAllowed() const
+{
+ return (mbBufferedOutputAllowed && maDrawinglayerOpt.IsPaintBuffer());
+}
+
+// #114898#
+void SdrPaintView::SetBufferedOutputAllowed(bool bNew)
+{
+ if(bNew != (bool)mbBufferedOutputAllowed)
+ {
+ mbBufferedOutputAllowed = bNew;
+ }
+}
+
+bool SdrPaintView::IsBufferedOverlayAllowed() const
+{
+ return (mbBufferedOverlayAllowed && maDrawinglayerOpt.IsOverlayBuffer());
+}
+
+void SdrPaintView::SetBufferedOverlayAllowed(bool bNew)
+{
+ if(bNew != (bool)mbBufferedOverlayAllowed)
+ {
+ mbBufferedOverlayAllowed = bNew;
+ }
+}
+
+sal_Bool SdrPaintView::IsPagePaintingAllowed() const
+{
+ return mbPagePaintingAllowed;
+}
+
+void SdrPaintView::SetPagePaintingAllowed(bool bNew)
+{
+ if(bNew != (bool)mbPagePaintingAllowed)
+ {
+ mbPagePaintingAllowed = bNew;
+ }
+}
+
+// #i38135# Sets the timer for Object animations and restarts.
+void SdrPaintView::SetAnimationTimer(sal_uInt32 nTime)
+{
+ if(mpPageView)
+ {
+ // first, reset all timers at all windows to 0L
+ for(sal_uInt32 a(0L); a < mpPageView->PageWindowCount(); a++)
+ {
+ const SdrPageWindow& rPageWindow = *mpPageView->GetPageWindow(a);
+ sdr::contact::ObjectContact& rObjectContact = rPageWindow.GetObjectContact();
+ sdr::animation::primitiveAnimator& rAnimator = rObjectContact.getPrimitiveAnimator();
+ rAnimator.SetTime(nTime);
+ }
+ }
+}
+
+// eof