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: */

Reply via email to