xref: /AOO41X/main/svx/source/gallery2/galmisc.cxx (revision 47148b3bc50811ceb41802e4cc50a5db21535900)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_svx.hxx"
26 
27 #include <unotools/streamwrap.hxx>
28 #include <unotools/ucbstreamhelper.hxx>
29 #include <unotools/processfactory.hxx>
30 #include <ucbhelper/content.hxx>
31 #include <tools/resmgr.hxx>
32 #include <tools/urlobj.hxx>
33 #include <svl/solar.hrc>
34 #include <svl/urihelper.hxx>
35 #include <svtools/filter.hxx>
36 #include <svl/itempool.hxx>
37 #include <sfx2/docfile.hxx>
38 #include <avmedia/mediawindow.hxx>
39 #include <vcl/svapp.hxx>
40 
41 #include "svtools/filter.hxx"
42 #include <svx/svdpage.hxx>
43 #include <svx/svdograf.hxx>
44 #include <svx/fmmodel.hxx>
45 #include <svx/fmview.hxx>
46 #include <svx/unomodel.hxx>
47 #include "codec.hxx"
48 #include "gallery.hrc"
49 #include "svx/gallery1.hxx"
50 #include "svx/galtheme.hxx"
51 #include "svx/galmisc.hxx"
52 #include <com/sun/star/sdbc/XResultSet.hpp>
53 #include <com/sun/star/ucb/XContentAccess.hpp>
54 #include <com/sun/star/ucb/TransferInfo.hpp>
55 #include <com/sun/star/ucb/NameClash.hpp>
56 
57 // --------------
58 // - Namespaces -
59 // --------------
60 
61 using namespace ::rtl;
62 using namespace ::com::sun::star;
63 
64 // ----------
65 // - ResMgr -
66 // ----------
67 
GetGalleryResMgr()68 ResMgr* GetGalleryResMgr()
69 {
70     static ResMgr* pGalleryResMgr = NULL;
71 
72     if( !pGalleryResMgr )
73     {
74         ByteString aResMgrName( "gal" );
75         pGalleryResMgr = ResMgr::CreateResMgr(
76             aResMgrName.GetBuffer(), Application::GetSettings().GetUILocale() );
77     }
78 
79     return pGalleryResMgr;
80 }
81 
82 // -------------------------
83 // - GalleryResGetBitmapEx -
84 // -------------------------
85 
GalleryResGetBitmapEx(sal_uInt32 nId)86 BitmapEx GalleryResGetBitmapEx( sal_uInt32 nId )
87 {
88     BitmapEx aBmpEx( GAL_RESID( nId ) );
89 
90     if( !aBmpEx.IsTransparent() )
91             aBmpEx = BitmapEx( aBmpEx.GetBitmap(), COL_LIGHTMAGENTA );
92 
93     return aBmpEx;
94 }
95 
96 // ----------------------
97 // - SgaUserDataFactory -
98 // ----------------------
99 
IMPL_LINK(SgaUserDataFactory,MakeUserData,SdrObjFactory *,pObjFactory)100 IMPL_LINK( SgaUserDataFactory, MakeUserData, SdrObjFactory*, pObjFactory )
101 {
102     if ( pObjFactory->nInventor == IV_IMAPINFO && pObjFactory->nIdentifier == ID_IMAPINFO )
103         pObjFactory->pNewData = new SgaIMapInfo;
104 
105     return 0L;
106 }
107 
108 // ------------------------
109 // - GalleryGraphicImport -
110 // ------------------------
111 
GalleryGraphicImport(const INetURLObject & rURL,Graphic & rGraphic,String & rFilterName,sal_Bool bShowProgress)112 sal_uInt16 GalleryGraphicImport( const INetURLObject& rURL, Graphic& rGraphic,
113                              String& rFilterName, sal_Bool bShowProgress )
114 {
115     sal_uInt16      nRet = SGA_IMPORT_NONE;
116     SfxMedium   aMedium( rURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ, sal_True );
117     String      aFilterName;
118 
119     aMedium.DownLoad();
120 
121     SvStream* pIStm = aMedium.GetInStream();
122 
123     if( pIStm )
124     {
125         GraphicFilter*      pGraphicFilter = GraphicFilter::GetGraphicFilter();
126         GalleryProgress*    pProgress = bShowProgress ? new GalleryProgress( pGraphicFilter ) : NULL;
127         sal_uInt16              nFormat;
128 
129         if( !pGraphicFilter->ImportGraphic( rGraphic, rURL.GetMainURL( INetURLObject::NO_DECODE ), *pIStm, GRFILTER_FORMAT_DONTKNOW, &nFormat ) )
130         {
131             rFilterName = pGraphicFilter->GetImportFormatName( nFormat );
132             nRet = SGA_IMPORT_FILE;
133         }
134 
135         delete pProgress;
136     }
137 
138     return nRet;
139 }
140 
141 // -----------------------
142 // - GallerySvDrawImport -
143 // -----------------------
144 
GallerySvDrawImport(SvStream & rIStm,SdrModel & rModel)145 sal_Bool GallerySvDrawImport( SvStream& rIStm, SdrModel& rModel )
146 {
147     sal_uInt32  nVersion;
148     sal_Bool    bRet = sal_False;
149 
150     if( GalleryCodec::IsCoded( rIStm, nVersion ) )
151     {
152         SvMemoryStream  aMemStm( 65535, 65535 );
153         GalleryCodec    aCodec( rIStm );
154 
155         aCodec.Read( aMemStm );
156         aMemStm.Seek( 0UL );
157 
158         if( 1 == nVersion )
159         {
160             DBG_ERROR( "staroffice binary file formats are no longer supported inside the gallery!" );
161             bRet = false;
162         }
163         else if( 2 == nVersion )
164         {
165             // recall to read as XML
166             bRet = GallerySvDrawImport( aMemStm, rModel );
167         }
168     }
169     else
170     {
171         // read as XML
172         uno::Reference< io::XInputStream > xInputStream( new utl::OInputStreamWrapper( rIStm ) );
173 
174         rModel.GetItemPool().SetDefaultMetric( SFX_MAPUNIT_100TH_MM );
175         uno::Reference< lang::XComponent > xComponent;
176 
177         bRet = SvxDrawingLayerImport( &rModel, xInputStream, xComponent, "com.sun.star.comp.Draw.XMLOasisImporter" );
178         if( !bRet || (rModel.GetPageCount() == 0) )
179         {
180             rIStm.Seek(0);
181             bRet = SvxDrawingLayerImport( &rModel, xInputStream, xComponent, "com.sun.star.comp.Draw.XMLImporter" );
182         }
183 
184     }
185 
186     return bRet;
187 }
188 
189 // ---------------------
190 // - CreateIMapGraphic -
191 // ---------------------
192 
CreateIMapGraphic(const FmFormModel & rModel,Graphic & rGraphic,ImageMap & rImageMap)193 sal_Bool CreateIMapGraphic( const FmFormModel& rModel, Graphic& rGraphic, ImageMap& rImageMap )
194 {
195     sal_Bool bRet = sal_False;
196 
197     if ( rModel.GetPageCount() )
198     {
199         const SdrPage*      pPage = rModel.GetPage( 0 );
200         const SdrObject*    pObj = pPage->GetObj( 0 );
201 
202         if ( pPage->GetObjCount() == 1 && pObj->ISA( SdrGrafObj ) )
203         {
204             const sal_uInt16 nCount = pObj->GetUserDataCount();
205 
206             // gibt es in den User-Daten eine IMap-Information?
207             for ( sal_uInt16 i = 0; i < nCount; i++ )
208             {
209                 const SdrObjUserData* pUserData = pObj->GetUserData( i );
210 
211                 if ( ( pUserData->GetInventor() == IV_IMAPINFO ) && ( pUserData->GetId() == ID_IMAPINFO ) )
212                 {
213                     rGraphic = ( (SdrGrafObj*) pObj )->GetGraphic();
214                     rImageMap = ( (SgaIMapInfo*) pUserData )->GetImageMap();
215                     bRet = sal_True;
216                     break;
217                 }
218             }
219         }
220     }
221 
222     return bRet;
223 }
224 
225 // --------------------
226 // - GetReducedString -
227 // --------------------
228 
GetReducedString(const INetURLObject & rURL,sal_uIntPtr nMaxLen)229 String GetReducedString( const INetURLObject& rURL, sal_uIntPtr nMaxLen )
230 {
231     String aReduced( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) );
232 
233     aReduced = aReduced.GetToken( aReduced.GetTokenCount( '/' ) - 1, '/' );
234 
235     if( INET_PROT_PRIV_SOFFICE != rURL.GetProtocol() )
236     {
237         sal_Unicode     aDelimiter;
238         const String    aPath( rURL.getFSysPath( INetURLObject::FSYS_DETECT, &aDelimiter ) );
239         const String    aName( aReduced );
240 
241         if( aPath.Len() > nMaxLen )
242         {
243             aReduced = aPath.Copy( 0, (sal_uInt16)( nMaxLen - aName.Len() - 4 ) );
244             aReduced += String( RTL_CONSTASCII_USTRINGPARAM( "..." ) );
245             aReduced += aDelimiter;
246             aReduced += aName;
247         }
248         else
249             aReduced = aPath;
250     }
251 
252     return aReduced;
253 }
254 
255 // -----------------------------------------------------------------------------
256 
GetSvDrawStreamNameFromURL(const INetURLObject & rSvDrawObjURL)257 String GetSvDrawStreamNameFromURL( const INetURLObject& rSvDrawObjURL )
258 {
259     String aRet;
260 
261     if( rSvDrawObjURL.GetProtocol() == INET_PROT_PRIV_SOFFICE &&
262         String(rSvDrawObjURL.GetMainURL( INetURLObject::NO_DECODE )).GetTokenCount( '/' ) == 3 )
263     {
264         aRet = String(rSvDrawObjURL.GetMainURL( INetURLObject::NO_DECODE )).GetToken( 2, '/' );
265     }
266 
267     return aRet;
268 }
269 
270 // -----------------------------------------------------------------------------
271 
FileExists(const INetURLObject & rURL)272 sal_Bool FileExists( const INetURLObject& rURL )
273 {
274     sal_Bool bRet = sal_False;
275 
276     if( rURL.GetProtocol() != INET_PROT_NOT_VALID )
277     {
278         try
279         {
280             ::ucbhelper::Content        aCnt( rURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >() );
281             OUString    aTitle;
282 
283             aCnt.getPropertyValue( OUString::createFromAscii( "Title" ) ) >>= aTitle;
284             bRet = ( aTitle.getLength() > 0 );
285         }
286         catch( const ucb::ContentCreationException& )
287         {
288         }
289         catch( const uno::RuntimeException& )
290         {
291         }
292         catch( const uno::Exception& )
293         {
294         }
295     }
296 
297     return bRet;
298 }
299 
300 // -----------------------------------------------------------------------------
301 
CreateDir(const INetURLObject & rURL)302 sal_Bool CreateDir( const INetURLObject& rURL )
303 {
304     sal_Bool bRet = FileExists( rURL );
305 
306     if( !bRet )
307     {
308         try
309         {
310             uno::Reference< ucb::XCommandEnvironment >  aCmdEnv;
311             INetURLObject                           aNewFolderURL( rURL );
312             INetURLObject                           aParentURL( aNewFolderURL ); aParentURL.removeSegment();
313             ::ucbhelper::Content                    aParent( aParentURL.GetMainURL( INetURLObject::NO_DECODE ), aCmdEnv );
314             uno::Sequence< OUString >               aProps( 1 );
315             uno::Sequence< uno::Any >               aValues( 1 );
316 
317             aProps.getArray()[ 0 ] = OUString::createFromAscii( "Title" );
318             aValues.getArray()[ 0 ] = uno::makeAny( OUString( aNewFolderURL.GetName() ) );
319 
320         ::ucbhelper::Content aContent( aNewFolderURL.GetMainURL( INetURLObject::NO_DECODE ), aCmdEnv );
321         bRet = aParent.insertNewContent( OUString::createFromAscii( "application/vnd.sun.staroffice.fsys-folder" ), aProps, aValues, aContent );
322         }
323         catch( const ucb::ContentCreationException& )
324         {
325         }
326         catch( const uno::RuntimeException& )
327         {
328         }
329         catch( const uno::Exception& )
330         {
331         }
332     }
333 
334     return bRet;
335 }
336 
337 // -----------------------------------------------------------------------------
338 
CopyFile(const INetURLObject & rSrcURL,const INetURLObject & rDstURL)339 sal_Bool CopyFile(  const INetURLObject& rSrcURL, const INetURLObject& rDstURL )
340 {
341     sal_Bool bRet = sal_False;
342 
343     try
344     {
345         ::ucbhelper::Content aDestPath( rDstURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >() );
346 
347         aDestPath.executeCommand( OUString::createFromAscii( "transfer" ),
348                                   uno::makeAny( ucb::TransferInfo( sal_False, rSrcURL.GetMainURL( INetURLObject::NO_DECODE ),
349                                                 rDstURL.GetName(), ucb::NameClash::OVERWRITE ) ) );
350         bRet = sal_True;
351     }
352     catch( const ucb::ContentCreationException& )
353     {
354     }
355     catch( const uno::RuntimeException& )
356     {
357     }
358     catch( const uno::Exception& )
359     {
360     }
361 
362     return bRet;
363 }
364 
365 // -----------------------------------------------------------------------------
366 
KillFile(const INetURLObject & rURL)367 sal_Bool KillFile( const INetURLObject& rURL )
368 {
369     sal_Bool bRet = FileExists( rURL );
370 
371     if( bRet )
372     {
373         try
374         {
375             ::ucbhelper::Content aCnt( rURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >() );
376             aCnt.executeCommand( OUString::createFromAscii( "delete" ), uno::makeAny( sal_Bool( sal_True ) ) );
377         }
378         catch( const ucb::ContentCreationException& )
379         {
380             bRet = sal_False;
381         }
382         catch( const uno::RuntimeException& )
383         {
384             bRet = sal_False;
385         }
386         catch( const uno::Exception& )
387         {
388             bRet = sal_False;
389         }
390     }
391 
392     return bRet;
393 }
394 
395 // -------------------
396 // - GalleryProgress -
397 // -------------------
DBG_NAME(GalleryProgress)398 DBG_NAME(GalleryProgress)
399 
400 GalleryProgress::GalleryProgress( GraphicFilter* pFilter ) :
401     mpFilter( pFilter )
402 {
403     DBG_CTOR(GalleryProgress,NULL);
404 
405     uno::Reference< lang::XMultiServiceFactory > xMgr( ::utl::getProcessServiceFactory() );
406 
407     if( xMgr.is() )
408     {
409         uno::Reference< awt::XProgressMonitor > xMonitor( xMgr->createInstance(
410                                                       ::rtl::OUString::createFromAscii( "com.sun.star.awt.XProgressMonitor" ) ),
411                                                       uno::UNO_QUERY );
412 
413         if ( xMonitor.is() )
414         {
415             mxProgressBar = uno::Reference< awt::XProgressBar >( xMonitor, uno::UNO_QUERY );
416 
417             if( mxProgressBar.is() )
418             {
419                 String aProgressText;
420 
421                 if( mpFilter )
422                 {
423                     aProgressText = String( GAL_RESID( RID_SVXSTR_GALLERY_FILTER ) );
424 //                  mpFilter->SetUpdatePercentHdl( LINK( this, GalleryProgress, Update ) );     // sj: progress wasn't working up from SO7 at all
425 //                                                                                              // so I am removing this. The gallery progress should
426 //                                                                                              // be changed to use the XStatusIndicator instead of XProgressMonitor
427                 }
428                 else
429                     aProgressText = String( RTL_CONSTASCII_USTRINGPARAM( "Gallery" ) );
430 
431                 xMonitor->addText( String( RTL_CONSTASCII_USTRINGPARAM( "Gallery" ) ), aProgressText, sal_False ) ;
432                 mxProgressBar->setRange( 0, GALLERY_PROGRESS_RANGE );
433             }
434         }
435     }
436 }
437 
438 // ------------------------------------------------------------------------
439 
~GalleryProgress()440 GalleryProgress::~GalleryProgress()
441 {
442 //  if( mpFilter )
443 //      mpFilter->SetUpdatePercentHdl( Link() );
444 
445     DBG_DTOR(GalleryProgress,NULL);
446 }
447 
448 // ------------------------------------------------------------------------
449 
Update(sal_uIntPtr nVal,sal_uIntPtr nMaxVal)450 void GalleryProgress::Update( sal_uIntPtr nVal, sal_uIntPtr nMaxVal )
451 {
452     if( mxProgressBar.is() && nMaxVal )
453         mxProgressBar->setValue( Min( (sal_uIntPtr)( (double) nVal / nMaxVal * GALLERY_PROGRESS_RANGE ), (sal_uIntPtr) GALLERY_PROGRESS_RANGE ) );
454 }
455 
456 // -----------------------
457 // - GalleryTransferable -
458 // -----------------------
DBG_NAME(GalleryTransferable)459 DBG_NAME(GalleryTransferable)
460 
461 GalleryTransferable::GalleryTransferable( GalleryTheme* pTheme, sal_uIntPtr nObjectPos, bool bLazy ) :
462     mpTheme( pTheme ),
463     meObjectKind( mpTheme->GetObjectKind( nObjectPos ) ),
464     mnObjectPos( nObjectPos ),
465     mpGraphicObject( NULL ),
466     mpImageMap( NULL ),
467     mpURL( NULL )
468 {
469     DBG_CTOR(GalleryTransferable,NULL);
470 
471     InitData( bLazy );
472 }
473 
474 // ------------------------------------------------------------------------
475 
~GalleryTransferable()476 GalleryTransferable::~GalleryTransferable()
477 {
478 
479     DBG_DTOR(GalleryTransferable,NULL);
480 }
481 
482 // ------------------------------------------------------------------------
483 
InitData(bool bLazy)484 void GalleryTransferable::InitData( bool bLazy )
485 {
486     switch( meObjectKind )
487     {
488         case( SGA_OBJ_SVDRAW ):
489         {
490             if( !bLazy )
491             {
492                 if( !mpGraphicObject )
493                 {
494                     Graphic aGraphic;
495 
496                     if( mpTheme->GetGraphic( mnObjectPos, aGraphic ) )
497                         mpGraphicObject = new GraphicObject( aGraphic );
498                 }
499 
500                 if( !mxModelStream.Is() )
501                 {
502                     mxModelStream = new SotStorageStream( String() );
503                     mxModelStream->SetBufferSize( 16348 );
504 
505                     if( !mpTheme->GetModelStream( mnObjectPos, mxModelStream ) )
506                         mxModelStream.Clear();
507                     else
508                         mxModelStream->Seek( 0 );
509                 }
510             }
511         }
512         break;
513 
514         case( SGA_OBJ_ANIM ):
515         case( SGA_OBJ_BMP ):
516         case( SGA_OBJ_INET ):
517         case( SGA_OBJ_SOUND ):
518         {
519             if( !mpURL )
520             {
521                 mpURL = new INetURLObject;
522 
523                 if( !mpTheme->GetURL( mnObjectPos, *mpURL ) )
524                     delete mpURL, mpURL = NULL;
525             }
526 
527             if( ( SGA_OBJ_SOUND != meObjectKind ) && !mpGraphicObject )
528             {
529                 Graphic aGraphic;
530 
531                 if( mpTheme->GetGraphic( mnObjectPos, aGraphic ) )
532                     mpGraphicObject = new GraphicObject( aGraphic );
533             }
534         }
535         break;
536 
537         default:
538             DBG_ERROR( "GalleryTransferable::GalleryTransferable: invalid object type" );
539         break;
540     }
541 }
542 
543 // ------------------------------------------------------------------------
544 
AddSupportedFormats()545 void GalleryTransferable::AddSupportedFormats()
546 {
547     if( SGA_OBJ_SVDRAW == meObjectKind )
548     {
549         AddFormat( SOT_FORMATSTR_ID_DRAWING );
550         AddFormat( SOT_FORMATSTR_ID_SVXB );
551         AddFormat( FORMAT_GDIMETAFILE );
552         AddFormat( FORMAT_BITMAP );
553     }
554     else
555     {
556         if( mpURL )
557             AddFormat( FORMAT_FILE );
558 
559         if( mpGraphicObject )
560         {
561             AddFormat( SOT_FORMATSTR_ID_SVXB );
562 
563             if( mpGraphicObject->GetType() == GRAPHIC_GDIMETAFILE )
564             {
565                 AddFormat( FORMAT_GDIMETAFILE );
566                 AddFormat( FORMAT_BITMAP );
567             }
568             else
569             {
570                 AddFormat( FORMAT_BITMAP );
571                 AddFormat( FORMAT_GDIMETAFILE );
572             }
573         }
574     }
575 }
576 
577 // ------------------------------------------------------------------------
578 
GetData(const datatransfer::DataFlavor & rFlavor)579 sal_Bool GalleryTransferable::GetData( const datatransfer::DataFlavor& rFlavor )
580 {
581     sal_uInt32  nFormat = SotExchange::GetFormat( rFlavor );
582     sal_Bool    bRet = sal_False;
583 
584     InitData( false );
585 
586     if( ( SOT_FORMATSTR_ID_DRAWING == nFormat ) && ( SGA_OBJ_SVDRAW == meObjectKind ) )
587     {
588         bRet = ( mxModelStream.Is() && SetObject( &mxModelStream, 0, rFlavor ) );
589     }
590     else if( ( SOT_FORMATSTR_ID_SVIM == nFormat ) && mpImageMap )
591     {
592         // TODO/MBA: do we need a BaseURL here?!
593         bRet = SetImageMap( *mpImageMap, rFlavor );
594     }
595     else if( ( FORMAT_FILE == nFormat ) && mpURL )
596     {
597         bRet = SetString( mpURL->GetMainURL( INetURLObject::NO_DECODE ), rFlavor );
598     }
599     else if( ( SOT_FORMATSTR_ID_SVXB == nFormat ) && mpGraphicObject )
600     {
601         bRet = SetGraphic( mpGraphicObject->GetGraphic(), rFlavor );
602     }
603     else if( ( FORMAT_GDIMETAFILE == nFormat ) && mpGraphicObject )
604     {
605         bRet = SetGDIMetaFile( mpGraphicObject->GetGraphic().GetGDIMetaFile(), rFlavor );
606     }
607     else if( ( FORMAT_BITMAP == nFormat ) && mpGraphicObject )
608     {
609         bRet = SetBitmapEx( mpGraphicObject->GetGraphic().GetBitmapEx(), rFlavor );
610     }
611 
612     return bRet;
613 }
614 
615 // ------------------------------------------------------------------------
616 
WriteObject(SotStorageStreamRef & rxOStm,void * pUserObject,sal_uInt32,const datatransfer::DataFlavor &)617 sal_Bool GalleryTransferable::WriteObject( SotStorageStreamRef& rxOStm, void* pUserObject,
618                                            sal_uInt32, const datatransfer::DataFlavor& )
619 {
620     sal_Bool bRet = sal_False;
621 
622     if( pUserObject )
623     {
624         *rxOStm << *static_cast< SotStorageStream* >( pUserObject );
625         bRet = ( rxOStm->GetError() == ERRCODE_NONE );
626     }
627 
628     return bRet;
629 }
630 
631 // ------------------------------------------------------------------------
632 
DragFinished(sal_Int8 nDropAction)633 void GalleryTransferable::DragFinished( sal_Int8 nDropAction )
634 {
635     mpTheme->SetDragging( sal_False );
636     mpTheme->SetDragPos( 0 );
637     if ( nDropAction )
638     {
639         Window *pFocusWindow = Application::GetFocusWindow();
640         if ( pFocusWindow )
641             pFocusWindow->GrabFocusToDocument();
642     }
643 }
644 
645 // ------------------------------------------------------------------------
646 
ObjectReleased()647 void GalleryTransferable::ObjectReleased()
648 {
649     mxModelStream.Clear();
650     delete mpGraphicObject, mpGraphicObject = NULL;
651     delete mpImageMap, mpImageMap = NULL;
652     delete mpURL, mpURL = NULL;
653 }
654 
655 // ------------------------------------------------------------------------
656 
CopyToClipboard(Window * pWindow)657 void GalleryTransferable::CopyToClipboard( Window* pWindow )
658 {
659     TransferableHelper::CopyToClipboard( pWindow );
660 }
661 
662 // ------------------------------------------------------------------------
663 
StartDrag(Window * pWindow,sal_Int8 nDragSourceActions,sal_Int32 nDragPointer,sal_Int32 nDragImage)664 void GalleryTransferable::StartDrag( Window* pWindow, sal_Int8 nDragSourceActions,
665                                      sal_Int32 nDragPointer, sal_Int32 nDragImage )
666 {
667     INetURLObject aURL;
668 
669     if( mpTheme->GetURL( mnObjectPos, aURL ) && ( aURL.GetProtocol() != INET_PROT_NOT_VALID ) )
670     {
671         mpTheme->SetDragging( sal_True );
672         mpTheme->SetDragPos( mnObjectPos );
673         TransferableHelper::StartDrag( pWindow, nDragSourceActions, nDragPointer, nDragImage );
674     }
675 }
676