1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_chart2.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir #include "RangeHighlighter.hxx"
32*cdf0e10cSrcweir #include "WeakListenerAdapter.hxx"
33*cdf0e10cSrcweir #include "ChartModelHelper.hxx"
34*cdf0e10cSrcweir #include "DataSourceHelper.hxx"
35*cdf0e10cSrcweir #include "ContainerHelper.hxx"
36*cdf0e10cSrcweir #include "macros.hxx"
37*cdf0e10cSrcweir #include "ObjectIdentifier.hxx"
38*cdf0e10cSrcweir #include "DataSeriesHelper.hxx"
39*cdf0e10cSrcweir 
40*cdf0e10cSrcweir #include <com/sun/star/chart2/XDataSeries.hpp>
41*cdf0e10cSrcweir #include <com/sun/star/chart/ErrorBarStyle.hpp>
42*cdf0e10cSrcweir #include <com/sun/star/drawing/XShape.hpp>
43*cdf0e10cSrcweir 
44*cdf0e10cSrcweir #define PREFERED_DEFAULT_COLOR 0x0000ff
45*cdf0e10cSrcweir 
46*cdf0e10cSrcweir using namespace ::com::sun::star;
47*cdf0e10cSrcweir 
48*cdf0e10cSrcweir using ::com::sun::star::uno::Reference;
49*cdf0e10cSrcweir using ::com::sun::star::uno::Sequence;
50*cdf0e10cSrcweir using ::rtl::OUString;
51*cdf0e10cSrcweir 
52*cdf0e10cSrcweir namespace
53*cdf0e10cSrcweir {
54*cdf0e10cSrcweir 
55*cdf0e10cSrcweir void lcl_fillRanges(
56*cdf0e10cSrcweir     Sequence< chart2::data::HighlightedRange > & rOutRanges,
57*cdf0e10cSrcweir     Sequence< OUString > aRangeStrings,
58*cdf0e10cSrcweir     sal_Int32 nPreferredColor = PREFERED_DEFAULT_COLOR,
59*cdf0e10cSrcweir     sal_Int32 nIndex = -1 )
60*cdf0e10cSrcweir {
61*cdf0e10cSrcweir     rOutRanges.realloc( aRangeStrings.getLength());
62*cdf0e10cSrcweir     for( sal_Int32 i=0; i<aRangeStrings.getLength(); ++i )
63*cdf0e10cSrcweir     {
64*cdf0e10cSrcweir         rOutRanges[i].RangeRepresentation = aRangeStrings[i];
65*cdf0e10cSrcweir         rOutRanges[i].PreferredColor = nPreferredColor;
66*cdf0e10cSrcweir         rOutRanges[i].AllowMerginigWithOtherRanges = sal_False;
67*cdf0e10cSrcweir         rOutRanges[i].Index = nIndex;
68*cdf0e10cSrcweir     }
69*cdf0e10cSrcweir }
70*cdf0e10cSrcweir 
71*cdf0e10cSrcweir } // anonymous namespace
72*cdf0e10cSrcweir 
73*cdf0e10cSrcweir namespace chart
74*cdf0e10cSrcweir {
75*cdf0e10cSrcweir 
76*cdf0e10cSrcweir RangeHighlighter::RangeHighlighter(
77*cdf0e10cSrcweir     const Reference< view::XSelectionSupplier > & xSelectionSupplier ) :
78*cdf0e10cSrcweir         impl::RangeHighlighter_Base( m_aMutex ),
79*cdf0e10cSrcweir         m_xSelectionSupplier( xSelectionSupplier ),
80*cdf0e10cSrcweir         m_nAddedListenerCount( 0 ),
81*cdf0e10cSrcweir         m_bIncludeHiddenCells(true)
82*cdf0e10cSrcweir {
83*cdf0e10cSrcweir }
84*cdf0e10cSrcweir 
85*cdf0e10cSrcweir RangeHighlighter::~RangeHighlighter()
86*cdf0e10cSrcweir {}
87*cdf0e10cSrcweir 
88*cdf0e10cSrcweir // ____ XRangeHighlighter ____
89*cdf0e10cSrcweir Sequence< chart2::data::HighlightedRange > SAL_CALL RangeHighlighter::getSelectedRanges()
90*cdf0e10cSrcweir     throw (uno::RuntimeException)
91*cdf0e10cSrcweir {
92*cdf0e10cSrcweir     return m_aSelectedRanges;
93*cdf0e10cSrcweir }
94*cdf0e10cSrcweir 
95*cdf0e10cSrcweir void RangeHighlighter::determineRanges()
96*cdf0e10cSrcweir {
97*cdf0e10cSrcweir     m_aSelectedRanges.realloc( 0 );
98*cdf0e10cSrcweir     if( m_xSelectionSupplier.is())
99*cdf0e10cSrcweir     {
100*cdf0e10cSrcweir         try
101*cdf0e10cSrcweir         {
102*cdf0e10cSrcweir             Reference< frame::XController > xController( m_xSelectionSupplier, uno::UNO_QUERY );
103*cdf0e10cSrcweir             Reference< frame::XModel > xChartModel;
104*cdf0e10cSrcweir             if( xController.is())
105*cdf0e10cSrcweir                 xChartModel.set( xController->getModel());
106*cdf0e10cSrcweir 
107*cdf0e10cSrcweir             m_bIncludeHiddenCells = ChartModelHelper::isIncludeHiddenCells( xChartModel );
108*cdf0e10cSrcweir 
109*cdf0e10cSrcweir             uno::Any aSelection( m_xSelectionSupplier->getSelection());
110*cdf0e10cSrcweir             const uno::Type& rType = aSelection.getValueType();
111*cdf0e10cSrcweir 
112*cdf0e10cSrcweir             if ( rType == ::getCppuType( static_cast< const OUString* >( 0 ) ) )
113*cdf0e10cSrcweir             {
114*cdf0e10cSrcweir                 // @todo??: maybe getSelection() should return a model object rather than a CID
115*cdf0e10cSrcweir 
116*cdf0e10cSrcweir                 OUString aCID;
117*cdf0e10cSrcweir                 aSelection >>= aCID;
118*cdf0e10cSrcweir                 if ( aCID.getLength() > 0 )
119*cdf0e10cSrcweir                 {
120*cdf0e10cSrcweir                     ObjectType eObjectType = ObjectIdentifier::getObjectType( aCID );
121*cdf0e10cSrcweir                     sal_Int32 nIndex = ObjectIdentifier::getIndexFromParticleOrCID( aCID );
122*cdf0e10cSrcweir                     Reference< chart2::XDataSeries > xDataSeries( ObjectIdentifier::getDataSeriesForCID( aCID, xChartModel ) );
123*cdf0e10cSrcweir                     if( OBJECTTYPE_LEGEND_ENTRY == eObjectType )
124*cdf0e10cSrcweir                     {
125*cdf0e10cSrcweir                         OUString aParentParticel( ObjectIdentifier::getFullParentParticle( aCID ) );
126*cdf0e10cSrcweir                         ObjectType eParentObjectType = ObjectIdentifier::getObjectType( aParentParticel );
127*cdf0e10cSrcweir                         eObjectType = eParentObjectType;
128*cdf0e10cSrcweir                         if( OBJECTTYPE_DATA_POINT == eObjectType )
129*cdf0e10cSrcweir                             nIndex = ObjectIdentifier::getIndexFromParticleOrCID( aParentParticel );
130*cdf0e10cSrcweir                     }
131*cdf0e10cSrcweir 
132*cdf0e10cSrcweir                     if( OBJECTTYPE_DATA_POINT == eObjectType || OBJECTTYPE_DATA_LABEL == eObjectType )
133*cdf0e10cSrcweir                     {
134*cdf0e10cSrcweir                         // Data Point
135*cdf0e10cSrcweir                         fillRangesForDataPoint( xDataSeries, nIndex );
136*cdf0e10cSrcweir                         return;
137*cdf0e10cSrcweir                     }
138*cdf0e10cSrcweir                     else if( OBJECTTYPE_DATA_ERRORS == eObjectType )
139*cdf0e10cSrcweir                     {
140*cdf0e10cSrcweir                         // select error bar ranges, or data series, if the style is
141*cdf0e10cSrcweir                         // not set to FROM_DATA
142*cdf0e10cSrcweir                         fillRangesForErrorBars( ObjectIdentifier::getObjectPropertySet( aCID, xChartModel ), xDataSeries );
143*cdf0e10cSrcweir                         return;
144*cdf0e10cSrcweir                     }
145*cdf0e10cSrcweir                     else if( xDataSeries.is() )
146*cdf0e10cSrcweir                     {
147*cdf0e10cSrcweir                         // Data Series
148*cdf0e10cSrcweir                         fillRangesForDataSeries( xDataSeries );
149*cdf0e10cSrcweir                         return;
150*cdf0e10cSrcweir                     }
151*cdf0e10cSrcweir                     else if( OBJECTTYPE_AXIS == eObjectType )
152*cdf0e10cSrcweir                     {
153*cdf0e10cSrcweir                         // Axis (Categories)
154*cdf0e10cSrcweir                         Reference< chart2::XAxis > xAxis( ObjectIdentifier::getObjectPropertySet( aCID, xChartModel ), uno::UNO_QUERY );
155*cdf0e10cSrcweir                         if( xAxis.is())
156*cdf0e10cSrcweir                         {
157*cdf0e10cSrcweir                             fillRangesForCategories( xAxis );
158*cdf0e10cSrcweir                             return;
159*cdf0e10cSrcweir                         }
160*cdf0e10cSrcweir                     }
161*cdf0e10cSrcweir                     else if( OBJECTTYPE_PAGE == eObjectType
162*cdf0e10cSrcweir                              || OBJECTTYPE_DIAGRAM == eObjectType
163*cdf0e10cSrcweir                              || OBJECTTYPE_DIAGRAM_WALL == eObjectType
164*cdf0e10cSrcweir                              || OBJECTTYPE_DIAGRAM_FLOOR == eObjectType
165*cdf0e10cSrcweir                         )
166*cdf0e10cSrcweir                     {
167*cdf0e10cSrcweir                         // Diagram
168*cdf0e10cSrcweir                         Reference< chart2::XDiagram > xDia( ObjectIdentifier::getDiagramForCID( aCID, xChartModel ) );
169*cdf0e10cSrcweir                         if( xDia.is())
170*cdf0e10cSrcweir                         {
171*cdf0e10cSrcweir                             fillRangesForDiagram( xDia );
172*cdf0e10cSrcweir                             return;
173*cdf0e10cSrcweir                         }
174*cdf0e10cSrcweir                     }
175*cdf0e10cSrcweir                 }
176*cdf0e10cSrcweir             }
177*cdf0e10cSrcweir             else if ( rType == ::getCppuType( static_cast< const Reference< drawing::XShape >* >( 0 ) ) )
178*cdf0e10cSrcweir             {
179*cdf0e10cSrcweir                 // #i12587# support for shapes in chart
180*cdf0e10cSrcweir                 Reference< drawing::XShape > xShape;
181*cdf0e10cSrcweir                 aSelection >>= xShape;
182*cdf0e10cSrcweir                 if ( xShape.is() )
183*cdf0e10cSrcweir                 {
184*cdf0e10cSrcweir                     return;
185*cdf0e10cSrcweir                 }
186*cdf0e10cSrcweir             }
187*cdf0e10cSrcweir             else
188*cdf0e10cSrcweir             {
189*cdf0e10cSrcweir                 //if nothing is selected select all ranges
190*cdf0e10cSrcweir                 Reference< chart2::XChartDocument > xChartDoc( xChartModel, uno::UNO_QUERY_THROW );
191*cdf0e10cSrcweir                 fillRangesForDiagram( xChartDoc->getFirstDiagram() );
192*cdf0e10cSrcweir                 return;
193*cdf0e10cSrcweir             }
194*cdf0e10cSrcweir         }
195*cdf0e10cSrcweir         catch( const uno::Exception & ex )
196*cdf0e10cSrcweir         {
197*cdf0e10cSrcweir             ASSERT_EXCEPTION( ex );
198*cdf0e10cSrcweir         }
199*cdf0e10cSrcweir     }
200*cdf0e10cSrcweir }
201*cdf0e10cSrcweir 
202*cdf0e10cSrcweir void RangeHighlighter::fillRangesForDiagram( const Reference< chart2::XDiagram > & xDiagram )
203*cdf0e10cSrcweir {
204*cdf0e10cSrcweir     Sequence< OUString > aSelectedRanges( DataSourceHelper::getUsedDataRanges( xDiagram ));
205*cdf0e10cSrcweir     m_aSelectedRanges.realloc( aSelectedRanges.getLength());
206*cdf0e10cSrcweir     // @todo: merge ranges
207*cdf0e10cSrcweir     for( sal_Int32 i=0; i<aSelectedRanges.getLength(); ++i )
208*cdf0e10cSrcweir     {
209*cdf0e10cSrcweir         m_aSelectedRanges[i].RangeRepresentation = aSelectedRanges[i];
210*cdf0e10cSrcweir         m_aSelectedRanges[i].Index = -1;
211*cdf0e10cSrcweir         m_aSelectedRanges[i].PreferredColor = PREFERED_DEFAULT_COLOR;
212*cdf0e10cSrcweir         m_aSelectedRanges[i].AllowMerginigWithOtherRanges = sal_True;
213*cdf0e10cSrcweir     }
214*cdf0e10cSrcweir }
215*cdf0e10cSrcweir 
216*cdf0e10cSrcweir void RangeHighlighter::fillRangesForDataSeries( const uno::Reference< chart2::XDataSeries > & xSeries )
217*cdf0e10cSrcweir {
218*cdf0e10cSrcweir     sal_Int32 nPreferredColor = PREFERED_DEFAULT_COLOR;
219*cdf0e10cSrcweir     Reference< chart2::data::XDataSource > xSource( xSeries, uno::UNO_QUERY );
220*cdf0e10cSrcweir     if( xSource.is())
221*cdf0e10cSrcweir         lcl_fillRanges( m_aSelectedRanges,
222*cdf0e10cSrcweir                         ::chart::DataSourceHelper::getRangesFromDataSource( xSource ),
223*cdf0e10cSrcweir                         nPreferredColor );
224*cdf0e10cSrcweir }
225*cdf0e10cSrcweir 
226*cdf0e10cSrcweir void RangeHighlighter::fillRangesForErrorBars(
227*cdf0e10cSrcweir     const uno::Reference< beans::XPropertySet > & xErrorBar,
228*cdf0e10cSrcweir     const uno::Reference< chart2::XDataSeries > & xSeries )
229*cdf0e10cSrcweir {
230*cdf0e10cSrcweir     // only show error bar ranges, if the style is set to FROM_DATA
231*cdf0e10cSrcweir     bool bUsesRangesAsErrorBars = false;
232*cdf0e10cSrcweir     try
233*cdf0e10cSrcweir     {
234*cdf0e10cSrcweir         sal_Int32 nStyle = ::com::sun::star::chart::ErrorBarStyle::NONE;
235*cdf0e10cSrcweir         bUsesRangesAsErrorBars =
236*cdf0e10cSrcweir             ( xErrorBar.is() &&
237*cdf0e10cSrcweir               (xErrorBar->getPropertyValue( C2U("ErrorBarStyle")) >>= nStyle) &&
238*cdf0e10cSrcweir               nStyle == ::com::sun::star::chart::ErrorBarStyle::FROM_DATA );
239*cdf0e10cSrcweir     }
240*cdf0e10cSrcweir     catch( const uno::Exception & ex )
241*cdf0e10cSrcweir     {
242*cdf0e10cSrcweir         ASSERT_EXCEPTION( ex );
243*cdf0e10cSrcweir     }
244*cdf0e10cSrcweir 
245*cdf0e10cSrcweir     if( bUsesRangesAsErrorBars )
246*cdf0e10cSrcweir     {
247*cdf0e10cSrcweir         sal_Int32 nPreferredColor = PREFERED_DEFAULT_COLOR;
248*cdf0e10cSrcweir         Reference< chart2::data::XDataSource > xSource( xErrorBar, uno::UNO_QUERY );
249*cdf0e10cSrcweir         if( xSource.is())
250*cdf0e10cSrcweir             lcl_fillRanges( m_aSelectedRanges,
251*cdf0e10cSrcweir                             ::chart::DataSourceHelper::getRangesFromDataSource( xSource ),
252*cdf0e10cSrcweir                             nPreferredColor );
253*cdf0e10cSrcweir     }
254*cdf0e10cSrcweir     else
255*cdf0e10cSrcweir     {
256*cdf0e10cSrcweir         fillRangesForDataSeries( xSeries );
257*cdf0e10cSrcweir     }
258*cdf0e10cSrcweir }
259*cdf0e10cSrcweir 
260*cdf0e10cSrcweir void RangeHighlighter::fillRangesForCategories( const Reference< chart2::XAxis > & xAxis )
261*cdf0e10cSrcweir {
262*cdf0e10cSrcweir     if( ! xAxis.is())
263*cdf0e10cSrcweir         return;
264*cdf0e10cSrcweir     chart2::ScaleData aData( xAxis->getScaleData());
265*cdf0e10cSrcweir     lcl_fillRanges( m_aSelectedRanges,
266*cdf0e10cSrcweir                     DataSourceHelper::getRangesFromLabeledDataSequence( aData.Categories ));
267*cdf0e10cSrcweir }
268*cdf0e10cSrcweir 
269*cdf0e10cSrcweir void RangeHighlighter::fillRangesForDataPoint( const Reference< uno::XInterface > & xDataSeries, sal_Int32 nIndex )
270*cdf0e10cSrcweir {
271*cdf0e10cSrcweir     sal_Int32 nPreferredColor = PREFERED_DEFAULT_COLOR;
272*cdf0e10cSrcweir     if( xDataSeries.is())
273*cdf0e10cSrcweir     {
274*cdf0e10cSrcweir         Reference< chart2::data::XDataSource > xSource( xDataSeries, uno::UNO_QUERY );
275*cdf0e10cSrcweir         if( xSource.is() )
276*cdf0e10cSrcweir         {
277*cdf0e10cSrcweir             ::std::vector< chart2::data::HighlightedRange > aHilightedRanges;
278*cdf0e10cSrcweir             Sequence< Reference< chart2::data::XLabeledDataSequence > > aLSeqSeq( xSource->getDataSequences());
279*cdf0e10cSrcweir             for( sal_Int32 i=0; i<aLSeqSeq.getLength(); ++i )
280*cdf0e10cSrcweir             {
281*cdf0e10cSrcweir                 Reference< chart2::data::XDataSequence > xLabel( aLSeqSeq[i]->getLabel());
282*cdf0e10cSrcweir                 Reference< chart2::data::XDataSequence > xValues( aLSeqSeq[i]->getValues());
283*cdf0e10cSrcweir 
284*cdf0e10cSrcweir                 if( xLabel.is())
285*cdf0e10cSrcweir                     aHilightedRanges.push_back(
286*cdf0e10cSrcweir                         chart2::data::HighlightedRange(
287*cdf0e10cSrcweir                             xLabel->getSourceRangeRepresentation(),
288*cdf0e10cSrcweir                             -1,
289*cdf0e10cSrcweir                             nPreferredColor,
290*cdf0e10cSrcweir                             sal_False ));
291*cdf0e10cSrcweir 
292*cdf0e10cSrcweir                 sal_Int32 nUnhiddenIndex = DataSeriesHelper::translateIndexFromHiddenToFullSequence( nIndex, xValues, !m_bIncludeHiddenCells );
293*cdf0e10cSrcweir                 if( xValues.is())
294*cdf0e10cSrcweir                     aHilightedRanges.push_back(
295*cdf0e10cSrcweir                         chart2::data::HighlightedRange(
296*cdf0e10cSrcweir                             xValues->getSourceRangeRepresentation(),
297*cdf0e10cSrcweir                             nUnhiddenIndex,
298*cdf0e10cSrcweir                             nPreferredColor,
299*cdf0e10cSrcweir                             sal_False ));
300*cdf0e10cSrcweir             }
301*cdf0e10cSrcweir             m_aSelectedRanges = ContainerHelper::ContainerToSequence( aHilightedRanges );
302*cdf0e10cSrcweir         }
303*cdf0e10cSrcweir     }
304*cdf0e10cSrcweir }
305*cdf0e10cSrcweir 
306*cdf0e10cSrcweir void SAL_CALL RangeHighlighter::addSelectionChangeListener( const Reference< view::XSelectionChangeListener >& xListener )
307*cdf0e10cSrcweir     throw (uno::RuntimeException)
308*cdf0e10cSrcweir {
309*cdf0e10cSrcweir     if(!xListener.is())
310*cdf0e10cSrcweir         return;
311*cdf0e10cSrcweir 
312*cdf0e10cSrcweir     if( m_nAddedListenerCount == 0 )
313*cdf0e10cSrcweir         startListening();
314*cdf0e10cSrcweir     rBHelper.addListener( ::getCppuType( & xListener ), xListener);
315*cdf0e10cSrcweir     ++m_nAddedListenerCount;
316*cdf0e10cSrcweir 
317*cdf0e10cSrcweir     //bring the new listener up to the current state
318*cdf0e10cSrcweir     lang::EventObject aEvent( static_cast< lang::XComponent* >( this ) );
319*cdf0e10cSrcweir     xListener->selectionChanged( aEvent );
320*cdf0e10cSrcweir }
321*cdf0e10cSrcweir 
322*cdf0e10cSrcweir void SAL_CALL RangeHighlighter::removeSelectionChangeListener( const Reference< view::XSelectionChangeListener >& xListener )
323*cdf0e10cSrcweir     throw (uno::RuntimeException)
324*cdf0e10cSrcweir {
325*cdf0e10cSrcweir     rBHelper.removeListener( ::getCppuType( & xListener ), xListener );
326*cdf0e10cSrcweir     --m_nAddedListenerCount;
327*cdf0e10cSrcweir     if( m_nAddedListenerCount == 0 )
328*cdf0e10cSrcweir         stopListening();
329*cdf0e10cSrcweir }
330*cdf0e10cSrcweir 
331*cdf0e10cSrcweir // ____ XSelectionChangeListener ____
332*cdf0e10cSrcweir void SAL_CALL RangeHighlighter::selectionChanged( const lang::EventObject& /*aEvent*/ )
333*cdf0e10cSrcweir     throw (uno::RuntimeException)
334*cdf0e10cSrcweir {
335*cdf0e10cSrcweir     determineRanges();
336*cdf0e10cSrcweir 
337*cdf0e10cSrcweir     // determine ranges of selected view objects
338*cdf0e10cSrcweir     // if changed, fire an event
339*cdf0e10cSrcweir     fireSelectionEvent();
340*cdf0e10cSrcweir }
341*cdf0e10cSrcweir 
342*cdf0e10cSrcweir void RangeHighlighter::fireSelectionEvent()
343*cdf0e10cSrcweir {
344*cdf0e10cSrcweir 	::cppu::OInterfaceContainerHelper* pIC = rBHelper.getContainer(
345*cdf0e10cSrcweir         ::getCppuType((const uno::Reference< view::XSelectionChangeListener >*)0) );
346*cdf0e10cSrcweir 	if( pIC )
347*cdf0e10cSrcweir 	{
348*cdf0e10cSrcweir 		lang::EventObject aEvent( static_cast< lang::XComponent* >( this ) );
349*cdf0e10cSrcweir 		::cppu::OInterfaceIteratorHelper aIt( *pIC );
350*cdf0e10cSrcweir 		while( aIt.hasMoreElements() )
351*cdf0e10cSrcweir         {
352*cdf0e10cSrcweir             uno::Reference< view::XSelectionChangeListener > xListener( aIt.next(), uno::UNO_QUERY );
353*cdf0e10cSrcweir             if( xListener.is() )
354*cdf0e10cSrcweir                 xListener->selectionChanged( aEvent );
355*cdf0e10cSrcweir         }
356*cdf0e10cSrcweir 	}
357*cdf0e10cSrcweir }
358*cdf0e10cSrcweir 
359*cdf0e10cSrcweir void SAL_CALL RangeHighlighter::disposing( const lang::EventObject& Source )
360*cdf0e10cSrcweir     throw (uno::RuntimeException)
361*cdf0e10cSrcweir {
362*cdf0e10cSrcweir     if( Source.Source == m_xSelectionSupplier )
363*cdf0e10cSrcweir     {
364*cdf0e10cSrcweir         m_xSelectionSupplier.clear();
365*cdf0e10cSrcweir         m_aSelectedRanges.realloc( 0 );
366*cdf0e10cSrcweir         fireSelectionEvent();
367*cdf0e10cSrcweir     }
368*cdf0e10cSrcweir }
369*cdf0e10cSrcweir 
370*cdf0e10cSrcweir void RangeHighlighter::startListening()
371*cdf0e10cSrcweir {
372*cdf0e10cSrcweir     if( m_xSelectionSupplier.is())
373*cdf0e10cSrcweir     {
374*cdf0e10cSrcweir         if( ! m_xListener.is())
375*cdf0e10cSrcweir         {
376*cdf0e10cSrcweir             m_xListener.set( new WeakSelectionChangeListenerAdapter( this ));
377*cdf0e10cSrcweir             determineRanges();
378*cdf0e10cSrcweir         }
379*cdf0e10cSrcweir         m_xSelectionSupplier->addSelectionChangeListener( m_xListener );
380*cdf0e10cSrcweir     }
381*cdf0e10cSrcweir }
382*cdf0e10cSrcweir 
383*cdf0e10cSrcweir void RangeHighlighter::stopListening()
384*cdf0e10cSrcweir {
385*cdf0e10cSrcweir     if( m_xSelectionSupplier.is() && m_xListener.is())
386*cdf0e10cSrcweir     {
387*cdf0e10cSrcweir         m_xSelectionSupplier->removeSelectionChangeListener( m_xListener );
388*cdf0e10cSrcweir         m_xListener.clear();
389*cdf0e10cSrcweir     }
390*cdf0e10cSrcweir }
391*cdf0e10cSrcweir 
392*cdf0e10cSrcweir 
393*cdf0e10cSrcweir // ____ WeakComponentImplHelperBase ____
394*cdf0e10cSrcweir // is called when dispose() is called at this component
395*cdf0e10cSrcweir void SAL_CALL RangeHighlighter::disposing()
396*cdf0e10cSrcweir {
397*cdf0e10cSrcweir     // @todo: remove listener. Currently the controller shows an assertion
398*cdf0e10cSrcweir     // because it is already disposed
399*cdf0e10cSrcweir //     stopListening();
400*cdf0e10cSrcweir     m_xListener.clear();
401*cdf0e10cSrcweir     m_xSelectionSupplier.clear();
402*cdf0e10cSrcweir     m_nAddedListenerCount =  0;
403*cdf0e10cSrcweir     m_aSelectedRanges.realloc( 0 );
404*cdf0e10cSrcweir }
405*cdf0e10cSrcweir 
406*cdf0e10cSrcweir } //  namespace chart
407