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