summaryrefslogtreecommitdiff
path: root/svx/source/svdraw/svdpagv.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/svdraw/svdpagv.cxx')
-rw-r--r--svx/source/svdraw/svdpagv.cxx1122
1 files changed, 1122 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdpagv.cxx b/svx/source/svdraw/svdpagv.cxx
new file mode 100644
index 000000000000..bad1401c2305
--- /dev/null
+++ b/svx/source/svdraw/svdpagv.cxx
@@ -0,0 +1,1122 @@
+/*************************************************************************
+ *
+ * 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 <svx/svdpagv.hxx>
+#include <com/sun/star/awt/XWindow.hpp>
+#include <com/sun/star/awt/PosSize.hpp>
+#include <comphelper/processfactory.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/xpoly.hxx>
+#include <svx/svdouno.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdview.hxx>
+
+#include <svx/svdedxv.hxx>
+#include <svx/svdpagv.hxx>
+#include <svx/svdoutl.hxx>
+#include <svx/svdpagv.hxx>
+#include <editeng/outliner.hxx>
+#include <svx/svdetc.hxx>
+#include <svx/svdobj.hxx>
+#include <svx/svdouno.hxx>
+#include <svx/svdpage.hxx>
+#include <svx/svdview.hxx>
+#include "svditer.hxx"
+#include <svx/svdogrp.hxx>
+#include <svx/svdtypes.hxx>
+
+#include <svx/svdotext.hxx> // fuer PaintOutlinerView
+#include <svx/svdoole2.hxx>
+
+// #110094#
+#include <svx/sdr/contact/objectcontactofpageview.hxx>
+#include <svx/svdogrp.hxx>
+#include <svx/sdr/contact/viewobjectcontactredirector.hxx>
+#include <svx/fmview.hxx>
+
+// for search on vector
+#include <algorithm>
+
+using namespace ::rtl;
+using namespace ::com::sun::star;
+#include <svx/sdrpagewindow.hxx>
+#include <sdrpaintwindow.hxx>
+
+TYPEINIT1(SdrPageView, SfxListener);
+DBG_NAME(SdrPageView);
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// interface to SdrPageWindow
+
+SdrPageWindow* SdrPageView::FindPageWindow(SdrPaintWindow& rPaintWindow) const
+{
+ for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++)
+ {
+ if(&((*a)->GetPaintWindow()) == &rPaintWindow)
+ {
+ return *a;
+ }
+ }
+
+ return 0L;
+}
+
+const SdrPageWindow* SdrPageView::FindPatchedPageWindow( const OutputDevice& _rOutDev ) const
+{
+ for ( SdrPageWindowVector::const_iterator loop = maPageWindows.begin();
+ loop != maPageWindows.end();
+ ++loop
+ )
+ {
+ const SdrPageWindow& rPageWindow( *(*loop) );
+ const SdrPaintWindow& rPaintWindow( rPageWindow.GetOriginalPaintWindow() ? *rPageWindow.GetOriginalPaintWindow() : rPageWindow.GetPaintWindow() );
+ if ( &rPaintWindow.GetOutputDevice() == &_rOutDev )
+ {
+ return &rPageWindow;
+ }
+ }
+
+ return NULL;
+}
+
+SdrPageWindow* SdrPageView::FindPageWindow(const OutputDevice& rOutDev) const
+{
+ for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++)
+ {
+ if(&((*a)->GetPaintWindow().GetOutputDevice()) == &rOutDev)
+ {
+ return *a;
+ }
+ }
+
+ return 0L;
+}
+
+SdrPageWindow* SdrPageView::GetPageWindow(sal_uInt32 nIndex) const
+{
+ // #126416#
+ if(nIndex < maPageWindows.size())
+ {
+ return maPageWindows[nIndex];
+ }
+
+ return 0L;
+}
+
+void SdrPageView::ClearPageWindows()
+{
+ // #126416#
+ for(SdrPageWindowVector::const_iterator a = maPageWindows.begin(); a != maPageWindows.end(); a++)
+ {
+ delete *a;
+ }
+
+ maPageWindows.clear();
+}
+
+void SdrPageView::AppendPageWindow(SdrPageWindow& rNew)
+{
+ maPageWindows.push_back(&rNew);
+}
+
+SdrPageWindow* SdrPageView::RemovePageWindow(sal_uInt32 nPos)
+{
+ if(nPos < maPageWindows.size())
+ {
+ SdrPageWindowVector::iterator aAccess = maPageWindows.begin() + nPos;
+ // #114376# remember return value
+ SdrPageWindow* pErasedSdrPageWindow = *aAccess;
+ maPageWindows.erase(aAccess);
+ return pErasedSdrPageWindow;
+ }
+
+ return 0L;
+}
+
+SdrPageWindow* SdrPageView::RemovePageWindow(SdrPageWindow& rOld)
+{
+ const SdrPageWindowVector::iterator aFindResult = ::std::find(maPageWindows.begin(), maPageWindows.end(), &rOld);
+
+ if(aFindResult != maPageWindows.end())
+ {
+ // #114376# remember return value
+ SdrPageWindow* pSdrPageWindow = *aFindResult;
+ maPageWindows.erase(aFindResult);
+ return pSdrPageWindow;
+ }
+
+ return 0L;
+}
+
+//////////////////////////////////////////////////////////////////////////////
+
+SdrPageView::SdrPageView(SdrPage* pPage1, SdrView& rNewView)
+: mrView(rNewView),
+ // #103911# col_auto color lets the view takes the default SvxColorConfig entry
+ maDocumentColor( COL_AUTO ),
+ maBackgroundColor(COL_AUTO ), // #i48367# also react on autocolor
+ mpPreparedPageWindow(0) // #i72752#
+{
+ DBG_CTOR(SdrPageView,NULL);
+ mpPage = pPage1;
+
+ if(mpPage)
+ {
+ aPgOrg.X()=mpPage->GetLftBorder();
+ aPgOrg.Y()=mpPage->GetUppBorder();
+ }
+ mbHasMarked = sal_False;
+ aLayerVisi.SetAll();
+ aLayerPrn.SetAll();
+
+ mbVisible = sal_False;
+ pAktList = NULL;
+ pAktGroup = NULL;
+ SetAktGroupAndList(NULL, mpPage);
+
+ StartListening(*rNewView.GetModel());
+
+ for(sal_uInt32 a(0L); a < rNewView.PaintWindowCount(); a++)
+ {
+ AddPaintWindowToPageView(*rNewView.GetPaintWindow(a));
+ }
+}
+
+SdrPageView::~SdrPageView()
+{
+ DBG_DTOR(SdrPageView,NULL);
+
+ // cleanup window vector
+ ClearPageWindows();
+}
+
+SdrPageWindow& SdrPageView::CreateNewPageWindowEntry(SdrPaintWindow& rPaintWindow)
+{
+ // MIB 3.7.08: Das WinRec muss sofort in die Liste eingetragen werden,
+ // weil sich das InsertControlContainer darauf verlaesst
+ //SdrPageViewWinRec* pRec = new SdrPageViewWinRec( *this, pOut );
+ //pWinList->Insert(pRec);
+ SdrPageWindow& rWindow = *(new SdrPageWindow(*this, rPaintWindow));
+ AppendPageWindow(rWindow);
+
+ return rWindow;
+}
+
+void SdrPageView::AddPaintWindowToPageView(SdrPaintWindow& rPaintWindow)
+{
+ if(!FindPageWindow(rPaintWindow))
+ {
+ CreateNewPageWindowEntry(rPaintWindow);
+ }
+}
+
+void SdrPageView::RemovePaintWindowFromPageView(SdrPaintWindow& rPaintWindow)
+{
+ SdrPageWindow* pCandidate = FindPageWindow(rPaintWindow);
+
+ if(pCandidate)
+ {
+ pCandidate = RemovePageWindow(*pCandidate);
+
+ if(pCandidate)
+ {
+ delete pCandidate;
+ }
+ }
+}
+
+::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > SdrPageView::GetControlContainer( const OutputDevice& _rDevice ) const
+{
+ ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > xReturn;
+ const SdrPageWindow* pCandidate = FindPatchedPageWindow( _rDevice );
+
+ if ( pCandidate )
+ xReturn = pCandidate->GetControlContainer( true );
+
+ return xReturn;
+}
+
+void __EXPORT SdrPageView::Notify(SfxBroadcaster& /*rBC*/, const SfxHint& /*rHint*/)
+{
+ // not really interested in
+}
+
+void SdrPageView::ModelHasChanged()
+{
+ if (GetAktGroup()!=NULL) CheckAktGroup();
+}
+
+sal_Bool SdrPageView::IsReadOnly() const
+{
+ return (0L == GetPage() || GetView().GetModel()->IsReadOnly() || GetPage()->IsReadOnly() || GetObjList()->IsReadOnly());
+}
+
+void SdrPageView::Show()
+{
+ if(!IsVisible())
+ {
+ mbVisible = sal_True;
+ InvalidateAllWin();
+
+ for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++)
+ {
+ AddPaintWindowToPageView(*GetView().GetPaintWindow(a));
+ }
+ }
+}
+
+void SdrPageView::Hide()
+{
+ if(IsVisible())
+ {
+ InvalidateAllWin();
+ mbVisible = sal_False;
+ ClearPageWindows();
+ }
+}
+
+Rectangle SdrPageView::GetPageRect() const
+{
+ if (GetPage()==NULL) return Rectangle();
+ return Rectangle(Point(),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1));
+}
+
+void SdrPageView::InvalidateAllWin()
+{
+ if(IsVisible() && GetPage())
+ {
+ Rectangle aRect(Point(0,0),Size(GetPage()->GetWdt()+1,GetPage()->GetHgt()+1));
+ aRect.Union(GetPage()->GetAllObjBoundRect());
+ GetView().InvalidateAllWin(aRect);
+ }
+}
+
+void SdrPageView::InvalidateAllWin(const Rectangle& rRect, sal_Bool bPlus1Pix)
+{
+ if(IsVisible())
+ {
+ GetView().InvalidateAllWin(rRect, bPlus1Pix);
+ }
+}
+
+void SdrPageView::PaintOutlinerView(OutputDevice* pOut, const Rectangle& rRect) const
+{
+ if (GetView().pTextEditOutliner==NULL) return;
+ //const SdrObject* pTextObjTmp=GetView().GetTextEditObject();
+ //const SdrTextObj* pText=PTR_CAST(SdrTextObj,pTextObjTmp);
+ //FASTBOOL bTextFrame=pText!=NULL && pText->IsTextFrame();
+ ULONG nViewAnz=GetView().pTextEditOutliner->GetViewCount();
+ for (ULONG i=0; i<nViewAnz; i++) {
+ OutlinerView* pOLV=GetView().pTextEditOutliner->GetView(i);
+ if (pOLV->GetWindow()==pOut) {
+ GetView().ImpPaintOutlinerView(*pOLV, rRect);
+ return;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+void SdrPageView::PrePaint()
+{
+ const sal_uInt32 nCount(PageWindowCount());
+
+ for(sal_uInt32 a(0); a < nCount; a++)
+ {
+ SdrPageWindow* pCandidate = GetPageWindow(a);
+
+ if(pCandidate)
+ {
+ pCandidate->PrePaint();
+ }
+ }
+}
+
+void SdrPageView::CompleteRedraw(SdrPaintWindow& rPaintWindow, const Region& rReg, sdr::contact::ViewObjectContactRedirector* pRedirector) const
+{
+ if(GetPage())
+ {
+ SdrPageWindow* pPageWindow = FindPageWindow(rPaintWindow);
+ sal_Bool bIsTempTarget(sal_False);
+
+ if(!pPageWindow)
+ {
+ // create temp PageWindow
+ pPageWindow = new SdrPageWindow(*((SdrPageView*)this), rPaintWindow);
+ bIsTempTarget = sal_True;
+ }
+
+ // do the redraw
+ pPageWindow->PrepareRedraw(rReg);
+ pPageWindow->RedrawAll(pRedirector);
+
+ // get rid of temp PageWindow
+ if(bIsTempTarget)
+ {
+ delete pPageWindow;
+ pPageWindow = 0L;
+ }
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// #i74769# use SdrPaintWindow directly
+
+void SdrPageView::setPreparedPageWindow(SdrPageWindow* pKnownTarget)
+{
+ // #i72752# remember prepared SdrPageWindow
+ mpPreparedPageWindow = pKnownTarget;
+}
+
+void SdrPageView::DrawLayer(SdrLayerID nID, OutputDevice* pGivenTarget, sdr::contact::ViewObjectContactRedirector* pRedirector) const
+{
+ if(GetPage())
+ {
+ if(pGivenTarget)
+ {
+ const SdrPageWindow* pKnownTarget = FindPageWindow(*pGivenTarget);
+
+ if(pKnownTarget)
+ {
+ // paint known target
+ pKnownTarget->RedrawLayer(&nID, pRedirector);
+ }
+ else
+ {
+ // #i72752# DrawLayer() uses a OutputDevice different from BeginDrawLayer. This happens
+ // e.g. when SW paints a single text line in text edit mode. Try to use it
+ SdrPageWindow* pPreparedTarget = mpPreparedPageWindow;
+
+ if(pPreparedTarget)
+ {
+ // if we have a prepared target, do not use a new SdrPageWindow since this
+ // works but is expensive. Just use a temporary PaintWindow
+ SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget);
+
+ // Copy existing paint region to use the same as prepared in BeginDrawLayer
+ SdrPaintWindow& rExistingPaintWindow = pPreparedTarget->GetPaintWindow();
+ const Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion();
+ aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
+
+ // patch the ExistingPageWindow
+ pPreparedTarget->patchPaintWindow(aTemporaryPaintWindow);
+
+ // redraw the layer
+ pPreparedTarget->RedrawLayer(&nID, pRedirector);
+
+ // restore the ExistingPageWindow
+ pPreparedTarget->unpatchPaintWindow();
+ }
+ else
+ {
+ OSL_ENSURE(false, "SdrPageView::DrawLayer: Creating temporary SdrPageWindow (ObjectContact), this should never be needed (!)");
+
+ // None of the known OutputDevices is the target of this paint, use
+ // a temporary SdrPageWindow for this Redraw.
+ SdrPaintWindow aTemporaryPaintWindow(mrView, *pGivenTarget);
+ SdrPageWindow aTemporaryPageWindow(*((SdrPageView*)this), aTemporaryPaintWindow);
+
+ // #i72752#
+ // Copy existing paint region if other PageWindows exist, this was created by
+ // PrepareRedraw() from BeginDrawLayer(). Needs to be used e.g. when suddenly SW
+ // paints into an unknown device other than the view was created for (e.g. VirtualDevice)
+ if(PageWindowCount())
+ {
+ SdrPageWindow* pExistingPageWindow = GetPageWindow(0L);
+ SdrPaintWindow& rExistingPaintWindow = pExistingPageWindow->GetPaintWindow();
+ const Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion();
+ aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion);
+ }
+
+ aTemporaryPageWindow.RedrawLayer(&nID, pRedirector);
+ }
+ }
+ }
+ else
+ {
+ // paint in all known windows
+ for(sal_uInt32 a(0L); a < PageWindowCount(); a++)
+ {
+ SdrPageWindow* pTarget = GetPageWindow(a);
+ pTarget->RedrawLayer(&nID, pRedirector);
+ }
+ }
+ }
+}
+
+void SdrPageView::SetDesignMode( bool _bDesignMode ) const
+{
+ for ( sal_uInt32 i = 0L; i < PageWindowCount(); ++i )
+ {
+ const SdrPageWindow& rPageViewWindow = *GetPageWindow(i);
+ rPageViewWindow.SetDesignMode( _bDesignMode );
+ }
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#ifdef OS2
+#define RGBCOLOR(r,g,b) ((ULONG)(((BYTE)(b) | ((USHORT)(g)<<8)) | (((ULONG)(BYTE)(r))<<16)))
+#endif
+
+void SdrPageView::DrawPageViewGrid(OutputDevice& rOut, const Rectangle& rRect, Color aColor)
+{
+ if (GetPage()==NULL)
+ return;
+
+ long nx1=GetView().aGridBig.Width();
+ long nx2=GetView().aGridFin.Width();
+ long ny1=GetView().aGridBig.Height();
+ long ny2=GetView().aGridFin.Height();
+
+ if (nx1==0) nx1=nx2;
+ if (nx2==0) nx2=nx1;
+ if (ny1==0) ny1=ny2;
+ if (ny2==0) ny2=ny1;
+ if (nx1==0) { nx1=ny1; nx2=ny2; }
+ if (ny1==0) { ny1=nx1; ny2=nx2; }
+ if (nx1<0) nx1=-nx1;
+ if (nx2<0) nx2=-nx2;
+ if (ny1<0) ny1=-ny1;
+ if (ny2<0) ny2=-ny2;
+
+ if (nx1!=0)
+ {
+ // no more global output size, use window size instead to decide grid sizes
+ long nScreenWdt = rOut.GetOutputSizePixel().Width();
+ // old: long nScreenWdt=System::GetDesktopRectPixel().GetWidth();
+
+ // Grid bei kleinen Zoomstufen etwas erweitern
+ //Size a1PixSiz(rOut.PixelToLogic(Size(1,1)));
+ long nMinDotPix=2;
+ long nMinLinPix=4;
+
+ if (nScreenWdt>=1600)
+ {
+ nMinDotPix=4;
+ nMinLinPix=8;
+ }
+ else if (nScreenWdt>=1024)
+ {
+ nMinDotPix=3;
+ nMinLinPix=6;
+ }
+ else
+ { // z.B. 640x480
+ nMinDotPix=2;
+ nMinLinPix=4;
+ }
+ Size aMinDotDist(rOut.PixelToLogic(Size(nMinDotPix,nMinDotPix)));
+ //Size a3PixSiz(rOut.PixelToLogic(Size(2,2)));
+ Size aMinLinDist(rOut.PixelToLogic(Size(nMinLinPix,nMinLinPix)));
+ FASTBOOL bHoriSolid=nx2<aMinDotDist.Width();
+ FASTBOOL bVertSolid=ny2<aMinDotDist.Height();
+ // Linienabstand vergroessern (mind. 4 Pixel)
+ // Vergroesserung: *2 *5 *10 *20 *50 *100 ...
+ int nTgl=0;
+ long nVal0=nx1;
+ while (nx1<aMinLinDist.Width())
+ {
+ long a=nx1;
+
+ if (nTgl==0) nx1*=2;
+ if (nTgl==1) nx1=nVal0*5; // => nx1*=2.5
+ if (nTgl==2) nx1*=2;
+
+ nVal0=a;
+ nTgl++; if (nTgl>=3) nTgl=0;
+ }
+ nTgl=0;
+ nVal0=ny1;
+ while (ny1<aMinLinDist.Height())
+ {
+ long a=ny1;
+
+ if (nTgl==0) ny1*=2;
+ if (nTgl==1) ny1=nVal0*5; // => ny1*=2.5
+ if (nTgl==2) ny1*=2;
+
+ nVal0=a;
+ nTgl++;
+
+ if (nTgl>=3) nTgl=0;
+ }
+ // Keine Zwischenpunkte, wenn...
+ //if (nx2<a2PixSiz.Width()) nx2=nx1;
+ //if (ny2<a2PixSiz.Height()) ny2=ny1;
+
+ FASTBOOL bHoriFine=nx2<nx1;
+ FASTBOOL bVertFine=ny2<ny1;
+ FASTBOOL bHoriLines=bHoriSolid || bHoriFine || !bVertFine;
+ FASTBOOL bVertLines=bVertSolid || bVertFine;
+
+ Color aColorMerk( rOut.GetLineColor() );
+ rOut.SetLineColor( aColor );
+
+ bool bMap0=rOut.IsMapModeEnabled();
+#ifdef WIN // SetPixel-Profiling fuer Windows
+ COLORREF aWinColRef=PALETTERGB(aColor.GetRed()>>8,aColor.GetGreen()>>8,aColor.GetBlue()>>8);
+ HDC aWinhDC=Sysdepen::GethDC(rOut);
+#endif
+
+ long nWrX=0;//aWriterPageOffset.X();
+ long nWrY=0;//aWriterPageOffset.Y();
+ Point aOrg(aPgOrg);
+ long x1=GetPage()->GetLftBorder()+1+nWrX;
+ long x2=GetPage()->GetWdt()-GetPage()->GetRgtBorder()-1+nWrY;
+ long y1=GetPage()->GetUppBorder()+1+nWrX;
+ long y2=GetPage()->GetHgt()-GetPage()->GetLwrBorder()-1+nWrY;
+ const SdrPageGridFrameList* pFrames=GetPage()->GetGridFrameList(this,NULL);
+ //USHORT nBufSiz=1024; // 4k Buffer = max. 512 Punkte
+ // #90353# long* pBuf = NULL;
+ USHORT nGridPaintAnz=1;
+ if (pFrames!=NULL) nGridPaintAnz=pFrames->GetCount();
+ for (USHORT nGridPaintNum=0; nGridPaintNum<nGridPaintAnz; nGridPaintNum++) {
+ if (pFrames!=NULL) {
+ const SdrPageGridFrame& rGF=(*pFrames)[nGridPaintNum];
+ nWrX=rGF.GetPaperRect().Left();
+ nWrY=rGF.GetPaperRect().Top();
+ x1=rGF.GetUserArea().Left();
+ x2=rGF.GetUserArea().Right();
+ y1=rGF.GetUserArea().Top();
+ y2=rGF.GetUserArea().Bottom();
+ aOrg=rGF.GetUserArea().TopLeft();
+ aOrg-=rGF.GetPaperRect().TopLeft();
+ }
+ if (!rRect.IsEmpty()) {
+ Size a1PixSiz(rOut.PixelToLogic(Size(1,1)));
+ long nX1Pix=a1PixSiz.Width(); // 1 Pixel Toleranz drauf
+ long nY1Pix=a1PixSiz.Height();
+ if (x1<rRect.Left() -nX1Pix) x1=rRect.Left() -nX1Pix;
+ if (x2>rRect.Right() +nX1Pix) x2=rRect.Right() +nX1Pix;
+ if (y1<rRect.Top() -nY1Pix) y1=rRect.Top() -nY1Pix;
+ if (y2>rRect.Bottom()+nY1Pix) y2=rRect.Bottom()+nY1Pix;
+ }
+ Point aPnt;
+
+ long xBigOrg=aOrg.X()+nWrX;
+ while (xBigOrg>=x1) xBigOrg-=nx1;
+ while (xBigOrg<x1) xBigOrg+=nx1;
+ long xFinOrg=xBigOrg;
+ while (xFinOrg>=x1) xFinOrg-=nx2;
+ while (xFinOrg<x1) xFinOrg+=nx2;
+
+ long yBigOrg=aOrg.Y()+nWrY;
+ while (yBigOrg>=y1) yBigOrg-=ny1;
+ while (yBigOrg<y1) yBigOrg+=ny1;
+ long yFinOrg=yBigOrg;
+ while (yFinOrg>=y1) yFinOrg-=ny2;
+ while (yFinOrg<y1) yFinOrg+=ny2;
+
+ if( x1 <= x2 && y1 <= y2 )
+ {
+ if( bHoriLines )
+ {
+ ULONG nGridFlags = ( bHoriSolid ? GRID_HORZLINES : GRID_DOTS );
+ UINT16 nSteps = sal_uInt16(nx1 / nx2);
+ UINT32 nRestPerStepMul1000 = nSteps ? ( ((nx1 * 1000L)/ nSteps) - (nx2 * 1000L) ) : 0;
+ UINT32 nStepOffset = 0;
+ UINT16 nPointOffset = 0;
+
+ for(UINT16 a=0;a<nSteps;a++)
+ {
+ // Zeichnen
+ rOut.DrawGrid(
+ Rectangle( xFinOrg + (a * nx2) + nPointOffset, yBigOrg, x2, y2 ),
+ Size( nx1, ny1 ), nGridFlags );
+
+ // Schritt machen
+ nStepOffset += nRestPerStepMul1000;
+ while(nStepOffset >= 1000)
+ {
+ nStepOffset -= 1000;
+ nPointOffset++;
+ }
+ }
+ }
+
+ if( bVertLines )
+ {
+ ULONG nGridFlags = ( bVertSolid ? GRID_VERTLINES : GRID_DOTS );
+ UINT16 nSteps = sal_uInt16(ny1 / ny2);
+ UINT32 nRestPerStepMul1000 = nSteps ? ( ((ny1 * 1000L)/ nSteps) - (ny2 * 1000L) ) : 0;
+ UINT32 nStepOffset = 0;
+ UINT16 nPointOffset = 0;
+
+ for(UINT16 a=0;a<nSteps;a++)
+ {
+ // Zeichnen
+ rOut.DrawGrid(
+ Rectangle( xBigOrg, yFinOrg + (a * ny2) + nPointOffset, x2, y2 ),
+ Size( nx1, ny1 ), nGridFlags );
+
+ // Schritt machen
+ nStepOffset += nRestPerStepMul1000;
+ while(nStepOffset >= 1000)
+ {
+ nStepOffset -= 1000;
+ nPointOffset++;
+ }
+ }
+
+ // rOut.DrawGrid( Rectangle( xo + xBigOrg, yo + yFinOrg, x2, y2 ), Size( nx1, ny2 ), nGridFlags );
+ }
+ }
+ }
+
+ rOut.EnableMapMode(bMap0);
+ rOut.SetLineColor(aColorMerk);
+ }
+}
+
+void SdrPageView::AdjHdl()
+{
+ GetView().AdjustMarkHdl();
+}
+
+void SdrPageView::SetLayer(const XubString& rName, SetOfByte& rBS, sal_Bool bJa)
+{
+ if(!GetPage())
+ return;
+
+ SdrLayerID nID = GetPage()->GetLayerAdmin().GetLayerID(rName, sal_True);
+
+ if(SDRLAYER_NOTFOUND != nID)
+ rBS.Set(nID, bJa);
+}
+
+sal_Bool SdrPageView::IsLayer(const XubString& rName, const SetOfByte& rBS) const
+{
+ if(!GetPage())
+ return sal_False;
+
+ sal_Bool bRet(sal_False);
+
+ if(rName.Len())
+ {
+ SdrLayerID nId = GetPage()->GetLayerAdmin().GetLayerID(rName, sal_True);
+
+ if(SDRLAYER_NOTFOUND != nId)
+ {
+ bRet = rBS.IsSet(nId);
+ }
+ }
+
+ return bRet;
+}
+
+void SdrPageView::SetAllLayers(SetOfByte& rB, sal_Bool bJa)
+{
+ if(bJa)
+ {
+ rB.SetAll();
+ rB.Clear(SDRLAYER_NOTFOUND);
+ }
+ else
+ {
+ rB.ClearAll();
+ }
+}
+
+sal_Bool SdrPageView::IsObjMarkable(SdrObject* pObj) const
+{
+ if(pObj)
+ {
+ // Vom Markieren ausgeschlossen?
+ if(pObj->IsMarkProtect())
+ {
+ return sal_False;
+ }
+
+ // only visible are markable
+ if( !pObj->IsVisible() )
+ {
+ return sal_False;
+ }
+
+ // #112440#
+ if(pObj->ISA(SdrObjGroup))
+ {
+ // If object is a Group object, visibility depends evtl. on
+ // multiple layers. If one object is markable, Group is markable.
+ SdrObjList* pObjList = ((SdrObjGroup*)pObj)->GetSubList();
+
+ if(pObjList && pObjList->GetObjCount())
+ {
+ sal_Bool bGroupIsMarkable(sal_False);
+
+ for(sal_uInt32 a(0L); !bGroupIsMarkable && a < pObjList->GetObjCount(); a++)
+ {
+ SdrObject* pCandidate = pObjList->GetObj(a);
+
+ // call recursively
+ if(IsObjMarkable(pCandidate))
+ {
+ bGroupIsMarkable = sal_True;
+ }
+ }
+
+ return bGroupIsMarkable;
+ }
+ else
+ {
+ // #i43302#
+ // Allow empty groups to be selected to be able to delete them
+ return sal_True;
+ }
+ }
+ else
+ {
+ // Der Layer muss sichtbar und darf nicht gesperrt sein
+ SdrLayerID nL = pObj->GetLayer();
+ return (aLayerVisi.IsSet(BYTE(nL)) && !aLayerLock.IsSet(BYTE(nL)));
+ }
+ }
+
+ return sal_False;
+}
+
+void SdrPageView::SetPageOrigin(const Point& rOrg)
+{
+ if (rOrg!=aPgOrg) {
+ aPgOrg=rOrg;
+ if (GetView().IsGridVisible()) {
+ InvalidateAllWin();
+ }
+ }
+}
+
+void SdrPageView::ImpInvalidateHelpLineArea(USHORT nNum) const
+{
+ if (GetView().IsHlplVisible() && nNum<aHelpLines.GetCount()) {
+ const SdrHelpLine& rHL=aHelpLines[nNum];
+
+ for(sal_uInt32 a(0L); a < GetView().PaintWindowCount(); a++)
+ {
+ SdrPaintWindow* pCandidate = GetView().GetPaintWindow(a);
+
+ if(pCandidate->OutputToWindow())
+ {
+ OutputDevice& rOutDev = pCandidate->GetOutputDevice();
+ Rectangle aR(rHL.GetBoundRect(rOutDev));
+ Size aSiz(rOutDev.PixelToLogic(Size(1,1)));
+ aR.Left() -= aSiz.Width();
+ aR.Right() += aSiz.Width();
+ aR.Top() -= aSiz.Height();
+ aR.Bottom() += aSiz.Height();
+ ((SdrView&)GetView()).InvalidateOneWin((Window&)rOutDev, aR);
+ }
+ }
+ }
+}
+
+void SdrPageView::SetHelpLines(const SdrHelpLineList& rHLL)
+{
+ aHelpLines=rHLL;
+ InvalidateAllWin();
+}
+
+void SdrPageView::SetHelpLine(USHORT nNum, const SdrHelpLine& rNewHelpLine)
+{
+ if (nNum<aHelpLines.GetCount() && aHelpLines[nNum]!=rNewHelpLine) {
+ FASTBOOL bNeedRedraw=TRUE;
+ if (aHelpLines[nNum].GetKind()==rNewHelpLine.GetKind()) {
+ switch (rNewHelpLine.GetKind()) {
+ case SDRHELPLINE_VERTICAL : if (aHelpLines[nNum].GetPos().X()==rNewHelpLine.GetPos().X()) bNeedRedraw=FALSE; break;
+ case SDRHELPLINE_HORIZONTAL: if (aHelpLines[nNum].GetPos().Y()==rNewHelpLine.GetPos().Y()) bNeedRedraw=FALSE; break;
+ default: break;
+ } // switch
+ }
+ if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum);
+ aHelpLines[nNum]=rNewHelpLine;
+ if (bNeedRedraw) ImpInvalidateHelpLineArea(nNum);
+ }
+}
+
+void SdrPageView::DeleteHelpLine(USHORT nNum)
+{
+ if (nNum<aHelpLines.GetCount()) {
+ ImpInvalidateHelpLineArea(nNum);
+ aHelpLines.Delete(nNum);
+ }
+}
+
+void SdrPageView::InsertHelpLine(const SdrHelpLine& rHL, USHORT nNum)
+{
+ if (nNum>aHelpLines.GetCount()) nNum=aHelpLines.GetCount();
+ aHelpLines.Insert(rHL,nNum);
+ if (GetView().IsHlplVisible()) {
+ if (GetView().IsHlplFront()) {
+ // Hier optimieren ...
+ ImpInvalidateHelpLineArea(nNum);
+ } else {
+ ImpInvalidateHelpLineArea(nNum);
+ }
+ }
+}
+
+// Betretene Gruppe und Liste setzen
+void SdrPageView::SetAktGroupAndList(SdrObject* pNewGroup, SdrObjList* pNewList)
+{
+ if(pAktGroup != pNewGroup)
+ {
+ pAktGroup = pNewGroup;
+ }
+ if(pAktList != pNewList)
+ {
+ pAktList = pNewList;
+ }
+}
+
+sal_Bool SdrPageView::EnterGroup(SdrObject* pObj)
+{
+ sal_Bool bRet(sal_False);
+
+ if(pObj && pObj->IsGroupObject())
+ {
+ sal_Bool bGlueInvalidate(GetView().ImpIsGlueVisible());
+
+ if(bGlueInvalidate)
+ {
+ GetView().GlueInvalidate();
+ }
+
+ // deselect all
+ GetView().UnmarkAll();
+
+ // set current group and list
+ SdrObjList* pNewObjList = pObj->GetSubList();
+ SetAktGroupAndList(pObj, pNewObjList);
+
+ // select contained object if only one object is contained,
+ // else select nothing and let the user decide what to do next
+ if(pNewObjList && pNewObjList->GetObjCount() == 1)
+ {
+ SdrObject* pFirstObject = pNewObjList->GetObj(0L);
+
+ if(GetView().GetSdrPageView())
+ {
+ GetView().MarkObj(pFirstObject, GetView().GetSdrPageView());
+ }
+ }
+
+ // build new handles
+ GetView().AdjustMarkHdl();
+
+ // invalidate only when view wants to visualize group entering
+ if(GetView().DoVisualizeEnteredGroup())
+ {
+ InvalidateAllWin();
+ }
+
+ if (bGlueInvalidate)
+ {
+ GetView().GlueInvalidate();
+ }
+
+ bRet = sal_True;
+ }
+
+ return bRet;
+}
+
+void SdrPageView::LeaveOneGroup()
+{
+ if(GetAktGroup())
+ {
+ BOOL bGlueInvalidate = (GetView().ImpIsGlueVisible());
+
+ if(bGlueInvalidate)
+ GetView().GlueInvalidate();
+
+ SdrObject* pLastGroup = GetAktGroup();
+ SdrObject* pParentGroup = GetAktGroup()->GetUpGroup();
+ SdrObjList* pParentList = GetPage();
+
+ if(pParentGroup)
+ pParentList = pParentGroup->GetSubList();
+
+ // Alles deselektieren
+ GetView().UnmarkAll();
+
+ // Zuweisungen, pAktGroup und pAktList muessen gesetzt sein
+ SetAktGroupAndList(pParentGroup, pParentList);
+
+ // gerade verlassene Gruppe selektieren
+ if(pLastGroup)
+ if(GetView().GetSdrPageView())
+ GetView().MarkObj(pLastGroup, GetView().GetSdrPageView());
+
+ GetView().AdjustMarkHdl();
+
+ // invalidate only when view wants to visualize group entering
+ if(GetView().DoVisualizeEnteredGroup())
+ InvalidateAllWin();
+
+ if(bGlueInvalidate)
+ GetView().GlueInvalidate();
+ }
+}
+
+void SdrPageView::LeaveAllGroup()
+{
+ if(GetAktGroup())
+ {
+ BOOL bGlueInvalidate = (GetView().ImpIsGlueVisible());
+
+ if(bGlueInvalidate)
+ GetView().GlueInvalidate();
+
+ SdrObject* pLastGroup = GetAktGroup();
+
+ // Alles deselektieren
+ GetView().UnmarkAll();
+
+ // Zuweisungen, pAktGroup und pAktList muessen gesetzt sein
+ SetAktGroupAndList(NULL, GetPage());
+
+ // Oberste letzte Gruppe finden und selektieren
+ if(pLastGroup)
+ {
+ while(pLastGroup->GetUpGroup())
+ pLastGroup = pLastGroup->GetUpGroup();
+
+ if(GetView().GetSdrPageView())
+ GetView().MarkObj(pLastGroup, GetView().GetSdrPageView());
+ }
+
+ GetView().AdjustMarkHdl();
+
+ // invalidate only when view wants to visualize group entering
+ if(GetView().DoVisualizeEnteredGroup())
+ InvalidateAllWin();
+
+ if(bGlueInvalidate)
+ GetView().GlueInvalidate();
+ }
+}
+
+USHORT SdrPageView::GetEnteredLevel() const
+{
+ USHORT nAnz=0;
+ SdrObject* pGrp=GetAktGroup();
+ while (pGrp!=NULL) {
+ nAnz++;
+ pGrp=pGrp->GetUpGroup();
+ }
+ return nAnz;
+}
+
+XubString SdrPageView::GetActualGroupName() const
+{
+ if(GetAktGroup())
+ {
+ XubString aStr(GetAktGroup()->GetName());
+
+ if(!aStr.Len())
+ aStr += sal_Unicode('?');
+
+ return aStr;
+ }
+ else
+ return String();
+}
+
+XubString SdrPageView::GetActualPathName(sal_Unicode cSep) const
+{
+ XubString aStr;
+ BOOL bNamFnd(FALSE);
+ SdrObject* pGrp = GetAktGroup();
+
+ while(pGrp)
+ {
+ XubString aStr1(pGrp->GetName());
+
+ if(!aStr1.Len())
+ aStr1 += sal_Unicode('?');
+ else
+ bNamFnd = TRUE;
+
+ aStr += aStr1;
+ pGrp = pGrp->GetUpGroup();
+
+ if(pGrp)
+ aStr += cSep;
+ }
+
+ if(!bNamFnd && GetAktGroup())
+ {
+ aStr = String();
+ aStr += sal_Unicode('(');
+ aStr += String::CreateFromInt32( GetEnteredLevel() );
+ aStr += sal_Unicode(')');
+ }
+
+ return aStr;
+}
+
+void SdrPageView::CheckAktGroup()
+{
+ SdrObject* pGrp=GetAktGroup();
+ while (pGrp!=NULL &&
+ (!pGrp->IsInserted() || pGrp->GetObjList()==NULL ||
+ pGrp->GetPage()==NULL || pGrp->GetModel()==NULL)) { // irgendwas daneben?
+ pGrp=pGrp->GetUpGroup();
+ }
+ if (pGrp!=GetAktGroup()) {
+ if (pGrp!=NULL) EnterGroup(pGrp);
+ else LeaveAllGroup();
+ }
+}
+
+// #103834# Set background color for svx at SdrPageViews
+void SdrPageView::SetApplicationBackgroundColor(Color aBackgroundColor)
+{
+ maBackgroundColor = aBackgroundColor;
+}
+
+// #109585#
+Color SdrPageView::GetApplicationBackgroundColor() const
+{
+ return maBackgroundColor;
+}
+
+// #103911# Set document color for svx at SdrPageViews
+void SdrPageView::SetApplicationDocumentColor(Color aDocumentColor)
+{
+ maDocumentColor = aDocumentColor;
+}
+
+Color SdrPageView::GetApplicationDocumentColor() const
+{
+ return maDocumentColor;
+}
+
+////////////////////////////////////////////////////////////////////////////////////////////////////
+// eof