xref: /AOO41X/main/cui/source/tabpages/tpbitmap.cxx (revision 7b6b9ddb4b63a97ea0214b9472b5270bbf674949)
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_cui.hxx"
26 
27 // include ---------------------------------------------------------------
28 
29 //svdraw.hxx
30 #define _SVDRAW_HXX
31 #define _SDR_NOITEMS
32 #define _SDR_NOTOUCH
33 #define _SDR_NOTRANSFORM
34 #define _SDR_NOOBJECTS
35 #define _SDR_NOVIEWS
36 #define _SDR_NOVIEWMARKER
37 #define _SDR_NODRAGMETHODS
38 #define _SDR_NOUNDO
39 #define _SDR_NOXOUTDEV
40 #include <vcl/wrkwin.hxx>
41 #include <tools/shl.hxx>
42 #include <vcl/msgbox.hxx>
43 #include <tools/urlobj.hxx>
44 #include <unotools/ucbstreamhelper.hxx>
45 #include <unotools/pathoptions.hxx>
46 #include <sfx2/app.hxx>
47 #include <sfx2/filedlghelper.hxx>
48 #include <unotools/localfilehelper.hxx>
49 #include "com/sun/star/ui/dialogs/TemplateDescription.hpp"
50 #include <svx/dialmgr.hxx>
51 #include <vcl/bmpacc.hxx>
52 #include <svx/dialogs.hrc>
53 
54 #define _SVX_TPBITMAP_CXX
55 
56 #include <cuires.hrc>
57 #include "helpid.hrc"
58 #include "svx/xattr.hxx"
59 #include <svx/xpool.hxx>
60 #include <svx/xtable.hxx>
61 #include "svx/xoutbmp.hxx"
62 #include "svx/drawitem.hxx"
63 #include "cuitabarea.hxx"
64 #include "tabarea.hrc"
65 #include "defdlgname.hxx" //CHINA001 #include "dlgname.hxx"
66 //#include "dlgname.hrc"
67 #include <svx/svxdlg.hxx> //CHINA001
68 #include <dialmgr.hxx>
69 #include "sfx2/opengrf.hxx"
70 #include "paragrph.hrc"
71 
72 #define DLGWIN this->GetParent()->GetParent()
73 
74 /*************************************************************************
75 |*
76 |*  Dialog zum Aendern und Definieren der Bitmaps
77 |*
78 \************************************************************************/
79 
80 SvxBitmapTabPage::SvxBitmapTabPage
81 (
82     Window* pParent,
83     const SfxItemSet& rInAttrs
84 ) :
85 
86     SvxTabPage          ( pParent, CUI_RES( RID_SVXPAGE_BITMAP ), rInAttrs ),
87 
88     aCtlPixel           ( this, CUI_RES( CTL_PIXEL ) ),
89     aFtPixelEdit        ( this, CUI_RES( FT_PIXEL_EDIT ) ),
90     aFtColor            ( this, CUI_RES( FT_COLOR ) ),
91     aLbColor            ( this, CUI_RES( LB_COLOR ) ),
92     aFtBackgroundColor  ( this, CUI_RES( FT_BACKGROUND_COLOR ) ),
93     aLbBackgroundColor  ( this, CUI_RES( LB_BACKGROUND_COLOR ) ),
94     // This fix text is used only to provide the name for the following
95     // bitmap list box.  The fixed text is not displayed.
96     aLbBitmapsHidden    ( this, CUI_RES( FT_BITMAPS_HIDDEN ) ),
97     aLbBitmaps          ( this, CUI_RES( LB_BITMAPS ) ),
98     aFlProp             ( this, CUI_RES( FL_PROP ) ),
99     aCtlPreview         ( this, CUI_RES( CTL_PREVIEW ) ),
100     aBtnAdd             ( this, CUI_RES( BTN_ADD ) ),
101     aBtnModify          ( this, CUI_RES( BTN_MODIFY ) ),
102     aBtnImport          ( this, CUI_RES( BTN_IMPORT ) ),
103     aBtnDelete          ( this, CUI_RES( BTN_DELETE ) ),
104     aBtnLoad            ( this, CUI_RES( BTN_LOAD ) ),
105     aBtnSave            ( this, CUI_RES( BTN_SAVE ) ),
106 
107     aBitmapCtl          ( this, aCtlPreview.GetSizePixel() ),
108     rOutAttrs           ( rInAttrs ),
109 
110     pColorTab( NULL ),
111     pBitmapList( NULL ),
112 
113     pXPool              ( (XOutdevItemPool*) rInAttrs.GetPool() ),
114     aXFStyleItem        ( XFILL_BITMAP ),
115     aXBitmapItem        ( String(), Graphic() ),
116     aXFillAttr          ( pXPool ),
117     rXFSet              ( aXFillAttr.GetItemSet() )
118 {
119     aBtnLoad.SetModeImage( Image( CUI_RES( RID_SVXIMG_LOAD_H ) ), BMP_COLOR_HIGHCONTRAST );
120     aBtnSave.SetModeImage( Image( CUI_RES( RID_SVXIMG_SAVE_H ) ), BMP_COLOR_HIGHCONTRAST );
121     FreeResource();
122 
123     // diese Page braucht ExchangeSupport
124     SetExchangeSupport();
125 
126     // Setzen des Output-Devices
127     rXFSet.Put( aXFStyleItem );
128     rXFSet.Put( aXBitmapItem );
129     //aCtlPreview.SetAttributes( aXFillAttr );
130 
131     aBtnAdd.SetClickHdl( LINK( this, SvxBitmapTabPage, ClickAddHdl_Impl ) );
132     aBtnImport.SetClickHdl(
133         LINK( this, SvxBitmapTabPage, ClickImportHdl_Impl ) );
134     aBtnModify.SetClickHdl(
135         LINK( this, SvxBitmapTabPage, ClickModifyHdl_Impl ) );
136     aBtnDelete.SetClickHdl(
137         LINK( this, SvxBitmapTabPage, ClickDeleteHdl_Impl ) );
138     aBtnLoad.SetClickHdl( LINK( this, SvxBitmapTabPage, ClickLoadHdl_Impl ) );
139     aBtnSave.SetClickHdl( LINK( this, SvxBitmapTabPage, ClickSaveHdl_Impl ) );
140 
141     aLbBitmaps.SetSelectHdl(
142         LINK( this, SvxBitmapTabPage, ChangeBitmapHdl_Impl ) );
143     aLbColor.SetSelectHdl(
144         LINK( this, SvxBitmapTabPage, ChangePixelColorHdl_Impl ) );
145     aLbBackgroundColor.SetSelectHdl(
146         LINK( this, SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl ) );
147 
148     String accName = String(CUI_RES(STR_EXAMPLE));
149     aCtlPreview.SetAccessibleName(accName);
150     aCtlPixel.SetAccessibleRelationMemberOf( &aFlProp );
151     aCtlPixel.SetAccessibleRelationLabeledBy( &aFtPixelEdit );
152     aLbBitmaps.SetAccessibleRelationLabeledBy(&aLbBitmaps);
153     aBtnAdd.SetAccessibleRelationMemberOf( &aFlProp );
154     aBtnModify.SetAccessibleRelationMemberOf( &aFlProp );
155     aBtnImport.SetAccessibleRelationMemberOf( &aFlProp );
156     aBtnDelete.SetAccessibleRelationMemberOf( &aFlProp );
157 
158 }
159 
160 // -----------------------------------------------------------------------
161 
162 void SvxBitmapTabPage::Construct()
163 {
164     // Farbtabellen
165     aLbColor.Fill( pColorTab );
166     aLbBackgroundColor.CopyEntries( aLbColor );
167 
168     // Bitmaptabelle
169     aLbBitmaps.Fill( pBitmapList );
170 }
171 
172 // -----------------------------------------------------------------------
173 
174 void SvxBitmapTabPage::ActivatePage( const SfxItemSet&  )
175 {
176     sal_uInt16 nPos;
177     sal_uInt16 nCount;
178 
179     if( *pDlgType == 0 ) // Flaechen-Dialog
180     {
181         *pbAreaTP = sal_False;
182 
183         if( pColorTab )
184         {
185             // ColorTable
186             if( *pnColorTableState & CT_CHANGED ||
187                 *pnColorTableState & CT_MODIFIED )
188             {
189                 if( *pnColorTableState & CT_CHANGED )
190                     pColorTab = ( (SvxAreaTabDialog*) DLGWIN )->GetNewColorTable();
191 
192                 // LbColor
193                 nPos = aLbColor.GetSelectEntryPos();
194                 aLbColor.Clear();
195                 aLbColor.Fill( pColorTab );
196                 nCount = aLbColor.GetEntryCount();
197                 if( nCount == 0 )
198                     ; // Dieser Fall sollte nicht auftreten
199                 else if( nCount <= nPos )
200                     aLbColor.SelectEntryPos( 0 );
201                 else
202                     aLbColor.SelectEntryPos( nPos );
203 
204                 // LbColorBackground
205                 nPos = aLbBackgroundColor.GetSelectEntryPos();
206                 aLbBackgroundColor.Clear();
207                 aLbBackgroundColor.CopyEntries( aLbColor );
208                 nCount = aLbBackgroundColor.GetEntryCount();
209                 if( nCount == 0 )
210                     ; // Dieser Fall sollte nicht auftreten
211                 else if( nCount <= nPos )
212                     aLbBackgroundColor.SelectEntryPos( 0 );
213                 else
214                     aLbBackgroundColor.SelectEntryPos( nPos );
215 
216                 ChangePixelColorHdl_Impl( this );
217                 ChangeBackgrndColorHdl_Impl( this );
218             }
219 
220             // Ermitteln (evtl. abschneiden) des Namens und in
221             // der GroupBox darstellen
222             String          aString( CUI_RES( RID_SVXSTR_TABLE ) ); aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
223             INetURLObject   aURL( pBitmapList->GetPath() );
224 
225             aURL.Append( pBitmapList->GetName() );
226             DBG_ASSERT( aURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
227 
228             if( aURL.getBase().getLength() > 18 )
229             {
230                 aString += String(aURL.getBase()).Copy( 0, 15 );
231                 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
232             }
233             else
234                 aString += String(aURL.getBase());
235 
236             if( *pPageType == PT_BITMAP && *pPos != LISTBOX_ENTRY_NOTFOUND )
237             {
238                 aLbBitmaps.SelectEntryPos( *pPos );
239             }
240             // Farben koennten geloescht worden sein
241             ChangeBitmapHdl_Impl( this );
242 
243             *pPageType = PT_BITMAP;
244             *pPos = LISTBOX_ENTRY_NOTFOUND;
245         }
246     }
247 }
248 
249 // -----------------------------------------------------------------------
250 
251 int SvxBitmapTabPage::DeactivatePage( SfxItemSet* _pSet)
252 {
253     if ( CheckChanges_Impl() == -1L )
254         return KEEP_PAGE;
255 
256     if( _pSet )
257         FillItemSet( *_pSet );
258 
259     return LEAVE_PAGE;
260 }
261 
262 // -----------------------------------------------------------------------
263 
264 sal_Bool SvxBitmapTabPage::FillItemSet( SfxItemSet& _rOutAttrs )
265 {
266     if( *pDlgType == 0 && *pbAreaTP == sal_False ) // Flaechen-Dialog
267     {
268         if(PT_BITMAP == *pPageType)
269         {
270             const sal_uInt16 nPos(aLbBitmaps.GetSelectEntryPos());
271 
272             _rOutAttrs.Put(XFillStyleItem(XFILL_BITMAP));
273 
274             if(LISTBOX_ENTRY_NOTFOUND != nPos)
275             {
276                 const XBitmapEntry* pXBitmapEntry = pBitmapList->GetBitmap(nPos);
277                 const String aString(aLbBitmaps.GetSelectEntry());
278 
279                 _rOutAttrs.Put(XFillBitmapItem(aString, pXBitmapEntry->GetGraphicObject()));
280             }
281             else
282             {
283                 const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx());
284 
285                 _rOutAttrs.Put(XFillBitmapItem(String(), Graphic(aBitmapEx)));
286             }
287         }
288     }
289 
290     return sal_True;
291 }
292 
293 // -----------------------------------------------------------------------
294 
295 void SvxBitmapTabPage::Reset( const SfxItemSet&  )
296 {
297     // aLbBitmaps.SelectEntryPos( 0 );
298 
299     aBitmapCtl.SetLines( aCtlPixel.GetLineCount() );
300     aBitmapCtl.SetPixelColor( aLbColor.GetSelectEntryColor() );
301     aBitmapCtl.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() );
302     aBitmapCtl.SetBmpArray( aCtlPixel.GetBitmapPixelPtr() );
303 
304     // Bitmap holen und darstellen
305     const XFillBitmapItem aBmpItem(String(), Graphic(aBitmapCtl.GetBitmapEx()));
306     rXFSet.Put( aBmpItem );
307     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
308     aCtlPreview.Invalidate();
309 
310     ChangeBitmapHdl_Impl( this );
311 
312     // Status der Buttons ermitteln
313     if( pBitmapList->Count() )
314     {
315         aBtnAdd.Enable();
316         aBtnModify.Enable();
317         aBtnDelete.Enable();
318         aBtnSave.Enable();
319     }
320     else
321     {
322         aBtnModify.Disable();
323         aBtnDelete.Disable();
324         aBtnSave.Disable();
325     }
326 }
327 
328 // -----------------------------------------------------------------------
329 
330 SfxTabPage* SvxBitmapTabPage::Create( Window* pWindow,
331                 const SfxItemSet& rSet )
332 {
333     return new SvxBitmapTabPage( pWindow, rSet );
334 }
335 
336 //------------------------------------------------------------------------
337 
338 IMPL_LINK( SvxBitmapTabPage, ChangeBitmapHdl_Impl, void *, EMPTYARG )
339 {
340     GraphicObject* pGraphicObject = 0;
341     int nPos(aLbBitmaps.GetSelectEntryPos());
342 
343     if(LISTBOX_ENTRY_NOTFOUND != nPos)
344     {
345         pGraphicObject = new GraphicObject(pBitmapList->GetBitmap(nPos)->GetGraphicObject());
346     }
347     else
348     {
349         const SfxPoolItem* pPoolItem = 0;
350 
351         if(SFX_ITEM_SET == rOutAttrs.GetItemState(GetWhich(XATTR_FILLSTYLE), true, &pPoolItem))
352         {
353             const XFillStyle eXFS((XFillStyle)((const XFillStyleItem*)pPoolItem)->GetValue());
354 
355             if((XFILL_BITMAP == eXFS) && (SFX_ITEM_SET == rOutAttrs.GetItemState(GetWhich(XATTR_FILLBITMAP), true, &pPoolItem)))
356             {
357                 pGraphicObject = new GraphicObject(((const XFillBitmapItem*)pPoolItem)->GetGraphicObject());
358             }
359         }
360 
361         if(!pGraphicObject)
362         {
363             aLbBitmaps.SelectEntryPos(0);
364             nPos = aLbBitmaps.GetSelectEntryPos();
365 
366             if(LISTBOX_ENTRY_NOTFOUND != nPos)
367             {
368                 pGraphicObject = new GraphicObject(pBitmapList->GetBitmap(nPos)->GetGraphicObject());
369             }
370         }
371     }
372 
373     if(pGraphicObject)
374     {
375         BitmapColor aBack;
376         BitmapColor aFront;
377         bool bIs8x8(isHistorical8x8(pGraphicObject->GetGraphic().GetBitmap(), aBack, aFront));
378 
379         aLbColor.SetNoSelection();
380         aLbBackgroundColor.SetNoSelection();
381 
382         if(bIs8x8)
383         {
384             aCtlPixel.SetPaintable( sal_True );
385             aCtlPixel.Enable();
386             aFtPixelEdit.Enable();
387             aFtColor.Enable();
388             aLbColor.Enable();
389             aFtBackgroundColor.Enable();
390             aLbBackgroundColor.Enable();
391             aBtnModify.Enable();
392             aBtnAdd.Enable();
393 
394             // Setzen des PixelControls
395             aCtlPixel.SetXBitmap(pGraphicObject->GetGraphic().GetBitmapEx());
396 
397             Color aPixelColor = aFront;
398             Color aBackColor = aBack;
399 
400             aBitmapCtl.SetPixelColor( aPixelColor );
401             aBitmapCtl.SetBackgroundColor( aBackColor );
402 
403             // Wenn der Eintrag nicht in der Listbox ist, wird die Farbe
404             // temporaer hinzugenommen
405             if( 0 == aLbBitmaps.GetSelectEntryPos() )
406             {
407                 aLbColor.SelectEntry( Color( COL_BLACK ) );
408                 ChangePixelColorHdl_Impl( this );
409             }
410             else
411                 aLbColor.SelectEntry( aPixelColor );
412             if( aLbColor.GetSelectEntryCount() == 0 )
413             {
414                 aLbColor.InsertEntry( aPixelColor, String() );
415                 aLbColor.SelectEntry( aPixelColor );
416             }
417             aLbBackgroundColor.SelectEntry( aBackColor );
418             if( aLbBackgroundColor.GetSelectEntryCount() == 0 )
419             {
420                 aLbBackgroundColor.InsertEntry( aBackColor, String() );
421                 aLbBackgroundColor.SelectEntry( aBackColor );
422             }
423         }
424         else
425         {
426             aCtlPixel.Reset();
427             aCtlPixel.SetPaintable( sal_False );
428             aCtlPixel.Disable();
429             aFtPixelEdit.Disable();
430             aFtColor.Disable();
431             aLbColor.Disable();
432             aFtBackgroundColor.Disable();
433             aLbBackgroundColor.Disable();
434             aBtnModify.Disable();
435             aBtnAdd.Disable();
436         }
437 
438         aCtlPixel.Invalidate();
439 
440         // Bitmap darstellen
441         const XFillBitmapItem aXBmpItem(String(), *pGraphicObject);
442         rXFSet.Put( aXBmpItem );
443 
444         aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
445         aCtlPreview.Invalidate();
446 
447         bBmpChanged = sal_False;
448         delete pGraphicObject;
449     }
450 
451     return 0;
452 }
453 
454 // -----------------------------------------------------------------------
455 
456 long SvxBitmapTabPage::CheckChanges_Impl()
457 {
458     sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos();
459     if( nPos != LISTBOX_ENTRY_NOTFOUND )
460     {
461         String aString = aLbBitmaps.GetSelectEntry();
462 
463         if( bBmpChanged )
464         {
465             ResMgr& rMgr = CUI_MGR();
466             Image aWarningBoxImage = WarningBox::GetStandardImage();
467             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
468             DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
469             AbstractSvxMessDialog* aMessDlg = pFact->CreateSvxMessDialog( DLGWIN, RID_SVXDLG_MESSBOX,
470                                                         String( SVX_RES( RID_SVXSTR_BITMAP ) ),
471                                                         String( CUI_RES( RID_SVXSTR_ASK_CHANGE_BITMAP ) ),
472                                                         &aWarningBoxImage  );
473             DBG_ASSERT(aMessDlg, "Dialogdiet fail!");//CHINA001
474             aMessDlg->SetButtonText( MESS_BTN_1, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_1,
475                                     String( ResId( RID_SVXSTR_CHANGE, rMgr ) ) );
476             aMessDlg->SetButtonText( MESS_BTN_2, //CHINA001 aMessDlg.SetButtonText( MESS_BTN_2,
477                                     String( ResId( RID_SVXSTR_ADD, rMgr ) ) );
478 
479             short nRet = aMessDlg->Execute(); //CHINA001 short nRet = aMessDlg.Execute();
480 
481             switch( nRet )
482             {
483                 case RET_BTN_1: // Aendern
484                 {
485                     ClickModifyHdl_Impl( this );
486                 }
487                 break;
488 
489                 case RET_BTN_2: // Hinzufuegen
490                 {
491                     ClickAddHdl_Impl( this );
492                     nPos = aLbBitmaps.GetSelectEntryPos();
493                 }
494                 break;
495 
496                 case RET_CANCEL:
497                     // return( -1L );
498                 break;
499                 // return( sal_True ); // Abbruch
500             }
501             delete aMessDlg; //add by CHINA001
502         }
503     }
504     nPos = aLbBitmaps.GetSelectEntryPos();
505     if( nPos != LISTBOX_ENTRY_NOTFOUND )
506         *pPos = nPos;
507     return 0L;
508 }
509 
510 //------------------------------------------------------------------------
511 
512 IMPL_LINK( SvxBitmapTabPage, ClickAddHdl_Impl, void *, EMPTYARG )
513 {
514     ResMgr& rMgr = CUI_MGR();
515     String aNewName( SVX_RES( RID_SVXSTR_BITMAP ) );
516     String aDesc( CUI_RES( RID_SVXSTR_DESC_NEW_BITMAP ) );
517     String aName;
518 
519     long nCount = pBitmapList->Count();
520     long j = 1;
521     sal_Bool bDifferent = sal_False;
522 
523     while( !bDifferent )
524     {
525         aName  = aNewName;
526         aName += sal_Unicode(' ');
527         aName += UniString::CreateFromInt32( j++ );
528         bDifferent = sal_True;
529 
530         for( long i = 0; i < nCount && bDifferent; i++ )
531             if( aName == pBitmapList->GetBitmap( i )->GetName() )
532                 bDifferent = sal_False;
533     }
534 
535     SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
536     DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
537     AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
538     DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
539     WarningBox*    pWarnBox = NULL;
540     sal_uInt16         nError   = RID_SVXSTR_WARN_NAME_DUPLICATE;
541 
542     while( pDlg->Execute() == RET_OK )
543     {
544         pDlg->GetName( aName );
545 
546         bDifferent = sal_True;
547 
548         for( long i = 0; i < nCount && bDifferent; i++ )
549             if( aName == pBitmapList->GetBitmap( i )->GetName() )
550                 bDifferent = sal_False;
551 
552         if( bDifferent ) {
553             nError = 0;
554             break;
555         }
556 
557         if( !pWarnBox )
558         {
559             pWarnBox = new WarningBox( DLGWIN,
560                                        WinBits( WB_OK_CANCEL ),
561                                        String( ResId( nError, rMgr ) ) );
562             pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE );
563         }
564 
565         if( pWarnBox->Execute() != RET_OK )
566             break;
567     }
568     //Rectangle aDlgRect( pDlg->GetPosPixel(), pDlg->GetSizePixel() );
569     delete pDlg;
570     delete pWarnBox;
571 
572     if( !nError )
573     {
574         XBitmapEntry* pEntry = 0;
575         if( aCtlPixel.IsEnabled() )
576         {
577             const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx());
578 
579             pEntry = new XBitmapEntry(Graphic(aBitmapEx), aName);
580         }
581         else // Es muss sich um eine nicht vorhandene importierte Bitmap handeln
582         {
583             const SfxPoolItem* pPoolItem = 0;
584 
585             if(SFX_ITEM_SET == rOutAttrs.GetItemState(XATTR_FILLBITMAP, true, &pPoolItem))
586             {
587                 pEntry = new XBitmapEntry(dynamic_cast< const XFillBitmapItem* >(pPoolItem)->GetGraphicObject(), aName);
588             }
589         }
590 
591         DBG_ASSERT( pEntry, "SvxBitmapTabPage::ClickAddHdl_Impl(), pEntry == 0 ?" );
592 
593         if( pEntry )
594         {
595             pBitmapList->Insert( pEntry );
596 
597             aLbBitmaps.Append( pEntry );
598             aLbBitmaps.SelectEntryPos( aLbBitmaps.GetEntryCount() - 1 );
599 
600 #ifdef WNT
601             // hack: #31355# W.P.
602             Rectangle aRect( aLbBitmaps.GetPosPixel(), aLbBitmaps.GetSizePixel() );
603             if( sal_True ) {                // ??? overlapped with pDlg
604                                         // and srolling
605                 Invalidate( aRect );
606                 //aLbBitmaps.Invalidate();
607             }
608 #endif
609 
610             // Flag fuer modifiziert setzen
611             *pnBitmapListState |= CT_MODIFIED;
612 
613             ChangeBitmapHdl_Impl( this );
614         }
615     }
616 
617     // Status der Buttons ermitteln
618     if( pBitmapList->Count() )
619     {
620         aBtnModify.Enable();
621         aBtnDelete.Enable();
622         aBtnSave.Enable();
623     }
624     return 0L;
625 }
626 
627 
628 /******************************************************************************/
629 /******************************************************************************/
630 
631 
632 //------------------------------------------------------------------------
633 
634 #ifdef _MSC_VER
635 #pragma optimize ( "", off )
636 #endif
637 
638 IMPL_LINK( SvxBitmapTabPage, ClickImportHdl_Impl, void *, EMPTYARG )
639 {
640     ResMgr& rMgr = CUI_MGR();
641     SvxOpenGraphicDialog aDlg( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Import" ) ) );
642     aDlg.EnableLink(sal_False);
643 
644     if( !aDlg.Execute() )
645     {
646         Graphic         aGraphic;
647         int             nError = 1;
648 
649         EnterWait();
650         nError = aDlg.GetGraphic( aGraphic );
651         LeaveWait();
652 
653         if( !nError )
654         {
655             String aDesc( ResId(RID_SVXSTR_DESC_EXT_BITMAP, rMgr) );
656             WarningBox*    pWarnBox = NULL;
657 
658             // convert file URL to UI name
659             String          aName;
660             INetURLObject   aURL( aDlg.GetPath() );
661             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
662             DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
663             AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, String(aURL.GetName()).GetToken( 0, '.' ), aDesc );
664             DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
665             nError = RID_SVXSTR_WARN_NAME_DUPLICATE;
666 
667             while( pDlg->Execute() == RET_OK )
668             {
669                 pDlg->GetName( aName );
670 
671                 sal_Bool bDifferent = sal_True;
672                 long nCount     = pBitmapList->Count();
673 
674                 for( long i = 0; i < nCount && bDifferent; i++ )
675                     if( aName == pBitmapList->GetBitmap( i )->GetName() )
676                         bDifferent = sal_False;
677 
678                 if( bDifferent ) {
679                     nError = 0;
680                     break;
681                 }
682 
683                 if( !pWarnBox )
684                 {
685                     pWarnBox = new WarningBox( DLGWIN,
686                                                WinBits( WB_OK_CANCEL ),
687                                                String( ResId( nError, rMgr ) ) );
688                     pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE );
689                 }
690 
691 
692                 if( pWarnBox->Execute() != RET_OK )
693                     break;
694             }
695             //Rectangle aDlgRect( pDlg->GetPosPixel(), pDlg->GetSizePixel() );
696             delete pDlg;
697             delete pWarnBox;
698 
699             if( !nError )
700             {
701                 XBitmapEntry* pEntry = new XBitmapEntry( aGraphic, aName );
702                 pBitmapList->Insert( pEntry );
703 
704                 aLbBitmaps.Append( pEntry );
705                 aLbBitmaps.SelectEntryPos( aLbBitmaps.GetEntryCount() - 1 );
706 
707 #ifdef WNT
708                 // hack: #31355# W.P.
709                 Rectangle aRect( aLbBitmaps.GetPosPixel(), aLbBitmaps.GetSizePixel() );
710                 if( sal_True ) {                // ??? overlapped with pDlg
711                                             // and srolling
712                     Invalidate( aRect );
713                     //aLbBitmaps.Invalidate();
714                 }
715 #endif
716 
717                 // Flag fuer modifiziert setzen
718                 *pnBitmapListState |= CT_MODIFIED;
719 
720                 ChangeBitmapHdl_Impl( this );
721             }
722         }
723         else
724             // Graphik konnte nicht geladen werden
725             ErrorBox( DLGWIN,
726                       WinBits( WB_OK ),
727                       String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
728     }
729 
730     return 0L;
731 }
732 
733 #ifdef _MSC_VER
734 #pragma optimize ( "", on )
735 #endif
736 
737 //------------------------------------------------------------------------
738 
739 IMPL_LINK( SvxBitmapTabPage, ClickModifyHdl_Impl, void *, EMPTYARG )
740 {
741     sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos();
742 
743     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
744     {
745         ResMgr& rMgr = CUI_MGR();
746         String aNewName( SVX_RES( RID_SVXSTR_BITMAP ) );
747         String aDesc( ResId( RID_SVXSTR_DESC_NEW_BITMAP, rMgr ) );
748         String aName( pBitmapList->GetBitmap( nPos )->GetName() );
749         String aOldName = aName;
750 
751         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
752         DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
753         AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
754         DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
755 
756         long nCount = pBitmapList->Count();
757         sal_Bool bDifferent = sal_False;
758         sal_Bool bLoop = sal_True;
759 
760         while( bLoop && pDlg->Execute() == RET_OK )
761         {
762             pDlg->GetName( aName );
763             bDifferent = sal_True;
764 
765             for( long i = 0; i < nCount && bDifferent; i++ )
766             {
767                 if( aName == pBitmapList->GetBitmap( i )->GetName() &&
768                     aName != aOldName )
769                     bDifferent = sal_False;
770             }
771 
772             if( bDifferent )
773             {
774                 bLoop = sal_False;
775                 XBitmapEntry* pEntry = pBitmapList->GetBitmap( nPos );
776 
777                 pEntry->SetName( aName );
778 
779                 const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx());
780 
781                 pEntry->SetGraphicObject(Graphic(aBitmapEx));
782 
783                 aLbBitmaps.Modify( pEntry, nPos );
784                 aLbBitmaps.SelectEntryPos( nPos );
785 
786                 // Flag fuer modifiziert setzen
787                 *pnBitmapListState |= CT_MODIFIED;
788 
789                 bBmpChanged = sal_False;
790             }
791             else
792             {
793                 WarningBox aBox( DLGWIN, WinBits( WB_OK ), String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
794                 aBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
795                 aBox.Execute();
796             }
797         }
798         delete pDlg;
799     }
800     return 0L;
801 }
802 
803 //------------------------------------------------------------------------
804 
805 IMPL_LINK( SvxBitmapTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG )
806 {
807     sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos();
808 
809     if( nPos != LISTBOX_ENTRY_NOTFOUND )
810     {
811         QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
812             String( CUI_RES( RID_SVXSTR_ASK_DEL_BITMAP ) ) );
813 
814         if( aQueryBox.Execute() == RET_YES )
815         {
816             delete pBitmapList->Remove( nPos );
817             aLbBitmaps.RemoveEntry( nPos );
818             aLbBitmaps.SelectEntryPos( 0 );
819 
820             aCtlPreview.Invalidate();
821             aCtlPixel.Invalidate();
822 
823             ChangeBitmapHdl_Impl( this );
824 
825             // Flag fuer modifiziert setzen
826             *pnBitmapListState |= CT_MODIFIED;
827         }
828     }
829     // Status der Buttons ermitteln
830     if( !pBitmapList->Count() )
831     {
832         aBtnModify.Disable();
833         aBtnDelete.Disable();
834         aBtnSave.Disable();
835     }
836     return 0L;
837 }
838 
839 // -----------------------------------------------------------------------
840 
841 IMPL_LINK( SvxBitmapTabPage, ClickLoadHdl_Impl, void *, EMPTYARG )
842 {
843     sal_uInt16 nReturn = RET_YES;
844     ResMgr& rMgr = CUI_MGR();
845 
846     if ( *pnBitmapListState & CT_MODIFIED )
847     {
848         nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ),
849             String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute();
850 
851         if ( nReturn == RET_YES )
852             pBitmapList->Save();
853     }
854 
855     if ( nReturn != RET_CANCEL )
856     {
857         ::sfx2::FileDialogHelper aDlg(
858             com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
859             0 );
860         String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) );
861         aDlg.AddFilter( aStrFilterType, aStrFilterType );
862         INetURLObject aFile( SvtPathOptions().GetPalettePath() );
863         aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
864 
865         if ( aDlg.Execute() == ERRCODE_NONE )
866         {
867             EnterWait();
868             INetURLObject aURL( aDlg.GetPath() );
869             INetURLObject aPathURL( aURL );
870 
871             aPathURL.removeSegment();
872             aPathURL.removeFinalSlash();
873 
874             // Tabelle speichern
875             XBitmapList* pBmpList = new XBitmapList( aPathURL.GetMainURL( INetURLObject::NO_DECODE ), pXPool );
876             pBmpList->SetName( aURL.getName() );
877             if( pBmpList->Load() )
878             {
879                 if( pBmpList )
880                 {
881                     // Pruefen, ob Tabelle geloescht werden darf:
882                     if( pBitmapList != ( (SvxAreaTabDialog*) DLGWIN )->GetBitmapList() )
883                         delete pBitmapList;
884 
885                     pBitmapList = pBmpList;
886                     ( (SvxAreaTabDialog*) DLGWIN )->SetNewBitmapList( pBitmapList );
887 
888                     aLbBitmaps.Clear();
889                     aLbBitmaps.Fill( pBitmapList );
890                     Reset( rOutAttrs );
891 
892                     pBitmapList->SetName( aURL.getName() );
893 
894                     // Ermitteln (evtl. abschneiden) des Namens und in
895                     // der GroupBox darstellen
896                     String aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
897                     aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
898 
899                     if ( aURL.getBase().getLength() > 18 )
900                     {
901                         aString += String(aURL.getBase()).Copy( 0, 15 );
902                         aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
903                     }
904                     else
905                         aString += String(aURL.getBase());
906 
907                     // Flag fuer gewechselt setzen
908                     *pnBitmapListState |= CT_CHANGED;
909                     // Flag fuer modifiziert entfernen
910                     *pnBitmapListState &= ~CT_MODIFIED;
911                 }
912                 LeaveWait();
913             }
914             else
915             {
916                 LeaveWait();
917                 ErrorBox( DLGWIN, WinBits( WB_OK ),
918                     String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
919             }
920         }
921     }
922 
923     // Status der Buttons ermitteln
924     if( pBitmapList->Count() )
925     {
926         aBtnModify.Enable();
927         aBtnDelete.Enable();
928         aBtnSave.Enable();
929     }
930     else
931     {
932         aBtnModify.Disable();
933         aBtnDelete.Disable();
934         aBtnSave.Disable();
935     }
936     return 0L;
937 }
938 
939 // -----------------------------------------------------------------------
940 
941 IMPL_LINK( SvxBitmapTabPage, ClickSaveHdl_Impl, void *, EMPTYARG )
942 {
943     ::sfx2::FileDialogHelper aDlg(
944         com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
945     String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) );
946     aDlg.AddFilter( aStrFilterType, aStrFilterType );
947 
948     INetURLObject aFile( SvtPathOptions().GetPalettePath() );
949     DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
950 
951     if( pBitmapList->GetName().Len() )
952     {
953         aFile.Append( pBitmapList->GetName() );
954 
955         if( !aFile.getExtension().getLength() )
956             aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "sob" ) ) );
957     }
958 
959     aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
960     if ( aDlg.Execute() == ERRCODE_NONE )
961     {
962         INetURLObject   aURL( aDlg.GetPath() );
963         INetURLObject   aPathURL( aURL );
964 
965         aPathURL.removeSegment();
966         aPathURL.removeFinalSlash();
967 
968         pBitmapList->SetName( aURL.getName() );
969         pBitmapList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
970 
971         if( pBitmapList->Save() )
972         {
973             // Ermitteln (evtl. abschneiden) des Namens und in
974             // der GroupBox darstellen
975             String aString( CUI_RES( RID_SVXSTR_TABLE ) );
976             aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
977 
978             if ( aURL.getBase().getLength() > 18 )
979             {
980                 aString += String(aURL.getBase()).Copy( 0, 15 );
981                 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
982             }
983             else
984                 aString += String(aURL.getBase());
985 
986             // Flag fuer gespeichert setzen
987             *pnBitmapListState |= CT_SAVED;
988             // Flag fuer modifiziert entfernen
989             *pnBitmapListState &= ~CT_MODIFIED;
990         }
991         else
992         {
993             ErrorBox( DLGWIN, WinBits( WB_OK ),
994                 String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute();
995         }
996     }
997 
998     return 0L;
999 }
1000 
1001 //------------------------------------------------------------------------
1002 
1003 IMPL_LINK( SvxBitmapTabPage, ChangePixelColorHdl_Impl, void *, EMPTYARG )
1004 {
1005     aCtlPixel.SetPixelColor( aLbColor.GetSelectEntryColor() );
1006     aCtlPixel.Invalidate();
1007 
1008     aBitmapCtl.SetPixelColor( aLbColor.GetSelectEntryColor() );
1009 
1010     // Bitmap holen und darstellen
1011     rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1012     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1013     aCtlPreview.Invalidate();
1014 
1015     bBmpChanged = sal_True;
1016 
1017     return 0L;
1018 }
1019 
1020 //------------------------------------------------------------------------
1021 
1022 IMPL_LINK( SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl, void *, EMPTYARG )
1023 {
1024     aCtlPixel.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() );
1025     aCtlPixel.Invalidate();
1026 
1027     aBitmapCtl.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() );
1028 
1029     // Bitmap holen und darstellen
1030     rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1031     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1032     aCtlPreview.Invalidate();
1033 
1034     bBmpChanged = sal_True;
1035 
1036     return 0L;
1037 }
1038 
1039 //------------------------------------------------------------------------
1040 
1041 void SvxBitmapTabPage::PointChanged( Window* pWindow, RECT_POINT )
1042 {
1043     if( pWindow == &aCtlPixel )
1044     {
1045         aBitmapCtl.SetBmpArray( aCtlPixel.GetBitmapPixelPtr() );
1046 
1047         // Bitmap holen und darstellen
1048         rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1049         aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1050         aCtlPreview.Invalidate();
1051 
1052         bBmpChanged = sal_True;
1053     }
1054 }
1055 
1056 
1057 
1058 
1059 Window* SvxBitmapTabPage::GetParentLabeledBy( const Window* pLabeled ) const
1060 {
1061     if (pLabeled == &aLbBitmaps)
1062         return const_cast<FixedText*>(&aLbBitmapsHidden);
1063     else
1064         return SvxTabPage::GetParentLabeledBy (pLabeled);
1065 }
1066