xref: /AOO41X/main/svx/source/dialog/_contdlg.cxx (revision f6e50924346d0b8c0b07c91832a97665dd718b0c)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 #include <vcl/wrkwin.hxx>
27 #include <sot/factory.hxx>
28 #include <tools/shl.hxx>
29 #include <vcl/salbtype.hxx>     // FRound
30 #include <vcl/msgbox.hxx>
31 #include <svl/eitem.hxx>
32 #include <sfx2/dispatch.hxx>
33 #include <sfx2/viewfrm.hxx>
34 #include <svtools/miscopt.hxx>
35 #include <unotools/localedatawrapper.hxx>
36 #ifndef _UNOTOOLS_PROCESSFACTORY_HXX
37 #include <comphelper/processfactory.hxx>
38 #endif
39 
40 #define _SDR_NOITEMS
41 #define _SDR_NOTOUCH
42 #define _SDR_NOTRANSFORM
43 #define _SDR_NOOBJECTS
44 #define _SDR_NOVIEWMARKER
45 #define _SDR_NODRAGMETHODS
46 #define _SDR_NOUNDO
47 #define _SDR_NOXOUTDEV
48 #define _XOUTBMP_STATICS_ONLY
49 
50 #include <svx/dialmgr.hxx>
51 #include "svx/xoutbmp.hxx"
52 #include <svx/dialogs.hrc>
53 #include <svx/svxids.hrc>
54 #include <svx/contdlg.hxx>
55 #include "contimp.hxx"
56 #include "contdlg.hrc"
57 #include "contwnd.hxx"
58 #include <svx/svdtrans.hxx>
59 #include <svx/svdopath.hxx>
60 #include "svx/dlgutil.hxx"
61 #include <vcl/svapp.hxx>
62 
63 /******************************************************************************/
64 
GetUnitString(long nVal_100,FieldUnit eFieldUnit,sal_Unicode cSep)65 inline String GetUnitString( long nVal_100, FieldUnit eFieldUnit, sal_Unicode cSep )
66 {
67     String aVal = UniString::CreateFromInt64( MetricField::ConvertValue( nVal_100, 2, MAP_100TH_MM, eFieldUnit ) );
68 
69     while( aVal.Len() < 3 )
70         aVal.Insert( sal_Unicode('0'), 0 );
71 
72     aVal.Insert( cSep, aVal.Len() - 2 );
73     aVal += sal_Unicode(' ');
74     aVal += SdrFormatter::GetUnitStr( eFieldUnit );
75 
76     return aVal;
77 }
78 
79 
80 /******************************************************************************/
81 
82 
83 SFX_IMPL_FLOATINGWINDOW( SvxContourDlgChildWindow, SID_CONTOUR_DLG );
84 
85 
86 /******************************************************************************/
87 
88 
89 /*************************************************************************
90 |*
91 |* ControllerItem
92 |*
93 \************************************************************************/
94 
SvxContourDlgItem(sal_uInt16 _nId,SvxSuperContourDlg & rContourDlg,SfxBindings & rBindings)95 SvxContourDlgItem::SvxContourDlgItem( sal_uInt16 _nId, SvxSuperContourDlg& rContourDlg, SfxBindings& rBindings ) :
96             SfxControllerItem   ( _nId, rBindings ),
97             rDlg                ( rContourDlg )
98 {
99 }
100 
101 
102 /*************************************************************************
103 |*
104 |*
105 |*
106 \************************************************************************/
107 
StateChanged(sal_uInt16 nSID,SfxItemState,const SfxPoolItem * pItem)108 void SvxContourDlgItem::StateChanged( sal_uInt16 nSID, SfxItemState /*eState*/, const SfxPoolItem* pItem )
109 {
110     if ( pItem && ( SID_CONTOUR_EXEC == nSID ) )
111     {
112         const SfxBoolItem* pStateItem = PTR_CAST( SfxBoolItem, pItem );
113 
114         DBG_ASSERT( pStateItem || pItem == 0, "SfxBoolItem erwartet");
115 
116         rDlg.SetExecState( !pStateItem->GetValue() );
117     }
118 }
119 
120 
121 /******************************************************************************/
122 
123 
124 /*************************************************************************
125 |*
126 |* Contour-Float
127 |*
128 \************************************************************************/
129 
SvxContourDlgChildWindow(Window * _pParent,sal_uInt16 nId,SfxBindings * pBindings,SfxChildWinInfo * pInfo)130 SvxContourDlgChildWindow::SvxContourDlgChildWindow( Window* _pParent, sal_uInt16 nId,
131                                                     SfxBindings* pBindings, SfxChildWinInfo* pInfo ) :
132             SfxChildWindow( _pParent, nId )
133 {
134     SvxSuperContourDlg* pDlg = new SvxSuperContourDlg( pBindings, this, _pParent, CONT_RESID( RID_SVXDLG_CONTOUR ) );
135     pWindow = pDlg;
136 
137     if ( pInfo->nFlags & SFX_CHILDWIN_ZOOMIN )
138         pDlg->RollUp();
139 
140     eChildAlignment = SFX_ALIGN_NOALIGNMENT;
141 
142     pDlg->Initialize( pInfo );
143 }
144 
145 /*************************************************************************
146 |*
147 |*
148 |*
149 \************************************************************************/
150 
UpdateContourDlg(const Graphic & rGraphic,sal_Bool bGraphicLinked,const PolyPolygon * pPolyPoly,void * pEditingObj)151 void SvxContourDlgChildWindow::UpdateContourDlg( const Graphic& rGraphic, sal_Bool bGraphicLinked,
152                                                  const PolyPolygon* pPolyPoly, void* pEditingObj )
153 {
154     if ( SfxViewFrame::Current() &&
155          SfxViewFrame::Current()->HasChildWindow( SvxContourDlgChildWindow::GetChildWindowId() ) )
156         SVXCONTOURDLG()->Update( rGraphic, bGraphicLinked, pPolyPoly, pEditingObj );
157 }
158 
159 /*************************************************************************
160 |*
161 |*
162 |*
163 \************************************************************************/
164 
SvxContourDlg(SfxBindings * _pBindings,SfxChildWindow * pCW,Window * _pParent,const ResId & rResId)165 SvxContourDlg::SvxContourDlg( SfxBindings* _pBindings, SfxChildWindow* pCW,
166                               Window* _pParent, const ResId& rResId ) :
167 
168     SfxFloatingWindow   ( _pBindings, pCW, _pParent, rResId )
169 
170 {
171 }
172 
173 /*************************************************************************
174 |*
175 |*
176 |*
177 \************************************************************************/
178 
~SvxContourDlg()179 SvxContourDlg::~SvxContourDlg()
180 {
181 }
182 
183 /*************************************************************************
184 |*
185 |*
186 |*
187 \************************************************************************/
188 
CreateAutoContour(const Graphic & rGraphic,const Rectangle * pRect,const sal_uIntPtr nFlags)189 PolyPolygon SvxContourDlg::CreateAutoContour( const Graphic& rGraphic,
190                                               const Rectangle* pRect,
191                                               const sal_uIntPtr nFlags )
192 {
193     Bitmap  aBmp;
194     sal_uIntPtr nContourFlags = XOUTBMP_CONTOUR_HORZ;
195 
196     if ( rGraphic.GetType() == GRAPHIC_BITMAP )
197     {
198         if( rGraphic.IsAnimated() )
199         {
200             VirtualDevice       aVDev;
201             MapMode             aTransMap;
202             PolyPolygon         aAnimPolyPoly;
203             const Animation     aAnim( rGraphic.GetAnimation() );
204             const Size&         rSizePix = aAnim.GetDisplaySizePixel();
205             const sal_uInt16        nCount = aAnim.Count();
206 
207             if ( aVDev.SetOutputSizePixel( rSizePix ) )
208             {
209                 aVDev.SetLineColor( Color( COL_BLACK ) );
210                 aVDev.SetFillColor( Color( COL_BLACK ) );
211 
212                 for( sal_uInt16 i = 0; i < nCount; i++ )
213                 {
214                     const AnimationBitmap& rStepBmp = aAnim.Get( i );
215 
216                     // Polygonausgabe an die richtige Stelle schieben;
217                     // dies ist der Offset des Teilbildes innerhalb
218                     // der Gesamtanimation
219                     aTransMap.SetOrigin( Point( rStepBmp.aPosPix.X(), rStepBmp.aPosPix.Y() ) );
220                     aVDev.SetMapMode( aTransMap );
221                     aVDev.DrawPolyPolygon( CreateAutoContour( rStepBmp.aBmpEx, pRect, nFlags ) );
222                 }
223 
224                 aTransMap.SetOrigin( Point() );
225                 aVDev.SetMapMode( aTransMap );
226                 aBmp = aVDev.GetBitmap( Point(), rSizePix );
227                 aBmp.Convert( BMP_CONVERSION_1BIT_THRESHOLD );
228             }
229         }
230         else if( rGraphic.IsTransparent() )
231             aBmp = rGraphic.GetBitmapEx().GetMask();
232         else
233         {
234             aBmp = rGraphic.GetBitmap();
235             nContourFlags |= XOUTBMP_CONTOUR_EDGEDETECT;
236         }
237     }
238     else if( rGraphic.GetType() != GRAPHIC_NONE )
239     {
240         const Graphic   aTmpGrf( rGraphic.GetGDIMetaFile().GetMonochromeMtf( Color( COL_BLACK ) ) );
241         VirtualDevice   aVDev;
242         Size            aSizePix( aVDev.LogicToPixel( aTmpGrf.GetPrefSize(), aTmpGrf.GetPrefMapMode() ) );
243 
244         if( aSizePix.Width() && aSizePix.Height() && ( aSizePix.Width() > 512 || aSizePix.Height() > 512 ) )
245         {
246             double fWH = (double) aSizePix.Width() / aSizePix.Height();
247 
248             if( fWH <= 1.0 )
249                 aSizePix.Width() = FRound( ( aSizePix.Height() = 512 ) * fWH );
250             else
251                 aSizePix.Height() = FRound( ( aSizePix.Width() = 512 ) / fWH );
252         }
253 
254         if( aVDev.SetOutputSizePixel( aSizePix ) )
255         {
256             const Point aPt;
257             aTmpGrf.Draw( &aVDev, aPt, aSizePix );
258             aBmp = aVDev.GetBitmap( aPt, aSizePix );
259         }
260 
261         nContourFlags |= XOUTBMP_CONTOUR_EDGEDETECT;
262     }
263 
264     aBmp.SetPrefSize( rGraphic.GetPrefSize() );
265     aBmp.SetPrefMapMode( rGraphic.GetPrefMapMode() );
266 
267     return PolyPolygon( XOutBitmap::GetCountour( aBmp, nContourFlags, 128, pRect ) );
268 }
269 
270 
271 /*************************************************************************
272 |*
273 |*
274 |*
275 \************************************************************************/
276 
ScaleContour(PolyPolygon & rContour,const Graphic & rGraphic,const MapUnit eUnit,const Size & rDisplaySize)277 void SvxContourDlg::ScaleContour( PolyPolygon& rContour, const Graphic& rGraphic,
278                                   const MapUnit eUnit, const Size& rDisplaySize )
279 {
280     DBG_ASSERT( rGraphic.GetType() != GRAPHIC_NONE, "Graphic is not valid!" );
281 
282     OutputDevice*   pOutDev = Application::GetDefaultDevice();
283     const MapMode   aDispMap( eUnit );
284     const MapMode   aGrfMap( rGraphic.GetPrefMapMode() );
285     const Size      aGrfSize( rGraphic.GetPrefSize() );
286     double          fScaleX;
287     double          fScaleY;
288     Size            aOrgSize;
289     Point           aNewPoint;
290     sal_Bool            bPixelMap = aGrfMap.GetMapUnit() == MAP_PIXEL;
291 
292     if ( bPixelMap )
293         aOrgSize = pOutDev->PixelToLogic( aGrfSize, aDispMap );
294     else
295         aOrgSize = pOutDev->LogicToLogic( aGrfSize, aGrfMap, aDispMap );
296 
297     if ( aOrgSize.Width() && aOrgSize.Height() )
298     {
299         fScaleX = (double) rDisplaySize.Width() / aOrgSize.Width();
300         fScaleY = (double) rDisplaySize.Height() / aOrgSize.Height();
301 
302         for ( sal_uInt16 j = 0, nPolyCount = rContour.Count(); j < nPolyCount; j++ )
303         {
304             Polygon& rPoly = rContour[ j ];
305 
306             for ( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ )
307             {
308                 if ( bPixelMap )
309                     aNewPoint = pOutDev->PixelToLogic( rPoly[ i ], aDispMap  );
310                 else
311                     aNewPoint = pOutDev->LogicToLogic( rPoly[ i ], aGrfMap, aDispMap  );
312 
313                 rPoly[ i ] = Point( FRound( aNewPoint.X() * fScaleX ), FRound( aNewPoint.Y() * fScaleY ) );
314             }
315         }
316     }
317 }
318 
319 
320 /*************************************************************************
321 |*
322 |* Durchschleifen an SuperClass; keine virt. Methoden, um
323 |* bei IF-Aenderungen nicht inkompatibel zu werden
324 |*
325 \************************************************************************/
326 
SetExecState(sal_Bool bEnable)327 void SvxContourDlg::SetExecState( sal_Bool bEnable )
328 {
329     pSuperClass->SetExecState( bEnable );
330 }
331 
SetGraphic(const Graphic & rGraphic)332 void SvxContourDlg::SetGraphic( const Graphic& rGraphic )
333 {
334     pSuperClass->SetGraphic( rGraphic );
335 }
336 
SetGraphicLinked(sal_Bool bGraphicLinked)337 void SvxContourDlg::SetGraphicLinked( sal_Bool bGraphicLinked )
338 {
339     pSuperClass->SetGraphicLinked( bGraphicLinked );
340 }
341 
GetGraphic() const342 const Graphic& SvxContourDlg::GetGraphic() const
343 {
344     return pSuperClass->GetGraphic();
345 }
346 
IsGraphicChanged() const347 sal_Bool SvxContourDlg::IsGraphicChanged() const
348 {
349     return pSuperClass->IsGraphicChanged();
350 }
351 
SetPolyPolygon(const PolyPolygon & rPolyPoly)352 void SvxContourDlg::SetPolyPolygon( const PolyPolygon& rPolyPoly )
353 {
354     pSuperClass->SetPolyPolygon( rPolyPoly );
355 }
356 
GetPolyPolygon()357 PolyPolygon SvxContourDlg::GetPolyPolygon()
358 {
359     return pSuperClass->GetPolyPolygon( sal_True );
360 }
361 
SetEditingObject(void * pObj)362 void SvxContourDlg::SetEditingObject( void* pObj )
363 {
364     pSuperClass->SetEditingObject( pObj );
365 }
366 
GetEditingObject() const367 const void* SvxContourDlg::GetEditingObject() const
368 {
369     return pSuperClass->GetEditingObject();
370 }
371 
Update(const Graphic & rGraphic,sal_Bool bGraphicLinked,const PolyPolygon * pPolyPoly,void * pEditingObj)372 void SvxContourDlg::Update( const Graphic& rGraphic, sal_Bool bGraphicLinked,
373                             const PolyPolygon* pPolyPoly, void* pEditingObj )
374 {
375     pSuperClass->UpdateGraphic( rGraphic, bGraphicLinked, pPolyPoly, pEditingObj );
376 }
377 
378 
379 /*************************************************************************
380 |*
381 |*
382 |*
383 \************************************************************************/
384 
SvxSuperContourDlg(SfxBindings * _pBindings,SfxChildWindow * pCW,Window * _pParent,const ResId & rResId)385 SvxSuperContourDlg::SvxSuperContourDlg( SfxBindings *_pBindings, SfxChildWindow *pCW,
386                                         Window* _pParent, const ResId& rResId ) :
387         SvxContourDlg       ( _pBindings, pCW, _pParent, rResId ),
388         pCheckObj           ( NULL ),
389         aContourItem        ( SID_CONTOUR_EXEC, *this, *_pBindings ),
390         aTbx1               ( this, ResId( TBX1, *rResId.GetResMgr() ) ),
391         aMtfTolerance       ( this, ResId( MTF_TOLERANCE, *rResId.GetResMgr() ) ),
392         aContourWnd         ( this, ResId( CTL_CONTOUR, *rResId.GetResMgr() ) ),
393         aStbStatus          ( this, WB_BORDER | WB_3DLOOK | WB_LEFT ),
394         nGrfChanged         ( 0UL ),
395         bExecState          ( sal_False ),
396         bGraphicLinked      ( sal_False ),
397         maImageList         ( SVX_RES( CD_IMAPDLG ) ),
398         maImageListH        ( SVX_RES( CDH_IMAPDLG ) )
399 {
400     ApplyImageList();
401 
402     FreeResource();
403 
404     SvxContourDlg::SetSuperClass( *this );
405 
406     aContourWnd.SetMousePosLink( LINK( this, SvxSuperContourDlg, MousePosHdl ) );
407     aContourWnd.SetGraphSizeLink( LINK( this, SvxSuperContourDlg, GraphSizeHdl ) );
408     aContourWnd.SetUpdateLink( LINK( this, SvxSuperContourDlg, StateHdl ) );
409     aContourWnd.SetPipetteHdl( LINK( this, SvxSuperContourDlg, PipetteHdl ) );
410     aContourWnd.SetPipetteClickHdl( LINK( this, SvxSuperContourDlg, PipetteClickHdl ) );
411     aContourWnd.SetWorkplaceClickHdl( LINK( this, SvxSuperContourDlg, WorkplaceClickHdl ) );
412 
413     const Size      aTbxSize( aTbx1.CalcWindowSizePixel() );
414     Point           aPos( aTbx1.GetPosPixel() );
415     SvtMiscOptions  aMiscOptions;
416 
417     aMiscOptions.AddListenerLink( LINK( this, SvxSuperContourDlg, MiscHdl ) );
418 
419     aTbx1.SetOutStyle( aMiscOptions.GetToolboxStyle() );
420     aTbx1.SetSizePixel( aTbxSize );
421     aTbx1.SetSelectHdl( LINK( this, SvxSuperContourDlg, Tbx1ClickHdl ) );
422 
423     aPos.X() += aTbxSize.Width() + LogicToPixel( Size( 3, 0 ), MapMode( MAP_APPFONT ) ).Width();
424     aMtfTolerance.SetPosPixel( aPos );
425     aMtfTolerance.SetValue( 10L );
426 
427     SetMinOutputSizePixel( aLastSize = GetOutputSizePixel() );
428 
429     aStbStatus.InsertItem( 1, 130, SIB_LEFT | SIB_IN | SIB_AUTOSIZE );
430     aStbStatus.InsertItem( 2, 10 + GetTextWidth( String::CreateFromAscii( " 9999,99 cm / 9999,99 cm " ) ), SIB_CENTER | SIB_IN );
431     aStbStatus.InsertItem( 3, 10 + GetTextWidth( String::CreateFromAscii( " 9999,99 cm x 9999,99 cm " ) ), SIB_CENTER | SIB_IN );
432     aStbStatus.InsertItem( 4, 20, SIB_CENTER | SIB_IN );
433 
434     Resize();
435 
436     aUpdateTimer.SetTimeout( 100 );
437     aUpdateTimer.SetTimeoutHdl( LINK( this, SvxSuperContourDlg, UpdateHdl ) );
438 
439     aCreateTimer.SetTimeout( 50 );
440     aCreateTimer.SetTimeoutHdl( LINK( this, SvxSuperContourDlg, CreateHdl ) );
441 }
442 
443 
444 /*************************************************************************
445 |*
446 |* Dtor
447 |*
448 \************************************************************************/
449 
~SvxSuperContourDlg()450 SvxSuperContourDlg::~SvxSuperContourDlg()
451 {
452 }
453 
454 
455 /*************************************************************************
456 |*
457 |* Resize-Methode
458 |*
459 \************************************************************************/
460 
Resize()461 void SvxSuperContourDlg::Resize()
462 {
463     SfxFloatingWindow::Resize();
464 
465     Size aMinSize( GetMinOutputSizePixel() );
466     Size aNewSize( GetOutputSizePixel() );
467 
468     if ( aNewSize.Height() >= aMinSize.Height() )
469     {
470         Size    _aSize( aStbStatus.GetSizePixel() );
471         Point   aPoint( 0, aNewSize.Height() - _aSize.Height() );
472 
473         // StatusBar positionieren
474         aStbStatus.SetPosSizePixel( aPoint, Size( aNewSize.Width(), _aSize.Height() ) );
475         aStbStatus.Show();
476 
477         // EditWindow positionieren
478         _aSize.Width() = aNewSize.Width() - 18;
479         _aSize.Height() = aPoint.Y() - aContourWnd.GetPosPixel().Y() - 6;
480         aContourWnd.SetSizePixel( _aSize );
481 
482         aLastSize = aNewSize;
483     }
484 }
485 
486 
487 /*************************************************************************
488 |*
489 |* Close-Methode
490 |*
491 \************************************************************************/
492 
Close()493 sal_Bool SvxSuperContourDlg::Close()
494 {
495     sal_Bool bRet = sal_True;
496 
497     if ( aTbx1.IsItemEnabled( TBI_APPLY ) )
498     {
499         QueryBox    aQBox( this, WB_YES_NO_CANCEL | WB_DEF_YES,
500                            String( CONT_RESID( STR_CONTOURDLG_MODIFY ) ) );
501         const long  nRet = aQBox.Execute();
502 
503         if ( nRet == RET_YES )
504         {
505             SfxBoolItem aBoolItem( SID_CONTOUR_EXEC, sal_True );
506             GetBindings().GetDispatcher()->Execute(
507                 SID_CONTOUR_EXEC, SFX_CALLMODE_SYNCHRON | SFX_CALLMODE_RECORD, &aBoolItem, 0L );
508         }
509         else if ( nRet == RET_CANCEL )
510             bRet = sal_False;
511     }
512 
513     return( bRet ? SfxFloatingWindow::Close() : sal_False );
514 }
515 
516 
517 /*************************************************************************
518 |*
519 |* Enabled oder disabled alle Controls
520 |*
521 \************************************************************************/
522 
SetExecState(sal_Bool bEnable)523 void SvxSuperContourDlg::SetExecState( sal_Bool bEnable )
524 {
525     bExecState = bEnable;
526 }
527 
528 
529 /*************************************************************************
530 |*
531 |*
532 |*
533 \************************************************************************/
534 
SetGraphic(const Graphic & rGraphic)535 void SvxSuperContourDlg::SetGraphic( const Graphic& rGraphic )
536 {
537     aUndoGraphic = aRedoGraphic = Graphic();
538     aGraphic = rGraphic;
539     nGrfChanged = 0UL;
540     aContourWnd.SetGraphic( aGraphic );
541 }
542 
543 
544 /*************************************************************************
545 |*
546 |*
547 |*
548 \************************************************************************/
549 
SetPolyPolygon(const PolyPolygon & rPolyPoly)550 void SvxSuperContourDlg::SetPolyPolygon( const PolyPolygon& rPolyPoly )
551 {
552     DBG_ASSERT(  aContourWnd.GetGraphic().GetType() != GRAPHIC_NONE, "Graphic must've been set first!" );
553 
554     PolyPolygon     aPolyPoly( rPolyPoly );
555     const MapMode   aMap100( MAP_100TH_MM );
556     const MapMode   aGrfMap( aGraphic.GetPrefMapMode() );
557     OutputDevice*   pOutDev = Application::GetDefaultDevice();
558     sal_Bool            bPixelMap = aGrfMap.GetMapUnit() == MAP_PIXEL;
559 
560     for ( sal_uInt16 j = 0, nPolyCount = aPolyPoly.Count(); j < nPolyCount; j++ )
561     {
562         Polygon& rPoly = aPolyPoly[ j ];
563 
564         for ( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ )
565         {
566             Point& rPt = rPoly[ i ];
567 
568             if ( !bPixelMap )
569                 rPt = pOutDev->LogicToPixel( rPt, aGrfMap );
570 
571             rPt = pOutDev->PixelToLogic( rPt, aMap100 );
572         }
573     }
574 
575     aContourWnd.SetPolyPolygon( aPolyPoly );
576     aContourWnd.GetSdrModel()->SetChanged( sal_True );
577 }
578 
579 
580 /*************************************************************************
581 |*
582 |*
583 |*
584 \************************************************************************/
585 
GetPolyPolygon(sal_Bool bRescaleToGraphic)586 PolyPolygon SvxSuperContourDlg::GetPolyPolygon( sal_Bool bRescaleToGraphic )
587 {
588     PolyPolygon aRetPolyPoly( aContourWnd.GetPolyPolygon() );
589 
590     if ( bRescaleToGraphic )
591     {
592         const MapMode   aMap100( MAP_100TH_MM );
593         const MapMode   aGrfMap( aGraphic.GetPrefMapMode() );
594         OutputDevice*   pOutDev = Application::GetDefaultDevice();
595         sal_Bool            bPixelMap = aGrfMap.GetMapUnit() == MAP_PIXEL;
596 
597         for ( sal_uInt16 j = 0, nPolyCount = aRetPolyPoly.Count(); j < nPolyCount; j++ )
598         {
599             Polygon& rPoly = aRetPolyPoly[ j ];
600 
601             for ( sal_uInt16 i = 0, nCount = rPoly.GetSize(); i < nCount; i++ )
602             {
603                 Point& rPt = rPoly[ i ];
604 
605                 rPt = pOutDev->LogicToPixel( rPt, aMap100  );
606 
607                 if ( !bPixelMap )
608                     rPt = pOutDev->PixelToLogic( rPt, aGrfMap  );
609             }
610         }
611     }
612 
613     return aRetPolyPoly;
614 }
615 
616 
617 /*************************************************************************
618 |*
619 |*
620 |*
621 \************************************************************************/
622 
UpdateGraphic(const Graphic & rGraphic,sal_Bool _bGraphicLinked,const PolyPolygon * pPolyPoly,void * pEditingObj)623 void SvxSuperContourDlg::UpdateGraphic( const Graphic& rGraphic, sal_Bool _bGraphicLinked,
624                                  const PolyPolygon* pPolyPoly, void* pEditingObj )
625 {
626     aUpdateGraphic = rGraphic;
627     bUpdateGraphicLinked = _bGraphicLinked;
628     pUpdateEditingObject = pEditingObj;
629 
630     if ( pPolyPoly )
631         aUpdatePolyPoly = *pPolyPoly;
632     else
633         aUpdatePolyPoly = PolyPolygon();
634 
635     aUpdateTimer.Start();
636 }
637 
638 
639 /*************************************************************************
640 |*
641 |*
642 |*
643 \************************************************************************/
644 
IsUndoPossible() const645 sal_Bool SvxSuperContourDlg::IsUndoPossible() const
646 {
647     return aUndoGraphic.GetType() != GRAPHIC_NONE;
648 }
649 
650 
651 /*************************************************************************
652 |*
653 |*
654 |*
655 \************************************************************************/
656 
IsRedoPossible() const657 sal_Bool SvxSuperContourDlg::IsRedoPossible() const
658 {
659     return aRedoGraphic.GetType() != GRAPHIC_NONE;
660 }
661 
662 
663 /*************************************************************************
664 |*
665 |*
666 |*
667 \************************************************************************/
668 
DoAutoCreate()669 void SvxSuperContourDlg::DoAutoCreate()
670 {
671     aCreateTimer.Start();
672 }
673 
674 
675 /*************************************************************************
676 |*
677 |*
678 |*
679 \************************************************************************/
680 
ReducePoints(const long nTol)681 void SvxSuperContourDlg::ReducePoints( const long nTol )
682 {
683     PolyPolygon aPolyPoly( GetPolyPolygon( sal_False ) );
684 
685     if ( aPolyPoly.Count() )
686     {
687         const MapMode   aMapMode( MAP_100TH_MM );
688         const long      nTol2 = nTol * nTol;
689         Polygon&        rPoly = aPolyPoly[ 0 ];
690         OutputDevice*   pOutDev = Application::GetDefaultDevice();
691         Point           aPtPix;
692         const sal_uInt16    nSize = rPoly.GetSize();
693         sal_uInt16          nCounter = 0;
694 
695         if ( nSize )
696             aPtPix = pOutDev->LogicToPixel( rPoly[ 0 ], aMapMode );
697 
698         for( sal_uInt16 i = 1; i < nSize; i++ )
699         {
700             const Point&    rNewPt = rPoly[ i ];
701             const Point     aNewPtPix( pOutDev->LogicToPixel( rNewPt, aMapMode ) );
702 
703             const long nDistX = aNewPtPix.X() - aPtPix.X();
704             const long nDistY = aNewPtPix.Y() - aPtPix.Y();
705 
706             if( ( nDistX * nDistX + nDistY * nDistY ) >= nTol2 )
707             {
708                 rPoly[ ++nCounter ] = rNewPt;
709                 aPtPix = aNewPtPix;
710             }
711         }
712 
713         rPoly.SetSize( nCounter );
714         aContourWnd.SetPolyPolygon( aPolyPoly );
715         aContourWnd.GetSdrModel()->SetChanged( sal_True );
716     }
717 }
718 
719 
720 /*************************************************************************
721 |*
722 |* Click-Hdl fuer ToolBox
723 |*
724 \************************************************************************/
725 
IMPL_LINK(SvxSuperContourDlg,Tbx1ClickHdl,ToolBox *,pTbx)726 IMPL_LINK( SvxSuperContourDlg, Tbx1ClickHdl, ToolBox*, pTbx )
727 {
728     sal_uInt16 nNewItemId = pTbx->GetCurItemId();
729 
730     switch( pTbx->GetCurItemId() )
731     {
732         case( TBI_APPLY ):
733         {
734             SfxBoolItem aBoolItem( SID_CONTOUR_EXEC, sal_True );
735             GetBindings().GetDispatcher()->Execute(
736                 SID_CONTOUR_EXEC, SFX_CALLMODE_ASYNCHRON | SFX_CALLMODE_RECORD, &aBoolItem, 0L );
737         }
738         break;
739 
740         case( TBI_WORKPLACE ):
741         {
742             if ( aTbx1.IsItemChecked( TBI_WORKPLACE ) )
743             {
744                 QueryBox aQBox( this, WB_YES_NO | WB_DEF_NO, String( CONT_RESID( STR_CONTOURDLG_WORKPLACE ) ) );
745 
746                 if ( !aContourWnd.IsContourChanged() || ( aQBox.Execute() == RET_YES ) )
747                     aContourWnd.SetWorkplaceMode( sal_True );
748                 else
749                     aTbx1.CheckItem( TBI_WORKPLACE, sal_False );
750             }
751             else
752                 aContourWnd.SetWorkplaceMode( sal_False );
753         }
754         break;
755 
756         case( TBI_SELECT ):
757         {
758             pTbx->CheckItem( nNewItemId, sal_True );
759             aContourWnd.SetEditMode( sal_True );
760         }
761         break;
762 
763         case( TBI_RECT ):
764         {
765             pTbx->CheckItem( nNewItemId, sal_True );
766             aContourWnd.SetObjKind( OBJ_RECT );
767         }
768         break;
769 
770         case( TBI_CIRCLE ):
771         {
772             pTbx->CheckItem( nNewItemId, sal_True );
773             aContourWnd.SetObjKind( OBJ_CIRC );
774 
775         }
776         break;
777 
778         case( TBI_POLY ):
779         {
780             pTbx->CheckItem( nNewItemId, sal_True );
781             aContourWnd.SetObjKind( OBJ_POLY );
782         }
783         break;
784 
785         case( TBI_FREEPOLY ):
786         {
787             pTbx->CheckItem( nNewItemId, sal_True );
788             aContourWnd.SetObjKind( OBJ_FREEFILL );
789         }
790         break;
791 
792         case( TBI_POLYEDIT ):
793             aContourWnd.SetPolyEditMode( pTbx->IsItemChecked( TBI_POLYEDIT ) ? SID_BEZIER_MOVE : 0 );
794         break;
795 
796         case( TBI_POLYMOVE ):
797             aContourWnd.SetPolyEditMode( SID_BEZIER_MOVE );
798         break;
799 
800         case( TBI_POLYINSERT ):
801             aContourWnd.SetPolyEditMode( SID_BEZIER_INSERT );
802         break;
803 
804         case( TBI_POLYDELETE ):
805             aContourWnd.GetSdrView()->DeleteMarkedPoints();
806         break;
807 
808         case( TBI_UNDO ):
809         {
810             nGrfChanged = nGrfChanged ? nGrfChanged-- : 0UL;
811             aRedoGraphic = aGraphic;
812             aGraphic = aUndoGraphic;
813             aUndoGraphic = Graphic();
814             aContourWnd.SetGraphic( aGraphic, sal_False );
815         }
816         break;
817 
818         case( TBI_REDO ):
819         {
820             nGrfChanged++;
821             aUndoGraphic = aGraphic;
822             aGraphic = aRedoGraphic;
823             aRedoGraphic = Graphic();
824             aContourWnd.SetGraphic( aGraphic, sal_False );
825         }
826         break;
827 
828         case( TBI_AUTOCONTOUR ):
829             aCreateTimer.Start();
830         break;
831 
832         case( TBI_PIPETTE ):
833         {
834             sal_Bool bPipette = aTbx1.IsItemChecked( TBI_PIPETTE );
835 
836             if ( !bPipette )
837                 aStbStatus.Invalidate();
838             else if ( bGraphicLinked )
839             {
840                 QueryBox aQBox( this, WB_YES_NO | WB_DEF_YES, String( CONT_RESID( STR_CONTOURDLG_LINKED ) ) );
841 
842                 if ( aQBox.Execute() != RET_YES )
843                 {
844                     aTbx1.CheckItem( TBI_PIPETTE, bPipette = sal_False );
845                     aStbStatus.Invalidate();
846                 }
847             }
848 
849             aContourWnd.SetPipetteMode( bPipette );
850         }
851         break;
852 
853         default:
854         break;
855     }
856 
857     return 0L;
858 }
859 
860 
861 /*************************************************************************
862 |*
863 |*
864 |*
865 \************************************************************************/
866 
IMPL_LINK(SvxSuperContourDlg,MousePosHdl,ContourWindow *,pWnd)867 IMPL_LINK( SvxSuperContourDlg, MousePosHdl, ContourWindow*, pWnd )
868 {
869     String aStr;
870     const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
871     const Point& rMousePos = pWnd->GetMousePos();
872     LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
873     const sal_Unicode cSep = aLocaleWrapper.getNumDecimalSep().GetChar(0);
874 
875     aStr.Assign( GetUnitString( rMousePos.X(), eFieldUnit, cSep ) );
876     aStr.Append( String::CreateFromAscii( " / " ) );
877     aStr.Append( GetUnitString( rMousePos.Y(), eFieldUnit, cSep ) );
878 
879     aStbStatus.SetItemText( 2, aStr );
880 
881     return 0L;
882 }
883 
884 /*************************************************************************
885 |*
886 |*
887 |*
888 \************************************************************************/
889 
IMPL_LINK(SvxSuperContourDlg,GraphSizeHdl,ContourWindow *,pWnd)890 IMPL_LINK( SvxSuperContourDlg, GraphSizeHdl, ContourWindow*, pWnd )
891 {
892     String aStr;
893     const FieldUnit eFieldUnit = GetBindings().GetDispatcher()->GetModule()->GetFieldUnit();
894     const Size& rSize = pWnd->GetGraphicSize();
895     LocaleDataWrapper aLocaleWrapper( ::comphelper::getProcessServiceFactory(), Application::GetSettings().GetLocale() );
896     const sal_Unicode cSep = aLocaleWrapper.getNumDecimalSep().GetChar(0);
897 
898     aStr.Assign( GetUnitString( rSize.Width(), eFieldUnit, cSep ) );
899     aStr.Append( String::CreateFromAscii( " x " ) );
900     aStr.Append( GetUnitString( rSize.Height(), eFieldUnit, cSep ) );
901 
902     aStbStatus.SetItemText( 3, aStr );
903 
904     return 0L;
905 }
906 
907 /*************************************************************************
908 |*
909 |*
910 |*
911 \************************************************************************/
912 
IMPL_LINK(SvxSuperContourDlg,UpdateHdl,Timer *,EMPTYARG)913 IMPL_LINK( SvxSuperContourDlg, UpdateHdl, Timer*, EMPTYARG )
914 {
915     aUpdateTimer.Stop();
916 
917     if ( pUpdateEditingObject != pCheckObj )
918     {
919         if( !GetEditingObject() )
920             aContourWnd.GrabFocus();
921 
922         SetGraphic( aUpdateGraphic );
923         SetPolyPolygon( aUpdatePolyPoly );
924         SetEditingObject( pUpdateEditingObject );
925         bGraphicLinked = bUpdateGraphicLinked;
926 
927         aUpdateGraphic = Graphic();
928         aUpdatePolyPoly = PolyPolygon();
929         bUpdateGraphicLinked = sal_False;
930 
931         aContourWnd.GetSdrModel()->SetChanged( sal_False );
932     }
933 
934     GetBindings().Invalidate( SID_CONTOUR_EXEC );
935 
936     return 0L;
937 }
938 
939 
940 /*************************************************************************
941 |*
942 |*
943 |*
944 \************************************************************************/
945 
IMPL_LINK(SvxSuperContourDlg,CreateHdl,Timer *,EMPTYARG)946 IMPL_LINK( SvxSuperContourDlg, CreateHdl, Timer*, EMPTYARG )
947 {
948     aCreateTimer.Stop();
949 
950     const Rectangle aWorkRect = aContourWnd.LogicToPixel( aContourWnd.GetWorkRect(), MapMode( MAP_100TH_MM ) );
951     const Graphic&  rGraphic = aContourWnd.GetGraphic();
952     const sal_Bool      bValid = aWorkRect.Left() != aWorkRect.Right() && aWorkRect.Top() != aWorkRect.Bottom();
953 
954     EnterWait();
955     SetPolyPolygon( CreateAutoContour( rGraphic, bValid ? &aWorkRect : NULL ) );
956     LeaveWait();
957 
958     return 0L;
959 }
960 
961 
962 /*************************************************************************
963 |*
964 |*
965 |*
966 \************************************************************************/
967 
IMPL_LINK(SvxSuperContourDlg,StateHdl,ContourWindow *,pWnd)968 IMPL_LINK( SvxSuperContourDlg, StateHdl, ContourWindow*, pWnd )
969 {
970     const SdrObject*    pObj = pWnd->GetSelectedSdrObject();
971     const SdrView*      pView = pWnd->GetSdrView();
972     const sal_Bool          bPolyEdit = ( pObj != NULL ) && pObj->ISA( SdrPathObj );
973     const sal_Bool          bDrawEnabled = !( bPolyEdit && aTbx1.IsItemChecked( TBI_POLYEDIT ) );
974     const sal_Bool          bPipette = aTbx1.IsItemChecked( TBI_PIPETTE );
975     const sal_Bool          bWorkplace = aTbx1.IsItemChecked( TBI_WORKPLACE );
976     const sal_Bool          bDontHide = !( bPipette || bWorkplace );
977     const sal_Bool          bBitmap = pWnd->GetGraphic().GetType() == GRAPHIC_BITMAP;
978 
979     aTbx1.EnableItem( TBI_APPLY, bDontHide && bExecState && pWnd->IsChanged() );
980 
981     aTbx1.EnableItem( TBI_WORKPLACE, !bPipette && bDrawEnabled );
982 
983     aTbx1.EnableItem( TBI_SELECT, bDontHide && bDrawEnabled );
984     aTbx1.EnableItem( TBI_RECT, bDontHide && bDrawEnabled );
985     aTbx1.EnableItem( TBI_CIRCLE, bDontHide && bDrawEnabled );
986     aTbx1.EnableItem( TBI_POLY, bDontHide && bDrawEnabled );
987     aTbx1.EnableItem( TBI_FREEPOLY, bDontHide && bDrawEnabled );
988 
989     aTbx1.EnableItem( TBI_POLYEDIT, bDontHide && bPolyEdit );
990     aTbx1.EnableItem( TBI_POLYMOVE, bDontHide && !bDrawEnabled );
991     aTbx1.EnableItem( TBI_POLYINSERT, bDontHide && !bDrawEnabled );
992     aTbx1.EnableItem( TBI_POLYDELETE, bDontHide && !bDrawEnabled && pView->IsDeleteMarkedPointsPossible() );
993 
994     aTbx1.EnableItem( TBI_AUTOCONTOUR, bDontHide && bDrawEnabled );
995     aTbx1.EnableItem( TBI_PIPETTE, !bWorkplace && bDrawEnabled && bBitmap );
996 
997     aTbx1.EnableItem( TBI_UNDO, bDontHide && IsUndoPossible() );
998     aTbx1.EnableItem( TBI_REDO, bDontHide && IsRedoPossible() );
999 
1000     if ( bPolyEdit )
1001     {
1002         sal_uInt16 nId = 0;
1003 
1004         switch( pWnd->GetPolyEditMode() )
1005         {
1006             case( SID_BEZIER_MOVE ): nId = TBI_POLYMOVE; break;
1007             case( SID_BEZIER_INSERT ): nId = TBI_POLYINSERT; break;
1008 
1009             default:
1010             break;
1011         }
1012 
1013         aTbx1.CheckItem( nId, sal_True );
1014     }
1015     else
1016     {
1017         aTbx1.CheckItem( TBI_POLYEDIT, sal_False );
1018         aTbx1.CheckItem( TBI_POLYMOVE, sal_True );
1019         aTbx1.CheckItem( TBI_POLYINSERT, sal_False );
1020         pWnd->SetPolyEditMode( 0 );
1021     }
1022 
1023     return 0L;
1024 }
1025 
1026 
1027 /*************************************************************************
1028 |*
1029 |*
1030 |*
1031 \************************************************************************/
1032 
IMPL_LINK(SvxSuperContourDlg,PipetteHdl,ContourWindow *,pWnd)1033 IMPL_LINK( SvxSuperContourDlg, PipetteHdl, ContourWindow*, pWnd )
1034 {
1035     const Color& rOldLineColor = aStbStatus.GetLineColor();
1036     const Color& rOldFillColor = aStbStatus.GetFillColor();
1037 
1038     Rectangle       aRect( aStbStatus.GetItemRect( 4 ) );
1039     const Color&    rColor = pWnd->GetPipetteColor();
1040 
1041     aStbStatus.SetLineColor( rColor );
1042     aStbStatus.SetFillColor( rColor );
1043 
1044     aRect.Left() += 4;
1045     aRect.Top() += 4;
1046     aRect.Right() -= 4;
1047     aRect.Bottom() -= 4;
1048 
1049     aStbStatus.DrawRect( aRect );
1050 
1051     aStbStatus.SetLineColor( rOldLineColor );
1052     aStbStatus.SetFillColor( rOldFillColor );
1053 
1054     return 0L;
1055 }
1056 
1057 
1058 /*************************************************************************
1059 |*
1060 |*
1061 |*
1062 \************************************************************************/
1063 
IMPL_LINK(SvxSuperContourDlg,PipetteClickHdl,ContourWindow *,pWnd)1064 IMPL_LINK( SvxSuperContourDlg, PipetteClickHdl, ContourWindow*, pWnd )
1065 {
1066     if ( pWnd->IsClickValid() )
1067     {
1068         Bitmap          aMask;
1069         const Color&    rColor = pWnd->GetPipetteColor();
1070 
1071         EnterWait();
1072 
1073         if( aGraphic.GetType() == GRAPHIC_BITMAP )
1074         {
1075             Bitmap      aBmp( aGraphic.GetBitmap() );
1076             const long  nTol = static_cast<long>(aMtfTolerance.GetValue() * 255L / 100L);
1077 
1078             aMask = aBmp.CreateMask( rColor, nTol );
1079 
1080             if( aGraphic.IsTransparent() )
1081                 aMask.CombineSimple( aGraphic.GetBitmapEx().GetMask(), BMP_COMBINE_OR );
1082 
1083             if( !!aMask )
1084             {
1085                 QueryBox    aQBox( this, WB_YES_NO | WB_DEF_YES, String( CONT_RESID( STR_CONTOURDLG_NEWPIPETTE ) ) );
1086                 sal_Bool        bNewContour;
1087 
1088                 aRedoGraphic = Graphic();
1089                 aUndoGraphic = aGraphic;
1090                 aGraphic = Graphic( BitmapEx( aBmp, aMask ) );
1091                 nGrfChanged++;
1092 
1093                 bNewContour = ( aQBox.Execute() == RET_YES );
1094                 pWnd->SetGraphic( aGraphic, bNewContour );
1095 
1096                 if( bNewContour )
1097                     aCreateTimer.Start();
1098             }
1099         }
1100 
1101         LeaveWait();
1102     }
1103 
1104     aTbx1.CheckItem( TBI_PIPETTE, sal_False );
1105     pWnd->SetPipetteMode( sal_False );
1106     aStbStatus.Invalidate();
1107 
1108     return 0L;
1109 }
1110 
1111 
1112 /*************************************************************************
1113 |*
1114 |*
1115 |*
1116 \************************************************************************/
1117 
IMPL_LINK(SvxSuperContourDlg,WorkplaceClickHdl,ContourWindow *,pWnd)1118 IMPL_LINK( SvxSuperContourDlg, WorkplaceClickHdl, ContourWindow*, pWnd )
1119 {
1120     aTbx1.CheckItem( TBI_WORKPLACE, sal_False );
1121     aTbx1.CheckItem( TBI_SELECT, sal_True );
1122     pWnd->SetWorkplaceMode( sal_False );
1123 
1124     return 0L;
1125 }
1126 
ApplyImageList()1127 void SvxSuperContourDlg::ApplyImageList()
1128 {
1129     bool bHighContrast = GetSettings().GetStyleSettings().GetHighContrastMode();
1130 
1131     ImageList& rImgLst = bHighContrast ? maImageListH : maImageList;
1132 
1133     aTbx1.SetImageList( rImgLst );
1134 }
1135 
DataChanged(const DataChangedEvent & rDCEvt)1136 void SvxSuperContourDlg::DataChanged( const DataChangedEvent& rDCEvt )
1137 {
1138     SfxFloatingWindow::DataChanged( rDCEvt );
1139 
1140     if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1141             ApplyImageList();
1142 }
1143 
1144 /*************************************************************************
1145 |*
1146 |*
1147 |*
1148 \************************************************************************/
1149 
IMPL_LINK(SvxSuperContourDlg,MiscHdl,void *,EMPTYARG)1150 IMPL_LINK( SvxSuperContourDlg, MiscHdl, void*, EMPTYARG )
1151 {
1152     SvtMiscOptions aMiscOptions;
1153     aTbx1.SetOutStyle( aMiscOptions.GetToolboxStyle() );
1154 
1155     return 0L;
1156 }
1157 
1158