summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Dominguez <venccsralph@gmail.com>2013-03-26 00:30:08 -0430
committerMiklos Vajna <vmiklos@suse.cz>2013-03-28 12:25:23 +0000
commita67bf57cf130d461dcf306ee381e9e4a7ee013a0 (patch)
tree79a88702f8e50ddc31c45ee96100871fc009abf6
parent82a320dbb30e843ef5e69ec82be7179a8fba28bc (diff)
Syncronize thumbnails ids with SfxDocumentTemplates when moving.
Change-Id: I9ee17e00f769ca16f566b1397d09b76a09273912 (cherry picked from commit dda5fe60ff6dfd61f5f262c61e1d538d20e9c978) Reviewed-on: https://gerrit.libreoffice.org/3091 Reviewed-by: Miklos Vajna <vmiklos@suse.cz> Tested-by: Miklos Vajna <vmiklos@suse.cz>
-rw-r--r--sfx2/inc/sfx2/templatelocalview.hxx4
-rw-r--r--sfx2/source/control/templatelocalview.cxx93
-rw-r--r--sfx2/source/doc/templatedlg.cxx10
3 files changed, 61 insertions, 46 deletions
diff --git a/sfx2/inc/sfx2/templatelocalview.hxx b/sfx2/inc/sfx2/templatelocalview.hxx
index 3bcacc40f9e3..68b7dc7ff155 100644
--- a/sfx2/inc/sfx2/templatelocalview.hxx
+++ b/sfx2/inc/sfx2/templatelocalview.hxx
@@ -56,9 +56,9 @@ public:
bool removeTemplate (const sal_uInt16 nItemId, const sal_uInt16 nSrcItemId);
bool moveTemplate (const ThumbnailViewItem* pItem, const sal_uInt16 nSrcItem,
- const sal_uInt16 nTargetItem, bool bCopy);
+ const sal_uInt16 nTargetItem);
- bool moveTemplates (const std::set<const ThumbnailViewItem*,selection_cmp_fn> &rItems, const sal_uInt16 nTargetItem, bool bCopy);
+ bool moveTemplates (const std::set<const ThumbnailViewItem*,selection_cmp_fn> &rItems, const sal_uInt16 nTargetItem);
bool copyFrom (const sal_uInt16 nRegionItemId, const BitmapEx &rThumbnail, const OUString &rPath);
diff --git a/sfx2/source/control/templatelocalview.cxx b/sfx2/source/control/templatelocalview.cxx
index ab55ca46018c..429b4dc82ef0 100644
--- a/sfx2/source/control/templatelocalview.cxx
+++ b/sfx2/source/control/templatelocalview.cxx
@@ -289,11 +289,8 @@ bool TemplateLocalView::removeTemplate (const sal_uInt16 nItemId, const sal_uInt
}
bool TemplateLocalView::moveTemplate (const ThumbnailViewItem *pItem, const sal_uInt16 nSrcItem,
- const sal_uInt16 nTargetItem, bool bCopy)
+ const sal_uInt16 nTargetItem)
{
- bool bRet = true;
- bool bRefresh = false;
-
TemplateContainerItem *pTarget = NULL;
TemplateContainerItem *pSrc = NULL;
@@ -313,16 +310,13 @@ bool TemplateLocalView::moveTemplate (const ThumbnailViewItem *pItem, const sal_
const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(pItem);
- bool bOK;
+ bool bCopy = !mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId);
if (bCopy)
- bOK = mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
- else
- bOK = mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
-
- if (!bOK)
- return false;
-
+ {
+ if (!mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId))
+ return false;
+ }
// move template to destination
TemplateItemProperties aTemplateItem;
@@ -340,37 +334,45 @@ bool TemplateLocalView::moveTemplate (const ThumbnailViewItem *pItem, const sal_
// remove template from region cached data
std::vector<TemplateItemProperties>::iterator aIter;
- for (aIter = pSrc->maTemplates.begin(); aIter != pSrc->maTemplates.end(); ++aIter)
+ for (aIter = pSrc->maTemplates.begin(); aIter != pSrc->maTemplates.end();)
{
- if (aIter->nId == pViewItem->mnId)
+ if (aIter->nDocId == pViewItem->mnDocId)
+ {
+ aIter = pSrc->maTemplates.erase(aIter);
+ }
+ else
{
- pSrc->maTemplates.erase(aIter);
+ // Keep region document id syncronized with SfxDocumentTemplates
+ if (aIter->nDocId > pViewItem->mnDocId)
+ --aIter->nDocId;
- RemoveItem(pViewItem->mnId);
- break;
+ ++aIter;
}
}
- }
- bRefresh = true;
- }
- else
- bRet = false;
+ // Keep view document id syncronized with SfxDocumentTemplates
+ std::vector<ThumbnailViewItem*>::iterator pItemIter = mItemList.begin();
+ for (; pItemIter != mItemList.end(); ++pItemIter)
+ {
+ if (static_cast<TemplateViewItem*>(*pItemIter)->mnDocId > pViewItem->mnDocId)
+ --static_cast<TemplateViewItem*>(*pItemIter)->mnDocId;
+ }
+ }
- if (bRefresh)
- {
lcl_updateThumbnails(pSrc);
lcl_updateThumbnails(pTarget);
CalculateItemPositions();
Invalidate();
+
+ return true;
}
- return bRet;
+ return false;
}
bool TemplateLocalView::moveTemplates(const std::set<const ThumbnailViewItem*, selection_cmp_fn> &rItems,
- const sal_uInt16 nTargetItem, bool bCopy)
+ const sal_uInt16 nTargetItem)
{
bool ret = true;
bool refresh = false;
@@ -400,17 +402,15 @@ bool TemplateLocalView::moveTemplates(const std::set<const ThumbnailViewItem*, s
{
const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(*aSelIter);
- bool bOK;
+ bool bCopy = !mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId);
if (bCopy)
- bOK = mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
- else
- bOK = mpDocTemplates->Move(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnId-1);
-
- if (!bOK)
{
- ret = false;
- continue;
+ if (!mpDocTemplates->Copy(nTargetRegion,nTargetIdx,nSrcRegionId,pViewItem->mnDocId))
+ {
+ ret = false;
+ continue;
+ }
}
// move template to destination
@@ -429,15 +429,30 @@ bool TemplateLocalView::moveTemplates(const std::set<const ThumbnailViewItem*, s
{
// remove template from region cached data
- std::vector<TemplateItemProperties>::iterator pIter;
- for (pIter = pSrc->maTemplates.begin(); pIter != pSrc->maTemplates.end(); ++pIter)
+ std::vector<TemplateItemProperties>::iterator pPropIter;
+ for (pPropIter = pSrc->maTemplates.begin(); pPropIter != pSrc->maTemplates.end();)
{
- if (pIter->nId == pViewItem->mnId)
+ if (pPropIter->nDocId == pViewItem->mnDocId)
{
- pSrc->maTemplates.erase(pIter);
+ pPropIter = pSrc->maTemplates.erase(pPropIter);
aItemIds.push_back(pViewItem->mnId);
- break;
}
+ else
+ {
+ // Keep region document id syncronized with SfxDocumentTemplates
+ if (pPropIter->nDocId > pViewItem->mnDocId)
+ --pPropIter->nDocId;
+
+ ++pPropIter;
+ }
+ }
+
+ // Keep view document id syncronized with SfxDocumentTemplates
+ std::vector<ThumbnailViewItem*>::iterator pItemIter = mItemList.begin();
+ for (; pItemIter != mItemList.end(); ++pItemIter)
+ {
+ if (static_cast<TemplateViewItem*>(*pItemIter)->mnDocId > pViewItem->mnDocId)
+ --static_cast<TemplateViewItem*>(*pItemIter)->mnDocId;
}
}
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index f1439c378860..c87030cc2013 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -1343,8 +1343,7 @@ void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nMenuId)
{
// Move templates to desired folder if for some reason move fails
// try copying them.
- if (!maView->moveTemplates(maSelTemplates,nItemId,false) &&
- !maView->moveTemplates(maSelTemplates,nItemId,true))
+ if (!maView->moveTemplates(maSelTemplates,nItemId))
{
OUString aTemplateList;
@@ -1449,13 +1448,14 @@ void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
// Move templates to desired folder if for some reason move fails
// try copying them.
std::set<const ThumbnailViewItem*>::const_iterator aIter;
- for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
+ std::set<const ThumbnailViewItem*,selection_cmp_fn> aSelTemplates = maSelTemplates; //Copy to avoid invalidating an iterator
+
+ for (aIter = aSelTemplates.begin(); aIter != aSelTemplates.end(); ++aIter)
{
const TemplateSearchViewItem *pItem =
static_cast<const TemplateSearchViewItem*>(*aIter);
- if(!maView->moveTemplate(pItem,pItem->mnRegionId+1,nItemId,false)
- && !maView->moveTemplate(pItem,pItem->mnRegionId+1,nItemId,true))
+ if(!maView->moveTemplate(pItem,pItem->mnRegionId+1,nItemId))
{
if (aTemplateList.isEmpty())
aTemplateList = (*aIter)->maTitle;