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