1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: _contdlg.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svx.hxx"
33 #include <vcl/wrkwin.hxx>
34 #include <sot/factory.hxx>
35 #include <tools/shl.hxx>
36 #include <vcl/salbtype.hxx> // FRound
37 #include <vcl/msgbox.hxx>
38 #include <svtools/eitem.hxx>
39 #include <sfx2/dispatch.hxx>
40 #include <sfx2/viewfrm.hxx>
41 #include <svtools/miscopt.hxx>
42 #include <unotools/localedatawrapper.hxx>
43 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
44 #include <comphelper/processfactory.hxx>
49 #define _SDR_NOTRANSFORM
50 #define _SDR_NOOBJECTS
51 #define _SDR_NOVIEWMARKER
52 #define _SDR_NODRAGMETHODS
54 #define _SDR_NOXOUTDEV
55 #define _XOUTBMP_STATICS_ONLY
57 #include <svx/dialmgr.hxx>
58 #include "xoutbmp.hxx"
59 #include <svx/dialogs.hrc>
60 #include <svx/svxids.hrc>
61 #include <svx/contdlg.hxx>
62 #include "contimp.hxx"
63 #include "contdlg.hrc"
64 #include "contwnd.hxx"
65 #include <svx/svdtrans.hxx>
66 #include <svx/svdopath.hxx>
67 #include "dlgutil.hxx"
68 #include <vcl/svapp.hxx>
70 /******************************************************************************/
72 inline String
GetUnitString( long nVal_100
, FieldUnit eFieldUnit
, sal_Unicode cSep
)
74 String aVal
= UniString::CreateFromInt64( MetricField::ConvertValue( nVal_100
, 2, MAP_100TH_MM
, eFieldUnit
) );
76 while( aVal
.Len() < 3 )
77 aVal
.Insert( sal_Unicode('0'), 0 );
79 aVal
.Insert( cSep
, aVal
.Len() - 2 );
80 aVal
+= sal_Unicode(' ');
81 aVal
+= SdrFormatter::GetUnitStr( eFieldUnit
);
87 /******************************************************************************/
90 SFX_IMPL_FLOATINGWINDOW( SvxContourDlgChildWindow
, SID_CONTOUR_DLG
);
93 /******************************************************************************/
96 /*************************************************************************
100 \************************************************************************/
102 SvxContourDlgItem::SvxContourDlgItem( USHORT _nId
, SvxSuperContourDlg
& rContourDlg
, SfxBindings
& rBindings
) :
103 SfxControllerItem ( _nId
, rBindings
),
109 /*************************************************************************
113 \************************************************************************/
115 void SvxContourDlgItem::StateChanged( USHORT nSID
, SfxItemState
/*eState*/, const SfxPoolItem
* pItem
)
117 if ( pItem
&& ( SID_CONTOUR_EXEC
== nSID
) )
119 const SfxBoolItem
* pStateItem
= PTR_CAST( SfxBoolItem
, pItem
);
121 DBG_ASSERT( pStateItem
|| pItem
== 0, "SfxBoolItem erwartet");
123 rDlg
.SetExecState( !pStateItem
->GetValue() );
128 /******************************************************************************/
131 /*************************************************************************
135 \************************************************************************/
137 SvxContourDlgChildWindow::SvxContourDlgChildWindow( Window
* _pParent
, USHORT nId
,
138 SfxBindings
* pBindings
, SfxChildWinInfo
* pInfo
) :
139 SfxChildWindow( _pParent
, nId
)
141 SvxSuperContourDlg
* pDlg
= new SvxSuperContourDlg( pBindings
, this, _pParent
, CONT_RESID( RID_SVXDLG_CONTOUR
) );
144 if ( pInfo
->nFlags
& SFX_CHILDWIN_ZOOMIN
)
147 eChildAlignment
= SFX_ALIGN_NOALIGNMENT
;
149 pDlg
->Initialize( pInfo
);
152 /*************************************************************************
156 \************************************************************************/
158 void SvxContourDlgChildWindow::UpdateContourDlg( const Graphic
& rGraphic
, BOOL bGraphicLinked
,
159 const PolyPolygon
* pPolyPoly
, void* pEditingObj
)
161 if ( SfxViewFrame::Current() &&
162 SfxViewFrame::Current()->HasChildWindow( SvxContourDlgChildWindow::GetChildWindowId() ) )
163 SVXCONTOURDLG()->Update( rGraphic
, bGraphicLinked
, pPolyPoly
, pEditingObj
);
166 /*************************************************************************
170 \************************************************************************/
172 SvxContourDlg::SvxContourDlg( SfxBindings
* _pBindings
, SfxChildWindow
* pCW
,
173 Window
* _pParent
, const ResId
& rResId
) :
175 SfxFloatingWindow ( _pBindings
, pCW
, _pParent
, rResId
)
180 /*************************************************************************
184 \************************************************************************/
186 SvxContourDlg::~SvxContourDlg()
190 /*************************************************************************
194 \************************************************************************/
196 PolyPolygon
SvxContourDlg::CreateAutoContour( const Graphic
& rGraphic
,
197 const Rectangle
* pRect
,
201 ULONG nContourFlags
= XOUTBMP_CONTOUR_HORZ
;
203 if ( rGraphic
.GetType() == GRAPHIC_BITMAP
)
205 if( rGraphic
.IsAnimated() )
209 PolyPolygon aAnimPolyPoly
;
210 const Animation
aAnim( rGraphic
.GetAnimation() );
211 const Size
& rSizePix
= aAnim
.GetDisplaySizePixel();
212 const USHORT nCount
= aAnim
.Count();
214 if ( aVDev
.SetOutputSizePixel( rSizePix
) )
216 aVDev
.SetLineColor( Color( COL_BLACK
) );
217 aVDev
.SetFillColor( Color( COL_BLACK
) );
219 for( USHORT i
= 0; i
< nCount
; i
++ )
221 const AnimationBitmap
& rStepBmp
= aAnim
.Get( i
);
223 // Polygonausgabe an die richtige Stelle schieben;
224 // dies ist der Offset des Teilbildes innerhalb
225 // der Gesamtanimation
226 aTransMap
.SetOrigin( Point( rStepBmp
.aPosPix
.X(), rStepBmp
.aPosPix
.Y() ) );
227 aVDev
.SetMapMode( aTransMap
);
228 aVDev
.DrawPolyPolygon( CreateAutoContour( rStepBmp
.aBmpEx
, pRect
, nFlags
) );
231 aTransMap
.SetOrigin( Point() );
232 aVDev
.SetMapMode( aTransMap
);
233 aBmp
= aVDev
.GetBitmap( Point(), rSizePix
);
234 aBmp
.Convert( BMP_CONVERSION_1BIT_THRESHOLD
);
237 else if( rGraphic
.IsTransparent() )
238 aBmp
= rGraphic
.GetBitmapEx().GetMask();
241 aBmp
= rGraphic
.GetBitmap();
242 nContourFlags
|= XOUTBMP_CONTOUR_EDGEDETECT
;
245 else if( rGraphic
.GetType() != GRAPHIC_NONE
)
247 const Graphic
aTmpGrf( rGraphic
.GetGDIMetaFile().GetMonochromeMtf( Color( COL_BLACK
) ) );
249 Size
aSizePix( aVDev
.LogicToPixel( aTmpGrf
.GetPrefSize(), aTmpGrf
.GetPrefMapMode() ) );
251 if( aSizePix
.Width() && aSizePix
.Height() && ( aSizePix
.Width() > 512 || aSizePix
.Height() > 512 ) )
253 double fWH
= (double) aSizePix
.Width() / aSizePix
.Height();
256 aSizePix
.Width() = FRound( ( aSizePix
.Height() = 512 ) * fWH
);
258 aSizePix
.Height() = FRound( ( aSizePix
.Width() = 512 ) / fWH
);
261 if( aVDev
.SetOutputSizePixel( aSizePix
) )
264 aTmpGrf
.Draw( &aVDev
, aPt
, aSizePix
);
265 aBmp
= aVDev
.GetBitmap( aPt
, aSizePix
);
268 nContourFlags
|= XOUTBMP_CONTOUR_EDGEDETECT
;
271 aBmp
.SetPrefSize( rGraphic
.GetPrefSize() );
272 aBmp
.SetPrefMapMode( rGraphic
.GetPrefMapMode() );
274 return PolyPolygon( XOutBitmap::GetCountour( aBmp
, nContourFlags
, 128, pRect
) );
278 /*************************************************************************
282 \************************************************************************/
284 void SvxContourDlg::ScaleContour( PolyPolygon
& rContour
, const Graphic
& rGraphic
,
285 const MapUnit eUnit
, const Size
& rDisplaySize
)
287 DBG_ASSERT( rGraphic
.GetType() != GRAPHIC_NONE
, "Graphic is not valid!" );
289 OutputDevice
* pOutDev
= Application::GetDefaultDevice();
290 const MapMode
aDispMap( eUnit
);
291 const MapMode
aGrfMap( rGraphic
.GetPrefMapMode() );
292 const Size
aGrfSize( rGraphic
.GetPrefSize() );
297 BOOL bPixelMap
= aGrfMap
.GetMapUnit() == MAP_PIXEL
;
300 aOrgSize
= pOutDev
->PixelToLogic( aGrfSize
, aDispMap
);
302 aOrgSize
= pOutDev
->LogicToLogic( aGrfSize
, aGrfMap
, aDispMap
);
304 if ( aOrgSize
.Width() && aOrgSize
.Height() )
306 fScaleX
= (double) rDisplaySize
.Width() / aOrgSize
.Width();
307 fScaleY
= (double) rDisplaySize
.Height() / aOrgSize
.Height();
309 for ( USHORT j
= 0, nPolyCount
= rContour
.Count(); j
< nPolyCount
; j
++ )
311 Polygon
& rPoly
= rContour
[ j
];
313 for ( USHORT i
= 0, nCount
= rPoly
.GetSize(); i
< nCount
; i
++ )
316 aNewPoint
= pOutDev
->PixelToLogic( rPoly
[ i
], aDispMap
);
318 aNewPoint
= pOutDev
->LogicToLogic( rPoly
[ i
], aGrfMap
, aDispMap
);
320 rPoly
[ i
] = Point( FRound( aNewPoint
.X() * fScaleX
), FRound( aNewPoint
.Y() * fScaleY
) );
327 /*************************************************************************
329 |* Durchschleifen an SuperClass; keine virt. Methoden, um
330 |* bei IF-Aenderungen nicht inkompatibel zu werden
332 \************************************************************************/
334 void SvxContourDlg::SetExecState( BOOL bEnable
)
336 pSuperClass
->SetExecState( bEnable
);
339 void SvxContourDlg::SetGraphic( const Graphic
& rGraphic
)
341 pSuperClass
->SetGraphic( rGraphic
);
344 void SvxContourDlg::SetGraphicLinked( BOOL bGraphicLinked
)
346 pSuperClass
->SetGraphicLinked( bGraphicLinked
);
349 const Graphic
& SvxContourDlg::GetGraphic() const
351 return pSuperClass
->GetGraphic();
354 BOOL
SvxContourDlg::IsGraphicChanged() const
356 return pSuperClass
->IsGraphicChanged();
359 void SvxContourDlg::SetPolyPolygon( const PolyPolygon
& rPolyPoly
)
361 pSuperClass
->SetPolyPolygon( rPolyPoly
);
364 PolyPolygon
SvxContourDlg::GetPolyPolygon()
366 return pSuperClass
->GetPolyPolygon( TRUE
);
369 void SvxContourDlg::SetEditingObject( void* pObj
)
371 pSuperClass
->SetEditingObject( pObj
);
374 const void* SvxContourDlg::GetEditingObject() const
376 return pSuperClass
->GetEditingObject();
379 void SvxContourDlg::Update( const Graphic
& rGraphic
, BOOL bGraphicLinked
,
380 const PolyPolygon
* pPolyPoly
, void* pEditingObj
)
382 pSuperClass
->UpdateGraphic( rGraphic
, bGraphicLinked
, pPolyPoly
, pEditingObj
);
386 /*************************************************************************
390 \************************************************************************/
392 SvxSuperContourDlg::SvxSuperContourDlg( SfxBindings
*_pBindings
, SfxChildWindow
*pCW
,
393 Window
* _pParent
, const ResId
& rResId
) :
394 SvxContourDlg ( _pBindings
, pCW
, _pParent
, rResId
),
396 aContourItem ( SID_CONTOUR_EXEC
, *this, *_pBindings
),
397 aTbx1 ( this, ResId( TBX1
, *rResId
.GetResMgr() ) ),
398 aMtfTolerance ( this, ResId( MTF_TOLERANCE
, *rResId
.GetResMgr() ) ),
399 aContourWnd ( this, ResId( CTL_CONTOUR
, *rResId
.GetResMgr() ) ),
400 aStbStatus ( this, WB_BORDER
| WB_3DLOOK
| WB_LEFT
),
402 bExecState ( FALSE
),
403 bGraphicLinked ( FALSE
),
404 maImageList ( SVX_RES( CD_IMAPDLG
) ),
405 maImageListH ( SVX_RES( CDH_IMAPDLG
) )
411 SvxContourDlg::SetSuperClass( *this );
413 aContourWnd
.SetMousePosLink( LINK( this, SvxSuperContourDlg
, MousePosHdl
) );
414 aContourWnd
.SetGraphSizeLink( LINK( this, SvxSuperContourDlg
, GraphSizeHdl
) );
415 aContourWnd
.SetUpdateLink( LINK( this, SvxSuperContourDlg
, StateHdl
) );
416 aContourWnd
.SetPipetteHdl( LINK( this, SvxSuperContourDlg
, PipetteHdl
) );
417 aContourWnd
.SetPipetteClickHdl( LINK( this, SvxSuperContourDlg
, PipetteClickHdl
) );
418 aContourWnd
.SetWorkplaceClickHdl( LINK( this, SvxSuperContourDlg
, WorkplaceClickHdl
) );
420 const Size
aTbxSize( aTbx1
.CalcWindowSizePixel() );
421 Point
aPos( aTbx1
.GetPosPixel() );
422 SvtMiscOptions aMiscOptions
;
424 aMiscOptions
.AddListener( LINK( this, SvxSuperContourDlg
, MiscHdl
) );
426 aTbx1
.SetOutStyle( aMiscOptions
.GetToolboxStyle() );
427 aTbx1
.SetSizePixel( aTbxSize
);
428 aTbx1
.SetSelectHdl( LINK( this, SvxSuperContourDlg
, Tbx1ClickHdl
) );
430 aPos
.X() += aTbxSize
.Width() + LogicToPixel( Size( 3, 0 ), MapMode( MAP_APPFONT
) ).Width();
431 aMtfTolerance
.SetPosPixel( aPos
);
432 aMtfTolerance
.SetValue( 10L );
434 SetMinOutputSizePixel( aLastSize
= GetOutputSizePixel() );
436 aStbStatus
.InsertItem( 1, 130, SIB_LEFT
| SIB_IN
| SIB_AUTOSIZE
);
437 aStbStatus
.InsertItem( 2, 10 + GetTextWidth( String::CreateFromAscii( " 9999,99 cm / 9999,99 cm " ) ), SIB_CENTER
| SIB_IN
);
438 aStbStatus
.InsertItem( 3, 10 + GetTextWidth( String::CreateFromAscii( " 9999,99 cm x 9999,99 cm " ) ), SIB_CENTER
| SIB_IN
);
439 aStbStatus
.InsertItem( 4, 20, SIB_CENTER
| SIB_IN
);
443 aUpdateTimer
.SetTimeout( 100 );
444 aUpdateTimer
.SetTimeoutHdl( LINK( this, SvxSuperContourDlg
, UpdateHdl
) );
446 aCreateTimer
.SetTimeout( 50 );
447 aCreateTimer
.SetTimeoutHdl( LINK( this, SvxSuperContourDlg
, CreateHdl
) );
451 /*************************************************************************
455 \************************************************************************/
457 SvxSuperContourDlg::~SvxSuperContourDlg()
462 /*************************************************************************
466 \************************************************************************/
468 void SvxSuperContourDlg::Resize()
470 SfxFloatingWindow::Resize();
472 Size
aMinSize( GetMinOutputSizePixel() );
473 Size
aNewSize( GetOutputSizePixel() );
475 if ( aNewSize
.Height() >= aMinSize
.Height() )
477 Size
_aSize( aStbStatus
.GetSizePixel() );
478 Point
aPoint( 0, aNewSize
.Height() - _aSize
.Height() );
480 // StatusBar positionieren
481 aStbStatus
.SetPosSizePixel( aPoint
, Size( aNewSize
.Width(), _aSize
.Height() ) );
484 // EditWindow positionieren
485 _aSize
.Width() = aNewSize
.Width() - 18;
486 _aSize
.Height() = aPoint
.Y() - aContourWnd
.GetPosPixel().Y() - 6;
487 aContourWnd
.SetSizePixel( _aSize
);
489 aLastSize
= aNewSize
;
494 /*************************************************************************
498 \************************************************************************/
500 BOOL
SvxSuperContourDlg::Close()
504 if ( aTbx1
.IsItemEnabled( TBI_APPLY
) )
506 QueryBox
aQBox( this, WB_YES_NO_CANCEL
| WB_DEF_YES
,
507 String( CONT_RESID( STR_CONTOURDLG_MODIFY
) ) );
508 const long nRet
= aQBox
.Execute();
510 if ( nRet
== RET_YES
)
512 SfxBoolItem
aBoolItem( SID_CONTOUR_EXEC
, TRUE
);
513 GetBindings().GetDispatcher()->Execute(
514 SID_CONTOUR_EXEC
, SFX_CALLMODE_SYNCHRON
| SFX_CALLMODE_RECORD
, &aBoolItem
, 0L );
516 else if ( nRet
== RET_CANCEL
)
520 return( bRet
? SfxFloatingWindow::Close() : FALSE
);
524 /*************************************************************************
526 |* Enabled oder disabled alle Controls
528 \************************************************************************/
530 void SvxSuperContourDlg::SetExecState( BOOL bEnable
)
532 bExecState
= bEnable
;
536 /*************************************************************************
540 \************************************************************************/
542 void SvxSuperContourDlg::SetGraphic( const Graphic
& rGraphic
)
544 aUndoGraphic
= aRedoGraphic
= Graphic();
547 aContourWnd
.SetGraphic( aGraphic
);
551 /*************************************************************************
555 \************************************************************************/
557 void SvxSuperContourDlg::SetPolyPolygon( const PolyPolygon
& rPolyPoly
)
559 DBG_ASSERT( aContourWnd
.GetGraphic().GetType() != GRAPHIC_NONE
, "Graphic must've been set first!" );
561 PolyPolygon
aPolyPoly( rPolyPoly
);
562 const MapMode
aMap100( MAP_100TH_MM
);
563 const MapMode
aGrfMap( aGraphic
.GetPrefMapMode() );
564 OutputDevice
* pOutDev
= Application::GetDefaultDevice();
565 BOOL bPixelMap
= aGrfMap
.GetMapUnit() == MAP_PIXEL
;
567 for ( USHORT j
= 0, nPolyCount
= aPolyPoly
.Count(); j
< nPolyCount
; j
++ )
569 Polygon
& rPoly
= aPolyPoly
[ j
];
571 for ( USHORT i
= 0, nCount
= rPoly
.GetSize(); i
< nCount
; i
++ )
573 Point
& rPt
= rPoly
[ i
];
576 rPt
= pOutDev
->LogicToPixel( rPt
, aGrfMap
);
578 rPt
= pOutDev
->PixelToLogic( rPt
, aMap100
);
582 aContourWnd
.SetPolyPolygon( aPolyPoly
);
583 aContourWnd
.GetSdrModel()->SetChanged( sal_True
);
587 /*************************************************************************
591 \************************************************************************/
593 PolyPolygon
SvxSuperContourDlg::GetPolyPolygon( BOOL bRescaleToGraphic
)
595 PolyPolygon
aRetPolyPoly( aContourWnd
.GetPolyPolygon() );
597 if ( bRescaleToGraphic
)
599 const MapMode
aMap100( MAP_100TH_MM
);
600 const MapMode
aGrfMap( aGraphic
.GetPrefMapMode() );
601 OutputDevice
* pOutDev
= Application::GetDefaultDevice();
602 BOOL bPixelMap
= aGrfMap
.GetMapUnit() == MAP_PIXEL
;
604 for ( USHORT j
= 0, nPolyCount
= aRetPolyPoly
.Count(); j
< nPolyCount
; j
++ )
606 Polygon
& rPoly
= aRetPolyPoly
[ j
];
608 for ( USHORT i
= 0, nCount
= rPoly
.GetSize(); i
< nCount
; i
++ )
610 Point
& rPt
= rPoly
[ i
];
612 rPt
= pOutDev
->LogicToPixel( rPt
, aMap100
);
615 rPt
= pOutDev
->PixelToLogic( rPt
, aGrfMap
);
624 /*************************************************************************
628 \************************************************************************/
630 void SvxSuperContourDlg::UpdateGraphic( const Graphic
& rGraphic
, BOOL _bGraphicLinked
,
631 const PolyPolygon
* pPolyPoly
, void* pEditingObj
)
633 aUpdateGraphic
= rGraphic
;
634 bUpdateGraphicLinked
= _bGraphicLinked
;
635 pUpdateEditingObject
= pEditingObj
;
638 aUpdatePolyPoly
= *pPolyPoly
;
640 aUpdatePolyPoly
= PolyPolygon();
642 aUpdateTimer
.Start();
646 /*************************************************************************
650 \************************************************************************/
652 BOOL
SvxSuperContourDlg::IsUndoPossible() const
654 return aUndoGraphic
.GetType() != GRAPHIC_NONE
;
658 /*************************************************************************
662 \************************************************************************/
664 BOOL
SvxSuperContourDlg::IsRedoPossible() const
666 return aRedoGraphic
.GetType() != GRAPHIC_NONE
;
670 /*************************************************************************
674 \************************************************************************/
676 void SvxSuperContourDlg::DoAutoCreate()
678 aCreateTimer
.Start();
682 /*************************************************************************
686 \************************************************************************/
688 void SvxSuperContourDlg::ReducePoints( const long nTol
)
690 PolyPolygon
aPolyPoly( GetPolyPolygon( FALSE
) );
692 if ( aPolyPoly
.Count() )
694 const MapMode
aMapMode( MAP_100TH_MM
);
695 const long nTol2
= nTol
* nTol
;
696 Polygon
& rPoly
= aPolyPoly
[ 0 ];
697 OutputDevice
* pOutDev
= Application::GetDefaultDevice();
699 const USHORT nSize
= rPoly
.GetSize();
703 aPtPix
= pOutDev
->LogicToPixel( rPoly
[ 0 ], aMapMode
);
705 for( USHORT i
= 1; i
< nSize
; i
++ )
707 const Point
& rNewPt
= rPoly
[ i
];
708 const Point
aNewPtPix( pOutDev
->LogicToPixel( rNewPt
, aMapMode
) );
710 const long nDistX
= aNewPtPix
.X() - aPtPix
.X();
711 const long nDistY
= aNewPtPix
.Y() - aPtPix
.Y();
713 if( ( nDistX
* nDistX
+ nDistY
* nDistY
) >= nTol2
)
715 rPoly
[ ++nCounter
] = rNewPt
;
720 rPoly
.SetSize( nCounter
);
721 aContourWnd
.SetPolyPolygon( aPolyPoly
);
722 aContourWnd
.GetSdrModel()->SetChanged( sal_True
);
727 /*************************************************************************
729 |* Click-Hdl fuer ToolBox
731 \************************************************************************/
733 IMPL_LINK( SvxSuperContourDlg
, Tbx1ClickHdl
, ToolBox
*, pTbx
)
735 USHORT nNewItemId
= pTbx
->GetCurItemId();
737 switch( pTbx
->GetCurItemId() )
741 SfxBoolItem
aBoolItem( SID_CONTOUR_EXEC
, TRUE
);
742 GetBindings().GetDispatcher()->Execute(
743 SID_CONTOUR_EXEC
, SFX_CALLMODE_ASYNCHRON
| SFX_CALLMODE_RECORD
, &aBoolItem
, 0L );
747 case( TBI_WORKPLACE
):
749 if ( aTbx1
.IsItemChecked( TBI_WORKPLACE
) )
751 QueryBox
aQBox( this, WB_YES_NO
| WB_DEF_NO
, String( CONT_RESID( STR_CONTOURDLG_WORKPLACE
) ) );
753 if ( !aContourWnd
.IsContourChanged() || ( aQBox
.Execute() == RET_YES
) )
754 aContourWnd
.SetWorkplaceMode( TRUE
);
756 aTbx1
.CheckItem( TBI_WORKPLACE
, FALSE
);
759 aContourWnd
.SetWorkplaceMode( FALSE
);
765 pTbx
->CheckItem( nNewItemId
, TRUE
);
766 aContourWnd
.SetEditMode( TRUE
);
772 pTbx
->CheckItem( nNewItemId
, TRUE
);
773 aContourWnd
.SetObjKind( OBJ_RECT
);
779 pTbx
->CheckItem( nNewItemId
, TRUE
);
780 aContourWnd
.SetObjKind( OBJ_CIRC
);
787 pTbx
->CheckItem( nNewItemId
, TRUE
);
788 aContourWnd
.SetObjKind( OBJ_POLY
);
792 case( TBI_FREEPOLY
):
794 pTbx
->CheckItem( nNewItemId
, TRUE
);
795 aContourWnd
.SetObjKind( OBJ_FREEFILL
);
799 case( TBI_POLYEDIT
):
800 aContourWnd
.SetPolyEditMode( pTbx
->IsItemChecked( TBI_POLYEDIT
) ? SID_BEZIER_MOVE
: 0 );
803 case( TBI_POLYMOVE
):
804 aContourWnd
.SetPolyEditMode( SID_BEZIER_MOVE
);
807 case( TBI_POLYINSERT
):
808 aContourWnd
.SetPolyEditMode( SID_BEZIER_INSERT
);
811 case( TBI_POLYDELETE
):
812 aContourWnd
.GetSdrView()->DeleteMarkedPoints();
817 nGrfChanged
= nGrfChanged
? nGrfChanged
-- : 0UL;
818 aRedoGraphic
= aGraphic
;
819 aGraphic
= aUndoGraphic
;
820 aUndoGraphic
= Graphic();
821 aContourWnd
.SetGraphic( aGraphic
, FALSE
);
828 aUndoGraphic
= aGraphic
;
829 aGraphic
= aRedoGraphic
;
830 aRedoGraphic
= Graphic();
831 aContourWnd
.SetGraphic( aGraphic
, FALSE
);
835 case( TBI_AUTOCONTOUR
):
836 aCreateTimer
.Start();
841 BOOL bPipette
= aTbx1
.IsItemChecked( TBI_PIPETTE
);
844 aStbStatus
.Invalidate();
845 else if ( bGraphicLinked
)
847 QueryBox
aQBox( this, WB_YES_NO
| WB_DEF_YES
, String( CONT_RESID( STR_CONTOURDLG_LINKED
) ) );
849 if ( aQBox
.Execute() != RET_YES
)
851 aTbx1
.CheckItem( TBI_PIPETTE
, bPipette
= FALSE
);
852 aStbStatus
.Invalidate();
856 aContourWnd
.SetPipetteMode( bPipette
);
868 /*************************************************************************
872 \************************************************************************/
874 IMPL_LINK( SvxSuperContourDlg
, MousePosHdl
, ContourWindow
*, pWnd
)
877 const FieldUnit eFieldUnit
= GetModuleFieldUnit();
878 const Point
& rMousePos
= pWnd
->GetMousePos();
879 LocaleDataWrapper
aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
880 const sal_Unicode cSep
= aLocaleWrapper
.getNumDecimalSep().GetChar(0);
882 aStr
.Assign( GetUnitString( rMousePos
.X(), eFieldUnit
, cSep
) );
883 aStr
.Append( String::CreateFromAscii( " / " ) );
884 aStr
.Append( GetUnitString( rMousePos
.Y(), eFieldUnit
, cSep
) );
886 aStbStatus
.SetItemText( 2, aStr
);
891 /*************************************************************************
895 \************************************************************************/
897 IMPL_LINK( SvxSuperContourDlg
, GraphSizeHdl
, ContourWindow
*, pWnd
)
900 const FieldUnit eFieldUnit
= GetModuleFieldUnit();
901 const Size
& rSize
= pWnd
->GetGraphicSize();
902 LocaleDataWrapper
aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
903 const sal_Unicode cSep
= aLocaleWrapper
.getNumDecimalSep().GetChar(0);
905 aStr
.Assign( GetUnitString( rSize
.Width(), eFieldUnit
, cSep
) );
906 aStr
.Append( String::CreateFromAscii( " x " ) );
907 aStr
.Append( GetUnitString( rSize
.Height(), eFieldUnit
, cSep
) );
909 aStbStatus
.SetItemText( 3, aStr
);
914 /*************************************************************************
918 \************************************************************************/
920 IMPL_LINK( SvxSuperContourDlg
, UpdateHdl
, Timer
*, EMPTYARG
)
924 if ( pUpdateEditingObject
!= pCheckObj
)
926 if( !GetEditingObject() )
927 aContourWnd
.GrabFocus();
929 SetGraphic( aUpdateGraphic
);
930 SetPolyPolygon( aUpdatePolyPoly
);
931 SetEditingObject( pUpdateEditingObject
);
932 bGraphicLinked
= bUpdateGraphicLinked
;
934 aUpdateGraphic
= Graphic();
935 aUpdatePolyPoly
= PolyPolygon();
936 bUpdateGraphicLinked
= FALSE
;
938 aContourWnd
.GetSdrModel()->SetChanged( sal_False
);
941 GetBindings().Invalidate( SID_CONTOUR_EXEC
);
947 /*************************************************************************
951 \************************************************************************/
953 IMPL_LINK( SvxSuperContourDlg
, CreateHdl
, Timer
*, EMPTYARG
)
957 const Rectangle aWorkRect
= aContourWnd
.LogicToPixel( aContourWnd
.GetWorkRect(), MapMode( MAP_100TH_MM
) );
958 const Graphic
& rGraphic
= aContourWnd
.GetGraphic();
959 const BOOL bValid
= aWorkRect
.Left() != aWorkRect
.Right() && aWorkRect
.Top() != aWorkRect
.Bottom();
962 SetPolyPolygon( CreateAutoContour( rGraphic
, bValid
? &aWorkRect
: NULL
) );
969 /*************************************************************************
973 \************************************************************************/
975 IMPL_LINK( SvxSuperContourDlg
, StateHdl
, ContourWindow
*, pWnd
)
977 const SdrObject
* pObj
= pWnd
->GetSelectedSdrObject();
978 const SdrView
* pView
= pWnd
->GetSdrView();
979 const BOOL bPolyEdit
= ( pObj
!= NULL
) && pObj
->ISA( SdrPathObj
);
980 const BOOL bDrawEnabled
= !( bPolyEdit
&& aTbx1
.IsItemChecked( TBI_POLYEDIT
) );
981 const BOOL bPipette
= aTbx1
.IsItemChecked( TBI_PIPETTE
);
982 const BOOL bWorkplace
= aTbx1
.IsItemChecked( TBI_WORKPLACE
);
983 const BOOL bDontHide
= !( bPipette
|| bWorkplace
);
984 const BOOL bBitmap
= pWnd
->GetGraphic().GetType() == GRAPHIC_BITMAP
;
986 aTbx1
.EnableItem( TBI_APPLY
, bDontHide
&& bExecState
&& pWnd
->IsChanged() );
988 aTbx1
.EnableItem( TBI_WORKPLACE
, !bPipette
&& bDrawEnabled
);
990 aTbx1
.EnableItem( TBI_SELECT
, bDontHide
&& bDrawEnabled
);
991 aTbx1
.EnableItem( TBI_RECT
, bDontHide
&& bDrawEnabled
);
992 aTbx1
.EnableItem( TBI_CIRCLE
, bDontHide
&& bDrawEnabled
);
993 aTbx1
.EnableItem( TBI_POLY
, bDontHide
&& bDrawEnabled
);
994 aTbx1
.EnableItem( TBI_FREEPOLY
, bDontHide
&& bDrawEnabled
);
996 aTbx1
.EnableItem( TBI_POLYEDIT
, bDontHide
&& bPolyEdit
);
997 aTbx1
.EnableItem( TBI_POLYMOVE
, bDontHide
&& !bDrawEnabled
);
998 aTbx1
.EnableItem( TBI_POLYINSERT
, bDontHide
&& !bDrawEnabled
);
999 aTbx1
.EnableItem( TBI_POLYDELETE
, bDontHide
&& !bDrawEnabled
&& pView
->IsDeleteMarkedPointsPossible() );
1001 aTbx1
.EnableItem( TBI_AUTOCONTOUR
, bDontHide
&& bDrawEnabled
);
1002 aTbx1
.EnableItem( TBI_PIPETTE
, !bWorkplace
&& bDrawEnabled
&& bBitmap
);
1004 aTbx1
.EnableItem( TBI_UNDO
, bDontHide
&& IsUndoPossible() );
1005 aTbx1
.EnableItem( TBI_REDO
, bDontHide
&& IsRedoPossible() );
1011 switch( pWnd
->GetPolyEditMode() )
1013 case( SID_BEZIER_MOVE
): nId
= TBI_POLYMOVE
; break;
1014 case( SID_BEZIER_INSERT
): nId
= TBI_POLYINSERT
; break;
1020 aTbx1
.CheckItem( nId
, TRUE
);
1024 aTbx1
.CheckItem( TBI_POLYEDIT
, FALSE
);
1025 aTbx1
.CheckItem( TBI_POLYMOVE
, TRUE
);
1026 aTbx1
.CheckItem( TBI_POLYINSERT
, FALSE
);
1027 pWnd
->SetPolyEditMode( 0 );
1034 /*************************************************************************
1038 \************************************************************************/
1040 IMPL_LINK( SvxSuperContourDlg
, PipetteHdl
, ContourWindow
*, pWnd
)
1042 const Color
& rOldLineColor
= aStbStatus
.GetLineColor();
1043 const Color
& rOldFillColor
= aStbStatus
.GetFillColor();
1045 Rectangle
aRect( aStbStatus
.GetItemRect( 4 ) );
1046 const Color
& rColor
= pWnd
->GetPipetteColor();
1048 aStbStatus
.SetLineColor( rColor
);
1049 aStbStatus
.SetFillColor( rColor
);
1054 aRect
.Bottom() -= 4;
1056 aStbStatus
.DrawRect( aRect
);
1058 aStbStatus
.SetLineColor( rOldLineColor
);
1059 aStbStatus
.SetFillColor( rOldFillColor
);
1065 /*************************************************************************
1069 \************************************************************************/
1071 IMPL_LINK( SvxSuperContourDlg
, PipetteClickHdl
, ContourWindow
*, pWnd
)
1073 if ( pWnd
->IsClickValid() )
1076 const Color
& rColor
= pWnd
->GetPipetteColor();
1080 if( aGraphic
.GetType() == GRAPHIC_BITMAP
)
1082 Bitmap
aBmp( aGraphic
.GetBitmap() );
1083 const long nTol
= static_cast<long>(aMtfTolerance
.GetValue() * 255L / 100L);
1085 aMask
= aBmp
.CreateMask( rColor
, nTol
);
1087 if( aGraphic
.IsTransparent() )
1088 aMask
.CombineSimple( aGraphic
.GetBitmapEx().GetMask(), BMP_COMBINE_OR
);
1092 QueryBox
aQBox( this, WB_YES_NO
| WB_DEF_YES
, String( CONT_RESID( STR_CONTOURDLG_NEWPIPETTE
) ) );
1095 aRedoGraphic
= Graphic();
1096 aUndoGraphic
= aGraphic
;
1097 aGraphic
= Graphic( BitmapEx( aBmp
, aMask
) );
1100 bNewContour
= ( aQBox
.Execute() == RET_YES
);
1101 pWnd
->SetGraphic( aGraphic
, bNewContour
);
1104 aCreateTimer
.Start();
1111 aTbx1
.CheckItem( TBI_PIPETTE
, FALSE
);
1112 pWnd
->SetPipetteMode( FALSE
);
1113 aStbStatus
.Invalidate();
1119 /*************************************************************************
1123 \************************************************************************/
1125 IMPL_LINK( SvxSuperContourDlg
, WorkplaceClickHdl
, ContourWindow
*, pWnd
)
1127 aTbx1
.CheckItem( TBI_WORKPLACE
, FALSE
);
1128 aTbx1
.CheckItem( TBI_SELECT
, TRUE
);
1129 pWnd
->SetWorkplaceMode( FALSE
);
1134 void SvxSuperContourDlg::ApplyImageList()
1136 bool bHighContrast
= GetDisplayBackground().GetColor().IsDark() != 0;
1138 ImageList
& rImgLst
= bHighContrast
? maImageListH
: maImageList
;
1140 aTbx1
.SetImageList( rImgLst
);
1143 void SvxSuperContourDlg::DataChanged( const DataChangedEvent
& rDCEvt
)
1145 SfxFloatingWindow::DataChanged( rDCEvt
);
1147 if ( (rDCEvt
.GetType() == DATACHANGED_SETTINGS
) && (rDCEvt
.GetFlags() & SETTINGS_STYLE
) )
1151 /*************************************************************************
1155 \************************************************************************/
1157 IMPL_LINK( SvxSuperContourDlg
, MiscHdl
, void*, EMPTYARG
)
1159 SvtMiscOptions aMiscOptions
;
1160 aTbx1
.SetOutStyle( aMiscOptions
.GetToolboxStyle() );