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