summaryrefslogtreecommitdiff
path: root/svx/source/fmcomp/gridcell.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svx/source/fmcomp/gridcell.cxx')
-rw-r--r--svx/source/fmcomp/gridcell.cxx4838
1 files changed, 0 insertions, 4838 deletions
diff --git a/svx/source/fmcomp/gridcell.cxx b/svx/source/fmcomp/gridcell.cxx
deleted file mode 100644
index 60229811ae..0000000000
--- a/svx/source/fmcomp/gridcell.cxx
+++ /dev/null
@@ -1,4838 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_svx.hxx"
-
-#include <sal/macros.h>
-#include "fmprop.hrc"
-#include "svx/fmresids.hrc"
-#include "svx/fmtools.hxx"
-#include "gridcell.hxx"
-#include "gridcols.hxx"
-#include "sdbdatacolumn.hxx"
-
-#include <com/sun/star/awt/LineEndFormat.hpp>
-#include <com/sun/star/awt/MouseWheelBehavior.hpp>
-#include <com/sun/star/awt/VisualEffect.hpp>
-#include <com/sun/star/container/XChild.hpp>
-#include <com/sun/star/container/XNamed.hpp>
-#include <com/sun/star/form/FormComponentType.hpp>
-#include <com/sun/star/form/XBoundComponent.hpp>
-#include <com/sun/star/script/XEventAttacherManager.hpp>
-#include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp>
-#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
-#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
-#include <com/sun/star/sdbc/ColumnValue.hpp>
-#include <com/sun/star/sdbc/DataType.hpp>
-#include <com/sun/star/sdbc/XStatement.hpp>
-#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
-#include <com/sun/star/util/NumberFormat.hpp>
-#include <com/sun/star/util/XNumberFormatsSupplier.hpp>
-#include <com/sun/star/util/XNumberFormatter.hpp>
-
-#include <comphelper/extract.hxx>
-#include <comphelper/numbers.hxx>
-#include <comphelper/property.hxx>
-#include <comphelper/servicehelper.hxx>
-#include <connectivity/formattedcolumnvalue.hxx>
-#include <cppuhelper/typeprovider.hxx>
-#include <i18npool/lang.h>
-
-#include <rtl/math.hxx>
-#include <svtools/calendar.hxx>
-#include <svtools/fmtfield.hxx>
-#include <svl/numuno.hxx>
-#include <svtools/svmedit.hxx>
-#include <svx/dialmgr.hxx>
-#include <toolkit/helper/vclunohelper.hxx>
-#include <tools/diagnose_ex.h>
-#include <tools/shl.hxx>
-#include <vcl/longcurr.hxx>
-
-#include <math.h>
-#include <stdio.h>
-
-using namespace ::connectivity;
-using namespace ::connectivity::simple;
-using namespace ::svxform;
-using namespace ::comphelper;
-using namespace ::svt;
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-using namespace ::com::sun::star::sdbc;
-using namespace ::com::sun::star::sdbcx;
-using namespace ::com::sun::star::sdb;
-using namespace ::com::sun::star::beans;
-using namespace ::com::sun::star::form;
-
-using ::com::sun::star::util::XNumberFormatter;
-namespace MouseWheelBehavior = ::com::sun::star::awt::MouseWheelBehavior;
-
-String INVALIDTEXT = String::CreateFromAscii("###");
-String OBJECTTEXT = String::CreateFromAscii("<OBJECT>");
- // TODO: resource
-
-//==================================================================
-//= helper
-//==================================================================
-namespace
-{
- static LineEnd getModelLineEndSetting( const Reference< XPropertySet >& _rxModel )
- {
- LineEnd eFormat = LINEEND_LF;
-
- try
- {
- sal_Int16 nLineEndFormat = awt::LineEndFormat::LINE_FEED;
-
- Reference< XPropertySetInfo > xPSI;
- if ( _rxModel.is() )
- xPSI = _rxModel->getPropertySetInfo();
-
- OSL_ENSURE( xPSI.is(), "getModelLineEndSetting: invalid column model!" );
- if ( xPSI.is() && xPSI->hasPropertyByName( FM_PROP_LINEENDFORMAT ) )
- {
- OSL_VERIFY( _rxModel->getPropertyValue( FM_PROP_LINEENDFORMAT ) >>= nLineEndFormat );
-
- switch ( nLineEndFormat )
- {
- case awt::LineEndFormat::CARRIAGE_RETURN: eFormat = LINEEND_CR; break;
- case awt::LineEndFormat::LINE_FEED: eFormat = LINEEND_LF; break;
- case awt::LineEndFormat::CARRIAGE_RETURN_LINE_FEED: eFormat = LINEEND_CRLF; break;
- default:
- OSL_FAIL( "getModelLineEndSetting: what's this?" );
- }
- }
- }
- catch( const Exception& )
- {
- OSL_FAIL( "getModelLineEndSetting: caught an exception!" );
- }
- return eFormat;
- }
-}
-
-//==================================================================
-//= DbGridColumn
-//==================================================================
-//------------------------------------------------------------------------------
-CellControllerRef DbGridColumn::s_xEmptyController;
-
-//------------------------------------------------------------------------------
-void DbGridColumn::CreateControl(sal_Int32 _nFieldPos, const Reference< ::com::sun::star::beans::XPropertySet >& xField, sal_Int32 nTypeId)
-{
- Clear();
-
- m_nTypeId = (sal_Int16)nTypeId;
- if (xField != m_xField)
- {
- // Grundeinstellung
- m_xField = xField;
- xField->getPropertyValue(FM_PROP_FORMATKEY) >>= m_nFormatKey;
- m_nFieldPos = (sal_Int16)_nFieldPos;
- m_bReadOnly = ::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_ISREADONLY));
- m_bAutoValue = ::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_AUTOINCREMENT));
- m_nFieldType = (sal_Int16)::comphelper::getINT32(xField->getPropertyValue(FM_PROP_FIELDTYPE));
-
- switch (m_nFieldType)
- {
- case DataType::DATE:
- case DataType::TIME:
- case DataType::TIMESTAMP:
- m_bDateTime = sal_True;
-
- case DataType::BIT:
- case DataType::BOOLEAN:
- case DataType::TINYINT:
- case DataType::SMALLINT:
- case DataType::INTEGER:
- case DataType::BIGINT:
- case DataType::FLOAT:
- case DataType::REAL:
- case DataType::DOUBLE:
- case DataType::NUMERIC:
- case DataType::DECIMAL:
- m_nAlign = ::com::sun::star::awt::TextAlign::RIGHT;
- m_bNumeric = sal_True;
- break;
- default:
- m_nAlign = ::com::sun::star::awt::TextAlign::LEFT;
- break;
- }
- }
-
- DbCellControl* pCellControl = NULL;
- if (m_rParent.IsFilterMode())
- {
- pCellControl = new DbFilterField(m_rParent.getServiceManager(),*this);
- }
- else
- {
-
- switch (nTypeId)
- {
- case TYPE_CHECKBOX: pCellControl = new DbCheckBox(*this); break;
- case TYPE_COMBOBOX: pCellControl = new DbComboBox(*this); break;
- case TYPE_CURRENCYFIELD: pCellControl = new DbCurrencyField(*this); break;
- case TYPE_DATEFIELD: pCellControl = new DbDateField(*this); break;
- case TYPE_LISTBOX: pCellControl = new DbListBox(*this); break;
- case TYPE_NUMERICFIELD: pCellControl = new DbNumericField(*this); break;
- case TYPE_PATTERNFIELD: pCellControl = new DbPatternField( *this, ::comphelper::ComponentContext( m_rParent.getServiceManager() ) ); break;
- case TYPE_TEXTFIELD: pCellControl = new DbTextField(*this); break;
- case TYPE_TIMEFIELD: pCellControl = new DbTimeField(*this); break;
- case TYPE_FORMATTEDFIELD: pCellControl = new DbFormattedField(*this); break;
- default:
- OSL_FAIL("DbGridColumn::CreateControl: Unknown Column");
- return;
- }
-
- }
- Reference< XRowSet > xCur;
- if (m_rParent.getDataSource())
- xCur = Reference< XRowSet > ((Reference< XInterface >)*m_rParent.getDataSource(), UNO_QUERY);
- // TODO : the cursor wrapper should use an XRowSet interface, too
-
- pCellControl->Init( m_rParent.GetDataWindow(), xCur );
-
- // now create the control wrapper
- if (m_rParent.IsFilterMode())
- m_pCell = new FmXFilterCell(this, pCellControl);
- else
- {
- switch (nTypeId)
- {
- case TYPE_CHECKBOX: m_pCell = new FmXCheckBoxCell( this, *pCellControl ); break;
- case TYPE_LISTBOX: m_pCell = new FmXListBoxCell( this, *pCellControl ); break;
- case TYPE_COMBOBOX: m_pCell = new FmXComboBoxCell( this, *pCellControl ); break;
- default:
- m_pCell = new FmXEditCell( this, *pCellControl );
- }
- }
- m_pCell->acquire();
- m_pCell->init();
-
- impl_toggleScriptManager_nothrow( true );
-
- // only if we use have a bound field, we use a a controller for displaying the
- // window in the grid
- if (m_xField.is())
- m_xController = pCellControl->CreateController();
-}
-
-//------------------------------------------------------------------------------
-void DbGridColumn::impl_toggleScriptManager_nothrow( bool _bAttach )
-{
- try
- {
- Reference< container::XChild > xChild( m_xModel, UNO_QUERY_THROW );
- Reference< script::XEventAttacherManager > xManager( xChild->getParent(), UNO_QUERY_THROW );
- Reference< container::XIndexAccess > xContainer( xChild->getParent(), UNO_QUERY_THROW );
-
- sal_Int32 nIndexInParent( getElementPos( xContainer, m_xModel ) );
-
- Reference< XInterface > xCellInterface( *m_pCell, UNO_QUERY );
- if ( _bAttach )
- xManager->attach( nIndexInParent, xCellInterface, makeAny( xCellInterface ) );
- else
- xManager->detach( nIndexInParent, xCellInterface );
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-}
-
-//------------------------------------------------------------------------------
-void DbGridColumn::UpdateFromField(const DbGridRow* pRow, const Reference< XNumberFormatter >& xFormatter)
-{
- if (m_pCell && m_pCell->ISA(FmXFilterCell))
- PTR_CAST(FmXFilterCell, m_pCell)->Update();
- else if (pRow && pRow->IsValid() && m_nFieldPos >= 0 && m_pCell && pRow->HasField(m_nFieldPos))
- {
- PTR_CAST(FmXDataCell, m_pCell)->UpdateFromField( pRow->GetField( m_nFieldPos ).getColumn(), xFormatter );
- }
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbGridColumn::Commit()
-{
- sal_Bool bResult = sal_True;
- if (!m_bInSave && m_pCell)
- {
- m_bInSave = sal_True;
- bResult = m_pCell->Commit();
-
- // store the data into the model
- FmXDataCell* pDataCell = PTR_CAST(FmXDataCell, m_pCell);
- if (bResult && pDataCell)
- {
- Reference< ::com::sun::star::form::XBoundComponent > xComp(m_xModel, UNO_QUERY);
- if (xComp.is())
- bResult = xComp->commit();
- }
- m_bInSave = sal_False;
- }
- return bResult;
-}
-
-//------------------------------------------------------------------------------
-DbGridColumn::~DbGridColumn()
-{
- Clear();
-}
-
-//------------------------------------------------------------------------------
-void DbGridColumn::setModel(::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _xModel)
-{
- if ( m_pCell )
- impl_toggleScriptManager_nothrow( false );
-
- m_xModel = _xModel;
-
- if ( m_pCell )
- impl_toggleScriptManager_nothrow( true );
-}
-
-//------------------------------------------------------------------------------
-void DbGridColumn::Clear()
-{
- if ( m_pCell )
- {
- impl_toggleScriptManager_nothrow( false );
-
- m_pCell->dispose();
- m_pCell->release();
- m_pCell = NULL;
- }
-
- m_xController = NULL;
- m_xField = NULL;
-
- m_nFormatKey = 0;
- m_nFieldPos = -1;
- m_bReadOnly = sal_True;
- m_bAutoValue = sal_False;
- m_nFieldType = DataType::OTHER;
-}
-
-//------------------------------------------------------------------------------
-sal_Int16 DbGridColumn::SetAlignment(sal_Int16 _nAlign)
-{
- if (_nAlign == -1)
- { // 'Standard'
- if (m_xField.is())
- {
- sal_Int32 nType = 0;
- m_xField->getPropertyValue(FM_PROP_FIELDTYPE) >>= nType;
-
- switch (nType)
- {
- case DataType::NUMERIC:
- case DataType::DECIMAL:
- case DataType::DOUBLE:
- case DataType::REAL:
- case DataType::BIGINT:
- case DataType::INTEGER:
- case DataType::SMALLINT:
- case DataType::TINYINT:
- case DataType::DATE:
- case DataType::TIME:
- case DataType::TIMESTAMP:
- _nAlign = ::com::sun::star::awt::TextAlign::RIGHT;
- break;
- case DataType::BIT:
- case DataType::BOOLEAN:
- _nAlign = ::com::sun::star::awt::TextAlign::CENTER;
- break;
- default:
- _nAlign = ::com::sun::star::awt::TextAlign::LEFT;
- break;
- }
- }
- else
- _nAlign = ::com::sun::star::awt::TextAlign::LEFT;
- }
-
- m_nAlign = _nAlign;
- if (m_pCell && m_pCell->isAlignedController())
- m_pCell->AlignControl(m_nAlign);
-
- return m_nAlign;
-}
-
-//------------------------------------------------------------------------------
-sal_Int16 DbGridColumn::SetAlignmentFromModel(sal_Int16 nStandardAlign)
-{
- Any aAlign( m_xModel->getPropertyValue(FM_PROP_ALIGN));
- if (aAlign.hasValue())
- {
- sal_Int16 nTest = sal_Int16();
- if (aAlign >>= nTest)
- nStandardAlign = nTest;
- }
- return SetAlignment(nStandardAlign);
-}
-
-//------------------------------------------------------------------------------
-void DbGridColumn::setLock(sal_Bool _bLock)
-{
- if (m_bLocked == _bLock)
- return;
- m_bLocked = _bLock;
-
- // is the column we represent active ?
- if (m_bHidden)
- return; // no, it isn't (or at least it shouldn't be ...)
-
- if (m_rParent.GetCurColumnId() == m_nId)
- {
- m_rParent.DeactivateCell();
- m_rParent.ActivateCell(m_rParent.GetCurRow(), m_rParent.GetCurColumnId());
- }
-}
-
-//------------------------------------------------------------------------------
-String DbGridColumn::GetCellText(const DbGridRow* pRow, const Reference< XNumberFormatter >& xFormatter) const
-{
- String aText;
- if (m_pCell && m_pCell->ISA(FmXFilterCell))
- return aText;
-
- if (!pRow || !pRow->IsValid())
- aText = INVALIDTEXT;
- else if (pRow->HasField(m_nFieldPos))
- {
- aText = GetCellText( pRow->GetField( m_nFieldPos ).getColumn(), xFormatter );
- }
- return aText;
-}
-
-//------------------------------------------------------------------------------
-String DbGridColumn::GetCellText(const Reference< ::com::sun::star::sdb::XColumn >& xField, const Reference< XNumberFormatter >& xFormatter) const
-{
- String aText;
- if (xField.is())
- {
- FmXTextCell* pTextCell = PTR_CAST(FmXTextCell, m_pCell);
- if (pTextCell)
- aText = pTextCell->GetText(xField, xFormatter);
- else if (m_bObject)
- aText = OBJECTTEXT;
- }
- return aText;
-}
-
-//------------------------------------------------------------------------------
-Reference< ::com::sun::star::sdb::XColumn > DbGridColumn::GetCurrentFieldValue() const
-{
- Reference< ::com::sun::star::sdb::XColumn > xField;
- const DbGridRowRef xRow = m_rParent.GetCurrentRow();
- if (xRow.Is() && xRow->HasField(m_nFieldPos))
- {
- xField = xRow->GetField(m_nFieldPos).getColumn();
- }
- return xField;
-}
-
-//------------------------------------------------------------------------------
-void DbGridColumn::Paint(OutputDevice& rDev,
- const Rectangle& rRect,
- const DbGridRow* pRow,
- const Reference< XNumberFormatter >& xFormatter)
-{
- bool bEnabled = ( rDev.GetOutDevType() != OUTDEV_WINDOW )
- || ( static_cast< Window& >( rDev ).IsEnabled() );
-
- FmXDataCell* pDataCell = PTR_CAST(FmXDataCell, m_pCell);
- if (pDataCell)
- {
- if (!pRow || !pRow->IsValid())
- {
- sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
- if ( !bEnabled )
- nStyle |= TEXT_DRAW_DISABLE;
-
- rDev.DrawText(rRect, INVALIDTEXT, nStyle);
- }
- else if (m_bAutoValue && pRow->IsNew())
- {
- static String aAutoText(SVX_RES(RID_STR_AUTOFIELD));
- sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_VCENTER;
- if ( !bEnabled )
- nStyle |= TEXT_DRAW_DISABLE;
-
- switch (GetAlignment())
- {
- case ::com::sun::star::awt::TextAlign::RIGHT:
- nStyle |= TEXT_DRAW_RIGHT;
- break;
- case ::com::sun::star::awt::TextAlign::CENTER:
- nStyle |= TEXT_DRAW_CENTER;
- break;
- default:
- nStyle |= TEXT_DRAW_LEFT;
- }
-
- rDev.DrawText(rRect, aAutoText , nStyle);
- }
- else if (pRow->HasField(m_nFieldPos))
- {
- pDataCell->PaintFieldToCell(rDev, rRect, pRow->GetField( m_nFieldPos ).getColumn(), xFormatter);
- }
- }
- else if (!m_pCell)
- {
- if (!pRow || !pRow->IsValid())
- {
- sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
- if ( !bEnabled )
- nStyle |= TEXT_DRAW_DISABLE;
-
- rDev.DrawText(rRect, INVALIDTEXT, nStyle);
- }
- else if (pRow->HasField(m_nFieldPos) && m_bObject)
- {
- sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
- if ( !bEnabled )
- nStyle |= TEXT_DRAW_DISABLE;
- rDev.DrawText(rRect, OBJECTTEXT, nStyle);
- }
- }
- else if ( m_pCell->ISA( FmXFilterCell ) )
- static_cast< FmXFilterCell* >( m_pCell )->PaintCell( rDev, rRect );
-}
-
-//------------------------------------------------------------------------------
-void DbGridColumn::ImplInitWindow( Window& rParent, const InitWindowFacet _eInitWhat )
-{
- if ( m_pCell )
- m_pCell->ImplInitWindow( rParent, _eInitWhat );
-}
-
-//==============================================================================
-//= cell controls
-//==============================================================================
-TYPEINIT0( DbCellControl )
-TYPEINIT1( DbLimitedLengthField, DbCellControl )
-TYPEINIT1( DbTextField, DbLimitedLengthField )
-TYPEINIT1( DbFormattedField, DbLimitedLengthField )
-TYPEINIT1( DbCheckBox, DbCellControl )
-TYPEINIT1( DbComboBox, DbCellControl )
-TYPEINIT1( DbListBox, DbCellControl )
-TYPEINIT1( DbPatternField, DbCellControl )
-TYPEINIT1( DbSpinField, DbCellControl )
-TYPEINIT1( DbDateField, DbSpinField )
-TYPEINIT1( DbTimeField, DbSpinField )
-TYPEINIT1( DbCurrencyField, DbSpinField )
-TYPEINIT1( DbNumericField, DbSpinField )
-TYPEINIT1( DbFilterField, DbCellControl )
-
-//------------------------------------------------------------------------------
-DbCellControl::DbCellControl( DbGridColumn& _rColumn, sal_Bool /*_bText*/ )
- :OPropertyChangeListener(m_aMutex)
- ,m_pFieldChangeBroadcaster(NULL)
- ,m_bTransparent( sal_False )
- ,m_bAlignedController( sal_True )
- ,m_bAccessingValueProperty( sal_False )
- ,m_rColumn( _rColumn )
- ,m_pPainter( NULL )
- ,m_pWindow( NULL )
-{
- Reference< XPropertySet > xColModelProps( _rColumn.getModel(), UNO_QUERY );
- if ( xColModelProps.is() )
- {
- // if our model's format key changes we want to propagate the new value to our windows
- m_pModelChangeBroadcaster = new ::comphelper::OPropertyChangeMultiplexer(this, Reference< ::com::sun::star::beans::XPropertySet > (_rColumn.getModel(), UNO_QUERY));
- m_pModelChangeBroadcaster->acquire();
-
- // be listener for some common properties
- implDoPropertyListening( FM_PROP_READONLY, sal_False );
- implDoPropertyListening( FM_PROP_ENABLED, sal_False );
-
- // add as listener for all know "value" properties
- implDoPropertyListening( FM_PROP_VALUE, sal_False );
- implDoPropertyListening( FM_PROP_STATE, sal_False );
- implDoPropertyListening( FM_PROP_TEXT, sal_False );
- implDoPropertyListening( FM_PROP_EFFECTIVE_VALUE, sal_False );
-
- // be listener at the bound field as well
- try
- {
- Reference< XPropertySetInfo > xPSI( xColModelProps->getPropertySetInfo(), UNO_SET_THROW );
- if ( xPSI->hasPropertyByName( FM_PROP_BOUNDFIELD ) )
- {
- Reference< XPropertySet > xField;
- xColModelProps->getPropertyValue( FM_PROP_BOUNDFIELD ) >>= xField;
- if ( xField.is() )
- {
- m_pFieldChangeBroadcaster = new ::comphelper::OPropertyChangeMultiplexer(this, xField);
- m_pFieldChangeBroadcaster->acquire();
- m_pFieldChangeBroadcaster->addProperty( FM_PROP_ISREADONLY );
- }
- }
- }
- catch( const Exception& )
- {
- OSL_FAIL( "DbCellControl::doPropertyListening: caught an exception!" );
- }
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::implDoPropertyListening( const ::rtl::OUString& _rPropertyName, sal_Bool _bWarnIfNotExistent )
-{
- try
- {
- Reference< XPropertySet > xColModelProps( m_rColumn.getModel(), UNO_QUERY );
- Reference< XPropertySetInfo > xPSI;
- if ( xColModelProps.is() )
- xPSI = xColModelProps->getPropertySetInfo();
-
- DBG_ASSERT( !_bWarnIfNotExistent || ( xPSI.is() && xPSI->hasPropertyByName( _rPropertyName ) ),
- "DbCellControl::doPropertyListening: no property set info or non-existent property!" );
- (void)_bWarnIfNotExistent;
-
- if ( xPSI.is() && xPSI->hasPropertyByName( _rPropertyName ) )
- m_pModelChangeBroadcaster->addProperty( _rPropertyName );
- }
- catch( const Exception& )
- {
- OSL_FAIL( "DbCellControl::doPropertyListening: caught an exception!" );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::doPropertyListening( const ::rtl::OUString& _rPropertyName )
-{
- implDoPropertyListening( _rPropertyName );
-}
-//------------------------------------------------------------------------------
-void lcl_clearBroadCaster(::comphelper::OPropertyChangeMultiplexer*& _pBroadcaster)
-{
- if ( _pBroadcaster )
- {
- _pBroadcaster->dispose();
- _pBroadcaster->release();
- _pBroadcaster = NULL;
- // no delete, this is done implicitly
- }
-}
-//------------------------------------------------------------------------------
-DbCellControl::~DbCellControl()
-{
- lcl_clearBroadCaster(m_pModelChangeBroadcaster);
- lcl_clearBroadCaster(m_pFieldChangeBroadcaster);
-
- delete m_pWindow;
- delete m_pPainter;
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::implValuePropertyChanged( )
-{
- OSL_ENSURE( !isValuePropertyLocked(),
- "DbCellControl::implValuePropertyChanged: not to be called with the value property locked!" );
-
- if ( m_pWindow )
- {
- if ( m_rColumn.getModel().is() )
- updateFromModel( m_rColumn.getModel() );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::implAdjustGenericFieldSetting( const Reference< XPropertySet >& /*_rxModel*/ )
-{
- // nothing to to here
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::_propertyChanged(const PropertyChangeEvent& _rEvent) throw(RuntimeException)
-{
- SolarMutexGuard aGuard;
-
- Reference< XPropertySet > xSourceProps( _rEvent.Source, UNO_QUERY );
-
- if ( _rEvent.PropertyName.equals( FM_PROP_VALUE )
- || _rEvent.PropertyName.equals( FM_PROP_STATE )
- || _rEvent.PropertyName.equals( FM_PROP_TEXT )
- || _rEvent.PropertyName.equals( FM_PROP_EFFECTIVE_VALUE )
- )
- { // it was one of the known "value" properties
- if ( !isValuePropertyLocked() )
- {
- implValuePropertyChanged( );
- }
- }
- else if ( _rEvent.PropertyName.equals( FM_PROP_READONLY ) )
- {
- implAdjustReadOnly( xSourceProps, true);
- }
- else if ( _rEvent.PropertyName.equals( FM_PROP_ISREADONLY ) )
- {
- sal_Bool bReadOnly = sal_True;
- _rEvent.NewValue >>= bReadOnly;
- m_rColumn.SetReadOnly(bReadOnly);
- implAdjustReadOnly( xSourceProps, false);
- }
- else if ( _rEvent.PropertyName.equals( FM_PROP_ENABLED ) )
- {
- implAdjustEnabled( xSourceProps );
- }
- else
- implAdjustGenericFieldSetting( xSourceProps );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbCellControl::Commit()
-{
- // lock the listening for value property changes
- lockValueProperty();
- // commit the content of the control into the model's value property
- sal_Bool bReturn = sal_False;
- try
- {
- bReturn = commitControl();
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- // unlock the listening for value property changes
- unlockValueProperty();
- // outta here
- return bReturn;
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::ImplInitWindow( Window& rParent, const InitWindowFacet _eInitWhat )
-{
- Window* pWindows[] = { m_pPainter, m_pWindow };
-
- if ( ( _eInitWhat & InitWritingMode ) != 0 )
- {
- for ( size_t i=0; i < SAL_N_ELEMENTS( pWindows ); ++i )
- {
- if ( pWindows[i] )
- pWindows[i]->EnableRTL( rParent.IsRTLEnabled() );
- }
- }
-
- if ( ( _eInitWhat & InitFont ) != 0 )
- {
- for (size_t i=0; i < SAL_N_ELEMENTS(pWindows); ++i)
- {
- if ( !pWindows[i] )
- continue;
-
- pWindows[i]->SetZoom( rParent.GetZoom() );
-
- const StyleSettings& rStyleSettings = pWindows[i]->GetSettings().GetStyleSettings();
- Font aFont = rStyleSettings.GetFieldFont();
- aFont.SetTransparent( isTransparent() );
-
- if ( rParent.IsControlFont() )
- {
- pWindows[i]->SetControlFont( rParent.GetControlFont() );
- aFont.Merge( rParent.GetControlFont() );
- }
- else
- pWindows[i]->SetControlFont();
-
- pWindows[i]->SetZoomedPointFont( aFont );
- }
- }
-
- if ( ( ( _eInitWhat & InitFont ) != 0 )
- || ( ( _eInitWhat & InitForeground ) != 0 )
- )
- {
- Color aTextColor( rParent.IsControlForeground() ? rParent.GetControlForeground() : rParent.GetTextColor() );
-
- sal_Bool bTextLineColor = rParent.IsTextLineColor();
- Color aTextLineColor( rParent.GetTextLineColor() );
-
- for (size_t i=0; i < SAL_N_ELEMENTS(pWindows); ++i)
- {
- if ( pWindows[i] )
- {
- pWindows[i]->SetTextColor(aTextColor);
- if (rParent.IsControlForeground())
- pWindows[i]->SetControlForeground(aTextColor);
-
- if (bTextLineColor)
- pWindows[i]->SetTextLineColor();
- else
- pWindows[i]->SetTextLineColor(aTextLineColor);
- }
- }
- }
-
- if ( ( _eInitWhat & InitBackground ) != 0 )
- {
- if (rParent.IsControlBackground())
- {
- Color aColor( rParent.GetControlBackground());
- for (size_t i=0; i < SAL_N_ELEMENTS(pWindows); ++i)
- {
- if ( pWindows[i] )
- {
- if ( isTransparent() )
- pWindows[i]->SetBackground();
- else
- {
- pWindows[i]->SetBackground(aColor);
- pWindows[i]->SetControlBackground(aColor);
- }
- pWindows[i]->SetFillColor(aColor);
- }
- }
- }
- else
- {
- if (m_pPainter)
- {
- if ( isTransparent() )
- m_pPainter->SetBackground();
- else
- m_pPainter->SetBackground(rParent.GetBackground());
- m_pPainter->SetFillColor(rParent.GetFillColor());
- }
-
- if (m_pWindow)
- {
- if ( isTransparent() )
- m_pWindow->SetBackground(rParent.GetBackground());
- else
- m_pWindow->SetFillColor(rParent.GetFillColor());
- }
- }
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::implAdjustReadOnly( const Reference< XPropertySet >& _rxModel,bool i_bReadOnly )
-{
- DBG_ASSERT( m_pWindow, "DbCellControl::implAdjustReadOnly: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbCellControl::implAdjustReadOnly: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- Edit* pEditWindow = dynamic_cast< Edit* >( m_pWindow );
- if ( pEditWindow )
- {
- sal_Bool bReadOnly = m_rColumn.IsReadOnly();
- if ( !bReadOnly )
- {
- _rxModel->getPropertyValue( i_bReadOnly ? FM_PROP_READONLY : FM_PROP_ISREADONLY) >>= bReadOnly;
- }
- static_cast< Edit* >( m_pWindow )->SetReadOnly( bReadOnly );
- }
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::implAdjustEnabled( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbCellControl::implAdjustEnabled: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbCellControl::implAdjustEnabled: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- sal_Bool bEnable = sal_True;
- _rxModel->getPropertyValue( FM_PROP_ENABLED ) >>= bEnable;
- m_pWindow->Enable( bEnable );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::Init( Window& rParent, const Reference< XRowSet >& _rxCursor )
-{
- ImplInitWindow( rParent, InitAll );
-
- if ( m_pWindow )
- {
- // align the control
- if ( isAlignedController() )
- AlignControl( m_rColumn.GetAlignment() );
-
- try
- {
- // some other common properties
- Reference< XPropertySet > xModel( m_rColumn.getModel(), UNO_SET_THROW );
- Reference< XPropertySetInfo > xModelPSI( xModel->getPropertySetInfo(), UNO_SET_THROW );
-
- if ( xModelPSI->hasPropertyByName( FM_PROP_READONLY ) )
- {
- implAdjustReadOnly( xModel,true );
- }
-
- if ( xModelPSI->hasPropertyByName( FM_PROP_ENABLED ) )
- {
- implAdjustEnabled( xModel );
- }
-
- if ( xModelPSI->hasPropertyByName( FM_PROP_MOUSE_WHEEL_BEHAVIOR ) )
- {
- sal_Int16 nWheelBehavior = MouseWheelBehavior::SCROLL_FOCUS_ONLY;
- OSL_VERIFY( xModel->getPropertyValue( FM_PROP_MOUSE_WHEEL_BEHAVIOR ) >>= nWheelBehavior );
- sal_uInt16 nVclSetting = MOUSE_WHEEL_FOCUS_ONLY;
- switch ( nWheelBehavior )
- {
- case MouseWheelBehavior::SCROLL_DISABLED: nVclSetting = MOUSE_WHEEL_DISABLE; break;
- case MouseWheelBehavior::SCROLL_FOCUS_ONLY: nVclSetting = MOUSE_WHEEL_FOCUS_ONLY; break;
- case MouseWheelBehavior::SCROLL_ALWAYS: nVclSetting = MOUSE_WHEEL_ALWAYS; break;
- default:
- OSL_FAIL( "DbCellControl::Init: invalid MouseWheelBehavior!" );
- break;
- }
-
- AllSettings aSettings = m_pWindow->GetSettings();
- MouseSettings aMouseSettings = aSettings.GetMouseSettings();
- aMouseSettings.SetWheelBehavior( nVclSetting );
- aSettings.SetMouseSettings( aMouseSettings );
- m_pWindow->SetSettings( aSettings, sal_True );
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- m_xCursor = _rxCursor;
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::SetTextLineColor()
-{
- if (m_pWindow)
- m_pWindow->SetTextLineColor();
- if (m_pPainter)
- m_pPainter->SetTextLineColor();
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::SetTextLineColor(const Color& _rColor)
-{
- if (m_pWindow)
- m_pWindow->SetTextLineColor(_rColor);
- if (m_pPainter)
- m_pPainter->SetTextLineColor(_rColor);
-}
-
-namespace
-{
- static void lcl_implAlign( Window* _pWindow, WinBits _nAlignmentBit )
- {
- WinBits nStyle = _pWindow->GetStyle();
- nStyle &= ~(WB_LEFT | WB_RIGHT | WB_CENTER);
- _pWindow->SetStyle( nStyle | _nAlignmentBit );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::AlignControl(sal_Int16 nAlignment)
-{
- WinBits nAlignmentBit = 0;
- switch (nAlignment)
- {
- case ::com::sun::star::awt::TextAlign::RIGHT:
- nAlignmentBit = WB_RIGHT;
- break;
- case ::com::sun::star::awt::TextAlign::CENTER:
- nAlignmentBit = WB_CENTER;
- break;
- default:
- nAlignmentBit = WB_LEFT;
- break;
- }
- lcl_implAlign( m_pWindow, nAlignmentBit );
- if ( m_pPainter )
- lcl_implAlign( m_pPainter, nAlignmentBit );
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::PaintCell( OutputDevice& _rDev, const Rectangle& _rRect )
-{
- if ( m_pPainter->GetParent() == &_rDev )
- {
- m_pPainter->SetPaintTransparent( sal_True );
- m_pPainter->SetBackground( );
- m_pPainter->SetControlBackground( _rDev.GetFillColor() );
- m_pPainter->SetControlForeground( _rDev.GetTextColor() );
- m_pPainter->SetTextColor( _rDev.GetTextColor() );
- m_pPainter->SetTextFillColor( _rDev.GetTextColor() );
-
- Font aFont( _rDev.GetFont() );
- aFont.SetTransparent( sal_True );
- m_pPainter->SetFont( aFont );
-
- m_pPainter->SetPosSizePixel( _rRect.TopLeft(), _rRect.GetSize() );
- m_pPainter->Show();
- m_pPainter->Update();
- m_pPainter->SetParentUpdateMode( sal_False );
- m_pPainter->Hide();
- m_pPainter->SetParentUpdateMode( sal_True );
- }
- else
- m_pPainter->Draw( &_rDev, _rRect.TopLeft(), _rRect.GetSize(), 0 );
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::PaintFieldToCell( OutputDevice& _rDev, const Rectangle& _rRect, const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
-{
- m_pPainter->SetText( GetFormatText( _rxField, _rxFormatter ) );
- PaintCell( _rDev, _rRect );
-}
-
-//------------------------------------------------------------------------------
-double DbCellControl::GetValue(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter) const
-{
- double fValue = 0;
- if (m_rColumn.IsNumeric())
- {
- try
- {
- fValue = _rxField->getDouble();
- }
- catch(const Exception&) { }
- }
- else
- {
- sal_Bool bSuccess = sal_False;
- try
- {
- fValue = _rxField->getDouble();
- bSuccess = sal_True;
- }
- catch(const Exception&) { }
- if (!bSuccess)
- {
- try
- {
- fValue = xFormatter->convertStringToNumber(m_rColumn.GetKey(), _rxField->getString());
- }
- catch(const Exception&) { }
- }
- }
- return fValue;
-}
-
-//------------------------------------------------------------------------------
-void DbCellControl::invalidatedController()
-{
- m_rColumn.GetParent().refreshController(m_rColumn.GetId(), DbGridControl::GrantControlAccess());
-}
-
-/*************************************************************************/
-// CellModels
-/*************************************************************************/
-
-//==============================================================================
-//= DbLimitedLengthField
-//==============================================================================
-//------------------------------------------------------------------------------
-DbLimitedLengthField::DbLimitedLengthField( DbGridColumn& _rColumn )
- :DbCellControl( _rColumn )
-{
- doPropertyListening( FM_PROP_MAXTEXTLEN );
-}
-
-//------------------------------------------------------------------------------
-void DbLimitedLengthField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbLimitedLengthField::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbLimitedLengthField::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- sal_Int16 nMaxLen = 0;
- _rxModel->getPropertyValue( FM_PROP_MAXTEXTLEN ) >>= nMaxLen;
- implSetMaxTextLen( nMaxLen );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbLimitedLengthField::implSetEffectiveMaxTextLen( sal_Int16 _nMaxLen )
-{
- dynamic_cast< Edit* >( m_pWindow )->SetMaxTextLen( _nMaxLen );
- if ( m_pPainter )
- dynamic_cast< Edit* >( m_pPainter )->SetMaxTextLen( _nMaxLen );
-}
-
-//==============================================================================
-//= DbTextField
-//==============================================================================
-//------------------------------------------------------------------------------
-DbTextField::DbTextField(DbGridColumn& _rColumn)
- :DbLimitedLengthField(_rColumn)
- ,m_pEdit( NULL )
- ,m_pPainterImplementation( NULL )
- ,m_nKeyType(::com::sun::star::util::NumberFormat::TEXT)
- ,m_bIsSimpleEdit( sal_True )
-{
-}
-
-//------------------------------------------------------------------------------
-DbTextField::~DbTextField( )
-{
- DELETEZ( m_pPainterImplementation );
- DELETEZ( m_pEdit );
-}
-
-//------------------------------------------------------------------------------
-void DbTextField::Init( Window& rParent, const Reference< XRowSet >& xCursor)
-{
- sal_Int16 nAlignment = m_rColumn.SetAlignmentFromModel(-1);
-
- Reference< XPropertySet > xModel( m_rColumn.getModel() );
-
- WinBits nStyle = WB_LEFT;
- switch (nAlignment)
- {
- case awt::TextAlign::RIGHT:
- nStyle = WB_RIGHT;
- break;
-
- case awt::TextAlign::CENTER:
- nStyle = WB_CENTER;
- break;
- }
-
- // is this a multi-line field?
- sal_Bool bIsMultiLine = sal_False;
- try
- {
- if ( xModel.is() )
- {
- OSL_VERIFY( xModel->getPropertyValue( FM_PROP_MULTILINE ) >>= bIsMultiLine );
- }
- }
- catch( const Exception& )
- {
- OSL_FAIL( "DbTextField::Init: caught an exception while determining the multi-line capabilities!" );
- }
-
- m_bIsSimpleEdit = !bIsMultiLine;
- if ( bIsMultiLine )
- {
- m_pWindow = new MultiLineTextCell( &rParent, nStyle );
- m_pEdit = new MultiLineEditImplementation( *static_cast< MultiLineTextCell* >( m_pWindow ) );
-
- m_pPainter = new MultiLineTextCell( &rParent, nStyle );
- m_pPainterImplementation = new MultiLineEditImplementation( *static_cast< MultiLineTextCell* >( m_pPainter ) );
- }
- else
- {
- m_pWindow = new Edit( &rParent, nStyle );
- m_pEdit = new EditImplementation( *static_cast< Edit* >( m_pWindow ) );
-
- m_pPainter = new Edit( &rParent, nStyle );
- m_pPainterImplementation = new EditImplementation( *static_cast< Edit* >( m_pPainter ) );
- }
-
- if ( WB_LEFT == nStyle )
- {
- // this is so that when getting the focus, the selection is oriented left-to-right
- AllSettings aSettings = m_pWindow->GetSettings();
- StyleSettings aStyleSettings = aSettings.GetStyleSettings();
- aStyleSettings.SetSelectionOptions(
- aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
- aSettings.SetStyleSettings(aStyleSettings);
- m_pWindow->SetSettings(aSettings);
- }
-
- implAdjustGenericFieldSetting( xModel );
-
- if (m_rColumn.GetParent().getNumberFormatter().is() && m_rColumn.GetKey())
- m_nKeyType = comphelper::getNumberFormatType(m_rColumn.GetParent().getNumberFormatter()->getNumberFormatsSupplier()->getNumberFormats(), m_rColumn.GetKey());
-
- DbLimitedLengthField::Init( rParent, xCursor );
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbTextField::CreateController() const
-{
- return new EditCellController( m_pEdit );
-}
-
-//------------------------------------------------------------------------------
-void DbTextField::PaintFieldToCell( OutputDevice& _rDev, const Rectangle& _rRect, const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
-{
- if ( m_pPainterImplementation )
- m_pPainterImplementation->SetText( GetFormatText( _rxField, _rxFormatter, NULL ) );
-
- DbLimitedLengthField::PaintFieldToCell( _rDev, _rRect, _rxField, _rxFormatter );
-}
-
-//------------------------------------------------------------------------------
-String DbTextField::GetFormatText(const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter, Color** /*ppColor*/)
-{
- ::rtl::OUString aString;
- if ( _rxField.is() )
- try
- {
- aString = getFormattedValue( _rxField, xFormatter, m_rColumn.GetParent().getNullDate(), m_rColumn.GetKey(), m_nKeyType);
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-
- return aString;
-}
-
-//------------------------------------------------------------------------------
-void DbTextField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter)
-{
- m_pEdit->SetText( GetFormatText( _rxField, xFormatter ) );
- m_pEdit->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
-}
-
-//------------------------------------------------------------------------------
-void DbTextField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbTextField::updateFromModel: invalid call!" );
-
- ::rtl::OUString sText;
- _rxModel->getPropertyValue( FM_PROP_TEXT ) >>= sText;
-
- xub_StrLen nMaxTextLen = m_pEdit->GetMaxTextLen();
- if ( EDIT_NOLIMIT != nMaxTextLen && sText.getLength() > nMaxTextLen )
- {
- sal_Int32 nDiff = sText.getLength() - nMaxTextLen;
- sText = sText.replaceAt(sText.getLength() - nDiff,nDiff,::rtl::OUString());
- }
-
-
- m_pEdit->SetText( sText );
- m_pEdit->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbTextField::commitControl()
-{
- ::rtl::OUString aText( m_pEdit->GetText( getModelLineEndSetting( m_rColumn.getModel() ) ) );
- // we have to check if the length before we can decide if the value was modified
- xub_StrLen nMaxTextLen = m_pEdit->GetMaxTextLen();
- if ( EDIT_NOLIMIT != nMaxTextLen )
- {
- ::rtl::OUString sOldValue;
- m_rColumn.getModel()->getPropertyValue( FM_PROP_TEXT ) >>= sOldValue;
- // if the new value didn't change we must set the old long value again
- if ( sOldValue.getLength() > nMaxTextLen && sOldValue.compareTo(aText,nMaxTextLen) == 0 )
- aText = sOldValue;
- }
- m_rColumn.getModel()->setPropertyValue( FM_PROP_TEXT, makeAny( aText ) );
- return sal_True;
-}
-
-//------------------------------------------------------------------------------
-void DbTextField::implSetEffectiveMaxTextLen( sal_Int16 _nMaxLen )
-{
- if ( m_pEdit )
- m_pEdit->SetMaxTextLen( _nMaxLen );
- if ( m_pPainterImplementation )
- m_pPainterImplementation->SetMaxTextLen( _nMaxLen );
-}
-
-//==============================================================================
-//= DbFormattedField
-//==============================================================================
-DBG_NAME(DbFormattedField);
-//------------------------------------------------------------------------------
-DbFormattedField::DbFormattedField(DbGridColumn& _rColumn)
- :DbLimitedLengthField(_rColumn)
- ,m_nKeyType(::com::sun::star::util::NumberFormat::UNDEFINED)
-{
- DBG_CTOR(DbFormattedField,NULL);
-
- // if our model's format key changes we want to propagate the new value to our windows
- doPropertyListening( FM_PROP_FORMATKEY );
-}
-
-//------------------------------------------------------------------------------
-DbFormattedField::~DbFormattedField()
-{
- DBG_DTOR(DbFormattedField,NULL);
-}
-
-//------------------------------------------------------------------------------
-void DbFormattedField::Init( Window& rParent, const Reference< XRowSet >& xCursor)
-{
- sal_Int16 nAlignment = m_rColumn.SetAlignmentFromModel(-1);
-
- Reference< ::com::sun::star::beans::XPropertySet > xUnoModel = m_rColumn.getModel();
-
- switch (nAlignment)
- {
- case ::com::sun::star::awt::TextAlign::RIGHT:
- m_pWindow = new FormattedField( &rParent, WB_RIGHT );
- m_pPainter = new FormattedField( &rParent, WB_RIGHT );
- break;
-
- case ::com::sun::star::awt::TextAlign::CENTER:
- m_pWindow = new FormattedField( &rParent, WB_CENTER );
- m_pPainter = new FormattedField( &rParent, WB_CENTER );
- break;
- default:
- m_pWindow = new FormattedField( &rParent, WB_LEFT );
- m_pPainter = new FormattedField( &rParent, WB_LEFT );
-
- // Alles nur damit die Selektion bei Focuserhalt von rechts nach links geht
- AllSettings aSettings = m_pWindow->GetSettings();
- StyleSettings aStyleSettings = aSettings.GetStyleSettings();
- aStyleSettings.SetSelectionOptions(
- aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
- aSettings.SetStyleSettings(aStyleSettings);
- m_pWindow->SetSettings(aSettings);
- }
-
- implAdjustGenericFieldSetting( xUnoModel );
-
- static_cast< FormattedField* >( m_pWindow )->SetStrictFormat( sal_False );
- static_cast< FormattedField* >( m_pPainter )->SetStrictFormat( sal_False );
- // wenn man _irgendeine_ Formatierung zulaesst, kann man da sowieso keine Eingabe-Ueberpruefung
- // machen (das FormattedField unterstuetzt das sowieso nicht, nur abgeleitete Klassen)
-
- // von dem Uno-Model den Formatter besorgen
- // (Ich koennte theoretisch auch ueber den ::com::sun::star::util::NumberFormatter gehen, den mir der Cursor bestimmt
- // liefern wuerde. Das Problem dabei ist, dass ich mich eigentlich nicht darauf verlassen
- // kann, dass die beiden Formatter die selben sind, sauber ist das Ganze, wenn ich ueber das
- // UNO-Model gehe.)
- sal_Int32 nFormatKey = -1;
-
- // mal sehen, ob das Model einen hat ...
- DBG_ASSERT(::comphelper::hasProperty(FM_PROP_FORMATSSUPPLIER, xUnoModel), "DbFormattedField::Init : invalid UNO model !");
- Any aSupplier( xUnoModel->getPropertyValue(FM_PROP_FORMATSSUPPLIER));
- if (aSupplier.hasValue())
- {
- ::cppu::extractInterface(m_xSupplier, aSupplier);
- if (m_xSupplier.is())
- {
- // wenn wir den Supplier vom Model nehmen, dann auch den Key
- Any aFmtKey( xUnoModel->getPropertyValue(FM_PROP_FORMATKEY));
- if (aFmtKey.hasValue())
- {
- DBG_ASSERT(aFmtKey.getValueType().getTypeClass() == TypeClass_LONG, "DbFormattedField::Init : invalid format key property (no sal_Int32) !");
- nFormatKey = ::comphelper::getINT32(aFmtKey);
- }
- else
- {
- DBG_WARNING("DbFormattedField::Init : my uno-model has no format-key, but a formats supplier !");
- // the OFormattedModel which we usually are working with ensures that the model has a format key
- // as soon as the form is loaded. Unfortunally this method here is called from within loaded, too.
- // So if our LoadListener is called before the LoadListener of the model, this "else case" is
- // allowed.
- // Of course our property listener for the FormatKey property will notify us if the prop is changed,
- // so this here isn't really bad ....
- nFormatKey = 0;
- }
- }
- }
-
- // nein ? vielleicht die ::com::sun::star::form::component::Form hinter dem Cursor ?
- if (!m_xSupplier.is())
- {
- Reference< XRowSet > xCursorForm(xCursor, UNO_QUERY);
- if (xCursorForm.is())
- { // wenn wir vom Cursor den Formatter nehmen, dann auch den Key vom Feld, an das wir gebunden sind
- m_xSupplier = getNumberFormats(getRowSetConnection(xCursorForm), sal_False);
-
- if (m_rColumn.GetField().is())
- nFormatKey = ::comphelper::getINT32(m_rColumn.GetField()->getPropertyValue(FM_PROP_FORMATKEY));
- }
- }
-
- SvNumberFormatter* pFormatterUsed = NULL;
- if (m_xSupplier.is())
- {
- SvNumberFormatsSupplierObj* pImplmentation = SvNumberFormatsSupplierObj::getImplementation(m_xSupplier);
- if (pImplmentation)
- pFormatterUsed = pImplmentation->GetNumberFormatter();
- else
- // alles hingfaellig : der Supplier ist vom falschen Typ, dann koennen wir uns auch nicht darauf verlassen, dass
- // ein Standard-Formatter den (eventuell nicht-Standard-)Key kennt.
- nFormatKey = -1;
- }
-
- // einen Standard-Formatter ...
- if (pFormatterUsed == NULL)
- {
- pFormatterUsed = ((FormattedField*)m_pWindow)->StandardFormatter();
- DBG_ASSERT(pFormatterUsed != NULL, "DbFormattedField::Init : no standard formatter given by the numeric field !");
- }
- // ... und einen Standard-Key
- if (nFormatKey == -1)
- nFormatKey = 0;
-
- m_nKeyType = comphelper::getNumberFormatType(m_xSupplier->getNumberFormats(), nFormatKey);
-
- ((FormattedField*)m_pWindow)->SetFormatter(pFormatterUsed);
- ((FormattedField*)m_pPainter)->SetFormatter(pFormatterUsed);
-
- ((FormattedField*)m_pWindow)->SetFormatKey(nFormatKey);
- ((FormattedField*)m_pPainter)->SetFormatKey(nFormatKey);
-
- ((FormattedField*)m_pWindow)->TreatAsNumber(m_rColumn.IsNumeric());
- ((FormattedField*)m_pPainter)->TreatAsNumber(m_rColumn.IsNumeric());
-
- // Min- und Max-Werte
- if (m_rColumn.IsNumeric())
- {
- sal_Bool bClearMin = sal_True;
- if (::comphelper::hasProperty(FM_PROP_EFFECTIVE_MIN, xUnoModel))
- {
- Any aMin( xUnoModel->getPropertyValue(FM_PROP_EFFECTIVE_MIN));
- if (aMin.getValueType().getTypeClass() != TypeClass_VOID)
- {
- DBG_ASSERT(aMin.getValueType().getTypeClass() == TypeClass_DOUBLE, "DbFormattedField::Init : the model has an invalid min value !");
- double dMin = ::comphelper::getDouble(aMin);
- ((FormattedField*)m_pWindow)->SetMinValue(dMin);
- ((FormattedField*)m_pPainter)->SetMinValue(dMin);
- bClearMin = sal_False;
- }
- }
- if (bClearMin)
- {
- ((FormattedField*)m_pWindow)->ClearMinValue();
- ((FormattedField*)m_pPainter)->ClearMinValue();
- }
- sal_Bool bClearMax = sal_True;
- if (::comphelper::hasProperty(FM_PROP_EFFECTIVE_MAX, xUnoModel))
- {
- Any aMin( xUnoModel->getPropertyValue(FM_PROP_EFFECTIVE_MAX));
- if (aMin.getValueType().getTypeClass() != TypeClass_VOID)
- {
- DBG_ASSERT(aMin.getValueType().getTypeClass() == TypeClass_DOUBLE, "DbFormattedField::Init : the model has an invalid max value !");
- double dMin = ::comphelper::getDouble(aMin);
- ((FormattedField*)m_pWindow)->SetMaxValue(dMin);
- ((FormattedField*)m_pPainter)->SetMaxValue(dMin);
- bClearMax = sal_False;
- }
- }
- if (bClearMax)
- {
- ((FormattedField*)m_pWindow)->ClearMaxValue();
- ((FormattedField*)m_pPainter)->ClearMaxValue();
- }
- }
-
- // den Default-Wert
- Any aDefault( xUnoModel->getPropertyValue(FM_PROP_EFFECTIVE_DEFAULT));
- if (aDefault.hasValue())
- { // das Ding kann ein double oder ein String sein
- switch (aDefault.getValueType().getTypeClass())
- {
- case TypeClass_DOUBLE:
- if (m_rColumn.IsNumeric())
- {
- ((FormattedField*)m_pWindow)->SetDefaultValue(::comphelper::getDouble(aDefault));
- ((FormattedField*)m_pPainter)->SetDefaultValue(::comphelper::getDouble(aDefault));
- }
- else
- {
- String sConverted;
- Color* pDummy;
- pFormatterUsed->GetOutputString(::comphelper::getDouble(aDefault), 0, sConverted, &pDummy);
- ((FormattedField*)m_pWindow)->SetDefaultText(sConverted);
- ((FormattedField*)m_pPainter)->SetDefaultText(sConverted);
- }
- break;
- case TypeClass_STRING:
- {
- String sDefault( ::comphelper::getString(aDefault) );
- if (m_rColumn.IsNumeric())
- {
- double dVal;
- sal_uInt32 nTestFormat(0);
- if (pFormatterUsed->IsNumberFormat(sDefault, nTestFormat, dVal))
- {
- ((FormattedField*)m_pWindow)->SetDefaultValue(dVal);
- ((FormattedField*)m_pPainter)->SetDefaultValue(dVal);
- }
- }
- else
- {
- ((FormattedField*)m_pWindow)->SetDefaultText(sDefault);
- ((FormattedField*)m_pPainter)->SetDefaultText(sDefault);
- }
- }
- default:
- OSL_FAIL( "DbFormattedField::Init: unexpected value type!" );
- break;
- }
- }
- DbLimitedLengthField::Init( rParent, xCursor );
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbFormattedField::CreateController() const
-{
- return new ::svt::FormattedFieldCellController( static_cast< FormattedField* >( m_pWindow ) );
-}
-
-//------------------------------------------------------------------------------
-void DbFormattedField::_propertyChanged( const PropertyChangeEvent& _rEvent ) throw( RuntimeException )
-{
- if (_rEvent.PropertyName.compareTo(FM_PROP_FORMATKEY) == COMPARE_EQUAL)
- {
- sal_Int32 nNewKey = _rEvent.NewValue.hasValue() ? ::comphelper::getINT32(_rEvent.NewValue) : 0;
- m_nKeyType = comphelper::getNumberFormatType(m_xSupplier->getNumberFormats(), nNewKey);
-
- DBG_ASSERT(m_pWindow && m_pPainter, "DbFormattedField::_propertyChanged : where are my windows ?");
- if (m_pWindow)
- static_cast< FormattedField* >( m_pWindow )->SetFormatKey( nNewKey );
- if (m_pPainter)
- static_cast< FormattedField* >( m_pPainter )->SetFormatKey( nNewKey );
- }
- else
- {
- DbLimitedLengthField::_propertyChanged( _rEvent );
- }
-}
-
-//------------------------------------------------------------------------------
-String DbFormattedField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/, Color** ppColor)
-{
- // defaultmaessig keine Farb-Angabe
- if (ppColor != NULL)
- *ppColor = NULL;
-
- // NULL-Wert -> leerer Text
- if (!_rxField.is())
- return String();
-
- String aText;
- try
- {
- if (m_rColumn.IsNumeric())
- {
- // das IsNumeric an der Column sagt nichts aus ueber die Klasse des benutzen Formates, sondern
- // ueber die des an die Column gebundenen Feldes. Wenn man also eine FormattedField-Spalte an
- // ein double-Feld bindet und als Text formatiert, liefert m_rColumn.IsNumeric() sal_True. Das heisst
- // also einfach, dass ich den Inhalt der Variant mittels getDouble abfragen kann, und dann kann
- // ich den Rest (die Formatierung) dem FormattedField ueberlassen.
- double dValue = getValue( _rxField, m_rColumn.GetParent().getNullDate() );
- if (_rxField->wasNull())
- return aText;
- ((FormattedField*)m_pPainter)->SetValue(dValue);
- }
- else
- {
- // Hier kann ich nicht mit einem double arbeiten, da das Feld mir keines liefern kann.
- // Also einfach den Text vom ::com::sun::star::util::NumberFormatter in die richtige ::com::sun::star::form::component::Form brinden lassen.
- aText = (const sal_Unicode*)_rxField->getString();
- if (_rxField->wasNull())
- return aText;
- ((FormattedField*)m_pPainter)->SetTextFormatted(aText);
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-
- aText = m_pPainter->GetText();
- if (ppColor != NULL)
- *ppColor = ((FormattedField*)m_pPainter)->GetLastOutputColor();
-
- return aText;
-}
-
-//------------------------------------------------------------------------------
-void DbFormattedField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
-{
- try
- {
- FormattedField* pFormattedWindow = static_cast<FormattedField*>(m_pWindow);
- if (!_rxField.is())
- { // NULL-Wert -> leerer Text
- m_pWindow->SetText(String());
- }
- else if (m_rColumn.IsNumeric())
- {
- // das IsNumeric an der Column sagt nichts aus ueber die Klasse des benutzen Formates, sondern
- // ueber die des an die Column gebundenen Feldes. Wenn man also eine FormattedField-Spalte an
- // ein double-Feld bindet und als Text formatiert, liefert m_rColumn.IsNumeric() sal_True. Das heisst
- // also einfach, dass ich den Inhalt der Variant mittels getDouble abfragen kann, und dann kann
- // ich den Rest (die Formatierung) dem FormattedField ueberlassen.
- double dValue = getValue( _rxField, m_rColumn.GetParent().getNullDate() );
- if (_rxField->wasNull())
- m_pWindow->SetText(String());
- else
- pFormattedWindow->SetValue(dValue);
- }
- else
- {
- // Hier kann ich nicht mit einem double arbeiten, da das Feld mir keines liefern kann.
- // Also einfach den Text vom ::com::sun::star::util::NumberFormatter in die richtige ::com::sun::star::form::component::Form brinden lassen.
- String sText( _rxField->getString());
-
- pFormattedWindow->SetTextFormatted( sText );
- pFormattedWindow->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-}
-
-//------------------------------------------------------------------------------
-void DbFormattedField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbFormattedField::updateFromModel: invalid call!" );
-
- FormattedField* pFormattedWindow = static_cast< FormattedField* >( m_pWindow );
-
- ::rtl::OUString sText;
- Any aValue = _rxModel->getPropertyValue( FM_PROP_EFFECTIVE_VALUE );
- if ( aValue >>= sText )
- { // our effective value is transfered as string
- pFormattedWindow->SetTextFormatted( sText );
- pFormattedWindow->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
- }
- else
- {
- double dValue = 0;
- aValue >>= dValue;
- pFormattedWindow->SetValue(dValue);
- }
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbFormattedField::commitControl()
-{
- Any aNewVal;
- FormattedField& rField = *(FormattedField*)m_pWindow;
- DBG_ASSERT(&rField == m_pWindow, "DbFormattedField::commitControl : can't work with a window other than my own !");
- if (m_rColumn.IsNumeric())
- {
- if (rField.GetText().Len() != 0)
- aNewVal <<= rField.GetValue();
- // ein LeerString wird erst mal standardmaessig als void weitergereicht
- }
- else
- aNewVal <<= ::rtl::OUString(rField.GetTextValue());
-
- m_rColumn.getModel()->setPropertyValue(FM_PROP_EFFECTIVE_VALUE, aNewVal);
- return sal_True;
-}
-
-//==============================================================================
-//= DbCheckBox
-//==============================================================================
-//------------------------------------------------------------------------------
-DbCheckBox::DbCheckBox( DbGridColumn& _rColumn )
- :DbCellControl( _rColumn, sal_True )
-{
- setAlignedController( sal_False );
-}
-
-namespace
-{
- void setCheckBoxStyle( Window* _pWindow, bool bMono )
- {
- AllSettings aSettings = _pWindow->GetSettings();
- StyleSettings aStyleSettings = aSettings.GetStyleSettings();
- if( bMono )
- aStyleSettings.SetOptions( aStyleSettings.GetOptions() | STYLE_OPTION_MONO );
- else
- aStyleSettings.SetOptions( aStyleSettings.GetOptions() & (~STYLE_OPTION_MONO) );
- aSettings.SetStyleSettings( aStyleSettings );
- _pWindow->SetSettings( aSettings );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbCheckBox::Init( Window& rParent, const Reference< XRowSet >& xCursor )
-{
- setTransparent( sal_True );
-
- m_pWindow = new CheckBoxControl( &rParent );
- m_pPainter = new CheckBoxControl( &rParent );
-
- m_pWindow->SetPaintTransparent( sal_True );
- m_pPainter->SetPaintTransparent( sal_True );
-
- m_pPainter->SetBackground();
-
- try
- {
- Reference< XPropertySet > xModel( m_rColumn.getModel(), UNO_SET_THROW );
-
- sal_Int16 nStyle = awt::VisualEffect::LOOK3D;
- OSL_VERIFY( xModel->getPropertyValue( FM_PROP_VISUALEFFECT ) >>= nStyle );
-
- setCheckBoxStyle( m_pWindow, nStyle == awt::VisualEffect::FLAT );
- setCheckBoxStyle( m_pPainter, nStyle == awt::VisualEffect::FLAT );
-
- sal_Bool bTristate = sal_True;
- OSL_VERIFY( xModel->getPropertyValue( FM_PROP_TRISTATE ) >>= bTristate );
- static_cast< CheckBoxControl* >( m_pWindow )->GetBox().EnableTriState( bTristate );
- static_cast< CheckBoxControl* >( m_pPainter )->GetBox().EnableTriState( bTristate );
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
-
- DbCellControl::Init( rParent, xCursor );
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbCheckBox::CreateController() const
-{
- return new CheckBoxCellController((CheckBoxControl*)m_pWindow);
-}
-//------------------------------------------------------------------------------
-static void lcl_setCheckBoxState( const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
- CheckBoxControl* _pCheckBoxControl )
-{
- TriState eState = STATE_DONTKNOW;
- if (_rxField.is())
- {
- try
- {
- sal_Bool bValue = _rxField->getBoolean();
- if (!_rxField->wasNull())
- eState = bValue ? STATE_CHECK : STATE_NOCHECK;
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- _pCheckBoxControl->GetBox().SetState(eState);
-}
-
-//------------------------------------------------------------------------------
-void DbCheckBox::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
-{
- lcl_setCheckBoxState( _rxField, static_cast<CheckBoxControl*>(m_pWindow) );
-}
-
-//------------------------------------------------------------------------------
-void DbCheckBox::PaintFieldToCell(OutputDevice& rDev, const Rectangle& rRect,
- const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
- const Reference< XNumberFormatter >& xFormatter)
-{
- lcl_setCheckBoxState( _rxField, static_cast<CheckBoxControl*>(m_pPainter) );
- DbCellControl::PaintFieldToCell( rDev, rRect, _rxField, xFormatter );
-}
-
-//------------------------------------------------------------------------------
-void DbCheckBox::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbCheckBox::updateFromModel: invalid call!" );
-
- sal_Int16 nState = STATE_DONTKNOW;
- _rxModel->getPropertyValue( FM_PROP_STATE ) >>= nState;
- static_cast< CheckBoxControl* >( m_pWindow )->GetBox().SetState( static_cast< TriState >( nState ) );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbCheckBox::commitControl()
-{
-#if OSL_DEBUG_LEVEL > 0
- Any aVal = makeAny( (sal_Int16)( static_cast< CheckBoxControl* >( m_pWindow )->GetBox().GetState() ) );
-#endif
- m_rColumn.getModel()->setPropertyValue( FM_PROP_STATE,
- makeAny( (sal_Int16)( static_cast< CheckBoxControl* >( m_pWindow )->GetBox().GetState() ) ) );
- return sal_True;
-}
-
-//------------------------------------------------------------------------------
-XubString DbCheckBox::GetFormatText(const Reference< XColumn >& /*_rxField*/, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
-{
- return XubString();
-}
-
-//==============================================================================
-//= DbPatternField
-//------------------------------------------------------------------------------
-DbPatternField::DbPatternField( DbGridColumn& _rColumn, const ::comphelper::ComponentContext& _rContext )
- :DbCellControl( _rColumn )
- ,m_aContext( _rContext )
-{
- doPropertyListening( FM_PROP_LITERALMASK );
- doPropertyListening( FM_PROP_EDITMASK );
- doPropertyListening( FM_PROP_STRICTFORMAT );
-}
-
-//------------------------------------------------------------------------------
-void DbPatternField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbPatternField::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbPatternField::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- ::rtl::OUString aLitMask;
- ::rtl::OUString aEditMask;
- sal_Bool bStrict = sal_False;
-
- _rxModel->getPropertyValue( FM_PROP_LITERALMASK ) >>= aLitMask;
- _rxModel->getPropertyValue( FM_PROP_EDITMASK ) >>= aEditMask;
- _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) >>= bStrict;
-
- ByteString aAsciiEditMask( aEditMask.getStr(), RTL_TEXTENCODING_ASCII_US );
-
- static_cast< PatternField* >( m_pWindow )->SetMask( aAsciiEditMask, aLitMask );
- static_cast< PatternField* >( m_pPainter )->SetMask( aAsciiEditMask, aLitMask );
- static_cast< PatternField* >( m_pWindow )->SetStrictFormat( bStrict );
- static_cast< PatternField* >( m_pPainter )->SetStrictFormat( bStrict );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbPatternField::Init( Window& rParent, const Reference< XRowSet >& xCursor)
-{
- m_rColumn.SetAlignmentFromModel(-1);
-
- m_pWindow = new PatternField( &rParent, 0 );
- m_pPainter= new PatternField( &rParent, 0 );
-
- Reference< XPropertySet > xModel( m_rColumn.getModel() );
- implAdjustGenericFieldSetting( xModel );
-
- DbCellControl::Init( rParent, xCursor );
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbPatternField::CreateController() const
-{
- return new SpinCellController( static_cast< PatternField* >( m_pWindow ) );
-}
-
-//------------------------------------------------------------------------------
-String DbPatternField::impl_formatText( const String& _rText )
-{
- m_pPainter->SetText( _rText );
- static_cast< PatternField* >( m_pPainter )->ReformatAll();
- return m_pPainter->GetText();
-}
-
-//------------------------------------------------------------------------------
-String DbPatternField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
-{
- bool bIsForPaint = _rxField != m_rColumn.GetField();
- ::std::auto_ptr< ::dbtools::FormattedColumnValue >& rpFormatter = bIsForPaint ? m_pPaintFormatter : m_pValueFormatter;
-
- if ( !rpFormatter.get() )
- {
- DBToolsObjectFactory aFactory;
- rpFormatter = aFactory.createFormattedColumnValue(
- m_aContext, getCursor(), Reference< XPropertySet >( _rxField, UNO_QUERY ) );
- OSL_ENSURE( rpFormatter.get(), "DbPatternField::Init: no value formatter!" );
- }
- else
- OSL_ENSURE( rpFormatter->getColumn() == _rxField, "DbPatternField::GetFormatText: my value formatter is working for another field ...!" );
- // re-creating the value formatter here everytime would be quite expensive ...
-
- String sText;
- if ( rpFormatter.get() )
- sText = rpFormatter->getFormattedValue();
-
- return impl_formatText( sText );
-}
-
-//------------------------------------------------------------------------------
-void DbPatternField::UpdateFromField( const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
-{
- static_cast< Edit* >( m_pWindow )->SetText( GetFormatText( _rxField, _rxFormatter ) );
- static_cast< Edit* >( m_pWindow )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
-}
-
-//------------------------------------------------------------------------------
-void DbPatternField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbPatternField::updateFromModel: invalid call!" );
-
- ::rtl::OUString sText;
- _rxModel->getPropertyValue( FM_PROP_TEXT ) >>= sText;
-
- static_cast< Edit* >( m_pWindow )->SetText( impl_formatText( sText ) );
- static_cast< Edit* >( m_pWindow )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbPatternField::commitControl()
-{
- String aText(m_pWindow->GetText());
- m_rColumn.getModel()->setPropertyValue(FM_PROP_TEXT, makeAny(::rtl::OUString(aText)));
- return sal_True;
-}
-
-//==============================================================================
-//= DbSpinField
-//==============================================================================
-//------------------------------------------------------------------------------
-DbSpinField::DbSpinField( DbGridColumn& _rColumn, sal_Int16 _nStandardAlign )
- :DbCellControl( _rColumn )
- ,m_nStandardAlign( _nStandardAlign )
-{
-}
-
-//------------------------------------------------------------------------------
-void DbSpinField::Init( Window& _rParent, const Reference< XRowSet >& _rxCursor )
-{
- m_rColumn.SetAlignmentFromModel( m_nStandardAlign );
-
- Reference< XPropertySet > xModel( m_rColumn.getModel() );
-
- // determine the WinBits for the field
- WinBits nFieldStyle = 0;
- if ( ::comphelper::getBOOL( xModel->getPropertyValue( FM_PROP_SPIN ) ) )
- nFieldStyle = WB_REPEAT | WB_SPIN;
- // create the fields
- m_pWindow = createField( &_rParent, nFieldStyle, xModel );
- m_pPainter = createField( &_rParent, nFieldStyle, xModel );
-
- // adjust all other settings which depend on the property values
- implAdjustGenericFieldSetting( xModel );
-
- // call the base class
- DbCellControl::Init( _rParent, _rxCursor );
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbSpinField::CreateController() const
-{
- return new SpinCellController( static_cast< SpinField* >( m_pWindow ) );
-}
-
-//==============================================================================
-//= DbNumericField
-//==============================================================================
-//------------------------------------------------------------------------------
-DbNumericField::DbNumericField( DbGridColumn& _rColumn )
- :DbSpinField( _rColumn )
-{
- doPropertyListening( FM_PROP_DECIMAL_ACCURACY );
- doPropertyListening( FM_PROP_VALUEMIN );
- doPropertyListening( FM_PROP_VALUEMAX );
- doPropertyListening( FM_PROP_VALUESTEP );
- doPropertyListening( FM_PROP_STRICTFORMAT );
- doPropertyListening( FM_PROP_SHOWTHOUSANDSEP );
-}
-
-//------------------------------------------------------------------------------
-void DbNumericField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbNumericField::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbNumericField::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- sal_Int32 nMin = (sal_Int32)getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMIN ) );
- sal_Int32 nMax = (sal_Int32)getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMAX ) );
- sal_Int32 nStep = (sal_Int32)getDouble( _rxModel->getPropertyValue( FM_PROP_VALUESTEP ) );
- sal_Bool bStrict = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
- sal_Int16 nScale = getINT16( _rxModel->getPropertyValue( FM_PROP_DECIMAL_ACCURACY ) );
- sal_Bool bThousand = getBOOL( _rxModel->getPropertyValue( FM_PROP_SHOWTHOUSANDSEP ) );
-
- static_cast< DoubleNumericField* >( m_pWindow )->SetMinValue(nMin);
- static_cast< DoubleNumericField* >( m_pWindow )->SetMaxValue(nMax);
- static_cast< DoubleNumericField* >( m_pWindow )->SetSpinSize(nStep);
- static_cast< DoubleNumericField* >( m_pWindow )->SetStrictFormat(bStrict);
-
- static_cast< DoubleNumericField* >( m_pPainter )->SetMinValue(nMin);
- static_cast< DoubleNumericField* >( m_pPainter )->SetMaxValue(nMax);
- static_cast< DoubleNumericField* >( m_pPainter )->SetStrictFormat(bStrict);
-
-
- // dem Field und dem Painter einen Formatter spendieren
- // zuerst testen, ob ich von dem Service hinter einer Connection bekommen kann
- Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier;
- Reference< XRowSet > xForm;
- if ( m_rColumn.GetParent().getDataSource() )
- xForm = Reference< XRowSet >( ( Reference< XInterface > )*m_rColumn.GetParent().getDataSource(), UNO_QUERY );
- if ( xForm.is() )
- xSupplier = getNumberFormats( getRowSetConnection( xForm ), sal_True );
- SvNumberFormatter* pFormatterUsed = NULL;
- if ( xSupplier.is() )
- {
- SvNumberFormatsSupplierObj* pImplmentation = SvNumberFormatsSupplierObj::getImplementation( xSupplier );
- pFormatterUsed = pImplmentation ? pImplmentation->GetNumberFormatter() : NULL;
- }
- if ( NULL == pFormatterUsed )
- { // der Cursor fuehrte nicht zum Erfolg -> Standard
- pFormatterUsed = static_cast< DoubleNumericField* >( m_pWindow )->StandardFormatter();
- DBG_ASSERT( pFormatterUsed != NULL, "DbNumericField::implAdjustGenericFieldSetting: no standard formatter given by the numeric field !" );
- }
- static_cast< DoubleNumericField* >( m_pWindow )->SetFormatter( pFormatterUsed );
- static_cast< DoubleNumericField* >( m_pPainter )->SetFormatter( pFormatterUsed );
-
- // und dann ein Format generieren, dass die gewuenschten Nachkommastellen usw. hat
- String sFormatString;
- LanguageType aAppLanguage = Application::GetSettings().GetUILanguage();
- pFormatterUsed->GenerateFormat( sFormatString, 0, aAppLanguage, bThousand, sal_False, nScale );
-
- static_cast< DoubleNumericField* >( m_pWindow )->SetFormat( sFormatString, aAppLanguage );
- static_cast< DoubleNumericField* >( m_pPainter )->SetFormat( sFormatString, aAppLanguage );
- }
-}
-
-//------------------------------------------------------------------------------
-SpinField* DbNumericField::createField( Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& /*_rxModel*/ )
-{
- return new DoubleNumericField( _pParent, _nFieldStyle );
-}
-
-namespace
-{
- //--------------------------------------------------------------------------
- static String lcl_setFormattedNumeric_nothrow( DoubleNumericField& _rField, const DbCellControl& _rControl,
- const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
- {
- String sValue;
- if ( _rxField.is() )
- {
- try
- {
- double fValue = _rControl.GetValue( _rxField, _rxFormatter );
- if ( !_rxField->wasNull() )
- {
- _rField.SetValue( fValue );
- sValue = _rField.GetText();
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- return sValue;
- }
-}
-
-//------------------------------------------------------------------------------
-String DbNumericField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, Color** /*ppColor*/)
-{
- return lcl_setFormattedNumeric_nothrow( *dynamic_cast< DoubleNumericField* >( m_pPainter ), *this, _rxField, _rxFormatter );
-}
-
-//------------------------------------------------------------------------------
-void DbNumericField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter)
-{
- lcl_setFormattedNumeric_nothrow( *dynamic_cast< DoubleNumericField* >( m_pWindow ), *this, _rxField, _rxFormatter );
-}
-
-//------------------------------------------------------------------------------
-void DbNumericField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbNumericField::updateFromModel: invalid call!" );
-
- double dValue = 0;
- if ( _rxModel->getPropertyValue( FM_PROP_VALUE ) >>= dValue )
- static_cast< DoubleNumericField* >( m_pWindow )->SetValue( dValue );
- else
- m_pWindow->SetText( String() );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbNumericField::commitControl()
-{
- String aText( m_pWindow->GetText());
- Any aVal;
-
- if (aText.Len() != 0) // nicht null
- {
- double fValue = ((DoubleNumericField*)m_pWindow)->GetValue();
- aVal <<= (double)fValue;
- }
- m_rColumn.getModel()->setPropertyValue(FM_PROP_VALUE, aVal);
- return sal_True;
-}
-
-//==============================================================================
-//= DbCurrencyField
-//==============================================================================
-//------------------------------------------------------------------------------
-DbCurrencyField::DbCurrencyField(DbGridColumn& _rColumn)
- :DbSpinField( _rColumn )
- ,m_nScale( 0 )
-{
- doPropertyListening( FM_PROP_DECIMAL_ACCURACY );
- doPropertyListening( FM_PROP_VALUEMIN );
- doPropertyListening( FM_PROP_VALUEMAX );
- doPropertyListening( FM_PROP_VALUESTEP );
- doPropertyListening( FM_PROP_STRICTFORMAT );
- doPropertyListening( FM_PROP_SHOWTHOUSANDSEP );
- doPropertyListening( FM_PROP_CURRENCYSYMBOL );
-}
-
-//------------------------------------------------------------------------------
-void DbCurrencyField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbCurrencyField::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbCurrencyField::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- m_nScale = getINT16( _rxModel->getPropertyValue( FM_PROP_DECIMAL_ACCURACY ) );
- double nMin = getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMIN ) );
- double nMax = getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMAX ) );
- double nStep = getDouble( _rxModel->getPropertyValue( FM_PROP_VALUESTEP ) );
- sal_Bool bStrict = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
- sal_Bool bThousand = getBOOL( _rxModel->getPropertyValue( FM_PROP_SHOWTHOUSANDSEP ) );
- ::rtl::OUString aStr( getString( _rxModel->getPropertyValue(FM_PROP_CURRENCYSYMBOL ) ) );
-
- static_cast< LongCurrencyField* >( m_pWindow )->SetUseThousandSep( bThousand );
- static_cast< LongCurrencyField* >( m_pWindow )->SetDecimalDigits( m_nScale );
- static_cast< LongCurrencyField* >( m_pWindow )->SetCurrencySymbol( aStr );
- static_cast< LongCurrencyField* >( m_pWindow )->SetFirst( nMin );
- static_cast< LongCurrencyField* >( m_pWindow )->SetLast( nMax );
- static_cast< LongCurrencyField* >( m_pWindow )->SetMin( nMin );
- static_cast< LongCurrencyField* >( m_pWindow )->SetMax( nMax );
- static_cast< LongCurrencyField* >( m_pWindow )->SetSpinSize( nStep );
- static_cast< LongCurrencyField* >( m_pWindow )->SetStrictFormat( bStrict );
-
- static_cast< LongCurrencyField* >( m_pPainter )->SetUseThousandSep( bThousand );
- static_cast< LongCurrencyField* >( m_pPainter )->SetDecimalDigits( m_nScale );
- static_cast< LongCurrencyField* >( m_pPainter )->SetCurrencySymbol( aStr );
- static_cast< LongCurrencyField* >( m_pPainter )->SetFirst( nMin );
- static_cast< LongCurrencyField* >( m_pPainter )->SetLast( nMax );
- static_cast< LongCurrencyField* >( m_pPainter )->SetMin( nMin );
- static_cast< LongCurrencyField* >( m_pPainter )->SetMax( nMax );
- static_cast< LongCurrencyField* >( m_pPainter )->SetStrictFormat( bStrict );
- }
-}
-
-//------------------------------------------------------------------------------
-SpinField* DbCurrencyField::createField( Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& /*_rxModel*/ )
-{
- return new LongCurrencyField( _pParent, _nFieldStyle );
-}
-
-//------------------------------------------------------------------------------
-double DbCurrencyField::GetCurrency(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter) const
-{
- double fValue = GetValue(_rxField, xFormatter);
- if (m_nScale)
- {
- // OSL_TRACE("double = %.64f ",fValue);
- fValue = ::rtl::math::pow10Exp(fValue, m_nScale);
- fValue = ::rtl::math::round(fValue, 0);
- }
- return fValue;
-}
-
-namespace
-{
- //--------------------------------------------------------------------------
- static String lcl_setFormattedCurrency_nothrow( LongCurrencyField& _rField, const DbCurrencyField& _rControl,
- const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
- {
- String sValue;
- if ( _rxField.is() )
- {
- try
- {
- double fValue = _rControl.GetCurrency( _rxField, _rxFormatter );
- if ( !_rxField->wasNull() )
- {
- _rField.SetValue( fValue );
- BigInt aValue = _rField.GetCorrectedValue();
- sValue = aValue.GetString();
- sValue = _rField.GetText();
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- return sValue;
- }
-}
-
-//------------------------------------------------------------------------------
-String DbCurrencyField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, Color** /*ppColor*/)
-{
- return lcl_setFormattedCurrency_nothrow( *dynamic_cast< LongCurrencyField* >( m_pPainter ), *this, _rxField, _rxFormatter );
-}
-
-//------------------------------------------------------------------------------
-void DbCurrencyField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter)
-{
- lcl_setFormattedCurrency_nothrow( *dynamic_cast< LongCurrencyField* >( m_pWindow ), *this, _rxField, _rxFormatter );
-}
-
-//------------------------------------------------------------------------------
-void DbCurrencyField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbCurrencyField::updateFromModel: invalid call!" );
-
- double dValue = 0;
- if ( _rxModel->getPropertyValue( FM_PROP_VALUE ) >>= dValue )
- {
- if ( m_nScale )
- {
- dValue = ::rtl::math::pow10Exp( dValue, m_nScale );
- dValue = ::rtl::math::round(dValue, 0);
- }
-
- static_cast< LongCurrencyField* >( m_pWindow )->SetValue( dValue );
- }
- else
- m_pWindow->SetText( String() );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbCurrencyField::commitControl()
-{
- String aText( m_pWindow->GetText());
- Any aVal;
- if (aText.Len() != 0) // nicht null
- {
- double fValue = ((LongCurrencyField*)m_pWindow)->GetValue();
- if (m_nScale)
- {
- fValue /= ::rtl::math::pow10Exp(1.0, m_nScale);
- //fValue = ::rtl::math::round(fValue, m_nScale);
- }
- aVal <<= (double)fValue;
- }
- m_rColumn.getModel()->setPropertyValue(FM_PROP_VALUE, aVal);
- return sal_True;
-}
-
-//==============================================================================
-//= DbDateField
-//==============================================================================
-//------------------------------------------------------------------------------
-DbDateField::DbDateField( DbGridColumn& _rColumn )
- :DbSpinField( _rColumn )
-{
- doPropertyListening( FM_PROP_DATEFORMAT );
- doPropertyListening( FM_PROP_DATEMIN );
- doPropertyListening( FM_PROP_DATEMAX );
- doPropertyListening( FM_PROP_STRICTFORMAT );
- doPropertyListening( FM_PROP_DATE_SHOW_CENTURY );
-}
-
-//------------------------------------------------------------------------------
-SpinField* DbDateField::createField( Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& _rxModel )
-{
- // check if there is a DropDown property set to TRUE
- sal_Bool bDropDown = !hasProperty( FM_PROP_DROPDOWN, _rxModel )
- || getBOOL( _rxModel->getPropertyValue( FM_PROP_DROPDOWN ) );
- if ( bDropDown )
- _nFieldStyle |= WB_DROPDOWN;
-
- CalendarField* pField = new CalendarField( _pParent, _nFieldStyle );
-
- pField->EnableToday();
- pField->EnableNone();
-
- return pField;
-}
-
-//------------------------------------------------------------------------------
-void DbDateField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbDateField::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbDateField::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- sal_Int16 nFormat = getINT16( _rxModel->getPropertyValue( FM_PROP_DATEFORMAT ) );
- sal_Int32 nMin = getINT32( _rxModel->getPropertyValue( FM_PROP_DATEMIN ) );
- sal_Int32 nMax = getINT32( _rxModel->getPropertyValue( FM_PROP_DATEMAX ) );
- sal_Bool bStrict = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
-
- Any aCentury = _rxModel->getPropertyValue( FM_PROP_DATE_SHOW_CENTURY );
- if ( aCentury.getValueType().getTypeClass() != TypeClass_VOID )
- {
- sal_Bool bShowDateCentury = getBOOL( aCentury );
-
- static_cast<DateField*>( m_pWindow )->SetShowDateCentury( bShowDateCentury );
- static_cast<DateField*>( m_pPainter )->SetShowDateCentury( bShowDateCentury );
- }
-
- static_cast< DateField* >( m_pWindow )->SetExtDateFormat( (ExtDateFieldFormat)nFormat );
- static_cast< DateField* >( m_pWindow )->SetMin( nMin );
- static_cast< DateField* >( m_pWindow )->SetMax( nMax );
- static_cast< DateField* >( m_pWindow )->SetStrictFormat( bStrict );
- static_cast< DateField* >( m_pWindow )->EnableEmptyFieldValue( sal_True );
-
- static_cast< DateField* >( m_pPainter )->SetExtDateFormat( (ExtDateFieldFormat)nFormat );
- static_cast< DateField* >( m_pPainter )->SetMin( nMin );
- static_cast< DateField* >( m_pPainter )->SetMax( nMax );
- static_cast< DateField* >( m_pPainter )->SetStrictFormat( bStrict );
- static_cast< DateField* >( m_pPainter )->EnableEmptyFieldValue( sal_True );
- }
-}
-
-namespace
-{
- //--------------------------------------------------------------------------
- static String lcl_setFormattedDate_nothrow( DateField& _rField, const Reference< XColumn >& _rxField )
- {
- String sDate;
- if ( _rxField.is() )
- {
- try
- {
- ::com::sun::star::util::Date aValue = _rxField->getDate();
- if ( _rxField->wasNull() )
- _rField.SetText( sDate );
- else
- {
- _rField.SetDate( ::Date( aValue.Day, aValue.Month, aValue.Year ) );
- sDate = _rField.GetText();
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- return sDate;
- }
-}
-//------------------------------------------------------------------------------
-String DbDateField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
-{
- return lcl_setFormattedDate_nothrow( *dynamic_cast< DateField* >( m_pPainter ), _rxField );
-}
-
-//------------------------------------------------------------------------------
-void DbDateField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
-{
- lcl_setFormattedDate_nothrow( *dynamic_cast< DateField* >( m_pWindow ), _rxField );
-}
-
-//------------------------------------------------------------------------------
-void DbDateField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbDateField::updateFromModel: invalid call!" );
-
- sal_Int32 nDate = 0;
- if ( _rxModel->getPropertyValue( FM_PROP_DATE ) >>= nDate )
- static_cast< DateField* >( m_pWindow )->SetDate( ::Date( nDate ) );
- else
- static_cast< DateField* >( m_pWindow )->SetText( String() );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbDateField::commitControl()
-{
- String aText( m_pWindow->GetText());
- Any aVal;
- if (aText.Len() != 0)
- aVal <<= (sal_Int32)static_cast<DateField*>(m_pWindow)->GetDate().GetDate();
- else
- aVal.clear();
-
- m_rColumn.getModel()->setPropertyValue(FM_PROP_DATE, aVal);
- return sal_True;
-}
-
-//==============================================================================
-//= DbTimeField
-//==============================================================================
-//------------------------------------------------------------------------------
-DbTimeField::DbTimeField( DbGridColumn& _rColumn )
- :DbSpinField( _rColumn, ::com::sun::star::awt::TextAlign::LEFT )
-{
- doPropertyListening( FM_PROP_TIMEFORMAT );
- doPropertyListening( FM_PROP_TIMEMIN );
- doPropertyListening( FM_PROP_TIMEMAX );
- doPropertyListening( FM_PROP_STRICTFORMAT );
-}
-
-//------------------------------------------------------------------------------
-SpinField* DbTimeField::createField( Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& /*_rxModel*/ )
-{
- return new TimeField( _pParent, _nFieldStyle );
-}
-
-//------------------------------------------------------------------------------
-void DbTimeField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbTimeField::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbTimeField::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- sal_Int16 nFormat = getINT16( _rxModel->getPropertyValue( FM_PROP_TIMEFORMAT ) );
- sal_Int32 nMin = getINT32( _rxModel->getPropertyValue( FM_PROP_TIMEMIN ) );
- sal_Int32 nMax = getINT32( _rxModel->getPropertyValue( FM_PROP_TIMEMAX ) );
- sal_Bool bStrict = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
-
- static_cast< TimeField* >( m_pWindow )->SetExtFormat( (ExtTimeFieldFormat)nFormat );
- static_cast< TimeField* >( m_pWindow )->SetMin( nMin );
- static_cast< TimeField* >( m_pWindow )->SetMax( nMax );
- static_cast< TimeField* >( m_pWindow )->SetStrictFormat( bStrict );
- static_cast< TimeField* >( m_pWindow )->EnableEmptyFieldValue( sal_True );
-
- static_cast< TimeField* >( m_pPainter )->SetExtFormat( (ExtTimeFieldFormat)nFormat );
- static_cast< TimeField* >( m_pPainter )->SetMin( nMin );
- static_cast< TimeField* >( m_pPainter )->SetMax( nMax );
- static_cast< TimeField* >( m_pPainter )->SetStrictFormat( bStrict );
- static_cast< TimeField* >( m_pPainter )->EnableEmptyFieldValue( sal_True );
- }
-}
-
-namespace
-{
- //--------------------------------------------------------------------------
- static String lcl_setFormattedTime_nothrow( TimeField& _rField, const Reference< XColumn >& _rxField )
- {
- String sTime;
- if ( _rxField.is() )
- {
- try
- {
- ::com::sun::star::util::Time aValue = _rxField->getTime();
- if ( _rxField->wasNull() )
- _rField.SetText( sTime );
- else
- {
- _rField.SetTime( ::Time( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.HundredthSeconds ) );
- sTime = _rField.GetText();
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- return sTime;
- }
-}
-//------------------------------------------------------------------------------
-String DbTimeField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
-{
- return lcl_setFormattedTime_nothrow( *static_cast< TimeField* >( m_pPainter ), _rxField );
-}
-
-//------------------------------------------------------------------------------
-void DbTimeField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
-{
- lcl_setFormattedTime_nothrow( *static_cast< TimeField* >( m_pWindow ), _rxField );
-}
-
-//------------------------------------------------------------------------------
-void DbTimeField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbTimeField::updateFromModel: invalid call!" );
-
- sal_Int32 nTime = 0;
- if ( _rxModel->getPropertyValue( FM_PROP_DATE ) >>= nTime )
- static_cast< TimeField* >( m_pWindow )->SetTime( ::Time( nTime ) );
- else
- static_cast< TimeField* >( m_pWindow )->SetText( String() );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbTimeField::commitControl()
-{
- String aText( m_pWindow->GetText());
- Any aVal;
- if (aText.Len() != 0)
- aVal <<= (sal_Int32)static_cast<TimeField*>(m_pWindow)->GetTime().GetTime();
- else
- aVal.clear();
-
- m_rColumn.getModel()->setPropertyValue(FM_PROP_TIME, aVal);
- return sal_True;
-}
-
-//==============================================================================
-//= DbComboBox
-//==============================================================================
-//------------------------------------------------------------------------------
-DbComboBox::DbComboBox(DbGridColumn& _rColumn)
- :DbCellControl(_rColumn)
- ,m_nKeyType(::com::sun::star::util::NumberFormat::UNDEFINED)
-{
- setAlignedController( sal_False );
-
- doPropertyListening( FM_PROP_STRINGITEMLIST );
- doPropertyListening( FM_PROP_LINECOUNT );
-}
-
-//------------------------------------------------------------------------------
-void DbComboBox::_propertyChanged( const PropertyChangeEvent& _rEvent ) throw( RuntimeException )
-{
- if ( _rEvent.PropertyName.equals( FM_PROP_STRINGITEMLIST ) )
- {
- SetList(_rEvent.NewValue);
- }
- else
- {
- DbCellControl::_propertyChanged( _rEvent ) ;
- }
-}
-
-//------------------------------------------------------------------------------
-void DbComboBox::SetList(const Any& rItems)
-{
- ComboBoxControl* pField = (ComboBoxControl*)m_pWindow;
- pField->Clear();
-
- ::comphelper::StringSequence aTest;
- if (rItems >>= aTest)
- {
- const ::rtl::OUString* pStrings = aTest.getConstArray();
- sal_Int32 nItems = aTest.getLength();
- for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
- pField->InsertEntry(*pStrings, LISTBOX_APPEND);
-
- // tell the grid control that this controller is invalid and has to be re-initialized
- invalidatedController();
- }
-}
-
-//------------------------------------------------------------------------------
-void DbComboBox::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbComboBox::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbComboBox::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- sal_Int16 nLines = getINT16( _rxModel->getPropertyValue( FM_PROP_LINECOUNT ) );
- static_cast< ComboBoxControl* >( m_pWindow )->SetDropDownLineCount( nLines );
- }
-}
-
-//------------------------------------------------------------------------------
-void DbComboBox::Init( Window& rParent, const Reference< XRowSet >& xCursor )
-{
- m_rColumn.SetAlignmentFromModel(::com::sun::star::awt::TextAlign::LEFT);
-
- m_pWindow = new ComboBoxControl( &rParent );
-
- // selection von rechts nach links
- AllSettings aSettings = m_pWindow->GetSettings();
- StyleSettings aStyleSettings = aSettings.GetStyleSettings();
- aStyleSettings.SetSelectionOptions(
- aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
- aSettings.SetStyleSettings(aStyleSettings);
- m_pWindow->SetSettings(aSettings, sal_True);
-
- // some initial properties
- Reference< XPropertySet > xModel(m_rColumn.getModel());
- SetList( xModel->getPropertyValue( FM_PROP_STRINGITEMLIST ) );
- implAdjustGenericFieldSetting( xModel );
-
- if (m_rColumn.GetParent().getNumberFormatter().is())
- m_nKeyType = comphelper::getNumberFormatType(m_rColumn.GetParent().getNumberFormatter()->getNumberFormatsSupplier()->getNumberFormats(), m_rColumn.GetKey());
-
- DbCellControl::Init( rParent, xCursor );
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbComboBox::CreateController() const
-{
- return new ComboBoxCellController((ComboBoxControl*)m_pWindow);
-}
-
-//------------------------------------------------------------------------------
-String DbComboBox::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter, Color** /*ppColor*/)
-{
- ::rtl::OUString aString;
- if (_rxField.is())
- try
- {
- aString = getFormattedValue( _rxField, xFormatter, m_rColumn.GetParent().getNullDate(), m_rColumn.GetKey(), m_nKeyType );
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- return aString;
-}
-
-//------------------------------------------------------------------------------
-void DbComboBox::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter)
-{
- m_pWindow->SetText(GetFormatText(_rxField, xFormatter));
-}
-
-//------------------------------------------------------------------------------
-void DbComboBox::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbComboBox::updateFromModel: invalid call!" );
-
- ::rtl::OUString sText;
- _rxModel->getPropertyValue( FM_PROP_TEXT ) >>= sText;
-
- static_cast< ComboBox* >( m_pWindow )->SetText( sText );
- static_cast< ComboBox* >( m_pWindow )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbComboBox::commitControl()
-{
- String aText( m_pWindow->GetText());
- m_rColumn.getModel()->setPropertyValue(FM_PROP_TEXT, makeAny(::rtl::OUString(aText)));
- return sal_True;
-}
-
-//------------------------------------------------------------------------------
-DbListBox::DbListBox(DbGridColumn& _rColumn)
- :DbCellControl(_rColumn)
- ,m_bBound(sal_False)
-{
- setAlignedController( sal_False );
-
- doPropertyListening( FM_PROP_STRINGITEMLIST );
- doPropertyListening( FM_PROP_LINECOUNT );
-}
-
-//------------------------------------------------------------------------------
-void DbListBox::_propertyChanged( const ::com::sun::star::beans::PropertyChangeEvent& _rEvent ) throw( RuntimeException )
-{
- if ( _rEvent.PropertyName.equals( FM_PROP_STRINGITEMLIST ) )
- {
- SetList(_rEvent.NewValue);
- }
- else
- {
- DbCellControl::_propertyChanged( _rEvent ) ;
- }
-}
-
-//------------------------------------------------------------------------------
-void DbListBox::SetList(const Any& rItems)
-{
- ListBoxControl* pField = (ListBoxControl*)m_pWindow;
-
- pField->Clear();
- m_bBound = sal_False;
-
- ::comphelper::StringSequence aTest;
- if (rItems >>= aTest)
- {
- const ::rtl::OUString* pStrings = aTest.getConstArray();
- sal_Int32 nItems = aTest.getLength();
- if (nItems)
- {
- for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
- pField->InsertEntry(*pStrings, LISTBOX_APPEND);
-
- m_rColumn.getModel()->getPropertyValue(FM_PROP_VALUE_SEQ) >>= m_aValueList;
- m_bBound = m_aValueList.getLength() > 0;
-
- // tell the grid control that this controller is invalid and has to be re-initialized
- invalidatedController();
- }
- }
-}
-
-//------------------------------------------------------------------------------
-void DbListBox::Init( Window& rParent, const Reference< XRowSet >& xCursor)
-{
- m_rColumn.SetAlignment(::com::sun::star::awt::TextAlign::LEFT);
-
- m_pWindow = new ListBoxControl( &rParent );
-
- // some initial properties
- Reference< XPropertySet > xModel( m_rColumn.getModel() );
- SetList( xModel->getPropertyValue( FM_PROP_STRINGITEMLIST ) );
- implAdjustGenericFieldSetting( xModel );
-
- DbCellControl::Init( rParent, xCursor );
-}
-
-//------------------------------------------------------------------------------
-void DbListBox::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
-{
- DBG_ASSERT( m_pWindow, "DbListBox::implAdjustGenericFieldSetting: not to be called without window!" );
- DBG_ASSERT( _rxModel.is(), "DbListBox::implAdjustGenericFieldSetting: invalid model!" );
- if ( m_pWindow && _rxModel.is() )
- {
- sal_Int16 nLines = getINT16( _rxModel->getPropertyValue( FM_PROP_LINECOUNT ) );
- static_cast< ListBoxControl* >( m_pWindow )->SetDropDownLineCount( nLines );
- }
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbListBox::CreateController() const
-{
- return new ListBoxCellController((ListBoxControl*)m_pWindow);
-}
-
-//------------------------------------------------------------------------------
-String DbListBox::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
-{
- String sText;
- if ( _rxField.is() )
- {
- try
- {
- sText = _rxField->getString();
- if ( m_bBound )
- {
- Sequence< sal_Int16 > aPosSeq = ::comphelper::findValue( m_aValueList, sText, sal_True );
- if ( aPosSeq.getLength() )
- sText = static_cast<ListBox*>(m_pWindow)->GetEntry(aPosSeq.getConstArray()[0]);
- else
- sText = String();
- }
- }
- catch( const Exception& )
- {
- DBG_UNHANDLED_EXCEPTION();
- }
- }
- return sText;
-}
-
-//------------------------------------------------------------------------------
-void DbListBox::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter)
-{
- String sFormattedText( GetFormatText( _rxField, xFormatter ) );
- if ( sFormattedText.Len() )
- static_cast< ListBox* >( m_pWindow )->SelectEntry( sFormattedText );
- else
- static_cast< ListBox* >( m_pWindow )->SetNoSelection();
-}
-
-//------------------------------------------------------------------------------
-void DbListBox::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbListBox::updateFromModel: invalid call!" );
-
- Sequence< sal_Int16 > aSelection;
- _rxModel->getPropertyValue( FM_PROP_SELECT_SEQ );
-
- sal_Int16 nSelection = -1;
- if ( aSelection.getLength() > 0 )
- nSelection = aSelection[ 0 ];
-
- ListBox* pListBox = static_cast< ListBox* >( m_pWindow );
-
- if ( ( nSelection >= 0 ) && ( nSelection < pListBox->GetEntryCount() ) )
- pListBox->SelectEntryPos( nSelection );
- else
- pListBox->SetNoSelection( );
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbListBox::commitControl()
-{
- Any aVal;
- Sequence<sal_Int16> aSelectSeq;
- if (static_cast<ListBox*>(m_pWindow)->GetSelectEntryCount())
- {
- aSelectSeq.realloc(1);
- *(sal_Int16 *)aSelectSeq.getArray() = (sal_Int16)static_cast<ListBox*>(m_pWindow)->GetSelectEntryPos();
- }
- aVal <<= aSelectSeq;
- m_rColumn.getModel()->setPropertyValue(FM_PROP_SELECT_SEQ, aVal);
- return sal_True;
-}
-
-
-DBG_NAME(DbFilterField);
-/*************************************************************************/
-DbFilterField::DbFilterField(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,DbGridColumn& _rColumn)
- :DbCellControl(_rColumn)
- ,OSQLParserClient(_rxORB)
- ,m_nControlClass(::com::sun::star::form::FormComponentType::TEXTFIELD)
- ,m_bFilterList(sal_False)
- ,m_bFilterListFilled(sal_False)
- ,m_bBound(sal_False)
-{
- DBG_CTOR(DbFilterField,NULL);
-
- setAlignedController( sal_False );
-}
-
-//------------------------------------------------------------------------------
-DbFilterField::~DbFilterField()
-{
- if (m_nControlClass == ::com::sun::star::form::FormComponentType::CHECKBOX)
- ((CheckBoxControl*)m_pWindow)->SetClickHdl( Link() );
-
- DBG_DTOR(DbFilterField,NULL);
-}
-
-//------------------------------------------------------------------------------
-void DbFilterField::PaintCell(OutputDevice& rDev, const Rectangle& rRect)
-{
- static sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_VCENTER | TEXT_DRAW_LEFT;
- switch (m_nControlClass)
- {
- case FormComponentType::CHECKBOX:
- DbCellControl::PaintCell( rDev, rRect );
- break;
- case FormComponentType::LISTBOX:
- rDev.DrawText(rRect, static_cast<ListBox*>(m_pWindow)->GetSelectEntry(), nStyle);
- break;
- default:
- rDev.DrawText(rRect, m_aText, nStyle);
- }
-}
-
-//------------------------------------------------------------------------------
-void DbFilterField::SetList(const Any& rItems, sal_Bool bComboBox)
-{
- ::comphelper::StringSequence aTest;
- rItems >>= aTest;
- const ::rtl::OUString* pStrings = aTest.getConstArray();
- sal_Int32 nItems = aTest.getLength();
- if (nItems)
- {
- if (bComboBox)
- {
- ComboBox* pField = (ComboBox*)m_pWindow;
- for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
- pField->InsertEntry(*pStrings, LISTBOX_APPEND);
- }
- else
- {
- ListBox* pField = (ListBox*)m_pWindow;
- for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
- pField->InsertEntry(*pStrings, LISTBOX_APPEND);
-
- m_rColumn.getModel()->getPropertyValue(FM_PROP_VALUE_SEQ) >>= m_aValueList;
- m_bBound = m_aValueList.getLength() > 0;
- }
- }
-}
-
-//------------------------------------------------------------------------------
-void DbFilterField::CreateControl(Window* pParent, const Reference< ::com::sun::star::beans::XPropertySet >& xModel)
-{
- switch (m_nControlClass)
- {
- case ::com::sun::star::form::FormComponentType::CHECKBOX:
- m_pWindow = new CheckBoxControl(pParent);
- m_pWindow->SetPaintTransparent( sal_True );
- ((CheckBoxControl*)m_pWindow)->SetClickHdl( LINK( this, DbFilterField, OnClick ) );
-
- m_pPainter = new CheckBoxControl(pParent);
- m_pPainter->SetPaintTransparent( sal_True );
- m_pPainter->SetBackground();
- break;
- case ::com::sun::star::form::FormComponentType::LISTBOX:
- {
- m_pWindow = new ListBoxControl(pParent);
- sal_Int16 nLines = ::comphelper::getINT16(xModel->getPropertyValue(FM_PROP_LINECOUNT));
- Any aItems = xModel->getPropertyValue(FM_PROP_STRINGITEMLIST);
- SetList(aItems, m_nControlClass == ::com::sun::star::form::FormComponentType::COMBOBOX);
- static_cast<ListBox*>(m_pWindow)->SetDropDownLineCount(nLines);
- } break;
- case ::com::sun::star::form::FormComponentType::COMBOBOX:
- {
- m_pWindow = new ComboBoxControl(pParent);
-
- AllSettings aSettings = m_pWindow->GetSettings();
- StyleSettings aStyleSettings = aSettings.GetStyleSettings();
- aStyleSettings.SetSelectionOptions(
- aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
- aSettings.SetStyleSettings(aStyleSettings);
- m_pWindow->SetSettings(aSettings, sal_True);
-
- if (!m_bFilterList)
- {
- sal_Int16 nLines = ::comphelper::getINT16(xModel->getPropertyValue(FM_PROP_LINECOUNT));
- Any aItems = xModel->getPropertyValue(FM_PROP_STRINGITEMLIST);
- SetList(aItems, m_nControlClass == ::com::sun::star::form::FormComponentType::COMBOBOX);
- ((ComboBox*)m_pWindow)->SetDropDownLineCount(nLines);
- }
- else
- ((ComboBox*)m_pWindow)->SetDropDownLineCount(5);
-
- } break;
- default:
- {
- m_pWindow = new Edit(pParent, WB_LEFT);
- AllSettings aSettings = m_pWindow->GetSettings();
- StyleSettings aStyleSettings = aSettings.GetStyleSettings();
- aStyleSettings.SetSelectionOptions(
- aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
- aSettings.SetStyleSettings(aStyleSettings);
- m_pWindow->SetSettings(aSettings, sal_True);
- }
- }
-}
-
-//------------------------------------------------------------------------------
-void DbFilterField::Init( Window& rParent, const Reference< XRowSet >& xCursor )
-{
- Reference< ::com::sun::star::beans::XPropertySet > xModel(m_rColumn.getModel());
- m_rColumn.SetAlignment(::com::sun::star::awt::TextAlign::LEFT);
-
- if (xModel.is())
- {
- m_bFilterList = ::comphelper::hasProperty(FM_PROP_FILTERPROPOSAL, xModel) && ::comphelper::getBOOL(xModel->getPropertyValue(FM_PROP_FILTERPROPOSAL));
- if (m_bFilterList)
- m_nControlClass = ::com::sun::star::form::FormComponentType::COMBOBOX;
- else
- {
- sal_Int16 nClassId = ::comphelper::getINT16(xModel->getPropertyValue(FM_PROP_CLASSID));
- switch (nClassId)
- {
- case FormComponentType::CHECKBOX:
- case FormComponentType::LISTBOX:
- case FormComponentType::COMBOBOX:
- m_nControlClass = nClassId;
- break;
- default:
- if (m_bFilterList)
- m_nControlClass = FormComponentType::COMBOBOX;
- else
- m_nControlClass = FormComponentType::TEXTFIELD;
- }
- }
- }
-
- CreateControl( &rParent, xModel );
- DbCellControl::Init( rParent, xCursor );
-
- // filter cells are never readonly
- Edit* pAsEdit = dynamic_cast< Edit* >( m_pWindow );
- if ( pAsEdit )
- pAsEdit->SetReadOnly( sal_False );
-}
-
-//------------------------------------------------------------------------------
-CellControllerRef DbFilterField::CreateController() const
-{
- CellControllerRef xController;
- switch (m_nControlClass)
- {
- case ::com::sun::star::form::FormComponentType::CHECKBOX:
- xController = new CheckBoxCellController((CheckBoxControl*)m_pWindow);
- break;
- case ::com::sun::star::form::FormComponentType::LISTBOX:
- xController = new ListBoxCellController((ListBoxControl*)m_pWindow);
- break;
- case ::com::sun::star::form::FormComponentType::COMBOBOX:
- xController = new ComboBoxCellController((ComboBoxControl*)m_pWindow);
- break;
- default:
- if (m_bFilterList)
- xController = new ComboBoxCellController((ComboBoxControl*)m_pWindow);
- else
- xController = new EditCellController((Edit*)m_pWindow);
- }
- return xController;
-}
-
-//------------------------------------------------------------------------------
-void DbFilterField::updateFromModel( Reference< XPropertySet > _rxModel )
-{
- OSL_ENSURE( _rxModel.is() && m_pWindow, "DbFilterField::updateFromModel: invalid call!" );
- (void)_rxModel;
-
- OSL_FAIL( "DbListBox::updateFromModel: not implemented yet (how the hell did you reach this?)!" );
- // TODO: implement this.
- // remember: updateFromModel should be some kind of opposite of commitControl
-}
-
-//------------------------------------------------------------------------------
-sal_Bool DbFilterField::commitControl()
-{
- String aText(m_aText);
- switch (m_nControlClass)
- {
- case ::com::sun::star::form::FormComponentType::CHECKBOX:
- return sal_True;
- case ::com::sun::star::form::FormComponentType::LISTBOX:
- aText.Erase();
- if (static_cast<ListBox*>(m_pWindow)->GetSelectEntryCount())
- {
- sal_Int16 nPos = (sal_Int16)static_cast<ListBox*>(m_pWindow)->GetSelectEntryPos();
- if ( ( nPos >= 0 ) && ( nPos < m_aValueList.getLength() ) )
- aText = (const sal_Unicode*)m_aValueList.getConstArray()[nPos];
- }
-
- if (m_aText != aText)
- {
- m_aText = aText;
- m_aCommitLink.Call(this);
- }
- return sal_True;
- default:
- aText = m_pWindow->GetText();
- }
-
- if (m_aText != aText)
- {
- // check the text with the SQL-Parser
- String aNewText(aText);
- aNewText.EraseTrailingChars();
- if (aNewText.Len() != 0)
- {
- ::rtl::OUString aErrorMsg;
- Reference< XNumberFormatter > xNumberFormatter(m_rColumn.GetParent().getNumberFormatter());
-
- ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree(aErrorMsg, aNewText,xNumberFormatter, m_rColumn.GetField());
- if (xParseNode.is())
- {
- ::rtl::OUString aPreparedText;
-
- ::com::sun::star::lang::Locale aAppLocale = Application::GetSettings().GetUILocale();
-
- Reference< XRowSet > xDataSourceRowSet(
- (Reference< XInterface >)*m_rColumn.GetParent().getDataSource(), UNO_QUERY);
- Reference< XConnection > xConnection(getRowSetConnection(xDataSourceRowSet));
-
- xParseNode->parseNodeToPredicateStr(aPreparedText,
- xConnection,
- xNumberFormatter,
- m_rColumn.GetField(),aAppLocale,'.',
- getParseContext());
- m_aText = aPreparedText;
- }
- else
- {
- // display the error and return sal_False
- String aTitle( SVX_RES(RID_STR_SYNTAXERROR) );
-
- SQLException aError;
- aError.Message = aErrorMsg;
- displayException(aError, m_pWindow->GetParent());
- // TODO: transport the title
-
- return sal_False;
- }
- }
- else
- m_aText = aText;
-
- m_pWindow->SetText(m_aText);
- m_aCommitLink.Call(this);
- }
- return sal_True;
-}
-
-//------------------------------------------------------------------------------
-void DbFilterField::SetText(const String& rText)
-{
- m_aText = rText;
- switch (m_nControlClass)
- {
- case ::com::sun::star::form::FormComponentType::CHECKBOX:
- {
- TriState eState;
- if (rText.EqualsAscii("1"))
- eState = STATE_CHECK;
- else if (rText.EqualsAscii("0"))
- eState = STATE_NOCHECK;
- else
- eState = STATE_DONTKNOW;
-
- ((CheckBoxControl*)m_pWindow)->GetBox().SetState(eState);
- ((CheckBoxControl*)m_pPainter)->GetBox().SetState(eState);
- } break;
- case ::com::sun::star::form::FormComponentType::LISTBOX:
- {
- String aText;
- Sequence<sal_Int16> aPosSeq = ::comphelper::findValue(m_aValueList, m_aText, sal_True);
- if (aPosSeq.getLength())
- static_cast<ListBox*>(m_pWindow)->SelectEntryPos(aPosSeq.getConstArray()[0], sal_True);
- else
- static_cast<ListBox*>(m_pWindow)->SetNoSelection();
- } break;
- default:
- m_pWindow->SetText(m_aText);
- }
-
- // now force a repaint on the window
- m_rColumn.GetParent().RowModified(0,m_rColumn.GetId());
-}
-
-//------------------------------------------------------------------------------
-void DbFilterField::Update()
-{
- // should we fill the combobox with a filter proposal?
- if (m_bFilterList && !m_bFilterListFilled)
- {
- m_bFilterListFilled = sal_True;
- Reference< ::com::sun::star::beans::XPropertySet > xField = m_rColumn.GetField();
- if (!xField.is())
- return;
-
- ::rtl::OUString aName;
- xField->getPropertyValue(FM_PROP_NAME) >>= aName;
-
- // the columnmodel
- Reference< ::com::sun::star::container::XChild > xModelAsChild(m_rColumn.getModel(), UNO_QUERY);
- // the grid model
- xModelAsChild = Reference< ::com::sun::star::container::XChild > (xModelAsChild->getParent(),UNO_QUERY);
- Reference< XRowSet > xForm(xModelAsChild->getParent(), UNO_QUERY);
- if (!xForm.is())
- return;
-
- Reference<XPropertySet> xFormProp(xForm,UNO_QUERY);
- Reference< XTablesSupplier > xSupTab;
- xFormProp->getPropertyValue(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SingleSelectQueryComposer"))) >>= xSupTab;
-
- Reference< XConnection > xConnection(getRowSetConnection(xForm));
- if (!xSupTab.is())
- return;
-
- // search the field
- Reference< XColumnsSupplier > xSupCol(xSupTab,UNO_QUERY);
- Reference< ::com::sun::star::container::XNameAccess > xFieldNames = xSupCol->getColumns();
- if (!xFieldNames->hasByName(aName))
- return;
-
- Reference< ::com::sun::star::container::XNameAccess > xTablesNames = xSupTab->getTables();
- Reference< ::com::sun::star::beans::XPropertySet > xComposerFieldAsSet(xFieldNames->getByName(aName),UNO_QUERY);
-
- if (xComposerFieldAsSet.is() && ::comphelper::hasProperty(FM_PROP_TABLENAME, xComposerFieldAsSet) &&
- ::comphelper::hasProperty(FM_PROP_FIELDSOURCE, xComposerFieldAsSet))
- {
- ::rtl::OUString aFieldName;
- ::rtl::OUString aTableName;
- xComposerFieldAsSet->getPropertyValue(FM_PROP_FIELDSOURCE) >>= aFieldName;
- xComposerFieldAsSet->getPropertyValue(FM_PROP_TABLENAME) >>= aTableName;
-
- // no possibility to create a select statement
- // looking for the complete table name
- if (!xTablesNames->hasByName(aTableName))
- return;
-
- // ein Statement aufbauen und abschicken als query
- // Access to the connection
- Reference< XStatement > xStatement;
- Reference< XResultSet > xListCursor;
- Reference< ::com::sun::star::sdb::XColumn > xDataField;
-
- try
- {
- Reference< XDatabaseMetaData > xMeta = xConnection->getMetaData();
-
- String aQuote( xMeta->getIdentifierQuoteString());
- String aStatement;
- aStatement.AssignAscii("SELECT DISTINCT ");
-
- aStatement += String(quoteName(aQuote, aName));
- if (aFieldName.getLength() && aName != aFieldName)
- {
- aStatement.AppendAscii(" AS ");
- aStatement += quoteName(aQuote, aFieldName).getStr();
- }
-
- aStatement.AppendAscii(" FROM ");
-
- Reference< XPropertySet > xTableNameAccess( xTablesNames->getByName(aTableName), UNO_QUERY_THROW );
- aStatement += composeTableNameForSelect( xConnection, xTableNameAccess ).getStr();
-
- xStatement = xConnection->createStatement();
- Reference< ::com::sun::star::beans::XPropertySet > xStatementProps(xStatement, UNO_QUERY);
- xStatementProps->setPropertyValue(FM_PROP_ESCAPE_PROCESSING, makeAny((sal_Bool)sal_True));
-
- xListCursor = xStatement->executeQuery(aStatement);
-
- Reference< ::com::sun::star::sdbcx::XColumnsSupplier > xSupplyCols(xListCursor, UNO_QUERY);
- Reference< ::com::sun::star::container::XIndexAccess > xFields(xSupplyCols->getColumns(), UNO_QUERY);
- ::cppu::extractInterface(xDataField, xFields->getByIndex(0));
- if (!xDataField.is())
- return;
- }
- catch(const Exception&)
- {
- ::comphelper::disposeComponent(xStatement);
- return;
- }
-
- sal_Int16 i = 0;
- ::std::vector< ::rtl::OUString > aStringList;
- aStringList.reserve(16);
- ::rtl::OUString aStr;
- com::sun::star::util::Date aNullDate = m_rColumn.GetParent().getNullDate();
- sal_Int32 nFormatKey = m_rColumn.GetKey();
- Reference< XNumberFormatter > xFormatter = m_rColumn.GetParent().getNumberFormatter();
- sal_Int16 nKeyType = ::comphelper::getNumberFormatType(xFormatter->getNumberFormatsSupplier()->getNumberFormats(), nFormatKey);
-
- while (!xListCursor->isAfterLast() && i++ < SHRT_MAX) // max anzahl eintraege
- {
- aStr = getFormattedValue(xDataField, xFormatter, aNullDate, nFormatKey, nKeyType);
- aStringList.push_back(aStr);
- xListCursor->next();
- }
-
- // filling the entries for the combobox
- for (::std::vector< ::rtl::OUString >::const_iterator iter = aStringList.begin();
- iter != aStringList.end(); ++iter)
- ((ComboBox*)m_pWindow)->InsertEntry(*iter, LISTBOX_APPEND);
- }
- }
-}
-
-//------------------------------------------------------------------------------
-XubString DbFilterField::GetFormatText(const Reference< XColumn >& /*_rxField*/, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
-{
- return XubString();
-}
-
-//------------------------------------------------------------------
-void DbFilterField::UpdateFromField(const Reference< XColumn >& /*_rxField*/, const Reference< XNumberFormatter >& /*xFormatter*/)
-{
- OSL_FAIL( "DbFilterField::UpdateFromField: cannot update a filter control from a field!" );
-}
-
-//------------------------------------------------------------------
-IMPL_LINK( DbFilterField, OnClick, void*, EMPTYARG )
-{
- TriState eState = ((CheckBoxControl*)m_pWindow)->GetBox().GetState();
- String aText;
-
- switch (eState)
- {
- case STATE_CHECK:
- aText.AssignAscii("1");
- break;
- case STATE_NOCHECK:
- aText.AssignAscii("0");
- break;
- case STATE_DONTKNOW:
- aText = String();
- break;
- }
-
- if (m_aText != aText)
- {
- m_aText = aText;
- m_aCommitLink.Call(this);
- }
- return 1;
-}
-
-/*************************************************************************/
-TYPEINIT0(FmXGridCell);
-
-
-DBG_NAME(FmXGridCell);
-//-----------------------------------------------------------------------------
-FmXGridCell::FmXGridCell( DbGridColumn* pColumn, DbCellControl* _pControl )
- :OComponentHelper(m_aMutex)
- ,m_pColumn(pColumn)
- ,m_pCellControl( _pControl )
- ,m_aWindowListeners( m_aMutex )
- ,m_aFocusListeners( m_aMutex )
- ,m_aKeyListeners( m_aMutex )
- ,m_aMouseListeners( m_aMutex )
- ,m_aMouseMotionListeners( m_aMutex )
-{
- DBG_CTOR(FmXGridCell,NULL);
-}
-
-//-----------------------------------------------------------------------------
-void FmXGridCell::init()
-{
- Window* pEventWindow( getEventWindow() );
- if ( pEventWindow )
- pEventWindow->AddEventListener( LINK( this, FmXGridCell, OnWindowEvent ) );
-}
-
-//-----------------------------------------------------------------------------
-Window* FmXGridCell::getEventWindow() const
-{
- if ( m_pCellControl )
- return &m_pCellControl->GetWindow();
- return NULL;
-}
-
-//-----------------------------------------------------------------------------
-FmXGridCell::~FmXGridCell()
-{
- if (!OComponentHelper::rBHelper.bDisposed)
- {
- acquire();
- dispose();
- }
-
- DBG_DTOR(FmXGridCell,NULL);
-}
-
-//------------------------------------------------------------------
-void FmXGridCell::SetTextLineColor()
-{
- if (m_pCellControl)
- m_pCellControl->SetTextLineColor();
-}
-
-//------------------------------------------------------------------
-void FmXGridCell::SetTextLineColor(const Color& _rColor)
-{
- if (m_pCellControl)
- m_pCellControl->SetTextLineColor(_rColor);
-}
-
-// XTypeProvider
-//------------------------------------------------------------------
-Sequence< Type > SAL_CALL FmXGridCell::getTypes( ) throw (RuntimeException)
-{
- Sequence< uno::Type > aTypes = ::comphelper::concatSequences(
- ::cppu::OComponentHelper::getTypes(),
- FmXGridCell_Base::getTypes()
- );
- if ( m_pCellControl )
- aTypes = ::comphelper::concatSequences(
- aTypes,
- FmXGridCell_WindowBase::getTypes()
- );
- return aTypes;
-}
-
-//------------------------------------------------------------------
-IMPLEMENT_GET_IMPLEMENTATION_ID( FmXGridCell )
-
-// OComponentHelper
-//-----------------------------------------------------------------------------
-void FmXGridCell::disposing()
-{
- lang::EventObject aEvent( *this );
- m_aWindowListeners.disposeAndClear( aEvent );
- m_aFocusListeners.disposeAndClear( aEvent );
- m_aKeyListeners.disposeAndClear( aEvent );
- m_aMouseListeners.disposeAndClear( aEvent );
- m_aMouseMotionListeners.disposeAndClear( aEvent );
-
- OComponentHelper::disposing();
- m_pColumn = NULL;
- DELETEZ(m_pCellControl);
-}
-
-//------------------------------------------------------------------
-Any SAL_CALL FmXGridCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException)
-{
- Any aReturn = OComponentHelper::queryAggregation( _rType );
-
- if ( !aReturn.hasValue() )
- aReturn = FmXGridCell_Base::queryInterface( _rType );
-
- if ( !aReturn.hasValue() && ( m_pCellControl != NULL ) )
- aReturn = FmXGridCell_WindowBase::queryInterface( _rType );
-
- return aReturn;
-}
-
-// ::com::sun::star::awt::XControl
-//-----------------------------------------------------------------------------
-Reference< XInterface > FmXGridCell::getContext() throw( RuntimeException )
-{
- return Reference< XInterface > ();
-}
-
-//-----------------------------------------------------------------------------
-Reference< ::com::sun::star::awt::XControlModel > FmXGridCell::getModel() throw( ::com::sun::star::uno::RuntimeException )
-{
- return Reference< ::com::sun::star::awt::XControlModel > (m_pColumn->getModel(), UNO_QUERY);
-}
-
-// ::com::sun::star::form::XBoundControl
-//------------------------------------------------------------------
-sal_Bool FmXGridCell::getLock() throw( RuntimeException )
-{
- return m_pColumn->isLocked();
-}
-
-//------------------------------------------------------------------
-void FmXGridCell::setLock(sal_Bool _bLock) throw( RuntimeException )
-{
- if (getLock() == _bLock)
- return;
- else
- {
- ::osl::MutexGuard aGuard(m_aMutex);
- m_pColumn->setLock(_bLock);
- }
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::setPosSize( ::sal_Int32 _XX, ::sal_Int32 _Y, ::sal_Int32 _Width, ::sal_Int32 _Height, ::sal_Int16 _Flags ) throw (RuntimeException)
-{
- OSL_FAIL( "FmXGridCell::setPosSize: not implemented" );
- (void)_XX;
- (void)_Y;
- (void)_Width;
- (void)_Height;
- (void)_Flags;
- // not allowed to tamper with this for a grid cell
-}
-
-//------------------------------------------------------------------
-awt::Rectangle SAL_CALL FmXGridCell::getPosSize( ) throw (RuntimeException)
-{
- OSL_FAIL( "FmXGridCell::getPosSize: not implemented" );
- return awt::Rectangle();
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::setVisible( ::sal_Bool _Visible ) throw (RuntimeException)
-{
- OSL_FAIL( "FmXGridCell::setVisible: not implemented" );
- (void)_Visible;
- // not allowed to tamper with this for a grid cell
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::setEnable( ::sal_Bool _Enable ) throw (RuntimeException)
-{
- OSL_FAIL( "FmXGridCell::setEnable: not implemented" );
- (void)_Enable;
- // not allowed to tamper with this for a grid cell
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::setFocus( ) throw (RuntimeException)
-{
- OSL_FAIL( "FmXGridCell::setFocus: not implemented" );
- // not allowed to tamper with this for a grid cell
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::addWindowListener( const Reference< awt::XWindowListener >& _rxListener ) throw (RuntimeException)
-{
- m_aWindowListeners.addInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::removeWindowListener( const Reference< awt::XWindowListener >& _rxListener ) throw (RuntimeException)
-{
- m_aWindowListeners.removeInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::addFocusListener( const Reference< awt::XFocusListener >& _rxListener ) throw (RuntimeException)
-{
- m_aFocusListeners.addInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::removeFocusListener( const Reference< awt::XFocusListener >& _rxListener ) throw (RuntimeException)
-{
- m_aFocusListeners.removeInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::addKeyListener( const Reference< awt::XKeyListener >& _rxListener ) throw (RuntimeException)
-{
- m_aKeyListeners.addInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::removeKeyListener( const Reference< awt::XKeyListener >& _rxListener ) throw (RuntimeException)
-{
- m_aKeyListeners.removeInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::addMouseListener( const Reference< awt::XMouseListener >& _rxListener ) throw (RuntimeException)
-{
- m_aMouseListeners.addInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::removeMouseListener( const Reference< awt::XMouseListener >& _rxListener ) throw (RuntimeException)
-{
- m_aMouseListeners.removeInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::addMouseMotionListener( const Reference< awt::XMouseMotionListener >& _rxListener ) throw (RuntimeException)
-{
- m_aMouseMotionListeners.addInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::removeMouseMotionListener( const Reference< awt::XMouseMotionListener >& _rxListener ) throw (RuntimeException)
-{
- m_aMouseMotionListeners.removeInterface( _rxListener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::addPaintListener( const Reference< awt::XPaintListener >& _rxListener ) throw (RuntimeException)
-{
- OSL_FAIL( "FmXGridCell::addPaintListener: not implemented" );
- (void)_rxListener;
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXGridCell::removePaintListener( const Reference< awt::XPaintListener >& _rxListener ) throw (RuntimeException)
-{
- OSL_FAIL( "FmXGridCell::removePaintListener: not implemented" );
- (void)_rxListener;
-}
-
-//------------------------------------------------------------------
-IMPL_LINK( FmXGridCell, OnWindowEvent, VclWindowEvent*, _pEvent )
-{
- ENSURE_OR_THROW( _pEvent, "illegal event pointer" );
- ENSURE_OR_THROW( _pEvent->GetWindow(), "illegal window" );
- onWindowEvent( _pEvent->GetId(), *_pEvent->GetWindow(), _pEvent->GetData() );
- return 1L;
-}
-
-//------------------------------------------------------------------------------
-void FmXGridCell::onFocusGained( const awt::FocusEvent& _rEvent )
-{
- m_aFocusListeners.notifyEach( &awt::XFocusListener::focusGained, _rEvent );
-}
-
-//------------------------------------------------------------------------------
-void FmXGridCell::onFocusLost( const awt::FocusEvent& _rEvent )
-{
- m_aFocusListeners.notifyEach( &awt::XFocusListener::focusLost, _rEvent );
-}
-
-//------------------------------------------------------------------------------
-void FmXGridCell::onWindowEvent( const sal_uIntPtr _nEventId, const Window& _rWindow, const void* _pEventData )
-{
- switch ( _nEventId )
- {
- case VCLEVENT_CONTROL_GETFOCUS:
- case VCLEVENT_WINDOW_GETFOCUS:
- case VCLEVENT_CONTROL_LOSEFOCUS:
- case VCLEVENT_WINDOW_LOSEFOCUS:
- {
- if ( ( _rWindow.IsCompoundControl()
- && ( _nEventId == VCLEVENT_CONTROL_GETFOCUS
- || _nEventId == VCLEVENT_CONTROL_LOSEFOCUS
- )
- )
- || ( !_rWindow.IsCompoundControl()
- && ( _nEventId == VCLEVENT_WINDOW_GETFOCUS
- || _nEventId == VCLEVENT_WINDOW_LOSEFOCUS
- )
- )
- )
- {
- if ( !m_aFocusListeners.getLength() )
- break;
-
- bool bFocusGained = ( _nEventId == VCLEVENT_CONTROL_GETFOCUS ) || ( _nEventId == VCLEVENT_WINDOW_GETFOCUS );
-
- awt::FocusEvent aEvent;
- aEvent.Source = *this;
- aEvent.FocusFlags = _rWindow.GetGetFocusFlags();
- aEvent.Temporary = sal_False;
-
- if ( bFocusGained )
- onFocusGained( aEvent );
- else
- onFocusLost( aEvent );
- }
- }
- break;
- case VCLEVENT_WINDOW_MOUSEBUTTONDOWN:
- case VCLEVENT_WINDOW_MOUSEBUTTONUP:
- {
- if ( !m_aMouseListeners.getLength() )
- break;
-
- const bool bButtonDown = ( _nEventId == VCLEVENT_WINDOW_MOUSEBUTTONDOWN );
-
- awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *static_cast< const ::MouseEvent* >( _pEventData ), *this ) );
- m_aMouseListeners.notifyEach( bButtonDown ? &awt::XMouseListener::mousePressed : &awt::XMouseListener::mouseReleased, aEvent );
- }
- break;
- case VCLEVENT_WINDOW_MOUSEMOVE:
- {
- const MouseEvent& rMouseEvent = *static_cast< const ::MouseEvent* >( _pEventData );
- if ( rMouseEvent.IsEnterWindow() || rMouseEvent.IsLeaveWindow() )
- {
- if ( m_aMouseListeners.getLength() != 0 )
- {
- awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( rMouseEvent, *this ) );
- m_aMouseListeners.notifyEach( rMouseEvent.IsEnterWindow() ? &awt::XMouseListener::mouseEntered: &awt::XMouseListener::mouseExited, aEvent );
- }
- }
- else if ( !rMouseEvent.IsEnterWindow() && !rMouseEvent.IsLeaveWindow() )
- {
- if ( m_aMouseMotionListeners.getLength() != 0 )
- {
- awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( rMouseEvent, *this ) );
- aEvent.ClickCount = 0;
- const bool bSimpleMove = ( ( rMouseEvent.GetMode() & MOUSE_SIMPLEMOVE ) != 0 );
- m_aMouseMotionListeners.notifyEach( bSimpleMove ? &awt::XMouseMotionListener::mouseMoved: &awt::XMouseMotionListener::mouseDragged, aEvent );
- }
- }
- }
- break;
- case VCLEVENT_WINDOW_KEYINPUT:
- case VCLEVENT_WINDOW_KEYUP:
- {
- if ( !m_aKeyListeners.getLength() )
- break;
-
- const bool bKeyPressed = ( _nEventId == VCLEVENT_WINDOW_KEYINPUT );
- awt::KeyEvent aEvent( VCLUnoHelper::createKeyEvent( *static_cast< const ::KeyEvent* >( _pEventData ), *this ) );
- m_aKeyListeners.notifyEach( bKeyPressed ? &awt::XKeyListener::keyPressed: &awt::XKeyListener::keyReleased, aEvent );
- }
- break;
- }
-}
-
-/*************************************************************************/
-TYPEINIT1(FmXDataCell, FmXGridCell);
-//------------------------------------------------------------------------------
-void FmXDataCell::PaintFieldToCell(OutputDevice& rDev, const Rectangle& rRect,
- const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
- const Reference< XNumberFormatter >& xFormatter)
-{
- m_pCellControl->PaintFieldToCell( rDev, rRect, _rxField, xFormatter );
-}
-
-//------------------------------------------------------------------------------
-void FmXDataCell::UpdateFromColumn()
-{
- Reference< ::com::sun::star::sdb::XColumn > xField(m_pColumn->GetCurrentFieldValue());
- if (xField.is())
- m_pCellControl->UpdateFromField(xField, m_pColumn->GetParent().getNumberFormatter());
-}
-
-/*************************************************************************/
-TYPEINIT1(FmXTextCell, FmXDataCell);
-
-FmXTextCell::FmXTextCell( DbGridColumn* pColumn, DbCellControl& _rControl )
- :FmXDataCell( pColumn, _rControl )
- ,m_bFastPaint( sal_True )
-{
-}
-
-//------------------------------------------------------------------------------
-void FmXTextCell::PaintFieldToCell(OutputDevice& rDev,
- const Rectangle& rRect,
- const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
- const Reference< XNumberFormatter >& xFormatter)
-{
- if ( !m_bFastPaint )
- {
- FmXDataCell::PaintFieldToCell( rDev, rRect, _rxField, xFormatter );
- return;
- }
-
- sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_VCENTER;
- if ( ( rDev.GetOutDevType() == OUTDEV_WINDOW ) && !static_cast< Window& >( rDev ).IsEnabled() )
- nStyle |= TEXT_DRAW_DISABLE;
-
- switch (m_pColumn->GetAlignment())
- {
- case ::com::sun::star::awt::TextAlign::RIGHT:
- nStyle |= TEXT_DRAW_RIGHT;
- break;
- case ::com::sun::star::awt::TextAlign::CENTER:
- nStyle |= TEXT_DRAW_CENTER;
- break;
- default:
- nStyle |= TEXT_DRAW_LEFT;
- }
-
- Color* pColor = NULL;
- String aText = GetText(_rxField, xFormatter, &pColor);
- if (pColor != NULL)
- {
- Color aOldTextColor( rDev.GetTextColor() );
- rDev.SetTextColor( *pColor );
- rDev.DrawText(rRect, aText, nStyle);
- rDev.SetTextColor( aOldTextColor );
- }
- else
- rDev.DrawText(rRect, aText, nStyle);
-}
-
-
-/*************************************************************************/
-
-DBG_NAME(FmXEditCell);
-//------------------------------------------------------------------------------
-FmXEditCell::FmXEditCell( DbGridColumn* pColumn, DbCellControl& _rControl )
- :FmXTextCell( pColumn, _rControl )
- ,m_aTextListeners(m_aMutex)
- ,m_aChangeListeners( m_aMutex )
- ,m_pEditImplementation( NULL )
- ,m_bOwnEditImplementation( false )
-{
- DBG_CTOR(FmXEditCell,NULL);
-
- DbTextField* pTextField = PTR_CAST( DbTextField, &_rControl );
- if ( pTextField )
- {
-
- m_pEditImplementation = pTextField->GetEditImplementation();
- if ( !pTextField->IsSimpleEdit() )
- m_bFastPaint = sal_False;
- }
- else
- {
- m_pEditImplementation = new EditImplementation( static_cast< Edit& >( _rControl.GetWindow() ) );
- m_bOwnEditImplementation = true;
- }
-}
-
-//------------------------------------------------------------------
-FmXEditCell::~FmXEditCell()
-{
- if (!OComponentHelper::rBHelper.bDisposed)
- {
- acquire();
- dispose();
- }
-
-
- DBG_DTOR(FmXEditCell,NULL);
-}
-
-// OComponentHelper
-//-----------------------------------------------------------------------------
-void FmXEditCell::disposing()
-{
- ::com::sun::star::lang::EventObject aEvt(*this);
- m_aTextListeners.disposeAndClear(aEvt);
- m_aChangeListeners.disposeAndClear(aEvt);
-
- m_pEditImplementation->SetModifyHdl( Link() );
- if ( m_bOwnEditImplementation )
- delete m_pEditImplementation;
- m_pEditImplementation = NULL;
-
- FmXDataCell::disposing();
-}
-
-//------------------------------------------------------------------
-Any SAL_CALL FmXEditCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException)
-{
- Any aReturn = FmXTextCell::queryAggregation( _rType );
-
- if ( !aReturn.hasValue() )
- aReturn = FmXEditCell_Base::queryInterface( _rType );
-
- return aReturn;
-}
-
-//-------------------------------------------------------------------------
-Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXEditCell::getTypes( ) throw(RuntimeException)
-{
- return ::comphelper::concatSequences(
- FmXTextCell::getTypes(),
- FmXEditCell_Base::getTypes()
- );
-}
-
-//------------------------------------------------------------------------------
-IMPLEMENT_GET_IMPLEMENTATION_ID( FmXEditCell )
-
-// ::com::sun::star::awt::XTextComponent
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::addTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException )
-{
- m_aTextListeners.addInterface( l );
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::removeTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException )
-{
- m_aTextListeners.removeInterface( l );
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::setText( const ::rtl::OUString& aText ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pEditImplementation )
- {
- m_pEditImplementation->SetText( aText );
-
- // In JAVA wird auch ein textChanged ausgeloest, in VCL nicht.
- // ::com::sun::star::awt::Toolkit soll JAVA-komform sein...
- onTextChanged();
- }
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::insertText(const ::com::sun::star::awt::Selection& rSel, const ::rtl::OUString& aText) throw(RuntimeException)
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pEditImplementation )
- {
- m_pEditImplementation->SetSelection( Selection( rSel.Min, rSel.Max ) );
- m_pEditImplementation->ReplaceSelected( aText );
- }
-}
-
-//------------------------------------------------------------------------------
-::rtl::OUString SAL_CALL FmXEditCell::getText() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- ::rtl::OUString aText;
- if ( m_pEditImplementation )
- {
- if ( m_pEditImplementation->GetControl().IsVisible() && m_pColumn->GetParent().getDisplaySynchron())
- {
- // if the display isn't sync with the cursor we can't ask the edit field
- LineEnd eLineEndFormat = m_pColumn ? getModelLineEndSetting( m_pColumn->getModel() ) : LINEEND_LF;
- aText = m_pEditImplementation->GetText( eLineEndFormat );
- }
- else
- {
- Reference< ::com::sun::star::sdb::XColumn > xField(m_pColumn->GetCurrentFieldValue());
- if (xField.is())
- aText = GetText(xField, m_pColumn->GetParent().getNumberFormatter());
- }
- }
- return aText;
-}
-
-//------------------------------------------------------------------------------
-::rtl::OUString SAL_CALL FmXEditCell::getSelectedText( void ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- ::rtl::OUString aText;
- if ( m_pEditImplementation )
- {
- LineEnd eLineEndFormat = m_pColumn ? getModelLineEndSetting( m_pColumn->getModel() ) : LINEEND_LF;
- aText = m_pEditImplementation->GetSelected( eLineEndFormat );
- }
- return aText;
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::setSelection( const ::com::sun::star::awt::Selection& aSelection ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pEditImplementation )
- m_pEditImplementation->SetSelection( Selection( aSelection.Min, aSelection.Max ) );
-}
-
-//------------------------------------------------------------------------------
-::com::sun::star::awt::Selection SAL_CALL FmXEditCell::getSelection( void ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- Selection aSel;
- if ( m_pEditImplementation )
- aSel = m_pEditImplementation->GetSelection();
-
- return ::com::sun::star::awt::Selection(aSel.Min(), aSel.Max());
-}
-
-//------------------------------------------------------------------------------
-sal_Bool SAL_CALL FmXEditCell::isEditable( void ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- return ( m_pEditImplementation && !m_pEditImplementation->IsReadOnly() && m_pEditImplementation->GetControl().IsEnabled() ) ? sal_True : sal_False;
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::setEditable( sal_Bool bEditable ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pEditImplementation )
- m_pEditImplementation->SetReadOnly( !bEditable );
-}
-
-//------------------------------------------------------------------------------
-sal_Int16 SAL_CALL FmXEditCell::getMaxTextLen() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- return m_pEditImplementation ? m_pEditImplementation->GetMaxTextLen() : 0;
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::setMaxTextLen( sal_Int16 nLen ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if ( m_pEditImplementation )
- m_pEditImplementation->SetMaxTextLen( nLen );
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::addChangeListener( const Reference< form::XChangeListener >& _Listener ) throw (RuntimeException)
-{
- m_aChangeListeners.addInterface( _Listener );
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXEditCell::removeChangeListener( const Reference< form::XChangeListener >& _Listener ) throw (RuntimeException)
-{
- m_aChangeListeners.removeInterface( _Listener );
-}
-
-//------------------------------------------------------------------------------
-void FmXEditCell::onTextChanged()
-{
- ::com::sun::star::awt::TextEvent aEvent;
- aEvent.Source = *this;
- m_aTextListeners.notifyEach( &awt::XTextListener::textChanged, aEvent );
-}
-
-//------------------------------------------------------------------------------
-void FmXEditCell::onFocusGained( const awt::FocusEvent& _rEvent )
-{
- FmXTextCell::onFocusGained( _rEvent );
- m_sValueOnEnter = getText();
-}
-
-//------------------------------------------------------------------------------
-void FmXEditCell::onFocusLost( const awt::FocusEvent& _rEvent )
-{
- FmXTextCell::onFocusLost( _rEvent );
-
- if ( getText() != m_sValueOnEnter )
- {
- lang::EventObject aEvent( *this );
- m_aChangeListeners.notifyEach( &XChangeListener::changed, aEvent );
- }
-}
-
-//------------------------------------------------------------------------------
-void FmXEditCell::onWindowEvent( const sal_uIntPtr _nEventId, const Window& _rWindow, const void* _pEventData )
-{
- switch ( _nEventId )
- {
- case VCLEVENT_EDIT_MODIFY:
- {
- if ( m_pEditImplementation && m_aTextListeners.getLength() )
- onTextChanged();
- return;
- }
- }
-
- FmXTextCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
-}
-
-/*************************************************************************/
-DBG_NAME(FmXCheckBoxCell);
-//------------------------------------------------------------------------------
-FmXCheckBoxCell::FmXCheckBoxCell( DbGridColumn* pColumn, DbCellControl& _rControl )
- :FmXDataCell( pColumn, _rControl )
- ,m_aItemListeners(m_aMutex)
- ,m_aActionListeners( m_aMutex )
- ,m_pBox( & static_cast< CheckBoxControl& >( _rControl.GetWindow() ).GetBox() )
-{
- DBG_CTOR(FmXCheckBoxCell,NULL);
-}
-
-//------------------------------------------------------------------
-FmXCheckBoxCell::~FmXCheckBoxCell()
-{
- if (!OComponentHelper::rBHelper.bDisposed)
- {
- acquire();
- dispose();
- }
-
- DBG_DTOR(FmXCheckBoxCell,NULL);
-}
-
-// OComponentHelper
-//-----------------------------------------------------------------------------
-void FmXCheckBoxCell::disposing()
-{
- ::com::sun::star::lang::EventObject aEvt(*this);
- m_aItemListeners.disposeAndClear(aEvt);
- m_aActionListeners.disposeAndClear(aEvt);
-
- static_cast< CheckBoxControl& >( m_pCellControl->GetWindow() ).SetClickHdl(Link());
- m_pBox = NULL;
-
- FmXDataCell::disposing();
-}
-
-//------------------------------------------------------------------
-Any SAL_CALL FmXCheckBoxCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException)
-{
- Any aReturn = FmXDataCell::queryAggregation( _rType );
-
- if ( !aReturn.hasValue() )
- aReturn = FmXCheckBoxCell_Base::queryInterface( _rType );
-
- return aReturn;
-}
-
-//-------------------------------------------------------------------------
-Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXCheckBoxCell::getTypes( ) throw(RuntimeException)
-{
- return ::comphelper::concatSequences(
- FmXDataCell::getTypes(),
- FmXCheckBoxCell_Base::getTypes()
- );
-}
-
-//------------------------------------------------------------------------------
-IMPLEMENT_GET_IMPLEMENTATION_ID( FmXCheckBoxCell )
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::addItemListener( const Reference< ::com::sun::star::awt::XItemListener >& l ) throw( RuntimeException )
-{
- m_aItemListeners.addInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::removeItemListener( const Reference< ::com::sun::star::awt::XItemListener >& l ) throw( RuntimeException )
-{
- m_aItemListeners.removeInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::setState( short n ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- {
- UpdateFromColumn();
- m_pBox->SetState( (TriState)n );
- }
-}
-
-//------------------------------------------------------------------
-short SAL_CALL FmXCheckBoxCell::getState() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- {
- UpdateFromColumn();
- return (short)m_pBox->GetState();
- }
- return STATE_DONTKNOW;
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::enableTriState( sal_Bool b ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- m_pBox->EnableTriState( b );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::addActionListener( const Reference< awt::XActionListener >& _Listener ) throw (RuntimeException)
-{
- m_aActionListeners.addInterface( _Listener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::removeActionListener( const Reference< awt::XActionListener >& _Listener ) throw (RuntimeException)
-{
- m_aActionListeners.removeInterface( _Listener );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::setLabel( const ::rtl::OUString& _Label ) throw (RuntimeException)
-{
- SolarMutexGuard aGuard;
- if ( m_pColumn )
- {
- DbGridControl& rGrid( m_pColumn->GetParent() );
- rGrid.SetColumnTitle( rGrid.GetColumnId( m_pColumn->GetFieldPos() ), _Label );
- }
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXCheckBoxCell::setActionCommand( const ::rtl::OUString& _Command ) throw (RuntimeException)
-{
- m_aActionCommand = _Command;
-}
-
-//------------------------------------------------------------------
-Window* FmXCheckBoxCell::getEventWindow() const
-{
- return m_pBox;
-}
-
-//------------------------------------------------------------------
-void FmXCheckBoxCell::onWindowEvent( const sal_uIntPtr _nEventId, const Window& _rWindow, const void* _pEventData )
-{
- switch ( _nEventId )
- {
- case VCLEVENT_CHECKBOX_TOGGLE:
- {
- // check boxes are to be committed immediately (this holds for ordinary check box controls in
- // documents, and this must hold for check boxes in grid columns, too
- // 91210 - 22.08.2001 - frank.schoenheit@sun.com
- m_pCellControl->Commit();
-
- Reference< XWindow > xKeepAlive( this );
- if ( m_aItemListeners.getLength() && m_pBox )
- {
- awt::ItemEvent aEvent;
- aEvent.Source = *this;
- aEvent.Highlighted = sal_False;
- aEvent.Selected = m_pBox->GetState();
- m_aItemListeners.notifyEach( &awt::XItemListener::itemStateChanged, aEvent );
- }
- if ( m_aActionListeners.getLength() )
- {
- awt::ActionEvent aEvent;
- aEvent.Source = *this;
- aEvent.ActionCommand = m_aActionCommand;
- m_aActionListeners.notifyEach( &awt::XActionListener::actionPerformed, aEvent );
- }
- }
- break;
-
- default:
- FmXDataCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
- break;
- }
-}
-
-/*************************************************************************/
-
-DBG_NAME(FmXListBoxCell);
-//------------------------------------------------------------------------------
-FmXListBoxCell::FmXListBoxCell(DbGridColumn* pColumn, DbCellControl& _rControl)
- :FmXTextCell( pColumn, _rControl )
- ,m_aItemListeners(m_aMutex)
- ,m_aActionListeners(m_aMutex)
- ,m_pBox( &static_cast< ListBox& >( _rControl.GetWindow() ) )
-{
- DBG_CTOR(FmXListBoxCell,NULL);
-
- m_pBox->SetDoubleClickHdl( LINK( this, FmXListBoxCell, OnDoubleClick ) );
-}
-
-//------------------------------------------------------------------
-FmXListBoxCell::~FmXListBoxCell()
-{
- if (!OComponentHelper::rBHelper.bDisposed)
- {
- acquire();
- dispose();
- }
-
- DBG_DTOR(FmXListBoxCell,NULL);
-}
-
-// OComponentHelper
-//-----------------------------------------------------------------------------
-void FmXListBoxCell::disposing()
-{
- ::com::sun::star::lang::EventObject aEvt(*this);
- m_aItemListeners.disposeAndClear(aEvt);
- m_aActionListeners.disposeAndClear(aEvt);
-
- m_pBox->SetSelectHdl( Link() );
- m_pBox->SetDoubleClickHdl( Link() );
- m_pBox = NULL;
-
- FmXTextCell::disposing();
-}
-
-//------------------------------------------------------------------
-Any SAL_CALL FmXListBoxCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException)
-{
- Any aReturn = FmXTextCell::queryAggregation(_rType);
-
- if ( !aReturn.hasValue() )
- aReturn = FmXListBoxCell_Base::queryInterface( _rType );
-
- return aReturn;
-}
-
-//-------------------------------------------------------------------------
-Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXListBoxCell::getTypes( ) throw(RuntimeException)
-{
- return ::comphelper::concatSequences(
- FmXTextCell::getTypes(),
- FmXListBoxCell_Base::getTypes()
- );
-}
-
-//------------------------------------------------------------------------------
-IMPLEMENT_GET_IMPLEMENTATION_ID( FmXListBoxCell )
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::addItemListener(const Reference< ::com::sun::star::awt::XItemListener >& l) throw( RuntimeException )
-{
- m_aItemListeners.addInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::removeItemListener(const Reference< ::com::sun::star::awt::XItemListener >& l) throw( RuntimeException )
-{
- m_aItemListeners.removeInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::addActionListener(const Reference< ::com::sun::star::awt::XActionListener >& l) throw( RuntimeException )
-{
- m_aActionListeners.addInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::removeActionListener(const Reference< ::com::sun::star::awt::XActionListener >& l) throw( RuntimeException )
-{
- m_aActionListeners.removeInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::addItem(const ::rtl::OUString& aItem, sal_Int16 nPos) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if (m_pBox)
- m_pBox->InsertEntry( aItem, nPos );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::addItems(const ::comphelper::StringSequence& aItems, sal_Int16 nPos) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if (m_pBox)
- {
- sal_uInt16 nP = nPos;
- for ( sal_uInt16 n = 0; n < aItems.getLength(); n++ )
- {
- m_pBox->InsertEntry( aItems.getConstArray()[n], nP );
- if ( nPos != -1 ) // Nicht wenn 0xFFFF, weil LIST_APPEND
- nP++;
- }
- }
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::removeItems(sal_Int16 nPos, sal_Int16 nCount) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if ( m_pBox )
- {
- for ( sal_uInt16 n = nCount; n; )
- m_pBox->RemoveEntry( nPos + (--n) );
- }
-}
-
-//------------------------------------------------------------------
-sal_Int16 SAL_CALL FmXListBoxCell::getItemCount() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- return m_pBox ? m_pBox->GetEntryCount() : 0;
-}
-
-//------------------------------------------------------------------
-::rtl::OUString SAL_CALL FmXListBoxCell::getItem(sal_Int16 nPos) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- String aItem;
- if (m_pBox)
- aItem = m_pBox->GetEntry( nPos );
- return aItem;
-}
-//------------------------------------------------------------------
-::comphelper::StringSequence SAL_CALL FmXListBoxCell::getItems() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- ::comphelper::StringSequence aSeq;
- if (m_pBox)
- {
- sal_uInt16 nEntries = m_pBox ->GetEntryCount();
- aSeq = ::comphelper::StringSequence( nEntries );
- for ( sal_uInt16 n = nEntries; n; )
- {
- --n;
- aSeq.getArray()[n] = m_pBox ->GetEntry( n );
- }
- }
- return aSeq;
-}
-
-//------------------------------------------------------------------
-sal_Int16 SAL_CALL FmXListBoxCell::getSelectedItemPos() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if (m_pBox)
- {
- UpdateFromColumn();
- return m_pBox->GetSelectEntryPos();
- }
- return 0;
-}
-
-//------------------------------------------------------------------
-Sequence< sal_Int16 > SAL_CALL FmXListBoxCell::getSelectedItemsPos() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- Sequence<sal_Int16> aSeq;
-
- if (m_pBox)
- {
- UpdateFromColumn();
- sal_uInt16 nSelEntries = m_pBox->GetSelectEntryCount();
- aSeq = Sequence<sal_Int16>( nSelEntries );
- for ( sal_uInt16 n = 0; n < nSelEntries; n++ )
- aSeq.getArray()[n] = m_pBox->GetSelectEntryPos( n );
- }
- return aSeq;
-}
-//------------------------------------------------------------------
-::rtl::OUString SAL_CALL FmXListBoxCell::getSelectedItem() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- String aItem;
- if (m_pBox)
- {
- UpdateFromColumn();
- aItem = m_pBox->GetSelectEntry();
- }
-
- return aItem;
-}
-
-//------------------------------------------------------------------
-::comphelper::StringSequence SAL_CALL FmXListBoxCell::getSelectedItems() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- ::comphelper::StringSequence aSeq;
-
- if (m_pBox)
- {
- UpdateFromColumn();
- sal_uInt16 nSelEntries = m_pBox->GetSelectEntryCount();
- aSeq = ::comphelper::StringSequence( nSelEntries );
- for ( sal_uInt16 n = 0; n < nSelEntries; n++ )
- aSeq.getArray()[n] = m_pBox->GetSelectEntry( n );
- }
- return aSeq;
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::selectItemPos(sal_Int16 nPos, sal_Bool bSelect) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- m_pBox->SelectEntryPos( nPos, bSelect );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::selectItemsPos(const Sequence< sal_Int16 >& aPositions, sal_Bool bSelect) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- {
- for ( sal_uInt16 n = (sal_uInt16)aPositions.getLength(); n; )
- m_pBox->SelectEntryPos( (sal_uInt16) aPositions.getConstArray()[--n], bSelect );
- }
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::selectItem(const ::rtl::OUString& aItem, sal_Bool bSelect) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- m_pBox->SelectEntry( aItem, bSelect );
-}
-
-//------------------------------------------------------------------
-sal_Bool SAL_CALL FmXListBoxCell::isMutipleMode() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- sal_Bool bMulti = sal_False;
- if (m_pBox)
- bMulti = m_pBox->IsMultiSelectionEnabled();
- return bMulti;
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::setMultipleMode(sal_Bool bMulti) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- m_pBox->EnableMultiSelection( bMulti );
-}
-
-//------------------------------------------------------------------
-sal_Int16 SAL_CALL FmXListBoxCell::getDropDownLineCount() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- sal_Int16 nLines = 0;
- if (m_pBox)
- nLines = m_pBox->GetDropDownLineCount();
-
- return nLines;
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::setDropDownLineCount(sal_Int16 nLines) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- m_pBox->SetDropDownLineCount( nLines );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXListBoxCell::makeVisible(sal_Int16 nEntry) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- if (m_pBox)
- m_pBox->SetTopEntry( nEntry );
-}
-
-//------------------------------------------------------------------
-void FmXListBoxCell::onWindowEvent( const sal_uIntPtr _nEventId, const Window& _rWindow, const void* _pEventData )
-{
- if ( ( &_rWindow == m_pBox )
- && ( _nEventId == VCLEVENT_LISTBOX_SELECT )
- )
- {
- OnDoubleClick( NULL );
-
- ::com::sun::star::awt::ItemEvent aEvent;
- aEvent.Source = *this;
- aEvent.Highlighted = sal_False;
-
- // Bei Mehrfachselektion 0xFFFF, sonst die ID
- aEvent.Selected = (m_pBox->GetSelectEntryCount() == 1 )
- ? m_pBox->GetSelectEntryPos() : 0xFFFF;
-
- m_aItemListeners.notifyEach( &awt::XItemListener::itemStateChanged, aEvent );
- return;
- }
-
- FmXTextCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
-}
-
-
-//------------------------------------------------------------------
-IMPL_LINK( FmXListBoxCell, OnDoubleClick, void*, EMPTYARG )
-{
- if (m_pBox)
- {
- ::cppu::OInterfaceIteratorHelper aIt( m_aActionListeners );
-
- ::com::sun::star::awt::ActionEvent aEvent;
- aEvent.Source = *this;
- aEvent.ActionCommand = m_pBox->GetSelectEntry();
-
- while( aIt.hasMoreElements() )
- ((::com::sun::star::awt::XActionListener *)aIt.next())->actionPerformed( aEvent );
- }
- return 1;
-}
-
-
-/*************************************************************************/
-
-DBG_NAME( FmXComboBoxCell );
-
-//------------------------------------------------------------------------------
-FmXComboBoxCell::FmXComboBoxCell( DbGridColumn* pColumn, DbCellControl& _rControl )
- :FmXTextCell( pColumn, _rControl )
- ,m_aItemListeners( m_aMutex )
- ,m_aActionListeners( m_aMutex )
- ,m_pComboBox( &static_cast< ComboBox& >( _rControl.GetWindow() ) )
-{
- DBG_CTOR( FmXComboBoxCell, NULL );
-}
-
-//------------------------------------------------------------------------------
-FmXComboBoxCell::~FmXComboBoxCell()
-{
- if ( !OComponentHelper::rBHelper.bDisposed )
- {
- acquire();
- dispose();
- }
-
- DBG_DTOR( FmXComboBoxCell, NULL );
-}
-
-//-----------------------------------------------------------------------------
-void FmXComboBoxCell::disposing()
-{
- ::com::sun::star::lang::EventObject aEvt(*this);
- m_aItemListeners.disposeAndClear(aEvt);
- m_aActionListeners.disposeAndClear(aEvt);
-
- FmXTextCell::disposing();
-}
-
-//------------------------------------------------------------------
-Any SAL_CALL FmXComboBoxCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException)
-{
- Any aReturn = FmXTextCell::queryAggregation(_rType);
-
- if ( !aReturn.hasValue() )
- aReturn = FmXComboBoxCell_Base::queryInterface( _rType );
-
- return aReturn;
-}
-
-//-------------------------------------------------------------------------
-Sequence< Type > SAL_CALL FmXComboBoxCell::getTypes( ) throw(RuntimeException)
-{
- return ::comphelper::concatSequences(
- FmXTextCell::getTypes(),
- FmXComboBoxCell_Base::getTypes()
- );
-}
-
-//------------------------------------------------------------------------------
-IMPLEMENT_GET_IMPLEMENTATION_ID( FmXComboBoxCell )
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::addItemListener(const Reference< awt::XItemListener >& l) throw( RuntimeException )
-{
- m_aItemListeners.addInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::removeItemListener(const Reference< awt::XItemListener >& l) throw( RuntimeException )
-{
- m_aItemListeners.removeInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::addActionListener(const Reference< awt::XActionListener >& l) throw( RuntimeException )
-{
- m_aActionListeners.addInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::removeActionListener(const Reference< awt::XActionListener >& l) throw( RuntimeException )
-{
- m_aActionListeners.removeInterface( l );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::addItem( const ::rtl::OUString& _Item, sal_Int16 _Pos ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if ( m_pComboBox )
- m_pComboBox->InsertEntry( _Item, _Pos );
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::addItems( const Sequence< ::rtl::OUString >& _Items, sal_Int16 _Pos ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if ( m_pComboBox )
- {
- sal_uInt16 nP = _Pos;
- for ( sal_uInt16 n = 0; n < _Items.getLength(); n++ )
- {
- m_pComboBox->InsertEntry( _Items.getConstArray()[n], nP );
- if ( _Pos != -1 )
- nP++;
- }
- }
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::removeItems( sal_Int16 _Pos, sal_Int16 _Count ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if ( m_pComboBox )
- {
- for ( sal_uInt16 n = _Count; n; )
- m_pComboBox->RemoveEntry( _Pos + (--n) );
- }
-}
-
-//------------------------------------------------------------------
-sal_Int16 SAL_CALL FmXComboBoxCell::getItemCount() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- return m_pComboBox ? m_pComboBox->GetEntryCount() : 0;
-}
-
-//------------------------------------------------------------------
-::rtl::OUString SAL_CALL FmXComboBoxCell::getItem( sal_Int16 _Pos ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- String sItem;
- if ( m_pComboBox )
- sItem = m_pComboBox->GetEntry( _Pos );
- return sItem;
-}
-//------------------------------------------------------------------
-Sequence< ::rtl::OUString > SAL_CALL FmXComboBoxCell::getItems() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- Sequence< ::rtl::OUString > aItems;
- if ( m_pComboBox )
- {
- sal_uInt16 nEntries = m_pComboBox->GetEntryCount();
- aItems.realloc( nEntries );
- ::rtl::OUString* pItem = aItems.getArray();
- for ( sal_uInt16 n=0; n<nEntries; ++n, ++pItem )
- *pItem = m_pComboBox->GetEntry( n );
- }
- return aItems;
-}
-
-//------------------------------------------------------------------
-sal_Int16 SAL_CALL FmXComboBoxCell::getDropDownLineCount() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
-
- sal_Int16 nLines = 0;
- if ( m_pComboBox )
- nLines = m_pComboBox->GetDropDownLineCount();
-
- return nLines;
-}
-
-//------------------------------------------------------------------
-void SAL_CALL FmXComboBoxCell::setDropDownLineCount(sal_Int16 nLines) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- if ( m_pComboBox )
- m_pComboBox->SetDropDownLineCount( nLines );
-}
-
-//------------------------------------------------------------------------------
-void FmXComboBoxCell::onWindowEvent( const sal_uIntPtr _nEventId, const Window& _rWindow, const void* _pEventData )
-{
-
- switch ( _nEventId )
- {
- case VCLEVENT_COMBOBOX_SELECT:
- {
- awt::ItemEvent aEvent;
- aEvent.Source = *this;
- aEvent.Highlighted = sal_False;
-
- // Bei Mehrfachselektion 0xFFFF, sonst die ID
- aEvent.Selected = ( m_pComboBox->GetSelectEntryCount() == 1 )
- ? m_pComboBox->GetSelectEntryPos()
- : 0xFFFF;
- m_aItemListeners.notifyEach( &awt::XItemListener::itemStateChanged, aEvent );
- }
- break;
-
- default:
- FmXTextCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
- break;
- }
-}
-
-/*************************************************************************/
-TYPEINIT1(FmXFilterCell, FmXGridCell);
-
-//------------------------------------------------------------------------------
-Reference< XInterface > FmXFilterCell_CreateInstance(const Reference< ::com::sun::star::lang::XMultiServiceFactory >& /*_rxFactory*/)
-{
- return *new FmXFilterCell();
-}
-
-DBG_NAME(FmXFilterCell);
-//------------------------------------------------------------------------------
-FmXFilterCell::FmXFilterCell(DbGridColumn* pColumn, DbCellControl* pControl )
- :FmXGridCell( pColumn, pControl )
- ,m_aTextListeners(m_aMutex)
-{
- DBG_CTOR(FmXFilterCell,NULL);
-
- DBG_ASSERT( m_pCellControl->ISA( DbFilterField ), "FmXFilterCell::FmXFilterCell: invalid cell control!" );
- static_cast< DbFilterField* >( m_pCellControl )->SetCommitHdl( LINK( this, FmXFilterCell, OnCommit ) );
-}
-
-//------------------------------------------------------------------
-FmXFilterCell::~FmXFilterCell()
-{
- if (!OComponentHelper::rBHelper.bDisposed)
- {
- acquire();
- dispose();
- }
-
- DBG_DTOR(FmXFilterCell,NULL);
-}
-
-// XUnoTunnel
-//------------------------------------------------------------------------------
-sal_Int64 SAL_CALL FmXFilterCell::getSomething( const Sequence< sal_Int8 >& _rIdentifier ) throw(RuntimeException)
-{
- sal_Int64 nReturn(0);
-
- if ( (_rIdentifier.getLength() == 16)
- && (0 == rtl_compareMemory( getUnoTunnelId().getConstArray(), _rIdentifier.getConstArray(), 16 ))
- )
- {
- nReturn = reinterpret_cast<sal_Int64>(this);
- }
-
- return nReturn;
-}
-
-namespace
-{
- class theFmXFilterCellUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theFmXFilterCellUnoTunnelId > {};
-}
-
-const Sequence<sal_Int8>& FmXFilterCell::getUnoTunnelId()
-{
- return theFmXFilterCellUnoTunnelId::get().getSeq();
-}
-
-//------------------------------------------------------------------------------
-FmXFilterCell* FmXFilterCell::getImplementation(const Reference< ::com::sun::star::awt::XControl >& _rxObject)
-{
- Reference< ::com::sun::star::lang::XUnoTunnel > xTunnel(
- _rxObject, UNO_QUERY);
- if (xTunnel.is())
- return reinterpret_cast<FmXFilterCell*>(xTunnel->getSomething(getUnoTunnelId()));
- return NULL;
-}
-
-//------------------------------------------------------------------------------
-void FmXFilterCell::PaintCell( OutputDevice& rDev, const Rectangle& rRect )
-{
- static_cast< DbFilterField* >( m_pCellControl )->PaintCell( rDev, rRect );
-}
-
-// OComponentHelper
-//-----------------------------------------------------------------------------
-void FmXFilterCell::disposing()
-{
- ::com::sun::star::lang::EventObject aEvt(*this);
- m_aTextListeners.disposeAndClear(aEvt);
-
- ((DbFilterField*)m_pCellControl)->SetCommitHdl(Link());
-
- FmXGridCell::disposing();
-}
-
-//------------------------------------------------------------------
-Any SAL_CALL FmXFilterCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException)
-{
- Any aReturn = FmXGridCell::queryAggregation(_rType);
-
- if ( !aReturn.hasValue() )
- aReturn = FmXFilterCell_Base::queryInterface( _rType );
-
- return aReturn;
-}
-
-//-------------------------------------------------------------------------
-Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXFilterCell::getTypes( ) throw(RuntimeException)
-{
- return ::comphelper::concatSequences(
- FmXGridCell::getTypes(),
- FmXFilterCell_Base::getTypes()
- );
-}
-
-//------------------------------------------------------------------------------
-IMPLEMENT_GET_IMPLEMENTATION_ID( FmXFilterCell )
-
-// ::com::sun::star::awt::XTextComponent
-//------------------------------------------------------------------------------
-void SAL_CALL FmXFilterCell::addTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException )
-{
- m_aTextListeners.addInterface( l );
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXFilterCell::removeTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException )
-{
- m_aTextListeners.removeInterface( l );
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXFilterCell::setText( const ::rtl::OUString& aText ) throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- ((DbFilterField*)m_pCellControl)->SetText(aText);
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXFilterCell::insertText( const ::com::sun::star::awt::Selection& /*rSel*/, const ::rtl::OUString& /*aText*/ ) throw( RuntimeException )
-{
-}
-
-//------------------------------------------------------------------------------
-::rtl::OUString SAL_CALL FmXFilterCell::getText() throw( RuntimeException )
-{
- ::osl::MutexGuard aGuard( m_aMutex );
- return ((DbFilterField*)m_pCellControl)->GetText();
-}
-
-//------------------------------------------------------------------------------
-::rtl::OUString SAL_CALL FmXFilterCell::getSelectedText( void ) throw( RuntimeException )
-{
- return getText();
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXFilterCell::setSelection( const ::com::sun::star::awt::Selection& /*aSelection*/ ) throw( RuntimeException )
-{
-}
-
-//------------------------------------------------------------------------------
-::com::sun::star::awt::Selection SAL_CALL FmXFilterCell::getSelection( void ) throw( RuntimeException )
-{
- return ::com::sun::star::awt::Selection();
-}
-
-//------------------------------------------------------------------------------
-sal_Bool SAL_CALL FmXFilterCell::isEditable( void ) throw( RuntimeException )
-{
- return sal_True;
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXFilterCell::setEditable( sal_Bool /*bEditable*/ ) throw( RuntimeException )
-{
-}
-
-//------------------------------------------------------------------------------
-sal_Int16 SAL_CALL FmXFilterCell::getMaxTextLen() throw( RuntimeException )
-{
- return 0;
-}
-
-//------------------------------------------------------------------------------
-void SAL_CALL FmXFilterCell::setMaxTextLen( sal_Int16 /*nLen*/ ) throw( RuntimeException )
-{
-}
-
-//------------------------------------------------------------------------------
-IMPL_LINK( FmXFilterCell, OnCommit, void*, EMPTYARG )
-{
- ::cppu::OInterfaceIteratorHelper aIt( m_aTextListeners );
- ::com::sun::star::awt::TextEvent aEvt;
- aEvt.Source = *this;
- while( aIt.hasMoreElements() )
- ((::com::sun::star::awt::XTextListener *)aIt.next())->textChanged( aEvt );
- return 1;
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */