[Libreoffice-commits] core.git: Branch 'libreoffice-6-3' - sw/source
Mike Kaganski (via logerrit)
logerrit at kemper.freedesktop.org
Wed Jan 22 19:42:58 UTC 2020
sw/source/ui/fldui/flddb.cxx | 58 +++++++++++++++++++++++++------------------
sw/source/ui/fldui/flddb.hxx | 1
2 files changed, 35 insertions(+), 24 deletions(-)
New commits:
commit fa28b588db339964303a06d739a4424b97d642cb
Author: Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Mon Jan 6 01:20:13 2020 +0300
Commit: Caolán McNamara <caolanm at redhat.com>
CommitDate: Wed Jan 22 20:42:23 2020 +0100
tdf#129798: store SwWrtShell when it's available
GetActiveWrtShell may return nullptr when attaching a new component
to current frame, e.g. destroying on print preview. OTOH SwWrtShell
is passed to SwFieldDBPage::SetWrtShell on creation, so store it to
own base class then.
Possibly that would be enough, and we could remove all the checks
in other methods - but I don't know the code well enough to be sure
that SwFieldDlg::PageCreated and SwFieldEditDlg::CreatePage will
always set SwWrtShell; to be on the safe side, I kept the checks
where SwWrtShell is used, and stored it in those places if not yet
stored.
Regression after commit 39ba5e3bde93358af1b363da8f850bdc96806cfa.
Change-Id: I21f3c8ef24764e98b1bc287db3c6485ce0b3ab48
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86253
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski at collabora.com>
(cherry picked from commit 016c69c99e1ab26e6582ca8dea6fa1b4b9e5d109)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86406
Reviewed-by: Caolán McNamara <caolanm at redhat.com>
diff --git a/sw/source/ui/fldui/flddb.cxx b/sw/source/ui/fldui/flddb.cxx
index cca2f31abaeb..1524c7abcbe3 100644
--- a/sw/source/ui/fldui/flddb.cxx
+++ b/sw/source/ui/fldui/flddb.cxx
@@ -75,13 +75,14 @@ SwFieldDBPage::~SwFieldDBPage()
void SwFieldDBPage::dispose()
{
- SwWrtShell* pSh = GetWrtShell();
- if (!pSh)
- pSh = ::GetActiveWrtShell();
- // This would cleanup in the case of cancelled dialog
- SwDBManager* pDbManager = pSh->GetDoc()->GetDBManager();
- if (pDbManager)
- pDbManager->RevokeLastRegistrations();
+ // If we have no stored SwWrtShell, it means we didn't do anything useful - no need to revoke.
+ if (SwWrtShell* pSh = GetWrtShell())
+ {
+ // This would cleanup in the case of cancelled dialog
+ SwDBManager* pDbManager = pSh->GetDoc()->GetDBManager();
+ if (pDbManager)
+ pDbManager->RevokeLastRegistrations();
+ }
SwFieldPage::dispose();
}
@@ -144,9 +145,7 @@ void SwFieldDBPage::Reset(const SfxItemSet*)
}
else
{
- SwWrtShell *pSh = GetWrtShell();
- if(!pSh)
- pSh = ::GetActiveWrtShell();
+ SwWrtShell *pSh = CheckAndGetWrtShell();
if(pSh)
{
SwDBData aTmp(pSh->GetDBData());
@@ -199,9 +198,8 @@ bool SwFieldDBPage::FillItemSet(SfxItemSet* )
aData.sDataSource = m_xDatabaseTLB->GetDBName(sTableName, sColumnName, &bIsTable);
aData.sCommand = sTableName;
aData.nCommandType = bIsTable ? 0 : 1;
- SwWrtShell *pSh = GetWrtShell();
- if(!pSh)
- pSh = ::GetActiveWrtShell();
+ SwWrtShell *pSh = CheckAndGetWrtShell();
+ assert(pSh);
SwDBManager* pDbManager = pSh->GetDoc()->GetDBManager();
if (pDbManager)
@@ -294,9 +292,8 @@ void SwFieldDBPage::TypeHdl(const weld::TreeView* pBox)
if (nOld == GetTypeSel())
return;
- SwWrtShell *pSh = GetWrtShell();
- if(!pSh)
- pSh = ::GetActiveWrtShell();
+ SwWrtShell *pSh = CheckAndGetWrtShell();
+ assert(pSh);
bool bCond = false, bSetNo = false, bFormat = false, bDBFormat = false;
const sal_uInt16 nTypeId = m_xTypeLB->get_id(GetTypeSel()).toUInt32();
@@ -488,15 +485,14 @@ IMPL_LINK(SwFieldDBPage, TreeSelectHdl, weld::TreeView&, rBox, void)
IMPL_LINK_NOARG(SwFieldDBPage, AddDBHdl, weld::Button&, void)
{
- SwWrtShell* pSh = GetWrtShell();
- if (!pSh)
- pSh = ::GetActiveWrtShell();
-
- OUString sNewDB
- = SwDBManager::LoadAndRegisterDataSource(GetDialogFrameWeld(), pSh->GetDoc()->GetDocShell());
- if(!sNewDB.isEmpty())
+ if (SwWrtShell* pSh = CheckAndGetWrtShell())
{
- m_xDatabaseTLB->AddDataSource(sNewDB);
+ OUString sNewDB
+ = SwDBManager::LoadAndRegisterDataSource(GetDialogFrameWeld(), pSh->GetDoc()->GetDocShell());
+ if (!sNewDB.isEmpty())
+ {
+ m_xDatabaseTLB->AddDataSource(sNewDB);
+ }
}
}
@@ -524,7 +520,21 @@ void SwFieldDBPage::ActivateMailMergeAddress()
void SwFieldDBPage::SetWrtShell(SwWrtShell& rSh)
{
+ // We need to remember the shell to be able to call correct SwDBManager
+ SwFieldPage::SetWrtShell(&rSh);
m_xDatabaseTLB->SetWrtShell(rSh);
}
+SwWrtShell* SwFieldDBPage::CheckAndGetWrtShell()
+{
+ SwWrtShell* pSh = GetWrtShell();
+ if (!pSh)
+ {
+ pSh = ::GetActiveWrtShell();
+ if (pSh) // this is not guaranteed: e.g., activating print preview with dialog active
+ SetWrtShell(*pSh);
+ }
+ return pSh;
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/ui/fldui/flddb.hxx b/sw/source/ui/fldui/flddb.hxx
index c1ae1b8e5768..942f811ee230 100644
--- a/sw/source/ui/fldui/flddb.hxx
+++ b/sw/source/ui/fldui/flddb.hxx
@@ -60,6 +60,7 @@ class SwFieldDBPage : public SwFieldPage
void CheckInsert();
using SwFieldPage::SetWrtShell;
+ SwWrtShell* CheckAndGetWrtShell();
protected:
virtual sal_uInt16 GetGroup() override;
More information about the Libreoffice-commits
mailing list