1*f6e50924SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*f6e50924SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*f6e50924SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*f6e50924SAndrew Rist * distributed with this work for additional information
6*f6e50924SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*f6e50924SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*f6e50924SAndrew Rist * "License"); you may not use this file except in compliance
9*f6e50924SAndrew Rist * with the License. You may obtain a copy of the License at
10*f6e50924SAndrew Rist *
11*f6e50924SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*f6e50924SAndrew Rist *
13*f6e50924SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*f6e50924SAndrew Rist * software distributed under the License is distributed on an
15*f6e50924SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*f6e50924SAndrew Rist * KIND, either express or implied. See the License for the
17*f6e50924SAndrew Rist * specific language governing permissions and limitations
18*f6e50924SAndrew Rist * under the License.
19*f6e50924SAndrew Rist *
20*f6e50924SAndrew Rist *************************************************************/
21*f6e50924SAndrew Rist
22*f6e50924SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_svx.hxx"
26cdf0e10cSrcweir #include <svx/xoutbmp.hxx>
27cdf0e10cSrcweir #include <svx/dialogs.hrc>
28cdf0e10cSrcweir #include <svx/svxids.hrc>
29cdf0e10cSrcweir #include <contdlg.hrc>
30cdf0e10cSrcweir #include <contwnd.hxx>
31cdf0e10cSrcweir #include <svx/svdpage.hxx>
32cdf0e10cSrcweir #include <svx/svdopath.hxx>
33cdf0e10cSrcweir #include <svx/xfltrit.hxx>
34cdf0e10cSrcweir #include <svx/xfillit.hxx>
35cdf0e10cSrcweir #include <basegfx/polygon/b2dpolygon.hxx>
36cdf0e10cSrcweir #include <basegfx/polygon/b2dpolypolygontools.hxx>
37cdf0e10cSrcweir
38cdf0e10cSrcweir // #i75482#
39cdf0e10cSrcweir #include "svx/sdrpaintwindow.hxx"
40cdf0e10cSrcweir
41cdf0e10cSrcweir #define TRANSCOL Color( COL_WHITE )
42cdf0e10cSrcweir
43cdf0e10cSrcweir /*************************************************************************
44cdf0e10cSrcweir |*
45cdf0e10cSrcweir |*
46cdf0e10cSrcweir |*
47cdf0e10cSrcweir \************************************************************************/
48cdf0e10cSrcweir
ContourWindow(Window * pParent,const ResId & rResId)49cdf0e10cSrcweir ContourWindow::ContourWindow( Window* pParent, const ResId& rResId ) :
50cdf0e10cSrcweir GraphCtrl ( pParent, rResId ),
51cdf0e10cSrcweir aWorkRect ( 0, 0, 0, 0 ),
52cdf0e10cSrcweir bPipetteMode ( sal_False ),
53cdf0e10cSrcweir bWorkplaceMode ( sal_False ),
54cdf0e10cSrcweir bClickValid ( sal_False )
55cdf0e10cSrcweir {
56cdf0e10cSrcweir SetWinStyle( WB_SDRMODE );
57cdf0e10cSrcweir }
58cdf0e10cSrcweir
59cdf0e10cSrcweir
60cdf0e10cSrcweir /*************************************************************************
61cdf0e10cSrcweir |*
62cdf0e10cSrcweir |*
63cdf0e10cSrcweir |*
64cdf0e10cSrcweir \************************************************************************/
65cdf0e10cSrcweir
~ContourWindow()66cdf0e10cSrcweir ContourWindow::~ContourWindow()
67cdf0e10cSrcweir {
68cdf0e10cSrcweir }
69cdf0e10cSrcweir
70cdf0e10cSrcweir
71cdf0e10cSrcweir /*************************************************************************
72cdf0e10cSrcweir |*
73cdf0e10cSrcweir |*
74cdf0e10cSrcweir |*
75cdf0e10cSrcweir \************************************************************************/
76cdf0e10cSrcweir
SetPolyPolygon(const PolyPolygon & rPolyPoly)77cdf0e10cSrcweir void ContourWindow::SetPolyPolygon( const PolyPolygon& rPolyPoly )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
80cdf0e10cSrcweir const sal_uInt16 nPolyCount = rPolyPoly.Count();
81cdf0e10cSrcweir
82cdf0e10cSrcweir // zuerst alle Zeichenobjekte loeschen
83cdf0e10cSrcweir aPolyPoly = rPolyPoly;
84cdf0e10cSrcweir
85cdf0e10cSrcweir // #117412#
86cdf0e10cSrcweir // To avoid to have destroyed objects which are still selected, it is necessary to deselect
87cdf0e10cSrcweir // them first (!)
88cdf0e10cSrcweir pView->UnmarkAllObj();
89cdf0e10cSrcweir
90cdf0e10cSrcweir pPage->Clear();
91cdf0e10cSrcweir
92cdf0e10cSrcweir for ( sal_uInt16 i = 0; i < nPolyCount; i++ )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir basegfx::B2DPolyPolygon aPolyPolygon;
95cdf0e10cSrcweir aPolyPolygon.append(aPolyPoly[ i ].getB2DPolygon());
96cdf0e10cSrcweir SdrPathObj* pPathObj = new SdrPathObj( OBJ_PATHFILL, aPolyPolygon );
97cdf0e10cSrcweir
98cdf0e10cSrcweir if ( pPathObj )
99cdf0e10cSrcweir {
100cdf0e10cSrcweir SfxItemSet aSet( pModel->GetItemPool() );
101cdf0e10cSrcweir
102cdf0e10cSrcweir aSet.Put( XFillStyleItem( XFILL_SOLID ) );
103cdf0e10cSrcweir aSet.Put( XFillColorItem( String(), TRANSCOL ) );
104cdf0e10cSrcweir aSet.Put( XFillTransparenceItem( 50 ) );
105cdf0e10cSrcweir
106cdf0e10cSrcweir //pPathObj->SetItemSetAndBroadcast(aSet);
107cdf0e10cSrcweir pPathObj->SetMergedItemSetAndBroadcast(aSet);
108cdf0e10cSrcweir
109cdf0e10cSrcweir pPage->InsertObject( pPathObj );
110cdf0e10cSrcweir }
111cdf0e10cSrcweir }
112cdf0e10cSrcweir
113cdf0e10cSrcweir if ( nPolyCount )
114cdf0e10cSrcweir {
115cdf0e10cSrcweir pView->MarkAll();
116cdf0e10cSrcweir pView->CombineMarkedObjects( sal_False );
117cdf0e10cSrcweir }
118cdf0e10cSrcweir
119cdf0e10cSrcweir pModel->SetChanged( sal_False );
120cdf0e10cSrcweir }
121cdf0e10cSrcweir
122cdf0e10cSrcweir
123cdf0e10cSrcweir /*************************************************************************
124cdf0e10cSrcweir |*
125cdf0e10cSrcweir |*
126cdf0e10cSrcweir |*
127cdf0e10cSrcweir \************************************************************************/
128cdf0e10cSrcweir
GetPolyPolygon()129cdf0e10cSrcweir const PolyPolygon& ContourWindow::GetPolyPolygon()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir if ( pModel->IsChanged() )
132cdf0e10cSrcweir {
133cdf0e10cSrcweir SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
134cdf0e10cSrcweir
135cdf0e10cSrcweir aPolyPoly = PolyPolygon();
136cdf0e10cSrcweir
137cdf0e10cSrcweir if ( pPage && pPage->GetObjCount() )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir SdrPathObj* pPathObj = (SdrPathObj*)pPage->GetObj(0L);
140cdf0e10cSrcweir // Not sure if subdivision is needed for ContourWindow, but maybe it cannot handle
141cdf0e10cSrcweir // curves at all. Keeping subdivision here for security
142cdf0e10cSrcweir const basegfx::B2DPolyPolygon aB2DPolyPolygon(basegfx::tools::adaptiveSubdivideByAngle(pPathObj->GetPathPoly()));
143cdf0e10cSrcweir aPolyPoly = PolyPolygon(aB2DPolyPolygon);
144cdf0e10cSrcweir }
145cdf0e10cSrcweir
146cdf0e10cSrcweir pModel->SetChanged( sal_False );
147cdf0e10cSrcweir }
148cdf0e10cSrcweir
149cdf0e10cSrcweir return aPolyPoly;
150cdf0e10cSrcweir }
151cdf0e10cSrcweir
152cdf0e10cSrcweir
153cdf0e10cSrcweir /*************************************************************************
154cdf0e10cSrcweir |*
155cdf0e10cSrcweir |*
156cdf0e10cSrcweir |*
157cdf0e10cSrcweir \************************************************************************/
158cdf0e10cSrcweir
InitSdrModel()159cdf0e10cSrcweir void ContourWindow::InitSdrModel()
160cdf0e10cSrcweir {
161cdf0e10cSrcweir GraphCtrl::InitSdrModel();
162cdf0e10cSrcweir
163cdf0e10cSrcweir SfxItemSet aSet( pModel->GetItemPool() );
164cdf0e10cSrcweir
165cdf0e10cSrcweir aSet.Put( XFillColorItem( String(), TRANSCOL ) );
166cdf0e10cSrcweir aSet.Put( XFillTransparenceItem( 50 ) );
167cdf0e10cSrcweir pView->SetAttributes( aSet );
168cdf0e10cSrcweir pView->SetFrameDragSingles( sal_True );
169cdf0e10cSrcweir }
170cdf0e10cSrcweir
171cdf0e10cSrcweir
172cdf0e10cSrcweir /*************************************************************************
173cdf0e10cSrcweir |*
174cdf0e10cSrcweir |*
175cdf0e10cSrcweir |*
176cdf0e10cSrcweir \************************************************************************/
177cdf0e10cSrcweir
SdrObjCreated(const SdrObject &)178cdf0e10cSrcweir void ContourWindow::SdrObjCreated( const SdrObject& )
179cdf0e10cSrcweir {
180cdf0e10cSrcweir pView->MarkAll();
181cdf0e10cSrcweir pView->CombineMarkedObjects( sal_False );
182cdf0e10cSrcweir }
183cdf0e10cSrcweir
184cdf0e10cSrcweir
185cdf0e10cSrcweir /*************************************************************************
186cdf0e10cSrcweir |*
187cdf0e10cSrcweir |*
188cdf0e10cSrcweir |*
189cdf0e10cSrcweir \************************************************************************/
190cdf0e10cSrcweir
IsContourChanged() const191cdf0e10cSrcweir sal_Bool ContourWindow::IsContourChanged() const
192cdf0e10cSrcweir {
193cdf0e10cSrcweir SdrPage* pPage = (SdrPage*) pModel->GetPage( 0 );
194cdf0e10cSrcweir sal_Bool bRet = sal_False;
195cdf0e10cSrcweir
196cdf0e10cSrcweir if ( pPage && pPage->GetObjCount() )
197cdf0e10cSrcweir bRet = ( (SdrPathObj*) pPage->GetObj( 0 ) )->GetPathPoly().count() && pModel->IsChanged();
198cdf0e10cSrcweir
199cdf0e10cSrcweir return bRet;
200cdf0e10cSrcweir }
201cdf0e10cSrcweir
202cdf0e10cSrcweir
203cdf0e10cSrcweir /*************************************************************************
204cdf0e10cSrcweir |*
205cdf0e10cSrcweir |*
206cdf0e10cSrcweir |*
207cdf0e10cSrcweir \************************************************************************/
208cdf0e10cSrcweir
MouseButtonDown(const MouseEvent & rMEvt)209cdf0e10cSrcweir void ContourWindow::MouseButtonDown( const MouseEvent& rMEvt )
210cdf0e10cSrcweir {
211cdf0e10cSrcweir if ( bWorkplaceMode )
212cdf0e10cSrcweir {
213cdf0e10cSrcweir const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
214cdf0e10cSrcweir
215cdf0e10cSrcweir SetPolyPolygon( PolyPolygon() );
216cdf0e10cSrcweir aWorkRect = Rectangle( aLogPt, aLogPt );
217cdf0e10cSrcweir Paint( Rectangle( Point(), GetGraphicSize() ) );
218cdf0e10cSrcweir SetEditMode( sal_True );
219cdf0e10cSrcweir }
220cdf0e10cSrcweir
221cdf0e10cSrcweir if ( !bPipetteMode )
222cdf0e10cSrcweir GraphCtrl::MouseButtonDown( rMEvt );
223cdf0e10cSrcweir }
224cdf0e10cSrcweir
225cdf0e10cSrcweir
226cdf0e10cSrcweir /*************************************************************************
227cdf0e10cSrcweir |*
228cdf0e10cSrcweir |*
229cdf0e10cSrcweir |*
230cdf0e10cSrcweir \************************************************************************/
231cdf0e10cSrcweir
MouseMove(const MouseEvent & rMEvt)232cdf0e10cSrcweir void ContourWindow::MouseMove( const MouseEvent& rMEvt )
233cdf0e10cSrcweir {
234cdf0e10cSrcweir bClickValid = sal_False;
235cdf0e10cSrcweir
236cdf0e10cSrcweir if ( bPipetteMode )
237cdf0e10cSrcweir {
238cdf0e10cSrcweir const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
239cdf0e10cSrcweir
240cdf0e10cSrcweir aPipetteColor = GetPixel( aLogPt );
241cdf0e10cSrcweir Control::MouseMove( rMEvt );
242cdf0e10cSrcweir
243cdf0e10cSrcweir if ( aPipetteLink.IsSet() && Rectangle( Point(), GetGraphicSize() ).IsInside( aLogPt ) )
244cdf0e10cSrcweir {
245cdf0e10cSrcweir SetPointer( POINTER_REFHAND );
246cdf0e10cSrcweir aPipetteLink.Call( this );
247cdf0e10cSrcweir }
248cdf0e10cSrcweir }
249cdf0e10cSrcweir else
250cdf0e10cSrcweir GraphCtrl::MouseMove( rMEvt );
251cdf0e10cSrcweir }
252cdf0e10cSrcweir
253cdf0e10cSrcweir
254cdf0e10cSrcweir /*************************************************************************
255cdf0e10cSrcweir |*
256cdf0e10cSrcweir |*
257cdf0e10cSrcweir |*
258cdf0e10cSrcweir \************************************************************************/
259cdf0e10cSrcweir
MouseButtonUp(const MouseEvent & rMEvt)260cdf0e10cSrcweir void ContourWindow::MouseButtonUp(const MouseEvent& rMEvt)
261cdf0e10cSrcweir {
262cdf0e10cSrcweir Point aTmpPoint;
263cdf0e10cSrcweir const Rectangle aGraphRect( aTmpPoint, GetGraphicSize() );
264cdf0e10cSrcweir const Point aLogPt( PixelToLogic( rMEvt.GetPosPixel() ) );
265cdf0e10cSrcweir
266cdf0e10cSrcweir bClickValid = aGraphRect.IsInside( aLogPt );
267cdf0e10cSrcweir ReleaseMouse();
268cdf0e10cSrcweir
269cdf0e10cSrcweir if ( bPipetteMode )
270cdf0e10cSrcweir {
271cdf0e10cSrcweir Control::MouseButtonUp( rMEvt );
272cdf0e10cSrcweir
273cdf0e10cSrcweir if ( aPipetteClickLink.IsSet() )
274cdf0e10cSrcweir aPipetteClickLink.Call( this );
275cdf0e10cSrcweir }
276cdf0e10cSrcweir else if ( bWorkplaceMode )
277cdf0e10cSrcweir {
278cdf0e10cSrcweir GraphCtrl::MouseButtonUp( rMEvt );
279cdf0e10cSrcweir
280cdf0e10cSrcweir aWorkRect.Right() = aLogPt.X();
281cdf0e10cSrcweir aWorkRect.Bottom() = aLogPt.Y();
282cdf0e10cSrcweir aWorkRect.Intersection( aGraphRect );
283cdf0e10cSrcweir aWorkRect.Justify();
284cdf0e10cSrcweir
285cdf0e10cSrcweir if ( aWorkRect.Left() != aWorkRect.Right() && aWorkRect.Top() != aWorkRect.Bottom() )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir PolyPolygon _aPolyPoly( GetPolyPolygon() );
288cdf0e10cSrcweir
289cdf0e10cSrcweir _aPolyPoly.Clip( aWorkRect );
290cdf0e10cSrcweir SetPolyPolygon( _aPolyPoly );
291cdf0e10cSrcweir pView->SetWorkArea( aWorkRect );
292cdf0e10cSrcweir }
293cdf0e10cSrcweir else
294cdf0e10cSrcweir pView->SetWorkArea( aGraphRect );
295cdf0e10cSrcweir
296cdf0e10cSrcweir Invalidate( aGraphRect );
297cdf0e10cSrcweir
298cdf0e10cSrcweir if ( aWorkplaceClickLink.IsSet() )
299cdf0e10cSrcweir aWorkplaceClickLink.Call( this );
300cdf0e10cSrcweir }
301cdf0e10cSrcweir else
302cdf0e10cSrcweir GraphCtrl::MouseButtonUp( rMEvt );
303cdf0e10cSrcweir }
304cdf0e10cSrcweir
305cdf0e10cSrcweir
306cdf0e10cSrcweir /*************************************************************************
307cdf0e10cSrcweir |*
308cdf0e10cSrcweir |*
309cdf0e10cSrcweir |*
310cdf0e10cSrcweir \************************************************************************/
311cdf0e10cSrcweir
Paint(const Rectangle & rRect)312cdf0e10cSrcweir void ContourWindow::Paint( const Rectangle& rRect )
313cdf0e10cSrcweir {
314cdf0e10cSrcweir // #i75482#
315cdf0e10cSrcweir // encapsulate the redraw using Begin/End and use the returned
316cdf0e10cSrcweir // data to get the target output device (e.g. when pre-rendering)
317cdf0e10cSrcweir SdrPaintWindow* pPaintWindow = pView->BeginCompleteRedraw(this);
318cdf0e10cSrcweir OutputDevice& rTarget = pPaintWindow->GetTargetOutputDevice();
319cdf0e10cSrcweir
320cdf0e10cSrcweir const Graphic& rGraphic = GetGraphic();
321cdf0e10cSrcweir const Color& rOldLineColor = GetLineColor();
322cdf0e10cSrcweir const Color& rOldFillColor = GetFillColor();
323cdf0e10cSrcweir
324cdf0e10cSrcweir rTarget.SetLineColor( Color( COL_BLACK ) );
325cdf0e10cSrcweir rTarget.SetFillColor( Color( COL_WHITE ) );
326cdf0e10cSrcweir
327cdf0e10cSrcweir rTarget.DrawRect( Rectangle( Point(), GetGraphicSize() ) );
328cdf0e10cSrcweir
329cdf0e10cSrcweir rTarget.SetLineColor( rOldLineColor );
330cdf0e10cSrcweir rTarget.SetFillColor( rOldFillColor );
331cdf0e10cSrcweir
332cdf0e10cSrcweir if ( rGraphic.GetType() != GRAPHIC_NONE )
333cdf0e10cSrcweir rGraphic.Draw( &rTarget, Point(), GetGraphicSize() );
334cdf0e10cSrcweir
335cdf0e10cSrcweir if ( aWorkRect.Left() != aWorkRect.Right() && aWorkRect.Top() != aWorkRect.Bottom() )
336cdf0e10cSrcweir {
337cdf0e10cSrcweir PolyPolygon _aPolyPoly( 2, 2 );
338cdf0e10cSrcweir const Color aOldFillColor( GetFillColor() );
339cdf0e10cSrcweir
340cdf0e10cSrcweir _aPolyPoly.Insert( Rectangle( Point(), GetGraphicSize() ) );
341cdf0e10cSrcweir _aPolyPoly.Insert( aWorkRect );
342cdf0e10cSrcweir
343cdf0e10cSrcweir rTarget.SetFillColor( COL_LIGHTRED );
344cdf0e10cSrcweir rTarget.DrawTransparent( _aPolyPoly, 50 );
345cdf0e10cSrcweir rTarget.SetFillColor( aOldFillColor );
346cdf0e10cSrcweir }
347cdf0e10cSrcweir
348cdf0e10cSrcweir // #i75482#
349cdf0e10cSrcweir const Region aRepaintRegion(rRect);
350cdf0e10cSrcweir pView->DoCompleteRedraw(*pPaintWindow, aRepaintRegion);
351cdf0e10cSrcweir pView->EndCompleteRedraw(*pPaintWindow, true);
352cdf0e10cSrcweir }
353cdf0e10cSrcweir
354cdf0e10cSrcweir // eof
355