OSDN Git Service

Add url error message at syncdlg
[tortoisegit/TortoiseGitJp.git] / src / TortoiseUDiff / MainWindow.cpp
1 // TortoiseSVN - a Windows shell extension for easy version control\r
2 \r
3 // Copyright (C) 2003-2009 - 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 #include "StdAfx.h"\r
20 #include "MainWindow.h"\r
21 #include "UnicodeUtils.h"\r
22 \r
23 CMainWindow::CMainWindow(HINSTANCE hInst, const WNDCLASSEX* wcx /* = NULL*/) \r
24         : CWindow(hInst, wcx)\r
25         , m_bShowFindBar(false)\r
26 {\r
27         SetWindowTitle(_T("TortoiseUDiff"));\r
28 }\r
29 \r
30 CMainWindow::~CMainWindow(void)\r
31 {\r
32 }\r
33 \r
34 bool CMainWindow::RegisterAndCreateWindow()\r
35 {\r
36         WNDCLASSEX wcx; \r
37 \r
38         // Fill in the window class structure with default parameters \r
39         wcx.cbSize = sizeof(WNDCLASSEX);\r
40         wcx.style = CS_HREDRAW | CS_VREDRAW;\r
41         wcx.lpfnWndProc = CWindow::stWinMsgHandler;\r
42         wcx.cbClsExtra = 0;\r
43         wcx.cbWndExtra = 0;\r
44         wcx.hInstance = hResource;\r
45         wcx.hCursor = NULL;\r
46         wcx.lpszClassName = ResString(hResource, IDS_APP_TITLE);\r
47         wcx.hIcon = LoadIcon(hResource, MAKEINTRESOURCE(IDI_TORTOISEUDIFF));\r
48         wcx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);\r
49         wcx.lpszMenuName = MAKEINTRESOURCE(IDC_TORTOISEUDIFF);\r
50         wcx.hIconSm     = LoadIcon(wcx.hInstance, MAKEINTRESOURCE(IDI_TORTOISEUDIFF));\r
51         if (RegisterWindow(&wcx))\r
52         {\r
53                 if (Create(WS_CAPTION | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN, NULL))\r
54                 {\r
55                         m_FindBar.SetParent(*this);\r
56                         m_FindBar.Create(hResource, IDD_FINDBAR, *this);\r
57                         ShowWindow(*this, SW_SHOW);\r
58                         UpdateWindow(*this);\r
59                         return true;\r
60                 }\r
61         }\r
62         return false;\r
63 }\r
64 \r
65 LRESULT CALLBACK CMainWindow::WinMsgHandler(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r
66 {\r
67         switch (uMsg)\r
68         {\r
69         case WM_CREATE:\r
70                 {\r
71                         m_hwnd = hwnd;\r
72                         Initialize();\r
73                 }\r
74                 break;\r
75         case WM_COMMAND:\r
76                 {\r
77                         return DoCommand(LOWORD(wParam));\r
78                 }\r
79                 break;\r
80         case WM_MOUSEWHEEL:\r
81                 {\r
82                         if (GET_KEYSTATE_WPARAM(wParam) == MK_SHIFT)\r
83                         {\r
84                                 // scroll sideways\r
85                                 SendEditor(SCI_LINESCROLL, -GET_WHEEL_DELTA_WPARAM(wParam)/40, 0);\r
86                         }\r
87                         else\r
88                                 return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
89                 }\r
90                 break;\r
91         case WM_SIZE:\r
92                 {\r
93                         RECT rect;\r
94                         GetClientRect(*this, &rect);\r
95                         if (m_bShowFindBar)\r
96                         {\r
97                                 ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
98                                         rect.left, rect.top,\r
99                                         rect.right-rect.left, rect.bottom-rect.top-30,\r
100                                         SWP_SHOWWINDOW);\r
101                                 ::SetWindowPos(m_FindBar, HWND_TOP,\r
102                                         rect.left, rect.bottom-30,\r
103                                         rect.right-rect.left, 30,\r
104                                         SWP_SHOWWINDOW);\r
105                         }\r
106                         else\r
107                         {\r
108                                 ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
109                                         rect.left, rect.top,\r
110                                         rect.right-rect.left, rect.bottom-rect.top,\r
111                                         SWP_SHOWWINDOW);\r
112                                 ::ShowWindow(m_FindBar, SW_HIDE);\r
113                         }\r
114                 }\r
115                 break;\r
116         case WM_GETMINMAXINFO:\r
117                 {\r
118                         MINMAXINFO * mmi = (MINMAXINFO*)lParam;\r
119                         mmi->ptMinTrackSize.x = 100;\r
120                         mmi->ptMinTrackSize.y = 100;\r
121                         return 0;\r
122                 }\r
123                 break;\r
124         case WM_DESTROY:\r
125                 PostQuitMessage(0);\r
126                 break;\r
127         case WM_CLOSE:\r
128                 {\r
129                         CRegStdDWORD w = CRegStdDWORD(_T("Software\\TortoiseGit\\UDiffViewerWidth"), (DWORD)CW_USEDEFAULT);\r
130                         CRegStdDWORD h = CRegStdDWORD(_T("Software\\TortoiseGit\\UDiffViewerHeight"), (DWORD)CW_USEDEFAULT);\r
131                         CRegStdDWORD p = CRegStdDWORD(_T("Software\\TortoiseGit\\UDiffViewerPos"), 0);\r
132 \r
133                         RECT rect;\r
134                         ::GetWindowRect(*this, &rect);\r
135                         w = rect.right-rect.left;\r
136                         h = rect.bottom-rect.top;\r
137                         p = MAKELONG(rect.left, rect.top);\r
138                 }\r
139                 ::DestroyWindow(m_hwnd);\r
140                 break;\r
141         case WM_SETFOCUS:\r
142                 SetFocus(m_hWndEdit);\r
143                 break;\r
144         case COMMITMONITOR_FINDMSGNEXT:\r
145                 {\r
146                         SendEditor(SCI_CHARRIGHT);\r
147                         SendEditor(SCI_SEARCHANCHOR);\r
148                         m_bMatchCase = !!wParam;\r
149                         m_findtext = (LPCTSTR)lParam;\r
150                         SendEditor(SCI_SEARCHNEXT, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
151                         SendEditor(SCI_SCROLLCARET);\r
152                 }\r
153                 break;\r
154         case COMMITMONITOR_FINDMSGPREV:\r
155                 {\r
156                         SendEditor(SCI_SEARCHANCHOR);\r
157                         m_bMatchCase = !!wParam;\r
158                         m_findtext = (LPCTSTR)lParam;\r
159                         SendEditor(SCI_SEARCHPREV, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
160                         SendEditor(SCI_SCROLLCARET);\r
161                 }\r
162                 break;\r
163         case COMMITMONITOR_FINDEXIT:\r
164                 {\r
165                         RECT rect;\r
166                         GetClientRect(*this, &rect);\r
167                         m_bShowFindBar = false;\r
168                         ::ShowWindow(m_FindBar, SW_HIDE);\r
169                         ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
170                                 rect.left, rect.top,\r
171                                 rect.right-rect.left, rect.bottom-rect.top,\r
172                                 SWP_SHOWWINDOW);\r
173                 }\r
174                 break;\r
175         case COMMITMONITOR_FINDRESET:\r
176                 SendEditor(SCI_SETSELECTIONSTART, 0);\r
177                 SendEditor(SCI_SETSELECTIONEND, 0);\r
178                 SendEditor(SCI_SEARCHANCHOR);\r
179                 break;\r
180         default:\r
181                 return DefWindowProc(hwnd, uMsg, wParam, lParam);\r
182         }\r
183 \r
184         return 0;\r
185 };\r
186 \r
187 LRESULT CMainWindow::DoCommand(int id)\r
188 {\r
189         switch (id) \r
190         {\r
191         case ID_FILE_OPEN:\r
192                 {\r
193                         OPENFILENAME ofn = {0};                         // common dialog box structure\r
194                         TCHAR szFile[MAX_PATH] = {0};           // buffer for file name\r
195                         // Initialize OPENFILENAME\r
196                         ofn.lStructSize = sizeof(OPENFILENAME);\r
197                         ofn.hwndOwner = *this;\r
198                         ofn.lpstrFile = szFile;\r
199                         ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);\r
200                         TCHAR filter[1024];\r
201                         LoadString(hResource, IDS_PATCHFILEFILTER, filter, sizeof(filter)/sizeof(TCHAR));\r
202                         TCHAR * pszFilters = filter;\r
203                         // Replace '|' delimiters with '\0's\r
204                         TCHAR *ptr = pszFilters + _tcslen(pszFilters);  //set ptr at the NULL\r
205                         while (ptr != pszFilters)\r
206                         {\r
207                                 if (*ptr == '|')\r
208                                         *ptr = '\0';\r
209                                 ptr--;\r
210                         }\r
211                         ofn.lpstrFilter = pszFilters;\r
212                         ofn.nFilterIndex = 1;\r
213                         ofn.lpstrFileTitle = NULL;\r
214                         ofn.nMaxFileTitle = 0;\r
215                         ofn.lpstrInitialDir = NULL;\r
216                         TCHAR opentitle[1024];\r
217                         LoadString(hResource, IDS_OPENPATCH, opentitle, sizeof(opentitle)/sizeof(TCHAR));\r
218                         ofn.lpstrTitle = opentitle;\r
219                         ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST | OFN_ENABLESIZING | OFN_EXPLORER;\r
220                         // Display the Open dialog box. \r
221                         if (GetOpenFileName(&ofn)==TRUE)\r
222                         {\r
223                                 LoadFile(ofn.lpstrFile);\r
224                         }\r
225                 }\r
226                 break;\r
227         case ID_FILE_SAVEAS:\r
228                 {\r
229                         OPENFILENAME ofn = {0};                         // common dialog box structure\r
230                         TCHAR szFile[MAX_PATH] = {0};           // buffer for file name\r
231                         // Initialize OPENFILENAME\r
232                         ofn.lStructSize = sizeof(OPENFILENAME);\r
233                         ofn.hwndOwner = *this;\r
234                         ofn.lpstrFile = szFile;\r
235                         ofn.nMaxFile = sizeof(szFile)/sizeof(TCHAR);\r
236                         TCHAR filter[1024];\r
237                         LoadString(hResource, IDS_PATCHFILEFILTER, filter, sizeof(filter)/sizeof(TCHAR));\r
238                         TCHAR * pszFilters = filter;\r
239                         // Replace '|' delimiters with '\0's\r
240                         TCHAR *ptr = pszFilters + _tcslen(pszFilters);  //set ptr at the NULL\r
241                         while (ptr != pszFilters)\r
242                         {\r
243                                 if (*ptr == '|')\r
244                                         *ptr = '\0';\r
245                                 ptr--;\r
246                         }\r
247                         ofn.lpstrFilter = pszFilters;\r
248                         ofn.nFilterIndex = 1;\r
249                         ofn.lpstrFileTitle = NULL;\r
250                         ofn.nMaxFileTitle = 0;\r
251                         ofn.lpstrInitialDir = NULL;\r
252                         TCHAR savetitle[1024];\r
253                         LoadString(hResource, IDS_SAVEPATCH, savetitle, sizeof(savetitle)/sizeof(TCHAR));\r
254                         ofn.lpstrTitle = savetitle;\r
255                         ofn.Flags = OFN_OVERWRITEPROMPT | OFN_ENABLESIZING | OFN_EXPLORER;\r
256                         // Display the Open dialog box. \r
257                         if (GetSaveFileName(&ofn)==TRUE)\r
258                         {\r
259                                 SaveFile(ofn.lpstrFile);\r
260                         }\r
261                 }\r
262                 break;\r
263         case ID_FILE_EXIT:\r
264                 ::PostQuitMessage(0);\r
265                 return 0;\r
266         case IDM_SHOWFINDBAR:\r
267                 {\r
268                         m_bShowFindBar = true;\r
269                         ::ShowWindow(m_FindBar, SW_SHOW);\r
270                         RECT rect;\r
271                         GetClientRect(*this, &rect);\r
272                         ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
273                                 rect.left, rect.top,\r
274                                 rect.right-rect.left, rect.bottom-rect.top-30,\r
275                                 SWP_SHOWWINDOW);\r
276                         ::SetWindowPos(m_FindBar, HWND_TOP,\r
277                                 rect.left, rect.bottom-30,\r
278                                 rect.right-rect.left, 30,\r
279                                 SWP_SHOWWINDOW);\r
280                         ::SetFocus(m_FindBar);\r
281                         SendEditor(SCI_SETSELECTIONSTART, 0);\r
282                         SendEditor(SCI_SETSELECTIONEND, 0);\r
283                         SendEditor(SCI_SEARCHANCHOR);\r
284                 }\r
285                 break;\r
286         case IDM_FINDNEXT:\r
287                 SendEditor(SCI_CHARRIGHT);\r
288                 SendEditor(SCI_SEARCHANCHOR);\r
289                 SendEditor(SCI_SEARCHNEXT, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
290                 SendEditor(SCI_SCROLLCARET);\r
291                 break;\r
292         case IDM_FINDPREV:\r
293                 SendEditor(SCI_SEARCHANCHOR);\r
294                 SendEditor(SCI_SEARCHPREV, m_bMatchCase ? SCFIND_MATCHCASE : 0, (LPARAM)CUnicodeUtils::StdGetUTF8(m_findtext).c_str());\r
295                 SendEditor(SCI_SCROLLCARET);\r
296                 break;\r
297         case IDM_FINDEXIT:\r
298                 {\r
299                         if (IsWindowVisible(m_FindBar))\r
300                         {\r
301                                 RECT rect;\r
302                                 GetClientRect(*this, &rect);\r
303                                 m_bShowFindBar = false;\r
304                                 ::ShowWindow(m_FindBar, SW_HIDE);\r
305                                 ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
306                                         rect.left, rect.top,\r
307                                         rect.right-rect.left, rect.bottom-rect.top,\r
308                                         SWP_SHOWWINDOW);\r
309                         }\r
310                         else\r
311                                 PostQuitMessage(0);\r
312                 }\r
313                 break;\r
314         default:\r
315                 break;\r
316         };\r
317         return 1;\r
318 }\r
319 \r
320 \r
321 LRESULT CMainWindow::SendEditor(UINT Msg, WPARAM wParam, LPARAM lParam)\r
322 {\r
323         if (m_directFunction)\r
324         {\r
325                 return ((SciFnDirect) m_directFunction)(m_directPointer, Msg, wParam, lParam);\r
326         }\r
327         return ::SendMessage(m_hWndEdit, Msg, wParam, lParam);  \r
328 }\r
329 \r
330 bool CMainWindow::Initialize()\r
331 {\r
332         CRegStdDWORD pos(_T("Software\\TortoiseGit\\UDiffViewerPos"), 0);\r
333         CRegStdDWORD width(_T("Software\\TortoiseGit\\UDiffViewerWidth"), (DWORD)640);\r
334         CRegStdDWORD height(_T("Software\\TortoiseGit\\UDiffViewerHeight"), (DWORD)480);\r
335         if (DWORD(pos) && DWORD(width) && DWORD(height))\r
336         {\r
337                 RECT rc;\r
338                 rc.left = LOWORD(DWORD(pos));\r
339                 rc.top = HIWORD(DWORD(pos));\r
340                 rc.right = rc.left + DWORD(width);\r
341                 rc.bottom = rc.top + DWORD(height);\r
342                 HMONITOR hMon = MonitorFromRect(&rc, MONITOR_DEFAULTTONULL);\r
343                 if (hMon)\r
344                 {\r
345                         // only restore the window position if the monitor is valid\r
346                         MoveWindow(*this, LOWORD(DWORD(pos)), HIWORD(DWORD(pos)),\r
347                                 DWORD(width), DWORD(height), FALSE);\r
348                 }\r
349         }\r
350 \r
351         m_hWndEdit = ::CreateWindow(\r
352                 _T("Scintilla"),\r
353                 _T("Source"),\r
354                 WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN,\r
355                 CW_USEDEFAULT, CW_USEDEFAULT,\r
356                 CW_USEDEFAULT, CW_USEDEFAULT,\r
357                 *this,\r
358                 0,\r
359                 hResource,\r
360                 0);\r
361         if (m_hWndEdit == NULL)\r
362                 return false;\r
363 \r
364         RECT rect;\r
365         GetClientRect(*this, &rect);\r
366         ::SetWindowPos(m_hWndEdit, HWND_TOP, \r
367                 rect.left, rect.top,\r
368                 rect.right-rect.left, rect.bottom-rect.top,\r
369                 SWP_SHOWWINDOW);\r
370 \r
371         m_directFunction = SendMessage(m_hWndEdit, SCI_GETDIRECTFUNCTION, 0, 0);\r
372         m_directPointer = SendMessage(m_hWndEdit, SCI_GETDIRECTPOINTER, 0, 0);\r
373 \r
374         // Set up the global default style. These attributes are used wherever no explicit choices are made.\r
375         SetAStyle(STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT), ::GetSysColor(COLOR_WINDOW),\r
376                 // Reusing TortoiseBlame's setting which already have an user friendly\r
377                 // pane in TortoiseSVN's Settings dialog, while there is no such\r
378                 // pane for TortoiseUDiff.\r
379                 CRegStdDWORD(_T("Software\\TortoiseGit\\BlameFontSize"), 10),\r
380                 WideToMultibyte(CRegStdString(_T("Software\\TortoiseGit\\BlameFontName"), _T("Courier New"))).c_str());\r
381         SendEditor(SCI_SETTABWIDTH, 4);\r
382         SendEditor(SCI_SETREADONLY, TRUE);\r
383         LRESULT pix = SendEditor(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"_99999");\r
384         SendEditor(SCI_SETMARGINWIDTHN, 0, pix);\r
385         SendEditor(SCI_SETMARGINWIDTHN, 1);\r
386         SendEditor(SCI_SETMARGINWIDTHN, 2);\r
387         //Set the default windows colors for edit controls\r
388         SendEditor(SCI_STYLESETFORE, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOWTEXT));\r
389         SendEditor(SCI_STYLESETBACK, STYLE_DEFAULT, ::GetSysColor(COLOR_WINDOW));\r
390         SendEditor(SCI_SETSELFORE, TRUE, ::GetSysColor(COLOR_HIGHLIGHTTEXT));\r
391         SendEditor(SCI_SETSELBACK, TRUE, ::GetSysColor(COLOR_HIGHLIGHT));\r
392         SendEditor(SCI_SETCARETFORE, ::GetSysColor(COLOR_WINDOWTEXT));\r
393 \r
394         return true;\r
395 }\r
396 \r
397 bool CMainWindow::LoadFile(LPCTSTR filename)\r
398 {\r
399         SendEditor(SCI_SETREADONLY, FALSE);\r
400         SendEditor(SCI_CLEARALL);\r
401         SendEditor(EM_EMPTYUNDOBUFFER);\r
402         SendEditor(SCI_SETSAVEPOINT);\r
403         SendEditor(SCI_CANCEL);\r
404         SendEditor(SCI_SETUNDOCOLLECTION, 0);\r
405 \r
406         FILE *fp = NULL;\r
407         _tfopen_s(&fp, filename, _T("rb"));\r
408         if (fp) \r
409         {\r
410                 //SetTitle();\r
411                 char data[4096];\r
412                 size_t lenFile = fread(data, 1, sizeof(data), fp);\r
413                 bool bUTF8 = IsUTF8(data, lenFile);\r
414                 while (lenFile > 0) \r
415                 {\r
416                         SendEditor(SCI_ADDTEXT, lenFile,\r
417                                 reinterpret_cast<LPARAM>(static_cast<char *>(data)));\r
418                         lenFile = fread(data, 1, sizeof(data), fp);\r
419                 }\r
420                 fclose(fp);\r
421                 SendEditor(SCI_SETCODEPAGE, bUTF8 ? SC_CP_UTF8 : GetACP());\r
422         }\r
423         else \r
424         {\r
425                 return false;\r
426         }\r
427 \r
428         SendEditor(SCI_SETUNDOCOLLECTION, 1);\r
429         ::SetFocus(m_hWndEdit);\r
430         SendEditor(EM_EMPTYUNDOBUFFER);\r
431         SendEditor(SCI_SETSAVEPOINT);\r
432         SendEditor(SCI_GOTOPOS, 0);\r
433 \r
434         SendEditor(SCI_CLEARDOCUMENTSTYLE, 0, 0);\r
435         SendEditor(SCI_SETSTYLEBITS, 5, 0);\r
436 \r
437         //SetAStyle(SCE_DIFF_DEFAULT, RGB(0, 0, 0));\r
438         SetAStyle(SCE_DIFF_COMMAND, RGB(0x0A, 0x24, 0x36));\r
439         SetAStyle(SCE_DIFF_POSITION, RGB(0xFF, 0, 0));\r
440         SetAStyle(SCE_DIFF_HEADER, RGB(0x80, 0, 0), RGB(0xFF, 0xFF, 0x80));\r
441         SetAStyle(SCE_DIFF_COMMENT, RGB(0, 0x80, 0));\r
442         SendEditor(SCI_STYLESETBOLD, SCE_DIFF_COMMENT, TRUE);\r
443         SetAStyle(SCE_DIFF_DELETED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0xFF, 0x80, 0x80));\r
444         SetAStyle(SCE_DIFF_ADDED, ::GetSysColor(COLOR_WINDOWTEXT), RGB(0x80, 0xFF, 0x80));\r
445 \r
446         SendEditor(SCI_SETLEXER, SCLEX_DIFF);\r
447         SendEditor(SCI_SETKEYWORDS, 0, (LPARAM)"revision");\r
448         SendEditor(SCI_COLOURISE, 0, -1);\r
449         ::ShowWindow(m_hWndEdit, SW_SHOW);\r
450         return true;\r
451 }\r
452 \r
453 bool CMainWindow::SaveFile(LPCTSTR filename)\r
454 {\r
455         FILE *fp = NULL;\r
456         _tfopen_s(&fp, filename, _T("w+b"));\r
457         if (fp) \r
458         {\r
459                 int len = SendEditor(SCI_GETTEXT, 0, 0);\r
460                 char * data = new char[len+1];\r
461                 SendEditor(SCI_GETTEXT, len, (LPARAM)data);\r
462                 fwrite(data, sizeof(char), len-1, fp);\r
463                 fclose(fp);\r
464         }\r
465         else \r
466         {\r
467                 return false;\r
468         }\r
469 \r
470         SendEditor(SCI_SETSAVEPOINT);\r
471         ::ShowWindow(m_hWndEdit, SW_SHOW);\r
472         return true;\r
473 }\r
474 \r
475 void CMainWindow::SetTitle(LPCTSTR title)\r
476 {\r
477         size_t len = _tcslen(title);\r
478         TCHAR * pBuf = new TCHAR[len+40];\r
479         _stprintf_s(pBuf, len+40, _T("%s - TortoiseUDiff"), title);\r
480         SetWindowTitle(std::wstring(pBuf));\r
481         delete [] pBuf;\r
482 }\r
483 \r
484 void CMainWindow::SetAStyle(int style, COLORREF fore, COLORREF back, int size, const char *face) \r
485 {\r
486         SendEditor(SCI_STYLESETFORE, style, fore);\r
487         SendEditor(SCI_STYLESETBACK, style, back);\r
488         if (size >= 1)\r
489                 SendEditor(SCI_STYLESETSIZE, style, size);\r
490         if (face) \r
491                 SendEditor(SCI_STYLESETFONT, style, reinterpret_cast<LPARAM>(face));\r
492 }\r
493 \r
494 bool CMainWindow::IsUTF8(LPVOID pBuffer, size_t cb)\r
495 {\r
496         if (cb < 2)\r
497                 return true;\r
498         UINT16 * pVal = (UINT16 *)pBuffer;\r
499         UINT8 * pVal2 = (UINT8 *)(pVal+1);\r
500         // scan the whole buffer for a 0x0000 sequence\r
501         // if found, we assume a binary file\r
502         for (size_t i=0; i<(cb-2); i=i+2)\r
503         {\r
504                 if (0x0000 == *pVal++)\r
505                         return false;\r
506         }\r
507         pVal = (UINT16 *)pBuffer;\r
508         if (*pVal == 0xFEFF)\r
509                 return false;\r
510         if (cb < 3)\r
511                 return false;\r
512         if (*pVal == 0xBBEF)\r
513         {\r
514                 if (*pVal2 == 0xBF)\r
515                         return true;\r
516         }\r
517         // check for illegal UTF8 chars\r
518         pVal2 = (UINT8 *)pBuffer;\r
519         for (size_t i=0; i<cb; ++i)\r
520         {\r
521                 if ((*pVal2 == 0xC0)||(*pVal2 == 0xC1)||(*pVal2 >= 0xF5))\r
522                         return false;\r
523                 pVal2++;\r
524         }\r
525         pVal2 = (UINT8 *)pBuffer;\r
526         bool bUTF8 = false;\r
527         for (size_t i=0; i<(cb-3); ++i)\r
528         {\r
529                 if ((*pVal2 & 0xE0)==0xC0)\r
530                 {\r
531                         pVal2++;i++;\r
532                         if ((*pVal2 & 0xC0)!=0x80)\r
533                                 return false;\r
534                         bUTF8 = true;\r
535                 }\r
536                 if ((*pVal2 & 0xF0)==0xE0)\r
537                 {\r
538                         pVal2++;i++;\r
539                         if ((*pVal2 & 0xC0)!=0x80)\r
540                                 return false;\r
541                         pVal2++;i++;\r
542                         if ((*pVal2 & 0xC0)!=0x80)\r
543                                 return false;\r
544                         bUTF8 = true;\r
545                 }\r
546                 if ((*pVal2 & 0xF8)==0xF0)\r
547                 {\r
548                         pVal2++;i++;\r
549                         if ((*pVal2 & 0xC0)!=0x80)\r
550                                 return false;\r
551                         pVal2++;i++;\r
552                         if ((*pVal2 & 0xC0)!=0x80)\r
553                                 return false;\r
554                         pVal2++;i++;\r
555                         if ((*pVal2 & 0xC0)!=0x80)\r
556                                 return false;\r
557                         bUTF8 = true;\r
558                 }\r
559                 pVal2++;\r
560         }\r
561         if (bUTF8)\r
562                 return true;\r
563         return false;\r
564 }\r