Hi,
I have submitted a patch for review:
https://gerrit.libreoffice.org/3238
To pull it, you can do:
git pull ssh://gerrit.libreoffice.org:29418/core refs/changes/38/3238/1
Separate template region ids from thumbnail ids.
- Update all actions to use the new system.
Change-Id: I8aa09a3317eff4cb083c8fc151ea2f93a5a971fe
---
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 68b7dc7..6d6beb1 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 5a56645..2310060 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 8af4bcc..49aea81 100644
--- a/sfx2/source/control/templateabstractview.cxx
+++ b/sfx2/source/control/templateabstractview.cxx
@@ -382,7 +382,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 429b4dc..d435f3d 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)
@@ -667,7 +696,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 8b2840d..6c64662 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -899,6 +899,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 f993ecf..6951df3 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -921,7 +921,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)
@@ -1078,10 +1078,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
{
@@ -1136,11 +1138,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;
@@ -1149,12 +1151,6 @@
++pIter;
}
- }
-
- if (maSelFolders.empty())
- {
- mpViewBar->HideItem(TBI_TEMPLATE_IMPORT);
- mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
}
if (!aFolderList.isEmpty())
@@ -1348,7 +1344,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/3238
To unsubscribe, visit https://gerrit.libreoffice.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8aa09a3317eff4cb083c8fc151ea2f93a5a971fe
Gerrit-PatchSet: 1
Gerrit-Project: core
Gerrit-Branch: libreoffice-4-0
Gerrit-Owner: Rafael Dominguez <venccsralph@gmail.com>
Context
- [PATCH libreoffice-4-0] Separate template region ids from thumbnail ids. · Rafael Dominguez (via Code Review)
Privacy Policy |
Impressum (Legal Info) |
Copyright information: Unless otherwise specified, all text and images
on this website are licensed under the
Creative Commons Attribution-Share Alike 3.0 License.
This does not include the source code of LibreOffice, which is
licensed under the Mozilla Public License (
MPLv2).
"LibreOffice" and "The Document Foundation" are
registered trademarks of their corresponding registered owners or are
in actual use as trademarks in one or more countries. Their respective
logos and icons are also subject to international copyright laws. Use
thereof is explained in our
trademark policy.