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_SOURCE_UI_INC_SDXFER_HXX
21 #define INCLUDED_SD_SOURCE_UI_INC_SDXFER_HXX
22 
23 #include <vcl/transfer.hxx>
24 #include <vcl/vclptr.hxx>
25 #include <sfx2/objsh.hxx>
26 #include <svl/lstner.hxx>
27 
28 // SdTransferable
29 class SdDrawDocument;
30 class SdrObject;
31 class INetBookmark;
32 class ImageMap;
33 class VirtualDevice;
34 
35 namespace sd {
36 class DrawDocShell;
37 class View;
38 }
39 
40 class SAL_DLLPUBLIC_RTTI SdTransferable : public TransferableHelper, public SfxListener
41 {
42 public:
43 
44                                     SdTransferable( SdDrawDocument* pSrcDoc, ::sd::View* pWorkView, bool bInitOnGetData );
45                                     virtual ~SdTransferable() override;
46 
SetDocShell(const SfxObjectShellRef & rRef)47     void                            SetDocShell( const SfxObjectShellRef& rRef ) { maDocShellRef = rRef; }
GetDocShell() const48     const SfxObjectShellRef&        GetDocShell() const { return maDocShellRef; }
49 
SetWorkDocument(const SdDrawDocument * pWorkDoc)50     void                            SetWorkDocument( const SdDrawDocument* pWorkDoc ) { mpSdDrawDocument = mpSdDrawDocumentIntern = const_cast<SdDrawDocument*>(pWorkDoc); }
GetWorkDocument() const51     const SdDrawDocument*           GetWorkDocument() const { return mpSdDrawDocument; }
52 
53     void                            SetView(const ::sd::View* pView);
GetView() const54     const ::sd::View*               GetView() const { return mpSdView; }
55 
56     void                            SetObjectDescriptor( std::unique_ptr<TransferableObjectDescriptor> pObjDesc );
57 
SetStartPos(const Point & rStartPos)58     void                            SetStartPos( const Point& rStartPos ) { maStartPos = rStartPos; }
GetStartPos() const59     const Point&                    GetStartPos() const { return maStartPos; }
60 
SetInternalMove(bool bSet)61     void                            SetInternalMove( bool bSet ) { mbInternalMove = bSet; }
IsInternalMove() const62     bool                            IsInternalMove() const { return mbInternalMove; }
63 
HasSourceDoc(const SdDrawDocument * pDoc) const64     bool                            HasSourceDoc( const SdDrawDocument* pDoc ) const { return( mpSourceDoc == pDoc ); }
65 
66     void                            SetPageBookmarks( const std::vector<OUString>& rPageBookmarks, bool bPersistent );
IsPageTransferable() const67     bool                            IsPageTransferable() const { return mbPageTransferable; }
HasPageBookmarks() const68     bool                            HasPageBookmarks() const { return( mpPageDocShell && ( !maPageBookmarks.empty() ) ); }
GetPageBookmarks() const69     const std::vector<OUString>&    GetPageBookmarks() const { return maPageBookmarks; }
GetPageDocShell() const70     ::sd::DrawDocShell*             GetPageDocShell() const { return mpPageDocShell; }
71 
72     bool                            SetTableRTF( SdDrawDocument* );
73 
74     static const css::uno::Sequence< sal_Int8 >& getUnoTunnelId();
75     static SdTransferable*          getImplementation( const css::uno::Reference< css::uno::XInterface >& rxData ) throw();
76 
77     // SfxListener
78     virtual void                    Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) override;
79 
80     virtual void                    DragFinished( sal_Int8 nDropAction ) override;
GetSourceDoc() const81     SdDrawDocument*                 GetSourceDoc() const { return mpSourceDoc;}
82 
83     /** User data objects can be used to store information temporarily
84         at the transferable.  The slide sorter uses this to store
85         previews of the slides that are referenced by the
86         transferable.
87     */
~UserData()88     class UserData {public:virtual~UserData(){}};
89 
90     /** Add a user data object.  When it was added before (and not
91         removed) then this call is ignored.
92     */
93     void AddUserData (const std::shared_ptr<UserData>& rpData);
94 
95     /** Return the number of user data objects.
96     */
97     sal_Int32 GetUserDataCount() const;
98 
99     /** Return the specified user data object.  When the index is not
100         valid, ie not in the range [0,count) then an empty pointer is
101         returned.
102     */
103     std::shared_ptr<UserData> GetUserData (const sal_Int32 nIndex) const;
104 
105 protected:
106 
107     virtual void                    AddSupportedFormats() override;
108     virtual bool                    GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override;
109     virtual bool                    WriteObject( tools::SvRef<SotStorageStream>& rxOStm, void* pUserObject, sal_uInt32 nUserObjectId, const css::datatransfer::DataFlavor& rFlavor ) override;
110     virtual void                    ObjectReleased() override final;
111 
112     virtual sal_Int64 SAL_CALL      getSomething( const css::uno::Sequence< sal_Int8 >& rId ) override;
113 
114 private:
115 
116     SfxObjectShellRef               maDocShellRef;
117     ::sd::DrawDocShell*             mpPageDocShell;
118     std::vector<OUString>      maPageBookmarks;
119     std::unique_ptr<TransferableDataHelper>  mpOLEDataHelper;
120     std::unique_ptr<TransferableObjectDescriptor>  mpObjDesc;
121     const ::sd::View*               mpSdView;
122     ::sd::View*                     mpSdViewIntern;
123     SdDrawDocument*                 mpSdDrawDocument;
124     SdDrawDocument*                 mpSdDrawDocumentIntern;
125     SdDrawDocument*                 mpSourceDoc;
126     VclPtr<VirtualDevice>           mpVDev;
127     std::unique_ptr<INetBookmark>   mpBookmark;
128     std::unique_ptr<Graphic>        mpGraphic;
129     std::unique_ptr<ImageMap>       mpImageMap;
130     ::tools::Rectangle                       maVisArea;
131     Point                           maStartPos;
132     bool                            mbInternalMove               : 1;
133     bool                            mbOwnDocument                : 1;
134     bool                            mbOwnView                    : 1;
135     bool const                      mbLateInit                   : 1;
136     bool                            mbPageTransferable           : 1;
137     bool                            mbPageTransferablePersistent : 1;
138     ::std::vector<std::shared_ptr<UserData> > maUserData;
139 
140                                     SdTransferable( const SdTransferable& ) = delete;
141     SdTransferable&                 operator=( const SdTransferable& ) = delete;
142 
143     void                            CreateObjectReplacement( SdrObject* pObj );
144     void                            CreateData();
145 
146 };
147 
148 #endif // INCLUDED_SD_SOURCE_UI_INC_SDXFER_HXX
149 
150 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
151