Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * Copyright 2012 LibreOffice contributors.
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/templatelocalviewitem.hxx>
15 : #include <sfx2/templateview.hxx>
16 : #include <sfx2/templateviewitem.hxx>
17 : #include <svl/inettype.hxx>
18 : #include <tools/urlobj.hxx>
19 : #include <unotools/ucbstreamhelper.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 (TemplateLocalViewItem *pItem);
34 :
35 0 : class FolderFilter_Application : public ViewFilter_Application
36 : {
37 : public:
38 :
39 0 : FolderFilter_Application (FILTER_APPLICATION eApp)
40 0 : : ViewFilter_Application(eApp)
41 : {
42 0 : }
43 :
44 0 : bool operator () (const ThumbnailViewItem *pItem)
45 : {
46 0 : TemplateLocalViewItem *pFolderItem = (TemplateLocalViewItem*)pItem;
47 :
48 0 : std::vector<TemplateItemProperties> &rTemplates = pFolderItem->maTemplates;
49 :
50 0 : size_t nVisCount = 0;
51 :
52 : // Clear thumbnails
53 0 : pFolderItem->maPreview1.Clear();
54 0 : pFolderItem->maPreview2.Clear();
55 :
56 0 : for (size_t i = 0, n = rTemplates.size(); i < n; ++i)
57 : {
58 0 : if (isValid(rTemplates[i].aPath))
59 : {
60 0 : ++nVisCount;
61 0 : if ( pFolderItem->maPreview1.IsEmpty( ) )
62 : {
63 0 : pFolderItem->maPreview1 = TemplateAbstractView::scaleImg(rTemplates[i].aThumbnail,
64 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
65 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
66 : }
67 0 : else if ( pFolderItem->maPreview2.IsEmpty() )
68 : {
69 0 : pFolderItem->maPreview2 = TemplateAbstractView::scaleImg(rTemplates[i].aThumbnail,
70 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
71 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
72 : }
73 : }
74 : }
75 :
76 0 : return meApp != FILTER_APP_NONE ? nVisCount : true ;
77 : }
78 :
79 :
80 : private:
81 :
82 : FILTER_APPLICATION meApp;
83 : };
84 :
85 0 : TemplateLocalView::TemplateLocalView ( Window* pParent, const ResId& rResId, bool bDisableTransientChildren)
86 : : TemplateAbstractView(pParent,rResId,bDisableTransientChildren),
87 : mbFilteredResults(false),
88 : meFilterOption(FILTER_APP_NONE),
89 0 : mpDocTemplates(new SfxDocumentTemplates)
90 : {
91 0 : mpItemView->SetColor(GetSettings().GetStyleSettings().GetFieldColor());
92 0 : }
93 :
94 0 : TemplateLocalView::~TemplateLocalView()
95 : {
96 0 : delete mpDocTemplates;
97 0 : }
98 :
99 0 : void TemplateLocalView::Populate ()
100 : {
101 0 : sal_uInt16 nCount = mpDocTemplates->GetRegionCount();
102 0 : for (sal_uInt16 i = 0; i < nCount; ++i)
103 : {
104 0 : OUString aRegionName(mpDocTemplates->GetFullRegionName(i));
105 :
106 0 : if ((sal_uInt32)aRegionName.getLength() > mpItemAttrs->nMaxTextLenght)
107 : {
108 0 : aRegionName = aRegionName.copy(0,mpItemAttrs->nMaxTextLenght-3);
109 0 : aRegionName += "...";
110 : }
111 :
112 0 : TemplateLocalViewItem* pItem = new TemplateLocalViewItem( *this );
113 0 : pItem->mnId = i+1;
114 0 : pItem->maTitle = aRegionName;
115 0 : pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
116 :
117 0 : sal_uInt16 nEntries = mpDocTemplates->GetCount(i);
118 :
119 0 : for (sal_uInt16 j = 0; j < nEntries; ++j)
120 : {
121 0 : OUString aName = mpDocTemplates->GetName(i,j);
122 0 : OUString aURL = mpDocTemplates->GetPath(i,j);
123 :
124 0 : if ((sal_uInt32)aName.getLength() > mpItemAttrs->nMaxTextLenght)
125 : {
126 0 : aName = aName.copy(0,mpItemAttrs->nMaxTextLenght-3);
127 0 : aName += "...";
128 : }
129 :
130 0 : TemplateItemProperties aProperties;;
131 0 : aProperties.nId = j+1;
132 0 : aProperties.nDocId = j;
133 0 : aProperties.nRegionId = i;
134 0 : aProperties.aName = aName;
135 0 : aProperties.aPath = aURL;
136 : aProperties.aThumbnail = TemplateAbstractView::fetchThumbnail(aURL,
137 : TEMPLATE_THUMBNAIL_MAX_WIDTH,
138 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT);
139 :
140 0 : pItem->maTemplates.push_back(aProperties);
141 0 : }
142 :
143 0 : lcl_updateThumbnails(pItem);
144 :
145 0 : mItemList.push_back(pItem);
146 0 : }
147 :
148 0 : CalculateItemPositions();
149 :
150 0 : if ( IsReallyVisible() && IsUpdateMode() )
151 0 : Invalidate();
152 0 : }
153 :
154 0 : void TemplateLocalView::reload ()
155 : {
156 0 : mpDocTemplates->Update();
157 :
158 0 : Clear();
159 :
160 0 : Populate();
161 :
162 0 : if (mpItemView->IsVisible())
163 : {
164 0 : sal_uInt16 nItemId = mpItemView->getId() + 1;
165 :
166 0 : for (size_t i = 0; i < mItemList.size(); ++i)
167 : {
168 0 : if (mItemList[i]->mnId == nItemId)
169 : {
170 0 : mpItemView->Clear();
171 0 : mpItemView->InsertItems(static_cast<TemplateLocalViewItem*>(mItemList[i])->maTemplates);
172 0 : break;
173 : }
174 : }
175 : }
176 0 : }
177 :
178 0 : std::vector<OUString> TemplateLocalView::getFolderNames()
179 : {
180 0 : size_t n = mItemList.size();
181 0 : std::vector<OUString> ret(n);
182 :
183 0 : for (size_t i = 0; i < n; ++i)
184 0 : ret[i] = mItemList[i]->maTitle;
185 :
186 0 : return ret;
187 : }
188 :
189 0 : void TemplateLocalView::showOverlay (bool bVisible)
190 : {
191 0 : mpItemView->Show(bVisible);
192 :
193 : // Clear items is the overlay is closed.
194 0 : if (!bVisible)
195 : {
196 : // Check if the folder view needs to be filtered
197 0 : if (mbFilteredResults)
198 : {
199 0 : filterItems(FolderFilter_Application(meFilterOption));
200 :
201 0 : mbFilteredResults = false;
202 0 : meFilterOption = FILTER_APP_NONE;
203 : }
204 :
205 0 : mpItemView->Clear();
206 : }
207 0 : }
208 :
209 0 : void TemplateLocalView::filterTemplatesByApp (const FILTER_APPLICATION &eApp)
210 : {
211 0 : meFilterOption = eApp;
212 :
213 0 : if (mpItemView->IsVisible())
214 : {
215 0 : mbFilteredResults = true;
216 0 : mpItemView->filterItems(ViewFilter_Application(eApp));
217 : }
218 : else
219 : {
220 0 : filterItems(FolderFilter_Application(eApp));
221 : }
222 0 : }
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 : for (size_t i = 0; i < mItemList.size(); ++i)
230 : {
231 0 : TemplateLocalViewItem *pFolderItem = static_cast<TemplateLocalViewItem*>(mItemList[i]);
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 :
240 0 : return aItems;
241 : }
242 :
243 0 : sal_uInt16 TemplateLocalView::createRegion(const OUString &rName)
244 : {
245 0 : sal_uInt16 nRegionId = mpDocTemplates->GetRegionCount(); // Next regionId
246 :
247 0 : if (!mpDocTemplates->InsertDir(rName,nRegionId))
248 0 : return false;
249 :
250 0 : OUString aRegionName = rName;
251 :
252 0 : if ((sal_uInt32)aRegionName.getLength() > mpItemAttrs->nMaxTextLenght)
253 : {
254 0 : aRegionName = aRegionName.copy(0,mpItemAttrs->nMaxTextLenght-3);
255 0 : aRegionName += "...";
256 : }
257 :
258 0 : TemplateLocalViewItem* pItem = new TemplateLocalViewItem( *this );
259 0 : pItem->mnId = nRegionId+1;
260 0 : pItem->maTitle = aRegionName;
261 0 : pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
262 :
263 0 : mItemList.push_back(pItem);
264 :
265 0 : CalculateItemPositions();
266 :
267 0 : if ( IsReallyVisible() && IsUpdateMode() )
268 0 : Invalidate();
269 :
270 0 : return pItem->mnId;
271 : }
272 :
273 0 : bool TemplateLocalView::removeRegion(const sal_uInt16 nItemId)
274 : {
275 0 : sal_uInt16 nRegionId = nItemId - 1;
276 :
277 0 : if (!mpDocTemplates->Delete(nRegionId,USHRT_MAX))
278 0 : return false;
279 :
280 0 : RemoveItem(nItemId);
281 :
282 0 : return true;
283 : }
284 :
285 0 : bool TemplateLocalView::removeTemplate (const sal_uInt16 nItemId, const sal_uInt16 nSrcItemId)
286 : {
287 0 : sal_uInt16 nRegionId = nSrcItemId - 1;
288 :
289 0 : for (size_t i = 0, n = mItemList.size(); i < n; ++i)
290 : {
291 0 : if (mItemList[i]->mnId == nSrcItemId)
292 : {
293 0 : TemplateLocalViewItem *pItem = static_cast<TemplateLocalViewItem*>(mItemList[i]);
294 0 : std::vector<TemplateItemProperties>::iterator pIter;
295 0 : for (pIter = pItem->maTemplates.begin(); pIter != pItem->maTemplates.end(); ++pIter)
296 : {
297 0 : if (pIter->nId == nItemId)
298 : {
299 0 : if (!mpDocTemplates->Delete(nRegionId,pIter->nDocId))
300 0 : return false;
301 :
302 0 : pIter = pItem->maTemplates.erase(pIter);
303 :
304 0 : mpItemView->RemoveItem(nItemId);
305 :
306 : // Update Doc Idx for all templates that follow
307 0 : for (; pIter != pItem->maTemplates.end(); ++pIter)
308 0 : pIter->nDocId = pIter->nDocId - 1;
309 :
310 0 : break;
311 : }
312 : }
313 :
314 0 : lcl_updateThumbnails(pItem);
315 :
316 0 : CalculateItemPositions();
317 :
318 : break;
319 : }
320 : }
321 :
322 0 : return true;
323 : }
324 :
325 0 : bool TemplateLocalView::moveTemplate (const ThumbnailViewItem *pItem, const sal_uInt16 nSrcItem,
326 : const sal_uInt16 nTargetItem, bool bCopy)
327 : {
328 0 : bool bRet = true;
329 0 : bool bRefresh = false;
330 :
331 0 : TemplateLocalViewItem *pTarget = NULL;
332 0 : TemplateLocalViewItem *pSrc = NULL;
333 :
334 0 : for (size_t i = 0, n = mItemList.size(); i < n; ++i)
335 : {
336 0 : if (mItemList[i]->mnId == nTargetItem)
337 0 : pTarget = static_cast<TemplateLocalViewItem*>(mItemList[i]);
338 0 : else if (mItemList[i]->mnId == nSrcItem)
339 0 : pSrc = static_cast<TemplateLocalViewItem*>(mItemList[i]);
340 : }
341 :
342 0 : if (pTarget && pSrc)
343 : {
344 0 : sal_uInt16 nSrcRegionId = nSrcItem-1;
345 0 : sal_uInt16 nTargetRegion = pTarget->mnId-1;
346 0 : sal_uInt16 nTargetIdx = mpDocTemplates->GetCount(nTargetRegion); // Next Idx
347 :
348 0 : const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(pItem);
349 :
350 : bool bOK;
351 :
352 0 : if (bCopy)
353 0 : bOK = mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
354 : else
355 0 : bOK = mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
356 :
357 0 : if (!bOK)
358 0 : return false;
359 :
360 : // move template to destination
361 :
362 0 : TemplateItemProperties aTemplateItem;
363 0 : aTemplateItem.nId = nTargetIdx + 1;
364 0 : aTemplateItem.nDocId = nTargetIdx;
365 0 : aTemplateItem.nRegionId = nTargetRegion;
366 0 : aTemplateItem.aName = pViewItem->maTitle;
367 0 : aTemplateItem.aPath = pViewItem->getPath();
368 0 : aTemplateItem.aThumbnail = pViewItem->maPreview1;
369 :
370 0 : pTarget->maTemplates.push_back(aTemplateItem);
371 :
372 0 : if (!bCopy)
373 : {
374 : // remove template from overlay and from cached data
375 :
376 0 : std::vector<TemplateItemProperties>::iterator aIter;
377 0 : for (aIter = pSrc->maTemplates.begin(); aIter != pSrc->maTemplates.end(); ++aIter)
378 : {
379 0 : if (aIter->nId == pViewItem->mnId)
380 : {
381 0 : pSrc->maTemplates.erase(aIter);
382 :
383 0 : mpItemView->RemoveItem(pViewItem->mnId);
384 0 : break;
385 : }
386 : }
387 : }
388 :
389 0 : bRefresh = true;
390 : }
391 : else
392 0 : bRet = false;
393 :
394 0 : if (bRefresh)
395 : {
396 0 : lcl_updateThumbnails(pSrc);
397 0 : lcl_updateThumbnails(pTarget);
398 :
399 0 : CalculateItemPositions();
400 :
401 0 : if (IsReallyVisible() && IsUpdateMode())
402 : {
403 0 : Invalidate();
404 0 : mpItemView->Invalidate();
405 : }
406 : }
407 :
408 0 : return bRet;
409 : }
410 :
411 0 : bool TemplateLocalView::moveTemplates(std::set<const ThumbnailViewItem *> &rItems,
412 : const sal_uInt16 nTargetItem, bool bCopy)
413 : {
414 0 : bool ret = true;
415 0 : bool refresh = false;
416 :
417 0 : sal_uInt16 nSrcRegionId = mpItemView->getId();
418 0 : sal_uInt16 nSrcRegionItemId = nSrcRegionId + 1;
419 :
420 0 : TemplateLocalViewItem *pTarget = NULL;
421 0 : TemplateLocalViewItem *pSrc = NULL;
422 :
423 0 : for (size_t i = 0, n = mItemList.size(); i < n; ++i)
424 : {
425 0 : if (mItemList[i]->mnId == nTargetItem)
426 0 : pTarget = static_cast<TemplateLocalViewItem*>(mItemList[i]);
427 0 : else if (mItemList[i]->mnId == nSrcRegionItemId)
428 0 : pSrc = static_cast<TemplateLocalViewItem*>(mItemList[i]);
429 : }
430 :
431 0 : if (pTarget && pSrc)
432 : {
433 0 : sal_uInt16 nTargetRegion = pTarget->mnId-1;
434 0 : sal_uInt16 nTargetIdx = mpDocTemplates->GetCount(nTargetRegion); // Next Idx
435 :
436 0 : std::set<const ThumbnailViewItem*>::iterator aSelIter;
437 0 : for ( aSelIter = rItems.begin(); aSelIter != rItems.end(); ++aSelIter, ++nTargetIdx )
438 : {
439 0 : const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(*aSelIter);
440 :
441 : bool bOK;
442 :
443 0 : if (bCopy)
444 0 : bOK = mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
445 : else
446 0 : bOK = mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
447 :
448 0 : if (!bOK)
449 : {
450 0 : ret = false;
451 0 : continue;
452 : }
453 :
454 : // move template to destination
455 :
456 0 : TemplateItemProperties aTemplateItem;
457 0 : aTemplateItem.nId = nTargetIdx + 1;
458 0 : aTemplateItem.nDocId = nTargetIdx;
459 0 : aTemplateItem.nRegionId = nTargetRegion;
460 0 : aTemplateItem.aName = pViewItem->maTitle;
461 0 : aTemplateItem.aPath = pViewItem->getPath();
462 0 : aTemplateItem.aThumbnail = pViewItem->maPreview1;
463 :
464 0 : pTarget->maTemplates.push_back(aTemplateItem);
465 :
466 0 : if (!bCopy)
467 : {
468 : // remove template from overlay and from cached data
469 :
470 0 : std::vector<TemplateItemProperties>::iterator pIter;
471 0 : for (pIter = pSrc->maTemplates.begin(); pIter != pSrc->maTemplates.end(); ++pIter)
472 : {
473 0 : if (pIter->nId == pViewItem->mnId)
474 : {
475 0 : pSrc->maTemplates.erase(pIter);
476 :
477 0 : mpItemView->RemoveItem(pViewItem->mnId);
478 0 : break;
479 : }
480 : }
481 : }
482 :
483 0 : refresh = true;
484 0 : }
485 : }
486 : else
487 0 : ret = false;
488 :
489 0 : if (refresh)
490 : {
491 0 : lcl_updateThumbnails(pSrc);
492 0 : lcl_updateThumbnails(pTarget);
493 :
494 0 : CalculateItemPositions();
495 :
496 0 : Invalidate();
497 0 : mpItemView->Invalidate();
498 : }
499 :
500 0 : return ret;
501 : }
502 :
503 0 : bool TemplateLocalView::copyFrom(const sal_uInt16 nRegionItemId, const BitmapEx &rThumbnail,
504 : const OUString &rPath)
505 : {
506 0 : sal_uInt16 nRegionId = nRegionItemId - 1;
507 :
508 0 : for (size_t i = 0, n = mItemList.size(); i < n; ++i)
509 : {
510 0 : if (mItemList[i]->mnId == nRegionItemId)
511 : {
512 0 : sal_uInt16 nId = 0;
513 0 : sal_uInt16 nDocId = 0;
514 :
515 : TemplateLocalViewItem *pRegionItem =
516 0 : static_cast<TemplateLocalViewItem*>(mItemList[i]);
517 :
518 0 : if (!pRegionItem->maTemplates.empty())
519 : {
520 0 : nId = (pRegionItem->maTemplates.back()).nId+1;
521 0 : nDocId = (pRegionItem->maTemplates.back()).nDocId+1;
522 : }
523 :
524 0 : String aPath(rPath);
525 :
526 0 : if (mpDocTemplates->CopyFrom(nRegionId,nDocId,aPath))
527 : {
528 0 : TemplateItemProperties aTemplate;
529 0 : aTemplate.nId = nId;
530 0 : aTemplate.nDocId = nDocId;
531 0 : aTemplate.nRegionId = nRegionId;
532 0 : aTemplate.aName = aPath;
533 0 : aTemplate.aThumbnail = rThumbnail;
534 0 : aTemplate.aPath = mpDocTemplates->GetPath(nRegionId,nDocId);
535 :
536 : TemplateLocalViewItem *pItem =
537 0 : static_cast<TemplateLocalViewItem*>(mItemList[i]);
538 :
539 0 : pItem->maTemplates.push_back(aTemplate);
540 :
541 0 : lcl_updateThumbnails(pItem);
542 :
543 0 : return true;
544 : }
545 :
546 0 : break;
547 : }
548 : }
549 :
550 0 : return false;
551 : }
552 :
553 0 : bool TemplateLocalView::copyFrom (TemplateLocalViewItem *pItem, const OUString &rPath)
554 : {
555 0 : sal_uInt16 nId = 0;
556 0 : sal_uInt16 nDocId = 0;
557 0 : sal_uInt16 nRegionId = pItem->mnId - 1;
558 0 : String aPath(rPath);
559 :
560 0 : if (!pItem->maTemplates.empty())
561 : {
562 0 : nId = (pItem->maTemplates.back()).nId+1;
563 0 : nDocId = (pItem->maTemplates.back()).nDocId+1;
564 : }
565 :
566 0 : if (mpDocTemplates->CopyFrom(nRegionId,nDocId,aPath))
567 : {
568 0 : TemplateItemProperties aTemplate;
569 0 : aTemplate.nId = nId;
570 0 : aTemplate.nDocId = nDocId;
571 0 : aTemplate.nRegionId = nRegionId;
572 0 : aTemplate.aName = aPath;
573 : aTemplate.aThumbnail = TemplateAbstractView::fetchThumbnail(rPath,
574 : TEMPLATE_THUMBNAIL_MAX_WIDTH,
575 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT);
576 0 : aTemplate.aPath = rPath;
577 :
578 0 : pItem->maTemplates.push_back(aTemplate);
579 :
580 0 : lcl_updateThumbnails(pItem);
581 :
582 0 : CalculateItemPositions();
583 :
584 0 : return true;
585 : }
586 :
587 0 : return false;
588 : }
589 :
590 0 : bool TemplateLocalView::exportTo(const sal_uInt16 nItemId, const sal_uInt16 nRegionItemId, const OUString &rName)
591 : {
592 0 : sal_uInt16 nRegionId = nRegionItemId - 1;
593 :
594 0 : for (size_t i = 0, n = mItemList.size(); i < n; ++i)
595 : {
596 0 : if (mItemList[i]->mnId == nRegionItemId)
597 : {
598 : TemplateLocalViewItem *pRegItem =
599 0 : static_cast<TemplateLocalViewItem*>(mItemList[i]);
600 :
601 0 : std::vector<TemplateItemProperties>::iterator aIter;
602 0 : for (aIter = pRegItem->maTemplates.begin(); aIter != pRegItem->maTemplates.end(); ++aIter)
603 : {
604 0 : if (aIter->nId == nItemId)
605 : {
606 0 : if (!mpDocTemplates->CopyTo(nRegionId,aIter->nDocId,rName))
607 0 : return false;
608 :
609 0 : return true;
610 : }
611 : }
612 :
613 : break;
614 : }
615 : }
616 :
617 0 : return false;
618 : }
619 :
620 0 : bool TemplateLocalView::saveTemplateAs (sal_uInt16 nItemId,
621 : com::sun::star::uno::Reference<com::sun::star::frame::XModel> &rModel,
622 : const OUString &rName)
623 : {
624 0 : bool bRet = false;
625 :
626 0 : for (size_t i = 0, n = mItemList.size(); i < n; ++i)
627 : {
628 0 : if (mItemList[i]->mnId == nItemId)
629 : {
630 0 : bRet = saveTemplateAs((const TemplateLocalViewItem*)mItemList[i],rModel,rName);
631 0 : break;
632 : }
633 : }
634 :
635 0 : return bRet;
636 : }
637 :
638 0 : bool TemplateLocalView::saveTemplateAs(const TemplateLocalViewItem *pDstItem,
639 : com::sun::star::uno::Reference<com::sun::star::frame::XModel> &rModel,
640 : const OUString &rName)
641 : {
642 0 : uno::Reference< frame::XStorable > xStorable(rModel, uno::UNO_QUERY_THROW );
643 :
644 : uno::Reference< frame::XDocumentTemplates > xTemplates(
645 0 : frame::DocumentTemplates::create(comphelper::getProcessComponentContext()) );
646 :
647 0 : sal_uInt16 nRegionId = pDstItem->mnId-1;
648 :
649 0 : if (!xTemplates->storeTemplate(mpDocTemplates->GetRegionName(nRegionId),rName, xStorable ))
650 0 : return false;
651 :
652 0 : return true;
653 : }
654 :
655 0 : bool TemplateLocalView::isTemplateNameUnique(const sal_uInt16 nRegionItemId, const OUString &rName) const
656 : {
657 0 : for (size_t i = 0, n = mItemList.size(); i < n; ++i)
658 : {
659 0 : if (mItemList[i]->mnId == nRegionItemId)
660 : {
661 : TemplateLocalViewItem *pRegItem =
662 0 : static_cast<TemplateLocalViewItem*>(mItemList[i]);
663 :
664 0 : std::vector<TemplateItemProperties>::iterator aIter;
665 0 : for (aIter = pRegItem->maTemplates.begin(); aIter != pRegItem->maTemplates.end(); ++aIter)
666 : {
667 0 : if (aIter->aName == rName)
668 0 : return false;
669 : }
670 :
671 : break;
672 : }
673 : }
674 :
675 0 : return true;
676 : }
677 :
678 0 : void TemplateLocalView::OnItemDblClicked (ThumbnailViewItem *pRegionItem)
679 : {
680 : // Fill templates
681 0 : sal_uInt16 nRegionId = pRegionItem->mnId-1;
682 :
683 0 : mpItemView->setId(nRegionId);
684 0 : mpItemView->setName(mpDocTemplates->GetRegionName(nRegionId));
685 0 : mpItemView->InsertItems(static_cast<TemplateLocalViewItem*>(pRegionItem)->maTemplates);
686 :
687 0 : mpItemView->filterItems(ViewFilter_Application(meFilterOption));
688 :
689 0 : showOverlay(true);
690 0 : }
691 :
692 0 : static void lcl_updateThumbnails (TemplateLocalViewItem *pItem)
693 : {
694 0 : pItem->maPreview1.Clear();
695 0 : pItem->maPreview2.Clear();
696 :
697 : // Update folder thumbnails
698 0 : for (size_t i = 0, n = pItem->maTemplates.size(); i < n && ( pItem->maPreview1.IsEmpty() || pItem->maPreview2.IsEmpty( ) ); ++i)
699 : {
700 0 : if ( pItem->maPreview1.IsEmpty( ) )
701 : {
702 0 : pItem->maPreview1 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
703 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
704 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
705 : }
706 : else
707 : {
708 0 : pItem->maPreview2 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
709 : TEMPLATE_THUMBNAIL_MAX_WIDTH*0.75,
710 0 : TEMPLATE_THUMBNAIL_MAX_HEIGHT*0.75);
711 : }
712 : }
713 0 : }
714 :
715 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|