From ed5640d8b587fbcfed7dd7967f3de04b37a76f26 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 11:06:44 +0200 Subject: Adding upstream version 4:7.4.7. Signed-off-by: Daniel Baumann --- svx/source/inc/gridcell.hxx | 1067 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1067 insertions(+) create mode 100644 svx/source/inc/gridcell.hxx (limited to 'svx/source/inc/gridcell.hxx') diff --git a/svx/source/inc/gridcell.hxx b/svx/source/inc/gridcell.hxx new file mode 100644 index 000000000..9ee419ea1 --- /dev/null +++ b/svx/source/inc/gridcell.hxx @@ -0,0 +1,1067 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#ifndef INCLUDED_SVX_SOURCE_INC_GRIDCELL_HXX +#define INCLUDED_SVX_SOURCE_INC_GRIDCELL_HXX + +#include +#include + +#include "sqlparserclient.hxx" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +class DbCellControl; +class Edit; +class FmXGridCell; +namespace dbtools { + class FormattedColumnValue; +} + +// DbGridColumn, column description + +class DbGridColumn +{ + friend class DbGridControl; + + css::uno::Reference< css::beans::XPropertySet > m_xModel; + css::uno::Reference< css::beans::XPropertySet > m_xField; // connection to the database field + ::svt::CellControllerRef m_xController; // structure for managing the controls for a column + // this is positioned by the DbBrowseBox on the respective + // cells of a column + rtl::Reference m_pCell; + DbGridControl& m_rParent; + sal_Int32 m_nLastVisibleWidth; // only valid if m_bHidden == sal_True + sal_Int32 m_nFormatKey; + sal_Int16 m_nFieldType; + sal_Int16 m_nTypeId; + sal_uInt16 m_nId; + sal_Int16 m_nFieldPos; + sal_Int16 m_nAlign; // specified with TXT_ALIGN_LEFT... + bool m_bReadOnly : 1; + bool m_bAutoValue : 1; + bool m_bInSave : 1; + bool m_bNumeric : 1; + bool m_bObject : 1; // does the column reference an object datatype? + bool m_bHidden : 1; + bool m_bLocked : 1; + + static ::svt::CellControllerRef s_xEmptyController; + // used by locked columns +public: + DbGridColumn(sal_uInt16 _nId, DbGridControl& rParent) + :m_rParent(rParent) + ,m_nLastVisibleWidth(-1) + ,m_nFormatKey(0) + ,m_nFieldType(0) + ,m_nTypeId(0) + ,m_nId(_nId) + ,m_nFieldPos(-1) + ,m_nAlign(css::awt::TextAlign::LEFT) + ,m_bReadOnly(false) + ,m_bAutoValue(false) + ,m_bInSave(false) + ,m_bNumeric(false) + ,m_bObject(false) + ,m_bHidden(false) + ,m_bLocked(false) + { + } + + ~DbGridColumn(); + + const css::uno::Reference< css::beans::XPropertySet >& getModel() const { return m_xModel; } + void setModel(const css::uno::Reference< css::beans::XPropertySet >& _xModel); + + + sal_uInt16 GetId() const {return m_nId;} + bool IsReadOnly() const {return m_bReadOnly;} + bool IsAutoValue() const {return m_bAutoValue;} + sal_Int16 GetAlignment() const {return m_nAlign;} + sal_Int16 GetFieldPos() const {return m_nFieldPos; } + bool IsNumeric() const {return m_bNumeric;} + bool IsHidden() const {return m_bHidden;} + sal_Int32 GetKey() const {return m_nFormatKey;} + const ::svt::CellControllerRef& GetController() const {return m_bLocked ? s_xEmptyController : m_xController;} + const css::uno::Reference< css::beans::XPropertySet >& GetField() const {return m_xField;} + DbGridControl& GetParent() const {return m_rParent;} + FmXGridCell* GetCell() const {return m_pCell.get();} + + css::uno::Reference< css::sdb::XColumn > GetCurrentFieldValue() const; + + // Drawing a field at a position. If a view is set, it takes over the drawing, + // e.g., for checkboxes. + void Paint(OutputDevice& rDev, + const tools::Rectangle& rRect, + const DbGridRow* pRow, + const css::uno::Reference< css::util::XNumberFormatter >& xFormatter); + + + // Initializing in the alive mode. + // If no ColumnController is set, a default initialization is performed. + void CreateControl(sal_Int32 _nFieldPos, const css::uno::Reference< css::beans::XPropertySet >& xField, sal_Int32 nTypeId); + void UpdateControl() + { + css::uno::Reference< css::beans::XPropertySet > xField(m_xField); + CreateControl(m_nFieldPos, xField, m_nTypeId); + } + + // Editing a Zelle + void UpdateFromField(const DbGridRow* pRow, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter); + bool Commit(); + + // releasing all the data required for the AliveMode + void Clear(); + + OUString GetCellText(const DbGridRow* pRow, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) const; + OUString GetCellText(const css::uno::Reference< css::sdb::XColumn >& xField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) const; + + void SetReadOnly(bool bRead){m_bReadOnly = bRead;} + void SetObject(sal_Int16 nPos) {m_bObject = m_bReadOnly = true; m_nFieldPos = nPos;} + + void ImplInitWindow( vcl::Window const & rParent, const InitWindowFacet _eInitWhat ); + + // properties that can bleed through onto the css::frame::Controller + sal_Int16 SetAlignment(sal_Int16 _nAlign); + // if _nAlign is -1, the alignment is calculated from the type of the field we are bound to + // the value really set is returned + sal_Int16 SetAlignmentFromModel(sal_Int16 nStandardAlign); + // set the alignment according to the "Align"-property of m_xModel, use the given standard + // alignment if the property if void, return the really set alignment + + // column locking + bool isLocked() const { return m_bLocked; } + void setLock(bool _bLock); + +private: + /** attaches or detaches our cell object to the SctriptEventAttacherManager implemented + by our model's parent + */ + void impl_toggleScriptManager_nothrow( bool _bAttach ); +}; + + +// DbCellControl, provides the data for a CellController. +// Is usually only required for complex controls such as combo boxes. + +class DbCellControl + :public cppu::BaseMutex // _before_ the listener, so the listener is to be destroyed first! + ,public ::comphelper::OPropertyChangeListener +{ +private: + rtl::Reference<::comphelper::OPropertyChangeMultiplexer> m_pModelChangeBroadcaster; + rtl::Reference<::comphelper::OPropertyChangeMultiplexer> m_pFieldChangeBroadcaster; + +private: + bool m_bTransparent : 1; + bool m_bAlignedController : 1; + bool m_bAccessingValueProperty : 1; + + css::uno::Reference< css::sdbc::XRowSet > + m_xCursor; + +protected: + DbGridColumn& m_rColumn; + VclPtr m_pPainter; + VclPtr m_pWindow; + +protected: + // attribute access + const css::uno::Reference< css::sdbc::XRowSet >& getCursor() const { return m_xCursor; } + + // control transparency + bool isTransparent( ) const { return m_bTransparent; } + void setTransparent( bool _bSet ) { m_bTransparent = _bSet; } + + // control alignment + void setAlignedController( bool _bAlign ) { m_bAlignedController = _bAlign; } + + + /** determined whether or not the value property is locked + @see lockValueProperty + */ + inline bool isValuePropertyLocked() const; + + /** locks the listening at the value property. +

