[Libreoffice-commits] core.git: dbaccess/source

Caolán McNamara (via logerrit) logerrit at kemper.freedesktop.org
Wed Aug 12 18:21:33 UTC 2020


 dbaccess/source/ui/control/tabletree.cxx |   99 ++++++++++++++++++++++---------
 dbaccess/source/ui/inc/tabletree.hxx     |   57 +++++++++++++++++
 2 files changed, 128 insertions(+), 28 deletions(-)

New commits:
commit c299e1255974c5564333480a5f8f0877c1011bc4
Author:     Caolán McNamara <caolanm at redhat.com>
AuthorDate: Sun Aug 9 17:59:48 2020 +0100
Commit:     Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Aug 12 20:20:52 2020 +0200

    sync OTableTreeListBox and TableTreeListBox
    
    Change-Id: I52c26e055c599e266221d6092957a0e764744e20
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100409
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/dbaccess/source/ui/control/tabletree.cxx b/dbaccess/source/ui/control/tabletree.cxx
index 414cacbc8afe..b565b62cbbf6 100644
--- a/dbaccess/source/ui/control/tabletree.cxx
+++ b/dbaccess/source/ui/control/tabletree.cxx
@@ -62,6 +62,8 @@ namespace DatabaseObjectContainer = ::com::sun::star::sdb::application::Database
 OTableTreeListBox::OTableTreeListBox(vcl::Window* pParent, WinBits nWinStyle)
     : DBTreeListBox(pParent, nWinStyle)
     , m_xImageProvider( new ImageProvider )
+    , m_bVirtualRoot(false)
+    , m_bNoEmptyFolders( false )
 {
     InitButtonData();
 
@@ -326,6 +328,20 @@ void OTableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConn
 
     try
     {
+        if (haveVirtualRoot())
+        {
+            OUString sRootEntryText;
+            if ( std::none_of(_rTables.begin(),_rTables.end(),
+                                [] (const TNames::value_type& name) { return !name.second; }) )
+                sRootEntryText  = DBA_RES(STR_ALL_TABLES);
+            else if ( std::none_of(_rTables.begin(),_rTables.end(),
+                                     [] (const TNames::value_type& name) { return name.second; }) )
+                sRootEntryText  = DBA_RES(STR_ALL_VIEWS);
+            else
+                sRootEntryText  = DBA_RES(STR_ALL_TABLES_AND_VIEWS);
+            InsertEntry( sRootEntryText, nullptr, false, TREELIST_APPEND, reinterpret_cast< void* >( DatabaseObjectContainer::TABLES ) );
+        }
+
         if ( _rTables.empty() )
             // nothing to do (besides inserting the root entry)
             return;
@@ -335,14 +351,10 @@ void OTableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConn
         for (auto const& table : _rTables)
         {
             // add the entry
-            implAddEntry(
-                xMeta,
-                table.first,
-                false
-            );
+            implAddEntry(xMeta, table.first, false);
         }
 
-        if ( lcl_shouldDisplayEmptySchemasAndCatalogs( _rxConnection ) )
+        if ( !m_bNoEmptyFolders && lcl_shouldDisplayEmptySchemasAndCatalogs( _rxConnection ) )
         {
             bool bSupportsCatalogs = xMeta->supportsCatalogsInDataManipulation();
             bool bSupportsSchemas = xMeta->supportsSchemasInDataManipulation();
@@ -358,11 +370,12 @@ void OTableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConn
                     bCatalogs ? xMeta->getCatalogs() : xMeta->getSchemas(), 1 ) );
                 sal_Int32 nFolderType = bCatalogs ? DatabaseObjectContainer::CATALOG : DatabaseObjectContainer::SCHEMA;
 
+                SvTreeListEntry* pRootEntry = getAllObjectsEntry();
                 for (auto const& folderName : aFolderNames)
                 {
-                    SvTreeListEntry* pFolder = GetEntryPosByName( folderName, nullptr );
+                    SvTreeListEntry* pFolder = GetEntryPosByName( folderName, pRootEntry );
                     if ( !pFolder )
-                        InsertEntry( folderName, nullptr, false, TREELIST_APPEND, reinterpret_cast< void* >( nFolderType ) );
+                        InsertEntry( folderName, pRootEntry, false, TREELIST_APPEND, reinterpret_cast< void* >( nFolderType ) );
                 }
             }
         }
