summaryrefslogtreecommitdiff
path: root/svx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-07-15 12:10:32 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-07-21 10:25:42 +0200
commit6e7e19d9c300dbdd279789b09f94781e946fad52 (patch)
tree09155fadd224d8907d0dff7378e5041d3fe6cb1e /svx
parent299638cab15831d31e7906d557d4f95239be4df9 (diff)
weld DateControl
replace SpinButton when WB_SPINBUTTON is set on a date field to always use a popover with a calendar in it to make it possible to integrate this with native widgets Change-Id: I36a26599a154bddf9aec9b50b6570e13477a1f63 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98858 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'svx')
-rw-r--r--svx/source/fmcomp/gridcell.cxx105
-rw-r--r--svx/source/inc/gridcell.hxx1
2 files changed, 49 insertions, 57 deletions
diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx
index 4c1eb3211412..8e87c2dabfc6 100644
--- a/svx/source/fmcomp/gridcell.cxx
+++ b/svx/source/fmcomp/gridcell.cxx
@@ -55,7 +55,6 @@
#include <i18nlangtag/lang.h>
#include <rtl/math.hxx>
-#include <vcl/calendar.hxx>
#include <svl/numuno.hxx>
#include <svl/zforlist.hxx>
#include <svx/dialmgr.hxx>
@@ -417,7 +416,6 @@ OUString DbGridColumn::GetCellText(const DbGridRow* pRow, const Reference< XNumb
return aText;
}
-
OUString DbGridColumn::GetCellText(const Reference< css::sdb::XColumn >& xField, const Reference< XNumberFormatter >& xFormatter) const
{
OUString aText;
@@ -432,7 +430,6 @@ OUString DbGridColumn::GetCellText(const Reference< css::sdb::XColumn >& xField,
return aText;
}
-
Reference< css::sdb::XColumn > DbGridColumn::GetCurrentFieldValue() const
{
Reference< css::sdb::XColumn > xField;
@@ -1195,7 +1192,6 @@ void DbTextField::updateFromModel( Reference< XPropertySet > _rxModel )
m_pEdit->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
}
-
bool DbTextField::commitControl()
{
OUString aText( m_pEdit->GetText( getModelLineEndSetting( m_rColumn.getModel() ) ) );
@@ -1213,7 +1209,6 @@ bool DbTextField::commitControl()
return true;
}
-
void DbTextField::implSetEffectiveMaxTextLen( sal_Int32 _nMaxLen )
{
if ( m_pEdit )
@@ -1812,7 +1807,6 @@ void DbPatternField::UpdateFromField( const Reference< XColumn >& _rxField, cons
static_cast< Edit* >( m_pWindow.get() )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
}
-
void DbPatternField::updateFromModel( Reference< XPropertySet > _rxModel )
{
OSL_ENSURE( _rxModel.is() && m_pWindow, "DbPatternField::updateFromModel: invalid call!" );
@@ -1824,7 +1818,6 @@ void DbPatternField::updateFromModel( Reference< XPropertySet > _rxModel )
static_cast< Edit* >( m_pWindow.get() )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
}
-
bool DbPatternField::commitControl()
{
OUString aText(m_pWindow->GetText());
@@ -2143,21 +2136,20 @@ DbDateField::DbDateField( DbGridColumn& _rColumn )
doPropertyListening( FM_PROP_DATE_SHOW_CENTURY );
}
-VclPtr<Control> DbDateField::createField(BrowserDataWin* _pParent, bool bSpinButton, const Reference< XPropertySet >& _rxModel )
+VclPtr<Control> DbDateField::createField(BrowserDataWin* pParent, bool bSpinButton, const Reference< XPropertySet >& rxModel)
{
- WinBits _nFieldStyle = bSpinButton ? (WB_REPEAT | WB_SPIN) : 0;
// check if there is a DropDown property set to TRUE
- bool bDropDown = !hasProperty( FM_PROP_DROPDOWN, _rxModel )
- || getBOOL( _rxModel->getPropertyValue( FM_PROP_DROPDOWN ) );
- if ( bDropDown )
- _nFieldStyle |= WB_DROPDOWN;
-
- VclPtr<CalendarField> pField = VclPtr<CalendarField>::Create( _pParent, _nFieldStyle );
-
- pField->EnableToday();
- pField->EnableNone();
+ bool bDropDown = !hasProperty( FM_PROP_DROPDOWN, rxModel )
+ || getBOOL( rxModel->getPropertyValue( FM_PROP_DROPDOWN ) );
+ // given the apparent inability to set a custom up/down action for a gtk
+ // spinbutton to have different up/down dates depending on the zone the
+ // mouse is in, show the dropdown calender for both the spin or dropdown case
+ return VclPtr<DateControl>::Create(pParent, bSpinButton || bDropDown);
+}
- return pField;
+CellControllerRef DbDateField::CreateController() const
+{
+ return new ::svt::FormattedFieldCellController(static_cast<FormattedControlBase*>(m_pWindow.get()));
}
void DbDateField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
@@ -2174,32 +2166,37 @@ void DbDateField::implAdjustGenericFieldSetting( const Reference< XPropertySet >
OSL_VERIFY( _rxModel->getPropertyValue( FM_PROP_DATEMAX ) >>= aMax );
bool bStrict = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
+ FormattedControlBase* pControl = static_cast<FormattedControlBase*>(m_pWindow.get());
+ weld::DateFormatter& rControlFormatter = static_cast<weld::DateFormatter&>(pControl->get_formatter());
+
+ FormattedControlBase* pPainter = static_cast<FormattedControlBase*>(m_pPainter.get());
+ weld::DateFormatter& rPainterFormatter = static_cast<weld::DateFormatter&>(pPainter->get_formatter());
+
Any aCentury = _rxModel->getPropertyValue( FM_PROP_DATE_SHOW_CENTURY );
if ( aCentury.getValueType().getTypeClass() != TypeClass_VOID )
{
bool bShowDateCentury = getBOOL( aCentury );
- static_cast<DateField*>( m_pWindow.get() )->SetShowDateCentury( bShowDateCentury );
- static_cast<DateField*>( m_pPainter.get() )->SetShowDateCentury( bShowDateCentury );
+ rControlFormatter.SetShowDateCentury(bShowDateCentury);
+ rPainterFormatter.SetShowDateCentury(bShowDateCentury);
}
- static_cast< DateField* >( m_pWindow.get() )->SetExtDateFormat( static_cast<ExtDateFieldFormat>(nFormat) );
- static_cast< DateField* >( m_pWindow.get() )->SetMin( aMin );
- static_cast< DateField* >( m_pWindow.get() )->SetMax( aMax );
- static_cast< DateField* >( m_pWindow.get() )->SetStrictFormat( bStrict );
- static_cast< DateField* >( m_pWindow.get() )->EnableEmptyFieldValue( true );
+ rControlFormatter.SetExtDateFormat( static_cast<ExtDateFieldFormat>(nFormat) );
+ rControlFormatter.SetMin( aMin );
+ rControlFormatter.SetMax( aMax );
+ rControlFormatter.SetStrictFormat( bStrict );
+ rControlFormatter.EnableEmptyField( true );
- static_cast< DateField* >( m_pPainter.get() )->SetExtDateFormat( static_cast<ExtDateFieldFormat>(nFormat) );
- static_cast< DateField* >( m_pPainter.get() )->SetMin( aMin );
- static_cast< DateField* >( m_pPainter.get() )->SetMax( aMax );
- static_cast< DateField* >( m_pPainter.get() )->SetStrictFormat( bStrict );
- static_cast< DateField* >( m_pPainter.get() )->EnableEmptyFieldValue( true );
+ rPainterFormatter.SetExtDateFormat( static_cast<ExtDateFieldFormat>(nFormat) );
+ rPainterFormatter.SetMin( aMin );
+ rPainterFormatter.SetMax( aMax );
+ rPainterFormatter.SetStrictFormat( bStrict );
+ rPainterFormatter.EnableEmptyField( true );
}
namespace
{
-
- OUString lcl_setFormattedDate_nothrow( DateField& _rField, const Reference< XColumn >& _rxField )
+ OUString lcl_setFormattedDate_nothrow(DateControl& _rField, const Reference<XColumn>& _rxField)
{
OUString sDate;
if ( _rxField.is() )
@@ -2207,12 +2204,10 @@ namespace
try
{
css::util::Date aValue = _rxField->getDate();
- if ( _rxField->wasNull() )
- _rField.SetText( sDate );
- else
+ if (!_rxField->wasNull())
{
- _rField.SetDate( ::Date( aValue.Day, aValue.Month, aValue.Year ) );
- sDate = _rField.GetText();
+ _rField.SetDate(::Date(aValue.Day, aValue.Month, aValue.Year));
+ sDate = _rField.get_widget().get_text();
}
}
catch( const Exception& )
@@ -2226,33 +2221,38 @@ namespace
OUString DbDateField::GetFormatText(const Reference< css::sdb::XColumn >& _rxField, const Reference< css::util::XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
{
- return lcl_setFormattedDate_nothrow(dynamic_cast<DateField&>(*m_pPainter), _rxField);
+ return lcl_setFormattedDate_nothrow(*static_cast<DateControl*>(m_pPainter.get()), _rxField);
}
void DbDateField::UpdateFromField(const Reference< css::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
{
- lcl_setFormattedDate_nothrow(dynamic_cast<DateField&>(*m_pWindow), _rxField);
+ lcl_setFormattedDate_nothrow(*static_cast<DateControl*>(m_pWindow.get()), _rxField);
}
void DbDateField::updateFromModel( Reference< XPropertySet > _rxModel )
{
OSL_ENSURE( _rxModel.is() && m_pWindow, "DbDateField::updateFromModel: invalid call!" );
+ DateControl* pControl = static_cast<DateControl*>(m_pWindow.get());
+
util::Date aDate;
if ( _rxModel->getPropertyValue( FM_PROP_DATE ) >>= aDate )
- static_cast< DateField* >( m_pWindow.get() )->SetDate( ::Date( aDate ) );
+ pControl->SetDate(::Date(aDate));
else
- static_cast< DateField* >( m_pWindow.get() )->SetText( OUString() );
+ pControl->get_widget().set_text(OUString());
}
bool DbDateField::commitControl()
{
- OUString aText(m_pWindow->GetText());
+ FormattedControlBase* pControl = static_cast<FormattedControlBase*>(m_pWindow.get());
+ OUString aText(pControl->get_widget().get_text());
Any aVal;
- if (!aText.isEmpty())
- aVal <<= static_cast<DateField*>(m_pWindow.get())->GetDate().GetUNODate();
- else
- aVal.clear();
+
+ if (!aText.isEmpty()) // not empty
+ {
+ weld::DateFormatter& rControlFormatter = static_cast<weld::DateFormatter&>(pControl->get_formatter());
+ aVal <<= rControlFormatter.GetDate().GetUNODate();
+ }
m_rColumn.getModel()->setPropertyValue(FM_PROP_DATE, aVal);
return true;
@@ -2365,13 +2365,12 @@ bool DbTimeField::commitControl()
OUString aText(pControl->get_widget().get_text());
Any aVal;
- fprintf(stderr, "text is %s\n", aText.toUtf8().getStr());
-
if (!aText.isEmpty()) // not empty
{
weld::TimeFormatter& rControlFormatter = static_cast<weld::TimeFormatter&>(pControl->get_formatter());
aVal <<= rControlFormatter.GetTime().GetUNOTime();
}
+
m_rColumn.getModel()->setPropertyValue(FM_PROP_TIME, aVal);
return true;
}
@@ -3618,7 +3617,6 @@ void SAL_CALL FmXEditCell::insertText(const css::awt::Selection& rSel, const OUS
}
}
-
OUString SAL_CALL FmXEditCell::getText()
{
::osl::MutexGuard aGuard( m_aMutex );
@@ -4212,43 +4210,36 @@ void SAL_CALL FmXFilterCell::removeTextListener(const Reference< css::awt::XText
m_aTextListeners.removeInterface( l );
}
-
void SAL_CALL FmXFilterCell::setText( const OUString& aText )
{
::osl::MutexGuard aGuard( m_aMutex );
static_cast<DbFilterField*>(m_pCellControl.get())->SetText(aText);
}
-
void SAL_CALL FmXFilterCell::insertText( const css::awt::Selection& /*rSel*/, const OUString& /*aText*/ )
{
}
-
OUString SAL_CALL FmXFilterCell::getText()
{
::osl::MutexGuard aGuard( m_aMutex );
return static_cast<DbFilterField*>(m_pCellControl.get())->GetText();
}
-
OUString SAL_CALL FmXFilterCell::getSelectedText()
{
return getText();
}
-
void SAL_CALL FmXFilterCell::setSelection( const css::awt::Selection& /*aSelection*/ )
{
}
-
css::awt::Selection SAL_CALL FmXFilterCell::getSelection()
{
return css::awt::Selection();
}
-
sal_Bool SAL_CALL FmXFilterCell::isEditable()
{
return true;
diff --git a/svx/source/inc/gridcell.hxx b/svx/source/inc/gridcell.hxx
index 0a65995c9435..e4203d31819a 100644
--- a/svx/source/inc/gridcell.hxx
+++ b/svx/source/inc/gridcell.hxx
@@ -557,6 +557,7 @@ class DbDateField : public DbSpinField
{
public:
DbDateField(DbGridColumn& _rColumn);
+ virtual ::svt::CellControllerRef CreateController() const override;
virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, Color** ppColor = nullptr) override;
virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override;