LCOV - code coverage report
Current view: top level - sfx2/source/control - templatelocalview.cxx (source / functions) Hit Total Coverage
Test: commit 0e63ca4fde4e446f346e35849c756a30ca294aab Lines: 0 448 0.0 %
Date: 2014-04-11 Functions: 0 31 0.0 %
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/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: */

Generated by: LCOV version 1.10