[Libreoffice-commits] core.git: 3 commits - configmgr/source cui/source

Stephan Bergmann sbergman at redhat.com
Fri Dec 6 07:54:33 PST 2013


 configmgr/source/access.cxx           |    7 
 cui/source/options/optaboutconfig.cxx |  246 +++++++++++++++++++---------------
 cui/source/options/optaboutconfig.hxx |    2 
 3 files changed, 144 insertions(+), 111 deletions(-)

New commits:
commit 434465cee3c5e21881d3466f115d968e8fbf731c
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Dec 6 16:53:36 2013 +0100

    More Expert Config Page fixes
    
    Change-Id: Iaa2b7df4246ab3fa31737126f27e4a9da3814048

diff --git a/cui/source/options/optaboutconfig.cxx b/cui/source/options/optaboutconfig.cxx
index ad145de..56b945a 100644
--- a/cui/source/options/optaboutconfig.cxx
+++ b/cui/source/options/optaboutconfig.cxx
@@ -21,6 +21,7 @@
 #include <com/sun/star/beans/XProperty.hpp>
 #include <com/sun/star/container/XNameAccess.hpp>
 #include <com/sun/star/container/XNameReplace.hpp>
+#include <com/sun/star/container/XHierarchicalName.hpp>
 #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
 #include <com/sun/star/util/XChangesBatch.hpp>
 
