xref: /trunk/main/svx/source/inc/gridcell.hxx (revision cdf0e10c4e3984b49a9502b011690b615761d4a3)
1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 #ifndef _SVX_GRIDCELL_HXX
29 #define _SVX_GRIDCELL_HXX
30 
31 #include <svx/gridctrl.hxx>
32 
33 #include "sqlparserclient.hxx"
34 #include "typeconversionclient.hxx"
35 
36 /** === begin UNO includes === **/
37 #include <com/sun/star/sdb/XColumn.hpp>
38 #include <com/sun/star/form/XBoundControl.hpp>
39 #include <com/sun/star/awt/XTextComponent.hpp>
40 #include <com/sun/star/awt/XListBox.hpp>
41 #include <com/sun/star/awt/XComboBox.hpp>
42 #include <com/sun/star/awt/TextAlign.hpp>
43 #include <com/sun/star/awt/XControlModel.hpp>
44 #include <com/sun/star/awt/XControl.hpp>
45 #include <com/sun/star/awt/XCheckBox.hpp>
46 #include <com/sun/star/awt/XButton.hpp>
47 #include <com/sun/star/beans/XFastPropertySet.hpp>
48 #include <com/sun/star/lang/XUnoTunnel.hpp>
49 #include <com/sun/star/form/XChangeBroadcaster.hpp>
50 #include <com/sun/star/awt/XWindow.hpp>
51 /** === end UNO includes === **/
52 
53 #include <comphelper/propmultiplex.hxx>
54 #include <comphelper/componentcontext.hxx>
55 #include <cppuhelper/component.hxx>
56 #include <cppuhelper/implbase1.hxx>
57 #include <cppuhelper/implbase2.hxx>
58 #include <tools/diagnose_ex.h>
59 #include <tools/rtti.hxx>
60 
61 class DbCellControl;
62 class Edit;
63 class FmXGridCell;
64 
65 //==================================================================
66 // FmMutexHelper
67 //==================================================================
68 class FmMutexHelper
69 {
70 protected:
71     ::osl::Mutex    m_aMutex;
72 };
73 
74 //==================================================================
75 // DbGridColumn, Spaltenbeschreibung
76 //==================================================================
77 class DbGridColumn
78 {
79     friend class DbGridControl;
80 
81     ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >       m_xModel;
82     ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >       m_xField;       // Verbindung zum Datenbankfeld
83     ::svt::CellControllerRef m_xController; // Struktur zum Verwalten der Controls fuer eine Spalte
84                                         // diese wird von der DbBrowseBox auf die jeweiligen Zellen
85                                         // einer Spalte positioniert
86     FmXGridCell*                m_pCell;
87 
88 protected:
89     DbGridControl&      m_rParent;
90 
91 private:
92     sal_Int32               m_nLastVisibleWidth;    // nur gueltig, wenn m_bHidden == sal_True
93     sal_Int32               m_nFormatKey;
94     sal_Int16               m_nFieldType;
95     sal_Int16               m_nTypeId;
96     sal_uInt16              m_nId;
97     sal_Int16               m_nFieldPos;
98     sal_Int16               m_nAlign;                       // wird mit TXT_ALIGN_LEFT .... angegeben
99     sal_Bool                m_bReadOnly : 1;
100     sal_Bool                m_bAutoValue : 1;
101     sal_Bool                m_bInSave : 1;
102     sal_Bool                m_bNumeric : 1;
103     sal_Bool                m_bObject : 1;  // Verweist die Column auf ein Object Datentyp?
104     sal_Bool                m_bHidden : 1;
105     sal_Bool                m_bLocked : 1;
106     sal_Bool                m_bDateTime : 1;
107 
108     static ::svt::CellControllerRef s_xEmptyController;
109         // used by locked columns
110 public:
111     DbGridColumn(sal_uInt16 _nId, DbGridControl& rParent)
112         :m_pCell(NULL)
113         ,m_rParent(rParent)
114         ,m_nLastVisibleWidth(-1)
115         ,m_nFormatKey(0)
116         ,m_nFieldType(0)
117         ,m_nTypeId(0)
118         ,m_nId(_nId)
119         ,m_nFieldPos(-1)
120         ,m_nAlign(::com::sun::star::awt::TextAlign::LEFT)
121         ,m_bReadOnly(sal_False)
122         ,m_bAutoValue(sal_False)
123         ,m_bInSave(sal_False)
124         ,m_bNumeric(sal_False)
125         ,m_bObject(sal_False)
126         ,m_bHidden(sal_False)
127         ,m_bLocked(sal_False)
128         ,m_bDateTime(sal_False)
129     {
130     }
131 
132     ~DbGridColumn();
133 
134     const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& getModel() const { return m_xModel; }
135     void  setModel(::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  _xModel);
136 
137 
138     sal_uInt16  GetId() const {return m_nId;}
139     sal_Bool    IsReadOnly() const {return m_bReadOnly;}
140     sal_Bool    IsAutoValue() const {return m_bAutoValue;}
141     sal_Bool    IsUpdating() const {return m_bInSave;}
142     sal_Int16   GetAlignment() const {return m_nAlign;}
143     sal_Int16   GetType() const {return m_nFieldType;}
144     sal_Int16   GetFieldPos() const {return m_nFieldPos; }
145     sal_Bool    IsNumeric() const {return m_bNumeric;}
146     sal_Bool    IsDateTime() const {return m_bDateTime;}
147     sal_Bool    IsObject() const {return m_bObject;}
148     sal_Bool    IsHidden() const {return m_bHidden;}
149     sal_Int32   GetKey() const {return m_nFormatKey;}
150     const   ::svt::CellControllerRef& GetController() const {return m_bLocked ? s_xEmptyController : m_xController;}
151     const   ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& GetField() const {return m_xField;}
152     DbGridControl& GetParent() const {return m_rParent;}
153     FmXGridCell* GetCell() const {return m_pCell;}
154 
155     ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >  GetCurrentFieldValue() const;
156 
157     //      Zeichnen eines Feldes an einer Position, ist ein ::com::sun::star::sdbcx::View gesetzt
158     //      uebernimmt dieser das Zeichnen, z.B. fuer CheckBoxen
159     void    Paint(OutputDevice& rDev,
160                   const Rectangle& rRect,
161                   const DbGridRow* pRow,
162                   const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
163 
164 
165     //      Inititialierung im alive mode
166     //      Ist kein ColumnController gesetzt, wird eine DefaultInitialisierung
167     //      vorgenommen
168     void    CreateControl(sal_Int32 _nFieldPos, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xField, sal_Int32 nTypeId);
169     void    UpdateControl()
170             {
171                 ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >  xField(m_xField);
172                 CreateControl(m_nFieldPos, xField, m_nTypeId);
173             }
174 
175     //      Editieren einer Zelle
176     void    UpdateFromField(const DbGridRow* pRow, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
177     sal_Bool    Commit();
178 
179     //      freigeben aller Daten, die fuer den AliveMode noetig sind
180     void    Clear();
181 
182     XubString  GetCellText(const DbGridRow* pRow, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter) const;
183     XubString  GetCellText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& xField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter) const;
184 
185     void    SetReadOnly(sal_Bool bRead){m_bReadOnly = bRead;}
186     void    SetObject(sal_Int16 nPos) {m_bObject = m_bReadOnly = sal_True; m_nFieldPos = nPos;}
187 
188     void    ImplInitWindow( Window& rParent, const InitWindowFacet _eInitWhat );
189 
190     // Properties, die auf den ::com::sun::star::frame::Controller durchschlagen koennen
191     sal_Int16   SetAlignment(sal_Int16 _nAlign);
192         // if _nAlign is -1, the alignment is calculated from the type of the field we are bound to
193         // the value really set is returned
194     sal_Int16   SetAlignmentFromModel(sal_Int16 nStandardAlign);
195         // set the alignment according to the "Align"-property of m_xModel, use the given standard
196         // alignment if the property if void, return the really set alignment
197 
198     // column locking
199     sal_Bool    isLocked() const { return m_bLocked; }
200     void    setLock(sal_Bool _bLock);
201 
202 private:
203     /** attaches or detaches our cell object to the SctriptEventAttacherManager implemented
204         by our model's parent
205     */
206     void    impl_toggleScriptManager_nothrow( bool _bAttach );
207 };
208 
209 //==================================================================
210 // DbCellControl, liefert die Daten fuer einen CellController
211 // wird in der Regel nur f�r komplexe Controls wie z.B ComboBoxen
212 // benoetigt
213 //==================================================================
214 class DbCellControl
215         :public ::svxform::OTypeConversionClient
216         ,public ::svxform::OStaticDataAccessTools
217         ,public FmMutexHelper           // _before_ the listener, so the listener is to be destroyed first!
218         ,public ::comphelper::OPropertyChangeListener
219 {
220 private:
221     ::comphelper::OPropertyChangeMultiplexer*   m_pModelChangeBroadcaster;
222     ::comphelper::OPropertyChangeMultiplexer*   m_pFieldChangeBroadcaster;
223 
224 private:
225     sal_Bool                    m_bTransparent : 1;
226     sal_Bool                    m_bAlignedController : 1;
227     sal_Bool                    m_bAccessingValueProperty : 1;
228 
229     ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >
230                                 m_xCursor;
231 
232 protected:
233     DbGridColumn&               m_rColumn;
234     Window*                     m_pPainter;
235     Window*                     m_pWindow;
236 
237 protected:
238     // attribute access
239     const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& getCursor() const { return m_xCursor; }
240 
241     // control transparency
242     inline  sal_Bool    isTransparent( ) const { return m_bTransparent; }
243     inline  void        setTransparent( sal_Bool _bSet ) { m_bTransparent = _bSet; }
244 
245     // control alignment
246     inline  void        setAlignedController( sal_Bool _bAlign = sal_True ) { m_bAlignedController = _bAlign; }
247 
248 
249     /** determined whether or not the value property is locked
250     @see lockValueProperty
251     */
252     inline  sal_Bool    isValuePropertyLocked() const;
253 
254     /** locks the listening at the value property.
255         <p>This means that every subsequent change now done on the value property of the model ("Text", or "Value",
256         or whatever) is then ignored.<br/>
257         This base class uses this setting in <method>Commit</method>.</p>
258     @precond
259         Value locking can't be nested
260     @see unlockValueProperty
261     */
262     inline  void        lockValueProperty();
263     /** unlocks the listening at the value property
264     @see lockValueProperty
265     */
266     inline  void        unlockValueProperty();
267 
268 protected:
269     // adds the given property to the list of properties which we listen for
270     void    doPropertyListening( const ::rtl::OUString& _rPropertyName );
271 
272     // called whenever a property which affects field settings in general is called
273     // you should overwrite this method for every property you add yourself as listener to
274     // with doPropertyListening
275     virtual void    implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
276 
277     // called by _propertyChanged if a property which denotes the column value has changed
278     void    implValuePropertyChanged( );
279 
280 
281 public:
282     TYPEINFO();
283     DbCellControl(DbGridColumn& _rColumn, sal_Bool _bText = sal_True);
284     virtual ~DbCellControl();
285 
286 
287     Window& GetWindow() const
288     {
289         ENSURE_OR_THROW( m_pWindow, "no window" );
290         return *m_pWindow;
291     }
292 
293     // control alignment
294     inline  sal_Bool    isAlignedController() const { return m_bAlignedController; }
295             void        AlignControl(sal_Int16 nAlignment);
296 
297     void SetTextLineColor();
298     void SetTextLineColor(const Color& _rColor);
299 
300     // Initialisieren bevor ein Control angezeigt wird
301     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
302     virtual ::svt::CellControllerRef CreateController() const = 0;
303 
304     // Schreiben des Wertes in das Model
305     sal_Bool Commit();
306 
307     // Formatting the field data to output text
308     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL) = 0;
309 
310     virtual void Update(){}
311     // Refresh the control by the field data
312     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter) = 0;
313 
314     // Painten eines Zellinhalts im vorgegeben Rechteck
315     virtual void PaintFieldToCell( OutputDevice& rDev, const Rectangle& rRect, const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
316     virtual void PaintCell( OutputDevice& _rDev, const Rectangle& _rRect );
317 
318     void  ImplInitWindow( Window& rParent, const InitWindowFacet _eInitWhat );
319 
320     double GetValue(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter) const;
321 
322 protected:
323     void    invalidatedController();
324 
325     /** commits the content of the control (e.g. the text of an edit field) into the column model
326         (e.g. the "Text" property of the model).
327         <p>To be overwritten in derived classes.</p>
328     @see updateFromModel
329     */
330     virtual sal_Bool commitControl( ) = 0;
331 
332     /** updates the current content of the control (e.g. the text of an edit field) from the column model
333         (e.g. the "Text" property of the model).
334         <p>To be overwritten in derived classes.</p>
335     @precond
336         NULL != _rxModel
337     @precond
338         NULL != m_pWindow
339 
340     @see commitControl
341     */
342     virtual void    updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel ) = 0;
343 
344 protected:
345 // OPropertyChangeListener
346     virtual void _propertyChanged(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException);
347 
348 private:
349     void implDoPropertyListening( const ::rtl::OUString& _rPropertyName, sal_Bool _bWarnIfNotExistent = sal_True );
350 
351     /// updates the "readonly" setting on m_pWindow, according to the respective property value in the given model
352     void implAdjustReadOnly( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel,bool i_bReadOnly );
353 
354     /// updates the "enabled" setting on m_pWindow, according to the respective property value in the given model
355     void implAdjustEnabled( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
356 };
357 
358 //==================================================================
359 //------------------------------------------------------------------
360 inline  sal_Bool    DbCellControl::isValuePropertyLocked() const
361 {
362     return m_bAccessingValueProperty;
363 }
364 
365 //------------------------------------------------------------------
366 inline  void        DbCellControl::lockValueProperty()
367 {
368     OSL_ENSURE( !isValuePropertyLocked(), "DbCellControl::lockValueProperty: not to be nested!" );
369     m_bAccessingValueProperty = sal_True;
370 }
371 
372 //------------------------------------------------------------------
373 inline  void        DbCellControl::unlockValueProperty()
374 {
375     OSL_ENSURE( isValuePropertyLocked(), "DbCellControl::lockValueProperty: not locked so far!" );
376     m_bAccessingValueProperty = sal_False;
377 }
378 
379 //==================================================================
380 /** a field which is bound to a column which supports the MaxTextLen property
381 */
382 class DbLimitedLengthField : public DbCellControl
383 {
384 public:
385     TYPEINFO();
386 
387 protected:
388     DbLimitedLengthField( DbGridColumn& _rColumn );
389 
390 protected:
391     // DbCellControl
392     virtual void implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
393 
394 protected:
395     inline void implSetMaxTextLen( sal_Int16 _nMaxLen )
396     {
397         implSetEffectiveMaxTextLen( _nMaxLen ? _nMaxLen : EDIT_NOLIMIT );
398     }
399     virtual void implSetEffectiveMaxTextLen( sal_Int16 _nMaxLen );
400 };
401 
402 //==================================================================
403 class DbTextField : public DbLimitedLengthField
404 {
405     ::svt::IEditImplementation* m_pEdit;
406     ::svt::IEditImplementation* m_pPainterImplementation;
407     sal_Int16                   m_nKeyType;
408     sal_Bool                    m_bIsSimpleEdit;
409 
410 protected:
411     ~DbTextField( );
412 
413 public:
414     TYPEINFO();
415     DbTextField(DbGridColumn& _rColumn);
416 
417     ::svt::IEditImplementation* GetEditImplementation() { return m_pEdit; }
418     sal_Bool                    IsSimpleEdit() const { return m_bIsSimpleEdit; }
419 
420     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
421     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
422     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
423     virtual ::svt::CellControllerRef CreateController() const;
424     virtual void PaintFieldToCell( OutputDevice& _rDev, const Rectangle& _rRect,
425                         const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField,
426                         const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& _rxFormatter );
427 
428 protected:
429     // DbCellControl
430     virtual sal_Bool    commitControl( );
431     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
432     // DbLimitedLengthField
433     virtual void        implSetEffectiveMaxTextLen( sal_Int16 _nMaxLen );
434 };
435 
436 //==================================================================
437 class DbFormattedField : public DbLimitedLengthField
438 {
439 protected:
440     ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatsSupplier >  m_xSupplier;
441     sal_Int16                       m_nKeyType;
442 
443 
444 public:
445     TYPEINFO();
446     DbFormattedField(DbGridColumn& _rColumn);
447     virtual ~DbFormattedField();
448 
449 
450     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
451     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
452     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
453     virtual ::svt::CellControllerRef CreateController() const;
454 
455 protected:
456     // DbCellControl
457     virtual sal_Bool    commitControl( );
458     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
459 
460     // OPropertyChangeListener
461     virtual void _propertyChanged(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException);
462 };
463 
464 //==================================================================
465 class DbCheckBox : public DbCellControl
466 {
467 public:
468     TYPEINFO();
469     DbCheckBox(DbGridColumn& _rColumn);
470 
471     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
472     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
473     virtual ::svt::CellControllerRef CreateController() const;
474     virtual void PaintFieldToCell(OutputDevice& rDev, const Rectangle& rRect,
475                           const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField,
476                           const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
477     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
478 
479 protected:
480     // DbCellControl
481     virtual sal_Bool    commitControl( );
482     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
483 };
484 
485 //==================================================================
486 class DbComboBox : public DbCellControl
487 {
488     sal_Int16         m_nKeyType;
489 
490 public:
491     TYPEINFO();
492     DbComboBox(DbGridColumn& _rColumn);
493 
494     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
495     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
496     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
497     virtual ::svt::CellControllerRef CreateController() const;
498 
499     void SetList(const ::com::sun::star::uno::Any& rItems);
500 
501 protected:
502     // DbCellControl
503     virtual sal_Bool    commitControl( );
504     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
505 
506     virtual void        implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
507 
508     // OPropertyChangeListener
509     virtual void _propertyChanged(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException);
510 };
511 
512 //==================================================================
513 class DbListBox     :public DbCellControl
514 {
515     sal_Bool              m_bBound  : 1;
516     ::com::sun::star::uno::Sequence< ::rtl::OUString > m_aValueList;
517 
518 public:
519     TYPEINFO();
520     DbListBox(DbGridColumn& _rColumn);
521 
522     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
523     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
524     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
525     virtual ::svt::CellControllerRef CreateController() const;
526 
527     void SetList(const ::com::sun::star::uno::Any& rItems);
528 
529 protected:
530     // DbCellControl
531     virtual sal_Bool    commitControl( );
532     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
533 
534     virtual void        implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
535 
536     // OPropertyChangeListener
537     virtual void _propertyChanged(const ::com::sun::star::beans::PropertyChangeEvent& evt) throw(::com::sun::star::uno::RuntimeException);
538 };
539 
540 //==================================================================
541 class DbPatternField : public DbCellControl
542 {
543 public:
544     TYPEINFO();
545     DbPatternField( DbGridColumn& _rColumn, const ::comphelper::ComponentContext& _rContext );
546     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
547     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
548     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
549     virtual ::svt::CellControllerRef CreateController() const;
550 
551 protected:
552     /// DbCellControl
553     virtual sal_Bool    commitControl( );
554     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
555 
556     virtual void        implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
557 
558 private:
559     String  impl_formatText( const String& _rText );
560 
561 private:
562     ::std::auto_ptr< ::dbtools::FormattedColumnValue >  m_pValueFormatter;
563     ::std::auto_ptr< ::dbtools::FormattedColumnValue >  m_pPaintFormatter;
564     ::comphelper::ComponentContext                      m_aContext;
565 };
566 
567 //==================================================================
568 class DbSpinField : public DbCellControl
569 {
570 private:
571     sal_Int16   m_nStandardAlign;
572 
573 public:
574     TYPEINFO();
575 
576 protected:
577     DbSpinField( DbGridColumn& _rColumn, sal_Int16 _nStandardAlign = com::sun::star::awt::TextAlign::RIGHT );
578 
579 public:
580     virtual void                        Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& _rxCursor );
581     virtual ::svt::CellControllerRef    CreateController() const;
582 
583 protected:
584     virtual SpinField*  createField(
585                             Window* _pParent,
586                             WinBits _nFieldStyle,
587                             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel
588                         ) = 0;
589 };
590 
591 //==================================================================
592 class DbDateField : public DbSpinField
593 {
594 public:
595     TYPEINFO();
596     DbDateField(DbGridColumn& _rColumn);
597     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
598     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
599 
600 protected:
601     // DbCellControl
602     virtual sal_Bool    commitControl( );
603     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
604 
605     // DbSpinField
606     virtual SpinField*  createField(
607                             Window* _pParent,
608                             WinBits _nFieldStyle,
609                             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel
610                         );
611 
612     /// initializes everything which relates to the properties describing the numeric behaviour
613     virtual void    implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
614 };
615 
616 //==================================================================
617 class DbTimeField : public DbSpinField
618 {
619 public:
620     TYPEINFO();
621     DbTimeField(DbGridColumn& _rColumn);
622     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
623     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
624 
625 protected:
626     // DbCellControl
627     virtual sal_Bool    commitControl( );
628     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
629 
630     // DbSpinField
631     virtual SpinField*  createField(
632                             Window* _pParent,
633                             WinBits _nFieldStyle,
634                             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel
635                         );
636 
637     /// initializes everything which relates to the properties describing the numeric behaviour
638     virtual void    implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
639 };
640 
641 //==================================================================
642 class DbCurrencyField : public DbSpinField
643 {
644     sal_Int16  m_nScale;
645 
646 public:
647     TYPEINFO();
648     DbCurrencyField(DbGridColumn& _rColumn);
649     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
650     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
651 
652     double GetCurrency(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter) const;
653 
654 protected:
655     // DbCellControl
656     virtual sal_Bool    commitControl( );
657     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
658 
659     // DbSpinField
660     virtual SpinField*  createField(
661                             Window* _pParent,
662                             WinBits _nFieldStyle,
663                             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel
664                         );
665 
666     /// initializes everything which relates to the properties describing the numeric behaviour
667     virtual void    implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
668 };
669 
670 //==================================================================
671 class DbNumericField : public DbSpinField
672 {
673 public:
674     TYPEINFO();
675     DbNumericField(DbGridColumn& _rColumn);
676     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
677     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
678 
679 protected:
680     // DbCellControl
681     virtual sal_Bool    commitControl( );
682     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
683 
684     // DbSpinField
685     virtual SpinField*  createField(
686                             Window* _pParent,
687                             WinBits _nFieldStyle,
688                             const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel
689                         );
690 
691     /// initializes everything which relates to the properties describing the numeric behaviour
692     void    implAdjustGenericFieldSetting( const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& _rxModel );
693 };
694 
695 //==================================================================
696 class DbFilterField
697         :public DbCellControl
698         ,public ::svxform::OSQLParserClient
699 {
700     ::com::sun::star::uno::Sequence< ::rtl::OUString >  m_aValueList;
701     XubString   m_aText;
702     Link    m_aCommitLink;
703     sal_Int16   m_nControlClass;
704     sal_Bool    m_bFilterList : 1;
705     sal_Bool    m_bFilterListFilled : 1;
706     sal_Bool    m_bBound : 1;
707 
708 public:
709     TYPEINFO();
710     DbFilterField(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,DbGridColumn& _rColumn);
711     virtual ~DbFilterField();
712 
713     virtual void Init( Window& rParent, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XRowSet >& xCursor );
714     virtual ::svt::CellControllerRef CreateController() const;
715     virtual void PaintCell(OutputDevice& rDev, const Rectangle& rRect);
716     virtual void Update();
717     virtual XubString GetFormatText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter, Color** ppColor = NULL);
718     virtual void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField, const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
719 
720     const XubString& GetText() const {return m_aText;}
721     void SetText(const XubString& rText);
722 
723     void SetCommitHdl( const Link& rLink ) { m_aCommitLink = rLink; }
724     const Link& GetCommitHdl() const { return m_aCommitLink; }
725 
726 protected:
727 
728     // DbCellControl
729     virtual sal_Bool    commitControl( );
730     virtual void        updateFromModel( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > _rxModel );
731 
732 protected:
733     void SetList(const ::com::sun::star::uno::Any& rItems, sal_Bool bComboBox);
734     void CreateControl(Window* pParent, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet >& xModel);
735     DECL_LINK( OnClick, void* );
736 };
737 
738 //==================================================================
739 // Base class providing the access to a grid cell
740 //==================================================================
741 typedef ::cppu::ImplHelper2 <   ::com::sun::star::awt::XControl
742                             ,   ::com::sun::star::form::XBoundControl
743                             >   FmXGridCell_Base;
744 typedef ::cppu::ImplHelper1 <   ::com::sun::star::awt::XWindow
745                             >   FmXGridCell_WindowBase;
746 class FmXGridCell   :public ::cppu::OComponentHelper
747                     ,public FmXGridCell_Base
748                     ,public FmXGridCell_WindowBase
749 {
750 protected:
751     ::osl::Mutex        m_aMutex;
752     DbGridColumn*       m_pColumn;
753     DbCellControl*      m_pCellControl;
754 
755 private:
756     ::cppu::OInterfaceContainerHelper   m_aWindowListeners;
757     ::cppu::OInterfaceContainerHelper   m_aFocusListeners;
758     ::cppu::OInterfaceContainerHelper   m_aKeyListeners;
759     ::cppu::OInterfaceContainerHelper   m_aMouseListeners;
760     ::cppu::OInterfaceContainerHelper   m_aMouseMotionListeners;
761 
762 protected:
763     virtual ~FmXGridCell();
764 
765 public:
766     TYPEINFO();
767     FmXGridCell( DbGridColumn* pColumn, DbCellControl* pControl );
768     void init();
769 
770     DECLARE_UNO3_AGG_DEFAULTS(FmXGridCell, OComponentHelper);
771     virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
772 
773     void SetTextLineColor();
774     void SetTextLineColor(const Color& _rColor);
775 
776 // XTypeProvider
777     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw (::com::sun::star::uno::RuntimeException);
778     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
779 
780 // OComponentHelper
781     virtual void SAL_CALL disposing();
782 
783 // ::com::sun::star::lang::XComponent
784     virtual void SAL_CALL dispose() throw(::com::sun::star::uno::RuntimeException){OComponentHelper::dispose();}
785     virtual void SAL_CALL addEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener)throw(::com::sun::star::uno::RuntimeException)       { OComponentHelper::addEventListener(aListener);}
786     virtual void SAL_CALL removeEventListener(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XEventListener >& aListener)throw(::com::sun::star::uno::RuntimeException)        { OComponentHelper::removeEventListener(aListener);}
787 
788 // ::com::sun::star::awt::XControl
789     virtual void SAL_CALL setContext(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >& /*Context*/) throw(::com::sun::star::uno::RuntimeException){}
790     virtual ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >  SAL_CALL getContext() throw(::com::sun::star::uno::RuntimeException);
791     virtual void SAL_CALL createPeer(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XToolkit >& /*Toolkit*/, const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer >& /*Parent*/) throw(::com::sun::star::uno::RuntimeException){}
792 
793     virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > SAL_CALL getPeer() throw (::com::sun::star::uno::RuntimeException) {return ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowPeer > ();}
794     virtual sal_Bool SAL_CALL setModel(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel >& /*Model*/) throw (::com::sun::star::uno::RuntimeException) {return sal_False;}
795     virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControlModel > SAL_CALL getModel() throw (::com::sun::star::uno::RuntimeException);
796     virtual ::com::sun::star::uno::Reference< ::com::sun::star::awt::XView > SAL_CALL getView() throw (::com::sun::star::uno::RuntimeException) {return ::com::sun::star::uno::Reference< ::com::sun::star::awt::XView > ();}
797     virtual void SAL_CALL setDesignMode(sal_Bool /*bOn*/) throw (::com::sun::star::uno::RuntimeException) {}
798     virtual sal_Bool SAL_CALL isDesignMode() throw (::com::sun::star::uno::RuntimeException) {return sal_False;}
799     virtual sal_Bool SAL_CALL isTransparent() throw (::com::sun::star::uno::RuntimeException) {return sal_False;}
800 
801 // ::com::sun::star::form::XBoundControl
802     virtual sal_Bool SAL_CALL getLock() throw(::com::sun::star::uno::RuntimeException);
803     virtual void SAL_CALL setLock(sal_Bool _bLock) throw(::com::sun::star::uno::RuntimeException);
804 
805     // XWindow
806     virtual void SAL_CALL setPosSize( ::sal_Int32 X, ::sal_Int32 Y, ::sal_Int32 Width, ::sal_Int32 Height, ::sal_Int16 Flags ) throw (::com::sun::star::uno::RuntimeException);
807     virtual ::com::sun::star::awt::Rectangle SAL_CALL getPosSize(  ) throw (::com::sun::star::uno::RuntimeException);
808     virtual void SAL_CALL setVisible( ::sal_Bool Visible ) throw (::com::sun::star::uno::RuntimeException);
809     virtual void SAL_CALL setEnable( ::sal_Bool Enable ) throw (::com::sun::star::uno::RuntimeException);
810     virtual void SAL_CALL setFocus(  ) throw (::com::sun::star::uno::RuntimeException);
811     virtual void SAL_CALL addWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
812     virtual void SAL_CALL removeWindowListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XWindowListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
813     virtual void SAL_CALL addFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
814     virtual void SAL_CALL removeFocusListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFocusListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
815     virtual void SAL_CALL addKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
816     virtual void SAL_CALL removeKeyListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XKeyListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
817     virtual void SAL_CALL addMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
818     virtual void SAL_CALL removeMouseListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
819     virtual void SAL_CALL addMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
820     virtual void SAL_CALL removeMouseMotionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XMouseMotionListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
821     virtual void SAL_CALL addPaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
822     virtual void SAL_CALL removePaintListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XPaintListener >& xListener ) throw (::com::sun::star::uno::RuntimeException);
823 
824     sal_Bool Commit() {return m_pCellControl->Commit();}
825     void ImplInitWindow( Window& rParent, const InitWindowFacet _eInitWhat )
826         { m_pCellControl->ImplInitWindow( rParent, _eInitWhat ); }
827 
828     sal_Bool isAlignedController() const { return m_pCellControl->isAlignedController(); }
829     void AlignControl(sal_Int16 nAlignment)
830         { m_pCellControl->AlignControl(nAlignment);}
831 
832 protected:
833     virtual Window* getEventWindow() const;
834     virtual void onWindowEvent( const sal_uLong _nEventId, const Window& _rWindow, const void* _pEventData );
835 
836     // default implementations call our focus listeners, don't forget to call them if you override this
837     virtual void onFocusGained( const ::com::sun::star::awt::FocusEvent& _rEvent );
838     virtual void onFocusLost( const ::com::sun::star::awt::FocusEvent& _rEvent );
839 
840 private:
841     DECL_LINK( OnWindowEvent, VclWindowEvent* );
842 };
843 
844 //==================================================================
845 class FmXDataCell : public FmXGridCell
846 {
847 public:
848     TYPEINFO();
849     FmXDataCell( DbGridColumn* pColumn, DbCellControl& _rControl )
850         :FmXGridCell( pColumn, &_rControl )
851     {
852     }
853 
854     virtual void PaintFieldToCell(OutputDevice& rDev,
855                const Rectangle& rRect,
856                const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& xField,
857                const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
858 
859     void UpdateFromField(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& xField,
860                          const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter)
861                 { m_pCellControl->UpdateFromField(xField, xFormatter); }
862 
863 protected:
864     void UpdateFromColumn();
865 };
866 
867 //==================================================================
868 class FmXTextCell : public FmXDataCell
869 {
870 protected:
871     /** determines whether the text of this cell can be painted directly, without
872         using the painter control
873 
874         If this is <TRUE/>, the <member>PaintCell</member> method will simply use the text as returned
875         by <member>GetText</member>, and draw it onto the device passed to <member>PaintFieldToCell</member>,
876         while respecting the current alignment settings.
877 
878         If this is <FALSE/>, the <member>PaintFieldToCell</member> request will be forwarded to the painter
879         control (<member>m_pPainter</member>). This is more expensive, but the only option
880         if your painting involves more that a simple DrawText.
881 
882         This member is <TRUE/> by default, and can be modified by derived classes.
883     */
884     sal_Bool    m_bFastPaint;
885 
886 public:
887     TYPEINFO();
888     FmXTextCell( DbGridColumn* pColumn, DbCellControl& _rControl );
889 
890     virtual void PaintFieldToCell(OutputDevice& rDev,
891                const Rectangle& rRect,
892                const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& xField,
893                const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter);
894 
895     XubString GetText(const ::com::sun::star::uno::Reference< ::com::sun::star::sdb::XColumn >& _rxField,
896                    const ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter >& xFormatter,
897                    Color** ppColor = NULL)
898             {return m_pCellControl->GetFormatText(_rxField, xFormatter, ppColor);}
899 };
900 
901 //==================================================================
902 typedef ::cppu::ImplHelper2 <   ::com::sun::star::awt::XTextComponent
903                             ,   ::com::sun::star::form::XChangeBroadcaster
904                             >   FmXEditCell_Base;
905 class FmXEditCell : public FmXTextCell,
906                     public FmXEditCell_Base
907 {
908 private:
909     ::rtl::OUString                     m_sValueOnEnter;
910 
911 protected:
912     ::cppu::OInterfaceContainerHelper   m_aTextListeners;
913     ::cppu::OInterfaceContainerHelper   m_aChangeListeners;
914     ::svt::IEditImplementation*         m_pEditImplementation;
915     bool                                m_bOwnEditImplementation;
916 
917     virtual ~FmXEditCell();
918 public:
919     FmXEditCell( DbGridColumn* pColumn, DbCellControl& _rControl );
920 
921     DECLARE_UNO3_AGG_DEFAULTS(FmXEditCell, FmXTextCell);
922     virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
923 
924 // XTypeProvider
925     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
926     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
927 
928 // OComponentHelper
929     virtual void SAL_CALL disposing();
930 
931 // ::com::sun::star::awt::XTextComponent
932     virtual void SAL_CALL addTextListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener >& l) throw(::com::sun::star::uno::RuntimeException);
933     virtual void SAL_CALL removeTextListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener >& l) throw(::com::sun::star::uno::RuntimeException);
934     virtual void SAL_CALL setText(const ::rtl::OUString& aText) throw(::com::sun::star::uno::RuntimeException);
935     virtual void SAL_CALL insertText(const ::com::sun::star::awt::Selection& Sel, const ::rtl::OUString& Text) throw(::com::sun::star::uno::RuntimeException);
936     virtual ::rtl::OUString SAL_CALL getText() throw(::com::sun::star::uno::RuntimeException);
937     virtual ::rtl::OUString SAL_CALL getSelectedText() throw(::com::sun::star::uno::RuntimeException);
938     virtual void SAL_CALL setSelection(const ::com::sun::star::awt::Selection& aSelection) throw(::com::sun::star::uno::RuntimeException);
939     virtual ::com::sun::star::awt::Selection SAL_CALL getSelection() throw(::com::sun::star::uno::RuntimeException);
940     virtual sal_Bool SAL_CALL isEditable() throw(::com::sun::star::uno::RuntimeException);
941     virtual void SAL_CALL setEditable(sal_Bool bEditable) throw(::com::sun::star::uno::RuntimeException);
942     virtual void SAL_CALL setMaxTextLen(sal_Int16 nLen) throw(::com::sun::star::uno::RuntimeException);
943     virtual sal_Int16 SAL_CALL getMaxTextLen() throw(::com::sun::star::uno::RuntimeException);
944 
945     // XChangeBroadcaster
946     virtual void SAL_CALL addChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XChangeListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
947     virtual void SAL_CALL removeChangeListener( const ::com::sun::star::uno::Reference< ::com::sun::star::form::XChangeListener >& aListener ) throw (::com::sun::star::uno::RuntimeException);
948 
949 protected:
950     virtual void onWindowEvent( const sal_uLong _nEventId, const Window& _rWindow, const void* _pEventData );
951 
952     virtual void onFocusGained( const ::com::sun::star::awt::FocusEvent& _rEvent );
953     virtual void onFocusLost( const ::com::sun::star::awt::FocusEvent& _rEvent );
954 
955 private:
956     void onTextChanged();
957 };
958 
959 //==================================================================
960 typedef ::cppu::ImplHelper2 <   ::com::sun::star::awt::XCheckBox
961                             ,   ::com::sun::star::awt::XButton
962                             >   FmXCheckBoxCell_Base;
963 class FmXCheckBoxCell : public FmXDataCell,
964                         public FmXCheckBoxCell_Base
965 {
966     ::cppu::OInterfaceContainerHelper   m_aItemListeners;
967     ::cppu::OInterfaceContainerHelper   m_aActionListeners;
968     ::rtl::OUString                     m_aActionCommand;
969     CheckBox*                           m_pBox;
970 
971 protected:
972     virtual ~FmXCheckBoxCell();
973 
974 public:
975     FmXCheckBoxCell( DbGridColumn* pColumn, DbCellControl& _rControl );
976 
977 // UNO
978     DECLARE_UNO3_AGG_DEFAULTS(FmXCheckBoxCell, FmXDataCell);
979     virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
980     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
981     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
982 
983 // OComponentHelper
984     virtual void SAL_CALL disposing();
985 
986 // ::com::sun::star::awt::XCheckBox
987     virtual void SAL_CALL addItemListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& l) throw(::com::sun::star::uno::RuntimeException);
988     virtual void SAL_CALL removeItemListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& l) throw(::com::sun::star::uno::RuntimeException);
989     virtual sal_Int16 SAL_CALL getState() throw(::com::sun::star::uno::RuntimeException);
990     virtual void SAL_CALL setState(sal_Int16 n) throw(::com::sun::star::uno::RuntimeException);
991     virtual void SAL_CALL setLabel(const ::rtl::OUString& Label) throw(::com::sun::star::uno::RuntimeException);
992     virtual void SAL_CALL enableTriState(sal_Bool b) throw(::com::sun::star::uno::RuntimeException);
993 
994     // XButton
995     virtual void SAL_CALL addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener >& l ) throw (::com::sun::star::uno::RuntimeException);
996     virtual void SAL_CALL removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener >& l ) throw (::com::sun::star::uno::RuntimeException);
997     //virtual void SAL_CALL setLabel( const ::rtl::OUString& Label ) throw (::com::sun::star::uno::RuntimeException);
998     virtual void SAL_CALL setActionCommand( const ::rtl::OUString& Command ) throw (::com::sun::star::uno::RuntimeException);
999 
1000 protected:
1001     virtual Window* getEventWindow() const;
1002     virtual void onWindowEvent( const sal_uLong _nEventId, const Window& _rWindow, const void* _pEventData );
1003 };
1004 
1005 //==================================================================
1006 typedef ::cppu::ImplHelper1 <   ::com::sun::star::awt::XListBox
1007                             >   FmXListBoxCell_Base;
1008 class FmXListBoxCell    :public FmXTextCell
1009                         ,public FmXListBoxCell_Base
1010 {
1011     ::cppu::OInterfaceContainerHelper   m_aItemListeners,
1012                                         m_aActionListeners;
1013     ListBox*                            m_pBox;
1014 
1015 protected:
1016     virtual ~FmXListBoxCell();
1017 
1018 public:
1019     FmXListBoxCell( DbGridColumn* pColumn, DbCellControl& _rControl );
1020 
1021     DECLARE_UNO3_AGG_DEFAULTS(FmXListBoxCell, FmXTextCell);
1022     virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
1023     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
1024     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
1025 
1026 // OComponentHelper
1027     virtual void SAL_CALL disposing();
1028 
1029 // ::com::sun::star::awt::XListBox
1030     virtual void SAL_CALL addItemListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& l) throw(::com::sun::star::uno::RuntimeException);
1031     virtual void SAL_CALL removeItemListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& l) throw(::com::sun::star::uno::RuntimeException);
1032     virtual void SAL_CALL addActionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener >& l) throw(::com::sun::star::uno::RuntimeException);
1033     virtual void SAL_CALL removeActionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener >& l) throw(::com::sun::star::uno::RuntimeException);
1034     virtual void SAL_CALL addItem(const ::rtl::OUString& aItem, sal_Int16 nPos) throw(::com::sun::star::uno::RuntimeException);
1035     virtual void SAL_CALL addItems(const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aItems, sal_Int16 nPos) throw(::com::sun::star::uno::RuntimeException);
1036     virtual void SAL_CALL removeItems(sal_Int16 nPos, sal_Int16 nCount) throw(::com::sun::star::uno::RuntimeException);
1037     virtual sal_Int16 SAL_CALL getItemCount() throw(::com::sun::star::uno::RuntimeException);
1038     virtual ::rtl::OUString SAL_CALL getItem(sal_Int16 nPos) throw(::com::sun::star::uno::RuntimeException);
1039     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getItems() throw(::com::sun::star::uno::RuntimeException);
1040     virtual sal_Int16 SAL_CALL getSelectedItemPos() throw(::com::sun::star::uno::RuntimeException);
1041     virtual ::com::sun::star::uno::Sequence< sal_Int16 > SAL_CALL getSelectedItemsPos() throw(::com::sun::star::uno::RuntimeException);
1042     virtual ::rtl::OUString SAL_CALL getSelectedItem() throw(::com::sun::star::uno::RuntimeException);
1043     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getSelectedItems() throw(::com::sun::star::uno::RuntimeException);
1044     virtual void SAL_CALL SAL_CALL selectItemPos(sal_Int16 nPos, sal_Bool bSelect) throw(::com::sun::star::uno::RuntimeException);
1045     virtual void SAL_CALL SAL_CALL selectItemsPos(const ::com::sun::star::uno::Sequence< sal_Int16 >& aPositions, sal_Bool bSelect) throw(::com::sun::star::uno::RuntimeException);
1046     virtual void SAL_CALL SAL_CALL selectItem(const ::rtl::OUString& aItem, sal_Bool bSelect) throw(::com::sun::star::uno::RuntimeException);
1047     virtual sal_Bool SAL_CALL isMutipleMode() throw(::com::sun::star::uno::RuntimeException);
1048     virtual void SAL_CALL SAL_CALL setMultipleMode(sal_Bool bMulti) throw(::com::sun::star::uno::RuntimeException);
1049     virtual sal_Int16 SAL_CALL getDropDownLineCount() throw(::com::sun::star::uno::RuntimeException);
1050     virtual void SAL_CALL SAL_CALL setDropDownLineCount(sal_Int16 nLines) throw(::com::sun::star::uno::RuntimeException);
1051     virtual void SAL_CALL SAL_CALL makeVisible(sal_Int16 nEntry) throw(::com::sun::star::uno::RuntimeException);
1052 
1053 protected:
1054     virtual void onWindowEvent( const sal_uLong _nEventId, const Window& _rWindow, const void* _pEventData );
1055 
1056     DECL_LINK( OnDoubleClick, void* );
1057 };
1058 
1059 //==================================================================
1060 typedef ::cppu::ImplHelper1 <   ::com::sun::star::awt::XComboBox
1061                             >   FmXComboBoxCell_Base;
1062 class FmXComboBoxCell   :public FmXTextCell
1063                         ,public FmXComboBoxCell_Base
1064 {
1065 private:
1066     ::cppu::OInterfaceContainerHelper   m_aItemListeners,
1067                                         m_aActionListeners;
1068     ComboBox*                           m_pComboBox;
1069 
1070 protected:
1071     virtual ~FmXComboBoxCell();
1072 
1073 public:
1074     FmXComboBoxCell( DbGridColumn* pColumn, DbCellControl& _rControl );
1075 
1076     DECLARE_UNO3_AGG_DEFAULTS(FmXListBoxCell, FmXTextCell);
1077     virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
1078     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
1079     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
1080 
1081     // OComponentHelper
1082     virtual void SAL_CALL disposing();
1083 
1084     // XComboBox
1085     virtual void SAL_CALL addItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& _Listener ) throw (::com::sun::star::uno::RuntimeException);
1086     virtual void SAL_CALL removeItemListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XItemListener >& _Listener ) throw (::com::sun::star::uno::RuntimeException);
1087     virtual void SAL_CALL addActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener >& _Listener ) throw (::com::sun::star::uno::RuntimeException);
1088     virtual void SAL_CALL removeActionListener( const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XActionListener >& _Listener ) throw (::com::sun::star::uno::RuntimeException);
1089     virtual void SAL_CALL addItem( const ::rtl::OUString& _Item, ::sal_Int16 _Pos ) throw (::com::sun::star::uno::RuntimeException);
1090     virtual void SAL_CALL addItems( const ::com::sun::star::uno::Sequence< ::rtl::OUString >& _Items, ::sal_Int16 _Pos ) throw (::com::sun::star::uno::RuntimeException);
1091     virtual void SAL_CALL removeItems( ::sal_Int16 nPos, ::sal_Int16 nCount ) throw (::com::sun::star::uno::RuntimeException);
1092     virtual ::sal_Int16 SAL_CALL getItemCount(  ) throw (::com::sun::star::uno::RuntimeException);
1093     virtual ::rtl::OUString SAL_CALL getItem( ::sal_Int16 _Pos ) throw (::com::sun::star::uno::RuntimeException);
1094     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getItems(  ) throw (::com::sun::star::uno::RuntimeException);
1095     virtual ::sal_Int16 SAL_CALL getDropDownLineCount(  ) throw (::com::sun::star::uno::RuntimeException);
1096     virtual void SAL_CALL setDropDownLineCount( ::sal_Int16 _Lines ) throw (::com::sun::star::uno::RuntimeException);
1097 
1098 protected:
1099     virtual void onWindowEvent( const sal_uLong _nEventId, const Window& _rWindow, const void* _pEventData );
1100 };
1101 
1102 //==================================================================
1103 typedef ::cppu::ImplHelper2 <   ::com::sun::star::awt::XTextComponent
1104                             ,   ::com::sun::star::lang::XUnoTunnel
1105                             >   FmXFilterCell_Base;
1106 class FmXFilterCell :public FmXGridCell
1107                     ,public FmXFilterCell_Base
1108 {
1109     ::cppu::OInterfaceContainerHelper m_aTextListeners;
1110 protected:
1111     virtual ~FmXFilterCell();
1112 public:
1113     TYPEINFO();
1114     FmXFilterCell(DbGridColumn* pColumn = NULL, DbCellControl* pControl = NULL);
1115 
1116 
1117     DECLARE_UNO3_AGG_DEFAULTS(FmXFilterCell, FmXGridCell);
1118     virtual ::com::sun::star::uno::Any SAL_CALL queryAggregation( const ::com::sun::star::uno::Type& _rType ) throw(::com::sun::star::uno::RuntimeException);
1119     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes(  ) throw(::com::sun::star::uno::RuntimeException);
1120     virtual ::com::sun::star::uno::Sequence< sal_Int8 > SAL_CALL getImplementationId() throw(::com::sun::star::uno::RuntimeException);
1121 
1122 // XUnoTunnel
1123     virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException);
1124 
1125 // helpers for XUnoTunnel
1126     static const ::com::sun::star::uno::Sequence<sal_Int8>& getUnoTunnelId();
1127     static FmXFilterCell* getImplementation(
1128         const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XControl >& _rxObject);
1129 
1130 //  painting the filter text
1131     virtual void PaintCell(OutputDevice& rDev, const Rectangle& rRect);
1132     void Update(){m_pCellControl->Update();}
1133 
1134 // OComponentHelper
1135     virtual void SAL_CALL disposing();
1136 
1137 // ::com::sun::star::awt::XTextComponent
1138     virtual void SAL_CALL addTextListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener >& l) throw(::com::sun::star::uno::RuntimeException);
1139     virtual void SAL_CALL removeTextListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::XTextListener >& l) throw(::com::sun::star::uno::RuntimeException);
1140     virtual void SAL_CALL setText(const ::rtl::OUString& aText) throw(::com::sun::star::uno::RuntimeException);
1141     virtual void SAL_CALL insertText(const ::com::sun::star::awt::Selection& Sel, const ::rtl::OUString& Text) throw(::com::sun::star::uno::RuntimeException);
1142     virtual ::rtl::OUString SAL_CALL getText() throw(::com::sun::star::uno::RuntimeException);
1143     virtual ::rtl::OUString SAL_CALL getSelectedText() throw(::com::sun::star::uno::RuntimeException);
1144     virtual void SAL_CALL setSelection(const ::com::sun::star::awt::Selection& aSelection) throw(::com::sun::star::uno::RuntimeException);
1145     virtual ::com::sun::star::awt::Selection SAL_CALL getSelection() throw(::com::sun::star::uno::RuntimeException);
1146     virtual sal_Bool SAL_CALL isEditable() throw(::com::sun::star::uno::RuntimeException);
1147     virtual void SAL_CALL setEditable(sal_Bool bEditable) throw(::com::sun::star::uno::RuntimeException);
1148     virtual void SAL_CALL setMaxTextLen(sal_Int16 nLen) throw(::com::sun::star::uno::RuntimeException);
1149     virtual sal_Int16 SAL_CALL getMaxTextLen() throw(::com::sun::star::uno::RuntimeException);
1150 
1151 protected:
1152     DECL_LINK( OnCommit, void* );
1153 };
1154 
1155 #endif // _SVX_GRIDCELL_HXX
1156 
1157