LCOV - code coverage report
Current view: top level - usr/local/src/libreoffice/forms/source/component - Grid.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 488 587 83.1 %
Date: 2013-07-09 Functions: 43 47 91.5 %
Legend: Lines: hit not hit

          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: */

Generated by: LCOV version 1.10