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 #ifndef INCLUDED_SD_INC_SDPAGE_HXX
21 #define INCLUDED_SD_INC_SDPAGE_HXX
22 
23 #include <com/sun/star/drawing/XDrawPage.hpp>
24 #include <com/sun/star/presentation/FadeEffect.hpp>
25 #include <com/sun/star/office/XAnnotation.hpp>
26 
27 #include <memory>
28 #include <vector>
29 #include <editeng/flditem.hxx>
30 #include <svx/svdobj.hxx>
31 #include <svx/fmpage.hxx>
32 #include <xmloff/autolayout.hxx>
33 #include "diadef.h"
34 #include "pres.hxx"
35 #include "shapelist.hxx"
36 #include "misc/scopelock.hxx"
37 #include "sddllapi.h"
38 
39 namespace com { namespace sun { namespace star { namespace animations {
40     class XAnimationNode;
41 } } } }
42 
43 class SfxStyleSheet;
44 class SdDrawDocument;
45 class SdrTextObj;
46 class SdPageLink;
47 class SfxItemSet;
48 class Paragraph;
49 class Outliner;
50 class SdStyleSheet;
51 
52 namespace sd
53 {
54     class MainSequence;
55 }
56 
57 namespace sd {
58 
59     struct SD_DLLPUBLIC HeaderFooterSettings
60     {
61         bool mbHeaderVisible;
62         OUString maHeaderText;
63 
64         bool mbFooterVisible;
65         OUString maFooterText;
66 
67         bool mbSlideNumberVisible;
68 
69         bool mbDateTimeVisible;
70         bool mbDateTimeIsFixed;
71         OUString maDateTimeText;
72         SvxDateFormat meDateFormat;
73         SvxTimeFormat meTimeFormat;
74 
75         HeaderFooterSettings();
76 
77         bool operator==( const HeaderFooterSettings& rSettings ) const;
78     };
79 
80     typedef std::vector< css::uno::Reference< css::office::XAnnotation > > AnnotationVector;
81 }
82 
83 namespace sd {
84     class UndoAnimation;
85     class UndoTransition;
86     class UndoGeoObject;
87     class UndoAttrObject;
88 }
89 
90 class SD_DLLPUBLIC SdPage final : public FmFormPage, public SdrObjUserCall
91 {
92     SdPage& operator=(const SdPage&) = delete;
93     SdPage(const SdPage&) = delete;
94 
95 friend class SdGenericDrawPage;
96 friend class SdDrawPage;
97 friend class sd::UndoAnimation;
98 friend class sd::UndoTransition;
99 friend class ModifyPageUndoAction;
100 friend class sd::UndoGeoObject;
101 friend class sd::UndoAttrObject;
102 
103     PageKind    mePageKind;               ///< page type
104     AutoLayout  meAutoLayout;             ///< AutoLayout
105     sd::ShapeList maPresentationShapeList;///< presentation objects
106     sd::ScopeLock maLockAutoLayoutArrangement;
107     bool    mbSelected;               ///< selection identifier
108     PresChange  mePresChange;             ///< manual / automatic / semi automatic
109     double      mfTime;                   ///< Display time in seconds
110     bool    mbSoundOn;                ///< with / without sound.
111     bool    mbExcluded;               ///< will (not) be displayed during show.
112     OUString    maLayoutName;             ///< Name of the layout
113     OUString    maSoundFile;              ///< Path to sound file (MS-DOS notation).
114     bool        mbLoopSound;
115     bool        mbStopSound;
116     OUString    maCreatedPageName;        ///< generated page name by GetPageName.
117     OUString    maFileName;               ///< file name.
118     OUString    maBookmarkName;           ///< Bookmark name.
119     bool    mbScaleObjects;           ///< Objects should be scaled
120     bool    mbBackgroundFullSize;     ///< Background object to represent the whole page.
121     rtl_TextEncoding meCharSet;           ///< Text encoding
122     sal_uInt16  mnPaperBin;               ///< PaperBin
123     SdPageLink* mpPageLink;               ///< Page link (at left sides only)
124 
125     sd::AnnotationVector    maAnnotations;
126 
127     /** holds the smil animation sequences for this page */
128     css::uno::Reference< css::animations::XAnimationNode > mxAnimationNode;
129 
130     /** a helper class to manipulate effects inside the main sequence */
131     std::shared_ptr< sd::MainSequence > mpMainSequence;
132 
133     virtual css::uno::Reference< css::uno::XInterface > createUnoPage() override;
134 
135     std::unique_ptr<SfxItemSet> mpItems;
136 
137     SfxItemSet* getOrCreateItems();
138 
139     sd::HeaderFooterSettings    maHeaderFooterSettings;
140 
141     // new transition settings
142     sal_Int16 mnTransitionType;
143     sal_Int16 mnTransitionSubtype;
144     bool mbTransitionDirection;
145     sal_Int32 mnTransitionFadeColor;
146     double mfTransitionDuration;
147 
148     void lateInit(const SdPage& rSrcPage);
149 
150 public:
151 
152     SdPage(SdDrawDocument& rNewDoc, bool bMasterPage);
153     virtual ~SdPage() override;
154 
155     virtual SdrPage* CloneSdrPage(SdrModel& rTargetModel) const override;
156 
157     virtual void    SetSize(const Size& aSize) override;
158     virtual void    SetBorder(sal_Int32 nLft, sal_Int32 nUpp, sal_Int32 nRgt, sal_Int32 Lwr) override;
159     virtual void    SetLeftBorder(sal_Int32 nBorder) override;
160     virtual void    SetRightBorder(sal_Int32 nBorder) override;
161     virtual void    SetUpperBorder(sal_Int32 nBorder) override;
162     virtual void    SetLowerBorder(sal_Int32 nBorder) override;
163     virtual bool    IsReadOnly() const override;
164 
GetPresentationShapeList()165     sd::ShapeList&  GetPresentationShapeList() { return maPresentationShapeList; }
166 
167     void EnsureMasterPageDefaultBackground();
168     SdrObject*      CreatePresObj(PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect);
169     SdrObject*      CreateDefaultPresObj(PresObjKind eObjKind);
170     void            DestroyDefaultPresObj(PresObjKind eObjKind);
171     SdrObject*      GetPresObj(PresObjKind eObjKind, int nIndex = 1, bool bFuzzySearch = false );
172     PresObjKind     GetPresObjKind(SdrObject* pObj) const;
173     OUString        GetPresObjText(PresObjKind eObjKind) const;
174     SfxStyleSheet* GetStyleSheetForMasterPageBackground() const;
175     SfxStyleSheet*  GetStyleSheetForPresObj(PresObjKind eObjKind) const;
176     sal_Int64       GetHashCode() const;
177     bool            RestoreDefaultText( SdrObject* pObj );
178 
179     /** @return true if the given SdrObject is inside the presentation object list */
180     bool            IsPresObj(const SdrObject* pObj);
181 
182     /** removes the given SdrObject from the presentation object list */
183     void            RemovePresObj(const SdrObject* pObj);
184 
185     /** inserts the given SdrObject into the presentation object list */
186     void            InsertPresObj(SdrObject* pObj, PresObjKind eKind );
187 
188     void            SetAutoLayout(AutoLayout eLayout, bool bInit=false, bool bCreate=false);
GetAutoLayout() const189     AutoLayout      GetAutoLayout() const { return meAutoLayout; }
190     void            CreateTitleAndLayout(bool bInit=false, bool bCreate=false);
191     SdrObject*      InsertAutoLayoutShape(SdrObject* pObj, PresObjKind eObjKind, bool bVertical, const ::tools::Rectangle& rRect, bool bInit);
192 
193     virtual void       NbcInsertObject(SdrObject* pObj, size_t nPos=SAL_MAX_SIZE) override;
194     virtual SdrObject* NbcRemoveObject(size_t nObjNum) override;
195     virtual SdrObject* RemoveObject(size_t nObjNum) override;
196 
197     /** Also override ReplaceObject methods to realize when
198     objects are removed with this mechanism instead of RemoveObject*/
199     virtual SdrObject* ReplaceObject(SdrObject* pNewObj, size_t nObjNum) override;
200 
201     void        SetObjText(SdrTextObj* pObj, SdrOutliner* pOutliner, PresObjKind eObjKind, const OUString& rStr );
202 
SetPageKind(PageKind ePgType)203     void        SetPageKind(PageKind ePgType)        { mePageKind = ePgType; }
GetPageKind() const204     PageKind    GetPageKind() const                  { return mePageKind; }
205 
SetSelected(bool bSel)206     void        SetSelected(bool bSel)               { mbSelected = bSel; }
IsSelected() const207     bool        IsSelected() const                   { return mbSelected; }
208 
209     void        SetFadeEffect(css::presentation::FadeEffect eNewEffect);
210     css::presentation::FadeEffect  GetFadeEffect() const;
211 
SetPresChange(PresChange eChange)212     void        SetPresChange(PresChange eChange)    { mePresChange = eChange; }
GetPresChange() const213     PresChange  GetPresChange() const                { return mePresChange; }
214 
SetTime(double fNewTime)215     void        SetTime(double fNewTime)             { mfTime = fNewTime; }
GetTime() const216     double      GetTime() const                      { return mfTime; }
217 
SetSound(bool bNewSoundOn)218     void        SetSound(bool bNewSoundOn)           { mbSoundOn = bNewSoundOn; }
IsSoundOn() const219     bool        IsSoundOn() const                    { return mbSoundOn; }
220 
SetExcluded(bool bNewExcluded)221     void        SetExcluded(bool bNewExcluded)      { mbExcluded = bNewExcluded; }
IsExcluded() const222     bool        IsExcluded() const                  { return mbExcluded; }
223 
IsScaleObjects() const224     bool        IsScaleObjects() const              { return mbScaleObjects; }
225 
SetSoundFile(const OUString & rStr)226     void        SetSoundFile(const OUString& rStr)    { maSoundFile = rStr; }
GetSoundFile() const227     const OUString& GetSoundFile() const                { return maSoundFile; }
228 
SetLoopSound(bool bLoopSound)229     void        SetLoopSound( bool bLoopSound ) { mbLoopSound = bLoopSound; }
IsLoopSound() const230     bool        IsLoopSound() const                 { return mbLoopSound; }
231 
SetStopSound(bool bStopSound)232     void        SetStopSound( bool bStopSound ) { mbStopSound = bStopSound; }
IsStopSound() const233     bool        IsStopSound() const             { return mbStopSound; }
234 
getTransitionType() const235     sal_Int16   getTransitionType() const { return mnTransitionType;}
236     void        setTransitionType( sal_Int16 nTransitionType );
237 
getTransitionSubtype() const238     sal_Int16   getTransitionSubtype() const { return mnTransitionSubtype;}
239     void        setTransitionSubtype( sal_Int16 nTransitionSubtype );
240 
getTransitionDirection() const241     bool    getTransitionDirection() const { return mbTransitionDirection;}
242     void        setTransitionDirection( bool bTransitionbDirection );
243 
getTransitionFadeColor() const244     sal_Int32   getTransitionFadeColor() const { return mnTransitionFadeColor;}
245     void        setTransitionFadeColor( sal_Int32 nTransitionFadeColor );
246 
getTransitionDuration() const247     double      getTransitionDuration() const { return mfTransitionDuration;}
248     void        setTransitionDuration( double fTranstionDuration );
249 
250     virtual void Changed(const SdrObject& rObj, SdrUserCallType eType,
251                          const ::tools::Rectangle& rOldBoundRect) override;
252 
253     void             SetLayoutName(const OUString& aName);
GetLayoutName() const254     virtual OUString GetLayoutName() const override       { return maLayoutName; }
255 
SetFileName(const OUString & aName)256     void            SetFileName(const OUString& aName) { maFileName = aName; }
GetFileName() const257     const OUString& GetFileName() const       { return maFileName; }
SetBookmarkName(const OUString & aName)258     void            SetBookmarkName(const OUString& aName) { maBookmarkName = aName; }
GetBookmarkName() const259     const OUString& GetBookmarkName() const       { return maBookmarkName; }
260 
261     void            ConnectLink();
262     void            DisconnectLink();
263 
264     void            ScaleObjects(const Size& rNewPageSize, const ::tools::Rectangle& rNewBorderRect,
265                          bool bScaleAllObj);
266 
267     const OUString& GetName() const;
GetRealName() const268     OUString const & GetRealName() const { return FmFormPage::GetName(); };
269 
270     void            SetPresentationLayout(const OUString& rLayoutName,
271                                   bool bReplaceStyleSheets = true,
272                                   bool bSetMasterPage = true,
273                                   bool bReverseOrder = false);
274     void            EndListenOutlineText();
275 
276     void    SetBackgroundFullSize( bool bIn );
IsBackgroundFullSize() const277     bool    IsBackgroundFullSize() const { return mbBackgroundFullSize; }
278 
SetPaperBin(sal_uInt16 nBin)279     void    SetPaperBin(sal_uInt16 nBin) { mnPaperBin = nBin; }
GetPaperBin() const280     sal_uInt16  GetPaperBin() const { return mnPaperBin; }
281     virtual void        SetOrientation(Orientation eOrient) override;
282     virtual Orientation GetOrientation() const override;
283 
284     virtual SfxStyleSheet* GetTextStyleSheetForObject( SdrObject* pObj ) const override;
285 
286     bool setAlienAttributes( const css::uno::Any& rAttributes );
287     void getAlienAttributes( css::uno::Any& rAttributes );
288 
289     /** @return the main animation node
290 
291         @throws css::uno::RuntimeException
292     */
293     css::uno::Reference< css::animations::XAnimationNode > const & getAnimationNode();
294 
295     /** sets the main animation node
296 
297         @throws css::uno::RuntimeException
298     */
299     void setAnimationNode( css::uno::Reference< css::animations::XAnimationNode > const & xNode );
300 
301     /// @return a helper class to manipulate effects inside the main sequence
302     std::shared_ptr< sd::MainSequence > const & getMainSequence();
303 
304     /** quick check if this slide has an animation node.
305         This can be used to have a cost free check if there are no animations ad this slide.
306         If it returns true this does not mean that there are animations available.
307     */
308     bool hasAnimationNode() const;
309 
310     /// @return the SdPage implementation for the given XDrawPage or 0 if not available
311     static SdPage* getImplementation( const css::uno::Reference< css::drawing::XDrawPage >& xPage );
312 
313     /** removes all custom animations for the given shape */
314     void removeAnimations( const SdrObject* pObj );
315 
316     /** Notify that the object has been renamed and the animation effects has to update. */
317     void notifyObjectRenamed(const SdrObject* pObj);
318 
319     /** Set the name of the page and broadcast a model change.
320     */
321     void SetName (const OUString& rName);
322 
323     const sd::HeaderFooterSettings& getHeaderFooterSettings() const;
324     void setHeaderFooterSettings( const sd::HeaderFooterSettings& rNewSettings );
325 
326     /**
327         @return true if the object from the ViewObjectContact should
328         be visible on this page while rendering.
329 
330         bEdit selects if visibility test is for an editing view or a final render,
331         like printing.
332     */
333     virtual bool checkVisibility(
334         const sdr::contact::ViewObjectContact& rOriginal,
335         const sdr::contact::DisplayInfo& rDisplayInfo,
336         bool bEdit ) override;
337 
338     /** callback from the sd::View when a new paragraph for one object on this page is created */
339     void onParagraphInserted( ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj );
340 
341     /** callback from the sd::View when a paragraph from one object on this page is removed */
342     void onParagraphRemoving( ::Outliner* pOutliner, Paragraph const * pPara, SdrObject* pObj );
343 
344     /** callback from the sd::View when an object just left text edit mode */
345     void onEndTextEdit( SdrObject* pObj );
346 
347     /** @return the presentation style with the given helpid from this masterpage or this
348         slides masterpage */
349     SdStyleSheet* getPresentationStyle( sal_uInt32 nHelpId ) const;
350 
351     /** removes all empty presentation objects from this slide */
352     void RemoveEmptyPresentationObjects();
353 
354     ::tools::Rectangle   GetTitleRect() const;
355     ::tools::Rectangle   GetLayoutRect() const;
356 
357     static void CalculateHandoutAreas( SdDrawDocument& rModel, AutoLayout eLayout, bool bHorizontal, std::vector< ::tools::Rectangle >& rAreas );
358 
359     /** Set the "precious" flag to the given value.
360     */
361     void SetPrecious (const bool bIsPrecious);
362 
363     /** The "precious" flag is used for master pages to prevent some unused
364         master pages from being deleted automatically.  For pages
365         other than master pages this flag can be ignored.
366         @return
367             When this method returns <TRUE/> for a master page then this
368             master page should not be deleted automatically.
369     */
IsPrecious() const370     bool IsPrecious() const { return mbIsPrecious; }
371 
372     void createAnnotation( css::uno::Reference< css::office::XAnnotation >& xAnnotation );
373     void addAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation, int nIndex );
374     void removeAnnotation( const css::uno::Reference< css::office::XAnnotation >& xAnnotation );
getAnnotations() const375     const sd::AnnotationVector& getAnnotations() const { return maAnnotations; }
376     bool Equals(const SdPage&) const;
377     virtual void dumpAsXml(xmlTextWriterPtr pWriter) const override;
getPageId() const378     sal_uInt16 getPageId() const { return mnPageId; }
379 
380     static sal_uInt16 mnLastPageId;
381 
382 private:
383     bool mbIsPrecious;
384 
385     // page id of this page
386     sal_uInt16 const mnPageId;
387 
388     /** clone the animations from this and set them to rTargetPage
389      *  TTTT: Order is strange, should be the other way around by
390      *  convention/convenience and makes usage a little dangerous...
391     */
392     void cloneAnimations( SdPage& rTargetPage ) const;
393 
394     /** called before a shape is removed or replaced from this slide */
395     void onRemoveObject( SdrObject* pObject );
396 };
397 
398 #endif // INCLUDED_SD_INC_SDPAGE_HXX
399 
400 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
401