summaryrefslogtreecommitdiffstats
path: root/sw/source/uibase/inc/swdtflvr.hxx
blob: 6234bd37294bf2fa9b0980fbadf24390d09f59d3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This file incorporates work covered by the following license notice:
 *
 *   Licensed to the Apache Software Foundation (ASF) under one or more
 *   contributor license agreements. See the NOTICE file distributed
 *   with this work for additional information regarding copyright
 *   ownership. The ASF licenses this file to you under the Apache
 *   License, Version 2.0 (the "License"); you may not use this file
 *   except in compliance with the License. You may obtain a copy of
 *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
 */
#ifndef INCLUDED_SW_SOURCE_UIBASE_INC_SWDTFLVR_HXX
#define INCLUDED_SW_SOURCE_UIBASE_INC_SWDTFLVR_HXX

#include <sfx2/objsh.hxx>

#include <vcl/transfer.hxx>
#include <vcl/graph.hxx>
#include <vcl/vclptr.hxx>
#include <sfx2/lnkbase.hxx>
#include <com/sun/star/embed/XEmbeddedObject.hpp>
#include <o3tl/deleter.hxx>
#include <o3tl/typed_flags_set.hxx>
#include <svx/swframetypes.hxx>
#include <svl/urlbmk.hxx>
#include <memory>
#include <optional>

#include <swdllapi.h>

class Graphic;
class ImageMap;
class INetImage;
class SfxAbstractPasteDialog;
class SwDoc;
class SwDocFac;
class SwPaM;
class SwTextBlocks;
class SwWrtShell;
class SvxClipboardFormatItem;
class SwFrameShell;
class SwView_Impl;
class SwPasteContext;
enum class SwPasteSdr;

enum class TransferBufferType : sal_uInt16
{
        NONE          = 0x0000,
        Document      = 0x0001,
        DocumentWord  = 0x0002,
        Graphic       = 0x0004,
        Table         = 0x0008,
        Ole           = 0x0020,
        InetField     = 0x0040,
        Drawing       = 0x0081,   // drawing is internal too!
};
namespace o3tl {
    template<> struct typed_flags<TransferBufferType> : is_typed_flags<TransferBufferType, 0x00ef> {};
}
// paste table into a table
enum class PasteTableType
{
        PASTE_DEFAULT, // paste table by overwriting table cells
        PASTE_ROW,     // paste table as rows above
        PASTE_COLUMN,  // paste table as columns before
        PASTE_TABLE    // paste table as nested table
};

class SwTransferDdeLink;

class SW_DLLPUBLIC SwTransferable final : public TransferableHelper
{
    friend class SwView_Impl;
    SfxObjectShellLock              m_aDocShellRef;
    TransferableObjectDescriptor    m_aObjDesc;
    tools::SvRef<SwTransferDdeLink>  m_xDdeLink;

    SwWrtShell      *m_pWrtShell;
    /* #96392# Added pCreatorView to distinguish SwFrameShell from
       SwWrtShell. */
    const SwFrameShell *m_pCreatorView;
    std::unique_ptr<SwDocFac, o3tl::default_delete<SwDocFac>> m_pClpDocFac;
    std::optional<Graphic>        m_oClpGraphic;
    std::optional<Graphic>        m_oClpBitmap;
    Graphic                         *m_pOrigGraphic;
    std::optional<INetBookmark>     m_oBookmark;     // URL and description!
    std::unique_ptr<ImageMap>       m_pImageMap;
    std::unique_ptr<INetImage>      m_pTargetURL;

    TransferBufferType m_eBufferType;

    bool m_bOldIdle   :1; //D&D Idle flag from the viewsettings
    bool m_bCleanUp   :1; //D&D cleanup after Drop (not by internal Drop)

    // helper methods for the copy
    css::uno::Reference < css::embed::XEmbeddedObject > FindOLEObj( sal_Int64& nAspect ) const;
    const Graphic* FindOLEReplacementGraphic() const;
    void DeleteSelection();