@@ -419,7 +432,7 @@ void TableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConne
         for (auto const& table : _rTables)
         {
             // add the entry
-            implAddEntry(xMeta, table.first);
+            implAddEntry(xMeta, table.first, false);
         }
 
         if ( !m_bNoEmptyFolders && lcl_shouldDisplayEmptySchemasAndCatalogs( _rxConnection ) )
@@ -467,11 +480,28 @@ void TableTreeListBox::UpdateTableList( const Reference< XConnection >& _rxConne
     m_xTreeView->make_sorted();
 }
 
+bool OTableTreeListBox::isWildcardChecked(SvTreeListEntry* _pEntry)
+{
+    if (_pEntry)
+    {
+        OBoldListboxString* pTextItem = static_cast<OBoldListboxString*>(_pEntry->GetFirstItem(SvLBoxItemType::String));
+        if (pTextItem)
+            return pTextItem->isEmphasized();
+    }
+    return false;
+}
+
 bool TableTreeListBox::isWildcardChecked(const weld::TreeIter& rEntry)
 {
     return m_xTreeView->get_text_emphasis(rEntry, 0);
 }
 
+void OTableTreeListBox::checkWildcard(SvTreeListEntry* _pEntry)
+{
+    SetCheckButtonState(_pEntry, SvButtonState::Checked);
+    checkedButton_noBroadcast(_pEntry);
+}
+
 void TableTreeListBox::checkWildcard(weld::TreeIter& rEntry)
 {
     if (!m_bShowToggles)
@@ -480,6 +510,11 @@ void TableTreeListBox::checkWildcard(weld::TreeIter& rEntry)
     checkedButton_noBroadcast(rEntry);
 }
 
+SvTreeListEntry* OTableTreeListBox::getAllObjectsEntry() const
+{
+    return haveVirtualRoot() ? First() : nullptr;
+}
+
 std::unique_ptr<weld::TreeIter> TableTreeListBox::getAllObjectsEntry() const
 {
     if (!haveVirtualRoot())
@@ -600,6 +635,7 @@ void OTableTreeListBox::CheckButtons()
 void OTableTreeListBox::CheckButtonHdl()
 {
     checkedButton_noBroadcast(GetHdlEntry());
+    m_aCheckButtonHandler.Call(this);
 }
 
 void OTableTreeListBox::Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& _rRect)
