OSDN Git Service

Show Ignore Sub Menu
[tortoisegit/TortoiseGitJp.git] / Utils / MiscUI / FileDropEdit.h
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2008 - TortoiseSVN\r
4 \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
9 \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
14 \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
18 //\r
19 #pragma once\r
20 \r
21 #include "../DragDropImpl.h"\r
22 #include "../UnicodeUtils.h"\r
23 \r
24 /**\r
25  * \ingroup Utils\r
26  * helper class to turn a control into a file drop target\r
27  */\r
28 class CFileDropTarget : public CIDropTarget\r
29 {\r
30 public:\r
31         CFileDropTarget(HWND hTargetWnd):CIDropTarget(hTargetWnd){}\r
32         virtual bool OnDrop(FORMATETC* pFmtEtc, STGMEDIUM& medium, DWORD * /*pdwEffect*/, POINTL /*pt*/)\r
33         {\r
34                 if(pFmtEtc->cfFormat == CF_TEXT && medium.tymed == TYMED_ISTREAM)\r
35                 {\r
36                         if(medium.pstm != NULL)\r
37                         {\r
38                                 const int BUF_SIZE = 10000;\r
39                                 char buff[BUF_SIZE+1];\r
40                                 ULONG cbRead=0;\r
41                                 HRESULT hr = medium.pstm->Read(buff, BUF_SIZE, &cbRead);\r
42                                 if( SUCCEEDED(hr) && cbRead > 0 && cbRead < BUF_SIZE)\r
43                                 {\r
44                                         buff[cbRead]=0;\r
45                                         LRESULT nLen = ::SendMessage(m_hTargetWnd, WM_GETTEXTLENGTH, 0, 0);\r
46                                         ::SendMessage(m_hTargetWnd, EM_SETSEL, nLen, -1);\r
47                                         std::wstring str = CUnicodeUtils::StdGetUnicode(std::string(buff));\r
48                                         ::SendMessage(m_hTargetWnd, EM_REPLACESEL, TRUE, (LPARAM)str.c_str());\r
49                                 }\r
50                                 else\r
51                                         for(;(hr==S_OK && cbRead >0) && SUCCEEDED(hr) ;)\r
52                                         {\r
53                                                 buff[cbRead]=0;\r
54                                                 LRESULT nLen = ::SendMessage(m_hTargetWnd, WM_GETTEXTLENGTH, 0, 0);\r
55                                                 ::SendMessage(m_hTargetWnd, EM_SETSEL, nLen, -1);\r
56                                                 std::wstring str = CUnicodeUtils::StdGetUnicode(std::string(buff));\r
57                                                 ::SendMessage(m_hTargetWnd, EM_REPLACESEL, TRUE, (LPARAM)str.c_str());\r
58                                                 cbRead=0;\r
59                                                 hr = medium.pstm->Read(buff, BUF_SIZE, &cbRead);\r
60                                         }\r
61                         }\r
62                 }\r
63                 if(pFmtEtc->cfFormat == CF_UNICODETEXT && medium.tymed == TYMED_ISTREAM)\r
64                 {\r
65                         if(medium.pstm != NULL)\r
66                         {\r
67                                 const int BUF_SIZE = 10000;\r
68                                 TCHAR buff[BUF_SIZE+1];\r
69                                 ULONG cbRead=0;\r
70                                 HRESULT hr = medium.pstm->Read(buff, BUF_SIZE, &cbRead);\r
71                                 if( SUCCEEDED(hr) && cbRead > 0 && cbRead < BUF_SIZE)\r
72                                 {\r
73                                         buff[cbRead]=0;\r
74                                         LRESULT nLen = ::SendMessage(m_hTargetWnd, WM_GETTEXTLENGTH, 0, 0);\r
75                                         ::SendMessage(m_hTargetWnd, EM_SETSEL, nLen, -1);\r
76                                         ::SendMessage(m_hTargetWnd, EM_REPLACESEL, TRUE, (LPARAM)buff);\r
77                                 }\r
78                                 else\r
79                                         for(;(hr==S_OK && cbRead >0) && SUCCEEDED(hr) ;)\r
80                                         {\r
81                                                 buff[cbRead]=0;\r
82                                                 LRESULT nLen = ::SendMessage(m_hTargetWnd, WM_GETTEXTLENGTH, 0, 0);\r
83                                                 ::SendMessage(m_hTargetWnd, EM_SETSEL, nLen, -1);\r
84                                                 ::SendMessage(m_hTargetWnd, EM_REPLACESEL, TRUE, (LPARAM)buff);\r
85                                                 cbRead=0;\r
86                                                 hr = medium.pstm->Read(buff, BUF_SIZE, &cbRead);\r
87                                         }\r
88                         }\r
89                 }\r
90                 if(pFmtEtc->cfFormat == CF_TEXT && medium.tymed == TYMED_HGLOBAL)\r
91                 {\r
92                         char* pStr = (char*)GlobalLock(medium.hGlobal);\r
93                         if(pStr != NULL)\r
94                         {\r
95                                 LRESULT nLen = ::SendMessage(m_hTargetWnd, WM_GETTEXTLENGTH, 0, 0);\r
96                                 ::SendMessage(m_hTargetWnd, EM_SETSEL, nLen, -1);\r
97                                 std::wstring str = CUnicodeUtils::StdGetUnicode(std::string(pStr));\r
98                                 ::SendMessage(m_hTargetWnd, EM_REPLACESEL, TRUE, (LPARAM)str.c_str());\r
99                         }\r
100                         GlobalUnlock(medium.hGlobal);\r
101                 }\r
102                 if(pFmtEtc->cfFormat == CF_UNICODETEXT && medium.tymed == TYMED_HGLOBAL)\r
103                 {\r
104                         WCHAR* pStr = (WCHAR*)GlobalLock(medium.hGlobal);\r
105                         if(pStr != NULL)\r
106                         {\r
107                                 LRESULT nLen = ::SendMessage(m_hTargetWnd, WM_GETTEXTLENGTH, 0, 0);\r
108                                 ::SendMessage(m_hTargetWnd, EM_SETSEL, nLen, -1);\r
109                                 ::SendMessage(m_hTargetWnd, EM_REPLACESEL, TRUE, (LPARAM)pStr);\r
110                         }\r
111                         GlobalUnlock(medium.hGlobal);\r
112                 }\r
113                 if(pFmtEtc->cfFormat == CF_HDROP && medium.tymed == TYMED_HGLOBAL)\r
114                 {\r
115                         HDROP hDrop = (HDROP)GlobalLock(medium.hGlobal);\r
116                         if(hDrop != NULL)\r
117                         {\r
118                                 TCHAR szFileName[MAX_PATH];\r
119 \r
120                                 UINT cFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); \r
121                                 for(UINT i = 0; i < cFiles; ++i)\r
122                                 {\r
123                                         DragQueryFile(hDrop, i, szFileName, sizeof(szFileName)); \r
124                                         ::SendMessage(m_hTargetWnd, WM_SETTEXT, 0, (LPARAM)szFileName);\r
125                                 }  \r
126                                 //DragFinish(hDrop); // base class calls ReleaseStgMedium\r
127                         }\r
128                         GlobalUnlock(medium.hGlobal);\r
129                 }\r
130                 return true; //let base free the medium\r
131         }\r
132 \r
133 };\r
134 \r
135 \r
136 /**\r
137  * \ingroup Utils\r
138  * Enhancement for a CEdit control which allows the edit control to have files\r
139  * dropped onto it and fill in the path of that dropped file.\r
140  */\r
141 class CFileDropEdit : public CEdit\r
142 {\r
143         DECLARE_DYNAMIC(CFileDropEdit)\r
144 \r
145 public:\r
146         CFileDropEdit();\r
147         virtual ~CFileDropEdit();\r
148 \r
149 protected:\r
150         DECLARE_MESSAGE_MAP()\r
151         \r
152         CFileDropTarget * m_pDropTarget;\r
153         virtual void PreSubclassWindow();\r
154 };\r
155 \r
156 \r