1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski #include <svx/sdrpagewindow.hxx>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XWindow.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/beans/XPropertySet.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/PosSize.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/util/XModeChangeBroadcaster.hpp>
31*b1cdbd2cSJim Jagielski #include <comphelper/processfactory.hxx>
32*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
33*b1cdbd2cSJim Jagielski #include <toolkit/helper/vclunohelper.hxx>
34*b1cdbd2cSJim Jagielski #include <svx/svdouno.hxx>
35*b1cdbd2cSJim Jagielski #include <svx/svdpage.hxx>
36*b1cdbd2cSJim Jagielski #include <svx/svdview.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/svdpagv.hxx>
38*b1cdbd2cSJim Jagielski #include <svx/sdrpaintwindow.hxx>
39*b1cdbd2cSJim Jagielski #include <svx/sdr/contact/objectcontactofpageview.hxx>
40*b1cdbd2cSJim Jagielski #include <svx/sdr/contact/displayinfo.hxx>
41*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
42*b1cdbd2cSJim Jagielski #include <svx/fmview.hxx>
43*b1cdbd2cSJim Jagielski #include <basegfx/matrix/b2dhommatrix.hxx>
44*b1cdbd2cSJim Jagielski 
45*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski using namespace ::rtl;
48*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
51*b1cdbd2cSJim Jagielski 
GetControlContainer(bool _bCreateIfNecessary) const52*b1cdbd2cSJim Jagielski ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlContainer > SdrPageWindow::GetControlContainer( bool _bCreateIfNecessary ) const
53*b1cdbd2cSJim Jagielski {
54*b1cdbd2cSJim Jagielski     if ( !mxControlContainer.is() && _bCreateIfNecessary )
55*b1cdbd2cSJim Jagielski 	{
56*b1cdbd2cSJim Jagielski 		SdrView& rView = GetPageView().GetView();
57*b1cdbd2cSJim Jagielski 
58*b1cdbd2cSJim Jagielski         const SdrPaintWindow& rPaintWindow( GetOriginalPaintWindow() ? *GetOriginalPaintWindow() : GetPaintWindow() );
59*b1cdbd2cSJim Jagielski 		if ( rPaintWindow.OutputToWindow() && !rView.IsPrintPreview() )
60*b1cdbd2cSJim Jagielski 		{
61*b1cdbd2cSJim Jagielski 			Window& rWindow = dynamic_cast< Window& >( rPaintWindow.GetOutputDevice() );
62*b1cdbd2cSJim Jagielski             const_cast< SdrPageWindow* >( this )->mxControlContainer = VCLUnoHelper::CreateControlContainer( &rWindow );
63*b1cdbd2cSJim Jagielski 
64*b1cdbd2cSJim Jagielski 			// #100394# xC->setVisible triggers window->Show() and this has
65*b1cdbd2cSJim Jagielski 			// problems when the view is not completely constructed which may
66*b1cdbd2cSJim Jagielski 			// happen when loading. This leads to accessibility broadcasts which
67*b1cdbd2cSJim Jagielski 			// throw asserts due to the not finished view. All this chan be avoided
68*b1cdbd2cSJim Jagielski 			// since xC->setVisible is here called only for the side effect in
69*b1cdbd2cSJim Jagielski 			// UnoControlContainer::setVisible(...) which calls createPeer(...).
70*b1cdbd2cSJim Jagielski 			// This will now be called directly from here.
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski 			// UnoContainerModel erzeugen
73*b1cdbd2cSJim Jagielski 			// uno::Reference< awt::XWindow > xC(mxControlContainer, uno::UNO_QUERY);
74*b1cdbd2cSJim Jagielski 			// CreateControlContainer() is only used from
75*b1cdbd2cSJim Jagielski 			// , thus it seems not necessary to make
76*b1cdbd2cSJim Jagielski 			// it visible her at all.
77*b1cdbd2cSJim Jagielski 			// #58917# Das Show darf nicht am VCL-Fenster landen, weil dann Assertion vom SFX
78*b1cdbd2cSJim Jagielski 			// sal_Bool bVis = pWindow->IsVisible();
79*b1cdbd2cSJim Jagielski 			// xC->setVisible(sal_True);
80*b1cdbd2cSJim Jagielski 			// if ( !bVis )
81*b1cdbd2cSJim Jagielski 			// 	pWindow->Hide();
82*b1cdbd2cSJim Jagielski 			//	if( !mxContext.is() && bVisible )
83*b1cdbd2cSJim Jagielski 			//		// Es ist ein TopWindow, also automatisch anzeigen
84*b1cdbd2cSJim Jagielski 			//		createPeer( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > (), ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > () );
85*b1cdbd2cSJim Jagielski 
86*b1cdbd2cSJim Jagielski 			uno::Reference< awt::XControl > xControl(mxControlContainer, uno::UNO_QUERY);
87*b1cdbd2cSJim Jagielski 			if(xControl.is())
88*b1cdbd2cSJim Jagielski 			{
89*b1cdbd2cSJim Jagielski 				uno::Reference< uno::XInterface > xContext = xControl->getContext();
90*b1cdbd2cSJim Jagielski 				if(!xContext.is())
91*b1cdbd2cSJim Jagielski 				{
92*b1cdbd2cSJim Jagielski 					xControl->createPeer( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit > (),
93*b1cdbd2cSJim Jagielski 						::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > () );
94*b1cdbd2cSJim Jagielski 				}
95*b1cdbd2cSJim Jagielski 			}
96*b1cdbd2cSJim Jagielski 		}
97*b1cdbd2cSJim Jagielski 		else
98*b1cdbd2cSJim Jagielski 		{
99*b1cdbd2cSJim Jagielski 			// Printer und VirtualDevice, bzw. kein OutDev
100*b1cdbd2cSJim Jagielski 			uno::Reference< lang::XMultiServiceFactory > xFactory( ::comphelper::getProcessServiceFactory() );
101*b1cdbd2cSJim Jagielski 			if( xFactory.is() )
102*b1cdbd2cSJim Jagielski 			{
103*b1cdbd2cSJim Jagielski                 const_cast< SdrPageWindow* >( this )->mxControlContainer = uno::Reference< awt::XControlContainer >(xFactory->createInstance(rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlContainer")), uno::UNO_QUERY);
104*b1cdbd2cSJim Jagielski 				uno::Reference< awt::XControlModel > xModel(xFactory->createInstance(rtl::OUString::createFromAscii("com.sun.star.awt.UnoControlContainerModel")), uno::UNO_QUERY);
105*b1cdbd2cSJim Jagielski 				uno::Reference< awt::XControl > xControl(mxControlContainer, uno::UNO_QUERY);
106*b1cdbd2cSJim Jagielski 				if (xControl.is())
107*b1cdbd2cSJim Jagielski 					xControl->setModel(xModel);
108*b1cdbd2cSJim Jagielski 
109*b1cdbd2cSJim Jagielski 				OutputDevice& rOutDev = rPaintWindow.GetOutputDevice();
110*b1cdbd2cSJim Jagielski 				Point aPosPix = rOutDev.GetMapMode().GetOrigin();
111*b1cdbd2cSJim Jagielski 				Size aSizePix = rOutDev.GetOutputSizePixel();
112*b1cdbd2cSJim Jagielski 
113*b1cdbd2cSJim Jagielski 				uno::Reference< awt::XWindow > xContComp(mxControlContainer, uno::UNO_QUERY);
114*b1cdbd2cSJim Jagielski 				if( xContComp.is() )
115*b1cdbd2cSJim Jagielski 					xContComp->setPosSize(aPosPix.X(), aPosPix.Y(), aSizePix.Width(), aSizePix.Height(), awt::PosSize::POSSIZE);
116*b1cdbd2cSJim Jagielski 			}
117*b1cdbd2cSJim Jagielski 		}
118*b1cdbd2cSJim Jagielski 
119*b1cdbd2cSJim Jagielski         FmFormView* pViewAsFormView = dynamic_cast< FmFormView* >( &rView );
120*b1cdbd2cSJim Jagielski         if ( pViewAsFormView )
121*b1cdbd2cSJim Jagielski 		    pViewAsFormView->InsertControlContainer(mxControlContainer);
122*b1cdbd2cSJim Jagielski 	}
123*b1cdbd2cSJim Jagielski     return mxControlContainer;
124*b1cdbd2cSJim Jagielski }
125*b1cdbd2cSJim Jagielski 
SdrPageWindow(SdrPageView & rPageView,SdrPaintWindow & rPaintWindow)126*b1cdbd2cSJim Jagielski SdrPageWindow::SdrPageWindow(SdrPageView& rPageView, SdrPaintWindow& rPaintWindow)
127*b1cdbd2cSJim Jagielski :	mpObjectContact(0L),
128*b1cdbd2cSJim Jagielski 	mrPageView(rPageView),
129*b1cdbd2cSJim Jagielski 	mpPaintWindow(&rPaintWindow),
130*b1cdbd2cSJim Jagielski     mpOriginalPaintWindow(NULL)
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski }
133*b1cdbd2cSJim Jagielski 
~SdrPageWindow()134*b1cdbd2cSJim Jagielski SdrPageWindow::~SdrPageWindow()
135*b1cdbd2cSJim Jagielski {
136*b1cdbd2cSJim Jagielski 	// #110094#, #i26631#
137*b1cdbd2cSJim Jagielski 	ResetObjectContact();
138*b1cdbd2cSJim Jagielski 
139*b1cdbd2cSJim Jagielski 	if (mxControlContainer.is())
140*b1cdbd2cSJim Jagielski 	{
141*b1cdbd2cSJim Jagielski 		SdrView& rView = GetPageView().GetView();
142*b1cdbd2cSJim Jagielski 
143*b1cdbd2cSJim Jagielski 		// notify derived views
144*b1cdbd2cSJim Jagielski         FmFormView* pViewAsFormView = dynamic_cast< FmFormView* >( &rView );
145*b1cdbd2cSJim Jagielski         if ( pViewAsFormView )
146*b1cdbd2cSJim Jagielski 		    pViewAsFormView->RemoveControlContainer(mxControlContainer);
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 		// dispose the control container
149*b1cdbd2cSJim Jagielski 		uno::Reference< lang::XComponent > xComponent(mxControlContainer, uno::UNO_QUERY);
150*b1cdbd2cSJim Jagielski 		xComponent->dispose();
151*b1cdbd2cSJim Jagielski 	}
152*b1cdbd2cSJim Jagielski }
153*b1cdbd2cSJim Jagielski 
154*b1cdbd2cSJim Jagielski // #110094# ObjectContact section
CreateViewSpecificObjectContact()155*b1cdbd2cSJim Jagielski sdr::contact::ObjectContact* SdrPageWindow::CreateViewSpecificObjectContact()
156*b1cdbd2cSJim Jagielski {
157*b1cdbd2cSJim Jagielski 	return new sdr::contact::ObjectContactOfPageView(*this);
158*b1cdbd2cSJim Jagielski }
159*b1cdbd2cSJim Jagielski 
160*b1cdbd2cSJim Jagielski // OVERLAYMANAGER
GetOverlayManager() const161*b1cdbd2cSJim Jagielski ::sdr::overlay::OverlayManager* SdrPageWindow::GetOverlayManager() const
162*b1cdbd2cSJim Jagielski {
163*b1cdbd2cSJim Jagielski 	return GetPaintWindow().GetOverlayManager();
164*b1cdbd2cSJim Jagielski }
165*b1cdbd2cSJim Jagielski 
patchPaintWindow(SdrPaintWindow & rPaintWindow)166*b1cdbd2cSJim Jagielski void SdrPageWindow::patchPaintWindow(SdrPaintWindow& rPaintWindow)
167*b1cdbd2cSJim Jagielski {
168*b1cdbd2cSJim Jagielski     mpOriginalPaintWindow = mpPaintWindow;
169*b1cdbd2cSJim Jagielski     mpPaintWindow = &rPaintWindow;
170*b1cdbd2cSJim Jagielski }
171*b1cdbd2cSJim Jagielski 
unpatchPaintWindow()172*b1cdbd2cSJim Jagielski void SdrPageWindow::unpatchPaintWindow()
173*b1cdbd2cSJim Jagielski {
174*b1cdbd2cSJim Jagielski     DBG_ASSERT(mpOriginalPaintWindow, "SdrPageWindow::unpatchPaintWindow: paint window not patched!" );
175*b1cdbd2cSJim Jagielski     if ( mpOriginalPaintWindow )
176*b1cdbd2cSJim Jagielski     {
177*b1cdbd2cSJim Jagielski         mpPaintWindow = mpOriginalPaintWindow;
178*b1cdbd2cSJim Jagielski         mpOriginalPaintWindow = NULL;
179*b1cdbd2cSJim Jagielski     }
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski 
PrePaint()182*b1cdbd2cSJim Jagielski void SdrPageWindow::PrePaint()
183*b1cdbd2cSJim Jagielski {
184*b1cdbd2cSJim Jagielski 	// give OC the chance to do ProcessDisplay preparations
185*b1cdbd2cSJim Jagielski 	if(HasObjectContact())
186*b1cdbd2cSJim Jagielski 	{
187*b1cdbd2cSJim Jagielski 		GetObjectContact().PrepareProcessDisplay();
188*b1cdbd2cSJim Jagielski 	}
189*b1cdbd2cSJim Jagielski }
190*b1cdbd2cSJim Jagielski 
PostPaint()191*b1cdbd2cSJim Jagielski void SdrPageWindow::PostPaint()
192*b1cdbd2cSJim Jagielski {
193*b1cdbd2cSJim Jagielski }
194*b1cdbd2cSJim Jagielski 
PrepareRedraw(const Region & rReg)195*b1cdbd2cSJim Jagielski void SdrPageWindow::PrepareRedraw(const Region& rReg)
196*b1cdbd2cSJim Jagielski {
197*b1cdbd2cSJim Jagielski 	// evtl. give OC the chance to do ProcessDisplay preparations
198*b1cdbd2cSJim Jagielski 	if(HasObjectContact())
199*b1cdbd2cSJim Jagielski 	{
200*b1cdbd2cSJim Jagielski 		GetObjectContact().PrepareProcessDisplay();
201*b1cdbd2cSJim Jagielski 	}
202*b1cdbd2cSJim Jagielski 
203*b1cdbd2cSJim Jagielski 	// remember eventually changed RedrawArea at PaintWindow for usage with
204*b1cdbd2cSJim Jagielski 	// overlay and PreRenderDevice stuff
205*b1cdbd2cSJim Jagielski 	GetPaintWindow().SetRedrawRegion(rReg);
206*b1cdbd2cSJim Jagielski }
207*b1cdbd2cSJim Jagielski 
208*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
209*b1cdbd2cSJim Jagielski // clip test
210*b1cdbd2cSJim Jagielski #ifdef CLIPPER_TEST
211*b1cdbd2cSJim Jagielski #include <svx/svdopath.hxx>
212*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygon.hxx>
213*b1cdbd2cSJim Jagielski #include <vcl/salbtype.hxx>		// FRound
214*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygoncutandtouch.hxx>
215*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolypolygontools.hxx>
216*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygontools.hxx>
217*b1cdbd2cSJim Jagielski #include <basegfx/polygon/b2dpolygonclipper.hxx>
218*b1cdbd2cSJim Jagielski 
219*b1cdbd2cSJim Jagielski // for ::std::sort
220*b1cdbd2cSJim Jagielski #include <algorithm>
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski namespace
223*b1cdbd2cSJim Jagielski {
impPaintStrokePolygon(const basegfx::B2DPolygon & rCandidate,OutputDevice & rOutDev,Color aColor)224*b1cdbd2cSJim Jagielski 	void impPaintStrokePolygon(const basegfx::B2DPolygon& rCandidate, OutputDevice& rOutDev, Color aColor)
225*b1cdbd2cSJim Jagielski 	{
226*b1cdbd2cSJim Jagielski 		basegfx::B2DPolygon aCandidate(rCandidate);
227*b1cdbd2cSJim Jagielski 
228*b1cdbd2cSJim Jagielski 		if(aCandidate.areControlPointsUsed())
229*b1cdbd2cSJim Jagielski 		{
230*b1cdbd2cSJim Jagielski 			aCandidate = basegfx::tools::adaptiveSubdivideByAngle(rCandidate);
231*b1cdbd2cSJim Jagielski 		}
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski 		if(aCandidate.count())
234*b1cdbd2cSJim Jagielski 		{
235*b1cdbd2cSJim Jagielski 			const sal_uInt32 nLoopCount(aCandidate.isClosed() ? aCandidate.count() : aCandidate.count() - 1L);
236*b1cdbd2cSJim Jagielski 			rOutDev.SetFillColor();
237*b1cdbd2cSJim Jagielski 			rOutDev.SetLineColor(aColor);
238*b1cdbd2cSJim Jagielski 
239*b1cdbd2cSJim Jagielski 			for(sal_uInt32 a(0L); a < nLoopCount; a++)
240*b1cdbd2cSJim Jagielski 			{
241*b1cdbd2cSJim Jagielski 				const basegfx::B2DPoint aBStart(aCandidate.getB2DPoint(a));
242*b1cdbd2cSJim Jagielski 				const basegfx::B2DPoint aBEnd(aCandidate.getB2DPoint((a + 1) % aCandidate.count()));
243*b1cdbd2cSJim Jagielski 				const Point aStart(FRound(aBStart.getX()), FRound(aBStart.getY()));
244*b1cdbd2cSJim Jagielski 				const Point aEnd(FRound(aBEnd.getX()), FRound(aBEnd.getY()));
245*b1cdbd2cSJim Jagielski 				rOutDev.DrawLine(aStart, aEnd);
246*b1cdbd2cSJim Jagielski 			}
247*b1cdbd2cSJim Jagielski 		}
248*b1cdbd2cSJim Jagielski 	}
249*b1cdbd2cSJim Jagielski 
impTryTest(const SdrPageView & rPageView,OutputDevice & rOutDev)250*b1cdbd2cSJim Jagielski 	void impTryTest(const SdrPageView& rPageView, OutputDevice& rOutDev)
251*b1cdbd2cSJim Jagielski 	{
252*b1cdbd2cSJim Jagielski 		if(rPageView.GetPage() && rPageView.GetPage()->GetObjCount() >= 2L)
253*b1cdbd2cSJim Jagielski 		{
254*b1cdbd2cSJim Jagielski 			SdrPage* pPage = rPageView.GetPage();
255*b1cdbd2cSJim Jagielski 			SdrObject* pObjA = pPage->GetObj(0L);
256*b1cdbd2cSJim Jagielski 
257*b1cdbd2cSJim Jagielski 			if(pObjA && pObjA->ISA(SdrPathObj))
258*b1cdbd2cSJim Jagielski 			{
259*b1cdbd2cSJim Jagielski 				basegfx::B2DPolyPolygon aPolyA(((SdrPathObj*)pObjA)->GetPathPoly());
260*b1cdbd2cSJim Jagielski 				aPolyA = basegfx::tools::correctOrientations(aPolyA);
261*b1cdbd2cSJim Jagielski 
262*b1cdbd2cSJim Jagielski 				basegfx::B2DPolyPolygon aPolyB;
263*b1cdbd2cSJim Jagielski 
264*b1cdbd2cSJim Jagielski 				for(sal_uInt32 a(1L); a < rPageView.GetPage()->GetObjCount(); a++)
265*b1cdbd2cSJim Jagielski 				{
266*b1cdbd2cSJim Jagielski 					SdrObject* pObjB = pPage->GetObj(a);
267*b1cdbd2cSJim Jagielski 
268*b1cdbd2cSJim Jagielski 					if(pObjB && pObjB->ISA(SdrPathObj))
269*b1cdbd2cSJim Jagielski 					{
270*b1cdbd2cSJim Jagielski 						basegfx::B2DPolyPolygon aCandidate(((SdrPathObj*)pObjB)->GetPathPoly());
271*b1cdbd2cSJim Jagielski 						aCandidate = basegfx::tools::correctOrientations(aCandidate);
272*b1cdbd2cSJim Jagielski 						aPolyB.append(aCandidate);
273*b1cdbd2cSJim Jagielski 					}
274*b1cdbd2cSJim Jagielski 				}
275*b1cdbd2cSJim Jagielski 
276*b1cdbd2cSJim Jagielski 				if(aPolyA.count() && aPolyA.isClosed() && aPolyB.count())
277*b1cdbd2cSJim Jagielski 				{
278*b1cdbd2cSJim Jagielski 					// poly A is the clipregion, clip poly b against it. Algo depends on
279*b1cdbd2cSJim Jagielski 					// poly b being closed.
280*b1cdbd2cSJim Jagielski 					basegfx::B2DPolyPolygon aResult(basegfx::tools::clipPolyPolygonOnPolyPolygon(aPolyB, aPolyA));
281*b1cdbd2cSJim Jagielski 
282*b1cdbd2cSJim Jagielski 					for(sal_uInt32 a(0L); a < aResult.count(); a++)
283*b1cdbd2cSJim Jagielski 					{
284*b1cdbd2cSJim Jagielski 						Color aColor(rand()%255, rand()%255, rand()%255);
285*b1cdbd2cSJim Jagielski 						impPaintStrokePolygon(aResult.getB2DPolygon(a), rOutDev, aColor);
286*b1cdbd2cSJim Jagielski 					}
287*b1cdbd2cSJim Jagielski 
288*b1cdbd2cSJim Jagielski 					bool bBla = true;
289*b1cdbd2cSJim Jagielski 				}
290*b1cdbd2cSJim Jagielski 			}
291*b1cdbd2cSJim Jagielski 		}
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski } // end of anonymous namespace
294*b1cdbd2cSJim Jagielski #endif // CLIPPER_TEST
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski //////////////////////////////////////////////////////////////////////////////
297*b1cdbd2cSJim Jagielski 
RedrawAll(sdr::contact::ViewObjectContactRedirector * pRedirector) const298*b1cdbd2cSJim Jagielski void SdrPageWindow::RedrawAll(sdr::contact::ViewObjectContactRedirector* pRedirector) const
299*b1cdbd2cSJim Jagielski {
300*b1cdbd2cSJim Jagielski 	// set Redirector
301*b1cdbd2cSJim Jagielski 	GetObjectContact().SetViewObjectContactRedirector(pRedirector);
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 	// set PaintingPageView
304*b1cdbd2cSJim Jagielski 	const SdrView& rView = mrPageView.GetView();
305*b1cdbd2cSJim Jagielski 	SdrModel& rModel = *((SdrModel*)rView.GetModel());
306*b1cdbd2cSJim Jagielski 
307*b1cdbd2cSJim Jagielski 	// get to be processed layers
308*b1cdbd2cSJim Jagielski 	const sal_Bool bPrinter(GetPaintWindow().OutputToPrinter());
309*b1cdbd2cSJim Jagielski 	SetOfByte aProcessLayers = bPrinter ? mrPageView.GetPrintableLayers() : mrPageView.GetVisibleLayers();
310*b1cdbd2cSJim Jagielski 
311*b1cdbd2cSJim Jagielski 	// create PaintInfoRec, #114359# use Rectangle only temporarily
312*b1cdbd2cSJim Jagielski 	const Region& rRegion = GetPaintWindow().GetRedrawRegion();
313*b1cdbd2cSJim Jagielski 
314*b1cdbd2cSJim Jagielski 	// create processing data
315*b1cdbd2cSJim Jagielski 	sdr::contact::DisplayInfo aDisplayInfo;
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski 	// Draw all layers. do NOT draw form layer from CompleteRedraw, this is done separate
318*b1cdbd2cSJim Jagielski 	// as a single layer paint
319*b1cdbd2cSJim Jagielski 	const SdrLayerAdmin& rLayerAdmin = rModel.GetLayerAdmin();
320*b1cdbd2cSJim Jagielski 	const SdrLayerID nControlLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName(), sal_False);
321*b1cdbd2cSJim Jagielski 	aProcessLayers.Clear(nControlLayerId);
322*b1cdbd2cSJim Jagielski 
323*b1cdbd2cSJim Jagielski 	// still something to paint?
324*b1cdbd2cSJim Jagielski 	if(!aProcessLayers.IsEmpty())
325*b1cdbd2cSJim Jagielski 	{
326*b1cdbd2cSJim Jagielski 		aDisplayInfo.SetProcessLayers(aProcessLayers);
327*b1cdbd2cSJim Jagielski 
328*b1cdbd2cSJim Jagielski 		// Set region as redraw area
329*b1cdbd2cSJim Jagielski 		aDisplayInfo.SetRedrawArea(rRegion);
330*b1cdbd2cSJim Jagielski 
331*b1cdbd2cSJim Jagielski 		// Draw/Impress
332*b1cdbd2cSJim Jagielski 		aDisplayInfo.SetPageProcessingActive(rView.IsPagePaintingAllowed()); // #i72889#
333*b1cdbd2cSJim Jagielski 
334*b1cdbd2cSJim Jagielski 		// paint page
335*b1cdbd2cSJim Jagielski 		GetObjectContact().ProcessDisplay(aDisplayInfo);
336*b1cdbd2cSJim Jagielski 	}
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski 	// reset redirector
339*b1cdbd2cSJim Jagielski 	GetObjectContact().SetViewObjectContactRedirector(0L);
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski 	// LineClip test
342*b1cdbd2cSJim Jagielski #ifdef CLIPPER_TEST
343*b1cdbd2cSJim Jagielski 	if(true)
344*b1cdbd2cSJim Jagielski 	{
345*b1cdbd2cSJim Jagielski 		impTryTest(GetPageView(), GetPaintWindow().GetOutputDevice());
346*b1cdbd2cSJim Jagielski 	}
347*b1cdbd2cSJim Jagielski #endif // CLIPPER_TEST
348*b1cdbd2cSJim Jagielski }
349*b1cdbd2cSJim Jagielski 
RedrawLayer(const SdrLayerID * pId,sdr::contact::ViewObjectContactRedirector * pRedirector) const350*b1cdbd2cSJim Jagielski void SdrPageWindow::RedrawLayer(const SdrLayerID* pId, sdr::contact::ViewObjectContactRedirector* pRedirector) const
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski 	// set redirector
353*b1cdbd2cSJim Jagielski 	GetObjectContact().SetViewObjectContactRedirector(pRedirector);
354*b1cdbd2cSJim Jagielski 
355*b1cdbd2cSJim Jagielski 	// set PaintingPageView
356*b1cdbd2cSJim Jagielski 	const SdrView& rView = mrPageView.GetView();
357*b1cdbd2cSJim Jagielski 	SdrModel& rModel = *((SdrModel*)rView.GetModel());
358*b1cdbd2cSJim Jagielski 
359*b1cdbd2cSJim Jagielski 	// get the layers to process
360*b1cdbd2cSJim Jagielski 	const sal_Bool bPrinter(GetPaintWindow().OutputToPrinter());
361*b1cdbd2cSJim Jagielski 	SetOfByte aProcessLayers = bPrinter ? mrPageView.GetPrintableLayers() : mrPageView.GetVisibleLayers();
362*b1cdbd2cSJim Jagielski 
363*b1cdbd2cSJim Jagielski 	// is the given layer visible at all?
364*b1cdbd2cSJim Jagielski 	if(aProcessLayers.IsSet(*pId))
365*b1cdbd2cSJim Jagielski 	{
366*b1cdbd2cSJim Jagielski 		// find out if we are painting the ControlLayer
367*b1cdbd2cSJim Jagielski 		const SdrLayerAdmin& rLayerAdmin = rModel.GetLayerAdmin();
368*b1cdbd2cSJim Jagielski 		const SdrLayerID nControlLayerId = rLayerAdmin.GetLayerID(rLayerAdmin.GetControlLayerName(), sal_False);
369*b1cdbd2cSJim Jagielski 		const sal_Bool bControlLayerProcessingActive(pId && nControlLayerId == *pId);
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski 		// create PaintInfoRec, use Rectangle only temporarily
372*b1cdbd2cSJim Jagielski 		const Region& rRegion = GetPaintWindow().GetRedrawRegion();
373*b1cdbd2cSJim Jagielski 
374*b1cdbd2cSJim Jagielski 		// create processing data
375*b1cdbd2cSJim Jagielski 		sdr::contact::DisplayInfo aDisplayInfo;
376*b1cdbd2cSJim Jagielski 
377*b1cdbd2cSJim Jagielski 		// is it the control layer? If Yes, set flag
378*b1cdbd2cSJim Jagielski 		aDisplayInfo.SetControlLayerProcessingActive(bControlLayerProcessingActive);
379*b1cdbd2cSJim Jagielski 
380*b1cdbd2cSJim Jagielski 		// Draw just the one given layer
381*b1cdbd2cSJim Jagielski 		aProcessLayers.ClearAll();
382*b1cdbd2cSJim Jagielski 		aProcessLayers.Set(*pId);
383*b1cdbd2cSJim Jagielski 
384*b1cdbd2cSJim Jagielski 		aDisplayInfo.SetProcessLayers(aProcessLayers);
385*b1cdbd2cSJim Jagielski 
386*b1cdbd2cSJim Jagielski 		// Set region as redraw area
387*b1cdbd2cSJim Jagielski 		aDisplayInfo.SetRedrawArea(rRegion);
388*b1cdbd2cSJim Jagielski 
389*b1cdbd2cSJim Jagielski 		// Writer or calc, coming from original RedrawOneLayer.
390*b1cdbd2cSJim Jagielski         // #i72889# no page painting for layer painting
391*b1cdbd2cSJim Jagielski 		aDisplayInfo.SetPageProcessingActive(false);
392*b1cdbd2cSJim Jagielski 
393*b1cdbd2cSJim Jagielski 		// paint page
394*b1cdbd2cSJim Jagielski 		GetObjectContact().ProcessDisplay(aDisplayInfo);
395*b1cdbd2cSJim Jagielski 	}
396*b1cdbd2cSJim Jagielski 
397*b1cdbd2cSJim Jagielski 	// reset redirector
398*b1cdbd2cSJim Jagielski 	GetObjectContact().SetViewObjectContactRedirector(0L);
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski 
401*b1cdbd2cSJim Jagielski // Invalidate call, used from ObjectContact(OfPageView) in InvalidatePartOfView(...)
InvalidatePageWindow(const basegfx::B2DRange & rRange)402*b1cdbd2cSJim Jagielski void SdrPageWindow::InvalidatePageWindow(const basegfx::B2DRange& rRange)
403*b1cdbd2cSJim Jagielski {
404*b1cdbd2cSJim Jagielski 	if(GetPageView().IsVisible() && GetPaintWindow().OutputToWindow())
405*b1cdbd2cSJim Jagielski 	{
406*b1cdbd2cSJim Jagielski         const SvtOptionsDrawinglayer aDrawinglayerOpt;
407*b1cdbd2cSJim Jagielski         Window& rWindow(static_cast< Window& >(GetPaintWindow().GetOutputDevice()));
408*b1cdbd2cSJim Jagielski         basegfx::B2DRange aDiscreteRange(rRange);
409*b1cdbd2cSJim Jagielski         aDiscreteRange.transform(rWindow.GetViewTransformation());
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski         if(aDrawinglayerOpt.IsAntiAliasing())
412*b1cdbd2cSJim Jagielski         {
413*b1cdbd2cSJim Jagielski             // invalidate one discrete unit more under the assumption that AA
414*b1cdbd2cSJim Jagielski             // needs one pixel more
415*b1cdbd2cSJim Jagielski             aDiscreteRange.grow(1.0);
416*b1cdbd2cSJim Jagielski         }
417*b1cdbd2cSJim Jagielski 
418*b1cdbd2cSJim Jagielski 		const Rectangle aVCLDiscreteRectangle(
419*b1cdbd2cSJim Jagielski 				(sal_Int32)floor(aDiscreteRange.getMinX()), (sal_Int32)floor(aDiscreteRange.getMinY()),
420*b1cdbd2cSJim Jagielski 				(sal_Int32)ceil(aDiscreteRange.getMaxX()), (sal_Int32)ceil(aDiscreteRange.getMaxY()));
421*b1cdbd2cSJim Jagielski         const bool bWasMapModeEnabled(rWindow.IsMapModeEnabled());
422*b1cdbd2cSJim Jagielski 
423*b1cdbd2cSJim Jagielski         rWindow.EnableMapMode(false);
424*b1cdbd2cSJim Jagielski 		rWindow.Invalidate(aVCLDiscreteRectangle, INVALIDATE_NOERASE);
425*b1cdbd2cSJim Jagielski         rWindow.EnableMapMode(bWasMapModeEnabled);
426*b1cdbd2cSJim Jagielski 	}
427*b1cdbd2cSJim Jagielski }
428*b1cdbd2cSJim Jagielski 
429*b1cdbd2cSJim Jagielski // #110094# ObjectContact section
GetObjectContact() const430*b1cdbd2cSJim Jagielski sdr::contact::ObjectContact& SdrPageWindow::GetObjectContact() const
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski 	if(!mpObjectContact)
433*b1cdbd2cSJim Jagielski 	{
434*b1cdbd2cSJim Jagielski 		((SdrPageWindow*)this)->mpObjectContact = ((SdrPageWindow*)this)->CreateViewSpecificObjectContact();
435*b1cdbd2cSJim Jagielski 	}
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 	return *mpObjectContact;
438*b1cdbd2cSJim Jagielski }
439*b1cdbd2cSJim Jagielski 
HasObjectContact() const440*b1cdbd2cSJim Jagielski bool SdrPageWindow::HasObjectContact() const
441*b1cdbd2cSJim Jagielski {
442*b1cdbd2cSJim Jagielski     return ( mpObjectContact != NULL );
443*b1cdbd2cSJim Jagielski }
444*b1cdbd2cSJim Jagielski 
445*b1cdbd2cSJim Jagielski // #i26631#
ResetObjectContact()446*b1cdbd2cSJim Jagielski void SdrPageWindow::ResetObjectContact()
447*b1cdbd2cSJim Jagielski {
448*b1cdbd2cSJim Jagielski 	if(mpObjectContact)
449*b1cdbd2cSJim Jagielski 	{
450*b1cdbd2cSJim Jagielski 		delete mpObjectContact;
451*b1cdbd2cSJim Jagielski 		mpObjectContact = 0L;
452*b1cdbd2cSJim Jagielski 	}
453*b1cdbd2cSJim Jagielski }
454*b1cdbd2cSJim Jagielski 
SetDesignMode(bool _bDesignMode) const455*b1cdbd2cSJim Jagielski void SdrPageWindow::SetDesignMode( bool _bDesignMode ) const
456*b1cdbd2cSJim Jagielski {
457*b1cdbd2cSJim Jagielski     const ::sdr::contact::ObjectContactOfPageView* pOC = dynamic_cast< const ::sdr::contact::ObjectContactOfPageView* >( &GetObjectContact() );
458*b1cdbd2cSJim Jagielski     DBG_ASSERT( pOC, "SdrPageWindow::SetDesignMode: invalid object contact!" );
459*b1cdbd2cSJim Jagielski     if ( pOC )
460*b1cdbd2cSJim Jagielski         pOC->SetUNOControlsDesignMode( _bDesignMode );
461*b1cdbd2cSJim Jagielski }
462*b1cdbd2cSJim Jagielski 
463*b1cdbd2cSJim Jagielski ////////////////////////////////////////////////////////////////////////////////////////////////////
464*b1cdbd2cSJim Jagielski // eof
465