desktop/source/lib/init.cxx | 5 include/svx/fontworkgallery.hxx | 6 include/vcl/jsdialog/executor.hxx | 9 include/vcl/uitest/uiobject.hxx | 19 + include/vcl/weld.hxx | 2 svx/source/tbxctrls/fontworkgallery.cxx | 9 svx/source/toolbars/fontworkbar.cxx | 4 sw/qa/uitest/writer_tests2/fontworks.py | 11 sw/source/uibase/uiview/viewdraw.cxx | 53 ++-- vcl/inc/iconview.hxx | 3 vcl/inc/jsdialog/jsdialogbuilder.hxx | 173 +++++++++---- vcl/inc/salvtables.hxx | 59 ++++ vcl/jsdialog/executor.cxx | 30 ++ vcl/jsdialog/jsdialogbuilder.cxx | 269 +++++++++++--------- vcl/source/app/salvtables.cxx | 415 +++++++++++++++----------------- vcl/source/treelist/iconview.cxx | 62 ++++ vcl/source/uitest/uiobject.cxx | 37 ++ vcl/source/window/builder.cxx | 3 18 files changed, 732 insertions(+), 437 deletions(-)
New commits: commit 248c7a8e70bff77491a05ba1e1e135b6a17e8b58 Author: Henry Castro <[email protected]> AuthorDate: Thu Dec 17 10:16:52 2020 -0400 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:26:41 2021 +0200 lok: add parameter "MacroExecMode" It is required to execute VBA scripts. Change-Id: Ibaafc62ecedcefcd0596c701728039783b5a0de7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107891 Tested-by: Jenkins Reviewed-by: Henry Castro <[email protected]> diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 7b455cf7b348..760249bb2555 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -60,6 +60,7 @@ #include <comphelper/threadpool.hxx> #include <comphelper/sequenceashashmap.hxx> +#include <com/sun/star/document/MacroExecMode.hpp> #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/container/XNameAccess.hpp> #include <com/sun/star/frame/Desktop.hpp> @@ -2239,7 +2240,7 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions(LibreOfficeKit* pThis, const OUString aDeviceFormFactor = extractParameter(aOptions, "DeviceFormFactor"); SfxLokHelper::setDeviceFormFactor(aDeviceFormFactor); - uno::Sequence<css::beans::PropertyValue> aFilterOptions(2); + uno::Sequence<css::beans::PropertyValue> aFilterOptions(3); aFilterOptions[0] = css::beans::PropertyValue( "FilterOptions", 0, uno::makeAny(aOptions), @@ -2258,11 +2259,11 @@ static LibreOfficeKitDocument* lo_documentLoadWithOptions(LibreOfficeKit* pThis, aFilterOptions[1].Name = "InteractionHandler"; aFilterOptions[1].Value <<= xInteraction; - /* TODO sal_Int16 nMacroExecMode = document::MacroExecMode::USE_CONFIG; aFilterOptions[2].Name = "MacroExecutionMode"; aFilterOptions[2].Value <<= nMacroExecMode; + /* TODO sal_Int16 nUpdateDoc = document::UpdateDocMode::ACCORDING_TO_CONFIG; aFilterOptions[3].Name = "UpdateDocMode"; aFilterOptions[3].Value <<= nUpdateDoc; commit db7f66f3f96782c4077089226dbcd1516f1e08aa Author: Henry Castro <[email protected]> AuthorDate: Fri Dec 4 16:32:30 2020 -0400 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:26:16 2021 +0200 lok: use JSDialog Builder to create a Macro Selector Dialog The Macro Selector Dialog should be created for desktop too. The JS Builder has an implementation to send "jsdialog: " data to the client side. Change-Id: If29660467e494323ac26605e704ee9bf15725fd5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107243 Tested-by: Jenkins Reviewed-by: Henry Castro <[email protected]> commit f3efaad1b8a2a8d0f397f7b1aaaf608850c1df72 Author: Mert Tumer <[email protected]> AuthorDate: Wed Dec 16 23:00:11 2020 +0300 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:25:13 2021 +0200 jsdialogs: Use JS dialog for Fontwork dialog Change-Id: I4d2206550f7d3948f373c803888c7d19034e42c4 Signed-off-by: Mert Tumer <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108684 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109217 Tested-by: Szymon Kłos <[email protected]> diff --git a/vcl/source/window/builder.cxx b/vcl/source/window/builder.cxx index 3ff956be4395..077534436651 100644 --- a/vcl/source/window/builder.cxx +++ b/vcl/source/window/builder.cxx @@ -203,7 +203,8 @@ weld::Builder* Application::CreateBuilder(weld::Widget* pParent, const OUString || rUIFile == "uui/ui/macrowarnmedium.ui" || rUIFile == "modules/scalc/ui/datafielddialog.ui" || rUIFile == "modules/scalc/ui/pivotfielddialog.ui" - || rUIFile == "modules/scalc/ui/datafieldoptionsdialog.ui") + || rUIFile == "modules/scalc/ui/datafieldoptionsdialog.ui" + || rUIFile == "svx/ui/fontworkgallerydialog.ui") { bUseJSBuilder = true; } commit b972832c002b025de9e0da1a1f7cceee3981d82a Author: Szymon Kłos <[email protected]> AuthorDate: Mon Jan 11 13:52:32 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:24:58 2021 +0200 Make Fontwork gallery dialog async Change-Id: I156dc1b505b01dc7520ccfe80bbf97eba881d653 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109092 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109258 Tested-by: Jenkins diff --git a/include/svx/fontworkgallery.hxx b/include/svx/fontworkgallery.hxx index 3fa657305ad6..46dfd3b26104 100644 --- a/include/svx/fontworkgallery.hxx +++ b/include/svx/fontworkgallery.hxx @@ -49,7 +49,8 @@ class SAL_WARN_UNUSED SVXCORE_DLLPUBLIC FontWorkGalleryDialog final : public wel sal_uInt16 mnThemeId; SdrView& mrSdrView; - SdrObject** mppSdrObject; + bool mbInsertIntoPage; + SdrObject* mppSdrObject; SdrModel* mpDestModel; std::vector<VclPtr< VirtualDevice >> maFavoritesHorizontal; @@ -69,7 +70,8 @@ public: virtual ~FontWorkGalleryDialog() override; // SJ: if the SdrObject** is set, the SdrObject is not inserted into the page when executing the dialog - void SetSdrObjectRef( SdrObject**, SdrModel* pModel ); + void SetSdrObjectRef( SdrModel* pModel, bool bInsertIntoPage = true ); + SdrObject* GetSdrObjectRef() { return mppSdrObject; } }; } diff --git a/svx/source/tbxctrls/fontworkgallery.cxx b/svx/source/tbxctrls/fontworkgallery.cxx index efef6f786e0d..b9ad40f80dbe 100644 --- a/svx/source/tbxctrls/fontworkgallery.cxx +++ b/svx/source/tbxctrls/fontworkgallery.cxx @@ -52,6 +52,7 @@ FontWorkGalleryDialog::FontWorkGalleryDialog(weld::Window* pParent, SdrView& rSd : GenericDialogController(pParent, "svx/ui/fontworkgallerydialog.ui", "FontworkGalleryDialog") , mnThemeId(0xffff) , mrSdrView(rSdrView) + , mbInsertIntoPage(true) , mppSdrObject(nullptr) , mpDestModel(nullptr) , maCtlFavorites(m_xBuilder->weld_icon_view("ctlFavoriteswin")) @@ -131,9 +132,9 @@ void FontWorkGalleryDialog::fillFavorites(sal_uInt16 nThemeId) maCtlFavorites->select(0); } -void FontWorkGalleryDialog::SetSdrObjectRef( SdrObject** ppSdrObject, SdrModel* pModel ) +void FontWorkGalleryDialog::SetSdrObjectRef( SdrModel* pModel, bool bInsertIntoPage ) { - mppSdrObject = ppSdrObject; + mbInsertIntoPage = bInsertIntoPage; mpDestModel = pModel; } @@ -164,7 +165,7 @@ void FontWorkGalleryDialog::insertSelectedFontwork() // If this is not used, the correct SdrModel seems to be the one from // the mrSdrView that is used to insert (InsertObjectAtView below) the // cloned SdrObject. - const bool bUseSpecialCalcMode(nullptr != mppSdrObject && nullptr != mpDestModel); + const bool bUseSpecialCalcMode(!mbInsertIntoPage && nullptr != mpDestModel); // center shape on current view OutputDevice* pOutDev(mrSdrView.GetFirstOutputDevice()); @@ -201,7 +202,7 @@ void FontWorkGalleryDialog::insertSelectedFontwork() if (bUseSpecialCalcMode) { - *mppSdrObject = pNewObject; + mppSdrObject = pNewObject; } else { diff --git a/svx/source/toolbars/fontworkbar.cxx b/svx/source/toolbars/fontworkbar.cxx index 308f4d2f6b60..8a89952d8db3 100644 --- a/svx/source/toolbars/fontworkbar.cxx +++ b/svx/source/toolbars/fontworkbar.cxx @@ -415,8 +415,8 @@ void FontworkBar::execute( SdrView& rSdrView, SfxRequest const & rReq, SfxBindin { case SID_FONTWORK_GALLERY_FLOATER: { - FontWorkGalleryDialog aDlg(rReq.GetFrameWeld(), rSdrView); - aDlg.run(); + std::shared_ptr<FontWorkGalleryDialog> pDlg = std::make_shared<FontWorkGalleryDialog>(rReq.GetFrameWeld(), rSdrView); + weld::DialogController::runAsync(pDlg, [](int){}); } break; diff --git a/sw/source/uibase/uiview/viewdraw.cxx b/sw/source/uibase/uiview/viewdraw.cxx index e5284b48e04a..219d4bbf52c8 100644 --- a/sw/source/uibase/uiview/viewdraw.cxx +++ b/sw/source/uibase/uiview/viewdraw.cxx @@ -150,35 +150,40 @@ void SwView::ExecDraw(SfxRequest& rReq) pSdrView = m_pWrtShell->GetDrawView(); if (pSdrView) { - SdrObject* pObj = nullptr; - svx::FontWorkGalleryDialog aDlg(rWin.GetFrameWeld(), *pSdrView); - aDlg.SetSdrObjectRef( &pObj, pSdrView->GetModel() ); - aDlg.run(); - if ( pObj ) - { - Size aDocSize( m_pWrtShell->GetDocSize() ); - const SwRect& rVisArea = m_pWrtShell->VisArea(); - Point aPos( rVisArea.Center() ); - Size aSize; - Size aPrefSize( pObj->GetSnapRect().GetSize() ); + std::shared_ptr<svx::FontWorkGalleryDialog> pDlg = std::make_shared<svx::FontWorkGalleryDialog>(rWin.GetFrameWeld(), *pSdrView); + pDlg->SetSdrObjectRef( pSdrView->GetModel(), false ); + weld::DialogController::runAsync(pDlg, [this, pDlg](int) { + vcl::Window& rWin2 = m_pWrtShell->GetView().GetViewFrame()->GetWindow(); - if( rVisArea.Width() > aDocSize.Width()) - aPos.setX( aDocSize.Width() / 2 + rVisArea.Left() ); + SdrObject* pObj = pDlg->GetSdrObjectRef(); + if ( pObj ) + { + Size aDocSize( m_pWrtShell->GetDocSize() ); + const SwRect& rVisArea = m_pWrtShell->VisArea(); + Point aPos( rVisArea.Center() ); + Size aSize; + Size aPrefSize( pObj->GetSnapRect().GetSize() ); - if(rVisArea.Height() > aDocSize.Height()) - aPos.setY( aDocSize.Height() / 2 + rVisArea.Top() ); + if( rVisArea.Width() > aDocSize.Width()) + aPos.setX( aDocSize.Width() / 2 + rVisArea.Left() ); - if( aPrefSize.Width() && aPrefSize.Height() ) - aSize = rWin.PixelToLogic(aPrefSize, MapMode(MapUnit::MapTwip)); - else - aSize = Size( 2835, 2835 ); + if(rVisArea.Height() > aDocSize.Height()) + aPos.setY( aDocSize.Height() / 2 + rVisArea.Top() ); - m_pWrtShell->EnterStdMode(); - m_pWrtShell->SwFEShell::InsertDrawObj( *pObj, aPos ); - rReq.Ignore (); - } + if( aPrefSize.Width() && aPrefSize.Height() ) + aSize = rWin2.PixelToLogic(aPrefSize, MapMode(MapUnit::MapTwip)); + else + aSize = Size( 2835, 2835 ); + + m_pWrtShell->EnterStdMode(); + m_pWrtShell->SwFEShell::InsertDrawObj( *pObj, aPos ); + } + + rWin2.LeaveWait(); + }); } - rWin.LeaveWait(); + else + rWin.LeaveWait(); } else if ( m_nFormSfxId != USHRT_MAX ) GetViewFrame()->GetDispatcher()->Execute( SID_FM_LEAVE_CREATE ); commit fa03ce3f5aa3cb9439b0531812448afa30c5a6ee Author: Szymon Kłos <[email protected]> AuthorDate: Mon Jan 11 09:47:33 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:24:47 2021 +0200 jsdialog: execute IconView actions Change-Id: If94df547096a5adb15ace432695f91ee7e879bb6 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109078 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109257 Tested-by: Jenkins diff --git a/include/vcl/jsdialog/executor.hxx b/include/vcl/jsdialog/executor.hxx index 0c7abbf693ca..159b1dccd730 100644 --- a/include/vcl/jsdialog/executor.hxx +++ b/include/vcl/jsdialog/executor.hxx @@ -22,6 +22,10 @@ public: static void trigger_changed(weld::ComboBox& rComboBox) { rComboBox.signal_changed(); } + static void trigger_changed(weld::TreeView& rTreeView) { rTreeView.signal_changed(); } + + static void trigger_changed(weld::IconView& rIconView) { rIconView.signal_selection_changed(); } + static void trigger_toggled(weld::ToggleButton& rButton) { rButton.signal_toggled(); } static void trigger_row_activated(weld::TreeView& rTreeView) @@ -29,7 +33,10 @@ public: rTreeView.signal_row_activated(); } - static void trigger_changed(weld::TreeView& rTreeView) { rTreeView.signal_changed(); } + static void trigger_item_activated(weld::IconView& rIconView) + { + rIconView.signal_item_activated(); + } static void trigger_clicked(weld::Toolbar& rToolbar, const OString& rIdent) { diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index db5ada010fd1..b38ba2914462 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -1228,6 +1228,8 @@ public: class VCL_DLLPUBLIC IconView : virtual public Container { + friend class ::LOKTrigger; + private: OUString m_sSavedValue; diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index 066512b2abf1..b21ec0ae7202 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -270,6 +270,36 @@ bool ExecuteAction(sal_uInt64 nWindowId, const OString& rWidget, StringMap& rDat } } } + else if (sControlType == "iconview") + { + auto pIconView = dynamic_cast<weld::IconView*>(pWidget); + if (pIconView) + { + if (sAction == "select") + { + OString nPosString + = OUStringToOString(rData["data"], RTL_TEXTENCODING_ASCII_US); + int nPos = std::atoi(nPosString.getStr()); + + pIconView->select(nPos); + LOKTrigger::trigger_changed(*pIconView); + + return true; + } + else if (sAction == "activate") + { + OString nPosString + = OUStringToOString(rData["data"], RTL_TEXTENCODING_ASCII_US); + int nPos = std::atoi(nPosString.getStr()); + + pIconView->select(nPos); + LOKTrigger::trigger_changed(*pIconView); + LOKTrigger::trigger_item_activated(*pIconView); + + return true; + } + } + } else if (sControlType == "expander") { auto pExpander = dynamic_cast<weld::Expander*>(pWidget); commit a0b95bc0806d45803f063af09a74c685456e79b6 Author: Szymon Kłos <[email protected]> AuthorDate: Fri Jan 8 10:54:14 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:20:56 2021 +0200 jsdialog: dump IconView Change-Id: I82df1f5e5f966e764b768044526b3401d55fc394 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108984 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109256 Tested-by: Jenkins diff --git a/vcl/inc/iconview.hxx b/vcl/inc/iconview.hxx index f10b0ed8a53e..c1e62bc2ec65 100644 --- a/vcl/inc/iconview.hxx +++ b/vcl/inc/iconview.hxx @@ -35,6 +35,7 @@ public: vcl::RenderContext& rRenderContext); virtual FactoryFunction GetUITestFactory() const override; + virtual void DumpAsPropertyTree(tools::JsonWriter& rJsonWriter) override; }; #endif diff --git a/vcl/source/treelist/iconview.cxx b/vcl/source/treelist/iconview.cxx index b6dd3da1c40a..7786a6976c2a 100644 --- a/vcl/source/treelist/iconview.cxx +++ b/vcl/source/treelist/iconview.cxx @@ -22,6 +22,11 @@ #include <iconview.hxx> #include "iconviewimpl.hxx" #include <vcl/uitest/uiobject.hxx> +#include <tools/json_writer.hxx> +#include <vcl/toolkit/svlbitm.hxx> +#include <tools/stream.hxx> +#include <vcl/cvtgrf.hxx> +#include <comphelper/base64.hxx> IconView::IconView(vcl::Window* pParent, WinBits nBits) : SvTreeListBox(pParent, nBits) @@ -218,4 +223,58 @@ void IconView::PaintEntry(SvTreeListEntry& rEntry, tools::Long nX, tools::Long n FactoryFunction IconView::GetUITestFactory() const { return IconViewUIObject::create; } +static OUString extractPngString(const SvLBoxContextBmp* pBmpItem) +{ + BitmapEx aImage = pBmpItem->GetBitmap1().GetBitmapEx(); + SvMemoryStream aOStm(65535, 65535); + if (GraphicConverter::Export(aOStm, aImage, ConvertDataFormat::PNG) == ERRCODE_NONE) + { + css::uno::Sequence<sal_Int8> aSeq(static_cast<sal_Int8 const*>(aOStm.GetData()), + aOStm.Tell()); + OUStringBuffer aBuffer("data:image/png;base64,"); + ::comphelper::Base64::encode(aBuffer, aSeq); + return aBuffer.makeStringAndClear(); + } + + return ""; +} + +static void lcl_DumpEntryAndSiblings(tools::JsonWriter& rJsonWriter, SvTreeListEntry* pEntry, + SvTreeListBox* pTabListBox) +{ + while (pEntry) + { + auto aNode = rJsonWriter.startStruct(); + + // simple listbox value + const SvLBoxItem* pIt = pEntry->GetFirstItem(SvLBoxItemType::String); + if (pIt) + rJsonWriter.put("text", static_cast<const SvLBoxString*>(pIt)->GetText()); + + pIt = pEntry->GetFirstItem(SvLBoxItemType::ContextBmp); + if (pIt) + { + const SvLBoxContextBmp* pBmpItem = static_cast<const SvLBoxContextBmp*>(pIt); + if (pBmpItem) + rJsonWriter.put("image", extractPngString(pBmpItem)); + } + + if (pTabListBox->IsSelected(pEntry)) + rJsonWriter.put("selected", "true"); + + rJsonWriter.put("row", + OString::number(pTabListBox->GetModel()->GetAbsPos(pEntry)).getStr()); + + pEntry = pEntry->NextSibling(); + } +} + +void IconView::DumpAsPropertyTree(tools::JsonWriter& rJsonWriter) +{ + SvTreeListBox::DumpAsPropertyTree(rJsonWriter); + rJsonWriter.put("type", "iconview"); + auto aNode = rJsonWriter.startArray("entries"); + lcl_DumpEntryAndSiblings(rJsonWriter, First(), this); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit ae840230fc92210f80be837f28e9985ab0670246 Author: Szymon Kłos <[email protected]> AuthorDate: Wed Jan 13 20:12:50 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:20:50 2021 +0200 UITest: add IconView Change-Id: I6971d73e65f0a1f60203ea1010ed8ad3ba176755 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109243 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/include/vcl/uitest/uiobject.hxx b/include/vcl/uitest/uiobject.hxx index b4c7f437e9e3..e2cb07384cf7 100644 --- a/include/vcl/uitest/uiobject.hxx +++ b/include/vcl/uitest/uiobject.hxx @@ -24,6 +24,7 @@ class CheckBox; class ComboBox; class Dialog; class Edit; +class IconView; class ListBox; class RadioButton; class TabControl; @@ -439,7 +440,7 @@ private: virtual OUString get_name() const override; }; -class TreeListUIObject final : public WindowUIObject +class TreeListUIObject : public WindowUIObject { public: TreeListUIObject(const VclPtr<SvTreeListBox>& xTreeList); @@ -455,7 +456,7 @@ public: virtual std::set<OUString> get_children() const override; -private: +protected: virtual OUString get_name() const override; @@ -486,6 +487,20 @@ private: SvTreeListEntry* const mpEntry; }; +class IconViewUIObject final : public TreeListUIObject +{ +public: + IconViewUIObject(const VclPtr<SvTreeListBox>& xIconView); + + virtual StringMap get_state() override; + + static std::unique_ptr<UIObject> create(vcl::Window* pWindow); + +private: + + virtual OUString get_name() const override; +}; + class ToolBoxUIObject final : public WindowUIObject { private: diff --git a/sw/qa/uitest/writer_tests2/fontworks.py b/sw/qa/uitest/writer_tests2/fontworks.py index d3034dc8134b..671f63087ba4 100644 --- a/sw/qa/uitest/writer_tests2/fontworks.py +++ b/sw/qa/uitest/writer_tests2/fontworks.py @@ -22,15 +22,18 @@ class fontWorksDialog(UITestCase): self.ui_test.execute_dialog_through_command(".uno:FontworkGalleryFloater") xDialog = self.xUITest.getTopFocusWindow() - FontWorkSelector = xDialog.getChild("ctlFavorites") + FontWorkSelector = xDialog.getChild("ctlFavoriteswin") # Select element with id (3) - FontWorkSelector.executeAction("CHOOSE", mkPropertyValues({"POS": "3"})) + element3 = FontWorkSelector.getChild("2") + element3.executeAction("SELECT", mkPropertyValues({})) + print(get_state_as_dict(FontWorkSelector)) self.assertEqual(get_state_as_dict(FontWorkSelector)["SelectedItemPos"], "2") self.assertEqual(get_state_as_dict(FontWorkSelector)["SelectedItemId"], "3") - self.assertEqual(get_state_as_dict(FontWorkSelector)["ItemsCount"], "36") + self.assertEqual(get_state_as_dict(FontWorkSelector)["VisibleCount"], "36") # Select element with id (7) - FontWorkSelector.executeAction("CHOOSE", mkPropertyValues({"POS": "7"})) + element7 = FontWorkSelector.getChild("6") + element7.executeAction("SELECT", mkPropertyValues({})) self.assertEqual(get_state_as_dict(FontWorkSelector)["SelectedItemPos"], "6") self.assertEqual(get_state_as_dict(FontWorkSelector)["SelectedItemId"], "7") diff --git a/vcl/inc/iconview.hxx b/vcl/inc/iconview.hxx index 9c74d29f9834..f10b0ed8a53e 100644 --- a/vcl/inc/iconview.hxx +++ b/vcl/inc/iconview.hxx @@ -33,6 +33,8 @@ public: void PaintEntry(SvTreeListEntry&, tools::Long nX, tools::Long nY, vcl::RenderContext& rRenderContext); + + virtual FactoryFunction GetUITestFactory() const override; }; #endif diff --git a/vcl/source/treelist/iconview.cxx b/vcl/source/treelist/iconview.cxx index 12bdd75165fe..b6dd3da1c40a 100644 --- a/vcl/source/treelist/iconview.cxx +++ b/vcl/source/treelist/iconview.cxx @@ -21,6 +21,7 @@ #include <vcl/toolkit/viewdataentry.hxx> #include <iconview.hxx> #include "iconviewimpl.hxx" +#include <vcl/uitest/uiobject.hxx> IconView::IconView(vcl::Window* pParent, WinBits nBits) : SvTreeListBox(pParent, nBits) @@ -215,4 +216,6 @@ void IconView::PaintEntry(SvTreeListEntry& rEntry, tools::Long nX, tools::Long n } } +FactoryFunction IconView::GetUITestFactory() const { return IconViewUIObject::create; } + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/vcl/source/uitest/uiobject.cxx b/vcl/source/uitest/uiobject.cxx index 90322d500611..92122b54caab 100644 --- a/vcl/source/uitest/uiobject.cxx +++ b/vcl/source/uitest/uiobject.cxx @@ -26,6 +26,9 @@ #include <vcl/toolkit/dialog.hxx> #include <vcl/toolkit/edit.hxx> #include <vcl/toolkit/field.hxx> +#include <vcl/toolkit/treelistbox.hxx> +#include <vcl/toolkit/treelistentry.hxx> +#include <vcl/toolkit/svlbitm.hxx> #include <vcl/menubtn.hxx> #include <vcl/toolkit/vclmedit.hxx> #include <vcl/uitest/logger.hxx> @@ -1729,4 +1732,38 @@ DrawingAreaUIObject::~DrawingAreaUIObject() { } +IconViewUIObject::IconViewUIObject(const VclPtr<SvTreeListBox>& xIconView): + TreeListUIObject(xIconView) +{ +} + +StringMap IconViewUIObject::get_state() +{ + StringMap aMap = TreeListUIObject::get_state(); + + SvTreeListEntry* pEntry = mxTreeList->FirstSelected(); + + OUString* pId = static_cast<OUString*>(pEntry->GetUserData()); + if (pId) + aMap["SelectedItemId"] = *pId; + + SvTreeList* pModel = mxTreeList->GetModel(); + if (pModel) + aMap["SelectedItemPos"] = OUString::number(pModel->GetAbsPos(pEntry)); + + return aMap; +} + +OUString IconViewUIObject::get_name() const +{ + return "IconViewUIObject"; +} + +std::unique_ptr<UIObject> IconViewUIObject::create(vcl::Window* pWindow) +{ + SvTreeListBox* pTreeList = dynamic_cast<SvTreeListBox*>(pWindow); + assert(pTreeList); + return std::unique_ptr<UIObject>(new IconViewUIObject(pTreeList)); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ commit 63a84a26366353b8bbe2bfedea56a0dcfdf2f572 Author: Szymon Kłos <[email protected]> AuthorDate: Wed Dec 16 23:00:11 2020 +0300 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:10:49 2021 +0200 jsdialogs: implemented IconView Change-Id: I05f5009efc879aaf3fc6055ff8dfa7c26aa33d1b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108983 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109244 Tested-by: Jenkins diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 8740ce5db983..ca59aab24924 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -28,6 +28,7 @@ class ToolBox; class ComboBox; class VclMultiLineEdit; class SvTabListBox; +class IconView; typedef std::map<OString, weld::Widget*> WidgetMap; @@ -174,6 +175,7 @@ public: virtual std::unique_ptr<weld::TextView> weld_text_view(const OString& id) override; virtual std::unique_ptr<weld::TreeView> weld_tree_view(const OString& id) override; virtual std::unique_ptr<weld::Expander> weld_expander(const OString& id) override; + virtual std::unique_ptr<weld::IconView> weld_icon_view(const OString& id) override; static weld::MessageDialog* CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, @@ -444,4 +446,20 @@ public: virtual void set_expanded(bool bExpand) override; }; +class JSIconView : public JSWidget<SalInstanceIconView, ::IconView> +{ +public: + JSIconView(JSDialogSender* pSender, ::IconView* pIconView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void insert(int pos, const OUString* pStr, const OUString* pId, + const OUString* pIconName, weld::TreeIter* pRet) override; + + virtual void insert(int pos, const OUString* pStr, const OUString* pId, + const VirtualDevice* pIcon, weld::TreeIter* pRet) override; + virtual void clear() override; + virtual void select(int pos) override; + virtual void unselect(int pos) override; +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 921552a7d32c..81ba11f92fb9 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -667,6 +667,18 @@ std::unique_ptr<weld::Expander> JSInstanceBuilder::weld_expander(const OString& return pWeldWidget; } +std::unique_ptr<weld::IconView> JSInstanceBuilder::weld_icon_view(const OString& id) +{ + ::IconView* pIconView = m_xBuilder->get<::IconView>(id); + auto pWeldWidget + = pIconView ? std::make_unique<JSIconView>(this, pIconView, this, false) : nullptr; + + if (pWeldWidget) + RememberWidget(id, pWeldWidget.get()); + + return pWeldWidget; +} + weld::MessageDialog* JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, VclButtonsType eButtonType, @@ -1056,4 +1068,42 @@ void JSExpander::set_expanded(bool bExpand) notifyDialogState(); } +JSIconView::JSIconView(JSDialogSender* pSender, ::IconView* pIconView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceIconView, ::IconView>(pSender, pIconView, pBuilder, bTakeOwnership) +{ +} + +void JSIconView::insert(int pos, const OUString* pStr, const OUString* pId, + const OUString* pIconName, weld::TreeIter* pRet) +{ + SalInstanceIconView::insert(pos, pStr, pId, pIconName, pRet); + notifyDialogState(); +} + +void JSIconView::insert(int pos, const OUString* pStr, const OUString* pId, + const VirtualDevice* pIcon, weld::TreeIter* pRet) +{ + SalInstanceIconView::insert(pos, pStr, pId, pIcon, pRet); + notifyDialogState(); +} + +void JSIconView::clear() +{ + SalInstanceIconView::clear(); + notifyDialogState(); +} + +void JSIconView::select(int pos) +{ + SalInstanceIconView::select(pos); + notifyDialogState(); +} + +void JSIconView::unselect(int pos) +{ + SalInstanceIconView::unselect(pos); + notifyDialogState(); +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ commit 242ed6c8c16e76734f2c7c4b7502fd548d59939d Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 12 14:30:05 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:10:49 2021 +0200 jsdialog: use shared sender Change-Id: I6d1047715cf6c29e9281c66d266ed4b888ed784c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109171 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 2df2aaeb3ad1..8740ce5db983 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -23,7 +23,6 @@ #include <com/sun/star/lang/XServiceInfo.hpp> #include <com/sun/star/datatransfer/dnd/XDropTarget.hpp> #include <cppuhelper/compbase.hxx> -#include <boost/property_tree/ptree_fwd.hpp> class ToolBox; class ComboBox; @@ -63,10 +62,11 @@ class JSDialogSender std::unique_ptr<JSDialogNotifyIdle> mpIdleNotify; public: + JSDialogSender() = default; JSDialogSender(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, std::string sTypeOfJSON) - : mpIdleNotify(new JSDialogNotifyIdle(aNotifierWindow, aContentWindow, sTypeOfJSON)) { + initializeSender(aNotifierWindow, aContentWindow, sTypeOfJSON); } virtual ~JSDialogSender() = default; @@ -74,6 +74,13 @@ public: virtual void notifyDialogState(bool bForce = false); void sendClose(); virtual void sendUpdate(VclPtr<vcl::Window> pWindow); + +protected: + void initializeSender(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, + std::string sTypeOfJSON) + { + mpIdleNotify.reset(new JSDialogNotifyIdle(aNotifierWindow, aContentWindow, sTypeOfJSON)); + } }; class JSDropTarget final @@ -110,7 +117,7 @@ public: void fire_dragEnter(const css::datatransfer::dnd::DropTargetDragEnterEvent& dtde); }; -class JSInstanceBuilder : public SalInstanceBuilder +class JSInstanceBuilder : public SalInstanceBuilder, public JSDialogSender { sal_uInt64 m_nWindowId; /// used in case of tab pages where dialog is not a direct top level @@ -174,24 +181,35 @@ public: const OUString& rPrimaryMessage); private: + const std::string& GetTypeOfJSON(); VclPtr<vcl::Window>& GetContentWindow(); VclPtr<vcl::Window>& GetNotifierWindow(); }; -template <class BaseInstanceClass, class VclClass> -class JSWidget : public BaseInstanceClass, public JSDialogSender +template <class BaseInstanceClass, class VclClass> class JSWidget : public BaseInstanceClass { protected: rtl::Reference<JSDropTarget> m_xDropTarget; bool m_bIsFreezed; + JSDialogSender* m_pSender; + public: - JSWidget(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - VclClass* pObject, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) + JSWidget(JSDialogSender* pSender, VclClass* pObject, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) : BaseInstanceClass(pObject, pBuilder, bTakeOwnership) - , JSDialogSender(aNotifierWindow, aContentWindow, sTypeOfJSON) , m_bIsFreezed(false) + , m_pSender(pSender) + { + } + + JSWidget(JSDialogSender* pSender, VclClass* pObject, SalInstanceBuilder* pBuilder, + const a11yref& rAlly, FactoryFunction pUITestFactoryFunction, void* pUserData, + bool bTakeOwnership) + : BaseInstanceClass(pObject, pBuilder, rAlly, pUITestFactoryFunction, pUserData, + bTakeOwnership) + , m_bIsFreezed(false) + , m_pSender(pSender) { } @@ -234,25 +252,30 @@ public: m_bIsFreezed = false; } - virtual void sendUpdate(VclPtr<vcl::Window> pWindow) override + void sendClose() + { + if (m_pSender) + m_pSender->sendClose(); + } + + void sendUpdate(VclPtr<vcl::Window> pWindow) { - if (!m_bIsFreezed) - JSDialogSender::sendUpdate(pWindow); + if (!m_bIsFreezed && m_pSender) + m_pSender->sendUpdate(pWindow); } - virtual void notifyDialogState(bool bForce = false) override + void notifyDialogState(bool bForce = false) { - if (!m_bIsFreezed || bForce) - JSDialogSender::notifyDialogState(bForce); + if ((!m_bIsFreezed || bForce) && m_pSender) + m_pSender->notifyDialogState(bForce); } }; class JSDialog : public JSWidget<SalInstanceDialog, ::Dialog> { public: - JSDialog(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::Dialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSDialog(JSDialogSender* pSender, ::Dialog* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void collapse(weld::Widget* pEdit, weld::Widget* pButton) override; virtual void undo_collapse() override; @@ -262,34 +285,31 @@ public: class JSLabel : public JSWidget<SalInstanceLabel, FixedText> { public: - JSLabel(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - FixedText* pLabel, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSLabel(JSDialogSender* pSender, FixedText* pLabel, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void set_label(const OUString& rText) override; }; class JSButton : public JSWidget<SalInstanceButton, ::Button> { public: - JSButton(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::Button* pButton, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSButton(JSDialogSender* pSender, ::Button* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); }; class JSEntry : public JSWidget<SalInstanceEntry, ::Edit> { public: - JSEntry(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, ::Edit* pEntry, - SalInstanceBuilder* pBuilder, bool bTakeOwnership, std::string sTypeOfJSON); + JSEntry(JSDialogSender* pSender, ::Edit* pEntry, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void set_text(const OUString& rText) override; }; class JSListBox : public JSWidget<SalInstanceComboBoxWithoutEdit, ::ListBox> { public: - JSListBox(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::ListBox* pListBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSListBox(JSDialogSender* pSender, ::ListBox* pListBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) override; virtual void remove(int pos) override; @@ -299,9 +319,8 @@ public: class JSComboBox : public JSWidget<SalInstanceComboBoxWithEdit, ::ComboBox> { public: - JSComboBox(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSComboBox(JSDialogSender* pSender, ::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void insert(int pos, const OUString& rStr, const OUString* pId, const OUString* pIconName, VirtualDevice* pImageSurface) override; virtual void remove(int pos) override; @@ -312,9 +331,8 @@ public: class JSNotebook : public JSWidget<SalInstanceNotebook, ::TabControl> { public: - JSNotebook(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::TabControl* pControl, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSNotebook(JSDialogSender* pSender, ::TabControl* pControl, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void set_current_page(int nPage) override; @@ -328,18 +346,20 @@ public: class JSSpinButton : public JSWidget<SalInstanceSpinButton, ::FormattedField> { public: - JSSpinButton(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::FormattedField* pSpin, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSSpinButton(JSDialogSender* pSender, ::FormattedField* pSpin, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void set_value(int value) override; }; -class JSMessageDialog : public SalInstanceMessageDialog, public JSDialogSender +class JSMessageDialog : public JSWidget<SalInstanceMessageDialog, ::MessageDialog> { + std::unique_ptr<JSDialogSender> m_pOwnedSender; + public: - JSMessageDialog(::MessageDialog* pDialog, VclPtr<vcl::Window> aContentWindow, - SalInstanceBuilder* pBuilder, bool bTakeOwnership); + JSMessageDialog(JSDialogSender* pSender, ::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership); virtual void set_primary_text(const OUString& rText) override; @@ -349,19 +369,18 @@ public: class JSCheckButton : public JSWidget<SalInstanceCheckButton, ::CheckBox> { public: - JSCheckButton(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::CheckBox* pCheckBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void set_active(bool active) override; }; -class JSDrawingArea : public SalInstanceDrawingArea, public JSDialogSender +class JSDrawingArea : public JSWidget<SalInstanceDrawingArea, VclDrawingArea> { public: - JSDrawingArea(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - VclDrawingArea* pDrawingArea, SalInstanceBuilder* pBuilder, const a11yref& rAlly, - FactoryFunction pUITestFactoryFunction, void* pUserData, std::string sTypeOfJSON); + JSDrawingArea(JSDialogSender* pSender, VclDrawingArea* pDrawingArea, + SalInstanceBuilder* pBuilder, const a11yref& rAlly, + FactoryFunction pUITestFactoryFunction, void* pUserData); virtual void queue_draw() override; virtual void queue_draw_area(int x, int y, int width, int height) override; @@ -370,9 +389,8 @@ public: class JSToolbar : public JSWidget<SalInstanceToolbar, ::ToolBox> { public: - JSToolbar(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void signal_clicked(const OString& rIdent) override; }; @@ -380,18 +398,16 @@ public: class JSTextView : public JSWidget<SalInstanceTextView, ::VclMultiLineEdit> { public: - JSTextView(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSTextView(JSDialogSender* pSender, ::VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void set_text(const OUString& rText) override; }; class JSTreeView : public JSWidget<SalInstanceTreeView, ::SvTabListBox> { public: - JSTreeView(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::SvTabListBox* pTextView, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSTreeView(JSDialogSender* pSender, ::SvTabListBox* pTextView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); using SalInstanceTreeView::set_toggle; /// pos is used differently here, it defines how many steps of iterator we need to perform to take entry @@ -422,9 +438,8 @@ public: class JSExpander : public JSWidget<SalInstanceExpander, ::VclExpander> { public: - JSExpander(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::VclExpander* pExpander, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON); + JSExpander(JSDialogSender* pSender, ::VclExpander* pExpander, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); virtual void set_expanded(bool bExpand) override; }; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index df2d68e71c16..921552a7d32c 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -297,6 +297,8 @@ JSInstanceBuilder::JSInstanceBuilder(weld::Widget* pParent, const OUString& rUIR m_nWindowId = m_aParentDialog->GetLOKWindowId(); InsertWindowToMap(m_nWindowId); } + + initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); } // used for notebookbar @@ -325,6 +327,8 @@ JSInstanceBuilder::JSInstanceBuilder(vcl::Window* pParent, const OUString& rUIRo } InsertWindowToMap(m_nWindowId); } + + initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); } // used for autofilter dropdown @@ -347,6 +351,8 @@ JSInstanceBuilder::JSInstanceBuilder(vcl::Window* pParent, const OUString& rUIRo m_nWindowId = m_aParentDialog->GetLOKWindowId(); InsertWindowToMap(m_nWindowId); } + + initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); } JSInstanceBuilder* JSInstanceBuilder::CreateDialogBuilder(weld::Widget* pParent, @@ -428,6 +434,8 @@ void JSInstanceBuilder::RememberWidget(const OString& id, weld::Widget* pWidget) } } +const std::string& JSInstanceBuilder::GetTypeOfJSON() { return m_sTypeOfJSON; } + VclPtr<vcl::Window>& JSInstanceBuilder::GetContentWindow() { if (m_aContentWindow) @@ -458,8 +466,7 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id) m_xBuilder->drop_ownership(pDialog); m_bHasTopLevelDialog = true; - pRet.reset( - new JSDialog(m_aOwnedToplevel, m_aOwnedToplevel, pDialog, this, false, m_sTypeOfJSON)); + pRet.reset(new JSDialog(this, pDialog, this, false)); RememberWidget("__DIALOG__", pRet.get()); @@ -471,6 +478,8 @@ std::unique_ptr<weld::Dialog> JSInstanceBuilder::weld_dialog(const OString& id) aJsonWriter.put("id", m_aOwnedToplevel->GetLOKWindowId()); pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, aJsonWriter.extractData()); } + + initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); } return pRet; @@ -491,10 +500,12 @@ std::unique_ptr<weld::MessageDialog> JSInstanceBuilder::weld_message_dialog(cons assert(!m_aOwnedToplevel && "only one toplevel per .ui allowed"); m_aOwnedToplevel.set(pMessageDialog); m_xBuilder->drop_ownership(pMessageDialog); + m_bHasTopLevelDialog = true; + + initializeSender(GetNotifierWindow(), GetContentWindow(), GetTypeOfJSON()); } - pRet.reset(pMessageDialog ? new JSMessageDialog(pMessageDialog, m_aOwnedToplevel, this, false) - : nullptr); + pRet.reset(pMessageDialog ? new JSMessageDialog(this, pMessageDialog, this, false) : nullptr); if (pRet) RememberWidget("__DIALOG__", pRet.get()); @@ -505,8 +516,7 @@ std::unique_ptr<weld::MessageDialog> JSInstanceBuilder::weld_message_dialog(cons std::unique_ptr<weld::Label> JSInstanceBuilder::weld_label(const OString& id) { ::FixedText* pLabel = m_xBuilder->get<FixedText>(id); - auto pWeldWidget = std::make_unique<JSLabel>(GetNotifierWindow(), GetContentWindow(), pLabel, - this, false, m_sTypeOfJSON); + auto pWeldWidget = std::make_unique<JSLabel>(this, pLabel, this, false); if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -517,9 +527,7 @@ std::unique_ptr<weld::Label> JSInstanceBuilder::weld_label(const OString& id) std::unique_ptr<weld::Button> JSInstanceBuilder::weld_button(const OString& id) { ::Button* pButton = m_xBuilder->get<::Button>(id); - auto pWeldWidget = pButton ? std::make_unique<JSButton>(GetNotifierWindow(), GetContentWindow(), - pButton, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget = pButton ? std::make_unique<JSButton>(this, pButton, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -530,9 +538,7 @@ std::unique_ptr<weld::Button> JSInstanceBuilder::weld_button(const OString& id) std::unique_ptr<weld::Entry> JSInstanceBuilder::weld_entry(const OString& id) { Edit* pEntry = m_xBuilder->get<Edit>(id); - auto pWeldWidget = pEntry ? std::make_unique<JSEntry>(GetNotifierWindow(), GetContentWindow(), - pEntry, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget = pEntry ? std::make_unique<JSEntry>(this, pEntry, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -548,16 +554,12 @@ std::unique_ptr<weld::ComboBox> JSInstanceBuilder::weld_combo_box(const OString& if (pComboBox) { - pWeldWidget = std::make_unique<JSComboBox>(GetNotifierWindow(), GetContentWindow(), - pComboBox, this, false, m_sTypeOfJSON); + pWeldWidget = std::make_unique<JSComboBox>(this, pComboBox, this, false); } else { ListBox* pListBox = dynamic_cast<ListBox*>(pWidget); - pWeldWidget = pListBox - ? std::make_unique<JSListBox>(GetNotifierWindow(), GetContentWindow(), - pListBox, this, false, m_sTypeOfJSON) - : nullptr; + pWeldWidget = pListBox ? std::make_unique<JSListBox>(this, pListBox, this, false) : nullptr; } if (pWeldWidget) @@ -569,10 +571,8 @@ std::unique_ptr<weld::ComboBox> JSInstanceBuilder::weld_combo_box(const OString& std::unique_ptr<weld::Notebook> JSInstanceBuilder::weld_notebook(const OString& id) { TabControl* pNotebook = m_xBuilder->get<TabControl>(id); - auto pWeldWidget = pNotebook - ? std::make_unique<JSNotebook>(GetNotifierWindow(), GetContentWindow(), - pNotebook, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget + = pNotebook ? std::make_unique<JSNotebook>(this, pNotebook, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -583,10 +583,8 @@ std::unique_ptr<weld::Notebook> JSInstanceBuilder::weld_notebook(const OString& std::unique_ptr<weld::SpinButton> JSInstanceBuilder::weld_spin_button(const OString& id) { FormattedField* pSpinButton = m_xBuilder->get<FormattedField>(id); - auto pWeldWidget = pSpinButton - ? std::make_unique<JSSpinButton>(GetNotifierWindow(), GetContentWindow(), - pSpinButton, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget + = pSpinButton ? std::make_unique<JSSpinButton>(this, pSpinButton, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -598,9 +596,7 @@ std::unique_ptr<weld::CheckButton> JSInstanceBuilder::weld_check_button(const OS { CheckBox* pCheckButton = m_xBuilder->get<CheckBox>(id); auto pWeldWidget - = pCheckButton ? std::make_unique<JSCheckButton>(GetNotifierWindow(), GetContentWindow(), - pCheckButton, this, false, m_sTypeOfJSON) - : nullptr; + = pCheckButton ? std::make_unique<JSCheckButton>(this, pCheckButton, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -613,9 +609,8 @@ JSInstanceBuilder::weld_drawing_area(const OString& id, const a11yref& rA11yImpl FactoryFunction pUITestFactoryFunction, void* pUserData) { VclDrawingArea* pArea = m_xBuilder->get<VclDrawingArea>(id); - auto pWeldWidget = pArea ? std::make_unique<JSDrawingArea>( - GetNotifierWindow(), GetContentWindow(), pArea, this, rA11yImpl, - pUITestFactoryFunction, pUserData, m_sTypeOfJSON) + auto pWeldWidget = pArea ? std::make_unique<JSDrawingArea>(this, pArea, this, rA11yImpl, + pUITestFactoryFunction, pUserData) : nullptr; if (pWeldWidget) @@ -627,10 +622,8 @@ JSInstanceBuilder::weld_drawing_area(const OString& id, const a11yref& rA11yImpl std::unique_ptr<weld::Toolbar> JSInstanceBuilder::weld_toolbar(const OString& id) { ToolBox* pToolBox = m_xBuilder->get<ToolBox>(id); - auto pWeldWidget = pToolBox - ? std::make_unique<JSToolbar>(GetNotifierWindow(), GetContentWindow(), - pToolBox, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget + = pToolBox ? std::make_unique<JSToolbar>(this, pToolBox, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -641,10 +634,8 @@ std::unique_ptr<weld::Toolbar> JSInstanceBuilder::weld_toolbar(const OString& id std::unique_ptr<weld::TextView> JSInstanceBuilder::weld_text_view(const OString& id) { VclMultiLineEdit* pTextView = m_xBuilder->get<VclMultiLineEdit>(id); - auto pWeldWidget = pTextView - ? std::make_unique<JSTextView>(GetNotifierWindow(), GetContentWindow(), - pTextView, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget + = pTextView ? std::make_unique<JSTextView>(this, pTextView, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -655,10 +646,8 @@ std::unique_ptr<weld::TextView> JSInstanceBuilder::weld_text_view(const OString& std::unique_ptr<weld::TreeView> JSInstanceBuilder::weld_tree_view(const OString& id) { SvTabListBox* pTreeView = m_xBuilder->get<SvTabListBox>(id); - auto pWeldWidget = pTreeView - ? std::make_unique<JSTreeView>(GetNotifierWindow(), GetContentWindow(), - pTreeView, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget + = pTreeView ? std::make_unique<JSTreeView>(this, pTreeView, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -669,10 +658,8 @@ std::unique_ptr<weld::TreeView> JSInstanceBuilder::weld_tree_view(const OString& std::unique_ptr<weld::Expander> JSInstanceBuilder::weld_expander(const OString& id) { VclExpander* pExpander = m_xBuilder->get<VclExpander>(id); - auto pWeldWidget = pExpander - ? std::make_unique<JSExpander>(GetNotifierWindow(), GetContentWindow(), - pExpander, this, false, m_sTypeOfJSON) - : nullptr; + auto pWeldWidget + = pExpander ? std::make_unique<JSExpander>(this, pExpander, this, false) : nullptr; if (pWeldWidget) RememberWidget(id, pWeldWidget.get()); @@ -701,14 +688,12 @@ weld::MessageDialog* JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParen pNotifier->libreOfficeKitViewCallback(LOK_CALLBACK_JSDIALOG, message.get()); } - return new JSMessageDialog(xMessageDialog, xMessageDialog, nullptr, true); + return new JSMessageDialog(xMessageDialog, nullptr, true); } -JSDialog::JSDialog(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::Dialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceDialog, ::Dialog>(aNotifierWindow, aContentWindow, pDialog, pBuilder, - bTakeOwnership, sTypeOfJSON) +JSDialog::JSDialog(JSDialogSender* pSender, ::Dialog* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceDialog, ::Dialog>(pSender, pDialog, pBuilder, bTakeOwnership) { } @@ -730,11 +715,9 @@ void JSDialog::response(int response) SalInstanceDialog::response(response); } -JSLabel::JSLabel(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - FixedText* pLabel, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceLabel, FixedText>(aNotifierWindow, aContentWindow, pLabel, pBuilder, - bTakeOwnership, sTypeOfJSON) +JSLabel::JSLabel(JSDialogSender* pSender, FixedText* pLabel, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceLabel, FixedText>(pSender, pLabel, pBuilder, bTakeOwnership) { } @@ -744,19 +727,15 @@ void JSLabel::set_label(const OUString& rText) notifyDialogState(); }; -JSButton::JSButton(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::Button* pButton, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceButton, ::Button>(aNotifierWindow, aContentWindow, pButton, pBuilder, - bTakeOwnership, sTypeOfJSON) +JSButton::JSButton(JSDialogSender* pSender, ::Button* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceButton, ::Button>(pSender, pButton, pBuilder, bTakeOwnership) { } -JSEntry::JSEntry(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::Edit* pEntry, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceEntry, ::Edit>(aNotifierWindow, aContentWindow, pEntry, pBuilder, - bTakeOwnership, sTypeOfJSON) +JSEntry::JSEntry(JSDialogSender* pSender, ::Edit* pEntry, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceEntry, ::Edit>(pSender, pEntry, pBuilder, bTakeOwnership) { } @@ -766,11 +745,10 @@ void JSEntry::set_text(const OUString& rText) notifyDialogState(); } -JSListBox::JSListBox(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::ListBox* pListBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceComboBoxWithoutEdit, ::ListBox>(aNotifierWindow, aContentWindow, pListBox, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSListBox::JSListBox(JSDialogSender* pSender, ::ListBox* pListBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceComboBoxWithoutEdit, ::ListBox>(pSender, pListBox, pBuilder, + bTakeOwnership) { } @@ -793,11 +771,10 @@ void JSListBox::set_active(int pos) notifyDialogState(); } -JSComboBox::JSComboBox(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceComboBoxWithEdit, ::ComboBox>(aNotifierWindow, aContentWindow, pComboBox, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSComboBox::JSComboBox(JSDialogSender* pSender, ::ComboBox* pComboBox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceComboBoxWithEdit, ::ComboBox>(pSender, pComboBox, pBuilder, + bTakeOwnership) { } @@ -826,11 +803,9 @@ void JSComboBox::set_active(int pos) notifyDialogState(); } -JSNotebook::JSNotebook(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::TabControl* pControl, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceNotebook, ::TabControl>(aNotifierWindow, aContentWindow, pControl, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSNotebook::JSNotebook(JSDialogSender* pSender, ::TabControl* pControl, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceNotebook, ::TabControl>(pSender, pControl, pBuilder, bTakeOwnership) { } @@ -868,11 +843,9 @@ void JSNotebook::insert_page(const OString& rIdent, const OUString& rLabel, int notifyDialogState(); } -JSSpinButton::JSSpinButton(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::FormattedField* pSpin, SalInstanceBuilder* pBuilder, - bool bTakeOwnership, std::string sTypeOfJSON) - : JSWidget<SalInstanceSpinButton, ::FormattedField>(aNotifierWindow, aContentWindow, pSpin, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSSpinButton::JSSpinButton(JSDialogSender* pSender, ::FormattedField* pSpin, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceSpinButton, ::FormattedField>(pSender, pSpin, pBuilder, bTakeOwnership) { } @@ -882,11 +855,20 @@ void JSSpinButton::set_value(int value) notifyDialogState(true); // if input is limited we can receive the same JSON } -JSMessageDialog::JSMessageDialog(::MessageDialog* pDialog, VclPtr<vcl::Window> aContentWindow, +JSMessageDialog::JSMessageDialog(JSDialogSender* pSender, ::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, bool bTakeOwnership) - : SalInstanceMessageDialog(pDialog, pBuilder, bTakeOwnership) - , JSDialogSender(m_xMessageDialog, aContentWindow, "dialog") + : JSWidget<SalInstanceMessageDialog, ::MessageDialog>(pSender, pDialog, pBuilder, + bTakeOwnership) +{ +} + +JSMessageDialog::JSMessageDialog(::MessageDialog* pDialog, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceMessageDialog, ::MessageDialog>(nullptr, pDialog, pBuilder, + bTakeOwnership) + , m_pOwnedSender(new JSDialogSender(pDialog, pDialog, "dialog")) { + m_pSender = m_pOwnedSender.get(); } void JSMessageDialog::set_primary_text(const OUString& rText) @@ -901,12 +883,9 @@ void JSMessageDialog::set_secondary_text(const OUString& rText) notifyDialogState(); } -JSCheckButton::JSCheckButton(VclPtr<vcl::Window> aNotifierWindow, - VclPtr<vcl::Window> aContentWindow, ::CheckBox* pCheckBox, - SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceCheckButton, ::CheckBox>(aNotifierWindow, aContentWindow, pCheckBox, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSCheckButton::JSCheckButton(JSDialogSender* pSender, ::CheckBox* pCheckBox, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceCheckButton, ::CheckBox>(pSender, pCheckBox, pBuilder, bTakeOwnership) { } @@ -916,14 +895,11 @@ void JSCheckButton::set_active(bool active) notifyDialogState(); } -JSDrawingArea::JSDrawingArea(VclPtr<vcl::Window> aNotifierWindow, - VclPtr<vcl::Window> aContentWindow, VclDrawingArea* pDrawingArea, +JSDrawingArea::JSDrawingArea(JSDialogSender* pSender, VclDrawingArea* pDrawingArea, SalInstanceBuilder* pBuilder, const a11yref& rAlly, - FactoryFunction pUITestFactoryFunction, void* pUserData, - std::string sTypeOfJSON) - : SalInstanceDrawingArea(pDrawingArea, pBuilder, rAlly, pUITestFactoryFunction, pUserData, - false) - , JSDialogSender(aNotifierWindow, aContentWindow, sTypeOfJSON) + FactoryFunction pUITestFactoryFunction, void* pUserData) + : JSWidget<SalInstanceDrawingArea, VclDrawingArea>(pSender, pDrawingArea, pBuilder, rAlly, + pUITestFactoryFunction, pUserData, false) { } @@ -939,11 +915,9 @@ void JSDrawingArea::queue_draw_area(int x, int y, int width, int height) notifyDialogState(); } -JSToolbar::JSToolbar(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceToolbar, ::ToolBox>(aNotifierWindow, aContentWindow, pToolbox, pBuilder, - bTakeOwnership, sTypeOfJSON) +JSToolbar::JSToolbar(JSDialogSender* pSender, ::ToolBox* pToolbox, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceToolbar, ::ToolBox>(pSender, pToolbox, pBuilder, bTakeOwnership) { } @@ -953,11 +927,10 @@ void JSToolbar::signal_clicked(const OString& rIdent) notifyDialogState(); } -JSTextView::JSTextView(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::VclMultiLineEdit* pTextView, SalInstanceBuilder* pBuilder, - bool bTakeOwnership, std::string sTypeOfJSON) - : JSWidget<SalInstanceTextView, ::VclMultiLineEdit>(aNotifierWindow, aContentWindow, pTextView, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSTextView::JSTextView(JSDialogSender* pSender, ::VclMultiLineEdit* pTextView, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceTextView, ::VclMultiLineEdit>(pSender, pTextView, pBuilder, + bTakeOwnership) { } @@ -967,11 +940,9 @@ void JSTextView::set_text(const OUString& rText) notifyDialogState(); } -JSTreeView::JSTreeView(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::SvTabListBox* pTreeView, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceTreeView, ::SvTabListBox>(aNotifierWindow, aContentWindow, pTreeView, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSTreeView::JSTreeView(JSDialogSender* pSender, ::SvTabListBox* pTreeView, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceTreeView, ::SvTabListBox>(pSender, pTreeView, pBuilder, bTakeOwnership) { } @@ -1073,11 +1044,9 @@ void JSTreeView::collapse_row(const weld::TreeIter& rIter) sendUpdate(m_xTreeView); } -JSExpander::JSExpander(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, - ::VclExpander* pExpander, SalInstanceBuilder* pBuilder, bool bTakeOwnership, - std::string sTypeOfJSON) - : JSWidget<SalInstanceExpander, ::VclExpander>(aNotifierWindow, aContentWindow, pExpander, - pBuilder, bTakeOwnership, sTypeOfJSON) +JSExpander::JSExpander(JSDialogSender* pSender, ::VclExpander* pExpander, + SalInstanceBuilder* pBuilder, bool bTakeOwnership) + : JSWidget<SalInstanceExpander, ::VclExpander>(pSender, pExpander, pBuilder, bTakeOwnership) { } commit 859cc731b18f8483db9e9ec09cb8e990f3ecd8fd Author: Szymon Kłos <[email protected]> AuthorDate: Wed Dec 30 09:57:00 2020 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 20:10:49 2021 +0200 jsdialog: support for freeze/thaw Change-Id: Ia3ca2c3c06a95e295e400780540c176cd9606ee7 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108498 Tested-by: Jenkins Reviewed-by: Szymon Kłos <[email protected]> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 756f9d34767a..2df2aaeb3ad1 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -69,9 +69,11 @@ public: { } - void notifyDialogState(bool bForce = false); + virtual ~JSDialogSender() = default; + + virtual void notifyDialogState(bool bForce = false); void sendClose(); - void sendUpdate(VclPtr<vcl::Window> pWindow); + virtual void sendUpdate(VclPtr<vcl::Window> pWindow); }; class JSDropTarget final @@ -181,6 +183,7 @@ class JSWidget : public BaseInstanceClass, public JSDialogSender { protected: rtl::Reference<JSDropTarget> m_xDropTarget; + bool m_bIsFreezed; public: JSWidget(VclPtr<vcl::Window> aNotifierWindow, VclPtr<vcl::Window> aContentWindow, @@ -188,6 +191,7 @@ public: std::string sTypeOfJSON) : BaseInstanceClass(pObject, pBuilder, bTakeOwnership) , JSDialogSender(aNotifierWindow, aContentWindow, sTypeOfJSON) + , m_bIsFreezed(false) { } @@ -217,6 +221,30 @@ public: return m_xDropTarget.get(); } + + virtual void freeze() override + { + BaseInstanceClass::freeze(); + m_bIsFreezed = true; + } + + virtual void thaw() override + { + BaseInstanceClass::thaw(); + m_bIsFreezed = false; + } + + virtual void sendUpdate(VclPtr<vcl::Window> pWindow) override + { + if (!m_bIsFreezed) + JSDialogSender::sendUpdate(pWindow); + } + + virtual void notifyDialogState(bool bForce = false) override + { + if (!m_bIsFreezed || bForce) + JSDialogSender::notifyDialogState(bForce); + } }; class JSDialog : public JSWidget<SalInstanceDialog, ::Dialog> commit 27f1750e1cc2795c24d63f7751a4203589d9fe26 Author: Szymon Kłos <[email protected]> AuthorDate: Tue Jan 12 16:10:58 2021 +0100 Commit: Andras Timar <[email protected]> CommitDate: Sat Apr 10 18:24:08 2021 +0200 Move SalInstanceIconView decl to header file Change-Id: I179f044b3db38ee51f539ef4023b136eac55f4ed Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108982 Tested-by: Jenkins CollaboraOffice <[email protected]> Reviewed-by: Szymon Kłos <[email protected]> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/109182 Tested-by: Jenkins diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 3c43c95c5cd9..34a301330ea8 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -27,6 +27,7 @@ #include <vcl/toolkit/svtabbx.hxx> #include <vcl/toolkit/svlbitm.hxx> #include <o3tl/sorted_vector.hxx> +#include "iconview.hxx" class SalInstanceBuilder : public weld::Builder { @@ -1699,4 +1700,62 @@ public: virtual ~SalInstanceExpander() override; }; +class SalInstanceIconView : public SalInstanceContainer, public virtual weld::IconView +{ +private: + // owner for UserData + std::vector<std::unique_ptr<OUString>> m_aUserData; + VclPtr<::IconView> m_xIconView; + + DECL_LINK(SelectHdl, SvTreeListBox*, void); + DECL_LINK(DeSelectHdl, SvTreeListBox*, void); + DECL_LINK(DoubleClickHdl, SvTreeListBox*, bool); + +public: + SalInstanceIconView(::IconView* pIconView, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + + virtual void freeze() override; + + virtual void thaw() override; + + virtual void insert(int pos, const OUString* pStr, const OUString* pId, + const OUString* pIconName, weld::TreeIter* pRet) override; + + virtual void insert(int pos, const OUString* pStr, const OUString* pId, + const VirtualDevice* pIcon, weld::TreeIter* pRet) override; + + virtual OUString get_selected_id() const override; + + virtual OUString get_selected_text() const override; + + virtual int count_selected_items() const override; + + virtual void select(int pos) override; + + virtual void unselect(int pos) override; + + virtual int n_children() const override; + + virtual std::unique_ptr<weld::TreeIter> make_iterator(const weld::TreeIter* pOrig + = nullptr) const override; + + virtual bool get_selected(weld::TreeIter* pIter) const override; + + virtual bool get_cursor(weld::TreeIter* pIter) const override; + + virtual void set_cursor(const weld::TreeIter& rIter) override; + + virtual bool get_iter_first(weld::TreeIter& rIter) const override; + + virtual void scroll_to_item(const weld::TreeIter& rIter) override; + + virtual void selected_foreach(const std::function<bool(weld::TreeIter&)>& func) override; + + virtual OUString get_id(const weld::TreeIter& rIter) const override; + + virtual void clear() override; + + virtual ~SalInstanceIconView() override; +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 56c0f9dd3e40..555bc74a8553 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -22,7 +22,6 @@ #include <com/sun/star/awt/XWindowPeer.hpp> #include <o3tl/sorted_vector.hxx> #include <officecfg/Office/Common.hxx> -#include <iconview.hxx> #include <salframe.hxx> #include <salinst.hxx> #include <salvd.hxx> @@ -5021,264 +5020,252 @@ IMPL_LINK(SalInstanceTreeView, EditedEntryHdl, IterString, rIterString, bool) iter_string(SalInstanceTreeIter(rIterString.first), rIterString.second)); } -class SalInstanceIconView : public SalInstanceContainer, public virtual weld::IconView +SalInstanceIconView::SalInstanceIconView(::IconView* pIconView, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : SalInstanceContainer(pIconView, pBuilder, bTakeOwnership) + , m_xIconView(pIconView) { -private: - // owner for UserData - std::vector<std::unique_ptr<OUString>> m_aUserData; - VclPtr<::IconView> m_xIconView; + m_xIconView->SetSelectHdl(LINK(this, SalInstanceIconView, SelectHdl)); + m_xIconView->SetDeselectHdl(LINK(this, SalInstanceIconView, DeSelectHdl)); + m_xIconView->SetDoubleClickHdl(LINK(this, SalInstanceIconView, DoubleClickHdl)); +} - DECL_LINK(SelectHdl, SvTreeListBox*, void); - DECL_LINK(DeSelectHdl, SvTreeListBox*, void); - DECL_LINK(DoubleClickHdl, SvTreeListBox*, bool); +void SalInstanceIconView::freeze() +{ + SalInstanceWidget::freeze(); + m_xIconView->SetUpdateMode(false); +} -public: - SalInstanceIconView(::IconView* pIconView, SalInstanceBuilder* pBuilder, bool bTakeOwnership) - : SalInstanceContainer(pIconView, pBuilder, bTakeOwnership) - , m_xIconView(pIconView) +void SalInstanceIconView::thaw() +{ + m_xIconView->SetUpdateMode(true); + SalInstanceWidget::thaw(); +} + +void SalInstanceIconView::insert(int pos, const OUString* pStr, const OUString* pId, + const OUString* pIconName, weld::TreeIter* pRet) +{ + disable_notify_events(); + auto nInsertPos = pos == -1 ? TREELIST_APPEND : pos; + void* pUserData; + if (pId) { - m_xIconView->SetSelectHdl(LINK(this, SalInstanceIconView, SelectHdl)); - m_xIconView->SetDeselectHdl(LINK(this, SalInstanceIconView, DeSelectHdl)); - m_xIconView->SetDoubleClickHdl(LINK(this, SalInstanceIconView, DoubleClickHdl)); + m_aUserData.emplace_back(std::make_unique<OUString>(*pId)); + pUserData = m_aUserData.back().get(); } + else + pUserData = nullptr; - virtual void freeze() override + SvTreeListEntry* pEntry = new SvTreeListEntry; + if (pIconName) { - SalInstanceWidget::freeze(); - m_xIconView->SetUpdateMode(false); + Image aImage(createImage(*pIconName)); + pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage, false)); } - - virtual void thaw() override + else { - m_xIconView->SetUpdateMode(true); - SalInstanceWidget::thaw(); + Image aDummy; + pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy, false)); } + if (pStr) + pEntry->AddItem(std::make_unique<SvLBoxString>(*pStr)); + pEntry->SetUserData(pUserData); + m_xIconView->Insert(pEntry, nullptr, nInsertPos); - virtual void insert(int pos, const OUString* pStr, const OUString* pId, - const OUString* pIconName, weld::TreeIter* pRet) override + if (pRet) { - disable_notify_events(); - auto nInsertPos = pos == -1 ? TREELIST_APPEND : pos; - void* pUserData; - if (pId) - { - m_aUserData.emplace_back(std::make_unique<OUString>(*pId)); - pUserData = m_aUserData.back().get(); - } - else - pUserData = nullptr; - - SvTreeListEntry* pEntry = new SvTreeListEntry; - if (pIconName) - { - Image aImage(createImage(*pIconName)); - pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage, false)); - } - else - { - Image aDummy; - pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy, false)); - } - if (pStr) - pEntry->AddItem(std::make_unique<SvLBoxString>(*pStr)); - pEntry->SetUserData(pUserData); - m_xIconView->Insert(pEntry, nullptr, nInsertPos); + SalInstanceTreeIter* pVclRetIter = static_cast<SalInstanceTreeIter*>(pRet); + pVclRetIter->iter = pEntry; + } - if (pRet) - { - SalInstanceTreeIter* pVclRetIter = static_cast<SalInstanceTreeIter*>(pRet); - pVclRetIter->iter = pEntry; - } + enable_notify_events(); +} - enable_notify_events(); +void SalInstanceIconView::insert(int pos, const OUString* pStr, const OUString* pId, + const VirtualDevice* pIcon, weld::TreeIter* pRet) +{ + disable_notify_events(); + auto nInsertPos = pos == -1 ? TREELIST_APPEND : pos; + void* pUserData; + if (pId) + { + m_aUserData.emplace_back(std::make_unique<OUString>(*pId)); + pUserData = m_aUserData.back().get(); } + else + pUserData = nullptr; - virtual void insert(int pos, const OUString* pStr, const OUString* pId, - const VirtualDevice* pIcon, weld::TreeIter* pRet) override + SvTreeListEntry* pEntry = new SvTreeListEntry; + if (pIcon) { - disable_notify_events(); - auto nInsertPos = pos == -1 ? TREELIST_APPEND : pos; - void* pUserData; - if (pId) - { - m_aUserData.emplace_back(std::make_unique<OUString>(*pId)); - pUserData = m_aUserData.back().get(); - } - else - pUserData = nullptr; - - SvTreeListEntry* pEntry = new SvTreeListEntry; - if (pIcon) - { - const Point aNull(0, 0); - const Size aSize = pIcon->GetOutputSizePixel(); - Image aImage(pIcon->GetBitmapEx(aNull, aSize)); - pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage, false)); - } - else - { - Image aDummy; - pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy, false)); - } - if (pStr) - pEntry->AddItem(std::make_unique<SvLBoxString>(*pStr)); - pEntry->SetUserData(pUserData); - m_xIconView->Insert(pEntry, nullptr, nInsertPos); - - if (pRet) - { - SalInstanceTreeIter* pVclRetIter = static_cast<SalInstanceTreeIter*>(pRet); - pVclRetIter->iter = pEntry; - } - - enable_notify_events(); + const Point aNull(0, 0); + const Size aSize = pIcon->GetOutputSizePixel(); + Image aImage(pIcon->GetBitmapEx(aNull, aSize)); + pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aImage, aImage, false)); } - - virtual OUString get_selected_id() const override + else { - assert(m_xIconView->IsUpdateMode() && "don't request selection when frozen"); - if (SvTreeListEntry* pEntry = m_xIconView->FirstSelected()) - { - if (const OUString* pStr = static_cast<const OUString*>(pEntry->GetUserData())) - return *pStr; - } - return OUString(); + Image aDummy; + pEntry->AddItem(std::make_unique<SvLBoxContextBmp>(aDummy, aDummy, false)); } + if (pStr) + pEntry->AddItem(std::make_unique<SvLBoxString>(*pStr)); + pEntry->SetUserData(pUserData); + m_xIconView->Insert(pEntry, nullptr, nInsertPos); - virtual OUString get_selected_text() const override + if (pRet) { - assert(m_xIconView->IsUpdateMode() && "don't request selection when frozen"); - if (SvTreeListEntry* pEntry = m_xIconView->FirstSelected()) - return m_xIconView->GetEntryText(pEntry); - return OUString(); + SalInstanceTreeIter* pVclRetIter = static_cast<SalInstanceTreeIter*>(pRet); + pVclRetIter->iter = pEntry; } - virtual int count_selected_items() const override { return m_xIconView->GetSelectionCount(); } + enable_notify_events(); +} - virtual void select(int pos) override +OUString SalInstanceIconView::get_selected_id() const +{ + assert(m_xIconView->IsUpdateMode() && "don't request selection when frozen"); + if (SvTreeListEntry* pEntry = m_xIconView->FirstSelected()) { - assert(m_xIconView->IsUpdateMode() - && "don't select when frozen, select after thaw. Note selection doesn't survive a " - "freeze"); - disable_notify_events(); - if (pos == -1 || (pos == 0 && n_children() == 0)) - m_xIconView->SelectAll(false); - else - { - SvTreeListEntry* pEntry = m_xIconView->GetEntry(nullptr, pos); - m_xIconView->Select(pEntry, true); - m_xIconView->MakeVisible(pEntry); - } - enable_notify_events(); + if (const OUString* pStr = static_cast<const OUString*>(pEntry->GetUserData())) + return *pStr; } + return OUString(); +} - virtual void unselect(int pos) override - { - assert(m_xIconView->IsUpdateMode() - && "don't select when frozen, select after thaw. Note selection doesn't survive a " - "freeze"); - disable_notify_events(); - if (pos == -1) - m_xIconView->SelectAll(true); - else - { - SvTreeListEntry* pEntry = m_xIconView->GetEntry(nullptr, pos); - m_xIconView->Select(pEntry, false); - } - enable_notify_events(); - } +OUString SalInstanceIconView::get_selected_text() const +{ + assert(m_xIconView->IsUpdateMode() && "don't request selection when frozen"); + if (SvTreeListEntry* pEntry = m_xIconView->FirstSelected()) + return m_xIconView->GetEntryText(pEntry); + return OUString(); +} - virtual int n_children() const override - { - return m_xIconView->GetModel()->GetChildList(nullptr).size(); - } +int SalInstanceIconView::count_selected_items() const { return m_xIconView->GetSelectionCount(); } - virtual std::unique_ptr<weld::TreeIter> - make_iterator(const weld::TreeIter* pOrig) const override +void SalInstanceIconView::select(int pos) +{ + assert(m_xIconView->IsUpdateMode() + && "don't select when frozen, select after thaw. Note selection doesn't survive a " + "freeze"); + disable_notify_events(); + if (pos == -1 || (pos == 0 && n_children() == 0)) + m_xIconView->SelectAll(false); + else { - return std::unique_ptr<weld::TreeIter>( - new SalInstanceTreeIter(static_cast<const SalInstanceTreeIter*>(pOrig))); + SvTreeListEntry* pEntry = m_xIconView->GetEntry(nullptr, pos); + m_xIconView->Select(pEntry, true); + m_xIconView->MakeVisible(pEntry); } + enable_notify_events(); +} - virtual bool get_selected(weld::TreeIter* pIter) const override +void SalInstanceIconView::unselect(int pos) +{ + assert(m_xIconView->IsUpdateMode() + && "don't select when frozen, select after thaw. Note selection doesn't survive a " + "freeze"); + disable_notify_events(); + if (pos == -1) + m_xIconView->SelectAll(true); + else { - SvTreeListEntry* pEntry = m_xIconView->FirstSelected(); - auto pVclIter = static_cast<SalInstanceTreeIter*>(pIter); - if (pVclIter) - pVclIter->iter = pEntry; - return pEntry != nullptr; + SvTreeListEntry* pEntry = m_xIconView->GetEntry(nullptr, pos); + m_xIconView->Select(pEntry, false); } + enable_notify_events(); +} - virtual bool get_cursor(weld::TreeIter* pIter) const override - { - SvTreeListEntry* pEntry = m_xIconView->GetCurEntry(); - auto pVclIter = static_cast<SalInstanceTreeIter*>(pIter); - if (pVclIter) - pVclIter->iter = pEntry; - return pEntry != nullptr; - } +int SalInstanceIconView::n_children() const +{ + return m_xIconView->GetModel()->GetChildList(nullptr).size(); +} - virtual void set_cursor(const weld::TreeIter& rIter) override - { - const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); - disable_notify_events(); - m_xIconView->SetCurEntry(rVclIter.iter); - enable_notify_events(); - } +std::unique_ptr<weld::TreeIter> +SalInstanceIconView::make_iterator(const weld::TreeIter* pOrig) const +{ + return std::unique_ptr<weld::TreeIter>( + new SalInstanceTreeIter(static_cast<const SalInstanceTreeIter*>(pOrig))); +} - virtual bool get_iter_first(weld::TreeIter& rIter) const override - { - SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter); - rVclIter.iter = m_xIconView->GetEntry(0); - return rVclIter.iter != nullptr; - } +bool SalInstanceIconView::get_selected(weld::TreeIter* pIter) const +{ + SvTreeListEntry* pEntry = m_xIconView->FirstSelected(); + auto pVclIter = static_cast<SalInstanceTreeIter*>(pIter); + if (pVclIter) + pVclIter->iter = pEntry; + return pEntry != nullptr; +} - virtual void scroll_to_item(const weld::TreeIter& rIter) override - { - assert(m_xIconView->IsUpdateMode() - && "don't select when frozen, select after thaw. Note selection doesn't survive a " - "freeze"); - disable_notify_events(); - const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); - m_xIconView->MakeVisible(rVclIter.iter); - enable_notify_events(); - } +bool SalInstanceIconView::get_cursor(weld::TreeIter* pIter) const +{ + SvTreeListEntry* pEntry = m_xIconView->GetCurEntry(); + auto pVclIter = static_cast<SalInstanceTreeIter*>(pIter); + if (pVclIter) + pVclIter->iter = pEntry; + return pEntry != nullptr; +} - virtual void selected_foreach(const std::function<bool(weld::TreeIter&)>& func) override - { - SalInstanceTreeIter aVclIter(m_xIconView->FirstSelected()); - while (aVclIter.iter) - { - if (func(aVclIter)) - return; - aVclIter.iter = m_xIconView->NextSelected(aVclIter.iter); - } - } +void SalInstanceIconView::set_cursor(const weld::TreeIter& rIter) +{ + const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); + disable_notify_events(); + m_xIconView->SetCurEntry(rVclIter.iter); + enable_notify_events(); +} - virtual OUString get_id(const weld::TreeIter& rIter) const override - { - const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); - const OUString* pStr = static_cast<const OUString*>(rVclIter.iter->GetUserData()); - if (pStr) - return *pStr; - return OUString(); - } +bool SalInstanceIconView::get_iter_first(weld::TreeIter& rIter) const +{ + SalInstanceTreeIter& rVclIter = static_cast<SalInstanceTreeIter&>(rIter); + rVclIter.iter = m_xIconView->GetEntry(0); + return rVclIter.iter != nullptr; +} - virtual void clear() override - { - disable_notify_events(); - m_xIconView->Clear(); - m_aUserData.clear(); - enable_notify_events(); - } +void SalInstanceIconView::scroll_to_item(const weld::TreeIter& rIter) +{ + assert(m_xIconView->IsUpdateMode() + && "don't select when frozen, select after thaw. Note selection doesn't survive a " + "freeze"); + disable_notify_events(); + const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); + m_xIconView->MakeVisible(rVclIter.iter); + enable_notify_events(); +} - virtual ~SalInstanceIconView() override +void SalInstanceIconView::selected_foreach(const std::function<bool(weld::TreeIter&)>& func) +{ + SalInstanceTreeIter aVclIter(m_xIconView->FirstSelected()); + while (aVclIter.iter) { - m_xIconView->SetDoubleClickHdl(Link<SvTreeListBox*, bool>()); - m_xIconView->SetSelectHdl(Link<SvTreeListBox*, void>()); - m_xIconView->SetDeselectHdl(Link<SvTreeListBox*, void>()); + if (func(aVclIter)) + return; + aVclIter.iter = m_xIconView->NextSelected(aVclIter.iter); } -}; +} + +OUString SalInstanceIconView::get_id(const weld::TreeIter& rIter) const +{ + const SalInstanceTreeIter& rVclIter = static_cast<const SalInstanceTreeIter&>(rIter); + const OUString* pStr = static_cast<const OUString*>(rVclIter.iter->GetUserData()); + if (pStr) + return *pStr; + return OUString(); +} + +void SalInstanceIconView::clear() +{ + disable_notify_events(); + m_xIconView->Clear(); + m_aUserData.clear(); + enable_notify_events(); +} + +SalInstanceIconView::~SalInstanceIconView() +{ + m_xIconView->SetDoubleClickHdl(Link<SvTreeListBox*, bool>()); + m_xIconView->SetSelectHdl(Link<SvTreeListBox*, void>()); + m_xIconView->SetDeselectHdl(Link<SvTreeListBox*, void>()); +} IMPL_LINK_NOARG(SalInstanceIconView, SelectHdl, SvTreeListBox*, void) { _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
