[Libreoffice-commits] .: 21 commits - sfx2/inc sfx2/source

Rafael Dominguez rdominguez at kemper.freedesktop.org
Sun Jul 29 18:58:40 PDT 2012


 sfx2/inc/sfx2/templateabstractview.hxx       |   11 +
 sfx2/inc/sfx2/templatefolderview.hxx         |   13 -
 sfx2/inc/sfx2/thumbnailview.hxx              |    8 
 sfx2/inc/templatedlg.hxx                     |   18 +
 sfx2/source/control/templateabstractview.cxx |  143 +++++++++++++
 sfx2/source/control/templatefolderview.cxx   |  279 +++++++++++++--------------
 sfx2/source/control/templateonlineview.cxx   |   27 +-
 sfx2/source/control/templatesearchview.cxx   |   15 -
 sfx2/source/control/thumbnailview.cxx        |   16 +
 sfx2/source/doc/templatedlg.cxx              |  215 +++++++++++++++++---
 sfx2/source/inc/templatesearchviewitem.hxx   |   30 ++
 11 files changed, 564 insertions(+), 211 deletions(-)

New commits:
commit 6c0d0bc410b4c5b4c2c559bbe2247d4bbea610c0
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sun Jul 29 21:28:31 2012 -0430

    Import templates from a remote repository.
    
    Change-Id: I2a3420903b546cc6ead8dcdc6196b31fc2c1a24a

diff --git a/sfx2/inc/sfx2/templatefolderview.hxx b/sfx2/inc/sfx2/templatefolderview.hxx
index f6cb683..cc7f957 100644
--- a/sfx2/inc/sfx2/templatefolderview.hxx
+++ b/sfx2/inc/sfx2/templatefolderview.hxx
@@ -58,6 +58,9 @@ public:
 
     bool moveTemplates (std::set<const ThumbnailViewItem*> &rItems, const sal_uInt16 nTargetItem, bool bCopy);
 
+    void copyFrom (const sal_uInt16 nRegionItemId, const OUString &rName,
+                   const BitmapEx &rThumbnail, const OUString &rPath);
+
     void copyFrom (TemplateFolderViewItem *pItem, const rtl::OUString &rPath);
 
 private:
diff --git a/sfx2/inc/templatedlg.hxx b/sfx2/inc/templatedlg.hxx
index 607d394..bffc83b 100644
--- a/sfx2/inc/templatedlg.hxx
+++ b/sfx2/inc/templatedlg.hxx
@@ -89,6 +89,8 @@ private:
 
     void localMoveTo (sal_uInt16 nMenuId);
 
