Extend static functions in CAppUtils with a window handle parameter
[TortoiseGit.git] / src / Git / GitDataObject.h
bloba48699c7942ad67dd891be3cb62715713fe72ef7
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.
20 #pragma once
21 #include "TGitPath.h"
22 #include "DragDropImpl.h"
23 #include <vector>
24 #include <Shldisp.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
36 /**
37 * \ingroup Git
38 * Represents a Git path as an IDataObject.
39 * This can be used for drag and drop operations to other applications like
40 * the shell itself.
42 class GitDataObject : public IDataObject, public IDataObjectAsyncCapability
44 public:
45 /**
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);
51 ~GitDataObject();
53 //IUnknown
54 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) override;
55 virtual ULONG STDMETHODCALLTYPE AddRef(void) override;
56 virtual ULONG STDMETHODCALLTYPE Release(void) override;
58 //IDataObject
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);
78 private:
79 void CopyMedium(STGMEDIUM* pMedDest, STGMEDIUM* pMedSrc, FORMATETC* pFmtSrc);
81 private:
82 CTGitPathList m_gitPaths;
83 CGitHash m_revision;
84 std::vector<CTGitPath> m_allPaths;
85 int m_iStripLength;
86 long m_cRefCount;
87 bool m_containsExistingFiles;
88 BOOL m_bInOperation;
89 BOOL m_bIsAsync;
90 std::vector<FORMATETC*> m_vecFormatEtc;
91 std::vector<STGMEDIUM*> m_vecStgMedium;
95 /**
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
101 public:
102 CGitEnumFormatEtc(const std::vector<FORMATETC*>& vec, bool localonly, bool containsExistingFiles);
103 CGitEnumFormatEtc(const std::vector<FORMATETC>& vec, bool localonly, bool containsExistingFiles);
104 //IUnknown members
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;
114 private:
115 void Init(bool localonly, bool containsExistingFiles);
116 private:
117 std::vector<FORMATETC> m_vecFormatEtc;
118 FORMATETC m_formats[GITDATAOBJECT_NUMFORMATS];
119 ULONG m_cRefCount;
120 size_t m_iCur;
121 bool m_localonly;
122 bool m_containsExistingFiles;