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