+    void remoteMoveTo (const sal_uInt16 nMenuId);
+
     /**
      *
      * Move search result templates stored in the filesystem to another folder.
diff --git a/sfx2/source/control/templatefolderview.cxx b/sfx2/source/control/templatefolderview.cxx
index c47b2ab..657e543 100644
--- a/sfx2/source/control/templatefolderview.cxx
+++ b/sfx2/source/control/templatefolderview.cxx
@@ -551,6 +551,44 @@ bool TemplateFolderView::moveTemplates(std::set<const ThumbnailViewItem *> &rIte
     return ret;
 }
 
+void TemplateFolderView::copyFrom(const sal_uInt16 nRegionItemId, const OUString &rName,
+                                  const BitmapEx &rThumbnail, const OUString &rPath)
+{
+    sal_uInt16 nId = 0;
+    sal_uInt16 nRegionId = nRegionItemId - 1;
+
+    if (!mItemList.empty())
+        nId = (mItemList.back())->mnId;
+
+    String aPath(rPath);
+
+    if (mpDocTemplates->CopyFrom(nRegionId,nId,aPath))
+    {
+        TemplateItemProperties aTemplate;
+        aTemplate.nId = nId+1;
+        aTemplate.nRegionId = nRegionId;
+        aTemplate.aName = aPath;
+        aTemplate.aThumbnail = rThumbnail;
+        aTemplate.aPath = mpDocTemplates->GetPath(nRegionId,nId);
+        aTemplate.aType = SvFileInformationManager::GetDescription(INetURLObject(aPath));
+
+        for (size_t i = 0, n = mItemList.size(); i < n; ++i)
+        {
+            if (mItemList[i]->mnId == nRegionItemId)
+            {
+                TemplateFolderViewItem *pItem =
+                        static_cast<TemplateFolderViewItem*>(mItemList[i]);
+
+                pItem->maTemplates.push_back(aTemplate);
+
+                lcl_updateThumbnails(pItem);
+            }
+        }
+
+        CalculateItemPositions();
+    }
+}
+
 void TemplateFolderView::copyFrom (TemplateFolderViewItem *pItem, const rtl::OUString &rPath)
 {
     sal_uInt16 nId = 0;
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index ea7b009..fffc400 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -552,6 +552,8 @@ IMPL_LINK(SfxTemplateManagerDlg, MoveMenuSelectHdl, Menu*, pMenu)
         // Check if we are displaying the local or remote templates
         if (mpCurView == maView)
             localMoveTo(nMenuId);
+        else
+            remoteMoveTo(nMenuId);
     }
 
     return 0;
@@ -915,6 +917,42 @@ void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nMenuId)
     }
 }
 
+void SfxTemplateManagerDlg::remoteMoveTo(const sal_uInt16 nMenuId)
+{
+    sal_uInt16 nItemId = 0;
+
+    if (nMenuId == MNI_MOVE_NEW)
+    {
+        InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
+
+        int ret = dlg.Execute();
+
+        if (ret)
+        {
+            rtl::OUString aName = dlg.getEntryText();
+
+            if (!aName.isEmpty())
+                nItemId = maView->createRegion(aName);
+        }
+    }
+    else
+    {
+        nItemId = maView->GetItemId(nMenuId-MNI_MOVE_FOLDER_BASE);
+    }
+
+    if (nItemId)
+    {
+        std::set<const ThumbnailViewItem*>::const_iterator aIter;
+        for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.end(); ++aIter)
+        {
+            const TemplateSearchViewItem *pItem =
+                    static_cast<const TemplateSearchViewItem*>(*aIter);
+
+            maView->copyFrom(nItemId,pItem->maTitle,pItem->maPreview1,pItem->getPath());
+        }
+    }
+}
+
 void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
 {
     sal_uInt16 nItemId = 0;
commit a2a041a0a1b1d00229c25e16d07e39b0e32bec86
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sun Jul 29 19:37:54 2012 -0430

    Track overlay item state for online view.
    
    Change-Id: Iad58a4f6dd7dec034359e4b29b00fa9531a8b7ec

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 3109d9c..ea7b009 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -200,6 +200,7 @@ SfxTemplateManagerDlg::SfxTemplateManagerDlg (Window *parent)
                                     ITEM_MAX_HEIGHT-THUMBNAIL_MAX_HEIGHT,
                                     ITEM_PADDING);
 
+    mpOnlineView->setOverlayItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVTemplateStateHdl));
     mpOnlineView->setOverlayDblClickHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
     mpOnlineView->setOverlayCloseHdl(LINK(this,SfxTemplateManagerDlg,CloseOverlayHdl));
 
commit 2f14792a4d1788fb1d63acacf1d037389c2d6f98
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sun Jul 29 19:13:14 2012 -0430

    Move setting overlay item state handler to TemplateAbstractView.
    
    - Rename method to a more descriptive name.
    
    Change-Id: Ib8fc988209ed6bf1453f3ef6784cae865caf2fe0

diff --git a/sfx2/inc/sfx2/templateabstractview.hxx b/sfx2/inc/sfx2/templateabstractview.hxx
index 24ca449..74dcd8a 100644
--- a/sfx2/inc/sfx2/templateabstractview.hxx
+++ b/sfx2/inc/sfx2/templateabstractview.hxx
@@ -37,6 +37,8 @@ public:
     void sortOverlayItems (const boost::function<bool (const ThumbnailViewItem*,
                                                        const ThumbnailViewItem*) > &func);
 
+    void setOverlayItemStateHdl (const Link &aLink) { maOverlayItemStateHdl = aLink; }
+
     void setOverlayDblClickHdl (const Link &rLink);
 
     void setOverlayCloseHdl (const Link &rLink);
@@ -49,9 +51,12 @@ protected:
 
     virtual void OnSelectionMode (bool bMode);
 
+    DECL_LINK(OverlayItemStateHdl, const ThumbnailViewItem*);
+
 protected:
 
     TemplateView *mpItemView;
+    Link maOverlayItemStateHdl;
 };
 
 #endif // __SFX2_TEMPLATEABSTRACTVIEW_HXX__
diff --git a/sfx2/inc/sfx2/templatefolderview.hxx b/sfx2/inc/sfx2/templatefolderview.hxx
index 5d23b9f..f6cb683 100644
--- a/sfx2/inc/sfx2/templatefolderview.hxx
+++ b/sfx2/inc/sfx2/templatefolderview.hxx
@@ -47,8 +47,6 @@ public:
     std::vector<TemplateItemProperties>
         getFilteredItems (const boost::function<bool (const TemplateItemProperties&) > &rFunc) const;
 
-    void setTemplateStateHdl (const Link &aLink) { maTemplateStateHdl = aLink; }
-
     sal_uInt16 createRegion (const rtl::OUString &rName);
 
     bool removeRegion (const sal_uInt16 nItemId);
@@ -68,8 +66,6 @@ private:
 
     virtual void OnItemDblClicked (ThumbnailViewItem *pRegionItem);
 
-    DECL_LINK(TVTemplateStateHdl, const ThumbnailViewItem*);
-
     DECL_LINK(ChangeNameHdl, TemplateView*);
 
 private:
@@ -77,7 +73,6 @@ private:
     bool mbFilteredResults;     // Flag keep track if overlay has been filtered so folders can get filtered too afterwards
     FILTER_APPLICATION meFilterOption;
     SfxDocumentTemplates *mpDocTemplates;
-    Link maTemplateStateHdl;
 };
 
 #endif // TEMPLATEFOLDERVIEW_HXX
diff --git a/sfx2/source/control/templateabstractview.cxx b/sfx2/source/control/templateabstractview.cxx
index 940874b..8f8d78b 100644
--- a/sfx2/source/control/templateabstractview.cxx
+++ b/sfx2/source/control/templateabstractview.cxx
@@ -24,12 +24,14 @@ TemplateAbstractView::TemplateAbstractView (Window *pParent, WinBits nWinStyle,
     : ThumbnailView(pParent,nWinStyle,bDisableTransientChildren),
       mpItemView(new TemplateView(this))
 {
+    mpItemView->setItemStateHdl(LINK(this,TemplateAbstractView,OverlayItemStateHdl));
 }
 
 TemplateAbstractView::TemplateAbstractView(Window *pParent, const ResId &rResId, bool bDisableTransientChildren)
     : ThumbnailView(pParent,rResId,bDisableTransientChildren),
       mpItemView(new TemplateView(this))
 {
+    mpItemView->setItemStateHdl(LINK(this,TemplateAbstractView,OverlayItemStateHdl));
 }
 
 TemplateAbstractView::~TemplateAbstractView ()
@@ -195,4 +197,10 @@ void TemplateAbstractView::OnSelectionMode (bool bMode)
         ThumbnailView::OnSelectionMode(bMode);
 }
 
+IMPL_LINK(TemplateAbstractView, OverlayItemStateHdl, const ThumbnailViewItem*, pItem)
+{
+    maOverlayItemStateHdl.Call((void*)pItem);
+    return 0;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sfx2/source/control/templatefolderview.cxx b/sfx2/source/control/templatefolderview.cxx
index c9f53b1..c47b2ab 100644
--- a/sfx2/source/control/templatefolderview.cxx
+++ b/sfx2/source/control/templatefolderview.cxx
@@ -163,7 +163,6 @@ TemplateFolderView::TemplateFolderView ( Window* pParent, const ResId& rResId, b
                                   ITEM_MAX_HEIGHT-THUMBNAIL_MAX_HEIGHT,
                                   ITEM_PADDING);
 
-    mpItemView->setItemStateHdl(LINK(this,TemplateFolderView,TVTemplateStateHdl));
     mpItemView->setChangeNameHdl(LINK(this,TemplateFolderView,ChangeNameHdl));
 }
 
@@ -609,12 +608,6 @@ void TemplateFolderView::OnItemDblClicked (ThumbnailViewItem *pRegionItem)
     mpItemView->Show();
 }
 
-IMPL_LINK(TemplateFolderView, TVTemplateStateHdl, const ThumbnailViewItem*, pItem)
-{
-    maTemplateStateHdl.Call((void*)pItem);
-    return 0;
-}
-
 IMPL_LINK(TemplateFolderView, ChangeNameHdl, TemplateView*, pView)
 {
     sal_uInt16 nRegionId = pView->getId();
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index b977342..3109d9c 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -188,7 +188,7 @@ SfxTemplateManagerDlg::SfxTemplateManagerDlg (Window *parent)
                               ITEM_PADDING);
 
     maView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVFolderStateHdl));
-    maView->setTemplateStateHdl(LINK(this,SfxTemplateManagerDlg,TVTemplateStateHdl));
+    maView->setOverlayItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVTemplateStateHdl));
     maView->setOverlayDblClickHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
     maView->setOverlayCloseHdl(LINK(this,SfxTemplateManagerDlg,CloseOverlayHdl));
 
commit 39089e15739eb4de2f055e220976ea501a624e3e
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sun Jul 29 16:10:25 2012 -0430

    Fetch thumbnails for templates in a remote repository.
    
    Change-Id: I1e2cdfcd7a98a798fde22722e8bba0a1ad8b3cd3

diff --git a/sfx2/source/control/templateonlineview.cxx b/sfx2/source/control/templateonlineview.cxx
index a7e1c99..2d6c75d 100644
--- a/sfx2/source/control/templateonlineview.cxx
+++ b/sfx2/source/control/templateonlineview.cxx
@@ -26,6 +26,13 @@
 #include <com/sun/star/ucb/XContentAccess.hpp>
 #include <com/sun/star/ucb/XDynamicResultSet.hpp>
 
+#define ITEM_MAX_WIDTH 192
+#define ITEM_MAX_HEIGHT 192
+#define ITEM_PADDING 5
+#define ITEM_SPACE 20
+#define THUMBNAIL_MAX_HEIGHT 128 - 2*ITEM_PADDING
+#define THUMBNAIL_MAX_WIDTH ITEM_MAX_WIDTH - 2*ITEM_PADDING
+
 using namespace com::sun::star;
 using namespace com::sun::star::lang;
 using namespace com::sun::star::task;
@@ -176,6 +183,9 @@ void TemplateOnlineView::OnItemDblClicked(ThumbnailViewItem *pItem)
                     aTemplateItem.nId = nIdx+1;
                     aTemplateItem.nRegionId = pItem->mnId-1;
                     aTemplateItem.aPath = sRealURL;
+                    aTemplateItem.aThumbnail = TemplateAbstractView::fetchThumbnail(sRealURL,
+                                                                                    THUMBNAIL_MAX_WIDTH,
+                                                                                    THUMBNAIL_MAX_HEIGHT);
 //                    pData->mbIsRemote = xRow->getBoolean( ROW_IS_REMOTE ) && !xRow->wasNull();
 //                    pData->mbIsRemoveable = xRow->getBoolean( ROW_IS_REMOVEABLE ) && !xRow->wasNull();
                     aTemplateItem.aName = xRow->getString( ROW_TITLE );
commit 76b7f976e4020b90ef5be7151944dd98abd927d7
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sun Jul 29 15:43:18 2012 -0430

    Move fetching thumbnail functions to TemplateAbstractView.
    
    - Reallocate lcl_ScaleImg and lcl_fetchThumbnail to be available for
    other classes to use them.
    - Mark this functions as static public.
    
    Change-Id: Ia64a1bad76d7d47519f50e144daa6ea78dfa0e59

diff --git a/sfx2/inc/sfx2/templateabstractview.hxx b/sfx2/inc/sfx2/templateabstractview.hxx
index 8bb6426..24ca449 100644
--- a/sfx2/inc/sfx2/templateabstractview.hxx
+++ b/sfx2/inc/sfx2/templateabstractview.hxx
@@ -41,6 +41,10 @@ public:
 
     void setOverlayCloseHdl (const Link &rLink);
 
+    static BitmapEx scaleImg (const BitmapEx &rImg, long width, long height);
+
+    static BitmapEx fetchThumbnail (const rtl::OUString &msURL, long width, long height);
+
 protected:
 
     virtual void OnSelectionMode (bool bMode);
diff --git a/sfx2/source/control/templateabstractview.cxx b/sfx2/source/control/templateabstractview.cxx
index 28a78b6..940874b 100644
--- a/sfx2/source/control/templateabstractview.cxx
+++ b/sfx2/source/control/templateabstractview.cxx
@@ -9,7 +9,16 @@
 
 #include <sfx2/templateabstractview.hxx>
 
+#include <comphelper/processfactory.hxx>
 #include <sfx2/templateview.hxx>
+#include <unotools/ucbstreamhelper.hxx>
+#include <vcl/pngread.hxx>
+
+#include <com/sun/star/embed/ElementModes.hpp>
+#include <com/sun/star/embed/XStorage.hpp>
+#include <com/sun/star/lang/XComponent.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/lang/XSingleServiceFactory.hpp>
 
 TemplateAbstractView::TemplateAbstractView (Window *pParent, WinBits nWinStyle, bool bDisableTransientChildren)
     : ThumbnailView(pParent,nWinStyle,bDisableTransientChildren),
@@ -54,6 +63,127 @@ void TemplateAbstractView::setOverlayCloseHdl(const Link &rLink)
     mpItemView->setCloseHdl(rLink);
 }
 
+BitmapEx TemplateAbstractView::scaleImg (const BitmapEx &rImg, long width, long height)
+{
+    BitmapEx aImg = rImg;
+
+    int sWidth = std::min(aImg.GetSizePixel().getWidth(),width);
+    int sHeight = std::min(aImg.GetSizePixel().getHeight(),height);
+
+    aImg.Scale(Size(sWidth,sHeight),BMP_SCALE_INTERPOLATE);
+
+    return aImg;
+}
+
+BitmapEx TemplateAbstractView::fetchThumbnail (const rtl::OUString &msURL, long width, long height)
+{
+    using namespace ::com::sun::star;
+    using namespace ::com::sun::star::uno;
+
+    // Load the thumbnail from a template document.
+    uno::Reference<io::XInputStream> xIStream;
+
+    uno::Reference< lang::XMultiServiceFactory > xServiceManager (comphelper::getProcessServiceFactory());
+
+    if (xServiceManager.is())
+    {
+        try
+        {
+            uno::Reference<lang::XSingleServiceFactory> xStorageFactory(
+                xServiceManager->createInstance( "com.sun.star.embed.StorageFactory"),
+                uno::UNO_QUERY);
+
+            if (xStorageFactory.is())
+            {
+                uno::Sequence<uno::Any> aArgs (2);
+                aArgs[0] <<= msURL;
+                aArgs[1] <<= embed::ElementModes::READ;
+                uno::Reference<embed::XStorage> xDocStorage (
+                    xStorageFactory->createInstanceWithArguments(aArgs),
+                    uno::UNO_QUERY);
+
+                try
+                {
+                    if (xDocStorage.is())
+                    {
+                        uno::Reference<embed::XStorage> xStorage (
+                            xDocStorage->openStorageElement(
+                                "Thumbnails",
+                                embed::ElementModes::READ));
+                        if (xStorage.is())
+                        {
+                            uno::Reference<io::XStream> xThumbnailCopy (
+                                xStorage->cloneStreamElement("thumbnail.png"));
+                            if (xThumbnailCopy.is())
+                                xIStream = xThumbnailCopy->getInputStream();
+                        }
+                    }
+                }
+                catch (const uno::Exception& rException)
+                {
+                    OSL_TRACE (
+                        "caught exception while trying to access Thumbnail/thumbnail.png of %s: %s",
+                        ::rtl::OUStringToOString(msURL,
+                            RTL_TEXTENCODING_UTF8).getStr(),
+                        ::rtl::OUStringToOString(rException.Message,
+                            RTL_TEXTENCODING_UTF8).getStr());
+                }
+
+                try
+                {
+                    // An (older) implementation had a bug - The storage
+                    // name was "Thumbnail" instead of "Thumbnails".  The
+                    // old name is still used as fallback but this code can
+                    // be removed soon.
+                    if ( ! xIStream.is())
+                    {
+                        uno::Reference<embed::XStorage> xStorage (
+                            xDocStorage->openStorageElement( "Thumbnail",
+                                embed::ElementModes::READ));
+                        if (xStorage.is())
+                        {
+                            uno::Reference<io::XStream> xThumbnailCopy (
+                                xStorage->cloneStreamElement("thumbnail.png"));
+                            if (xThumbnailCopy.is())
+                                xIStream = xThumbnailCopy->getInputStream();
+                        }
+                    }
+                }
+                catch (const uno::Exception& rException)
+                {
+                    OSL_TRACE (
+                        "caught exception while trying to access Thumbnails/thumbnail.png of %s: %s",
+                        ::rtl::OUStringToOString(msURL,
+                            RTL_TEXTENCODING_UTF8).getStr(),
+                        ::rtl::OUStringToOString(rException.Message,
+                            RTL_TEXTENCODING_UTF8).getStr());
+                }
+            }
+        }
+        catch (const uno::Exception& rException)
+        {
+            OSL_TRACE (
+                "caught exception while trying to access tuhmbnail of %s: %s",
+                ::rtl::OUStringToOString(msURL,
+                    RTL_TEXTENCODING_UTF8).getStr(),
+                ::rtl::OUStringToOString(rException.Message,
+                    RTL_TEXTENCODING_UTF8).getStr());
+        }
+    }
+
+    // Extract the image from the stream.
+    BitmapEx aThumbnail;
+    if (xIStream.is())
+    {
+        ::std::auto_ptr<SvStream> pStream (
+            ::utl::UcbStreamHelper::CreateStream (xIStream));
+        ::vcl::PNGReader aReader (*pStream);
+        aThumbnail = aReader.Read ();
+    }
+
+    return TemplateAbstractView::scaleImg(aThumbnail,width,height);
+}
+
 void TemplateAbstractView::OnSelectionMode (bool bMode)
 {
     if (mpItemView->IsVisible())
diff --git a/sfx2/source/control/templatefolderview.cxx b/sfx2/source/control/templatefolderview.cxx
index 5521962..c9f53b1 100644
--- a/sfx2/source/control/templatefolderview.cxx
+++ b/sfx2/source/control/templatefolderview.cxx
@@ -38,127 +38,6 @@
 
 void lcl_updateThumbnails (TemplateFolderViewItem *pItem);
 
-BitmapEx lcl_ScaleImg (const BitmapEx &rImg, long width, long height)
-{
-    BitmapEx aImg = rImg;
-
-    int sWidth = std::min(aImg.GetSizePixel().getWidth(),width);
-    int sHeight = std::min(aImg.GetSizePixel().getHeight(),height);
-
-    aImg.Scale(Size(sWidth,sHeight),BMP_SCALE_INTERPOLATE);
-
-    return aImg;
-}
-
-BitmapEx lcl_fetchThumbnail (const rtl::OUString &msURL, long width, long height)
-{
-    using namespace ::com::sun::star;
-    using namespace ::com::sun::star::uno;
-
-    // Load the thumbnail from a template document.
-    uno::Reference<io::XInputStream> xIStream;
-
-    uno::Reference< lang::XMultiServiceFactory > xServiceManager (
-        ::comphelper::getProcessServiceFactory());
-    if (xServiceManager.is())
-    {
-        try
-        {
-            uno::Reference<lang::XSingleServiceFactory> xStorageFactory(
-                xServiceManager->createInstance( "com.sun.star.embed.StorageFactory"),
-                uno::UNO_QUERY);
-
-            if (xStorageFactory.is())
-            {
-                uno::Sequence<uno::Any> aArgs (2);
-                aArgs[0] <<= msURL;
-                aArgs[1] <<= embed::ElementModes::READ;
-                uno::Reference<embed::XStorage> xDocStorage (
-                    xStorageFactory->createInstanceWithArguments(aArgs),
-                    uno::UNO_QUERY);
-
-                try
-                {
-                    if (xDocStorage.is())
-                    {
-                        uno::Reference<embed::XStorage> xStorage (
-                            xDocStorage->openStorageElement(
-                                "Thumbnails",
-                                embed::ElementModes::READ));
-                        if (xStorage.is())
-                        {
-                            uno::Reference<io::XStream> xThumbnailCopy (
-                                xStorage->cloneStreamElement("thumbnail.png"));
-                            if (xThumbnailCopy.is())
-                                xIStream = xThumbnailCopy->getInputStream();
-                        }
-                    }
-                }
-                catch (const uno::Exception& rException)
-                {
-                    OSL_TRACE (
-                        "caught exception while trying to access Thumbnail/thumbnail.png of %s: %s",
-                        ::rtl::OUStringToOString(msURL,
-                            RTL_TEXTENCODING_UTF8).getStr(),
-                        ::rtl::OUStringToOString(rException.Message,
-                            RTL_TEXTENCODING_UTF8).getStr());
-                }
-
-                try
-                {
-                    // An (older) implementation had a bug - The storage
-                    // name was "Thumbnail" instead of "Thumbnails".  The
-                    // old name is still used as fallback but this code can
-                    // be removed soon.
-                    if ( ! xIStream.is())
-                    {
-                        uno::Reference<embed::XStorage> xStorage (
-                            xDocStorage->openStorageElement( "Thumbnail",
-                                embed::ElementModes::READ));
-                        if (xStorage.is())
-                        {
-                            uno::Reference<io::XStream> xThumbnailCopy (
-                                xStorage->cloneStreamElement("thumbnail.png"));
-                            if (xThumbnailCopy.is())
-                                xIStream = xThumbnailCopy->getInputStream();
-                        }
-                    }
-                }
-                catch (const uno::Exception& rException)
-                {
-                    OSL_TRACE (
-                        "caught exception while trying to access Thumbnails/thumbnail.png of %s: %s",
-                        ::rtl::OUStringToOString(msURL,
-                            RTL_TEXTENCODING_UTF8).getStr(),
-                        ::rtl::OUStringToOString(rException.Message,
-                            RTL_TEXTENCODING_UTF8).getStr());
-                }
-            }
-        }
-        catch (const uno::Exception& rException)
-        {
-            OSL_TRACE (
-                "caught exception while trying to access tuhmbnail of %s: %s",
-                ::rtl::OUStringToOString(msURL,
-                    RTL_TEXTENCODING_UTF8).getStr(),
-                ::rtl::OUStringToOString(rException.Message,
-                    RTL_TEXTENCODING_UTF8).getStr());
-        }
-    }
-
-    // Extract the image from the stream.
-    BitmapEx aThumbnail;
-    if (xIStream.is())
-    {
-        ::std::auto_ptr<SvStream> pStream (
-            ::utl::UcbStreamHelper::CreateStream (xIStream));
-        ::vcl::PNGReader aReader (*pStream);
-        aThumbnail = aReader.Read ();
-    }
-
-    return lcl_ScaleImg(aThumbnail,width,height);
-}
-
 // Display template items depending on the generator application
 class ViewFilter_Application
 {
@@ -331,7 +210,7 @@ void TemplateFolderView::Populate ()
             aProperties.aName = aName;
             aProperties.aPath = aURL;
             aProperties.aType = aType;
-            aProperties.aThumbnail = lcl_fetchThumbnail(aURL,THUMBNAIL_MAX_WIDTH,THUMBNAIL_MAX_HEIGHT);
+            aProperties.aThumbnail = TemplateAbstractView::fetchThumbnail(aURL,THUMBNAIL_MAX_WIDTH,THUMBNAIL_MAX_HEIGHT);
 
             pItem->maTemplates.push_back(aProperties);
         }
@@ -688,7 +567,7 @@ void TemplateFolderView::copyFrom (TemplateFolderViewItem *pItem, const rtl::OUS
         aTemplate.nId = nId;
         aTemplate.nRegionId = nRegionId;
         aTemplate.aName = mpDocTemplates->GetName(nRegionId,nId);
-        aTemplate.aThumbnail = lcl_fetchThumbnail(rPath,128,128);
+        aTemplate.aThumbnail = TemplateAbstractView::fetchThumbnail(rPath,128,128);
         aTemplate.aPath = rPath;
         aTemplate.aType = SvFileInformationManager::GetDescription(INetURLObject(rPath));
 
@@ -765,15 +644,15 @@ void lcl_updateThumbnails (TemplateFolderViewItem *pItem)
     {
         if (i == 0)
         {
-            pItem->maPreview1 = lcl_ScaleImg(pItem->maTemplates[i].aThumbnail,
-                                            THUMBNAIL_MAX_WIDTH*0.75,
-                                            THUMBNAIL_MAX_HEIGHT*0.75);
+            pItem->maPreview1 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
+                                                               THUMBNAIL_MAX_WIDTH*0.75,
+                                                               THUMBNAIL_MAX_HEIGHT*0.75);
         }
         else
         {
-            pItem->maPreview2 = lcl_ScaleImg(pItem->maTemplates[i].aThumbnail,
-                                            THUMBNAIL_MAX_WIDTH*0.75,
-                                            THUMBNAIL_MAX_HEIGHT*0.75);
+            pItem->maPreview2 = TemplateAbstractView::scaleImg(pItem->maTemplates[i].aThumbnail,
+                                                               THUMBNAIL_MAX_WIDTH*0.75,
+                                                               THUMBNAIL_MAX_HEIGHT*0.75);
         }
     }
 }
commit 724d575e79797bb2b734d39f91ae5e2806f2e528
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sun Jul 29 14:39:45 2012 -0430

    Open remote templates when double clicking in the thumbnail.
    
    Change-Id: I74dfd2b9c117e577e777e8e5defa6f2964d97292

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 1256fdf..b977342 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -200,6 +200,7 @@ SfxTemplateManagerDlg::SfxTemplateManagerDlg (Window *parent)
                                     ITEM_MAX_HEIGHT-THUMBNAIL_MAX_HEIGHT,
                                     ITEM_PADDING);
 
+    mpOnlineView->setOverlayDblClickHdl(LINK(this,SfxTemplateManagerDlg,OpenTemplateHdl));
     mpOnlineView->setOverlayCloseHdl(LINK(this,SfxTemplateManagerDlg,CloseOverlayHdl));
 
     mpSearchView->SetSizePixel(aThumbSize);
commit 3d05b0c22708bdb876e45e344cad8cf5a6b71b7b
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sun Jul 29 14:28:11 2012 -0430

    Fetch only documents.
    
    Change-Id: If775f159ba94d364f28c675a9493fd3c19d4a2e9

diff --git a/sfx2/source/control/templateonlineview.cxx b/sfx2/source/control/templateonlineview.cxx
index a776515..a7e1c99 100644
--- a/sfx2/source/control/templateonlineview.cxx
+++ b/sfx2/source/control/templateonlineview.cxx
@@ -39,7 +39,6 @@ enum
     ROW_SIZE,
     ROW_DATE_MOD,
     ROW_DATE_CREATE,
-    ROW_IS_DOCUMENT,
     ROW_TARGET_URL,
     ROW_IS_HIDDEN,
     ROW_IS_REMOTE,
@@ -120,24 +119,23 @@ void TemplateOnlineView::OnItemDblClicked(ThumbnailViewItem *pItem)
     try
     {
 
-        uno::Sequence< rtl::OUString > aProps(9);
+        uno::Sequence< rtl::OUString > aProps(8);
 
         aProps[0] = "Title";
         aProps[1] = "Size";
         aProps[2] = "DateModified";
         aProps[3] = "DateCreated";
-        aProps[4] = "IsDocument";
-        aProps[5] = "TargetURL";
-        aProps[6] = "IsHidden";
-        aProps[7] = "IsRemote";
-        aProps[8] = "IsRemoveable";
+        aProps[4] = "TargetURL";
+        aProps[5] = "IsHidden";
+        aProps[6] = "IsRemote";
+        aProps[7] = "IsRemoveable";
 
         ucbhelper::Content aContent(aURL,m_xCmdEnv);
 
         uno::Reference< XResultSet > xResultSet;
         uno::Reference< XDynamicResultSet > xDynResultSet;
 
-        ucbhelper::ResultSetInclude eInclude = ucbhelper::INCLUDE_FOLDERS_AND_DOCUMENTS;
+        ucbhelper::ResultSetInclude eInclude = ucbhelper::INCLUDE_DOCUMENTS_ONLY;
         xDynResultSet = aContent.createDynamicCursor( aProps, eInclude );
 
         if ( xDynResultSet.is() )
@@ -154,11 +152,10 @@ void TemplateOnlineView::OnItemDblClicked(ThumbnailViewItem *pItem)
             sal_uInt16 nIdx = 0;
             while ( xResultSet->next() )
             {
-                bool bIsDocument = xRow->getBoolean( ROW_IS_DOCUMENT ) && !xRow->wasNull();
                 bool bIsHidden = xRow->getBoolean( ROW_IS_HIDDEN );
 
                 // don't show hidden files or anything besides documents
-                if ( bIsDocument && (!bIsHidden || xRow->wasNull()) )
+                if ( !bIsHidden || xRow->wasNull() )
                 {
                     aDT = xRow->getTimestamp( ROW_DATE_MOD );
                     bool bContainsDate = !xRow->wasNull();
commit 3390725129eb694cb42e99086b90f34c8aa0e14d
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 23:07:55 2012 -0430

    Close dialog after opening a template to edit it.
    
    Change-Id: I9d2aaddb6aece8db87d82d4a889be8e545303dd3

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 41edc77..1256fdf 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -757,6 +757,8 @@ void SfxTemplateManagerDlg::OnTemplateEdit ()
         {
         }
     }
+
+    Close();
 }
 
 void SfxTemplateManagerDlg::OnTemplateProperties ()
commit 194429cea1f55f385de9b1ad8793fb1688e71670
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 23:04:50 2012 -0430

    Hide folder actions is all selected folders were deleted.
    
    Change-Id: Id9056cbed6f2b3a28a8008a58a7b94a70f1916fc

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 118e063..41edc77 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -815,6 +815,12 @@ void SfxTemplateManagerDlg::OnFolderDelete()
         else
             ++pIter;
     }
+
+    if (maSelFolders.empty())
+    {
+        mpViewBar->EnableItem(TBI_TEMPLATE_IMPORT,false);
+        mpViewBar->HideItem(TBI_TEMPLATE_FOLDER_DEL);
+    }
 }
 
 void SfxTemplateManagerDlg::centerTopButtons()
commit 3187312a1e2de62fde48e600c97ad891bbf82c5d
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 22:36:17 2012 -0430

    Erase templates selected in the search view.
    
    Change-Id: I3c1035d061ec6c3e7430a1703d6873dc6d2b1d33

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index bdf48b3..118e063 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -765,13 +765,43 @@ void SfxTemplateManagerDlg::OnTemplateProperties ()
 
 void SfxTemplateManagerDlg::OnTemplateDelete ()
 {
-    std::set<const ThumbnailViewItem*>::const_iterator pIter;
-    for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end();)
+    if (mpSearchView->IsVisible())
     {
-        if (maView->removeTemplate((*pIter)->mnId,maView->getOverlayRegionId()+1))
-            maSelTemplates.erase(pIter++);
-        else
-            ++pIter;
+        std::set<const ThumbnailViewItem*>::const_iterator pIter;
+        for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end();)
+        {
+            const TemplateSearchViewItem *pItem =
+                    static_cast<const TemplateSearchViewItem*>(*pIter);
+
+            sal_uInt16 nItemId = pItem->mnIdx + 1;
+            sal_uInt16 nItemRegionId = pItem->mnRegionId + 1;
+
+            if (maView->removeTemplate(nItemId,nItemRegionId))
+                maSelTemplates.erase(pIter++);
+            else
+                ++pIter;
+        }
+
+        // Update search results
+        if (maSelTemplates.empty())
+        {
+            mpTemplateBar->Show(false);
+            mpViewBar->Show();
+            mpActionBar->Show();
+        }
+
+        SearchUpdateHdl(mpSearchEdit);
+    }
+    else
+    {
+        std::set<const ThumbnailViewItem*>::const_iterator pIter;
+        for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end();)
+        {
+            if (maView->removeTemplate((*pIter)->mnId,maView->getOverlayRegionId()+1))
+                maSelTemplates.erase(pIter++);
+            else
+                ++pIter;
+        }
     }
 }
 
commit 29536cbd49c4bb51cb668f8f2ce45365b29d8333
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 22:28:59 2012 -0430

    Add template region source as an argument to removeTemplate method.
    
    - Update OnTemplateDelete to reflect changes.
    
    Change-Id: Idd8f39d490168c5c826b0c917c8e0c3e3b78c694

diff --git a/sfx2/inc/sfx2/templatefolderview.hxx b/sfx2/inc/sfx2/templatefolderview.hxx
index e11d524..5d23b9f 100644
--- a/sfx2/inc/sfx2/templatefolderview.hxx
+++ b/sfx2/inc/sfx2/templatefolderview.hxx
@@ -53,7 +53,7 @@ public:
 
     bool removeRegion (const sal_uInt16 nItemId);
 
-    bool removeTemplate (const sal_uInt16 nItemId);
+    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);
diff --git a/sfx2/source/control/templatefolderview.cxx b/sfx2/source/control/templatefolderview.cxx
index 117899f..5521962 100644
--- a/sfx2/source/control/templatefolderview.cxx
+++ b/sfx2/source/control/templatefolderview.cxx
@@ -457,10 +457,9 @@ bool TemplateFolderView::removeRegion(const sal_uInt16 nItemId)
     return true;
 }
 
-bool TemplateFolderView::removeTemplate (const sal_uInt16 nItemId)
+bool TemplateFolderView::removeTemplate (const sal_uInt16 nItemId, const sal_uInt16 nSrcItemId)
 {
-    sal_uInt16 nRegionId = mpItemView->getId();
-    sal_uInt16 nItemRegionId = nRegionId + 1;
+    sal_uInt16 nRegionId = nSrcItemId - 1;
     sal_uInt16 nTemplateId = nItemId - 1;
 
     if (!mpDocTemplates->Delete(nRegionId,nTemplateId))
@@ -468,7 +467,7 @@ bool TemplateFolderView::removeTemplate (const sal_uInt16 nItemId)
 
     for (size_t i = 0, n = mItemList.size(); i < n; ++i)
     {
-        if (mItemList[i]->mnId == nItemRegionId)
+        if (mItemList[i]->mnId == nSrcItemId)
         {
 
             TemplateFolderViewItem *pItem = static_cast<TemplateFolderViewItem*>(mItemList[i]);
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 5011e8a..bdf48b3 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -768,7 +768,7 @@ void SfxTemplateManagerDlg::OnTemplateDelete ()
     std::set<const ThumbnailViewItem*>::const_iterator pIter;
     for (pIter = maSelTemplates.begin(); pIter != maSelTemplates.end();)
     {
-        if (maView->removeTemplate((*pIter)->mnId))
+        if (maView->removeTemplate((*pIter)->mnId,maView->getOverlayRegionId()+1))
             maSelTemplates.erase(pIter++);
         else
             ++pIter;
commit 80acf6916401420991cc7a7a83063e893b119a24
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 22:27:31 2012 -0430

    Add a method to return overlay current region id.
    
    Change-Id: Icdbd01b050af9fc1f0532c20885cbad13605cdcd

diff --git a/sfx2/inc/sfx2/templateabstractview.hxx b/sfx2/inc/sfx2/templateabstractview.hxx
index 323e125..8bb6426 100644
--- a/sfx2/inc/sfx2/templateabstractview.hxx
+++ b/sfx2/inc/sfx2/templateabstractview.hxx
@@ -29,6 +29,8 @@ public:
 
     virtual void showOverlay (bool bVisible) = 0;
 
+    sal_uInt16 getOverlayRegionId () const;
+
     // Check if the overlay is visible or not.
     bool isOverlayVisible () const;
 
diff --git a/sfx2/source/control/templateabstractview.cxx b/sfx2/source/control/templateabstractview.cxx
index b32bdd2..28a78b6 100644
--- a/sfx2/source/control/templateabstractview.cxx
+++ b/sfx2/source/control/templateabstractview.cxx
@@ -28,6 +28,11 @@ TemplateAbstractView::~TemplateAbstractView ()
     delete mpItemView;
 }
 
+sal_uInt16 TemplateAbstractView::getOverlayRegionId() const
+{
+    return mpItemView->getId();
+}
+
 bool TemplateAbstractView::isOverlayVisible () const
 {
     return mpItemView->IsVisible();
commit eaa24544961408a62b8fe20996e773261e745c06
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 20:41:14 2012 -0430

    Update search view after moving templates from the results.
    
    Change-Id: I894d786b69c52deb5756d4c17881acb25e861207

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 739ff13..5011e8a 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -24,6 +24,7 @@
 #include <tools/urlobj.hxx>
 #include <unotools/moduleoptions.hxx>
 #include <vcl/edit.hxx>
+#include <vcl/msgbox.hxx>
 #include <vcl/toolbox.hxx>
 
 #include <com/sun/star/beans/PropertyValue.hpp>
@@ -913,6 +914,11 @@ void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
             }
         }
     }
+
+    // Deselect all items and update search results
+    mpSearchView->unselectItems();
+
+    SearchUpdateHdl(mpSearchEdit);
 }
 
 void lcl_createTemplate(uno::Reference< com::sun::star::frame::XComponentLoader > xDesktop,
commit d4af0655a3fc765b73dd8b36442f8139e0d1ea03
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 20:03:18 2012 -0430

    Add a method to deselect all currently selected items in the view.
    
    Change-Id: I4d05e5b851b028798c75a7767706b5aabb94e4b6

diff --git a/sfx2/inc/sfx2/thumbnailview.hxx b/sfx2/inc/sfx2/thumbnailview.hxx
index da69b2b..24827ee 100644
--- a/sfx2/inc/sfx2/thumbnailview.hxx
+++ b/sfx2/inc/sfx2/thumbnailview.hxx
@@ -221,6 +221,14 @@ public:
     bool IsItemSelected( sal_uInt16 nItemId ) const
         { return nItemId == mnSelItemId; }
 
+    /**
+     *
+     * @brief unselect all current selected items.
+     *
+     **/
+
+    void unselectItems ();
+
     rtl::OUString GetItemText( sal_uInt16 nItemId ) const;
 
     void SetColor( const Color& rColor );
