include/vcl/jsdialog/executor.hxx | 4 + include/vcl/weld.hxx | 2 svtools/source/brwbox/ebbcontrols.cxx | 2 svtools/source/control/ctrlbox.cxx | 4 - svtools/uiconfig/ui/datewindow.ui | 2 vcl/inc/jsdialog/jsdialogbuilder.hxx | 8 ++ vcl/inc/salvtables.hxx | 43 ++++++++++++ vcl/jsdialog/enabled.cxx | 1 vcl/jsdialog/executor.cxx | 21 ++++++ vcl/jsdialog/jsdialogbuilder.cxx | 19 +++++ vcl/source/app/salvtables.cxx | 114 ++++++++++++---------------------- 11 files changed, 144 insertions(+), 76 deletions(-)
New commits: commit b0de1f5fc3b6170f562328de8abd3680f2382a7a Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Fri Jul 7 17:56:46 2023 +0200 Commit: Szymon Kłos <szymon.k...@collabora.com> CommitDate: Tue Jul 11 12:45:12 2023 +0200 Move SalInstanceFormattedSpinButton decl to header Change-Id: I64582387b9169efa700a0df5c89e042a9a150423 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154192 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Pranam Lashkari <lpra...@collabora.com> diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 7c246a9d9d72..bd1866df3f76 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -2198,4 +2198,47 @@ public: } }; +class SalInstanceFormattedSpinButton : public SalInstanceEntry, + public virtual weld::FormattedSpinButton +{ +private: + VclPtr<FormattedField> m_xButton; + weld::EntryFormatter* m_pFormatter; + Link<weld::Widget&, void> m_aLoseFocusHdl; + + DECL_LINK(UpDownHdl, SpinField&, void); + DECL_LINK(LoseFocusHdl, Control&, void); + +public: + SalInstanceFormattedSpinButton(FormattedField* pButton, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); + + virtual void set_text(const OUString& rText) override; + + virtual void connect_changed(const Link<weld::Entry&, void>& rLink) override; + + virtual void connect_focus_out(const Link<weld::Widget&, void>& rLink) override; + + virtual void SetFormatter(weld::EntryFormatter* pFormatter) override; + + virtual void sync_value_from_formatter() override + { + // no-op for gen + } + + virtual void sync_range_from_formatter() override + { + // no-op for gen + } + + virtual void sync_increments_from_formatter() override + { + // no-op for gen + } + + virtual Formatter& GetFormatter() override; + + virtual ~SalInstanceFormattedSpinButton() 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 53d670b8537c..0b870a0cdd28 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5791,88 +5791,59 @@ IMPL_LINK(SalInstanceSpinButton, InputHdl, sal_Int64*, pResult, TriState) return eRet; } -namespace -{ -class SalInstanceFormattedSpinButton : public SalInstanceEntry, - public virtual weld::FormattedSpinButton +SalInstanceFormattedSpinButton::SalInstanceFormattedSpinButton(FormattedField* pButton, + SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : SalInstanceEntry(pButton, pBuilder, bTakeOwnership) + , m_xButton(pButton) + , m_pFormatter(nullptr) { -private: - VclPtr<FormattedField> m_xButton; - weld::EntryFormatter* m_pFormatter; - Link<weld::Widget&, void> m_aLoseFocusHdl; - - DECL_LINK(UpDownHdl, SpinField&, void); - DECL_LINK(LoseFocusHdl, Control&, void); - -public: - SalInstanceFormattedSpinButton(FormattedField* pButton, SalInstanceBuilder* pBuilder, - bool bTakeOwnership) - : SalInstanceEntry(pButton, pBuilder, bTakeOwnership) - , m_xButton(pButton) - , m_pFormatter(nullptr) - { - m_xButton->SetUpHdl(LINK(this, SalInstanceFormattedSpinButton, UpDownHdl)); - m_xButton->SetDownHdl(LINK(this, SalInstanceFormattedSpinButton, UpDownHdl)); - m_xButton->SetLoseFocusHdl(LINK(this, SalInstanceFormattedSpinButton, LoseFocusHdl)); - } - - virtual void set_text(const OUString& rText) override - { - disable_notify_events(); - m_xButton->SpinField::SetText(rText); - enable_notify_events(); - } - - virtual void connect_changed(const Link<weld::Entry&, void>& rLink) override - { - if (!m_pFormatter) // once a formatter is set, it takes over "changed" - { - SalInstanceEntry::connect_changed(rLink); - return; - } - m_pFormatter->connect_changed(rLink); - } - - virtual void connect_focus_out(const Link<weld::Widget&, void>& rLink) override - { - if (!m_pFormatter) // once a formatter is set, it takes over "focus-out" - { - m_aLoseFocusHdl = rLink; - return; - } - m_pFormatter->connect_focus_out(rLink); - } + m_xButton->SetUpHdl(LINK(this, SalInstanceFormattedSpinButton, UpDownHdl)); + m_xButton->SetDownHdl(LINK(this, SalInstanceFormattedSpinButton, UpDownHdl)); + m_xButton->SetLoseFocusHdl(LINK(this, SalInstanceFormattedSpinButton, LoseFocusHdl)); +} - virtual void SetFormatter(weld::EntryFormatter* pFormatter) override - { - m_pFormatter = pFormatter; - m_xButton->SetFormatter(pFormatter); - } +void SalInstanceFormattedSpinButton::set_text(const OUString& rText) +{ + disable_notify_events(); + m_xButton->SpinField::SetText(rText); + enable_notify_events(); +} - virtual void sync_value_from_formatter() override +void SalInstanceFormattedSpinButton::connect_changed(const Link<weld::Entry&, void>& rLink) +{ + if (!m_pFormatter) // once a formatter is set, it takes over "changed" { - // no-op for gen + SalInstanceEntry::connect_changed(rLink); + return; } + m_pFormatter->connect_changed(rLink); +} - virtual void sync_range_from_formatter() override +void SalInstanceFormattedSpinButton::connect_focus_out(const Link<weld::Widget&, void>& rLink) +{ + if (!m_pFormatter) // once a formatter is set, it takes over "focus-out" { - // no-op for gen + m_aLoseFocusHdl = rLink; + return; } + m_pFormatter->connect_focus_out(rLink); +} - virtual void sync_increments_from_formatter() override - { - // no-op for gen - } +void SalInstanceFormattedSpinButton::SetFormatter(weld::EntryFormatter* pFormatter) +{ + m_pFormatter = pFormatter; + m_xButton->SetFormatter(pFormatter); +} - virtual Formatter& GetFormatter() override { return m_xButton->GetFormatter(); } +Formatter& SalInstanceFormattedSpinButton::GetFormatter() { return m_xButton->GetFormatter(); } - virtual ~SalInstanceFormattedSpinButton() override - { - m_xButton->SetLoseFocusHdl(Link<Control&, void>()); - m_xButton->SetDownHdl(Link<SpinField&, void>()); - m_xButton->SetUpHdl(Link<SpinField&, void>()); - } -}; +SalInstanceFormattedSpinButton::~SalInstanceFormattedSpinButton() +{ + m_xButton->SetLoseFocusHdl(Link<Control&, void>()); + m_xButton->SetDownHdl(Link<SpinField&, void>()); + m_xButton->SetUpHdl(Link<SpinField&, void>()); +} IMPL_LINK_NOARG(SalInstanceFormattedSpinButton, UpDownHdl, SpinField&, void) { @@ -5885,7 +5856,6 @@ IMPL_LINK_NOARG(SalInstanceFormattedSpinButton, LoseFocusHdl, Control&, void) signal_value_changed(); m_aLoseFocusHdl.Call(*this); } -} SalInstanceLabel::SalInstanceLabel(Control* pLabel, SalInstanceBuilder* pBuilder, bool bTakeOwnership) commit 8cb85fba92aff08969aec510d32beb7b28d0e551 Author: Szymon Kłos <szymon.k...@collabora.com> AuthorDate: Thu Jul 6 15:44:24 2023 +0200 Commit: Szymon Kłos <szymon.k...@collabora.com> CommitDate: Tue Jul 11 12:45:03 2023 +0200 jsdialog: calendar widget Change-Id: I5b2b8a1516ed2e851309dca6ef3200ed522d1b7b Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154136 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Pranam Lashkari <lpra...@collabora.com> diff --git a/include/vcl/jsdialog/executor.hxx b/include/vcl/jsdialog/executor.hxx index 1a1ad61030d7..a9873893e4a7 100644 --- a/include/vcl/jsdialog/executor.hxx +++ b/include/vcl/jsdialog/executor.hxx @@ -86,6 +86,10 @@ public: rButton.signal_selected(rIdent); } + static void trigger_selected(weld::Calendar& rCalendar) { rCalendar.signal_selected(); } + + static void trigger_activated(weld::Calendar& rCalendar) { rCalendar.signal_activated(); } + static void trigger_value_changed(weld::SpinButton& rSpinButton) { rSpinButton.signal_value_changed(); diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx index 618f9a518a8e..4397018e2958 100644 --- a/include/vcl/weld.hxx +++ b/include/vcl/weld.hxx @@ -1884,6 +1884,8 @@ public: class VCL_DLLPUBLIC Calendar : virtual public Widget { + friend class ::LOKTrigger; + Link<Calendar&, void> m_aSelectedHdl; Link<Calendar&, void> m_aActivatedHdl; diff --git a/svtools/source/brwbox/ebbcontrols.cxx b/svtools/source/brwbox/ebbcontrols.cxx index b0a2ad1bbcc3..2ee6254c4203 100644 --- a/svtools/source/brwbox/ebbcontrols.cxx +++ b/svtools/source/brwbox/ebbcontrols.cxx @@ -531,7 +531,7 @@ namespace svt , m_xMenuButton(m_xBuilder->weld_menu_button("button")) , m_xCalendarBuilder(Application::CreateBuilder(m_xMenuButton.get(), "svt/ui/datewindow.ui")) , m_xTopLevel(m_xCalendarBuilder->weld_widget("date_popup_window")) - , m_xCalendar(m_xCalendarBuilder->weld_calendar("date")) + , m_xCalendar(m_xCalendarBuilder->weld_calendar("date_picker")) , m_xExtras(m_xCalendarBuilder->weld_widget("extras")) , m_xTodayBtn(m_xCalendarBuilder->weld_button("today")) , m_xNoneBtn(m_xCalendarBuilder->weld_button("none")) diff --git a/svtools/source/control/ctrlbox.cxx b/svtools/source/control/ctrlbox.cxx index b88b484cc6dd..7cba59c1cc13 100644 --- a/svtools/source/control/ctrlbox.cxx +++ b/svtools/source/control/ctrlbox.cxx @@ -1569,8 +1569,8 @@ SvtCalendarBox::SvtCalendarBox(std::unique_ptr<weld::MenuButton> pControl, bool : m_bUseLabel(bUseLabel) , m_xControl(std::move(pControl)) , m_xBuilder(Application::CreateBuilder(m_xControl.get(), "svt/ui/datewindow.ui")) - , m_xTopLevel(m_xBuilder->weld_widget("date_popup_window")) - , m_xCalendar(m_xBuilder->weld_calendar("date")) + , m_xTopLevel(m_xBuilder->weld_popover("date_popup_window")) + , m_xCalendar(m_xBuilder->weld_calendar("date_picker")) { m_xControl->set_popover(m_xTopLevel.get()); m_xCalendar->connect_selected(LINK(this, SvtCalendarBox, SelectHdl)); diff --git a/svtools/uiconfig/ui/datewindow.ui b/svtools/uiconfig/ui/datewindow.ui index 9467cbb73213..265affe4afcb 100644 --- a/svtools/uiconfig/ui/datewindow.ui +++ b/svtools/uiconfig/ui/datewindow.ui @@ -14,7 +14,7 @@ <property name="orientation">vertical</property> <property name="spacing">6</property> <child> - <object class="GtkCalendar" id="date"> + <object class="GtkCalendar" id="date_picker"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="year">2019</property> diff --git a/vcl/inc/jsdialog/jsdialogbuilder.hxx b/vcl/inc/jsdialog/jsdialogbuilder.hxx index 25281fb33236..85f6c8140369 100644 --- a/vcl/inc/jsdialog/jsdialogbuilder.hxx +++ b/vcl/inc/jsdialog/jsdialogbuilder.hxx @@ -314,6 +314,7 @@ public: virtual std::unique_ptr<weld::Box> weld_box(const OString& id) override; virtual std::unique_ptr<weld::Widget> weld_widget(const OString& id) override; virtual std::unique_ptr<weld::Image> weld_image(const OString& id) override; + virtual std::unique_ptr<weld::Calendar> weld_calendar(const OString& id) override; static weld::MessageDialog* CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, @@ -861,4 +862,11 @@ public: virtual void set_image(const css::uno::Reference<css::graphic::XGraphic>& rImage) override; }; +class JSCalendar : public JSWidget<SalInstanceCalendar, ::Calendar> +{ +public: + JSCalendar(JSDialogSender* pSender, ::Calendar* pCalendar, SalInstanceBuilder* pBuilder, + bool bTakeOwnership); +}; + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/jsdialog/enabled.cxx b/vcl/jsdialog/enabled.cxx index 885eeb520bb6..647cec05602b 100644 --- a/vcl/jsdialog/enabled.cxx +++ b/vcl/jsdialog/enabled.cxx @@ -285,6 +285,7 @@ bool isBuilderEnabledForPopup(std::u16string_view rUIFile) || rUIFile == u"modules/scalc/ui/floatingborderstyle.ui" || rUIFile == u"modules/scalc/ui/floatinglinestyle.ui" // svt + || rUIFile == u"svt/ui/datewindow.ui" || rUIFile == u"svt/ui/linewindow.ui" // svx || rUIFile == u"svx/ui/colorwindow.ui" diff --git a/vcl/jsdialog/executor.cxx b/vcl/jsdialog/executor.cxx index 750b10c0b606..e509504db24c 100644 --- a/vcl/jsdialog/executor.cxx +++ b/vcl/jsdialog/executor.cxx @@ -603,6 +603,27 @@ bool ExecuteAction(const std::string& nWindowId, const OString& rWidget, StringM } } } + else if (sControlType == "calendar") + { + auto pCalendar = dynamic_cast<weld::Calendar*>(pWidget); + if (pCalendar && sAction == "selectdate") + { + // MM/DD/YYYY + OUString aDate = rData["data"]; + + if (aDate.getLength() < 10) + return false; + + sal_Int32 aMonth = o3tl::toInt32(aDate.subView(0, 2)); + sal_Int32 aDay = o3tl::toInt32(aDate.subView(3, 2)); + sal_Int32 aYear = o3tl::toInt32(aDate.subView(6, 4)); + + pCalendar->set_date(Date(aDay, aMonth, aYear)); + LOKTrigger::trigger_selected(*pCalendar); + LOKTrigger::trigger_activated(*pCalendar); + return true; + } + } } return false; diff --git a/vcl/jsdialog/jsdialogbuilder.cxx b/vcl/jsdialog/jsdialogbuilder.cxx index 6944cc817af7..9bb60861aadf 100644 --- a/vcl/jsdialog/jsdialogbuilder.cxx +++ b/vcl/jsdialog/jsdialogbuilder.cxx @@ -1261,6 +1261,19 @@ std::unique_ptr<weld::Image> JSInstanceBuilder::weld_image(const OString& id) return pWeldWidget; } +std::unique_ptr<weld::Calendar> JSInstanceBuilder::weld_calendar(const OString& id) +{ + ::Calendar* pCalendar = m_xBuilder->get<::Calendar>(id); + + auto pWeldWidget + = pCalendar ? std::make_unique<JSCalendar>(this, pCalendar, this, false) : nullptr; + + if (pWeldWidget) + RememberWidget(id, pWeldWidget.get()); + + return pWeldWidget; +} + weld::MessageDialog* JSInstanceBuilder::CreateMessageDialog(weld::Widget* pParent, VclMessageType eMessageType, VclButtonsType eButtonType, const OUString& rPrimaryMessage, @@ -2246,4 +2259,10 @@ void JSImage::set_image(const css::uno::Reference<css::graphic::XGraphic>& rImag sendUpdate(); } +JSCalendar::JSCalendar(JSDialogSender* pSender, ::Calendar* pCalendar, SalInstanceBuilder* pBuilder, + bool bTakeOwnership) + : JSWidget<SalInstanceCalendar, ::Calendar>(pSender, pCalendar, pBuilder, bTakeOwnership) +{ +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */