xref: /AOO41X/main/sd/source/filter/grf/sdgrffilter.cxx (revision 79aad27f7f29270c03e208e3d687e8e3850af11d)
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_sd.hxx"
26 
27 #ifdef _MSC_VER
28 #pragma warning (disable:4190)
29 #endif
30 #include <com/sun/star/graphic/XGraphicProvider.hpp>
31 #include <com/sun/star/graphic/GraphicType.hpp>
32 #include <com/sun/star/ucb/XSimpleFileAccess2.hpp>
33 
34 #include <unotools/localfilehelper.hxx>
35 #include <tools/errinf.hxx>
36 #include <vcl/msgbox.hxx>
37 #include <vcl/metaact.hxx>
38 #include <vcl/virdev.hxx>
39 #include <sfx2/docfile.hxx>
40 #include <sfx2/docfilt.hxx>
41 #include <sfx2/frame.hxx>
42 #include <svx/svdograf.hxx>
43 #include <svx/svdpagv.hxx>
44 
45 #include "../../ui/inc/strings.hrc"
46 #include "../../ui/inc/DrawViewShell.hxx"
47 #include "../../ui/inc/DrawDocShell.hxx"
48 #include "../../ui/inc/ClientView.hxx"
49 #include "../../ui/inc/FrameView.hxx"
50 
51 #include "comphelper/anytostring.hxx"
52 #include "cppuhelper/exc_hlp.hxx"
53 
54 // --
55 #include <comphelper/processfactory.hxx>
56 #include <unotools/pathoptions.hxx>
57 #include <com/sun/star/ui/dialogs/XFilePicker.hpp>
58 #include <com/sun/star/ui/dialogs/XFilterManager.hpp>
59 #include <com/sun/star/ui/dialogs/TemplateDescription.hpp>
60 #include <sfx2/filedlghelper.hxx>
61 #include <tools/urlobj.hxx>
62 #include <svtools/filter.hxx>
63 #include <svx/xoutbmp.hxx>
64 
65 // --
66 
67 #include "sdpage.hxx"
68 #include "drawdoc.hxx"
69 #include "sdresid.hxx"
70 #include "sdgrffilter.hxx"
71 #include "../../ui/inc/ViewShellBase.hxx"
72 #include <com/sun/star/uno/Sequence.h>
73 #include <com/sun/star/beans/PropertyValue.hpp>
74 #include <com/sun/star/beans/PropertyValues.hpp>
75 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
76 #include <com/sun/star/lang/XComponent.hpp>
77 #include <com/sun/star/document/XFilter.hpp>
78 #include <com/sun/star/document/XExporter.hpp>
79 #include <comphelper/processfactory.hxx>
80 #include <com/sun/star/view/XSelectionSupplier.hpp>
81 #include <com/sun/star/drawing/XDrawView.hpp>
82 #include "../../ui/inc/DrawController.hxx"
83 #include <cppuhelper/implbase2.hxx>
84 #include <com/sun/star/drawing/XShape.hpp>
85 #include <com/sun/star/task/XInteractionHandler.hpp>
86 #include <com/sun/star/task/XInteractionRequest.hpp>
87 #include <com/sun/star/drawing/GraphicFilterRequest.hpp>
88 
89 using namespace ::com::sun::star;
90 using namespace ::com::sun::star::uno;
91 using namespace ::com::sun::star::lang;
92 using namespace ::com::sun::star::beans;
93 using namespace ::com::sun::star::graphic;
94 using namespace ::com::sun::star::io;
95 using namespace ::com::sun::star::ucb;
96 using namespace com::sun::star::ui::dialogs;
97 using rtl::OUString;
98 using namespace ::sfx2;
99 
100 
101 // -----------------------------------------------------------------------------
102 
103 class SdGRFFilter_ImplInteractionHdl : public ::cppu::WeakImplHelper1< com::sun::star::task::XInteractionHandler >
104 {
105     com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler > m_xInter;
106     sal_uInt16 nFilterError;
107 
108     public:
109 
SdGRFFilter_ImplInteractionHdl(com::sun::star::uno::Reference<com::sun::star::task::XInteractionHandler> xInteraction)110     SdGRFFilter_ImplInteractionHdl( com::sun::star::uno::Reference< com::sun::star::task::XInteractionHandler > xInteraction ) :
111         m_xInter( xInteraction ),
112         nFilterError( GRFILTER_OK )
113         {}
114 
115     ~SdGRFFilter_ImplInteractionHdl();
116 
GetErrorCode() const117     sal_uInt16 GetErrorCode() const { return nFilterError; };
118 
119     virtual void SAL_CALL   handle( const com::sun::star::uno::Reference< com::sun::star::task::XInteractionRequest >& )
120                                 throw( com::sun::star::uno::RuntimeException );
121 };
122 
~SdGRFFilter_ImplInteractionHdl()123 SdGRFFilter_ImplInteractionHdl::~SdGRFFilter_ImplInteractionHdl()
124 {
125 }
126 
handle(const com::sun::star::uno::Reference<com::sun::star::task::XInteractionRequest> & xRequest)127 void SdGRFFilter_ImplInteractionHdl::handle( const com::sun::star::uno::Reference< com::sun::star::task::XInteractionRequest >& xRequest )
128         throw( com::sun::star::uno::RuntimeException )
129 {
130     if( !m_xInter.is() )
131         return;
132 
133     com::sun::star::drawing::GraphicFilterRequest aErr;
134     if ( xRequest->getRequest() >>= aErr )
135         nFilterError = (sal_uInt16)aErr.ErrCode;
136     else
137         m_xInter->handle( xRequest );
138 }
139 
140 
141 // ---------------
142 // - SdPPTFilter -
143 // ---------------
144 
SdGRFFilter(SfxMedium & rMedium,::sd::DrawDocShell & rDocShell)145 SdGRFFilter::SdGRFFilter( SfxMedium& rMedium, ::sd::DrawDocShell& rDocShell ) :
146     SdFilter( rMedium, rDocShell, sal_True )
147 {
148 }
149 
150 // -----------------------------------------------------------------------------
151 
~SdGRFFilter()152 SdGRFFilter::~SdGRFFilter()
153 {
154 }
155 
156 // -----------------------------------------------------------------------------
157 
HandleGraphicFilterError(sal_uInt16 nFilterError,sal_uLong nStreamError)158 void SdGRFFilter::HandleGraphicFilterError( sal_uInt16 nFilterError, sal_uLong nStreamError )
159 {
160     sal_uInt16 nId;
161 
162     switch( nFilterError )
163     {
164         case GRFILTER_OPENERROR:
165             nId = STR_IMPORT_GRFILTER_OPENERROR;
166             break;
167         case GRFILTER_IOERROR:
168             nId = STR_IMPORT_GRFILTER_IOERROR;
169             break;
170         case GRFILTER_FORMATERROR:
171             nId = STR_IMPORT_GRFILTER_FORMATERROR;
172             break;
173         case GRFILTER_VERSIONERROR:
174             nId = STR_IMPORT_GRFILTER_VERSIONERROR;
175             break;
176         case GRFILTER_TOOBIG:
177             nId = STR_IMPORT_GRFILTER_TOOBIG;
178             break;
179         case 0 :
180             nId = 0;
181             break;
182 
183         default:
184         case GRFILTER_FILTERERROR:
185             nId = STR_IMPORT_GRFILTER_FILTERERROR;
186             break;
187     }
188 
189     if( ERRCODE_NONE != nStreamError )
190         ErrorHandler::HandleError( nStreamError );
191     else if( STR_IMPORT_GRFILTER_IOERROR == nId )
192         ErrorHandler::HandleError( ERRCODE_IO_GENERAL );
193     else
194     {
195         ErrorBox aErrorBox( NULL, WB_OK, String( SdResId( nId ) ) );
196         aErrorBox.Execute();
197     }
198 }
199 
200 // -----------------------------------------------------------------------------
201 
Import()202 sal_Bool SdGRFFilter::Import()
203 {
204     Graphic         aGraphic;
205     const String    aFileName( mrMedium.GetURLObject().GetMainURL( INetURLObject::NO_DECODE ) );
206     GraphicFilter*  pGraphicFilter = GraphicFilter::GetGraphicFilter();
207     const sal_uInt16    nFilter = pGraphicFilter->GetImportFormatNumberForTypeName( mrMedium.GetFilter()->GetTypeName() );
208     sal_Bool        bRet = sal_False;
209 
210     // ggf. Filterdialog ausfuehren
211     if ( !pGraphicFilter->HasImportDialog( nFilter ) || pGraphicFilter->DoImportDialog( NULL, nFilter ) )
212     {
213         SvStream*       pIStm = mrMedium.GetInStream();
214         sal_uInt16          nReturn = pIStm ? pGraphicFilter->ImportGraphic( aGraphic, aFileName, *pIStm, nFilter ) : 1;
215 
216         if( nReturn )
217             HandleGraphicFilterError( nReturn, pGraphicFilter->GetLastError().nStreamError );
218         else
219         {
220             if( mrDocument.GetPageCount() == 0L )
221                 mrDocument.CreateFirstPages();
222 
223             SdPage*     pPage = mrDocument.GetSdPage( 0, PK_STANDARD );
224             Point       aPos;
225             Size        aPagSize( pPage->GetSize() );
226             Size        aGrfSize( OutputDevice::LogicToLogic( aGraphic.GetPrefSize(),
227                                   aGraphic.GetPrefMapMode(), MAP_100TH_MM ) );
228 
229             aPagSize.Width() -= pPage->GetLftBorder() + pPage->GetRgtBorder();
230             aPagSize.Height() -= pPage->GetUppBorder() + pPage->GetLwrBorder();
231 
232             // scale to fit page
233             if ( ( ( aGrfSize.Height() > aPagSize.Height() ) || ( aGrfSize.Width() > aPagSize.Width() ) ) &&
234                  aGrfSize.Height() && aPagSize.Height() )
235             {
236                 double fGrfWH = (double) aGrfSize.Width() / aGrfSize.Height();
237                 double fWinWH = (double) aPagSize.Width() / aPagSize.Height();
238 
239                 // Grafik an Pagesize anpassen (skaliert)
240                 if( fGrfWH < fWinWH )
241                 {
242                     aGrfSize.Width() = (long) ( aPagSize.Height() * fGrfWH );
243                     aGrfSize.Height() = aPagSize.Height();
244                 }
245                 else if( fGrfWH > 0.F )
246                 {
247                     aGrfSize.Width() = aPagSize.Width();
248                     aGrfSize.Height()= (long) ( aPagSize.Width() / fGrfWH );
249                 }
250             }
251 
252             // Ausgaberechteck fuer Grafik setzen
253             aPos.X() = ( ( aPagSize.Width() - aGrfSize.Width() ) >> 1 ) + pPage->GetLftBorder();
254             aPos.Y() = ( ( aPagSize.Height() - aGrfSize.Height() ) >> 1 )  + pPage->GetUppBorder();
255 
256             pPage->InsertObject( new SdrGrafObj( aGraphic, Rectangle( aPos, aGrfSize ) ) );
257             bRet = sal_True;
258         }
259     }
260     return bRet;
261 }
262 
263 // -----------------------------------------------------------------------------
264 
Export()265 sal_Bool SdGRFFilter::Export()
266 {
267     // SJ: todo: error handling, the GraphicExportFilter does not support proper errorhandling
268 
269     sal_Bool bRet = sal_False;
270 
271     uno::Reference< lang::XMultiServiceFactory >
272         xSMgr( ::comphelper::getProcessServiceFactory() );
273     uno::Reference< uno::XInterface > xComponent
274         ( xSMgr->createInstance( rtl::OUString::createFromAscii( "com.sun.star.drawing.GraphicExportFilter" ) ),
275             uno::UNO_QUERY );
276     if ( xComponent.is() )
277     {
278         uno::Reference< document::XExporter > xExporter
279             ( xComponent, uno::UNO_QUERY );
280         uno::Reference< document::XFilter > xFilter
281             ( xComponent, uno::UNO_QUERY );
282         if ( xExporter.is() && xFilter.is() )
283         {
284             SdPage* pPage = NULL;
285             sd::DrawViewShell*  pDrawViewShell = static_cast< ::sd::DrawViewShell* >
286                 ( ( ( mrDocShell.GetViewShell() && mrDocShell.GetViewShell()->ISA(::sd::DrawViewShell ) ) ? mrDocShell.GetViewShell() : NULL ) );
287 
288             PageKind ePageKind = PK_STANDARD;
289             if( pDrawViewShell )
290             {
291                 ePageKind = pDrawViewShell->GetPageKind();
292                 if( PK_HANDOUT == ePageKind )
293                     pPage = mrDocument.GetSdPage( 0, PK_HANDOUT );
294                 else
295                     pPage = pDrawViewShell->GetActualPage();
296             }
297             else
298                 pPage = mrDocument.GetSdPage( 0, PK_STANDARD );
299 
300             if ( pPage )
301             {
302                 // taking the 'correct' page number, seems that there might exist a better method to archive this
303                 pPage = mrDocument.GetSdPage( pPage->GetPageNum() ? ( pPage->GetPageNum() - 1 ) >> 1 : 0, ePageKind );
304                 if ( pPage )
305                 {
306                     uno::Reference< lang::XComponent > xSource( pPage->getUnoPage(), uno::UNO_QUERY );
307                     SfxItemSet* pSet = mrMedium.GetItemSet();
308                     GraphicFilter*  pGraphicFilter = GraphicFilter::GetGraphicFilter();
309                     if ( pSet && pGraphicFilter && xSource.is() )
310                     {
311                         const String aTypeName( mrMedium.GetFilter()->GetTypeName() );
312                         const sal_uInt16 nFilter = pGraphicFilter->GetExportFormatNumberForTypeName( aTypeName );
313                         if ( nFilter != GRFILTER_FORMAT_NOTFOUND )
314                         {
315                             uno::Reference< task::XInteractionHandler > mXInteractionHandler;
316 
317                             beans::PropertyValues aArgs;
318                             TransformItems( SID_SAVEASDOC, *pSet, aArgs );
319 
320                             rtl::OUString sInteractionHandler( RTL_CONSTASCII_USTRINGPARAM( "InteractionHandler" ) );
321                             rtl::OUString sFilterName( RTL_CONSTASCII_USTRINGPARAM( "FilterName" ) );
322                             rtl::OUString sShortName( pGraphicFilter->GetExportFormatShortName( nFilter ) );
323 
324                             sal_Bool    bFilterNameFound = sal_False;
325                             sal_Int32   i, nCount;
326                             for ( i = 0, nCount = aArgs.getLength(); i < nCount; i++ )
327                             {
328                                 rtl::OUString& rStr = aArgs[ i ].Name;
329                                 if ( rStr == sFilterName )
330                                 {
331                                     bFilterNameFound = sal_True;
332                                     aArgs[ i ].Name = sFilterName;
333                                     aArgs[ i ].Value <<= sShortName;
334                                 }
335                                 else if ( rStr == sInteractionHandler )
336                                 {
337                                     uno::Reference< task::XInteractionHandler > xHdl;
338                                     if ( aArgs[ i ].Value >>= xHdl )
339                                     {
340                                         mXInteractionHandler = new SdGRFFilter_ImplInteractionHdl( xHdl );
341                                         aArgs[ i ].Value <<= mXInteractionHandler;
342                                     }
343                                 }
344                             }
345                             if ( !bFilterNameFound )
346                             {
347                                 aArgs.realloc( ++nCount );
348                                 aArgs[ i ].Name = sFilterName;
349                                 aArgs[ i ].Value <<= sShortName;
350                             }
351 
352                             // take selection if needed
353                             if( ( SFX_ITEM_SET == pSet->GetItemState( SID_SELECTION ) )
354                                 && static_cast< const SfxBoolItem& >( pSet->Get( SID_SELECTION ) ).GetValue()
355                                 && pDrawViewShell )
356                             {
357                                 uno::Reference< view::XSelectionSupplier > xSelectionSupplier(
358                                     pDrawViewShell->GetViewShellBase().GetController(), uno::UNO_QUERY );
359                                 if ( xSelectionSupplier.is() )
360                                 {
361                                     uno::Any aSelection( xSelectionSupplier->getSelection() );
362                                     uno::Reference< lang::XComponent > xSelection;
363                                     if ( aSelection >>= xSelection )
364                                         xSource = xSelection;
365                                 }
366                             }
367                             xExporter->setSourceDocument( xSource );
368                             bRet = xFilter->filter( aArgs );
369                             if ( !bRet && mXInteractionHandler.is() )
370                                 SdGRFFilter::HandleGraphicFilterError(
371                                     static_cast< SdGRFFilter_ImplInteractionHdl* >( mXInteractionHandler.get() )->GetErrorCode(),
372                                                     pGraphicFilter->GetLastError().nStreamError );
373                         }
374                     }
375                 }
376             }
377         }
378     }
379     return bRet;
380 }
381 
SaveGraphic(const::com::sun::star::uno::Reference<::com::sun::star::drawing::XShape> & xShape)382 void SdGRFFilter::SaveGraphic( const ::com::sun::star::uno::Reference< ::com::sun::star::drawing::XShape >& xShape )
383 {
384     try
385     {
386         Reference< XMultiServiceFactory > xSM( ::comphelper::getProcessServiceFactory(), UNO_QUERY_THROW );
387 
388         Reference< XGraphicProvider > xProvider( xSM->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.graphic.GraphicProvider" ) ) ), UNO_QUERY_THROW );
389         Reference< XPropertySet > xShapeSet( xShape, UNO_QUERY_THROW );
390 
391         // detect mime type of graphic
392         OUString aMimeType;
393         OUString sGraphicURL;
394 
395         // first try to detect from graphic object
396         Reference< XPropertySet > xGraphicSet( xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Graphic" ) ) ), UNO_QUERY_THROW );
397         xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicURL" ) ) ) >>= sGraphicURL;
398 
399         bool bIsLinked = (sGraphicURL.getLength() != 0) && (sGraphicURL.compareToAscii( RTL_CONSTASCII_STRINGPARAM("vnd.sun.star.GraphicObject:") ) != 0);
400 
401         if( !bIsLinked )
402             xGraphicSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MimeType" ) ) ) >>= aMimeType;
403 
404         if( bIsLinked || aMimeType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "image/x-vclgraphic" ) ) || !aMimeType.getLength() )
405         {
406             // this failed, try to detect it from graphic stream and URL
407             OUString aURL( sGraphicURL );
408 
409             if( aURL.getLength() == 0 )
410                 xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStreamURL" ) ) ) >>= aURL;
411 
412             {
413                 Reference< XInputStream > xGraphStream( xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStream" ) ) ), UNO_QUERY );
414                 PropertyValues aDesc(2);
415                 aDesc[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
416                 aDesc[0].Value <<= aURL;
417                 aDesc[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "InputStream" ) );
418                 aDesc[1].Value <<= xGraphStream;
419 
420                 Reference< XPropertySet > xDescSet( xProvider->queryGraphicDescriptor( aDesc ), UNO_QUERY_THROW );
421 
422                 xDescSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "MimeType" ) ) ) >>= aMimeType;
423             }
424         }
425 
426         if( aMimeType.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "image/x-vclgraphic" ) ) || !aMimeType.getLength() )
427         {
428             // this also failed, now set a mimetype that fits graphic best
429 
430             // gif for animated pixel
431             // png for non animated pixel
432             // svm for vector format
433             sal_Int8 nGraphicType = 0;
434             xGraphicSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicType" ) ) ) >>= nGraphicType;
435             switch( nGraphicType )
436             {
437             case ::com::sun::star::graphic::GraphicType::VECTOR:
438                 aMimeType = OUString::createFromAscii( "image/x-svm" );
439                 break;
440 
441             case ::com::sun::star::graphic::GraphicType::PIXEL:
442                 {
443                     sal_Bool bAnimated = sal_False;
444                     xGraphicSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Animated" ) ) ) >>= bAnimated;
445 
446                     if( bAnimated )
447                     {
448                         aMimeType = OUString::createFromAscii( "image/gif" );
449                         break;
450                     }
451                 }
452                 // Fallthrough!
453 //          case ::com::sun::star::graphic::GraphicType::EMPTY:
454             default:
455                 aMimeType = OUString::createFromAscii( "image/png" );
456                 break;
457             }
458         }
459 
460         // init dialog
461         SvtPathOptions aPathOpt;
462         String sGrfPath( aPathOpt.GetGraphicPath() );
463 
464         FileDialogHelper aDlgHelper( TemplateDescription::FILESAVE_AUTOEXTENSION, 0 );
465         Reference < XFilePicker > xFP = aDlgHelper.GetFilePicker();
466 
467         String aTitle( SdResId( STR_TITLE_SAVE_AS_PICTURE ) );
468         aDlgHelper.SetTitle( aTitle );
469 
470         INetURLObject aPath;
471         aPath.SetSmartURL( sGrfPath);
472         xFP->setDisplayDirectory( aPath.GetMainURL(INetURLObject::DECODE_TO_IURI) );
473 
474         // populate filter dialog filter list and select default filter to match graphic mime type
475 
476         GraphicFilter& rGF = *GraphicFilter::GetGraphicFilter();
477         Reference<XFilterManager> xFltMgr(xFP, UNO_QUERY);
478         OUString aDefaultFormatName;
479         sal_uInt16 nCount = rGF.GetExportFormatCount();
480 
481         std::map< OUString, OUString > aMimeTypeMap;
482 
483         for ( sal_uInt16 i = 0; i < nCount; i++ )
484         {
485             const OUString aExportFormatName( rGF.GetExportFormatName( i ) );
486             const OUString aFilterMimeType( rGF.GetExportFormatMediaType( i ) );
487             xFltMgr->appendFilter( aExportFormatName, rGF.GetExportWildcard( i ) );
488             aMimeTypeMap[ aExportFormatName ] = aFilterMimeType;
489             if( aMimeType == aFilterMimeType )
490                 aDefaultFormatName = aExportFormatName;
491         }
492 
493         if( aDefaultFormatName.getLength() == 0 )
494         {
495             nCount = rGF.GetImportFormatCount();
496             for( sal_uInt16 i = 0; i < nCount; i++ )
497             {
498                 const OUString aFilterMimeType( rGF.GetImportFormatMediaType( i ) );
499                 if( aMimeType == aFilterMimeType )
500                 {
501                     aDefaultFormatName = rGF.GetImportFormatName( i );
502                     xFltMgr->appendFilter( aDefaultFormatName,  rGF.GetImportWildcard( i ) );
503                     aMimeTypeMap[ aDefaultFormatName ] = aFilterMimeType;
504                     break;
505                 }
506             }
507         }
508 
509         if( aDefaultFormatName.getLength() == 0 )
510             aDefaultFormatName = OUString( RTL_CONSTASCII_USTRINGPARAM( "PNG - Portable Network Graphic" ) );
511 
512         xFltMgr->setCurrentFilter( aDefaultFormatName );
513 
514         // execute dialog
515 
516         if( aDlgHelper.Execute() == ERRCODE_NONE )
517         {
518             OUString sPath( xFP->getFiles().getConstArray()[0] );
519             aPath.SetSmartURL( sPath);
520             sGrfPath = aPath.GetPath();
521 
522             OUString aExportMimeType( aMimeTypeMap[xFltMgr->getCurrentFilter()] );
523 
524             Reference< XInputStream > xGraphStream;
525             if( aMimeType == aExportMimeType )
526                 xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "GraphicStream" ) ) ) >>= xGraphStream;
527 
528             if( xGraphStream.is() )
529             {
530                 Reference< XSimpleFileAccess2 > xFileAccess( xSM->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.ucb.SimpleFileAccess" ) ) ), UNO_QUERY_THROW );
531                 xFileAccess->writeFile( sPath, xGraphStream );
532             }
533             else
534             {
535                 PropertyValues aDesc(2);
536                 aDesc[0].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "URL" ) );
537                 aDesc[0].Value <<= sPath;
538                 aDesc[1].Name = OUString( RTL_CONSTASCII_USTRINGPARAM( "MimeType" ) );
539                 aDesc[1].Value <<= aExportMimeType;
540                 Reference< XGraphic > xGraphic( xShapeSet->getPropertyValue( OUString( RTL_CONSTASCII_USTRINGPARAM( "Graphic" ) ) ), UNO_QUERY_THROW );
541                 xProvider->storeGraphic( xGraphic, aDesc );
542             }
543         }
544     }
545     catch( Exception& )
546     {
547         DBG_ERROR(
548             (rtl::OString("SdGRFFilter::SaveGraphic(), "
549                     "exception caught: ") +
550             rtl::OUStringToOString(
551                 comphelper::anyToString( cppu::getCaughtException() ),
552                 RTL_TEXTENCODING_UTF8 )).getStr() );
553     }
554 }
555