1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2016 - 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
);
55 virtual ULONG STDMETHODCALLTYPE
AddRef(void);
56 virtual ULONG STDMETHODCALLTYPE
Release(void);
59 virtual HRESULT STDMETHODCALLTYPE
GetData(FORMATETC
* pformatetcIn
, STGMEDIUM
* pmedium
);
60 virtual HRESULT STDMETHODCALLTYPE
GetDataHere(FORMATETC
* pformatetc
, STGMEDIUM
* pmedium
);
61 virtual HRESULT STDMETHODCALLTYPE
QueryGetData(FORMATETC
* pformatetc
);
62 virtual HRESULT STDMETHODCALLTYPE
GetCanonicalFormatEtc(FORMATETC
* pformatectIn
, FORMATETC
* pformatetcOut
);
63 virtual HRESULT STDMETHODCALLTYPE
SetData(FORMATETC
* pformatetc
, STGMEDIUM
* pmedium
, BOOL fRelease
);
64 virtual HRESULT STDMETHODCALLTYPE
EnumFormatEtc(DWORD dwDirection
, IEnumFORMATETC
** ppenumFormatEtc
);
65 virtual HRESULT STDMETHODCALLTYPE
DAdvise(FORMATETC
* pformatetc
, DWORD advf
, IAdviseSink
* pAdvSink
, DWORD
* pdwConnection
);
66 virtual HRESULT STDMETHODCALLTYPE
DUnadvise(DWORD dwConnection
);
67 virtual HRESULT STDMETHODCALLTYPE
EnumDAdvise(IEnumSTATDATA
** ppenumAdvise
);
69 //IDataObjectAsyncCapability
70 virtual HRESULT STDMETHODCALLTYPE
SetAsyncMode(BOOL fDoOpAsync
);
71 virtual HRESULT STDMETHODCALLTYPE
GetAsyncMode(BOOL
* pfIsOpAsync
);
72 virtual HRESULT STDMETHODCALLTYPE
StartOperation(IBindCtx
* pbcReserved
);
73 virtual HRESULT STDMETHODCALLTYPE
InOperation(BOOL
* pfInAsyncOp
);
74 virtual HRESULT STDMETHODCALLTYPE
EndOperation(HRESULT hResult
, IBindCtx
* pbcReserved
, DWORD dwEffects
);
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**);
106 STDMETHOD_(ULONG
, AddRef
)(void);
107 STDMETHOD_(ULONG
, Release
)(void);
109 //IEnumFORMATETC members
110 STDMETHOD(Next
)(ULONG
, LPFORMATETC
, ULONG
*);
111 STDMETHOD(Skip
)(ULONG
);
112 STDMETHOD(Reset
)(void);
113 STDMETHOD(Clone
)(IEnumFORMATETC
**);
115 void Init(bool localonly
, bool containsExistingFiles
);
117 std::vector
<FORMATETC
> m_vecFormatEtc
;
118 FORMATETC m_formats
[GITDATAOBJECT_NUMFORMATS
];
122 bool m_containsExistingFiles
;