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