summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2019-02-14 21:26:27 +0000
committerCaolán McNamara <caolanm@redhat.com>2019-02-15 15:11:58 +0100
commit03b4d8f486d9ecdfe21a05d6bf65c396a35772f6 (patch)
treee12a35585430f1cfcac56a202382a30d3d1917f9 /vcl
parent8fdbda18b593e7014e44a0fd590bbf98d83258b7 (diff)
weld ScDPDateGroupDlg
adding a weld::Calendar and a pretty menubutton to access it, sidestepping the difficulty of abusing a spinbutton to select a date. The prettiness is wasted on this hard to find obscure dialog Change-Id: I51d461fe0220f947c106d96965e6422b4b26575b Reviewed-on: https://gerrit.libreoffice.org/67863 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/source/app/salvtables.cxx55
-rw-r--r--vcl/source/control/calendar.cxx18
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx90
3 files changed, 163 insertions, 0 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index d783794ca8d2..c24d6f5ab745 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -36,6 +36,7 @@
#include <utility>
#include <tools/helpers.hxx>
#include <vcl/builder.hxx>
+#include <vcl/calendar.hxx>
#include <vcl/combobox.hxx>
#include <vcl/lstbox.hxx>
#include <vcl/dialog.hxx>
@@ -1788,6 +1789,54 @@ public:
}
};
+class SalInstanceCalendar : public SalInstanceWidget, public virtual weld::Calendar
+{
+private:
+ VclPtr<::Calendar> m_xCalendar;
+
+ DECL_LINK(SelectHdl, ::Calendar*, void);
+ DECL_LINK(ActivateHdl, ::Calendar*, void);
+
+public:
+ SalInstanceCalendar(::Calendar* pCalendar, bool bTakeOwnership)
+ : SalInstanceWidget(pCalendar, bTakeOwnership)
+ , m_xCalendar(pCalendar)
+ {
+ m_xCalendar->SetSelectHdl(LINK(this, SalInstanceCalendar, SelectHdl));
+ m_xCalendar->SetActivateHdl(LINK(this, SalInstanceCalendar, ActivateHdl));
+ }
+
+ virtual void set_date(const Date& rDate) override
+ {
+ m_xCalendar->SetCurDate(rDate);
+ }
+
+ virtual Date get_date() const override
+ {
+ return m_xCalendar->GetFirstSelectedDate();
+ }
+
+ virtual ~SalInstanceCalendar() override
+ {
+ m_xCalendar->SetSelectHdl(Link<::Calendar*, void>());
+ m_xCalendar->SetActivateHdl(Link<::Calendar*, void>());
+ }
+};
+
+IMPL_LINK_NOARG(SalInstanceCalendar, SelectHdl, ::Calendar*, void)
+{
+ if (notify_events_disabled())
+ return;
+ signal_selected();
+}
+
+IMPL_LINK_NOARG(SalInstanceCalendar, ActivateHdl, ::Calendar*, void)
+{
+ if (notify_events_disabled())
+ return;
+ signal_activated();
+}
+
namespace
{
class WeldTextFilter : public TextFilter
@@ -3854,6 +3903,12 @@ public:
return pImage ? std::make_unique<SalInstanceImage>(pImage, bTakeOwnership) : nullptr;
}
+ virtual std::unique_ptr<weld::Calendar> weld_calendar(const OString &id, bool bTakeOwnership) override
+ {
+ Calendar* pCalendar = m_xBuilder->get<Calendar>(id);
+ return pCalendar ? std::make_unique<SalInstanceCalendar>(pCalendar, bTakeOwnership) : nullptr;
+ }
+
virtual std::unique_ptr<weld::Entry> weld_entry(const OString &id, bool bTakeOwnership) override
{
Edit* pEntry = m_xBuilder->get<Edit>(id);
diff --git a/vcl/source/control/calendar.cxx b/vcl/source/control/calendar.cxx
index d9656d3e60ff..9bd1c17b31e1 100644
--- a/vcl/source/control/calendar.cxx
+++ b/vcl/source/control/calendar.cxx
@@ -1057,6 +1057,8 @@ void Calendar::MouseButtonDown( const MouseEvent& rMEvt )
ImplMouseSelect( aTempDate, nHitTest, false );
}
+ if (rMEvt.GetClicks() == 2)
+ maActivateHdl.Call(this);
}
}
}
@@ -1135,6 +1137,9 @@ void Calendar::KeyInput( const KeyEvent& rKEvt )
aNewDate.AddDays( aNewDate.GetDaysInMonth() );
break;
+ case KEY_RETURN:
+ break;
+
default:
Control::KeyInput( rKEvt );
break;
@@ -1147,6 +1152,14 @@ void Calendar::KeyInput( const KeyEvent& rKEvt )
Select();
mbTravelSelect = false;
}
+
+ if (rKEvt.GetKeyCode().GetCode() == KEY_RETURN)
+ {
+ if (maActivateHdl.IsSet())
+ maActivateHdl.Call(this);
+ else
+ Control::KeyInput(rKEvt);
+ }
}
void Calendar::Paint( vcl::RenderContext& rRenderContext, const tools::Rectangle& )
@@ -1547,4 +1560,9 @@ Size Calendar::CalcWindowSizePixel() const
return aSize;
}
+Size Calendar::GetOptimalSize() const
+{
+ return CalcWindowSizePixel();
+}
+
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index d26c9e42d24e..3afb2e260b28 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -4611,6 +4611,87 @@ public:
}
};
+class GtkInstanceCalendar : public GtkInstanceWidget, public virtual weld::Calendar
+{
+private:
+ GtkCalendar* m_pCalendar;
+ gulong m_nDaySelectedSignalId;
+ gulong m_nDaySelectedDoubleClickSignalId;
+ gulong m_nKeyPressEventSignalId;
+
+ static void signalDaySelected(GtkCalendar*, gpointer widget)
+ {
+ GtkInstanceCalendar* pThis = static_cast<GtkInstanceCalendar*>(widget);
+ pThis->signal_selected();
+ }
+
+ static void signalDaySelectedDoubleClick(GtkCalendar*, gpointer widget)
+ {
+ GtkInstanceCalendar* pThis = static_cast<GtkInstanceCalendar*>(widget);
+ pThis->signal_activated();
+ }
+
+ gboolean signal_key_press(GdkEventKey* pEvent)
+ {
+ if (pEvent->keyval == GDK_KEY_Return)
+ {
+ signal_activated();
+ return true;
+ }
+ return false;
+ }
+
+ static gboolean signalKeyPress(GtkWidget*, GdkEventKey* pEvent, gpointer widget)
+ {
+ GtkInstanceCalendar* pThis = static_cast<GtkInstanceCalendar*>(widget);
+ return pThis->signal_key_press(pEvent);
+ }
+
+public:
+ GtkInstanceCalendar(GtkCalendar* pCalendar, bool bTakeOwnership)
+ : GtkInstanceWidget(GTK_WIDGET(pCalendar), bTakeOwnership)
+ , m_pCalendar(pCalendar)
+ , m_nDaySelectedSignalId(g_signal_connect(pCalendar, "day-selected", G_CALLBACK(signalDaySelected), this))
+ , m_nDaySelectedDoubleClickSignalId(g_signal_connect(pCalendar, "day-selected-double-click", G_CALLBACK(signalDaySelectedDoubleClick), this))
+ , m_nKeyPressEventSignalId(g_signal_connect(pCalendar, "key-press-event", G_CALLBACK(signalKeyPress), this))
+ {
+ }
+
+ virtual void set_date(const Date& rDate) override
+ {
+ gtk_calendar_select_month(m_pCalendar, rDate.GetMonth(), rDate.GetYear());
+ gtk_calendar_select_day(m_pCalendar, rDate.GetDay());
+ }
+
+ virtual Date get_date() const override
+ {
+ guint year, month, day;
+ gtk_calendar_get_date(m_pCalendar, &year, &month, &day);
+ return Date(day, month, year);
+ }
+
+ virtual void disable_notify_events() override
+ {
+ g_signal_handler_block(m_pCalendar, m_nDaySelectedDoubleClickSignalId);
+ g_signal_handler_block(m_pCalendar, m_nDaySelectedSignalId);
+ GtkInstanceWidget::disable_notify_events();
+ }
+
+ virtual void enable_notify_events() override
+ {
+ GtkInstanceWidget::enable_notify_events();
+ g_signal_handler_unblock(m_pCalendar, m_nDaySelectedSignalId);
+ g_signal_handler_unblock(m_pCalendar, m_nDaySelectedDoubleClickSignalId);
+ }
+
+ virtual ~GtkInstanceCalendar() override
+ {
+ g_signal_handler_disconnect(m_pCalendar, m_nKeyPressEventSignalId);
+ g_signal_handler_disconnect(m_pCalendar, m_nDaySelectedDoubleClickSignalId);
+ g_signal_handler_disconnect(m_pCalendar, m_nDaySelectedSignalId);
+ }
+};
+
class GtkInstanceEntry : public GtkInstanceWidget, public virtual weld::Entry
{
private:
@@ -8325,6 +8406,15 @@ public:
return std::make_unique<GtkInstanceImage>(pImage, bTakeOwnership);
}
+ virtual std::unique_ptr<weld::Calendar> weld_calendar(const OString &id, bool bTakeOwnership) override
+ {
+ GtkCalendar* pCalendar = GTK_CALENDAR(gtk_builder_get_object(m_pBuilder, id.getStr()));
+ if (!pCalendar)
+ return nullptr;
+ auto_add_parentless_widgets_to_container(GTK_WIDGET(pCalendar));
+ return std::make_unique<GtkInstanceCalendar>(pCalendar, bTakeOwnership);
+ }
+
virtual std::unique_ptr<weld::Entry> weld_entry(const OString &id, bool bTakeOwnership) override
{
GtkEntry* pEntry = GTK_ENTRY(gtk_builder_get_object(m_pBuilder, id.getStr()));