1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2016-2017 - TortoiseGit
4 // Copyright (C) 2007-2008, 2010, 2012-2014 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include "DragDropImpl.h"
26 extern CLIPFORMAT CF_FILECONTENTS
;
27 extern CLIPFORMAT CF_FILEDESCRIPTOR
;
28 extern CLIPFORMAT CF_PREFERREDDROPEFFECT
;
29 extern CLIPFORMAT CF_INETURL
;
30 extern CLIPFORMAT CF_SHELLURL
;
31 extern CLIPFORMAT CF_FILE_ATTRIBUTES_ARRAY
;
34 #define GITDATAOBJECT_NUMFORMATS 9
38 * Represents a Git path as an IDataObject.
39 * This can be used for drag and drop operations to other applications like
42 class GitDataObject
: public IDataObject
, public IDataObjectAsyncCapability
46 * Constructs the GitDataObject.
47 * \param svnpaths a list of paths which must be inside a working tree.
48 * \param rev the revision
50 GitDataObject(const CTGitPathList
& gitpaths
, const CGitHash
& rev
, int stripLength
= -1);
54 virtual HRESULT STDMETHODCALLTYPE
QueryInterface(REFIID riid
, void** ppvObject
) override
;
55 virtual ULONG STDMETHODCALLTYPE
AddRef(void) override
;
56 virtual ULONG STDMETHODCALLTYPE
Release(void) override
;
59 virtual HRESULT STDMETHODCALLTYPE
GetData(FORMATETC
* pformatetcIn
, STGMEDIUM
* pmedium
) override
;
60 virtual HRESULT STDMETHODCALLTYPE
GetDataHere(FORMATETC
* pformatetc
, STGMEDIUM
* pmedium
) override
;
61 virtual HRESULT STDMETHODCALLTYPE
QueryGetData(FORMATETC
* pformatetc
) override
;
62 virtual HRESULT STDMETHODCALLTYPE
GetCanonicalFormatEtc(FORMATETC
* pformatectIn
, FORMATETC
* pformatetcOut
) override
;
63 virtual HRESULT STDMETHODCALLTYPE
SetData(FORMATETC
* pformatetc
, STGMEDIUM
* pmedium
, BOOL fRelease
) override
;
64 virtual HRESULT STDMETHODCALLTYPE
EnumFormatEtc(DWORD dwDirection
, IEnumFORMATETC
** ppenumFormatEtc
) override
;
65 virtual HRESULT STDMETHODCALLTYPE
DAdvise(FORMATETC
* pformatetc
, DWORD advf
, IAdviseSink
* pAdvSink
, DWORD
* pdwConnection
) override
;
66 virtual HRESULT STDMETHODCALLTYPE
DUnadvise(DWORD dwConnection
) override
;
67 virtual HRESULT STDMETHODCALLTYPE
EnumDAdvise(IEnumSTATDATA
** ppenumAdvise
) override
;
69 //IDataObjectAsyncCapability
70 virtual HRESULT STDMETHODCALLTYPE
SetAsyncMode(BOOL fDoOpAsync
) override
;
71 virtual HRESULT STDMETHODCALLTYPE
GetAsyncMode(BOOL
* pfIsOpAsync
) override
;
72 virtual HRESULT STDMETHODCALLTYPE
StartOperation(IBindCtx
* pbcReserved
) override
;
73 virtual HRESULT STDMETHODCALLTYPE
InOperation(BOOL
* pfInAsyncOp
) override
;
74 virtual HRESULT STDMETHODCALLTYPE
EndOperation(HRESULT hResult
, IBindCtx
* pbcReserved
, DWORD dwEffects
) override
;
76 HRESULT
SetDropDescription(DROPIMAGETYPE image
, LPCTSTR format
, LPCTSTR insert
);
79 void CopyMedium(STGMEDIUM
* pMedDest
, STGMEDIUM
* pMedSrc
, FORMATETC
* pFmtSrc
);
82 CTGitPathList m_gitPaths
;
84 std::vector
<CTGitPath
> m_allPaths
;
87 bool m_containsExistingFiles
;
90 std::vector
<FORMATETC
*> m_vecFormatEtc
;
91 std::vector
<STGMEDIUM
*> m_vecStgMedium
;
96 * Helper class for the GitDataObject class: implements the enumerator
97 * for the supported clipboard formats of the GitDataObject class.
99 class CGitEnumFormatEtc
: public IEnumFORMATETC
102 CGitEnumFormatEtc(const std::vector
<FORMATETC
*>& vec
, bool localonly
, bool containsExistingFiles
);
103 CGitEnumFormatEtc(const std::vector
<FORMATETC
>& vec
, bool localonly
, bool containsExistingFiles
);
105 STDMETHOD(QueryInterface
)(REFIID
, void**) override
;
106 STDMETHOD_(ULONG
, AddRef
)(void) override
;
107 STDMETHOD_(ULONG
, Release
)(void) override
;
109 //IEnumFORMATETC members
110 STDMETHOD(Next
)(ULONG
, LPFORMATETC
, ULONG
*) override
;
111 STDMETHOD(Skip
)(ULONG
) override
;
112 STDMETHOD(Reset
)(void) override
;
113 STDMETHOD(Clone
)(IEnumFORMATETC
**) override
;
115 void Init(bool localonly
, bool containsExistingFiles
);
117 std::vector
<FORMATETC
> m_vecFormatEtc
;
118 FORMATETC m_formats
[GITDATAOBJECT_NUMFORMATS
];
122 bool m_containsExistingFiles
;