OSDN Git Service

Change Dir Structure to be same as TortoiseSVN'
[tortoisegit/TortoiseGitJp.git] / src / TortoiseShell / SVNPropertyPage.cpp
diff --git a/src/TortoiseShell/SVNPropertyPage.cpp b/src/TortoiseShell/SVNPropertyPage.cpp
new file mode 100644 (file)
index 0000000..cc87844
--- /dev/null
@@ -0,0 +1,367 @@
+// TortoiseGit - a Windows shell extension for easy version control\r
+\r
+// Copyright (C) 2003-2008 - TortoiseGit\r
+\r
+// This program is free software; you can redistribute it and/or\r
+// modify it under the terms of the GNU General Public License\r
+// as published by the Free Software Foundation; either version 2\r
+// of the License, or (at your option) any later version.\r
+\r
+// This program is distributed in the hope that it will be useful,\r
+// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+// GNU General Public License for more details.\r
+\r
+// You should have received a copy of the GNU General Public License\r
+// along with this program; if not, write to the Free Software Foundation,\r
+// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\r
+//\r
+#include "stdafx.h"\r
+\r
+#include "ShellExt.h"\r
+#include "svnpropertypage.h"\r
+#include "UnicodeUtils.h"\r
+#include "PathUtils.h"\r
+#include "GitStatus.h"\r
+\r
+#define MAX_STRING_LENGTH              4096                    //should be big enough\r
+\r
+// Nonmember function prototypes\r
+BOOL CALLBACK PageProc (HWND, UINT, WPARAM, LPARAM);\r
+UINT CALLBACK PropPageCallbackProc ( HWND hwnd, UINT uMsg, LPPROPSHEETPAGE ppsp );\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Dialog procedures and other callback functions\r
+\r
+BOOL CALLBACK PageProc (HWND hwnd, UINT uMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+    CGitPropertyPage * sheetpage;\r
+\r
+    if (uMessage == WM_INITDIALOG)\r
+    {\r
+        sheetpage = (CGitPropertyPage*) ((LPPROPSHEETPAGE) lParam)->lParam;\r
+        SetWindowLongPtr (hwnd, GWLP_USERDATA, (LONG_PTR) sheetpage);\r
+        sheetpage->SetHwnd(hwnd);\r
+    }\r
+    else\r
+    {\r
+        sheetpage = (CGitPropertyPage*) GetWindowLongPtr (hwnd, GWLP_USERDATA);\r
+    }\r
+\r
+    if (sheetpage != 0L)\r
+        return sheetpage->PageProc(hwnd, uMessage, wParam, lParam);\r
+    else\r
+        return FALSE;\r
+}\r
+\r
+UINT CALLBACK PropPageCallbackProc ( HWND /*hwnd*/, UINT uMsg, LPPROPSHEETPAGE ppsp )\r
+{\r
+    // Delete the page before closing.\r
+    if (PSPCB_RELEASE == uMsg)\r
+    {\r
+        CGitPropertyPage* sheetpage = (CGitPropertyPage*) ppsp->lParam;\r
+        if (sheetpage != NULL)\r
+            delete sheetpage;\r
+    }\r
+    return 1;\r
+}\r
+\r
+// *********************** CGitPropertyPage *************************\r
+\r
+CGitPropertyPage::CGitPropertyPage(const std::vector<stdstring> &newFilenames)\r
+       :filenames(newFilenames)\r
+{\r
+}\r
+\r
+CGitPropertyPage::~CGitPropertyPage(void)\r
+{\r
+}\r
+\r
+void CGitPropertyPage::SetHwnd(HWND newHwnd)\r
+{\r
+    m_hwnd = newHwnd;\r
+}\r
+\r
+BOOL CGitPropertyPage::PageProc (HWND /*hwnd*/, UINT uMessage, WPARAM wParam, LPARAM lParam)\r
+{\r
+       switch (uMessage)\r
+       {\r
+       case WM_INITDIALOG:\r
+               {\r
+                       InitWorkfileView();\r
+                       return TRUE;\r
+               }\r
+       case WM_NOTIFY:\r
+               {\r
+                       LPNMHDR point = (LPNMHDR)lParam;\r
+                       int code = point->code;\r
+                       //\r
+                       // Respond to notifications.\r
+                       //    \r
+                       if (code == PSN_APPLY)\r
+                       {\r
+                       }\r
+                       SetWindowLongPtr (m_hwnd, DWLP_MSGRESULT, FALSE);\r
+                       return TRUE;        \r
+\r
+                       }\r
+               case WM_DESTROY:\r
+                       return TRUE;\r
+\r
+               case WM_COMMAND:\r
+                       switch (HIWORD(wParam))\r
+                       {\r
+                               case BN_CLICKED:\r
+                                       if (LOWORD(wParam) == IDC_SHOWLOG)\r
+                                       {\r
+                                               STARTUPINFO startup;\r
+                                               PROCESS_INFORMATION process;\r
+                                               memset(&startup, 0, sizeof(startup));\r
+                                               startup.cb = sizeof(startup);\r
+                                               memset(&process, 0, sizeof(process));\r
+                                               CRegStdString tortoiseProcPath(_T("Software\\TortoiseGit\\ProcPath"), _T("TortoiseProc.exe"), false, HKEY_LOCAL_MACHINE);\r
+                                               stdstring svnCmd = _T(" /command:");\r
+                                               svnCmd += _T("log /path:\"");\r
+                                               svnCmd += filenames.front().c_str();\r
+                                               svnCmd += _T("\"");\r
+                                               if (CreateProcess(((stdstring)tortoiseProcPath).c_str(), const_cast<TCHAR*>(svnCmd.c_str()), NULL, NULL, FALSE, 0, 0, 0, &startup, &process))\r
+                                               {\r
+                                                       CloseHandle(process.hThread);\r
+                                                       CloseHandle(process.hProcess);\r
+                                               }\r
+                                       }\r
+                                       if (LOWORD(wParam) == IDC_EDITPROPERTIES)\r
+                                       {\r
+                                               DWORD pathlength = GetTempPath(0, NULL);\r
+                                               TCHAR * path = new TCHAR[pathlength+1];\r
+                                               TCHAR * tempFile = new TCHAR[pathlength + 100];\r
+                                               GetTempPath (pathlength+1, path);\r
+                                               GetTempFileName (path, _T("svn"), 0, tempFile);\r
+                                               stdstring retFilePath = stdstring(tempFile);\r
+\r
+                                               HANDLE file = ::CreateFile (tempFile,\r
+                                                       GENERIC_WRITE, \r
+                                                       FILE_SHARE_READ, \r
+                                                       0, \r
+                                                       CREATE_ALWAYS, \r
+                                                       FILE_ATTRIBUTE_TEMPORARY,\r
+                                                       0);\r
+\r
+                                               delete [] path;\r
+                                               delete [] tempFile;\r
+                                               if (file != INVALID_HANDLE_VALUE)\r
+                                               {\r
+                                                       DWORD written = 0;\r
+                                                       for (std::vector<stdstring>::iterator I = filenames.begin(); I != filenames.end(); ++I)\r
+                                                       {\r
+                                                               ::WriteFile (file, I->c_str(), I->size()*sizeof(TCHAR), &written, 0);\r
+                                                               ::WriteFile (file, _T("\n"), 2, &written, 0);\r
+                                                       }\r
+                                                       ::CloseHandle(file);\r
+\r
+                                                       STARTUPINFO startup;\r
+                                                       PROCESS_INFORMATION process;\r
+                                                       memset(&startup, 0, sizeof(startup));\r
+                                                       startup.cb = sizeof(startup);\r
+                                                       memset(&process, 0, sizeof(process));\r
+                                                       CRegStdString tortoiseProcPath(_T("Software\\TortoiseGit\\ProcPath"), _T("TortoiseProc.exe"), false, HKEY_LOCAL_MACHINE);\r
+                                                       stdstring svnCmd = _T(" /command:");\r
+                                                       svnCmd += _T("properties /pathfile:\"");\r
+                                                       svnCmd += retFilePath.c_str();\r
+                                                       svnCmd += _T("\"");\r
+                                                       svnCmd += _T(" /deletepathfile");\r
+                                                       if (CreateProcess(((stdstring)tortoiseProcPath).c_str(), const_cast<TCHAR*>(svnCmd.c_str()), NULL, NULL, FALSE, 0, 0, 0, &startup, &process))\r
+                                                       {\r
+                                                               CloseHandle(process.hThread);\r
+                                                               CloseHandle(process.hProcess);\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       break;\r
+                       } // switch (HIWORD(wParam)) \r
+       } // switch (uMessage) \r
+       return FALSE;\r
+}\r
+void CGitPropertyPage::Time64ToTimeString(__time64_t time, TCHAR * buf, size_t buflen)\r
+{\r
+       struct tm newtime;\r
+       SYSTEMTIME systime;\r
+       TCHAR timebuf[MAX_STRING_LENGTH];\r
+       TCHAR datebuf[MAX_STRING_LENGTH];\r
+\r
+       LCID locale = (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT));\r
+       locale = MAKELCID(locale, SORT_DEFAULT);\r
+\r
+       *buf = '\0';\r
+       if (time)\r
+       {\r
+               _localtime64_s(&newtime, &time);\r
+\r
+               systime.wDay = (WORD)newtime.tm_mday;\r
+               systime.wDayOfWeek = (WORD)newtime.tm_wday;\r
+               systime.wHour = (WORD)newtime.tm_hour;\r
+               systime.wMilliseconds = 0;\r
+               systime.wMinute = (WORD)newtime.tm_min;\r
+               systime.wMonth = (WORD)newtime.tm_mon+1;\r
+               systime.wSecond = (WORD)newtime.tm_sec;\r
+               systime.wYear = (WORD)newtime.tm_year+1900;\r
+               if (CRegStdWORD(_T("Software\\TortoiseGit\\LogDateFormat")) == 1)\r
+                       GetDateFormat(locale, DATE_SHORTDATE, &systime, NULL, datebuf, MAX_STRING_LENGTH);\r
+               else\r
+                       GetDateFormat(locale, DATE_LONGDATE, &systime, NULL, datebuf, MAX_STRING_LENGTH);\r
+               GetTimeFormat(locale, 0, &systime, NULL, timebuf, MAX_STRING_LENGTH);\r
+               *buf = '\0';\r
+               _tcsncat_s(buf, buflen, timebuf, MAX_STRING_LENGTH-1);\r
+               _tcsncat_s(buf, buflen, _T(", "), MAX_STRING_LENGTH-1);\r
+               _tcsncat_s(buf, buflen, datebuf, MAX_STRING_LENGTH-1);\r
+       }\r
+}\r
+\r
+void CGitPropertyPage::InitWorkfileView()\r
+{\r
+       GitStatus svn = GitStatus();\r
+       TCHAR tbuf[MAX_STRING_LENGTH];\r
+       if (filenames.size() == 1)\r
+       {\r
+               if (svn.GetStatus(CTGitPath(filenames.front().c_str()))>(-2))\r
+               {\r
+                       TCHAR buf[MAX_STRING_LENGTH];\r
+                       __time64_t      time;\r
+                       if (svn.status->entry != NULL)\r
+                       {\r
+                               LoadLangDll();\r
+                               if (svn.status->text_status == svn_wc_status_added)\r
+                               {\r
+                                       // disable the "show log" button for added files\r
+                                       HWND showloghwnd = GetDlgItem(m_hwnd, IDC_SHOWLOG);\r
+                                       if (GetFocus() == showloghwnd)\r
+                                               ::SendMessage(m_hwnd, WM_NEXTDLGCTL, 0, FALSE);\r
+                                       ::EnableWindow(showloghwnd, FALSE);\r
+                               }\r
+                               else\r
+                               {\r
+                                       _stprintf_s(buf, MAX_STRING_LENGTH, _T("%d"), svn.status->entry->revision);\r
+                                       SetDlgItemText(m_hwnd, IDC_REVISION, buf);\r
+                               }\r
+                               if (svn.status->entry->url)\r
+                               {\r
+                                       size_t len = strlen(svn.status->entry->url);\r
+                                       char * unescapedurl = new char[len+1];\r
+                                       strcpy_s(unescapedurl, len+1, svn.status->entry->url);\r
+                                       CPathUtils::Unescape(unescapedurl);\r
+                                       SetDlgItemText(m_hwnd, IDC_REPOURL, UTF8ToWide(unescapedurl).c_str());\r
+                                       if (strcmp(unescapedurl, svn.status->entry->url))\r
+                                       {\r
+                                               ShowWindow(GetDlgItem(m_hwnd, IDC_ESCAPEDURLLABEL), SW_SHOW);\r
+                                               ShowWindow(GetDlgItem(m_hwnd, IDC_REPOURLUNESCAPED), SW_SHOW);\r
+                                               SetDlgItemText(m_hwnd, IDC_REPOURLUNESCAPED, UTF8ToWide(svn.status->entry->url).c_str());\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               ShowWindow(GetDlgItem(m_hwnd, IDC_ESCAPEDURLLABEL), SW_HIDE);\r
+                                               ShowWindow(GetDlgItem(m_hwnd, IDC_REPOURLUNESCAPED), SW_HIDE);\r
+                                       }\r
+                                       delete [] unescapedurl;\r
+                               }\r
+                               else\r
+                               {\r
+                                       ShowWindow(GetDlgItem(m_hwnd, IDC_ESCAPEDURLLABEL), SW_HIDE);\r
+                                       ShowWindow(GetDlgItem(m_hwnd, IDC_REPOURLUNESCAPED), SW_HIDE);\r
+                               }\r
+                               if (svn.status->text_status != svn_wc_status_added)\r
+                               {\r
+                                       _stprintf_s(buf, MAX_STRING_LENGTH, _T("%d"), svn.status->entry->cmt_rev);\r
+                                       SetDlgItemText(m_hwnd, IDC_CREVISION, buf);\r
+                                       time = (__time64_t)svn.status->entry->cmt_date/1000000L;\r
+                                       Time64ToTimeString(time, buf, MAX_STRING_LENGTH);\r
+                                       SetDlgItemText(m_hwnd, IDC_CDATE, buf);\r
+                               }\r
+                               if (svn.status->entry->cmt_author)\r
+                                       SetDlgItemText(m_hwnd, IDC_AUTHOR, UTF8ToWide(svn.status->entry->cmt_author).c_str());\r
+                               GitStatus::GetStatusString(g_hResInst, svn.status->text_status, buf, sizeof(buf)/sizeof(TCHAR), (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)));\r
+                               SetDlgItemText(m_hwnd, IDC_TEXTSTATUS, buf);\r
+                               GitStatus::GetStatusString(g_hResInst, svn.status->prop_status, buf, sizeof(buf)/sizeof(TCHAR), (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)));\r
+                               SetDlgItemText(m_hwnd, IDC_PROPSTATUS, buf);\r
+                               time = (__time64_t)svn.status->entry->text_time/1000000L;\r
+                               Time64ToTimeString(time, buf, MAX_STRING_LENGTH);\r
+                               SetDlgItemText(m_hwnd, IDC_TEXTDATE, buf);\r
+                               time = (__time64_t)svn.status->entry->prop_time/1000000L;\r
+                               Time64ToTimeString(time, buf, MAX_STRING_LENGTH);\r
+                               SetDlgItemText(m_hwnd, IDC_PROPDATE, buf);\r
+\r
+                               if (svn.status->entry->lock_owner)\r
+                                       SetDlgItemText(m_hwnd, IDC_LOCKOWNER, UTF8ToWide(svn.status->entry->lock_owner).c_str());\r
+                               time = (__time64_t)svn.status->entry->lock_creation_date/1000000L;\r
+                               Time64ToTimeString(time, buf, MAX_STRING_LENGTH);\r
+                               SetDlgItemText(m_hwnd, IDC_LOCKDATE, buf);\r
+       \r
+                               if (svn.status->entry->uuid)\r
+                                       SetDlgItemText(m_hwnd, IDC_REPOUUID, UTF8ToWide(svn.status->entry->uuid).c_str());\r
+                               if (svn.status->entry->changelist)\r
+                                       SetDlgItemText(m_hwnd, IDC_CHANGELIST, UTF8ToWide(svn.status->entry->changelist).c_str());\r
+                               GitStatus::GetDepthString(g_hResInst, svn.status->entry->depth, buf, sizeof(buf)/sizeof(TCHAR), (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)));\r
+                               SetDlgItemText(m_hwnd, IDC_DEPTHEDIT, buf);\r
+\r
+                               if (svn.status->entry->checksum)\r
+                                       SetDlgItemText(m_hwnd, IDC_CHECKSUM, UTF8ToWide(svn.status->entry->checksum).c_str());\r
+\r
+                               if (svn.status->locked)\r
+                                       MAKESTRING(IDS_YES);\r
+                               else\r
+                                       MAKESTRING(IDS_NO);\r
+                               SetDlgItemText(m_hwnd, IDC_LOCKED, stringtablebuffer);\r
+\r
+                               if (svn.status->copied)\r
+                                       MAKESTRING(IDS_YES);\r
+                               else\r
+                                       MAKESTRING(IDS_NO);\r
+                               SetDlgItemText(m_hwnd, IDC_COPIED, stringtablebuffer);\r
+\r
+                               if (svn.status->switched)\r
+                                       MAKESTRING(IDS_YES);\r
+                               else\r
+                                       MAKESTRING(IDS_NO);\r
+                               SetDlgItemText(m_hwnd, IDC_SWITCHED, stringtablebuffer);\r
+                       } // if (svn.status->entry != NULL)\r
+               } // if (svn.GetStatus(CTGitPath(filenames.front().c_str()))>(-2))\r
+       } // if (filenames.size() == 1) \r
+       else if (filenames.size() != 0)\r
+       {\r
+               //deactivate the show log button\r
+               HWND logwnd = GetDlgItem(m_hwnd, IDC_SHOWLOG);\r
+               if (GetFocus() == logwnd)\r
+                       ::SendMessage(m_hwnd, WM_NEXTDLGCTL, 0, FALSE);\r
+               ::EnableWindow(logwnd, FALSE);\r
+               //get the handle of the list view\r
+               if (svn.GetStatus(CTGitPath(filenames.front().c_str()))>(-2))\r
+               {\r
+                       if (svn.status->entry != NULL)\r
+                       {\r
+                               LoadLangDll();\r
+                               if (svn.status->entry->url)\r
+                               {\r
+                                       CPathUtils::Unescape((char*)svn.status->entry->url);\r
+                                       _tcsncpy_s(tbuf, MAX_STRING_LENGTH, UTF8ToWide(svn.status->entry->url).c_str(), 4095);\r
+                                       TCHAR * ptr = _tcsrchr(tbuf, '/');\r
+                                       if (ptr != 0)\r
+                                       {\r
+                                               *ptr = 0;\r
+                                       }\r
+                                       SetDlgItemText(m_hwnd, IDC_REPOURL, tbuf);\r
+                               }\r
+                               SetDlgItemText(m_hwnd, IDC_LOCKED, _T(""));\r
+                               SetDlgItemText(m_hwnd, IDC_COPIED, _T(""));\r
+                               SetDlgItemText(m_hwnd, IDC_SWITCHED, _T(""));\r
+\r
+                               SetDlgItemText(m_hwnd, IDC_DEPTHEDIT, _T(""));\r
+                               SetDlgItemText(m_hwnd, IDC_CHECKSUM, _T(""));\r
+                               SetDlgItemText(m_hwnd, IDC_REPOUUID, _T(""));\r
+\r
+                               ShowWindow(GetDlgItem(m_hwnd, IDC_ESCAPEDURLLABEL), SW_HIDE);\r
+                               ShowWindow(GetDlgItem(m_hwnd, IDC_REPOURLUNESCAPED), SW_HIDE);\r
+                       }\r
+               }\r
+       } \r
+}\r
+\r
+\r