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