Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 :
20 : #include <vcl/wrkwin.hxx>
21 : #include <sot/factory.hxx>
22 : #include <tools/shl.hxx>
23 : #include <tools/helpers.hxx>
24 : #include <vcl/msgbox.hxx>
25 : #include <svl/eitem.hxx>
26 : #include <sfx2/dispatch.hxx>
27 : #include <sfx2/viewfrm.hxx>
28 : #include <svtools/miscopt.hxx>
29 : #include <unotools/localedatawrapper.hxx>
30 : #include <comphelper/processfactory.hxx>
31 :
32 : #include <svx/dialmgr.hxx>
33 : #include "svx/xoutbmp.hxx"
34 : #include <svx/dialogs.hrc>
35 : #include <svx/svxids.hrc>
36 : #include <svx/contdlg.hxx>
37 : #include "contimp.hxx"
38 : #include "contdlg.hrc"
39 : #include "contwnd.hxx"
40 : #include <svx/svdtrans.hxx>
41 : #include <svx/svdopath.hxx>
42 : #include "svx/dlgutil.hxx"
43 : #include <vcl/svapp.hxx>
44 : #include <vcl/virdev.hxx>
45 : #include "dlgunit.hxx"
46 :
47 20 : SFX_IMPL_FLOATINGWINDOW_WITHID( SvxContourDlgChildWindow, SID_CONTOUR_DLG );
48 :
49 :
50 : /******************************************************************************/
51 :
52 0 : SvxContourDlgItem::SvxContourDlgItem( sal_uInt16 _nId, SvxSuperContourDlg& rContourDlg, SfxBindings& rBindings ) :
53 : SfxControllerItem ( _nId, rBindings ),
54 0 : rDlg ( rContourDlg )
55 : {
56 0 : }
57 :
58 0 : void SvxContourDlgItem::StateChanged( sal_uInt16 nSID, SfxItemState /*eState*/, const SfxPoolItem* pItem )
59 : {
60 0 : if ( pItem && ( SID_CONTOUR_EXEC == nSID ) )
61 : {
62 0 : const SfxBoolItem* pStateItem = PTR_CAST( SfxBoolItem, pItem );
63 :
64 : DBG_ASSERT( pStateItem || pItem == 0, "SfxBoolItem expected ");
65 :
66 0 : rDlg.SetExecState( !pStateItem->GetValue() );
67 : }
68 0 : }
69 :
70 :
71 : /******************************************************************************/
72 :
73 0 : SvxContourDlgChildWindow::SvxContourDlgChildWindow( Window* _pParent, sal_uInt16 nId,
74 : SfxBindings* pBindings, SfxChildWinInfo* pInfo ) :
75 0 : SfxChildWindow( _pParent, nId )
76 : {
77 0 : SvxSuperContourDlg* pDlg = new SvxSuperContourDlg( pBindings, this, _pParent, CONT_RESID( RID_SVXDLG_CONTOUR ) );
78 0 : pWindow = pDlg;
79 :
80 0 : if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
81 0 : pDlg->RollUp();
82 :
83 0 : eChildAlignment = SFX_ALIGN_NOALIGNMENT;
84 :
85 0 : pDlg->Initialize( pInfo );
86 0 : }
87 :
88 0 : SvxContourDlg::SvxContourDlg( SfxBindings* _pBindings, SfxChildWindow* pCW,
89 : Window* _pParent, const ResId& rResId ) :
90 :
91 0 : SfxFloatingWindow ( _pBindings, pCW, _pParent, rResId )
92 :
93 : {
94 0 : }
95 :
96 0 : SvxContourDlg::~SvxContourDlg()
97 : {
98 0 : }
99 :
100 0 : PolyPolygon SvxContourDlg::CreateAutoContour( const Graphic& rGraphic,
101 : const Rectangle* pRect,
102 : const sal_uIntPtr nFlags )
103 : {
104 0 : Bitmap aBmp;
105 0 : sal_uIntPtr nContourFlags = XOUTBMP_CONTOUR_HORZ;
106 :
107 0 : if ( rGraphic.GetType() == GRAPHIC_BITMAP )
108 : {
109 0 : if( rGraphic.IsAnimated() )
110 : {
111 0 : VirtualDevice aVDev;
112 0 : MapMode aTransMap;
113 0 : PolyPolygon aAnimPolyPoly;
114 0 : const Animation aAnim( rGraphic.GetAnimation() );
115 0 : const Size& rSizePix = aAnim.GetDisplaySizePixel();
116 0 : const sal_uInt16 nCount = aAnim.Count();
117 :
118 0 : if ( aVDev.SetOutputSizePixel( rSizePix ) )
119 : {
120 0 : aVDev.SetLineColor( Color( COL_BLACK ) );
121 0 : aVDev.SetFillColor( Color( COL_BLACK ) );
122 :
123 0 : for( sal_uInt16 i = 0; i < nCount; i++ )
124 : {
125 0 : const AnimationBitmap& rStepBmp = aAnim.Get( i );
126 :
127 : // Push Polygon output to the right place; this is the
128 : // offset of the sub-image within the total animation
129 0 : aTransMap.SetOrigin( Point( rStepBmp.aPosPix.X(), rStepBmp.aPosPix.Y() ) );
130 0 : aVDev.SetMapMode( aTransMap );
131 0 : aVDev.DrawPolyPolygon( CreateAutoContour( rStepBmp.aBmpEx, pRect, nFlags ) );
132 : }
133 :
134 0 : aTransMap.SetOrigin( Point() );
135 0 : aVDev.SetMapMode( aTransMap );
136 0 : aBmp = aVDev.GetBitmap( Point(), rSizePix );
137 0 : aBmp.Convert( BMP_CONVERSION_1BIT_THRESHOLD );
138 0 : }
139 : }
140 0 : else if( rGraphic.IsTransparent() )
141 0 : aBmp = rGraphic.GetBitmapEx().GetMask();
142 : else
143 : {
144 0 : aBmp = rGraphic.GetBitmap();
145 0 : nContourFlags |= XOUTBMP_CONTOUR_EDGEDETECT;
146 : }
147 : }
148 0 : else if( rGraphic.GetType() != GRAPHIC_NONE )
149 : {
150 0 : const Graphic aTmpGrf( rGraphic.GetGDIMetaFile().GetMonochromeMtf( Color( COL_BLACK ) ) );
151 0 : VirtualDevice aVDev;
152 0 : Size aSizePix( aVDev.LogicToPixel( aTmpGrf.GetPrefSize(), aTmpGrf.GetPrefMapMode() ) );
153 :
154 0 : if( aSizePix.Width() && aSizePix.Height() && ( aSizePix.Width() > 512 || aSizePix.Height() > 512 ) )
155 : {
156 0 : double fWH = (double) aSizePix.Width() / aSizePix.Height();
157 :
158 0 : if( fWH <= 1.0 )
159 0 : aSizePix.Width() = FRound( ( aSizePix.Height() = 512 ) * fWH );
160 : else
161 0 : aSizePix.Height() = FRound( ( aSizePix.Width() = 512 ) / fWH );
162 : }
163 :
164 0 : if( aVDev.SetOutputSizePixel( aSizePix ) )
165 : {
166 0 : const Point aPt;
167 0 : aTmpGrf.Draw( &aVDev, aPt, aSizePix );
168 0 : aBmp = aVDev.GetBitmap( aPt, aSizePix );
169 : }
170 :
171 0 : nContourFlags |= XOUTBMP_CONTOUR_EDGEDETECT;
172 : }
173 :
174 0 : aBmp.SetPrefSize( rGraphic.GetPrefSize() );
175 0 : aBmp.SetPrefMapMode( rGraphic.GetPrefMapMode() );
176 :
177 0 : return PolyPolygon( XOutBitmap::GetCountour( aBmp, nContourFlags, 128, pRect ) );
178 : }
179 :
180 : // Loop through to super class, no virtual Methods to not become incompatible
181 : // due to IF changes
182 :
183 0 : const Graphic& SvxContourDlg::GetGraphic() const
184 : {
185 0 : return pSuperClass->GetGraphic();
186 : }
187 :
188 0 : sal_Bool SvxContourDlg::IsGraphicChanged() const
189 : {
190 0 : return pSuperClass->IsGraphicChanged();
191 : }
192 :
193 0 : PolyPolygon SvxContourDlg::GetPolyPolygon()
194 : {
195 0 : return pSuperClass->GetPolyPolygon( sal_True );
196 : }
197 :
198 0 : const void* SvxContourDlg::GetEditingObject() const
199 : {
200 0 : return pSuperClass->GetEditingObject();
201 : }
202 :
203 0 : void SvxContourDlg::Update( const Graphic& rGraphic, sal_Bool bGraphicLinked,
204 : const PolyPolygon* pPolyPoly, void* pEditingObj )
205 : {
206 0 : pSuperClass->UpdateGraphic( rGraphic, bGraphicLinked, pPolyPoly, pEditingObj );
207 0 : }
208 :
209 0 : SvxSuperContourDlg::SvxSuperContourDlg( SfxBindings *_pBindings, SfxChildWindow *pCW,
210 : Window* _pParent, const ResId& rResId ) :
211 : SvxContourDlg ( _pBindings, pCW, _pParent, rResId ),
212 : pCheckObj ( NULL ),
213 : aContourItem ( SID_CONTOUR_EXEC, *this, *_pBindings ),
214 0 : aTbx1 ( this, ResId( TBX1, *rResId.GetResMgr() ) ),
215 0 : aMtfTolerance ( this, ResId( MTF_TOLERANCE, *rResId.GetResMgr() ) ),
216 0 : aContourWnd ( this, ResId( CTL_CONTOUR, *rResId.GetResMgr() ) ),
217 : aStbStatus ( this, WB_BORDER | WB_3DLOOK | WB_LEFT ),
218 : nGrfChanged ( 0UL ),
219 : bExecState ( sal_False ),
220 : bGraphicLinked ( sal_False ),
221 0 : maImageList ( SVX_RES( CD_IMAPDLG ) )
222 : {
223 0 : ApplyImageList();
224 :
225 0 : FreeResource();
226 :
227 0 : SvxContourDlg::SetSuperClass( *this );
228 :
229 0 : aContourWnd.SetMousePosLink( LINK( this, SvxSuperContourDlg, MousePosHdl ) );
230 0 : aContourWnd.SetGraphSizeLink( LINK( this, SvxSuperContourDlg, GraphSizeHdl ) );
231 0 : aContourWnd.SetUpdateLink( LINK( this, SvxSuperContourDlg, StateHdl ) );
232 0 : aContourWnd.SetPipetteHdl( LINK( this, SvxSuperContourDlg, PipetteHdl ) );
233 0 : aContourWnd.SetPipetteClickHdl( LINK( this, SvxSuperContourDlg, PipetteClickHdl ) );
234 0 : aContourWnd.SetWorkplaceClickHdl( LINK( this, SvxSuperContourDlg, WorkplaceClickHdl ) );
235 :
236 0 : const Size aTbxSize( aTbx1.CalcWindowSizePixel() );
237 0 : Point aPos( aTbx1.GetPosPixel() );
238 0 : SvtMiscOptions aMiscOptions;
239 :
240 0 : aMiscOptions.AddListenerLink( LINK( this, SvxSuperContourDlg, MiscHdl ) );
241 :
242 0 : aTbx1.SetOutStyle( aMiscOptions.GetToolboxStyle() );
243 0 : aTbx1.SetSizePixel( aTbxSize );
244 0 : aTbx1.SetSelectHdl( LINK( this, SvxSuperContourDlg, Tbx1ClickHdl ) );
245 :
246 0 : aPos.X() += aTbxSize.Width() + LogicToPixel( Size( 3, 0 ), MapMode( MAP_APPFONT ) ).Width();
247 0 : aMtfTolerance.SetPosPixel( aPos );
248 0 : aMtfTolerance.SetValue( 10L );
249 :
250 0 : SetMinOutputSizePixel( aLastSize = GetOutputSizePixel() );
251 :
252 0 : aStbStatus.InsertItem( 1, 130, SIB_LEFT | SIB_IN | SIB_AUTOSIZE );
253 0 : aStbStatus.InsertItem( 2, 10 + GetTextWidth( rtl::OUString(" 9999,99 cm / 9999,99 cm ") ), SIB_CENTER | SIB_IN );
254 0 : aStbStatus.InsertItem( 3, 10 + GetTextWidth( rtl::OUString(" 9999,99 cm x 9999,99 cm ") ), SIB_CENTER | SIB_IN );
255 0 : aStbStatus.InsertItem( 4, 20, SIB_CENTER | SIB_IN );
256 :
257 0 : Resize();
258 :
259 0 : aUpdateTimer.SetTimeout( 100 );
260 0 : aUpdateTimer.SetTimeoutHdl( LINK( this, SvxSuperContourDlg, UpdateHdl ) );
261 :
262 0 : aCreateTimer.SetTimeout( 50 );
263 0 : aCreateTimer.SetTimeoutHdl( LINK( this, SvxSuperContourDlg, CreateHdl ) );
264 0 : }
265 :
266 0 : SvxSuperContourDlg::~SvxSuperContourDlg()
267 : {
268 0 : }
269 :
270 : // Resize methods
271 :
272 0 : void SvxSuperContourDlg::Resize()
273 : {
274 0 : SfxFloatingWindow::Resize();
275 :
276 0 : Size aMinSize( GetMinOutputSizePixel() );
277 0 : Size aNewSize( GetOutputSizePixel() );
278 :
279 0 : if ( aNewSize.Height() >= aMinSize.Height() )
280 : {
281 0 : Size _aSize( aStbStatus.GetSizePixel() );
282 0 : Point aPoint( 0, aNewSize.Height() - _aSize.Height() );
283 :
284 : // Position the StatusBar
285 0 : aStbStatus.SetPosSizePixel( aPoint, Size( aNewSize.Width(), _aSize.Height() ) );
286 0 : aStbStatus.Show();
287 :
288 : // Position the EditWindow
289 0 : _aSize.Width() = aNewSize.Width() - 18;
290 0 : _aSize.Height() = aPoint.Y() - aContourWnd.GetPosPixel().Y() - 6;
291 0 : aContourWnd.SetSizePixel( _aSize );
292 :
293 0 : aLastSize = aNewSize;
294 : }
295 0 : }
296 :
297 : // Close methods
298 :
299 0 : sal_Bool SvxSuperContourDlg::Close()
300 : {
301 0 : sal_Bool bRet = sal_True;
302 :
303 0 : if ( aTbx1.IsItemEnabled( TBI_APPLY ) )
304 : {
305 : QueryBox aQBox( this, WB_YES_NO_CANCEL | WB_DEF_YES,
306 0 : String( CONT_RESID( STR_CONTOURDLG_MODIFY ) ) );
307 0 : const long nRet = aQBox.Execute();
308 :
309 0 : if ( nRet == RET_YES )
310 : {
311 0 : SfxBoolItem aBoolItem( SID_CONTOUR_EXEC, sal_True );
312 0 : GetBindings().GetDispatcher()->Execute(
313 0 : SID_CONTOUR_EXEC, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD, &aBoolItem, 0L );
314 : }
315 0 : else if ( nRet == RET_CANCEL )
316 0 : bRet = sal_False;
317 : }
318 :
319 0 : return( bRet ? SfxFloatingWindow::Close() : sal_False );
320 : }
321 :
322 : // Enabled or disabled all Controls
323 :
324 0 : void SvxSuperContourDlg::SetExecState( sal_Bool bEnable )
325 : {
326 0 : bExecState = bEnable;
327 0 : }
328 :
329 0 : void SvxSuperContourDlg::SetGraphic( const Graphic& rGraphic )
330 : {
331 0 : aUndoGraphic = aRedoGraphic = Graphic();
332 0 : aGraphic = rGraphic;
333 0 : nGrfChanged = 0UL;
334 0 : aContourWnd.SetGraphic( aGraphic );
335 0 : }
336 :
337 0 : void SvxSuperContourDlg::SetPolyPolygon( const PolyPolygon& rPolyPoly )
338 : {
339 : DBG_ASSERT( aContourWnd.GetGraphic().GetType() != GRAPHIC_NONE, "Graphic must've been set first!" );
340 :
341 0 : PolyPolygon aPolyPoly( rPolyPoly );
342 0 : const MapMode aMap100( MAP_100TH_MM );
343 0 : const MapMode aGrfMap( aGraphic.GetPrefMapMode() );
344 0 : OutputDevice* pOutDev = Application::GetDefaultDevice();
345 0 : sal_Bool bPixelMap = aGrfMap.GetMapUnit() == MAP_PIXEL;
346 :
347 0 : for ( sal_uInt16 j = 0, nPolyCount = aPolyPoly.Count(); j < nPolyCount; j++ )
348 : {
349 0 : Polygon& rPoly = aPolyPoly[ j ];
350 :
351 0 : for ( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ )
352 : {
353 0 : Point& rPt = rPoly[ i ];
354 :
355 0 : if ( !bPixelMap )
356 0 : rPt = pOutDev->LogicToPixel( rPt, aGrfMap );
357 :
358 0 : rPt = pOutDev->PixelToLogic( rPt, aMap100 );
359 : }
360 : }
361 :
362 0 : aContourWnd.SetPolyPolygon( aPolyPoly );
363 0 : aContourWnd.GetSdrModel()->SetChanged( sal_True );
364 0 : }
365 :
366 0 : PolyPolygon SvxSuperContourDlg::GetPolyPolygon( sal_Bool bRescaleToGraphic )
367 : {
368 0 : PolyPolygon aRetPolyPoly( aContourWnd.GetPolyPolygon() );
369 :
370 0 : if ( bRescaleToGraphic )
371 : {
372 0 : const MapMode aMap100( MAP_100TH_MM );
373 0 : const MapMode aGrfMap( aGraphic.GetPrefMapMode() );
374 0 : OutputDevice* pOutDev = Application::GetDefaultDevice();
375 0 : sal_Bool bPixelMap = aGrfMap.GetMapUnit() == MAP_PIXEL;
376 :
377 0 : for ( sal_uInt16 j = 0, nPolyCount = aRetPolyPoly.Count(); j < nPolyCount; j++ )
378 : {
379 0 : Polygon& rPoly = aRetPolyPoly[ j ];
380 :
381 0 : for ( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ )
382 : {
383 0 : Point& rPt = rPoly[ i ];
384 :
385 0 : rPt = pOutDev->LogicToPixel( rPt, aMap100 );
386 :
387 0 : if ( !bPixelMap )
388 0 : rPt = pOutDev->PixelToLogic( rPt, aGrfMap );
389 : }
390 0 : }
391 : }
392 :
393 0 : return aRetPolyPoly;
394 : }
395 :
396 0 : void SvxSuperContourDlg::UpdateGraphic( const Graphic& rGraphic, sal_Bool _bGraphicLinked,
397 : const PolyPolygon* pPolyPoly, void* pEditingObj )
398 : {
399 0 : aUpdateGraphic = rGraphic;
400 0 : bUpdateGraphicLinked = _bGraphicLinked;
401 0 : pUpdateEditingObject = pEditingObj;
402 :
403 0 : if ( pPolyPoly )
404 0 : aUpdatePolyPoly = *pPolyPoly;
405 : else
406 0 : aUpdatePolyPoly = PolyPolygon();
407 :
408 0 : aUpdateTimer.Start();
409 0 : }
410 :
411 0 : sal_Bool SvxSuperContourDlg::IsUndoPossible() const
412 : {
413 0 : return aUndoGraphic.GetType() != GRAPHIC_NONE;
414 : }
415 :
416 0 : sal_Bool SvxSuperContourDlg::IsRedoPossible() const
417 : {
418 0 : return aRedoGraphic.GetType() != GRAPHIC_NONE;
419 : }
420 :
421 : // Click handler for ToolBox
422 :
423 0 : IMPL_LINK( SvxSuperContourDlg, Tbx1ClickHdl, ToolBox*, pTbx )
424 : {
425 0 : sal_uInt16 nNewItemId = pTbx->GetCurItemId();
426 :
427 0 : switch( pTbx->GetCurItemId() )
428 : {
429 : case( TBI_APPLY ):
430 : {
431 0 : SfxBoolItem aBoolItem( SID_CONTOUR_EXEC, sal_True );
432 0 : GetBindings().GetDispatcher()->Execute(
433 0 : SID_CONTOUR_EXEC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aBoolItem, 0L );
434 : }
435 0 : break;
436 :
437 : case( TBI_WORKPLACE ):
438 : {
439 0 : if ( aTbx1.IsItemChecked( TBI_WORKPLACE ) )
440 : {
441 0 : QueryBox aQBox( this, WB_YES_NO | WB_DEF_NO, String( CONT_RESID( STR_CONTOURDLG_WORKPLACE ) ) );
442 :
443 0 : if ( !aContourWnd.IsContourChanged() || ( aQBox.Execute() == RET_YES ) )
444 0 : aContourWnd.SetWorkplaceMode( sal_True );
445 : else
446 0 : aTbx1.CheckItem( TBI_WORKPLACE, sal_False );
447 : }
448 : else
449 0 : aContourWnd.SetWorkplaceMode( sal_False );
450 : }
451 0 : break;
452 :
453 : case( TBI_SELECT ):
454 : {
455 0 : pTbx->CheckItem( nNewItemId, sal_True );
456 0 : aContourWnd.SetEditMode( sal_True );
457 : }
458 0 : break;
459 :
460 : case( TBI_RECT ):
461 : {
462 0 : pTbx->CheckItem( nNewItemId, sal_True );
463 0 : aContourWnd.SetObjKind( OBJ_RECT );
464 : }
465 0 : break;
466 :
467 : case( TBI_CIRCLE ):
468 : {
469 0 : pTbx->CheckItem( nNewItemId, sal_True );
470 0 : aContourWnd.SetObjKind( OBJ_CIRC );
471 :
472 : }
473 0 : break;
474 :
475 : case( TBI_POLY ):
476 : {
477 0 : pTbx->CheckItem( nNewItemId, sal_True );
478 0 : aContourWnd.SetObjKind( OBJ_POLY );
479 : }
480 0 : break;
481 :
482 : case( TBI_FREEPOLY ):
483 : {
484 0 : pTbx->CheckItem( nNewItemId, sal_True );
485 0 : aContourWnd.SetObjKind( OBJ_FREEFILL );
486 : }
487 0 : break;
488 :
489 : case( TBI_POLYEDIT ):
490 0 : aContourWnd.SetPolyEditMode( pTbx->IsItemChecked( TBI_POLYEDIT ) ? SID_BEZIER_MOVE : 0 );
491 0 : break;
492 :
493 : case( TBI_POLYMOVE ):
494 0 : aContourWnd.SetPolyEditMode( SID_BEZIER_MOVE );
495 0 : break;
496 :
497 : case( TBI_POLYINSERT ):
498 0 : aContourWnd.SetPolyEditMode( SID_BEZIER_INSERT );
499 0 : break;
500 :
501 : case( TBI_POLYDELETE ):
502 0 : aContourWnd.GetSdrView()->DeleteMarkedPoints();
503 0 : break;
504 :
505 : case( TBI_UNDO ):
506 : {
507 0 : nGrfChanged = nGrfChanged ? nGrfChanged - 1 : 0UL;
508 0 : aRedoGraphic = aGraphic;
509 0 : aGraphic = aUndoGraphic;
510 0 : aUndoGraphic = Graphic();
511 0 : aContourWnd.SetGraphic( aGraphic, sal_False );
512 : }
513 0 : break;
514 :
515 : case( TBI_REDO ):
516 : {
517 0 : nGrfChanged++;
518 0 : aUndoGraphic = aGraphic;
519 0 : aGraphic = aRedoGraphic;
520 0 : aRedoGraphic = Graphic();
521 0 : aContourWnd.SetGraphic( aGraphic, sal_False );
522 : }
523 0 : break;
524 :
525 : case( TBI_AUTOCONTOUR ):
526 0 : aCreateTimer.Start();
527 0 : break;
528 :
529 : case( TBI_PIPETTE ):
530 : {
531 0 : sal_Bool bPipette = aTbx1.IsItemChecked( TBI_PIPETTE );
532 :
533 0 : if ( !bPipette )
534 0 : aStbStatus.Invalidate();
535 0 : else if ( bGraphicLinked )
536 : {
537 0 : QueryBox aQBox( this, WB_YES_NO | WB_DEF_YES, String( CONT_RESID( STR_CONTOURDLG_LINKED ) ) );
538 :
539 0 : if ( aQBox.Execute() != RET_YES )
540 : {
541 0 : aTbx1.CheckItem( TBI_PIPETTE, bPipette = sal_False );
542 0 : aStbStatus.Invalidate();
543 0 : }
544 : }
545 :
546 0 : aContourWnd.SetPipetteMode( bPipette );
547 : }
548 0 : break;
549 :
550 : default:
551 0 : break;
552 : }
553 :
554 0 : return 0L;
555 : }
556 :
557 0 : IMPL_LINK( SvxSuperContourDlg, MousePosHdl, ContourWindow*, pWnd )
558 : {
559 0 : String aStr;
560 0 : const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
561 0 : const Point& rMousePos = pWnd->GetMousePos();
562 0 : const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
563 0 : const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
564 :
565 0 : aStr.Assign( GetUnitString( rMousePos.X(), eFieldUnit, cSep ) );
566 0 : aStr.Append( rtl::OUString(" / ") );
567 0 : aStr.Append( GetUnitString( rMousePos.Y(), eFieldUnit, cSep ) );
568 :
569 0 : aStbStatus.SetItemText( 2, aStr );
570 :
571 0 : return 0L;
572 : }
573 :
574 0 : IMPL_LINK( SvxSuperContourDlg, GraphSizeHdl, ContourWindow*, pWnd )
575 : {
576 0 : String aStr;
577 0 : const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
578 0 : const Size& rSize = pWnd->GetGraphicSize();
579 0 : const LocaleDataWrapper& rLocaleWrapper( Application::GetSettings().GetLocaleDataWrapper() );
580 0 : const sal_Unicode cSep = rLocaleWrapper.getNumDecimalSep()[0];
581 :
582 0 : aStr.Assign( GetUnitString( rSize.Width(), eFieldUnit, cSep ) );
583 0 : aStr.Append( rtl::OUString(" x ") );
584 0 : aStr.Append( GetUnitString( rSize.Height(), eFieldUnit, cSep ) );
585 :
586 0 : aStbStatus.SetItemText( 3, aStr );
587 :
588 0 : return 0L;
589 : }
590 :
591 0 : IMPL_LINK_NOARG(SvxSuperContourDlg, UpdateHdl)
592 : {
593 0 : aUpdateTimer.Stop();
594 :
595 0 : if ( pUpdateEditingObject != pCheckObj )
596 : {
597 0 : if( !GetEditingObject() )
598 0 : aContourWnd.GrabFocus();
599 :
600 0 : SetGraphic( aUpdateGraphic );
601 0 : SetPolyPolygon( aUpdatePolyPoly );
602 0 : SetEditingObject( pUpdateEditingObject );
603 0 : bGraphicLinked = bUpdateGraphicLinked;
604 :
605 0 : aUpdateGraphic = Graphic();
606 0 : aUpdatePolyPoly = PolyPolygon();
607 0 : bUpdateGraphicLinked = sal_False;
608 :
609 0 : aContourWnd.GetSdrModel()->SetChanged( sal_False );
610 : }
611 :
612 0 : GetBindings().Invalidate( SID_CONTOUR_EXEC );
613 :
614 0 : return 0L;
615 : }
616 :
617 0 : IMPL_LINK_NOARG(SvxSuperContourDlg, CreateHdl)
618 : {
619 0 : aCreateTimer.Stop();
620 :
621 0 : const Rectangle aWorkRect = aContourWnd.LogicToPixel( aContourWnd.GetWorkRect(), MapMode( MAP_100TH_MM ) );
622 0 : const Graphic& rGraphic = aContourWnd.GetGraphic();
623 0 : const sal_Bool bValid = aWorkRect.Left() != aWorkRect.Right() && aWorkRect.Top() != aWorkRect.Bottom();
624 :
625 0 : EnterWait();
626 0 : SetPolyPolygon( CreateAutoContour( rGraphic, bValid ? &aWorkRect : NULL ) );
627 0 : LeaveWait();
628 :
629 0 : return 0L;
630 : }
631 :
632 0 : IMPL_LINK( SvxSuperContourDlg, StateHdl, ContourWindow*, pWnd )
633 : {
634 0 : const SdrObject* pObj = pWnd->GetSelectedSdrObject();
635 0 : const SdrView* pView = pWnd->GetSdrView();
636 0 : const sal_Bool bPolyEdit = ( pObj != NULL ) && pObj->ISA( SdrPathObj );
637 0 : const sal_Bool bDrawEnabled = !( bPolyEdit && aTbx1.IsItemChecked( TBI_POLYEDIT ) );
638 0 : const sal_Bool bPipette = aTbx1.IsItemChecked( TBI_PIPETTE );
639 0 : const sal_Bool bWorkplace = aTbx1.IsItemChecked( TBI_WORKPLACE );
640 0 : const sal_Bool bDontHide = !( bPipette || bWorkplace );
641 0 : const sal_Bool bBitmap = pWnd->GetGraphic().GetType() == GRAPHIC_BITMAP;
642 :
643 0 : aTbx1.EnableItem( TBI_APPLY, bDontHide && bExecState && pWnd->IsChanged() );
644 :
645 0 : aTbx1.EnableItem( TBI_WORKPLACE, !bPipette && bDrawEnabled );
646 :
647 0 : aTbx1.EnableItem( TBI_SELECT, bDontHide && bDrawEnabled );
648 0 : aTbx1.EnableItem( TBI_RECT, bDontHide && bDrawEnabled );
649 0 : aTbx1.EnableItem( TBI_CIRCLE, bDontHide && bDrawEnabled );
650 0 : aTbx1.EnableItem( TBI_POLY, bDontHide && bDrawEnabled );
651 0 : aTbx1.EnableItem( TBI_FREEPOLY, bDontHide && bDrawEnabled );
652 :
653 0 : aTbx1.EnableItem( TBI_POLYEDIT, bDontHide && bPolyEdit );
654 0 : aTbx1.EnableItem( TBI_POLYMOVE, bDontHide && !bDrawEnabled );
655 0 : aTbx1.EnableItem( TBI_POLYINSERT, bDontHide && !bDrawEnabled );
656 0 : aTbx1.EnableItem( TBI_POLYDELETE, bDontHide && !bDrawEnabled && pView->IsDeleteMarkedPointsPossible() );
657 :
658 0 : aTbx1.EnableItem( TBI_AUTOCONTOUR, bDontHide && bDrawEnabled );
659 0 : aTbx1.EnableItem( TBI_PIPETTE, !bWorkplace && bDrawEnabled && bBitmap );
660 :
661 0 : aTbx1.EnableItem( TBI_UNDO, bDontHide && IsUndoPossible() );
662 0 : aTbx1.EnableItem( TBI_REDO, bDontHide && IsRedoPossible() );
663 :
664 0 : if ( bPolyEdit )
665 : {
666 0 : sal_uInt16 nId = 0;
667 :
668 0 : switch( pWnd->GetPolyEditMode() )
669 : {
670 0 : case( SID_BEZIER_MOVE ): nId = TBI_POLYMOVE; break;
671 0 : case( SID_BEZIER_INSERT ): nId = TBI_POLYINSERT; break;
672 :
673 : default:
674 0 : break;
675 : }
676 :
677 0 : aTbx1.CheckItem( nId, sal_True );
678 : }
679 : else
680 : {
681 0 : aTbx1.CheckItem( TBI_POLYEDIT, sal_False );
682 0 : aTbx1.CheckItem( TBI_POLYMOVE, sal_True );
683 0 : aTbx1.CheckItem( TBI_POLYINSERT, sal_False );
684 0 : pWnd->SetPolyEditMode( 0 );
685 : }
686 :
687 0 : return 0L;
688 : }
689 :
690 0 : IMPL_LINK( SvxSuperContourDlg, PipetteHdl, ContourWindow*, pWnd )
691 : {
692 0 : const Color& rOldLineColor = aStbStatus.GetLineColor();
693 0 : const Color& rOldFillColor = aStbStatus.GetFillColor();
694 :
695 0 : Rectangle aRect( aStbStatus.GetItemRect( 4 ) );
696 0 : const Color& rColor = pWnd->GetPipetteColor();
697 :
698 0 : aStbStatus.SetLineColor( rColor );
699 0 : aStbStatus.SetFillColor( rColor );
700 :
701 0 : aRect.Left() += 4;
702 0 : aRect.Top() += 4;
703 0 : aRect.Right() -= 4;
704 0 : aRect.Bottom() -= 4;
705 :
706 0 : aStbStatus.DrawRect( aRect );
707 :
708 0 : aStbStatus.SetLineColor( rOldLineColor );
709 0 : aStbStatus.SetFillColor( rOldFillColor );
710 :
711 0 : return 0L;
712 : }
713 :
714 0 : IMPL_LINK( SvxSuperContourDlg, PipetteClickHdl, ContourWindow*, pWnd )
715 : {
716 0 : if ( pWnd->IsClickValid() )
717 : {
718 0 : Bitmap aMask;
719 0 : const Color& rColor = pWnd->GetPipetteColor();
720 :
721 0 : EnterWait();
722 :
723 0 : if( aGraphic.GetType() == GRAPHIC_BITMAP )
724 : {
725 0 : Bitmap aBmp( aGraphic.GetBitmap() );
726 0 : const long nTol = static_cast<long>(aMtfTolerance.GetValue() * 255L / 100L);
727 :
728 0 : aMask = aBmp.CreateMask( rColor, nTol );
729 :
730 0 : if( aGraphic.IsTransparent() )
731 0 : aMask.CombineSimple( aGraphic.GetBitmapEx().GetMask(), BMP_COMBINE_OR );
732 :
733 0 : if( !!aMask )
734 : {
735 0 : QueryBox aQBox( this, WB_YES_NO | WB_DEF_YES, String( CONT_RESID( STR_CONTOURDLG_NEWPIPETTE ) ) );
736 : sal_Bool bNewContour;
737 :
738 0 : aRedoGraphic = Graphic();
739 0 : aUndoGraphic = aGraphic;
740 0 : aGraphic = Graphic( BitmapEx( aBmp, aMask ) );
741 0 : nGrfChanged++;
742 :
743 0 : bNewContour = ( aQBox.Execute() == RET_YES );
744 0 : pWnd->SetGraphic( aGraphic, bNewContour );
745 :
746 0 : if( bNewContour )
747 0 : aCreateTimer.Start();
748 0 : }
749 : }
750 :
751 0 : LeaveWait();
752 : }
753 :
754 0 : aTbx1.CheckItem( TBI_PIPETTE, sal_False );
755 0 : pWnd->SetPipetteMode( sal_False );
756 0 : aStbStatus.Invalidate();
757 :
758 0 : return 0L;
759 : }
760 :
761 0 : IMPL_LINK( SvxSuperContourDlg, WorkplaceClickHdl, ContourWindow*, pWnd )
762 : {
763 0 : aTbx1.CheckItem( TBI_WORKPLACE, sal_False );
764 0 : aTbx1.CheckItem( TBI_SELECT, sal_True );
765 0 : pWnd->SetWorkplaceMode( sal_False );
766 :
767 0 : return 0L;
768 : }
769 :
770 0 : void SvxSuperContourDlg::ApplyImageList()
771 : {
772 0 : ImageList& rImgLst = maImageList;
773 :
774 0 : aTbx1.SetImageList( rImgLst );
775 0 : }
776 :
777 0 : void SvxSuperContourDlg::DataChanged( const DataChangedEvent& rDCEvt )
778 : {
779 0 : SfxFloatingWindow::DataChanged( rDCEvt );
780 :
781 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
782 0 : ApplyImageList();
783 0 : }
784 :
785 0 : IMPL_LINK_NOARG(SvxSuperContourDlg, MiscHdl)
786 : {
787 0 : SvtMiscOptions aMiscOptions;
788 0 : aTbx1.SetOutStyle( aMiscOptions.GetToolboxStyle() );
789 :
790 0 : return 0L;
791 : }
792 :
793 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|