diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2020-01-06 01:20:13 +0300 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-01-22 20:42:23 +0100 |
commit | fa28b588db339964303a06d739a4424b97d642cb (patch) | |
tree | 7e6a9bc0ad274830e575c400ed2f76817aa178e9 | |
parent | 92051303dce5efbc29b2afe426f9e076cee01736 (diff) |
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@collabora.com>
(cherry picked from commit 016c69c99e1ab26e6582ca8dea6fa1b4b9e5d109)
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/86406
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | sw/source/ui/fldui/flddb.cxx | 58 | ||||
-rw-r--r-- | sw/source/ui/fldui/flddb.hxx | 1 |
2 files changed, 35 insertions, 24 deletions
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; |