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 <vcl/metaact.hxx>
22 : #include <vcl/settings.hxx>
23 : #include <svtools/valueset.hxx>
24 : #include <svl/eitem.hxx>
25 : #include <sfx2/dispatch.hxx>
26 : #include <svtools/colrdlg.hxx>
27 :
28 : #define BMPMASK_PRIVATE
29 :
30 : #include <svx/dialmgr.hxx>
31 : #include <svx/bmpmask.hxx>
32 : #include <svx/dialogs.hrc>
33 : #include <bmpmask.hrc>
34 : #include <svx/svxids.hrc>
35 : #include <boost/scoped_array.hpp>
36 : #include <boost/scoped_ptr.hpp>
37 :
38 :
39 : #define BMP_RESID(nId) ResId(nId, DIALOG_MGR())
40 : #define TRANSP_COL (Color( 252, 252, 252 ))
41 : #define OWN_CALLMODE SfxCallMode::ASYNCHRON | SfxCallMode::RECORD
42 :
43 :
44 :
45 : #define TEST_COLS() \
46 : { \
47 : nR = aCol.GetRed(); nG = aCol.GetGreen(); nB = aCol.GetBlue(); \
48 : for( i = 0; i < nCount; i++ ) \
49 : { \
50 : if ( ( pMinR[i] <= nR ) && ( pMaxR[i] >= nR ) && \
51 : ( pMinG[i] <= nG ) && ( pMaxG[i] >= nG ) && \
52 : ( pMinB[i] <= nB ) && ( pMaxB[i] >= nB ) ) \
53 : { \
54 : aCol = pDstCols[i]; bReplace = true; break; \
55 : } \
56 : } \
57 : }
58 :
59 :
60 :
61 658 : SFX_IMPL_DOCKINGWINDOW_WITHID( SvxBmpMaskChildWindow, SID_BMPMASK )
62 :
63 :
64 :
65 0 : class ColorWindow : public Control
66 : {
67 : Color aColor;
68 :
69 :
70 : public:
71 0 : ColorWindow( vcl::Window* pParent, const ResId& rId ) :
72 : Control( pParent, rId ),
73 0 : aColor( COL_WHITE ) {};
74 :
75 0 : void SetColor( const Color& rColor )
76 : {
77 0 : aColor = rColor;
78 0 : Invalidate();
79 0 : }
80 :
81 : virtual void Paint( const Rectangle& rRect ) SAL_OVERRIDE;
82 : };
83 :
84 :
85 :
86 0 : class MaskSet : public ValueSet
87 : {
88 : SvxBmpMask* pSvxBmpMask;
89 :
90 :
91 : public:
92 : MaskSet( SvxBmpMask* pParent, const ResId& rId );
93 :
94 : virtual void Select() SAL_OVERRIDE;
95 : virtual void KeyInput( const KeyEvent& rKEvt ) SAL_OVERRIDE;
96 : virtual void GetFocus() SAL_OVERRIDE;
97 :
98 : void onEditColor();
99 : };
100 :
101 :
102 :
103 0 : MaskSet::MaskSet( SvxBmpMask* pParent, const ResId& rId ) :
104 : ValueSet ( pParent, rId ),
105 0 : pSvxBmpMask ( pParent )
106 : {
107 0 : }
108 :
109 :
110 :
111 0 : void MaskSet::Select()
112 : {
113 0 : ValueSet::Select();
114 :
115 0 : pSvxBmpMask->onSelect( this );
116 0 : }
117 :
118 0 : void MaskSet::GetFocus()
119 : {
120 0 : ValueSet::GetFocus();
121 0 : SelectItem( 1 );
122 0 : pSvxBmpMask->onSelect( this );
123 0 : }
124 :
125 0 : void MaskSet::KeyInput( const KeyEvent& rKEvt )
126 : {
127 0 : vcl::KeyCode aCode = rKEvt.GetKeyCode();
128 :
129 : // if the key has a modifier we don't care
130 0 : if( aCode.GetModifier() )
131 : {
132 0 : ValueSet::KeyInput( rKEvt );
133 : }
134 : else
135 : {
136 : // check for keys that interests us
137 0 : switch ( aCode.GetCode() )
138 : {
139 : case KEY_SPACE:
140 0 : onEditColor();
141 0 : break;
142 : default:
143 0 : ValueSet::KeyInput( rKEvt );
144 : }
145 :
146 : }
147 0 : }
148 :
149 0 : void MaskSet::onEditColor()
150 : {
151 0 : boost::scoped_ptr<SvColorDialog> pColorDlg(new SvColorDialog( GetParent() ));
152 :
153 0 : pColorDlg->SetColor(GetItemColor(1));
154 :
155 0 : if( pColorDlg->Execute() )
156 0 : SetItemColor( 1, pColorDlg->GetColor() );
157 0 : }
158 :
159 :
160 :
161 : class MaskData
162 : {
163 : SvxBmpMask* pMask;
164 : bool bIsReady;
165 : bool bExecState;
166 : SfxBindings& rBindings;
167 :
168 : public:
169 : MaskData( SvxBmpMask* pBmpMask, SfxBindings& rBind );
170 :
171 0 : bool IsCbxReady() const { return bIsReady; }
172 0 : void SetExecState( bool bState ) { bExecState = bState; }
173 0 : bool IsExecReady() const { return bExecState; }
174 :
175 : DECL_LINK( PipetteHdl, ToolBox* pTbx );
176 : DECL_LINK( CbxHdl, CheckBox* pCbx );
177 : DECL_LINK( CbxTransHdl, CheckBox* pCbx );
178 : DECL_LINK( FocusLbHdl, ColorLB* pLb );
179 : DECL_LINK(ExecHdl, void *);
180 : };
181 :
182 :
183 :
184 0 : MaskData::MaskData( SvxBmpMask* pBmpMask, SfxBindings& rBind ) :
185 :
186 : pMask ( pBmpMask ),
187 : bIsReady ( false ),
188 : bExecState ( false ),
189 0 : rBindings ( rBind )
190 :
191 : {
192 0 : }
193 :
194 :
195 :
196 0 : IMPL_LINK( MaskData, PipetteHdl, ToolBox*, pTbx )
197 : {
198 : SfxBoolItem aBItem( SID_BMPMASK_PIPETTE,
199 0 : pTbx->IsItemChecked( TBI_PIPETTE ) );
200 :
201 0 : rBindings.GetDispatcher()->Execute( SID_BMPMASK_PIPETTE, OWN_CALLMODE, &aBItem, 0L );
202 :
203 0 : return 0;
204 : }
205 :
206 :
207 :
208 0 : IMPL_LINK( MaskData, CbxHdl, CheckBox*, pCbx )
209 : {
210 0 : bIsReady = pMask->aCbx1.IsChecked() || pMask->aCbx2.IsChecked() ||
211 0 : pMask->aCbx3.IsChecked() || pMask->aCbx4.IsChecked();
212 :
213 0 : if ( bIsReady && IsExecReady() )
214 0 : pMask->aBtnExec.Enable();
215 : else
216 0 : pMask->aBtnExec.Disable();
217 :
218 : // When a checkbox is checked, the pipette is enabled
219 0 : if ( pCbx->IsChecked() )
220 : {
221 0 : MaskSet* pSet = NULL;
222 :
223 0 : if ( pCbx == &( pMask->aCbx1 ) )
224 0 : pSet = pMask->pQSet1;
225 0 : else if ( pCbx == &( pMask->aCbx2 ) )
226 0 : pSet = pMask->pQSet2;
227 0 : else if ( pCbx == &( pMask->aCbx3 ) )
228 0 : pSet = pMask->pQSet3;
229 : else // if ( pCbx == &( pMask->aCbx4 ) )
230 0 : pSet = pMask->pQSet4;
231 :
232 0 : pSet->SelectItem( 1 );
233 0 : pSet->Select();
234 :
235 0 : pMask->aTbxPipette.CheckItem( TBI_PIPETTE, true );
236 0 : PipetteHdl( &( pMask->aTbxPipette ) );
237 : }
238 :
239 0 : return 0;
240 : }
241 :
242 :
243 :
244 0 : IMPL_LINK( MaskData, CbxTransHdl, CheckBox*, pCbx )
245 : {
246 0 : bIsReady = pCbx->IsChecked();
247 0 : if ( bIsReady )
248 : {
249 0 : pMask->pQSet1->Disable();
250 0 : pMask->pQSet2->Disable();
251 0 : pMask->pQSet3->Disable();
252 0 : pMask->pQSet4->Disable();
253 0 : pMask->pCtlPipette->Disable();
254 0 : pMask->aCbx1.Disable();
255 0 : pMask->aSp1.Disable();
256 0 : pMask->aCbx2.Disable();
257 0 : pMask->aSp2.Disable();
258 0 : pMask->aCbx3.Disable();
259 0 : pMask->aSp3.Disable();
260 0 : pMask->aCbx4.Disable();
261 0 : pMask->aSp4.Disable();
262 0 : pMask->aTbxPipette.Disable();
263 :
264 0 : pMask->aLbColor1.Disable();
265 0 : pMask->aLbColor2.Disable();
266 0 : pMask->aLbColor3.Disable();
267 0 : pMask->aLbColor4.Disable();
268 0 : pMask->aLbColorTrans.Enable();
269 : }
270 : else
271 : {
272 0 : pMask->pQSet1->Enable();
273 0 : pMask->pQSet2->Enable();
274 0 : pMask->pQSet3->Enable();
275 0 : pMask->pQSet4->Enable();
276 0 : pMask->pCtlPipette->Enable();
277 0 : pMask->aCbx1.Enable();
278 0 : pMask->aSp1.Enable();
279 0 : pMask->aCbx2.Enable();
280 0 : pMask->aSp2.Enable();
281 0 : pMask->aCbx3.Enable();
282 0 : pMask->aSp3.Enable();
283 0 : pMask->aCbx4.Enable();
284 0 : pMask->aSp4.Enable();
285 0 : pMask->aTbxPipette.Enable();
286 :
287 0 : pMask->aLbColor1.Enable();
288 0 : pMask->aLbColor2.Enable();
289 0 : pMask->aLbColor3.Enable();
290 0 : pMask->aLbColor4.Enable();
291 0 : pMask->aLbColorTrans.Disable();
292 :
293 0 : bIsReady = pMask->aCbx1.IsChecked() || pMask->aCbx2.IsChecked() ||
294 0 : pMask->aCbx3.IsChecked() || pMask->aCbx4.IsChecked();
295 : }
296 :
297 0 : if ( bIsReady && IsExecReady() )
298 0 : pMask->aBtnExec.Enable();
299 : else
300 0 : pMask->aBtnExec.Disable();
301 :
302 0 : return 0L;
303 : }
304 :
305 :
306 :
307 0 : IMPL_LINK( MaskData, FocusLbHdl, ColorLB*, pLb )
308 : {
309 : // MT: bFireFox as API parameter is ugly, find better solution????
310 0 : pMask->pQSet1->SelectItem( pLb == &( pMask->aLbColor1 ) ? 1 : 0 /* , false */ );
311 0 : pMask->pQSet2->SelectItem( pLb == &( pMask->aLbColor2 ) ? 1 : 0 /* , false */ );
312 0 : pMask->pQSet3->SelectItem( pLb == &( pMask->aLbColor3 ) ? 1 : 0 /* , false */ );
313 0 : pMask->pQSet4->SelectItem( pLb == &( pMask->aLbColor4 ) ? 1 : 0 /* , false */ );
314 :
315 0 : return 0;
316 : }
317 :
318 :
319 :
320 0 : IMPL_LINK_NOARG(MaskData, ExecHdl)
321 : {
322 0 : SfxBoolItem aBItem( SID_BMPMASK_EXEC, true );
323 0 : rBindings.GetDispatcher()->Execute( SID_BMPMASK_EXEC, OWN_CALLMODE, &aBItem, 0L );
324 :
325 0 : return 0L;
326 : }
327 :
328 :
329 :
330 0 : void ColorWindow::Paint( const Rectangle &/*Rect*/ )
331 : {
332 0 : const Color& rOldLineColor = GetLineColor();
333 0 : const Color& rOldFillColor = GetFillColor();
334 :
335 0 : SetLineColor( aColor );
336 0 : SetFillColor( aColor );
337 :
338 0 : DrawRect( Rectangle( Point(), GetSizePixel() ) );
339 :
340 0 : SetLineColor( rOldLineColor );
341 0 : SetFillColor( rOldFillColor );
342 0 : }
343 :
344 :
345 :
346 0 : SvxBmpMaskSelectItem::SvxBmpMaskSelectItem( sal_uInt16 nId_, SvxBmpMask& rMask,
347 : SfxBindings& rBindings ) :
348 : SfxControllerItem ( nId_, rBindings ),
349 0 : rBmpMask ( rMask)
350 : {
351 0 : }
352 :
353 :
354 :
355 0 : void SvxBmpMaskSelectItem::StateChanged( sal_uInt16 nSID, SfxItemState /*eState*/,
356 : const SfxPoolItem* pItem )
357 : {
358 0 : if ( ( nSID == SID_BMPMASK_EXEC ) && pItem )
359 : {
360 0 : const SfxBoolItem* pStateItem = PTR_CAST( SfxBoolItem, pItem );
361 : assert(pStateItem); //SfxBoolItem erwartet
362 0 : if (pStateItem)
363 0 : rBmpMask.SetExecState( pStateItem->GetValue() );
364 : }
365 0 : }
366 :
367 :
368 :
369 0 : SvxBmpMaskChildWindow::SvxBmpMaskChildWindow( vcl::Window* pParent_, sal_uInt16 nId,
370 : SfxBindings* pBindings,
371 : SfxChildWinInfo* pInfo ) :
372 0 : SfxChildWindow( pParent_, nId )
373 : {
374 : pWindow = new SvxBmpMask( pBindings, this, pParent_,
375 0 : BMP_RESID( RID_SVXDLG_BMPMASK ) );
376 0 : SvxBmpMask* pDlg = static_cast<SvxBmpMask*>(pWindow);
377 :
378 0 : eChildAlignment = SFX_ALIGN_NOALIGNMENT;
379 :
380 0 : pDlg->Initialize( pInfo );
381 0 : }
382 :
383 :
384 :
385 0 : SvxBmpMask::SvxBmpMask( SfxBindings *pBindinx,
386 : SfxChildWindow *pCW,
387 : vcl::Window* pParent,
388 : const ResId& rResId ) :
389 : SfxDockingWindow ( pBindinx, pCW, pParent, rResId ),
390 0 : aTbxPipette ( this, BMP_RESID( TBX_PIPETTE ) ),
391 0 : pCtlPipette ( new ColorWindow( this, BMP_RESID( WND_PIPETTE ) ) ),
392 0 : aBtnExec ( this, BMP_RESID( BTN_EXEC ) ),
393 0 : aGrpQ ( this, BMP_RESID( GRP_Q ) ),
394 :
395 0 : aFt1 ( this, BMP_RESID ( FT_1 ) ),
396 0 : aFt2 ( this, BMP_RESID ( FT_2 ) ),
397 0 : aFt3 ( this, BMP_RESID ( FT_3 ) ),
398 :
399 0 : aCbx1 ( this, BMP_RESID( CBX_1 ) ),
400 0 : pQSet1 ( new MaskSet( this, BMP_RESID( QCOL_1 ) ) ),
401 0 : aSp1 ( this, BMP_RESID( SP_1 ) ),
402 0 : aLbColor1 ( this, BMP_RESID ( LB_1 ) ),
403 :
404 0 : aCbx2 ( this, BMP_RESID( CBX_2 ) ),
405 0 : pQSet2 ( new MaskSet( this, BMP_RESID( QCOL_2 ) ) ),
406 0 : aSp2 ( this, BMP_RESID( SP_2 ) ),
407 0 : aLbColor2 ( this, BMP_RESID ( LB_2 ) ),
408 :
409 0 : aCbx3 ( this, BMP_RESID( CBX_3 ) ),
410 0 : pQSet3 ( new MaskSet( this, BMP_RESID( QCOL_3 ) ) ),
411 0 : aSp3 ( this, BMP_RESID( SP_3 ) ),
412 0 : aLbColor3 ( this, BMP_RESID ( LB_3 ) ),
413 :
414 0 : aCbx4 ( this, BMP_RESID( CBX_4 ) ),
415 0 : pQSet4 ( new MaskSet( this, BMP_RESID( QCOL_4 ) ) ),
416 0 : aSp4 ( this, BMP_RESID( SP_4 ) ),
417 0 : aLbColor4 ( this, BMP_RESID ( LB_4 ) ),
418 :
419 0 : pData ( new MaskData( this, *pBindinx ) ),
420 0 : aCbxTrans ( this, BMP_RESID( CBX_TRANS ) ),
421 0 : aLbColorTrans ( this, BMP_RESID ( LB_TRANS ) ),
422 : aPipetteColor ( COL_WHITE ),
423 : aSelItem ( SID_BMPMASK_EXEC, *this, *pBindinx ),
424 0 : maImgPipette ( BMP_RESID ( IMG_PIPETTE ) )
425 : {
426 0 : FreeResource();
427 :
428 0 : ApplyStyle();
429 :
430 0 : aTbxPipette.SetSizePixel( aTbxPipette.CalcWindowSizePixel() );
431 0 : aTbxPipette.SetSelectHdl( LINK( pData, MaskData, PipetteHdl ) );
432 0 : aBtnExec.SetClickHdl( LINK( pData, MaskData, ExecHdl ) );
433 :
434 0 : aCbx1.SetClickHdl( LINK( pData, MaskData, CbxHdl ) );
435 0 : aCbx2.SetClickHdl( LINK( pData, MaskData, CbxHdl ) );
436 0 : aCbx3.SetClickHdl( LINK( pData, MaskData, CbxHdl ) );
437 0 : aCbx4.SetClickHdl( LINK( pData, MaskData, CbxHdl ) );
438 0 : aCbxTrans.SetClickHdl( LINK( pData, MaskData, CbxTransHdl ) );
439 :
440 0 : SetAccessibleNames ();
441 :
442 0 : aLbColor1.SetGetFocusHdl( LINK( pData, MaskData, FocusLbHdl ) );
443 0 : aLbColor2.SetGetFocusHdl( LINK( pData, MaskData, FocusLbHdl ) );
444 0 : aLbColor3.SetGetFocusHdl( LINK( pData, MaskData, FocusLbHdl ) );
445 0 : aLbColor4.SetGetFocusHdl( LINK( pData, MaskData, FocusLbHdl ) );
446 0 : aLbColorTrans.Disable();
447 :
448 0 : aSp1.SetValue( 10 );
449 0 : aSp2.SetValue( 10 );
450 0 : aSp3.SetValue( 10 );
451 0 : aSp4.SetValue( 10 );
452 :
453 0 : pQSet1->SetStyle( pQSet1->GetStyle() | WB_DOUBLEBORDER | WB_ITEMBORDER );
454 0 : pQSet1->SetColCount( 1 );
455 0 : pQSet1->SetLineCount( 1 );
456 0 : OUString sColorPalette (BMP_RESID( RID_SVXDLG_BMPMASK_STR_PALETTE));
457 0 : OUString sColorPaletteN;
458 0 : sColorPaletteN = sColorPalette;
459 0 : sColorPaletteN += " 1";
460 0 : pQSet1->InsertItem( 1, aPipetteColor, sColorPaletteN);
461 0 : pQSet1->SelectItem( 1 );
462 :
463 0 : pQSet2->SetStyle( pQSet2->GetStyle() | WB_DOUBLEBORDER | WB_ITEMBORDER );
464 0 : pQSet2->SetColCount( 1 );
465 0 : pQSet2->SetLineCount( 1 );
466 0 : sColorPaletteN = sColorPalette;
467 0 : sColorPaletteN += " 2";
468 0 : pQSet2->InsertItem( 1, aPipetteColor, sColorPaletteN);
469 0 : pQSet2->SelectItem( 0 );
470 :
471 0 : pQSet3->SetStyle( pQSet3->GetStyle() | WB_DOUBLEBORDER | WB_ITEMBORDER );
472 0 : pQSet3->SetColCount( 1 );
473 0 : pQSet3->SetLineCount( 1 );
474 0 : sColorPaletteN = sColorPalette;
475 0 : sColorPaletteN += " 3";
476 0 : pQSet3->InsertItem( 1, aPipetteColor, sColorPaletteN);
477 0 : pQSet3->SelectItem( 0 );
478 :
479 0 : pQSet4->SetStyle( pQSet4->GetStyle() | WB_DOUBLEBORDER | WB_ITEMBORDER );
480 0 : pQSet4->SetColCount( 1 );
481 0 : pQSet4->SetLineCount( 1 );
482 0 : sColorPaletteN = sColorPalette;
483 0 : sColorPaletteN += " 4";
484 0 : pQSet4->InsertItem( 1, aPipetteColor, sColorPaletteN);
485 0 : pQSet4->SelectItem( 0 );
486 :
487 0 : pQSet1->Show();
488 0 : pQSet2->Show();
489 0 : pQSet3->Show();
490 0 : pQSet4->Show();
491 :
492 0 : aCbx1.SetAccessibleRelationMemberOf( &aGrpQ );
493 0 : pQSet1->SetAccessibleRelationMemberOf( &aGrpQ );
494 0 : aSp1.SetAccessibleRelationMemberOf( &aGrpQ );
495 0 : aLbColor1.SetAccessibleRelationMemberOf( &aGrpQ );
496 0 : aCbx1.SetAccessibleRelationLabeledBy( &aFt1 );
497 0 : pQSet1->SetAccessibleRelationLabeledBy( &aFt1 );
498 0 : aSp1.SetAccessibleRelationLabeledBy( &aFt2 );
499 0 : aLbColor1.SetAccessibleRelationLabeledBy( &aFt3 );
500 0 : aCbx2.SetAccessibleRelationMemberOf( &aGrpQ );
501 0 : pQSet2->SetAccessibleRelationMemberOf( &aGrpQ );
502 0 : aSp2.SetAccessibleRelationMemberOf( &aGrpQ );
503 0 : aLbColor2.SetAccessibleRelationMemberOf( &aGrpQ );
504 0 : aCbx2.SetAccessibleRelationLabeledBy( &aFt1 );
505 0 : pQSet2->SetAccessibleRelationLabeledBy( &aFt1 );
506 0 : aSp2.SetAccessibleRelationLabeledBy( &aFt2 );
507 0 : aLbColor2.SetAccessibleRelationLabeledBy( &aFt3 );
508 0 : aCbx3.SetAccessibleRelationMemberOf( &aGrpQ );
509 0 : pQSet3->SetAccessibleRelationMemberOf( &aGrpQ );
510 0 : aSp3.SetAccessibleRelationMemberOf( &aGrpQ );
511 0 : aLbColor3.SetAccessibleRelationMemberOf( &aGrpQ );
512 0 : aCbx3.SetAccessibleRelationLabeledBy( &aFt1 );
513 0 : pQSet3->SetAccessibleRelationLabeledBy( &aFt1 );
514 0 : aSp3.SetAccessibleRelationLabeledBy( &aFt2 );
515 0 : aLbColor3.SetAccessibleRelationLabeledBy( &aFt3 );
516 0 : aCbx4.SetAccessibleRelationMemberOf( &aGrpQ );
517 0 : pQSet4->SetAccessibleRelationMemberOf( &aGrpQ );
518 0 : aSp4.SetAccessibleRelationMemberOf( &aGrpQ );
519 0 : aLbColor4.SetAccessibleRelationMemberOf( &aGrpQ );
520 0 : aCbx4.SetAccessibleRelationLabeledBy( &aFt1 );
521 0 : pQSet4->SetAccessibleRelationLabeledBy( &aFt1 );
522 0 : aSp4.SetAccessibleRelationLabeledBy( &aFt2 );
523 0 : aLbColor4.SetAccessibleRelationLabeledBy( &aFt3 );
524 0 : aLbColorTrans.SetAccessibleRelationLabeledBy( &aCbxTrans );
525 0 : aLbColorTrans.SetAccessibleRelationMemberOf( &aGrpQ );
526 0 : aCbxTrans.SetAccessibleRelationMemberOf( &aGrpQ );
527 0 : }
528 :
529 :
530 :
531 0 : SvxBmpMask::~SvxBmpMask()
532 : {
533 0 : delete pQSet1;
534 0 : delete pQSet2;
535 0 : delete pQSet3;
536 0 : delete pQSet4;
537 0 : delete pCtlPipette;
538 0 : delete pData;
539 0 : }
540 :
541 :
542 :
543 : /** is called by a MaskSet when it is selected */
544 0 : void SvxBmpMask::onSelect( MaskSet* pSet )
545 : {
546 : // now deselect all other value sets
547 0 : if( pSet != pQSet1 )
548 0 : pQSet1->SelectItem( 0 );
549 :
550 0 : if( pSet != pQSet2 )
551 0 : pQSet2->SelectItem( 0 );
552 :
553 0 : if( pSet != pQSet3 )
554 0 : pQSet3->SelectItem( 0 );
555 :
556 0 : if( pSet != pQSet4 )
557 0 : pQSet4->SelectItem( 0 );
558 0 : }
559 :
560 :
561 :
562 0 : bool SvxBmpMask::Close()
563 : {
564 0 : SfxBoolItem aItem2( SID_BMPMASK_PIPETTE, false );
565 0 : GetBindings().GetDispatcher()->Execute( SID_BMPMASK_PIPETTE, OWN_CALLMODE, &aItem2, 0L );
566 :
567 0 : return SfxDockingWindow::Close();
568 : }
569 :
570 :
571 :
572 0 : bool SvxBmpMask::NeedsColorList() const
573 : {
574 0 : return ( aLbColor1.GetEntryCount() == 0 );
575 : }
576 :
577 :
578 :
579 0 : void SvxBmpMask::SetColorList( const XColorListRef &pList )
580 : {
581 0 : if ( pList.is() && ( pList != pColLst ) )
582 : {
583 0 : const OUString aTransp(BMP_RESID(RID_SVXDLG_BMPMASK_STR_TRANSP).toString());
584 :
585 0 : pColLst = pList;
586 :
587 0 : aLbColorTrans.Fill( pColLst );
588 0 : aLbColorTrans.SelectEntryPos( 0 );
589 :
590 0 : aLbColor1.Fill( pColLst );
591 0 : aLbColor1.InsertEntry( TRANSP_COL, aTransp, 0 );
592 0 : aLbColor1.SelectEntryPos( 0 );
593 :
594 0 : aLbColor2.Fill( pColLst );
595 0 : aLbColor2.InsertEntry( TRANSP_COL, aTransp, 0 );
596 0 : aLbColor2.SelectEntryPos( 0 );
597 :
598 0 : aLbColor3.Fill( pColLst );
599 0 : aLbColor3.InsertEntry( TRANSP_COL, aTransp, 0 );
600 0 : aLbColor3.SelectEntryPos( 0 );
601 :
602 0 : aLbColor4.Fill( pColLst );
603 0 : aLbColor4.InsertEntry( TRANSP_COL, aTransp, 0 );
604 0 : aLbColor4.SelectEntryPos( 0 );
605 : }
606 0 : }
607 :
608 :
609 :
610 0 : void SvxBmpMask::SetColor( const Color& rColor )
611 : {
612 0 : aPipetteColor = rColor;
613 0 : pCtlPipette->SetColor( aPipetteColor );
614 0 : }
615 :
616 :
617 :
618 0 : void SvxBmpMask::PipetteClicked()
619 : {
620 0 : if( pQSet1->GetSelectItemId() == 1 )
621 : {
622 0 : aCbx1.Check( true );
623 0 : pData->CbxHdl( &aCbx1 );
624 0 : pQSet1->SetItemColor( 1, aPipetteColor );
625 : }
626 0 : else if( pQSet2->GetSelectItemId() == 1 )
627 : {
628 0 : aCbx2.Check( true );
629 0 : pData->CbxHdl( &aCbx2 );
630 0 : pQSet2->SetItemColor( 1, aPipetteColor );
631 : }
632 0 : else if( pQSet3->GetSelectItemId() == 1 )
633 : {
634 0 : aCbx3.Check( true );
635 0 : pData->CbxHdl( &aCbx3 );
636 0 : pQSet3->SetItemColor( 1, aPipetteColor );
637 : }
638 0 : else if( pQSet4->GetSelectItemId() == 1 )
639 : {
640 0 : aCbx4.Check( true );
641 0 : pData->CbxHdl( &aCbx4 );
642 0 : pQSet4->SetItemColor( 1, aPipetteColor );
643 : }
644 :
645 0 : aTbxPipette.CheckItem( TBI_PIPETTE, false );
646 0 : pData->PipetteHdl( &aTbxPipette );
647 0 : }
648 :
649 :
650 :
651 0 : void SvxBmpMask::SetExecState( bool bEnable )
652 : {
653 0 : pData->SetExecState( bEnable );
654 :
655 0 : if ( pData->IsExecReady() && pData->IsCbxReady() )
656 0 : aBtnExec.Enable();
657 : else
658 0 : aBtnExec.Disable();
659 0 : }
660 :
661 :
662 :
663 0 : sal_uInt16 SvxBmpMask::InitColorArrays( Color* pSrcCols, Color* pDstCols, sal_uIntPtr* pTols )
664 : {
665 0 : sal_uInt16 nCount = 0;
666 :
667 0 : if ( aCbx1.IsChecked() )
668 : {
669 0 : pSrcCols[nCount] = pQSet1->GetItemColor( 1 );
670 0 : pDstCols[nCount] = aLbColor1.GetSelectEntryColor();
671 0 : pTols[nCount++] = static_cast<sal_uIntPtr>(aSp1.GetValue());
672 : }
673 :
674 0 : if ( aCbx2.IsChecked() )
675 : {
676 0 : pSrcCols[nCount] = pQSet2->GetItemColor( 1 );
677 0 : pDstCols[nCount] = aLbColor2.GetSelectEntryColor();
678 0 : pTols[nCount++] = static_cast<sal_uIntPtr>(aSp2.GetValue());
679 : }
680 :
681 0 : if ( aCbx3.IsChecked() )
682 : {
683 0 : pSrcCols[nCount] = pQSet3->GetItemColor( 1 );
684 0 : pDstCols[nCount] = aLbColor3.GetSelectEntryColor();
685 0 : pTols[nCount++] = static_cast<sal_uIntPtr>(aSp3.GetValue());
686 : }
687 :
688 0 : if ( aCbx4.IsChecked() )
689 : {
690 0 : pSrcCols[nCount] = pQSet4->GetItemColor( 1 );
691 0 : pDstCols[nCount] = aLbColor4.GetSelectEntryColor();
692 0 : pTols[nCount++] = static_cast<sal_uIntPtr>(aSp4.GetValue());
693 : }
694 :
695 0 : return nCount;
696 : }
697 :
698 :
699 :
700 0 : Bitmap SvxBmpMask::ImpMask( const Bitmap& rBitmap )
701 : {
702 0 : Bitmap aBitmap( rBitmap );
703 0 : Color pSrcCols[4];
704 0 : Color pDstCols[4];
705 : sal_uIntPtr pTols[4];
706 0 : const sal_uInt16 nCount = InitColorArrays( pSrcCols, pDstCols, pTols );
707 :
708 0 : EnterWait();
709 0 : aBitmap.Replace( pSrcCols, pDstCols, nCount, pTols );
710 0 : LeaveWait();
711 :
712 0 : return aBitmap;
713 : }
714 :
715 :
716 :
717 0 : BitmapEx SvxBmpMask::ImpMaskTransparent( const BitmapEx& rBitmapEx, const Color& rColor, const long nTol )
718 : {
719 0 : EnterWait();
720 :
721 0 : BitmapEx aBmpEx;
722 0 : Bitmap aMask( rBitmapEx.GetBitmap().CreateMask( rColor, nTol ) );
723 :
724 0 : if( rBitmapEx.IsTransparent() )
725 0 : aMask.CombineSimple( rBitmapEx.GetMask(), BMP_COMBINE_OR );
726 :
727 0 : aBmpEx = BitmapEx( rBitmapEx.GetBitmap(), aMask );
728 0 : LeaveWait();
729 :
730 0 : return aBmpEx;
731 : }
732 :
733 :
734 :
735 0 : Animation SvxBmpMask::ImpMask( const Animation& rAnimation )
736 : {
737 0 : Animation aAnimation( rAnimation );
738 0 : Color pSrcCols[4];
739 0 : Color pDstCols[4];
740 : sal_uIntPtr pTols[4];
741 0 : InitColorArrays( pSrcCols, pDstCols, pTols );
742 0 : sal_uInt16 nAnimationCount = aAnimation.Count();
743 :
744 0 : for( sal_uInt16 i = 0; i < nAnimationCount; i++ )
745 : {
746 0 : AnimationBitmap aAnimBmp( aAnimation.Get( i ) );
747 0 : aAnimBmp.aBmpEx = Mask( aAnimBmp.aBmpEx ).GetBitmapEx();
748 0 : aAnimation.Replace( aAnimBmp, i );
749 0 : }
750 :
751 0 : return aAnimation;
752 : }
753 :
754 :
755 :
756 0 : GDIMetaFile SvxBmpMask::ImpMask( const GDIMetaFile& rMtf )
757 : {
758 0 : GDIMetaFile aMtf;
759 0 : Color pSrcCols[4];
760 0 : Color pDstCols[4];
761 : sal_uIntPtr pTols[4];
762 0 : sal_uInt16 nCount = InitColorArrays( pSrcCols, pDstCols, pTols );
763 : sal_Bool pTrans[4];
764 :
765 : // If no color is selected, we copy only the Mtf
766 0 : if( !nCount )
767 0 : aMtf = rMtf;
768 : else
769 : {
770 0 : Color aCol;
771 : long nVal;
772 : long nTol;
773 : long nR;
774 : long nG;
775 : long nB;
776 0 : boost::scoped_array<long> pMinR(new long[nCount]);
777 0 : boost::scoped_array<long> pMaxR(new long[nCount]);
778 0 : boost::scoped_array<long> pMinG(new long[nCount]);
779 0 : boost::scoped_array<long> pMaxG(new long[nCount]);
780 0 : boost::scoped_array<long> pMinB(new long[nCount]);
781 0 : boost::scoped_array<long> pMaxB(new long[nCount]);
782 : sal_uInt16 i;
783 : bool bReplace;
784 :
785 0 : aMtf.SetPrefSize( rMtf.GetPrefSize() );
786 0 : aMtf.SetPrefMapMode( rMtf.GetPrefMapMode() );
787 :
788 : // Prepare Color comparison array
789 0 : for( i = 0; i < nCount; i++ )
790 : {
791 0 : nTol = ( pTols[i] * 255L ) / 100L;
792 :
793 0 : nVal = ( (long) pSrcCols[i].GetRed() );
794 0 : pMinR[i] = std::max( nVal - nTol, 0L );
795 0 : pMaxR[i] = std::min( nVal + nTol, 255L );
796 :
797 0 : nVal = ( (long) pSrcCols[i].GetGreen() );
798 0 : pMinG[i] = std::max( nVal - nTol, 0L );
799 0 : pMaxG[i] = std::min( nVal + nTol, 255L );
800 :
801 0 : nVal = ( (long) pSrcCols[i].GetBlue() );
802 0 : pMinB[i] = std::max( nVal - nTol, 0L );
803 0 : pMaxB[i] = std::min( nVal + nTol, 255L );
804 :
805 0 : pTrans[ i ] = ( pDstCols[ i ] == TRANSP_COL );
806 : }
807 :
808 : // Investigate actions and if necessary replace colors
809 0 : for( size_t nAct = 0, nActCount = rMtf.GetActionSize(); nAct < nActCount; nAct++ )
810 : {
811 0 : MetaAction* pAction = rMtf.GetAction( nAct );
812 :
813 0 : bReplace = false;
814 :
815 0 : switch( pAction->GetType() )
816 : {
817 : case( META_PIXEL_ACTION ):
818 : {
819 0 : MetaPixelAction* pAct = static_cast<MetaPixelAction*>(pAction);
820 :
821 0 : aCol = pAct->GetColor();
822 0 : TEST_COLS();
823 :
824 0 : if( bReplace )
825 0 : pAct = new MetaPixelAction( pAct->GetPoint(), aCol );
826 : else
827 0 : pAct->Duplicate();
828 :
829 0 : aMtf.AddAction( pAct );
830 : }
831 0 : break;
832 :
833 : case( META_LINECOLOR_ACTION ):
834 : {
835 0 : MetaLineColorAction* pAct = static_cast<MetaLineColorAction*>(pAction);
836 :
837 0 : aCol = pAct->GetColor();
838 0 : TEST_COLS();
839 :
840 0 : if( bReplace )
841 0 : pAct = new MetaLineColorAction( aCol, !pTrans[ i ] );
842 : else
843 0 : pAct->Duplicate();
844 :
845 0 : aMtf.AddAction( pAct );
846 : }
847 0 : break;
848 :
849 : case( META_FILLCOLOR_ACTION ):
850 : {
851 0 : MetaFillColorAction* pAct = static_cast<MetaFillColorAction*>(pAction);
852 :
853 0 : aCol = pAct->GetColor();
854 0 : TEST_COLS();
855 :
856 0 : if( bReplace )
857 0 : pAct = new MetaFillColorAction( aCol, !pTrans[ i ] );
858 : else
859 0 : pAct->Duplicate();
860 :
861 0 : aMtf.AddAction( pAct );
862 : }
863 0 : break;
864 :
865 : case( META_TEXTCOLOR_ACTION ):
866 : {
867 0 : MetaTextColorAction* pAct = static_cast<MetaTextColorAction*>(pAction);
868 :
869 0 : aCol = pAct->GetColor();
870 0 : TEST_COLS();
871 :
872 0 : if( bReplace )
873 0 : pAct = new MetaTextColorAction( aCol );
874 : else
875 0 : pAct->Duplicate();
876 :
877 0 : aMtf.AddAction( pAct );
878 : }
879 0 : break;
880 :
881 : case( META_TEXTFILLCOLOR_ACTION ):
882 : {
883 0 : MetaTextFillColorAction* pAct = static_cast<MetaTextFillColorAction*>(pAction);
884 :
885 0 : aCol = pAct->GetColor();
886 0 : TEST_COLS();
887 :
888 0 : if( bReplace )
889 0 : pAct = new MetaTextFillColorAction( aCol, !pTrans[ i ] );
890 : else
891 0 : pAct->Duplicate();
892 :
893 0 : aMtf.AddAction( pAct );
894 : }
895 0 : break;
896 :
897 : case( META_FONT_ACTION ):
898 : {
899 0 : MetaFontAction* pAct = static_cast<MetaFontAction*>(pAction);
900 0 : vcl::Font aFont( pAct->GetFont() );
901 :
902 0 : aCol = aFont.GetColor();
903 0 : TEST_COLS();
904 :
905 0 : if( bReplace )
906 : {
907 0 : aFont.SetColor( aCol );
908 0 : pAct = new MetaFontAction( aFont );
909 : }
910 : else
911 0 : pAct->Duplicate();
912 :
913 0 : aMtf.AddAction( pAct );
914 : }
915 0 : break;
916 :
917 : case( META_WALLPAPER_ACTION ):
918 : {
919 0 : MetaWallpaperAction* pAct = static_cast<MetaWallpaperAction*>(pAction);
920 0 : Wallpaper aWall( pAct->GetWallpaper() );
921 :
922 0 : aCol = aWall.GetColor();
923 0 : TEST_COLS();
924 :
925 0 : if( bReplace )
926 : {
927 0 : aWall.SetColor( aCol );
928 0 : pAct = new MetaWallpaperAction( pAct->GetRect(), aWall );
929 : }
930 : else
931 0 : pAct->Duplicate();
932 :
933 0 : aMtf.AddAction( pAct );
934 : }
935 0 : break;
936 :
937 : case( META_BMP_ACTION ):
938 : {
939 0 : MetaBmpAction* pAct = static_cast<MetaBmpAction*>(pAction);
940 0 : const Bitmap aBmp( Mask( pAct->GetBitmap() ).GetBitmap() );
941 :
942 0 : pAct = new MetaBmpAction( pAct->GetPoint(), aBmp );
943 0 : aMtf.AddAction( pAct );
944 : }
945 0 : break;
946 :
947 : case( META_BMPSCALE_ACTION ):
948 : {
949 0 : MetaBmpScaleAction* pAct = static_cast<MetaBmpScaleAction*>(pAction);
950 0 : const Bitmap aBmp( Mask( pAct->GetBitmap() ).GetBitmap() );
951 :
952 0 : pAct = new MetaBmpScaleAction( pAct->GetPoint(), pAct->GetSize(), aBmp );
953 0 : aMtf.AddAction( pAct );
954 : }
955 0 : break;
956 :
957 : case( META_BMPSCALEPART_ACTION ):
958 : {
959 0 : MetaBmpScalePartAction* pAct = static_cast<MetaBmpScalePartAction*>(pAction);
960 0 : const Bitmap aBmp( Mask( pAct->GetBitmap() ).GetBitmap() );
961 :
962 : pAct = new MetaBmpScalePartAction( pAct->GetDestPoint(), pAct->GetDestSize(),
963 0 : pAct->GetSrcPoint(), pAct->GetSrcSize(), aBmp );
964 0 : aMtf.AddAction( pAct );
965 : }
966 0 : break;
967 :
968 : case( META_BMPEX_ACTION ):
969 : {
970 0 : MetaBmpExAction* pAct = static_cast<MetaBmpExAction*>(pAction);
971 0 : const BitmapEx aBmpEx( Mask( pAct->GetBitmapEx() ).GetBitmapEx() );
972 :
973 0 : pAct = new MetaBmpExAction( pAct->GetPoint(), aBmpEx );
974 0 : aMtf.AddAction( pAct );
975 : }
976 0 : break;
977 :
978 : case( META_BMPEXSCALE_ACTION ):
979 : {
980 0 : MetaBmpExScaleAction* pAct = static_cast<MetaBmpExScaleAction*>(pAction);
981 0 : const BitmapEx aBmpEx( Mask( pAct->GetBitmapEx() ).GetBitmapEx() );
982 :
983 0 : pAct = new MetaBmpExScaleAction( pAct->GetPoint(), pAct->GetSize(), aBmpEx );
984 0 : aMtf.AddAction( pAct );
985 : }
986 0 : break;
987 :
988 : case( META_BMPEXSCALEPART_ACTION ):
989 : {
990 0 : MetaBmpExScalePartAction* pAct = static_cast<MetaBmpExScalePartAction*>(pAction);
991 0 : const BitmapEx aBmpEx( Mask( pAct->GetBitmapEx() ).GetBitmapEx() );
992 :
993 : pAct = new MetaBmpExScalePartAction( pAct->GetDestPoint(), pAct->GetDestSize(),
994 0 : pAct->GetSrcPoint(), pAct->GetSrcSize(), aBmpEx );
995 0 : aMtf.AddAction( pAct );
996 : }
997 0 : break;
998 :
999 : default:
1000 : {
1001 0 : pAction->Duplicate();
1002 0 : aMtf.AddAction( pAction );
1003 : }
1004 0 : break;
1005 : }
1006 0 : }
1007 : }
1008 :
1009 0 : LeaveWait();
1010 :
1011 0 : return aMtf;
1012 : }
1013 :
1014 :
1015 :
1016 0 : BitmapEx SvxBmpMask::ImpReplaceTransparency( const BitmapEx& rBmpEx, const Color& rColor )
1017 : {
1018 0 : if( rBmpEx.IsTransparent() )
1019 : {
1020 0 : Bitmap aBmp( rBmpEx.GetBitmap() );
1021 0 : aBmp.Replace( rBmpEx.GetMask(), rColor );
1022 0 : return aBmp;
1023 : }
1024 : else
1025 0 : return rBmpEx;
1026 : }
1027 :
1028 :
1029 :
1030 0 : Animation SvxBmpMask::ImpReplaceTransparency( const Animation& rAnim, const Color& rColor )
1031 : {
1032 0 : Animation aAnimation( rAnim );
1033 0 : sal_uInt16 nAnimationCount = aAnimation.Count();
1034 :
1035 0 : for( sal_uInt16 i = 0; i < nAnimationCount; i++ )
1036 : {
1037 0 : AnimationBitmap aAnimBmp( aAnimation.Get( i ) );
1038 0 : aAnimBmp.aBmpEx = ImpReplaceTransparency( aAnimBmp.aBmpEx, rColor );
1039 0 : aAnimation.Replace( aAnimBmp, i );
1040 0 : }
1041 :
1042 0 : return aAnimation;
1043 : }
1044 :
1045 :
1046 :
1047 0 : GDIMetaFile SvxBmpMask::ImpReplaceTransparency( const GDIMetaFile& rMtf, const Color& rColor )
1048 : {
1049 0 : VirtualDevice aVDev;
1050 0 : GDIMetaFile aMtf;
1051 0 : const MapMode& rPrefMap = rMtf.GetPrefMapMode();
1052 0 : const Size& rPrefSize = rMtf.GetPrefSize();
1053 0 : const size_t nActionCount = rMtf.GetActionSize();
1054 :
1055 0 : aVDev.EnableOutput( false );
1056 0 : aMtf.Record( &aVDev );
1057 0 : aMtf.SetPrefSize( rPrefSize );
1058 0 : aMtf.SetPrefMapMode( rPrefMap );
1059 0 : aVDev.SetLineColor( rColor );
1060 0 : aVDev.SetFillColor( rColor );
1061 :
1062 : // retrieve one action at the time; first
1063 : // set the whole area to the replacement color.
1064 0 : aVDev.DrawRect( Rectangle( rPrefMap.GetOrigin(), rPrefSize ) );
1065 0 : for ( size_t i = 0; i < nActionCount; i++ )
1066 : {
1067 0 : MetaAction* pAct = rMtf.GetAction( i );
1068 :
1069 0 : pAct->Duplicate();
1070 0 : aMtf.AddAction( pAct );
1071 : }
1072 :
1073 0 : aMtf.Stop();
1074 0 : aMtf.WindStart();
1075 :
1076 0 : return aMtf;
1077 : }
1078 :
1079 :
1080 :
1081 0 : Graphic SvxBmpMask::Mask( const Graphic& rGraphic )
1082 : {
1083 0 : Graphic aGraphic( rGraphic );
1084 0 : const Color aReplColor( aLbColorTrans.GetSelectEntryColor() );
1085 :
1086 0 : switch( rGraphic.GetType() )
1087 : {
1088 : case( GRAPHIC_BITMAP ):
1089 : {
1090 0 : if( rGraphic.IsAnimated() )
1091 : {
1092 : // Replace transparency?
1093 0 : if ( aCbxTrans.IsChecked() )
1094 0 : aGraphic = ImpReplaceTransparency( rGraphic.GetAnimation(), aReplColor );
1095 : else
1096 0 : aGraphic = ImpMask( rGraphic.GetAnimation() );
1097 : }
1098 : else
1099 : {
1100 : // Replace transparency?
1101 0 : if( aCbxTrans.IsChecked() )
1102 : {
1103 0 : if( aGraphic.IsTransparent() )
1104 : {
1105 0 : BitmapEx aBmpEx( ImpReplaceTransparency( aGraphic.GetBitmapEx(), aReplColor ) );
1106 0 : const Size aSize( aBmpEx.GetSizePixel() );
1107 :
1108 0 : if( aSize.Width() && aSize.Height() )
1109 0 : aGraphic = aBmpEx;
1110 : }
1111 : }
1112 : else
1113 : {
1114 0 : Color pSrcCols[4];
1115 0 : Color pDstCols[4];
1116 : sal_uIntPtr pTols[4];
1117 0 : sal_uInt16 nCount = InitColorArrays( pSrcCols, pDstCols, pTols );
1118 :
1119 0 : if( nCount )
1120 : {
1121 : // first set all transparent colors
1122 0 : for( sal_uInt16 i = 0; i < nCount; i++ )
1123 : {
1124 : // Do we have a transparent color?
1125 0 : if( pDstCols[i] == TRANSP_COL )
1126 : {
1127 : BitmapEx aBmpEx( ImpMaskTransparent( aGraphic.GetBitmapEx(),
1128 0 : pSrcCols[ i ], pTols[ i ] ) );
1129 0 : const Size aSize( aBmpEx.GetSizePixel() );
1130 :
1131 0 : if( aSize.Width() && aSize.Height() )
1132 0 : aGraphic = aBmpEx;
1133 : }
1134 : }
1135 :
1136 : // now replace it again with the normal colors
1137 0 : Bitmap aBitmap( ImpMask( aGraphic.GetBitmap() ) );
1138 0 : Size aSize( aBitmap.GetSizePixel() );
1139 :
1140 0 : if ( aSize.Width() && aSize.Height() )
1141 : {
1142 0 : if ( aGraphic.IsTransparent() )
1143 0 : aGraphic = Graphic( BitmapEx( aBitmap, aGraphic.GetBitmapEx().GetMask() ) );
1144 : else
1145 0 : aGraphic = aBitmap;
1146 0 : }
1147 : }
1148 : }
1149 : }
1150 : }
1151 0 : break;
1152 :
1153 : case( GRAPHIC_GDIMETAFILE ):
1154 : {
1155 0 : GDIMetaFile aMtf( aGraphic.GetGDIMetaFile() );
1156 :
1157 : // Replace transparency?
1158 0 : if( aCbxTrans.IsChecked() )
1159 0 : aMtf = ImpReplaceTransparency( aMtf, aReplColor );
1160 : else
1161 0 : aMtf = ImpMask( aMtf );
1162 :
1163 0 : Size aSize( aMtf.GetPrefSize() );
1164 0 : if ( aSize.Width() && aSize.Height() )
1165 0 : aGraphic = Graphic( aMtf );
1166 : else
1167 0 : aGraphic = rGraphic;
1168 : }
1169 0 : break;
1170 :
1171 : default:
1172 0 : aGraphic = rGraphic;
1173 0 : break;
1174 : }
1175 :
1176 0 : if( aGraphic != rGraphic )
1177 : {
1178 0 : aGraphic.SetPrefSize( rGraphic.GetPrefSize() );
1179 0 : aGraphic.SetPrefMapMode( rGraphic.GetPrefMapMode() );
1180 : }
1181 :
1182 0 : return aGraphic;
1183 : }
1184 :
1185 :
1186 :
1187 0 : bool SvxBmpMask::IsEyedropping() const
1188 : {
1189 0 : return aTbxPipette.IsItemChecked( TBI_PIPETTE );
1190 : }
1191 :
1192 0 : void SvxBmpMask::DataChanged( const DataChangedEvent& rDCEvt )
1193 : {
1194 0 : SfxDockingWindow::DataChanged( rDCEvt );
1195 :
1196 0 : if ( (rDCEvt.GetType() == DATACHANGED_SETTINGS) && (rDCEvt.GetFlags() & SETTINGS_STYLE) )
1197 0 : ApplyStyle();
1198 0 : }
1199 :
1200 0 : void SvxBmpMask::ApplyStyle()
1201 : {
1202 0 : aTbxPipette.SetItemImage( TBI_PIPETTE, maImgPipette );
1203 0 : }
1204 :
1205 :
1206 : /** Set an accessible name for the source color check boxes. Without this
1207 : the lengthy description is read.
1208 : */
1209 0 : void SvxBmpMask::SetAccessibleNames (void)
1210 : {
1211 0 : OUString sSourceColor(BMP_RESID(RID_SVXDLG_BMPMASK_STR_SOURCECOLOR).toString());
1212 0 : OUString sSourceColorN;
1213 :
1214 0 : sSourceColorN = sSourceColor;
1215 0 : sSourceColorN += " 1";
1216 0 : aCbx1.SetAccessibleName (sSourceColorN);
1217 :
1218 0 : sSourceColorN = sSourceColor;
1219 0 : sSourceColorN += " 2";
1220 0 : aCbx2.SetAccessibleName (sSourceColorN);
1221 :
1222 0 : sSourceColorN = sSourceColor;
1223 0 : sSourceColorN += " 3";
1224 0 : aCbx3.SetAccessibleName (sSourceColorN);
1225 :
1226 0 : sSourceColorN = sSourceColor;
1227 0 : sSourceColorN += " 4";
1228 0 : aCbx4.SetAccessibleName (sSourceColorN);
1229 : // set the accessible name for valueset
1230 0 : OUString sColorPalette (BMP_RESID( RID_SVXDLG_BMPMASK_STR_PALETTE));
1231 0 : OUString sColorPaletteN;
1232 0 : sColorPaletteN = sColorPalette;
1233 0 : sColorPaletteN += " 1";
1234 0 : pQSet1->SetText (sColorPaletteN);
1235 0 : sColorPaletteN = sColorPalette;
1236 0 : sColorPaletteN += " 2";
1237 0 : pQSet2->SetText (sColorPaletteN);
1238 0 : sColorPaletteN = sColorPalette;
1239 0 : sColorPaletteN += " 3";
1240 0 : pQSet3->SetText (sColorPaletteN);
1241 0 : sColorPaletteN = sColorPalette;
1242 0 : sColorPaletteN += " 4";
1243 0 : pQSet4->SetText (sColorPaletteN);
1244 : // set the accessible for replace with spin boxes.
1245 0 : OUString sTolerance(BMP_RESID( RID_SVXDLG_BMPMASK_STR_TOLERANCE));
1246 0 : OUString sToleranceN;
1247 0 : sToleranceN = sTolerance;
1248 0 : sToleranceN += " 1";
1249 0 : aSp1.SetAccessibleName (sToleranceN);
1250 0 : sToleranceN = sTolerance;
1251 0 : sToleranceN += " 2";
1252 0 : aSp2.SetAccessibleName (sToleranceN);
1253 0 : sToleranceN = sTolerance;
1254 0 : sToleranceN += " 3";
1255 0 : aSp3.SetAccessibleName (sToleranceN);
1256 0 : sToleranceN = sTolerance;
1257 0 : sToleranceN += " 4";
1258 0 : aSp4.SetAccessibleName (sToleranceN);
1259 : // set the accessible for replace with combo boxes.
1260 0 : OUString sReplaceWith(BMP_RESID( RID_SVXDLG_BMPMASK_STR_REPLACEWITH));
1261 0 : OUString sReplaceWithN;
1262 0 : sReplaceWithN = sReplaceWith;
1263 0 : sReplaceWithN += " 1";
1264 0 : aLbColor1.SetAccessibleName (sReplaceWithN);
1265 0 : sReplaceWithN = sReplaceWith;
1266 0 : sReplaceWithN += " 2";
1267 0 : aLbColor2.SetAccessibleName (sReplaceWithN);
1268 0 : sReplaceWithN = sReplaceWith;
1269 0 : sReplaceWithN += " 3";
1270 0 : aLbColor3.SetAccessibleName (sReplaceWithN);
1271 0 : sReplaceWithN = sReplaceWith;
1272 0 : sReplaceWithN += " 4";
1273 0 : aLbColor4.SetAccessibleName (sReplaceWithN);
1274 594 : }
1275 :
1276 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|