diff --git a/sfx2/source/control/thumbnailview.cxx b/sfx2/source/control/thumbnailview.cxx
index 886ec9b..f6042b5 100644
--- a/sfx2/source/control/thumbnailview.cxx
+++ b/sfx2/source/control/thumbnailview.cxx
@@ -1042,6 +1042,22 @@ void ThumbnailView::SelectItem( sal_uInt16 nItemId )
     }
 }
 
+void ThumbnailView::unselectItems()
+{
+    for (size_t i = 0, n = mItemList.size(); i < n; ++i)
+    {
+        if (mItemList[i]->isSelected())
+        {
+            mItemList[i]->setSelection(false);
+
+            maItemStateHdl.Call(mItemList[i]);
+        }
+    }
+
+    if (IsReallyVisible() && IsUpdateMode())
+        Invalidate();
+}
+
 rtl::OUString ThumbnailView::GetItemText( sal_uInt16 nItemId ) const
 {
     size_t nPos = GetItemPos( nItemId );
commit e3bb872add7705ff956056c5a86cbdd1fe8e34c8
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 18:02:34 2012 -0430

    Move/Copy selected templates in the search view to target region.
    
    Change-Id: I94dfc3610925b37ca25e1fe1ea591d9b5abbeae1

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 6c942b5..739ff13 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -11,6 +11,7 @@
 
 #include "inputdlg.hxx"
 #include "templatesearchview.hxx"
+#include "templatesearchviewitem.hxx"
 
 #include <comphelper/processfactory.hxx>
 #include <sfx2/filedlghelper.hxx>
@@ -900,9 +901,16 @@ void SfxTemplateManagerDlg::localSearchMoveTo(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))
+        std::set<const ThumbnailViewItem*>::const_iterator aIter;
+        for (aIter = maSelTemplates.begin(); aIter != maSelTemplates.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))
+            {
+            }
         }
     }
 }
