OSDN Git Service

Cleanup 'look and feel' settings page.
[tortoisegit/TortoiseGitJp.git] / src / TortoiseShell / ContextMenu.cpp
index ead4a78..7bd9c4a 100644 (file)
@@ -156,7 +156,9 @@ CShellExt::MenuInfo CShellExt::menuInfo[] =
 //     ITEMIS_FOLDER, ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 },\r
 \r
        { ShellMenuBlame,                                               MENUBLAME,                      IDI_BLAME,                              IDS_MENUBLAME,                          IDS_MENUDESCBLAME,\r
-       ITEMIS_INSVN|ITEMIS_ONLYONE, ITEMIS_FOLDER|ITEMIS_ADDED, 0, 0, 0, 0, 0, 0 },\r
+       ITEMIS_NORMAL|ITEMIS_ONLYONE, ITEMIS_FOLDER|ITEMIS_ADDED, 0, 0, 0, 0, 0, 0 },\r
+       // TODO: original code is ITEMIS_INSVN|ITEMIS_ONLYONE, makes sense to only allow blaming of versioned files\r
+       //       why was this changed, is this related to GitStatus?\r
 \r
        { ShellMenuIgnoreSub,                                   MENUIGNORE,                     IDI_IGNORE,                             IDS_MENUIGNORE,                         IDS_MENUDESCIGNORE,\r
        ITEMIS_INVERSIONEDFOLDER, ITEMIS_IGNORED|ITEMIS_INSVN, 0, 0, 0, 0, 0, 0 },\r
@@ -308,12 +310,12 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                                        fetchedstatus = status;\r
                                                                        //if ((stat.status->entry)&&(stat.status->entry->lock_token))\r
                                                                        //      itemStates |= (stat.status->entry->lock_token[0] != 0) ? ITEMIS_LOCKED : 0;\r
-                                                                       //if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
-                                                                       //{\r
-                                                                       //      itemStates |= ITEMIS_FOLDER;\r
-                                                                       //      if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
-                                                                       //              itemStates |= ITEMIS_FOLDERINGit;\r
-                                                                       //}\r
+                                                                       if ( askedpath.IsDirectory() )//if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
+                                                                       {\r
+                                                                               itemStates |= ITEMIS_FOLDER;\r
+                                                                               if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+                                                                                       itemStates |= ITEMIS_FOLDERINSVN;\r
+                                                                       }\r
                                                                        //if ((stat.status->entry)&&(stat.status->entry->present_props))\r
                                                                        //{\r
                                                                        //      if (strstr(stat.status->entry->present_props, "svn:needs-lock"))\r
@@ -335,6 +337,14 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                        {\r
                                                                ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
                                                        }\r
+\r
+                                                       // TODO: should we really assume any sub-directory to be versioned\r
+                                                       //       or only if it contains versioned files\r
+                                                       if ( askedpath.IsDirectory() )\r
+                                                       {\r
+                                                               if (askedpath.HasAdminDir())\r
+                                                                       itemStates |= ITEMIS_INSVN;\r
+                                                       }\r
                                                        if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
                                                                itemStates |= ITEMIS_INSVN;\r
                                                        if (status == git_wc_status_ignored)\r
@@ -401,14 +411,15 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                                                fetchedstatus = status;\r
                                                                                //if ((stat.status->entry)&&(stat.status->entry->lock_token))\r
                                                                                //      itemStates |= (stat.status->entry->lock_token[0] != 0) ? ITEMIS_LOCKED : 0;\r
-                                                                               //if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
-                                                                               //{\r
-                                                                               //      itemStates |= ITEMIS_FOLDER;\r
-                                                                               //      if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
-                                                                               //              itemStates |= ITEMIS_FOLDERINGit;\r
-                                                                               //}\r
-                                                                               //if ((stat.status->entry)&&(stat.status->entry->conflict_wrk))\r
-                                                                               //      itemStates |= ITEMIS_CONFLICTED;\r
+                                                                               if ( strpath.IsDirectory() )//if ((stat.status->entry)&&(stat.status->entry->kind == git_node_dir))\r
+                                                                               {\r
+                                                                                       itemStates |= ITEMIS_FOLDER;\r
+                                                                                       if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+                                                                                               itemStates |= ITEMIS_FOLDERINSVN;\r
+                                                                               }\r
+                                                                               // TODO: do we need to check that it's not a dir? does conflict options makes sense for dir in git?\r
+                                                                               if (status == git_wc_status_conflicted)//if ((stat.status->entry)&&(stat.status->entry->conflict_wrk))\r
+                                                                                       itemStates |= ITEMIS_CONFLICTED;\r
                                                                                //if ((stat.status->entry)&&(stat.status->entry->present_props))\r
                                                                                //{\r
                                                                                //      if (strstr(stat.status->entry->present_props, "svn:needs-lock"))\r
