diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-07-15 12:10:32 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-07-21 10:25:42 +0200 |
commit | 6e7e19d9c300dbdd279789b09f94781e946fad52 (patch) | |
tree | 09155fadd224d8907d0dff7378e5041d3fe6cb1e /svx | |
parent | 299638cab15831d31e7906d557d4f95239be4df9 (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.cxx | 105 | ||||
-rw-r--r-- | svx/source/inc/gridcell.hxx | 1 |
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; |