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 "Columns.hxx"
22 : #include "findpos.hxx"
23 : #include "Grid.hxx"
24 : #include "property.hrc"
25 : #include "property.hxx"
26 : #include "services.hxx"
27 :
28 : #include <com/sun/star/form/FormComponentType.hpp>
29 : #include <com/sun/star/form/XForm.hpp>
30 : #include <com/sun/star/form/XLoadable.hpp>
31 : #include <com/sun/star/text/WritingMode2.hpp>
32 :
33 : #include <comphelper/basicio.hxx>
34 : #include <comphelper/container.hxx>
35 : #include <comphelper/extract.hxx>
36 : #include <comphelper/processfactory.hxx>
37 : #include <cppuhelper/queryinterface.hxx>
38 : #include <toolkit/helper/vclunohelper.hxx>
39 : #include <vcl/svapp.hxx>
40 :
41 : using namespace ::com::sun::star::uno;
42 :
43 : //.........................................................................
44 : namespace frm
45 : {
46 : //.........................................................................
47 : using namespace ::com::sun::star;
48 : using namespace ::com::sun::star::uno;
49 : using namespace ::com::sun::star::sdb;
50 : using namespace ::com::sun::star::sdbc;
51 : using namespace ::com::sun::star::sdbcx;
52 : using namespace ::com::sun::star::beans;
53 : using namespace ::com::sun::star::container;
54 : using namespace ::com::sun::star::form;
55 : using namespace ::com::sun::star::awt;
56 : using namespace ::com::sun::star::io;
57 : using namespace ::com::sun::star::lang;
58 : using namespace ::com::sun::star::util;
59 : using namespace ::com::sun::star::view;
60 :
61 : namespace WritingMode2 = ::com::sun::star::text::WritingMode2;
62 :
63 : const sal_uInt16 ROWHEIGHT = 0x0001;
64 : const sal_uInt16 FONTTYPE = 0x0002;
65 : const sal_uInt16 FONTSIZE = 0x0004;
66 : const sal_uInt16 FONTATTRIBS = 0x0008;
67 : const sal_uInt16 TABSTOP = 0x0010;
68 : const sal_uInt16 TEXTCOLOR = 0x0020;
69 : const sal_uInt16 FONTDESCRIPTOR = 0x0040;
70 : const sal_uInt16 RECORDMARKER = 0x0080;
71 : const sal_uInt16 BACKGROUNDCOLOR = 0x0100;
72 :
73 : //------------------------------------------------------------------
74 13 : InterfaceRef SAL_CALL OGridControlModel_CreateInstance(const Reference<XMultiServiceFactory>& _rxFactory)
75 : {
76 13 : return *(new OGridControlModel( comphelper::getComponentContext(_rxFactory) ));
77 : }
78 :
79 : DBG_NAME(OGridControlModel);
80 : //------------------------------------------------------------------
81 13 : OGridControlModel::OGridControlModel(const Reference<XComponentContext>& _rxFactory)
82 : :OControlModel(_rxFactory, OUString())
83 13 : ,OInterfaceContainer(_rxFactory, m_aMutex, ::getCppuType(static_cast<Reference<XPropertySet>*>(NULL)))
84 : ,OErrorBroadcaster( OComponentHelper::rBHelper )
85 : ,FontControlModel( false )
86 : ,m_aSelectListeners(m_aMutex)
87 : ,m_aResetListeners(m_aMutex)
88 : ,m_aRowSetChangeListeners(m_aMutex)
89 : ,m_aDefaultControl( FRM_SUN_CONTROL_GRIDCONTROL )
90 : ,m_nBorder(1)
91 : ,m_nWritingMode( WritingMode2::CONTEXT )
92 : ,m_nContextWritingMode( WritingMode2::CONTEXT )
93 : ,m_bEnableVisible(sal_True)
94 : ,m_bEnable(sal_True)
95 : ,m_bNavigation(sal_True)
96 : ,m_bRecordMarker(sal_True)
97 : ,m_bPrintable(sal_True)
98 : ,m_bAlwaysShowCursor(sal_False)
99 26 : ,m_bDisplaySynchron(sal_True)
100 : {
101 : DBG_CTOR(OGridControlModel,NULL);
102 :
103 13 : m_nClassId = FormComponentType::GRIDCONTROL;
104 13 : }
105 :
106 : //------------------------------------------------------------------
107 1 : OGridControlModel::OGridControlModel( const OGridControlModel* _pOriginal, const Reference< XComponentContext >& _rxFactory )
108 : :OControlModel( _pOriginal, _rxFactory )
109 1 : ,OInterfaceContainer( _rxFactory, m_aMutex, ::getCppuType( static_cast<Reference<XPropertySet>*>( NULL ) ) )
110 : ,OErrorBroadcaster( OComponentHelper::rBHelper )
111 : ,FontControlModel( _pOriginal )
112 : ,m_aSelectListeners( m_aMutex )
113 : ,m_aResetListeners( m_aMutex )
114 2 : ,m_aRowSetChangeListeners( m_aMutex )
115 : {
116 : DBG_CTOR(OGridControlModel,NULL);
117 :
118 1 : m_aDefaultControl = _pOriginal->m_aDefaultControl;
119 1 : m_bEnable = _pOriginal->m_bEnable;
120 1 : m_bEnableVisible = _pOriginal->m_bEnableVisible;
121 1 : m_bNavigation = _pOriginal->m_bNavigation;
122 1 : m_nBorder = _pOriginal->m_nBorder;
123 1 : m_nWritingMode = _pOriginal->m_nWritingMode;
124 1 : m_nContextWritingMode = _pOriginal->m_nContextWritingMode;
125 1 : m_bRecordMarker = _pOriginal->m_bRecordMarker;
126 1 : m_bPrintable = _pOriginal->m_bPrintable;
127 1 : m_bAlwaysShowCursor = _pOriginal->m_bAlwaysShowCursor;
128 1 : m_bDisplaySynchron = _pOriginal->m_bDisplaySynchron;
129 :
130 : // clone the columns
131 1 : cloneColumns( _pOriginal );
132 :
133 : // TODO: clone the events?
134 1 : }
135 :
136 : //------------------------------------------------------------------
137 36 : OGridControlModel::~OGridControlModel()
138 : {
139 12 : if (!OComponentHelper::rBHelper.bDisposed)
140 : {
141 0 : acquire();
142 0 : dispose();
143 : }
144 :
145 : DBG_DTOR(OGridControlModel,NULL);
146 24 : }
147 :
148 : // XCloneable
149 : //------------------------------------------------------------------------------
150 1 : Reference< XCloneable > SAL_CALL OGridControlModel::createClone( ) throw (RuntimeException)
151 : {
152 1 : OGridControlModel* pClone = new OGridControlModel( this, getContext() );
153 1 : osl_atomic_increment( &pClone->m_refCount );
154 1 : pClone->OControlModel::clonedFrom( this );
155 : // do not call OInterfaceContainer::clonedFrom, it would clone the elements aka columns, which is
156 : // already done in the ctor
157 : //pClone->OInterfaceContainer::clonedFrom( *this );
158 1 : osl_atomic_decrement( &pClone->m_refCount );
159 1 : return static_cast< XCloneable* >( static_cast< OControlModel* >( pClone ) );
160 : }
161 :
162 : //------------------------------------------------------------------------------
163 1 : void OGridControlModel::cloneColumns( const OGridControlModel* _pOriginalContainer )
164 : {
165 : try
166 : {
167 1 : Reference< XCloneable > xColCloneable;
168 :
169 1 : const OInterfaceArray::const_iterator pColumnStart = _pOriginalContainer->m_aItems.begin();
170 1 : const OInterfaceArray::const_iterator pColumnEnd = _pOriginalContainer->m_aItems.end();
171 3 : for ( OInterfaceArray::const_iterator pColumn = pColumnStart; pColumn != pColumnEnd; ++pColumn )
172 : {
173 : // ask the col for a factory for the clone
174 2 : xColCloneable = xColCloneable.query( *pColumn );
175 : DBG_ASSERT( xColCloneable.is(), "OGridControlModel::cloneColumns: column is not cloneable!" );
176 :
177 2 : if ( xColCloneable.is() )
178 : {
179 : // create a clone of the column
180 2 : Reference< XCloneable > xColClone( xColCloneable->createClone() );
181 : DBG_ASSERT( xColClone.is(), "OGridControlModel::cloneColumns: invalid column clone!" );
182 :
183 2 : if ( xColClone.is() )
184 : {
185 : // insert this clone into our own container
186 2 : insertByIndex( pColumn - pColumnStart, xColClone->queryInterface( m_aElementType ) );
187 2 : }
188 :
189 : }
190 1 : }
191 : }
192 0 : catch( const Exception& )
193 : {
194 : OSL_FAIL( "OGridControlModel::cloneColumns: caught an exception while cloning the columns!" );
195 : }
196 1 : }
197 :
198 : // XServiceInfo
199 : //------------------------------------------------------------------------------
200 5 : StringSequence OGridControlModel::getSupportedServiceNames() throw(RuntimeException)
201 : {
202 5 : StringSequence aSupported = OControlModel::getSupportedServiceNames();
203 5 : aSupported.realloc(aSupported.getLength() + 2);
204 :
205 5 : OUString*pArray = aSupported.getArray();
206 5 : pArray[aSupported.getLength()-2] = OUString("com.sun.star.awt.UnoControlModel");
207 5 : pArray[aSupported.getLength()-1] = FRM_SUN_COMPONENT_GRIDCONTROL;
208 5 : return aSupported;
209 : }
210 :
211 : //------------------------------------------------------------------------------
212 4712 : Any SAL_CALL OGridControlModel::queryAggregation( const Type& _rType ) throw (RuntimeException)
213 : {
214 4712 : Any aReturn = OGridControlModel_BASE::queryInterface(_rType);
215 :
216 4712 : if ( !aReturn.hasValue() )
217 : {
218 1686 : aReturn = OControlModel::queryAggregation( _rType );
219 1686 : if ( !aReturn.hasValue() )
220 : {
221 604 : aReturn = OInterfaceContainer::queryInterface( _rType );
222 604 : if ( !aReturn.hasValue() )
223 238 : aReturn = OErrorBroadcaster::queryInterface( _rType );
224 : }
225 : }
226 4712 : return aReturn;
227 : }
228 :
229 : // XSQLErrorListener
230 : //------------------------------------------------------------------------------
231 0 : void SAL_CALL OGridControlModel::errorOccured( const SQLErrorEvent& _rEvent ) throw (RuntimeException)
232 : {
233 : // forward the errors which happened to my columns to my own listeners
234 0 : onError( _rEvent );
235 0 : }
236 :
237 : // XRowSetSupplier
238 : //------------------------------------------------------------------------------
239 63 : Reference< XRowSet > SAL_CALL OGridControlModel::getRowSet( ) throw (RuntimeException)
240 : {
241 63 : return Reference< XRowSet >( getParent(), UNO_QUERY );
242 : }
243 :
244 : //------------------------------------------------------------------------------
245 0 : void SAL_CALL OGridControlModel::setRowSet( const Reference< XRowSet >& /*_rxDataSource*/ ) throw (RuntimeException)
246 : {
247 : OSL_FAIL( "OGridControlModel::setRowSet: not supported!" );
248 0 : }
249 :
250 : //--------------------------------------------------------------------
251 63 : void SAL_CALL OGridControlModel::addRowSetChangeListener( const Reference< XRowSetChangeListener >& i_Listener ) throw (RuntimeException)
252 : {
253 63 : if ( i_Listener.is() )
254 63 : m_aRowSetChangeListeners.addInterface( i_Listener );
255 63 : }
256 :
257 : //--------------------------------------------------------------------
258 18 : void SAL_CALL OGridControlModel::removeRowSetChangeListener( const Reference< XRowSetChangeListener >& i_Listener ) throw (RuntimeException)
259 : {
260 18 : m_aRowSetChangeListeners.removeInterface( i_Listener );
261 18 : }
262 :
263 : // XChild
264 : //------------------------------------------------------------------------------
265 45 : void SAL_CALL OGridControlModel::setParent( const InterfaceRef& i_Parent ) throw(NoSupportException, RuntimeException)
266 : {
267 45 : ::osl::ClearableMutexGuard aGuard( m_aMutex );
268 45 : if ( i_Parent == getParent() )
269 69 : return;
270 :
271 21 : OControlModel::setParent( i_Parent );
272 :
273 42 : EventObject aEvent( *this );
274 21 : aGuard.clear();
275 42 : m_aRowSetChangeListeners.notifyEach( &XRowSetChangeListener::onRowSetChanged, aEvent );
276 : }
277 :
278 : //------------------------------------------------------------------------------
279 0 : Sequence< Type > SAL_CALL OGridControlModel::getTypes( ) throw(RuntimeException)
280 : {
281 : return concatSequences(
282 : concatSequences(
283 : OControlModel::getTypes(),
284 : OInterfaceContainer::getTypes(),
285 : OErrorBroadcaster::getTypes()
286 : ),
287 : OGridControlModel_BASE::getTypes()
288 0 : );
289 : }
290 :
291 : // OComponentHelper
292 : //------------------------------------------------------------------------------
293 12 : void OGridControlModel::disposing()
294 : {
295 12 : OControlModel::disposing();
296 12 : OErrorBroadcaster::disposing();
297 12 : OInterfaceContainer::disposing();
298 :
299 12 : setParent(NULL);
300 :
301 12 : EventObject aEvt(static_cast<XWeak*>(this));
302 12 : m_aSelectListeners.disposeAndClear(aEvt);
303 12 : m_aResetListeners.disposeAndClear(aEvt);
304 12 : m_aRowSetChangeListeners.disposeAndClear(aEvt);
305 12 : }
306 :
307 : // XEventListener
308 : //------------------------------------------------------------------------------
309 15 : void OGridControlModel::disposing(const EventObject& _rEvent) throw( RuntimeException )
310 : {
311 15 : OControlModel::disposing( _rEvent );
312 15 : OInterfaceContainer::disposing( _rEvent );
313 15 : }
314 :
315 : // XSelectionSupplier
316 : //-----------------------------------------------------------------------------
317 0 : sal_Bool SAL_CALL OGridControlModel::select(const Any& rElement) throw(IllegalArgumentException, RuntimeException)
318 : {
319 0 : ::osl::ClearableMutexGuard aGuard( m_aMutex );
320 :
321 0 : Reference<XPropertySet> xSel;
322 0 : if (rElement.hasValue() && !::cppu::extractInterface(xSel, rElement))
323 : {
324 0 : throw IllegalArgumentException();
325 : }
326 0 : InterfaceRef xMe = static_cast<XWeak*>(this);
327 :
328 0 : if (xSel.is())
329 : {
330 0 : Reference<XChild> xAsChild(xSel, UNO_QUERY);
331 0 : if (!xAsChild.is() || (xAsChild->getParent() != xMe))
332 : {
333 0 : throw IllegalArgumentException();
334 0 : }
335 : }
336 :
337 0 : if ( xSel != m_xSelection )
338 : {
339 0 : m_xSelection = xSel;
340 0 : aGuard.clear();
341 0 : m_aSelectListeners.notifyEach( &XSelectionChangeListener::selectionChanged, EventObject( *this ) );
342 0 : return sal_True;
343 : }
344 0 : return sal_False;
345 : }
346 :
347 : //-----------------------------------------------------------------------------
348 42 : Any SAL_CALL OGridControlModel::getSelection() throw(RuntimeException)
349 : {
350 42 : return makeAny(m_xSelection);
351 : }
352 :
353 : //-----------------------------------------------------------------------------
354 31 : void OGridControlModel::addSelectionChangeListener(const Reference< XSelectionChangeListener >& _rxListener) throw( RuntimeException )
355 : {
356 31 : m_aSelectListeners.addInterface(_rxListener);
357 31 : }
358 :
359 : //-----------------------------------------------------------------------------
360 30 : void OGridControlModel::removeSelectionChangeListener(const Reference< XSelectionChangeListener >& _rxListener) throw( RuntimeException )
361 : {
362 30 : m_aSelectListeners.removeInterface(_rxListener);
363 30 : }
364 :
365 : // XGridColumnFactory
366 : //------------------------------------------------------------------------------
367 57 : Reference<XPropertySet> SAL_CALL OGridControlModel::createColumn(const OUString& ColumnType) throw ( :: com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException)
368 : {
369 57 : SolarMutexGuard g;
370 57 : const Sequence< OUString >& rColumnTypes = frm::getColumnTypes();
371 57 : return createColumn( ::detail::findPos( ColumnType, rColumnTypes ) );
372 : }
373 :
374 : //------------------------------------------------------------------------------
375 59 : Reference<XPropertySet> OGridControlModel::createColumn(sal_Int32 nTypeId) const
376 : {
377 59 : Reference<XPropertySet> xReturn;
378 59 : switch (nTypeId)
379 : {
380 0 : case TYPE_CHECKBOX: xReturn = new CheckBoxColumn( getContext() ); break;
381 0 : case TYPE_COMBOBOX: xReturn = new ComboBoxColumn( getContext() ); break;
382 0 : case TYPE_CURRENCYFIELD: xReturn = new CurrencyFieldColumn( getContext() ); break;
383 6 : case TYPE_DATEFIELD: xReturn = new DateFieldColumn( getContext() ); break;
384 0 : case TYPE_LISTBOX: xReturn = new ListBoxColumn( getContext() ); break;
385 0 : case TYPE_NUMERICFIELD: xReturn = new NumericFieldColumn( getContext() ); break;
386 0 : case TYPE_PATTERNFIELD: xReturn = new PatternFieldColumn( getContext() ); break;
387 39 : case TYPE_TEXTFIELD: xReturn = new TextFieldColumn( getContext() ); break;
388 0 : case TYPE_TIMEFIELD: xReturn = new TimeFieldColumn( getContext() ); break;
389 14 : case TYPE_FORMATTEDFIELD: xReturn = new FormattedFieldColumn( getContext() ); break;
390 : default:
391 : OSL_FAIL("OGridControlModel::createColumn: Unknown Column");
392 0 : break;
393 : }
394 59 : return xReturn;
395 : }
396 :
397 : //------------------------------------------------------------------------------
398 1 : StringSequence SAL_CALL OGridControlModel::getColumnTypes() throw ( ::com::sun::star::uno::RuntimeException)
399 : {
400 1 : return frm::getColumnTypes();
401 : }
402 :
403 : // XReset
404 : //-----------------------------------------------------------------------------
405 3 : void SAL_CALL OGridControlModel::reset() throw ( ::com::sun::star::uno::RuntimeException)
406 : {
407 3 : ::cppu::OInterfaceIteratorHelper aIter(m_aResetListeners);
408 6 : EventObject aEvt(static_cast<XWeak*>(this));
409 3 : sal_Bool bContinue = sal_True;
410 12 : while (aIter.hasMoreElements() && bContinue)
411 6 : bContinue =((XResetListener*)aIter.next())->approveReset(aEvt);
412 :
413 3 : if (bContinue)
414 : {
415 2 : _reset();
416 2 : m_aResetListeners.notifyEach( &XResetListener::resetted, aEvt );
417 3 : }
418 3 : }
419 :
420 : //-----------------------------------------------------------------------------
421 24 : void SAL_CALL OGridControlModel::addResetListener(const Reference<XResetListener>& _rxListener) throw ( ::com::sun::star::uno::RuntimeException)
422 : {
423 24 : m_aResetListeners.addInterface(_rxListener);
424 24 : }
425 :
426 : //-----------------------------------------------------------------------------
427 23 : void SAL_CALL OGridControlModel::removeResetListener(const Reference<XResetListener>& _rxListener) throw ( ::com::sun::star::uno::RuntimeException)
428 : {
429 23 : m_aResetListeners.removeInterface(_rxListener);
430 23 : }
431 :
432 : //-----------------------------------------------------------------------------
433 2 : void OGridControlModel::_reset()
434 : {
435 2 : Reference<XReset> xReset;
436 2 : sal_Int32 nCount = getCount();
437 6 : for (sal_Int32 nIndex=0; nIndex < nCount; nIndex++)
438 : {
439 4 : getByIndex( nIndex ) >>= xReset;
440 4 : if (xReset.is())
441 4 : xReset->reset();
442 2 : }
443 2 : }
444 :
445 : // XPropertySet
446 : //------------------------------------------------------------------------------
447 14 : void OGridControlModel::describeFixedProperties( Sequence< Property >& _rProps ) const
448 : {
449 14 : BEGIN_DESCRIBE_BASE_PROPERTIES( 37 )
450 14 : DECL_PROP1(NAME, OUString, BOUND);
451 14 : DECL_PROP2(CLASSID, sal_Int16, READONLY, TRANSIENT);
452 14 : DECL_PROP1(TAG, OUString, BOUND);
453 14 : DECL_PROP1(TABINDEX, sal_Int16, BOUND);
454 14 : DECL_PROP3(TABSTOP, sal_Bool, BOUND, MAYBEDEFAULT, MAYBEVOID);
455 14 : DECL_PROP2(HASNAVIGATION, sal_Bool, BOUND, MAYBEDEFAULT);
456 14 : DECL_PROP1(ENABLED, sal_Bool, BOUND);
457 14 : DECL_PROP2(ENABLEVISIBLE, sal_Bool, BOUND, MAYBEDEFAULT);
458 14 : DECL_PROP1(BORDER, sal_Int16, BOUND);
459 14 : DECL_PROP2(BORDERCOLOR, sal_Int16, BOUND, MAYBEVOID);
460 14 : DECL_PROP1(DEFAULTCONTROL, OUString, BOUND);
461 14 : DECL_PROP3(TEXTCOLOR, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID);
462 14 : DECL_PROP3(BACKGROUNDCOLOR, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID);
463 14 : DECL_PROP2(FONT, FontDescriptor, BOUND, MAYBEDEFAULT);
464 14 : DECL_PROP3(ROWHEIGHT, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID);
465 14 : DECL_PROP1(HELPTEXT, OUString, BOUND);
466 14 : DECL_PROP1(FONT_NAME, OUString, MAYBEDEFAULT);
467 14 : DECL_PROP1(FONT_STYLENAME, OUString, MAYBEDEFAULT);
468 14 : DECL_PROP1(FONT_FAMILY, sal_Int16, MAYBEDEFAULT);
469 14 : DECL_PROP1(FONT_CHARSET, sal_Int16, MAYBEDEFAULT);
470 14 : DECL_PROP1(FONT_HEIGHT, float, MAYBEDEFAULT);
471 14 : DECL_PROP1(FONT_WEIGHT, float, MAYBEDEFAULT);
472 14 : DECL_PROP1(FONT_SLANT, sal_Int16, MAYBEDEFAULT);
473 14 : DECL_PROP1(FONT_UNDERLINE, sal_Int16, MAYBEDEFAULT);
474 14 : DECL_BOOL_PROP1(FONT_WORDLINEMODE, MAYBEDEFAULT);
475 14 : DECL_PROP3(TEXTLINECOLOR, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID);
476 14 : DECL_PROP2(FONTEMPHASISMARK, sal_Int16, BOUND, MAYBEDEFAULT);
477 14 : DECL_PROP2(FONTRELIEF, sal_Int16, BOUND, MAYBEDEFAULT);
478 14 : DECL_PROP1(FONT_STRIKEOUT, sal_Int16, MAYBEDEFAULT);
479 14 : DECL_PROP2(RECORDMARKER, sal_Bool, BOUND, MAYBEDEFAULT );
480 14 : DECL_PROP2(PRINTABLE, sal_Bool, BOUND, MAYBEDEFAULT );
481 14 : DECL_PROP4(CURSORCOLOR, sal_Int32, BOUND, MAYBEDEFAULT, MAYBEVOID , TRANSIENT);
482 14 : DECL_PROP3(ALWAYSSHOWCURSOR, sal_Bool, BOUND, MAYBEDEFAULT, TRANSIENT);
483 14 : DECL_PROP3(DISPLAYSYNCHRON, sal_Bool, BOUND, MAYBEDEFAULT, TRANSIENT);
484 14 : DECL_PROP2(HELPURL, OUString, BOUND, MAYBEDEFAULT);
485 14 : DECL_PROP2(WRITING_MODE, sal_Int16, BOUND, MAYBEDEFAULT);
486 14 : DECL_PROP3(CONTEXT_WRITING_MODE,sal_Int16, BOUND, MAYBEDEFAULT, TRANSIENT);
487 : END_DESCRIBE_PROPERTIES();
488 14 : }
489 :
490 : //------------------------------------------------------------------------------
491 1951 : void OGridControlModel::getFastPropertyValue(Any& rValue, sal_Int32 nHandle ) const
492 : {
493 1951 : switch (nHandle)
494 : {
495 : case PROPERTY_ID_CONTEXT_WRITING_MODE:
496 59 : rValue <<= m_nContextWritingMode;
497 59 : break;
498 : case PROPERTY_ID_WRITING_MODE:
499 59 : rValue <<= m_nWritingMode;
500 59 : break;
501 : case PROPERTY_ID_HELPTEXT:
502 59 : rValue <<= m_sHelpText;
503 59 : break;
504 : case PROPERTY_ID_HELPURL:
505 52 : rValue <<= m_sHelpURL;
506 52 : break;
507 : case PROPERTY_ID_DISPLAYSYNCHRON:
508 59 : setBOOL(rValue, m_bDisplaySynchron);
509 59 : break;
510 : case PROPERTY_ID_ALWAYSSHOWCURSOR:
511 63 : setBOOL(rValue, m_bAlwaysShowCursor);
512 63 : break;
513 : case PROPERTY_ID_CURSORCOLOR:
514 26 : rValue = m_aCursorColor;
515 26 : break;
516 : case PROPERTY_ID_PRINTABLE:
517 59 : setBOOL(rValue, m_bPrintable);
518 59 : break;
519 : case PROPERTY_ID_TABSTOP:
520 27 : rValue = m_aTabStop;
521 27 : break;
522 : case PROPERTY_ID_HASNAVIGATION:
523 59 : setBOOL(rValue, m_bNavigation);
524 59 : break;
525 : case PROPERTY_ID_RECORDMARKER:
526 59 : setBOOL(rValue, m_bRecordMarker);
527 59 : break;
528 : case PROPERTY_ID_ENABLED:
529 61 : setBOOL(rValue, m_bEnable);
530 61 : break;
531 : case PROPERTY_ID_ENABLEVISIBLE:
532 59 : setBOOL(rValue, m_bEnableVisible);
533 59 : break;
534 : case PROPERTY_ID_BORDER:
535 84 : rValue <<= (sal_Int16)m_nBorder;
536 84 : break;
537 : case PROPERTY_ID_BORDERCOLOR:
538 27 : rValue <<= m_aBorderColor;
539 27 : break;
540 : case PROPERTY_ID_DEFAULTCONTROL:
541 71 : rValue <<= m_aDefaultControl;
542 71 : break;
543 : case PROPERTY_ID_BACKGROUNDCOLOR:
544 26 : rValue = m_aBackgroundColor;
545 26 : break;
546 : case PROPERTY_ID_ROWHEIGHT:
547 52 : rValue = m_aRowHeight;
548 52 : break;
549 :
550 : default:
551 990 : if ( isFontRelatedProperty( nHandle ) )
552 511 : FontControlModel::getFastPropertyValue( rValue, nHandle );
553 : else
554 479 : OControlModel::getFastPropertyValue( rValue, nHandle );
555 : }
556 1951 : }
557 :
558 : //------------------------------------------------------------------------------
559 562 : sal_Bool OGridControlModel::convertFastPropertyValue( Any& rConvertedValue, Any& rOldValue,
560 : sal_Int32 nHandle, const Any& rValue )throw( IllegalArgumentException )
561 : {
562 562 : sal_Bool bModified(sal_False);
563 562 : switch (nHandle)
564 : {
565 : case PROPERTY_ID_CONTEXT_WRITING_MODE:
566 46 : bModified = tryPropertyValue( rConvertedValue, rOldValue, rValue, m_nContextWritingMode );
567 46 : break;
568 : case PROPERTY_ID_WRITING_MODE:
569 26 : bModified = tryPropertyValue( rConvertedValue, rOldValue, rValue, m_nWritingMode );
570 26 : break;
571 : case PROPERTY_ID_HELPTEXT:
572 28 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_sHelpText);
573 27 : break;
574 : case PROPERTY_ID_HELPURL:
575 22 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_sHelpURL);
576 22 : break;
577 : case PROPERTY_ID_DISPLAYSYNCHRON:
578 26 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bDisplaySynchron);
579 26 : break;
580 : case PROPERTY_ID_ALWAYSSHOWCURSOR:
581 27 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bAlwaysShowCursor);
582 27 : break;
583 : case PROPERTY_ID_CURSORCOLOR:
584 0 : if (!rValue.hasValue() || !m_aCursorColor.hasValue())
585 : {
586 0 : if (rValue.hasValue() && (TypeClass_LONG != rValue.getValueType().getTypeClass()))
587 : {
588 0 : throw IllegalArgumentException();
589 : }
590 0 : rOldValue = m_aCursorColor;
591 0 : rConvertedValue = rValue;
592 0 : bModified = (rOldValue.getValue() != rConvertedValue.getValue());
593 : }
594 : else
595 0 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, getINT32(m_aCursorColor));
596 0 : break;
597 : case PROPERTY_ID_PRINTABLE:
598 26 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bPrintable);
599 26 : break;
600 : case PROPERTY_ID_TABSTOP:
601 0 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aTabStop, ::getBooleanCppuType());
602 0 : break;
603 : case PROPERTY_ID_HASNAVIGATION:
604 26 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bNavigation);
605 26 : break;
606 : case PROPERTY_ID_RECORDMARKER:
607 26 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bRecordMarker);
608 26 : break;
609 : case PROPERTY_ID_ENABLED:
610 27 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bEnable);
611 27 : break;
612 : case PROPERTY_ID_ENABLEVISIBLE:
613 26 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_bEnableVisible);
614 26 : break;
615 : case PROPERTY_ID_BORDER:
616 29 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_nBorder);
617 29 : break;
618 : case PROPERTY_ID_BORDERCOLOR:
619 0 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aBorderColor, ::getCppuType((const sal_Int32*)NULL));
620 0 : break;
621 : case PROPERTY_ID_DEFAULTCONTROL:
622 37 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aDefaultControl);
623 37 : break;
624 : case PROPERTY_ID_BACKGROUNDCOLOR:
625 0 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aBackgroundColor, ::getCppuType((const sal_Int32*)NULL));
626 0 : break;
627 : case PROPERTY_ID_ROWHEIGHT:
628 : {
629 1 : bModified = tryPropertyValue(rConvertedValue, rOldValue, rValue, m_aRowHeight, ::getCppuType((const sal_Int32*)NULL));
630 :
631 1 : sal_Int32 nNewVal( 0 );
632 1 : if ( ( rConvertedValue >>= nNewVal ) && ( nNewVal <= 0 ) )
633 : {
634 0 : rConvertedValue.clear();
635 0 : bModified = m_aRowHeight.hasValue();
636 : }
637 : }
638 1 : break;
639 : default:
640 189 : if ( isFontRelatedProperty( nHandle ) )
641 92 : bModified = FontControlModel::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue );
642 : else
643 97 : bModified = OControlModel::convertFastPropertyValue( rConvertedValue, rOldValue, nHandle, rValue);
644 : }
645 561 : return bModified;
646 : }
647 :
648 : //------------------------------------------------------------------------------
649 193 : void OGridControlModel::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const Any& rValue ) throw ( ::com::sun::star::uno::Exception)
650 : {
651 193 : switch (nHandle)
652 : {
653 : case PROPERTY_ID_CONTEXT_WRITING_MODE:
654 18 : rValue >>= m_nContextWritingMode;
655 18 : break;
656 : case PROPERTY_ID_WRITING_MODE:
657 8 : rValue >>= m_nWritingMode;
658 8 : break;
659 : case PROPERTY_ID_HELPTEXT:
660 9 : rValue >>= m_sHelpText;
661 9 : break;
662 : case PROPERTY_ID_HELPURL:
663 4 : rValue >>= m_sHelpURL;
664 4 : break;
665 : case PROPERTY_ID_DISPLAYSYNCHRON:
666 8 : m_bDisplaySynchron = getBOOL(rValue);
667 8 : break;
668 : case PROPERTY_ID_ALWAYSSHOWCURSOR:
669 8 : m_bAlwaysShowCursor = getBOOL(rValue);
670 8 : break;
671 : case PROPERTY_ID_CURSORCOLOR:
672 0 : m_aCursorColor = rValue;
673 0 : break;
674 : case PROPERTY_ID_PRINTABLE:
675 8 : m_bPrintable = getBOOL(rValue);
676 8 : break;
677 : case PROPERTY_ID_TABSTOP:
678 0 : m_aTabStop = rValue;
679 0 : break;
680 : case PROPERTY_ID_HASNAVIGATION:
681 8 : m_bNavigation = getBOOL(rValue);
682 8 : break;
683 : case PROPERTY_ID_ENABLED:
684 9 : m_bEnable = getBOOL(rValue);
685 9 : break;
686 : case PROPERTY_ID_ENABLEVISIBLE:
687 8 : m_bEnableVisible = getBOOL(rValue);
688 8 : break;
689 : case PROPERTY_ID_RECORDMARKER:
690 8 : m_bRecordMarker = getBOOL(rValue);
691 8 : break;
692 : case PROPERTY_ID_BORDER:
693 11 : rValue >>= m_nBorder;
694 11 : break;
695 : case PROPERTY_ID_BORDERCOLOR:
696 0 : m_aBorderColor = rValue;
697 0 : break;
698 : case PROPERTY_ID_DEFAULTCONTROL:
699 9 : rValue >>= m_aDefaultControl;
700 9 : break;
701 : case PROPERTY_ID_BACKGROUNDCOLOR:
702 0 : m_aBackgroundColor = rValue;
703 0 : break;
704 : case PROPERTY_ID_ROWHEIGHT:
705 0 : m_aRowHeight = rValue;
706 0 : break;
707 :
708 : default:
709 77 : if ( isFontRelatedProperty( nHandle ) )
710 : {
711 34 : FontDescriptor aOldFont( getFont() );
712 :
713 34 : FontControlModel::setFastPropertyValue_NoBroadcast( nHandle, rValue );
714 :
715 34 : if ( isFontAggregateProperty( nHandle ) )
716 20 : firePropertyChange( PROPERTY_ID_FONT, makeAny( getFont() ), makeAny( aOldFont ) );
717 : }
718 : else
719 43 : OControlModel::setFastPropertyValue_NoBroadcast( nHandle, rValue );
720 : }
721 :
722 193 : }
723 :
724 : //XPropertyState
725 :
726 : //------------------------------------------------------------------------------
727 4 : Any OGridControlModel::getPropertyDefaultByHandle( sal_Int32 nHandle ) const
728 : {
729 4 : Any aReturn;
730 4 : switch (nHandle)
731 : {
732 : case PROPERTY_ID_CONTEXT_WRITING_MODE:
733 : case PROPERTY_ID_WRITING_MODE:
734 0 : aReturn <<= WritingMode2::CONTEXT;
735 0 : break;
736 :
737 : case PROPERTY_ID_DEFAULTCONTROL:
738 0 : aReturn <<= OUString( STARDIV_ONE_FORM_CONTROL_GRID );
739 0 : break;
740 :
741 : case PROPERTY_ID_PRINTABLE:
742 : case PROPERTY_ID_HASNAVIGATION:
743 : case PROPERTY_ID_RECORDMARKER:
744 : case PROPERTY_ID_DISPLAYSYNCHRON:
745 : case PROPERTY_ID_ENABLED:
746 : case PROPERTY_ID_ENABLEVISIBLE:
747 0 : aReturn = makeBoolAny(sal_True);
748 0 : break;
749 :
750 : case PROPERTY_ID_ALWAYSSHOWCURSOR:
751 4 : aReturn = makeBoolAny(sal_False);
752 4 : break;
753 :
754 : case PROPERTY_ID_HELPURL:
755 : case PROPERTY_ID_HELPTEXT:
756 0 : aReturn <<= OUString();
757 0 : break;
758 :
759 : case PROPERTY_ID_BORDER:
760 0 : aReturn <<= (sal_Int16)1;
761 0 : break;
762 :
763 : case PROPERTY_ID_BORDERCOLOR:
764 : case PROPERTY_ID_TABSTOP:
765 : case PROPERTY_ID_BACKGROUNDCOLOR:
766 : case PROPERTY_ID_ROWHEIGHT:
767 : case PROPERTY_ID_CURSORCOLOR:
768 : // void
769 0 : break;
770 :
771 : default:
772 0 : if ( isFontRelatedProperty( nHandle ) )
773 0 : aReturn = FontControlModel::getPropertyDefaultByHandle( nHandle );
774 : else
775 0 : aReturn = OControlModel::getPropertyDefaultByHandle(nHandle);
776 : }
777 4 : return aReturn;
778 : }
779 :
780 : //------------------------------------------------------------------------------
781 62 : OGridColumn* OGridControlModel::getColumnImplementation(const InterfaceRef& _rxIFace) const
782 : {
783 62 : OGridColumn* pImplementation = NULL;
784 62 : Reference< XUnoTunnel > xUnoTunnel( _rxIFace, UNO_QUERY );
785 62 : if ( xUnoTunnel.is() )
786 59 : pImplementation = reinterpret_cast<OGridColumn*>(xUnoTunnel->getSomething(OGridColumn::getUnoTunnelImplementationId()));
787 :
788 62 : return pImplementation;
789 : }
790 :
791 : //------------------------------------------------------------------------------
792 55 : void OGridControlModel::gotColumn( const Reference< XInterface >& _rxColumn )
793 : {
794 55 : Reference< XSQLErrorBroadcaster > xBroadcaster( _rxColumn, UNO_QUERY );
795 55 : if ( xBroadcaster.is() )
796 14 : xBroadcaster->addSQLErrorListener( this );
797 55 : }
798 :
799 : //------------------------------------------------------------------------------
800 10 : void OGridControlModel::lostColumn(const Reference< XInterface >& _rxColumn)
801 : {
802 10 : if ( m_xSelection == _rxColumn )
803 : { // the currently selected element was replaced
804 0 : m_xSelection.clear();
805 0 : EventObject aEvt( static_cast< XWeak* >( this ) );
806 0 : m_aSelectListeners.notifyEach( &XSelectionChangeListener::selectionChanged, aEvt );
807 : }
808 :
809 10 : Reference< XSQLErrorBroadcaster > xBroadcaster( _rxColumn, UNO_QUERY );
810 10 : if ( xBroadcaster.is() )
811 0 : xBroadcaster->removeSQLErrorListener( this );
812 10 : }
813 :
814 : //------------------------------------------------------------------------------
815 4 : void OGridControlModel::implRemoved(const InterfaceRef& _rxObject)
816 : {
817 4 : OInterfaceContainer::implRemoved(_rxObject);
818 4 : lostColumn(_rxObject);
819 4 : }
820 :
821 : //------------------------------------------------------------------------------
822 49 : void OGridControlModel::implInserted( const ElementDescription* _pElement )
823 : {
824 49 : OInterfaceContainer::implInserted( _pElement );
825 49 : gotColumn( _pElement->xInterface );
826 49 : }
827 :
828 : //------------------------------------------------------------------------------
829 6 : void OGridControlModel::impl_replacedElement( const ContainerEvent& _rEvent, ::osl::ClearableMutexGuard& _rInstanceLock )
830 : {
831 6 : Reference< XInterface > xOldColumn( _rEvent.ReplacedElement, UNO_QUERY );
832 12 : Reference< XInterface > xNewColumn( _rEvent.Element, UNO_QUERY );
833 :
834 6 : bool bNewSelection = ( xOldColumn == m_xSelection );
835 :
836 6 : lostColumn( xOldColumn );
837 6 : gotColumn( xNewColumn );
838 :
839 6 : if ( bNewSelection )
840 0 : m_xSelection.set( xNewColumn, UNO_QUERY );
841 :
842 6 : OInterfaceContainer::impl_replacedElement( _rEvent, _rInstanceLock );
843 : // <<---- SYNCHRONIZED
844 :
845 6 : if ( bNewSelection )
846 : {
847 0 : m_aSelectListeners.notifyEach( &XSelectionChangeListener::selectionChanged, EventObject( *this ) );
848 6 : }
849 6 : }
850 :
851 : //------------------------------------------------------------------------------
852 58 : ElementDescription* OGridControlModel::createElementMetaData( )
853 : {
854 58 : return new ColumnDescription;
855 : }
856 :
857 : //------------------------------------------------------------------------------
858 58 : void OGridControlModel::approveNewElement( const Reference< XPropertySet >& _rxObject, ElementDescription* _pElement )
859 : {
860 58 : OGridColumn* pCol = getColumnImplementation( _rxObject );
861 58 : if ( !pCol )
862 3 : throw IllegalArgumentException();
863 :
864 55 : OInterfaceContainer::approveNewElement( _rxObject, _pElement );
865 :
866 : // if we're here, the object passed all tests
867 55 : if ( _pElement )
868 55 : static_cast< ColumnDescription* >( _pElement )->pColumn = pCol;
869 55 : }
870 :
871 : // XPersistObject
872 : //------------------------------------------------------------------------------
873 1 : OUString SAL_CALL OGridControlModel::getServiceName() throw ( ::com::sun::star::uno::RuntimeException)
874 : {
875 1 : return OUString(FRM_COMPONENT_GRID); // old (non-sun) name for compatibility !
876 : }
877 :
878 : //------------------------------------------------------------------------------
879 1 : void OGridControlModel::write(const Reference<XObjectOutputStream>& _rxOutStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
880 : {
881 1 : OControlModel::write(_rxOutStream);
882 :
883 1 : Reference<XMarkableStream> xMark(_rxOutStream, UNO_QUERY);
884 :
885 : // 1. Version
886 1 : _rxOutStream->writeShort(0x0008);
887 :
888 : // 2. Columns
889 1 : sal_Int32 nLen = getCount();
890 1 : _rxOutStream->writeLong(nLen);
891 : OGridColumn* pCol;
892 3 : for (sal_Int32 i = 0; i < nLen; i++)
893 : {
894 : // zuerst den Servicenamen fuer das darunterliegende Model
895 2 : pCol = getColumnImplementation(m_aItems[i]);
896 : DBG_ASSERT(pCol != NULL, "OGridControlModel::write : such items should never reach it into my container !");
897 :
898 2 : _rxOutStream << pCol->getModelName();
899 :
900 : // dann das Object selbst
901 2 : sal_Int32 nMark = xMark->createMark();
902 2 : sal_Int32 nObjLen = 0;
903 2 : _rxOutStream->writeLong(nObjLen);
904 :
905 : // schreiben der Col
906 2 : pCol->write(_rxOutStream);
907 :
908 : // feststellen der Laenge
909 2 : nObjLen = xMark->offsetToMark(nMark) - 4;
910 2 : xMark->jumpToMark(nMark);
911 2 : _rxOutStream->writeLong(nObjLen);
912 2 : xMark->jumpToFurthest();
913 2 : xMark->deleteMark(nMark);
914 : }
915 :
916 : // 3. Events
917 1 : writeEvents(_rxOutStream);
918 :
919 : // 4. Attribute
920 : // Maskierung fuer alle any Typen
921 1 : sal_uInt16 nAnyMask = 0;
922 1 : if (m_aRowHeight.getValueType().getTypeClass() == TypeClass_LONG)
923 0 : nAnyMask |= ROWHEIGHT;
924 1 : if ( getFont() != getDefaultFont() )
925 1 : nAnyMask |= FONTATTRIBS | FONTSIZE | FONTTYPE | FONTDESCRIPTOR;
926 1 : if (m_aTabStop.getValueType().getTypeClass() == TypeClass_BOOLEAN)
927 0 : nAnyMask |= TABSTOP;
928 1 : if ( hasTextColor() )
929 0 : nAnyMask |= TEXTCOLOR;
930 1 : if (m_aBackgroundColor.getValueType().getTypeClass() == TypeClass_LONG)
931 0 : nAnyMask |= BACKGROUNDCOLOR;
932 1 : if (!m_bRecordMarker)
933 0 : nAnyMask |= RECORDMARKER;
934 :
935 1 : _rxOutStream->writeShort(nAnyMask);
936 :
937 1 : if (nAnyMask & ROWHEIGHT)
938 0 : _rxOutStream->writeLong(getINT32(m_aRowHeight));
939 :
940 : // old structures
941 1 : const FontDescriptor& aFont = getFont();
942 1 : if ( nAnyMask & FONTDESCRIPTOR )
943 : {
944 : // Attrib
945 1 : _rxOutStream->writeShort( sal::static_int_cast< sal_Int16 >( VCLUnoHelper::ConvertFontWeight( aFont.Weight ) ) );
946 1 : _rxOutStream->writeShort( sal::static_int_cast< sal_Int16 >( aFont.Slant ) );
947 1 : _rxOutStream->writeShort( aFont.Underline );
948 1 : _rxOutStream->writeShort( aFont.Strikeout );
949 1 : _rxOutStream->writeShort( sal_Int16(aFont.Orientation * 10) );
950 1 : _rxOutStream->writeBoolean( aFont.Kerning );
951 1 : _rxOutStream->writeBoolean( aFont.WordLineMode );
952 :
953 : // Size
954 1 : _rxOutStream->writeLong( aFont.Width );
955 1 : _rxOutStream->writeLong( aFont.Height );
956 1 : _rxOutStream->writeShort( sal::static_int_cast< sal_Int16 >( VCLUnoHelper::ConvertFontWidth( aFont.CharacterWidth ) ) );
957 :
958 : // Type
959 1 : _rxOutStream->writeUTF( aFont.Name );
960 1 : _rxOutStream->writeUTF( aFont.StyleName );
961 1 : _rxOutStream->writeShort( aFont.Family );
962 1 : _rxOutStream->writeShort( aFont.CharSet );
963 1 : _rxOutStream->writeShort( aFont.Pitch );
964 : }
965 :
966 1 : _rxOutStream << m_aDefaultControl;
967 :
968 1 : _rxOutStream->writeShort(m_nBorder);
969 1 : _rxOutStream->writeBoolean(m_bEnable);
970 :
971 1 : if (nAnyMask & TABSTOP)
972 0 : _rxOutStream->writeBoolean(getBOOL(m_aTabStop));
973 :
974 1 : _rxOutStream->writeBoolean(m_bNavigation);
975 :
976 1 : if (nAnyMask & TEXTCOLOR)
977 0 : _rxOutStream->writeLong( getTextColor() );
978 :
979 : // neu ab Version 6
980 1 : _rxOutStream << m_sHelpText;
981 :
982 1 : if (nAnyMask & FONTDESCRIPTOR)
983 1 : _rxOutStream << getFont();
984 :
985 1 : if (nAnyMask & RECORDMARKER)
986 0 : _rxOutStream->writeBoolean(m_bRecordMarker);
987 :
988 : // neu ab Version 7
989 1 : _rxOutStream->writeBoolean(m_bPrintable);
990 :
991 : // new since 8
992 1 : if (nAnyMask & BACKGROUNDCOLOR)
993 0 : _rxOutStream->writeLong(getINT32(m_aBackgroundColor));
994 1 : }
995 :
996 : //------------------------------------------------------------------------------
997 1 : void OGridControlModel::read(const Reference<XObjectInputStream>& _rxInStream) throw ( ::com::sun::star::io::IOException, ::com::sun::star::uno::RuntimeException)
998 : {
999 1 : SolarMutexGuard g;
1000 1 : OControlModel::read(_rxInStream);
1001 :
1002 2 : Reference<XMarkableStream> xMark(_rxInStream, UNO_QUERY);
1003 :
1004 : // 1. Version
1005 1 : sal_Int16 nVersion = _rxInStream->readShort();
1006 :
1007 : // 2. Einlesen der Spalten
1008 1 : sal_Int32 nLen = _rxInStream->readLong();
1009 1 : if (nLen)
1010 : {
1011 3 : for (sal_Int32 i = 0; i < nLen; i++)
1012 : {
1013 : // Lesen des Modelnamen
1014 :
1015 2 : OUString sModelName;
1016 2 : _rxInStream >> sModelName;
1017 :
1018 4 : Reference<XPropertySet> xCol(createColumn(getColumnTypeByModelName(sModelName)));
1019 : DBG_ASSERT(xCol.is(), "OGridControlModel::read : unknown column type !");
1020 2 : sal_Int32 nObjLen = _rxInStream->readLong();
1021 2 : if (nObjLen)
1022 : {
1023 2 : sal_Int32 nMark = xMark->createMark();
1024 2 : if (xCol.is())
1025 : {
1026 2 : OGridColumn* pCol = getColumnImplementation(xCol);
1027 2 : pCol->read(_rxInStream);
1028 : }
1029 2 : xMark->jumpToMark(nMark);
1030 2 : _rxInStream->skipBytes(nObjLen);
1031 2 : xMark->deleteMark(nMark);
1032 : }
1033 :
1034 2 : if ( xCol.is() )
1035 2 : implInsert( i, xCol, sal_False, NULL, sal_False );
1036 2 : }
1037 : }
1038 :
1039 : // In der Basisimplementierung werden die Events nur gelesen, Elemente im Container existieren
1040 : // da aber vor TF_ONE fuer das GridControl immer Events geschrieben wurden, muessen sie auch immer
1041 : // mit gelesen werden
1042 1 : sal_Int32 nObjLen = _rxInStream->readLong();
1043 1 : if (nObjLen)
1044 : {
1045 1 : sal_Int32 nMark = xMark->createMark();
1046 1 : Reference<XPersistObject> xObj(m_xEventAttacher, UNO_QUERY);
1047 1 : if (xObj.is())
1048 1 : xObj->read(_rxInStream);
1049 1 : xMark->jumpToMark(nMark);
1050 1 : _rxInStream->skipBytes(nObjLen);
1051 1 : xMark->deleteMark(nMark);
1052 : }
1053 :
1054 : // Attachement lesen
1055 3 : for (sal_Int32 i = 0; i < nLen; i++)
1056 : {
1057 2 : InterfaceRef xIfc(m_aItems[i], UNO_QUERY);
1058 4 : Reference<XPropertySet> xSet(xIfc, UNO_QUERY);
1059 4 : Any aHelper;
1060 2 : aHelper <<= xSet;
1061 2 : m_xEventAttacher->attach( i, xIfc, aHelper );
1062 2 : }
1063 :
1064 : // 4. Einlesen der Attribute
1065 1 : if (nVersion == 1)
1066 1 : return;
1067 :
1068 : // Maskierung fuer any
1069 1 : sal_uInt16 nAnyMask = _rxInStream->readShort();
1070 :
1071 1 : if (nAnyMask & ROWHEIGHT)
1072 : {
1073 0 : sal_Int32 nValue = _rxInStream->readLong();
1074 0 : m_aRowHeight <<= (sal_Int32)nValue;
1075 : }
1076 :
1077 2 : FontDescriptor aFont( getFont() );
1078 1 : if ( nAnyMask & FONTATTRIBS )
1079 : {
1080 1 : aFont.Weight = (float)VCLUnoHelper::ConvertFontWeight( _rxInStream->readShort() );
1081 :
1082 1 : aFont.Slant = (FontSlant)_rxInStream->readShort();
1083 1 : aFont.Underline = _rxInStream->readShort();
1084 1 : aFont.Strikeout = _rxInStream->readShort();
1085 1 : aFont.Orientation = ( (float)_rxInStream->readShort() ) / 10;
1086 1 : aFont.Kerning = _rxInStream->readBoolean();
1087 1 : aFont.WordLineMode = _rxInStream->readBoolean();
1088 : }
1089 1 : if ( nAnyMask & FONTSIZE )
1090 : {
1091 1 : aFont.Width = (sal_Int16)_rxInStream->readLong();
1092 1 : aFont.Height = (sal_Int16)_rxInStream->readLong();
1093 1 : aFont.CharacterWidth = (float)VCLUnoHelper::ConvertFontWidth( _rxInStream->readShort() );
1094 : }
1095 1 : if ( nAnyMask & FONTTYPE )
1096 : {
1097 1 : aFont.Name = _rxInStream->readUTF();
1098 1 : aFont.StyleName = _rxInStream->readUTF();
1099 1 : aFont.Family = _rxInStream->readShort();
1100 1 : aFont.CharSet = _rxInStream->readShort();
1101 1 : aFont.Pitch = _rxInStream->readShort();
1102 : }
1103 :
1104 1 : if ( nAnyMask & ( FONTATTRIBS | FONTSIZE | FONTTYPE ) )
1105 1 : setFont( aFont );
1106 :
1107 : // Name
1108 1 : _rxInStream >> m_aDefaultControl;
1109 1 : m_nBorder = _rxInStream->readShort();
1110 1 : m_bEnable = _rxInStream->readBoolean();
1111 :
1112 1 : if (nAnyMask & TABSTOP)
1113 : {
1114 0 : m_aTabStop = makeBoolAny(_rxInStream->readBoolean());
1115 : }
1116 :
1117 1 : if (nVersion > 3)
1118 1 : m_bNavigation = _rxInStream->readBoolean();
1119 :
1120 1 : if (nAnyMask & TEXTCOLOR)
1121 : {
1122 0 : sal_Int32 nValue = _rxInStream->readLong();
1123 0 : setTextColor( (sal_Int32)nValue );
1124 : }
1125 :
1126 : // neu ab Version 6
1127 1 : if (nVersion > 5)
1128 1 : _rxInStream >> m_sHelpText;
1129 :
1130 1 : if (nAnyMask & FONTDESCRIPTOR)
1131 : {
1132 1 : FontDescriptor aUNOFont;
1133 1 : _rxInStream >> aUNOFont;
1134 1 : setFont( aFont );
1135 : }
1136 :
1137 1 : if (nAnyMask & RECORDMARKER)
1138 0 : m_bRecordMarker = _rxInStream->readBoolean();
1139 :
1140 : // neu ab Version 7
1141 1 : if (nVersion > 6)
1142 1 : m_bPrintable = _rxInStream->readBoolean();
1143 :
1144 1 : if (nAnyMask & BACKGROUNDCOLOR)
1145 : {
1146 0 : sal_Int32 nValue = _rxInStream->readLong();
1147 0 : m_aBackgroundColor <<= (sal_Int32)nValue;
1148 1 : }
1149 : }
1150 :
1151 : //.........................................................................
1152 72 : } // namespace frm
1153 : //.........................................................................
1154 :
1155 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|