commit 4b0999916a17327337129dea7695648be1478529
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 17:43:45 2012 -0430

    Implement moveTemplate function for a single template.
    
    - Copy or move a template from a source region to a target region.
    
    Change-Id: I6dc2eedd0b8fdb310d67c63c6c315bf51d03e881

diff --git a/sfx2/inc/sfx2/templatefolderview.hxx b/sfx2/inc/sfx2/templatefolderview.hxx
index 5274dd6..e11d524 100644
--- a/sfx2/inc/sfx2/templatefolderview.hxx
+++ b/sfx2/inc/sfx2/templatefolderview.hxx
@@ -55,6 +55,9 @@ public:
 
     bool removeTemplate (const sal_uInt16 nItemId);
 
+    bool moveTemplate (const ThumbnailViewItem* pItem, const sal_uInt16 nSrcItem,
+                       const sal_uInt16 nTargetItem, bool bCopy);
+
     bool moveTemplates (std::set<const ThumbnailViewItem*> &rItems, const sal_uInt16 nTargetItem, bool bCopy);
 
     void copyFrom (TemplateFolderViewItem *pItem, const rtl::OUString &rPath);
diff --git a/sfx2/source/control/templatefolderview.cxx b/sfx2/source/control/templatefolderview.cxx
index 59ef94b..117899f 100644
--- a/sfx2/source/control/templatefolderview.cxx
+++ b/sfx2/source/control/templatefolderview.cxx
@@ -496,6 +496,92 @@ bool TemplateFolderView::removeTemplate (const sal_uInt16 nItemId)
     return true;
 }
 