    // helper methods for the paste
    static SwTransferable* GetSwTransferable( const TransferableDataHelper& rData );
    static void SetSelInShell( SwWrtShell& , bool , const Point* );
    static bool CheckForURLOrLNKFile( const TransferableDataHelper& rData,
                                OUString& rFileName, OUString* pTitle = nullptr );
    static bool TestAllowedFormat( const TransferableDataHelper& rData,
                                        SotClipboardFormatId nFormat, SotExchangeDest nDestination );

    static bool PasteFileContent( const TransferableDataHelper&,
                                    SwWrtShell& rSh, SotClipboardFormatId nFormat, bool bMsg, bool bIgnoreComments = false );
    static bool PasteOLE( TransferableDataHelper& rData, SwWrtShell& rSh,
                            SotClipboardFormatId nFormat, SotExchangeActionFlags nActionFlags, bool bMsg );
    static bool PasteTargetURL( const TransferableDataHelper& rData, SwWrtShell& rSh,
                        SwPasteSdr nAction, const Point* pPt, bool bInsertGRF );

    static bool PasteDDE( const TransferableDataHelper& rData, SwWrtShell& rWrtShell,
                            bool bReReadGrf, bool bMsg );

    static bool PasteSdrFormat(  const TransferableDataHelper& rData,
                                    SwWrtShell& rSh, SwPasteSdr nAction,
                                    const Point* pPt, SotExchangeActionFlags nActionFlags, bool bNeedToSelectBeforePaste);

    static bool PasteGrf( const TransferableDataHelper& rData, SwWrtShell& rSh,
                                SotClipboardFormatId nFormat, SwPasteSdr nAction, const Point* pPt,
                                SotExchangeActionFlags nActionFlags, sal_Int8 nDropAction, bool bNeedToSelectBeforePaste, RndStdIds nAnchorType = RndStdIds::FLY_AT_PARA );

    static bool PasteImageMap( const TransferableDataHelper& rData,
                                    SwWrtShell& rSh );

    static bool PasteAsHyperlink( const TransferableDataHelper& rData,
                                        SwWrtShell& rSh, SotClipboardFormatId nFormat );

    static bool PasteFileName( TransferableDataHelper& rData,
                            SwWrtShell& rSh, SotClipboardFormatId nFormat, SwPasteSdr nAction,
                            const Point* pPt, SotExchangeActionFlags nActionFlags, bool * graphicInserted );

    static bool PasteDBData( const TransferableDataHelper& rData, SwWrtShell& rSh,
                            SotClipboardFormatId nFormat, bool bLink, const Point* pDragPt,
                            bool bMsg );

    static bool PasteFileList( const TransferableDataHelper& rData,
                                SwWrtShell& rSh, bool bLink,
                                const Point* pPt, bool bMsg );

    bool PrivatePaste( SwWrtShell& rShell, SwPasteContext* pContext = nullptr, PasteTableType ePasteTable = PasteTableType::PASTE_DEFAULT );

    void SetDataForDragAndDrop( const Point& rSttPos );

                                    SwTransferable( const SwTransferable& ) = delete;
    SwTransferable&                 operator=( const SwTransferable& ) = delete;

    virtual void        AddSupportedFormats() override;
    virtual bool GetData( const css::datatransfer::DataFlavor& rFlavor, const OUString& rDestDoc ) override;
    virtual bool        WriteObject( tools::SvRef<SotTempStream>& rxOStm,
                                        void* pUserObject,
                                        sal_uInt32 nUserObjectId,
                                        const css::datatransfer::DataFlavor& rFlavor ) override;
    virtual void        DragFinished( sal_Int8 nDropAction ) override;
    virtual void        ObjectReleased() override;
    virtual sal_Bool SAL_CALL isComplex() override;

    using TransferableHelper::StartDrag;

public:
    SwTransferable( SwWrtShell& );
    virtual ~SwTransferable() override;

