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

Andras Timar timar at kemper.freedesktop.org
Thu Sep 22 02:51:05 PDT 2011


 sfx2/inc/sfx2/doctempl.hxx   |    3 
 sfx2/source/doc/doctdlg.cxx  |    3 
 sfx2/source/doc/doctempl.cxx |  199 +++++++++++++++++++++++++++----------------
 sfx2/source/doc/docvor.cxx   |    2 
 sfx2/source/doc/new.cxx      |    2 
 5 files changed, 135 insertions(+), 74 deletions(-)

New commits:
commit df59068902b294b7b344af0c20da196cc64aaced
Author: Peter Rabi <prabi at caesar.elte.hu>
Date:   Mon Sep 19 14:21:20 2011 +0200

    Fix of localized template name problems in Impress part 2
    
    Template entries now appear in the correct word order
    in their representation in SfxDocumentTemplates. That makes
    template listboxes in a few dialogs work as expected.
    Contributed under license LGPLv3+/MPL.

diff --git a/sfx2/inc/sfx2/doctempl.hxx b/sfx2/inc/sfx2/doctempl.hxx
index df1d9f0..b60ac95 100644
--- a/sfx2/inc/sfx2/doctempl.hxx
+++ b/sfx2/inc/sfx2/doctempl.hxx
@@ -93,6 +93,9 @@ public:
                             int nCount,
                             const ::rtl::OUString& rString);
 
+    void                EnableRegionSorting(bool isRegionSortingEnabled = true);
+    void                EnableTemplateSorting(bool isTemplateSortingEnabled = true);
+
     sal_Bool            Copy(sal_uInt16 nTargetRegion,
                          sal_uInt16 nTargetIdx,
                          sal_uInt16 nSourceRegion,
diff --git a/sfx2/source/doc/doctdlg.cxx b/sfx2/source/doc/doctdlg.cxx
index 36cd638..d99ef9a 100644
--- a/sfx2/source/doc/doctdlg.cxx
+++ b/sfx2/source/doc/doctdlg.cxx
@@ -111,6 +111,9 @@ void SfxDocumentTemplateDlg::Init()
     if(!pTemplates->IsConstructed())
         pTemplates->Construct();
 
+    pTemplates->EnableRegionSorting();
+    pTemplates->EnableTemplateSorting();
+
     const sal_uInt16 nCount = pTemplates->GetRegionCount();
     for(sal_uInt16 i = 0; i < nCount; ++i)
         aRegionLb.InsertEntry(pTemplates->GetFullRegionName(i));
diff --git a/sfx2/source/doc/doctempl.cxx b/sfx2/source/doc/doctempl.cxx
index 378d489..22ed882 100644
--- a/sfx2/source/doc/doctempl.cxx
+++ b/sfx2/source/doc/doctempl.cxx
@@ -103,6 +103,7 @@ using namespace ::ucbhelper;
 #include <unotools/ucbhelper.hxx>
 
 #include <vector>
+#include <algorithm>
 using ::std::vector;
 using ::std::advance;
 
@@ -171,6 +172,13 @@ public:
     sal_Bool                DeleteObjectShell();
 };
 
+class TemplateEntryCompare
+{
+public:
+    bool operator()( DocTempl_EntryData_Impl* pA, DocTempl_EntryData_Impl* pB ) const
+        { return 0 > pA->Compare( pB->GetTitle() ); }
+};
+
 }
 
 using namespace ::DocTempl;
@@ -184,6 +192,7 @@ class RegionData_Impl
     OUString                    maTitle;
     OUString                    maOwnURL;
     OUString                    maTargetURL;
+    bool                        mbSortingEnabled;
 
 private:
     size_t                      GetEntryPos( const OUString& rTitle,
@@ -214,11 +223,20 @@ public:
                                   size_t *pPos = NULL );
     void                DeleteEntry( size_t nIndex );
 
+    void                EnableSorting( bool isSortingEnabled = true );
+
     int                 Compare( const OUString& rTitle ) const
                             { return maTitle.compareTo( rTitle ); }
     int                 Compare( RegionData_Impl* pCompareWith ) const;
 };
 
+class RegionCompare
+{
+public:
+    bool operator()( RegionData_Impl* pA, RegionData_Impl* pB ) const
+        { return 0 > pA->Compare( pB ); }
+};
+
 typedef vector< RegionData_Impl* > RegionList_Impl;
 
 // ------------------------------------------------------------------------
@@ -230,9 +248,10 @@ class SfxDocTemplate_Impl : public SvRefBase
 
     ::osl::Mutex        maMutex;
     OUString            maRootURL;
-    OUString            maStandardGroup;
     RegionList_Impl     maRegions;
     sal_Bool            mbConstructed;
+    bool                mbRegionSortingEnabled;
+    bool                mbTemplateSortingEnabled;
 
     uno::Reference< XAnyCompareFactory > m_rCompareFactory;
 
@@ -258,6 +277,13 @@ public:
 
     void                Rescan();
 
+    void                EnableRegionSorting( bool isRegionSortingEnabled = true );
+    void                EnableTemplateSorting( bool isTemplateSortingEnabled = true )
+                            { mbTemplateSortingEnabled = isTemplateSortingEnabled; }
+
+    bool                IsRegionSortingEnabled() const { return mbRegionSortingEnabled; }
+    bool                IsTemplateSortingEnabled() const { return mbTemplateSortingEnabled; }
+
     void                DeleteRegion( size_t nIndex );
 
     size_t              GetRegionCount() const
@@ -621,6 +647,28 @@ OUString SfxDocumentTemplates::ConvertResourceString (
 
 //------------------------------------------------------------------------
 
+/** Enables or disables the sorting of regions.
+    @param isRegionSortingEnabled
+        Whether to sort regions or not.
+*/
+void SfxDocumentTemplates::EnableRegionSorting( bool isRegionSortingEnabled )
+{
+    pImp->EnableRegionSorting( isRegionSortingEnabled );
+}
+
+//------------------------------------------------------------------------
+
+/** Enables or disables the sorting of templates inside regions.
+    @param isTemplateSortingEnabled
+        Whether to sort templates or not.
+*/
+void SfxDocumentTemplates::EnableTemplateSorting( bool isTemplateSortingEnabled )
+{
+    pImp->EnableTemplateSorting( isTemplateSortingEnabled );
+}
+
+//------------------------------------------------------------------------
+
 sal_Bool SfxDocumentTemplates::CopyOrMove
 (
     sal_uInt16  nTargetRegion,      //  Target Region Index
@@ -1109,6 +1157,7 @@ sal_Bool SfxDocumentTemplates::InsertDir
     if ( xTemplates->addGroup( rText ) )
     {
         RegionData_Impl* pNewRegion = new RegionData_Impl( pImp, rText );
+        pNewRegion->EnableSorting( pImp->IsTemplateSortingEnabled() );
 
         if ( ! pImp->InsertRegion( pNewRegion, nRegion ) )
         {
@@ -1168,6 +1217,10 @@ sal_Bool SfxDocumentTemplates::SetName
             pRegion->SetTitle( rName );
             pRegion->SetTargetURL( aEmpty );
             pRegion->SetHierarchyURL( aEmpty );
+
+            // force resorting if needed
+            pImp->EnableRegionSorting( pImp->IsRegionSortingEnabled() );
+
             return sal_True;
         }
     }
@@ -1188,6 +1241,10 @@ sal_Bool SfxDocumentTemplates::SetName
             pEntry->SetTitle( rName );
             pEntry->SetTargetURL( aEmpty );
             pEntry->SetHierarchyURL( aEmpty );
+
+            // force resorting if needed
+            pRegion->EnableSorting( pImp->IsTemplateSortingEnabled() );
+
             return sal_True;
         }
     }
@@ -1707,8 +1764,9 @@ const OUString& DocTempl_EntryData_Impl::GetTargetURL()
 RegionData_Impl::RegionData_Impl( const SfxDocTemplate_Impl* pParent,
                                   const OUString& rTitle )
 {
-    maTitle     = rTitle;
-    mpParent    = pParent;
+    maTitle          = rTitle;
+    mpParent         = pParent;
+    mbSortingEnabled = false;
 }
 
 // -----------------------------------------------------------------------
@@ -1722,62 +1780,37 @@ RegionData_Impl::~RegionData_Impl()
 // -----------------------------------------------------------------------
 size_t RegionData_Impl::GetEntryPos( const OUString& rTitle, sal_Bool& rFound ) const
 {
-#if 1   // Don't use binary search today
-    size_t i;
-    size_t nCount = maEntries.size();
-
-    for ( i=0; i<nCount; i++ )
+    if ( mbSortingEnabled )
     {
-        DocTempl_EntryData_Impl *pData = maEntries[ i ];
+        DocTempl_EntryData_Impl aToFind( NULL, rTitle );
+        vector< DocTempl_EntryData_Impl* >::const_iterator aPlaceToInsert =
+            ::std::lower_bound( maEntries.begin(), maEntries.end(),
+                                &aToFind, TemplateEntryCompare() );
 
-        if ( pData->Compare( rTitle ) == 0 )
-        {
-            rFound = sal_True;
-            return i;
-        }
-    }
-
-    rFound = sal_False;
-    return i;
-
-#else
-    // use binary search to find the correct position
-    // in the maEntries list
-
-    int     nCompVal = 1;
-    size_t  nStart = 0;
-    size_t  nEnd = maEntries.size() - 1;
-    size_t  nMid;
+        rFound = aPlaceToInsert != maEntries.end() &&
+                 0 == (*aPlaceToInsert)->Compare( rTitle );
 
-    DocTempl_EntryData_Impl* pMid;
-
-    rFound = sal_False;
-
-    while ( nCompVal && ( nStart <= nEnd ) )
+        return ::std::distance( maEntries.begin(), aPlaceToInsert );
+    }
+    else
     {
-        nMid = ( nEnd - nStart ) / 2 + nStart;
-        pMid = maEntries[ nMid ];
+        size_t i;
+        size_t nCount = maEntries.size();
 
-        nCompVal = pMid->Compare( rTitle );
+        for ( i=0; i<nCount; i++ )
+        {
+            DocTempl_EntryData_Impl *pData = maEntries[ i ];
 
-        if ( nCompVal < 0 )     // pMid < pData
-            nStart = nMid + 1;
-        else
-            nEnd = nMid - 1;
-    }
+            if ( pData->Compare( rTitle ) == 0 )
+            {
+                rFound = sal_True;
+                return i;
+            }
+        }
 
-    if ( nCompVal == 0 )
-    {
-        rFound = sal_True;
-    }
-    else
-    {
-        if ( nCompVal < 0 )     // pMid < pData
-            nMid++;
+        rFound = sal_False;
+        return i;
     }
-
-    return nMid;
-#endif
 }
 
 // -----------------------------------------------------------------------
@@ -1791,23 +1824,20 @@ void RegionData_Impl::AddEntry( const OUString& rTitle,
                       INetURLObject::ENCODE_ALL );
     OUString aLinkURL = aLinkObj.GetMainURL( INetURLObject::NO_DECODE );
 
-    DocTempl_EntryData_Impl* pEntry;
     sal_Bool        bFound = sal_False;
     size_t          nPos = GetEntryPos( rTitle, bFound );
 
