1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseSVN
\r
5 // This program is free software; you can redistribute it and/or
\r
6 // modify it under the terms of the GNU General Public License
\r
7 // as published by the Free Software Foundation; either version 2
\r
8 // of the License, or (at your option) any later version.
\r
10 // This program is distributed in the hope that it will be useful,
\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 // GNU General Public License for more details.
\r
15 // You should have received a copy of the GNU General Public License
\r
16 // along with this program; if not, write to the Free Software Foundation,
\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
21 #include "Globals.h"
\r
22 #include "registry.h"
\r
23 #include "resource.h"
\r
24 #include "ShellCache.h"
\r
25 #include "RemoteCacheLink.h"
\r
26 #include "GitStatus.h"
\r
27 #include "GitFolderStatus.h"
\r
28 #include "uxtheme.h"
\r
30 extern UINT g_cRefThisDll; // Reference count of this DLL.
\r
31 extern HINSTANCE g_hmodThisDll; // Instance handle for this DLL
\r
32 extern ShellCache g_ShellCache; // caching of registry entries, ...
\r
33 extern DWORD g_langid;
\r
34 extern DWORD g_langTimeout;
\r
35 extern HINSTANCE g_hResInst;
\r
36 extern stdstring g_filepath;
\r
37 extern git_wc_status_kind g_filestatus; ///< holds the corresponding status to the file/dir above
\r
38 extern bool g_readonlyoverlay; ///< whether to show the read only overlay or not
\r
39 extern bool g_lockedoverlay; ///< whether to show the locked overlay or not
\r
41 extern bool g_normalovlloaded;
\r
42 extern bool g_modifiedovlloaded;
\r
43 extern bool g_conflictedovlloaded;
\r
44 extern bool g_readonlyovlloaded;
\r
45 extern bool g_deletedovlloaded;
\r
46 extern bool g_lockedovlloaded;
\r
47 extern bool g_addedovlloaded;
\r
48 extern bool g_ignoredovlloaded;
\r
49 extern bool g_unversionedovlloaded;
\r
50 extern LPCTSTR g_MenuIDString;
\r
52 extern void LoadLangDll();
\r
53 extern CComCriticalSection g_csGlobalCOMGuard;
\r
54 typedef CComCritSecLock<CComCriticalSection> AutoLocker;
\r
58 typedef HRESULT (WINAPI *FN_GetBufferedPaintBits) (HPAINTBUFFER hBufferedPaint, RGBQUAD **ppbBuffer, int *pcxRow);
\r
59 typedef HPAINTBUFFER (WINAPI *FN_BeginBufferedPaint) (HDC hdcTarget, const RECT *prcTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS *pPaintParams, HDC *phdc);
\r
60 typedef HRESULT (WINAPI *FN_EndBufferedPaint) (HPAINTBUFFER hBufferedPaint, BOOL fUpdateTarget);
\r
63 // The actual OLE Shell context menu handler
\r
65 * \ingroup TortoiseShell
\r
66 * The main class of our COM object / Shell Extension.
\r
67 * It contains all Interfaces we implement for the shell to use.
\r
68 * \remark The implementations of the different interfaces are
\r
69 * split into several *.cpp files to keep them in a reasonable size.
\r
71 class CShellExt : public IContextMenu3,
\r
75 IShellIconOverlayIdentifier,
\r
79 // COMPILER ERROR? You need the latest version of the
\r
80 // platform SDK which has references to IColumnProvider
\r
81 // in the header files. Download it here:
\r
82 // http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
\r
93 ShellSubMenuMultiple,
\r
98 ShellMenuAddAsReplacement,
\r
106 ShellMenuCreateRepos,
\r
112 ShellMenuRemoveKeep,
\r
114 ShellMenuUpdateExt,
\r
118 ShellMenuDropCopyAdd,
\r
119 ShellMenuDropMoveAdd,
\r
121 ShellMenuDropMoveRename,
\r
123 ShellMenuDropCopyRename,
\r
124 ShellMenuDropExport,
\r
125 ShellMenuDropExportExtended,
\r
127 ShellMenuConflictEditor,
\r
130 ShellMenuShowChanged,
\r
131 ShellMenuIgnoreSub,
\r
133 ShellMenuIgnoreFile,
\r
134 ShellMenuIgnoreCaseSensitive,
\r
135 ShellMenuIgnoreCaseInsensitive,
\r
137 ShellMenuRefBrowse,
\r
139 ShellMenuApplyPatch,
\r
140 ShellMenuCreatePatch,
\r
141 ShellMenuRevisionGraph,
\r
142 ShellMenuUnIgnoreSub,
\r
143 ShellMenuUnIgnoreCaseSensitive,
\r
146 // ShellMenuUnlock,
\r
147 // ShellMenuUnlockForce,
\r
148 ShellMenuProperties,
\r
149 ShellMenuDelUnversioned,
\r
150 ShellMenuClipPaste,
\r
156 ShellMenuFormatPatch,
\r
157 ShellMenuImportPatch,
\r
158 ShellMenuCherryPick,
\r
161 ShellMenuStashSave,
\r
162 ShellMenuStashApply,
\r
163 ShellMenuStashList,
\r
168 ShellMenuGitSVNRebase,
\r
169 ShellMenuGitSVNDCommit,
\r
170 ShellMenuGitSVNIgnore, //import svn ignore
\r
172 ShellMenuLastEntry // used to mark the menu array end
\r
175 // helper struct for context menu entries
\r
176 typedef struct MenuInfo
\r
178 GitCommands command; ///< the command which gets executed for this menu entry
\r
179 unsigned __int64 menuID; ///< the menu ID to recognize the entry. NULL if it shouldn't be added to the context menu automatically
\r
180 UINT iconID; ///< the icon to show for the menu entry
\r
181 UINT menuTextID; ///< the text of the menu entry
\r
182 UINT menuDescID; ///< the description text for the menu entry
\r
183 /// the following 8 params are for checking whether the menu entry should
\r
184 /// be added automatically, based on states of the selected item(s).
\r
185 /// The 'yes' states must be set, the 'no' states must not be set
\r
186 /// the four pairs are OR'ed together, the 'yes'/'no' states are AND'ed together.
\r
197 static MenuInfo menuInfo[];
\r
201 //std::map<int,std::string> verbMap;
\r
202 std::map<UINT_PTR, UINT_PTR> myIDMap;
\r
203 std::map<UINT_PTR, UINT_PTR> mySubMenuMap;
\r
204 std::map<stdstring, UINT_PTR> myVerbsMap;
\r
205 std::map<UINT_PTR, stdstring> myVerbsIDMap;
\r
207 std::vector<stdstring> files_;
\r
208 DWORD itemStates; ///< see the globals.h file for the ITEMIS_* defines
\r
209 DWORD itemStatesFolder; ///< used for states of the folder_ (folder background and/or drop target folder)
\r
210 stdstring uuidSource;
\r
211 stdstring uuidTarget;
\r
213 TCHAR stringtablebuffer[255];
\r
214 stdstring columnfilepath; ///< holds the last file/dir path for the column provider
\r
215 stdstring columnauthor; ///< holds the corresponding author of the file/dir above
\r
217 stdstring itemshorturl;
\r
218 stdstring ignoredprops;
\r
220 git_revnum_t columnrev; ///< holds the corresponding revision to the file/dir above
\r
221 git_wc_status_kind filestatus;
\r
222 std::map<UINT, HBITMAP> bitmaps;
\r
224 GitFolderStatus m_CachedStatus; // status cache
\r
225 CRemoteCacheLink m_remoteCacheLink;
\r
227 FN_GetBufferedPaintBits pfnGetBufferedPaintBits;
\r
228 FN_BeginBufferedPaint pfnBeginBufferedPaint;
\r
229 FN_EndBufferedPaint pfnEndBufferedPaint;
\r
231 #define MAKESTRING(ID) LoadStringEx(g_hResInst, ID, stringtablebuffer, sizeof(stringtablebuffer)/sizeof(TCHAR), (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)))
\r
233 void InsertGitMenu(BOOL istop, HMENU menu, UINT pos, UINT_PTR id, UINT stringid, UINT icon, UINT idCmdFirst, GitCommands com, UINT uFlags);
\r
234 void InsertIgnoreSubmenus(UINT &idCmd, UINT idCmdFirst, HMENU hMenu, HMENU subMenu, UINT &indexMenu, int &indexSubMenu, unsigned __int64 topmenu, bool bShowIcons, UINT uFlags);
\r
235 stdstring WriteFileListToTempFile();
\r
236 bool WriteClipboardPathsToTempFile(stdstring& tempfile);
\r
237 LPCTSTR GetMenuTextFromResource(int id);
\r
238 void GetColumnStatus(const TCHAR * path, BOOL bIsDir);
\r
239 HBITMAP IconToBitmap(UINT uIcon);
\r
240 STDMETHODIMP QueryDropContext(UINT uFlags, UINT idCmdFirst, HMENU hMenu, UINT &indexMenu);
\r
241 bool IsIllegalFolder(std::wstring folder, int * cslidarray);
\r
242 HBITMAP IconToBitmapPARGB32(UINT uIcon);
\r
243 HRESULT Create32BitHBITMAP(HDC hdc, const SIZE *psize, __deref_opt_out void **ppvBits, __out HBITMAP* phBmp);
\r
244 HRESULT ConvertBufferToPARGB32(HPAINTBUFFER hPaintBuffer, HDC hdc, HICON hicon, SIZE& sizIcon);
\r
245 bool HasAlpha(__in ARGB *pargb, SIZE& sizImage, int cxRow);
\r
246 HRESULT ConvertToPARGB32(HDC hdc, __inout ARGB *pargb, HBITMAP hbmp, SIZE& sizImage, int cxRow);
\r
250 CShellExt(FileState state);
\r
251 virtual ~CShellExt();
\r
253 /** \name IUnknown
\r
257 STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
\r
258 STDMETHODIMP_(ULONG) AddRef();
\r
259 STDMETHODIMP_(ULONG) Release();
\r
262 /** \name IContextMenu2
\r
263 * IContextMenu2 members
\r
266 STDMETHODIMP QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags);
\r
267 STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi);
\r
268 STDMETHODIMP GetCommandString(UINT_PTR idCmd, UINT uFlags, UINT FAR *reserved, LPSTR pszName, UINT cchMax);
\r
269 STDMETHODIMP HandleMenuMsg(UINT uMsg, WPARAM wParam, LPARAM lParam);
\r
272 /** \name IContextMenu3
\r
273 * IContextMenu3 members
\r
276 STDMETHODIMP HandleMenuMsg2(UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pResult);
\r
279 /** \name IColumnProvider
\r
280 * IColumnProvider members
\r
283 STDMETHODIMP GetColumnInfo(DWORD dwIndex, SHCOLUMNINFO *psci);
\r
284 STDMETHODIMP GetItemData(LPCSHCOLUMNID pscid, LPCSHCOLUMNDATA pscd, VARIANT *pvarData);
\r
285 STDMETHODIMP Initialize(LPCSHCOLUMNINIT psci);
\r
288 /** \name IShellExtInit
\r
289 * IShellExtInit methods
\r
292 STDMETHODIMP Initialize(LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hKeyID);
\r
295 /** \name IPersistFile
\r
296 * IPersistFile methods
\r
299 STDMETHODIMP GetClassID(CLSID *pclsid);
\r
300 STDMETHODIMP Load(LPCOLESTR pszFileName, DWORD dwMode);
\r
301 STDMETHODIMP IsDirty(void) { return S_OK; };
\r
302 STDMETHODIMP Save(LPCOLESTR /*pszFileName*/, BOOL /*fRemember*/) { return S_OK; };
\r
303 STDMETHODIMP SaveCompleted(LPCOLESTR /*pszFileName*/) { return S_OK; };
\r
304 STDMETHODIMP GetCurFile(LPOLESTR * /*ppszFileName*/) { return S_OK; };
\r
307 /** \name IShellIconOverlayIdentifier
\r
308 * IShellIconOverlayIdentifier methods
\r
311 STDMETHODIMP GetOverlayInfo(LPWSTR pwszIconFile, int cchMax, int *pIndex, DWORD *pdwFlags);
\r
312 STDMETHODIMP GetPriority(int *pPriority);
\r
313 STDMETHODIMP IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib);
\r
316 /** \name IShellPropSheetExt
\r
317 * IShellPropSheetExt methods
\r
320 STDMETHODIMP AddPages(LPFNADDPROPSHEETPAGE lpfnAddPage, LPARAM lParam);
\r
321 STDMETHODIMP ReplacePage (UINT, LPFNADDPROPSHEETPAGE, LPARAM);
\r
324 /** \name ICopyHook
\r
325 * ICopyHook members
\r
328 STDMETHODIMP_(UINT) CopyCallback(HWND hWnd, UINT wFunc, UINT wFlags, LPCTSTR pszSrcFile, DWORD dwSrcAttribs, LPCTSTR pszDestFile, DWORD dwDestAttribs);
\r