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