@@ -435,6 +446,14 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                                                        ATLTRACE2(_T("Exception in GitStatus::GetStatus()\n"));\r
                                                                }\r
                                                        }\r
+\r
+                                                       // TODO: should we really assume any sub-directory to be versioned\r
+                                                       //       or only if it contains versioned files\r
+                                                       if ( strpath.IsDirectory() )\r
+                                                       {\r
+                                                               if (strpath.HasAdminDir())\r
+                                                                       itemStates |= ITEMIS_INSVN;\r
+                                                       }\r
                                                        if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
                                                                itemStates |= ITEMIS_INSVN;\r
                                                        if (status == git_wc_status_ignored)\r
@@ -468,13 +487,13 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                        }\r
                                } // for (int i = 0; i < count; ++i)\r
                                ItemIDList child (GetPIDLItem (cida, 0), &parent);\r
-//                             if (g_ShellCache.HasGitAdminDir(child.toString().c_str(), FALSE))\r
-//                                     itemStates |= ITEMIS_INVERSIONEDFOLDER;\r
+                               if (g_ShellCache.HasSVNAdminDir(child.toString().c_str(), FALSE))\r
+                                       itemStates |= ITEMIS_INVERSIONEDFOLDER;\r
                                GlobalUnlock(medium.hGlobal);\r
 \r
                                // if the item is a versioned folder, check if there's a patch file\r
                                // in the clipboard to be used in "Apply Patch"\r
