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