+bool TemplateFolderView::moveTemplate (const ThumbnailViewItem *pItem, const sal_uInt16 nSrcItem,
+                                       const sal_uInt16 nTargetItem, bool bCopy)
+{
+    bool bRet = true;
+    bool bRefresh = false;
+
+    TemplateFolderViewItem *pTarget = NULL;
+    TemplateFolderViewItem *pSrc = NULL;
+
+    for (size_t i = 0, n = mItemList.size(); i < n; ++i)
+    {
+        if (mItemList[i]->mnId == nTargetItem)
+            pTarget = static_cast<TemplateFolderViewItem*>(mItemList[i]);
+        else if (mItemList[i]->mnId == nSrcItem)
+            pSrc = static_cast<TemplateFolderViewItem*>(mItemList[i]);
+    }
+
+    if (pTarget && pSrc)
+    {
+        sal_uInt16 nSrcRegionId = nSrcItem-1;
+        sal_uInt16 nTargetRegion = pTarget->mnId-1;
+        sal_uInt16 nTargetIdx = mpDocTemplates->GetCount(nTargetRegion);    // Next Idx
+
+        const TemplateViewItem *pViewItem = static_cast<const TemplateViewItem*>(pItem);
+
+        bool bOK;
+
+        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;
+
+        // move template to destination
+
+        TemplateItemProperties aTemplateItem;
+        aTemplateItem.nId = nTargetIdx + 1;
+        aTemplateItem.nRegionId = nTargetRegion;
+        aTemplateItem.aName = pViewItem->maTitle;
+        aTemplateItem.aPath = pViewItem->getPath();
+        aTemplateItem.aType = pViewItem->getFileType();
+        aTemplateItem.aThumbnail = pViewItem->maPreview1;
+
+        pTarget->maTemplates.push_back(aTemplateItem);
+
+        if (!bCopy)
+        {
+            // remove template from overlay and from cached data
+
+            std::vector<TemplateItemProperties>::iterator aIter;
+            for (aIter = pSrc->maTemplates.begin(); aIter != pSrc->maTemplates.end(); ++aIter)
+            {
+                if (aIter->nId == pViewItem->mnId)
+                {
+                    pSrc->maTemplates.erase(aIter);
+
+                    mpItemView->RemoveItem(pViewItem->mnId);
+                    break;
+                }
+            }
+        }
+
+        bRefresh = true;
+    }
+    else
+        bRet = false;
+
+    if (bRefresh)
+    {
+        lcl_updateThumbnails(pSrc);
+        lcl_updateThumbnails(pTarget);
+
+        CalculateItemPositions();
+
+        if (IsReallyVisible() && IsUpdateMode())
+        {
+            Invalidate();
+            mpItemView->Invalidate();
+        }
+    }
+
+    return bRet;
+}
+
 bool TemplateFolderView::moveTemplates(std::set<const ThumbnailViewItem *> &rItems,
                                        const sal_uInt16 nTargetItem, bool bCopy)
 {
commit 7cc0477506ffa023b6e360863e43c8afc90b8712
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 17:21:47 2012 -0430

    Move TemplateSearchViewItem to its own header.
    
    Change-Id: Ie00b5e81fdae69dea31be2a680b0d37f867b5f4e

diff --git a/sfx2/source/control/templatesearchview.cxx b/sfx2/source/control/templatesearchview.cxx
index edd4bd4..620d815 100644
--- a/sfx2/source/control/templatesearchview.cxx
+++ b/sfx2/source/control/templatesearchview.cxx
@@ -9,20 +9,7 @@
 
 #include "templatesearchview.hxx"
 
-#include <sfx2/templateviewitem.hxx>
-
-struct TemplateSearchViewItem : public TemplateViewItem
-{
-    TemplateSearchViewItem (ThumbnailView &rView, Window *pParent)
-        : TemplateViewItem(rView,pParent)
-    {}
-
-    virtual ~TemplateSearchViewItem ()
-    {}
-
-    sal_uInt16 mnIdx;       // Template associated Index
-    sal_uInt16 mnRegionId;  // Template associated Region id
-};
+#include "templatesearchviewitem.hxx"
 
 TemplateSearchView::TemplateSearchView (Window *pParent, WinBits nWinStyle)
     : ThumbnailView(pParent,nWinStyle)
diff --git a/sfx2/source/inc/templatesearchviewitem.hxx b/sfx2/source/inc/templatesearchviewitem.hxx
new file mode 100644
index 0000000..185560a
--- /dev/null
+++ b/sfx2/source/inc/templatesearchviewitem.hxx
@@ -0,0 +1,30 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * 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/.
+ */
+
+#ifndef __SFX2_TEMPLATESEARCHVIEWITEM_HXX__
+#define __SFX2_TEMPLATESEARCHVIEWITEM_HXX__
+
+#include <sfx2/templateviewitem.hxx>
+
+struct TemplateSearchViewItem : public TemplateViewItem
+{
+    TemplateSearchViewItem (ThumbnailView &rView, Window *pParent)
+        : TemplateViewItem(rView,pParent)
+    {}
+
+    virtual ~TemplateSearchViewItem ()
+    {}
+
+    sal_uInt16 mnIdx;       // Template associated Index
+    sal_uInt16 mnRegionId;  // Template associated Region id
+};
+
+#endif // __SFX2_TEMPLATESEARCHVIEWITEM_HXX__
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 5dd1eb17806a7acebdb0323d76111006ce3ee7fb
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Sat Jul 28 13:26:20 2012 -0430

    Return correct new region id.
    
    Change-Id: Ifbe3a0dd13a286b6e39883ebd9a7e8d79c4602cf

diff --git a/sfx2/source/control/templatefolderview.cxx b/sfx2/source/control/templatefolderview.cxx
index b7c5310..59ef94b 100644
--- a/sfx2/source/control/templatefolderview.cxx
+++ b/sfx2/source/control/templatefolderview.cxx
@@ -442,7 +442,7 @@ sal_uInt16 TemplateFolderView::createRegion(const rtl::OUString &rName)
     if ( IsReallyVisible() && IsUpdateMode() )
         Invalidate();
 
-    return true;
+    return pItem->mnId;
 }
 
 bool TemplateFolderView::removeRegion(const sal_uInt16 nItemId)
