xref: /trunk/main/chart2/source/inc/InternalDataProvider.hxx (revision 91144cd0085a7583d2099b982122deb2184ab956)
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 #ifndef CHART2_INTERNALDATAPROVIDER_HXX
24 #define CHART2_INTERNALDATAPROVIDER_HXX
25 
26 #include "InternalData.hxx"
27 
28 #include <com/sun/star/lang/XServiceInfo.hpp>
29 #include <com/sun/star/chart/XDateCategories.hpp>
30 #include <com/sun/star/chart2/XAnyDescriptionAccess.hpp>
31 #include <com/sun/star/chart2/data/XDataProvider.hpp>
32 #include <com/sun/star/chart2/XInternalDataProvider.hpp>
33 #include <com/sun/star/chart2/data/XLabeledDataSequence.hpp>
34 #include <com/sun/star/chart2/data/XRangeXMLConversion.hpp>
35 #include <com/sun/star/chart2/XChartDocument.hpp>
36 #include <com/sun/star/lang/XInitialization.hpp>
37 #include <com/sun/star/util/XCloneable.hpp>
38 #include <cppuhelper/implbase7.hxx>
39 #include "ServiceMacros.hxx"
40 
41 #include "CachedDataSequence.hxx"
42 
43 #include <map>
44 #include <memory>
45 
46 namespace chart
47 {
48 
49 namespace impl
50 {
51 
52 typedef ::cppu::WeakImplHelper7<
53         ::com::sun::star::chart2::XInternalDataProvider,
54         ::com::sun::star::chart2::data::XRangeXMLConversion,
55         ::com::sun::star::chart2::XAnyDescriptionAccess,
56         ::com::sun::star::chart::XDateCategories,
57         ::com::sun::star::util::XCloneable,
58         ::com::sun::star::lang::XInitialization,
59         ::com::sun::star::lang::XServiceInfo >
60     InternalDataProvider_Base;
61 }
62 
63 /** Data provider that handles data internally.  This is used for charts with
64     their own data.
65 
66     <p>The format for single ranges is "categories|label n|n" where n is a
67     non-negative number. Meaning return all categories, the label of sequence n,
68     or the data of sequence n.</p>
69 
70     <p>The format for a complete range is "all". (Do we need more than
71     that?)</p>
72  */
73 class InternalDataProvider :
74         public impl::InternalDataProvider_Base
75 {
76 public:
77     explicit InternalDataProvider(const ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > & _xContext);
78 
79     // #120559# allow handing over a default for data orientation (DataInColumns) that will
80     // be used when no data is available
81     explicit InternalDataProvider(
82         const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::XChartDocument > & xChartDoc,
83         bool bConnectToModel,
84         bool bDefaultDataInColumns );
85     explicit InternalDataProvider( const InternalDataProvider & rOther );
86     virtual ~InternalDataProvider();
87 
88     void createDefaultData();
89 
90     /// declare XServiceInfo methods
91     APPHELPER_XSERVICEINFO_DECL()
92     APPHELPER_SERVICE_FACTORY_HELPER(InternalDataProvider)
93 
94     // ____ XInternalDataProvider ____
95     virtual ::sal_Bool SAL_CALL hasDataByRangeRepresentation( const ::rtl::OUString& aRange );
96     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > SAL_CALL
97         getDataByRangeRepresentation( const ::rtl::OUString& aRange );
98     virtual void SAL_CALL setDataByRangeRepresentation(
99         const ::rtl::OUString& aRange,
100         const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& aNewData );
101     virtual void SAL_CALL insertSequence( ::sal_Int32 nAfterIndex );
102     virtual void SAL_CALL deleteSequence( ::sal_Int32 nAtIndex );
103     virtual void SAL_CALL appendSequence();
104     virtual void SAL_CALL insertComplexCategoryLevel( ::sal_Int32 nLevel );
105     virtual void SAL_CALL deleteComplexCategoryLevel( ::sal_Int32 nLevel );
106     virtual void SAL_CALL insertDataPointForAllSequences( ::sal_Int32 nAfterIndex );
107     virtual void SAL_CALL deleteDataPointForAllSequences( ::sal_Int32 nAtIndex );
108     virtual void SAL_CALL swapDataPointWithNextOneForAllSequences( ::sal_Int32 nAtIndex );
109     virtual void SAL_CALL registerDataSequenceForChanges(
110         const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence >& xSeq );
111 
112     // ____ XDataProvider (base of XInternalDataProvider) ____
113     virtual ::sal_Bool SAL_CALL createDataSourcePossible(
114         const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArguments );
115     virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSource > SAL_CALL createDataSource(
116         const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& aArguments );
117     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > SAL_CALL detectArguments(
118         const ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSource >& xDataSource );
119     virtual ::sal_Bool SAL_CALL createDataSequenceByRangeRepresentationPossible(
120         const ::rtl::OUString& aRangeRepresentation );
121     virtual ::com::sun::star::uno::Reference< ::com::sun::star::chart2::data::XDataSequence > SAL_CALL createDataSequenceByRangeRepresentation(
122         const ::rtl::OUString& aRangeRepresentation );
123     virtual ::com::sun::star::uno::Reference< ::com::sun::star::sheet::XRangeSelection > SAL_CALL getRangeSelection();
124 
125     // ____ XRangeXMLConversion ____
126     virtual ::rtl::OUString SAL_CALL convertRangeToXML(
127         const ::rtl::OUString& aRangeRepresentation );
128     virtual ::rtl::OUString SAL_CALL convertRangeFromXML(
129         const ::rtl::OUString& aXMLRange );
130 
131     // ____ XDateCategories ____
132     virtual ::com::sun::star::uno::Sequence< double > SAL_CALL getDateCategories();
133     virtual void SAL_CALL setDateCategories( const ::com::sun::star::uno::Sequence< double >& rDates );
134 
135     // ____ XAnyDescriptionAccess ____
136     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > > SAL_CALL
137         getAnyRowDescriptions();
138     virtual void SAL_CALL setAnyRowDescriptions(
139         const ::com::sun::star::uno::Sequence<
140         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >& aRowDescriptions );
141     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > > SAL_CALL
142         getAnyColumnDescriptions();
143     virtual void SAL_CALL setAnyColumnDescriptions(
144         const ::com::sun::star::uno::Sequence<
145         ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > >& aColumnDescriptions );
146 
147     // ____ XComplexDescriptionAccess (base of XAnyDescriptionAccess) ____
148     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL
149         getComplexRowDescriptions();
150     virtual void SAL_CALL setComplexRowDescriptions(
151         const ::com::sun::star::uno::Sequence<
152         ::com::sun::star::uno::Sequence< ::rtl::OUString > >& aRowDescriptions );
153     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< ::rtl::OUString > > SAL_CALL
154         getComplexColumnDescriptions();
155     virtual void SAL_CALL setComplexColumnDescriptions(
156         const ::com::sun::star::uno::Sequence<
157         ::com::sun::star::uno::Sequence< ::rtl::OUString > >& aColumnDescriptions );
158 
159     // ____ XChartDataArray (base of XComplexDescriptionAccess) ____
160     virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > > SAL_CALL getData();
161     virtual void SAL_CALL setData(
162         const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Sequence< double > >& aData );
163     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getRowDescriptions();
164     virtual void SAL_CALL setRowDescriptions(
165         const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aRowDescriptions );
166     virtual ::com::sun::star::uno::Sequence< ::rtl::OUString > SAL_CALL getColumnDescriptions();
167     virtual void SAL_CALL setColumnDescriptions(
168         const ::com::sun::star::uno::Sequence< ::rtl::OUString >& aColumnDescriptions );
169 
170     // ____ XChartData (base of XChartDataArray) ____
171     virtual void SAL_CALL addChartDataChangeEventListener(
172         const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener );
173     virtual void SAL_CALL removeChartDataChangeEventListener(
174         const ::com::sun::star::uno::Reference< ::com::sun::star::chart::XChartDataChangeEventListener >& aListener );
175     virtual double SAL_CALL getNotANumber();
176     virtual ::sal_Bool SAL_CALL isNotANumber(
177         double nNumber );
178 
179     // ____ XCloneable ____
180     virtual ::com::sun::star::uno::Reference< ::com::sun::star::util::XCloneable > SAL_CALL createClone();
181     // ::com::sun::star::lang::XInitialization:
182     virtual void SAL_CALL initialize(const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any > & aArguments);
183 
184 private:
185     void lcl_addDataSequenceToMap(
186         const ::rtl::OUString & rRangeRepresentation,
187         const ::com::sun::star::uno::Reference<
188             ::com::sun::star::chart2::data::XDataSequence > & xSequence );
189 
190     ::com::sun::star::uno::Reference<
191             ::com::sun::star::chart2::data::XDataSequence >
192         lcl_createDataSequenceAndAddToMap( const ::rtl::OUString & rRangeRepresentation,
193                                        const ::rtl::OUString & rRole );
194     ::com::sun::star::uno::Reference<
195             ::com::sun::star::chart2::data::XDataSequence >
196         lcl_createDataSequenceAndAddToMap( const ::rtl::OUString & rRangeRepresentation );
197 
198     void lcl_deleteMapReferences( const ::rtl::OUString & rRangeRepresentation );
199 
200     void lcl_adaptMapReferences(
201         const ::rtl::OUString & rOldRangeRepresentation,
202         const ::rtl::OUString & rNewRangeRepresentation );
203 
204     void lcl_increaseMapReferences( sal_Int32 nBegin, sal_Int32 nEnd );
205     void lcl_decreaseMapReferences( sal_Int32 nBegin, sal_Int32 nEnd );
206 
207     typedef ::std::multimap< ::rtl::OUString,
208             ::com::sun::star::uno::WeakReference< ::com::sun::star::chart2::data::XDataSequence > >
209         tSequenceMap;
210     typedef ::std::pair< tSequenceMap::iterator, tSequenceMap::iterator > tSequenceMapRange;
211     typedef ::std::pair< tSequenceMap::const_iterator, tSequenceMap::const_iterator > tConstSequenceMapRange;
212 
213     /** cache for all sequences that have been returned.
214 
215         If the range-representation of a sequence changes and it is still
216         referred to by some component (weak reference is valid), the range will
217         be adapted.
218      */
219     tSequenceMap m_aSequenceMap;
220     InternalData m_aInternalData;
221     bool m_bDataInColumns;
222 };
223 
224 } //  namespace chart
225 
226 // CHART2_INTERNALDATAPROVIDER_HXX
227 #endif
228