This means that every subsequent change now done on the value property of the model ("Text", or "Value", + or whatever) is then ignored.
+ This base class uses this setting in Commit.

+ @precond + Value locking can't be nested + @see unlockValueProperty + */ + inline void lockValueProperty(); + /** unlocks the listening at the value property + @see lockValueProperty + */ + inline void unlockValueProperty(); + +protected: + // adds the given property to the list of properties which we listen for + void doPropertyListening( const OUString& _rPropertyName ); + + // called whenever a property which affects field settings in general is called + // you should overwrite this method for every property you add yourself as listener to + // with doPropertyListening + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ); + + // called by _propertyChanged if a property which denotes the column value has changed + void implValuePropertyChanged( ); + + +public: + DbCellControl(DbGridColumn& _rColumn); + virtual ~DbCellControl() override; + + svt::ControlBase& GetWindow() const + { + ENSURE_OR_THROW( m_pWindow, "no window" ); + return *m_pWindow; + } + + // control alignment + bool isAlignedController() const { return m_bAlignedController; } + void AlignControl(sal_Int16 nAlignment); + + void SetTextLineColor(); + void SetTextLineColor(const Color& _rColor); + + // initializing before a control is displayed + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ); + virtual ::svt::CellControllerRef CreateController() const = 0; + + // writing the value into the model + bool Commit(); + + // Formatting the field data to output text + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) = 0; + + virtual void Update(){} + // Refresh the control by the field data + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) = 0; + + // painting a cell content in the specified rectangle + virtual void PaintFieldToCell( OutputDevice& rDev, const tools::Rectangle& rRect, const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter); + virtual void PaintCell( OutputDevice& _rDev, const tools::Rectangle& _rRect ); + + void ImplInitWindow( vcl::Window const & rParent, const InitWindowFacet _eInitWhat ); + + double GetValue(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) const; + +protected: + void invalidatedController(); + + /** commits the content of the control (e.g. the text of an edit field) into the column model + (e.g. the "Text" property of the model). +

To be overwritten in derived classes.

+ @see updateFromModel + */ + virtual bool commitControl( ) = 0; + + /** updates the current content of the control (e.g. the text of an edit field) from the column model + (e.g. the "Text" property of the model). +

To be overwritten in derived classes.

+ @precond + NULL != _rxModel + @precond + NULL != m_pWindow + + @see commitControl + */ + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) = 0; + +protected: +// OPropertyChangeListener + virtual void _propertyChanged(const css::beans::PropertyChangeEvent& evt) override; + +private: + void implDoPropertyListening( const OUString& _rPropertyName, bool _bWarnIfNotExistent ); + + /// updates the "readonly" setting on m_pWindow, according to the respective property value in the given model + void implAdjustReadOnly( const css::uno::Reference< css::beans::XPropertySet >& _rxModel,bool i_bReadOnly ); + + /// updates the "enabled" setting on m_pWindow, according to the respective property value in the given model + void implAdjustEnabled( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ); +}; + + +inline bool DbCellControl::isValuePropertyLocked() const +{ + return m_bAccessingValueProperty; +} + + +inline void DbCellControl::lockValueProperty() +{ + OSL_ENSURE( !isValuePropertyLocked(), "DbCellControl::lockValueProperty: not to be nested!" ); + m_bAccessingValueProperty = true; +} + + +inline void DbCellControl::unlockValueProperty() +{ + OSL_ENSURE( isValuePropertyLocked(), "DbCellControl::lockValueProperty: not locked so far!" ); + m_bAccessingValueProperty = false; +} + + +/** a field which is bound to a column which supports the MaxTextLen property +*/ +class DbLimitedLengthField : public DbCellControl +{ +public: + +protected: + DbLimitedLengthField( DbGridColumn& _rColumn ); + +protected: + // DbCellControl + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; + +protected: + void implSetMaxTextLen( sal_Int16 _nMaxLen ) + { + implSetEffectiveMaxTextLen(_nMaxLen); + } + virtual void implSetEffectiveMaxTextLen( sal_Int32 _nMaxLen ); +}; + + +class DbTextField final : public DbLimitedLengthField +{ + std::unique_ptr<::svt::IEditImplementation> m_pEdit; + std::unique_ptr<::svt::IEditImplementation> m_pPainterImplementation; + bool m_bIsMultiLineEdit; + + virtual ~DbTextField( ) override; + +public: + DbTextField(DbGridColumn& _rColumn); + + ::svt::IEditImplementation* GetEditImplementation() { return m_pEdit.get(); } + bool IsMultiLineEdit() const { return m_bIsMultiLineEdit; } + + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ) override; + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + virtual ::svt::CellControllerRef CreateController() const override; + virtual void PaintFieldToCell( OutputDevice& _rDev, const tools::Rectangle& _rRect, + const css::uno::Reference< css::sdb::XColumn >& _rxField, + const css::uno::Reference< css::util::XNumberFormatter >& _rxFormatter ) override; + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + // DbLimitedLengthField + virtual void implSetEffectiveMaxTextLen( sal_Int32 _nMaxLen ) override; +}; + + +class DbFormattedField final : public DbLimitedLengthField +{ +public: + DbFormattedField(DbGridColumn& _rColumn); + virtual ~DbFormattedField() override; + + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ) override; + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + virtual ::svt::CellControllerRef CreateController() const override; + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + // OPropertyChangeListener + virtual void _propertyChanged(const css::beans::PropertyChangeEvent& evt) override; + + css::uno::Reference< css::util::XNumberFormatsSupplier > m_xSupplier; +}; + + +class DbCheckBox final : public DbCellControl +{ +public: + DbCheckBox(DbGridColumn& _rColumn); + + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + virtual ::svt::CellControllerRef CreateController() const override; + virtual void PaintFieldToCell(OutputDevice& rDev, const tools::Rectangle& rRect, + const css::uno::Reference< css::sdb::XColumn >& _rxField, + const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + virtual void PaintCell(OutputDevice& rDev, const tools::Rectangle& rRect) override; + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; +}; + + +class DbComboBox final : public DbCellControl +{ + +public: + DbComboBox(DbGridColumn& _rColumn); + + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ) override; + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + virtual ::svt::CellControllerRef CreateController() const override; + + void SetList(const css::uno::Any& rItems); + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; + + // OPropertyChangeListener + virtual void _propertyChanged(const css::beans::PropertyChangeEvent& evt) override; +}; + + +class DbListBox final : public DbCellControl +{ + bool m_bBound : 1; + css::uno::Sequence< OUString > m_aValueList; + +public: + DbListBox(DbGridColumn& _rColumn); + + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ) override; + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + virtual ::svt::CellControllerRef CreateController() const override; + + void SetList(const css::uno::Any& rItems); + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; + + // OPropertyChangeListener + virtual void _propertyChanged(const css::beans::PropertyChangeEvent& evt) override; +}; + + +class DbPatternField final : public DbCellControl +{ +public: + DbPatternField( DbGridColumn& _rColumn, const css::uno::Reference& _rContext ); + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ) override; + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + virtual ::svt::CellControllerRef CreateController() const override; + +private: + /// DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; + + OUString impl_formatText(const OUString& _rText); + + ::std::unique_ptr< ::dbtools::FormattedColumnValue > m_pValueFormatter; + ::std::unique_ptr< ::dbtools::FormattedColumnValue > m_pPaintFormatter; + css::uno::Reference m_xContext; +}; + + +class DbSpinField : public DbCellControl +{ +private: + sal_Int16 m_nStandardAlign; + +public: + +protected: + DbSpinField( DbGridColumn& _rColumn, sal_Int16 _nStandardAlign = css::awt::TextAlign::RIGHT ); + +public: + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& _rxCursor ) override; + virtual ::svt::CellControllerRef CreateController() const override; + +protected: + virtual VclPtr createField( + BrowserDataWin* _pParent, + bool bSpinButton, + const css::uno::Reference< css::beans::XPropertySet >& _rxModel + ) = 0; +}; + +class DbDateField final : public DbSpinField +{ +public: + DbDateField(DbGridColumn& _rColumn); + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + // DbSpinField + virtual VclPtr createField( + BrowserDataWin* _pParent, + bool bSpinButton, + const css::uno::Reference< css::beans::XPropertySet >& _rxModel + ) override; + + /// initializes everything which relates to the properties describing the numeric behaviour + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; +}; + +class DbTimeField final : public DbSpinField +{ +public: + DbTimeField(DbGridColumn& _rColumn); + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + // DbSpinField + virtual VclPtr createField( + BrowserDataWin* _pParent, + bool bSpinButton, + const css::uno::Reference< css::beans::XPropertySet >& _rxModel + ) override; + + /// initializes everything which relates to the properties describing the numeric behaviour + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; +}; + +class DbCurrencyField final : public DbSpinField +{ +public: + DbCurrencyField(DbGridColumn& _rColumn); + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + // DbSpinField + virtual VclPtr createField( + BrowserDataWin* _pParent, + bool bSpinButton, + const css::uno::Reference< css::beans::XPropertySet >& _rxModel + ) override; + + /// initializes everything which relates to the properties describing the numeric behaviour + virtual void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; +}; + +class DbNumericField final : public DbSpinField +{ +public: + DbNumericField(DbGridColumn& _rColumn); + + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + // DbSpinField + virtual VclPtr createField( + BrowserDataWin* _pParent, + bool bSpinButton, + const css::uno::Reference< css::beans::XPropertySet >& _rxModel + ) override; + + /// initializes everything which relates to the properties describing the numeric behaviour + void implAdjustGenericFieldSetting( const css::uno::Reference< css::beans::XPropertySet >& _rxModel ) override; +}; + +class DbFilterField final + :public DbCellControl + ,public ::svxform::OSQLParserClient +{ +public: + DbFilterField(const css::uno::Reference< css::uno::XComponentContext >& rxContext, DbGridColumn& _rColumn); + virtual ~DbFilterField() override; + + virtual void Init( BrowserDataWin& rParent, const css::uno::Reference< css::sdbc::XRowSet >& xCursor ) override; + virtual ::svt::CellControllerRef CreateController() const override; + virtual void PaintCell(OutputDevice& rDev, const tools::Rectangle& rRect) override; + virtual void Update() override; + virtual OUString GetFormatText(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, const Color** ppColor = nullptr) override; + virtual void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& _rxField, const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + + const OUString& GetText() const {return m_aText;} + void SetText(const OUString& rText); + + void SetCommitHdl( const Link& rLink ) { m_aCommitLink = rLink; } + +private: + // DbCellControl + virtual bool commitControl( ) override; + virtual void updateFromModel( css::uno::Reference< css::beans::XPropertySet > _rxModel ) override; + + void SetList(const css::uno::Any& rItems, bool bComboBox); + void CreateControl(BrowserDataWin* pParent, const css::uno::Reference< css::beans::XPropertySet >& xModel); + DECL_LINK(OnToggle, weld::CheckButton&, void); + + css::uno::Sequence< OUString > m_aValueList; + OUString m_aText; + Link m_aCommitLink; + sal_Int16 m_nControlClass; + bool m_bFilterList : 1; + bool m_bFilterListFilled : 1; +}; + + +// Base class providing the access to a grid cell + +typedef ::cppu::ImplHelper2 < css::awt::XControl + , css::form::XBoundControl + > FmXGridCell_Base; +typedef ::cppu::ImplHelper1 < css::awt::XWindow + > FmXGridCell_WindowBase; +class FmXGridCell :public ::cppu::OComponentHelper + ,public FmXGridCell_Base + ,public FmXGridCell_WindowBase +{ +protected: + ::osl::Mutex m_aMutex; + DbGridColumn* m_pColumn; + std::unique_ptr m_pCellControl; + +private: + ::comphelper::OInterfaceContainerHelper3 m_aWindowListeners; + ::comphelper::OInterfaceContainerHelper3 m_aFocusListeners; + ::comphelper::OInterfaceContainerHelper3 m_aKeyListeners; + ::comphelper::OInterfaceContainerHelper3 m_aMouseListeners; + ::comphelper::OInterfaceContainerHelper3 m_aMouseMotionListeners; + +protected: + virtual ~FmXGridCell() override; + +public: + FmXGridCell( DbGridColumn* pColumn, std::unique_ptr pControl ); + void init(); + + DECLARE_UNO3_AGG_DEFAULTS(FmXGridCell, OComponentHelper) + virtual css::uno::Any SAL_CALL queryAggregation( const css::uno::Type& _rType ) override; + + void SetTextLineColor(); + void SetTextLineColor(const Color& _rColor); + +// XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + +// OComponentHelper + virtual void SAL_CALL disposing() override; + +// css::lang::XComponent + virtual void SAL_CALL dispose() override {OComponentHelper::dispose();} + virtual void SAL_CALL addEventListener(const css::uno::Reference< css::lang::XEventListener >& aListener) override { OComponentHelper::addEventListener(aListener);} + virtual void SAL_CALL removeEventListener(const css::uno::Reference< css::lang::XEventListener >& aListener) override { OComponentHelper::removeEventListener(aListener);} + +// css::awt::XControl + virtual void SAL_CALL setContext(const css::uno::Reference< css::uno::XInterface >& /*Context*/) override {} + virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getContext() override; + virtual void SAL_CALL createPeer(const css::uno::Reference< css::awt::XToolkit >& /*Toolkit*/, const css::uno::Reference< css::awt::XWindowPeer >& /*Parent*/) override {} + + virtual css::uno::Reference< css::awt::XWindowPeer > SAL_CALL getPeer() override {return css::uno::Reference< css::awt::XWindowPeer > ();} + virtual sal_Bool SAL_CALL setModel(const css::uno::Reference< css::awt::XControlModel >& /*Model*/) override {return false;} + virtual css::uno::Reference< css::awt::XControlModel > SAL_CALL getModel() override; + virtual css::uno::Reference< css::awt::XView > SAL_CALL getView() override {return css::uno::Reference< css::awt::XView > ();} + virtual void SAL_CALL setDesignMode(sal_Bool /*bOn*/) override {} + virtual sal_Bool SAL_CALL isDesignMode() override {return false;} + virtual sal_Bool SAL_CALL isTransparent() override {return false;} + +// css::form::XBoundControl + virtual sal_Bool SAL_CALL getLock() override; + virtual void SAL_CALL setLock(sal_Bool _bLock) override; + + // XWindow + virtual void SAL_CALL setPosSize( ::sal_Int32 X, ::sal_Int32 Y, ::sal_Int32 Width, ::sal_Int32 Height, ::sal_Int16 Flags ) override; + virtual css::awt::Rectangle SAL_CALL getPosSize( ) override; + virtual void SAL_CALL setVisible( sal_Bool Visible ) override; + virtual void SAL_CALL setEnable( sal_Bool Enable ) override; + virtual void SAL_CALL setFocus( ) override; + virtual void SAL_CALL addWindowListener( const css::uno::Reference< css::awt::XWindowListener >& xListener ) override; + virtual void SAL_CALL removeWindowListener( const css::uno::Reference< css::awt::XWindowListener >& xListener ) override; + virtual void SAL_CALL addFocusListener( const css::uno::Reference< css::awt::XFocusListener >& xListener ) override; + virtual void SAL_CALL removeFocusListener( const css::uno::Reference< css::awt::XFocusListener >& xListener ) override; + virtual void SAL_CALL addKeyListener( const css::uno::Reference< css::awt::XKeyListener >& xListener ) override; + virtual void SAL_CALL removeKeyListener( const css::uno::Reference< css::awt::XKeyListener >& xListener ) override; + virtual void SAL_CALL addMouseListener( const css::uno::Reference< css::awt::XMouseListener >& xListener ) override; + virtual void SAL_CALL removeMouseListener( const css::uno::Reference< css::awt::XMouseListener >& xListener ) override; + virtual void SAL_CALL addMouseMotionListener( const css::uno::Reference< css::awt::XMouseMotionListener >& xListener ) override; + virtual void SAL_CALL removeMouseMotionListener( const css::uno::Reference< css::awt::XMouseMotionListener >& xListener ) override; + virtual void SAL_CALL addPaintListener( const css::uno::Reference< css::awt::XPaintListener >& xListener ) override; + virtual void SAL_CALL removePaintListener( const css::uno::Reference< css::awt::XPaintListener >& xListener ) override; + + bool Commit() {return m_pCellControl->Commit();} + void ImplInitWindow( vcl::Window const & rParent, const InitWindowFacet _eInitWhat ) + { m_pCellControl->ImplInitWindow( rParent, _eInitWhat ); } + + bool isAlignedController() const { return m_pCellControl->isAlignedController(); } + void AlignControl(sal_Int16 nAlignment) + { m_pCellControl->AlignControl(nAlignment);} + +protected: + // default implementations call our focus listeners, don't forget to call them if you override this + virtual void onFocusGained( const css::awt::FocusEvent& _rEvent ); + virtual void onFocusLost( const css::awt::FocusEvent& _rEvent ); + +private: + svt::ControlBase* getEventWindow() const; + DECL_LINK(OnFocusGained, LinkParamNone*, void); + DECL_LINK(OnFocusLost, LinkParamNone*, void); + DECL_LINK(OnMousePress, const MouseEvent&, void); + DECL_LINK(OnMouseRelease, const MouseEvent&, void); + DECL_LINK(OnMouseMove, const MouseEvent&, void); + DECL_LINK(OnKeyInput, const KeyEvent&, void); + DECL_LINK(OnKeyRelease, const KeyEvent&, void); +}; + + +class FmXDataCell : public FmXGridCell +{ +public: + FmXDataCell( DbGridColumn* pColumn, std::unique_ptr pControl ) + :FmXGridCell( pColumn, std::move(pControl) ) + { + } + + virtual void PaintFieldToCell(OutputDevice& rDev, + const tools::Rectangle& rRect, + const css::uno::Reference< css::sdb::XColumn >& xField, + const css::uno::Reference< css::util::XNumberFormatter >& xFormatter); + + void UpdateFromField(const css::uno::Reference< css::sdb::XColumn >& xField, + const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) + { m_pCellControl->UpdateFromField(xField, xFormatter); } + +protected: + void UpdateFromColumn(); +}; + + +class FmXTextCell : public FmXDataCell +{ +protected: + bool m_bIsMultiLineText; + +public: + FmXTextCell( DbGridColumn* pColumn, std::unique_ptr pControl ); + + virtual void PaintFieldToCell(OutputDevice& rDev, + const tools::Rectangle& rRect, + const css::uno::Reference< css::sdb::XColumn >& xField, + const css::uno::Reference< css::util::XNumberFormatter >& xFormatter) override; + + OUString GetText(const css::uno::Reference< css::sdb::XColumn >& _rxField, + const css::uno::Reference< css::util::XNumberFormatter >& xFormatter, + const Color** ppColor = nullptr) + {return m_pCellControl->GetFormatText(_rxField, xFormatter, ppColor);} +}; + + +typedef ::cppu::ImplHelper2 < css::awt::XTextComponent + , css::form::XChangeBroadcaster + > FmXEditCell_Base; +class FmXEditCell final : public FmXTextCell, + public FmXEditCell_Base +{ +public: + FmXEditCell( DbGridColumn* pColumn, std::unique_ptr pControl ); + + DECLARE_UNO3_AGG_DEFAULTS(FmXEditCell, FmXTextCell) + virtual css::uno::Any SAL_CALL queryAggregation( const css::uno::Type& _rType ) override; + +// XTypeProvider + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + +// OComponentHelper + virtual void SAL_CALL disposing() override; + +// css::awt::XTextComponent + virtual void SAL_CALL addTextListener(const css::uno::Reference< css::awt::XTextListener >& l) override; + virtual void SAL_CALL removeTextListener(const css::uno::Reference< css::awt::XTextListener >& l) override; + virtual void SAL_CALL setText(const OUString& aText) override; + virtual void SAL_CALL insertText(const css::awt::Selection& Sel, const OUString& Text) override; + virtual OUString SAL_CALL getText() override; + virtual OUString SAL_CALL getSelectedText() override; + virtual void SAL_CALL setSelection(const css::awt::Selection& aSelection) override; + virtual css::awt::Selection SAL_CALL getSelection() override; + virtual sal_Bool SAL_CALL isEditable() override; + virtual void SAL_CALL setEditable(sal_Bool bEditable) override; + virtual void SAL_CALL setMaxTextLen(sal_Int16 nLen) override; + virtual sal_Int16 SAL_CALL getMaxTextLen() override; + + // XChangeBroadcaster + virtual void SAL_CALL addChangeListener( const css::uno::Reference< css::form::XChangeListener >& aListener ) override; + virtual void SAL_CALL removeChangeListener( const css::uno::Reference< css::form::XChangeListener >& aListener ) override; + +private: + virtual ~FmXEditCell() override; + + virtual void onFocusGained( const css::awt::FocusEvent& _rEvent ) override; + virtual void onFocusLost( const css::awt::FocusEvent& _rEvent ) override; + + DECL_LINK(ModifyHdl, LinkParamNone*, void); + + void onTextChanged(); + + OUString m_sValueOnEnter; + ::comphelper::OInterfaceContainerHelper3 m_aTextListeners; + ::comphelper::OInterfaceContainerHelper3 m_aChangeListeners; + ::svt::IEditImplementation* m_pEditImplementation; + bool m_bOwnEditImplementation; +}; + +typedef ::cppu::ImplHelper2 < css::awt::XCheckBox + , css::awt::XButton + > FmXCheckBoxCell_Base; +class FmXCheckBoxCell final : public FmXDataCell, + public FmXCheckBoxCell_Base +{ + ::comphelper::OInterfaceContainerHelper3 m_aItemListeners; + ::comphelper::OInterfaceContainerHelper3 m_aActionListeners; + OUString m_aActionCommand; + VclPtr<::svt::CheckBoxControl> m_pBox; + + DECL_LINK(ModifyHdl, LinkParamNone*, void); + + virtual ~FmXCheckBoxCell() override; + +public: + FmXCheckBoxCell( DbGridColumn* pColumn, std::unique_ptr pControl ); + +// UNO + DECLARE_UNO3_AGG_DEFAULTS(FmXCheckBoxCell, FmXDataCell) + virtual css::uno::Any SAL_CALL queryAggregation( const css::uno::Type& _rType ) override; + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + +// OComponentHelper + virtual void SAL_CALL disposing() override; + +// css::awt::XCheckBox + virtual void SAL_CALL addItemListener(const css::uno::Reference< css::awt::XItemListener >& l) override; + virtual void SAL_CALL removeItemListener(const css::uno::Reference< css::awt::XItemListener >& l) override; + virtual sal_Int16 SAL_CALL getState() override; + virtual void SAL_CALL setState(sal_Int16 n) override; + virtual void SAL_CALL setLabel(const OUString& Label) override; + virtual void SAL_CALL enableTriState(sal_Bool b) override; + + // XButton + virtual void SAL_CALL addActionListener( const css::uno::Reference< css::awt::XActionListener >& l ) override; + virtual void SAL_CALL removeActionListener( const css::uno::Reference< css::awt::XActionListener >& l ) override; + //virtual void SAL_CALL setLabel( const OUString& Label ) throw (css::uno::RuntimeException); + virtual void SAL_CALL setActionCommand( const OUString& Command ) override; +}; + +typedef ::cppu::ImplHelper1 < css::awt::XListBox + > FmXListBoxCell_Base; +class FmXListBoxCell final : public FmXTextCell + , public FmXListBoxCell_Base +{ +public: + FmXListBoxCell( DbGridColumn* pColumn, std::unique_ptr pControl ); + + DECLARE_UNO3_AGG_DEFAULTS(FmXListBoxCell, FmXTextCell) + virtual css::uno::Any SAL_CALL queryAggregation( const css::uno::Type& _rType ) override; + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + +// OComponentHelper + virtual void SAL_CALL disposing() override; + +// css::awt::XListBox + virtual void SAL_CALL addItemListener(const css::uno::Reference< css::awt::XItemListener >& l) override; + virtual void SAL_CALL removeItemListener(const css::uno::Reference< css::awt::XItemListener >& l) override; + virtual void SAL_CALL addActionListener(const css::uno::Reference< css::awt::XActionListener >& l) override; + virtual void SAL_CALL removeActionListener(const css::uno::Reference< css::awt::XActionListener >& l) override; + virtual void SAL_CALL addItem(const OUString& aItem, sal_Int16 nPos) override; + virtual void SAL_CALL addItems(const css::uno::Sequence< OUString >& aItems, sal_Int16 nPos) override; + virtual void SAL_CALL removeItems(sal_Int16 nPos, sal_Int16 nCount) override; + virtual sal_Int16 SAL_CALL getItemCount() override; + virtual OUString SAL_CALL getItem(sal_Int16 nPos) override; + virtual css::uno::Sequence< OUString > SAL_CALL getItems() override; + virtual sal_Int16 SAL_CALL getSelectedItemPos() override; + virtual css::uno::Sequence< sal_Int16 > SAL_CALL getSelectedItemsPos() override; + virtual OUString SAL_CALL getSelectedItem() override; + virtual css::uno::Sequence< OUString > SAL_CALL getSelectedItems() override; + virtual void SAL_CALL selectItemPos(sal_Int16 nPos, sal_Bool bSelect) override; + virtual void SAL_CALL selectItemsPos(const css::uno::Sequence< sal_Int16 >& aPositions, sal_Bool bSelect) override; + virtual void SAL_CALL selectItem(const OUString& aItem, sal_Bool bSelect) override; + virtual sal_Bool SAL_CALL isMutipleMode() override; + virtual void SAL_CALL setMultipleMode(sal_Bool bMulti) override; + virtual sal_Int16 SAL_CALL getDropDownLineCount() override; + virtual void SAL_CALL setDropDownLineCount(sal_Int16 nLines) override; + virtual void SAL_CALL makeVisible(sal_Int16 nEntry) override; + +private: + virtual ~FmXListBoxCell() override; + + DECL_LINK(ChangedHdl, bool, void); + + void OnDoubleClick(); + + ::comphelper::OInterfaceContainerHelper3 m_aItemListeners; + ::comphelper::OInterfaceContainerHelper3 m_aActionListeners; + VclPtr<::svt::ListBoxControl> m_pBox; + sal_uInt16 m_nLines; + bool m_bMulti; +}; + + +typedef ::cppu::ImplHelper1 < css::awt::XComboBox + > FmXComboBoxCell_Base; +class FmXComboBoxCell final : public FmXTextCell + , public FmXComboBoxCell_Base +{ +private: + ::comphelper::OInterfaceContainerHelper3 m_aItemListeners; + ::comphelper::OInterfaceContainerHelper3 m_aActionListeners; + VclPtr<::svt::ComboBoxControl> m_pComboBox; + sal_uInt16 m_nLines; + + DECL_LINK(ChangedHdl, bool, void); + + virtual ~FmXComboBoxCell() override; + +public: + FmXComboBoxCell( DbGridColumn* pColumn, std::unique_ptr pControl ); + + DECLARE_UNO3_AGG_DEFAULTS(FmXListBoxCell, FmXTextCell) + virtual css::uno::Any SAL_CALL queryAggregation( const css::uno::Type& _rType ) override; + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + + // OComponentHelper + virtual void SAL_CALL disposing() override; + + // XComboBox + virtual void SAL_CALL addItemListener( const css::uno::Reference< css::awt::XItemListener >& Listener ) override; + virtual void SAL_CALL removeItemListener( const css::uno::Reference< css::awt::XItemListener >& Listener ) override; + virtual void SAL_CALL addActionListener( const css::uno::Reference< css::awt::XActionListener >& Listener ) override; + virtual void SAL_CALL removeActionListener( const css::uno::Reference< css::awt::XActionListener >& Listener ) override; + virtual void SAL_CALL addItem( const OUString& Item, ::sal_Int16 Pos ) override; + virtual void SAL_CALL addItems( const css::uno::Sequence< OUString >& Items, ::sal_Int16 Pos ) override; + virtual void SAL_CALL removeItems( ::sal_Int16 nPos, ::sal_Int16 nCount ) override; + virtual ::sal_Int16 SAL_CALL getItemCount( ) override; + virtual OUString SAL_CALL getItem( ::sal_Int16 Pos ) override; + virtual css::uno::Sequence< OUString > SAL_CALL getItems( ) override; + virtual ::sal_Int16 SAL_CALL getDropDownLineCount( ) override; + virtual void SAL_CALL setDropDownLineCount( ::sal_Int16 Lines ) override; +}; + +typedef ::cppu::ImplHelper2 < css::awt::XTextComponent + , css::lang::XUnoTunnel + > FmXFilterCell_Base; +class FmXFilterCell final : public FmXGridCell + ,public FmXFilterCell_Base +{ +public: + FmXFilterCell(DbGridColumn* pColumn, std::unique_ptr pControl); + + + DECLARE_UNO3_AGG_DEFAULTS(FmXFilterCell, FmXGridCell) + virtual css::uno::Any SAL_CALL queryAggregation( const css::uno::Type& _rType ) override; + virtual css::uno::Sequence< css::uno::Type > SAL_CALL getTypes( ) override; + virtual css::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() override; + +// XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< sal_Int8 >& aIdentifier ) override; + +// helpers for XUnoTunnel + static const css::uno::Sequence& getUnoTunnelId(); + +// painting the filter text + void PaintCell(OutputDevice& rDev, const tools::Rectangle& rRect); + void Update(){m_pCellControl->Update();} + +// OComponentHelper + virtual void SAL_CALL disposing() override; + +// css::awt::XTextComponent + virtual void SAL_CALL addTextListener(const css::uno::Reference< css::awt::XTextListener >& l) override; + virtual void SAL_CALL removeTextListener(const css::uno::Reference< css::awt::XTextListener >& l) override; + virtual void SAL_CALL setText(const OUString& aText) override; + virtual void SAL_CALL insertText(const css::awt::Selection& Sel, const OUString& Text) override; + virtual OUString SAL_CALL getText() override; + virtual OUString SAL_CALL getSelectedText() override; + virtual void SAL_CALL setSelection(const css::awt::Selection& aSelection) override; + virtual css::awt::Selection SAL_CALL getSelection() override; + virtual sal_Bool SAL_CALL isEditable() override; + virtual void SAL_CALL setEditable(sal_Bool bEditable) override; + virtual void SAL_CALL setMaxTextLen(sal_Int16 nLen) override; + virtual sal_Int16 SAL_CALL getMaxTextLen() override; + +private: + DECL_LINK( OnCommit, DbFilterField&, void ); + virtual ~FmXFilterCell() override; + + ::comphelper::OInterfaceContainerHelper3 m_aTextListeners; +}; + +#endif // INCLUDED_SVX_SOURCE_INC_GRIDCELL_HXX + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v1.2.3