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