-    if ( bFound )
+    if ( !bFound )
     {
-        pEntry = maEntries[ nPos ];
-    }
-    else
-    {
-        if ( pPos )
+        if ( !mbSortingEnabled && pPos )
             nPos = *pPos;
 
-        pEntry = new DocTempl_EntryData_Impl( this, rTitle );
+        DocTempl_EntryData_Impl* pEntry = new DocTempl_EntryData_Impl( this, rTitle );
         pEntry->SetTargetURL( rTargetURL );
         pEntry->SetHierarchyURL( aLinkURL );
-        if ( nPos < maEntries.size() ) {
+
+        if ( nPos < maEntries.size() )
+        {
             vector< DocTempl_EntryData_Impl* >::iterator it = maEntries.begin();
             advance( it, nPos );
             maEntries.insert( it, pEntry );
@@ -1899,6 +1929,15 @@ void RegionData_Impl::DeleteEntry( size_t nIndex )
 }
 
 // -----------------------------------------------------------------------
+void RegionData_Impl::EnableSorting( bool isSortingEnabled )
+{
+    mbSortingEnabled = isSortingEnabled;
+
+    if ( mbSortingEnabled )
+        ::std::sort( maEntries.begin(), maEntries.end(), TemplateEntryCompare() );
+}
+
+// -----------------------------------------------------------------------
 int RegionData_Impl::Compare( RegionData_Impl* pCompare ) const
 {
     int nCompare = maTitle.compareTo( pCompare->maTitle );
@@ -1910,6 +1949,8 @@ int RegionData_Impl::Compare( RegionData_Impl* pCompare ) const
 
 SfxDocTemplate_Impl::SfxDocTemplate_Impl()
 : mbConstructed( sal_False )
+, mbRegionSortingEnabled( false )
+, mbTemplateSortingEnabled( false )
 , mnLockCounter( 0 )
 {
 }
@@ -1978,6 +2019,7 @@ void SfxDocTemplate_Impl::AddRegion( const OUString& rTitle,
 {
     RegionData_Impl* pRegion;
     pRegion = new RegionData_Impl( this, rTitle );
+    pRegion->EnableSorting( mbTemplateSortingEnabled );
 
     if ( ! InsertRegion( pRegion ) )
     {
@@ -2100,11 +2142,6 @@ sal_Bool SfxDocTemplate_Impl::Construct( )
     mbConstructed = sal_True;
     maRootURL = aRootContent->getIdentifier()->getContentIdentifier();
 
-    ResStringArray  aLongNames( SfxResId( TEMPLATE_LONG_NAMES_ARY ) );
-
-    if ( aLongNames.Count() )
-        maStandardGroup = aLongNames.GetString( 0 );
-
     Content aTemplRoot( aRootContent, aCmdEnv );
     CreateFromHierarchy( aTemplRoot );
 
@@ -2135,18 +2172,23 @@ sal_Bool SfxDocTemplate_Impl::InsertRegion( RegionData_Impl *pNew, size_t nPos )
         if ( maRegions[ i ]->Compare( pNew ) == 0 )
             return sal_False;
 
-    size_t newPos = nPos;
-    if ( pNew->GetTitle() == maStandardGroup )
-        newPos = 0;
-
-    if ( newPos < maRegions.size() )
+    if ( mbRegionSortingEnabled )
     {
-        RegionList_Impl::iterator it = maRegions.begin();
-        advance( it, newPos );
-        maRegions.insert( it, pNew );
+        RegionList_Impl::iterator aPlaceToInsert =
+            ::std::upper_bound( maRegions.begin(), maRegions.end(), pNew, RegionCompare() );
+        maRegions.insert( aPlaceToInsert, pNew );
     }
     else
-        maRegions.push_back( pNew );
+    {
+        if ( nPos < maRegions.size() )
+        {
+            RegionList_Impl::iterator it = maRegions.begin();
+            advance( it, nPos );
+            maRegions.insert( it, pNew );
+        }
+        else
+            maRegions.push_back( pNew );
+    }
 
     return sal_True;
 }
@@ -2178,6 +2220,15 @@ void SfxDocTemplate_Impl::Rescan()
 }
 
 // -----------------------------------------------------------------------
+void SfxDocTemplate_Impl::EnableRegionSorting( bool isRegionSortingEnabled )
+{
+    mbRegionSortingEnabled = isRegionSortingEnabled;
+
+    if ( mbRegionSortingEnabled )
+        ::std::sort( maRegions.begin(), maRegions.end(), RegionCompare() );
+}
+
+// -----------------------------------------------------------------------
 sal_Bool SfxDocTemplate_Impl::GetTitleFromURL( const OUString& rURL,
                                            OUString& aTitle )
 {
diff --git a/sfx2/source/doc/docvor.cxx b/sfx2/source/doc/docvor.cxx
index 9ac8ba7..0f9609f 100644
--- a/sfx2/source/doc/docvor.cxx
+++ b/sfx2/source/doc/docvor.cxx
@@ -234,6 +234,8 @@ SfxOrganizeDlg_Impl::SfxOrganizeDlg_Impl( SfxTemplateOrganizeDlg* pParent,
             pWaitObjectRange = pDialog;
 
         WaitObject aWaitCursor( pWaitObjectRange );
+        const_cast< SfxDocumentTemplates* >( aMgr.GetTemplates() )->EnableRegionSorting();
+        const_cast< SfxDocumentTemplates* >( aMgr.GetTemplates() )->EnableTemplateSorting();
         const_cast< SfxDocumentTemplates* >( aMgr.GetTemplates() )->Update( sal_True /* be smart */ );
             // this const_cast is a hack - but the alternative would be to
             // * have a method which returns the templates non-const
diff --git a/sfx2/source/doc/new.cxx b/sfx2/source/doc/new.cxx
index cc7c004..95f6f6d 100644
--- a/sfx2/source/doc/new.cxx
+++ b/sfx2/source/doc/new.cxx
@@ -567,6 +567,8 @@ SfxNewFileDialog_Impl::SfxNewFileDialog_Impl(
     // update the template configuration if necessary
     {
         WaitObject aWaitCursor( pAntiImplP->GetParent() );
+        aTemplates.EnableRegionSorting();
+        aTemplates.EnableTemplateSorting();
         aTemplates.Update( sal_True /* be smart */ );
     }
     // fill the list boxes


More information about the Libreoffice-commits mailing list