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 :
10 : #include <sfx2/templatelocalview.hxx>
11 :
12 : #include <comphelper/processfactory.hxx>
13 : #include <sfx2/doctempl.hxx>
14 : #include <sfx2/templatecontaineritem.hxx>
15 : #include <sfx2/templateviewitem.hxx>
16 : #include <svl/inettype.hxx>
17 : #include <tools/urlobj.hxx>
18 : #include <unotools/ucbstreamhelper.hxx>
19 : #include <vcl/builderfactory.hxx>
20 : #include <vcl/pngread.hxx>
21 :
22 : #include <com/sun/star/embed/ElementModes.hpp>
23 : #include <com/sun/star/embed/XStorage.hpp>
24 : #include <com/sun/star/frame/DocumentTemplates.hpp>
25 : #include <com/sun/star/lang/XComponent.hpp>
26 : #include <com/sun/star/frame/XDocumentTemplates.hpp>
27 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
28 : #include <com/sun/star/lang/XSingleServiceFactory.hpp>
29 :
30 : using namespace ::com::sun::star;
31 : using namespace ::com::sun::star::frame;
32 :
33 : static void lcl_updateThumbnails (TemplateContainerItem *pItem);
34 :
35 1 : TemplateLocalView::TemplateLocalView ( vcl::Window* pParent)
36 : : TemplateAbstractView(pParent),
37 1 : mpDocTemplates(new SfxDocumentTemplates)
38 : {
39 1 : }
40 :
41 0 : VCL_BUILDER_FACTORY(TemplateLocalView)
42 :
43 2 : TemplateLocalView::~TemplateLocalView()
44 : {
45 1 : disposeOnce();
46 1 : }
47 :
48 1 : void TemplateLocalView::dispose()
49 : {
50 1 : for (size_t i = 0; i < maRegions.size(); ++i)
51 0 : delete maRegions[i];
52 :
53 1 : maRegions.clear();
54 :
55 1 : delete mpDocTemplates;
56 1 : TemplateAbstractView::dispose();
57 1 : }
58 :
59 0 : void TemplateLocalView::Populate ()
60 : {
61 0 : for (size_t i = 0; i < maRegions.size(); ++i)
62 0 : delete maRegions[i];
63 :
64 0 : maRegions.clear();
65 :
66 0 : sal_uInt16 nCount = mpDocTemplates->GetRegionCount();
67 0 : for (sal_uInt16 i = 0; i < nCount; ++i)
68 : {
69 0 : OUString aRegionName(mpDocTemplates->GetFullRegionName(i));
70 :
71 0 : TemplateContainerItem* pItem = new TemplateContainerItem( *this, i+1 );
72 0 : pItem->mnRegionId = i;
73 0 : pItem->maTitle = aRegionName;
74 0 : pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
75 :
76 0 : sal_uInt16 nEntries = mpDocTemplates->GetCount(i);
77 :
78 0 : for (sal_uInt16 j = 0; j < nEntries; ++j)
79 : {
80 0 : OUString aName = mpDocTemplates->GetName(i,j);
81 0 : OUString aURL = mpDocTemplates->GetPath(i,j);
82 :
83 0 : TemplateItemProperties aProperties;
84 0 : aProperties.aIsFolder = false; // Flat hierarchy for the local filesystem (no nested folders)
85 0 : aProperties.nId = j+1;
86 0 : aProperties.nDocId = j;
87 0 : aProperties.nRegionId = i;
88 0 : aProperties.aName = aName;
89 0 : aProperties.aPath = aURL;
90 0 : aProperties.aThumbnail = TemplateAbstractView::fetchThumbnail(aURL,
91 : TEMPLATE_THUMBNAIL_MAX_WIDTH,
92 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT);
93 :
94 0 : pItem->maTemplates.push_back(aProperties);
95 0 : }
96 :
97 0 : lcl_updateThumbnails(pItem);
98 :
99 0 : maRegions.push_back(pItem);
100 0 : }
101 0 : }
102 :
103 0 : void TemplateLocalView::reload ()
104 : {
105 0 : mpDocTemplates->Update();
106 :
107 0 : Populate();
108 :
109 : // Check if we are currently browsing a region or root folder
110 0 : if (mnCurRegionId)
111 : {
112 0 : sal_uInt16 nRegionId = mnCurRegionId - 1; //Is offset by 1
113 :
114 0 : for (size_t i = 0; i < maRegions.size(); ++i)
115 : {
116 0 : if (maRegions[i]->mnRegionId == nRegionId)
117 : {
118 0 : showRegion(maRegions[i]);
119 0 : break;
120 : }
121 : }
122 : }
123 : else
124 0 : showRootRegion();
125 0 : }
126 :
127 0 : void TemplateLocalView::showRootRegion()
128 : {
129 0 : mnHeaderHeight = 0;
130 0 : mnCurRegionId = 0;
131 0 : maCurRegionName.clear();
132 :
133 : // Clone root region items so they dont get invalidated when we open another region
134 0 : std::vector<ThumbnailViewItem*> items(maRegions.size());
135 0 : for (int i = 0, n = maRegions.size(); i < n; ++i)
136 : {
137 0 : TemplateContainerItem *pCur = maRegions[i];
138 0 : TemplateContainerItem *pItem = new TemplateContainerItem(*this, pCur->mnId);
139 0 : pItem->mnRegionId = pCur->mnRegionId;
140 0 : pItem->maTitle = pCur->maTitle;
141 0 : pItem->maTemplates = pCur->maTemplates;
142 0 : pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
143 :
144 0 : items[i] = pItem;
145 : }
146 :
147 0 : maAllButton->Show(false);
148 0 : maFTName->Show(false);
149 :
150 0 : updateItems(items);
151 :
152 0 : maOpenRegionHdl.Call(NULL);
153 0 : }
154 :
155 0 : void TemplateLocalView::showRegion(ThumbnailViewItem *pItem)
156 : {
157 0 : mnHeaderHeight = maAllButton->GetSizePixel().getHeight() + maAllButton->GetPosPixel().Y() * 2;
158 :
159 0 : mnCurRegionId = static_cast<TemplateContainerItem*>(pItem)->mnRegionId+1;
160 0 : maCurRegionName = pItem->maTitle;
161 0 : maAllButton->Show(true);
162 0 : maFTName->Show(true);
163 :
164 0 : insertItems(reinterpret_cast<TemplateContainerItem*>(pItem)->maTemplates);
165 :
166 0 : maOpenRegionHdl.Call(NULL);
167 0 : }
168 :
169 0 : void TemplateLocalView::showRegion(const OUString &rName)
170 : {
171 0 : for (int i = 0, n = maRegions.size(); i < n; ++i)
172 : {
173 0 : if (maRegions[i]->maTitle == rName)
174 : {
175 0 : maFTName->SetText(rName);
176 0 : showRegion(maRegions[i]);
177 0 : break;
178 : }
179 : }
180 0 : }
181 :
182 0 : sal_uInt16 TemplateLocalView::getCurRegionItemId() const
183 : {
184 0 : for (size_t i = 0; i < maRegions.size(); ++i)
185 : {
186 0 : if (maRegions[i]->mnRegionId == mnCurRegionId-1)
187 0 : return maRegions[i]->mnId;
188 : }
189 :
190 0 : return 0;
191 : }
192 :
193 0 : sal_uInt16 TemplateLocalView::getRegionId(size_t pos) const
194 : {
195 : assert(pos < maRegions.size());
196 :
197 0 : return maRegions[pos]->mnId;
198 : }
199 :
200 0 : OUString TemplateLocalView::getRegionName(const sal_uInt16 nRegionId) const
201 : {
202 0 : return mpDocTemplates->GetRegionName(nRegionId);
203 : }
204 :
205 0 : OUString TemplateLocalView::getRegionItemName(const sal_uInt16 nItemId) const
206 : {
207 0 : for (size_t i = 0; i < maRegions.size(); ++i)
208 : {
209 0 : if (maRegions[i]->mnId == nItemId)
210 0 : return maRegions[i]->maTitle;
211 : }
212 :
213 0 : return OUString();
214 : }
215 :
216 0 : std::vector<OUString> TemplateLocalView::getFolderNames()
217 : {
218 0 : size_t n = maRegions.size();
219 0 : std::vector<OUString> ret(n);
220 :
221 0 : for (size_t i = 0; i < n; ++i)
222 0 : ret[i] = maRegions[i]->maTitle;
223 :
224 0 : return ret;
225 : }
226 :
227 : std::vector<TemplateItemProperties>
228 0 : TemplateLocalView::getFilteredItems(const boost::function<bool (const TemplateItemProperties&) > &rFunc) const
229 : {
230 0 : std::vector<TemplateItemProperties> aItems;
231 :
232 0 : if (mnCurRegionId)
233 : {
234 0 : TemplateContainerItem *pFolderItem = maRegions[mnCurRegionId-1];
235 :
236 0 : for (size_t j = 0; j < pFolderItem->maTemplates.size(); ++j)
237 : {
238 0 : if (rFunc(pFolderItem->maTemplates[j]))
239 0 : aItems.push_back(pFolderItem->maTemplates[j]);
240 : }
241 : }
242 : else
243 : {
244 0 : for (size_t i = 0; i < maRegions.size(); ++i)
245 : {
246 0 : TemplateContainerItem *pFolderItem = maRegions[i];
247 :
248 0 : for (size_t j = 0; j < pFolderItem->maTemplates.size(); ++j)
249 : {
250 0 : if (rFunc(pFolderItem->maTemplates[j]))
251 0 : aItems.push_back(pFolderItem->maTemplates[j]);
252 : }
253 : }
254 : }
255 :
256 0 : return aItems;
257 : }
258 :
259 0 : sal_uInt16 TemplateLocalView::createRegion(const OUString &rName)
260 : {
261 0 : sal_uInt16 nRegionId = mpDocTemplates->GetRegionCount(); // Next regionId
262 0 : sal_uInt16 nItemId = getNextItemId();
263 :
264 0 : if (!mpDocTemplates->InsertDir(rName,nRegionId))
265 0 : return 0;
266 :
267 0 : OUString aRegionName = rName;
268 :
269 : // Insert to the region cache list and to the thumbnail item list
270 0 : TemplateContainerItem* pItem = new TemplateContainerItem( *this, nItemId );
271 0 : pItem->mnRegionId = nRegionId;
272 0 : pItem->maTitle = aRegionName;
273 0 : pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
274 :
275 0 : maRegions.push_back(pItem);
276 :
277 0 : pItem = new TemplateContainerItem(*this, nItemId);
278 0 : pItem->mnRegionId = nRegionId;
279 0 : pItem->maTitle = aRegionName;
280 0 : pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
281 :
282 0 : AppendItem(pItem);
283 :
284 0 : CalculateItemPositions();
285 0 : Invalidate();
286 :
287 0 : return pItem->mnId;
288 : }
289 :
290 0 : bool TemplateLocalView::isNestedRegionAllowed() const
291 : {
292 0 : return !mnCurRegionId;
293 : }
294 :
295 0 : bool TemplateLocalView::isImportAllowed() const
296 : {
297 0 : return mnCurRegionId;
298 : }
299 :
300 0 : bool TemplateLocalView::removeRegion(const sal_uInt16 nItemId)
301 : {
302 0 : sal_uInt16 nRegionId = USHRT_MAX;
303 :
304 : // Remove from the region cache list
305 0 : std::vector<TemplateContainerItem*>::iterator pRegionIt;
306 0 : for ( pRegionIt = maRegions.begin(); pRegionIt != maRegions.end();)
307 : {
308 0 : if ( (*pRegionIt)->mnId == nItemId )
309 : {
310 0 : if (!mpDocTemplates->Delete((*pRegionIt)->mnRegionId,USHRT_MAX))
311 0 : return false;
312 :
313 0 : nRegionId = (*pRegionIt)->mnRegionId;
314 :
315 0 : delete *pRegionIt;
316 0 : pRegionIt = maRegions.erase(pRegionIt);
317 : }
318 : else
319 : {
320 : // Synchronize regions cache ids with SfxDocumentTemplates
321 0 : if (nRegionId != USHRT_MAX && (*pRegionIt)->mnRegionId > nRegionId)
322 0 : --(*pRegionIt)->mnRegionId;
323 :
324 0 : ++pRegionIt;
325 : }
326 : }
327 :
328 0 : if (nRegionId == USHRT_MAX)
329 0 : return false;
330 :
331 : // Synchronize view regions ids with SfxDocumentTemplates
332 0 : std::vector<ThumbnailViewItem*>::iterator pViewIt = mItemList.begin();
333 0 : for ( pViewIt = mItemList.begin(); pViewIt != mItemList.end(); ++pViewIt)
334 : {
335 0 : if (static_cast<TemplateContainerItem*>(*pViewIt)->mnRegionId > nRegionId)
336 0 : --static_cast<TemplateContainerItem*>(*pViewIt)->mnRegionId;
337 : }
338 :
339 0 : RemoveItem(nItemId);
340 :
341 0 : return true;
342 : }
343 :
344 0 : bool TemplateLocalView::removeTemplate (const sal_uInt16 nItemId, const sal_uInt16 nSrcItemId)
345 : {
346 0 : for (size_t i = 0, n = maRegions.size(); i < n; ++i)
347 : {
348 0 : if (maRegions[i]->mnId == nSrcItemId)
349 : {
350 0 : TemplateContainerItem *pItem = static_cast<TemplateContainerItem*>(maRegions[i]);
351 0 : std::vector<TemplateItemProperties>::iterator pIter;
352 0 : for (pIter = pItem->maTemplates.begin(); pIter != pItem->maTemplates.end(); ++pIter)
353 : {
354 0 : if (pIter->nId == nItemId)
355 : {
356 0 : if (!mpDocTemplates->Delete(pItem->mnRegionId,pIter->nDocId))
357 0 : return false;
358 :
359 0 : pIter = pItem->maTemplates.erase(pIter);
360 :
361 0 : if (maRegions[i]->mnRegionId == mnCurRegionId-1)
362 : {
363 0 : RemoveItem(nItemId);
364 0 : Invalidate();
365 : }
366 :
367 : // Update Doc Idx for all templates that follow
368 0 : for (; pIter != pItem->maTemplates.end(); ++pIter)
369 0 : pIter->nDocId = pIter->nDocId - 1;
370 :
371 0 : break;
372 : }
373 : }
374 :
375 0 : lcl_updateThumbnails(pItem);
376 :
377 0 : CalculateItemPositions();
378 :
379 0 : break;
380 : }
381 : }
382 :
383 0 : return true;
384 : }
385 :
386 0 : bool TemplateLocalView::moveTemplate (const ThumbnailViewItem *pItem, const sal_uInt16 nSrcItem,
387 : const sal_uInt16 nTargetItem)
388 : {
389 0 : TemplateContainerItem *pTarget = NULL;
390 0 : TemplateContainerItem *pSrc = NULL;
391 :
392 0 : for (size_t i = 0, n = maRegions.size(); i < n; ++i)
393 : {
394 0 : if (maRegions[i]->mnId == nTargetItem)
395 0 : pTarget = static_cast<TemplateContainerItem*>(maRegions[i]);
396 0 : else if (maRegions[i]->mnId == nSrcItem)
397 0 : pSrc = static_cast<TemplateContainerItem*>(maRegions[i]);
398 : }
399 :
400 0 : if (pTarget && pSrc)
401 : {
402 0 : sal_uInt16 nSrcRegionId = pSrc->mnRegionId;
403 0 : sal_uInt16 nTargetRegion = pTarget->mnRegionId;
404 0 : sal_uInt16 nTargetIdx = mpDocTemplates->GetCount(nTargetRegion); // Next Idx
405 :
406 0 : const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(pItem);
407 :
408 0 : bool bCopy = !mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId);
409 :
410 0 : if (bCopy)
411 : {
412 0 : if (!mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId))
413 0 : return false;
414 : }
415 : // move template to destination
416 :
417 0 : TemplateItemProperties aTemplateItem;
418 0 : aTemplateItem.nId = nTargetIdx + 1;
419 0 : aTemplateItem.nDocId = nTargetIdx;
420 0 : aTemplateItem.nRegionId = nTargetRegion;
421 0 : aTemplateItem.aName = pViewItem->maTitle;
422 0 : aTemplateItem.aPath = mpDocTemplates->GetPath(nTargetRegion,nTargetIdx);
423 0 : aTemplateItem.aThumbnail = pViewItem->maPreview1;
424 :
425 0 : pTarget->maTemplates.push_back(aTemplateItem);
426 :
427 0 : if (!bCopy)
428 : {
429 : // remove template from region cached data
430 :
431 0 : std::vector<TemplateItemProperties>::iterator aIter;
432 0 : for (aIter = pSrc->maTemplates.begin(); aIter != pSrc->maTemplates.end();)
433 : {
434 0 : if (aIter->nDocId == pViewItem->mnDocId)
435 : {
436 0 : aIter = pSrc->maTemplates.erase(aIter);
437 : }
438 : else
439 : {
440 : // Keep region document id synchronized with SfxDocumentTemplates
441 0 : if (aIter->nDocId > pViewItem->mnDocId)
442 0 : --aIter->nDocId;
443 :
444 0 : ++aIter;
445 : }
446 : }
447 :
448 : // Keep view document id synchronized with SfxDocumentTemplates
449 0 : std::vector<ThumbnailViewItem*>::iterator pItemIter = mItemList.begin();
450 0 : for (; pItemIter != mItemList.end(); ++pItemIter)
451 : {
452 0 : if (static_cast<TemplateViewItem*>(*pItemIter)->mnDocId > pViewItem->mnDocId)
453 0 : --static_cast<TemplateViewItem*>(*pItemIter)->mnDocId;
454 : }
455 : }
456 :
457 0 : lcl_updateThumbnails(pSrc);
458 0 : lcl_updateThumbnails(pTarget);
459 :
460 0 : CalculateItemPositions();
461 0 : Invalidate();
462 :
463 0 : return true;
464 : }
465 :
466 0 : return false;
467 : }
468 :
469 0 : bool TemplateLocalView::moveTemplates(const std::set<const ThumbnailViewItem*, selection_cmp_fn> &rItems,
470 : const sal_uInt16 nTargetItem)
471 : {
472 : assert(mnCurRegionId); // Only allowed in non root regions
473 :
474 0 : bool ret = true;
475 :
476 0 : sal_uInt16 nSrcRegionId = mnCurRegionId-1;
477 :
478 0 : TemplateContainerItem *pTarget = NULL;
479 0 : TemplateContainerItem *pSrc = NULL;
480 :
481 0 : for (size_t i = 0, n = maRegions.size(); i < n; ++i)
482 : {
483 0 : if (maRegions[i]->mnId == nTargetItem)
484 0 : pTarget = static_cast<TemplateContainerItem*>(maRegions[i]);
485 0 : else if (maRegions[i]->mnRegionId == nSrcRegionId)
486 0 : pSrc = static_cast<TemplateContainerItem*>(maRegions[i]);
487 : }
488 :
489 0 : if (pTarget && pSrc)
490 : {
491 0 : bool refresh = false;
492 :
493 0 : sal_uInt16 nTargetRegion = pTarget->mnRegionId;
494 0 : sal_uInt16 nTargetIdx = mpDocTemplates->GetCount(nTargetRegion); // Next Idx
495 0 : std::vector<sal_uInt16> aItemIds; // List of moved items ids (also prevents the invalidation of rItems iterators when we remove them as we go)
496 :
497 0 : std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator aSelIter;
498 0 : for ( aSelIter = rItems.begin(); aSelIter != rItems.end(); ++aSelIter, ++nTargetIdx )
499 : {
500 0 : const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(*aSelIter);
501 :
502 0 : bool bCopy = !mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId);
503 :
504 0 : if (bCopy)
505 : {
506 0 : if (!mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId))
507 : {
508 0 : ret = false;
509 0 : continue;
510 : }
511 : }
512 :
513 : // move template to destination
514 :
515 0 : TemplateItemProperties aTemplateItem;
516 0 : aTemplateItem.nId = nTargetIdx + 1;
517 0 : aTemplateItem.nDocId = nTargetIdx;
518 0 : aTemplateItem.nRegionId = nTargetRegion;
519 0 : aTemplateItem.aName = pViewItem->maTitle;
520 0 : aTemplateItem.aPath = mpDocTemplates->GetPath(nTargetRegion,nTargetIdx);
521 0 : aTemplateItem.aThumbnail = pViewItem->maPreview1;
522 :
523 0 : pTarget->maTemplates.push_back(aTemplateItem);
524 :
525 0 : if (!bCopy)
526 : {
527 : // remove template from region cached data
528 :
529 0 : std::vector<TemplateItemProperties>::iterator pPropIter;
530 0 : for (pPropIter = pSrc->maTemplates.begin(); pPropIter != pSrc->maTemplates.end();)
531 : {
532 0 : if (pPropIter->nDocId == pViewItem->mnDocId)
533 : {
534 0 : pPropIter = pSrc->maTemplates.erase(pPropIter);
535 0 : aItemIds.push_back(pViewItem->mnId);
536 : }
537 : else
538 : {
539 : // Keep region document id synchronized with SfxDocumentTemplates
540 0 : if (pPropIter->nDocId > pViewItem->mnDocId)
541 0 : --pPropIter->nDocId;
542 :
543 0 : ++pPropIter;
544 : }
545 : }
546 :
547 : // Keep view document id synchronized with SfxDocumentTemplates
548 0 : std::vector<ThumbnailViewItem*>::iterator pItemIter = mItemList.begin();
549 0 : for (; pItemIter != mItemList.end(); ++pItemIter)
550 : {
551 0 : if (static_cast<TemplateViewItem*>(*pItemIter)->mnDocId > pViewItem->mnDocId)
552 0 : --static_cast<TemplateViewItem*>(*pItemIter)->mnDocId;
553 : }
554 : }
555 :
556 0 : refresh = true;
557 0 : }
558 :
559 : // Remove items from the current view
560 0 : for (std::vector<sal_uInt16>::iterator it = aItemIds.begin(); it != aItemIds.end(); ++it)
561 0 : RemoveItem(*it);
562 :
563 0 : if (refresh)
564 : {
565 0 : lcl_updateThumbnails(pSrc);
566 0 : lcl_updateThumbnails(pTarget);
567 :
568 0 : CalculateItemPositions();
569 0 : Invalidate();
570 0 : }
571 : }
572 : else
573 0 : ret = false;
574 :
575 0 : return ret;
576 : }
577 :
578 0 : bool TemplateLocalView::copyFrom(const sal_uInt16 nRegionItemId, const BitmapEx &rThumbnail,
579 : const OUString &rPath)
580 : {
581 0 : for (size_t i = 0, n = maRegions.size(); i < n; ++i)
582 : {
583 0 : if (maRegions[i]->mnId == nRegionItemId)
584 : {
585 0 : sal_uInt16 nId = 0;
586 0 : sal_uInt16 nDocId = 0;
587 :
588 : TemplateContainerItem *pRegionItem =
589 0 : static_cast<TemplateContainerItem*>(maRegions[i]);
590 :
591 0 : if (!pRegionItem->maTemplates.empty())
592 : {
593 0 : nId = (pRegionItem->maTemplates.back()).nId+1;
594 0 : nDocId = (pRegionItem->maTemplates.back()).nDocId+1;
595 : }
596 :
597 0 : OUString aPath(rPath);
598 0 : sal_uInt16 nRegionId = maRegions[i]->mnRegionId;
599 :
600 0 : if (mpDocTemplates->CopyFrom(nRegionId,nDocId,aPath))
601 : {
602 0 : TemplateItemProperties aTemplate;
603 0 : aTemplate.nId = nId;
604 0 : aTemplate.nDocId = nDocId;
605 0 : aTemplate.nRegionId = nRegionId;
606 0 : aTemplate.aName = aPath;
607 0 : aTemplate.aThumbnail = rThumbnail;
608 0 : aTemplate.aPath = mpDocTemplates->GetPath(nRegionId,nDocId);
609 :
610 : TemplateContainerItem *pItem =
611 0 : static_cast<TemplateContainerItem*>(maRegions[i]);
612 :
613 0 : pItem->maTemplates.push_back(aTemplate);
614 :
615 0 : lcl_updateThumbnails(pItem);
616 :
617 0 : return true;
618 : }
619 :
620 0 : break;
621 : }
622 : }
623 :
624 0 : return false;
625 : }
626 :
627 0 : bool TemplateLocalView::copyFrom(const OUString &rPath)
628 : {
629 : assert(mnCurRegionId);
630 :
631 0 : TemplateContainerItem *pRegItem = maRegions[mnCurRegionId-1];
632 :
633 0 : sal_uInt16 nId = getNextItemId();
634 0 : sal_uInt16 nDocId = 0;
635 0 : sal_uInt16 nRegionId = pRegItem->mnRegionId;
636 :
637 0 : OUString aPath(rPath);
638 :
639 0 : if (!pRegItem->maTemplates.empty())
640 0 : nDocId = (pRegItem->maTemplates.back()).nDocId+1;
641 :
642 0 : if (!mpDocTemplates->CopyFrom(nRegionId,nDocId,aPath))
643 0 : return false;
644 :
645 0 : TemplateItemProperties aTemplate;
646 0 : aTemplate.aIsFolder = false;
647 0 : aTemplate.nId = nId;
648 0 : aTemplate.nDocId = nDocId;
649 0 : aTemplate.nRegionId = nRegionId;
650 0 : aTemplate.aName = aPath;
651 0 : aTemplate.aThumbnail = TemplateAbstractView::fetchThumbnail(rPath,
652 : TEMPLATE_THUMBNAIL_MAX_WIDTH,
653 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT);
654 0 : aTemplate.aPath = rPath;
655 :
656 0 : pRegItem->maTemplates.push_back(aTemplate);
657 :
658 0 : insertItem(aTemplate);
659 :
660 0 : return true;
661 : }
662 :
663 0 : bool TemplateLocalView::copyFrom (TemplateContainerItem *pItem, const OUString &rPath)
664 : {
665 0 : sal_uInt16 nId = 1;
666 0 : sal_uInt16 nDocId = 0;
667 0 : sal_uInt16 nRegionId = pItem->mnRegionId;
668 0 : OUString aPath(rPath);
669 :
670 0 : if (!pItem->maTemplates.empty())
671 : {
672 0 : nId = (pItem->maTemplates.back()).nId+1;
673 0 : nDocId = (pItem->maTemplates.back()).nDocId+1;
674 : }
675 :
676 0 : if (mpDocTemplates->CopyFrom(nRegionId,nDocId,aPath))
677 : {
678 0 : TemplateItemProperties aTemplate;
679 0 : aTemplate.aIsFolder = false;
680 0 : aTemplate.nId = nId;
681 0 : aTemplate.nDocId = nDocId;
682 0 : aTemplate.nRegionId = nRegionId;
683 0 : aTemplate.aName = aPath;
684 0 : aTemplate.aThumbnail = TemplateAbstractView::fetchThumbnail(rPath,
685 : TEMPLATE_THUMBNAIL_MAX_WIDTH,
686 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT);
687 0 : aTemplate.aPath = rPath;
688 :
689 0 : pItem->maTemplates.push_back(aTemplate);
690 :
691 0 : lcl_updateThumbnails(pItem);
692 :
693 0 : CalculateItemPositions();
694 :
695 0 : return true;
696 : }
697 :
698 0 : return false;
699 : }
700 :
701 0 : bool TemplateLocalView::exportTo(const sal_uInt16 nItemId, const sal_uInt16 nRegionItemId, const OUString &rName)
702 : {
703 0 : for (size_t i = 0, n = maRegions.size(); i < n; ++i)
704 : {
705 0 : if (maRegions[i]->mnId == nRegionItemId)
706 : {
707 0 : TemplateContainerItem *pRegItem = maRegions[i];
708 :
709 0 : std::vector<TemplateItemProperties>::iterator aIter;
710 0 : for (aIter = pRegItem->maTemplates.begin(); aIter != pRegItem->maTemplates.end(); ++aIter)
711 : {
712 0 : if (aIter->nId == nItemId)
713 : {
714 0 : if (!mpDocTemplates->CopyTo(pRegItem->mnRegionId,aIter->nDocId,rName))
715 0 : return false;
716 :
717 0 : return true;
718 : }
719 : }
720 :
721 0 : break;
722 : }
723 : }
724 :
725 0 : return false;
726 : }
727 :
728 0 : bool TemplateLocalView::saveTemplateAs (sal_uInt16 nItemId,
729 : com::sun::star::uno::Reference<com::sun::star::frame::XModel> &rModel,
730 : const OUString &rName)
731 : {
732 :
733 0 : for (size_t i = 0, n = maRegions.size(); i < n; ++i)
734 : {
735 0 : if (maRegions[i]->mnId == nItemId)
736 : {
737 0 : uno::Reference< frame::XStorable > xStorable(rModel, uno::UNO_QUERY_THROW );
738 :
739 : uno::Reference< frame::XDocumentTemplates > xTemplates(
740 0 : frame::DocumentTemplates::create(comphelper::getProcessComponentContext()) );
741 :
742 0 : if (!xTemplates->storeTemplate(mpDocTemplates->GetRegionName(maRegions[i]->mnRegionId),rName, xStorable ))
743 0 : return false;
744 :
745 0 : sal_uInt16 nDocId = maRegions[i]->maTemplates.size();
746 :
747 0 : OUString aURL = mpDocTemplates->GetTemplateTargetURLFromComponent(mpDocTemplates->GetRegionName(maRegions[i]->mnRegionId),rName);
748 :
749 0 : if(!mpDocTemplates->InsertTemplate(maRegions[i]->mnRegionId,nDocId,rName,aURL))
750 0 : return false;
751 :
752 :
753 0 : TemplateItemProperties aTemplate;
754 0 : aTemplate.aIsFolder = false;
755 0 : aTemplate.nId = getNextItemId();
756 0 : aTemplate.nDocId = nDocId;
757 0 : aTemplate.nRegionId = maRegions[i]->mnRegionId;
758 0 : aTemplate.aName = rName;
759 0 : aTemplate.aThumbnail = TemplateAbstractView::fetchThumbnail(aURL,
760 : TEMPLATE_THUMBNAIL_MAX_WIDTH,
761 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT);
762 0 : aTemplate.aPath = aURL;
763 :
764 0 : maRegions[i]->maTemplates.push_back(aTemplate);
765 :
766 0 : insertItem(aTemplate);
767 :
768 0 : return true;
769 : }
770 : }
771 :
772 0 : return false;
773 : }
774 :
775 0 : bool TemplateLocalView::saveTemplateAs(TemplateContainerItem *pDstItem,
776 : com::sun::star::uno::Reference<com::sun::star::frame::XModel> &rModel,
777 : const OUString &rName)
778 : {
779 0 : uno::Reference< frame::XStorable > xStorable(rModel, uno::UNO_QUERY_THROW );
780 :
781 : uno::Reference< frame::XDocumentTemplates > xTemplates(
782 0 : frame::DocumentTemplates::create(comphelper::getProcessComponentContext()) );
783 :
784 0 : if (!xTemplates->storeTemplate(mpDocTemplates->GetRegionName(pDstItem->mnRegionId),rName, xStorable ))
785 0 : return false;
786 :
787 0 : sal_uInt16 nDocId = pDstItem->maTemplates.size();
788 0 : OUString aURL = mpDocTemplates->GetTemplateTargetURLFromComponent(mpDocTemplates->GetRegionName(pDstItem->mnRegionId),rName);
789 :
790 0 : if(!mpDocTemplates->InsertTemplate(pDstItem->mnRegionId,nDocId,rName,aURL))
791 0 : return false;
792 :
793 0 : TemplateItemProperties aTemplate;
794 0 : aTemplate.aIsFolder = false;
795 0 : aTemplate.nId = pDstItem->maTemplates.empty() ? 1 : pDstItem->maTemplates.back().nId+1;
796 0 : aTemplate.nDocId = nDocId;
797 0 : aTemplate.nRegionId = pDstItem->mnRegionId;
798 0 : aTemplate.aName = rName;
799 0 : aTemplate.aThumbnail = TemplateAbstractView::fetchThumbnail(aURL,
800 : TEMPLATE_THUMBNAIL_MAX_WIDTH,
801 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT);
802 0 : aTemplate.aPath = aURL;
803 :
804 0 : pDstItem->maTemplates.push_back(aTemplate);
805 :
806 0 : return true;
807 : }
808 :
809 0 : bool TemplateLocalView::isTemplateNameUnique(const sal_uInt16 nRegionItemId, const OUString &rName) const
810 : {
811 0 : for (size_t i = 0, n = maRegions.size(); i < n; ++i)
812 : {
813 0 : if (maRegions[i]->mnId == nRegionItemId)
814 : {
815 0 : TemplateContainerItem *pRegItem = maRegions[i];
816 :
817 0 : std::vector<TemplateItemProperties>::iterator aIter;
818 0 : for (aIter = pRegItem->maTemplates.begin(); aIter != pRegItem->maTemplates.end(); ++aIter)
819 : {
820 0 : if (aIter->aName == rName)
821 0 : return false;
822 : }
823 :
824 0 : break;
825 : }
826 : }
827 :
828 0 : return true;
829 : }
830 :
831 0 : bool TemplateLocalView::renameItem(ThumbnailViewItem* pItem, const OUString& sNewTitle)
832 : {
833 0 : sal_uInt16 nRegionId = 0;
834 0 : sal_uInt16 nDocId = USHRT_MAX;
835 0 : TemplateViewItem* pDocItem = dynamic_cast<TemplateViewItem*>( pItem );
836 0 : TemplateContainerItem* pContainerItem = dynamic_cast<TemplateContainerItem*>( pItem );
837 0 : if ( pDocItem )
838 : {
839 0 : nRegionId = pDocItem->mnRegionId;
840 0 : nDocId = pDocItem->mnDocId;
841 : }
842 0 : else if ( pContainerItem )
843 : {
844 0 : nRegionId = pContainerItem->mnRegionId;
845 : }
846 0 : return mpDocTemplates->SetName( sNewTitle, nRegionId, nDocId );
847 : }
848 :
849 0 : static void lcl_updateThumbnails (TemplateContainerItem *pItem)
850 : {
851 0 : pItem->maPreview1.Clear();
852 0 : pItem->maPreview2.Clear();
853 0 : pItem->maPreview3.Clear();
854 0 : pItem->maPreview4.Clear();
855 :
856 : // Update folder thumbnails
857 0 : for (size_t i = 0, n = pItem->maTemplates.size(); i < n && pItem->HasMissingPreview(); ++i)
858 : {
859 0 : if ( pItem->maPreview1.IsEmpty( ) )
860 : {
861 0 : pItem->maPreview1 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
862 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
863 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
864 : }
865 0 : else if ( pItem->maPreview2.IsEmpty() )
866 : {
867 0 : pItem->maPreview2 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
868 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
869 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
870 : }
871 0 : else if ( pItem->maPreview3.IsEmpty() )
872 : {
873 0 : pItem->maPreview3 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
874 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
875 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
876 : }
877 0 : else if ( pItem->maPreview4.IsEmpty() )
878 : {
879 0 : pItem->maPreview4 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
880 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
881 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
882 : }
883 : }
884 648 : }
885 :
886 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|