commit 72b48950556820cac8198da467254b25f2e054c4
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Fri Jul 27 09:10:24 2012 -0430

    Do different action when moving templates depending on the active view.
    
    Change-Id: I97726bf0d8e26f833fc96274a908e72c6110d86b

diff --git a/sfx2/inc/templatedlg.hxx b/sfx2/inc/templatedlg.hxx
index 23fd9a4..607d394 100644
--- a/sfx2/inc/templatedlg.hxx
+++ b/sfx2/inc/templatedlg.hxx
@@ -81,6 +81,22 @@ private:
     // Exchange view between local/online view.
     void switchMainView (bool bDisplayLocal);
 
+    /**
+     *
+     * Move templates stored in the filesystem to another folder.
+     *
+     **/
+
+    void localMoveTo (sal_uInt16 nMenuId);
+
+    /**
+     *
+     * Move search result templates stored in the filesystem to another folder.
+     *
+     **/
+
+    void localSearchMoveTo (sal_uInt16 nMenuId);
+
 private:
 
     PushButton aButtonAll;
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index a6afee1..6c942b5 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -537,42 +537,17 @@ IMPL_LINK(SfxTemplateManagerDlg, MoveMenuSelectHdl, Menu*, pMenu)
 {
     sal_uInt16 nMenuId = pMenu->GetCurItemId();
 
-    if (nMenuId == MNI_MOVE_NEW)
+    if (mpSearchView->IsVisible())
     {
-        InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
-
-        int ret = dlg.Execute();
-
-        if (ret)
-        {
-            rtl::OUString aName = dlg.getEntryText();
-
-            if (!aName.isEmpty())
-            {
-                sal_uInt16 nNewRegionId = maView->createRegion(aName);
-
-                if (nNewRegionId)
-                {
-                    // Move templates to desired folder if for some reason move fails
-                    // try copying them.
-                    if (!maView->moveTemplates(maSelTemplates,nNewRegionId,false) &&
-                            !maView->moveTemplates(maSelTemplates,nNewRegionId,true))
-                    {
-                    }
-                }
-            }
-        }
+        // Check if we are searching the local or remote templates
+        if (mpCurView == maView)
+            localSearchMoveTo(nMenuId);
     }
     else
     {
-        // Try to move the template, if isnt possible try to copy it.
-
-        sal_uInt16 nItemId = maView->GetItemId(nMenuId-MNI_MOVE_FOLDER_BASE);
-
-        if (!maView->moveTemplates(maSelTemplates,nItemId,false) &&
-                !maView->moveTemplates(maSelTemplates,nItemId,true))
-        {
-        }
+        // Check if we are displaying the local or remote templates
+        if (mpCurView == maView)
+            localMoveTo(nMenuId);
     }
 
     return 0;
@@ -864,6 +839,74 @@ void SfxTemplateManagerDlg::switchMainView(bool bDisplayLocal)
     }
 }
 