    static SotExchangeDest GetSotDestination( const SwWrtShell& rSh );

    // set properties on the document, like PageMargin, VisArea.
    // And set real Size
    static void InitOle( SfxObjectShell* pDoc );

    // copy - methods and helper methods for the copy
    int  Cut();
    int  Copy( bool bIsCut = false );
    int  PrepareForCopy( bool bIsCut = false );
    void PrepareForCopyTextRange(SwPaM & rPaM);
    void  CalculateAndCopy();                // special for Calculator
    bool  CopyGlossary( SwTextBlocks& rGlossary, const OUString& rStr );

    // remove the DDE-Link format promise
    void RemoveDDELinkFormat(vcl::Window& rWin);
    // disconnect to not receive DataChanged listener notifications
    void DisconnectDDE();

    // paste - methods and helper methods for the paste
    static bool IsPaste( const SwWrtShell&, const TransferableDataHelper& );
    static bool Paste( SwWrtShell&, TransferableDataHelper&, RndStdIds nAnchorType = RndStdIds::FLY_AT_PARA,
                          bool bIgnoreComments = false, PasteTableType ePasteTable = PasteTableType::PASTE_DEFAULT );
    static bool PasteData( TransferableDataHelper& rData,
                          SwWrtShell& rSh, sal_uInt8 nAction, SotExchangeActionFlags nActionFlags,
                          SotClipboardFormatId nFormat,
                          SotExchangeDest nDestination, bool bIsPasteFormat,
                          bool bIsDefault,
                          const Point* pDDPos = nullptr, sal_Int8 nDropAction = 0,
                          bool bPasteSelection = false, RndStdIds nAnchorType = RndStdIds::FLY_AT_PARA,
                          bool bIgnoreComments = false,
                          SwPasteContext* pContext = nullptr,
                          PasteTableType nPaste = PasteTableType::PASTE_DEFAULT );

    static bool IsPasteSpecial( const SwWrtShell& rWrtShell,
                                const TransferableDataHelper& );
    static bool IsPasteOwnFormat( const TransferableDataHelper& );
    static bool PasteUnformatted( SwWrtShell& rSh, TransferableDataHelper& );
    /**
     * @brief PrePasteSpecial Prepares the given dialog without actually running it
     * @param rSh
     * @param rFormatUsed
     */
    static void PrePasteSpecial( const SwWrtShell& rSh, TransferableDataHelper&, const VclPtr<SfxAbstractPasteDialog>& pDlg );
    static bool PasteFormat( SwWrtShell& rSh, TransferableDataHelper& rData,
                             SotClipboardFormatId nFormat );

    static void FillClipFormatItem( const SwWrtShell& rSh,
                                const TransferableDataHelper& rData,
                                SvxClipboardFormatItem & rToFill );

    // Interfaces for Drag & Drop
    void StartDrag( vcl::Window* pWin, const Point& rPos );

    SwWrtShell* GetShell()              { return m_pWrtShell; }
    void SetCleanUp( bool bFlag )       { m_bCleanUp = bFlag; }

    // public only for testing
    bool PrivateDrop( SwWrtShell& rSh, const Point& rDragPt, bool bMove,
                        bool bIsXSelection );

    // Interfaces for Selection
    /* #96392# Added pCreator to distinguish SwFrameShell from SwWrtShell. */
    static void CreateSelection( SwWrtShell & rSh,
                                 const SwFrameShell * pCreator = nullptr );
    static void ClearSelection( const SwWrtShell& rSh,
                                const SwFrameShell * pCreator = nullptr );

    // the related SwView is being closed and the SwTransferable is invalid now
    void    Invalidate() {m_pWrtShell = nullptr;}

    static void SelectPasteFormat(TransferableDataHelper& rData, sal_uInt8& nAction,
                                  SotClipboardFormatId& nFormat);
};

#endif

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */