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_toolkit.hxx"
26 
27 #include "gridcontrol.hxx"
28 #include "grideventforwarder.hxx"
29 
30 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
31 #include <com/sun/star/view/SelectionType.hpp>
32 #include <com/sun/star/awt/grid/XGridDataModel.hpp>
33 #include <com/sun/star/awt/grid/XMutableGridDataModel.hpp>
34 #include <com/sun/star/awt/grid/DefaultGridDataModel.hpp>
35 #include <com/sun/star/awt/grid/SortableGridDataModel.hpp>
36 #include <com/sun/star/awt/grid/XGridColumnModel.hpp>
37 #include <toolkit/helper/unopropertyarrayhelper.hxx>
38 #include <toolkit/helper/property.hxx>
39 #include <com/sun/star/awt/XVclWindowPeer.hpp>
40 #include <comphelper/processfactory.hxx>
41 #include <tools/diagnose_ex.h>
42 #include <tools/color.hxx>
43 
44 using ::rtl::OUString;
45 using namespace ::com::sun::star;
46 using namespace ::com::sun::star::uno;
47 using namespace ::com::sun::star::awt;
48 using namespace ::com::sun::star::awt::grid;
49 using namespace ::com::sun::star::lang;
50 using namespace ::com::sun::star::beans;
51 using namespace ::com::sun::star::container;
52 using namespace ::com::sun::star::view;
53 using namespace ::com::sun::star::util;
54 
55 namespace toolkit
56 {
57 //======================================================================================================================
58 //= UnoGridModel
59 //======================================================================================================================
60 namespace
61 {
lcl_getDefaultDataModel_throw(::comphelper::ComponentContext const & i_context)62     Reference< XGridDataModel > lcl_getDefaultDataModel_throw( ::comphelper::ComponentContext const & i_context )
63     {
64         Reference< XMutableGridDataModel > const xDelegatorModel( DefaultGridDataModel::create( i_context.getUNOContext() ), UNO_QUERY_THROW );
65         Reference< XGridDataModel > const xDataModel( SortableGridDataModel::create( i_context.getUNOContext(), xDelegatorModel ), UNO_QUERY_THROW );
66         return xDataModel;
67     }
68 
lcl_getDefaultColumnModel_throw(::comphelper::ComponentContext const & i_context)69     Reference< XGridColumnModel > lcl_getDefaultColumnModel_throw( ::comphelper::ComponentContext const & i_context )
70     {
71         Reference< XGridColumnModel > const xColumnModel( i_context.createComponent( "com.sun.star.awt.grid.DefaultGridColumnModel" ), UNO_QUERY_THROW );
72         return xColumnModel;
73     }
74 }
75 
76 //----------------------------------------------------------------------------------------------------------------------
UnoGridModel(const::com::sun::star::uno::Reference<::com::sun::star::lang::XMultiServiceFactory> & i_factory)77 UnoGridModel::UnoGridModel( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& i_factory )
78         :UnoControlModel( i_factory )
79 {
80 	ImplRegisterProperty( BASEPROPERTY_BACKGROUNDCOLOR );
81     ImplRegisterProperty( BASEPROPERTY_BORDER );
82 	ImplRegisterProperty( BASEPROPERTY_BORDERCOLOR );
83     ImplRegisterProperty( BASEPROPERTY_DEFAULTCONTROL );
84 	ImplRegisterProperty( BASEPROPERTY_ENABLED );
85 	ImplRegisterProperty( BASEPROPERTY_FILLCOLOR );
86     ImplRegisterProperty( BASEPROPERTY_HELPTEXT );
87 	ImplRegisterProperty( BASEPROPERTY_HELPURL );
88     ImplRegisterProperty( BASEPROPERTY_PRINTABLE );
89 	ImplRegisterProperty( BASEPROPERTY_SIZEABLE ); // resizeable
90 	ImplRegisterProperty( BASEPROPERTY_HSCROLL );
91 	ImplRegisterProperty( BASEPROPERTY_VSCROLL );
92 	ImplRegisterProperty( BASEPROPERTY_TABSTOP );
93 	ImplRegisterProperty( BASEPROPERTY_GRID_SHOWROWHEADER );
94 	ImplRegisterProperty( BASEPROPERTY_ROW_HEADER_WIDTH );
95 	ImplRegisterProperty( BASEPROPERTY_GRID_SHOWCOLUMNHEADER );
96 	ImplRegisterProperty( BASEPROPERTY_COLUMN_HEADER_HEIGHT );
97 	ImplRegisterProperty( BASEPROPERTY_ROW_HEIGHT );
98 	ImplRegisterProperty( BASEPROPERTY_GRID_DATAMODEL, makeAny( lcl_getDefaultDataModel_throw( maContext ) ) );
99 	ImplRegisterProperty( BASEPROPERTY_GRID_COLUMNMODEL, makeAny( lcl_getDefaultColumnModel_throw( maContext ) ) );
100 	ImplRegisterProperty( BASEPROPERTY_GRID_SELECTIONMODE );
101 	ImplRegisterProperty( BASEPROPERTY_FONTRELIEF );
102 	ImplRegisterProperty( BASEPROPERTY_FONTEMPHASISMARK );
103 	ImplRegisterProperty( BASEPROPERTY_FONTDESCRIPTOR );
104 	ImplRegisterProperty( BASEPROPERTY_TEXTCOLOR );
105 	ImplRegisterProperty( BASEPROPERTY_TEXTLINECOLOR );
106 	ImplRegisterProperty( BASEPROPERTY_USE_GRID_LINES );
107 	ImplRegisterProperty( BASEPROPERTY_GRID_LINE_COLOR );
108 	ImplRegisterProperty( BASEPROPERTY_GRID_HEADER_BACKGROUND );
109     ImplRegisterProperty( BASEPROPERTY_GRID_HEADER_TEXT_COLOR );
110     ImplRegisterProperty( BASEPROPERTY_GRID_ROW_BACKGROUND_COLORS );
111     ImplRegisterProperty( BASEPROPERTY_ACTIVE_SEL_BACKGROUND_COLOR );
112     ImplRegisterProperty( BASEPROPERTY_INACTIVE_SEL_BACKGROUND_COLOR );
113     ImplRegisterProperty( BASEPROPERTY_ACTIVE_SEL_TEXT_COLOR );
114     ImplRegisterProperty( BASEPROPERTY_INACTIVE_SEL_TEXT_COLOR );
115 	ImplRegisterProperty( BASEPROPERTY_VERTICALALIGN );
116 }
117 
118 //----------------------------------------------------------------------------------------------------------------------
UnoGridModel(const UnoGridModel & rModel)119 UnoGridModel::UnoGridModel( const UnoGridModel& rModel )
120     :UnoControlModel( rModel )
121 {
122     osl_incrementInterlockedCount( &m_refCount );
123     {
124         Reference< XGridDataModel > xDataModel;
125         // clone the data model
126         const Reference< XFastPropertySet > xCloneSource( &const_cast< UnoGridModel& >( rModel ) );
127         try
128         {
129             const Reference< XCloneable > xCloneable( xCloneSource->getFastPropertyValue( BASEPROPERTY_GRID_DATAMODEL ), UNO_QUERY_THROW );
130             xDataModel.set( xCloneable->createClone(), UNO_QUERY_THROW );
131         }
132         catch( const Exception& )
133         {
134     	    DBG_UNHANDLED_EXCEPTION();
135         }
136         if ( !xDataModel.is() )
137             xDataModel = lcl_getDefaultDataModel_throw( maContext );
138         UnoControlModel::setFastPropertyValue_NoBroadcast( BASEPROPERTY_GRID_DATAMODEL, makeAny( xDataModel ) );
139             // do *not* use setFastPropertyValue here: The UnoControlModel ctor did a simple copy of all property values,
140             // so before this call here, we share our data model with the own of the clone source. setFastPropertyValue,
141             // then, disposes the old data model - which means the data model which in fact belongs to the clone source.
142             // so, call the UnoControlModel's impl-method for setting the value.
143 
144         // clone the column model
145         Reference< XGridColumnModel > xColumnModel;
146         try
147         {
148             const Reference< XCloneable > xCloneable( xCloneSource->getFastPropertyValue( BASEPROPERTY_GRID_COLUMNMODEL ), UNO_QUERY_THROW );
149             xColumnModel.set( xCloneable->createClone(), UNO_QUERY_THROW );
150         }
151         catch( const Exception& )
152         {
153     	    DBG_UNHANDLED_EXCEPTION();
154         }
155         if ( !xColumnModel.is() )
156             xColumnModel = lcl_getDefaultColumnModel_throw( maContext );
157         UnoControlModel::setFastPropertyValue_NoBroadcast( BASEPROPERTY_GRID_COLUMNMODEL, makeAny( xColumnModel ) );
158             // same comment as above: do not use our own setPropertyValue here.
159     }
160     osl_decrementInterlockedCount( &m_refCount );
161 }
162 
163 //----------------------------------------------------------------------------------------------------------------------
Clone() const164 UnoControlModel* UnoGridModel::Clone() const
165 {
166 	return new UnoGridModel( *this );
167 }
168 
169 //----------------------------------------------------------------------------------------------------------------------
170 namespace
171 {
lcl_dispose_nothrow(const Any & i_component)172     void lcl_dispose_nothrow( const Any& i_component )
173     {
174         try
175         {
176             const Reference< XComponent > xComponent( i_component, UNO_QUERY_THROW );
177             xComponent->dispose();
178         }
179         catch( const Exception& )
180         {
181         	DBG_UNHANDLED_EXCEPTION();
182         }
183     }
184 }
185 
186 //----------------------------------------------------------------------------------------------------------------------
dispose()187 void SAL_CALL UnoGridModel::dispose(  ) throw(RuntimeException)
188 {
189     lcl_dispose_nothrow( getFastPropertyValue( BASEPROPERTY_GRID_COLUMNMODEL ) );
190     lcl_dispose_nothrow( getFastPropertyValue( BASEPROPERTY_GRID_DATAMODEL ) );
191 
192     UnoControlModel::dispose();
193 }
194 
195 //----------------------------------------------------------------------------------------------------------------------
setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any & rValue)196 void SAL_CALL UnoGridModel::setFastPropertyValue_NoBroadcast( sal_Int32 nHandle, const Any& rValue ) throw (Exception)
197 {
198     Any aOldSubModel;
199     if ( ( nHandle == BASEPROPERTY_GRID_COLUMNMODEL ) || ( nHandle == BASEPROPERTY_GRID_DATAMODEL ) )
200     {
201         aOldSubModel = getFastPropertyValue( nHandle );
202         if ( aOldSubModel == rValue )
203         {
204             OSL_ENSURE( false, "UnoGridModel::setFastPropertyValue_NoBroadcast: setting the same value, again!" );
205                 // shouldn't this have been caught by convertFastPropertyValue?
206             aOldSubModel.clear();
207         }
208     }
209 
210     UnoControlModel::setFastPropertyValue_NoBroadcast( nHandle, rValue );
211 
212     if ( aOldSubModel.hasValue() )
213         lcl_dispose_nothrow( aOldSubModel );
214 }
215 
216 //----------------------------------------------------------------------------------------------------------------------
getServiceName()217 OUString UnoGridModel::getServiceName() throw(RuntimeException)
218 {
219 	return OUString::createFromAscii( szServiceName_GridControlModel );
220 }
221 
222 //----------------------------------------------------------------------------------------------------------------------
ImplGetDefaultValue(sal_uInt16 nPropId) const223 Any UnoGridModel::ImplGetDefaultValue( sal_uInt16 nPropId ) const
224 {
225 	switch( nPropId )
226 	{
227 		case BASEPROPERTY_DEFAULTCONTROL:
228 			return uno::makeAny( ::rtl::OUString::createFromAscii( szServiceName_GridControl ) );
229 		case BASEPROPERTY_GRID_SELECTIONMODE:
230 			return uno::makeAny( SelectionType(1) );
231 		case BASEPROPERTY_GRID_SHOWROWHEADER:
232         case BASEPROPERTY_USE_GRID_LINES:
233 			return uno::makeAny( (sal_Bool)sal_False );
234         case BASEPROPERTY_ROW_HEADER_WIDTH:
235             return uno::makeAny( sal_Int32( 10 ) );
236 		case BASEPROPERTY_GRID_SHOWCOLUMNHEADER:
237 			return uno::makeAny( (sal_Bool)sal_True );
238         case BASEPROPERTY_COLUMN_HEADER_HEIGHT:
239         case BASEPROPERTY_ROW_HEIGHT:
240 		case BASEPROPERTY_GRID_HEADER_BACKGROUND:
241         case BASEPROPERTY_GRID_HEADER_TEXT_COLOR:
242 		case BASEPROPERTY_GRID_LINE_COLOR:
243         case BASEPROPERTY_GRID_ROW_BACKGROUND_COLORS:
244         case BASEPROPERTY_ACTIVE_SEL_BACKGROUND_COLOR:
245         case BASEPROPERTY_INACTIVE_SEL_BACKGROUND_COLOR:
246         case BASEPROPERTY_ACTIVE_SEL_TEXT_COLOR:
247         case BASEPROPERTY_INACTIVE_SEL_TEXT_COLOR:
248             return Any();
249 		default:
250 			return UnoControlModel::ImplGetDefaultValue( nPropId );
251 	}
252 
253 }
254 
255 //----------------------------------------------------------------------------------------------------------------------
getInfoHelper()256 ::cppu::IPropertyArrayHelper& UnoGridModel::getInfoHelper()
257 {
258 	static UnoPropertyArrayHelper* pHelper = NULL;
259 	if ( !pHelper )
260 	{
261 		Sequence<sal_Int32>	aIDs = ImplGetPropertyIds();
262 		pHelper = new UnoPropertyArrayHelper( aIDs );
263 	}
264 	return *pHelper;
265 }
266 
267 //----------------------------------------------------------------------------------------------------------------------
268 // XMultiPropertySet
getPropertySetInfo()269 Reference< XPropertySetInfo > UnoGridModel::getPropertySetInfo(  ) throw(RuntimeException)
270 {
271 	static Reference< XPropertySetInfo > xInfo( createPropertySetInfo( getInfoHelper() ) );
272 	return xInfo;
273 }
274 
275 
276 //======================================================================================================================
277 //= UnoGridControl
278 //======================================================================================================================
UnoGridControl(const Reference<XMultiServiceFactory> & i_factory)279 UnoGridControl::UnoGridControl( const Reference< XMultiServiceFactory >& i_factory )
280     :UnoGridControl_Base( i_factory )
281     ,mSelectionMode(SelectionType(1))
282 	,m_aSelectionListeners( *this )
283     ,m_pEventForwarder( new GridEventForwarder( *this ) )
284 {
285 }
286 
287 //----------------------------------------------------------------------------------------------------------------------
~UnoGridControl()288 UnoGridControl::~UnoGridControl()
289 {
290 }
291 
292 //----------------------------------------------------------------------------------------------------------------------
GetComponentServiceName()293 OUString UnoGridControl::GetComponentServiceName()
294 {
295 	return OUString::createFromAscii( "Grid" );
296 }
297 
298 //----------------------------------------------------------------------------------------------------------------------
dispose()299 void SAL_CALL UnoGridControl::dispose(  ) throw(RuntimeException)
300 {
301 	lang::EventObject aEvt;
302 	aEvt.Source = (::cppu::OWeakObject*)this;
303 	m_aSelectionListeners.disposeAndClear( aEvt );
304 	UnoControl::dispose();
305 }
306 
307 //----------------------------------------------------------------------------------------------------------------------
createPeer(const uno::Reference<awt::XToolkit> & rxToolkit,const uno::Reference<awt::XWindowPeer> & rParentPeer)308 void SAL_CALL UnoGridControl::createPeer( const uno::Reference< awt::XToolkit > & rxToolkit, const uno::Reference< awt::XWindowPeer >  & rParentPeer ) throw(uno::RuntimeException)
309 {
310 	UnoControlBase::createPeer( rxToolkit, rParentPeer );
311 
312 	const Reference< XGridRowSelection > xGrid( getPeer(), UNO_QUERY_THROW );
313 	xGrid->addSelectionListener( &m_aSelectionListeners );
314 }
315 
316 //----------------------------------------------------------------------------------------------------------------------
317 namespace
318 {
lcl_setEventForwarding(const Reference<XControlModel> & i_gridControlModel,const::boost::scoped_ptr<GridEventForwarder> & i_listener,bool const i_add)319     void lcl_setEventForwarding( const Reference< XControlModel >& i_gridControlModel, const ::boost::scoped_ptr< GridEventForwarder >& i_listener,
320         bool const i_add )
321     {
322         const Reference< XPropertySet > xModelProps( i_gridControlModel, UNO_QUERY );
323         if ( !xModelProps.is() )
324             return;
325 
326         try
327         {
328             Reference< XContainer > const xColModel(
329                 xModelProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "ColumnModel" ) ) ),
330                 UNO_QUERY_THROW );
331             if ( i_add )
332                 xColModel->addContainerListener( i_listener.get() );
333             else
334                 xColModel->removeContainerListener( i_listener.get() );
335 
336             Reference< XGridDataModel > const xDataModel(
337                 xModelProps->getPropertyValue( ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "GridDataModel" ) ) ),
338                 UNO_QUERY_THROW
339             );
340             Reference< XMutableGridDataModel > const xMutableDataModel( xDataModel, UNO_QUERY );
341             if ( xMutableDataModel.is() )
342             {
343                 if ( i_add )
344                     xMutableDataModel->addGridDataListener( i_listener.get() );
345                 else
346                     xMutableDataModel->removeGridDataListener( i_listener.get() );
347             }
348         }
349         catch( const Exception& )
350         {
351 	        DBG_UNHANDLED_EXCEPTION();
352         }
353     }
354 }
355 
356 //----------------------------------------------------------------------------------------------------------------------
setModel(const Reference<XControlModel> & i_model)357 sal_Bool SAL_CALL UnoGridControl::setModel( const Reference< XControlModel >& i_model ) throw(RuntimeException)
358 {
359     lcl_setEventForwarding( getModel(), m_pEventForwarder, false );
360     if ( !UnoGridControl_Base::setModel( i_model ) )
361         return sal_False;
362     lcl_setEventForwarding( getModel(), m_pEventForwarder, true );
363     return sal_True;
364 }
365 
366 //----------------------------------------------------------------------------------------------------------------------
getRowAtPoint(::sal_Int32 x,::sal_Int32 y)367 ::sal_Int32 UnoGridControl::getRowAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException)
368 {
369 	Reference< XGridControl > const xGrid ( getPeer(), UNO_QUERY_THROW );
370 	return xGrid->getRowAtPoint( x, y );
371 }
372 
373 //----------------------------------------------------------------------------------------------------------------------
getColumnAtPoint(::sal_Int32 x,::sal_Int32 y)374 ::sal_Int32 UnoGridControl::getColumnAtPoint(::sal_Int32 x, ::sal_Int32 y) throw (::com::sun::star::uno::RuntimeException)
375 {
376 	Reference< XGridControl > const xGrid ( getPeer(), UNO_QUERY_THROW );
377 	return xGrid->getColumnAtPoint( x, y );
378 }
379 
380 //----------------------------------------------------------------------------------------------------------------------
getCurrentColumn()381 ::sal_Int32 SAL_CALL UnoGridControl::getCurrentColumn(  ) throw (RuntimeException)
382 {
383 	Reference< XGridControl > const xGrid ( getPeer(), UNO_QUERY_THROW );
384 	return xGrid->getCurrentColumn();
385 }
386 
387 //----------------------------------------------------------------------------------------------------------------------
getCurrentRow()388 ::sal_Int32 SAL_CALL UnoGridControl::getCurrentRow(  ) throw (RuntimeException)
389 {
390 	Reference< XGridControl > const xGrid ( getPeer(), UNO_QUERY_THROW );
391 	return xGrid->getCurrentRow();
392 }
393 
394 //----------------------------------------------------------------------------------------------------------------------
goToCell(::sal_Int32 i_columnIndex,::sal_Int32 i_rowIndex)395 void SAL_CALL UnoGridControl::goToCell( ::sal_Int32 i_columnIndex, ::sal_Int32 i_rowIndex ) throw (RuntimeException, IndexOutOfBoundsException, VetoException)
396 {
397 	Reference< XGridControl > const xGrid ( getPeer(), UNO_QUERY_THROW );
398 	xGrid->goToCell( i_columnIndex, i_rowIndex );
399 }
400 
401 //----------------------------------------------------------------------------------------------------------------------
selectRow(::sal_Int32 i_rowIndex)402 void SAL_CALL UnoGridControl::selectRow( ::sal_Int32 i_rowIndex ) throw (RuntimeException, IndexOutOfBoundsException )
403 {
404 	Reference< XGridRowSelection >( getPeer(), UNO_QUERY_THROW )->selectRow( i_rowIndex );
405 }
406 
407 //----------------------------------------------------------------------------------------------------------------------
selectAllRows()408 void SAL_CALL UnoGridControl::selectAllRows() throw (::com::sun::star::uno::RuntimeException)
409 {
410 	Reference< XGridRowSelection >( getPeer(), UNO_QUERY_THROW )->selectAllRows();
411 }
412 
413 //----------------------------------------------------------------------------------------------------------------------
deselectRow(::sal_Int32 i_rowIndex)414 void SAL_CALL UnoGridControl::deselectRow( ::sal_Int32 i_rowIndex ) throw (RuntimeException, IndexOutOfBoundsException )
415 {
416 	Reference< XGridRowSelection >( getPeer(), UNO_QUERY_THROW )->deselectRow( i_rowIndex );
417 }
418 
419 //----------------------------------------------------------------------------------------------------------------------
deselectAllRows()420 void SAL_CALL UnoGridControl::deselectAllRows() throw (::com::sun::star::uno::RuntimeException)
421 {
422 	Reference< XGridRowSelection >( getPeer(), UNO_QUERY_THROW )->deselectAllRows();
423 }
424 
425 //----------------------------------------------------------------------------------------------------------------------
getSelectedRows()426 ::com::sun::star::uno::Sequence< ::sal_Int32 > SAL_CALL UnoGridControl::getSelectedRows() throw (::com::sun::star::uno::RuntimeException)
427 {
428 	return Reference< XGridRowSelection >( getPeer(), UNO_QUERY_THROW )->getSelectedRows();
429 }
430 
431 //----------------------------------------------------------------------------------------------------------------------
hasSelectedRows()432 ::sal_Bool SAL_CALL UnoGridControl::hasSelectedRows() throw (::com::sun::star::uno::RuntimeException)
433 {
434 	return Reference< XGridRowSelection >( getPeer(), UNO_QUERY_THROW )->hasSelectedRows();
435 }
436 
437 //----------------------------------------------------------------------------------------------------------------------
isRowSelected(::sal_Int32 index)438 ::sal_Bool SAL_CALL UnoGridControl::isRowSelected(::sal_Int32 index) throw (::com::sun::star::uno::RuntimeException)
439 {
440 	return Reference< XGridRowSelection >( getPeer(), UNO_QUERY_THROW )->isRowSelected( index );
441 }
442 
443 //----------------------------------------------------------------------------------------------------------------------
addSelectionListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::grid::XGridSelectionListener> & listener)444 void SAL_CALL UnoGridControl::addSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException)
445 {
446 	m_aSelectionListeners.addInterface( listener );
447 }
448 
449 //----------------------------------------------------------------------------------------------------------------------
removeSelectionListener(const::com::sun::star::uno::Reference<::com::sun::star::awt::grid::XGridSelectionListener> & listener)450 void SAL_CALL UnoGridControl::removeSelectionListener(const ::com::sun::star::uno::Reference< ::com::sun::star::awt::grid::XGridSelectionListener > & listener) throw (::com::sun::star::uno::RuntimeException)
451 {
452 	m_aSelectionListeners.removeInterface( listener );
453 }
454 
455 }//namespace toolkit
456 
GridControl_CreateInstance(const Reference<XMultiServiceFactory> & i_factory)457 Reference< XInterface > SAL_CALL GridControl_CreateInstance( const Reference< XMultiServiceFactory >& i_factory )
458 {
459 	return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::UnoGridControl( i_factory ) );
460 }
461 
GridControlModel_CreateInstance(const Reference<XMultiServiceFactory> & i_factory)462 Reference< XInterface > SAL_CALL GridControlModel_CreateInstance( const Reference< XMultiServiceFactory >& i_factory )
463 {
464 	return Reference < XInterface >( ( ::cppu::OWeakObject* ) new ::toolkit::UnoGridModel( i_factory ) );
465 }
466