+void SfxTemplateManagerDlg::localMoveTo(sal_uInt16 nMenuId)
+{
+    sal_uInt16 nItemId = 0;
+
+    if (nMenuId == MNI_MOVE_NEW)
+    {
+        InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
+
+        int ret = dlg.Execute();
+
+        if (ret)
+        {
+            rtl::OUString aName = dlg.getEntryText();
+
+            if (!aName.isEmpty())
+                nItemId = maView->createRegion(aName);
+        }
+    }
+    else
+    {
+        nItemId = maView->GetItemId(nMenuId-MNI_MOVE_FOLDER_BASE);
+    }
+
+    if (nItemId)
+    {
+        // 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))
+        {
+        }
+    }
+}
+
+void SfxTemplateManagerDlg::localSearchMoveTo(sal_uInt16 nMenuId)
+{
+    sal_uInt16 nItemId = 0;
+
+    if (nMenuId == MNI_MOVE_NEW)
+    {
+        InputDialog dlg(SfxResId(STR_INPUT_NEW).toString(),this);
+
+        int ret = dlg.Execute();
+
+        if (ret)
+        {
+            rtl::OUString aName = dlg.getEntryText();
+
+            if (!aName.isEmpty())
+                nItemId = maView->createRegion(aName);
+        }
+    }
+    else
+    {
+        nItemId = maView->GetItemId(nMenuId-MNI_MOVE_FOLDER_BASE);
+    }
+
+    if (nItemId)
+    {
+        // 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))
+        {
+        }
+    }
+}
+
 void lcl_createTemplate(uno::Reference< com::sun::star::frame::XComponentLoader > xDesktop,
                         const FILTER_APPLICATION eApp)
 {
commit c180c37c032532df0534856cd1d9791c0e965d49
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Thu Jul 26 19:28:35 2012 -0430

    Set SearchView item state handle.
    
    Change-Id: I60d8552de9648b0b5f360612fa46b474e8dd9734

diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 4add070..a6afee1 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -207,6 +207,8 @@ SfxTemplateManagerDlg::SfxTemplateManagerDlg (Window *parent)
                                     ITEM_MAX_HEIGHT-THUMBNAIL_MAX_HEIGHT,
                                     ITEM_PADDING);
 
+    mpSearchView->setItemStateHdl(LINK(this,SfxTemplateManagerDlg,TVTemplateStateHdl));
+
     // Set OK button position
     Point aBtnPos;
     Size aBtnSize = maButtonClose.GetSizePixel();
commit 1d6d7bff8d3c55bf974d504efe3fbb591f2f597d
Author: Rafael Dominguez <venccsralph at gmail.com>
Date:   Thu Jul 26 16:49:23 2012 -0430

    Display all available folders when all button is clicked.
    
    Change-Id: Ia7f0acca967c5ef4057ad0f5f891f095efa5cf1e

diff --git a/sfx2/source/control/templatefolderview.cxx b/sfx2/source/control/templatefolderview.cxx
index 3972a49..b7c5310 100644
--- a/sfx2/source/control/templatefolderview.cxx
+++ b/sfx2/source/control/templatefolderview.cxx
@@ -242,7 +242,7 @@ public:
 
     bool isValid (const rtl::OUString &rType) const
     {
-        bool bRet = false;
+        bool bRet = true;
 
         if (meApp == FILTER_APP_WRITER)
         {


More information about the Libreoffice-commits mailing list