xref: /aoo41x/main/svx/source/gallery2/galtheme.cxx (revision cdf0e10c)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_svx.hxx"
30 
31 #define ENABLE_BYTESTRING_STREAM_OPERATORS
32 
33 #include <tools/urlobj.hxx>
34 #include <tools/vcompat.hxx>
35 #include <unotools/streamwrap.hxx>
36 #include <unotools/ucbstreamhelper.hxx>
37 #include <unotools/tempfile.hxx>
38 #include <unotools/localfilehelper.hxx>
39 #include <ucbhelper/content.hxx>
40 #include <sot/storage.hxx>
41 #include <sot/formats.hxx>
42 #include <sot/filelist.hxx>
43 #include <vcl/virdev.hxx>
44 #include <vcl/cvtgrf.hxx>
45 #include <svl/itempool.hxx>
46 #include <sfx2/docfile.hxx>
47 #include <avmedia/mediawindow.hxx>
48 #include <svx/svdograf.hxx>
49 #include <svx/fmpage.hxx>
50 #include "codec.hxx"
51 #include <svx/unomodel.hxx>
52 #include <svx/fmmodel.hxx>
53 #include <svx/fmview.hxx>
54 #include "svx/galmisc.hxx"
55 #include "svx/galtheme.hxx"
56 #include <com/sun/star/sdbc/XResultSet.hpp>
57 #include <com/sun/star/ucb/XContentAccess.hpp>
58 #include <com/sun/star/io/XInputStream.hpp>
59 #include "galobj.hxx"
60 #include <svx/gallery1.hxx>
61 #include "galtheme.hrc"
62 #include <vcl/lstbox.hxx>
63 #include "gallerydrawmodel.hxx"
64 
65 // --------------
66 // - Namespaces -
67 // --------------
68 
69 using namespace ::rtl;
70 using namespace ::com::sun::star;
71 
72 // ------------
73 // - SgaTheme -
74 // ------------
75 DBG_NAME(GalleryTheme)
76 
77 GalleryTheme::GalleryTheme( Gallery* pGallery, GalleryThemeEntry* pThemeEntry ) :
78 		pParent               ( pGallery ),
79 		pThm		          ( pThemeEntry ),
80         mnThemeLockCount      ( 0 ),
81 		mnBroadcasterLockCount( 0 ),
82 		nDragPos	          ( 0 ),
83 		bDragging	          ( sal_False )
84 {
85     DBG_CTOR(GalleryTheme,NULL);
86 
87 	ImplCreateSvDrawStorage();
88 
89 	if( pThm->IsImported() )
90 		aImportName = pThm->GetThemeName();
91 }
92 
93 // ------------------------------------------------------------------------
94 
95 GalleryTheme::~GalleryTheme()
96 {
97 	ImplWrite();
98 
99 	for( GalleryObject* pEntry = aObjectList.First(); pEntry; pEntry = aObjectList.Next() )
100 	{
101 		Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
102 		delete pEntry;
103 		Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
104 	}
105 
106     DBG_DTOR(GalleryTheme,NULL);
107 }
108 
109 // ------------------------------------------------------------------------
110 
111 void GalleryTheme::ImplCreateSvDrawStorage()
112 {
113 	if( !pThm->IsImported() )
114 	{
115 		aSvDrawStorageRef = new SvStorage( sal_False, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), pThm->IsReadOnly() ? STREAM_READ : STREAM_STD_READWRITE );
116 		// #i50423# ReadOnly may not been set though the file can't be written (because of security reasons)
117 		if ( ( aSvDrawStorageRef->GetError() != ERRCODE_NONE ) && !pThm->IsReadOnly() )
118 			aSvDrawStorageRef = new SvStorage( sal_False, GetSdvURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
119 	}
120 	else
121 		aSvDrawStorageRef.Clear();
122 }
123 
124 // ------------------------------------------------------------------------
125 
126 sal_Bool GalleryTheme::ImplWriteSgaObject( const SgaObject& rObj, sal_uIntPtr nPos, GalleryObject* pExistentEntry )
127 {
128 	SvStream*	pOStm = ::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
129 	sal_Bool		bRet = sal_False;
130 
131 	if( pOStm )
132 	{
133 		const sal_uInt32 nOffset = pOStm->Seek( STREAM_SEEK_TO_END );
134 
135 		rObj.WriteData( *pOStm, m_aDestDir );
136 
137 		if( !pOStm->GetError() )
138 		{
139 			GalleryObject* pEntry;
140 
141 			if( !pExistentEntry )
142 			{
143 				pEntry = new GalleryObject;
144 				aObjectList.Insert( pEntry, nPos );
145 			}
146 			else
147 				pEntry = pExistentEntry;
148 
149 			pEntry->aURL = rObj.GetURL();
150 			pEntry->nOffset = nOffset;
151 			pEntry->eObjKind = rObj.GetObjKind();
152 			bRet = sal_True;
153 		}
154 
155 		delete pOStm;
156 	}
157 
158 	return bRet;
159 }
160 
161 // ------------------------------------------------------------------------
162 
163 SgaObject* GalleryTheme::ImplReadSgaObject( GalleryObject* pEntry )
164 {
165 	SgaObject* pSgaObj = NULL;
166 
167 	if( pEntry )
168 	{
169 		SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( GetSdgURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
170 
171 		if( pIStm )
172 		{
173 			sal_uInt32 nInventor;
174 
175 			// Ueberpruefen, ob das File ein gueltiges SGA-File ist
176 			pIStm->Seek( pEntry->nOffset );
177 			*pIStm >> nInventor;
178 
179 			if( nInventor == COMPAT_FORMAT( 'S', 'G', 'A', '3' ) )
180 			{
181 				pIStm->Seek( pEntry->nOffset );
182 
183 				switch( pEntry->eObjKind )
184 				{
185 					case( SGA_OBJ_BMP ):	pSgaObj = new SgaObjectBmp(); break;
186 					case( SGA_OBJ_ANIM ):	pSgaObj = new SgaObjectAnim(); break;
187 					case( SGA_OBJ_INET ):	pSgaObj = new SgaObjectINet(); break;
188 					case( SGA_OBJ_SVDRAW ):	pSgaObj = new SgaObjectSvDraw(); break;
189 					case( SGA_OBJ_SOUND ):	pSgaObj = new SgaObjectSound(); break;
190 
191 					default:
192 					break;
193 				}
194 
195 				if( pSgaObj )
196 				{
197 					*pIStm >> *pSgaObj;
198 					pSgaObj->ImplUpdateURL( pEntry->aURL );
199 				}
200 			}
201 
202 			delete pIStm;
203 		}
204 	}
205 
206 	return pSgaObj;
207 }
208 
209 // ------------------------------------------------------------------------
210 
211 void GalleryTheme::ImplRead()
212 {
213 	SvStream* pIStm	= ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
214 
215 	if( pIStm )
216 	{
217 		*pIStm >> *this;
218 		delete pIStm;
219 	}
220 }
221 
222 // ------------------------------------------------------------------------
223 
224 void GalleryTheme::ImplWrite()
225 {
226 	if( IsModified() )
227 	{
228 		INetURLObject aPathURL( GetThmURL() );
229 
230 		aPathURL.removeSegment();
231 		aPathURL.removeFinalSlash();
232 
233 		DBG_ASSERT( aPathURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
234 
235 		if( FileExists( aPathURL ) || CreateDir( aPathURL ) )
236 		{
237 #ifdef UNX
238 			SvStream* pOStm	= ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_COPY_ON_SYMLINK | STREAM_TRUNC );
239 #else
240 			SvStream* pOStm	= ::utl::UcbStreamHelper::CreateStream( GetThmURL().GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
241 #endif
242 
243 			if( pOStm )
244 			{
245 				*pOStm << *this;
246 				delete pOStm;
247 			}
248 
249 			ImplSetModified( sal_False );
250 		}
251 	}
252 }
253 
254 // ------------------------------------------------------------------------
255 
256 const GalleryObject* GalleryTheme::ImplGetGalleryObject( const INetURLObject& rURL )
257 {
258 	GalleryObject*	pEntry = aObjectList.First();
259 	GalleryObject*	pFoundEntry = NULL;
260 
261 	for( ; pEntry && !pFoundEntry; pEntry = aObjectList.Next() )
262 		if( pEntry->aURL == rURL )
263 			pFoundEntry = pEntry;
264 
265 	return pFoundEntry;
266 }
267 
268 // ------------------------------------------------------------------------
269 
270 INetURLObject GalleryTheme::ImplGetURL( const GalleryObject* pObject ) const
271 {
272 	INetURLObject aURL;
273 
274 	if( pObject )
275 	{
276 		if( IsImported() )
277 		{
278 			INetURLObject aPathURL( GetParent()->GetImportURL( GetName() ) );
279 
280 			aPathURL.removeSegment();
281 			aPathURL.removeFinalSlash();
282 			aPathURL.Append( pObject->aURL.GetName() );
283 			aURL = aPathURL;
284 		}
285 		else
286 			aURL = pObject->aURL;
287 	}
288 
289 	return aURL;
290 }
291 
292 // ------------------------------------------------------------------------
293 
294 INetURLObject GalleryTheme::ImplCreateUniqueURL( SgaObjKind eObjKind, sal_uIntPtr nFormat )
295 {
296     INetURLObject   aDir( GetParent()->GetUserURL() );
297     INetURLObject   aInfoFileURL( GetParent()->GetUserURL() );
298     INetURLObject   aNewURL;
299 	sal_uInt32		nNextNumber = 1999;
300     sal_Char const* pExt = NULL;
301     sal_Bool            bExists;
302 
303     aDir.Append( String( RTL_CONSTASCII_USTRINGPARAM( "dragdrop" ) ) );
304     CreateDir( aDir );
305 
306 	aInfoFileURL.Append( String( RTL_CONSTASCII_USTRINGPARAM( "sdddndx1" ) ) );
307 
308 	// read next possible number
309     if( FileExists( aInfoFileURL ) )
310 	{
311 		SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
312 
313 		if( pIStm )
314 		{
315 			*pIStm >> nNextNumber;
316 			delete pIStm;
317 		}
318 	}
319 
320     // create extension
321     if( nFormat )
322     {
323         switch( nFormat )
324         {
325             case( CVT_BMP ): pExt = ".bmp"; break;
326             case( CVT_GIF ): pExt = ".gif"; break;
327             case( CVT_JPG ): pExt = ".jpg"; break;
328             case( CVT_MET ): pExt = ".met"; break;
329             case( CVT_PCT ): pExt = ".pct"; break;
330             case( CVT_PNG ): pExt = ".png"; break;
331             case( CVT_SVM ): pExt = ".svm"; break;
332             case( CVT_TIF ): pExt = ".tif"; break;
333             case( CVT_WMF ): pExt = ".wmf"; break;
334             case( CVT_EMF ): pExt = ".emf"; break;
335 
336             default:
337                 pExt = ".grf";
338             break;
339         }
340     }
341 
342     do
343     {
344         // get URL
345 	    if( SGA_OBJ_SVDRAW == eObjKind )
346 	    {
347             String aFileName( RTL_CONSTASCII_USTRINGPARAM( "gallery/svdraw/dd" ) );
348 		    aNewURL = INetURLObject( aFileName += String::CreateFromInt32( ++nNextNumber % 99999999 ), INET_PROT_PRIV_SOFFICE );
349 
350             bExists = sal_False;
351 
352 		    for( GalleryObject* pEntry = aObjectList.First(); pEntry && !bExists; pEntry = aObjectList.Next() )
353 			    if( pEntry->aURL == aNewURL )
354                     bExists = sal_True;
355 	    }
356 	    else
357 	    {
358             String aFileName( RTL_CONSTASCII_USTRINGPARAM( "dd" ) );
359 
360             aFileName += String::CreateFromInt32( ++nNextNumber % 999999 );
361             aFileName += String( pExt, RTL_TEXTENCODING_ASCII_US );
362 
363             aNewURL = aDir;
364 		    aNewURL.Append( aFileName );
365 
366             bExists = FileExists( aNewURL );
367 	    }
368     }
369     while( bExists );
370 
371 	// write updated number
372     SvStream* pOStm = ::utl::UcbStreamHelper::CreateStream( aInfoFileURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE );
373 
374 	if( pOStm )
375 	{
376 		*pOStm << nNextNumber;
377 		delete pOStm;
378 	}
379 
380 	return aNewURL;
381 }
382 
383 // ------------------------------------------------------------------------
384 
385 void GalleryTheme::ImplBroadcast( sal_uIntPtr nUpdatePos )
386 {
387 	if( !IsBroadcasterLocked() )
388 	{
389 		if( GetObjectCount() && ( nUpdatePos >= GetObjectCount() ) )
390 			nUpdatePos = GetObjectCount() - 1;
391 
392 		Broadcast( GalleryHint( GALLERY_HINT_THEME_UPDATEVIEW, GetName(), nUpdatePos ) );
393 	}
394 }
395 
396 // ------------------------------------------------------------------------
397 
398 sal_Bool GalleryTheme::UnlockTheme()
399 {
400     DBG_ASSERT( mnThemeLockCount, "Theme is not locked" );
401 
402     sal_Bool bRet = sal_False;
403 
404     if( mnThemeLockCount )
405     {
406         --mnThemeLockCount;
407         bRet = sal_True;
408     }
409 
410     return bRet;
411 }
412 
413 // ------------------------------------------------------------------------
414 
415 void GalleryTheme::UnlockBroadcaster( sal_uIntPtr nUpdatePos )
416 {
417 	DBG_ASSERT( mnBroadcasterLockCount, "Broadcaster is not locked" );
418 
419 	if( mnBroadcasterLockCount && !--mnBroadcasterLockCount )
420 		ImplBroadcast( nUpdatePos );
421 }
422 
423 // ------------------------------------------------------------------------
424 
425 sal_Bool GalleryTheme::InsertObject( const SgaObject& rObj, sal_uIntPtr nInsertPos )
426 {
427 	sal_Bool bRet = sal_False;
428 
429 	if( rObj.IsValid() )
430 	{
431 		GalleryObject*	pEntry = aObjectList.First();
432 		GalleryObject*	pFoundEntry = NULL;
433 
434 		for( ; pEntry && !pFoundEntry; pEntry = aObjectList.Next() )
435 			if( pEntry->aURL == rObj.GetURL() )
436 				pFoundEntry = pEntry;
437 
438 		if( pFoundEntry )
439         {
440     		GalleryObject aNewEntry;
441 
442             // update title of new object if neccessary
443             if( !rObj.GetTitle().Len() )
444             {
445                 SgaObject* pOldObj = ImplReadSgaObject( pFoundEntry );
446 
447                 if( pOldObj )
448                 {
449                     ( (SgaObject&) rObj ).SetTitle( pOldObj->GetTitle() );
450                     delete pOldObj;
451                 }
452             }
453             else if( rObj.GetTitle() == String( RTL_CONSTASCII_USTRINGPARAM( "__<empty>__" ) ) )
454                 ( (SgaObject&) rObj ).SetTitle( String() );
455 
456             ImplWriteSgaObject( rObj, nInsertPos, &aNewEntry );
457 			pFoundEntry->nOffset = aNewEntry.nOffset;
458         }
459 		else
460 			ImplWriteSgaObject( rObj, nInsertPos, NULL );
461 
462 		ImplSetModified( bRet = sal_True );
463 		ImplBroadcast( pFoundEntry ? aObjectList.GetPos( pFoundEntry ) : nInsertPos );
464 	}
465 
466 	return bRet;
467 }
468 
469 // ------------------------------------------------------------------------
470 
471 SgaObject* GalleryTheme::AcquireObject( sal_uIntPtr nPos )
472 {
473 	return ImplReadSgaObject( aObjectList.GetObject( nPos ) );
474 }
475 
476 // ------------------------------------------------------------------------
477 
478 void GalleryTheme::ReleaseObject( SgaObject* pObject )
479 {
480 	delete pObject;
481 }
482 
483 // ------------------------------------------------------------------------
484 
485 sal_Bool GalleryTheme::RemoveObject( sal_uIntPtr nPos )
486 {
487 	GalleryObject* pEntry = aObjectList.Remove( nPos );
488 
489 	if( !aObjectList.Count() )
490 		KillFile( GetSdgURL() );
491 
492 	if( pEntry )
493 	{
494 		if( SGA_OBJ_SVDRAW == pEntry->eObjKind )
495 			aSvDrawStorageRef->Remove( pEntry->aURL.GetMainURL( INetURLObject::NO_DECODE ) );
496 
497 		Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
498 		delete pEntry;
499 		Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
500 
501 		ImplSetModified( sal_True );
502 		ImplBroadcast( nPos );
503 	}
504 
505 	return( pEntry != NULL );
506 }
507 
508 // ------------------------------------------------------------------------
509 
510 sal_Bool GalleryTheme::ChangeObjectPos( sal_uIntPtr nOldPos, sal_uIntPtr nNewPos )
511 {
512 	sal_Bool bRet = sal_False;
513 
514 	if( nOldPos != nNewPos )
515 	{
516 		GalleryObject* pEntry = aObjectList.GetObject( nOldPos );
517 
518 		if( pEntry )
519 		{
520 			aObjectList.Insert( pEntry, nNewPos );
521 
522 			if( nNewPos < nOldPos )
523 				nOldPos++;
524 
525 			aObjectList.Remove( nOldPos );
526 			ImplSetModified( bRet = sal_True );
527 			ImplBroadcast( ( nNewPos < nOldPos ) ? nNewPos : ( nNewPos - 1 ) );
528 		}
529 	}
530 
531 	return bRet;
532 }
533 
534 // ------------------------------------------------------------------------
535 
536 void GalleryTheme::Actualize( const Link& rActualizeLink, GalleryProgress* pProgress )
537 {
538 	if( !IsReadOnly() && !IsImported() )
539 	{
540 		Graphic			aGraphic;
541 		String			aFormat;
542 		GalleryObject*	pEntry;
543 		const sal_uIntPtr		nCount = aObjectList.Count();
544 		sal_uIntPtr			i;
545 
546 		LockBroadcaster();
547 		bAbortActualize = sal_False;
548 
549 		// LoeschFlag zuruecksetzen
550 		for ( i = 0; i < nCount; i++ )
551 			aObjectList.GetObject( i )->bDummy = sal_False;
552 
553 		for( i = 0; ( i < nCount ) && !bAbortActualize; i++ )
554 		{
555 			if( pProgress )
556 				pProgress->Update( i, nCount - 1 );
557 
558 			pEntry = aObjectList.GetObject( i );
559 
560             const INetURLObject aURL( pEntry->aURL );
561 
562             rActualizeLink.Call( (void*) &aURL );
563 
564 			// SvDraw-Objekte werden spaeter aktualisiert
565 			if( pEntry->eObjKind != SGA_OBJ_SVDRAW )
566 			{
567 				// Hier muss noch etwas eingebaut werden,
568 				// das Files auf den ensprechenden Eintrag matched
569 				// Grafiken als Grafik-Objekte in die Gallery aufnehmen
570 				if( pEntry->eObjKind == SGA_OBJ_SOUND )
571 				{
572 					SgaObjectSound aObjSound( aURL );
573 					if( !InsertObject( aObjSound ) )
574 						pEntry->bDummy = sal_True;
575 				}
576 				else
577 				{
578 					aGraphic.Clear();
579 
580 					if ( GalleryGraphicImport( aURL, aGraphic, aFormat ) )
581 					{
582 						SgaObject* pNewObj;
583 
584 						if ( SGA_OBJ_INET == pEntry->eObjKind )
585 							pNewObj = (SgaObject*) new SgaObjectINet( aGraphic, aURL, aFormat );
586 						else if ( aGraphic.IsAnimated() )
587 							pNewObj = (SgaObject*) new SgaObjectAnim( aGraphic, aURL, aFormat );
588 						else
589 							pNewObj = (SgaObject*) new SgaObjectBmp( aGraphic, aURL, aFormat );
590 
591 						if( !InsertObject( *pNewObj ) )
592 							pEntry->bDummy = sal_True;
593 
594 						delete pNewObj;
595 					}
596 					else
597 						pEntry->bDummy = sal_True; // Loesch-Flag setzen
598 				}
599 			}
600 			else
601 			{
602 				if ( aSvDrawStorageRef.Is() )
603 				{
604 					const String		aStmName( GetSvDrawStreamNameFromURL( pEntry->aURL ) );
605 					SvStorageStreamRef	pIStm = aSvDrawStorageRef->OpenSotStream( aStmName, STREAM_READ );
606 
607 					if( pIStm && !pIStm->GetError() )
608 					{
609 						pIStm->SetBufferSize( 16384 );
610 
611 						SgaObjectSvDraw aNewObj( *pIStm, pEntry->aURL );
612 
613                         if( !InsertObject( aNewObj ) )
614 							pEntry->bDummy = sal_True;
615 
616 						pIStm->SetBufferSize( 0L );
617 					}
618 				}
619 			}
620 		}
621 
622 		// remove all entries with set flag
623 		pEntry = aObjectList.First();
624 		while( pEntry )
625 		{
626 			if( pEntry->bDummy )
627 			{
628 				Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
629 				delete aObjectList.Remove( pEntry );
630 				Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pEntry ) ) );
631 
632 				pEntry = aObjectList.GetCurObject();
633 			}
634 			else
635 				pEntry = aObjectList.Next();
636 		}
637 
638 		// update theme
639 		::utl::TempFile	aTmp;
640 		INetURLObject	aInURL( GetSdgURL() );
641 		INetURLObject	aTmpURL( aTmp.GetURL() );
642 
643 		DBG_ASSERT( aInURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
644 		DBG_ASSERT( aTmpURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
645 
646 		SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( aInURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
647 		SvStream* pTmpStm = ::utl::UcbStreamHelper::CreateStream( aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
648 
649 		if( pIStm && pTmpStm )
650 		{
651 			pEntry = aObjectList.First();
652 
653 			while( pEntry )
654 			{
655 				SgaObject* pObj;
656 
657 				switch( pEntry->eObjKind )
658 				{
659 					case( SGA_OBJ_BMP ):	pObj = new SgaObjectBmp(); break;
660 					case( SGA_OBJ_ANIM ):	pObj = new SgaObjectAnim(); break;
661 					case( SGA_OBJ_INET ):	pObj = new SgaObjectINet(); break;
662 					case( SGA_OBJ_SVDRAW ):	pObj = new SgaObjectSvDraw(); break;
663 					case (SGA_OBJ_SOUND):	pObj = new SgaObjectSound(); break;
664 
665 					default:
666 						pObj = NULL;
667 					break;
668 				}
669 
670 				if( pObj )
671 				{
672 					pIStm->Seek( pEntry->nOffset );
673 					*pIStm >> *pObj;
674 					pEntry->nOffset = pTmpStm->Tell();
675 					*pTmpStm << *pObj;
676 					delete pObj;
677 				}
678 
679 				pEntry = aObjectList.Next();
680 			}
681 		}
682 		else
683 		{
684 			DBG_ERROR( "File(s) could not be opened" );
685 		}
686 
687 		delete pIStm;
688 		delete pTmpStm;
689 
690 		CopyFile( aTmpURL, aInURL );
691 		KillFile( aTmpURL );
692 
693 		sal_uIntPtr nStorErr = 0;
694 
695 		{
696 			SvStorageRef aTempStorageRef( new SvStorage( sal_False, aTmpURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_STD_READWRITE ) );
697 			aSvDrawStorageRef->CopyTo( aTempStorageRef );
698 			nStorErr = aSvDrawStorageRef->GetError();
699 		}
700 
701 		if( !nStorErr )
702 		{
703 			aSvDrawStorageRef.Clear();
704 			CopyFile( aTmpURL, GetSdvURL() );
705 			ImplCreateSvDrawStorage();
706 		}
707 
708 		KillFile( aTmpURL );
709 		ImplSetModified( sal_True );
710 		ImplWrite();
711 		UnlockBroadcaster();
712 	}
713 }
714 
715 // ------------------------------------------------------------------------
716 
717 GalleryThemeEntry* GalleryTheme::CreateThemeEntry( const INetURLObject& rURL, sal_Bool bReadOnly )
718 {
719 	DBG_ASSERT( rURL.GetProtocol() != INET_PROT_NOT_VALID, "invalid URL" );
720 
721 	GalleryThemeEntry*	pRet = NULL;
722 
723 	if( FileExists( rURL ) )
724 	{
725 		SvStream* pIStm = ::utl::UcbStreamHelper::CreateStream( rURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_READ );
726 
727 		if( pIStm )
728 		{
729 			String			aThemeName;
730 			sal_uInt32		nThemeId = 0;
731 			sal_uInt16		nVersion;
732 			sal_Bool			bThemeNameFromResource = sal_False;
733 
734 			*pIStm >> nVersion;
735 
736 			if( nVersion <= 0x00ff )
737 			{
738 				ByteString aTmpStr;
739 
740 				*pIStm >> aTmpStr; aThemeName = String( aTmpStr.GetBuffer(), RTL_TEXTENCODING_UTF8 );
741 
742 				// Charakterkonvertierung durchfuehren
743 				if( nVersion >= 0x0004 )
744 				{
745 					sal_uInt32	nCount;
746 					sal_uInt16	nTemp16;
747 
748 					*pIStm >> nCount >> nTemp16;
749 					pIStm->Seek( STREAM_SEEK_TO_END );
750 
751 					// pruefen, ob es sich um eine neuere Version handelt;
752 					// daher um 520Bytes (8Bytes Kennung + 512Bytes Reserverpuffer ) zurueckspringen,
753 					// falls dies ueberhaupt moeglich ist
754 					if( pIStm->Tell() >= 520 )
755 					{
756 						sal_uInt32 nId1, nId2;
757 
758 						pIStm->SeekRel( -520 );
759 						*pIStm >> nId1 >> nId2;
760 
761 						if( nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
762 							nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
763 						{
764 							VersionCompat* pCompat = new VersionCompat( *pIStm, STREAM_READ );
765 
766 							*pIStm >> nThemeId;
767 
768 							if( pCompat->GetVersion() >= 2 )
769 							{
770 								*pIStm >> bThemeNameFromResource;
771 							}
772 
773 							delete pCompat;
774 						}
775 					}
776 				}
777 
778 				INetURLObject aPathURL( rURL );
779 
780 				aPathURL.removeSegment();
781 				aPathURL.removeFinalSlash();
782 				pRet = new GalleryThemeEntry( aPathURL, aThemeName,
783 											  String(rURL.GetBase()).Copy( 2, 6 ).ToInt32(),
784 											  bReadOnly, sal_False, sal_False, nThemeId,
785 											  bThemeNameFromResource );
786 			}
787 
788 			delete pIStm;
789 		}
790 	}
791 
792 	return pRet;
793 }
794 
795 // -----------------------------------------------------------------------------
796 
797 sal_Bool GalleryTheme::GetThumb( sal_uIntPtr nPos, Bitmap& rBmp, sal_Bool )
798 {
799 	SgaObject*	pObj = AcquireObject( nPos );
800 	sal_Bool		bRet = sal_False;
801 
802 	if( pObj )
803 	{
804 		rBmp = pObj->GetThumbBmp();
805 		ReleaseObject( pObj );
806 		bRet = sal_True;
807 	}
808 
809 	return bRet;
810 }
811 
812 // -----------------------------------------------------------------------------
813 
814 sal_Bool GalleryTheme::GetGraphic( sal_uIntPtr nPos, Graphic& rGraphic, sal_Bool bProgress )
815 {
816 	const GalleryObject*	pObject = ImplGetGalleryObject( nPos );
817 	sal_Bool					bRet = sal_False;
818 
819 	if( pObject )
820 	{
821 		const INetURLObject aURL( ImplGetURL( pObject ) );
822 
823 		switch( pObject->eObjKind )
824 		{
825 			case( SGA_OBJ_BMP ):
826 			case( SGA_OBJ_ANIM ):
827 			case( SGA_OBJ_INET ):
828 			{
829 				String aFilterDummy;
830 				bRet = ( GalleryGraphicImport( aURL, rGraphic, aFilterDummy, bProgress ) != SGA_IMPORT_NONE );
831 			}
832 			break;
833 
834 			case( SGA_OBJ_SVDRAW ):
835 			{
836                 SvxGalleryDrawModel aModel;
837 
838                 if( aModel.GetModel() )
839                 {
840 				    if( GetModel( nPos, *aModel.GetModel(), bProgress ) )
841 				    {
842 					    ImageMap aIMap;
843 
844 					    if( CreateIMapGraphic( *aModel.GetModel(), rGraphic, aIMap ) )
845 						    bRet = sal_True;
846 					    else
847 					    {
848 						    VirtualDevice aVDev;
849 						    aVDev.SetMapMode( MapMode( MAP_100TH_MM ) );
850 						    FmFormView aView( aModel.GetModel(), &aVDev );
851 
852 						    aView.hideMarkHandles();
853 						    aView.ShowSdrPage(aView.GetModel()->GetPage(0));
854 						    aView.MarkAll();
855 						    rGraphic = aView.GetAllMarkedGraphic();
856 						    bRet = sal_True;
857 					    }
858 				    }
859                 }
860 			}
861 			break;
862 
863 			case( SGA_OBJ_SOUND ):
864 			{
865 				SgaObject* pObj = AcquireObject( nPos );
866 
867 				if( pObj )
868 				{
869 					Bitmap aBmp( pObj->GetThumbBmp() );
870 					aBmp.Replace( COL_LIGHTMAGENTA, COL_WHITE );
871 					rGraphic = aBmp;
872 					ReleaseObject( pObj );
873 					bRet = sal_True;
874 				}
875 			}
876 			break;
877 
878 			default:
879 			break;
880 		}
881 	}
882 
883 	return bRet;
884 }
885 
886 // -----------------------------------------------------------------------------
887 
888 sal_Bool GalleryTheme::InsertGraphic( const Graphic& rGraphic, sal_uIntPtr nInsertPos )
889 {
890 	sal_Bool bRet = sal_False;
891 
892 	if( rGraphic.GetType() != GRAPHIC_NONE )
893     {
894 		sal_uIntPtr           nExportFormat = CVT_UNKNOWN;
895 		const GfxLink	aGfxLink( ( (Graphic&) rGraphic ).GetLink() );
896 
897 		if( aGfxLink.GetDataSize() )
898 		{
899 			switch( aGfxLink.GetType() )
900 			{
901 				case( GFX_LINK_TYPE_EPS_BUFFER ): nExportFormat = CVT_SVM; break;
902 				case( GFX_LINK_TYPE_NATIVE_GIF ): nExportFormat = CVT_GIF; break;
903 				case( GFX_LINK_TYPE_NATIVE_JPG ): nExportFormat = CVT_JPG; break;
904 				case( GFX_LINK_TYPE_NATIVE_PNG ): nExportFormat = CVT_PNG; break;
905 				case( GFX_LINK_TYPE_NATIVE_TIF ): nExportFormat = CVT_TIF; break;
906 				case( GFX_LINK_TYPE_NATIVE_WMF ): nExportFormat = CVT_WMF; break;
907 				case( GFX_LINK_TYPE_NATIVE_MET ): nExportFormat = CVT_MET; break;
908 				case( GFX_LINK_TYPE_NATIVE_PCT ): nExportFormat = CVT_PCT; break;
909 				case( GFX_LINK_TYPE_NATIVE_SVG ): nExportFormat = CVT_SVG; break;
910 				default:
911 					break;
912 			}
913 		}
914 		else
915 		{
916 		    if( rGraphic.GetType() == GRAPHIC_BITMAP )
917 		    {
918 			    if( rGraphic.IsAnimated() )
919 				    nExportFormat = CVT_GIF;
920 			    else
921 				    nExportFormat = CVT_PNG;
922 		    }
923 		    else
924                 nExportFormat = CVT_SVM;
925 		}
926 
927         const INetURLObject aURL( ImplCreateUniqueURL( SGA_OBJ_BMP, nExportFormat ) );
928 		SvStream*           pOStm = ::utl::UcbStreamHelper::CreateStream( aURL.GetMainURL( INetURLObject::NO_DECODE ), STREAM_WRITE | STREAM_TRUNC );
929 
930         if( pOStm )
931         {
932 		    pOStm->SetVersion( SOFFICE_FILEFORMAT_50 );
933 
934             if( CVT_SVM == nExportFormat )
935             {
936                 GDIMetaFile aMtf( rGraphic.GetGDIMetaFile() );
937 
938 			    aMtf.Write( *pOStm );
939 			    bRet = ( pOStm->GetError() == ERRCODE_NONE );
940             }
941             else
942             {
943                 if( aGfxLink.GetDataSize() && aGfxLink.GetData() )
944                 {
945                     pOStm->Write( aGfxLink.GetData(), aGfxLink.GetDataSize() );
946                     bRet = ( pOStm->GetError() == ERRCODE_NONE );
947                 }
948                 else
949                     bRet = ( GraphicConverter::Export( *pOStm, rGraphic, nExportFormat ) == ERRCODE_NONE );
950             }
951 
952             delete pOStm;
953         }
954 
955 		if( bRet )
956 		{
957 			const SgaObjectBmp aObjBmp( aURL.GetMainURL( INetURLObject::NO_DECODE ) );
958 			InsertObject( aObjBmp, nInsertPos );
959 		}
960 	}
961 
962 	return bRet;
963 }
964 
965 // -----------------------------------------------------------------------------
966 
967 sal_Bool GalleryTheme::GetModel( sal_uIntPtr nPos, SdrModel& rModel, sal_Bool )
968 {
969 	const GalleryObject*	pObject = ImplGetGalleryObject( nPos );
970 	sal_Bool					bRet = sal_False;
971 
972 	if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
973 	{
974 		const INetURLObject aURL( ImplGetURL( pObject ) );
975 		SvStorageRef		xStor( GetSvDrawStorage() );
976 
977 		if( xStor.Is() )
978 		{
979 			const String		aStmName( GetSvDrawStreamNameFromURL( aURL ) );
980 			SvStorageStreamRef	xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) );
981 
982 			if( xIStm.Is() && !xIStm->GetError() )
983 			{
984 				xIStm->SetBufferSize( STREAMBUF_SIZE );
985 				bRet = GallerySvDrawImport( *xIStm, rModel );
986 				xIStm->SetBufferSize( 0L );
987 			}
988 		}
989 	}
990 
991 	return bRet;
992 }
993 
994 // -----------------------------------------------------------------------------
995 
996 sal_Bool GalleryTheme::InsertModel( const FmFormModel& rModel, sal_uIntPtr nInsertPos )
997 {
998 	INetURLObject	aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
999 	SvStorageRef	xStor( GetSvDrawStorage() );
1000 	sal_Bool			bRet = sal_False;
1001 
1002 	if( xStor.Is() )
1003 	{
1004 		const String		aStmName( GetSvDrawStreamNameFromURL( aURL ) );
1005 		SvStorageStreamRef	xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) );
1006 
1007 		if( xOStm.Is() && !xOStm->GetError() )
1008 		{
1009 			SvMemoryStream	aMemStm( 65535, 65535 );
1010 			FmFormModel*	pFormModel = (FmFormModel*) &rModel;
1011 
1012 		    pFormModel->BurnInStyleSheetAttributes();
1013 
1014             {
1015 			    uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( aMemStm ) );
1016 
1017         	    if( xDocOut.is() )
1018                     SvxDrawingLayerExport( pFormModel, xDocOut );
1019 		    }
1020 
1021             aMemStm.Seek( 0 );
1022 
1023 		    xOStm->SetBufferSize( 16348 );
1024 			GalleryCodec aCodec( *xOStm );
1025 		    aCodec.Write( aMemStm );
1026 
1027 		    if( !xOStm->GetError() )
1028 		    {
1029 			    SgaObjectSvDraw	aObjSvDraw( rModel, aURL );
1030 			    bRet = InsertObject( aObjSvDraw, nInsertPos );
1031 		    }
1032 
1033 		    xOStm->SetBufferSize( 0L );
1034             xOStm->Commit();
1035         }
1036 	}
1037 
1038 	return bRet;
1039 }
1040 
1041 // -----------------------------------------------------------------------------
1042 
1043 sal_Bool GalleryTheme::GetModelStream( sal_uIntPtr nPos, SotStorageStreamRef& rxModelStream, sal_Bool )
1044 {
1045 	const GalleryObject*	pObject = ImplGetGalleryObject( nPos );
1046 	sal_Bool					bRet = sal_False;
1047 
1048 	if( pObject && ( SGA_OBJ_SVDRAW == pObject->eObjKind ) )
1049 	{
1050 		const INetURLObject aURL( ImplGetURL( pObject ) );
1051 		SvStorageRef		xStor( GetSvDrawStorage() );
1052 
1053 		if( xStor.Is() )
1054 		{
1055 			const String		aStmName( GetSvDrawStreamNameFromURL( aURL ) );
1056 			SvStorageStreamRef	xIStm( xStor->OpenSotStream( aStmName, STREAM_READ ) );
1057 
1058 			if( xIStm.Is() && !xIStm->GetError() )
1059 			{
1060             	sal_uInt32 nVersion = 0;
1061 
1062                 xIStm->SetBufferSize( 16348 );
1063 
1064 	            if( GalleryCodec::IsCoded( *xIStm, nVersion ) )
1065                 {
1066                     SvxGalleryDrawModel aModel;
1067 
1068                     if( aModel.GetModel() )
1069                     {
1070                         if( GallerySvDrawImport( *xIStm, *aModel.GetModel() ) )
1071                         {
1072                             aModel.GetModel()->BurnInStyleSheetAttributes();
1073 
1074                             {
1075                                 uno::Reference< io::XOutputStream > xDocOut( new utl::OOutputStreamWrapper( *rxModelStream ) );
1076 
1077                                 if( SvxDrawingLayerExport( aModel.GetModel(), xDocOut ) )
1078                                     rxModelStream->Commit();
1079                             }
1080                         }
1081 
1082                         bRet = ( rxModelStream->GetError() == ERRCODE_NONE );
1083                     }
1084                 }
1085 
1086                 xIStm->SetBufferSize( 0 );
1087 			}
1088 		}
1089 	}
1090 
1091 	return bRet;
1092 }
1093 
1094 // -----------------------------------------------------------------------------
1095 
1096 sal_Bool GalleryTheme::InsertModelStream( const SotStorageStreamRef& rxModelStream, sal_uIntPtr nInsertPos )
1097 {
1098 	INetURLObject	aURL( ImplCreateUniqueURL( SGA_OBJ_SVDRAW ) );
1099 	SvStorageRef	xStor( GetSvDrawStorage() );
1100 	sal_Bool			bRet = sal_False;
1101 
1102 	if( xStor.Is() )
1103 	{
1104 		const String		aStmName( GetSvDrawStreamNameFromURL( aURL ) );
1105 		SvStorageStreamRef	xOStm( xStor->OpenSotStream( aStmName, STREAM_WRITE | STREAM_TRUNC ) );
1106 
1107 		if( xOStm.Is() && !xOStm->GetError() )
1108 		{
1109             GalleryCodec    aCodec( *xOStm );
1110             SvMemoryStream  aMemStm( 65535, 65535 );
1111 
1112 		    xOStm->SetBufferSize( 16348 );
1113             aCodec.Write( *rxModelStream );
1114 
1115 		    if( !xOStm->GetError() )
1116 		    {
1117 			    xOStm->Seek( 0 );
1118                 SgaObjectSvDraw	aObjSvDraw( *xOStm, aURL );
1119 			    bRet = InsertObject( aObjSvDraw, nInsertPos );
1120 		    }
1121 
1122 		    xOStm->SetBufferSize( 0L );
1123             xOStm->Commit();
1124         }
1125 	}
1126 
1127 	return bRet;
1128 }
1129 
1130 // -----------------------------------------------------------------------------
1131 
1132 sal_Bool GalleryTheme::GetURL( sal_uIntPtr nPos, INetURLObject& rURL, sal_Bool )
1133 {
1134 	const GalleryObject*	pObject = ImplGetGalleryObject( nPos );
1135 	sal_Bool					bRet = sal_False;
1136 
1137 	if( pObject )
1138 	{
1139 		rURL = INetURLObject( ImplGetURL( pObject ) );
1140 		bRet = sal_True;
1141 	}
1142 
1143 	return bRet;
1144 }
1145 
1146 // -----------------------------------------------------------------------------
1147 
1148 sal_Bool GalleryTheme::InsertURL( const INetURLObject& rURL, sal_uIntPtr nInsertPos )
1149 {
1150 	Graphic			aGraphic;
1151 	String			aFormat;
1152 	SgaObject*		pNewObj = NULL;
1153 	const sal_uInt16	nImportRet = GalleryGraphicImport( rURL, aGraphic, aFormat );
1154 	sal_Bool			bRet = sal_False;
1155 
1156 	if( nImportRet != SGA_IMPORT_NONE )
1157 	{
1158 		if ( SGA_IMPORT_INET == nImportRet )
1159 			pNewObj = (SgaObject*) new SgaObjectINet( aGraphic, rURL, aFormat );
1160 		else if ( aGraphic.IsAnimated() )
1161 			pNewObj = (SgaObject*) new SgaObjectAnim( aGraphic, rURL, aFormat );
1162 		else
1163 			pNewObj = (SgaObject*) new SgaObjectBmp( aGraphic, rURL, aFormat );
1164 	}
1165 	else if( ::avmedia::MediaWindow::isMediaURL( rURL.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS ) ) )
1166 		pNewObj = (SgaObject*) new SgaObjectSound( rURL );
1167 
1168 	if( pNewObj && InsertObject( *pNewObj, nInsertPos ) )
1169 		bRet = sal_True;
1170 
1171 	delete pNewObj;
1172 
1173 	return bRet;
1174 }
1175 
1176 // -----------------------------------------------------------------------------
1177 
1178 sal_Bool GalleryTheme::InsertFileOrDirURL( const INetURLObject& rFileOrDirURL, sal_uIntPtr nInsertPos )
1179 {
1180     INetURLObject                   aURL;
1181     ::std::vector< INetURLObject >  aURLVector;
1182 	sal_Bool                            bRet = sal_False;
1183 
1184 	try
1185 	{
1186 		::ucbhelper::Content         aCnt( rFileOrDirURL.GetMainURL( INetURLObject::NO_DECODE ), uno::Reference< ucb::XCommandEnvironment >() );
1187 		sal_Bool        bFolder = false;
1188 
1189 		aCnt.getPropertyValue( OUString::createFromAscii( "IsFolder" ) ) >>= bFolder;
1190 
1191 		if( bFolder )
1192 		{
1193 			uno::Sequence< OUString > aProps( 1 );
1194 			aProps.getArray()[ 0 ] = OUString::createFromAscii( "Url" );
1195 			uno::Reference< sdbc::XResultSet > xResultSet( aCnt.createCursor( aProps, ::ucbhelper::INCLUDE_DOCUMENTS_ONLY ) );
1196             uno::Reference< ucb::XContentAccess > xContentAccess( xResultSet, uno::UNO_QUERY );
1197 			if( xContentAccess.is() )
1198 			{
1199 				while( xResultSet->next() )
1200 				{
1201 					aURL.SetSmartURL( xContentAccess->queryContentIdentifierString() );
1202                     aURLVector.push_back( aURL );
1203 				}
1204 			}
1205 		}
1206 		else
1207             aURLVector.push_back( rFileOrDirURL );
1208 	}
1209 	catch( const ucb::ContentCreationException& )
1210 	{
1211 	}
1212 	catch( const uno::RuntimeException& )
1213 	{
1214 	}
1215 	catch( const uno::Exception& )
1216 	{
1217 	}
1218 
1219     ::std::vector< INetURLObject >::const_iterator aIter( aURLVector.begin() ), aEnd( aURLVector.end() );
1220 
1221     while( aIter != aEnd )
1222         bRet = bRet || InsertURL( *aIter++, nInsertPos );
1223 
1224     return bRet;
1225 }
1226 
1227 // -----------------------------------------------------------------------------
1228 
1229 sal_Bool GalleryTheme::InsertTransferable( const uno::Reference< datatransfer::XTransferable >& rxTransferable, sal_uIntPtr nInsertPos )
1230 {
1231 	sal_Bool bRet = sal_False;
1232 
1233 	if( rxTransferable.is() )
1234 	{
1235 		TransferableDataHelper	aDataHelper( rxTransferable );
1236 		Graphic*				pGraphic = NULL;
1237 
1238 		if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_DRAWING ) )
1239 		{
1240 			SotStorageStreamRef xModelStm;
1241 
1242 			if( aDataHelper.GetSotStorageStream( SOT_FORMATSTR_ID_DRAWING, xModelStm ) )
1243 				bRet = InsertModelStream( xModelStm, nInsertPos );
1244 		}
1245 		else if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) ||
1246                  aDataHelper.HasFormat( FORMAT_FILE ) )
1247 		{
1248             FileList aFileList;
1249 
1250             if( aDataHelper.HasFormat( SOT_FORMAT_FILE_LIST ) )
1251                 aDataHelper.GetFileList( SOT_FORMAT_FILE_LIST, aFileList );
1252             else
1253             {
1254                 String aFile;
1255 
1256                 aDataHelper.GetString( FORMAT_FILE, aFile );
1257 
1258                 if( aFile.Len() )
1259                     aFileList.AppendFile( aFile );
1260             }
1261 
1262             for( sal_uInt32 i = 0, nCount = aFileList.Count(); i < nCount; ++i )
1263             {
1264                 const String    aFile( aFileList.GetFile( i ) );
1265                 INetURLObject   aURL( aFile );
1266 
1267                 if( aURL.GetProtocol() == INET_PROT_NOT_VALID )
1268                 {
1269                     String aLocalURL;
1270 
1271                     if( ::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFile, aLocalURL ) )
1272                         aURL = INetURLObject( aLocalURL );
1273                 }
1274 
1275                 if( aURL.GetProtocol() != INET_PROT_NOT_VALID )
1276                     bRet = InsertFileOrDirURL( aURL, nInsertPos );
1277 			}
1278 		}
1279 		else
1280 		{
1281 			Graphic	aGraphic;
1282 			sal_uIntPtr	nFormat = 0;
1283 
1284 			if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVXB ) )
1285 				nFormat = SOT_FORMATSTR_ID_SVXB;
1286 			else if( aDataHelper.HasFormat( FORMAT_GDIMETAFILE ) )
1287 				nFormat = FORMAT_GDIMETAFILE;
1288 			else if( aDataHelper.HasFormat( FORMAT_BITMAP ) )
1289 				nFormat = FORMAT_BITMAP;
1290 
1291 			if( nFormat && aDataHelper.GetGraphic( nFormat, aGraphic ) )
1292 				pGraphic = new Graphic( aGraphic );
1293 		}
1294 
1295 		if( pGraphic )
1296 		{
1297 			bRet = sal_False;
1298 
1299 			if( aDataHelper.HasFormat( SOT_FORMATSTR_ID_SVIM ) )
1300 			{
1301 
1302 				ImageMap aImageMap;
1303 
1304                 // according to KA we don't need a BaseURL here
1305                 if( aDataHelper.GetImageMap( SOT_FORMATSTR_ID_SVIM, aImageMap ) )
1306 				{
1307                     SvxGalleryDrawModel aModel;
1308 
1309                     if( aModel.GetModel() )
1310                     {
1311 					    SgaUserDataFactory	aFactory;
1312 
1313 					    SdrPage*	pPage = aModel.GetModel()->GetPage(0);
1314 					    SdrGrafObj*	pGrafObj = new SdrGrafObj( *pGraphic );
1315 
1316 					    pGrafObj->InsertUserData( new SgaIMapInfo( aImageMap ) );
1317 					    pPage->InsertObject( pGrafObj );
1318 					    bRet = InsertModel( *aModel.GetModel(), nInsertPos );
1319                     }
1320 				}
1321 			}
1322 
1323 			if( !bRet )
1324 				bRet = InsertGraphic( *pGraphic, nInsertPos );
1325 
1326 			delete pGraphic;
1327 		}
1328 	}
1329 
1330 	return bRet;
1331 }
1332 
1333 // -----------------------------------------------------------------------------
1334 
1335 void GalleryTheme::CopyToClipboard( Window* pWindow, sal_uIntPtr nPos )
1336 {
1337 	GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, false );
1338 	pTransferable->CopyToClipboard( pWindow );
1339 }
1340 
1341 // -----------------------------------------------------------------------------
1342 
1343 void GalleryTheme::StartDrag( Window* pWindow, sal_uIntPtr nPos )
1344 {
1345 	GalleryTransferable* pTransferable = new GalleryTransferable( this, nPos, true );
1346 	pTransferable->StartDrag( pWindow, DND_ACTION_COPY | DND_ACTION_LINK );
1347 }
1348 
1349 // -----------------------------------------------------------------------------
1350 
1351 SvStream& GalleryTheme::WriteData( SvStream& rOStm ) const
1352 {
1353 	const INetURLObject	aRelURL1( GetParent()->GetRelativeURL() );
1354 	const INetURLObject	aRelURL2( GetParent()->GetUserURL() );
1355 	INetURLObject		aNewURL, aTempURL;
1356 	sal_uInt32			nCount = GetObjectCount();
1357 	sal_Bool				bRel;
1358 
1359 	rOStm << (sal_uInt16) 0x0004;
1360 	rOStm << ByteString( GetRealName(), RTL_TEXTENCODING_UTF8 );
1361 	rOStm << nCount << (sal_uInt16) gsl_getSystemTextEncoding();
1362 
1363 	for( sal_uInt32 i = 0; i < nCount; i++ )
1364 	{
1365 		const GalleryObject* pObj = ImplGetGalleryObject( i );
1366 		String				 aPath;
1367 
1368 		if( SGA_OBJ_SVDRAW == pObj->eObjKind )
1369 		{
1370 			aPath = GetSvDrawStreamNameFromURL( pObj->aURL );
1371 			bRel = sal_False;
1372 		}
1373 		else
1374 		{
1375 			aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1376 			bRel = ( ( aPath.Erase( sal::static_int_cast< xub_StrLen >( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ) ) == String(aRelURL1.GetMainURL( INetURLObject::NO_DECODE ) ));
1377 
1378 			if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
1379 			{
1380 				aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1381 				aPath = aPath.Erase( 0, sal::static_int_cast< xub_StrLen >( aRelURL1.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) );
1382 			}
1383 			else
1384 			{
1385 				aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1386 				bRel = ( ( aPath.Erase( sal::static_int_cast< xub_StrLen >( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) ) ) == String(aRelURL2.GetMainURL( INetURLObject::NO_DECODE ) ));
1387 
1388 				if( bRel && ( pObj->aURL.GetMainURL( INetURLObject::NO_DECODE ).getLength() > ( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() + 1 ) ) )
1389 				{
1390 					aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1391 					aPath = aPath.Erase( 0, sal::static_int_cast< xub_StrLen >( aRelURL2.GetMainURL( INetURLObject::NO_DECODE ).getLength() ) );
1392 				}
1393 				else
1394 					aPath = pObj->aURL.GetMainURL( INetURLObject::NO_DECODE );
1395 			}
1396 		}
1397 
1398 		aPath.SearchAndReplace(m_aDestDir, String());
1399 		rOStm << bRel << ByteString( aPath, RTL_TEXTENCODING_UTF8 ) << pObj->nOffset << (sal_uInt16) pObj->eObjKind;
1400 	}
1401 
1402 	// neuerdings wird ein 512-Byte-Reservepuffer gechrieben;
1403 	// um diesen zu erkennen werden zwei sal_uIntPtr-Ids geschrieben
1404 	rOStm << COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) << COMPAT_FORMAT( 'E', 'S', 'R', 'V' );
1405 
1406 	const long		nReservePos = rOStm.Tell();
1407 	VersionCompat*	pCompat = new VersionCompat( rOStm, STREAM_WRITE, 2 );
1408 
1409 	rOStm << (sal_uInt32) GetId() << IsThemeNameFromResource(); // ab Version 2
1410 
1411 	delete pCompat;
1412 
1413 	// Rest des Puffers auffuellen
1414 	const long	nRest = Max( 512L - ( (long) rOStm.Tell() - nReservePos ), 0L );
1415 
1416 	if( nRest )
1417 	{
1418 		char* pReserve = new char[ nRest ];
1419 		memset( pReserve, 0, nRest );
1420 		rOStm.Write( pReserve, nRest );
1421 		delete[] pReserve;
1422 	}
1423 
1424 	return rOStm;
1425 }
1426 
1427 // ------------------------------------------------------------------------
1428 
1429 SvStream& GalleryTheme::ReadData( SvStream& rIStm )
1430 {
1431 	sal_uInt32			nCount;
1432 	sal_uInt16			nVersion;
1433 	ByteString			aTmpStr;
1434 	String				aThemeName;
1435 	rtl_TextEncoding	nTextEncoding;
1436 
1437 	aImportName = String();
1438 	rIStm >> nVersion >> aTmpStr >> nCount;
1439 
1440 	if( nVersion >= 0x0004 )
1441 	{
1442 		sal_uInt16 nTmp16;
1443 		rIStm >> nTmp16;
1444 		nTextEncoding = (rtl_TextEncoding) nTmp16;
1445 	}
1446 	else
1447 		nTextEncoding = RTL_TEXTENCODING_UTF8;
1448 
1449 	aThemeName = String( aTmpStr.GetBuffer(), nTextEncoding );
1450 
1451 	if( nCount <= ( 1L << 14 ) )
1452 	{
1453 		GalleryObject*	pObj;
1454 		INetURLObject	aRelURL1( GetParent()->GetRelativeURL() );
1455 		INetURLObject	aRelURL2( GetParent()->GetUserURL() );
1456 		sal_uInt32		nId1, nId2;
1457 		sal_Bool			bRel;
1458 
1459 		for( pObj = aObjectList.First(); pObj; pObj = aObjectList.Next() )
1460 		{
1461 			Broadcast( GalleryHint( GALLERY_HINT_CLOSE_OBJECT, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
1462 			delete pObj;
1463 			Broadcast( GalleryHint( GALLERY_HINT_OBJECT_REMOVED, GetName(), reinterpret_cast< sal_uIntPtr >( pObj ) ) );
1464 		}
1465 
1466 		aObjectList.Clear();
1467 
1468 		for( sal_uInt32 i = 0; i < nCount; i++ )
1469 		{
1470 			pObj = new GalleryObject;
1471 
1472 			ByteString	aTempFileName;
1473 			String		aFileName;
1474 			String		aPath;
1475 			sal_uInt16	nTemp;
1476 
1477 			rIStm >> bRel >> aTempFileName >> pObj->nOffset;
1478 			rIStm >> nTemp; pObj->eObjKind = (SgaObjKind) nTemp;
1479 
1480 			aFileName = String( aTempFileName.GetBuffer(), gsl_getSystemTextEncoding() );
1481 
1482 			if( bRel )
1483 			{
1484 				aFileName.SearchAndReplaceAll( '\\', '/' );
1485 				aPath = aRelURL1.GetMainURL( INetURLObject::NO_DECODE );
1486 
1487 				if( aFileName.GetChar( 0 ) != '/' )
1488 			    		aPath += '/';
1489 
1490 				aPath += aFileName;
1491 
1492 				pObj->aURL = INetURLObject( aPath );
1493 
1494 				if( !FileExists( pObj->aURL ) )
1495 				{
1496 					aPath = aRelURL2.GetMainURL( INetURLObject::NO_DECODE );
1497 
1498 					if( aFileName.GetChar( 0 ) != '/' )
1499 						aPath += '/';
1500 
1501 					aPath += aFileName;
1502 
1503 					// assign this URL, even in the case it is not valid (#94482)
1504                     pObj->aURL = INetURLObject( aPath );
1505 				}
1506 			}
1507 			else
1508 			{
1509 				if( SGA_OBJ_SVDRAW == pObj->eObjKind )
1510 				{
1511 					const static String aBaseURLStr( RTL_CONSTASCII_USTRINGPARAM( "gallery/svdraw/" ) );
1512 
1513 					String aDummyURL( aBaseURLStr );
1514 					pObj->aURL = INetURLObject( aDummyURL += aFileName, INET_PROT_PRIV_SOFFICE );
1515 				}
1516 				else
1517 				{
1518                     String aLocalURL;
1519 
1520 					pObj->aURL = INetURLObject( aFileName );
1521 
1522 					if( ( pObj->aURL.GetProtocol() == INET_PROT_NOT_VALID ) &&
1523 						::utl::LocalFileHelper::ConvertPhysicalNameToURL( aFileName, aLocalURL ) )
1524 					{
1525 						pObj->aURL = INetURLObject( aLocalURL );
1526 					}
1527 				}
1528 			}
1529 
1530 			aObjectList.Insert( pObj, LIST_APPEND );
1531 		}
1532 
1533 		rIStm >> nId1 >> nId2;
1534 
1535 		// in neueren Versionen befindet sich am Ende ein 512-Byte-Reservepuffer;
1536 		// die Daten befinden sich am Anfang dieses Puffers und
1537 		// sind durch eine VersionCompat geklammert
1538 		if( !rIStm.IsEof() &&
1539 			nId1 == COMPAT_FORMAT( 'G', 'A', 'L', 'R' ) &&
1540 			nId2 == COMPAT_FORMAT( 'E', 'S', 'R', 'V' ) )
1541 		{
1542 			VersionCompat*	pCompat = new VersionCompat( rIStm, STREAM_READ );
1543 			sal_uInt32		nTemp32;
1544 			sal_Bool			bThemeNameFromResource = sal_False;
1545 
1546 			rIStm >> nTemp32;
1547 
1548 			if( pCompat->GetVersion() >= 2 )
1549 			{
1550 				rIStm >> bThemeNameFromResource;
1551 			}
1552 
1553 			SetId( nTemp32, bThemeNameFromResource );
1554 			delete pCompat;
1555 		}
1556 	}
1557 	else
1558 		rIStm.SetError( SVSTREAM_READ_ERROR );
1559 
1560 	ImplSetModified( sal_False );
1561 
1562 	return rIStm;
1563 }
1564 
1565 // ------------------------------------------------------------------------
1566 
1567 SvStream& operator<<( SvStream& rOut, const GalleryTheme& rTheme )
1568 {
1569 	return rTheme.WriteData( rOut );
1570 }
1571 
1572 // ------------------------------------------------------------------------
1573 
1574 SvStream& operator>>( SvStream& rIn, GalleryTheme& rTheme )
1575 {
1576 	return rTheme.ReadData( rIn );
1577 }
1578 
1579 void GalleryTheme::ImplSetModified( sal_Bool bModified )
1580 { pThm->SetModified( bModified ); }
1581 
1582 const String& GalleryTheme::GetRealName() const { return pThm->GetThemeName(); }
1583 const INetURLObject& GalleryTheme::GetThmURL() const { return pThm->GetThmURL(); }
1584 const INetURLObject& GalleryTheme::GetSdgURL() const { return pThm->GetSdgURL(); }
1585 const INetURLObject& GalleryTheme::GetSdvURL() const { return pThm->GetSdvURL(); }
1586 sal_uInt32 GalleryTheme::GetId() const { return pThm->GetId(); }
1587 void GalleryTheme::SetId( sal_uInt32 nNewId, sal_Bool bResetThemeName ) { pThm->SetId( nNewId, bResetThemeName ); }
1588 sal_Bool GalleryTheme::IsThemeNameFromResource() const { return pThm->IsNameFromResource(); }
1589 sal_Bool GalleryTheme::IsImported() const { return pThm->IsImported(); }
1590 sal_Bool GalleryTheme::IsReadOnly() const { return pThm->IsReadOnly(); }
1591 sal_Bool GalleryTheme::IsDefault() const { return pThm->IsDefault(); }
1592 sal_Bool GalleryTheme::IsModified() const { return pThm->IsModified(); }
1593 const String& GalleryTheme::GetName() const	{ return IsImported() ? aImportName : pThm->GetThemeName(); }
1594 
1595 void GalleryTheme::InsertAllThemes( ListBox& rListBox )
1596 {
1597 	for( sal_uInt16 i = RID_GALLERYSTR_THEME_FIRST; i <= RID_GALLERYSTR_THEME_LAST; i++ )
1598 		rListBox.InsertEntry( String( GAL_RESID( i ) ) );
1599 }
1600 
1601