[PATCH] Separate template region ids from thumbnail ids.

Rafael Dominguez (via Code Review) gerrit at gerrit.libreoffice.org
Tue Mar 26 22:35:21 PDT 2013


Hi,

I have submitted a patch for review:

    https://gerrit.libreoffice.org/3075

To pull it, you can do:

    git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/75/3075/1

Separate template region ids from thumbnail ids.

- Update all actions to use the new system.

Change-Id: I22da25a4bbba4604f5df42f440e6532076d39457
---
M sfx2/inc/sfx2/templatecontaineritem.hxx
M sfx2/inc/sfx2/templatelocalview.hxx
M sfx2/inc/sfx2/thumbnailview.hxx
M sfx2/source/control/templateabstractview.cxx
M sfx2/source/control/templatelocalview.cxx
M sfx2/source/control/thumbnailview.cxx
M sfx2/source/doc/templatedlg.cxx
7 files changed, 90 insertions(+), 55 deletions(-)



diff --git a/sfx2/inc/sfx2/templatecontaineritem.hxx b/sfx2/inc/sfx2/templatecontaineritem.hxx
index 4768604..527571c 100644
--- a/sfx2/inc/sfx2/templatecontaineritem.hxx
+++ b/sfx2/inc/sfx2/templatecontaineritem.hxx
@@ -17,6 +17,7 @@
 {
 public:
 
+    sal_uInt16 mnRegionId;
     BitmapEx maPreview2;
     BitmapEx maPreview3;
     BitmapEx maPreview4;
diff --git a/sfx2/inc/sfx2/templatelocalview.hxx b/sfx2/inc/sfx2/templatelocalview.hxx
index 7ea226c..da51114 100644
--- a/sfx2/inc/sfx2/templatelocalview.hxx
+++ b/sfx2/inc/sfx2/templatelocalview.hxx
@@ -42,6 +42,8 @@
 
     virtual void showRegion (ThumbnailViewItem *pItem);
 
+    sal_uInt16 getCurRegionItemId () const;
+
     sal_uInt16 getRegionId (size_t pos) const;
 
     std::vector<OUString> getFolderNames ();
diff --git a/sfx2/inc/sfx2/thumbnailview.hxx b/sfx2/inc/sfx2/thumbnailview.hxx
index 8d7f46a..467ac74 100644
--- a/sfx2/inc/sfx2/thumbnailview.hxx
+++ b/sfx2/inc/sfx2/thumbnailview.hxx
@@ -192,6 +192,8 @@
 
     sal_uInt16 GetItemId( const Point& rPos ) const;
 
+    sal_uInt16 getNextItemId () const;
+
     long GetItemWidth() const { return mnItemWidth; }
 
     long GetItemHeight() const { return mnItemHeight; }
diff --git a/sfx2/source/control/templateabstractview.cxx b/sfx2/source/control/templateabstractview.cxx
index baa72ee..eb725ba 100644
--- a/sfx2/source/control/templateabstractview.cxx
+++ b/sfx2/source/control/templateabstractview.cxx
@@ -375,7 +375,7 @@
     {
         // Fill templates
 
-        mnCurRegionId = pContainerItem->mnId-1;
+        mnCurRegionId = pContainerItem->mnRegionId+1;
         maCurRegionName = pContainerItem->maTitle;
         maFTName.SetText(maCurRegionName);
         showRegion(pItem);
diff --git a/sfx2/source/control/templatelocalview.cxx b/sfx2/source/control/templatelocalview.cxx
index ddab413..dd99ceb 100644
--- a/sfx2/source/control/templatelocalview.cxx
+++ b/sfx2/source/control/templatelocalview.cxx
@@ -61,6 +61,7 @@
 
         TemplateContainerItem* pItem = new TemplateContainerItem( *this );
         pItem->mnId = i+1;
+        pItem->mnRegionId = i;
         pItem->maTitle = aRegionName;
         pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
 
@@ -100,11 +101,11 @@
     // Check if we are currently browsing a region or root folder
     if (mnCurRegionId)
     {
-        sal_uInt16 nItemId = mnCurRegionId + 1;
+        sal_uInt16 nRegionId = mnCurRegionId - 1;   //Is offset by 1
 
         for (size_t i = 0; i < maRegions.size(); ++i)
         {
-            if (maRegions[i]->mnId == nItemId)
+            if (maRegions[i]->mnRegionId == nRegionId)
             {
                 showRegion(maRegions[i]);
                 break;
@@ -128,6 +129,7 @@
         TemplateContainerItem *pCur = maRegions[i];
         TemplateContainerItem *pItem = new TemplateContainerItem(*this);
         pItem->mnId = pCur->mnId;
+        pItem->mnRegionId = pCur->mnRegionId;
         pItem->maTitle = pCur->maTitle;
         pItem->maTemplates = pCur->maTemplates;
         pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
@@ -147,7 +149,7 @@
 {
     mnHeaderHeight = maAllButton.GetSizePixel().getHeight() + maAllButton.GetPosPixel().Y() * 2;
 
-    mnCurRegionId = pItem->mnId-1;
+    mnCurRegionId = static_cast<TemplateContainerItem*>(pItem)->mnRegionId+1;
     maCurRegionName = pItem->maTitle;
     maAllButton.Show(true);
     maFTName.Show(true);
@@ -155,6 +157,17 @@
     insertItems(reinterpret_cast<TemplateContainerItem*>(pItem)->maTemplates);
 
     maOpenRegionHdl.Call(NULL);
+}
+
+sal_uInt16 TemplateLocalView::getCurRegionItemId() const
+{
+    for (size_t i = 0; i < maRegions.size(); ++i)
+    {
+        if (maRegions[i]->mnRegionId == mnCurRegionId-1)
+            return maRegions[i]->mnId;
+    }
+
+    return 0;
 }
 
 sal_uInt16 TemplateLocalView::getRegionId(size_t pos) const
@@ -197,6 +210,7 @@
 sal_uInt16 TemplateLocalView::createRegion(const OUString &rName)
 {
     sal_uInt16 nRegionId = mpDocTemplates->GetRegionCount();    // Next regionId
+    sal_uInt16 nItemId = getNextItemId();
 
     if (!mpDocTemplates->InsertDir(rName,nRegionId))
         return false;
@@ -205,14 +219,16 @@
 
     // Insert to the region cache list and to the thumbnail item list
     TemplateContainerItem* pItem = new TemplateContainerItem( *this );
-    pItem->mnId = nRegionId+1;
+    pItem->mnId = nItemId;
+    pItem->mnRegionId = nRegionId;
     pItem->maTitle = aRegionName;
     pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
 
     maRegions.push_back(pItem);
 
     pItem = new TemplateContainerItem(*this);
-    pItem->mnId = nRegionId + 1;
+    pItem->mnId = nItemId;
+    pItem->mnRegionId = nRegionId;
     pItem->maTitle = aRegionName;
     pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnItemSelected));
 
@@ -226,32 +242,50 @@
 
 bool TemplateLocalView::removeRegion(const sal_uInt16 nItemId)
 {
-    sal_uInt16 nRegionId = nItemId - 1;
-
-    if (!mpDocTemplates->Delete(nRegionId,USHRT_MAX))
-        return false;
-
-    RemoveItem(nItemId);
+    sal_uInt16 nRegionId = USHRT_MAX;
 
     // Remove from the region cache list
-    std::vector<TemplateContainerItem*>::iterator it;
-    for ( it = maRegions.begin(); it != maRegions.end(); ++it )
+    std::vector<TemplateContainerItem*>::iterator pRegionIt;
+    for ( pRegionIt = maRegions.begin(); pRegionIt != maRegions.end();)
     {
-        if ( (*it)->mnId == nItemId )
+        if ( (*pRegionIt)->mnId == nItemId )
         {
-            delete *it;
-            maRegions.erase(it);
-            break;
+            if (!mpDocTemplates->Delete((*pRegionIt)->mnRegionId,USHRT_MAX))
+                return false;
+
+            nRegionId = (*pRegionIt)->mnRegionId;
+
+            delete *pRegionIt;
+            pRegionIt = maRegions.erase(pRegionIt);
+        }
+        else
+        {
+            // Syncronize regions cache ids with SfxDocumentTemplates
+            if (nRegionId != USHRT_MAX && (*pRegionIt)->mnRegionId > nRegionId)
+                --(*pRegionIt)->mnRegionId;
+
+            ++pRegionIt;
         }
     }
+
+    if (nRegionId == USHRT_MAX)
+        return false;
+
+    // Syncronize view regions ids with SfxDocumentTemplates
+    std::vector<ThumbnailViewItem*>::iterator pViewIt = mItemList.begin();
+    for ( pViewIt = mItemList.begin(); pViewIt != mItemList.end(); ++pViewIt)
+    {
+        if (static_cast<TemplateContainerItem*>(*pViewIt)->mnRegionId > nRegionId)
+            --static_cast<TemplateContainerItem*>(*pViewIt)->mnRegionId;
+    }
+
+    RemoveItem(nItemId);
 
     return true;
 }
 
 bool TemplateLocalView::removeTemplate (const sal_uInt16 nItemId, const sal_uInt16 nSrcItemId)
 {
-    sal_uInt16 nRegionId = nSrcItemId - 1;
-
     for (size_t i = 0, n = maRegions.size(); i < n; ++i)
     {
         if (maRegions[i]->mnId == nSrcItemId)
@@ -262,7 +296,7 @@
             {
                 if (pIter->nId == nItemId)
                 {
-                    if (!mpDocTemplates->Delete(nRegionId,pIter->nDocId))
+                    if (!mpDocTemplates->Delete(pItem->mnRegionId,pIter->nDocId))
                         return false;
 
                     pIter = pItem->maTemplates.erase(pIter);
@@ -304,8 +338,8 @@
 
     if (pTarget && pSrc)
     {
-        sal_uInt16 nSrcRegionId = nSrcItem-1;
-        sal_uInt16 nTargetRegion = pTarget->mnId-1;
+        sal_uInt16 nSrcRegionId = pSrc->mnRegionId;
+        sal_uInt16 nTargetRegion = pTarget->mnRegionId;
         sal_uInt16 nTargetIdx = mpDocTemplates->GetCount(nTargetRegion);    // Next Idx
 
         const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(pItem);
@@ -374,11 +408,12 @@
 bool TemplateLocalView::moveTemplates(const std::set<const ThumbnailViewItem*, selection_cmp_fn> &rItems,
                                       const sal_uInt16 nTargetItem)
 {
+    assert(mnCurRegionId);  // Only allowed in non root regions
+
     bool ret = true;
     bool refresh = false;
 
-    sal_uInt16 nSrcRegionId = mnCurRegionId;
-    sal_uInt16 nSrcRegionItemId = nSrcRegionId + 1;
+    sal_uInt16 nSrcRegionId = mnCurRegionId-1;
 
     TemplateContainerItem *pTarget = NULL;
     TemplateContainerItem *pSrc = NULL;
@@ -387,13 +422,13 @@
     {
         if (maRegions[i]->mnId == nTargetItem)
             pTarget = static_cast<TemplateContainerItem*>(maRegions[i]);
-        else if (maRegions[i]->mnId == nSrcRegionItemId)
+        else if (maRegions[i]->mnRegionId == nSrcRegionId)
             pSrc = static_cast<TemplateContainerItem*>(maRegions[i]);
     }
 
     if (pTarget && pSrc)
     {
-        sal_uInt16 nTargetRegion = pTarget->mnId-1;
+        sal_uInt16 nTargetRegion = pTarget->mnRegionId;
         sal_uInt16 nTargetIdx = mpDocTemplates->GetCount(nTargetRegion);    // Next Idx
         std::vector<sal_uInt16> aItemIds;    // List of moved items ids (also prevents the invalidation of rItems iterators when we remove them as we go)
 
@@ -481,8 +516,6 @@
 bool TemplateLocalView::copyFrom(const sal_uInt16 nRegionItemId, const BitmapEx &rThumbnail,
                                   const OUString &rPath)
 {
-    sal_uInt16 nRegionId = nRegionItemId - 1;
-
     for (size_t i = 0, n = maRegions.size(); i < n; ++i)
     {
         if (maRegions[i]->mnId == nRegionItemId)
@@ -500,6 +533,7 @@
             }
 
             String aPath(rPath);
+            sal_uInt16 nRegionId = maRegions[i]->mnRegionId;
 
             if (mpDocTemplates->CopyFrom(nRegionId,nDocId,aPath))
             {
@@ -530,9 +564,9 @@
 
 bool TemplateLocalView::copyFrom (TemplateContainerItem *pItem, const OUString &rPath)
 {
-    sal_uInt16 nId = 0;
+    sal_uInt16 nId = 1;
     sal_uInt16 nDocId = 0;
-    sal_uInt16 nRegionId = pItem->mnId - 1;
+    sal_uInt16 nRegionId = pItem->mnRegionId;
     String aPath(rPath);
 
     if (!pItem->maTemplates.empty())
@@ -544,6 +578,7 @@
     if (mpDocTemplates->CopyFrom(nRegionId,nDocId,aPath))
     {
         TemplateItemProperties aTemplate;
+        aTemplate.aIsFolder = false;
         aTemplate.nId = nId;
         aTemplate.nDocId = nDocId;
         aTemplate.nRegionId = nRegionId;
@@ -567,21 +602,18 @@
 
 bool TemplateLocalView::exportTo(const sal_uInt16 nItemId, const sal_uInt16 nRegionItemId, const OUString &rName)
 {
-    sal_uInt16 nRegionId = nRegionItemId - 1;
-
     for (size_t i = 0, n = maRegions.size(); i < n; ++i)
     {
         if (maRegions[i]->mnId == nRegionItemId)
         {
-            TemplateContainerItem *pRegItem =
-                    static_cast<TemplateContainerItem*>(maRegions[i]);
+            TemplateContainerItem *pRegItem = maRegions[i];
 
             std::vector<TemplateItemProperties>::iterator aIter;
             for (aIter = pRegItem->maTemplates.begin(); aIter != pRegItem->maTemplates.end(); ++aIter)
             {
                 if (aIter->nId == nItemId)
                 {
-                    if (!mpDocTemplates->CopyTo(nRegionId,aIter->nDocId,rName))
+                    if (!mpDocTemplates->CopyTo(pRegItem->mnRegionId,aIter->nDocId,rName))
                         return false;
 
                     return true;
@@ -622,9 +654,7 @@
     uno::Reference< frame::XDocumentTemplates > xTemplates(
                     frame::DocumentTemplates::create(comphelper::getProcessComponentContext()) );
 
-    sal_uInt16 nRegionId = pDstItem->mnId-1;
-
-    if (!xTemplates->storeTemplate(mpDocTemplates->GetRegionName(nRegionId),rName, xStorable ))
+    if (!xTemplates->storeTemplate(mpDocTemplates->GetRegionName(pDstItem->mnRegionId),rName, xStorable ))
         return false;
 
     return true;
@@ -636,8 +666,7 @@
     {
         if (maRegions[i]->mnId == nRegionItemId)
         {
-            TemplateContainerItem *pRegItem =
-                    static_cast<TemplateContainerItem*>(maRegions[i]);
+            TemplateContainerItem *pRegItem = maRegions[i];
 
             std::vector<TemplateItemProperties>::iterator aIter;
             for (aIter = pRegItem->maTemplates.begin(); aIter != pRegItem->maTemplates.end(); ++aIter)
@@ -666,7 +695,7 @@
     }
     else if ( pContainerItem )
     {
-        nRegionId = pContainerItem->mnId - 1;
+        nRegionId = pContainerItem->mnRegionId;
     }
     return mpDocTemplates->SetName( sNewTitle, nRegionId, nDocId );
 }
diff --git a/sfx2/source/control/thumbnailview.cxx b/sfx2/source/control/thumbnailview.cxx
index d7521b0..605ee50 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -896,6 +896,11 @@
     return 0;
 }
 
+sal_uInt16 ThumbnailView::getNextItemId() const
+{
+    return mItemList.empty() ? 1 : mItemList.back()->mnId + 1;
+}
+
 void ThumbnailView::setItemMaxTextLength(sal_uInt32 nLength)
 {
     mpItemAttrs->nMaxTextLenght = nLength;
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 4250fe1..c537321 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -925,7 +925,7 @@
             // export templates from the current view
 
             sal_uInt16 i = 1;
-            sal_uInt16 nRegionItemId = maView->getCurRegionId() + 1;
+            sal_uInt16 nRegionItemId = maView->getCurRegionItemId();
 
             std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter = maSelTemplates.begin();
             for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter, ++i)
@@ -1087,10 +1087,12 @@
     }
     else
     {
+        sal_uInt16 nRegionItemId = maView->getCurRegionItemId();
+
         std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
         for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end();)
         {
-            if (maView->removeTemplate((*pIter)->mnId,maView->getCurRegionId()+1))
+            if (maView->removeTemplate((*pIter)->mnId,nRegionItemId))
                 maSelTemplates.erase(pIter++);
             else
             {
@@ -1159,11 +1161,11 @@
     OUString aFolderList;
 
     std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
-    for (pIter = maSelFolders.begin(); pIter != maSelFolders.end();)
+    std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelFolders = maSelFolders; //Copy to avoid invalidating an iterator
+
+    for (pIter = aSelFolders.begin(); pIter != aSelFolders.end(); ++pIter)
     {
-        if (maView->removeRegion((*pIter)->mnId))
-            maSelFolders.erase(pIter++);
-        else
+        if (!maView->removeRegion((*pIter)->mnId))
         {
             if (aFolderList.isEmpty())
                 aFolderList = (*pIter)->maTitle;
@@ -1172,12 +1174,6 @@
 
             ++pIter;
         }
-    }
-
-    if (maSelFolders.empty())
-    {
-        mpViewBar->HideItem(TBI_TEMPLATE_IMPORT);
-        mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
     }
 
     if (!aFolderList.isEmpty())
@@ -1371,7 +1367,7 @@
             OUString aTemplateList;
 
             std::set<const ThumbnailViewItem*,selection_cmp_fn>::const_iterator pIter;
-            for (pIter = maSelFolders.begin(); pIter != maSelFolders.end(); ++pIter)
+            for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end(); ++pIter)
             {
                 if (aTemplateList.isEmpty())
                     aTemplateList = (*pIter)->maTitle;

-- 
To view, visit https://gerrit.libreoffice.org/3075
To unsubscribe, visit https://gerrit.libreoffice.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I22da25a4bbba4604f5df42f440e6532076d39457
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: master
Gerrit-Owner: Rafael Dominguez <venccsralph at gmail.com>



More information about the LibreOffice mailing list