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 #pragma once
20 
21 #include <LifeTime.hxx>
22 
23 #include <com/sun/star/frame/XStorable2.hpp>
24 #include <com/sun/star/util/XModifiable.hpp>
25 #include <com/sun/star/util/XCloseable.hpp>
26 #include <com/sun/star/util/XUpdatable.hpp>
27 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
28 #include <com/sun/star/document/XUndoManagerSupplier.hpp>
29 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
30 #include <com/sun/star/lang/XServiceInfo.hpp>
31 #include <com/sun/star/lang/XInitialization.hpp>
32 #include <com/sun/star/util/XCloneable.hpp>
33 #include <com/sun/star/embed/XVisualObject.hpp>
34 #include <com/sun/star/document/XStorageBasedDocument.hpp>
35 #include <com/sun/star/lang/XUnoTunnel.hpp>
36 #include <com/sun/star/util/XNumberFormatsSupplier.hpp>
37 #include <com/sun/star/container/XChild.hpp>
38 #include <com/sun/star/chart2/data/XDataSource.hpp>
39 #include <com/sun/star/qa/XDumper.hpp>
40 
41 // public API
42 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
43 
44 #include <com/sun/star/chart2/XChartDocument.hpp>
45 #include <com/sun/star/chart2/XTitled.hpp>
46 
47 #include <com/sun/star/frame/XLoadable.hpp>
48 #include <com/sun/star/datatransfer/XTransferable.hpp>
49 
50 #include <osl/mutex.hxx>
51 #include <rtl/ref.hxx>
52 #include <cppuhelper/implbase.hxx>
53 #include <comphelper/interfacecontainer2.hxx>
54 #include <vcl/GraphicObject.hxx>
55 #include <sfx2/xmldump.hxx>
56 
57 #include <memory>
58 
59 namespace com::sun::star::awt { class XRequestCallback; }
60 namespace com::sun::star::chart2 { class XChartTypeTemplate; }
61 namespace com::sun::star::chart2::data { class XDataProvider; }
62 namespace com::sun::star::document { class XFilter; }
63 namespace com::sun::star::embed { class XStorage; }
64 namespace com::sun::star::frame { class XModel; }
65 namespace com::sun::star::uno { class XComponentContext; }
66 namespace com::sun::star::uno { class XAggregation; }
67 
68 class SvNumberFormatter;
69 
70 namespace chart
71 {
72 
73 namespace impl
74 {
75 
76 // Note: needed for queryInterface (if it calls the base-class implementation)
77 typedef cppu::WeakImplHelper<
78 //       css::frame::XModel        //comprehends XComponent (required interface), base of XChartDocument
79          css::util::XCloseable     //comprehends XCloseBroadcaster
80         ,css::frame::XStorable2    //(extension of XStorable)
81         ,css::util::XModifiable    //comprehends XModifyBroadcaster (required interface)
82         ,css::lang::XServiceInfo
83         ,css::lang::XInitialization
84         ,css::chart2::XChartDocument  // derived from XModel
85         ,css::chart2::data::XDataReceiver   // public API
86         ,css::chart2::XTitled
87         ,css::frame::XLoadable
88         ,css::util::XCloneable
89         ,css::embed::XVisualObject
90         ,css::lang::XMultiServiceFactory
91         ,css::document::XStorageBasedDocument
92         ,css::lang::XUnoTunnel
93         ,css::util::XNumberFormatsSupplier
94         ,css::container::XChild
95         ,css::util::XModifyListener
96         ,css::datatransfer::XTransferable
97         ,css::document::XDocumentPropertiesSupplier
98         ,css::chart2::data::XDataSource
99         ,css::document::XUndoManagerSupplier
100         ,css::util::XUpdatable
101         ,css::qa::XDumper
102         >
103     ChartModel_Base;
104 }
105 
106 class UndoManager;
107 class ChartView;
108 
109 class OOO_DLLPUBLIC_CHARTTOOLS ChartModel final : public impl::ChartModel_Base, public sfx2::XmlDump
110 {
111 
112 private:
113     mutable ::apphelper::CloseableLifeTimeManager   m_aLifeTimeManager;
114 
115     mutable ::osl::Mutex    m_aModelMutex;
116     bool volatile       m_bReadOnly;
117     bool volatile       m_bModified;
118     sal_Int32               m_nInLoad;
119     bool volatile       m_bUpdateNotificationsPending;
120 
121     bool mbTimeBased;
122 
123     rtl::Reference<ChartView> mxChartView;
124 
125     OUString m_aResource;
126     css::uno::Sequence< css::beans::PropertyValue >   m_aMediaDescriptor;
127     css::uno::Reference< css::document::XDocumentProperties > m_xDocumentProperties;
128     ::rtl::Reference< UndoManager >                    m_pUndoManager;
129 
130     ::comphelper::OInterfaceContainerHelper2           m_aControllers;
131     css::uno::Reference< css::frame::XController >     m_xCurrentController;
132     sal_uInt16                                         m_nControllerLockCount;
133 
134     css::uno::Reference< css::uno::XComponentContext > m_xContext;
135     css::uno::Reference< css::uno::XAggregation >      m_xOldModelAgg;
136 
137     css::uno::Reference< css::embed::XStorage >        m_xStorage;
138     //the content of this should be always synchronized with the current m_xViewWindow size. The variable is necessary to hold the information as long as no view window exists.
139     css::awt::Size                                     m_aVisualAreaSize;
140     css::uno::Reference< css::frame::XModel >          m_xParent;
141     css::uno::Reference< css::chart2::data::XRangeHighlighter > m_xRangeHighlighter;
142     css::uno::Reference<css::awt::XRequestCallback>    m_xPopupRequest;
143     std::vector< GraphicObject >                            m_aGraphicObjectVector;
144 
145     css::uno::Reference< css::chart2::data::XDataProvider >   m_xDataProvider;
146     /** is only valid if m_xDataProvider is set. If m_xDataProvider is set to an
147         external data provider this reference must be set to 0
148     */
149     css::uno::Reference< css::chart2::data::XDataProvider >   m_xInternalDataProvider;
150 
151     css::uno::Reference< css::util::XNumberFormatsSupplier >
152                                 m_xOwnNumberFormatsSupplier;
153     css::uno::Reference< css::util::XNumberFormatsSupplier >
154                                 m_xNumberFormatsSupplier;
155     std::unique_ptr< SvNumberFormatter > m_apSvNumberFormatter; // #i113784# avoid memory leak
156 
157     css::uno::Reference< css::chart2::XChartTypeManager >
158         m_xChartTypeManager;
159 
160     // Diagram Access
161     css::uno::Reference< css::chart2::XDiagram >
162         m_xDiagram;
163 
164     css::uno::Reference< css::chart2::XTitle >
165                                           m_xTitle;
166 
167     css::uno::Reference< css::beans::XPropertySet >
168                                           m_xPageBackground;
169 
170     css::uno::Reference< css::container::XNameAccess>     m_xXMLNamespaceMap;
171 
172 private:
173     //private methods
174 
175     OUString impl_g_getLocation();
176 
177     bool
178         impl_isControllerConnected( const css::uno::Reference< com::sun::star::frame::XController >& xController );
179 
180     /// @throws css::uno::RuntimeException
181     css::uno::Reference< css::frame::XController >
182         impl_getCurrentController();
183 
184     /// @throws css::uno::RuntimeException
185     void
186         impl_notifyModifiedListeners();
187     /// @throws css::uno::RuntimeException
188     void
189         impl_notifyCloseListeners();
190     /// @throws css::uno::RuntimeException
191     void
192         impl_notifyStorageChangeListeners();
193 
194     void impl_store(
195         const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor,
196         const css::uno::Reference< css::embed::XStorage > & xStorage );
197     void impl_load(
198         const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor,
199         const css::uno::Reference< css::embed::XStorage >& xStorage );
200     void impl_loadGraphics(
201         const css::uno::Reference< ::com::sun::star::embed::XStorage >& xStorage );
202     css::uno::Reference< css::document::XFilter >
203         impl_createFilter( const css::uno::Sequence< css::beans::PropertyValue > & rMediaDescriptor );
204 
205     css::uno::Reference< css::chart2::XChartTypeTemplate > impl_createDefaultChartTypeTemplate();
206     css::uno::Reference< css::chart2::data::XDataSource > impl_createDefaultData();
207 
208     void impl_adjustAdditionalShapesPositionAndSize(
209         const css::awt::Size& aVisualAreaSize );
210 
211     void insertDefaultChart();
212 
213 public:
214     ChartModel() = delete;
215     ChartModel(css::uno::Reference< css::uno::XComponentContext > const & xContext);
216     explicit ChartModel( const ChartModel & rOther );
217     virtual ~ChartModel() override;
218 
219     // css::lang::XServiceInfo
220 
221     virtual OUString SAL_CALL getImplementationName() override;
222     virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
223     virtual css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override;
224 
225     // css::lang::XInitialization
226     virtual void SAL_CALL initialize( const css::uno::Sequence< css::uno::Any >& aArguments ) override;
227 
228     // css::frame::XModel (required interface)
229 
230     virtual sal_Bool SAL_CALL
231         attachResource( const OUString& rURL,
232                         const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor ) override;
233 
234     virtual OUString SAL_CALL
235         getURL() override;
236 
237     virtual css::uno::Sequence< css::beans::PropertyValue > SAL_CALL
238         getArgs() override;
239 
240     virtual void SAL_CALL
241         connectController( const css::uno::Reference< css::frame::XController >& xController ) override;
242 
243     virtual void SAL_CALL
244         disconnectController( const css::uno::Reference< css::frame::XController >& xController ) override;
245 
246     virtual void SAL_CALL
247         lockControllers() override;
248 
249     virtual void SAL_CALL
250         unlockControllers() override;
251 
252     virtual sal_Bool SAL_CALL
253         hasControllersLocked() override;
254 
255     virtual css::uno::Reference< css::frame::XController > SAL_CALL
256         getCurrentController() override;
257 
258     virtual void SAL_CALL
259         setCurrentController( const css::uno::Reference< css::frame::XController >& xController ) override;
260 
261     virtual css::uno::Reference< css::uno::XInterface > SAL_CALL
262         getCurrentSelection() override;
263 
264     // css::lang::XComponent (base of XModel)
265     virtual void SAL_CALL
266         dispose() override;
267 
268     virtual void SAL_CALL
269         addEventListener( const css::uno::Reference< css::lang::XEventListener > & xListener ) override;
270 
271     virtual void SAL_CALL
272         removeEventListener( const css::uno::Reference< css::lang::XEventListener > & xListener ) override;
273 
274     // css::util::XCloseable
275     virtual void SAL_CALL
276         close( sal_Bool bDeliverOwnership ) override;
277 
278     // css::util::XCloseBroadcaster (base of XCloseable)
279     virtual void SAL_CALL
280         addCloseListener( const css::uno::Reference< css::util::XCloseListener > & xListener ) override;
281 
282     virtual void SAL_CALL
283         removeCloseListener( const css::uno::Reference< css::util::XCloseListener > & xListener ) override;
284 
285     // css::frame::XStorable2 (extension of XStorable)
286     virtual void SAL_CALL storeSelf(
287         const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor ) override;
288 
289     // css::frame::XStorable (required interface)
290     virtual sal_Bool SAL_CALL
291         hasLocation() override;
292 
293     virtual OUString SAL_CALL
294         getLocation() override;
295 
296     virtual sal_Bool SAL_CALL
297         isReadonly() override;
298 
299     virtual void SAL_CALL
300         store() override;
301 
302     virtual void SAL_CALL
303         storeAsURL( const OUString& rURL,
304                     const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor ) override;
305 
306     virtual void SAL_CALL
307         storeToURL( const OUString& rURL,
308                     const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor ) override;
309 
310     // css::util::XModifiable (required interface)
311     virtual sal_Bool SAL_CALL
312         isModified() override;
313 
314     virtual void SAL_CALL
315         setModified( sal_Bool bModified ) override;
316 
317     // css::util::XModifyBroadcaster (base of XModifiable)
318     virtual void SAL_CALL
319         addModifyListener( const css::uno::Reference< css::util::XModifyListener >& xListener ) override;
320 
321     virtual void SAL_CALL
322         removeModifyListener( const css::uno::Reference< css::util::XModifyListener >& xListener ) override;
323 
324     // ____ XModifyListener ____
325     virtual void SAL_CALL modified(
326         const css::lang::EventObject& aEvent ) override;
327 
328     // ____ XEventListener (base of XModifyListener) ____
329     virtual void SAL_CALL disposing(
330         const css::lang::EventObject& Source ) override;
331 
332     // ____ datatransferable::XTransferable ____
333     virtual css::uno::Any SAL_CALL getTransferData(
334         const css::datatransfer::DataFlavor& aFlavor ) override;
335     virtual css::uno::Sequence< css::datatransfer::DataFlavor > SAL_CALL getTransferDataFlavors() override;
336     virtual sal_Bool SAL_CALL isDataFlavorSupported(
337         const css::datatransfer::DataFlavor& aFlavor ) override;
338 
339     // lang::XTypeProvider (override method of WeakImplHelper)
340     virtual css::uno::Sequence< css::uno::Type > SAL_CALL
341         getTypes() override;
342 
343     // ____ document::XDocumentPropertiesSupplier ____
344     virtual css::uno::Reference< css::document::XDocumentProperties > SAL_CALL
345         getDocumentProperties(  ) override;
346 
347     // ____ document::XUndoManagerSupplier ____
348     virtual css::uno::Reference< css::document::XUndoManager > SAL_CALL
349         getUndoManager(  ) override;
350 
351     // css::chart2::XChartDocument
352     virtual css::uno::Reference< css::chart2::XDiagram > SAL_CALL
353         getFirstDiagram() override;
354     virtual void SAL_CALL setFirstDiagram(
355         const css::uno::Reference< css::chart2::XDiagram >& xDiagram ) override;
356     virtual void SAL_CALL
357         createInternalDataProvider( sal_Bool bCloneExistingData ) override;
358     virtual sal_Bool SAL_CALL hasInternalDataProvider() override;
359     virtual css::uno::Reference< css::chart2::data::XDataProvider > SAL_CALL
360         getDataProvider() override;
361     virtual void SAL_CALL
362         setChartTypeManager( const css::uno::Reference< css::chart2::XChartTypeManager >& xNewManager ) override;
363     virtual css::uno::Reference< css::chart2::XChartTypeManager > SAL_CALL
364         getChartTypeManager() override;
365     virtual css::uno::Reference< css::beans::XPropertySet > SAL_CALL
366         getPageBackground() override;
367 
368     virtual void SAL_CALL createDefaultChart() override;
369 
370     // ____ XDataReceiver (public API) ____
371     virtual void SAL_CALL
372         attachDataProvider( const css::uno::Reference< css::chart2::data::XDataProvider >& xProvider ) override;
373     virtual void SAL_CALL setArguments(
374         const css::uno::Sequence< css::beans::PropertyValue >& aArguments ) override;
375     virtual css::uno::Sequence< OUString > SAL_CALL getUsedRangeRepresentations() override;
376     virtual css::uno::Reference< css::chart2::data::XDataSource > SAL_CALL getUsedData() override;
377     virtual void SAL_CALL attachNumberFormatsSupplier( const css::uno::Reference<
378         css::util::XNumberFormatsSupplier >& xSupplier ) override;
379     virtual css::uno::Reference< css::chart2::data::XRangeHighlighter > SAL_CALL getRangeHighlighter() override;
380     virtual css::uno::Reference<css::awt::XRequestCallback> SAL_CALL getPopupRequest() override;
381 
382     // ____ XTitled ____
383     virtual css::uno::Reference< css::chart2::XTitle > SAL_CALL getTitleObject() override;
384     virtual void SAL_CALL setTitleObject( const css::uno::Reference< css::chart2::XTitle >& Title ) override;
385 
386     // ____ XInterface (for old API wrapper) ____
387     virtual css::uno::Any SAL_CALL queryInterface( const css::uno::Type& aType ) override;
388 
389     // ____ XLoadable ____
390     virtual void SAL_CALL initNew() override;
391     virtual void SAL_CALL load( const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor ) override;
392 
393     // ____ XCloneable ____
394     virtual css::uno::Reference< css::util::XCloneable > SAL_CALL createClone() override;
395 
396     // ____ XVisualObject ____
397     virtual void SAL_CALL setVisualAreaSize(
398         ::sal_Int64 nAspect,
399         const css::awt::Size& aSize ) override;
400     virtual css::awt::Size SAL_CALL getVisualAreaSize(
401         ::sal_Int64 nAspect ) override;
402     virtual css::embed::VisualRepresentation SAL_CALL getPreferredVisualRepresentation(
403         ::sal_Int64 nAspect ) override;
404     virtual ::sal_Int32 SAL_CALL getMapUnit(
405         ::sal_Int64 nAspect ) override;
406 
407     // ____ XMultiServiceFactory ____
408     virtual css::uno::Reference< css::uno::XInterface > SAL_CALL
409         createInstance( const OUString& aServiceSpecifier ) override;
410     virtual css::uno::Reference< css::uno::XInterface > SAL_CALL
411         createInstanceWithArguments( const OUString& ServiceSpecifier
412                                    , const css::uno::Sequence< css::uno::Any >& Arguments ) override;
413     virtual css::uno::Sequence< OUString > SAL_CALL
414         getAvailableServiceNames() override;
415 
416     // ____ XStorageBasedDocument ____
417     virtual void SAL_CALL loadFromStorage(
418         const css::uno::Reference< css::embed::XStorage >& xStorage,
419         const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor ) override;
420     virtual void SAL_CALL storeToStorage(
421         const css::uno::Reference< css::embed::XStorage >& xStorage,
422         const css::uno::Sequence< css::beans::PropertyValue >& rMediaDescriptor ) override;
423     virtual void SAL_CALL switchToStorage(
424         const css::uno::Reference< css::embed::XStorage >& xStorage ) override;
425     virtual css::uno::Reference< css::embed::XStorage > SAL_CALL getDocumentStorage() override;
426     virtual void SAL_CALL addStorageChangeListener(
427         const css::uno::Reference< css::document::XStorageChangeListener >& xListener ) override;
428     virtual void SAL_CALL removeStorageChangeListener(
429         const css::uno::Reference< css::document::XStorageChangeListener >& xListener ) override;
430 
431     // for SvNumberFormatsSupplierObj
432     // ____ XUnoTunnel ___
433     virtual ::sal_Int64 SAL_CALL getSomething( const css::uno::Sequence< ::sal_Int8 >& aIdentifier ) override;
434 
435     // ____ XNumberFormatsSupplier ____
436     virtual css::uno::Reference< css::beans::XPropertySet > SAL_CALL getNumberFormatSettings() override;
437     virtual css::uno::Reference< css::util::XNumberFormats > SAL_CALL getNumberFormats() override;
438 
439     // ____ XChild ____
440     virtual css::uno::Reference< css::uno::XInterface > SAL_CALL getParent() override;
441     virtual void SAL_CALL setParent(
442         const css::uno::Reference< css::uno::XInterface >& Parent ) override;
443 
444     // ____ XDataSource ____ allows access to the currently used data and data ranges
445     virtual css::uno::Sequence< css::uno::Reference< css::chart2::data::XLabeledDataSequence > > SAL_CALL getDataSequences() override;
446 
447     // XUpdatable
448     virtual void SAL_CALL update() override;
449 
450     // XDumper
451     virtual OUString SAL_CALL dump() override;
452 
453     // normal methods
454     css::uno::Reference< css::util::XNumberFormatsSupplier > const &
455         getNumberFormatsSupplier();
456 
457     css::uno::Reference< css::uno::XInterface > getChartView() const;
458 
isTimeBased() const459     bool isTimeBased() const { return mbTimeBased;}
460 
461     void setTimeBasedRange(sal_Int32 nStart, sal_Int32 nEnd);
462 
463     bool isDataFromSpreadsheet();
464 
465     bool isDataFromPivotTable() const;
466 
467     void removeDataProviders();
468 
469     /// See sfx2::XmlDump::dumpAsXml().
470     void dumpAsXml(xmlTextWriterPtr pWriter) const override;
471 
472 private:
473     sal_Int32 mnStart;
474     sal_Int32 mnEnd;
475 };
476 
477 }  // namespace chart
478 
479 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
480