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