xref: /AOO41X/main/cui/source/tabpages/tpbitmap.cxx (revision 5443dcac4da55ae8863c5c80e8907938642a7f1b)
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     maColorTab(),
111     maBitmapList(),
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( maColorTab );
166     aLbBackgroundColor.CopyEntries( aLbColor );
167 
168     // Bitmaptabelle
169     aLbBitmaps.Fill( maBitmapList );
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( maColorTab.get() )
184         {
185             // ColorTable
186             if( *pnColorTableState & CT_CHANGED ||
187                 *pnColorTableState & CT_MODIFIED )
188             {
189                 if( *pnColorTableState & CT_CHANGED )
190                     maColorTab = ( (SvxAreaTabDialog*) DLGWIN )->GetNewColorTable();
191 
192                 // LbColor
193                 nPos = aLbColor.GetSelectEntryPos();
194                 aLbColor.Clear();
195                 aLbColor.Fill( maColorTab );
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( maBitmapList->GetPath() );
224 
225             aURL.Append( maBitmapList->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 = maBitmapList->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( maBitmapList.get() && maBitmapList->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(maBitmapList->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(maBitmapList->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 = maBitmapList.get() ? maBitmapList->Count() : 0;
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 == maBitmapList->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 == maBitmapList->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             maBitmapList->Insert( pEntry );
596             const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
597             aLbBitmaps.Append(rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *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( maBitmapList.get() && maBitmapList->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     = maBitmapList->Count();
673 
674                 for( long i = 0; i < nCount && bDifferent; i++ )
675                     if( aName == maBitmapList->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                 maBitmapList->Insert( pEntry );
703 
704                 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
705                 aLbBitmaps.Append(rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry );
706                 aLbBitmaps.SelectEntryPos( aLbBitmaps.GetEntryCount() - 1 );
707 
708 #ifdef WNT
709                 // hack: #31355# W.P.
710                 Rectangle aRect( aLbBitmaps.GetPosPixel(), aLbBitmaps.GetSizePixel() );
711                 if( sal_True ) {                // ??? overlapped with pDlg
712                                             // and srolling
713                     Invalidate( aRect );
714                     //aLbBitmaps.Invalidate();
715                 }
716 #endif
717 
718                 // Flag fuer modifiziert setzen
719                 *pnBitmapListState |= CT_MODIFIED;
720 
721                 ChangeBitmapHdl_Impl( this );
722             }
723         }
724         else
725             // Graphik konnte nicht geladen werden
726             ErrorBox( DLGWIN,
727                       WinBits( WB_OK ),
728                       String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
729     }
730 
731     return 0L;
732 }
733 
734 #ifdef _MSC_VER
735 #pragma optimize ( "", on )
736 #endif
737 
738 //------------------------------------------------------------------------
739 
740 IMPL_LINK( SvxBitmapTabPage, ClickModifyHdl_Impl, void *, EMPTYARG )
741 {
742     sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos();
743 
744     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
745     {
746         ResMgr& rMgr = CUI_MGR();
747         String aNewName( SVX_RES( RID_SVXSTR_BITMAP ) );
748         String aDesc( ResId( RID_SVXSTR_DESC_NEW_BITMAP, rMgr ) );
749         String aName( maBitmapList->GetBitmap( nPos )->GetName() );
750         String aOldName = aName;
751 
752         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
753         DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
754         AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
755         DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
756 
757         long nCount = maBitmapList.get() ? maBitmapList->Count() : 0;
758         sal_Bool bDifferent = sal_False;
759         sal_Bool bLoop = sal_True;
760         const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
761 
762         while( bLoop && pDlg->Execute() == RET_OK )
763         {
764             pDlg->GetName( aName );
765             bDifferent = sal_True;
766 
767             for( long i = 0; i < nCount && bDifferent; i++ )
768             {
769                 if( aName == maBitmapList->GetBitmap( i )->GetName() &&
770                     aName != aOldName )
771                     bDifferent = sal_False;
772             }
773 
774             if( bDifferent )
775             {
776                 bLoop = sal_False;
777                 XBitmapEntry* pEntry = maBitmapList->GetBitmap( nPos );
778 
779                 pEntry->SetName( aName );
780 
781                 const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx());
782 
783                 pEntry->SetGraphicObject(Graphic(aBitmapEx));
784 
785                 aLbBitmaps.Modify( rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry, nPos );
786                 aLbBitmaps.SelectEntryPos( nPos );
787 
788                 // Flag fuer modifiziert setzen
789                 *pnBitmapListState |= CT_MODIFIED;
790 
791                 bBmpChanged = sal_False;
792             }
793             else
794             {
795                 WarningBox aBox( DLGWIN, WinBits( WB_OK ), String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
796                 aBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
797                 aBox.Execute();
798             }
799         }
800         delete pDlg;
801     }
802     return 0L;
803 }
804 
805 //------------------------------------------------------------------------
806 
807 IMPL_LINK( SvxBitmapTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG )
808 {
809     sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos();
810 
811     if( nPos != LISTBOX_ENTRY_NOTFOUND )
812     {
813         QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
814             String( CUI_RES( RID_SVXSTR_ASK_DEL_BITMAP ) ) );
815 
816         if( aQueryBox.Execute() == RET_YES )
817         {
818             delete maBitmapList->Remove( nPos );
819             aLbBitmaps.RemoveEntry( nPos );
820             aLbBitmaps.SelectEntryPos( 0 );
821 
822             aCtlPreview.Invalidate();
823             aCtlPixel.Invalidate();
824 
825             ChangeBitmapHdl_Impl( this );
826 
827             // Flag fuer modifiziert setzen
828             *pnBitmapListState |= CT_MODIFIED;
829         }
830     }
831     // Status der Buttons ermitteln
832     if( !maBitmapList.get() || !maBitmapList->Count() )
833     {
834         aBtnModify.Disable();
835         aBtnDelete.Disable();
836         aBtnSave.Disable();
837     }
838     return 0L;
839 }
840 
841 // -----------------------------------------------------------------------
842 
843 IMPL_LINK( SvxBitmapTabPage, ClickLoadHdl_Impl, void *, EMPTYARG )
844 {
845     sal_uInt16 nReturn = RET_YES;
846     ResMgr& rMgr = CUI_MGR();
847 
848     if ( *pnBitmapListState & CT_MODIFIED )
849     {
850         nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ),
851             String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute();
852 
853         if ( nReturn == RET_YES )
854             maBitmapList->Save();
855     }
856 
857     if ( nReturn != RET_CANCEL )
858     {
859         ::sfx2::FileDialogHelper aDlg(
860             com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
861             0 );
862         String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) );
863         aDlg.AddFilter( aStrFilterType, aStrFilterType );
864         INetURLObject aFile( SvtPathOptions().GetPalettePath() );
865         aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
866 
867         if ( aDlg.Execute() == ERRCODE_NONE )
868         {
869             EnterWait();
870             INetURLObject aURL( aDlg.GetPath() );
871             INetURLObject aPathURL( aURL );
872 
873             aPathURL.removeSegment();
874             aPathURL.removeFinalSlash();
875 
876             // Tabelle speichern
877             XBitmapListSharedPtr aBmpList(XPropertyListFactory::CreateSharedXBitmapList(aPathURL.GetMainURL(INetURLObject::NO_DECODE)));
878             aBmpList->SetName( aURL.getName() );
879             if( aBmpList->Load() )
880             {
881                 if( aBmpList.get() )
882                 {
883                     maBitmapList = aBmpList;
884                     ( (SvxAreaTabDialog*) DLGWIN )->SetNewBitmapList( maBitmapList );
885 
886                     aLbBitmaps.Clear();
887                     aLbBitmaps.Fill( maBitmapList );
888                     Reset( rOutAttrs );
889 
890                     maBitmapList->SetName( aURL.getName() );
891 
892                     // Ermitteln (evtl. abschneiden) des Namens und in
893                     // der GroupBox darstellen
894                     String aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
895                     aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
896 
897                     if ( aURL.getBase().getLength() > 18 )
898                     {
899                         aString += String(aURL.getBase()).Copy( 0, 15 );
900                         aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
901                     }
902                     else
903                         aString += String(aURL.getBase());
904 
905                     // Flag fuer gewechselt setzen
906                     *pnBitmapListState |= CT_CHANGED;
907                     // Flag fuer modifiziert entfernen
908                     *pnBitmapListState &= ~CT_MODIFIED;
909                 }
910                 LeaveWait();
911             }
912             else
913             {
914                 LeaveWait();
915                 ErrorBox( DLGWIN, WinBits( WB_OK ),
916                     String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
917             }
918         }
919     }
920 
921     // Status der Buttons ermitteln
922     if( maBitmapList.get() && maBitmapList->Count() )
923     {
924         aBtnModify.Enable();
925         aBtnDelete.Enable();
926         aBtnSave.Enable();
927     }
928     else
929     {
930         aBtnModify.Disable();
931         aBtnDelete.Disable();
932         aBtnSave.Disable();
933     }
934     return 0L;
935 }
936 
937 // -----------------------------------------------------------------------
938 
939 IMPL_LINK( SvxBitmapTabPage, ClickSaveHdl_Impl, void *, EMPTYARG )
940 {
941     ::sfx2::FileDialogHelper aDlg(
942         com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
943     String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) );
944     aDlg.AddFilter( aStrFilterType, aStrFilterType );
945 
946     INetURLObject aFile( SvtPathOptions().GetPalettePath() );
947     DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
948 
949     if( maBitmapList->GetName().Len() )
950     {
951         aFile.Append( maBitmapList->GetName() );
952 
953         if( !aFile.getExtension().getLength() )
954             aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "sob" ) ) );
955     }
956 
957     aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
958     if ( aDlg.Execute() == ERRCODE_NONE )
959     {
960         INetURLObject   aURL( aDlg.GetPath() );
961         INetURLObject   aPathURL( aURL );
962 
963         aPathURL.removeSegment();
964         aPathURL.removeFinalSlash();
965 
966         maBitmapList->SetName( aURL.getName() );
967         maBitmapList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
968 
969         if( maBitmapList->Save() )
970         {
971             // Ermitteln (evtl. abschneiden) des Namens und in
972             // der GroupBox darstellen
973             String aString( CUI_RES( RID_SVXSTR_TABLE ) );
974             aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
975 
976             if ( aURL.getBase().getLength() > 18 )
977             {
978                 aString += String(aURL.getBase()).Copy( 0, 15 );
979                 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
980             }
981             else
982                 aString += String(aURL.getBase());
983 
984             // Flag fuer gespeichert setzen
985             *pnBitmapListState |= CT_SAVED;
986             // Flag fuer modifiziert entfernen
987             *pnBitmapListState &= ~CT_MODIFIED;
988         }
989         else
990         {
991             ErrorBox( DLGWIN, WinBits( WB_OK ),
992                 String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute();
993         }
994     }
995 
996     return 0L;
997 }
998 
999 //------------------------------------------------------------------------
1000 
1001 IMPL_LINK( SvxBitmapTabPage, ChangePixelColorHdl_Impl, void *, EMPTYARG )
1002 {
1003     aCtlPixel.SetPixelColor( aLbColor.GetSelectEntryColor() );
1004     aCtlPixel.Invalidate();
1005 
1006     aBitmapCtl.SetPixelColor( aLbColor.GetSelectEntryColor() );
1007 
1008     // Bitmap holen und darstellen
1009     rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1010     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1011     aCtlPreview.Invalidate();
1012 
1013     bBmpChanged = sal_True;
1014 
1015     return 0L;
1016 }
1017 
1018 //------------------------------------------------------------------------
1019 
1020 IMPL_LINK( SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl, void *, EMPTYARG )
1021 {
1022     aCtlPixel.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() );
1023     aCtlPixel.Invalidate();
1024 
1025     aBitmapCtl.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() );
1026 
1027     // Bitmap holen und darstellen
1028     rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1029     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1030     aCtlPreview.Invalidate();
1031 
1032     bBmpChanged = sal_True;
1033 
1034     return 0L;
1035 }
1036 
1037 //------------------------------------------------------------------------
1038 
1039 void SvxBitmapTabPage::PointChanged( Window* pWindow, RECT_POINT )
1040 {
1041     if( pWindow == &aCtlPixel )
1042     {
1043         aBitmapCtl.SetBmpArray( aCtlPixel.GetBitmapPixelPtr() );
1044 
1045         // Bitmap holen und darstellen
1046         rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1047         aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1048         aCtlPreview.Invalidate();
1049 
1050         bBmpChanged = sal_True;
1051     }
1052 }
1053 
1054 
1055 
1056 
1057 Window* SvxBitmapTabPage::GetParentLabeledBy( const Window* pLabeled ) const
1058 {
1059     if (pLabeled == &aLbBitmaps)
1060         return const_cast<FixedText*>(&aLbBitmapsHidden);
1061     else
1062         return SvxTabPage::GetParentLabeledBy (pLabeled);
1063 }
1064