@@ -695,11 +731,18 @@ void OTableTreeListBox::implEmphasize(SvTreeListEntry* _pEntry, bool _bChecked,
 {
     OSL_ENSURE(_pEntry, "OTableTreeListBox::implEmphasize: invalid entry (NULL)!");
 
-    if ( GetModel()->HasChildren(_pEntry) )             // the entry has children
+    // special emphasizing handling for the "all objects" entry
+    bool bAllObjectsEntryAffected = haveVirtualRoot() && (getAllObjectsEntry() == _pEntry);
+    if  (   GetModel()->HasChildren(_pEntry)              // the entry has children
+        ||  bAllObjectsEntryAffected                    // or it is the "all objects" entry
+        )
     {
         OBoldListboxString* pTextItem = static_cast<OBoldListboxString*>(_pEntry->GetFirstItem(SvLBoxItemType::String));
         if (pTextItem)
             pTextItem->emphasize(_bChecked);
+
+        if (bAllObjectsEntryAffected)
+            InvalidateEntry(_pEntry);
     }
 
     if (_bUpdateDescendants)
@@ -782,7 +825,7 @@ SvTreeListEntry* OTableTreeListBox::implAddEntry(
     OUString sCatalog, sSchema, sName;
     qualifiedNameComponents( _rxMeta, _rTableName, sCatalog, sSchema, sName, ::dbtools::EComposeRule::InDataManipulation );
 
-    SvTreeListEntry* pParentEntry = nullptr;
+    SvTreeListEntry* pParentEntry = getAllObjectsEntry();
 
     // if the DB uses catalog at the start of identifiers, then our hierarchy is
     //   catalog
@@ -830,7 +873,8 @@ SvTreeListEntry* OTableTreeListBox::implAddEntry(
 
 void TableTreeListBox::implAddEntry(
         const Reference< XDatabaseMetaData >& _rxMeta,
-        const OUString& _rTableName
+        const OUString& _rTableName,
+        bool _bCheckName
     )
 {
     OSL_PRECOND( _rxMeta.is(), "OTableTreeListBox::implAddEntry: invalid meta data!" );
@@ -893,21 +937,24 @@ void TableTreeListBox::implAddEntry(
         xParentEntry = std::move(xFolder);
     }
 
-    std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
-    m_xTreeView->insert(xParentEntry.get(), -1, nullptr, nullptr, nullptr, nullptr, false, xEntry.get());
-
-    auto xGraphic = m_xImageProvider->getXGraphic(_rTableName, DatabaseObject::TABLE);
-    if (xGraphic.is())
-        m_xTreeView->set_image(*xEntry, xGraphic, -1);
-    else
+    if (!_bCheckName || !GetEntryPosByName(sName, xParentEntry.get()))
     {
-        OUString sImageId(m_xImageProvider->getImageId(_rTableName, DatabaseObject::TABLE));
-        m_xTreeView->set_image(*xEntry, sImageId, -1);
+        std::unique_ptr<weld::TreeIter> xEntry = m_xTreeView->make_iterator();
+        m_xTreeView->insert(xParentEntry.get(), -1, nullptr, nullptr, nullptr, nullptr, false, xEntry.get());
+
+        auto xGraphic = m_xImageProvider->getXGraphic(_rTableName, DatabaseObject::TABLE);
+        if (xGraphic.is())
+            m_xTreeView->set_image(*xEntry, xGraphic, -1);
+        else
+        {
+            OUString sImageId(m_xImageProvider->getImageId(_rTableName, DatabaseObject::TABLE));
+            m_xTreeView->set_image(*xEntry, sImageId, -1);
+        }
+        if (m_bShowToggles)
+            m_xTreeView->set_toggle(*xEntry, TRISTATE_FALSE);
+        m_xTreeView->set_text(*xEntry, sName, 0);
+        m_xTreeView->set_text_emphasis(*xEntry, false, 0);
     }
-    if (m_bShowToggles)
-        m_xTreeView->set_toggle(*xEntry, TRISTATE_FALSE);
-    m_xTreeView->set_text(*xEntry, sName, 0);
-    m_xTreeView->set_text_emphasis(*xEntry, false, 0);
 }
 
 NamedDatabaseObject OTableTreeListBox::describeObject( SvTreeListEntry* _pEntry )
@@ -1015,7 +1062,7 @@ SvTreeListEntry* OTableTreeListBox::getEntryByQualifiedName( const OUString& _rN
         OUString sCatalog, sSchema, sName;
         qualifiedNameComponents(xMeta, _rName, sCatalog, sSchema, sName,::dbtools::EComposeRule::InDataManipulation);
 
-        SvTreeListEntry* pParent = nullptr;
+        SvTreeListEntry* pParent = getAllObjectsEntry();
         SvTreeListEntry* pCat = nullptr;
         SvTreeListEntry* pSchema = nullptr;
         if ( !sCatalog.isEmpty() )
diff --git a/dbaccess/source/ui/inc/tabletree.hxx b/dbaccess/source/ui/inc/tabletree.hxx
index 179fce227f75..97b1ba7cc666 100644
--- a/dbaccess/source/ui/inc/tabletree.hxx
+++ b/dbaccess/source/ui/inc/tabletree.hxx
@@ -36,18 +36,26 @@ namespace dbaui
 class OTableTreeListBox final : public DBTreeListBox
 {
     std::unique_ptr<SvLBoxButtonData> m_pCheckButton;
+    Link<void*,void>    m_aCheckButtonHandler;
+
     css::uno::Reference< css::sdbc::XConnection >
                     m_xConnection;      // the connection we're working for, set in implOnNewConnection, called by UpdateTableList
     std::unique_ptr< ImageProvider >
                     m_xImageProvider;   // provider for our images
+    bool            m_bVirtualRoot;     // should the first entry be visible
+    bool            m_bNoEmptyFolders;  // should empty catalogs/schematas be prevented from being displayed?
 
 public:
     OTableTreeListBox(vcl::Window* pParent, WinBits nWinStyle);
     virtual void dispose() override;
 
+    void init() { m_bVirtualRoot = true; }
+
     typedef std::pair< OUString, bool > TTableViewName;
     typedef std::vector< TTableViewName >         TNames;
 
+    void    suppressEmptyFolders() { m_bNoEmptyFolders = true; }
+
     /** call when HiContrast change.
     */
     void notifyHiContrastChanged();
@@ -100,10 +108,24 @@ public:
 
     SvTreeListEntry*    getEntryByQualifiedName( const OUString& _rName );
 
+    SvTreeListEntry*    getAllObjectsEntry() const;
+
+    /** does a wildcard check of the given entry
+        <p>There are two different 'checked' states: If the user checks all children of an entry, this is different
+        from checking the entry itself. The second is called 'wildcard' checking, 'cause in the resulting
+        table filter it's represented by a wildcard.</p>
+    */
+    void            checkWildcard(SvTreeListEntry* _pEntry);
+
+    /** determine if the given entry is 'wildcard checked'
+        @see checkWildcard
+    */
+    static bool     isWildcardChecked(SvTreeListEntry* pEntry);
+
 private:
     virtual void InitEntry(SvTreeListEntry* _pEntry, const OUString& _rString, const Image& _rCollapsedBitmap, const Image& _rExpandedBitmap) override;
 
-    virtual void    CheckButtonHdl() override;
+    virtual void CheckButtonHdl() override;
     void checkedButton_noBroadcast(SvTreeListEntry* _pEntry);
 
     void implEmphasize(SvTreeListEntry* _pEntry, bool _bChecked, bool _bUpdateDescendants = true, bool _bUpdateAncestors = true);
@@ -125,6 +147,8 @@ private:
 
     bool    impl_getAndAssertMetaData( css::uno::Reference< css::sdbc::XDatabaseMetaData >& _out_rMetaData ) const;
 
+    bool haveVirtualRoot() const { return m_bVirtualRoot; }
+
     /** fill the table list with the tables and views determined by the two given containers
         @param      _rxConnection   the connection where you got the object names from. Must not be NULL.
                                     Used to split the full qualified names into its parts.
@@ -137,6 +161,9 @@ private:
 
     void InitButtonData();
 
+    /// the handler given is called whenever the check state of one or more items changed
+    void SetCheckHandler(const Link<void*,void>& _rHdl) { m_aCheckButtonHandler = _rHdl; }
+
     SvButtonState   implDetermineState(SvTreeListEntry* _pEntry);
         // determines the check state of the given entry, by analyzing the states of all descendants
 
@@ -170,6 +197,10 @@ public:
     void    SuppressEmptyFolders() { m_bNoEmptyFolders = true; }
     void    DisableCheckButtons();
 
+    /** determines whether the given entry denotes a tables folder
+    */
+    static bool isFolderEntry( const SvTreeListEntry* _pEntry );
+
     /** fill the table list with the tables belonging to the connection described by the parameters
         @param _rxConnection
             the connection, which must support the service com.sun.star.sdb.Connection
@@ -193,6 +224,27 @@ public:
                 const css::uno::Sequence< OUString>& _rViews
             );
 
+    /** returns a NamedDatabaseObject record which describes the given entry
+    */
+    css::sdb::application::NamedDatabaseObject
+            describeObject( SvTreeListEntry* _pEntry );
+
+    /** to be used if a foreign instance added a table
+    */
+    SvTreeListEntry* addedTable( const OUString& _rName );
+
+    /** to be used if a foreign instance removed a table
+    */
+    void    removedTable( const OUString& _rName );
+
+    /** returns the fully qualified name of a table entry
+        @param _pEntry
+            the entry whose name is to be obtained. Must not denote a folder entry.
+    */
+    OUString getQualifiedTableName( SvTreeListEntry* _pEntry ) const;
+
+    SvTreeListEntry*    getEntryByQualifiedName( const OUString& _rName );
+
     std::unique_ptr<weld::TreeIter>    getAllObjectsEntry() const;
 
     /** does a wildcard check of the given entry
@@ -224,7 +276,8 @@ private:
     */
     void implAddEntry(
             const css::uno::Reference< css::sdbc::XDatabaseMetaData >& _rxMeta,
-            const OUString& _rTableName
+            const OUString& _rTableName,
+            bool _bCheckName = true
         );
 
     void    implOnNewConnection( const css::uno::Reference< css::sdbc::XConnection >& _rxConnection );


More information about the Libreoffice-commits mailing list