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

Generated by: LCOV version 1.11