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