xref: /AOO41X/main/cui/source/tabpages/tpbitmap.cxx (revision 4689730ce39795730cf88050013c1780e66ef76e)
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 
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             // Flag fuer modifiziert setzen
601             *pnBitmapListState |= CT_MODIFIED;
602 
603             ChangeBitmapHdl_Impl( this );
604         }
605     }
606 
607     // Status der Buttons ermitteln
608     if( maBitmapList.get() && maBitmapList->Count() )
609     {
610         aBtnModify.Enable();
611         aBtnDelete.Enable();
612         aBtnSave.Enable();
613     }
614     return 0L;
615 }
616 
617 
618 /******************************************************************************/
619 /******************************************************************************/
620 
621 
622 //------------------------------------------------------------------------
623 
624 #ifdef _MSC_VER
625 #pragma optimize ( "", off )
626 #endif
627 
628 IMPL_LINK( SvxBitmapTabPage, ClickImportHdl_Impl, void *, EMPTYARG )
629 {
630     ResMgr& rMgr = CUI_MGR();
631     SvxOpenGraphicDialog aDlg( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "Import" ) ) );
632     aDlg.EnableLink(sal_False);
633 
634     if( !aDlg.Execute() )
635     {
636         Graphic         aGraphic;
637         int             nError = 1;
638 
639         EnterWait();
640         nError = aDlg.GetGraphic( aGraphic );
641         LeaveWait();
642 
643         if( !nError )
644         {
645             String aDesc( ResId(RID_SVXSTR_DESC_EXT_BITMAP, rMgr) );
646             WarningBox*    pWarnBox = NULL;
647 
648             // convert file URL to UI name
649             String          aName;
650             INetURLObject   aURL( aDlg.GetPath() );
651             SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
652             DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
653             AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, String(aURL.GetName()).GetToken( 0, '.' ), aDesc );
654             DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
655             nError = RID_SVXSTR_WARN_NAME_DUPLICATE;
656 
657             while( pDlg->Execute() == RET_OK )
658             {
659                 pDlg->GetName( aName );
660 
661                 sal_Bool bDifferent = sal_True;
662                 long nCount     = maBitmapList->Count();
663 
664                 for( long i = 0; i < nCount && bDifferent; i++ )
665                     if( aName == maBitmapList->GetBitmap( i )->GetName() )
666                         bDifferent = sal_False;
667 
668                 if( bDifferent ) {
669                     nError = 0;
670                     break;
671                 }
672 
673                 if( !pWarnBox )
674                 {
675                     pWarnBox = new WarningBox( DLGWIN,
676                                                WinBits( WB_OK_CANCEL ),
677                                                String( ResId( nError, rMgr ) ) );
678                     pWarnBox->SetHelpId( HID_WARN_NAME_DUPLICATE );
679                 }
680 
681 
682                 if( pWarnBox->Execute() != RET_OK )
683                     break;
684             }
685 
686             delete pDlg;
687             delete pWarnBox;
688 
689             if( !nError )
690             {
691                 XBitmapEntry* pEntry = new XBitmapEntry( aGraphic, aName );
692                 maBitmapList->Insert( pEntry );
693 
694                 const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
695                 aLbBitmaps.Append(rStyleSettings.GetListBoxPreviewDefaultPixelSize(), *pEntry );
696                 aLbBitmaps.SelectEntryPos( aLbBitmaps.GetEntryCount() - 1 );
697 
698                 // Flag fuer modifiziert setzen
699                 *pnBitmapListState |= CT_MODIFIED;
700 
701                 ChangeBitmapHdl_Impl( this );
702             }
703         }
704         else
705             // Graphik konnte nicht geladen werden
706             ErrorBox( DLGWIN,
707                       WinBits( WB_OK ),
708                       String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
709     }
710 
711     return 0L;
712 }
713 
714 #ifdef _MSC_VER
715 #pragma optimize ( "", on )
716 #endif
717 
718 //------------------------------------------------------------------------
719 
720 IMPL_LINK( SvxBitmapTabPage, ClickModifyHdl_Impl, void *, EMPTYARG )
721 {
722     sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos();
723 
724     if ( nPos != LISTBOX_ENTRY_NOTFOUND )
725     {
726         ResMgr& rMgr = CUI_MGR();
727         String aNewName( SVX_RES( RID_SVXSTR_BITMAP ) );
728         String aDesc( ResId( RID_SVXSTR_DESC_NEW_BITMAP, rMgr ) );
729         String aName( maBitmapList->GetBitmap( nPos )->GetName() );
730         String aOldName = aName;
731 
732         SvxAbstractDialogFactory* pFact = SvxAbstractDialogFactory::Create();
733         DBG_ASSERT(pFact, "Dialogdiet fail!");//CHINA001
734         AbstractSvxNameDialog* pDlg = pFact->CreateSvxNameDialog( DLGWIN, aName, aDesc );
735         DBG_ASSERT(pDlg, "Dialogdiet fail!");//CHINA001
736 
737         long nCount = maBitmapList.get() ? maBitmapList->Count() : 0;
738         sal_Bool bDifferent = sal_False;
739         sal_Bool bLoop = sal_True;
740         const StyleSettings& rStyleSettings = Application::GetSettings().GetStyleSettings();
741 
742         while( bLoop && pDlg->Execute() == RET_OK )
743         {
744             pDlg->GetName( aName );
745             bDifferent = sal_True;
746 
747             for( long i = 0; i < nCount && bDifferent; i++ )
748             {
749                 if( aName == maBitmapList->GetBitmap( i )->GetName() &&
750                     aName != aOldName )
751                     bDifferent = sal_False;
752             }
753 
754             if( bDifferent )
755             {
756                 bLoop = sal_False;
757 
758                 const BitmapEx aBitmapEx(aBitmapCtl.GetBitmapEx());
759                 const XBitmapEntry aEntry(Graphic(aBitmapEx), aName);
760 
761                 aLbBitmaps.Modify( rStyleSettings.GetListBoxPreviewDefaultPixelSize(), aEntry, nPos );
762                 aLbBitmaps.SelectEntryPos( nPos );
763 
764                 // Flag fuer modifiziert setzen
765                 *pnBitmapListState |= CT_MODIFIED;
766 
767                 bBmpChanged = sal_False;
768             }
769             else
770             {
771                 WarningBox aBox( DLGWIN, WinBits( WB_OK ), String( ResId( RID_SVXSTR_WARN_NAME_DUPLICATE, rMgr ) ) );
772                 aBox.SetHelpId( HID_WARN_NAME_DUPLICATE );
773                 aBox.Execute();
774             }
775         }
776         delete pDlg;
777     }
778     return 0L;
779 }
780 
781 //------------------------------------------------------------------------
782 
783 IMPL_LINK( SvxBitmapTabPage, ClickDeleteHdl_Impl, void *, EMPTYARG )
784 {
785     sal_uInt16 nPos = aLbBitmaps.GetSelectEntryPos();
786 
787     if( nPos != LISTBOX_ENTRY_NOTFOUND )
788     {
789         QueryBox aQueryBox( DLGWIN, WinBits( WB_YES_NO | WB_DEF_NO ),
790             String( CUI_RES( RID_SVXSTR_ASK_DEL_BITMAP ) ) );
791 
792         if( aQueryBox.Execute() == RET_YES )
793         {
794             delete maBitmapList->Remove( nPos );
795             aLbBitmaps.RemoveEntry( nPos );
796             aLbBitmaps.SelectEntryPos( 0 );
797 
798             aCtlPreview.Invalidate();
799             aCtlPixel.Invalidate();
800 
801             ChangeBitmapHdl_Impl( this );
802 
803             // Flag fuer modifiziert setzen
804             *pnBitmapListState |= CT_MODIFIED;
805         }
806     }
807     // Status der Buttons ermitteln
808     if( !maBitmapList.get() || !maBitmapList->Count() )
809     {
810         aBtnModify.Disable();
811         aBtnDelete.Disable();
812         aBtnSave.Disable();
813     }
814     return 0L;
815 }
816 
817 // -----------------------------------------------------------------------
818 
819 IMPL_LINK( SvxBitmapTabPage, ClickLoadHdl_Impl, void *, EMPTYARG )
820 {
821     sal_uInt16 nReturn = RET_YES;
822     ResMgr& rMgr = CUI_MGR();
823 
824     if ( *pnBitmapListState & CT_MODIFIED )
825     {
826         nReturn = WarningBox( DLGWIN, WinBits( WB_YES_NO_CANCEL ),
827             String( ResId( RID_SVXSTR_WARN_TABLE_OVERWRITE, rMgr ) ) ).Execute();
828 
829         if ( nReturn == RET_YES )
830             maBitmapList->Save();
831     }
832 
833     if ( nReturn != RET_CANCEL )
834     {
835         ::sfx2::FileDialogHelper aDlg(
836             com::sun::star::ui::dialogs::TemplateDescription::FILEOPEN_SIMPLE,
837             0 );
838         String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) );
839         aDlg.AddFilter( aStrFilterType, aStrFilterType );
840         INetURLObject aFile( SvtPathOptions().GetPalettePath() );
841         aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
842 
843         if ( aDlg.Execute() == ERRCODE_NONE )
844         {
845             EnterWait();
846             INetURLObject aURL( aDlg.GetPath() );
847             INetURLObject aPathURL( aURL );
848 
849             aPathURL.removeSegment();
850             aPathURL.removeFinalSlash();
851 
852             // Tabelle speichern
853             XBitmapListSharedPtr aBmpList(XPropertyListFactory::CreateSharedXBitmapList(aPathURL.GetMainURL(INetURLObject::NO_DECODE)));
854             aBmpList->SetName( aURL.getName() );
855             if( aBmpList->Load() )
856             {
857                 if( aBmpList.get() )
858                 {
859                     maBitmapList = aBmpList;
860                     ( (SvxAreaTabDialog*) DLGWIN )->SetNewBitmapList( maBitmapList );
861 
862                     aLbBitmaps.Clear();
863                     aLbBitmaps.Fill( maBitmapList );
864                     Reset( rOutAttrs );
865 
866                     maBitmapList->SetName( aURL.getName() );
867 
868                     // Ermitteln (evtl. abschneiden) des Namens und in
869                     // der GroupBox darstellen
870                     String aString( ResId( RID_SVXSTR_TABLE, rMgr ) );
871                     aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
872 
873                     if ( aURL.getBase().getLength() > 18 )
874                     {
875                         aString += String(aURL.getBase()).Copy( 0, 15 );
876                         aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
877                     }
878                     else
879                         aString += String(aURL.getBase());
880 
881                     // Flag fuer gewechselt setzen
882                     *pnBitmapListState |= CT_CHANGED;
883                     // Flag fuer modifiziert entfernen
884                     *pnBitmapListState &= ~CT_MODIFIED;
885                 }
886                 LeaveWait();
887             }
888             else
889             {
890                 LeaveWait();
891                 ErrorBox( DLGWIN, WinBits( WB_OK ),
892                     String( ResId( RID_SVXSTR_READ_DATA_ERROR, rMgr ) ) ).Execute();
893             }
894         }
895     }
896 
897     // Status der Buttons ermitteln
898     if( maBitmapList.get() && maBitmapList->Count() )
899     {
900         aBtnModify.Enable();
901         aBtnDelete.Enable();
902         aBtnSave.Enable();
903     }
904     else
905     {
906         aBtnModify.Disable();
907         aBtnDelete.Disable();
908         aBtnSave.Disable();
909     }
910     return 0L;
911 }
912 
913 // -----------------------------------------------------------------------
914 
915 IMPL_LINK( SvxBitmapTabPage, ClickSaveHdl_Impl, void *, EMPTYARG )
916 {
917     ::sfx2::FileDialogHelper aDlg(
918         com::sun::star::ui::dialogs::TemplateDescription::FILESAVE_SIMPLE, 0 );
919     String aStrFilterType( RTL_CONSTASCII_USTRINGPARAM( "*.sob" ) );
920     aDlg.AddFilter( aStrFilterType, aStrFilterType );
921 
922     INetURLObject aFile( SvtPathOptions().GetPalettePath() );
923     DBG_ASSERT( aFile.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
924 
925     if( maBitmapList->GetName().Len() )
926     {
927         aFile.Append( maBitmapList->GetName() );
928 
929         if( !aFile.getExtension().getLength() )
930             aFile.SetExtension( UniString::CreateFromAscii( RTL_CONSTASCII_STRINGPARAM( "sob" ) ) );
931     }
932 
933     aDlg.SetDisplayDirectory( aFile.GetMainURL( INetURLObject::NO_DECODE ) );
934     if ( aDlg.Execute() == ERRCODE_NONE )
935     {
936         INetURLObject   aURL( aDlg.GetPath() );
937         INetURLObject   aPathURL( aURL );
938 
939         aPathURL.removeSegment();
940         aPathURL.removeFinalSlash();
941 
942         maBitmapList->SetName( aURL.getName() );
943         maBitmapList->SetPath( aPathURL.GetMainURL( INetURLObject::NO_DECODE ) );
944 
945         if( maBitmapList->Save() )
946         {
947             // Ermitteln (evtl. abschneiden) des Namens und in
948             // der GroupBox darstellen
949             String aString( CUI_RES( RID_SVXSTR_TABLE ) );
950             aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( ": " ) );
951 
952             if ( aURL.getBase().getLength() > 18 )
953             {
954                 aString += String(aURL.getBase()).Copy( 0, 15 );
955                 aString.AppendAscii( RTL_CONSTASCII_STRINGPARAM( "..." ) );
956             }
957             else
958                 aString += String(aURL.getBase());
959 
960             // Flag fuer gespeichert setzen
961             *pnBitmapListState |= CT_SAVED;
962             // Flag fuer modifiziert entfernen
963             *pnBitmapListState &= ~CT_MODIFIED;
964         }
965         else
966         {
967             ErrorBox( DLGWIN, WinBits( WB_OK ),
968                 String( CUI_RES( RID_SVXSTR_WRITE_DATA_ERROR ) ) ).Execute();
969         }
970     }
971 
972     return 0L;
973 }
974 
975 //------------------------------------------------------------------------
976 
977 IMPL_LINK( SvxBitmapTabPage, ChangePixelColorHdl_Impl, void *, EMPTYARG )
978 {
979     aCtlPixel.SetPixelColor( aLbColor.GetSelectEntryColor() );
980     aCtlPixel.Invalidate();
981 
982     aBitmapCtl.SetPixelColor( aLbColor.GetSelectEntryColor() );
983 
984     // Bitmap holen und darstellen
985     rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
986     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
987     aCtlPreview.Invalidate();
988 
989     bBmpChanged = sal_True;
990 
991     return 0L;
992 }
993 
994 //------------------------------------------------------------------------
995 
996 IMPL_LINK( SvxBitmapTabPage, ChangeBackgrndColorHdl_Impl, void *, EMPTYARG )
997 {
998     aCtlPixel.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() );
999     aCtlPixel.Invalidate();
1000 
1001     aBitmapCtl.SetBackgroundColor( aLbBackgroundColor.GetSelectEntryColor() );
1002 
1003     // Bitmap holen und darstellen
1004     rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1005     aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1006     aCtlPreview.Invalidate();
1007 
1008     bBmpChanged = sal_True;
1009 
1010     return 0L;
1011 }
1012 
1013 //------------------------------------------------------------------------
1014 
1015 void SvxBitmapTabPage::PointChanged( Window* pWindow, RECT_POINT )
1016 {
1017     if( pWindow == &aCtlPixel )
1018     {
1019         aBitmapCtl.SetBmpArray( aCtlPixel.GetBitmapPixelPtr() );
1020 
1021         // Bitmap holen und darstellen
1022         rXFSet.Put(XFillBitmapItem(String(), Graphic(aBitmapCtl.GetBitmapEx())));
1023         aCtlPreview.SetAttributes( aXFillAttr.GetItemSet() );
1024         aCtlPreview.Invalidate();
1025 
1026         bBmpChanged = sal_True;
1027     }
1028 }
1029 
1030 
1031 
1032 
1033 Window* SvxBitmapTabPage::GetParentLabeledBy( const Window* pLabeled ) const
1034 {
1035     if (pLabeled == &aLbBitmaps)
1036         return const_cast<FixedText*>(&aLbBitmapsHidden);
1037     else
1038         return SvxTabPage::GetParentLabeledBy (pLabeled);
1039 }
1040