[Libreoffice-commits] core.git: Branch 'distro/collabora/co-2021' - 10 commits - include/vcl sc/source vcl/inc vcl/jsdialog vcl/source
Szymon KÅos (via logerrit)
logerrit at kemper.freedesktop.org
Wed Apr 7 11:06:14 UTC 2021
include/vcl/jsdialog/executor.hxx | 2
include/vcl/toolkit/dialog.hxx | 3
sc/source/ui/attrdlg/scdlgfact.cxx | 21 ++
sc/source/ui/attrdlg/scdlgfact.hxx | 15 +-
sc/source/ui/cctrl/checklistmenu.cxx | 20 ++
sc/source/ui/view/cellsh1.cxx | 254 ++++++++++++++++++++---------------
sc/source/ui/view/gridwin2.cxx | 8 -
vcl/inc/jsdialog/jsdialogbuilder.hxx | 55 +++++++
vcl/jsdialog/executor.cxx | 34 ++++
vcl/jsdialog/jsdialogbuilder.cxx | 133 +++++++++++++++++-
vcl/source/window/builder.cxx | 30 ++--
vcl/source/window/dialog.cxx | 37 ++++-
12 files changed, 474 insertions(+), 138 deletions(-)
New commits:
commit e02eebde65bfe427b56970ef2704a8f746ac563d
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Dec 2 15:06:35 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:05:36 2021 +0200
jsdialog: use valid window instance
Change-Id: I3b7e98de41f56abbab1d8c15b7928089ebf8159a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107077
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107339
Tested-by: Jenkins
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index 051c90c7b6db..3c663bac10e0 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -363,12 +363,6 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id)
InsertWindowToMap(m_nWindowId);
- std::unique_ptr<weld::Dialog> pRet(pDialog ? new JSDialog(m_aOwnedToplevel, m_aOwnedToplevel,
- pDialog, this, false, m_sTypeOfJSON)
- : nullptr);
-
- RememberWidget("__DIALOG__", pRet.get());
-
if (pDialog)
{
assert(!m_aOwnedToplevel && "only one toplevel per .ui allowed");
@@ -377,6 +371,12 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id)
m_bHasTopLevelDialog = true;
}
+ std::unique_ptr<weld::Dialog> pRet(pDialog ? new JSDialog(m_aOwnedToplevel, m_aOwnedToplevel,
+ pDialog, this, false, m_sTypeOfJSON)
+ : nullptr);
+
+ RememberWidget("__DIALOG__", pRet.get());
+
const vcl::ILibreOfficeKitNotifier* pNotifier = pDialog->GetLOKNotifier();
if (pNotifier)
{
commit cd96198e70c29865c96fa3daebe5a0f5b506a5ed
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Mon Nov 30 05:55:55 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:05:04 2021 +0200
Make Pivot table db & external source dialogs async
Change-Id: Iff1a49a9fa04b55ece1aa30259ab57d105883eda
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106996
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108798
Tested-by: Jenkins
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx b/sc/source/ui/attrdlg/scdlgfact.cxx
index 295d61f5270a..00b62493743f 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -105,6 +105,11 @@ short AbstractScDataPilotDatabaseDlg_Impl::Execute()
return m_xDlg->run();
}
+bool AbstractScDataPilotDatabaseDlg_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+ return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
short AbstractScDataPilotSourceTypeDlg_Impl::Execute()
{
return m_xDlg->run();
@@ -120,6 +125,11 @@ short AbstractScDataPilotServiceDlg_Impl::Execute()
return m_xDlg->run();
}
+bool AbstractScDataPilotServiceDlg_Impl::StartExecuteAsync(VclAbstractDialog::AsyncContext &rCtx)
+{
+ return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
short AbstractScDeleteCellDlg_Impl::Execute()
{
return m_xDlg->run();
@@ -985,7 +995,7 @@ VclPtr<AbstractScCondFormatManagerDlg> ScAbstractDialogFactory_Impl::CreateScCon
VclPtr<AbstractScDataPilotDatabaseDlg> ScAbstractDialogFactory_Impl::CreateScDataPilotDatabaseDlg(weld::Window* pParent)
{
- return VclPtr<AbstractScDataPilotDatabaseDlg_Impl>::Create(std::make_unique<ScDataPilotDatabaseDlg>(pParent));
+ return VclPtr<AbstractScDataPilotDatabaseDlg_Impl>::Create(std::make_shared<ScDataPilotDatabaseDlg>(pParent));
}
VclPtr<AbstractScDataPilotSourceTypeDlg> ScAbstractDialogFactory_Impl::CreateScDataPilotSourceTypeDlg(
@@ -997,7 +1007,7 @@ VclPtr<AbstractScDataPilotSourceTypeDlg> ScAbstractDialogFactory_Impl::CreateScD
VclPtr<AbstractScDataPilotServiceDlg> ScAbstractDialogFactory_Impl::CreateScDataPilotServiceDlg(weld::Window* pParent,
const std::vector<OUString>& rServices)
{
- return VclPtr<AbstractScDataPilotServiceDlg_Impl>::Create(std::make_unique<ScDataPilotServiceDlg>(pParent, rServices));
+ return VclPtr<AbstractScDataPilotServiceDlg_Impl>::Create(std::make_shared<ScDataPilotServiceDlg>(pParent, rServices));
}
VclPtr<AbstractScDeleteCellDlg> ScAbstractDialogFactory_Impl::CreateScDeleteCellDlg(weld::Window* pParent,
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx b/sc/source/ui/attrdlg/scdlgfact.hxx
index aaa94d0ddae9..088dae2b5547 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -165,13 +165,14 @@ public:
class AbstractScDataPilotDatabaseDlg_Impl :public AbstractScDataPilotDatabaseDlg
{
- std::unique_ptr<ScDataPilotDatabaseDlg> m_xDlg;
+ std::shared_ptr<ScDataPilotDatabaseDlg> m_xDlg;
public:
- explicit AbstractScDataPilotDatabaseDlg_Impl(std::unique_ptr<ScDataPilotDatabaseDlg> p)
+ explicit AbstractScDataPilotDatabaseDlg_Impl(std::shared_ptr<ScDataPilotDatabaseDlg> p)
: m_xDlg(std::move(p))
{
}
virtual short Execute() override;
+ virtual bool StartExecuteAsync(AsyncContext &) override;
virtual void GetValues( ScImportSourceDesc& rDesc ) override;
// screenshotting
@@ -202,13 +203,14 @@ public:
class AbstractScDataPilotServiceDlg_Impl : public AbstractScDataPilotServiceDlg
{
- std::unique_ptr<ScDataPilotServiceDlg> m_xDlg;
+ std::shared_ptr<ScDataPilotServiceDlg> m_xDlg;
public:
- explicit AbstractScDataPilotServiceDlg_Impl(std::unique_ptr<ScDataPilotServiceDlg> p)
+ explicit AbstractScDataPilotServiceDlg_Impl(std::shared_ptr<ScDataPilotServiceDlg> p)
: m_xDlg(std::move(p))
{
}
virtual short Execute() override;
+ virtual bool StartExecuteAsync(AsyncContext &) override;
virtual OUString GetServiceName() const override;
virtual OUString GetParSource() const override;
virtual OUString GetParName() const override;
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index d49fe9f32188..84e6422d3511 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -2956,124 +2956,149 @@ void ScCellShell::ExecuteDataPilotDialog()
pTypeDlg->StartExecuteAsync([this, pTypeDlg, pTabViewShell,
pScMod, pFact, &rDoc, &rMark, aDestPos](int nResult) mutable {
- const char* pSrcErrorId = nullptr;
- std::unique_ptr<ScDPObject> pNewDPObject;
if (nResult == RET_OK )
{
if ( pTypeDlg->IsExternal() )
{
std::vector<OUString> aSources = ScDPObject::GetRegisteredSources();
- ScopedVclPtr<AbstractScDataPilotServiceDlg> pServDlg(
+ VclPtr<AbstractScDataPilotServiceDlg> pServDlg(
pFact->CreateScDataPilotServiceDlg(
pTabViewShell->GetFrameWeld(), aSources));
- if ( pServDlg->Execute() == RET_OK )
- {
- ScDPServiceDesc aServDesc(
- pServDlg->GetServiceName(),
- pServDlg->GetParSource(),
- pServDlg->GetParName(),
- pServDlg->GetParUser(),
- pServDlg->GetParPass() );
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetServiceData( aServDesc );
- }
+ pServDlg->StartExecuteAsync([pServDlg, pScMod, pTabViewShell,
+ aDestPos, &rDoc](int nResult2) mutable {
+ if ( nResult2 == RET_OK )
+ {
+ ScDPServiceDesc aServDesc(
+ pServDlg->GetServiceName(),
+ pServDlg->GetParSource(),
+ pServDlg->GetParName(),
+ pServDlg->GetParUser(),
+ pServDlg->GetParPass() );
+ std::unique_ptr<ScDPObject> pNewDPObject(new ScDPObject(&rDoc));
+ pNewDPObject->SetServiceData( aServDesc );
+
+ if ( pNewDPObject )
+ pNewDPObject->SetOutRange( aDestPos );
+
+ RunPivotLayoutDialog(pScMod, pTabViewShell, pNewDPObject);
+ }
+
+ pServDlg->disposeOnce();
+ });
}
else if ( pTypeDlg->IsDatabase() )
{
assert(pFact && "ScAbstractFactory create fail!");
- ScopedVclPtr<AbstractScDataPilotDatabaseDlg> pDataDlg(
+ VclPtr<AbstractScDataPilotDatabaseDlg> pDataDlg(
pFact->CreateScDataPilotDatabaseDlg(pTabViewShell->GetFrameWeld()));
assert(pDataDlg && "Dialog create fail!");
- if ( pDataDlg->Execute() == RET_OK )
- {
- ScImportSourceDesc aImpDesc(&rDoc);
- pDataDlg->GetValues( aImpDesc );
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetImportDesc( aImpDesc );
- }
+
+ pDataDlg->StartExecuteAsync([pDataDlg, pScMod, pTabViewShell,
+ aDestPos, &rDoc](int nResult2) mutable {
+ if ( nResult2 == RET_OK )
+ {
+ ScImportSourceDesc aImpDesc(&rDoc);
+ pDataDlg->GetValues( aImpDesc );
+ std::unique_ptr<ScDPObject> pNewDPObject(new ScDPObject(&rDoc));
+ pNewDPObject->SetImportDesc( aImpDesc );
+
+ if ( pNewDPObject )
+ pNewDPObject->SetOutRange( aDestPos );
+
+ RunPivotLayoutDialog(pScMod, pTabViewShell, pNewDPObject);
+ }
+
+ pDataDlg->disposeOnce();
+ });
}
- else if (pTypeDlg->IsNamedRange())
+ else
{
- OUString aName = pTypeDlg->GetSelectedNamedRange();
- ScSheetSourceDesc aShtDesc(&rDoc);
- aShtDesc.SetRangeName(aName);
- pSrcErrorId = aShtDesc.CheckSourceRange();
- if (!pSrcErrorId)
+ std::unique_ptr<ScDPObject> pNewDPObject;
+ const char* pSrcErrorId = nullptr;
+
+ if (pTypeDlg->IsNamedRange())
{
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetSheetDesc(aShtDesc);
+ OUString aName = pTypeDlg->GetSelectedNamedRange();
+ ScSheetSourceDesc aShtDesc(&rDoc);
+ aShtDesc.SetRangeName(aName);
+ pSrcErrorId = aShtDesc.CheckSourceRange();
+ if (!pSrcErrorId)
+ {
+ pNewDPObject.reset(new ScDPObject(&rDoc));
+ pNewDPObject->SetSheetDesc(aShtDesc);
+ }
}
- }
- else // selection
- {
- //! use database ranges (select before type dialog?)
- ScRange aRange;
- ScMarkType eType = GetViewData()->GetSimpleArea(aRange);
- if ( (eType & SC_MARK_SIMPLE) == SC_MARK_SIMPLE )
+ else // selection
{
- // Shrink the range to the data area.
- SCCOL nStartCol = aRange.aStart.Col(), nEndCol = aRange.aEnd.Col();
- SCROW nStartRow = aRange.aStart.Row(), nEndRow = aRange.aEnd.Row();
- if (rDoc.ShrinkToDataArea(aRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow))
+ //! use database ranges (select before type dialog?)
+ ScRange aRange;
+ ScMarkType eType = GetViewData()->GetSimpleArea(aRange);
+ if ( (eType & SC_MARK_SIMPLE) == SC_MARK_SIMPLE )
{
- aRange.aStart.SetCol(nStartCol);
- aRange.aStart.SetRow(nStartRow);
- aRange.aEnd.SetCol(nEndCol);
- aRange.aEnd.SetRow(nEndRow);
- rMark.SetMarkArea(aRange);
- pTabViewShell->MarkRange(aRange);
- }
+ // Shrink the range to the data area.
+ SCCOL nStartCol = aRange.aStart.Col(), nEndCol = aRange.aEnd.Col();
+ SCROW nStartRow = aRange.aStart.Row(), nEndRow = aRange.aEnd.Row();
+ if (rDoc.ShrinkToDataArea(aRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow))
+ {
+ aRange.aStart.SetCol(nStartCol);
+ aRange.aStart.SetRow(nStartRow);
+ aRange.aEnd.SetCol(nEndCol);
+ aRange.aEnd.SetRow(nEndRow);
+ rMark.SetMarkArea(aRange);
+ pTabViewShell->MarkRange(aRange);
+ }
- bool bOK = true;
- if ( rDoc.HasSubTotalCells( aRange ) )
- {
- // confirm selection if it contains SubTotal cells
- std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
- VclMessageType::Question, VclButtonsType::YesNo,
- ScResId(STR_DATAPILOT_SUBTOTAL)));
- xQueryBox->set_default_response(RET_YES);
- if (xQueryBox->run() == RET_NO)
- bOK = false;
- }
- if (bOK)
- {
- ScSheetSourceDesc aShtDesc(&rDoc);
- aShtDesc.SetSourceRange(aRange);
- pSrcErrorId = aShtDesc.CheckSourceRange();
- if (!pSrcErrorId)
+ bool bOK = true;
+ if ( rDoc.HasSubTotalCells( aRange ) )
{
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetSheetDesc( aShtDesc );
+ // confirm selection if it contains SubTotal cells
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
+ VclMessageType::Question, VclButtonsType::YesNo,
+ ScResId(STR_DATAPILOT_SUBTOTAL)));
+ xQueryBox->set_default_response(RET_YES);
+ if (xQueryBox->run() == RET_NO)
+ bOK = false;
}
+ if (bOK)
+ {
+ ScSheetSourceDesc aShtDesc(&rDoc);
+ aShtDesc.SetSourceRange(aRange);
+ pSrcErrorId = aShtDesc.CheckSourceRange();
+ if (!pSrcErrorId)
+ {
+ pNewDPObject.reset(new ScDPObject(&rDoc));
+ pNewDPObject->SetSheetDesc( aShtDesc );
+ }
- // output below source data
- if ( aRange.aEnd.Row()+2 <= rDoc.MaxRow() - 4 )
- aDestPos = ScAddress( aRange.aStart.Col(),
- aRange.aEnd.Row()+2,
- aRange.aStart.Tab() );
+ // output below source data
+ if ( aRange.aEnd.Row()+2 <= rDoc.MaxRow() - 4 )
+ aDestPos = ScAddress( aRange.aStart.Col(),
+ aRange.aEnd.Row()+2,
+ aRange.aStart.Tab() );
+ }
}
}
- }
- }
- if (pSrcErrorId)
- {
- // Error occurred during data creation. Launch an error and bail out.
- std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
- VclMessageType::Info, VclButtonsType::Ok,
- ScResId(pSrcErrorId)));
- xInfoBox->run();
- return;
- }
+ if (pSrcErrorId)
+ {
+ // Error occurred during data creation. Launch an error and bail out.
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ ScResId(pSrcErrorId)));
+ xInfoBox->run();
+ return;
+ }
- if ( pNewDPObject )
- pNewDPObject->SetOutRange( aDestPos );
+ if ( pNewDPObject )
+ pNewDPObject->SetOutRange( aDestPos );
- pTypeDlg->disposeOnce();
+ RunPivotLayoutDialog(pScMod, pTabViewShell, pNewDPObject);
+ }
+ }
- RunPivotLayoutDialog(pScMod, pTabViewShell, pNewDPObject);
+ pTypeDlg->disposeOnce();
});
}
}
commit 5e660a454f91b9fff0b2246854bf767226804020
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Nov 25 13:39:28 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:04:47 2021 +0200
jsdialog: enable Pivot Table dialogs
Change-Id: Ic467c95f0d56d28e6c6590d488e2a0b10f65e803
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106997
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107338
Tested-by: Jenkins
diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx
index 268707b37859..ccca582b7dc8 100644
--- a/vcl/source/window/builder.cxx
+++ b/vcl/source/window/builder.cxx
@@ -165,17 +165,27 @@ weld::Builder* Application::CreateBuilder(weld::Widget* pParent, const OUString
{
bool bUseJSBuilder = false;
- if (bMobile)
- {
- if (rUIFile == "modules/swriter/ui/wordcount-mobile.ui" ||
- rUIFile == "svx/ui/findreplacedialog-mobile.ui" ||
- rUIFile == "modules/swriter/ui/watermarkdialog.ui" ||
- rUIFile == "modules/scalc/ui/validationdialog.ui" ||
- rUIFile == "modules/scalc/ui/validationcriteriapage.ui" ||
- rUIFile == "modules/scalc/ui/validationhelptabpage-mobile.ui" ||
- rUIFile == "modules/scalc/ui/erroralerttabpage-mobile.ui" ||
- rUIFile == "modules/scalc/ui/validationdialog.ui")
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ if (bMobile)
+ {
+ if (rUIFile == "modules/swriter/ui/wordcount-mobile.ui" ||
+ rUIFile == "svx/ui/findreplacedialog-mobile.ui" ||
+ rUIFile == "modules/swriter/ui/watermarkdialog.ui" ||
+ rUIFile == "modules/scalc/ui/validationdialog.ui" ||
+ rUIFile == "modules/scalc/ui/validationcriteriapage.ui" ||
+ rUIFile == "modules/scalc/ui/validationhelptabpage-mobile.ui" ||
+ rUIFile == "modules/scalc/ui/erroralerttabpage-mobile.ui" ||
+ rUIFile == "modules/scalc/ui/validationdialog.ui")
+ {
+ bUseJSBuilder = true;
+ }
+ }
+
+ if (rUIFile == "modules/scalc/ui/pivottablelayoutdialog.ui")
+ {
bUseJSBuilder = true;
+ }
}
if (bUseJSBuilder)
commit f72f9a6a23839880e09a44253dc7475bd76a0258
Author: Stephan Bergmann <sbergman at redhat.com>
AuthorDate: Mon Nov 30 22:16:15 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:04:35 2021 +0200
Fix stack-use-after-return
...introduced with 244a447734d2abae8896884d4ab73eb4510d243c "Make Pivot table
data source dialog async", as seen e.g. during UITest_calc_tests8:
> ==1217030==ERROR: AddressSanitizer: stack-use-after-return on address 0x7f06d7133444 at pc 0x7f069f0cb613 bp 0x7ffe24058430 sp 0x7ffe24058428
> WRITE of size 2 at 0x7f06d7133444 thread T0
> #0 in ScAddress::operator=(ScAddress const&) at sc/inc/address.hxx:415:10
> #1 in ScCellShell::ExecuteDataPilotDialog()::$_4::operator()(int) const at sc/source/ui/view/cellsh1.cxx:3014:42
> #2 in void std::__invoke_impl<void, ScCellShell::ExecuteDataPilotDialog()::$_4&, int>(std::__invoke_other, ScCellShell::ExecuteDataPilotDialog()::$_4&, int&&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/invoke.h:60:14
> #3 in std::enable_if<is_invocable_r_v<void, ScCellShell::ExecuteDataPilotDialog()::$_4&, int>, void>::type std::__invoke_r<void, ScCellShell::ExecuteDataPilotDialog()::$_4&, int>(ScCellShell::ExecuteDataPilotDialog()::$_4&, int&&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/invoke.h:110:2
> #4 in std::_Function_handler<void (int), ScCellShell::ExecuteDataPilotDialog()::$_4>::_M_invoke(std::_Any_data const&, int&&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/std_function.h:291:9
> #5 in std::function<void (int)>::operator()(int) const at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/std_function.h:560:9
> #6 in Dialog::EndDialog(long) at vcl/source/window/dialog.cxx:1137:9
> #7 in Dialog::ResponseHdl(Button*) at vcl/source/window/dialog.cxx:1391:5
> #8 in Dialog::LinkStubResponseHdl(void*, Button*) at vcl/source/window/dialog.cxx:1376:1
> #9 in Link<Button*, void>::Call(Button*) const at include/tools/link.hxx:111:45
> #10 in Button::Click()::$_0::operator()() const at vcl/source/control/button.cxx:124:87
> #11 in void std::__invoke_impl<void, Button::Click()::$_0&>(std::__invoke_other, Button::Click()::$_0&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/invoke.h:60:14
> #12 in std::enable_if<is_invocable_r_v<void, Button::Click()::$_0&>, void>::type std::__invoke_r<void, Button::Click()::$_0&>(Button::Click()::$_0&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/invoke.h:110:2
> #13 in std::_Function_handler<void (), Button::Click()::$_0>::_M_invoke(std::_Any_data const&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/std_function.h:291:9
> #14 in std::function<void ()>::operator()() const at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/std_function.h:560:9
> #15 in Control::ImplCallEventListenersAndHandler(VclEventId, std::function<void ()> const&) at vcl/source/control/ctrl.cxx:315:13
> #16 in Button::Click() at vcl/source/control/button.cxx:124:5
> #17 in ButtonUIObject::execute(rtl::OUString const&, std::__debug::map<rtl::OUString const, rtl::OUString, std::less<rtl::OUString const>, std::allocator<std::pair<rtl::OUString const, rtl::OUString> > > const&) at vcl/source/uitest/uiobject.cxx:614:19
> #18 in UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&)::$_0::operator()() const at vcl/source/uitest/uno/uiobject_uno.cxx:124:16
> #19 in void std::__invoke_impl<void, UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&)::$_0&>(std::__invoke_other, UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&)::$_0&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/invoke.h:60:14
> #20 in std::enable_if<is_invocable_r_v<void, UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&)::$_0&>, void>::type std::__invoke_r<void, UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&)::$_0&>(UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&)::$_0&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/invoke.h:110:2
> #21 in std::_Function_handler<void (), UIObjectUnoObj::executeAction(rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&)::$_0>::_M_invoke(std::_Any_data const&) at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/std_function.h:291:9
> #22 in std::function<void ()>::operator()() const at ~/gcc/trunk/inst/lib/gcc/x86_64-pc-linux-gnu/11.0.0/../../../../include/c++/11.0.0/bits/std_function.h:560:9
> #23 in (anonymous namespace)::ExecuteWrapper::ExecuteActionHdl(Timer*) at vcl/source/uitest/uno/uiobject_uno.cxx:83:13
> #24 in (anonymous namespace)::ExecuteWrapper::LinkStubExecuteActionHdl(void*, Timer*) at vcl/source/uitest/uno/uiobject_uno.cxx:78:1
> #25 in Link<Timer*, void>::Call(Timer*) const at include/tools/link.hxx:111:45
> #26 in Timer::Invoke() at vcl/source/app/timer.cxx:75:21
> #27 in Scheduler::ProcessTaskScheduling() at vcl/source/app/scheduler.cxx:486:20
> #28 in Scheduler::CallbackTaskScheduling() at vcl/source/app/scheduler.cxx:288:5
> #29 in SalTimer::CallCallback() at vcl/inc/saltimer.hxx:54:13
> #30 in SvpSalInstance::CheckTimeout(bool) at vcl/headless/svpinst.cxx:210:53
> #31 in SvpSalInstance::DoYield(bool, bool) at vcl/headless/svpinst.cxx:463:21
> #32 in ImplYield(bool, bool) at vcl/source/app/svapp.cxx:447:48
> #33 in Application::Yield() at vcl/source/app/svapp.cxx:511:5
> #34 in Application::Execute() at vcl/source/app/svapp.cxx:426:9
> #35 in desktop::Desktop::Main() at desktop/source/app/app.cxx:1588:13
> #36 in ImplSVMain() at vcl/source/app/svmain.cxx:196:35
> #37 in SVMain() at vcl/source/app/svmain.cxx:228:12
> #38 in soffice_main at desktop/source/app/sofficemain.cxx:98:12
> #39 in sal_main at desktop/source/app/main.c:49:15
> #40 in main at desktop/source/app/main.c:47:1
Change-Id: I7ff5148f4bf9170fc7add312053de5acc153125b
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106919
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index 1905e32c0ddd..d49fe9f32188 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -2955,7 +2955,7 @@ void ScCellShell::ExecuteDataPilotDialog()
}
pTypeDlg->StartExecuteAsync([this, pTypeDlg, pTabViewShell,
- pScMod, pFact, &rDoc, &rMark, &aDestPos](int nResult) {
+ pScMod, pFact, &rDoc, &rMark, aDestPos](int nResult) mutable {
const char* pSrcErrorId = nullptr;
std::unique_ptr<ScDPObject> pNewDPObject;
commit 6209b6bacde46762052483403e8bd1fc2c5e7b66
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Mon Nov 23 12:02:07 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:04:20 2021 +0200
Make Pivot table data source dialog async
Change-Id: I573038935e31c5393293197c1a9706110a970837
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106848
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
diff --git a/sc/source/ui/attrdlg/scdlgfact.cxx b/sc/source/ui/attrdlg/scdlgfact.cxx
index 40dc203d56c1..295d61f5270a 100644
--- a/sc/source/ui/attrdlg/scdlgfact.cxx
+++ b/sc/source/ui/attrdlg/scdlgfact.cxx
@@ -110,6 +110,11 @@ short AbstractScDataPilotSourceTypeDlg_Impl::Execute()
return m_xDlg->run();
}
+bool AbstractScDataPilotSourceTypeDlg_Impl::StartExecuteAsync(AsyncContext &rCtx)
+{
+ return weld::DialogController::runAsync(m_xDlg, rCtx.maEndDialogFn);
+}
+
short AbstractScDataPilotServiceDlg_Impl::Execute()
{
return m_xDlg->run();
@@ -986,7 +991,7 @@ VclPtr<AbstractScDataPilotDatabaseDlg> ScAbstractDialogFactory_Impl::CreateScDat
VclPtr<AbstractScDataPilotSourceTypeDlg> ScAbstractDialogFactory_Impl::CreateScDataPilotSourceTypeDlg(
weld::Window* pParent, bool bEnableExternal)
{
- return VclPtr<AbstractScDataPilotSourceTypeDlg_Impl>::Create(std::make_unique<ScDataPilotSourceTypeDlg>(pParent, bEnableExternal));
+ return VclPtr<AbstractScDataPilotSourceTypeDlg_Impl>::Create(std::make_shared<ScDataPilotSourceTypeDlg>(pParent, bEnableExternal));
}
VclPtr<AbstractScDataPilotServiceDlg> ScAbstractDialogFactory_Impl::CreateScDataPilotServiceDlg(weld::Window* pParent,
diff --git a/sc/source/ui/attrdlg/scdlgfact.hxx b/sc/source/ui/attrdlg/scdlgfact.hxx
index 1e3be87c34cc..aaa94d0ddae9 100644
--- a/sc/source/ui/attrdlg/scdlgfact.hxx
+++ b/sc/source/ui/attrdlg/scdlgfact.hxx
@@ -181,13 +181,14 @@ public:
class AbstractScDataPilotSourceTypeDlg_Impl :public AbstractScDataPilotSourceTypeDlg
{
- std::unique_ptr<ScDataPilotSourceTypeDlg> m_xDlg;
+ std::shared_ptr<ScDataPilotSourceTypeDlg> m_xDlg;
public:
- explicit AbstractScDataPilotSourceTypeDlg_Impl(std::unique_ptr<ScDataPilotSourceTypeDlg> p)
+ explicit AbstractScDataPilotSourceTypeDlg_Impl(std::shared_ptr<ScDataPilotSourceTypeDlg> p)
: m_xDlg(std::move(p))
{
}
virtual short Execute() override;
+ virtual bool StartExecuteAsync(AsyncContext &) override;
virtual bool IsDatabase() const override;
virtual bool IsExternal() const override;
virtual bool IsNamedRange() const override;
diff --git a/sc/source/ui/view/cellsh1.cxx b/sc/source/ui/view/cellsh1.cxx
index afe2301df103..1905e32c0ddd 100644
--- a/sc/source/ui/view/cellsh1.cxx
+++ b/sc/source/ui/view/cellsh1.cxx
@@ -2884,6 +2884,23 @@ bool isDPSourceValid(const ScDPObject& rDPObj)
return true;
}
+void RunPivotLayoutDialog(ScModule* pScMod,
+ ScTabViewShell* pTabViewShell,
+ std::unique_ptr<ScDPObject>& pNewDPObject)
+{
+ bool bHadNewDPObject = pNewDPObject != nullptr;
+ pTabViewShell->SetDialogDPObject( std::move(pNewDPObject) );
+ if ( bHadNewDPObject )
+ {
+ // start layout dialog
+
+ sal_uInt16 nId = ScPivotLayoutWrapper::GetChildWindowId();
+ SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
+ SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
+ pScMod->SetRefDialog( nId, pWnd == nullptr );
+ }
+}
+
}
void ScCellShell::ExecuteDataPilotDialog()
@@ -2893,21 +2910,21 @@ void ScCellShell::ExecuteDataPilotDialog()
ScViewData* pData = GetViewData();
ScDocument& rDoc = pData->GetDocument();
- std::unique_ptr<ScDPObject> pNewDPObject;
-
// ScPivot is no longer used...
ScDPObject* pDPObj = rDoc.GetDPAtCursor(
pData->GetCurX(), pData->GetCurY(),
pData->GetTabNo() );
if ( pDPObj ) // on an existing table?
{
+ std::unique_ptr<ScDPObject> pNewDPObject;
+
if (isDPSourceValid(*pDPObj))
pNewDPObject.reset(new ScDPObject(*pDPObj));
+
+ RunPivotLayoutDialog(pScMod, pTabViewShell, pNewDPObject);
}
else // create new table
{
- const char* pSrcErrorId = nullptr;
-
// select database range or data
pTabViewShell->GetDBData( true, SC_DB_OLD );
ScMarkData& rMark = GetViewData()->GetMarkData();
@@ -2924,7 +2941,7 @@ void ScCellShell::ExecuteDataPilotDialog()
ScAbstractDialogFactory* pFact = ScAbstractDialogFactory::Create();
- ScopedVclPtr<AbstractScDataPilotSourceTypeDlg> pTypeDlg(
+ VclPtr<AbstractScDataPilotSourceTypeDlg> pTypeDlg(
pFact->CreateScDataPilotSourceTypeDlg(
pTabViewShell->GetFrameWeld(), bEnableExt));
@@ -2937,129 +2954,127 @@ void ScCellShell::ExecuteDataPilotDialog()
pTypeDlg->AppendNamedRange(itr->second->GetName());
}
- if ( pTypeDlg->Execute() == RET_OK )
- {
- if ( pTypeDlg->IsExternal() )
- {
- std::vector<OUString> aSources = ScDPObject::GetRegisteredSources();
- ScopedVclPtr<AbstractScDataPilotServiceDlg> pServDlg(
- pFact->CreateScDataPilotServiceDlg(
- pTabViewShell->GetFrameWeld(), aSources));
+ pTypeDlg->StartExecuteAsync([this, pTypeDlg, pTabViewShell,
+ pScMod, pFact, &rDoc, &rMark, &aDestPos](int nResult) {
+ const char* pSrcErrorId = nullptr;
+ std::unique_ptr<ScDPObject> pNewDPObject;
- if ( pServDlg->Execute() == RET_OK )
- {
- ScDPServiceDesc aServDesc(
- pServDlg->GetServiceName(),
- pServDlg->GetParSource(),
- pServDlg->GetParName(),
- pServDlg->GetParUser(),
- pServDlg->GetParPass() );
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetServiceData( aServDesc );
- }
- }
- else if ( pTypeDlg->IsDatabase() )
+ if (nResult == RET_OK )
{
- assert(pFact && "ScAbstractFactory create fail!");
- ScopedVclPtr<AbstractScDataPilotDatabaseDlg> pDataDlg(
- pFact->CreateScDataPilotDatabaseDlg(pTabViewShell->GetFrameWeld()));
- assert(pDataDlg && "Dialog create fail!");
- if ( pDataDlg->Execute() == RET_OK )
+ if ( pTypeDlg->IsExternal() )
{
- ScImportSourceDesc aImpDesc(&rDoc);
- pDataDlg->GetValues( aImpDesc );
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetImportDesc( aImpDesc );
- }
- }
- else if (pTypeDlg->IsNamedRange())
- {
- OUString aName = pTypeDlg->GetSelectedNamedRange();
- ScSheetSourceDesc aShtDesc(&rDoc);
- aShtDesc.SetRangeName(aName);
- pSrcErrorId = aShtDesc.CheckSourceRange();
- if (!pSrcErrorId)
- {
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetSheetDesc(aShtDesc);
+ std::vector<OUString> aSources = ScDPObject::GetRegisteredSources();
+ ScopedVclPtr<AbstractScDataPilotServiceDlg> pServDlg(
+ pFact->CreateScDataPilotServiceDlg(
+ pTabViewShell->GetFrameWeld(), aSources));
+
+ if ( pServDlg->Execute() == RET_OK )
+ {
+ ScDPServiceDesc aServDesc(
+ pServDlg->GetServiceName(),
+ pServDlg->GetParSource(),
+ pServDlg->GetParName(),
+ pServDlg->GetParUser(),
+ pServDlg->GetParPass() );
+ pNewDPObject.reset(new ScDPObject(&rDoc));
+ pNewDPObject->SetServiceData( aServDesc );
+ }
}
- }
- else // selection
- {
- //! use database ranges (select before type dialog?)
- ScRange aRange;
- ScMarkType eType = GetViewData()->GetSimpleArea(aRange);
- if ( (eType & SC_MARK_SIMPLE) == SC_MARK_SIMPLE )
+ else if ( pTypeDlg->IsDatabase() )
{
- // Shrink the range to the data area.
- SCCOL nStartCol = aRange.aStart.Col(), nEndCol = aRange.aEnd.Col();
- SCROW nStartRow = aRange.aStart.Row(), nEndRow = aRange.aEnd.Row();
- if (rDoc.ShrinkToDataArea(aRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow))
+ assert(pFact && "ScAbstractFactory create fail!");
+ ScopedVclPtr<AbstractScDataPilotDatabaseDlg> pDataDlg(
+ pFact->CreateScDataPilotDatabaseDlg(pTabViewShell->GetFrameWeld()));
+ assert(pDataDlg && "Dialog create fail!");
+ if ( pDataDlg->Execute() == RET_OK )
{
- aRange.aStart.SetCol(nStartCol);
- aRange.aStart.SetRow(nStartRow);
- aRange.aEnd.SetCol(nEndCol);
- aRange.aEnd.SetRow(nEndRow);
- rMark.SetMarkArea(aRange);
- pTabViewShell->MarkRange(aRange);
+ ScImportSourceDesc aImpDesc(&rDoc);
+ pDataDlg->GetValues( aImpDesc );
+ pNewDPObject.reset(new ScDPObject(&rDoc));
+ pNewDPObject->SetImportDesc( aImpDesc );
}
-
- bool bOK = true;
- if ( rDoc.HasSubTotalCells( aRange ) )
+ }
+ else if (pTypeDlg->IsNamedRange())
+ {
+ OUString aName = pTypeDlg->GetSelectedNamedRange();
+ ScSheetSourceDesc aShtDesc(&rDoc);
+ aShtDesc.SetRangeName(aName);
+ pSrcErrorId = aShtDesc.CheckSourceRange();
+ if (!pSrcErrorId)
{
- // confirm selection if it contains SubTotal cells
- std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
- VclMessageType::Question, VclButtonsType::YesNo,
- ScResId(STR_DATAPILOT_SUBTOTAL)));
- xQueryBox->set_default_response(RET_YES);
- if (xQueryBox->run() == RET_NO)
- bOK = false;
+ pNewDPObject.reset(new ScDPObject(&rDoc));
+ pNewDPObject->SetSheetDesc(aShtDesc);
}
- if (bOK)
+ }
+ else // selection
+ {
+ //! use database ranges (select before type dialog?)
+ ScRange aRange;
+ ScMarkType eType = GetViewData()->GetSimpleArea(aRange);
+ if ( (eType & SC_MARK_SIMPLE) == SC_MARK_SIMPLE )
{
- ScSheetSourceDesc aShtDesc(&rDoc);
- aShtDesc.SetSourceRange(aRange);
- pSrcErrorId = aShtDesc.CheckSourceRange();
- if (!pSrcErrorId)
+ // Shrink the range to the data area.
+ SCCOL nStartCol = aRange.aStart.Col(), nEndCol = aRange.aEnd.Col();
+ SCROW nStartRow = aRange.aStart.Row(), nEndRow = aRange.aEnd.Row();
+ if (rDoc.ShrinkToDataArea(aRange.aStart.Tab(), nStartCol, nStartRow, nEndCol, nEndRow))
{
- pNewDPObject.reset(new ScDPObject(&rDoc));
- pNewDPObject->SetSheetDesc( aShtDesc );
+ aRange.aStart.SetCol(nStartCol);
+ aRange.aStart.SetRow(nStartRow);
+ aRange.aEnd.SetCol(nEndCol);
+ aRange.aEnd.SetRow(nEndRow);
+ rMark.SetMarkArea(aRange);
+ pTabViewShell->MarkRange(aRange);
}
- // output below source data
- if ( aRange.aEnd.Row()+2 <= rDoc.MaxRow() - 4 )
- aDestPos = ScAddress( aRange.aStart.Col(),
- aRange.aEnd.Row()+2,
- aRange.aStart.Tab() );
+ bool bOK = true;
+ if ( rDoc.HasSubTotalCells( aRange ) )
+ {
+ // confirm selection if it contains SubTotal cells
+ std::unique_ptr<weld::MessageDialog> xQueryBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
+ VclMessageType::Question, VclButtonsType::YesNo,
+ ScResId(STR_DATAPILOT_SUBTOTAL)));
+ xQueryBox->set_default_response(RET_YES);
+ if (xQueryBox->run() == RET_NO)
+ bOK = false;
+ }
+ if (bOK)
+ {
+ ScSheetSourceDesc aShtDesc(&rDoc);
+ aShtDesc.SetSourceRange(aRange);
+ pSrcErrorId = aShtDesc.CheckSourceRange();
+ if (!pSrcErrorId)
+ {
+ pNewDPObject.reset(new ScDPObject(&rDoc));
+ pNewDPObject->SetSheetDesc( aShtDesc );
+ }
+
+ // output below source data
+ if ( aRange.aEnd.Row()+2 <= rDoc.MaxRow() - 4 )
+ aDestPos = ScAddress( aRange.aStart.Col(),
+ aRange.aEnd.Row()+2,
+ aRange.aStart.Tab() );
+ }
}
}
}
- }
- if (pSrcErrorId)
- {
- // Error occurred during data creation. Launch an error and bail out.
- std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
- VclMessageType::Info, VclButtonsType::Ok,
- ScResId(pSrcErrorId)));
- xInfoBox->run();
- return;
- }
+ if (pSrcErrorId)
+ {
+ // Error occurred during data creation. Launch an error and bail out.
+ std::unique_ptr<weld::MessageDialog> xInfoBox(Application::CreateMessageDialog(pTabViewShell->GetFrameWeld(),
+ VclMessageType::Info, VclButtonsType::Ok,
+ ScResId(pSrcErrorId)));
+ xInfoBox->run();
+ return;
+ }
- if ( pNewDPObject )
- pNewDPObject->SetOutRange( aDestPos );
- }
+ if ( pNewDPObject )
+ pNewDPObject->SetOutRange( aDestPos );
- bool bHadNewDPObject = pNewDPObject != nullptr;
- pTabViewShell->SetDialogDPObject( std::move(pNewDPObject) );
- if ( bHadNewDPObject )
- {
- // start layout dialog
+ pTypeDlg->disposeOnce();
- sal_uInt16 nId = ScPivotLayoutWrapper::GetChildWindowId();
- SfxViewFrame* pViewFrm = pTabViewShell->GetViewFrame();
- SfxChildWindow* pWnd = pViewFrm->GetChildWindow( nId );
- pScMod->SetRefDialog( nId, pWnd == nullptr );
+ RunPivotLayoutDialog(pScMod, pTabViewShell, pNewDPObject);
+ });
}
}
commit 4bfbc798773d137b3ab66dfd77ce93e60901ab85
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Fri Nov 20 12:23:45 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:02:43 2021 +0200
autofilter: fix submenu popup for online
Change-Id: If48428f99b921d3c6f9927c612e6ade81b980678
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106847
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
diff --git a/include/vcl/jsdialog/executor.hxx b/include/vcl/jsdialog/executor.hxx
index 5dde733a3823..038b86b30f64 100644
--- a/include/vcl/jsdialog/executor.hxx
+++ b/include/vcl/jsdialog/executor.hxx
@@ -29,6 +29,8 @@ public:
rTreeView.signal_row_activated();
}
+ static void trigger_changed(weld::TreeView& rTreeView) { rTreeView.signal_changed(); }
+
static void trigger_clicked(weld::Toolbar& rToolbar, const OString& rIdent)
{
rToolbar.signal_clicked(rIdent);
diff --git a/sc/source/ui/cctrl/checklistmenu.cxx b/sc/source/ui/cctrl/checklistmenu.cxx
index 6312b2062a16..c61c52cf7840 100644
--- a/sc/source/ui/cctrl/checklistmenu.cxx
+++ b/sc/source/ui/cctrl/checklistmenu.cxx
@@ -35,6 +35,8 @@
#include <comphelper/lok.hxx>
#include <LibreOfficeKit/LibreOfficeKitEnums.h>
#include <tools/json_writer.hxx>
+#include <sfx2/viewsh.hxx>
+#include <vcl/jsdialog/executor.hxx>
#include <document.hxx>
@@ -170,8 +172,14 @@ ScCheckListMenuWindow* ScCheckListMenuControl::addSubMenuItem(const OUString& rT
MenuItemData aItem;
aItem.mbEnabled = bEnabled;
vcl::Window *pContainer = mxFrame->GetWindow(GetWindowType::FirstChild);
+
+ vcl::ILibreOfficeKitNotifier* pNotifier = nullptr;
+ if (comphelper::LibreOfficeKit::isActive())
+ pNotifier = SfxViewShell::Current();
+
aItem.mxSubMenuWin.reset(VclPtr<ScCheckListMenuWindow>::Create(pContainer, mpDoc, false,
- false, -1, mxFrame.get()));
+ false, -1, mxFrame.get(),
+ pNotifier));
maMenuItems.emplace_back(std::move(aItem));
mxMenu->append_text(rText);
@@ -288,6 +296,16 @@ void ScCheckListMenuControl::launchSubMenu(bool bSetMenuPos)
mxMenu->select(*mxScratchIter);
rSubMenuControl.GrabFocus();
+
+ // TODO: something better to retrigger JSON dialog invalidation
+ if (comphelper::LibreOfficeKit::isActive())
+ {
+ StringMap args;
+ args["cmd"] = "change";
+ args["type"] = "checkbox";
+ args["data"] = "true";
+ jsdialog::ExecuteAction(pSubMenu->GetLOKWindowId(), "toggle_all", args);
+ }
}
IMPL_LINK_NOARG(ScCheckListMenuControl, PostPopdownHdl, void*, void)
diff --git a/sc/source/ui/view/gridwin2.cxx b/sc/source/ui/view/gridwin2.cxx
index efb952dc7721..d71741cda2bc 100644
--- a/sc/source/ui/view/gridwin2.cxx
+++ b/sc/source/ui/view/gridwin2.cxx
@@ -467,8 +467,14 @@ void ScGridWindow::DPLaunchFieldPopupMenu(const Point& rScrPos, const Size& rScr
const ScDPLabelData& rLabelData = pDPData->maLabels;
mpDPFieldPopup.disposeAndClear();
+
+ vcl::ILibreOfficeKitNotifier* pNotifier = nullptr;
+ if (comphelper::LibreOfficeKit::isActive())
+ pNotifier = SfxViewShell::Current();
+
mpDPFieldPopup.reset(VclPtr<ScCheckListMenuWindow>::Create(this, &mrViewData.GetDocument(),
- bDimOrientNotPage, false));
+ bDimOrientNotPage, false, -1,
+ nullptr, pNotifier));
ScCheckListMenuControl& rControl = mpDPFieldPopup->get_widget();
rControl.setExtendedData(std::move(pDPData));
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index 83d19fd7b657..b2103fbe865f 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -205,6 +205,7 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat
int nRow = std::atoi(nRowString.getStr());
pTreeView->select(nRow);
+ LOKTrigger::trigger_changed(*pTreeView);
LOKTrigger::trigger_row_activated(*pTreeView);
return true;
}
commit f8536a478f2c8893491cfa55b88c7bac7cb317ce
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Thu Nov 19 13:50:30 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:02:28 2021 +0200
jsdialog: dump dialog title
Change-Id: Id4c9f336039f8a0b8d1d43fdff4852f32e2c7ae6
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106707
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
diff --git a/include/vcl/toolkit/dialog.hxx b/include/vcl/toolkit/dialog.hxx
index bd497e60035d..efd2d2f0f6c0 100644
--- a/include/vcl/toolkit/dialog.hxx
+++ b/include/vcl/toolkit/dialog.hxx
@@ -155,6 +155,8 @@ public:
void set_default_response(int nResponse);
int get_default_response() const;
vcl::Window* get_widget_for_response(int nResponse);
+
+ void DumpAsPropertyTree(tools::JsonWriter& rJsonWriter) override;
};
#endif // INCLUDED_VCL_DIALOG_HXX
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index cb2d845fbf92..9a237ba5df9f 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -60,6 +60,7 @@
#include <vcl/IDialogRenderable.hxx>
#include <messagedialog.hxx>
#include <salframe.hxx>
+#include <tools/json_writer.hxx>
#include <iostream>
#include <utility>
@@ -1630,4 +1631,10 @@ void TopLevelWindowLocker::decBusy()
m_aBusyStack.pop();
}
+void Dialog::DumpAsPropertyTree(tools::JsonWriter& rJsonWriter)
+{
+ SystemWindow::DumpAsPropertyTree(rJsonWriter);
+ rJsonWriter.put("title", GetText());
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
commit 74a39123df3202de60273529fbaafa532c192bd2
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Nov 18 12:14:35 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:02:01 2021 +0200
jsdialog: remember dialog instance & handle close
Change-Id: I1b10d12edfa7ffca1061f50b5219baae1ac3caeb
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106706
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index 13ffc1a33e06..83d19fd7b657 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -242,6 +242,18 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat
}
}
}
+ else if (sControlType == "dialog")
+ {
+ auto pDialog = dynamic_cast<weld::Dialog*>(pWidget);
+ if (pDialog)
+ {
+ if (sAction == "close")
+ {
+ pDialog->response(RET_CANCEL);
+ return true;
+ }
+ }
+ }
}
return false;
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index f44cd42e97cf..051c90c7b6db 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -366,6 +366,9 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id)
std::unique_ptr<weld::Dialog> pRet(pDialog ? new JSDialog(m_aOwnedToplevel, m_aOwnedToplevel,
pDialog, this, false, m_sTypeOfJSON)
: nullptr);
+
+ RememberWidget("__DIALOG__", pRet.get());
+
if (pDialog)
{
assert(!m_aOwnedToplevel && "only one toplevel per .ui allowed");
commit 87ddbb81e651ef7cbe535aabd149c33b4922e51b
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Nov 18 12:00:03 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:01:43 2021 +0200
jsdialog: turn off tunneling for JSON dialogs
Change-Id: I9a9d359d1769f6c34203bc558efe8189fbf81fd3
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106929
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107337
Tested-by: Jenkins
diff --git a/include/vcl/toolkit/dialog.hxx b/include/vcl/toolkit/dialog.hxx
index 3c519d0a5004..bd497e60035d 100644
--- a/include/vcl/toolkit/dialog.hxx
+++ b/include/vcl/toolkit/dialog.hxx
@@ -149,6 +149,7 @@ public:
void SetPopupMenuHdl(const Link<const CommandEvent&, bool>& rLink);
void SetInstallLOKNotifierHdl(const Link<void*, vcl::ILibreOfficeKitNotifier*>& rLink);
+ void SetLOKTunnelingState(bool bEnabled);
void add_button(PushButton* pButton, int nResponse, bool bTransferOwnership);
void set_default_response(int nResponse);
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index 58c8c64d1108..f44cd42e97cf 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -359,6 +359,7 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id)
{
::Dialog* pDialog = m_xBuilder->get<::Dialog>(id);
m_nWindowId = pDialog->GetLOKWindowId();
+ pDialog->SetLOKTunnelingState(false);
InsertWindowToMap(m_nWindowId);
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index 5618af225d4c..cb2d845fbf92 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -355,8 +355,9 @@ struct DialogImpl
VclAbstractDialog::AsyncContext maEndCtx;
Link<const CommandEvent&, bool> m_aPopupMenuHdl;
Link<void*, vcl::ILibreOfficeKitNotifier*> m_aInstallLOKNotifierHdl;
+ bool m_bLOKTunneling;
- DialogImpl() : mnResult( -1 ), mbStartedModal( false ) {}
+ DialogImpl() : mnResult( -1 ), mbStartedModal( false ), m_bLOKTunneling( true ) {}
#ifndef NDEBUG
short get_response(vcl::Window *pWindow) const
@@ -609,6 +610,8 @@ Dialog::~Dialog()
void Dialog::dispose()
{
+ bool bTunnelingEnabled = mpDialogImpl->m_bLOKTunneling;
+
mpDialogImpl.reset();
RemoveFromDlgList();
mpActionArea.clear();
@@ -626,7 +629,8 @@ void Dialog::dispose()
{
if(const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
{
- pNotifier->notifyWindow(GetLOKWindowId(), "close");
+ if (bTunnelingEnabled)
+ pNotifier->notifyWindow(GetLOKWindowId(), "close");
ReleaseLOKNotifier();
}
}
@@ -733,14 +737,21 @@ void Dialog::SetInstallLOKNotifierHdl(const Link<void*, vcl::ILibreOfficeKitNoti
mpDialogImpl->m_aInstallLOKNotifierHdl = rLink;
}
+void Dialog::SetLOKTunnelingState(bool bEnabled)
+{
+ mpDialogImpl->m_bLOKTunneling = bEnabled;
+}
+
void Dialog::StateChanged( StateChangedType nType )
{
+ bool bTunnelingEnabled = mpDialogImpl->m_bLOKTunneling;
+
if (nType == StateChangedType::InitShow)
{
DoInitialLayout();
const bool bKitActive = comphelper::LibreOfficeKit::isActive();
- if (bKitActive)
+ if (bKitActive && bTunnelingEnabled)
{
std::vector<vcl::LOKPayloadItem> aItems;
aItems.emplace_back("type", "dialog");
@@ -779,7 +790,8 @@ void Dialog::StateChanged( StateChangedType nType )
}
else if (nType == StateChangedType::Text)
{
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
+ const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier();
+ if (pNotifier && bTunnelingEnabled)
{
std::vector<vcl::LOKPayloadItem> aPayload;
aPayload.emplace_back("title", GetText().toUtf8());
@@ -797,7 +809,8 @@ void Dialog::StateChanged( StateChangedType nType )
if (!mbModalMode && nType == StateChangedType::Visible)
{
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
+ const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier();
+ if (pNotifier && bTunnelingEnabled)
{
std::vector<vcl::LOKPayloadItem> aPayload;
aPayload.emplace_back("title", GetText().toUtf8());
@@ -985,7 +998,8 @@ bool Dialog::ImplStartExecute()
else
UITestLogger::getInstance().log("Open Modeless " + get_id());
- if (comphelper::LibreOfficeKit::isActive())
+ bool bTunnelingEnabled = mpDialogImpl->m_bLOKTunneling;
+ if (comphelper::LibreOfficeKit::isActive() && bTunnelingEnabled)
{
if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
{
@@ -1350,7 +1364,9 @@ void Dialog::Resize()
if (comphelper::LibreOfficeKit::isDialogPainting())
return;
- if (const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier())
+ bool bTunnelingEnabled = mpDialogImpl->m_bLOKTunneling;
+ const vcl::ILibreOfficeKitNotifier* pNotifier = GetLOKNotifier();
+ if (pNotifier && bTunnelingEnabled)
{
std::vector<vcl::LOKPayloadItem> aItems;
aItems.emplace_back("size", GetSizePixel().toString());
commit d5c797249981d318793c93ce0f13576135563980
Author: Szymon Kłos <szymon.klos at collabora.com>
AuthorDate: Wed Nov 18 10:12:38 2020 +0100
Commit: Andras Timar <andras.timar at collabora.com>
CommitDate: Wed Apr 7 13:00:37 2021 +0200
jsdialog: drag and drop support for TreeView
Change-Id: I67e2eb986b48591b7f758bbb5c1d72b6a322d4d8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/106705
Tested-by: Jenkins
Reviewed-by: Szymon Kłos <szymon.klos at collabora.com>
diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx
index 4b9e042960f4..ab7c038648d3 100644
--- a/vcl/inc/jsdialog/jsdialogbuilder.hxx
+++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx
@@ -19,6 +19,11 @@
#include <vcl/toolkit/button.hxx>
#include <vcl/toolkit/fmtfield.hxx>
+#include <com/sun/star/lang/XInitialization.hpp>
+#include <com/sun/star/lang/XServiceInfo.hpp>
+#include <com/sun/star/datatransfer/dnd/XDropTarget.hpp>
+#include <cppuhelper/compbase.hxx>
+
class ToolBox;
class ComboBox;
class VclMultiLineEdit;
@@ -58,6 +63,40 @@ public:
void notifyDialogState(bool bForce = false);
};
+class JSDropTarget final
+ : public cppu::WeakComponentImplHelper<css::datatransfer::dnd::XDropTarget,
+ css::lang::XInitialization, css::lang::XServiceInfo>
+{
+ osl::Mutex m_aMutex;
+ std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> m_aListeners;
+
+public:
+ JSDropTarget();
+
+ // XInitialization
+ virtual void SAL_CALL initialize(const css::uno::Sequence<css::uno::Any>& rArgs) override;
+
+ // XDropTarget
+ virtual void SAL_CALL addDropTargetListener(
+ const css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>&) override;
+ virtual void SAL_CALL removeDropTargetListener(
+ const css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>&) override;
+ virtual sal_Bool SAL_CALL isActive() override;
+ virtual void SAL_CALL setActive(sal_Bool active) override;
+ virtual sal_Int8 SAL_CALL getDefaultActions() override;
+ virtual void SAL_CALL setDefaultActions(sal_Int8 actions) override;
+
+ OUString SAL_CALL getImplementationName() override;
+
+ sal_Bool SAL_CALL supportsService(OUString const& ServiceName) override;
+
+ css::uno::Sequence<OUString> SAL_CALL getSupportedServiceNames() override;
+
+ void fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde);
+
+ void fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde);
+};
+
class JSInstanceBuilder : public SalInstanceBuilder
{
sal_uInt64 m_nWindowId;
@@ -128,6 +167,9 @@ private:
template <class BaseInstanceClass, class VclClass>
class JSWidget : public BaseInstanceClass, public JSDialogSender
{
+protected:
+ rtl::Reference<JSDropTarget> m_xDropTarget;
+
public:
JSWidget(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow,
VclClass* pObject, SalInstanceBuilder* pBuilder, bool bTakeOwnership,
@@ -155,6 +197,14 @@ public:
BaseInstanceClass::set_sensitive(sensitive);
notifyDialogState();
}
+
+ virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> get_drop_target() override
+ {
+ if (!m_xDropTarget)
+ m_xDropTarget.set(new JSDropTarget);
+
+ return m_xDropTarget.get();
+ }
};
class JSDialog : public JSWidget<SalInstanceDialog, ::Dialog>
@@ -309,6 +359,11 @@ public:
using SalInstanceTreeView::select;
/// pos is used differently here, it defines how many steps of iterator we need to perform to take entry
virtual void select(int pos) override;
+
+ virtual weld::TreeView* get_drag_source() const override;
+
+ void drag_start();
+ void drag_end();
};
class JSExpander : public JSWidget<SalInstanceExpander, ::VclExpander>
diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx
index 24e3eb1f14d3..13ffc1a33e06 100644
--- a/vcl/jsdialog/executor.cxx
+++ b/vcl/jsdialog/executor.cxx
@@ -206,6 +206,27 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat
pTreeView->select(nRow);
LOKTrigger::trigger_row_activated(*pTreeView);
+ return true;
+ }
+ else if (sAction == "dragstart")
+ {
+ OString nRowString
+ = OUStringToOString(rData["data"], RTL_TEXTENCODING_ASCII_US);
+ int nRow = std::atoi(nRowString.getStr());
+
+ pTreeView->select(nRow);
+
+ JSTreeView* pJSTreeView = dynamic_cast<JSTreeView*>(pTreeView);
+ if (pJSTreeView)
+ pJSTreeView->drag_start();
+ return true;
+ }
+ else if (sAction == "dragend")
+ {
+ JSTreeView* pJSTreeView = dynamic_cast<JSTreeView*>(pTreeView);
+ if (pJSTreeView)
+ pJSTreeView->drag_end();
+ return true;
}
}
}
diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx
index 4fb351b5439f..58c8c64d1108 100644
--- a/vcl/jsdialog/jsdialogbuilder.cxx
+++ b/vcl/jsdialog/jsdialogbuilder.cxx
@@ -24,6 +24,7 @@
#include <boost/property_tree/json_parser.hpp>
#include <vcl/toolkit/treelistentry.hxx>
#include <vcl/jsdialog/executor.hxx>
+#include <cppuhelper/supportsservice.hxx>
JSDialogNotifyIdle::JSDialogNotifyIdle(VclPtr<vcl::Window> aNotifierWindow,
VclPtr<vcl::Window> aContentWindow, std::string sTypeOfJSON)
@@ -96,6 +97,102 @@ vcl::Window* extract_sal_widget(weld::Widget* pParent)
}
}
+// Drag and drop
+
+namespace
+{
+class JSDropTargetDropContext
+ : public cppu::WeakImplHelper<css::datatransfer::dnd::XDropTargetDropContext>
+{
+public:
+ JSDropTargetDropContext() {}
+
+ // XDropTargetDropContext
+ virtual void SAL_CALL acceptDrop(sal_Int8 /*dragOperation*/) override {}
+
+ virtual void SAL_CALL rejectDrop() override {}
+
+ virtual void SAL_CALL dropComplete(sal_Bool /*bSuccess*/) override {}
+};
+}
+
+static JSTreeView* g_DragSource;
+
+JSDropTarget::JSDropTarget()
+ : WeakComponentImplHelper(m_aMutex)
+{
+}
+
+void JSDropTarget::initialize(const css::uno::Sequence<css::uno::Any>& /*rArgs*/) {}
+
+void JSDropTarget::addDropTargetListener(
+ const css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>& xListener)
+{
+ ::osl::Guard<::osl::Mutex> aGuard(m_aMutex);
+
+ m_aListeners.push_back(xListener);
+}
+
+void JSDropTarget::removeDropTargetListener(
+ const css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>& xListener)
+{
+ ::osl::Guard<::osl::Mutex> aGuard(m_aMutex);
+
+ m_aListeners.erase(std::remove(m_aListeners.begin(), m_aListeners.end(), xListener),
+ m_aListeners.end());
+}
+
+sal_Bool JSDropTarget::isActive() { return false; }
+
+void JSDropTarget::setActive(sal_Bool /*active*/) {}
+
+sal_Int8 JSDropTarget::getDefaultActions() { return 0; }
+
+void JSDropTarget::setDefaultActions(sal_Int8 /*actions*/) {}
+
+OUString JSDropTarget::getImplementationName()
+{
+ return "com.sun.star.datatransfer.dnd.JSDropTarget";
+}
+
+sal_Bool JSDropTarget::supportsService(OUString const& ServiceName)
+{
+ return cppu::supportsService(this, ServiceName);
+}
+
+css::uno::Sequence<OUString> JSDropTarget::getSupportedServiceNames()
+{
+ css::uno::Sequence<OUString> aRet{ "com.sun.star.datatransfer.dnd.JSDropTarget" };
+ return aRet;
+}
+
+void JSDropTarget::fire_drop(const css::datatransfer::dnd::DropTargetDropEvent& dtde)
+{
+ osl::ClearableGuard<osl::Mutex> aGuard(m_aMutex);
+ std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> aListeners(
+ m_aListeners);
+ aGuard.clear();
+
+ for (auto const& listener : aListeners)
+ {
+ listener->drop(dtde);
+ }
+}
+
+void JSDropTarget::fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde)
+{
+ osl::ClearableGuard<::osl::Mutex> aGuard(m_aMutex);
+ std::vector<css::uno::Reference<css::datatransfer::dnd::XDropTargetListener>> aListeners(
+ m_aListeners);
+ aGuard.clear();
+
+ for (auto const& listener : aListeners)
+ {
+ listener->dragEnter(dtde);
+ }
+}
+
+// used for dialogs
JSInstanceBuilder::JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIRoot,
const OUString& rUIFile)
: SalInstanceBuilder(extract_sal_widget(pParent), rUIRoot, rUIFile)
@@ -793,6 +890,32 @@ void JSTreeView::select(int pos)
enable_notify_events();
}
+weld::TreeView* JSTreeView::get_drag_source() const { return g_DragSource; }
+
+void JSTreeView::drag_start() { g_DragSource = this; }
+
+void JSTreeView::drag_end()
+{
+ css::datatransfer::dnd::XDropTarget* xDropTarget = m_xDropTarget.get();
+ if (xDropTarget)
+ {
+ css::datatransfer::dnd::DropTargetDropEvent aEvent;
+ aEvent.Source = xDropTarget;
+ aEvent.Context = new JSDropTargetDropContext();
+ // dummy values
+ aEvent.LocationX = 50;
+ aEvent.LocationY = 50;
+ aEvent.DropAction = css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT;
+ aEvent.SourceActions = css::datatransfer::dnd::DNDConstants::ACTION_DEFAULT;
+
+ m_xDropTarget->fire_drop(aEvent);
+
+ notifyDialogState();
+ }
+
+ g_DragSource = nullptr;
+}
+
JSExpander::JSExpander(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow,
::VclExpander* pExpander, SalInstanceBuilder* pBuilder, bool bTakeOwnership,
std::string sTypeOfJSON)
More information about the Libreoffice-commits
mailing list