diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-07-16 17:26:23 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-08-13 15:18:54 +0200 |
commit | 20bc07707949508f029da5e523fedda3cd64ccc8 (patch) | |
tree | ea692c2791883245776b8761c55f343ea7ce40ff /extensions | |
parent | 282ddcf0bf0893f9a71eef2b1fea3db86b1c3292 (diff) |
tdf#143357 use a DateFormatter and a separate Calendar menubutton
similar to what we ended up with in DateControl in
svtools/source/brwbox/ebbcontrols.cxx
Change-Id: I37c843ff7e1e8e39b318db80fe590ce5f796f46a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/119082
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'extensions')
-rw-r--r-- | extensions/source/propctrlr/propcontroller.cxx | 4 | ||||
-rw-r--r-- | extensions/source/propctrlr/standardcontrol.cxx | 51 | ||||
-rw-r--r-- | extensions/source/propctrlr/standardcontrol.hxx | 23 | ||||
-rw-r--r-- | extensions/uiconfig/spropctrlr/ui/datefield.ui | 43 |
4 files changed, 99 insertions, 22 deletions
diff --git a/extensions/source/propctrlr/propcontroller.cxx b/extensions/source/propctrlr/propcontroller.cxx index d9166b64dff6..a24384459d7d 100644 --- a/extensions/source/propctrlr/propcontroller.cxx +++ b/extensions/source/propctrlr/propcontroller.cxx @@ -754,8 +754,8 @@ namespace pcr case PropertyControlType::DateField: { std::unique_ptr<weld::Builder> xBuilder(PropertyHandlerHelper::makeBuilder("modules/spropctrlr/ui/datefield.ui", m_xContext)); - auto pMenuButton = xBuilder->weld_menu_button("datefield"); - rtl::Reference<ODateControl> pControl = new ODateControl(std::make_unique<SvtCalendarBox>(std::move(pMenuButton)), std::move(xBuilder), bCreateReadOnly); + auto pContainer = xBuilder->weld_container("datefield"); + rtl::Reference<ODateControl> pControl = new ODateControl(std::move(pContainer), std::move(xBuilder), bCreateReadOnly); pControl->SetModifyHandler(); xControl = pControl; break; diff --git a/extensions/source/propctrlr/standardcontrol.cxx b/extensions/source/propctrlr/standardcontrol.cxx index 7cbca1c276b4..f03c60b2bb4f 100644 --- a/extensions/source/propctrlr/standardcontrol.cxx +++ b/extensions/source/propctrlr/standardcontrol.cxx @@ -90,34 +90,69 @@ namespace pcr } //= ODateControl - ODateControl::ODateControl(std::unique_ptr<SvtCalendarBox> xWidget, std::unique_ptr<weld::Builder> xBuilder, bool bReadOnly) + ODateControl::ODateControl(std::unique_ptr<weld::Container> xWidget, std::unique_ptr<weld::Builder> xBuilder, bool bReadOnly) : ODateControl_Base(PropertyControlType::DateField, std::move(xBuilder), std::move(xWidget), bReadOnly) + , m_xEntry(m_xBuilder->weld_entry("entry")) + , m_xCalendarBox(std::make_unique<SvtCalendarBox>(m_xBuilder->weld_menu_button("button"), false)) + { + m_xEntryFormatter.reset(new weld::DateFormatter(*m_xEntry)); + + m_xEntryFormatter->SetStrictFormat(true); + m_xEntryFormatter->SetMin(::Date(1, 1, 1600)); + m_xEntryFormatter->SetMax(::Date(1, 1, 9999)); + + m_xEntryFormatter->SetExtDateFormat(ExtDateFieldFormat::SystemShortYYYY); + m_xEntryFormatter->EnableEmptyField(true); + + m_xCalendarBox->connect_activated(LINK(this, ODateControl, ActivateHdl)); + + m_xCalendarBox->get_button().connect_toggled(LINK(this, ODateControl, ToggleHdl)); + } + + void SAL_CALL ODateControl::disposing() { + m_xEntryFormatter.reset(); + m_xEntry.reset(); + m_xCalendarBox.reset(); + ODateControl_Base::disposing(); } void SAL_CALL ODateControl::setValue( const Any& _rValue ) { - SvtCalendarBox* pCalendarBox = getTypedControlWindow(); - util::Date aUNODate; if ( !( _rValue >>= aUNODate ) ) { - pCalendarBox->set_date(::Date(::Date::SYSTEM)); - pCalendarBox->set_label(""); + m_xEntry->set_text(OUString()); } else { ::Date aDate( aUNODate.Day, aUNODate.Month, aUNODate.Year ); - pCalendarBox->set_date(aDate); + m_xEntryFormatter->SetDate(aDate); } } + IMPL_LINK_NOARG(ODateControl, ActivateHdl, SvtCalendarBox&, void) + { + m_xEntryFormatter->SetDate(m_xCalendarBox->get_date()); + setModified(); + m_xEntry->grab_focus(); + } + + IMPL_LINK(ODateControl, ToggleHdl, weld::Toggleable&, rToggle, void) + { + if (!rToggle.get_active()) + return; + m_xCalendarBox->set_date(m_xEntryFormatter->GetDate()); + } + Any SAL_CALL ODateControl::getValue() { Any aPropValue; - ::Date aDate(getTypedControlWindow()->get_date()); - if (!aDate.IsEmpty()) + if (!m_xEntry->get_text().isEmpty()) + { + ::Date aDate(m_xEntryFormatter->GetDate()); aPropValue <<= aDate.GetUNODate(); + } return aPropValue; } diff --git a/extensions/source/propctrlr/standardcontrol.hxx b/extensions/source/propctrlr/standardcontrol.hxx index 4463ed1038bf..a54af78c3a3a 100644 --- a/extensions/source/propctrlr/standardcontrol.hxx +++ b/extensions/source/propctrlr/standardcontrol.hxx @@ -60,11 +60,18 @@ namespace pcr }; //= ODateControl - typedef CommonBehaviourControl<css::inspection::XPropertyControl, SvtCalendarBox> ODateControl_Base; + typedef CommonBehaviourControl<css::inspection::XPropertyControl, weld::Container> ODateControl_Base; class ODateControl : public ODateControl_Base { + std::unique_ptr<weld::Entry> m_xEntry; + std::unique_ptr<SvtCalendarBox> m_xCalendarBox; + std::unique_ptr<weld::DateFormatter> m_xEntryFormatter; + + DECL_LINK(ActivateHdl, SvtCalendarBox&, void); + DECL_LINK(ToggleHdl, weld::Toggleable&, void); + public: - ODateControl(std::unique_ptr<SvtCalendarBox> xWidget, std::unique_ptr<weld::Builder> xBuilder, bool bReadOnly); + ODateControl(std::unique_ptr<weld::Container> xWidget, std::unique_ptr<weld::Builder> xBuilder, bool bReadOnly); // XPropertyControl virtual css::uno::Any SAL_CALL getValue() override; @@ -74,10 +81,18 @@ namespace pcr virtual void SetModifyHandler() override { ODateControl_Base::SetModifyHandler(); - getTypedControlWindow()->connect_selected( LINK( this, CommonBehaviourControlHelper, DateModifiedHdl ) ); + + m_xEntry->connect_focus_in( LINK( this, CommonBehaviourControlHelper, GetFocusHdl ) ); + m_xEntryFormatter->connect_focus_out( LINK( this, CommonBehaviourControlHelper, LoseFocusHdl ) ); + m_xCalendarBox->connect_focus_in( LINK( this, CommonBehaviourControlHelper, GetFocusHdl ) ); + m_xCalendarBox->connect_focus_out( LINK( this, CommonBehaviourControlHelper, LoseFocusHdl ) ); + + m_xEntryFormatter->connect_changed(LINK(this, CommonBehaviourControlHelper, EditModifiedHdl)); } - virtual weld::Widget* getWidget() override { return &getTypedControlWindow()->get_button(); } + virtual void SAL_CALL disposing() override; + + virtual weld::Widget* getWidget() override { return getTypedControlWindow(); } }; //= OEditControl diff --git a/extensions/uiconfig/spropctrlr/ui/datefield.ui b/extensions/uiconfig/spropctrlr/ui/datefield.ui index e064f618bfd5..02fdbc54e253 100644 --- a/extensions/uiconfig/spropctrlr/ui/datefield.ui +++ b/extensions/uiconfig/spropctrlr/ui/datefield.ui @@ -1,17 +1,44 @@ <?xml version="1.0" encoding="UTF-8"?> -<!-- Generated with glade 3.22.1 --> +<!-- Generated with glade 3.38.2 --> <interface domain="pcr"> <requires lib="gtk+" version="3.20"/> - <object class="GtkMenuButton" id="datefield"> + <object class="GtkImage" id="image7"> <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="focus-on-click">True</property> - <property name="receives_default">False</property> + <property name="can_focus">False</property> + <property name="icon_name">x-office-calendar</property> + <property name="icon_size">2</property> + </object> + <object class="GtkBox" id="datefield"> + <property name="visible">True</property> + <property name="can-focus">False</property> <property name="hexpand">True</property> - <property name="draw_indicator">True</property> - <property name="label" translatable="no"></property> + <property name="spacing">6</property> + <child> + <object class="GtkEntry" id="entry"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="hexpand">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> <child> - <placeholder/> + <object class="GtkMenuButton" id="button"> + <property name="visible">True</property> + <property name="can-focus">True</property> + <property name="receives-default">True</property> + <property name="image">image7</property> + <property name="margin-start">1</property> + <property name="always_show_image">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> </child> </object> </interface> |