Kaydet (Commit) 0b42f159 authored tarafından Rafael Dominguez's avatar Rafael Dominguez

Only store template data instead of a ThumbnailViewItem.

- Allocates less memory because we only store the important data.
- Fix a bug that makes the application crash while on debug mode
when a view gets destroyed and not all selection boxes have been released
before the window.

Change-Id: Idd5c11811278ed77268ce56350cfa75cdefaa483
üst 0e644201
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <set> #include <set>
#include <sfx2/templateproperties.hxx>
#include <sfx2/thumbnailview.hxx> #include <sfx2/thumbnailview.hxx>
class SfxDocumentTemplates; class SfxDocumentTemplates;
...@@ -49,8 +50,8 @@ public: ...@@ -49,8 +50,8 @@ public:
void filterTemplatesByApp (const FILTER_APPLICATION &eApp); void filterTemplatesByApp (const FILTER_APPLICATION &eApp);
std::vector<std::pair<sal_uInt16,std::vector<ThumbnailViewItem*> > > std::vector<TemplateItemProperties>
getFilteredItems (const boost::function<bool (const ThumbnailViewItem*) > &rFunc) const; getFilteredItems (const boost::function<bool (const TemplateItemProperties&) > &rFunc) const;
void sortOverlayItems (const boost::function<bool (const ThumbnailViewItem*, void sortOverlayItems (const boost::function<bool (const ThumbnailViewItem*,
const ThumbnailViewItem*) > &func); const ThumbnailViewItem*) > &func);
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#ifndef TEMPLATEFOLDERVIEWITEM_HXX #ifndef TEMPLATEFOLDERVIEWITEM_HXX
#define TEMPLATEFOLDERVIEWITEM_HXX #define TEMPLATEFOLDERVIEWITEM_HXX
#include <sfx2/templateproperties.hxx>
#include <sfx2/thumbnailviewitem.hxx> #include <sfx2/thumbnailviewitem.hxx>
class TemplateViewItem; class TemplateViewItem;
...@@ -19,7 +20,7 @@ class TemplateFolderViewItem : public ThumbnailViewItem ...@@ -19,7 +20,7 @@ class TemplateFolderViewItem : public ThumbnailViewItem
public: public:
BitmapEx maPreview2; BitmapEx maPreview2;
std::vector<TemplateViewItem*> maTemplates; std::vector<TemplateItemProperties> maTemplates;
TemplateFolderViewItem (ThumbnailView &rView, Window *pParent); TemplateFolderViewItem (ThumbnailView &rView, Window *pParent);
......
...@@ -6,10 +6,23 @@ ...@@ -6,10 +6,23 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. * file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/ */
...
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
#ifndef TEMPLATEPROPERTIES_HXX #ifndef __SFX2_TEMPLATEPROPERTIES_HXX__
#define TEMPLATEPROPERTIES_HXX #define __SFX2_TEMPLATEPROPERTIES_HXX__
#include <rtl/ustring.hxx>
#include <vcl/bitmapex.hxx>
struct TemplateItemProperties
{
sal_uInt16 nId;
sal_uInt16 nRegionId;
rtl::OUString aName;
rtl::OUString aPath;
rtl::OUString aType;
BitmapEx aThumbnail;
};
#endif // TEMPLATEPROPERTIES_HXX #endif // __SFX2_TEMPLATEPROPERTIES_HXX__
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#ifndef TEMPLATEVIEW_HXX #ifndef TEMPLATEVIEW_HXX
#define TEMPLATEVIEW_HXX #define TEMPLATEVIEW_HXX
#include <sfx2/templateproperties.hxx>
#include <sfx2/thumbnailview.hxx> #include <sfx2/thumbnailview.hxx>
#include <vcl/image.hxx> #include <vcl/image.hxx>
...@@ -33,7 +34,7 @@ public: ...@@ -33,7 +34,7 @@ public:
virtual void Paint (const Rectangle &rRect); virtual void Paint (const Rectangle &rRect);
void InsertItems (const std::vector<TemplateViewItem*> &rTemplates); void InsertItems (const std::vector<TemplateItemProperties> &rTemplates);
void setDblClickHdl (const Link &rLink) { maDblClickHdl = rLink; } void setDblClickHdl (const Link &rLink) { maDblClickHdl = rLink; }
......
...@@ -206,20 +206,18 @@ class FolderFilter_Application ...@@ -206,20 +206,18 @@ class FolderFilter_Application
{ {
public: public:
FolderFilter_Application ( SfxDocumentTemplates *pDocTemplates, FILTER_APPLICATION eApp) FolderFilter_Application (FILTER_APPLICATION eApp)
: meApp(eApp) : meApp(eApp)
{ {
maFilterFunc = ViewFilter_Application(pDocTemplates,eApp);
} }
bool operator () (const ThumbnailViewItem *pItem) bool operator () (const ThumbnailViewItem *pItem)
{ {
TemplateFolderViewItem *pFolderItem = (TemplateFolderViewItem*)pItem; TemplateFolderViewItem *pFolderItem = (TemplateFolderViewItem*)pItem;
std::vector<TemplateViewItem*> &rTemplates = pFolderItem->maTemplates; std::vector<TemplateItemProperties> &rTemplates = pFolderItem->maTemplates;
size_t nVisCount = 0; size_t nVisCount = 0;
ThumbnailViewItem *pTemplateItem;
// Clear thumbnails // Clear thumbnails
pFolderItem->maPreview1.Clear(); pFolderItem->maPreview1.Clear();
...@@ -227,27 +225,48 @@ public: ...@@ -227,27 +225,48 @@ public:
for (size_t i = 0, n = rTemplates.size(); i < n; ++i) for (size_t i = 0, n = rTemplates.size(); i < n; ++i)
{ {
pTemplateItem = rTemplates[i]; if (isValid(rTemplates[i].aType))
if (maFilterFunc(pTemplateItem))
{ {
++nVisCount; ++nVisCount;
// Update the thumbnails // Update the thumbnails
if (nVisCount == 1) if (nVisCount == 1)
pFolderItem->maPreview1 = pTemplateItem->maPreview1; pFolderItem->maPreview1 = rTemplates[i].aThumbnail;
else if (nVisCount == 2) else if (nVisCount == 2)
pFolderItem->maPreview2 = pTemplateItem->maPreview1; pFolderItem->maPreview2 = rTemplates[i].aThumbnail;
} }
} }
return nVisCount; return nVisCount;
} }
bool isValid (const rtl::OUString &rType) const
{
bool bRet = false;
if (meApp == FILTER_APP_WRITER)
{
bRet = rType == "OpenDocument Text" || rType == "OpenDocument Text Template";
}
else if (meApp == FILTER_APP_CALC)
{
bRet = rType == "OpenDocument Spreadsheet" || rType == "OpenDocument Spreadsheet Template";
}
else if (meApp == FILTER_APP_IMPRESS)
{
bRet = rType == "OpenDocument Presentation" || rType == "OpenDocument Presentation Template";
}
else if (meApp == FILTER_APP_DRAW)
{
bRet = rType == "OpenDocument Drawing" || rType == "OpenDocument Drawing Template";
}
return bRet;
}
private: private:
FILTER_APPLICATION meApp; FILTER_APPLICATION meApp;
boost::function<bool (const ThumbnailViewItem*)> maFilterFunc;
}; };
TemplateFolderView::TemplateFolderView ( Window* pParent, const ResId& rResId, bool bDisableTransientChildren) TemplateFolderView::TemplateFolderView ( Window* pParent, const ResId& rResId, bool bDisableTransientChildren)
...@@ -309,14 +328,15 @@ void TemplateFolderView::Populate () ...@@ -309,14 +328,15 @@ void TemplateFolderView::Populate ()
aName += "..."; aName += "...";
} }
TemplateViewItem *pTemplateItem = new TemplateViewItem(*mpItemView,mpItemView); TemplateItemProperties aProperties;;
pTemplateItem->mnId = j+1; aProperties.nId = j+1;
pTemplateItem->maText = aName; aProperties.nRegionId = i;
pTemplateItem->setPath(aURL); aProperties.aName = aName;
pTemplateItem->setFileType(aType); aProperties.aPath = aURL;
pTemplateItem->maPreview1 = lcl_fetchThumbnail(aURL,THUMBNAIL_MAX_WIDTH,THUMBNAIL_MAX_HEIGHT); aProperties.aType = aType;
aProperties.aThumbnail = lcl_fetchThumbnail(aURL,THUMBNAIL_MAX_WIDTH,THUMBNAIL_MAX_HEIGHT);
pItem->maTemplates.push_back(pTemplateItem); pItem->maTemplates.push_back(aProperties);
} }
lcl_updateThumbnails(pItem); lcl_updateThumbnails(pItem);
...@@ -357,7 +377,7 @@ void TemplateFolderView::showOverlay (bool bVisible) ...@@ -357,7 +377,7 @@ void TemplateFolderView::showOverlay (bool bVisible)
// Check if the folder view needs to be filtered // Check if the folder view needs to be filtered
if (mbFilteredResults) if (mbFilteredResults)
{ {
filterItems(FolderFilter_Application(mpDocTemplates,meFilterOption)); filterItems(FolderFilter_Application(meFilterOption));
mbFilteredResults = false; mbFilteredResults = false;
meFilterOption = FILTER_APP_NONE; meFilterOption = FILTER_APP_NONE;
...@@ -385,30 +405,24 @@ void TemplateFolderView::filterTemplatesByApp (const FILTER_APPLICATION &eApp) ...@@ -385,30 +405,24 @@ void TemplateFolderView::filterTemplatesByApp (const FILTER_APPLICATION &eApp)
} }
else else
{ {
filterItems(FolderFilter_Application(mpDocTemplates,eApp)); filterItems(FolderFilter_Application(eApp));
} }
} }
std::vector<std::pair<sal_uInt16,std::vector<ThumbnailViewItem*> > > std::vector<TemplateItemProperties>
TemplateFolderView::getFilteredItems(const boost::function<bool (const ThumbnailViewItem*) > &rFunc) const TemplateFolderView::getFilteredItems(const boost::function<bool (const TemplateItemProperties&) > &rFunc) const
{ {
std::vector<ThumbnailViewItem*> aRegionItems; std::vector<TemplateItemProperties> aItems;
std::vector<std::pair<sal_uInt16,std::vector<ThumbnailViewItem*> > > aItems;
for (size_t i = 0; i < mItemList.size(); ++i) for (size_t i = 0; i < mItemList.size(); ++i)
{ {
TemplateFolderViewItem *pFolderItem = static_cast<TemplateFolderViewItem*>(mItemList[i]); TemplateFolderViewItem *pFolderItem = static_cast<TemplateFolderViewItem*>(mItemList[i]);
sal_uInt16 nRegionId = pFolderItem->mnId-1;
for (size_t j = 0; j < pFolderItem->maTemplates.size(); ++j) for (size_t j = 0; j < pFolderItem->maTemplates.size(); ++j)
{ {
if (rFunc(pFolderItem->maTemplates[j])) if (rFunc(pFolderItem->maTemplates[j]))
aRegionItems.push_back(pFolderItem->maTemplates[j]); aItems.push_back(pFolderItem->maTemplates[j]);
} }
aItems.push_back(std::make_pair(nRegionId,aRegionItems));
aRegionItems.clear();
} }
return aItems; return aItems;
...@@ -465,13 +479,11 @@ bool TemplateFolderView::removeTemplate (const sal_uInt16 nItemId) ...@@ -465,13 +479,11 @@ bool TemplateFolderView::removeTemplate (const sal_uInt16 nItemId)
{ {
TemplateFolderViewItem *pItem = static_cast<TemplateFolderViewItem*>(mItemList[i]); TemplateFolderViewItem *pItem = static_cast<TemplateFolderViewItem*>(mItemList[i]);
std::vector<TemplateViewItem*>::iterator pIter; std::vector<TemplateItemProperties>::iterator pIter;
for (pIter = pItem->maTemplates.begin(); pIter != pItem->maTemplates.end(); ++pIter) for (pIter = pItem->maTemplates.begin(); pIter != pItem->maTemplates.end(); ++pIter)
{ {
if ((*pIter)->mnId == nItemId) if (pIter->nId == nItemId)
{ {
delete *pIter;
pItem->maTemplates.erase(pIter); pItem->maTemplates.erase(pIter);
mpItemView->RemoveItem(nItemId); mpItemView->RemoveItem(nItemId);
...@@ -536,26 +548,25 @@ bool TemplateFolderView::moveTemplates(std::set<const ThumbnailViewItem *> &rIte ...@@ -536,26 +548,25 @@ bool TemplateFolderView::moveTemplates(std::set<const ThumbnailViewItem *> &rIte
// move template to destination // move template to destination
TemplateViewItem *pTemplateItem = new TemplateViewItem(*mpItemView,mpItemView); TemplateItemProperties aTemplateItem;
pTemplateItem->mnId = nTargetIdx + 1; aTemplateItem.nId = nTargetIdx + 1;
pTemplateItem->maText = pViewItem->maText; aTemplateItem.nRegionId = nTargetRegion;
pTemplateItem->setPath(pViewItem->getPath()); aTemplateItem.aName = pViewItem->maText;
pTemplateItem->setFileType(pViewItem->getFileType()); aTemplateItem.aPath = pViewItem->getPath();
pTemplateItem->maPreview1 = pViewItem->maPreview1; aTemplateItem.aType = pViewItem->getFileType();
aTemplateItem.aThumbnail = pViewItem->maPreview1;
pTarget->maTemplates.push_back(pTemplateItem); pTarget->maTemplates.push_back(aTemplateItem);
if (!bCopy) if (!bCopy)
{ {
// remove template for overlay and from cached data // remove template from overlay and from cached data
std::vector<TemplateViewItem*>::iterator pIter; std::vector<TemplateItemProperties>::iterator pIter;
for (pIter = pSrc->maTemplates.begin(); pIter != pSrc->maTemplates.end(); ++pIter) for (pIter = pSrc->maTemplates.begin(); pIter != pSrc->maTemplates.end(); ++pIter)
{ {
if ((*pIter)->mnId == pViewItem->mnId) if (pIter->nId == pViewItem->mnId)
{ {
delete *pIter;
pSrc->maTemplates.erase(pIter); pSrc->maTemplates.erase(pIter);
mpItemView->RemoveItem(pViewItem->mnId); mpItemView->RemoveItem(pViewItem->mnId);
...@@ -595,14 +606,15 @@ void TemplateFolderView::copyFrom (TemplateFolderViewItem *pItem, const rtl::OUS ...@@ -595,14 +606,15 @@ void TemplateFolderView::copyFrom (TemplateFolderViewItem *pItem, const rtl::OUS
if (mpDocTemplates->CopyFrom(nRegionId,nId,aPath)) if (mpDocTemplates->CopyFrom(nRegionId,nId,aPath))
{ {
TemplateViewItem *pTemplate = new TemplateViewItem(*mpItemView,mpItemView); TemplateItemProperties aTemplate;
pTemplate->mnId = nId; aTemplate.nId = nId;
pTemplate->maText = mpDocTemplates->GetName(nRegionId,nId); aTemplate.nRegionId = nRegionId;
pTemplate->maPreview1 = lcl_fetchThumbnail(rPath,128,128); aTemplate.aName = mpDocTemplates->GetName(nRegionId,nId);
pTemplate->setPath(rPath); aTemplate.aThumbnail = lcl_fetchThumbnail(rPath,128,128);
pTemplate->setFileType(SvFileInformationManager::GetDescription(INetURLObject(rPath))); aTemplate.aPath = rPath;
aTemplate.aType = SvFileInformationManager::GetDescription(INetURLObject(rPath));
pItem->maTemplates.push_back(pTemplate); pItem->maTemplates.push_back(aTemplate);
lcl_updateThumbnails(pItem); lcl_updateThumbnails(pItem);
...@@ -691,13 +703,13 @@ void lcl_updateThumbnails (TemplateFolderViewItem *pItem) ...@@ -691,13 +703,13 @@ void lcl_updateThumbnails (TemplateFolderViewItem *pItem)
{ {
if (i == 0) if (i == 0)
{ {
pItem->maPreview1 = lcl_ScaleImg(pItem->maTemplates[i]->maPreview1, pItem->maPreview1 = lcl_ScaleImg(pItem->maTemplates[i].aThumbnail,
THUMBNAIL_MAX_WIDTH*0.75, THUMBNAIL_MAX_WIDTH*0.75,
THUMBNAIL_MAX_HEIGHT*0.75); THUMBNAIL_MAX_HEIGHT*0.75);
} }
else else
{ {
pItem->maPreview2 = lcl_ScaleImg(pItem->maTemplates[i]->maPreview1, pItem->maPreview2 = lcl_ScaleImg(pItem->maTemplates[i].aThumbnail,
THUMBNAIL_MAX_WIDTH*0.75, THUMBNAIL_MAX_WIDTH*0.75,
THUMBNAIL_MAX_HEIGHT*0.75); THUMBNAIL_MAX_HEIGHT*0.75);
} }
......
...@@ -32,8 +32,6 @@ TemplateFolderViewItem::TemplateFolderViewItem (ThumbnailView &rView, Window *pP ...@@ -32,8 +32,6 @@ TemplateFolderViewItem::TemplateFolderViewItem (ThumbnailView &rView, Window *pP
TemplateFolderViewItem::~TemplateFolderViewItem () TemplateFolderViewItem::~TemplateFolderViewItem ()
{ {
for (size_t i = 0; i < maTemplates.size(); ++i)
delete maTemplates[i];
} }
void TemplateFolderViewItem::calculateItemsPosition (sal_uInt32 nMaxTextLenght) void TemplateFolderViewItem::calculateItemsPosition (sal_uInt32 nMaxTextLenght)
......
...@@ -107,18 +107,18 @@ void TemplateView::Paint (const Rectangle &rRect) ...@@ -107,18 +107,18 @@ void TemplateView::Paint (const Rectangle &rRect)
mpProcessor->process(aSeq); mpProcessor->process(aSeq);
} }
void TemplateView::InsertItems (const std::vector<TemplateViewItem*> &rTemplates) void TemplateView::InsertItems (const std::vector<TemplateItemProperties> &rTemplates)
{ {
for (size_t i = 0, n = rTemplates.size(); i < n; ++i ) for (size_t i = 0, n = rTemplates.size(); i < n; ++i )
{ {
TemplateViewItem *pItem = new TemplateViewItem(*this,this); TemplateViewItem *pItem = new TemplateViewItem(*this,this);
TemplateViewItem *pCur = rTemplates[i]; const TemplateItemProperties *pCur = &rTemplates[i];
pItem->mnId = pCur->mnId; pItem->mnId = pCur->nId;
pItem->maText = pCur->maText; pItem->maText = pCur->aName;
pItem->setPath(pCur->getPath()); pItem->setPath(pCur->aPath);
pItem->setFileType(pCur->getFileType()); pItem->setFileType(pCur->aType);
pItem->maPreview1 = pCur->maPreview1; pItem->maPreview1 = pCur->aThumbnail;
pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnFolderSelected)); pItem->setSelectClickHdl(LINK(this,ThumbnailView,OnFolderSelected));
mItemList.push_back(pItem); mItemList.push_back(pItem);
......
...@@ -72,9 +72,9 @@ public: ...@@ -72,9 +72,9 @@ public:
: maKeyword(rKeyword) : maKeyword(rKeyword)
{} {}
bool operator() (const ThumbnailViewItem *pItem) bool operator() (const TemplateItemProperties &rItem)
{ {
return pItem->maText.indexOf(maKeyword) != -1; return rItem.aName.indexOf(maKeyword) != -1;
} }
private: private:
...@@ -575,25 +575,19 @@ IMPL_LINK_NOARG(SfxTemplateManagerDlg, SearchUpdateHdl) ...@@ -575,25 +575,19 @@ IMPL_LINK_NOARG(SfxTemplateManagerDlg, SearchUpdateHdl)
{ {
mpSearchView->Clear(); mpSearchView->Clear();
std::vector<std::pair<sal_uInt16,std::vector<ThumbnailViewItem*> > > aItems = std::vector<TemplateItemProperties> aItems =
maView->getFilteredItems(SearchView_Keyword(aKeyword)); maView->getFilteredItems(SearchView_Keyword(aKeyword));
size_t nCounter = 0; size_t nCounter = 0;
for (size_t i = 0; i < aItems.size(); ++i) for (size_t i = 0; i < aItems.size(); ++i)
{ {
sal_uInt16 nRegionId = aItems[i].first; TemplateItemProperties *pItem = &aItems[i];
std::vector<ThumbnailViewItem*> &rRegionItems = aItems[i].second;
for (size_t j = 0; j < rRegionItems.size(); ++j) mpSearchView->AppendItem(++nCounter,pItem->nRegionId,
{ pItem->nId-1,
TemplateViewItem *pItem = static_cast<TemplateViewItem*>(rRegionItems[j]); pItem->aName,
pItem->aPath,
mpSearchView->AppendItem(++nCounter,nRegionId, pItem->aThumbnail);
pItem->mnId-1,
pItem->maText,
pItem->getPath(),
pItem->maPreview1);
}
} }
mpSearchView->Invalidate(); mpSearchView->Invalidate();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment