LCOV - code coverage report
Current view: top level - svx/source/fmcomp - gridcell.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 486 2312 21.0 %
Date: 2014-11-03 Functions: 79 405 19.5 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : 
      21             : #include <sal/macros.h>
      22             : #include "fmprop.hrc"
      23             : #include "svx/fmresids.hrc"
      24             : #include "svx/fmtools.hxx"
      25             : #include "gridcell.hxx"
      26             : #include "gridcols.hxx"
      27             : #include "sdbdatacolumn.hxx"
      28             : 
      29             : #include <com/sun/star/awt/LineEndFormat.hpp>
      30             : #include <com/sun/star/awt/MouseWheelBehavior.hpp>
      31             : #include <com/sun/star/awt/VisualEffect.hpp>
      32             : #include <com/sun/star/container/XChild.hpp>
      33             : #include <com/sun/star/container/XNamed.hpp>
      34             : #include <com/sun/star/form/FormComponentType.hpp>
      35             : #include <com/sun/star/form/XBoundComponent.hpp>
      36             : #include <com/sun/star/script/XEventAttacherManager.hpp>
      37             : #include <com/sun/star/sdb/XSQLQueryComposerFactory.hpp>
      38             : #include <com/sun/star/sdbcx/XTablesSupplier.hpp>
      39             : #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
      40             : #include <com/sun/star/sdbc/ColumnValue.hpp>
      41             : #include <com/sun/star/sdbc/DataType.hpp>
      42             : #include <com/sun/star/sdbc/XStatement.hpp>
      43             : #include <com/sun/star/util/NumberFormat.hpp>
      44             : #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
      45             : #include <com/sun/star/util/Time.hpp>
      46             : #include <com/sun/star/util/Date.hpp>
      47             : 
      48             : #include <comphelper/numbers.hxx>
      49             : #include <comphelper/property.hxx>
      50             : #include <comphelper/servicehelper.hxx>
      51             : #include <comphelper/string.hxx>
      52             : #include <connectivity/formattedcolumnvalue.hxx>
      53             : #include <cppuhelper/typeprovider.hxx>
      54             : #include <i18nlangtag/lang.h>
      55             : 
      56             : #include <rtl/math.hxx>
      57             : #include <svtools/calendar.hxx>
      58             : #include <svtools/fmtfield.hxx>
      59             : #include <svl/numuno.hxx>
      60             : #include <svtools/svmedit.hxx>
      61             : #include <svx/dialmgr.hxx>
      62             : #include <toolkit/helper/vclunohelper.hxx>
      63             : #include <tools/diagnose_ex.h>
      64             : #include <vcl/longcurr.hxx>
      65             : #include <vcl/settings.hxx>
      66             : #include <connectivity/dbtools.hxx>
      67             : #include <connectivity/dbconversion.hxx>
      68             : 
      69             : #include <math.h>
      70             : #include <stdio.h>
      71             : 
      72             : using namespace ::connectivity;
      73             : using namespace ::connectivity::simple;
      74             : using namespace ::svxform;
      75             : using namespace ::comphelper;
      76             : using namespace ::svt;
      77             : using namespace ::com::sun::star;
      78             : using namespace ::com::sun::star::uno;
      79             : using namespace ::com::sun::star::sdbc;
      80             : using namespace ::com::sun::star::sdbcx;
      81             : using namespace ::com::sun::star::sdb;
      82             : using namespace ::com::sun::star::beans;
      83             : using namespace ::com::sun::star::form;
      84             : using namespace ::dbtools::DBTypeConversion;
      85             : using namespace ::dbtools;
      86             : 
      87             : using ::com::sun::star::util::XNumberFormatter;
      88             : namespace MouseWheelBehavior = ::com::sun::star::awt::MouseWheelBehavior;
      89             : 
      90             : const char INVALIDTEXT[] = "###";
      91             : const char OBJECTTEXT[] = "<OBJECT>";
      92             : 
      93             : 
      94             : //= helper
      95             : 
      96             : namespace
      97             : {
      98           0 :     static LineEnd getModelLineEndSetting( const Reference< XPropertySet >& _rxModel )
      99             :     {
     100           0 :         LineEnd eFormat = LINEEND_LF;
     101             : 
     102             :         try
     103             :         {
     104           0 :             sal_Int16 nLineEndFormat = awt::LineEndFormat::LINE_FEED;
     105             : 
     106           0 :             Reference< XPropertySetInfo > xPSI;
     107           0 :             if ( _rxModel.is() )
     108           0 :                 xPSI = _rxModel->getPropertySetInfo();
     109             : 
     110             :             OSL_ENSURE( xPSI.is(), "getModelLineEndSetting: invalid column model!" );
     111           0 :             if ( xPSI.is() && xPSI->hasPropertyByName( FM_PROP_LINEENDFORMAT ) )
     112             :             {
     113           0 :                 OSL_VERIFY( _rxModel->getPropertyValue( FM_PROP_LINEENDFORMAT ) >>= nLineEndFormat );
     114             : 
     115           0 :                 switch ( nLineEndFormat )
     116             :                 {
     117           0 :                 case awt::LineEndFormat::CARRIAGE_RETURN:            eFormat = LINEEND_CR; break;
     118           0 :                 case awt::LineEndFormat::LINE_FEED:                  eFormat = LINEEND_LF; break;
     119           0 :                 case awt::LineEndFormat::CARRIAGE_RETURN_LINE_FEED:  eFormat = LINEEND_CRLF; break;
     120             :                 default:
     121             :                     OSL_FAIL( "getModelLineEndSetting: what's this?" );
     122             :                 }
     123           0 :             }
     124             :         }
     125           0 :         catch( const Exception& )
     126             :         {
     127             :             OSL_FAIL( "getModelLineEndSetting: caught an exception!" );
     128             :             DBG_UNHANDLED_EXCEPTION();
     129             :         }
     130           0 :         return eFormat;
     131             :     }
     132             : }
     133             : 
     134             : 
     135             : //= DbGridColumn
     136             : 
     137             : 
     138         217 : CellControllerRef DbGridColumn::s_xEmptyController;
     139             : 
     140             : 
     141          62 : void DbGridColumn::CreateControl(sal_Int32 _nFieldPos, const Reference< ::com::sun::star::beans::XPropertySet >& xField, sal_Int32 nTypeId)
     142             : {
     143          62 :     Clear();
     144             : 
     145          62 :     m_nTypeId = (sal_Int16)nTypeId;
     146          62 :     if (xField != m_xField)
     147             :     {
     148             :         // Grundeinstellung
     149          62 :         m_xField = xField;
     150          62 :         xField->getPropertyValue(FM_PROP_FORMATKEY) >>= m_nFormatKey;
     151          62 :         m_nFieldPos   = (sal_Int16)_nFieldPos;
     152          62 :         m_bReadOnly   = ::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_ISREADONLY));
     153          62 :         m_bAutoValue  = ::comphelper::getBOOL(xField->getPropertyValue(FM_PROP_AUTOINCREMENT));
     154          62 :         m_nFieldType  = (sal_Int16)::comphelper::getINT32(xField->getPropertyValue(FM_PROP_FIELDTYPE));
     155             : 
     156          62 :         switch (m_nFieldType)
     157             :         {
     158             :             case DataType::DATE:
     159             :             case DataType::TIME:
     160             :             case DataType::TIMESTAMP:
     161           0 :                 m_bDateTime = true;
     162             :                 //fall-through
     163             :             case DataType::BIT:
     164             :             case DataType::BOOLEAN:
     165             :             case DataType::TINYINT:
     166             :             case DataType::SMALLINT:
     167             :             case DataType::INTEGER:
     168             :             case DataType::BIGINT:
     169             :             case DataType::FLOAT:
     170             :             case DataType::REAL:
     171             :             case DataType::DOUBLE:
     172             :             case DataType::NUMERIC:
     173             :             case DataType::DECIMAL:
     174           0 :                 m_nAlign = ::com::sun::star::awt::TextAlign::RIGHT;
     175           0 :                 m_bNumeric = true;
     176           0 :                 break;
     177             :             default:
     178          62 :                 m_nAlign = ::com::sun::star::awt::TextAlign::LEFT;
     179          62 :                 break;
     180             :         }
     181             :     }
     182             : 
     183          62 :     DbCellControl* pCellControl = NULL;
     184          62 :     if (m_rParent.IsFilterMode())
     185             :     {
     186           0 :         pCellControl = new DbFilterField(m_rParent.getContext(),*this);
     187             :     }
     188             :     else
     189             :     {
     190             : 
     191          62 :         switch (nTypeId)
     192             :         {
     193           0 :             case TYPE_CHECKBOX: pCellControl = new DbCheckBox(*this);   break;
     194           0 :             case TYPE_COMBOBOX: pCellControl = new DbComboBox(*this); break;
     195           0 :             case TYPE_CURRENCYFIELD: pCellControl = new DbCurrencyField(*this); break;
     196           0 :             case TYPE_DATEFIELD: pCellControl = new DbDateField(*this); break;
     197           0 :             case TYPE_LISTBOX: pCellControl = new DbListBox(*this); break;
     198           0 :             case TYPE_NUMERICFIELD: pCellControl = new DbNumericField(*this); break;
     199           0 :             case TYPE_PATTERNFIELD: pCellControl = new DbPatternField( *this, m_rParent.getContext() ); break;
     200          34 :             case TYPE_TEXTFIELD: pCellControl = new DbTextField(*this); break;
     201           0 :             case TYPE_TIMEFIELD: pCellControl = new DbTimeField(*this); break;
     202          28 :             case TYPE_FORMATTEDFIELD: pCellControl = new DbFormattedField(*this); break;
     203             :             default:
     204             :                 OSL_FAIL("DbGridColumn::CreateControl: Unknown Column");
     205          62 :                 return;
     206             :         }
     207             : 
     208             :     }
     209          62 :     Reference< XRowSet >  xCur;
     210          62 :     if (m_rParent.getDataSource())
     211          62 :         xCur = Reference< XRowSet > (Reference< XInterface >(*m_rParent.getDataSource()), UNO_QUERY);
     212             :         // TODO : the cursor wrapper should use an XRowSet interface, too
     213             : 
     214          62 :     pCellControl->Init( m_rParent.GetDataWindow(), xCur );
     215             : 
     216             :     // now create the control wrapper
     217          62 :     if (m_rParent.IsFilterMode())
     218           0 :         m_pCell = new FmXFilterCell(this, pCellControl);
     219             :     else
     220             :     {
     221          62 :         switch (nTypeId)
     222             :         {
     223           0 :             case TYPE_CHECKBOX: m_pCell = new FmXCheckBoxCell( this, *pCellControl );  break;
     224           0 :             case TYPE_LISTBOX: m_pCell = new FmXListBoxCell( this, *pCellControl );    break;
     225           0 :             case TYPE_COMBOBOX: m_pCell = new FmXComboBoxCell( this, *pCellControl );    break;
     226             :             default:
     227          62 :                 m_pCell = new FmXEditCell( this, *pCellControl );
     228             :         }
     229             :     }
     230          62 :     m_pCell->acquire();
     231          62 :     m_pCell->init();
     232             : 
     233          62 :     impl_toggleScriptManager_nothrow( true );
     234             : 
     235             :     // only if we use have a bound field, we use a a controller for displaying the
     236             :     // window in the grid
     237          62 :     if (m_xField.is())
     238          62 :         m_xController = pCellControl->CreateController();
     239             : }
     240             : 
     241             : 
     242         124 : void DbGridColumn::impl_toggleScriptManager_nothrow( bool _bAttach )
     243             : {
     244             :     try
     245             :     {
     246         124 :         Reference< container::XChild > xChild( m_xModel, UNO_QUERY_THROW );
     247         248 :         Reference< script::XEventAttacherManager > xManager( xChild->getParent(), UNO_QUERY_THROW );
     248         248 :         Reference< container::XIndexAccess > xContainer( xChild->getParent(), UNO_QUERY_THROW );
     249             : 
     250         124 :         sal_Int32 nIndexInParent( getElementPos( xContainer, m_xModel ) );
     251             : 
     252         248 :         Reference< XInterface > xCellInterface( *m_pCell, UNO_QUERY );
     253         124 :         if ( _bAttach )
     254          62 :             xManager->attach( nIndexInParent, xCellInterface, makeAny( xCellInterface ) );
     255             :         else
     256         186 :             xManager->detach( nIndexInParent, xCellInterface );
     257             :     }
     258           0 :     catch( const Exception& )
     259             :     {
     260             :         DBG_UNHANDLED_EXCEPTION();
     261             :     }
     262         124 : }
     263             : 
     264             : 
     265           2 : void DbGridColumn::UpdateFromField(const DbGridRow* pRow, const Reference< XNumberFormatter >& xFormatter)
     266             : {
     267           2 :     if (m_pCell && m_pCell->ISA(FmXFilterCell))
     268           0 :         PTR_CAST(FmXFilterCell, m_pCell)->Update();
     269           2 :     else if (pRow && pRow->IsValid() && m_nFieldPos >= 0 && m_pCell && pRow->HasField(m_nFieldPos))
     270             :     {
     271           2 :         PTR_CAST(FmXDataCell, m_pCell)->UpdateFromField( pRow->GetField( m_nFieldPos ).getColumn(), xFormatter );
     272             :     }
     273           2 : }
     274             : 
     275             : 
     276           0 : bool DbGridColumn::Commit()
     277             : {
     278           0 :     bool bResult = true;
     279           0 :     if (!m_bInSave && m_pCell)
     280             :     {
     281           0 :         m_bInSave = true;
     282           0 :         bResult = m_pCell->Commit();
     283             : 
     284             :         // store the data into the model
     285           0 :         FmXDataCell* pDataCell = PTR_CAST(FmXDataCell, m_pCell);
     286           0 :         if (bResult && pDataCell)
     287             :         {
     288           0 :             Reference< ::com::sun::star::form::XBoundComponent >  xComp(m_xModel, UNO_QUERY);
     289           0 :             if (xComp.is())
     290           0 :                 bResult = xComp->commit();
     291             :         }
     292           0 :         m_bInSave = false;
     293             :     }
     294           0 :     return bResult;
     295             : }
     296             : 
     297             : 
     298         280 : DbGridColumn::~DbGridColumn()
     299             : {
     300         140 :     Clear();
     301         140 : }
     302             : 
     303             : 
     304         202 : void DbGridColumn::setModel(::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  _xModel)
     305             : {
     306         202 :     if ( m_pCell )
     307           0 :         impl_toggleScriptManager_nothrow( false );
     308             : 
     309         202 :     m_xModel = _xModel;
     310             : 
     311         202 :     if ( m_pCell )
     312           0 :         impl_toggleScriptManager_nothrow( true );
     313         202 : }
     314             : 
     315             : 
     316         326 : void DbGridColumn::Clear()
     317             : {
     318         326 :     if ( m_pCell )
     319             :     {
     320          62 :         impl_toggleScriptManager_nothrow( false );
     321             : 
     322          62 :         m_pCell->dispose();
     323          62 :         m_pCell->release();
     324          62 :         m_pCell = NULL;
     325             :     }
     326             : 
     327         326 :     m_xController = NULL;
     328         326 :     m_xField = NULL;
     329             : 
     330         326 :     m_nFormatKey = 0;
     331         326 :     m_nFieldPos = -1;
     332         326 :     m_bReadOnly = true;
     333         326 :     m_bAutoValue = false;
     334         326 :     m_nFieldType = DataType::OTHER;
     335         326 : }
     336             : 
     337             : 
     338          62 : sal_Int16 DbGridColumn::SetAlignment(sal_Int16 _nAlign)
     339             : {
     340          62 :     if (_nAlign == -1)
     341             :     {   // 'Standard'
     342           0 :         if (m_xField.is())
     343             :         {
     344           0 :             sal_Int32 nType = 0;
     345           0 :             m_xField->getPropertyValue(FM_PROP_FIELDTYPE) >>= nType;
     346             : 
     347           0 :             switch (nType)
     348             :             {
     349             :                 case DataType::NUMERIC:
     350             :                 case DataType::DECIMAL:
     351             :                 case DataType::DOUBLE:
     352             :                 case DataType::REAL:
     353             :                 case DataType::BIGINT:
     354             :                 case DataType::INTEGER:
     355             :                 case DataType::SMALLINT:
     356             :                 case DataType::TINYINT:
     357             :                 case DataType::DATE:
     358             :                 case DataType::TIME:
     359             :                 case DataType::TIMESTAMP:
     360           0 :                     _nAlign = ::com::sun::star::awt::TextAlign::RIGHT;
     361           0 :                     break;
     362             :                 case DataType::BIT:
     363             :                 case DataType::BOOLEAN:
     364           0 :                     _nAlign = ::com::sun::star::awt::TextAlign::CENTER;
     365           0 :                     break;
     366             :                 default:
     367           0 :                     _nAlign = ::com::sun::star::awt::TextAlign::LEFT;
     368           0 :                     break;
     369             :             }
     370             :         }
     371             :         else
     372           0 :             _nAlign = ::com::sun::star::awt::TextAlign::LEFT;
     373             :     }
     374             : 
     375          62 :     m_nAlign = _nAlign;
     376          62 :     if (m_pCell && m_pCell->isAlignedController())
     377           0 :         m_pCell->AlignControl(m_nAlign);
     378             : 
     379          62 :     return m_nAlign;
     380             : }
     381             : 
     382             : 
     383          62 : sal_Int16 DbGridColumn::SetAlignmentFromModel(sal_Int16 nStandardAlign)
     384             : {
     385          62 :     Any aAlign( m_xModel->getPropertyValue(FM_PROP_ALIGN));
     386          62 :     if (aAlign.hasValue())
     387             :     {
     388          62 :         sal_Int16 nTest = sal_Int16();
     389          62 :         if (aAlign >>= nTest)
     390          62 :             nStandardAlign = nTest;
     391             :     }
     392          62 :     return SetAlignment(nStandardAlign);
     393             : }
     394             : 
     395             : 
     396           0 : void DbGridColumn::setLock(bool _bLock)
     397             : {
     398           0 :     if (m_bLocked == _bLock)
     399           0 :         return;
     400           0 :     m_bLocked = _bLock;
     401             : 
     402             :     // is the column we represent active ?
     403           0 :     if (m_bHidden)
     404           0 :         return;     // no, it isn't (or at least it shouldn't be ...)
     405             : 
     406           0 :     if (m_rParent.GetCurColumnId() == m_nId)
     407             :     {
     408           0 :         m_rParent.DeactivateCell();
     409           0 :         m_rParent.ActivateCell(m_rParent.GetCurRow(), m_rParent.GetCurColumnId());
     410             :     }
     411             : }
     412             : 
     413             : 
     414           0 : OUString DbGridColumn::GetCellText(const DbGridRow* pRow, const Reference< XNumberFormatter >& xFormatter) const
     415             : {
     416           0 :     OUString aText;
     417           0 :     if (m_pCell && m_pCell->ISA(FmXFilterCell))
     418           0 :         return aText;
     419             : 
     420           0 :     if (!pRow || !pRow->IsValid())
     421           0 :         aText = OUString(INVALIDTEXT);
     422           0 :     else if (pRow->HasField(m_nFieldPos))
     423             :     {
     424           0 :         aText = GetCellText( pRow->GetField( m_nFieldPos ).getColumn(), xFormatter );
     425             :     }
     426           0 :     return aText;
     427             : }
     428             : 
     429             : 
     430           0 : OUString DbGridColumn::GetCellText(const Reference< ::com::sun::star::sdb::XColumn >& xField, const Reference< XNumberFormatter >& xFormatter) const
     431             : {
     432           0 :     OUString aText;
     433           0 :     if (xField.is())
     434             :     {
     435           0 :         FmXTextCell* pTextCell = PTR_CAST(FmXTextCell, m_pCell);
     436           0 :         if (pTextCell)
     437           0 :             aText = pTextCell->GetText(xField, xFormatter);
     438           0 :         else if (m_bObject)
     439           0 :             aText = OUString(OBJECTTEXT);
     440             :     }
     441           0 :     return aText;
     442             : }
     443             : 
     444             : 
     445           0 : Reference< ::com::sun::star::sdb::XColumn >  DbGridColumn::GetCurrentFieldValue() const
     446             : {
     447           0 :     Reference< ::com::sun::star::sdb::XColumn >  xField;
     448           0 :     const DbGridRowRef xRow = m_rParent.GetCurrentRow();
     449           0 :     if (xRow.Is() && xRow->HasField(m_nFieldPos))
     450             :     {
     451           0 :         xField = xRow->GetField(m_nFieldPos).getColumn();
     452             :     }
     453           0 :     return xField;
     454             : }
     455             : 
     456             : 
     457          78 : void DbGridColumn::Paint(OutputDevice& rDev,
     458             :                          const Rectangle& rRect,
     459             :                          const DbGridRow* pRow,
     460             :                          const Reference< XNumberFormatter >& xFormatter)
     461             : {
     462          78 :     bool bEnabled = ( rDev.GetOutDevType() != OUTDEV_WINDOW )
     463          78 :                 ||  ( static_cast< vcl::Window& >( rDev ).IsEnabled() );
     464             : 
     465          78 :     FmXDataCell* pDataCell = PTR_CAST(FmXDataCell, m_pCell);
     466          78 :     if (pDataCell)
     467             :     {
     468          78 :         if (!pRow || !pRow->IsValid())
     469             :         {
     470           0 :             sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
     471           0 :             if ( !bEnabled )
     472           0 :                 nStyle |= TEXT_DRAW_DISABLE;
     473             : 
     474           0 :             rDev.DrawText(rRect, OUString(INVALIDTEXT), nStyle);
     475             :         }
     476          78 :         else if (m_bAutoValue && pRow->IsNew())
     477             :         {
     478           0 :             sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_VCENTER;
     479           0 :             if ( !bEnabled )
     480           0 :                 nStyle |= TEXT_DRAW_DISABLE;
     481             : 
     482           0 :             switch (GetAlignment())
     483             :             {
     484             :                 case ::com::sun::star::awt::TextAlign::RIGHT:
     485           0 :                     nStyle |= TEXT_DRAW_RIGHT;
     486           0 :                     break;
     487             :                 case ::com::sun::star::awt::TextAlign::CENTER:
     488           0 :                     nStyle |= TEXT_DRAW_CENTER;
     489           0 :                     break;
     490             :                 default:
     491           0 :                     nStyle |= TEXT_DRAW_LEFT;
     492             :             }
     493             : 
     494           0 :             rDev.DrawText(rRect, SVX_RESSTR(RID_STR_AUTOFIELD), nStyle);
     495             :         }
     496          78 :         else if (pRow->HasField(m_nFieldPos))
     497             :         {
     498          78 :             pDataCell->PaintFieldToCell(rDev, rRect, pRow->GetField( m_nFieldPos ).getColumn(), xFormatter);
     499             :         }
     500             :     }
     501           0 :     else if (!m_pCell)
     502             :     {
     503           0 :         if (!pRow || !pRow->IsValid())
     504             :         {
     505           0 :             sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
     506           0 :             if ( !bEnabled )
     507           0 :                 nStyle |= TEXT_DRAW_DISABLE;
     508             : 
     509           0 :             rDev.DrawText(rRect, OUString(INVALIDTEXT), nStyle);
     510             :         }
     511           0 :         else if (pRow->HasField(m_nFieldPos) && m_bObject)
     512             :         {
     513           0 :             sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_CENTER;
     514           0 :             if ( !bEnabled )
     515           0 :                 nStyle |= TEXT_DRAW_DISABLE;
     516           0 :             rDev.DrawText(rRect, OUString(OBJECTTEXT), nStyle);
     517             :         }
     518             :     }
     519           0 :     else if ( m_pCell->ISA( FmXFilterCell ) )
     520           0 :         static_cast< FmXFilterCell* >( m_pCell )->PaintCell( rDev, rRect );
     521          78 : }
     522             : 
     523             : 
     524         232 : void DbGridColumn::ImplInitWindow( vcl::Window& rParent, const InitWindowFacet _eInitWhat )
     525             : {
     526         232 :     if ( m_pCell )
     527           0 :         m_pCell->ImplInitWindow( rParent, _eInitWhat );
     528         232 : }
     529             : 
     530             : 
     531             : //= cell controls
     532             : 
     533          56 : TYPEINIT0( DbCellControl )
     534          56 : TYPEINIT1( DbLimitedLengthField, DbCellControl )
     535         164 : TYPEINIT1( DbTextField, DbLimitedLengthField )
     536          84 : TYPEINIT1( DbFormattedField, DbLimitedLengthField )
     537           0 : TYPEINIT1( DbCheckBox, DbCellControl )
     538           0 : TYPEINIT1( DbComboBox, DbCellControl )
     539           0 : TYPEINIT1( DbListBox, DbCellControl )
     540           0 : TYPEINIT1( DbPatternField, DbCellControl )
     541           0 : TYPEINIT1( DbSpinField, DbCellControl )
     542           0 : TYPEINIT1( DbDateField, DbSpinField )
     543           0 : TYPEINIT1( DbTimeField, DbSpinField )
     544           0 : TYPEINIT1( DbCurrencyField, DbSpinField )
     545           0 : TYPEINIT1( DbNumericField, DbSpinField )
     546           0 : TYPEINIT1( DbFilterField, DbCellControl )
     547             : 
     548             : 
     549          62 : DbCellControl::DbCellControl( DbGridColumn& _rColumn, bool /*_bText*/ )
     550             :     :OPropertyChangeListener(m_aMutex)
     551             :     ,m_pModelChangeBroadcaster(NULL)
     552             :     ,m_pFieldChangeBroadcaster(NULL)
     553             :     ,m_bTransparent( false )
     554             :     ,m_bAlignedController( true )
     555             :     ,m_bAccessingValueProperty( false )
     556             :     ,m_rColumn( _rColumn )
     557             :     ,m_pPainter( NULL )
     558          62 :     ,m_pWindow( NULL )
     559             : {
     560          62 :     Reference< XPropertySet > xColModelProps( _rColumn.getModel(), UNO_QUERY );
     561          62 :     if ( xColModelProps.is() )
     562             :     {
     563             :         // if our model's format key changes we want to propagate the new value to our windows
     564          62 :         m_pModelChangeBroadcaster = new ::comphelper::OPropertyChangeMultiplexer(this, Reference< ::com::sun::star::beans::XPropertySet > (_rColumn.getModel(), UNO_QUERY));
     565          62 :         m_pModelChangeBroadcaster->acquire();
     566             : 
     567             :         // be listener for some common properties
     568          62 :         implDoPropertyListening( FM_PROP_READONLY, false );
     569          62 :         implDoPropertyListening( FM_PROP_ENABLED, false );
     570             : 
     571             :         // add as listener for all know "value" properties
     572          62 :         implDoPropertyListening( FM_PROP_VALUE, false );
     573          62 :         implDoPropertyListening( FM_PROP_STATE, false );
     574          62 :         implDoPropertyListening( FM_PROP_TEXT, false );
     575          62 :         implDoPropertyListening( FM_PROP_EFFECTIVE_VALUE, false );
     576             : 
     577             :         // be listener at the bound field as well
     578             :         try
     579             :         {
     580          62 :             Reference< XPropertySetInfo > xPSI( xColModelProps->getPropertySetInfo(), UNO_SET_THROW );
     581          62 :             if ( xPSI->hasPropertyByName( FM_PROP_BOUNDFIELD ) )
     582             :             {
     583          62 :                 Reference< XPropertySet > xField;
     584          62 :                 xColModelProps->getPropertyValue( FM_PROP_BOUNDFIELD ) >>= xField;
     585          62 :                 if ( xField.is() )
     586             :                 {
     587          62 :                     m_pFieldChangeBroadcaster = new ::comphelper::OPropertyChangeMultiplexer(this, xField);
     588          62 :                     m_pFieldChangeBroadcaster->acquire();
     589          62 :                     m_pFieldChangeBroadcaster->addProperty( FM_PROP_ISREADONLY );
     590          62 :                 }
     591          62 :             }
     592             :         }
     593           0 :         catch( const Exception& )
     594             :         {
     595             :             OSL_FAIL( "DbCellControl::doPropertyListening: caught an exception!" );
     596             :             DBG_UNHANDLED_EXCEPTION();
     597             :         }
     598          62 :     }
     599          62 : }
     600             : 
     601             : 
     602         462 : void DbCellControl::implDoPropertyListening(const OUString& _rPropertyName, bool _bWarnIfNotExistent)
     603             : {
     604             :     try
     605             :     {
     606         462 :         Reference< XPropertySet > xColModelProps( m_rColumn.getModel(), UNO_QUERY );
     607         924 :         Reference< XPropertySetInfo > xPSI;
     608         462 :         if ( xColModelProps.is() )
     609         462 :             xPSI = xColModelProps->getPropertySetInfo();
     610             : 
     611             :         DBG_ASSERT( !_bWarnIfNotExistent || ( xPSI.is() && xPSI->hasPropertyByName( _rPropertyName ) ),
     612             :             "DbCellControl::doPropertyListening: no property set info or non-existent property!" );
     613             :         (void)_bWarnIfNotExistent;
     614             : 
     615         462 :         if ( xPSI.is() && xPSI->hasPropertyByName( _rPropertyName ) )
     616         766 :             m_pModelChangeBroadcaster->addProperty( _rPropertyName );
     617             :     }
     618           0 :     catch( const Exception& )
     619             :     {
     620             :         OSL_FAIL( "DbCellControl::doPropertyListening: caught an exception!" );
     621             :         DBG_UNHANDLED_EXCEPTION();
     622             :     }
     623         462 : }
     624             : 
     625             : 
     626          90 : void DbCellControl::doPropertyListening(const OUString& _rPropertyName)
     627             : {
     628          90 :     implDoPropertyListening( _rPropertyName );
     629          90 : }
     630             : 
     631         124 : static void lcl_clearBroadCaster(::comphelper::OPropertyChangeMultiplexer*& _pBroadcaster)
     632             : {
     633         124 :     if ( _pBroadcaster )
     634             :     {
     635         124 :         _pBroadcaster->dispose();
     636         124 :         _pBroadcaster->release();
     637         124 :         _pBroadcaster = NULL;
     638             :         // no delete, this is done implicitly
     639             :     }
     640         124 : }
     641             : 
     642         124 : DbCellControl::~DbCellControl()
     643             : {
     644          62 :     lcl_clearBroadCaster(m_pModelChangeBroadcaster);
     645          62 :     lcl_clearBroadCaster(m_pFieldChangeBroadcaster);
     646             : 
     647          62 :     delete m_pWindow;
     648          62 :     delete m_pPainter;
     649          62 : }
     650             : 
     651             : 
     652           0 : void DbCellControl::implValuePropertyChanged( )
     653             : {
     654             :     OSL_ENSURE( !isValuePropertyLocked(),
     655             :         "DbCellControl::implValuePropertyChanged: not to be called with the value property locked!" );
     656             : 
     657           0 :     if ( m_pWindow )
     658             :     {
     659           0 :         if ( m_rColumn.getModel().is() )
     660           0 :             updateFromModel( m_rColumn.getModel() );
     661             :     }
     662           0 : }
     663             : 
     664             : 
     665           0 : void DbCellControl::implAdjustGenericFieldSetting( const Reference< XPropertySet >& /*_rxModel*/ )
     666             : {
     667             :     // nothing to to here
     668           0 : }
     669             : 
     670             : 
     671           0 : void DbCellControl::_propertyChanged(const PropertyChangeEvent& _rEvent) throw(RuntimeException)
     672             : {
     673           0 :     SolarMutexGuard aGuard;
     674             : 
     675           0 :     Reference< XPropertySet > xSourceProps( _rEvent.Source, UNO_QUERY );
     676             : 
     677           0 :     if  (   _rEvent.PropertyName.equals( FM_PROP_VALUE )
     678           0 :         ||  _rEvent.PropertyName.equals( FM_PROP_STATE )
     679           0 :         ||  _rEvent.PropertyName.equals( FM_PROP_TEXT )
     680           0 :         ||  _rEvent.PropertyName.equals( FM_PROP_EFFECTIVE_VALUE )
     681             :         )
     682             :     {   // it was one of the known "value" properties
     683           0 :         if ( !isValuePropertyLocked() )
     684             :         {
     685           0 :             implValuePropertyChanged( );
     686             :         }
     687             :     }
     688           0 :     else if ( _rEvent.PropertyName.equals( FM_PROP_READONLY ) )
     689             :     {
     690           0 :         implAdjustReadOnly( xSourceProps, true);
     691             :     }
     692           0 :     else if ( _rEvent.PropertyName.equals( FM_PROP_ISREADONLY ) )
     693             :     {
     694           0 :         bool bReadOnly = true;
     695           0 :         _rEvent.NewValue >>= bReadOnly;
     696           0 :         m_rColumn.SetReadOnly(bReadOnly);
     697           0 :         implAdjustReadOnly( xSourceProps, false);
     698             :     }
     699           0 :     else if ( _rEvent.PropertyName.equals( FM_PROP_ENABLED ) )
     700             :     {
     701           0 :         implAdjustEnabled( xSourceProps );
     702             :     }
     703             :     else
     704           0 :         implAdjustGenericFieldSetting( xSourceProps );
     705           0 : }
     706             : 
     707             : 
     708           0 : bool DbCellControl::Commit()
     709             : {
     710             :     // lock the listening for value property changes
     711           0 :     lockValueProperty();
     712             :     // commit the content of the control into the model's value property
     713           0 :     bool bReturn = false;
     714             :     try
     715             :     {
     716           0 :         bReturn = commitControl();
     717             :     }
     718           0 :     catch( const Exception& )
     719             :     {
     720             :         DBG_UNHANDLED_EXCEPTION();
     721             :     }
     722             :     // unlock the listening for value property changes
     723           0 :     unlockValueProperty();
     724             :     // outta here
     725           0 :     return bReturn;
     726             : }
     727             : 
     728             : 
     729          62 : void DbCellControl::ImplInitWindow( vcl::Window& rParent, const InitWindowFacet _eInitWhat )
     730             : {
     731          62 :     vcl::Window* pWindows[] = { m_pPainter, m_pWindow };
     732             : 
     733          62 :     if ( ( _eInitWhat & InitWritingMode ) != 0 )
     734             :     {
     735         186 :         for ( size_t i=0; i < sizeof( pWindows ) / sizeof( pWindows[0] ); ++i )
     736             :         {
     737         124 :             if ( pWindows[i] )
     738         124 :                 pWindows[i]->EnableRTL( rParent.IsRTLEnabled() );
     739             :         }
     740             :     }
     741             : 
     742          62 :     if ( ( _eInitWhat & InitFontFacet ) != 0 )
     743             :     {
     744         186 :         for (size_t i=0; i < sizeof(pWindows)/sizeof(pWindows[0]); ++i)
     745             :         {
     746         124 :             if ( !pWindows[i] )
     747           0 :                 continue;
     748             : 
     749         124 :             pWindows[i]->SetZoom( rParent.GetZoom() );
     750             : 
     751         124 :             const StyleSettings& rStyleSettings = pWindows[i]->GetSettings().GetStyleSettings();
     752         124 :             vcl::Font aFont = rStyleSettings.GetFieldFont();
     753         124 :             aFont.SetTransparent( isTransparent() );
     754             : 
     755         124 :             if ( rParent.IsControlFont() )
     756             :             {
     757           0 :                 pWindows[i]->SetControlFont( rParent.GetControlFont() );
     758           0 :                 aFont.Merge( rParent.GetControlFont() );
     759             :             }
     760             :             else
     761         124 :                 pWindows[i]->SetControlFont();
     762             : 
     763         124 :             pWindows[i]->SetZoomedPointFont( aFont );
     764         124 :         }
     765             :     }
     766             : 
     767          62 :     if  (   ( ( _eInitWhat & InitFontFacet ) != 0 )
     768           0 :         ||  ( ( _eInitWhat & InitForeground ) != 0 )
     769             :         )
     770             :     {
     771          62 :         Color aTextColor( rParent.IsControlForeground() ? rParent.GetControlForeground() : rParent.GetTextColor() );
     772             : 
     773          62 :         bool bTextLineColor = rParent.IsTextLineColor();
     774          62 :         Color aTextLineColor( rParent.GetTextLineColor() );
     775             : 
     776         186 :         for (size_t i=0; i < sizeof(pWindows)/sizeof(pWindows[0]); ++i)
     777             :         {
     778         124 :             if ( pWindows[i] )
     779             :             {
     780         124 :                 pWindows[i]->SetTextColor(aTextColor);
     781         124 :                 if (rParent.IsControlForeground())
     782           0 :                     pWindows[i]->SetControlForeground(aTextColor);
     783             : 
     784         124 :                 if (bTextLineColor)
     785           0 :                     pWindows[i]->SetTextLineColor();
     786             :                 else
     787         124 :                     pWindows[i]->SetTextLineColor(aTextLineColor);
     788             :             }
     789             :         }
     790             :     }
     791             : 
     792          62 :     if ( ( _eInitWhat & InitBackground ) != 0 )
     793             :     {
     794          62 :         if (rParent.IsControlBackground())
     795             :         {
     796           0 :             Color aColor( rParent.GetControlBackground());
     797           0 :             for (size_t i=0; i < sizeof(pWindows)/sizeof(pWindows[0]); ++i)
     798             :             {
     799           0 :                 if ( pWindows[i] )
     800             :                 {
     801           0 :                     if ( isTransparent() )
     802           0 :                         pWindows[i]->SetBackground();
     803             :                     else
     804             :                     {
     805           0 :                         pWindows[i]->SetBackground(aColor);
     806           0 :                         pWindows[i]->SetControlBackground(aColor);
     807             :                     }
     808           0 :                     pWindows[i]->SetFillColor(aColor);
     809             :                 }
     810             :             }
     811             :         }
     812             :         else
     813             :         {
     814          62 :             if (m_pPainter)
     815             :             {
     816          62 :                 if ( isTransparent() )
     817           0 :                     m_pPainter->SetBackground();
     818             :                 else
     819          62 :                     m_pPainter->SetBackground(rParent.GetBackground());
     820          62 :                 m_pPainter->SetFillColor(rParent.GetFillColor());
     821             :             }
     822             : 
     823          62 :             if (m_pWindow)
     824             :             {
     825          62 :                 if ( isTransparent() )
     826           0 :                     m_pWindow->SetBackground(rParent.GetBackground());
     827             :                 else
     828          62 :                     m_pWindow->SetFillColor(rParent.GetFillColor());
     829             :             }
     830             :         }
     831             :     }
     832          62 : }
     833             : 
     834             : 
     835          62 : void DbCellControl::implAdjustReadOnly( const Reference< XPropertySet >& _rxModel,bool i_bReadOnly )
     836             : {
     837             :     DBG_ASSERT( m_pWindow, "DbCellControl::implAdjustReadOnly: not to be called without window!" );
     838             :     DBG_ASSERT( _rxModel.is(), "DbCellControl::implAdjustReadOnly: invalid model!" );
     839          62 :     if ( m_pWindow && _rxModel.is() )
     840             :     {
     841          62 :         Edit* pEditWindow = dynamic_cast< Edit* >( m_pWindow );
     842          62 :         if ( pEditWindow )
     843             :         {
     844          62 :             bool bReadOnly = m_rColumn.IsReadOnly();
     845          62 :             if ( !bReadOnly )
     846             :             {
     847          62 :                 _rxModel->getPropertyValue( i_bReadOnly ? OUString(FM_PROP_READONLY) : OUString(FM_PROP_ISREADONLY)) >>= bReadOnly;
     848             :             }
     849          62 :             static_cast< Edit* >( m_pWindow )->SetReadOnly( bReadOnly );
     850             :         }
     851             :     }
     852          62 : }
     853             : 
     854             : 
     855          62 : void DbCellControl::implAdjustEnabled( const Reference< XPropertySet >& _rxModel )
     856             : {
     857             :     DBG_ASSERT( m_pWindow, "DbCellControl::implAdjustEnabled: not to be called without window!" );
     858             :     DBG_ASSERT( _rxModel.is(), "DbCellControl::implAdjustEnabled: invalid model!" );
     859          62 :     if ( m_pWindow && _rxModel.is() )
     860             :     {
     861          62 :         bool bEnable = true;
     862          62 :         _rxModel->getPropertyValue( FM_PROP_ENABLED ) >>= bEnable;
     863          62 :         m_pWindow->Enable( bEnable );
     864             :     }
     865          62 : }
     866             : 
     867             : 
     868          62 : void DbCellControl::Init( vcl::Window& rParent, const Reference< XRowSet >& _rxCursor )
     869             : {
     870          62 :     ImplInitWindow( rParent, InitAll );
     871             : 
     872          62 :     if ( m_pWindow )
     873             :     {
     874             :         // align the control
     875          62 :         if ( isAlignedController() )
     876          62 :             AlignControl( m_rColumn.GetAlignment() );
     877             : 
     878             :         try
     879             :         {
     880             :             // some other common properties
     881          62 :             Reference< XPropertySet > xModel( m_rColumn.getModel(), UNO_SET_THROW );
     882         124 :             Reference< XPropertySetInfo > xModelPSI( xModel->getPropertySetInfo(), UNO_SET_THROW );
     883             : 
     884          62 :             if ( xModelPSI->hasPropertyByName( FM_PROP_READONLY ) )
     885             :             {
     886          62 :                 implAdjustReadOnly( xModel,true );
     887             :             }
     888             : 
     889          62 :             if ( xModelPSI->hasPropertyByName( FM_PROP_ENABLED ) )
     890             :             {
     891          62 :                 implAdjustEnabled( xModel );
     892             :             }
     893             : 
     894          62 :             if ( xModelPSI->hasPropertyByName( FM_PROP_MOUSE_WHEEL_BEHAVIOR ) )
     895             :             {
     896          28 :                 sal_Int16 nWheelBehavior = MouseWheelBehavior::SCROLL_FOCUS_ONLY;
     897          28 :                 OSL_VERIFY( xModel->getPropertyValue( FM_PROP_MOUSE_WHEEL_BEHAVIOR ) >>= nWheelBehavior );
     898          28 :                 sal_uInt16 nVclSetting = MOUSE_WHEEL_FOCUS_ONLY;
     899          28 :                 switch ( nWheelBehavior )
     900             :                 {
     901          28 :                 case MouseWheelBehavior::SCROLL_DISABLED:   nVclSetting = MOUSE_WHEEL_DISABLE; break;
     902           0 :                 case MouseWheelBehavior::SCROLL_FOCUS_ONLY: nVclSetting = MOUSE_WHEEL_FOCUS_ONLY; break;
     903           0 :                 case MouseWheelBehavior::SCROLL_ALWAYS:     nVclSetting = MOUSE_WHEEL_ALWAYS; break;
     904             :                 default:
     905             :                     OSL_FAIL( "DbCellControl::Init: invalid MouseWheelBehavior!" );
     906           0 :                     break;
     907             :                 }
     908             : 
     909          28 :                 AllSettings aSettings = m_pWindow->GetSettings();
     910          56 :                 MouseSettings aMouseSettings = aSettings.GetMouseSettings();
     911          28 :                 aMouseSettings.SetWheelBehavior( nVclSetting );
     912          28 :                 aSettings.SetMouseSettings( aMouseSettings );
     913          56 :                 m_pWindow->SetSettings( aSettings, true );
     914          62 :             }
     915             :         }
     916           0 :         catch( const Exception& )
     917             :         {
     918             :             DBG_UNHANDLED_EXCEPTION();
     919             :         }
     920             :     }
     921          62 :     m_xCursor = _rxCursor;
     922          62 : }
     923             : 
     924             : 
     925           0 : void DbCellControl::SetTextLineColor()
     926             : {
     927           0 :     if (m_pWindow)
     928           0 :         m_pWindow->SetTextLineColor();
     929           0 :     if (m_pPainter)
     930           0 :         m_pPainter->SetTextLineColor();
     931           0 : }
     932             : 
     933             : 
     934           0 : void DbCellControl::SetTextLineColor(const Color& _rColor)
     935             : {
     936           0 :     if (m_pWindow)
     937           0 :         m_pWindow->SetTextLineColor(_rColor);
     938           0 :     if (m_pPainter)
     939           0 :         m_pPainter->SetTextLineColor(_rColor);
     940           0 : }
     941             : 
     942             : namespace
     943             : {
     944         124 :     static void lcl_implAlign( vcl::Window* _pWindow, WinBits _nAlignmentBit )
     945             :     {
     946         124 :         WinBits nStyle = _pWindow->GetStyle();
     947         124 :         nStyle &= ~(WB_LEFT | WB_RIGHT | WB_CENTER);
     948         124 :         _pWindow->SetStyle( nStyle | _nAlignmentBit );
     949         124 :     }
     950             : }
     951             : 
     952             : 
     953          62 : void DbCellControl::AlignControl(sal_Int16 nAlignment)
     954             : {
     955          62 :     WinBits nAlignmentBit = 0;
     956          62 :     switch (nAlignment)
     957             :     {
     958             :         case ::com::sun::star::awt::TextAlign::RIGHT:
     959           0 :             nAlignmentBit = WB_RIGHT;
     960           0 :             break;
     961             :         case ::com::sun::star::awt::TextAlign::CENTER:
     962           0 :             nAlignmentBit = WB_CENTER;
     963           0 :             break;
     964             :         default:
     965          62 :             nAlignmentBit = WB_LEFT;
     966          62 :             break;
     967             :     }
     968          62 :     lcl_implAlign( m_pWindow, nAlignmentBit );
     969          62 :     if ( m_pPainter )
     970          62 :         lcl_implAlign( m_pPainter, nAlignmentBit );
     971          62 : }
     972             : 
     973             : 
     974          32 : void DbCellControl::PaintCell( OutputDevice& _rDev, const Rectangle& _rRect )
     975             : {
     976          32 :     if ( m_pPainter->GetParent() == &_rDev )
     977             :     {
     978          32 :         m_pPainter->SetPaintTransparent( true );
     979          32 :         m_pPainter->SetBackground( );
     980          32 :         m_pPainter->SetControlBackground( _rDev.GetFillColor() );
     981          32 :         m_pPainter->SetControlForeground( _rDev.GetTextColor() );
     982          32 :         m_pPainter->SetTextColor( _rDev.GetTextColor() );
     983          32 :         m_pPainter->SetTextFillColor( _rDev.GetTextColor() );
     984             : 
     985          32 :         vcl::Font aFont( _rDev.GetFont() );
     986          32 :         aFont.SetTransparent( true );
     987          32 :         m_pPainter->SetFont( aFont );
     988             : 
     989          32 :         m_pPainter->SetPosSizePixel( _rRect.TopLeft(), _rRect.GetSize() );
     990          32 :         m_pPainter->Show();
     991          32 :         m_pPainter->Update();
     992          32 :         m_pPainter->SetParentUpdateMode( false );
     993          32 :         m_pPainter->Hide();
     994          32 :         m_pPainter->SetParentUpdateMode( true );
     995             :     }
     996             :     else
     997           0 :         m_pPainter->Draw( &_rDev, _rRect.TopLeft(), _rRect.GetSize(), 0 );
     998          32 : }
     999             : 
    1000             : 
    1001          32 : void DbCellControl::PaintFieldToCell( OutputDevice& _rDev, const Rectangle& _rRect, const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
    1002             : {
    1003          32 :     m_pPainter->SetText( GetFormatText( _rxField, _rxFormatter ) );
    1004          32 :     PaintCell( _rDev, _rRect );
    1005          32 : }
    1006             : 
    1007             : 
    1008           0 : double DbCellControl::GetValue(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter) const
    1009             : {
    1010           0 :     double fValue = 0;
    1011           0 :     if (m_rColumn.IsNumeric())
    1012             :     {
    1013             :         try
    1014             :         {
    1015           0 :             fValue = _rxField->getDouble();
    1016             :         }
    1017           0 :         catch(const Exception&) { }
    1018             :     }
    1019             :     else
    1020             :     {
    1021           0 :         bool bSuccess = false;
    1022             :         try
    1023             :         {
    1024           0 :             fValue = _rxField->getDouble();
    1025           0 :             bSuccess = true;
    1026             :         }
    1027           0 :         catch(const Exception&) { }
    1028           0 :         if (!bSuccess)
    1029             :         {
    1030             :             try
    1031             :             {
    1032           0 :                 fValue = xFormatter->convertStringToNumber(m_rColumn.GetKey(), _rxField->getString());
    1033             :             }
    1034           0 :             catch(const Exception&) { }
    1035             :         }
    1036             :     }
    1037           0 :     return fValue;
    1038             : }
    1039             : 
    1040             : 
    1041           0 : void DbCellControl::invalidatedController()
    1042             : {
    1043           0 :     m_rColumn.GetParent().refreshController(m_rColumn.GetId(), DbGridControl::GrantControlAccess());
    1044           0 : }
    1045             : 
    1046             : // CellModels
    1047             : 
    1048          62 : DbLimitedLengthField::DbLimitedLengthField( DbGridColumn& _rColumn )
    1049          62 :     :DbCellControl( _rColumn )
    1050             : {
    1051          62 :     doPropertyListening( FM_PROP_MAXTEXTLEN );
    1052          62 : }
    1053             : 
    1054             : 
    1055          62 : void DbLimitedLengthField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    1056             : {
    1057             :     DBG_ASSERT( m_pWindow, "DbLimitedLengthField::implAdjustGenericFieldSetting: not to be called without window!" );
    1058             :     DBG_ASSERT( _rxModel.is(), "DbLimitedLengthField::implAdjustGenericFieldSetting: invalid model!" );
    1059          62 :     if ( m_pWindow && _rxModel.is() )
    1060             :     {
    1061          62 :         sal_Int16 nMaxLen = 0;
    1062          62 :         _rxModel->getPropertyValue( FM_PROP_MAXTEXTLEN ) >>= nMaxLen;
    1063          62 :         implSetMaxTextLen( nMaxLen );
    1064             :     }
    1065          62 : }
    1066             : 
    1067          28 : void DbLimitedLengthField::implSetEffectiveMaxTextLen( sal_Int32 _nMaxLen )
    1068             : {
    1069          28 :     dynamic_cast<Edit&>(*m_pWindow).SetMaxTextLen(_nMaxLen);
    1070          28 :     if (m_pPainter)
    1071          28 :         dynamic_cast<Edit&>(*m_pPainter).SetMaxTextLen(_nMaxLen);
    1072          28 : }
    1073             : 
    1074          34 : DbTextField::DbTextField(DbGridColumn& _rColumn)
    1075             :             :DbLimitedLengthField(_rColumn)
    1076             :             ,m_pEdit( NULL )
    1077             :             ,m_pPainterImplementation( NULL )
    1078          34 :             ,m_bIsSimpleEdit( true )
    1079             : {
    1080          34 : }
    1081             : 
    1082             : 
    1083         102 : DbTextField::~DbTextField( )
    1084             : {
    1085          34 :     DELETEZ( m_pPainterImplementation );
    1086          34 :     DELETEZ( m_pEdit );
    1087          68 : }
    1088             : 
    1089             : 
    1090          34 : void DbTextField::Init( vcl::Window& rParent, const Reference< XRowSet >& xCursor)
    1091             : {
    1092          34 :     sal_Int16 nAlignment = m_rColumn.SetAlignmentFromModel(-1);
    1093             : 
    1094          34 :     Reference< XPropertySet > xModel( m_rColumn.getModel() );
    1095             : 
    1096          34 :     WinBits nStyle = WB_LEFT;
    1097          34 :     switch (nAlignment)
    1098             :     {
    1099             :     case awt::TextAlign::RIGHT:
    1100           0 :         nStyle = WB_RIGHT;
    1101           0 :         break;
    1102             : 
    1103             :     case awt::TextAlign::CENTER:
    1104           0 :         nStyle = WB_CENTER;
    1105           0 :         break;
    1106             :     }
    1107             : 
    1108             :     // is this a multi-line field?
    1109          34 :     bool bIsMultiLine = false;
    1110             :     try
    1111             :     {
    1112          34 :         if ( xModel.is() )
    1113             :         {
    1114          34 :             OSL_VERIFY( xModel->getPropertyValue( FM_PROP_MULTILINE ) >>= bIsMultiLine );
    1115             :         }
    1116             :     }
    1117           0 :     catch( const Exception& )
    1118             :     {
    1119             :         OSL_FAIL( "DbTextField::Init: caught an exception while determining the multi-line capabilities!" );
    1120             :         DBG_UNHANDLED_EXCEPTION();
    1121             :     }
    1122             : 
    1123          34 :     m_bIsSimpleEdit = !bIsMultiLine;
    1124          34 :     if ( bIsMultiLine )
    1125             :     {
    1126          34 :         m_pWindow = new MultiLineTextCell( &rParent, nStyle );
    1127          34 :         m_pEdit = new MultiLineEditImplementation( *static_cast< MultiLineTextCell* >( m_pWindow ) );
    1128             : 
    1129          34 :         m_pPainter = new MultiLineTextCell( &rParent, nStyle );
    1130          34 :         m_pPainterImplementation = new MultiLineEditImplementation( *static_cast< MultiLineTextCell* >( m_pPainter ) );
    1131             :     }
    1132             :     else
    1133             :     {
    1134           0 :         m_pWindow = new Edit( &rParent, nStyle );
    1135           0 :         m_pEdit = new EditImplementation( *static_cast< Edit* >( m_pWindow ) );
    1136             : 
    1137           0 :         m_pPainter = new Edit( &rParent, nStyle );
    1138           0 :         m_pPainterImplementation = new EditImplementation( *static_cast< Edit* >( m_pPainter ) );
    1139             :     }
    1140             : 
    1141          34 :     if ( WB_LEFT == nStyle )
    1142             :     {
    1143             :         // this is so that when getting the focus, the selection is oriented left-to-right
    1144          34 :         AllSettings aSettings = m_pWindow->GetSettings();
    1145          68 :         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
    1146             :         aStyleSettings.SetSelectionOptions(
    1147          34 :             aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
    1148          34 :         aSettings.SetStyleSettings(aStyleSettings);
    1149          68 :         m_pWindow->SetSettings(aSettings);
    1150             :     }
    1151             : 
    1152          34 :     implAdjustGenericFieldSetting( xModel );
    1153             : 
    1154          34 :     DbLimitedLengthField::Init( rParent, xCursor );
    1155          34 : }
    1156             : 
    1157             : 
    1158          34 : CellControllerRef DbTextField::CreateController() const
    1159             : {
    1160          34 :     return new EditCellController( m_pEdit );
    1161             : }
    1162             : 
    1163             : 
    1164          32 : void DbTextField::PaintFieldToCell( OutputDevice& _rDev, const Rectangle& _rRect, const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
    1165             : {
    1166          32 :     if ( m_pPainterImplementation )
    1167          32 :         m_pPainterImplementation->SetText( GetFormatText( _rxField, _rxFormatter, NULL ) );
    1168             : 
    1169          32 :     DbLimitedLengthField::PaintFieldToCell( _rDev, _rRect, _rxField, _rxFormatter );
    1170          32 : }
    1171             : 
    1172             : 
    1173          64 : OUString DbTextField::GetFormatText(const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter, Color** /*ppColor*/)
    1174             : {
    1175          64 :     const com::sun::star::uno::Reference<com::sun::star::beans::XPropertySet> xPS(_rxField, UNO_QUERY);
    1176         128 :     FormattedColumnValue fmter( xFormatter, xPS );
    1177             : 
    1178         128 :     return fmter.getFormattedValue();
    1179             : }
    1180             : 
    1181             : 
    1182           0 : void DbTextField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter)
    1183             : {
    1184           0 :     m_pEdit->SetText( GetFormatText( _rxField, xFormatter ) );
    1185           0 :     m_pEdit->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
    1186           0 : }
    1187             : 
    1188             : 
    1189           0 : void DbTextField::updateFromModel( Reference< XPropertySet > _rxModel )
    1190             : {
    1191             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbTextField::updateFromModel: invalid call!" );
    1192             : 
    1193           0 :     OUString sText;
    1194           0 :     _rxModel->getPropertyValue( FM_PROP_TEXT ) >>= sText;
    1195             : 
    1196           0 :     sal_Int32 nMaxTextLen = m_pEdit->GetMaxTextLen();
    1197           0 :     if ( EDIT_NOLIMIT != nMaxTextLen && sText.getLength() > nMaxTextLen )
    1198             :     {
    1199           0 :         sal_Int32 nDiff = sText.getLength() - nMaxTextLen;
    1200           0 :         sText = sText.replaceAt(sText.getLength() - nDiff,nDiff, OUString());
    1201             :     }
    1202             : 
    1203             : 
    1204           0 :     m_pEdit->SetText( sText );
    1205           0 :     m_pEdit->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
    1206           0 : }
    1207             : 
    1208             : 
    1209           0 : bool DbTextField::commitControl()
    1210             : {
    1211           0 :     OUString aText( m_pEdit->GetText( getModelLineEndSetting( m_rColumn.getModel() ) ) );
    1212             :     // we have to check if the length before we can decide if the value was modified
    1213           0 :     sal_Int32 nMaxTextLen = m_pEdit->GetMaxTextLen();
    1214           0 :     if ( EDIT_NOLIMIT != nMaxTextLen )
    1215             :     {
    1216           0 :         OUString sOldValue;
    1217           0 :         m_rColumn.getModel()->getPropertyValue( FM_PROP_TEXT ) >>= sOldValue;
    1218             :         // if the new value didn't change we must set the old long value again
    1219           0 :         if ( sOldValue.getLength() > nMaxTextLen && sOldValue.compareTo(aText,nMaxTextLen) == 0 )
    1220           0 :             aText = sOldValue;
    1221             :     }
    1222           0 :     m_rColumn.getModel()->setPropertyValue( FM_PROP_TEXT, makeAny( aText ) );
    1223           0 :     return true;
    1224             : }
    1225             : 
    1226             : 
    1227          34 : void DbTextField::implSetEffectiveMaxTextLen( sal_Int32 _nMaxLen )
    1228             : {
    1229          34 :     if ( m_pEdit )
    1230          34 :         m_pEdit->SetMaxTextLen( _nMaxLen );
    1231          34 :     if ( m_pPainterImplementation )
    1232          34 :         m_pPainterImplementation->SetMaxTextLen( _nMaxLen );
    1233          34 : }
    1234             : 
    1235          28 : DbFormattedField::DbFormattedField(DbGridColumn& _rColumn)
    1236             :     :DbLimitedLengthField(_rColumn)
    1237          28 :     ,m_nKeyType(::com::sun::star::util::NumberFormat::UNDEFINED)
    1238             : {
    1239             : 
    1240             :     // if our model's format key changes we want to propagate the new value to our windows
    1241          28 :     doPropertyListening( FM_PROP_FORMATKEY );
    1242          28 : }
    1243             : 
    1244             : 
    1245          56 : DbFormattedField::~DbFormattedField()
    1246             : {
    1247          56 : }
    1248             : 
    1249             : 
    1250          28 : void DbFormattedField::Init( vcl::Window& rParent, const Reference< XRowSet >& xCursor)
    1251             : {
    1252          28 :     sal_Int16 nAlignment = m_rColumn.SetAlignmentFromModel(-1);
    1253             : 
    1254          28 :     Reference< ::com::sun::star::beans::XPropertySet >  xUnoModel = m_rColumn.getModel();
    1255             : 
    1256          28 :     switch (nAlignment)
    1257             :     {
    1258             :         case ::com::sun::star::awt::TextAlign::RIGHT:
    1259           0 :             m_pWindow  = new FormattedField( &rParent, WB_RIGHT );
    1260           0 :             m_pPainter = new FormattedField( &rParent, WB_RIGHT );
    1261           0 :             break;
    1262             : 
    1263             :         case ::com::sun::star::awt::TextAlign::CENTER:
    1264           0 :             m_pWindow  = new FormattedField( &rParent, WB_CENTER );
    1265           0 :             m_pPainter  = new FormattedField( &rParent, WB_CENTER );
    1266           0 :             break;
    1267             :         default:
    1268          28 :             m_pWindow  = new FormattedField( &rParent, WB_LEFT );
    1269          28 :             m_pPainter  = new FormattedField( &rParent, WB_LEFT );
    1270             : 
    1271             :             // Alles nur damit die Selektion bei Focuserhalt von rechts nach links geht
    1272          28 :             AllSettings aSettings = m_pWindow->GetSettings();
    1273          56 :             StyleSettings aStyleSettings = aSettings.GetStyleSettings();
    1274             :             aStyleSettings.SetSelectionOptions(
    1275          28 :                 aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
    1276          28 :             aSettings.SetStyleSettings(aStyleSettings);
    1277          56 :             m_pWindow->SetSettings(aSettings);
    1278             :     }
    1279             : 
    1280          28 :     implAdjustGenericFieldSetting( xUnoModel );
    1281             : 
    1282          28 :     static_cast< FormattedField* >( m_pWindow )->SetStrictFormat( false );
    1283          28 :     static_cast< FormattedField* >( m_pPainter )->SetStrictFormat( false );
    1284             :         // wenn man _irgendeine_ Formatierung zulaesst, kann man da sowieso keine Eingabe-Ueberpruefung
    1285             :         // machen (das FormattedField unterstuetzt das sowieso nicht, nur abgeleitete Klassen)
    1286             : 
    1287             :     // von dem Uno-Model den Formatter besorgen
    1288             :     // (Ich koennte theoretisch auch ueber den ::com::sun::star::util::NumberFormatter gehen, den mir der Cursor bestimmt
    1289             :     // liefern wuerde. Das Problem dabei ist, dass ich mich eigentlich nicht darauf verlassen
    1290             :     // kann, dass die beiden Formatter die selben sind, sauber ist das Ganze, wenn ich ueber das
    1291             :     // UNO-Model gehe.)
    1292          28 :     sal_Int32 nFormatKey = -1;
    1293             : 
    1294             :     // mal sehen, ob das Model einen hat ...
    1295             :     DBG_ASSERT(::comphelper::hasProperty(FM_PROP_FORMATSSUPPLIER, xUnoModel), "DbFormattedField::Init : invalid UNO model !");
    1296          28 :     Any aSupplier( xUnoModel->getPropertyValue(FM_PROP_FORMATSSUPPLIER));
    1297          28 :     if (aSupplier.hasValue())
    1298             :     {
    1299          28 :         m_xSupplier.set(aSupplier, css::uno::UNO_QUERY);
    1300          28 :         if (m_xSupplier.is())
    1301             :         {
    1302             :             // wenn wir den Supplier vom Model nehmen, dann auch den Key
    1303          28 :             Any aFmtKey( xUnoModel->getPropertyValue(FM_PROP_FORMATKEY));
    1304          28 :             if (aFmtKey.hasValue())
    1305             :             {
    1306             :                 DBG_ASSERT(aFmtKey.getValueType().getTypeClass() == TypeClass_LONG, "DbFormattedField::Init : invalid format key property (no sal_Int32) !");
    1307          28 :                 nFormatKey = ::comphelper::getINT32(aFmtKey);
    1308             :             }
    1309             :             else
    1310             :             {
    1311             :                 DBG_WARNING("DbFormattedField::Init : my uno-model has no format-key, but a formats supplier !");
    1312             :                 // the OFormattedModel which we usually are working with ensures that the model has a format key
    1313             :                 // as soon as the form is loaded. Unfortunally this method here is called from within loaded, too.
    1314             :                 // So if our LoadListener is called before the LoadListener of the model, this "else case" is
    1315             :                 // allowed.
    1316             :                 // Of course our property listener for the FormatKey property will notify us if the prop is changed,
    1317             :                 // so this here isn't really bad ....
    1318           0 :                 nFormatKey = 0;
    1319          28 :             }
    1320             :         }
    1321             :     }
    1322             : 
    1323             :     // nein ? vielleicht die ::com::sun::star::form::component::Form hinter dem Cursor ?
    1324          28 :     if (!m_xSupplier.is())
    1325             :     {
    1326           0 :         Reference< XRowSet >  xCursorForm(xCursor, UNO_QUERY);
    1327           0 :         if (xCursorForm.is())
    1328             :         {   // wenn wir vom Cursor den Formatter nehmen, dann auch den Key vom Feld, an das wir gebunden sind
    1329           0 :             m_xSupplier = getNumberFormats(getConnection(xCursorForm), false);
    1330             : 
    1331           0 :             if (m_rColumn.GetField().is())
    1332           0 :                 nFormatKey = ::comphelper::getINT32(m_rColumn.GetField()->getPropertyValue(FM_PROP_FORMATKEY));
    1333           0 :         }
    1334             :     }
    1335             : 
    1336          28 :     SvNumberFormatter* pFormatterUsed = NULL;
    1337          28 :     if (m_xSupplier.is())
    1338             :     {
    1339          28 :         SvNumberFormatsSupplierObj* pImplmentation = SvNumberFormatsSupplierObj::getImplementation(m_xSupplier);
    1340          28 :         if (pImplmentation)
    1341          28 :             pFormatterUsed = pImplmentation->GetNumberFormatter();
    1342             :         else
    1343             :             // alles hingfaellig : der Supplier ist vom falschen Typ, dann koennen wir uns auch nicht darauf verlassen, dass
    1344             :             // ein Standard-Formatter den (eventuell nicht-Standard-)Key kennt.
    1345           0 :             nFormatKey = -1;
    1346             :     }
    1347             : 
    1348             :     // einen Standard-Formatter ...
    1349          28 :     if (pFormatterUsed == NULL)
    1350             :     {
    1351           0 :         pFormatterUsed = static_cast<FormattedField*>(m_pWindow)->StandardFormatter();
    1352             :         DBG_ASSERT(pFormatterUsed != NULL, "DbFormattedField::Init : no standard formatter given by the numeric field !");
    1353             :     }
    1354             :     // ... und einen Standard-Key
    1355          28 :     if (nFormatKey == -1)
    1356           0 :         nFormatKey = 0;
    1357             : 
    1358          28 :     m_nKeyType  = comphelper::getNumberFormatType(m_xSupplier->getNumberFormats(), nFormatKey);
    1359             : 
    1360          28 :     static_cast<FormattedField*>(m_pWindow)->SetFormatter(pFormatterUsed);
    1361          28 :     static_cast<FormattedField*>(m_pPainter)->SetFormatter(pFormatterUsed);
    1362             : 
    1363          28 :     static_cast<FormattedField*>(m_pWindow)->SetFormatKey(nFormatKey);
    1364          28 :     static_cast<FormattedField*>(m_pPainter)->SetFormatKey(nFormatKey);
    1365             : 
    1366          28 :     static_cast<FormattedField*>(m_pWindow)->TreatAsNumber(m_rColumn.IsNumeric());
    1367          28 :     static_cast<FormattedField*>(m_pPainter)->TreatAsNumber(m_rColumn.IsNumeric());
    1368             : 
    1369             :     // Min- und Max-Werte
    1370          28 :     if (m_rColumn.IsNumeric())
    1371             :     {
    1372           0 :         bool bClearMin = true;
    1373           0 :         if (::comphelper::hasProperty(FM_PROP_EFFECTIVE_MIN, xUnoModel))
    1374             :         {
    1375           0 :             Any aMin( xUnoModel->getPropertyValue(FM_PROP_EFFECTIVE_MIN));
    1376           0 :             if (aMin.getValueType().getTypeClass() != TypeClass_VOID)
    1377             :             {
    1378             :                 DBG_ASSERT(aMin.getValueType().getTypeClass() == TypeClass_DOUBLE, "DbFormattedField::Init : the model has an invalid min value !");
    1379           0 :                 double dMin = ::comphelper::getDouble(aMin);
    1380           0 :                 static_cast<FormattedField*>(m_pWindow)->SetMinValue(dMin);
    1381           0 :                 static_cast<FormattedField*>(m_pPainter)->SetMinValue(dMin);
    1382           0 :                 bClearMin = false;
    1383           0 :             }
    1384             :         }
    1385           0 :         if (bClearMin)
    1386             :         {
    1387           0 :             static_cast<FormattedField*>(m_pWindow)->ClearMinValue();
    1388           0 :             static_cast<FormattedField*>(m_pPainter)->ClearMinValue();
    1389             :         }
    1390           0 :         bool bClearMax = true;
    1391           0 :         if (::comphelper::hasProperty(FM_PROP_EFFECTIVE_MAX, xUnoModel))
    1392             :         {
    1393           0 :             Any aMin( xUnoModel->getPropertyValue(FM_PROP_EFFECTIVE_MAX));
    1394           0 :             if (aMin.getValueType().getTypeClass() != TypeClass_VOID)
    1395             :             {
    1396             :                 DBG_ASSERT(aMin.getValueType().getTypeClass() == TypeClass_DOUBLE, "DbFormattedField::Init : the model has an invalid max value !");
    1397           0 :                 double dMin = ::comphelper::getDouble(aMin);
    1398           0 :                 static_cast<FormattedField*>(m_pWindow)->SetMaxValue(dMin);
    1399           0 :                 static_cast<FormattedField*>(m_pPainter)->SetMaxValue(dMin);
    1400           0 :                 bClearMax = false;
    1401           0 :             }
    1402             :         }
    1403           0 :         if (bClearMax)
    1404             :         {
    1405           0 :             static_cast<FormattedField*>(m_pWindow)->ClearMaxValue();
    1406           0 :             static_cast<FormattedField*>(m_pPainter)->ClearMaxValue();
    1407             :         }
    1408             :     }
    1409             : 
    1410             :     // den Default-Wert
    1411          56 :     Any aDefault( xUnoModel->getPropertyValue(FM_PROP_EFFECTIVE_DEFAULT));
    1412          28 :     if (aDefault.hasValue())
    1413             :     {   // das Ding kann ein double oder ein String sein
    1414           0 :         switch (aDefault.getValueType().getTypeClass())
    1415             :         {
    1416             :             case TypeClass_DOUBLE:
    1417           0 :                 if (m_rColumn.IsNumeric())
    1418             :                 {
    1419           0 :                     static_cast<FormattedField*>(m_pWindow)->SetDefaultValue(::comphelper::getDouble(aDefault));
    1420           0 :                     static_cast<FormattedField*>(m_pPainter)->SetDefaultValue(::comphelper::getDouble(aDefault));
    1421             :                 }
    1422             :                 else
    1423             :                 {
    1424           0 :                     OUString sConverted;
    1425             :                     Color* pDummy;
    1426           0 :                     pFormatterUsed->GetOutputString(::comphelper::getDouble(aDefault), 0, sConverted, &pDummy);
    1427           0 :                     static_cast<FormattedField*>(m_pWindow)->SetDefaultText(sConverted);
    1428           0 :                     static_cast<FormattedField*>(m_pPainter)->SetDefaultText(sConverted);
    1429             :                 }
    1430           0 :                 break;
    1431             :             case TypeClass_STRING:
    1432             :             {
    1433           0 :                 OUString sDefault( ::comphelper::getString(aDefault) );
    1434           0 :                 if (m_rColumn.IsNumeric())
    1435             :                 {
    1436             :                     double dVal;
    1437           0 :                     sal_uInt32 nTestFormat(0);
    1438           0 :                     if (pFormatterUsed->IsNumberFormat(sDefault, nTestFormat, dVal))
    1439             :                     {
    1440           0 :                         static_cast<FormattedField*>(m_pWindow)->SetDefaultValue(dVal);
    1441           0 :                         static_cast<FormattedField*>(m_pPainter)->SetDefaultValue(dVal);
    1442             :                     }
    1443             :                 }
    1444             :                 else
    1445             :                 {
    1446           0 :                     static_cast<FormattedField*>(m_pWindow)->SetDefaultText(sDefault);
    1447           0 :                     static_cast<FormattedField*>(m_pPainter)->SetDefaultText(sDefault);
    1448           0 :                 }
    1449             :             }
    1450           0 :             break;
    1451             :             default:
    1452             :                 OSL_FAIL( "DbFormattedField::Init: unexpected value type!" );
    1453           0 :                 break;
    1454             :         }
    1455             :     }
    1456          56 :     DbLimitedLengthField::Init( rParent, xCursor );
    1457          28 : }
    1458             : 
    1459             : 
    1460          28 : CellControllerRef DbFormattedField::CreateController() const
    1461             : {
    1462          28 :     return new ::svt::FormattedFieldCellController( static_cast< FormattedField* >( m_pWindow ) );
    1463             : }
    1464             : 
    1465             : 
    1466           0 : void DbFormattedField::_propertyChanged( const PropertyChangeEvent& _rEvent ) throw( RuntimeException )
    1467             : {
    1468           0 :     if (_rEvent.PropertyName == FM_PROP_FORMATKEY )
    1469             :     {
    1470           0 :         sal_Int32 nNewKey = _rEvent.NewValue.hasValue() ? ::comphelper::getINT32(_rEvent.NewValue) : 0;
    1471           0 :         m_nKeyType = comphelper::getNumberFormatType(m_xSupplier->getNumberFormats(), nNewKey);
    1472             : 
    1473             :         DBG_ASSERT(m_pWindow && m_pPainter, "DbFormattedField::_propertyChanged : where are my windows ?");
    1474           0 :         if (m_pWindow)
    1475           0 :             static_cast< FormattedField* >( m_pWindow )->SetFormatKey( nNewKey );
    1476           0 :         if (m_pPainter)
    1477           0 :             static_cast< FormattedField* >( m_pPainter )->SetFormatKey( nNewKey );
    1478             :     }
    1479             :     else
    1480             :     {
    1481           0 :         DbLimitedLengthField::_propertyChanged( _rEvent );
    1482             :     }
    1483           0 : }
    1484             : 
    1485             : 
    1486          46 : OUString DbFormattedField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/, Color** ppColor)
    1487             : {
    1488             :     // defaultmaessig keine Farb-Angabe
    1489          46 :     if (ppColor != NULL)
    1490          46 :         *ppColor = NULL;
    1491             : 
    1492             :     // NULL-Wert -> leerer Text
    1493          46 :     if (!_rxField.is())
    1494           0 :         return OUString();
    1495             : 
    1496          46 :     OUString aText;
    1497             :     try
    1498             :     {
    1499          46 :         if (m_rColumn.IsNumeric())
    1500             :         {
    1501             :             // das IsNumeric an der Column sagt nichts aus ueber die Klasse des benutzen Formates, sondern
    1502             :             // ueber die des an die Column gebundenen Feldes. Wenn man also eine FormattedField-Spalte an
    1503             :             // ein double-Feld bindet und als Text formatiert, liefert m_rColumn.IsNumeric() sal_True. Das heisst
    1504             :             // also einfach, dass ich den Inhalt der Variant mittels getDouble abfragen kann, und dann kann
    1505             :             // ich den Rest (die Formatierung) dem FormattedField ueberlassen.
    1506           0 :             double dValue = getValue( _rxField, m_rColumn.GetParent().getNullDate() );
    1507           0 :             if (_rxField->wasNull())
    1508           0 :                 return aText;
    1509           0 :             static_cast<FormattedField*>(m_pPainter)->SetValue(dValue);
    1510             :         }
    1511             :         else
    1512             :         {
    1513             :             // Hier kann ich nicht mit einem double arbeiten, da das Feld mir keines liefern kann.
    1514             :             // Also einfach den Text vom ::com::sun::star::util::NumberFormatter in die richtige ::com::sun::star::form::component::Form brinden lassen.
    1515          46 :             aText = _rxField->getString();
    1516          46 :             if (_rxField->wasNull())
    1517          16 :                 return aText;
    1518          30 :             static_cast<FormattedField*>(m_pPainter)->SetTextFormatted(aText);
    1519             :         }
    1520             :     }
    1521           0 :     catch( const Exception& )
    1522             :     {
    1523             :         DBG_UNHANDLED_EXCEPTION();
    1524             :     }
    1525             : 
    1526          30 :     aText = m_pPainter->GetText();
    1527          30 :     if (ppColor != NULL)
    1528          30 :         *ppColor = static_cast<FormattedField*>(m_pPainter)->GetLastOutputColor();
    1529             : 
    1530          30 :     return aText;
    1531             : }
    1532             : 
    1533             : 
    1534           2 : void DbFormattedField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
    1535             : {
    1536             :     try
    1537             :     {
    1538           2 :         FormattedField* pFormattedWindow = static_cast<FormattedField*>(m_pWindow);
    1539           2 :         if (!_rxField.is())
    1540             :         {   // NULL-Wert -> leerer Text
    1541           0 :             m_pWindow->SetText(OUString());
    1542             :         }
    1543           2 :         else if (m_rColumn.IsNumeric())
    1544             :         {
    1545             :             // das IsNumeric an der Column sagt nichts aus ueber die Klasse des benutzen Formates, sondern
    1546             :             // ueber die des an die Column gebundenen Feldes. Wenn man also eine FormattedField-Spalte an
    1547             :             // ein double-Feld bindet und als Text formatiert, liefert m_rColumn.IsNumeric() sal_True. Das heisst
    1548             :             // also einfach, dass ich den Inhalt der Variant mittels getDouble abfragen kann, und dann kann
    1549             :             // ich den Rest (die Formatierung) dem FormattedField ueberlassen.
    1550           0 :             double dValue = getValue( _rxField, m_rColumn.GetParent().getNullDate() );
    1551           0 :             if (_rxField->wasNull())
    1552           0 :                 m_pWindow->SetText(OUString());
    1553             :             else
    1554           0 :                 pFormattedWindow->SetValue(dValue);
    1555             :         }
    1556             :         else
    1557             :         {
    1558             :             // Hier kann ich nicht mit einem double arbeiten, da das Feld mir keines liefern kann.
    1559             :             // Also einfach den Text vom ::com::sun::star::util::NumberFormatter in die richtige ::com::sun::star::form::component::Form brinden lassen.
    1560           2 :             OUString sText( _rxField->getString());
    1561             : 
    1562           2 :             pFormattedWindow->SetTextFormatted( sText );
    1563           2 :             pFormattedWindow->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
    1564             :         }
    1565             :     }
    1566           0 :     catch( const Exception& )
    1567             :     {
    1568             :         DBG_UNHANDLED_EXCEPTION();
    1569             :     }
    1570           2 : }
    1571             : 
    1572             : 
    1573           0 : void DbFormattedField::updateFromModel( Reference< XPropertySet > _rxModel )
    1574             : {
    1575             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbFormattedField::updateFromModel: invalid call!" );
    1576             : 
    1577           0 :     FormattedField* pFormattedWindow = static_cast< FormattedField* >( m_pWindow );
    1578             : 
    1579           0 :     OUString sText;
    1580           0 :     Any aValue = _rxModel->getPropertyValue( FM_PROP_EFFECTIVE_VALUE );
    1581           0 :     if ( aValue >>= sText )
    1582             :     {   // our effective value is transferred as string
    1583           0 :         pFormattedWindow->SetTextFormatted( sText );
    1584           0 :         pFormattedWindow->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
    1585             :     }
    1586             :     else
    1587             :     {
    1588           0 :         double dValue = 0;
    1589           0 :         aValue >>= dValue;
    1590           0 :         pFormattedWindow->SetValue(dValue);
    1591           0 :     }
    1592           0 : }
    1593             : 
    1594             : 
    1595           0 : bool DbFormattedField::commitControl()
    1596             : {
    1597           0 :     Any aNewVal;
    1598           0 :     FormattedField& rField = *static_cast<FormattedField*>(m_pWindow);
    1599             :     DBG_ASSERT(&rField == m_pWindow, "DbFormattedField::commitControl : can't work with a window other than my own !");
    1600           0 :     if (m_rColumn.IsNumeric())
    1601             :     {
    1602           0 :         if (!rField.GetText().isEmpty())
    1603           0 :             aNewVal <<= rField.GetValue();
    1604             :         // ein LeerString wird erst mal standardmaessig als void weitergereicht
    1605             :     }
    1606             :     else
    1607           0 :         aNewVal <<= OUString(rField.GetTextValue());
    1608             : 
    1609           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_EFFECTIVE_VALUE, aNewVal);
    1610           0 :     return true;
    1611             : }
    1612             : 
    1613           0 : DbCheckBox::DbCheckBox( DbGridColumn& _rColumn )
    1614           0 :     :DbCellControl( _rColumn, true )
    1615             : {
    1616           0 :     setAlignedController( false );
    1617           0 : }
    1618             : 
    1619             : namespace
    1620             : {
    1621           0 :     void setCheckBoxStyle( vcl::Window* _pWindow, bool bMono )
    1622             :     {
    1623           0 :         AllSettings aSettings = _pWindow->GetSettings();
    1624           0 :         StyleSettings aStyleSettings = aSettings.GetStyleSettings();
    1625           0 :         if( bMono )
    1626           0 :             aStyleSettings.SetOptions( aStyleSettings.GetOptions() | STYLE_OPTION_MONO );
    1627             :         else
    1628           0 :             aStyleSettings.SetOptions( aStyleSettings.GetOptions() & (~STYLE_OPTION_MONO) );
    1629           0 :         aSettings.SetStyleSettings( aStyleSettings );
    1630           0 :         _pWindow->SetSettings( aSettings );
    1631           0 :     }
    1632             : }
    1633             : 
    1634             : 
    1635           0 : void DbCheckBox::Init( vcl::Window& rParent, const Reference< XRowSet >& xCursor )
    1636             : {
    1637           0 :     setTransparent( true );
    1638             : 
    1639           0 :     m_pWindow  = new CheckBoxControl( &rParent );
    1640           0 :     m_pPainter = new CheckBoxControl( &rParent );
    1641             : 
    1642           0 :     m_pWindow->SetPaintTransparent( true );
    1643           0 :     m_pPainter->SetPaintTransparent( true );
    1644             : 
    1645           0 :     m_pPainter->SetBackground();
    1646             : 
    1647             :     try
    1648             :     {
    1649           0 :         Reference< XPropertySet > xModel( m_rColumn.getModel(), UNO_SET_THROW );
    1650             : 
    1651           0 :         sal_Int16 nStyle = awt::VisualEffect::LOOK3D;
    1652           0 :         OSL_VERIFY( xModel->getPropertyValue( FM_PROP_VISUALEFFECT ) >>= nStyle );
    1653             : 
    1654           0 :         setCheckBoxStyle( m_pWindow, nStyle == awt::VisualEffect::FLAT );
    1655           0 :         setCheckBoxStyle( m_pPainter, nStyle == awt::VisualEffect::FLAT );
    1656             : 
    1657           0 :         bool bTristate = true;
    1658           0 :         OSL_VERIFY( xModel->getPropertyValue( FM_PROP_TRISTATE ) >>= bTristate );
    1659           0 :         static_cast< CheckBoxControl* >( m_pWindow )->GetBox().EnableTriState( bTristate );
    1660           0 :         static_cast< CheckBoxControl* >( m_pPainter )->GetBox().EnableTriState( bTristate );
    1661             :     }
    1662           0 :     catch( const Exception& )
    1663             :     {
    1664             :         DBG_UNHANDLED_EXCEPTION();
    1665             :     }
    1666             : 
    1667           0 :     DbCellControl::Init( rParent, xCursor );
    1668           0 : }
    1669             : 
    1670             : 
    1671           0 : CellControllerRef DbCheckBox::CreateController() const
    1672             : {
    1673           0 :     return new CheckBoxCellController(static_cast<CheckBoxControl*>(m_pWindow));
    1674             : }
    1675             : 
    1676           0 : static void lcl_setCheckBoxState(   const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
    1677             :                         CheckBoxControl* _pCheckBoxControl )
    1678             : {
    1679           0 :     TriState eState = TRISTATE_INDET;
    1680           0 :     if (_rxField.is())
    1681             :     {
    1682             :         try
    1683             :         {
    1684           0 :             bool bValue = _rxField->getBoolean();
    1685           0 :             if (!_rxField->wasNull())
    1686           0 :                 eState = bValue ? TRISTATE_TRUE : TRISTATE_FALSE;
    1687             :         }
    1688           0 :         catch( const Exception& )
    1689             :         {
    1690             :             DBG_UNHANDLED_EXCEPTION();
    1691             :         }
    1692             :     }
    1693           0 :     _pCheckBoxControl->GetBox().SetState(eState);
    1694           0 : }
    1695             : 
    1696             : 
    1697           0 : void DbCheckBox::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
    1698             : {
    1699           0 :     lcl_setCheckBoxState( _rxField, static_cast<CheckBoxControl*>(m_pWindow) );
    1700           0 : }
    1701             : 
    1702             : 
    1703           0 : void DbCheckBox::PaintFieldToCell(OutputDevice& rDev, const Rectangle& rRect,
    1704             :                           const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
    1705             :                           const Reference< XNumberFormatter >& xFormatter)
    1706             : {
    1707           0 :     lcl_setCheckBoxState( _rxField, static_cast<CheckBoxControl*>(m_pPainter) );
    1708           0 :     DbCellControl::PaintFieldToCell( rDev, rRect, _rxField, xFormatter );
    1709           0 : }
    1710             : 
    1711             : 
    1712           0 : void DbCheckBox::updateFromModel( Reference< XPropertySet > _rxModel )
    1713             : {
    1714             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbCheckBox::updateFromModel: invalid call!" );
    1715             : 
    1716           0 :     sal_Int16 nState = TRISTATE_INDET;
    1717           0 :     _rxModel->getPropertyValue( FM_PROP_STATE ) >>= nState;
    1718           0 :     static_cast< CheckBoxControl* >( m_pWindow )->GetBox().SetState( static_cast< TriState >( nState ) );
    1719           0 : }
    1720             : 
    1721             : 
    1722           0 : bool DbCheckBox::commitControl()
    1723             : {
    1724           0 :     m_rColumn.getModel()->setPropertyValue( FM_PROP_STATE,
    1725           0 :                     makeAny( (sal_Int16)( static_cast< CheckBoxControl* >( m_pWindow )->GetBox().GetState() ) ) );
    1726           0 :     return true;
    1727             : }
    1728             : 
    1729             : 
    1730           0 : OUString DbCheckBox::GetFormatText(const Reference< XColumn >& /*_rxField*/, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
    1731             : {
    1732           0 :     return OUString();
    1733             : }
    1734             : 
    1735           0 : DbPatternField::DbPatternField( DbGridColumn& _rColumn, const Reference<XComponentContext>& _rContext )
    1736             :     :DbCellControl( _rColumn )
    1737           0 :     ,m_xContext( _rContext )
    1738             : {
    1739           0 :     doPropertyListening( FM_PROP_LITERALMASK );
    1740           0 :     doPropertyListening( FM_PROP_EDITMASK );
    1741           0 :     doPropertyListening( FM_PROP_STRICTFORMAT );
    1742           0 : }
    1743             : 
    1744             : 
    1745           0 : void DbPatternField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    1746             : {
    1747             :     DBG_ASSERT( m_pWindow, "DbPatternField::implAdjustGenericFieldSetting: not to be called without window!" );
    1748             :     DBG_ASSERT( _rxModel.is(), "DbPatternField::implAdjustGenericFieldSetting: invalid model!" );
    1749           0 :     if ( m_pWindow && _rxModel.is() )
    1750             :     {
    1751           0 :         OUString aLitMask;
    1752           0 :         OUString aEditMask;
    1753           0 :         bool bStrict = false;
    1754             : 
    1755           0 :         _rxModel->getPropertyValue( FM_PROP_LITERALMASK ) >>= aLitMask;
    1756           0 :         _rxModel->getPropertyValue( FM_PROP_EDITMASK ) >>= aEditMask;
    1757           0 :         _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) >>= bStrict;
    1758             : 
    1759           0 :         OString aAsciiEditMask(OUStringToOString(aEditMask, RTL_TEXTENCODING_ASCII_US));
    1760             : 
    1761           0 :         static_cast< PatternField* >( m_pWindow )->SetMask( aAsciiEditMask, aLitMask );
    1762           0 :         static_cast< PatternField* >( m_pPainter )->SetMask( aAsciiEditMask, aLitMask );
    1763           0 :         static_cast< PatternField* >( m_pWindow )->SetStrictFormat( bStrict );
    1764           0 :         static_cast< PatternField* >( m_pPainter )->SetStrictFormat( bStrict );
    1765             :     }
    1766           0 : }
    1767             : 
    1768             : 
    1769           0 : void DbPatternField::Init( vcl::Window& rParent, const Reference< XRowSet >& xCursor)
    1770             : {
    1771           0 :     m_rColumn.SetAlignmentFromModel(-1);
    1772             : 
    1773           0 :     m_pWindow = new PatternField( &rParent, 0 );
    1774           0 :     m_pPainter= new PatternField( &rParent, 0 );
    1775             : 
    1776           0 :     Reference< XPropertySet >   xModel( m_rColumn.getModel() );
    1777           0 :     implAdjustGenericFieldSetting( xModel );
    1778             : 
    1779           0 :     DbCellControl::Init( rParent, xCursor );
    1780           0 : }
    1781             : 
    1782             : 
    1783           0 : CellControllerRef DbPatternField::CreateController() const
    1784             : {
    1785           0 :     return new SpinCellController( static_cast< PatternField* >( m_pWindow ) );
    1786             : }
    1787             : 
    1788             : 
    1789           0 : OUString DbPatternField::impl_formatText( const OUString& _rText )
    1790             : {
    1791           0 :     m_pPainter->SetText( _rText );
    1792           0 :     static_cast< PatternField* >( m_pPainter )->ReformatAll();
    1793           0 :     return m_pPainter->GetText();
    1794             : }
    1795             : 
    1796             : 
    1797           0 : OUString DbPatternField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
    1798             : {
    1799           0 :     bool bIsForPaint = _rxField != m_rColumn.GetField();
    1800           0 :     ::std::unique_ptr< FormattedColumnValue >& rpFormatter = bIsForPaint ? m_pPaintFormatter : m_pValueFormatter;
    1801             : 
    1802           0 :     if ( !rpFormatter.get() )
    1803             :     {
    1804           0 :         DBToolsObjectFactory aFactory;
    1805           0 :         rpFormatter = aFactory.createFormattedColumnValue(
    1806           0 :             m_xContext, getCursor(), Reference< XPropertySet >( _rxField, UNO_QUERY ) );
    1807           0 :         OSL_ENSURE( rpFormatter.get(), "DbPatternField::Init: no value formatter!" );
    1808             :     }
    1809             :     else
    1810             :         OSL_ENSURE( rpFormatter->getColumn() == _rxField, "DbPatternField::GetFormatText: my value formatter is working for another field ...!" );
    1811             :         // re-creating the value formatter here every time would be quite expensive ...
    1812             : 
    1813           0 :     OUString sText;
    1814           0 :     if ( rpFormatter.get() )
    1815           0 :         sText = rpFormatter->getFormattedValue();
    1816             : 
    1817           0 :     return impl_formatText( sText );
    1818             : }
    1819             : 
    1820             : 
    1821           0 : void DbPatternField::UpdateFromField( const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
    1822             : {
    1823           0 :     static_cast< Edit* >( m_pWindow )->SetText( GetFormatText( _rxField, _rxFormatter ) );
    1824           0 :     static_cast< Edit* >( m_pWindow )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
    1825           0 : }
    1826             : 
    1827             : 
    1828           0 : void DbPatternField::updateFromModel( Reference< XPropertySet > _rxModel )
    1829             : {
    1830             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbPatternField::updateFromModel: invalid call!" );
    1831             : 
    1832           0 :     OUString sText;
    1833           0 :     _rxModel->getPropertyValue( FM_PROP_TEXT ) >>= sText;
    1834             : 
    1835           0 :     static_cast< Edit* >( m_pWindow )->SetText( impl_formatText( sText ) );
    1836           0 :     static_cast< Edit* >( m_pWindow )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
    1837           0 : }
    1838             : 
    1839             : 
    1840           0 : bool DbPatternField::commitControl()
    1841             : {
    1842           0 :     OUString aText(m_pWindow->GetText());
    1843           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_TEXT, makeAny(aText));
    1844           0 :     return true;
    1845             : }
    1846             : 
    1847           0 : DbSpinField::DbSpinField( DbGridColumn& _rColumn, sal_Int16 _nStandardAlign )
    1848             :     :DbCellControl( _rColumn )
    1849           0 :     ,m_nStandardAlign( _nStandardAlign )
    1850             : {
    1851           0 : }
    1852             : 
    1853             : 
    1854           0 : void DbSpinField::Init( vcl::Window& _rParent, const Reference< XRowSet >& _rxCursor )
    1855             : {
    1856           0 :     m_rColumn.SetAlignmentFromModel( m_nStandardAlign );
    1857             : 
    1858           0 :     Reference< XPropertySet > xModel( m_rColumn.getModel() );
    1859             : 
    1860             :     // determine the WinBits for the field
    1861           0 :     WinBits nFieldStyle = 0;
    1862           0 :     if ( ::comphelper::getBOOL( xModel->getPropertyValue( FM_PROP_SPIN ) ) )
    1863           0 :         nFieldStyle = WB_REPEAT | WB_SPIN;
    1864             :     // create the fields
    1865           0 :     m_pWindow = createField( &_rParent, nFieldStyle, xModel );
    1866           0 :     m_pPainter = createField( &_rParent, nFieldStyle, xModel );
    1867             : 
    1868             :     // adjust all other settings which depend on the property values
    1869           0 :     implAdjustGenericFieldSetting( xModel );
    1870             : 
    1871             :     // call the base class
    1872           0 :     DbCellControl::Init( _rParent, _rxCursor );
    1873           0 : }
    1874             : 
    1875             : 
    1876           0 : CellControllerRef DbSpinField::CreateController() const
    1877             : {
    1878           0 :     return new SpinCellController( static_cast< SpinField* >( m_pWindow ) );
    1879             : }
    1880             : 
    1881           0 : DbNumericField::DbNumericField( DbGridColumn& _rColumn )
    1882           0 :     :DbSpinField( _rColumn )
    1883             : {
    1884           0 :     doPropertyListening( FM_PROP_DECIMAL_ACCURACY );
    1885           0 :     doPropertyListening( FM_PROP_VALUEMIN );
    1886           0 :     doPropertyListening( FM_PROP_VALUEMAX );
    1887           0 :     doPropertyListening( FM_PROP_VALUESTEP );
    1888           0 :     doPropertyListening( FM_PROP_STRICTFORMAT );
    1889           0 :     doPropertyListening( FM_PROP_SHOWTHOUSANDSEP );
    1890           0 : }
    1891             : 
    1892             : 
    1893           0 : void DbNumericField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    1894             : {
    1895             :     DBG_ASSERT( m_pWindow, "DbNumericField::implAdjustGenericFieldSetting: not to be called without window!" );
    1896             :     DBG_ASSERT( _rxModel.is(), "DbNumericField::implAdjustGenericFieldSetting: invalid model!" );
    1897           0 :     if ( m_pWindow && _rxModel.is() )
    1898             :     {
    1899           0 :         sal_Int32   nMin        = (sal_Int32)getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMIN ) );
    1900           0 :         sal_Int32   nMax        = (sal_Int32)getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMAX ) );
    1901           0 :         sal_Int32   nStep       = (sal_Int32)getDouble( _rxModel->getPropertyValue( FM_PROP_VALUESTEP ) );
    1902           0 :         bool    bStrict     = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
    1903           0 :         sal_Int16   nScale      = getINT16( _rxModel->getPropertyValue( FM_PROP_DECIMAL_ACCURACY ) );
    1904           0 :         bool    bThousand   = getBOOL( _rxModel->getPropertyValue( FM_PROP_SHOWTHOUSANDSEP ) );
    1905             : 
    1906           0 :         static_cast< DoubleNumericField* >( m_pWindow )->SetMinValue(nMin);
    1907           0 :         static_cast< DoubleNumericField* >( m_pWindow )->SetMaxValue(nMax);
    1908           0 :         static_cast< DoubleNumericField* >( m_pWindow )->SetSpinSize(nStep);
    1909           0 :         static_cast< DoubleNumericField* >( m_pWindow )->SetStrictFormat(bStrict);
    1910             : 
    1911           0 :         static_cast< DoubleNumericField* >( m_pPainter )->SetMinValue(nMin);
    1912           0 :         static_cast< DoubleNumericField* >( m_pPainter )->SetMaxValue(nMax);
    1913           0 :         static_cast< DoubleNumericField* >( m_pPainter )->SetStrictFormat(bStrict);
    1914             : 
    1915             : 
    1916             :         // dem Field und dem Painter einen Formatter spendieren
    1917             :         // zuerst testen, ob ich von dem Service hinter einer Connection bekommen kann
    1918           0 :         Reference< ::com::sun::star::util::XNumberFormatsSupplier >  xSupplier;
    1919           0 :         Reference< XRowSet > xForm;
    1920           0 :         if ( m_rColumn.GetParent().getDataSource() )
    1921           0 :             xForm = Reference< XRowSet >( Reference< XInterface >(*m_rColumn.GetParent().getDataSource()), UNO_QUERY );
    1922           0 :         if ( xForm.is() )
    1923           0 :             xSupplier = getNumberFormats( getConnection( xForm ), true );
    1924           0 :         SvNumberFormatter* pFormatterUsed = NULL;
    1925           0 :         if ( xSupplier.is() )
    1926             :         {
    1927           0 :             SvNumberFormatsSupplierObj* pImplmentation = SvNumberFormatsSupplierObj::getImplementation( xSupplier );
    1928           0 :             pFormatterUsed = pImplmentation ? pImplmentation->GetNumberFormatter() : NULL;
    1929             :         }
    1930           0 :         if ( NULL == pFormatterUsed )
    1931             :         {   // der Cursor fuehrte nicht zum Erfolg -> Standard
    1932           0 :             pFormatterUsed = static_cast< DoubleNumericField* >( m_pWindow )->StandardFormatter();
    1933             :             DBG_ASSERT( pFormatterUsed != NULL, "DbNumericField::implAdjustGenericFieldSetting: no standard formatter given by the numeric field !" );
    1934             :         }
    1935           0 :         static_cast< DoubleNumericField* >( m_pWindow )->SetFormatter( pFormatterUsed );
    1936           0 :         static_cast< DoubleNumericField* >( m_pPainter )->SetFormatter( pFormatterUsed );
    1937             : 
    1938             :         // und dann ein Format generieren, dass die gewuenschten Nachkommastellen usw. hat
    1939           0 :         LanguageType aAppLanguage = Application::GetSettings().GetUILanguageTag().getLanguageType();
    1940           0 :         OUString sFormatString = pFormatterUsed->GenerateFormat(0, aAppLanguage, bThousand, false, nScale);
    1941             : 
    1942           0 :         static_cast< DoubleNumericField* >( m_pWindow )->SetFormat( sFormatString, aAppLanguage );
    1943           0 :         static_cast< DoubleNumericField* >( m_pPainter )->SetFormat( sFormatString, aAppLanguage );
    1944             :     }
    1945           0 : }
    1946             : 
    1947             : 
    1948           0 : SpinField* DbNumericField::createField( vcl::Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& /*_rxModel*/  )
    1949             : {
    1950           0 :     return new DoubleNumericField( _pParent, _nFieldStyle );
    1951             : }
    1952             : 
    1953             : namespace
    1954             : {
    1955             : 
    1956           0 :     static OUString lcl_setFormattedNumeric_nothrow( DoubleNumericField& _rField, const DbCellControl& _rControl,
    1957             :         const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
    1958             :     {
    1959           0 :         OUString sValue;
    1960           0 :         if ( _rxField.is() )
    1961             :         {
    1962             :             try
    1963             :             {
    1964           0 :                 double fValue = _rControl.GetValue( _rxField, _rxFormatter );
    1965           0 :                 if ( !_rxField->wasNull() )
    1966             :                 {
    1967           0 :                     _rField.SetValue( fValue );
    1968           0 :                     sValue = _rField.GetText();
    1969             :                 }
    1970             :             }
    1971           0 :             catch( const Exception& )
    1972             :             {
    1973             :                 DBG_UNHANDLED_EXCEPTION();
    1974             :             }
    1975             :         }
    1976           0 :         return sValue;
    1977             :     }
    1978             : }
    1979             : 
    1980             : 
    1981           0 : OUString DbNumericField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, Color** /*ppColor*/)
    1982             : {
    1983           0 :     return lcl_setFormattedNumeric_nothrow(dynamic_cast<DoubleNumericField&>(*m_pPainter), *this, _rxField, _rxFormatter);
    1984             : }
    1985             : 
    1986             : 
    1987           0 : void DbNumericField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter)
    1988             : {
    1989           0 :     lcl_setFormattedNumeric_nothrow(dynamic_cast<DoubleNumericField&>(*m_pWindow), *this, _rxField, _rxFormatter);
    1990           0 : }
    1991             : 
    1992             : 
    1993           0 : void DbNumericField::updateFromModel( Reference< XPropertySet > _rxModel )
    1994             : {
    1995             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbNumericField::updateFromModel: invalid call!" );
    1996             : 
    1997           0 :     double dValue = 0;
    1998           0 :     if ( _rxModel->getPropertyValue( FM_PROP_VALUE ) >>= dValue )
    1999           0 :         static_cast< DoubleNumericField* >( m_pWindow )->SetValue( dValue );
    2000             :     else
    2001           0 :         m_pWindow->SetText( OUString() );
    2002           0 : }
    2003             : 
    2004             : 
    2005           0 : bool DbNumericField::commitControl()
    2006             : {
    2007           0 :     OUString aText( m_pWindow->GetText());
    2008           0 :     Any aVal;
    2009             : 
    2010           0 :     if (!aText.isEmpty())   // not empty
    2011             :     {
    2012           0 :         double fValue = static_cast<DoubleNumericField*>(m_pWindow)->GetValue();
    2013           0 :         aVal <<= (double)fValue;
    2014             :     }
    2015           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_VALUE, aVal);
    2016           0 :     return true;
    2017             : }
    2018             : 
    2019           0 : DbCurrencyField::DbCurrencyField(DbGridColumn& _rColumn)
    2020             :     :DbSpinField( _rColumn )
    2021           0 :     ,m_nScale( 0 )
    2022             : {
    2023           0 :     doPropertyListening( FM_PROP_DECIMAL_ACCURACY );
    2024           0 :     doPropertyListening( FM_PROP_VALUEMIN );
    2025           0 :     doPropertyListening( FM_PROP_VALUEMAX );
    2026           0 :     doPropertyListening( FM_PROP_VALUESTEP );
    2027           0 :     doPropertyListening( FM_PROP_STRICTFORMAT );
    2028           0 :     doPropertyListening( FM_PROP_SHOWTHOUSANDSEP );
    2029           0 :     doPropertyListening( FM_PROP_CURRENCYSYMBOL );
    2030           0 : }
    2031             : 
    2032             : 
    2033           0 : void DbCurrencyField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    2034             : {
    2035             :     DBG_ASSERT( m_pWindow, "DbCurrencyField::implAdjustGenericFieldSetting: not to be called without window!" );
    2036             :     DBG_ASSERT( _rxModel.is(), "DbCurrencyField::implAdjustGenericFieldSetting: invalid model!" );
    2037           0 :     if ( m_pWindow && _rxModel.is() )
    2038             :     {
    2039           0 :         m_nScale                = getINT16( _rxModel->getPropertyValue( FM_PROP_DECIMAL_ACCURACY ) );
    2040           0 :         double  nMin            = getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMIN ) );
    2041           0 :         double  nMax            = getDouble( _rxModel->getPropertyValue( FM_PROP_VALUEMAX ) );
    2042           0 :         double  nStep           = getDouble( _rxModel->getPropertyValue( FM_PROP_VALUESTEP ) );
    2043           0 :         bool    bStrict     = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
    2044           0 :         bool    bThousand   = getBOOL( _rxModel->getPropertyValue( FM_PROP_SHOWTHOUSANDSEP ) );
    2045           0 :         OUString aStr( getString( _rxModel->getPropertyValue(FM_PROP_CURRENCYSYMBOL ) ) );
    2046             : 
    2047             :         //fdo#42747 the min/max/first/last of vcl NumericFormatters needs to be
    2048             :         //multiplied by the no of decimal places. See also
    2049             :         //VclBuilder::mungeAdjustment
    2050           0 :         int nMul = rtl_math_pow10Exp(1, m_nScale);
    2051           0 :         nMin *= nMul;
    2052           0 :         nMax *= nMul;
    2053             : 
    2054           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetUseThousandSep( bThousand );
    2055           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetDecimalDigits( m_nScale );
    2056           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetCurrencySymbol( aStr );
    2057           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetFirst( nMin );
    2058           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetLast( nMax );
    2059           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetMin( nMin );
    2060           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetMax( nMax );
    2061           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetSpinSize( nStep );
    2062           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetStrictFormat( bStrict );
    2063             : 
    2064           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetUseThousandSep( bThousand );
    2065           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetDecimalDigits( m_nScale );
    2066           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetCurrencySymbol( aStr );
    2067           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetFirst( nMin );
    2068           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetLast( nMax );
    2069           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetMin( nMin );
    2070           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetMax( nMax );
    2071           0 :         static_cast< LongCurrencyField* >( m_pPainter )->SetStrictFormat( bStrict );
    2072             :     }
    2073           0 : }
    2074             : 
    2075             : 
    2076           0 : SpinField* DbCurrencyField::createField( vcl::Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& /*_rxModel*/  )
    2077             : {
    2078           0 :     return new LongCurrencyField( _pParent, _nFieldStyle );
    2079             : }
    2080             : 
    2081             : 
    2082           0 : double DbCurrencyField::GetCurrency(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter) const
    2083             : {
    2084           0 :     double fValue = GetValue(_rxField, xFormatter);
    2085           0 :     if (m_nScale)
    2086             :     {
    2087             :         // OSL_TRACE("double = %.64f ",fValue);
    2088           0 :         fValue = ::rtl::math::pow10Exp(fValue, m_nScale);
    2089           0 :         fValue = ::rtl::math::round(fValue, 0);
    2090             :     }
    2091           0 :     return fValue;
    2092             : }
    2093             : 
    2094             : namespace
    2095             : {
    2096             : 
    2097           0 :     static OUString lcl_setFormattedCurrency_nothrow( LongCurrencyField& _rField, const DbCurrencyField& _rControl,
    2098             :         const Reference< XColumn >& _rxField, const Reference< XNumberFormatter >& _rxFormatter )
    2099             :     {
    2100           0 :         OUString sValue;
    2101           0 :         if ( _rxField.is() )
    2102             :         {
    2103             :             try
    2104             :             {
    2105           0 :                 double fValue = _rControl.GetCurrency( _rxField, _rxFormatter );
    2106           0 :                 if ( !_rxField->wasNull() )
    2107             :                 {
    2108           0 :                     _rField.SetValue( fValue );
    2109           0 :                     sValue = _rField.GetText();
    2110             :                 }
    2111             :             }
    2112           0 :             catch( const Exception& )
    2113             :             {
    2114             :                 DBG_UNHANDLED_EXCEPTION();
    2115             :             }
    2116             :         }
    2117           0 :         return sValue;
    2118             :     }
    2119             : }
    2120             : 
    2121             : 
    2122           0 : OUString DbCurrencyField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter, Color** /*ppColor*/)
    2123             : {
    2124           0 :     return lcl_setFormattedCurrency_nothrow( dynamic_cast< LongCurrencyField& >( *m_pPainter ), *this, _rxField, _rxFormatter );
    2125             : }
    2126             : 
    2127             : 
    2128           0 : void DbCurrencyField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter)
    2129             : {
    2130           0 :     lcl_setFormattedCurrency_nothrow( dynamic_cast< LongCurrencyField& >( *m_pWindow ), *this, _rxField, _rxFormatter );
    2131           0 : }
    2132             : 
    2133             : 
    2134           0 : void DbCurrencyField::updateFromModel( Reference< XPropertySet > _rxModel )
    2135             : {
    2136             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbCurrencyField::updateFromModel: invalid call!" );
    2137             : 
    2138           0 :     double dValue = 0;
    2139           0 :     if ( _rxModel->getPropertyValue( FM_PROP_VALUE ) >>= dValue )
    2140             :     {
    2141           0 :         if ( m_nScale )
    2142             :         {
    2143           0 :             dValue = ::rtl::math::pow10Exp( dValue, m_nScale );
    2144           0 :             dValue = ::rtl::math::round(dValue, 0);
    2145             :         }
    2146             : 
    2147           0 :         static_cast< LongCurrencyField* >( m_pWindow )->SetValue( dValue );
    2148             :     }
    2149             :     else
    2150           0 :         m_pWindow->SetText( OUString() );
    2151           0 : }
    2152             : 
    2153             : 
    2154           0 : bool DbCurrencyField::commitControl()
    2155             : {
    2156           0 :     OUString aText(m_pWindow->GetText());
    2157           0 :     Any aVal;
    2158           0 :     if (!aText.isEmpty())   // not empty
    2159             :     {
    2160           0 :         double fValue = static_cast<LongCurrencyField*>(m_pWindow)->GetValue();
    2161           0 :         if (m_nScale)
    2162             :         {
    2163           0 :             fValue /= ::rtl::math::pow10Exp(1.0, m_nScale);
    2164             :         }
    2165           0 :         aVal <<= (double)fValue;
    2166             :     }
    2167           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_VALUE, aVal);
    2168           0 :     return true;
    2169             : }
    2170             : 
    2171           0 : DbDateField::DbDateField( DbGridColumn& _rColumn )
    2172           0 :     :DbSpinField( _rColumn )
    2173             : {
    2174           0 :     doPropertyListening( FM_PROP_DATEFORMAT );
    2175           0 :     doPropertyListening( FM_PROP_DATEMIN );
    2176           0 :     doPropertyListening( FM_PROP_DATEMAX );
    2177           0 :     doPropertyListening( FM_PROP_STRICTFORMAT );
    2178           0 :     doPropertyListening( FM_PROP_DATE_SHOW_CENTURY );
    2179           0 : }
    2180             : 
    2181             : 
    2182           0 : SpinField* DbDateField::createField( vcl::Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& _rxModel  )
    2183             : {
    2184             :     // check if there is a DropDown property set to TRUE
    2185           0 :     bool bDropDown =    !hasProperty( FM_PROP_DROPDOWN, _rxModel )
    2186           0 :                         ||  getBOOL( _rxModel->getPropertyValue( FM_PROP_DROPDOWN ) );
    2187           0 :     if ( bDropDown )
    2188           0 :         _nFieldStyle |= WB_DROPDOWN;
    2189             : 
    2190           0 :     CalendarField* pField = new CalendarField( _pParent, _nFieldStyle );
    2191             : 
    2192           0 :     pField->EnableToday();
    2193           0 :     pField->EnableNone();
    2194             : 
    2195           0 :     return pField;
    2196             : }
    2197             : 
    2198             : 
    2199           0 : void DbDateField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    2200             : {
    2201             :     DBG_ASSERT( m_pWindow, "DbDateField::implAdjustGenericFieldSetting: not to be called without window!" );
    2202             :     DBG_ASSERT( _rxModel.is(), "DbDateField::implAdjustGenericFieldSetting: invalid model!" );
    2203           0 :     if ( m_pWindow && _rxModel.is() )
    2204             :     {
    2205           0 :         sal_Int16   nFormat     = getINT16( _rxModel->getPropertyValue( FM_PROP_DATEFORMAT ) );
    2206           0 :         util::Date  aMin;
    2207           0 :         OSL_VERIFY( _rxModel->getPropertyValue( FM_PROP_DATEMIN ) >>= aMin );
    2208           0 :         util::Date  aMax;
    2209           0 :         OSL_VERIFY( _rxModel->getPropertyValue( FM_PROP_DATEMAX ) >>= aMax );
    2210           0 :         bool    bStrict     = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
    2211             : 
    2212           0 :         Any  aCentury = _rxModel->getPropertyValue( FM_PROP_DATE_SHOW_CENTURY );
    2213           0 :         if ( aCentury.getValueType().getTypeClass() != TypeClass_VOID )
    2214             :         {
    2215           0 :             bool bShowDateCentury = getBOOL( aCentury );
    2216             : 
    2217           0 :             static_cast<DateField*>( m_pWindow )->SetShowDateCentury( bShowDateCentury );
    2218           0 :             static_cast<DateField*>( m_pPainter )->SetShowDateCentury( bShowDateCentury );
    2219             :         }
    2220             : 
    2221           0 :         static_cast< DateField* >( m_pWindow )->SetExtDateFormat( (ExtDateFieldFormat)nFormat );
    2222           0 :         static_cast< DateField* >( m_pWindow )->SetMin( aMin );
    2223           0 :         static_cast< DateField* >( m_pWindow )->SetMax( aMax );
    2224           0 :         static_cast< DateField* >( m_pWindow )->SetStrictFormat( bStrict );
    2225           0 :         static_cast< DateField* >( m_pWindow )->EnableEmptyFieldValue( true );
    2226             : 
    2227           0 :         static_cast< DateField* >( m_pPainter )->SetExtDateFormat( (ExtDateFieldFormat)nFormat );
    2228           0 :         static_cast< DateField* >( m_pPainter )->SetMin( aMin );
    2229           0 :         static_cast< DateField* >( m_pPainter )->SetMax( aMax );
    2230           0 :         static_cast< DateField* >( m_pPainter )->SetStrictFormat( bStrict );
    2231           0 :         static_cast< DateField* >( m_pPainter )->EnableEmptyFieldValue( true );
    2232             :     }
    2233           0 : }
    2234             : 
    2235             : namespace
    2236             : {
    2237             : 
    2238           0 :     static OUString lcl_setFormattedDate_nothrow( DateField& _rField, const Reference< XColumn >& _rxField )
    2239             :     {
    2240           0 :         OUString sDate;
    2241           0 :         if ( _rxField.is() )
    2242             :         {
    2243             :             try
    2244             :             {
    2245           0 :                 ::com::sun::star::util::Date aValue = _rxField->getDate();
    2246           0 :                 if ( _rxField->wasNull() )
    2247           0 :                     _rField.SetText( sDate );
    2248             :                 else
    2249             :                 {
    2250           0 :                     _rField.SetDate( ::Date( aValue.Day, aValue.Month, aValue.Year ) );
    2251           0 :                     sDate = _rField.GetText();
    2252             :                 }
    2253             :             }
    2254           0 :             catch( const Exception& )
    2255             :             {
    2256             :                 DBG_UNHANDLED_EXCEPTION();
    2257             :             }
    2258             :         }
    2259           0 :         return sDate;
    2260             :     }
    2261             : }
    2262             : 
    2263           0 : OUString DbDateField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
    2264             : {
    2265           0 :      return lcl_setFormattedDate_nothrow(dynamic_cast<DateField&>(*m_pPainter), _rxField);
    2266             : }
    2267             : 
    2268             : 
    2269           0 : void DbDateField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
    2270             : {
    2271           0 :     lcl_setFormattedDate_nothrow(dynamic_cast<DateField&>(*m_pWindow), _rxField);
    2272           0 : }
    2273             : 
    2274             : 
    2275           0 : void DbDateField::updateFromModel( Reference< XPropertySet > _rxModel )
    2276             : {
    2277             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbDateField::updateFromModel: invalid call!" );
    2278             : 
    2279           0 :     util::Date aDate;
    2280           0 :     if ( _rxModel->getPropertyValue( FM_PROP_DATE ) >>= aDate )
    2281           0 :         static_cast< DateField* >( m_pWindow )->SetDate( ::Date( aDate ) );
    2282             :     else
    2283           0 :         static_cast< DateField* >( m_pWindow )->SetText( OUString() );
    2284           0 : }
    2285             : 
    2286             : 
    2287           0 : bool DbDateField::commitControl()
    2288             : {
    2289           0 :     OUString aText(m_pWindow->GetText());
    2290           0 :     Any aVal;
    2291           0 :     if (!aText.isEmpty())
    2292           0 :         aVal <<= static_cast<DateField*>(m_pWindow)->GetDate().GetUNODate();
    2293             :     else
    2294           0 :         aVal.clear();
    2295             : 
    2296           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_DATE, aVal);
    2297           0 :     return true;
    2298             : }
    2299             : 
    2300           0 : DbTimeField::DbTimeField( DbGridColumn& _rColumn )
    2301           0 :     :DbSpinField( _rColumn, ::com::sun::star::awt::TextAlign::LEFT )
    2302             : {
    2303           0 :     doPropertyListening( FM_PROP_TIMEFORMAT );
    2304           0 :     doPropertyListening( FM_PROP_TIMEMIN );
    2305           0 :     doPropertyListening( FM_PROP_TIMEMAX );
    2306           0 :     doPropertyListening( FM_PROP_STRICTFORMAT );
    2307           0 : }
    2308             : 
    2309             : 
    2310           0 : SpinField* DbTimeField::createField( vcl::Window* _pParent, WinBits _nFieldStyle, const Reference< XPropertySet >& /*_rxModel*/ )
    2311             : {
    2312           0 :     return new TimeField( _pParent, _nFieldStyle );
    2313             : }
    2314             : 
    2315             : 
    2316           0 : void DbTimeField::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    2317             : {
    2318             :     DBG_ASSERT( m_pWindow, "DbTimeField::implAdjustGenericFieldSetting: not to be called without window!" );
    2319             :     DBG_ASSERT( _rxModel.is(), "DbTimeField::implAdjustGenericFieldSetting: invalid model!" );
    2320           0 :     if ( m_pWindow && _rxModel.is() )
    2321             :     {
    2322           0 :         sal_Int16   nFormat     = getINT16( _rxModel->getPropertyValue( FM_PROP_TIMEFORMAT ) );
    2323           0 :         util::Time  aMin;
    2324           0 :         OSL_VERIFY( _rxModel->getPropertyValue( FM_PROP_TIMEMIN ) >>= aMin );
    2325           0 :         util::Time  aMax;
    2326           0 :         OSL_VERIFY( _rxModel->getPropertyValue( FM_PROP_TIMEMAX ) >>= aMax );
    2327           0 :         bool    bStrict     = getBOOL( _rxModel->getPropertyValue( FM_PROP_STRICTFORMAT ) );
    2328             : 
    2329           0 :         static_cast< TimeField* >( m_pWindow )->SetExtFormat( (ExtTimeFieldFormat)nFormat );
    2330           0 :         static_cast< TimeField* >( m_pWindow )->SetMin( aMin );
    2331           0 :         static_cast< TimeField* >( m_pWindow )->SetMax( aMax );
    2332           0 :         static_cast< TimeField* >( m_pWindow )->SetStrictFormat( bStrict );
    2333           0 :         static_cast< TimeField* >( m_pWindow )->EnableEmptyFieldValue( true );
    2334             : 
    2335           0 :         static_cast< TimeField* >( m_pPainter )->SetExtFormat( (ExtTimeFieldFormat)nFormat );
    2336           0 :         static_cast< TimeField* >( m_pPainter )->SetMin( aMin );
    2337           0 :         static_cast< TimeField* >( m_pPainter )->SetMax( aMax );
    2338           0 :         static_cast< TimeField* >( m_pPainter )->SetStrictFormat( bStrict );
    2339           0 :         static_cast< TimeField* >( m_pPainter )->EnableEmptyFieldValue( true );
    2340             :     }
    2341           0 : }
    2342             : 
    2343             : namespace
    2344             : {
    2345             : 
    2346           0 :     static OUString lcl_setFormattedTime_nothrow( TimeField& _rField, const Reference< XColumn >& _rxField )
    2347             :     {
    2348           0 :         OUString sTime;
    2349           0 :         if ( _rxField.is() )
    2350             :         {
    2351             :             try
    2352             :             {
    2353           0 :                 ::com::sun::star::util::Time aValue = _rxField->getTime();
    2354           0 :                 if ( _rxField->wasNull() )
    2355           0 :                     _rField.SetText( sTime );
    2356             :                 else
    2357             :                 {
    2358           0 :                     _rField.SetTime( ::tools::Time( aValue.Hours, aValue.Minutes, aValue.Seconds, aValue.NanoSeconds ) );
    2359           0 :                     sTime = _rField.GetText();
    2360             :                 }
    2361             :             }
    2362           0 :             catch( const Exception& )
    2363             :             {
    2364             :                 DBG_UNHANDLED_EXCEPTION();
    2365             :             }
    2366             :         }
    2367           0 :         return sTime;
    2368             :     }
    2369             : }
    2370             : 
    2371           0 : OUString DbTimeField::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< ::com::sun::star::util::XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
    2372             : {
    2373           0 :     return lcl_setFormattedTime_nothrow( *static_cast< TimeField* >( m_pPainter ), _rxField );
    2374             : }
    2375             : 
    2376             : 
    2377           0 : void DbTimeField::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/)
    2378             : {
    2379           0 :     lcl_setFormattedTime_nothrow( *static_cast< TimeField* >( m_pWindow ), _rxField );
    2380           0 : }
    2381             : 
    2382             : 
    2383           0 : void DbTimeField::updateFromModel( Reference< XPropertySet > _rxModel )
    2384             : {
    2385             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbTimeField::updateFromModel: invalid call!" );
    2386             : 
    2387           0 :     util::Time aTime;
    2388           0 :     if ( _rxModel->getPropertyValue( FM_PROP_DATE ) >>= aTime )
    2389           0 :         static_cast< TimeField* >( m_pWindow )->SetTime( ::tools::Time( aTime ) );
    2390             :     else
    2391           0 :         static_cast< TimeField* >( m_pWindow )->SetText( OUString() );
    2392           0 : }
    2393             : 
    2394             : 
    2395           0 : bool DbTimeField::commitControl()
    2396             : {
    2397           0 :     OUString aText(m_pWindow->GetText());
    2398           0 :     Any aVal;
    2399           0 :     if (!aText.isEmpty())
    2400           0 :         aVal <<= static_cast<TimeField*>(m_pWindow)->GetTime().GetUNOTime();
    2401             :     else
    2402           0 :         aVal.clear();
    2403             : 
    2404           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_TIME, aVal);
    2405           0 :     return true;
    2406             : }
    2407             : 
    2408           0 : DbComboBox::DbComboBox(DbGridColumn& _rColumn)
    2409             :            :DbCellControl(_rColumn)
    2410           0 :            ,m_nKeyType(::com::sun::star::util::NumberFormat::UNDEFINED)
    2411             : {
    2412           0 :     setAlignedController( false );
    2413             : 
    2414           0 :     doPropertyListening( FM_PROP_STRINGITEMLIST );
    2415           0 :     doPropertyListening( FM_PROP_LINECOUNT );
    2416           0 : }
    2417             : 
    2418             : 
    2419           0 : void DbComboBox::_propertyChanged( const PropertyChangeEvent& _rEvent ) throw( RuntimeException )
    2420             : {
    2421           0 :     if ( _rEvent.PropertyName.equals( FM_PROP_STRINGITEMLIST ) )
    2422             :     {
    2423           0 :         SetList(_rEvent.NewValue);
    2424             :     }
    2425             :     else
    2426             :     {
    2427           0 :         DbCellControl::_propertyChanged( _rEvent ) ;
    2428             :     }
    2429           0 : }
    2430             : 
    2431             : 
    2432           0 : void DbComboBox::SetList(const Any& rItems)
    2433             : {
    2434           0 :     ComboBoxControl* pField = static_cast<ComboBoxControl*>(m_pWindow);
    2435           0 :     pField->Clear();
    2436             : 
    2437           0 :     ::comphelper::StringSequence aTest;
    2438           0 :     if (rItems >>= aTest)
    2439             :     {
    2440           0 :         const OUString* pStrings = aTest.getConstArray();
    2441           0 :         sal_Int32 nItems = aTest.getLength();
    2442           0 :         for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
    2443           0 :              pField->InsertEntry(*pStrings, LISTBOX_APPEND);
    2444             : 
    2445             :         // tell the grid control that this controller is invalid and has to be re-initialized
    2446           0 :         invalidatedController();
    2447           0 :     }
    2448           0 : }
    2449             : 
    2450             : 
    2451           0 : void DbComboBox::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    2452             : {
    2453             :     DBG_ASSERT( m_pWindow, "DbComboBox::implAdjustGenericFieldSetting: not to be called without window!" );
    2454             :     DBG_ASSERT( _rxModel.is(), "DbComboBox::implAdjustGenericFieldSetting: invalid model!" );
    2455           0 :     if ( m_pWindow && _rxModel.is() )
    2456             :     {
    2457           0 :         sal_Int16  nLines = getINT16( _rxModel->getPropertyValue( FM_PROP_LINECOUNT ) );
    2458           0 :         static_cast< ComboBoxControl* >( m_pWindow )->SetDropDownLineCount( nLines );
    2459             :     }
    2460           0 : }
    2461             : 
    2462             : 
    2463           0 : void DbComboBox::Init( vcl::Window& rParent, const Reference< XRowSet >& xCursor )
    2464             : {
    2465           0 :     m_rColumn.SetAlignmentFromModel(::com::sun::star::awt::TextAlign::LEFT);
    2466             : 
    2467           0 :     m_pWindow = new ComboBoxControl( &rParent );
    2468             : 
    2469             :     // selection von rechts nach links
    2470           0 :     AllSettings     aSettings = m_pWindow->GetSettings();
    2471           0 :     StyleSettings   aStyleSettings = aSettings.GetStyleSettings();
    2472             :     aStyleSettings.SetSelectionOptions(
    2473           0 :         aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
    2474           0 :     aSettings.SetStyleSettings(aStyleSettings);
    2475           0 :     m_pWindow->SetSettings(aSettings, true);
    2476             : 
    2477             :     // some initial properties
    2478           0 :     Reference< XPropertySet >   xModel(m_rColumn.getModel());
    2479           0 :     SetList( xModel->getPropertyValue( FM_PROP_STRINGITEMLIST ) );
    2480           0 :     implAdjustGenericFieldSetting( xModel );
    2481             : 
    2482           0 :     if (m_rColumn.GetParent().getNumberFormatter().is())
    2483           0 :         m_nKeyType  = comphelper::getNumberFormatType(m_rColumn.GetParent().getNumberFormatter()->getNumberFormatsSupplier()->getNumberFormats(), m_rColumn.GetKey());
    2484             : 
    2485           0 :     DbCellControl::Init( rParent, xCursor );
    2486           0 : }
    2487             : 
    2488             : 
    2489           0 : CellControllerRef DbComboBox::CreateController() const
    2490             : {
    2491           0 :     return new ComboBoxCellController(static_cast<ComboBoxControl*>(m_pWindow));
    2492             : }
    2493             : 
    2494             : 
    2495           0 : OUString DbComboBox::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter, Color** /*ppColor*/)
    2496             : {
    2497           0 :     OUString aString;
    2498           0 :     if (_rxField.is())
    2499             :         try
    2500             :         {
    2501           0 :             aString = getFormattedValue( _rxField, xFormatter, m_rColumn.GetParent().getNullDate(), m_rColumn.GetKey(), m_nKeyType );
    2502             :         }
    2503           0 :         catch( const Exception& )
    2504             :         {
    2505             :             DBG_UNHANDLED_EXCEPTION();
    2506             :         }
    2507           0 :     return aString;
    2508             : }
    2509             : 
    2510             : 
    2511           0 : void DbComboBox::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter)
    2512             : {
    2513           0 :     m_pWindow->SetText(GetFormatText(_rxField, xFormatter));
    2514           0 : }
    2515             : 
    2516             : 
    2517           0 : void DbComboBox::updateFromModel( Reference< XPropertySet > _rxModel )
    2518             : {
    2519             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbComboBox::updateFromModel: invalid call!" );
    2520             : 
    2521           0 :     OUString sText;
    2522           0 :     _rxModel->getPropertyValue( FM_PROP_TEXT ) >>= sText;
    2523             : 
    2524           0 :     static_cast< ComboBox* >( m_pWindow )->SetText( sText );
    2525           0 :     static_cast< ComboBox* >( m_pWindow )->SetSelection( Selection( SELECTION_MAX, SELECTION_MIN ) );
    2526           0 : }
    2527             : 
    2528             : 
    2529           0 : bool DbComboBox::commitControl()
    2530             : {
    2531           0 :     OUString aText( m_pWindow->GetText());
    2532           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_TEXT, makeAny(aText));
    2533           0 :     return true;
    2534             : }
    2535             : 
    2536             : 
    2537           0 : DbListBox::DbListBox(DbGridColumn& _rColumn)
    2538             :           :DbCellControl(_rColumn)
    2539           0 :           ,m_bBound(false)
    2540             : {
    2541           0 :     setAlignedController( false );
    2542             : 
    2543           0 :     doPropertyListening( FM_PROP_STRINGITEMLIST );
    2544           0 :     doPropertyListening( FM_PROP_LINECOUNT );
    2545           0 : }
    2546             : 
    2547             : 
    2548           0 : void DbListBox::_propertyChanged( const ::com::sun::star::beans::PropertyChangeEvent& _rEvent ) throw( RuntimeException )
    2549             : {
    2550           0 :     if ( _rEvent.PropertyName.equals( FM_PROP_STRINGITEMLIST ) )
    2551             :     {
    2552           0 :         SetList(_rEvent.NewValue);
    2553             :     }
    2554             :     else
    2555             :     {
    2556           0 :         DbCellControl::_propertyChanged( _rEvent ) ;
    2557             :     }
    2558           0 : }
    2559             : 
    2560             : 
    2561           0 : void DbListBox::SetList(const Any& rItems)
    2562             : {
    2563           0 :     ListBoxControl* pField = static_cast<ListBoxControl*>(m_pWindow);
    2564             : 
    2565           0 :     pField->Clear();
    2566           0 :     m_bBound = false;
    2567             : 
    2568           0 :     ::comphelper::StringSequence aTest;
    2569           0 :     if (rItems >>= aTest)
    2570             :     {
    2571           0 :         const OUString* pStrings = aTest.getConstArray();
    2572           0 :         sal_Int32 nItems = aTest.getLength();
    2573           0 :         if (nItems)
    2574             :         {
    2575           0 :             for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
    2576           0 :                  pField->InsertEntry(*pStrings, LISTBOX_APPEND);
    2577             : 
    2578           0 :             m_rColumn.getModel()->getPropertyValue(FM_PROP_VALUE_SEQ) >>= m_aValueList;
    2579           0 :             m_bBound = m_aValueList.getLength() > 0;
    2580             : 
    2581             :             // tell the grid control that this controller is invalid and has to be re-initialized
    2582           0 :             invalidatedController();
    2583             :         }
    2584           0 :     }
    2585           0 : }
    2586             : 
    2587             : 
    2588           0 : void DbListBox::Init( vcl::Window& rParent, const Reference< XRowSet >& xCursor)
    2589             : {
    2590           0 :     m_rColumn.SetAlignment(::com::sun::star::awt::TextAlign::LEFT);
    2591             : 
    2592           0 :     m_pWindow = new ListBoxControl( &rParent );
    2593             : 
    2594             :     // some initial properties
    2595           0 :     Reference< XPropertySet > xModel( m_rColumn.getModel() );
    2596           0 :     SetList( xModel->getPropertyValue( FM_PROP_STRINGITEMLIST ) );
    2597           0 :     implAdjustGenericFieldSetting( xModel );
    2598             : 
    2599           0 :     DbCellControl::Init( rParent, xCursor );
    2600           0 : }
    2601             : 
    2602             : 
    2603           0 : void DbListBox::implAdjustGenericFieldSetting( const Reference< XPropertySet >& _rxModel )
    2604             : {
    2605             :     DBG_ASSERT( m_pWindow, "DbListBox::implAdjustGenericFieldSetting: not to be called without window!" );
    2606             :     DBG_ASSERT( _rxModel.is(), "DbListBox::implAdjustGenericFieldSetting: invalid model!" );
    2607           0 :     if ( m_pWindow && _rxModel.is() )
    2608             :     {
    2609           0 :         sal_Int16  nLines   = getINT16( _rxModel->getPropertyValue( FM_PROP_LINECOUNT ) );
    2610           0 :         static_cast< ListBoxControl* >( m_pWindow )->SetDropDownLineCount( nLines );
    2611             :     }
    2612           0 : }
    2613             : 
    2614             : 
    2615           0 : CellControllerRef DbListBox::CreateController() const
    2616             : {
    2617           0 :     return new ListBoxCellController(static_cast<ListBoxControl*>(m_pWindow));
    2618             : }
    2619             : 
    2620             : 
    2621           0 : OUString DbListBox::GetFormatText(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
    2622             : {
    2623           0 :     OUString sText;
    2624           0 :     if ( _rxField.is() )
    2625             :     {
    2626             :         try
    2627             :         {
    2628           0 :             sText = _rxField->getString();
    2629           0 :             if ( m_bBound )
    2630             :             {
    2631           0 :                 Sequence< sal_Int16 > aPosSeq = ::comphelper::findValue( m_aValueList, sText, true );
    2632           0 :                 if ( aPosSeq.getLength() )
    2633           0 :                     sText = static_cast<ListBox*>(m_pWindow)->GetEntry(aPosSeq.getConstArray()[0]);
    2634             :                 else
    2635           0 :                     sText = "";
    2636             :             }
    2637             :         }
    2638           0 :         catch( const Exception& )
    2639             :         {
    2640             :             DBG_UNHANDLED_EXCEPTION();
    2641             :         }
    2642             :     }
    2643           0 :     return sText;
    2644             : }
    2645             : 
    2646             : 
    2647           0 : void DbListBox::UpdateFromField(const Reference< ::com::sun::star::sdb::XColumn >& _rxField, const Reference< XNumberFormatter >& xFormatter)
    2648             : {
    2649           0 :     OUString sFormattedText( GetFormatText( _rxField, xFormatter ) );
    2650           0 :     if (!sFormattedText.isEmpty())
    2651           0 :         static_cast< ListBox* >( m_pWindow )->SelectEntry( sFormattedText );
    2652             :     else
    2653           0 :         static_cast< ListBox* >( m_pWindow )->SetNoSelection();
    2654           0 : }
    2655             : 
    2656             : 
    2657           0 : void DbListBox::updateFromModel( Reference< XPropertySet > _rxModel )
    2658             : {
    2659             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbListBox::updateFromModel: invalid call!" );
    2660             : 
    2661           0 :     Sequence< sal_Int16 > aSelection;
    2662           0 :     _rxModel->getPropertyValue( FM_PROP_SELECT_SEQ );
    2663             : 
    2664           0 :     sal_Int16 nSelection = -1;
    2665           0 :     if ( aSelection.getLength() > 0 )
    2666           0 :         nSelection = aSelection[ 0 ];
    2667             : 
    2668           0 :     ListBox* pListBox = static_cast< ListBox* >( m_pWindow );
    2669             : 
    2670           0 :     if ( ( nSelection >= 0 ) && ( nSelection < pListBox->GetEntryCount() ) )
    2671           0 :         pListBox->SelectEntryPos( nSelection );
    2672             :     else
    2673           0 :         pListBox->SetNoSelection( );
    2674           0 : }
    2675             : 
    2676             : 
    2677           0 : bool DbListBox::commitControl()
    2678             : {
    2679           0 :     Any aVal;
    2680           0 :     Sequence<sal_Int16> aSelectSeq;
    2681           0 :     if (static_cast<ListBox*>(m_pWindow)->GetSelectEntryCount())
    2682             :     {
    2683           0 :         aSelectSeq.realloc(1);
    2684           0 :         *(sal_Int16 *)aSelectSeq.getArray() = (sal_Int16)static_cast<ListBox*>(m_pWindow)->GetSelectEntryPos();
    2685             :     }
    2686           0 :     aVal <<= aSelectSeq;
    2687           0 :     m_rColumn.getModel()->setPropertyValue(FM_PROP_SELECT_SEQ, aVal);
    2688           0 :     return true;
    2689             : }
    2690             : 
    2691           0 : DbFilterField::DbFilterField(const Reference< XComponentContext >& rxContext,DbGridColumn& _rColumn)
    2692             :               :DbCellControl(_rColumn)
    2693             :               ,OSQLParserClient(rxContext)
    2694             :               ,m_nControlClass(::com::sun::star::form::FormComponentType::TEXTFIELD)
    2695             :               ,m_bFilterList(false)
    2696             :               ,m_bFilterListFilled(false)
    2697           0 :               ,m_bBound(false)
    2698             : {
    2699             : 
    2700           0 :     setAlignedController( false );
    2701           0 : }
    2702             : 
    2703             : 
    2704           0 : DbFilterField::~DbFilterField()
    2705             : {
    2706           0 :     if (m_nControlClass == ::com::sun::star::form::FormComponentType::CHECKBOX)
    2707           0 :         static_cast<CheckBoxControl*>(m_pWindow)->SetClickHdl( Link() );
    2708             : 
    2709           0 : }
    2710             : 
    2711             : 
    2712           0 : void DbFilterField::PaintCell(OutputDevice& rDev, const Rectangle& rRect)
    2713             : {
    2714             :     static sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_VCENTER | TEXT_DRAW_LEFT;
    2715           0 :     switch (m_nControlClass)
    2716             :     {
    2717             :         case FormComponentType::CHECKBOX:
    2718           0 :             DbCellControl::PaintCell( rDev, rRect );
    2719           0 :             break;
    2720             :         case FormComponentType::LISTBOX:
    2721           0 :             rDev.DrawText(rRect, static_cast<ListBox*>(m_pWindow)->GetSelectEntry(), nStyle);
    2722           0 :             break;
    2723             :         default:
    2724           0 :             rDev.DrawText(rRect, m_aText, nStyle);
    2725             :     }
    2726           0 : }
    2727             : 
    2728             : 
    2729           0 : void DbFilterField::SetList(const Any& rItems, bool bComboBox)
    2730             : {
    2731           0 :     ::comphelper::StringSequence aTest;
    2732           0 :     rItems >>= aTest;
    2733           0 :     const OUString* pStrings = aTest.getConstArray();
    2734           0 :     sal_Int32 nItems = aTest.getLength();
    2735           0 :     if (nItems)
    2736             :     {
    2737           0 :         if (bComboBox)
    2738             :         {
    2739           0 :             ComboBox* pField = static_cast<ComboBox*>(m_pWindow);
    2740           0 :             for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
    2741           0 :                 pField->InsertEntry(*pStrings, LISTBOX_APPEND);
    2742             :         }
    2743             :         else
    2744             :         {
    2745           0 :             ListBox* pField = static_cast<ListBox*>(m_pWindow);
    2746           0 :             for (sal_Int32 i = 0; i < nItems; ++i, ++pStrings )
    2747           0 :                 pField->InsertEntry(*pStrings, LISTBOX_APPEND);
    2748             : 
    2749           0 :             m_rColumn.getModel()->getPropertyValue(FM_PROP_VALUE_SEQ) >>= m_aValueList;
    2750           0 :             m_bBound = m_aValueList.getLength() > 0;
    2751             :         }
    2752           0 :     }
    2753           0 : }
    2754             : 
    2755             : 
    2756           0 : void DbFilterField::CreateControl(vcl::Window* pParent, const Reference< ::com::sun::star::beans::XPropertySet >& xModel)
    2757             : {
    2758           0 :     switch (m_nControlClass)
    2759             :     {
    2760             :         case ::com::sun::star::form::FormComponentType::CHECKBOX:
    2761           0 :             m_pWindow = new CheckBoxControl(pParent);
    2762           0 :             m_pWindow->SetPaintTransparent( true );
    2763           0 :             static_cast<CheckBoxControl*>(m_pWindow)->SetClickHdl( LINK( this, DbFilterField, OnClick ) );
    2764             : 
    2765           0 :             m_pPainter = new CheckBoxControl(pParent);
    2766           0 :             m_pPainter->SetPaintTransparent( true );
    2767           0 :             m_pPainter->SetBackground();
    2768           0 :             break;
    2769             :         case ::com::sun::star::form::FormComponentType::LISTBOX:
    2770             :         {
    2771           0 :             m_pWindow = new ListBoxControl(pParent);
    2772           0 :             sal_Int16  nLines       = ::comphelper::getINT16(xModel->getPropertyValue(FM_PROP_LINECOUNT));
    2773           0 :             Any  aItems      = xModel->getPropertyValue(FM_PROP_STRINGITEMLIST);
    2774           0 :             SetList(aItems, m_nControlClass == ::com::sun::star::form::FormComponentType::COMBOBOX);
    2775           0 :             static_cast<ListBox*>(m_pWindow)->SetDropDownLineCount(nLines);
    2776           0 :         }   break;
    2777             :         case ::com::sun::star::form::FormComponentType::COMBOBOX:
    2778             :         {
    2779           0 :             m_pWindow = new ComboBoxControl(pParent);
    2780             : 
    2781           0 :             AllSettings     aSettings = m_pWindow->GetSettings();
    2782           0 :             StyleSettings   aStyleSettings = aSettings.GetStyleSettings();
    2783             :             aStyleSettings.SetSelectionOptions(
    2784           0 :                            aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
    2785           0 :             aSettings.SetStyleSettings(aStyleSettings);
    2786           0 :             m_pWindow->SetSettings(aSettings, true);
    2787             : 
    2788           0 :             if (!m_bFilterList)
    2789             :             {
    2790           0 :                 sal_Int16  nLines       = ::comphelper::getINT16(xModel->getPropertyValue(FM_PROP_LINECOUNT));
    2791           0 :                 Any  aItems      = xModel->getPropertyValue(FM_PROP_STRINGITEMLIST);
    2792           0 :                 SetList(aItems, m_nControlClass == ::com::sun::star::form::FormComponentType::COMBOBOX);
    2793           0 :                 static_cast<ComboBox*>(m_pWindow)->SetDropDownLineCount(nLines);
    2794             :             }
    2795             :             else
    2796           0 :                 static_cast<ComboBox*>(m_pWindow)->SetDropDownLineCount(5);
    2797             : 
    2798           0 :         }   break;
    2799             :         default:
    2800             :         {
    2801           0 :             m_pWindow  = new Edit(pParent, WB_LEFT);
    2802           0 :             AllSettings     aSettings = m_pWindow->GetSettings();
    2803           0 :             StyleSettings   aStyleSettings = aSettings.GetStyleSettings();
    2804             :             aStyleSettings.SetSelectionOptions(
    2805           0 :                            aStyleSettings.GetSelectionOptions() | SELECTION_OPTION_SHOWFIRST);
    2806           0 :             aSettings.SetStyleSettings(aStyleSettings);
    2807           0 :             m_pWindow->SetSettings(aSettings, true);
    2808             :         }
    2809             :     }
    2810           0 : }
    2811             : 
    2812             : 
    2813           0 : void DbFilterField::Init( vcl::Window& rParent, const Reference< XRowSet >& xCursor )
    2814             : {
    2815           0 :     Reference< ::com::sun::star::beans::XPropertySet >  xModel(m_rColumn.getModel());
    2816           0 :     m_rColumn.SetAlignment(::com::sun::star::awt::TextAlign::LEFT);
    2817             : 
    2818           0 :     if (xModel.is())
    2819             :     {
    2820           0 :         m_bFilterList = ::comphelper::hasProperty(FM_PROP_FILTERPROPOSAL, xModel) && ::comphelper::getBOOL(xModel->getPropertyValue(FM_PROP_FILTERPROPOSAL));
    2821           0 :         if (m_bFilterList)
    2822           0 :             m_nControlClass = ::com::sun::star::form::FormComponentType::COMBOBOX;
    2823             :         else
    2824             :         {
    2825           0 :             sal_Int16 nClassId = ::comphelper::getINT16(xModel->getPropertyValue(FM_PROP_CLASSID));
    2826           0 :             switch (nClassId)
    2827             :             {
    2828             :                 case FormComponentType::CHECKBOX:
    2829             :                 case FormComponentType::LISTBOX:
    2830             :                 case FormComponentType::COMBOBOX:
    2831           0 :                     m_nControlClass = nClassId;
    2832           0 :                     break;
    2833             :                 default:
    2834           0 :                     if (m_bFilterList)
    2835           0 :                         m_nControlClass = FormComponentType::COMBOBOX;
    2836             :                     else
    2837           0 :                         m_nControlClass = FormComponentType::TEXTFIELD;
    2838             :             }
    2839             :         }
    2840             :     }
    2841             : 
    2842           0 :     CreateControl( &rParent, xModel );
    2843           0 :     DbCellControl::Init( rParent, xCursor );
    2844             : 
    2845             :     // filter cells are never readonly
    2846           0 :     Edit* pAsEdit = dynamic_cast< Edit* >( m_pWindow );
    2847           0 :     if ( pAsEdit )
    2848           0 :         pAsEdit->SetReadOnly( false );
    2849           0 : }
    2850             : 
    2851             : 
    2852           0 : CellControllerRef DbFilterField::CreateController() const
    2853             : {
    2854           0 :     CellControllerRef xController;
    2855           0 :     switch (m_nControlClass)
    2856             :     {
    2857             :         case ::com::sun::star::form::FormComponentType::CHECKBOX:
    2858           0 :             xController = new CheckBoxCellController(static_cast<CheckBoxControl*>(m_pWindow));
    2859           0 :             break;
    2860             :         case ::com::sun::star::form::FormComponentType::LISTBOX:
    2861           0 :             xController = new ListBoxCellController(static_cast<ListBoxControl*>(m_pWindow));
    2862           0 :             break;
    2863             :         case ::com::sun::star::form::FormComponentType::COMBOBOX:
    2864           0 :             xController = new ComboBoxCellController(static_cast<ComboBoxControl*>(m_pWindow));
    2865           0 :             break;
    2866             :         default:
    2867           0 :             if (m_bFilterList)
    2868           0 :                 xController = new ComboBoxCellController(static_cast<ComboBoxControl*>(m_pWindow));
    2869             :             else
    2870           0 :                 xController = new EditCellController(static_cast<Edit*>(m_pWindow));
    2871             :     }
    2872           0 :     return xController;
    2873             : }
    2874             : 
    2875             : 
    2876           0 : void DbFilterField::updateFromModel( Reference< XPropertySet > _rxModel )
    2877             : {
    2878             :     OSL_ENSURE( _rxModel.is() && m_pWindow, "DbFilterField::updateFromModel: invalid call!" );
    2879             :     (void)_rxModel;
    2880             : 
    2881             :     OSL_FAIL( "DbListBox::updateFromModel: not implemented yet (how the hell did you reach this?)!" );
    2882             :     // TODO: implement this.
    2883             :     // remember: updateFromModel should be some kind of opposite of commitControl
    2884           0 : }
    2885             : 
    2886             : 
    2887           0 : bool DbFilterField::commitControl()
    2888             : {
    2889           0 :     OUString aText(m_aText);
    2890           0 :     switch (m_nControlClass)
    2891             :     {
    2892             :         case ::com::sun::star::form::FormComponentType::CHECKBOX:
    2893           0 :             return true;
    2894             :         case ::com::sun::star::form::FormComponentType::LISTBOX:
    2895           0 :             aText = OUString();
    2896           0 :             if (static_cast<ListBox*>(m_pWindow)->GetSelectEntryCount())
    2897             :             {
    2898           0 :                 sal_Int16 nPos = (sal_Int16)static_cast<ListBox*>(m_pWindow)->GetSelectEntryPos();
    2899           0 :                 if ( ( nPos >= 0 ) && ( nPos < m_aValueList.getLength() ) )
    2900           0 :                     aText = m_aValueList.getConstArray()[nPos];
    2901             :             }
    2902             : 
    2903           0 :             if (m_aText != aText)
    2904             :             {
    2905           0 :                 m_aText = aText;
    2906           0 :                 m_aCommitLink.Call(this);
    2907             :             }
    2908           0 :             return true;
    2909             :         default:
    2910           0 :             aText = m_pWindow->GetText();
    2911             :     }
    2912             : 
    2913           0 :     if (m_aText != aText)
    2914             :     {
    2915             :         // check the text with the SQL-Parser
    2916           0 :         OUString aNewText(comphelper::string::stripEnd(aText, ' '));
    2917           0 :         if (!aNewText.isEmpty())
    2918             :         {
    2919           0 :             OUString aErrorMsg;
    2920           0 :             Reference< XNumberFormatter >  xNumberFormatter(m_rColumn.GetParent().getNumberFormatter());
    2921             : 
    2922           0 :             ::rtl::Reference< ISQLParseNode > xParseNode = predicateTree(aErrorMsg, aNewText,xNumberFormatter, m_rColumn.GetField());
    2923           0 :             if (xParseNode.is())
    2924             :             {
    2925           0 :                 OUString aPreparedText;
    2926             : 
    2927           0 :                 ::com::sun::star::lang::Locale aAppLocale = Application::GetSettings().GetUILanguageTag().getLocale();
    2928             : 
    2929             :                 Reference< XRowSet > xDataSourceRowSet(
    2930           0 :                     Reference< XInterface >(*m_rColumn.GetParent().getDataSource()), UNO_QUERY);
    2931           0 :                 Reference< XConnection >  xConnection(getConnection(xDataSourceRowSet));
    2932             : 
    2933           0 :                 xParseNode->parseNodeToPredicateStr(aPreparedText,
    2934             :                                                     xConnection,
    2935             :                                                     xNumberFormatter,
    2936           0 :                                                     m_rColumn.GetField(),
    2937             :                                                     OUString(),
    2938             :                                                     aAppLocale,
    2939             :                                                     '.',
    2940           0 :                                                     getParseContext());
    2941           0 :                 m_aText = aPreparedText;
    2942             :             }
    2943             :             else
    2944             :             {
    2945             : 
    2946           0 :                 SQLException aError;
    2947           0 :                 aError.Message = aErrorMsg;
    2948           0 :                 displayException(aError, m_pWindow->GetParent());
    2949             :                     // TODO: transport the title
    2950             : 
    2951           0 :                 return false;
    2952           0 :             }
    2953             :         }
    2954             :         else
    2955           0 :             m_aText = aText;
    2956             : 
    2957           0 :         m_pWindow->SetText(m_aText);
    2958           0 :         m_aCommitLink.Call(this);
    2959             :     }
    2960           0 :     return true;
    2961             : }
    2962             : 
    2963             : 
    2964           0 : void DbFilterField::SetText(const OUString& rText)
    2965             : {
    2966           0 :     m_aText = rText;
    2967           0 :     switch (m_nControlClass)
    2968             :     {
    2969             :         case ::com::sun::star::form::FormComponentType::CHECKBOX:
    2970             :         {
    2971             :             TriState eState;
    2972           0 :             if (rText == "1")
    2973           0 :                 eState = TRISTATE_TRUE;
    2974           0 :             else if (rText == "0")
    2975           0 :                 eState = TRISTATE_FALSE;
    2976             :             else
    2977           0 :                 eState = TRISTATE_INDET;
    2978             : 
    2979           0 :             static_cast<CheckBoxControl*>(m_pWindow)->GetBox().SetState(eState);
    2980           0 :             static_cast<CheckBoxControl*>(m_pPainter)->GetBox().SetState(eState);
    2981           0 :         }   break;
    2982             :         case ::com::sun::star::form::FormComponentType::LISTBOX:
    2983             :         {
    2984           0 :             Sequence<sal_Int16> aPosSeq = ::comphelper::findValue(m_aValueList, m_aText, true);
    2985           0 :             if (aPosSeq.getLength())
    2986           0 :                 static_cast<ListBox*>(m_pWindow)->SelectEntryPos(aPosSeq.getConstArray()[0], true);
    2987             :             else
    2988           0 :                 static_cast<ListBox*>(m_pWindow)->SetNoSelection();
    2989           0 :         }   break;
    2990             :         default:
    2991           0 :             m_pWindow->SetText(m_aText);
    2992             :     }
    2993             : 
    2994             :     // now force a repaint on the window
    2995           0 :     m_rColumn.GetParent().RowModified(0,m_rColumn.GetId());
    2996           0 : }
    2997             : 
    2998             : 
    2999           0 : void DbFilterField::Update()
    3000             : {
    3001             :     // should we fill the combobox with a filter proposal?
    3002           0 :     if (m_bFilterList && !m_bFilterListFilled)
    3003             :     {
    3004           0 :         m_bFilterListFilled = true;
    3005           0 :         Reference< ::com::sun::star::beans::XPropertySet >  xField = m_rColumn.GetField();
    3006           0 :         if (!xField.is())
    3007           0 :             return;
    3008             : 
    3009           0 :         OUString aName;
    3010           0 :         xField->getPropertyValue(FM_PROP_NAME) >>= aName;
    3011             : 
    3012             :         // the columnmodel
    3013           0 :         Reference< ::com::sun::star::container::XChild >  xModelAsChild(m_rColumn.getModel(), UNO_QUERY);
    3014             :         // the grid model
    3015           0 :         xModelAsChild = Reference< ::com::sun::star::container::XChild > (xModelAsChild->getParent(),UNO_QUERY);
    3016           0 :         Reference< XRowSet >  xForm(xModelAsChild->getParent(), UNO_QUERY);
    3017           0 :         if (!xForm.is())
    3018           0 :             return;
    3019             : 
    3020           0 :         Reference<XPropertySet> xFormProp(xForm,UNO_QUERY);
    3021           0 :         Reference< XTablesSupplier > xSupTab;
    3022           0 :         xFormProp->getPropertyValue("SingleSelectQueryComposer") >>= xSupTab;
    3023             : 
    3024           0 :         Reference< XConnection >  xConnection(getConnection(xForm));
    3025           0 :         if (!xSupTab.is())
    3026           0 :             return;
    3027             : 
    3028             :         // search the field
    3029           0 :         Reference< XColumnsSupplier > xSupCol(xSupTab,UNO_QUERY);
    3030           0 :         Reference< ::com::sun::star::container::XNameAccess >    xFieldNames = xSupCol->getColumns();
    3031           0 :         if (!xFieldNames->hasByName(aName))
    3032           0 :             return;
    3033             : 
    3034           0 :         Reference< ::com::sun::star::container::XNameAccess >    xTablesNames = xSupTab->getTables();
    3035           0 :         Reference< ::com::sun::star::beans::XPropertySet >       xComposerFieldAsSet(xFieldNames->getByName(aName),UNO_QUERY);
    3036             : 
    3037           0 :         if (xComposerFieldAsSet.is() && ::comphelper::hasProperty(FM_PROP_TABLENAME, xComposerFieldAsSet) &&
    3038           0 :             ::comphelper::hasProperty(FM_PROP_FIELDSOURCE, xComposerFieldAsSet))
    3039             :         {
    3040           0 :             OUString aFieldName;
    3041           0 :             OUString aTableName;
    3042           0 :             xComposerFieldAsSet->getPropertyValue(FM_PROP_FIELDSOURCE)  >>= aFieldName;
    3043           0 :             xComposerFieldAsSet->getPropertyValue(FM_PROP_TABLENAME)    >>= aTableName;
    3044             : 
    3045             :             // no possibility to create a select statement
    3046             :             // looking for the complete table name
    3047           0 :             if (!xTablesNames->hasByName(aTableName))
    3048           0 :                 return;
    3049             : 
    3050             :             // ein Statement aufbauen und abschicken als query
    3051             :             // Access to the connection
    3052           0 :             Reference< XStatement >  xStatement;
    3053           0 :             Reference< XResultSet >  xListCursor;
    3054           0 :             Reference< ::com::sun::star::sdb::XColumn >  xDataField;
    3055             : 
    3056             :             try
    3057             :             {
    3058           0 :                 Reference< XDatabaseMetaData >  xMeta = xConnection->getMetaData();
    3059             : 
    3060           0 :                 OUString aQuote(xMeta->getIdentifierQuoteString());
    3061           0 :                 OUStringBuffer aStatement("SELECT DISTINCT ");
    3062           0 :                 aStatement.append(quoteName(aQuote, aName));
    3063           0 :                 if (!aFieldName.isEmpty() && aName != aFieldName)
    3064             :                 {
    3065           0 :                     aStatement.append(" AS ");
    3066           0 :                     aStatement.append(quoteName(aQuote, aFieldName));
    3067             :                 }
    3068             : 
    3069           0 :                 aStatement.append(" FROM ");
    3070             : 
    3071           0 :                 Reference< XPropertySet > xTableNameAccess(xTablesNames->getByName(aTableName), UNO_QUERY_THROW);
    3072           0 :                 aStatement.append(composeTableNameForSelect(xConnection, xTableNameAccess));
    3073             : 
    3074           0 :                 xStatement = xConnection->createStatement();
    3075           0 :                 Reference< ::com::sun::star::beans::XPropertySet >  xStatementProps(xStatement, UNO_QUERY);
    3076           0 :                 xStatementProps->setPropertyValue(FM_PROP_ESCAPE_PROCESSING, makeAny(true));
    3077             : 
    3078           0 :                 xListCursor = xStatement->executeQuery(aStatement.makeStringAndClear());
    3079             : 
    3080           0 :                 Reference< ::com::sun::star::sdbcx::XColumnsSupplier >  xSupplyCols(xListCursor, UNO_QUERY);
    3081           0 :                 Reference< ::com::sun::star::container::XIndexAccess >  xFields(xSupplyCols->getColumns(), UNO_QUERY);
    3082           0 :                 xDataField.set(xFields->getByIndex(0), css::uno::UNO_QUERY);
    3083           0 :                 if (!xDataField.is())
    3084           0 :                     return;
    3085             :             }
    3086           0 :             catch(const Exception&)
    3087             :             {
    3088           0 :                 ::comphelper::disposeComponent(xStatement);
    3089           0 :                 return;
    3090             :             }
    3091             : 
    3092           0 :             sal_Int16 i = 0;
    3093           0 :             ::std::vector< OUString >   aStringList;
    3094           0 :             aStringList.reserve(16);
    3095           0 :             OUString aStr;
    3096           0 :             com::sun::star::util::Date aNullDate = m_rColumn.GetParent().getNullDate();
    3097           0 :             sal_Int32 nFormatKey = m_rColumn.GetKey();
    3098           0 :             Reference< XNumberFormatter >  xFormatter = m_rColumn.GetParent().getNumberFormatter();
    3099           0 :             sal_Int16 nKeyType = ::comphelper::getNumberFormatType(xFormatter->getNumberFormatsSupplier()->getNumberFormats(), nFormatKey);
    3100             : 
    3101           0 :             while (!xListCursor->isAfterLast() && i++ < SHRT_MAX) // max anzahl eintraege
    3102             :             {
    3103           0 :                 aStr = getFormattedValue(xDataField, xFormatter, aNullDate, nFormatKey, nKeyType);
    3104           0 :                 aStringList.push_back(aStr);
    3105           0 :                 (void)xListCursor->next();
    3106             :             }
    3107             : 
    3108             :             // filling the entries for the combobox
    3109           0 :             for (::std::vector< OUString >::const_iterator iter = aStringList.begin();
    3110           0 :                  iter != aStringList.end(); ++iter)
    3111           0 :                 static_cast<ComboBox*>(m_pWindow)->InsertEntry(*iter, LISTBOX_APPEND);
    3112           0 :         }
    3113             :     }
    3114             : }
    3115             : 
    3116             : 
    3117           0 : OUString DbFilterField::GetFormatText(const Reference< XColumn >& /*_rxField*/, const Reference< XNumberFormatter >& /*xFormatter*/, Color** /*ppColor*/)
    3118             : {
    3119           0 :     return OUString();
    3120             : }
    3121             : 
    3122             : 
    3123           0 : void DbFilterField::UpdateFromField(const Reference< XColumn >& /*_rxField*/, const Reference< XNumberFormatter >& /*xFormatter*/)
    3124             : {
    3125             :     OSL_FAIL( "DbFilterField::UpdateFromField: cannot update a filter control from a field!" );
    3126           0 : }
    3127             : 
    3128             : 
    3129           0 : IMPL_LINK_NOARG(DbFilterField, OnClick)
    3130             : {
    3131           0 :     TriState eState = static_cast<CheckBoxControl*>(m_pWindow)->GetBox().GetState();
    3132           0 :     OUString aText;
    3133             : 
    3134           0 :     switch (eState)
    3135             :     {
    3136             :         case TRISTATE_TRUE:
    3137           0 :             aText = "1";
    3138           0 :             break;
    3139             :         case TRISTATE_FALSE:
    3140           0 :             aText = "0";
    3141           0 :             break;
    3142             :         case TRISTATE_INDET:
    3143           0 :             break;
    3144             :     }
    3145             : 
    3146           0 :     if (m_aText != aText)
    3147             :     {
    3148           0 :         m_aText = aText;
    3149           0 :         m_aCommitLink.Call(this);
    3150             :     }
    3151           0 :     return 1;
    3152             : }
    3153             : 
    3154           4 : TYPEINIT0(FmXGridCell);
    3155             : 
    3156             : 
    3157             : 
    3158          62 : FmXGridCell::FmXGridCell( DbGridColumn* pColumn, DbCellControl* _pControl )
    3159             :             :OComponentHelper(m_aMutex)
    3160             :             ,m_pColumn(pColumn)
    3161             :             ,m_pCellControl( _pControl )
    3162             :             ,m_aWindowListeners( m_aMutex )
    3163             :             ,m_aFocusListeners( m_aMutex )
    3164             :             ,m_aKeyListeners( m_aMutex )
    3165             :             ,m_aMouseListeners( m_aMutex )
    3166          62 :             ,m_aMouseMotionListeners( m_aMutex )
    3167             : {
    3168          62 : }
    3169             : 
    3170             : 
    3171          62 : void FmXGridCell::init()
    3172             : {
    3173          62 :     vcl::Window* pEventWindow( getEventWindow() );
    3174          62 :     if ( pEventWindow )
    3175          62 :         pEventWindow->AddEventListener( LINK( this, FmXGridCell, OnWindowEvent ) );
    3176          62 : }
    3177             : 
    3178             : 
    3179          62 : vcl::Window* FmXGridCell::getEventWindow() const
    3180             : {
    3181          62 :     if ( m_pCellControl )
    3182          62 :         return &m_pCellControl->GetWindow();
    3183           0 :     return NULL;
    3184             : }
    3185             : 
    3186             : 
    3187         124 : FmXGridCell::~FmXGridCell()
    3188             : {
    3189          62 :     if (!OComponentHelper::rBHelper.bDisposed)
    3190             :     {
    3191           0 :         acquire();
    3192           0 :         dispose();
    3193             :     }
    3194             : 
    3195          62 : }
    3196             : 
    3197             : 
    3198           0 : void FmXGridCell::SetTextLineColor()
    3199             : {
    3200           0 :     if (m_pCellControl)
    3201           0 :         m_pCellControl->SetTextLineColor();
    3202           0 : }
    3203             : 
    3204             : 
    3205           0 : void FmXGridCell::SetTextLineColor(const Color& _rColor)
    3206             : {
    3207           0 :     if (m_pCellControl)
    3208           0 :         m_pCellControl->SetTextLineColor(_rColor);
    3209           0 : }
    3210             : 
    3211             : // XTypeProvider
    3212             : 
    3213           0 : Sequence< Type > SAL_CALL FmXGridCell::getTypes( ) throw (RuntimeException, std::exception)
    3214             : {
    3215             :     Sequence< uno::Type > aTypes = ::comphelper::concatSequences(
    3216             :         ::cppu::OComponentHelper::getTypes(),
    3217             :         FmXGridCell_Base::getTypes()
    3218           0 :     );
    3219           0 :     if ( m_pCellControl )
    3220           0 :         aTypes = ::comphelper::concatSequences(
    3221             :             aTypes,
    3222             :             FmXGridCell_WindowBase::getTypes()
    3223           0 :         );
    3224           0 :     return aTypes;
    3225             : }
    3226             : 
    3227             : 
    3228           0 : IMPLEMENT_GET_IMPLEMENTATION_ID( FmXGridCell )
    3229             : 
    3230             : // OComponentHelper
    3231             : 
    3232          62 : void FmXGridCell::disposing()
    3233             : {
    3234          62 :     lang::EventObject aEvent( *this );
    3235          62 :     m_aWindowListeners.disposeAndClear( aEvent );
    3236          62 :     m_aFocusListeners.disposeAndClear( aEvent );
    3237          62 :     m_aKeyListeners.disposeAndClear( aEvent );
    3238          62 :     m_aMouseListeners.disposeAndClear( aEvent );
    3239          62 :     m_aMouseMotionListeners.disposeAndClear( aEvent );
    3240             : 
    3241          62 :     OComponentHelper::disposing();
    3242          62 :     m_pColumn = NULL;
    3243          62 :     DELETEZ(m_pCellControl);
    3244          62 : }
    3245             : 
    3246             : 
    3247         248 : Any SAL_CALL FmXGridCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException, std::exception)
    3248             : {
    3249         248 :     Any aReturn = OComponentHelper::queryAggregation( _rType );
    3250             : 
    3251         248 :     if ( !aReturn.hasValue() )
    3252           0 :         aReturn = FmXGridCell_Base::queryInterface( _rType );
    3253             : 
    3254         248 :     if ( !aReturn.hasValue() && ( m_pCellControl != NULL ) )
    3255           0 :         aReturn = FmXGridCell_WindowBase::queryInterface( _rType );
    3256             : 
    3257         248 :     return aReturn;
    3258             : }
    3259             : 
    3260             : // ::com::sun::star::awt::XControl
    3261             : 
    3262           0 : Reference< XInterface >  FmXGridCell::getContext() throw( RuntimeException, std::exception )
    3263             : {
    3264           0 :     return Reference< XInterface > ();
    3265             : }
    3266             : 
    3267             : 
    3268           0 : Reference< ::com::sun::star::awt::XControlModel >  FmXGridCell::getModel() throw( ::com::sun::star::uno::RuntimeException, std::exception )
    3269             : {
    3270           0 :     return Reference< ::com::sun::star::awt::XControlModel > (m_pColumn->getModel(), UNO_QUERY);
    3271             : }
    3272             : 
    3273             : // ::com::sun::star::form::XBoundControl
    3274             : 
    3275           0 : sal_Bool FmXGridCell::getLock() throw( RuntimeException, std::exception )
    3276             : {
    3277           0 :     return m_pColumn->isLocked();
    3278             : }
    3279             : 
    3280             : 
    3281           0 : void FmXGridCell::setLock(sal_Bool _bLock) throw( RuntimeException, std::exception )
    3282             : {
    3283           0 :     if (getLock() == _bLock)
    3284           0 :         return;
    3285             :     else
    3286             :     {
    3287           0 :         ::osl::MutexGuard aGuard(m_aMutex);
    3288           0 :         m_pColumn->setLock(_bLock);
    3289             :     }
    3290             : }
    3291             : 
    3292             : 
    3293           0 : void SAL_CALL FmXGridCell::setPosSize( ::sal_Int32 _XX, ::sal_Int32 _Y, ::sal_Int32 _Width, ::sal_Int32 _Height, ::sal_Int16 _Flags ) throw (RuntimeException, std::exception)
    3294             : {
    3295             :     OSL_FAIL( "FmXGridCell::setPosSize: not implemented" );
    3296             :     (void)_XX;
    3297             :     (void)_Y;
    3298             :     (void)_Width;
    3299             :     (void)_Height;
    3300             :     (void)_Flags;
    3301             :     // not allowed to tamper with this for a grid cell
    3302           0 : }
    3303             : 
    3304             : 
    3305           0 : awt::Rectangle SAL_CALL FmXGridCell::getPosSize(  ) throw (RuntimeException, std::exception)
    3306             : {
    3307             :     OSL_FAIL( "FmXGridCell::getPosSize: not implemented" );
    3308           0 :     return awt::Rectangle();
    3309             : }
    3310             : 
    3311             : 
    3312           0 : void SAL_CALL FmXGridCell::setVisible( sal_Bool _Visible ) throw (RuntimeException, std::exception)
    3313             : {
    3314             :     OSL_FAIL( "FmXGridCell::setVisible: not implemented" );
    3315             :     (void)_Visible;
    3316             :     // not allowed to tamper with this for a grid cell
    3317           0 : }
    3318             : 
    3319             : 
    3320           0 : void SAL_CALL FmXGridCell::setEnable( sal_Bool _Enable ) throw (RuntimeException, std::exception)
    3321             : {
    3322             :     OSL_FAIL( "FmXGridCell::setEnable: not implemented" );
    3323             :     (void)_Enable;
    3324             :     // not allowed to tamper with this for a grid cell
    3325           0 : }
    3326             : 
    3327             : 
    3328           0 : void SAL_CALL FmXGridCell::setFocus(  ) throw (RuntimeException, std::exception)
    3329             : {
    3330             :     OSL_FAIL( "FmXGridCell::setFocus: not implemented" );
    3331             :     // not allowed to tamper with this for a grid cell
    3332           0 : }
    3333             : 
    3334             : 
    3335           0 : void SAL_CALL FmXGridCell::addWindowListener( const Reference< awt::XWindowListener >& _rxListener ) throw (RuntimeException, std::exception)
    3336             : {
    3337           0 :     m_aWindowListeners.addInterface( _rxListener );
    3338           0 : }
    3339             : 
    3340             : 
    3341           0 : void SAL_CALL FmXGridCell::removeWindowListener( const Reference< awt::XWindowListener >& _rxListener ) throw (RuntimeException, std::exception)
    3342             : {
    3343           0 :     m_aWindowListeners.removeInterface( _rxListener );
    3344           0 : }
    3345             : 
    3346             : 
    3347           0 : void SAL_CALL FmXGridCell::addFocusListener( const Reference< awt::XFocusListener >& _rxListener ) throw (RuntimeException, std::exception)
    3348             : {
    3349           0 :     m_aFocusListeners.addInterface( _rxListener );
    3350           0 : }
    3351             : 
    3352             : 
    3353           0 : void SAL_CALL FmXGridCell::removeFocusListener( const Reference< awt::XFocusListener >& _rxListener ) throw (RuntimeException, std::exception)
    3354             : {
    3355           0 :     m_aFocusListeners.removeInterface( _rxListener );
    3356           0 : }
    3357             : 
    3358             : 
    3359           0 : void SAL_CALL FmXGridCell::addKeyListener( const Reference< awt::XKeyListener >& _rxListener ) throw (RuntimeException, std::exception)
    3360             : {
    3361           0 :     m_aKeyListeners.addInterface( _rxListener );
    3362           0 : }
    3363             : 
    3364             : 
    3365           0 : void SAL_CALL FmXGridCell::removeKeyListener( const Reference< awt::XKeyListener >& _rxListener ) throw (RuntimeException, std::exception)
    3366             : {
    3367           0 :     m_aKeyListeners.removeInterface( _rxListener );
    3368           0 : }
    3369             : 
    3370             : 
    3371           0 : void SAL_CALL FmXGridCell::addMouseListener( const Reference< awt::XMouseListener >& _rxListener ) throw (RuntimeException, std::exception)
    3372             : {
    3373           0 :     m_aMouseListeners.addInterface( _rxListener );
    3374           0 : }
    3375             : 
    3376             : 
    3377           0 : void SAL_CALL FmXGridCell::removeMouseListener( const Reference< awt::XMouseListener >& _rxListener ) throw (RuntimeException, std::exception)
    3378             : {
    3379           0 :     m_aMouseListeners.removeInterface( _rxListener );
    3380           0 : }
    3381             : 
    3382             : 
    3383           0 : void SAL_CALL FmXGridCell::addMouseMotionListener( const Reference< awt::XMouseMotionListener >& _rxListener ) throw (RuntimeException, std::exception)
    3384             : {
    3385           0 :     m_aMouseMotionListeners.addInterface( _rxListener );
    3386           0 : }
    3387             : 
    3388             : 
    3389           0 : void SAL_CALL FmXGridCell::removeMouseMotionListener( const Reference< awt::XMouseMotionListener >& _rxListener ) throw (RuntimeException, std::exception)
    3390             : {
    3391           0 :     m_aMouseMotionListeners.removeInterface( _rxListener );
    3392           0 : }
    3393             : 
    3394             : 
    3395           0 : void SAL_CALL FmXGridCell::addPaintListener( const Reference< awt::XPaintListener >& _rxListener ) throw (RuntimeException, std::exception)
    3396             : {
    3397             :     OSL_FAIL( "FmXGridCell::addPaintListener: not implemented" );
    3398             :     (void)_rxListener;
    3399           0 : }
    3400             : 
    3401             : 
    3402           0 : void SAL_CALL FmXGridCell::removePaintListener( const Reference< awt::XPaintListener >& _rxListener ) throw (RuntimeException, std::exception)
    3403             : {
    3404             :     OSL_FAIL( "FmXGridCell::removePaintListener: not implemented" );
    3405             :     (void)_rxListener;
    3406           0 : }
    3407             : 
    3408             : 
    3409         152 : IMPL_LINK( FmXGridCell, OnWindowEvent, VclWindowEvent*, _pEvent )
    3410             : {
    3411          76 :     ENSURE_OR_THROW( _pEvent, "illegal event pointer" );
    3412          76 :     ENSURE_OR_THROW( _pEvent->GetWindow(), "illegal window" );
    3413          76 :     onWindowEvent( _pEvent->GetId(), *_pEvent->GetWindow(), _pEvent->GetData() );
    3414          76 :     return 1L;
    3415             : }
    3416             : 
    3417             : 
    3418           0 : void FmXGridCell::onFocusGained( const awt::FocusEvent& _rEvent )
    3419             : {
    3420           0 :     m_aFocusListeners.notifyEach( &awt::XFocusListener::focusGained, _rEvent );
    3421           0 : }
    3422             : 
    3423             : 
    3424           0 : void FmXGridCell::onFocusLost( const awt::FocusEvent& _rEvent )
    3425             : {
    3426           0 :     m_aFocusListeners.notifyEach( &awt::XFocusListener::focusLost, _rEvent );
    3427           0 : }
    3428             : 
    3429             : 
    3430          74 : void FmXGridCell::onWindowEvent( const sal_uIntPtr _nEventId, const vcl::Window& _rWindow, const void* _pEventData )
    3431             : {
    3432          74 :     switch ( _nEventId )
    3433             :     {
    3434             :     case VCLEVENT_CONTROL_GETFOCUS:
    3435             :     case VCLEVENT_WINDOW_GETFOCUS:
    3436             :     case VCLEVENT_CONTROL_LOSEFOCUS:
    3437             :     case VCLEVENT_WINDOW_LOSEFOCUS:
    3438             :     {
    3439           0 :         if  (   (   _rWindow.IsCompoundControl()
    3440           0 :                 &&  (   _nEventId == VCLEVENT_CONTROL_GETFOCUS
    3441           0 :                     ||  _nEventId == VCLEVENT_CONTROL_LOSEFOCUS
    3442             :                     )
    3443             :                 )
    3444           0 :             ||  (   !_rWindow.IsCompoundControl()
    3445           0 :                 &&  (   _nEventId == VCLEVENT_WINDOW_GETFOCUS
    3446           0 :                     ||  _nEventId == VCLEVENT_WINDOW_LOSEFOCUS
    3447             :                     )
    3448             :                 )
    3449             :             )
    3450             :         {
    3451           0 :             if ( !m_aFocusListeners.getLength() )
    3452           0 :                 break;
    3453             : 
    3454           0 :             bool bFocusGained = ( _nEventId == VCLEVENT_CONTROL_GETFOCUS ) || ( _nEventId == VCLEVENT_WINDOW_GETFOCUS );
    3455             : 
    3456           0 :             awt::FocusEvent aEvent;
    3457           0 :             aEvent.Source = *this;
    3458           0 :             aEvent.FocusFlags = _rWindow.GetGetFocusFlags();
    3459           0 :             aEvent.Temporary = sal_False;
    3460             : 
    3461           0 :             if ( bFocusGained )
    3462           0 :                 onFocusGained( aEvent );
    3463             :             else
    3464           0 :                 onFocusLost( aEvent );
    3465             :         }
    3466             :     }
    3467           0 :     break;
    3468             :     case VCLEVENT_WINDOW_MOUSEBUTTONDOWN:
    3469             :     case VCLEVENT_WINDOW_MOUSEBUTTONUP:
    3470             :     {
    3471           0 :         if ( !m_aMouseListeners.getLength() )
    3472           0 :             break;
    3473             : 
    3474           0 :         const bool bButtonDown = ( _nEventId == VCLEVENT_WINDOW_MOUSEBUTTONDOWN );
    3475             : 
    3476           0 :         awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( *static_cast< const ::MouseEvent* >( _pEventData ), *this ) );
    3477           0 :         m_aMouseListeners.notifyEach( bButtonDown ? &awt::XMouseListener::mousePressed : &awt::XMouseListener::mouseReleased, aEvent );
    3478             :     }
    3479           0 :     break;
    3480             :     case VCLEVENT_WINDOW_MOUSEMOVE:
    3481             :     {
    3482           0 :         const MouseEvent& rMouseEvent = *static_cast< const ::MouseEvent* >( _pEventData );
    3483           0 :         if ( rMouseEvent.IsEnterWindow() || rMouseEvent.IsLeaveWindow() )
    3484             :         {
    3485           0 :             if ( m_aMouseListeners.getLength() != 0 )
    3486             :             {
    3487           0 :                 awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( rMouseEvent, *this ) );
    3488           0 :                 m_aMouseListeners.notifyEach( rMouseEvent.IsEnterWindow() ? &awt::XMouseListener::mouseEntered: &awt::XMouseListener::mouseExited, aEvent );
    3489             :             }
    3490             :         }
    3491           0 :         else if ( !rMouseEvent.IsEnterWindow() && !rMouseEvent.IsLeaveWindow() )
    3492             :         {
    3493           0 :             if ( m_aMouseMotionListeners.getLength() != 0 )
    3494             :             {
    3495           0 :                 awt::MouseEvent aEvent( VCLUnoHelper::createMouseEvent( rMouseEvent, *this ) );
    3496           0 :                 aEvent.ClickCount = 0;
    3497           0 :                 const bool bSimpleMove = ( ( rMouseEvent.GetMode() & MOUSE_SIMPLEMOVE ) != 0 );
    3498           0 :                 m_aMouseMotionListeners.notifyEach( bSimpleMove ? &awt::XMouseMotionListener::mouseMoved: &awt::XMouseMotionListener::mouseDragged, aEvent );
    3499             :             }
    3500             :         }
    3501             :     }
    3502           0 :     break;
    3503             :     case VCLEVENT_WINDOW_KEYINPUT:
    3504             :     case VCLEVENT_WINDOW_KEYUP:
    3505             :     {
    3506           0 :         if ( !m_aKeyListeners.getLength() )
    3507           0 :             break;
    3508             : 
    3509           0 :         const bool bKeyPressed = ( _nEventId == VCLEVENT_WINDOW_KEYINPUT );
    3510           0 :         awt::KeyEvent aEvent( VCLUnoHelper::createKeyEvent( *static_cast< const ::KeyEvent* >( _pEventData ), *this ) );
    3511           0 :         m_aKeyListeners.notifyEach( bKeyPressed ? &awt::XKeyListener::keyPressed: &awt::XKeyListener::keyReleased, aEvent );
    3512             :     }
    3513           0 :     break;
    3514             :     }
    3515          74 : }
    3516             : 
    3517         244 : TYPEINIT1(FmXDataCell, FmXGridCell);
    3518             : 
    3519          32 : void FmXDataCell::PaintFieldToCell(OutputDevice& rDev, const Rectangle& rRect,
    3520             :                         const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
    3521             :                         const Reference< XNumberFormatter >& xFormatter)
    3522             : {
    3523          32 :     m_pCellControl->PaintFieldToCell( rDev, rRect, _rxField, xFormatter );
    3524          32 : }
    3525             : 
    3526             : 
    3527           0 : void FmXDataCell::UpdateFromColumn()
    3528             : {
    3529           0 :     Reference< ::com::sun::star::sdb::XColumn >  xField(m_pColumn->GetCurrentFieldValue());
    3530           0 :     if (xField.is())
    3531           0 :         m_pCellControl->UpdateFromField(xField, m_pColumn->GetParent().getNumberFormatter());
    3532           0 : }
    3533             : 
    3534         246 : TYPEINIT1(FmXTextCell, FmXDataCell);
    3535             : 
    3536          62 : FmXTextCell::FmXTextCell( DbGridColumn* pColumn, DbCellControl& _rControl )
    3537             :     :FmXDataCell( pColumn, _rControl )
    3538          62 :     ,m_bFastPaint( true )
    3539             : {
    3540          62 : }
    3541             : 
    3542             : 
    3543          78 : void FmXTextCell::PaintFieldToCell(OutputDevice& rDev,
    3544             :                         const Rectangle& rRect,
    3545             :                         const Reference< ::com::sun::star::sdb::XColumn >& _rxField,
    3546             :                         const Reference< XNumberFormatter >& xFormatter)
    3547             : {
    3548          78 :     if ( !m_bFastPaint )
    3549             :     {
    3550          32 :         FmXDataCell::PaintFieldToCell( rDev, rRect, _rxField, xFormatter );
    3551         110 :         return;
    3552             :     }
    3553             : 
    3554          46 :     sal_uInt16 nStyle = TEXT_DRAW_CLIP | TEXT_DRAW_VCENTER;
    3555          46 :     if ( ( rDev.GetOutDevType() == OUTDEV_WINDOW ) && !static_cast< vcl::Window& >( rDev ).IsEnabled() )
    3556           0 :         nStyle |= TEXT_DRAW_DISABLE;
    3557             : 
    3558          46 :     switch (m_pColumn->GetAlignment())
    3559             :     {
    3560             :         case ::com::sun::star::awt::TextAlign::RIGHT:
    3561           0 :             nStyle |= TEXT_DRAW_RIGHT;
    3562           0 :             break;
    3563             :         case ::com::sun::star::awt::TextAlign::CENTER:
    3564           0 :             nStyle |= TEXT_DRAW_CENTER;
    3565           0 :             break;
    3566             :         default:
    3567          46 :             nStyle |= TEXT_DRAW_LEFT;
    3568             :     }
    3569             : 
    3570          46 :     Color* pColor = NULL;
    3571          46 :     OUString aText = GetText(_rxField, xFormatter, &pColor);
    3572          46 :     if (pColor != NULL)
    3573             :     {
    3574           0 :         Color aOldTextColor( rDev.GetTextColor() );
    3575           0 :         rDev.SetTextColor( *pColor );
    3576           0 :         rDev.DrawText(rRect, aText, nStyle);
    3577           0 :         rDev.SetTextColor( aOldTextColor );
    3578             :     }
    3579             :     else
    3580          46 :         rDev.DrawText(rRect, aText, nStyle);
    3581             : }
    3582             : 
    3583          62 : FmXEditCell::FmXEditCell( DbGridColumn* pColumn, DbCellControl& _rControl )
    3584             :             :FmXTextCell( pColumn, _rControl )
    3585             :             ,m_aTextListeners(m_aMutex)
    3586             :             ,m_aChangeListeners( m_aMutex )
    3587             :             ,m_pEditImplementation( NULL )
    3588          62 :             ,m_bOwnEditImplementation( false )
    3589             : {
    3590             : 
    3591          62 :     DbTextField* pTextField = PTR_CAST( DbTextField, &_rControl );
    3592          62 :     if ( pTextField )
    3593             :     {
    3594             : 
    3595          34 :         m_pEditImplementation = pTextField->GetEditImplementation();
    3596          34 :         if ( !pTextField->IsSimpleEdit() )
    3597          34 :             m_bFastPaint = false;
    3598             :     }
    3599             :     else
    3600             :     {
    3601          28 :         m_pEditImplementation = new EditImplementation( static_cast< Edit& >( _rControl.GetWindow() ) );
    3602          28 :         m_bOwnEditImplementation = true;
    3603             :     }
    3604          62 : }
    3605             : 
    3606             : 
    3607         186 : FmXEditCell::~FmXEditCell()
    3608             : {
    3609          62 :     if (!OComponentHelper::rBHelper.bDisposed)
    3610             :     {
    3611           0 :         acquire();
    3612           0 :         dispose();
    3613             :     }
    3614             : 
    3615             : 
    3616         124 : }
    3617             : 
    3618             : // OComponentHelper
    3619             : 
    3620          62 : void FmXEditCell::disposing()
    3621             : {
    3622          62 :     ::com::sun::star::lang::EventObject aEvt(*this);
    3623          62 :     m_aTextListeners.disposeAndClear(aEvt);
    3624          62 :     m_aChangeListeners.disposeAndClear(aEvt);
    3625             : 
    3626          62 :     m_pEditImplementation->SetModifyHdl( Link() );
    3627          62 :     if ( m_bOwnEditImplementation )
    3628          28 :         delete m_pEditImplementation;
    3629          62 :     m_pEditImplementation = NULL;
    3630             : 
    3631          62 :     FmXDataCell::disposing();
    3632          62 : }
    3633             : 
    3634             : 
    3635         248 : Any SAL_CALL FmXEditCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException, std::exception)
    3636             : {
    3637         248 :     Any aReturn = FmXTextCell::queryAggregation( _rType );
    3638             : 
    3639         248 :     if ( !aReturn.hasValue() )
    3640           0 :         aReturn = FmXEditCell_Base::queryInterface( _rType );
    3641             : 
    3642         248 :     return aReturn;
    3643             : }
    3644             : 
    3645             : 
    3646           0 : Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXEditCell::getTypes(  ) throw(RuntimeException, std::exception)
    3647             : {
    3648             :     return ::comphelper::concatSequences(
    3649             :         FmXTextCell::getTypes(),
    3650             :         FmXEditCell_Base::getTypes()
    3651           0 :     );
    3652             : }
    3653             : 
    3654             : 
    3655           0 : IMPLEMENT_GET_IMPLEMENTATION_ID( FmXEditCell )
    3656             : 
    3657             : // ::com::sun::star::awt::XTextComponent
    3658             : 
    3659           0 : void SAL_CALL FmXEditCell::addTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException, std::exception )
    3660             : {
    3661           0 :     m_aTextListeners.addInterface( l );
    3662           0 : }
    3663             : 
    3664             : 
    3665           0 : void SAL_CALL FmXEditCell::removeTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException, std::exception )
    3666             : {
    3667           0 :     m_aTextListeners.removeInterface( l );
    3668           0 : }
    3669             : 
    3670             : 
    3671           0 : void SAL_CALL FmXEditCell::setText( const OUString& aText ) throw( RuntimeException, std::exception )
    3672             : {
    3673           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3674             : 
    3675           0 :     if ( m_pEditImplementation )
    3676             :     {
    3677           0 :         m_pEditImplementation->SetText( aText );
    3678             : 
    3679             :         // In JAVA wird auch ein textChanged ausgeloest, in VCL nicht.
    3680             :         // ::com::sun::star::awt::Toolkit soll JAVA-komform sein...
    3681           0 :         onTextChanged();
    3682           0 :     }
    3683           0 : }
    3684             : 
    3685             : 
    3686           0 : void SAL_CALL FmXEditCell::insertText(const ::com::sun::star::awt::Selection& rSel, const OUString& aText) throw(RuntimeException, std::exception)
    3687             : {
    3688           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3689             : 
    3690           0 :     if ( m_pEditImplementation )
    3691             :     {
    3692           0 :         m_pEditImplementation->SetSelection( Selection( rSel.Min, rSel.Max ) );
    3693           0 :         m_pEditImplementation->ReplaceSelected( aText );
    3694           0 :     }
    3695           0 : }
    3696             : 
    3697             : 
    3698           0 : OUString SAL_CALL FmXEditCell::getText() throw( RuntimeException, std::exception )
    3699             : {
    3700           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3701             : 
    3702           0 :     OUString aText;
    3703           0 :     if ( m_pEditImplementation )
    3704             :     {
    3705           0 :         if ( m_pEditImplementation->GetControl().IsVisible() && m_pColumn->GetParent().getDisplaySynchron())
    3706             :         {
    3707             :             // if the display isn't sync with the cursor we can't ask the edit field
    3708           0 :             LineEnd eLineEndFormat = getModelLineEndSetting( m_pColumn->getModel() );
    3709           0 :             aText = m_pEditImplementation->GetText( eLineEndFormat );
    3710             :         }
    3711             :         else
    3712             :         {
    3713           0 :             Reference< ::com::sun::star::sdb::XColumn >  xField(m_pColumn->GetCurrentFieldValue());
    3714           0 :             if (xField.is())
    3715           0 :                 aText = GetText(xField, m_pColumn->GetParent().getNumberFormatter());
    3716             :         }
    3717             :     }
    3718           0 :     return aText;
    3719             : }
    3720             : 
    3721             : 
    3722           0 : OUString SAL_CALL FmXEditCell::getSelectedText( void ) throw( RuntimeException, std::exception )
    3723             : {
    3724           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3725             : 
    3726           0 :     OUString aText;
    3727           0 :     if ( m_pEditImplementation )
    3728             :     {
    3729           0 :         LineEnd eLineEndFormat = m_pColumn ? getModelLineEndSetting( m_pColumn->getModel() ) : LINEEND_LF;
    3730           0 :         aText = m_pEditImplementation->GetSelected( eLineEndFormat );
    3731             :     }
    3732           0 :     return aText;
    3733             : }
    3734             : 
    3735             : 
    3736           0 : void SAL_CALL FmXEditCell::setSelection( const ::com::sun::star::awt::Selection& aSelection ) throw( RuntimeException, std::exception )
    3737             : {
    3738           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3739             : 
    3740           0 :     if ( m_pEditImplementation )
    3741           0 :         m_pEditImplementation->SetSelection( Selection( aSelection.Min, aSelection.Max ) );
    3742           0 : }
    3743             : 
    3744             : 
    3745           0 : ::com::sun::star::awt::Selection SAL_CALL FmXEditCell::getSelection( void ) throw( RuntimeException, std::exception )
    3746             : {
    3747           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3748             : 
    3749           0 :     Selection aSel;
    3750           0 :     if ( m_pEditImplementation )
    3751           0 :         aSel = m_pEditImplementation->GetSelection();
    3752             : 
    3753           0 :     return ::com::sun::star::awt::Selection(aSel.Min(), aSel.Max());
    3754             : }
    3755             : 
    3756             : 
    3757           0 : sal_Bool SAL_CALL FmXEditCell::isEditable( void ) throw( RuntimeException, std::exception )
    3758             : {
    3759           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3760             : 
    3761           0 :     return ( m_pEditImplementation && !m_pEditImplementation->IsReadOnly() && m_pEditImplementation->GetControl().IsEnabled() ) ? sal_True : sal_False;
    3762             : }
    3763             : 
    3764             : 
    3765           0 : void SAL_CALL FmXEditCell::setEditable( sal_Bool bEditable ) throw( RuntimeException, std::exception )
    3766             : {
    3767           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3768             : 
    3769           0 :     if ( m_pEditImplementation )
    3770           0 :         m_pEditImplementation->SetReadOnly( !bEditable );
    3771           0 : }
    3772             : 
    3773             : 
    3774           0 : sal_Int16 SAL_CALL FmXEditCell::getMaxTextLen() throw( RuntimeException, std::exception )
    3775             : {
    3776           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3777             : 
    3778           0 :     return m_pEditImplementation ? m_pEditImplementation->GetMaxTextLen() : 0;
    3779             : }
    3780             : 
    3781             : 
    3782           0 : void SAL_CALL FmXEditCell::setMaxTextLen( sal_Int16 nLen ) throw( RuntimeException, std::exception )
    3783             : {
    3784           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3785             : 
    3786           0 :     if ( m_pEditImplementation )
    3787           0 :         m_pEditImplementation->SetMaxTextLen( nLen );
    3788           0 : }
    3789             : 
    3790             : 
    3791           0 : void SAL_CALL FmXEditCell::addChangeListener( const Reference< form::XChangeListener >& _Listener ) throw (RuntimeException, std::exception)
    3792             : {
    3793           0 :     m_aChangeListeners.addInterface( _Listener );
    3794           0 : }
    3795             : 
    3796             : 
    3797           0 : void SAL_CALL FmXEditCell::removeChangeListener( const Reference< form::XChangeListener >& _Listener ) throw (RuntimeException, std::exception)
    3798             : {
    3799           0 :     m_aChangeListeners.removeInterface( _Listener );
    3800           0 : }
    3801             : 
    3802             : 
    3803           0 : void FmXEditCell::onTextChanged()
    3804             : {
    3805           0 :     ::com::sun::star::awt::TextEvent aEvent;
    3806           0 :     aEvent.Source = *this;
    3807           0 :     m_aTextListeners.notifyEach( &awt::XTextListener::textChanged, aEvent );
    3808           0 : }
    3809             : 
    3810             : 
    3811           0 : void FmXEditCell::onFocusGained( const awt::FocusEvent& _rEvent )
    3812             : {
    3813           0 :     FmXTextCell::onFocusGained( _rEvent );
    3814           0 :     m_sValueOnEnter = getText();
    3815           0 : }
    3816             : 
    3817             : 
    3818           0 : void FmXEditCell::onFocusLost( const awt::FocusEvent& _rEvent )
    3819             : {
    3820           0 :     FmXTextCell::onFocusLost( _rEvent );
    3821             : 
    3822           0 :     if ( getText() != m_sValueOnEnter )
    3823             :     {
    3824           0 :         lang::EventObject aEvent( *this );
    3825           0 :         m_aChangeListeners.notifyEach( &XChangeListener::changed, aEvent );
    3826             :     }
    3827           0 : }
    3828             : 
    3829             : 
    3830          76 : void FmXEditCell::onWindowEvent( const sal_uIntPtr _nEventId, const vcl::Window& _rWindow, const void* _pEventData )
    3831             : {
    3832          76 :     switch ( _nEventId )
    3833             :     {
    3834             :     case VCLEVENT_EDIT_MODIFY:
    3835             :     {
    3836           2 :         if ( m_pEditImplementation && m_aTextListeners.getLength() )
    3837           0 :             onTextChanged();
    3838          78 :         return;
    3839             :     }
    3840             :     }
    3841             : 
    3842          74 :     FmXTextCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
    3843             : }
    3844             : 
    3845           0 : FmXCheckBoxCell::FmXCheckBoxCell( DbGridColumn* pColumn, DbCellControl& _rControl )
    3846             :                 :FmXDataCell( pColumn, _rControl )
    3847             :                 ,m_aItemListeners(m_aMutex)
    3848             :                 ,m_aActionListeners( m_aMutex )
    3849           0 :                 ,m_pBox( & static_cast< CheckBoxControl& >( _rControl.GetWindow() ).GetBox() )
    3850             : {
    3851           0 : }
    3852             : 
    3853             : 
    3854           0 : FmXCheckBoxCell::~FmXCheckBoxCell()
    3855             : {
    3856           0 :     if (!OComponentHelper::rBHelper.bDisposed)
    3857             :     {
    3858           0 :         acquire();
    3859           0 :         dispose();
    3860             :     }
    3861             : 
    3862           0 : }
    3863             : 
    3864             : // OComponentHelper
    3865             : 
    3866           0 : void FmXCheckBoxCell::disposing()
    3867             : {
    3868           0 :     ::com::sun::star::lang::EventObject aEvt(*this);
    3869           0 :     m_aItemListeners.disposeAndClear(aEvt);
    3870           0 :     m_aActionListeners.disposeAndClear(aEvt);
    3871             : 
    3872           0 :     static_cast< CheckBoxControl& >( m_pCellControl->GetWindow() ).SetClickHdl(Link());
    3873           0 :     m_pBox = NULL;
    3874             : 
    3875           0 :     FmXDataCell::disposing();
    3876           0 : }
    3877             : 
    3878             : 
    3879           0 : Any SAL_CALL FmXCheckBoxCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException, std::exception)
    3880             : {
    3881           0 :     Any aReturn = FmXDataCell::queryAggregation( _rType );
    3882             : 
    3883           0 :     if ( !aReturn.hasValue() )
    3884           0 :         aReturn = FmXCheckBoxCell_Base::queryInterface( _rType );
    3885             : 
    3886           0 :     return aReturn;
    3887             : }
    3888             : 
    3889             : 
    3890           0 : Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXCheckBoxCell::getTypes(  ) throw(RuntimeException, std::exception)
    3891             : {
    3892             :     return ::comphelper::concatSequences(
    3893             :         FmXDataCell::getTypes(),
    3894             :         FmXCheckBoxCell_Base::getTypes()
    3895           0 :     );
    3896             : }
    3897             : 
    3898             : 
    3899           0 : IMPLEMENT_GET_IMPLEMENTATION_ID( FmXCheckBoxCell )
    3900             : 
    3901             : 
    3902           0 : void SAL_CALL FmXCheckBoxCell::addItemListener( const Reference< ::com::sun::star::awt::XItemListener >& l ) throw( RuntimeException, std::exception )
    3903             : {
    3904           0 :     m_aItemListeners.addInterface( l );
    3905           0 : }
    3906             : 
    3907             : 
    3908           0 : void SAL_CALL FmXCheckBoxCell::removeItemListener( const Reference< ::com::sun::star::awt::XItemListener >& l ) throw( RuntimeException, std::exception )
    3909             : {
    3910           0 :     m_aItemListeners.removeInterface( l );
    3911           0 : }
    3912             : 
    3913             : 
    3914           0 : void SAL_CALL FmXCheckBoxCell::setState( short n ) throw( RuntimeException, std::exception )
    3915             : {
    3916           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3917             : 
    3918           0 :     if (m_pBox)
    3919             :     {
    3920           0 :         UpdateFromColumn();
    3921           0 :         m_pBox->SetState( (TriState)n );
    3922           0 :     }
    3923           0 : }
    3924             : 
    3925             : 
    3926           0 : short SAL_CALL FmXCheckBoxCell::getState() throw( RuntimeException, std::exception )
    3927             : {
    3928           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3929             : 
    3930           0 :     if (m_pBox)
    3931             :     {
    3932           0 :         UpdateFromColumn();
    3933           0 :         return (short)m_pBox->GetState();
    3934             :     }
    3935           0 :     return TRISTATE_INDET;
    3936             : }
    3937             : 
    3938             : 
    3939           0 : void SAL_CALL FmXCheckBoxCell::enableTriState( sal_Bool b ) throw( RuntimeException, std::exception )
    3940             : {
    3941           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    3942             : 
    3943           0 :     if (m_pBox)
    3944           0 :         m_pBox->EnableTriState( b );
    3945           0 : }
    3946             : 
    3947             : 
    3948           0 : void SAL_CALL FmXCheckBoxCell::addActionListener( const Reference< awt::XActionListener >& _Listener ) throw (RuntimeException, std::exception)
    3949             : {
    3950           0 :     m_aActionListeners.addInterface( _Listener );
    3951           0 : }
    3952             : 
    3953             : 
    3954           0 : void SAL_CALL FmXCheckBoxCell::removeActionListener( const Reference< awt::XActionListener >& _Listener ) throw (RuntimeException, std::exception)
    3955             : {
    3956           0 :     m_aActionListeners.removeInterface( _Listener );
    3957           0 : }
    3958             : 
    3959             : 
    3960           0 : void SAL_CALL FmXCheckBoxCell::setLabel( const OUString& _Label ) throw (RuntimeException, std::exception)
    3961             : {
    3962           0 :     SolarMutexGuard aGuard;
    3963           0 :     if ( m_pColumn )
    3964             :     {
    3965           0 :         DbGridControl& rGrid( m_pColumn->GetParent() );
    3966           0 :         rGrid.SetColumnTitle( rGrid.GetColumnId( m_pColumn->GetFieldPos() ), _Label );
    3967           0 :     }
    3968           0 : }
    3969             : 
    3970             : 
    3971           0 : void SAL_CALL FmXCheckBoxCell::setActionCommand( const OUString& _Command ) throw (RuntimeException, std::exception)
    3972             : {
    3973           0 :     m_aActionCommand = _Command;
    3974           0 : }
    3975             : 
    3976             : 
    3977           0 : vcl::Window* FmXCheckBoxCell::getEventWindow() const
    3978             : {
    3979           0 :     return m_pBox;
    3980             : }
    3981             : 
    3982             : 
    3983           0 : void FmXCheckBoxCell::onWindowEvent( const sal_uIntPtr _nEventId, const vcl::Window& _rWindow, const void* _pEventData )
    3984             : {
    3985           0 :     switch ( _nEventId )
    3986             :     {
    3987             :     case VCLEVENT_CHECKBOX_TOGGLE:
    3988             :     {
    3989             :         // check boxes are to be committed immediately (this holds for ordinary check box controls in
    3990             :         // documents, and this must hold for check boxes in grid columns, too
    3991             :         // 91210 - 22.08.2001 - frank.schoenheit@sun.com
    3992           0 :         m_pCellControl->Commit();
    3993             : 
    3994           0 :         Reference< XWindow > xKeepAlive( this );
    3995           0 :         if ( m_aItemListeners.getLength() && m_pBox )
    3996             :         {
    3997           0 :             awt::ItemEvent aEvent;
    3998           0 :             aEvent.Source = *this;
    3999           0 :             aEvent.Highlighted = sal_False;
    4000           0 :             aEvent.Selected = m_pBox->GetState();
    4001           0 :             m_aItemListeners.notifyEach( &awt::XItemListener::itemStateChanged, aEvent );
    4002             :         }
    4003           0 :         if ( m_aActionListeners.getLength() )
    4004             :         {
    4005           0 :             awt::ActionEvent aEvent;
    4006           0 :             aEvent.Source = *this;
    4007           0 :             aEvent.ActionCommand = m_aActionCommand;
    4008           0 :             m_aActionListeners.notifyEach( &awt::XActionListener::actionPerformed, aEvent );
    4009           0 :         }
    4010             :     }
    4011           0 :     break;
    4012             : 
    4013             :     default:
    4014           0 :         FmXDataCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
    4015           0 :         break;
    4016             :     }
    4017           0 : }
    4018             : 
    4019           0 : FmXListBoxCell::FmXListBoxCell(DbGridColumn* pColumn, DbCellControl& _rControl)
    4020             :                :FmXTextCell( pColumn, _rControl )
    4021             :                ,m_aItemListeners(m_aMutex)
    4022             :                ,m_aActionListeners(m_aMutex)
    4023           0 :                ,m_pBox( &static_cast< ListBox& >( _rControl.GetWindow() ) )
    4024             : {
    4025             : 
    4026           0 :     m_pBox->SetDoubleClickHdl( LINK( this, FmXListBoxCell, OnDoubleClick ) );
    4027           0 : }
    4028             : 
    4029             : 
    4030           0 : FmXListBoxCell::~FmXListBoxCell()
    4031             : {
    4032           0 :     if (!OComponentHelper::rBHelper.bDisposed)
    4033             :     {
    4034           0 :         acquire();
    4035           0 :         dispose();
    4036             :     }
    4037             : 
    4038           0 : }
    4039             : 
    4040             : // OComponentHelper
    4041             : 
    4042           0 : void FmXListBoxCell::disposing()
    4043             : {
    4044           0 :     ::com::sun::star::lang::EventObject aEvt(*this);
    4045           0 :     m_aItemListeners.disposeAndClear(aEvt);
    4046           0 :     m_aActionListeners.disposeAndClear(aEvt);
    4047             : 
    4048           0 :     m_pBox->SetSelectHdl( Link() );
    4049           0 :     m_pBox->SetDoubleClickHdl( Link() );
    4050           0 :     m_pBox = NULL;
    4051             : 
    4052           0 :     FmXTextCell::disposing();
    4053           0 : }
    4054             : 
    4055             : 
    4056           0 : Any SAL_CALL FmXListBoxCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException, std::exception)
    4057             : {
    4058           0 :     Any aReturn = FmXTextCell::queryAggregation(_rType);
    4059             : 
    4060           0 :     if ( !aReturn.hasValue() )
    4061           0 :         aReturn = FmXListBoxCell_Base::queryInterface( _rType );
    4062             : 
    4063           0 :     return aReturn;
    4064             : }
    4065             : 
    4066             : 
    4067           0 : Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXListBoxCell::getTypes(  ) throw(RuntimeException, std::exception)
    4068             : {
    4069             :     return ::comphelper::concatSequences(
    4070             :         FmXTextCell::getTypes(),
    4071             :         FmXListBoxCell_Base::getTypes()
    4072           0 :     );
    4073             : }
    4074             : 
    4075             : 
    4076           0 : IMPLEMENT_GET_IMPLEMENTATION_ID( FmXListBoxCell )
    4077             : 
    4078             : 
    4079           0 : void SAL_CALL FmXListBoxCell::addItemListener(const Reference< ::com::sun::star::awt::XItemListener >& l) throw( RuntimeException, std::exception )
    4080             : {
    4081           0 :     m_aItemListeners.addInterface( l );
    4082           0 : }
    4083             : 
    4084             : 
    4085           0 : void SAL_CALL FmXListBoxCell::removeItemListener(const Reference< ::com::sun::star::awt::XItemListener >& l) throw( RuntimeException, std::exception )
    4086             : {
    4087           0 :     m_aItemListeners.removeInterface( l );
    4088           0 : }
    4089             : 
    4090             : 
    4091           0 : void SAL_CALL FmXListBoxCell::addActionListener(const Reference< ::com::sun::star::awt::XActionListener >& l) throw( RuntimeException, std::exception )
    4092             : {
    4093           0 :     m_aActionListeners.addInterface( l );
    4094           0 : }
    4095             : 
    4096             : 
    4097           0 : void SAL_CALL FmXListBoxCell::removeActionListener(const Reference< ::com::sun::star::awt::XActionListener >& l) throw( RuntimeException, std::exception )
    4098             : {
    4099           0 :     m_aActionListeners.removeInterface( l );
    4100           0 : }
    4101             : 
    4102             : 
    4103           0 : void SAL_CALL FmXListBoxCell::addItem(const OUString& aItem, sal_Int16 nPos) throw( RuntimeException, std::exception )
    4104             : {
    4105           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4106           0 :     if (m_pBox)
    4107           0 :         m_pBox->InsertEntry( aItem, nPos );
    4108           0 : }
    4109             : 
    4110             : 
    4111           0 : void SAL_CALL FmXListBoxCell::addItems(const ::comphelper::StringSequence& aItems, sal_Int16 nPos) throw( RuntimeException, std::exception )
    4112             : {
    4113           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4114           0 :     if (m_pBox)
    4115             :     {
    4116           0 :         sal_uInt16 nP = nPos;
    4117           0 :         for ( sal_uInt16 n = 0; n < aItems.getLength(); n++ )
    4118             :         {
    4119           0 :             m_pBox->InsertEntry( aItems.getConstArray()[n], nP );
    4120           0 :             if ( nPos != -1 )    // Nicht wenn 0xFFFF, weil LIST_APPEND
    4121           0 :                 nP++;
    4122             :         }
    4123           0 :     }
    4124           0 : }
    4125             : 
    4126             : 
    4127           0 : void SAL_CALL FmXListBoxCell::removeItems(sal_Int16 nPos, sal_Int16 nCount) throw( RuntimeException, std::exception )
    4128             : {
    4129           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4130           0 :     if ( m_pBox )
    4131             :     {
    4132           0 :         for ( sal_uInt16 n = nCount; n; )
    4133           0 :             m_pBox->RemoveEntry( nPos + (--n) );
    4134           0 :     }
    4135           0 : }
    4136             : 
    4137             : 
    4138           0 : sal_Int16 SAL_CALL FmXListBoxCell::getItemCount() throw( RuntimeException, std::exception )
    4139             : {
    4140           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4141           0 :     return m_pBox ? m_pBox->GetEntryCount() : 0;
    4142             : }
    4143             : 
    4144             : 
    4145           0 : OUString SAL_CALL FmXListBoxCell::getItem(sal_Int16 nPos) throw( RuntimeException, std::exception )
    4146             : {
    4147           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4148           0 :     return m_pBox ? OUString(m_pBox->GetEntry(nPos)) : OUString();
    4149             : }
    4150             : 
    4151           0 : ::comphelper::StringSequence SAL_CALL FmXListBoxCell::getItems() throw( RuntimeException, std::exception )
    4152             : {
    4153           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4154             : 
    4155           0 :     ::comphelper::StringSequence aSeq;
    4156           0 :     if (m_pBox)
    4157             :     {
    4158           0 :         sal_uInt16 nEntries = m_pBox ->GetEntryCount();
    4159           0 :         aSeq = ::comphelper::StringSequence( nEntries );
    4160           0 :         for ( sal_uInt16 n = nEntries; n; )
    4161             :         {
    4162           0 :             --n;
    4163           0 :             aSeq.getArray()[n] = m_pBox ->GetEntry( n );
    4164             :         }
    4165             :     }
    4166           0 :     return aSeq;
    4167             : }
    4168             : 
    4169             : 
    4170           0 : sal_Int16 SAL_CALL FmXListBoxCell::getSelectedItemPos() throw( RuntimeException, std::exception )
    4171             : {
    4172           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4173           0 :     if (m_pBox)
    4174             :     {
    4175           0 :         UpdateFromColumn();
    4176           0 :         sal_Int32 nPos = m_pBox->GetSelectEntryPos();
    4177           0 :         if (nPos > SHRT_MAX || nPos < SHRT_MIN)
    4178           0 :             throw std::out_of_range("awt::XListBox::getSelectedItemPos can only return a short");
    4179           0 :         return nPos;
    4180             :     }
    4181           0 :     return 0;
    4182             : }
    4183             : 
    4184             : 
    4185           0 : Sequence< sal_Int16 > SAL_CALL FmXListBoxCell::getSelectedItemsPos() throw( RuntimeException, std::exception )
    4186             : {
    4187           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4188           0 :     Sequence<sal_Int16> aSeq;
    4189             : 
    4190           0 :     if (m_pBox)
    4191             :     {
    4192           0 :         UpdateFromColumn();
    4193           0 :         sal_uInt16 nSelEntries = m_pBox->GetSelectEntryCount();
    4194           0 :         aSeq = Sequence<sal_Int16>( nSelEntries );
    4195           0 :         for ( sal_uInt16 n = 0; n < nSelEntries; n++ )
    4196           0 :             aSeq.getArray()[n] = m_pBox->GetSelectEntryPos( n );
    4197             :     }
    4198           0 :     return aSeq;
    4199             : }
    4200             : 
    4201           0 : OUString SAL_CALL FmXListBoxCell::getSelectedItem() throw( RuntimeException, std::exception )
    4202             : {
    4203           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4204             : 
    4205           0 :     OUString aItem;
    4206             : 
    4207           0 :     if (m_pBox)
    4208             :     {
    4209           0 :         UpdateFromColumn();
    4210           0 :         aItem = m_pBox->GetSelectEntry();
    4211             :     }
    4212             : 
    4213           0 :     return aItem;
    4214             : }
    4215             : 
    4216             : 
    4217           0 : ::comphelper::StringSequence SAL_CALL FmXListBoxCell::getSelectedItems() throw( RuntimeException, std::exception )
    4218             : {
    4219           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4220             : 
    4221           0 :     ::comphelper::StringSequence aSeq;
    4222             : 
    4223           0 :     if (m_pBox)
    4224             :     {
    4225           0 :         UpdateFromColumn();
    4226           0 :         sal_uInt16 nSelEntries = m_pBox->GetSelectEntryCount();
    4227           0 :         aSeq = ::comphelper::StringSequence( nSelEntries );
    4228           0 :         for ( sal_uInt16 n = 0; n < nSelEntries; n++ )
    4229           0 :             aSeq.getArray()[n] = m_pBox->GetSelectEntry( n );
    4230             :     }
    4231           0 :     return aSeq;
    4232             : }
    4233             : 
    4234             : 
    4235           0 : void SAL_CALL FmXListBoxCell::selectItemPos(sal_Int16 nPos, sal_Bool bSelect) throw( RuntimeException, std::exception )
    4236             : {
    4237           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4238             : 
    4239           0 :     if (m_pBox)
    4240           0 :         m_pBox->SelectEntryPos( nPos, bSelect );
    4241           0 : }
    4242             : 
    4243             : 
    4244           0 : void SAL_CALL FmXListBoxCell::selectItemsPos(const Sequence< sal_Int16 >& aPositions, sal_Bool bSelect) throw( RuntimeException, std::exception )
    4245             : {
    4246           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4247             : 
    4248           0 :     if (m_pBox)
    4249             :     {
    4250           0 :         for ( sal_uInt16 n = (sal_uInt16)aPositions.getLength(); n; )
    4251           0 :             m_pBox->SelectEntryPos( (sal_uInt16) aPositions.getConstArray()[--n], bSelect );
    4252           0 :     }
    4253           0 : }
    4254             : 
    4255             : 
    4256           0 : void SAL_CALL FmXListBoxCell::selectItem(const OUString& aItem, sal_Bool bSelect) throw( RuntimeException, std::exception )
    4257             : {
    4258           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4259             : 
    4260           0 :     if (m_pBox)
    4261           0 :         m_pBox->SelectEntry( aItem, bSelect );
    4262           0 : }
    4263             : 
    4264             : 
    4265           0 : sal_Bool SAL_CALL FmXListBoxCell::isMutipleMode() throw( RuntimeException, std::exception )
    4266             : {
    4267           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4268             : 
    4269           0 :     bool bMulti = false;
    4270           0 :     if (m_pBox)
    4271           0 :         bMulti = m_pBox->IsMultiSelectionEnabled();
    4272           0 :     return bMulti;
    4273             : }
    4274             : 
    4275             : 
    4276           0 : void SAL_CALL FmXListBoxCell::setMultipleMode(sal_Bool bMulti) throw( RuntimeException, std::exception )
    4277             : {
    4278           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4279             : 
    4280           0 :     if (m_pBox)
    4281           0 :         m_pBox->EnableMultiSelection( bMulti );
    4282           0 : }
    4283             : 
    4284             : 
    4285           0 : sal_Int16 SAL_CALL FmXListBoxCell::getDropDownLineCount() throw( RuntimeException, std::exception )
    4286             : {
    4287           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4288             : 
    4289           0 :     sal_Int16 nLines = 0;
    4290           0 :     if (m_pBox)
    4291           0 :         nLines = m_pBox->GetDropDownLineCount();
    4292             : 
    4293           0 :     return nLines;
    4294             : }
    4295             : 
    4296             : 
    4297           0 : void SAL_CALL FmXListBoxCell::setDropDownLineCount(sal_Int16 nLines) throw( RuntimeException, std::exception )
    4298             : {
    4299           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4300             : 
    4301           0 :     if (m_pBox)
    4302           0 :         m_pBox->SetDropDownLineCount( nLines );
    4303           0 : }
    4304             : 
    4305             : 
    4306           0 : void SAL_CALL FmXListBoxCell::makeVisible(sal_Int16 nEntry) throw( RuntimeException, std::exception )
    4307             : {
    4308           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4309             : 
    4310           0 :     if (m_pBox)
    4311           0 :         m_pBox->SetTopEntry( nEntry );
    4312           0 : }
    4313             : 
    4314             : 
    4315           0 : void FmXListBoxCell::onWindowEvent( const sal_uIntPtr _nEventId, const vcl::Window& _rWindow, const void* _pEventData )
    4316             : {
    4317           0 :     if  (   ( &_rWindow == m_pBox )
    4318           0 :         &&  ( _nEventId == VCLEVENT_LISTBOX_SELECT )
    4319             :         )
    4320             :     {
    4321           0 :         OnDoubleClick( NULL );
    4322             : 
    4323           0 :         ::com::sun::star::awt::ItemEvent aEvent;
    4324           0 :         aEvent.Source = *this;
    4325           0 :         aEvent.Highlighted = sal_False;
    4326             : 
    4327             :         // Bei Mehrfachselektion 0xFFFF, sonst die ID
    4328           0 :         aEvent.Selected = (m_pBox->GetSelectEntryCount() == 1 )
    4329           0 :             ? m_pBox->GetSelectEntryPos() : 0xFFFF;
    4330             : 
    4331           0 :         m_aItemListeners.notifyEach( &awt::XItemListener::itemStateChanged, aEvent );
    4332           0 :         return;
    4333             :     }
    4334             : 
    4335           0 :     FmXTextCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
    4336             : }
    4337             : 
    4338             : 
    4339             : 
    4340           0 : IMPL_LINK_NOARG(FmXListBoxCell, OnDoubleClick)
    4341             : {
    4342           0 :     if (m_pBox)
    4343             :     {
    4344           0 :         ::cppu::OInterfaceIteratorHelper aIt( m_aActionListeners );
    4345             : 
    4346           0 :         ::com::sun::star::awt::ActionEvent aEvent;
    4347           0 :         aEvent.Source = *this;
    4348           0 :         aEvent.ActionCommand = m_pBox->GetSelectEntry();
    4349             : 
    4350           0 :         while( aIt.hasMoreElements() )
    4351           0 :             static_cast< ::com::sun::star::awt::XActionListener *>(aIt.next())->actionPerformed( aEvent );
    4352             :     }
    4353           0 :     return 1;
    4354             : }
    4355             : 
    4356           0 : FmXComboBoxCell::FmXComboBoxCell( DbGridColumn* pColumn, DbCellControl& _rControl )
    4357             :     :FmXTextCell( pColumn, _rControl )
    4358             :     ,m_aItemListeners( m_aMutex )
    4359             :     ,m_aActionListeners( m_aMutex )
    4360           0 :     ,m_pComboBox( &static_cast< ComboBox& >( _rControl.GetWindow() ) )
    4361             : {
    4362           0 : }
    4363             : 
    4364             : 
    4365           0 : FmXComboBoxCell::~FmXComboBoxCell()
    4366             : {
    4367           0 :     if ( !OComponentHelper::rBHelper.bDisposed )
    4368             :     {
    4369           0 :         acquire();
    4370           0 :         dispose();
    4371             :     }
    4372             : 
    4373           0 : }
    4374             : 
    4375             : 
    4376           0 : void FmXComboBoxCell::disposing()
    4377             : {
    4378           0 :     ::com::sun::star::lang::EventObject aEvt(*this);
    4379           0 :     m_aItemListeners.disposeAndClear(aEvt);
    4380           0 :     m_aActionListeners.disposeAndClear(aEvt);
    4381             : 
    4382           0 :     FmXTextCell::disposing();
    4383           0 : }
    4384             : 
    4385             : 
    4386           0 : Any SAL_CALL FmXComboBoxCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException, std::exception)
    4387             : {
    4388           0 :     Any aReturn = FmXTextCell::queryAggregation(_rType);
    4389             : 
    4390           0 :     if ( !aReturn.hasValue() )
    4391           0 :         aReturn = FmXComboBoxCell_Base::queryInterface( _rType );
    4392             : 
    4393           0 :     return aReturn;
    4394             : }
    4395             : 
    4396             : 
    4397           0 : Sequence< Type > SAL_CALL FmXComboBoxCell::getTypes(  ) throw(RuntimeException, std::exception)
    4398             : {
    4399             :     return ::comphelper::concatSequences(
    4400             :         FmXTextCell::getTypes(),
    4401             :         FmXComboBoxCell_Base::getTypes()
    4402           0 :     );
    4403             : }
    4404             : 
    4405             : 
    4406           0 : IMPLEMENT_GET_IMPLEMENTATION_ID( FmXComboBoxCell )
    4407             : 
    4408             : 
    4409           0 : void SAL_CALL FmXComboBoxCell::addItemListener(const Reference< awt::XItemListener >& l) throw( RuntimeException, std::exception )
    4410             : {
    4411           0 :     m_aItemListeners.addInterface( l );
    4412           0 : }
    4413             : 
    4414             : 
    4415           0 : void SAL_CALL FmXComboBoxCell::removeItemListener(const Reference< awt::XItemListener >& l) throw( RuntimeException, std::exception )
    4416             : {
    4417           0 :     m_aItemListeners.removeInterface( l );
    4418           0 : }
    4419             : 
    4420             : 
    4421           0 : void SAL_CALL FmXComboBoxCell::addActionListener(const Reference< awt::XActionListener >& l) throw( RuntimeException, std::exception )
    4422             : {
    4423           0 :     m_aActionListeners.addInterface( l );
    4424           0 : }
    4425             : 
    4426             : 
    4427           0 : void SAL_CALL FmXComboBoxCell::removeActionListener(const Reference< awt::XActionListener >& l) throw( RuntimeException, std::exception )
    4428             : {
    4429           0 :     m_aActionListeners.removeInterface( l );
    4430           0 : }
    4431             : 
    4432             : 
    4433           0 : void SAL_CALL FmXComboBoxCell::addItem( const OUString& _Item, sal_Int16 _Pos ) throw( RuntimeException, std::exception )
    4434             : {
    4435           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4436           0 :     if ( m_pComboBox )
    4437           0 :         m_pComboBox->InsertEntry( _Item, _Pos );
    4438           0 : }
    4439             : 
    4440             : 
    4441           0 : void SAL_CALL FmXComboBoxCell::addItems( const Sequence< OUString >& _Items, sal_Int16 _Pos ) throw( RuntimeException, std::exception )
    4442             : {
    4443           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4444           0 :     if ( m_pComboBox )
    4445             :     {
    4446           0 :         sal_uInt16 nP = _Pos;
    4447           0 :         for ( sal_uInt16 n = 0; n < _Items.getLength(); n++ )
    4448             :         {
    4449           0 :             m_pComboBox->InsertEntry( _Items.getConstArray()[n], nP );
    4450           0 :             if ( _Pos != -1 )
    4451           0 :                 nP++;
    4452             :         }
    4453           0 :     }
    4454           0 : }
    4455             : 
    4456             : 
    4457           0 : void SAL_CALL FmXComboBoxCell::removeItems( sal_Int16 _Pos, sal_Int16 _Count ) throw( RuntimeException, std::exception )
    4458             : {
    4459           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4460           0 :     if ( m_pComboBox )
    4461             :     {
    4462           0 :         for ( sal_uInt16 n = _Count; n; )
    4463           0 :             m_pComboBox->RemoveEntryAt( _Pos + (--n) );
    4464           0 :     }
    4465           0 : }
    4466             : 
    4467             : 
    4468           0 : sal_Int16 SAL_CALL FmXComboBoxCell::getItemCount() throw( RuntimeException, std::exception )
    4469             : {
    4470           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4471           0 :     return m_pComboBox ? m_pComboBox->GetEntryCount() : 0;
    4472             : }
    4473             : 
    4474             : 
    4475           0 : OUString SAL_CALL FmXComboBoxCell::getItem( sal_Int16 _Pos ) throw( RuntimeException, std::exception )
    4476             : {
    4477           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4478           0 :     return m_pComboBox ? OUString(m_pComboBox->GetEntry(_Pos)) : OUString();
    4479             : }
    4480             : 
    4481           0 : Sequence< OUString > SAL_CALL FmXComboBoxCell::getItems() throw( RuntimeException, std::exception )
    4482             : {
    4483           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4484             : 
    4485           0 :     Sequence< OUString > aItems;
    4486           0 :     if ( m_pComboBox )
    4487             :     {
    4488           0 :         sal_uInt16 nEntries = m_pComboBox->GetEntryCount();
    4489           0 :         aItems.realloc( nEntries );
    4490           0 :         OUString* pItem = aItems.getArray();
    4491           0 :         for ( sal_uInt16 n=0; n<nEntries; ++n, ++pItem )
    4492           0 :             *pItem = m_pComboBox->GetEntry( n );
    4493             :     }
    4494           0 :     return aItems;
    4495             : }
    4496             : 
    4497             : 
    4498           0 : sal_Int16 SAL_CALL FmXComboBoxCell::getDropDownLineCount() throw( RuntimeException, std::exception )
    4499             : {
    4500           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4501             : 
    4502           0 :     sal_Int16 nLines = 0;
    4503           0 :     if ( m_pComboBox )
    4504           0 :         nLines = m_pComboBox->GetDropDownLineCount();
    4505             : 
    4506           0 :     return nLines;
    4507             : }
    4508             : 
    4509             : 
    4510           0 : void SAL_CALL FmXComboBoxCell::setDropDownLineCount(sal_Int16 nLines) throw( RuntimeException, std::exception )
    4511             : {
    4512           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4513           0 :     if ( m_pComboBox )
    4514           0 :         m_pComboBox->SetDropDownLineCount( nLines );
    4515           0 : }
    4516             : 
    4517             : 
    4518           0 : void FmXComboBoxCell::onWindowEvent( const sal_uIntPtr _nEventId, const vcl::Window& _rWindow, const void* _pEventData )
    4519             : {
    4520             : 
    4521           0 :     switch ( _nEventId )
    4522             :     {
    4523             :     case VCLEVENT_COMBOBOX_SELECT:
    4524             :     {
    4525           0 :         awt::ItemEvent aEvent;
    4526           0 :         aEvent.Source = *this;
    4527           0 :         aEvent.Highlighted = sal_False;
    4528             : 
    4529             :         // Bei Mehrfachselektion 0xFFFF, sonst die ID
    4530           0 :         aEvent.Selected =   ( m_pComboBox->GetSelectEntryCount() == 1 )
    4531           0 :                         ?   m_pComboBox->GetSelectEntryPos()
    4532           0 :                         :   0xFFFF;
    4533           0 :         m_aItemListeners.notifyEach( &awt::XItemListener::itemStateChanged, aEvent );
    4534             :     }
    4535           0 :     break;
    4536             : 
    4537             :     default:
    4538           0 :         FmXTextCell::onWindowEvent( _nEventId, _rWindow, _pEventData );
    4539           0 :         break;
    4540             :     }
    4541           0 : }
    4542             : 
    4543           2 : TYPEINIT1(FmXFilterCell, FmXGridCell);
    4544             : 
    4545           0 : FmXFilterCell::FmXFilterCell(DbGridColumn* pColumn, DbCellControl* pControl )
    4546             :               :FmXGridCell( pColumn, pControl )
    4547           0 :               ,m_aTextListeners(m_aMutex)
    4548             : {
    4549             : 
    4550             :     DBG_ASSERT( m_pCellControl->ISA( DbFilterField ), "FmXFilterCell::FmXFilterCell: invalid cell control!" );
    4551           0 :     static_cast< DbFilterField* >( m_pCellControl )->SetCommitHdl( LINK( this, FmXFilterCell, OnCommit ) );
    4552           0 : }
    4553             : 
    4554             : 
    4555           0 : FmXFilterCell::~FmXFilterCell()
    4556             : {
    4557           0 :     if (!OComponentHelper::rBHelper.bDisposed)
    4558             :     {
    4559           0 :         acquire();
    4560           0 :         dispose();
    4561             :     }
    4562             : 
    4563           0 : }
    4564             : 
    4565             : // XUnoTunnel
    4566             : 
    4567           0 : sal_Int64 SAL_CALL FmXFilterCell::getSomething( const Sequence< sal_Int8 >& _rIdentifier ) throw(RuntimeException, std::exception)
    4568             : {
    4569           0 :     sal_Int64 nReturn(0);
    4570             : 
    4571           0 :     if  (   (_rIdentifier.getLength() == 16)
    4572           0 :         &&  (0 == memcmp( getUnoTunnelId().getConstArray(), _rIdentifier.getConstArray(), 16 ))
    4573             :         )
    4574             :     {
    4575           0 :         nReturn = reinterpret_cast<sal_Int64>(this);
    4576             :     }
    4577             : 
    4578           0 :     return nReturn;
    4579             : }
    4580             : 
    4581             : namespace
    4582             : {
    4583             :     class theFmXFilterCellUnoTunnelId : public rtl::Static< UnoTunnelIdInit, theFmXFilterCellUnoTunnelId > {};
    4584             : }
    4585             : 
    4586           0 : const Sequence<sal_Int8>& FmXFilterCell::getUnoTunnelId()
    4587             : {
    4588           0 :     return theFmXFilterCellUnoTunnelId::get().getSeq();
    4589             : }
    4590             : 
    4591             : 
    4592           0 : void FmXFilterCell::PaintCell( OutputDevice& rDev, const Rectangle& rRect )
    4593             : {
    4594           0 :     static_cast< DbFilterField* >( m_pCellControl )->PaintCell( rDev, rRect );
    4595           0 : }
    4596             : 
    4597             : // OComponentHelper
    4598             : 
    4599           0 : void FmXFilterCell::disposing()
    4600             : {
    4601           0 :     ::com::sun::star::lang::EventObject aEvt(*this);
    4602           0 :     m_aTextListeners.disposeAndClear(aEvt);
    4603             : 
    4604           0 :     static_cast<DbFilterField*>(m_pCellControl)->SetCommitHdl(Link());
    4605             : 
    4606           0 :     FmXGridCell::disposing();
    4607           0 : }
    4608             : 
    4609             : 
    4610           0 : Any SAL_CALL FmXFilterCell::queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(RuntimeException, std::exception)
    4611             : {
    4612           0 :     Any aReturn = FmXGridCell::queryAggregation(_rType);
    4613             : 
    4614           0 :     if ( !aReturn.hasValue() )
    4615           0 :         aReturn = FmXFilterCell_Base::queryInterface( _rType );
    4616             : 
    4617           0 :     return aReturn;
    4618             : }
    4619             : 
    4620             : 
    4621           0 : Sequence< ::com::sun::star::uno::Type > SAL_CALL FmXFilterCell::getTypes(  ) throw(RuntimeException, std::exception)
    4622             : {
    4623             :     return ::comphelper::concatSequences(
    4624             :         FmXGridCell::getTypes(),
    4625             :         FmXFilterCell_Base::getTypes()
    4626           0 :     );
    4627             : }
    4628             : 
    4629             : 
    4630           0 : IMPLEMENT_GET_IMPLEMENTATION_ID( FmXFilterCell )
    4631             : 
    4632             : // ::com::sun::star::awt::XTextComponent
    4633             : 
    4634           0 : void SAL_CALL FmXFilterCell::addTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException, std::exception )
    4635             : {
    4636           0 :     m_aTextListeners.addInterface( l );
    4637           0 : }
    4638             : 
    4639             : 
    4640           0 : void SAL_CALL FmXFilterCell::removeTextListener(const Reference< ::com::sun::star::awt::XTextListener >& l) throw( RuntimeException, std::exception )
    4641             : {
    4642           0 :     m_aTextListeners.removeInterface( l );
    4643           0 : }
    4644             : 
    4645             : 
    4646           0 : void SAL_CALL FmXFilterCell::setText( const OUString& aText ) throw( RuntimeException, std::exception )
    4647             : {
    4648           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4649           0 :     static_cast<DbFilterField*>(m_pCellControl)->SetText(aText);
    4650           0 : }
    4651             : 
    4652             : 
    4653           0 : void SAL_CALL FmXFilterCell::insertText( const ::com::sun::star::awt::Selection& /*rSel*/, const OUString& /*aText*/ ) throw( RuntimeException, std::exception )
    4654             : {
    4655           0 : }
    4656             : 
    4657             : 
    4658           0 : OUString SAL_CALL FmXFilterCell::getText() throw( RuntimeException, std::exception )
    4659             : {
    4660           0 :     ::osl::MutexGuard aGuard( m_aMutex );
    4661           0 :     return static_cast<DbFilterField*>(m_pCellControl)->GetText();
    4662             : }
    4663             : 
    4664             : 
    4665           0 : OUString SAL_CALL FmXFilterCell::getSelectedText( void ) throw( RuntimeException, std::exception )
    4666             : {
    4667           0 :     return getText();
    4668             : }
    4669             : 
    4670             : 
    4671           0 : void SAL_CALL FmXFilterCell::setSelection( const ::com::sun::star::awt::Selection& /*aSelection*/ ) throw( RuntimeException, std::exception )
    4672             : {
    4673           0 : }
    4674             : 
    4675             : 
    4676           0 : ::com::sun::star::awt::Selection SAL_CALL FmXFilterCell::getSelection( void ) throw( RuntimeException, std::exception )
    4677             : {
    4678           0 :     return ::com::sun::star::awt::Selection();
    4679             : }
    4680             : 
    4681             : 
    4682           0 : sal_Bool SAL_CALL FmXFilterCell::isEditable( void ) throw( RuntimeException, std::exception )
    4683             : {
    4684           0 :     return sal_True;
    4685             : }
    4686             : 
    4687             : 
    4688           0 : void SAL_CALL FmXFilterCell::setEditable( sal_Bool /*bEditable*/ ) throw( RuntimeException, std::exception )
    4689             : {
    4690           0 : }
    4691             : 
    4692             : 
    4693           0 : sal_Int16 SAL_CALL FmXFilterCell::getMaxTextLen() throw( RuntimeException, std::exception )
    4694             : {
    4695           0 :     return 0;
    4696             : }
    4697             : 
    4698             : 
    4699           0 : void SAL_CALL FmXFilterCell::setMaxTextLen( sal_Int16 /*nLen*/ ) throw( RuntimeException, std::exception )
    4700             : {
    4701           0 : }
    4702             : 
    4703             : 
    4704           0 : IMPL_LINK_NOARG(FmXFilterCell, OnCommit)
    4705             : {
    4706           0 :     ::cppu::OInterfaceIteratorHelper aIt( m_aTextListeners );
    4707           0 :     ::com::sun::star::awt::TextEvent aEvt;
    4708           0 :     aEvt.Source = *this;
    4709           0 :     while( aIt.hasMoreElements() )
    4710           0 :         static_cast< ::com::sun::star::awt::XTextListener *>(aIt.next())->textChanged( aEvt );
    4711           0 :     return 1;
    4712         651 : }
    4713             : 
    4714             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10