@@ -175,27 +176,25 @@ void CuiAboutConfigTabPage::InsertEntry(const OUString& rProp, const OUString& r
 
 void CuiAboutConfigTabPage::Reset(/* const SfxItemSet&*/ )
 {
-    OUString sRootNodePath = "";
     m_pPrefBox->Clear();
 
     m_vectorOfModified.clear();
     m_pPrefBox->GetModel()->SetSortMode( SortNone );
 
     m_pPrefBox->SetUpdateMode(sal_False);
-    Reference< XNameAccess > xConfigAccess = getConfigAccess( sRootNodePath, sal_False );
-    FillItems( xConfigAccess, sRootNodePath );
+    Reference< XNameAccess > xConfigAccess = getConfigAccess( "/", sal_False );
+    FillItems( xConfigAccess );
     m_pPrefBox->SetUpdateMode(sal_True);
 }
 
 sal_Bool CuiAboutConfigTabPage::FillItemSet(/* SfxItemSet&*/ )
 {
     sal_Bool bModified = sal_False;
-    Reference< XNameAccess > xUpdateAccess = getConfigAccess( "/", sal_True );
 
     std::vector< boost::shared_ptr< Prop_Impl > >::iterator pIter;
     for( pIter = m_vectorOfModified.begin() ; pIter != m_vectorOfModified.end(); ++pIter )
     {
-        xUpdateAccess = getConfigAccess( (*pIter)->Name , sal_True );
+        Reference< XNameAccess > xUpdateAccess = getConfigAccess( (*pIter)->Name , sal_True );
         Reference< XNameReplace > xNameReplace( xUpdateAccess, UNO_QUERY_THROW );
 
         xNameReplace->replaceByName( (*pIter)->Property, (*pIter)->Value );
@@ -208,10 +207,12 @@ sal_Bool CuiAboutConfigTabPage::FillItemSet(/* SfxItemSet&*/ )
     return bModified;
 }
 
-void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAccess, const OUString& sPath)
+void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAccess)
 {
+    OUString sPath = Reference< XHierarchicalName >(
+        xNameAccess, uno::UNO_QUERY_THROW )->getHierarchicalName();
     uno::Sequence< OUString > seqItems = xNameAccess->getElementNames();
-    for( sal_Int16 i = 0; i < seqItems.getLength(); ++i )
+    for( sal_Int32 i = 0; i < seqItems.getLength(); ++i )
     {
         Any aNode = xNameAccess->getByName( seqItems[i] );
 
@@ -219,7 +220,7 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
         if( xNextNameAccess.is() )
         {
             // not leaf node
-            FillItems( xNextNameAccess, sPath + "/" + seqItems[i] );
+            FillItems( xNextNameAccess );
         }
         else
         {
@@ -227,100 +228,152 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
             OUString sType = aNode.getValueTypeName();
 
             OUString sValue;
-            if( aNode.hasValue() )
+            switch( aNode.getValueType().getTypeClass() )
             {
-                switch( aNode.getValueType().getTypeClass() )
+            case ::com::sun::star::uno::TypeClass_VOID:
+                break;
+
+            case ::com::sun::star::uno::TypeClass_BOOLEAN:
+                sValue = OUString::boolean( aNode.get<bool>() );
+                break;
+
+            case ::com::sun::star::uno::TypeClass_SHORT:
+            case ::com::sun::star::uno::TypeClass_LONG:
+            case ::com::sun::star::uno::TypeClass_HYPER:
+                sValue = OUString::number( aNode.get<sal_Int64>() );
+                break;
+
+            case ::com::sun::star::uno::TypeClass_DOUBLE:
+                sValue = OUString::number( aNode.get<double>() );
+                break;
+
+            case ::com::sun::star::uno::TypeClass_STRING:
+                sValue = aNode.get<OUString>();
+                break;
+
+            case ::com::sun::star::uno::TypeClass_SEQUENCE:
+                if( sType == "[]boolean" )
                 {
-                    case ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT :
-                    case ::com::sun::star::uno::TypeClass_SHORT :
-                    case ::com::sun::star::uno::TypeClass_UNSIGNED_LONG :
-                    case ::com::sun::star::uno::TypeClass_LONG :
-                    //case ::com::sun::star::uno::TypeClass_INT :
+                    uno::Sequence<sal_Bool> seq = aNode.get< uno::Sequence<sal_Bool> >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
                     {
-                        sal_Int32 nVal = 0;
-                        if(aNode >>= nVal)
+                        if( j != 0 )
                         {
-                            sValue = OUString::number( nVal );
+                            sValue += ",";
                         }
+                        sValue += OUString::boolean( seq[j] );
                     }
-                    break;
-
-                    case ::com::sun::star::uno::TypeClass_BOOLEAN :
+                }
+                else if( sType == "[]byte" )
+                {
+                    uno::Sequence<sal_Int8> seq = aNode.get< uno::Sequence<sal_Int8> >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
                     {
-                        sal_Bool bVal = sal_False;
-                        if(aNode >>= bVal  )
+                        OUString s = OUString::number(
+                            static_cast<sal_uInt8>(seq[j]), 16 );
+                        if( s.getLength() == 1 )
                         {
-                            sValue = OUString::boolean( bVal );
+                            sValue += "0";
                         }
+                        sValue += s.toAsciiUpperCase();
                     }
-                    break;
-
-                    case ::com::sun::star::uno::TypeClass_STRING :
+                }
+                else if( sType == "[][]byte" )
+                {
+                    uno::Sequence< uno::Sequence<sal_Int8> > seq = aNode.get< uno::Sequence< uno::Sequence<sal_Int8> > >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
                     {
-                        OUString sString;
-                        if(aNode >>= sString)
+                        if( j != 0 )
                         {
-                            sValue = sString;
+                            sValue += ",";
                         }
-
-                    }
-                    break;
-
-                    case ::com::sun::star::uno::TypeClass_SEQUENCE :
-                    //case ::com::sun::star::uno::TypeClass_ARRAY :
-                    {
-                        sValue = "";
-                        if( "[]long" == sType || "[]short"== sType )
+                        for( sal_Int32 k = 0; k != seq[j].getLength(); ++k )
                         {
-                            uno::Sequence<sal_Int32> seqLong;
-                            if( aNode >>= seqLong )
+                            OUString s = OUString::number(
+                                static_cast<sal_uInt8>(seq[j][k]), 16 );
+                            if( s.getLength() == 1 )
                             {
-                                for(int nInd=0;  nInd < seqLong.getLength(); ++nInd)
-                                {
-                                    sValue += OUString::number(seqLong[nInd]) + ",";
-                                }
+                                sValue += "0";
                             }
+                            sValue += s.toAsciiUpperCase();
                         }
-
-                        if( "[]string" == sType )
+                    }
+                }
+                else if( sType == "[]short" )
+                {
+                    uno::Sequence<sal_Int16> seq = aNode.get< uno::Sequence<sal_Int16> >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                    {
+                        if( j != 0 )
                         {
-                            uno::Sequence< OUString > seqOUString;
-                            if( aNode >>= seqOUString )
-                            {
-                                for( sal_Int16 nInd=0; nInd < seqOUString.getLength(); ++nInd )
-                                {
-                                    sValue += seqOUString[nInd] + ",";
-                                }
-                            }
+                            sValue += ",";
                         }
-
-                        if( "[]hyper" == sType )
+                        sValue += OUString::number( seq[j] );
+                    }
+                }
+                else if( sType == "[]long" )
+                {
+                    uno::Sequence<sal_Int32> seq = aNode.get< uno::Sequence<sal_Int32> >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                    {
+                        if( j != 0 )
                         {
-                            uno::Sequence< sal_Int64 > seqHyp;
-                            if( aNode >>= seqHyp )
-                            {
-                                for(int nInd = 0; nInd < seqHyp.getLength(); ++nInd)
-                                {
-                                    sValue += OUString::number( seqHyp[nInd] ) + ",";
-                                }
-                            }
+                            sValue += ",";
                         }
+                        sValue += OUString::number( seq[j] );
                     }
-                    break;
-
-                    default:
+                }
+                else if( sType == "[]hyper" )
+                {
+                    uno::Sequence<sal_Int64> seq = aNode.get< uno::Sequence<sal_Int64> >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
                     {
-                        if( "hyper" == sType )
+                        if( j != 0 )
                         {
-                            sal_Int64 nHyp = 0;
-                            if(aNode >>= nHyp)
-                            {
-                                sValue = OUString::number( nHyp );
-                            }
-                        }else
-                            sValue = "";
+                            sValue += ",";
+                        }
+                        sValue += OUString::number( seq[j] );
                     }
                 }
+                else if( sType == "[]double" )
+                {
+                    uno::Sequence<double> seq = aNode.get< uno::Sequence<double> >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                    {
+                        if( j != 0 )
+                        {
+                            sValue += ",";
+                        }
+                        sValue += OUString::number( seq[j] );
+                    }
+                }
+                else if( sType == "[]string" )
+                {
+                    uno::Sequence<OUString> seq = aNode.get< uno::Sequence<OUString> >();
+                    for( sal_Int32 j = 0; j != seq.getLength(); ++j )
+                    {
+                        if( j != 0 )
+                        {
+                            sValue += ",";
+                        }
+                        sValue += seq[j];
+                    }
+                }
+                else
+                {
+                    SAL_WARN(
+                        "cui.options",
+                        "path \"" << sPath << "\" member " << seqItems[i]
+                            << " of unsupported type " << sType);
+                }
+                break;
+
+            default:
+                SAL_WARN(
+                    "cui.options",
+                    "path \"" << sPath << "\" member " << seqItems[i]
+                        << " of unsupported type " << sType);
+                break;
             }
 
             InsertEntry( sPath, seqItems[i], sType, sValue);
@@ -335,8 +388,6 @@ Reference< XNameAccess > CuiAboutConfigTabPage::getConfigAccess( OUString sNodeP
     uno::Reference< lang::XMultiServiceFactory > xConfigProvider(
                 com::sun::star::configuration::theDefaultProvider::get( xContext  ) );
 
-    if( sNodePath == "" )
-        sNodePath = "/";
     beans::NamedValue aProperty;
     aProperty.Name = "nodepath";
     aProperty.Value = uno::makeAny( sNodePath );
@@ -365,7 +416,7 @@ void CuiAboutConfigTabPage::AddToModifiedVector( const boost::shared_ptr< Prop_I
     //Check if value modified before
     for( size_t nInd = 0; nInd < m_vectorOfModified.size() ; ++nInd )
     {
-        if( rProp->Name == m_vectorOfModified[nInd]->Name && rProp->Value == m_vectorOfModified[nInd]->Value )
+        if( rProp->Name == m_vectorOfModified[nInd]->Name && rProp->Property == m_vectorOfModified[nInd]->Property )
         {
             //property modified before. assing reference to the modified value
             //do your changes on this object. They will be saved later.
diff --git a/cui/source/options/optaboutconfig.hxx b/cui/source/options/optaboutconfig.hxx
index 9ad78a6..7d6017d 100644
--- a/cui/source/options/optaboutconfig.hxx
+++ b/cui/source/options/optaboutconfig.hxx
@@ -62,7 +62,7 @@ public:
    CuiAboutConfigTabPage( Window* pParent/*, const SfxItemSet& rItemSet*/ );
    void     InsertEntry(const OUString& rProp, const OUString& rStatus, const OUString& rType, const OUString& rValue);
    void     Reset(/* const SfxItemSet&*/ );
-   void     FillItems(const com::sun::star::uno::Reference<com::sun::star::container::XNameAccess>& xNameAccess, const OUString& sPath);
+   void     FillItems(const com::sun::star::uno::Reference<com::sun::star::container::XNameAccess>& xNameAccess);
    com::sun::star::uno::Reference< com::sun::star::container::XNameAccess > getConfigAccess( OUString sNodePath, sal_Bool bUpdate );
    virtual sal_Bool FillItemSet( /* SfxItemSet& rSet*/ );
 
commit bd8b3be0c7535e74ca8b63969be5c2bece0d3a3b
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Dec 6 16:52:27 2013 +0100

    Do not create paths starting "//" when root is just "/"
    
    Change-Id: If0b413a4fdd93465074548c7ea5451288c1d12aa

diff --git a/configmgr/source/access.cxx b/configmgr/source/access.cxx
index 280f053..a6a8035 100644
--- a/configmgr/source/access.cxx
+++ b/configmgr/source/access.cxx
@@ -543,13 +543,14 @@ OUString Access::getHierarchicalName() throw (css::uno::RuntimeException) {
     checkLocalizedPropertyAccess();
     // For backwards compatibility, return an absolute path representation where
     // available:
-    OUStringBuffer path;
+    OUString rootPath;
     rtl::Reference< RootAccess > root(getRootAccess());
     if (root.is()) {
-        path.append(root->getAbsolutePathRepresentation());
+        rootPath = root->getAbsolutePathRepresentation();
     }
     OUString rel(getRelativePathRepresentation());
-    if (!path.isEmpty() && !rel.isEmpty()) {
+    OUStringBuffer path(rootPath);
+    if (!rootPath.isEmpty() && rootPath != "/" && !rel.isEmpty()) {
         path.append('/');
     }
     path.append(rel);
commit 7468f9b773d5a9a4cb3af57cf123c2a0e7e937fd
Author: Noel Grandin <noel at peralex.com>
Date:   Fri Dec 6 10:39:34 2013 +0200

    fdo#72125 - Expert config dialog takes too much time to come up
    
    This is not a full fix, this just trims some of the fat in
    CuiAboutConfigTabPage::FillItems.
    Specifically
      - improve string handling
      - don't use catch/throw unnecessarily
    
    Change-Id: I5b4987407bd007fbbb18f76fcf26f4a33282c0c0
    Signed-off-by: Stephan Bergmann <sbergman at redhat.com>:
     reintroduced lost "/" into path of recursive FillItems calls

diff --git a/cui/source/options/optaboutconfig.cxx b/cui/source/options/optaboutconfig.cxx
index 6f8a757..ad145de 100644
--- a/cui/source/options/optaboutconfig.cxx
+++ b/cui/source/options/optaboutconfig.cxx
@@ -26,6 +26,7 @@
 
 #include <vector>
 #include <boost/shared_ptr.hpp>
+#include <iostream>
 
 using namespace svx;
 using namespace ::com::sun::star;
@@ -209,37 +210,26 @@ sal_Bool CuiAboutConfigTabPage::FillItemSet(/* SfxItemSet&*/ )
 
 void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAccess, const OUString& sPath)
 {
-    sal_Bool bIsLeafNode;
-
-    Reference< XHierarchicalNameAccess > xHierarchicalNameAccess( xNameAccess, uno::UNO_QUERY_THROW );
-
     uno::Sequence< OUString > seqItems = xNameAccess->getElementNames();
     for( sal_Int16 i = 0; i < seqItems.getLength(); ++i )
     {
-        Any aNode = xHierarchicalNameAccess->getByHierarchicalName( seqItems[i] );
-
-        bIsLeafNode = sal_True;
-
-        try
-        {
-            Reference< XHierarchicalNameAccess >xNextHierarchicalNameAccess( aNode, uno::UNO_QUERY_THROW );
-            Reference< XNameAccess > xNextNameAccess( xNextHierarchicalNameAccess, uno::UNO_QUERY_THROW );
-            FillItems( xNextNameAccess, sPath + OUString("/") + seqItems[i] );
-            bIsLeafNode = sal_False;
+        Any aNode = xNameAccess->getByName( seqItems[i] );
 
-        }
-        catch( uno::Exception& )
+        Reference< XNameAccess > xNextNameAccess( aNode, uno::UNO_QUERY );
+        if( xNextNameAccess.is() )
         {
+            // not leaf node
+            FillItems( xNextNameAccess, sPath + "/" + seqItems[i] );
         }
-
-        if( bIsLeafNode )
+        else
         {
-            Any aProp = xHierarchicalNameAccess->getByHierarchicalName(seqItems[i]);
+            // leaf node
+            OUString sType = aNode.getValueTypeName();
 
             OUString sValue;
-            if( aProp.hasValue() )
+            if( aNode.hasValue() )
             {
-                switch( aProp.getValueType().getTypeClass() )
+                switch( aNode.getValueType().getTypeClass() )
                 {
                     case ::com::sun::star::uno::TypeClass_UNSIGNED_SHORT :
                     case ::com::sun::star::uno::TypeClass_SHORT :
@@ -248,10 +238,9 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
                     //case ::com::sun::star::uno::TypeClass_INT :
                     {
                         sal_Int32 nVal = 0;
-                        if(aProp >>= nVal)
+                        if(aNode >>= nVal)
                         {
-                            OUString aNumber( OUString::number( nVal ) );
-                            sValue = aNumber;
+                            sValue = OUString::number( nVal );
                         }
                     }
                     break;
@@ -259,10 +248,9 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
                     case ::com::sun::star::uno::TypeClass_BOOLEAN :
                     {
                         sal_Bool bVal = sal_False;
-                        if(aProp >>= bVal  )
+                        if(aNode >>= bVal  )
                         {
-                            OUString sBoolean( OUString::boolean( bVal ) );
-                            sValue = sBoolean;
+                            sValue = OUString::boolean( bVal );
                         }
                     }
                     break;
@@ -270,7 +258,7 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
                     case ::com::sun::star::uno::TypeClass_STRING :
                     {
                         OUString sString;
-                        if(aProp >>= sString)
+                        if(aNode >>= sString)
                         {
                             sValue = sString;
                         }
@@ -282,43 +270,38 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
                     //case ::com::sun::star::uno::TypeClass_ARRAY :
                     {
                         sValue = "";
-                        if( OUString("[]long") ==aProp.getValueTypeName() ||
-                                OUString("[]short")==aProp.getValueTypeName() )
+                        if( "[]long" == sType || "[]short"== sType )
                         {
                             uno::Sequence<sal_Int32> seqLong;
-                            if( aProp >>= seqLong )
+                            if( aNode >>= seqLong )
                             {
                                 for(int nInd=0;  nInd < seqLong.getLength(); ++nInd)
                                 {
-                                    OUString sNumber( OUString::number(seqLong[nInd]) );
-                                    sValue += sNumber;
-                                    sValue += ",";
+                                    sValue += OUString::number(seqLong[nInd]) + ",";
                                 }
                             }
                         }
 
-                        if( OUString("[]string") == aProp.getValueTypeName() )
+                        if( "[]string" == sType )
                         {
                             uno::Sequence< OUString > seqOUString;
-                            if( aProp >>= seqOUString )
+                            if( aNode >>= seqOUString )
                             {
                                 for( sal_Int16 nInd=0; nInd < seqOUString.getLength(); ++nInd )
                                 {
-                                    sValue += seqOUString[nInd] + OUString(",");
+                                    sValue += seqOUString[nInd] + ",";
                                 }
                             }
                         }
 
-                        if( OUString("[]hyper") == aProp.getValueTypeName() )
+                        if( "[]hyper" == sType )
                         {
                             uno::Sequence< sal_Int64 > seqHyp;
-                            if( aProp >>= seqHyp )
+                            if( aNode >>= seqHyp )
                             {
                                 for(int nInd = 0; nInd < seqHyp.getLength(); ++nInd)
                                 {
-                                    OUString sHyper( OUString::number( seqHyp[nInd] ) );
-                                    sValue += sHyper;
-                                    sValue += ",";
+                                    sValue += OUString::number( seqHyp[nInd] ) + ",";
                                 }
                             }
                         }
@@ -327,13 +310,12 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
 
                     default:
                     {
-                        if( OUString("hyper") == aProp.getValueTypeName() )
+                        if( "hyper" == sType )
                         {
                             sal_Int64 nHyp = 0;
-                            if(aProp >>= nHyp)
+                            if(aNode >>= nHyp)
                             {
-                                OUString aHyp( OUString::number( nHyp ) );
-                                sValue = aHyp;
+                                sValue = OUString::number( nHyp );
                             }
                         }else
                             sValue = "";
@@ -341,8 +323,7 @@ void CuiAboutConfigTabPage::FillItems(const Reference< XNameAccess >& xNameAcces
                 }
             }
 
-            OUString sType = aProp.getValueTypeName();
-            InsertEntry( sPath, seqItems [ i ], sType, sValue);
+            InsertEntry( sPath, seqItems[i], sType, sValue);
         }
     }
 }


More information about the Libreoffice-commits mailing list