-                               UINT cFormatDiff = RegisterClipboardFormat(_T("Tgit_UNIFIEDDIFF"));\r
+                               UINT cFormatDiff = RegisterClipboardFormat(_T("TGIT_UNIFIEDDIFF"));\r
                                if (cFormatDiff)\r
                                {\r
                                        if (IsClipboardFormatAvailable(cFormatDiff)) \r
@@ -503,10 +522,13 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                git_wc_status_kind status = git_wc_status_none;\r
                if (IsClipboardFormatAvailable(CF_HDROP)) \r
                        itemStatesFolder |= ITEMIS_PATHINCLIPBOARD;\r
+               \r
+               CTGitPath askedpath;\r
+               askedpath.SetFromWin(folder_.c_str());\r
+\r
                if ((folder_.compare(statuspath)!=0)&&(g_ShellCache.IsContextPathAllowed(folder_.c_str())))\r
                {\r
-                       CTGitPath askedpath;\r
-                       askedpath.SetFromWin(folder_.c_str());\r
+                       \r
                        try\r
                        {\r
                                GitStatus stat;\r
@@ -523,16 +545,7 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
 //                                     }\r
 //                                     if ((stat.status->entry)&&(stat.status->entry->uuid))\r
 //                                             uuidTarget = CUnicodeUtils::StdGetUnicode(stat.status->entry->uuid);\r
-                                       if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
-                                               itemStatesFolder |= ITEMIS_INSVN;\r
-                                       if (status == git_wc_status_normal)\r
-                                               itemStatesFolder |= ITEMIS_NORMAL;\r
-                                       if (status == git_wc_status_conflicted)\r
-                                               itemStatesFolder |= ITEMIS_CONFLICTED;\r
-                                       if (status == git_wc_status_added)\r
-                                               itemStatesFolder |= ITEMIS_ADDED;\r
-                                       if (status == git_wc_status_deleted)\r
-                                               itemStatesFolder |= ITEMIS_DELETED;\r
+                               \r
                                }\r
                                else\r
                                {\r
@@ -542,6 +555,19 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                        if (askedpath.HasAdminDir())\r
                                                status = git_wc_status_normal;\r
                                }\r
+                               \r
+                               //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+                               if (askedpath.HasAdminDir())\r
+                                       itemStatesFolder |= ITEMIS_INSVN;\r
+                               if (status == git_wc_status_normal)\r
+                                       itemStatesFolder |= ITEMIS_NORMAL;\r
+                               if (status == git_wc_status_conflicted)\r
+                                       itemStatesFolder |= ITEMIS_CONFLICTED;\r
+                               if (status == git_wc_status_added)\r
+                                       itemStatesFolder |= ITEMIS_ADDED;\r
+                               if (status == git_wc_status_deleted)\r
+                                       itemStatesFolder |= ITEMIS_DELETED;\r
+\r
                        }\r
                        catch ( ... )\r
                        {\r
@@ -552,7 +578,8 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                {\r
                        status = fetchedstatus;\r
                }\r
-               if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+               //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+               if (askedpath.HasAdminDir())\r
                {\r
                        itemStatesFolder |= ITEMIS_FOLDERINSVN;\r
                }\r
@@ -577,10 +604,11 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                        {\r
                                folder_ = files_.front();\r
                                git_wc_status_kind status = git_wc_status_none;\r
+                               CTGitPath askedpath;\r
+                               askedpath.SetFromWin(folder_.c_str());\r
+\r
                                if (folder_.compare(statuspath)!=0)\r
-                               {\r
-                                       CTGitPath askedpath;\r
-                                       askedpath.SetFromWin(folder_.c_str());\r
+                               {                               \r
                                        try\r
                                        {\r
                                                GitStatus stat;\r
@@ -608,7 +636,8 @@ STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder,
                                {\r
                                        status = fetchedstatus;\r
                                }\r
-                               if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+                               //if ((status != git_wc_status_unversioned)&&(status != git_wc_status_ignored)&&(status != git_wc_status_none))\r
+                               if (askedpath.HasAdminDir())\r
                                        itemStates |= ITEMIS_FOLDERINSVN;\r
                                if (status == git_wc_status_ignored)\r
                                        itemStates |= ITEMIS_IGNORED;\r
@@ -775,7 +804,7 @@ bool CShellExt::WriteClipboardPathsToTempFile(stdstring& tempfile)
        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
+       GetTempFileName (path, _T("git"), 0, tempFile);\r
        tempfile = stdstring(tempFile);\r
 \r
        HANDLE file = ::CreateFile (tempFile,\r
@@ -829,7 +858,7 @@ stdstring CShellExt::WriteFileListToTempFile()
        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
+       GetTempFileName (path, _T("git"), 0, tempFile);\r
        stdstring retFilePath = stdstring(tempFile);\r
        \r
        HANDLE file = ::CreateFile (tempFile,\r
@@ -1051,10 +1080,12 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
        int menuIndex = 0;\r
        bool bAddSeparator = false;\r
        bool bMenuEntryAdded = false;\r
+       bool bMenuEmpty = true;\r
        // insert separator at start\r
        InsertMenu(hMenu, indexMenu++, MF_SEPARATOR|MF_BYPOSITION, 0, NULL); idCmd++;\r
        bool bShowIcons = !!DWORD(CRegStdWORD(_T("Software\\TortoiseGit\\ShowContextMenuIcons"), TRUE));\r
-       if (fullver <= 0x0500)\r
+       // ?? TortoiseSVN had this as (fullver <= 0x0500) this disabled icons in win2k, but icons work fine in win2k\r
+       if (fullver < 0x0500)\r
                bShowIcons = false;\r
        while (menuInfo[menuIndex].command != ShellMenuLastEntry)\r
        {\r
@@ -1064,7 +1095,8 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
                        // another 'normal' menu entry after we insert a separator.\r
                        // we simply set a flag here, indicating that before the next\r
                        // 'normal' menu entry, a separator should be added.\r
-                       bAddSeparator = true;\r
+                       if (!bMenuEmpty)\r
+                               bAddSeparator = true;\r
                }\r
                else\r
                {\r
@@ -1137,16 +1169,12 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
                                        {\r
                                                InsertIgnoreSubmenus(idCmd, idCmdFirst, hMenu, subMenu, indexMenu, indexSubMenu, topmenu, bShowIcons);\r
                                                bMenuEntryAdded = true;\r
+                                               bMenuEmpty = false;\r
                                        }\r
                                        else\r
                                        {\r
-                                               // the 'get lock' command is special\r
                                                bool bIsTop = ((topmenu & menuInfo[menuIndex].menuID) != 0);\r
-                                               if (menuInfo[menuIndex].command == ShellMenuLock)\r
-                                               {\r
-                                                       if ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop())\r
-                                                               bIsTop = true;\r
-                                               }\r
+\r
                                                // insert the menu entry\r
                                                InsertGitMenu(  bIsTop,\r
                                                                                bIsTop ? hMenu : subMenu,\r
@@ -1158,7 +1186,10 @@ STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu,
                                                                                menuInfo[menuIndex].command,\r
                                                                                uFlags);\r
                                                if (!bIsTop)\r
+                                               {\r
                                                        bMenuEntryAdded = true;\r
+                                                       bMenuEmpty = false;\r
+                                               }\r
                                        }\r
                                }\r
                        }\r
@@ -1631,7 +1662,7 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                {\r
                                        // if there's a patch file in the clipboard, we save it\r
                                        // to a temporary file and tell TortoiseMerge to use that one\r
-                                       UINT cFormat = RegisterClipboardFormat(_T("Tgit_UNIFIEDDIFF"));\r
+                                       UINT cFormat = RegisterClipboardFormat(_T("TGIT_UNIFIEDDIFF"));\r
                                        if ((cFormat)&&(OpenClipboard(NULL)))\r
                                        { \r
                                                HGLOBAL hglb = GetClipboardData(cFormat); \r
@@ -1641,7 +1672,7 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                                TCHAR * path = new TCHAR[len+1];\r
                                                TCHAR * tempF = new TCHAR[len+100];\r
                                                GetTempPath (len+1, path);\r
-                                               GetTempFileName (path, TEXT("svn"), 0, tempF);\r
+                                               GetTempFileName (path, TEXT("git"), 0, tempF);\r
                                                std::wstring sTempFile = std::wstring(tempF);\r
                                                delete [] path;\r
                                                delete [] tempF;\r
@@ -1723,28 +1754,6 @@ STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi)
                                        svnCmd += folder_;\r
                                svnCmd += _T("\"");\r
                                break;\r
-                       case ShellMenuLock:\r
-                               tempfile = WriteFileListToTempFile();\r
-                               svnCmd += _T("lock /pathfile:\"");\r
-                               svnCmd += tempfile;\r
-                               svnCmd += _T("\"");\r
-                               svnCmd += _T(" /deletepathfile");\r
-                               break;\r
-                       case ShellMenuUnlock:\r
-                               tempfile = WriteFileListToTempFile();\r
-                               svnCmd += _T("unlock /pathfile:\"");\r
-                               svnCmd += tempfile;\r
-                               svnCmd += _T("\"");\r
-                               svnCmd += _T(" /deletepathfile");\r
-                               break;\r
-                       case ShellMenuUnlockForce:\r
-                               tempfile = WriteFileListToTempFile();\r
-                               svnCmd += _T("unlock /pathfile:\"");\r
-                               svnCmd += tempfile;\r
-                               svnCmd += _T("\"");\r
-                               svnCmd += _T(" /deletepathfile");\r
-                               svnCmd += _T(" /force");\r
-                               break;\r
                        case ShellMenuProperties:\r
                                tempfile = WriteFileListToTempFile();\r
                                svnCmd += _T("properties /pathfile:\"");\r
@@ -2113,18 +2122,6 @@ LPCTSTR CShellExt::GetMenuTextFromResource(int id)
                        resource = MAKEINTRESOURCE(menuInfo[menuIndex].iconID);\r
                        switch (id)\r
                        {\r
-                       case ShellMenuLock:\r
-                               // menu lock is special because it can be set to the top\r
-                               // with a separate option in the registry\r
-                               space = ((layout & MENULOCK) || ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop())) ? 0 : 6;\r
-                               if ((layout & MENULOCK) || ((itemStates & ITEMIS_NEEDSLOCK) && g_ShellCache.IsGetLockTop()))\r
-                               {\r
-                                       _tcscpy_s(textbuf, 255, _T("Git "));\r
-                                       _tcscat_s(textbuf, 255, stringtablebuffer);\r
-                                       _tcscpy_s(stringtablebuffer, 255, textbuf);\r
-                               }\r
-                               break;\r
-                               // the sub menu entries are special because they're *always* on the top level menu\r
                        case ShellSubMenuMultiple:\r
                        case ShellSubMenuLink:\r
                        case ShellSubMenuFolder:\r