LCOV - code coverage report
Current view: top level - sfx2/source/control - templatelocalview.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 13 451 2.9 %
Date: 2015-06-13 12:38:46 Functions: 5 34 14.7 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.11