OSDN Git Service

Add Resolve "Their" and Resolve "Mine" at conflict item.
[tortoisegit/TortoiseGitJp.git] / src / Git / GitStatusListCtrl.cpp
index a8e4e56..b28692c 100644 (file)
@@ -63,43 +63,7 @@ const UINT CGitStatusListCtrl::SVNSLNM_ADDFILE
 const UINT CGitStatusListCtrl::SVNSLNM_CHECKCHANGED\r
                                        = ::RegisterWindowMessage(_T("GITSLNM_CHECKCHANGED"));\r
 \r
-#define IDSVNLC_REVERT                  1\r
-#define IDSVNLC_COMPARE                         2\r
-#define IDSVNLC_OPEN                    3\r
-#define IDSVNLC_DELETE                  4\r
-#define IDSVNLC_IGNORE                  5\r
-#define IDSVNLC_GNUDIFF1                6\r
-#define IDSVNLC_UPDATE           7\r
-#define IDSVNLC_LOG              8\r
-#define IDSVNLC_EDITCONFLICT     9\r
-#define IDSVNLC_IGNOREMASK         10\r
-#define IDSVNLC_ADD                        11\r
-#define IDSVNLC_RESOLVECONFLICT 12\r
-#define IDSVNLC_LOCK                   13\r
-#define IDSVNLC_LOCKFORCE              14\r
-#define IDSVNLC_UNLOCK                 15\r
-#define IDSVNLC_UNLOCKFORCE            16\r
-#define IDSVNLC_OPENWITH               17\r
-#define IDSVNLC_EXPLORE                        18\r
-#define IDSVNLC_RESOLVETHEIRS  19\r
-#define IDSVNLC_RESOLVEMINE            20\r
-#define IDSVNLC_REMOVE                 21\r
-#define IDSVNLC_COMMIT                 22\r
-#define IDSVNLC_PROPERTIES             23\r
-#define IDSVNLC_COPY                   24\r
-#define IDSVNLC_COPYEXT                        25\r
-#define IDSVNLC_REPAIRMOVE             26\r
-#define IDSVNLC_REMOVEFROMCS   27\r
-#define IDSVNLC_CREATECS               28\r
-#define IDSVNLC_CREATEIGNORECS 29\r
-#define IDSVNLC_CHECKGROUP             30\r
-#define IDSVNLC_UNCHECKGROUP   31\r
-#define IDSVNLC_ADD_RECURSIVE   32\r
-#define IDSVNLC_COMPAREWC              33\r
-#define IDSVNLC_BLAME                  34\r
-// the IDSVNLC_MOVETOCS *must* be the last index, because it contains a dynamic submenu where \r
-// the submenu items get command ID's sequent to this number\r
-#define IDSVNLC_MOVETOCS               35\r
+\r
 \r
 \r
 BEGIN_MESSAGE_MAP(CGitStatusListCtrl, CListCtrl)\r
@@ -235,7 +199,7 @@ int CGitStatusListCtrl::GetIndex(const CTGitPath& path)
 }\r
 #endif \r
 \r
-void CGitStatusListCtrl::Init(DWORD dwColumns, const CString& sColumnInfoContainer, DWORD dwContextMenus /* = GitSLC_POPALL */, bool bHasCheckboxes /* = true */)\r
+void CGitStatusListCtrl::Init(DWORD dwColumns, const CString& sColumnInfoContainer, unsigned __int64 dwContextMenus /* = GitSLC_POPALL */, bool bHasCheckboxes /* = true */)\r
 {\r
        Locker lock(m_critSec);\r
 \r
@@ -1288,6 +1252,9 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
 \r
 void CGitStatusListCtrl::Show(DWORD dwShow, const CTGitPathList& checkedList, bool bShowFolders /* = true */)\r
 {\r
+       DeleteAllItems();\r
+       for(int i=0;i<checkedList.GetCount();i++)\r
+               this->AddEntry((CTGitPath *)&checkedList[i],0,i);\r
        return ;\r
 #if 0\r
 \r
@@ -1426,7 +1393,7 @@ int CGitStatusListCtrl::GetColumnIndex(int mask)
        int i=0;\r
        for(i=0;i<32;i++)\r
                if(mask&0x1)\r
-                       return i-1;\r
+                       return i;\r
                else\r
                        mask=mask>>1;\r
        return -1;\r
@@ -1444,9 +1411,9 @@ void CGitStatusListCtrl::AddEntry(CTGitPath * GitPath, WORD langID, int listInde
        int nCol = 1;\r
        CString entryname = GitPath->GetGitPathString();\r
        int icon_idx = 0;\r
-//     if (entry->isfolder)\r
-//             icon_idx = m_nIconFolder;\r
-//     else\r
+       if (GitPath->IsDirectory())\r
+               icon_idx = m_nIconFolder;\r
+       else\r
        {\r
                icon_idx = SYS_IMAGE_LIST().GetPathIconIndex(*GitPath);\r
        }\r
@@ -2324,8 +2291,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                }\r
                                if ((m_dwContextMenus & SVNSLC_POPRESOLVE)/*&&(entry->textstatus == git_wc_status_conflicted)*/)\r
                                {\r
-                                       //popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE);\r
-                                       //popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE);\r
+                                       popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE);\r
+                                       popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE);\r
                                }\r
                                if ((m_dwContextMenus & SVNSLC_POPCONFLICT)||(m_dwContextMenus & SVNSLC_POPRESOLVE))\r
                                        popup.AppendMenu(MF_SEPARATOR);\r
@@ -2338,6 +2305,12 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        popup.AppendMenuIcon(IDSVNLC_COMPARE, IDS_LOG_COMPAREWITHBASE, IDI_DIFF);\r
                                        popup.SetDefaultItem(IDSVNLC_COMPARE, FALSE);\r
                                }\r
+\r
+                               if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_COMPAREWC))\r
+                               {\r
+                                       if( (!m_CurrentVersion.IsEmpty()) && m_CurrentVersion != GIT_REV_ZERO)\r
+                                               popup.AppendMenuIcon(IDSVNLC_COMPAREWC, IDS_LOG_POPUP_COMPARE, IDI_DIFF);\r
+                               }\r
                                //Select one items\r
                                if (GetSelectedCount() == 1)\r
                                {\r
@@ -2348,10 +2321,12 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        //      {\r
                                        //              if ((m_dwContextMenus & SVNSLC_POPGNUDIFF)&&(wcStatus != git_wc_status_deleted)&&(wcStatus != git_wc_status_missing))\r
                                        //              {\r
-                                       if(!g_Git.IsInitRepos())\r
+                                       if(!g_Git.IsInitRepos() && (m_dwContextMenus&SVNSLC_POPGNUDIFF))\r
+                                       {\r
                                                popup.AppendMenuIcon(IDSVNLC_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF);\r
 \r
-                                       bEntryAdded = true;\r
+                                               bEntryAdded = true;\r
+                                       }\r
                                        //              }\r
                                        //      }\r
                                        //\r
@@ -2383,6 +2358,21 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                //}\r
                        }\r
                        \r
+                       if( (!this->m_Rev1.IsEmpty()) || (!this->m_Rev1.IsEmpty()) )\r
+                       {\r
+                               if(GetSelectedCount() == 1)\r
+                               {\r
+                                       if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_COMPARETWO))\r
+                                       {       \r
+                                               popup.AppendMenuIcon(IDSVNLC_COMPARETWO, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF);\r
+                                               popup.SetDefaultItem(IDSVNLC_COMPARETWO, FALSE);\r
+                                       }\r
+                                       if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_GNUDIFF2))\r
+                                       {       \r
+                                               popup.AppendMenuIcon(IDSVNLC_GNUDIFF2, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF);\r
+                                       }\r
+                               }\r
+                       }\r
        \r
                        ///Select Multi item\r
                        //if (GetSelectedCount() > 0)\r
@@ -2438,6 +2428,12 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                {\r
                                        popup.AppendMenuIcon(IDSVNLC_REVERT, IDS_MENUREVERT, IDI_REVERT);\r
                                }\r
+\r
+                               if ((m_dwContextMenus & GetContextMenuBit(IDSVNLC_REVERTTOREV)) && ( !this->m_CurrentVersion.IsEmpty() )\r
+                                       && this->m_CurrentVersion != GIT_REV_ZERO)\r
+                               {\r
+                                       popup.AppendMenuIcon(IDSVNLC_REVERTTOREV, IDS_LOG_POPUP_REVERTTOREV, IDI_REVERT);\r
+                               }\r
                        }\r
 \r
                        if ((GetSelectedCount() == 1)&&(!(wcStatus & CTGitPath::LOGACTIONS_UNVER))\r
@@ -2453,17 +2449,26 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                }\r
                        }\r
 //                     if ((wcStatus != git_wc_status_deleted)&&(wcStatus != git_wc_status_missing) && (GetSelectedCount() == 1))\r
-//                     {\r
+                       if ( (GetSelectedCount() == 1) )\r
+                       {\r
+                               if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_SAVEAS) ) \r
+                               {\r
+                                       popup.AppendMenuIcon(IDSVNLC_SAVEAS, IDS_LOG_POPUP_SAVE, IDI_SAVEAS);\r
+                               }\r
+\r
                                if (m_dwContextMenus & SVNSLC_POPOPEN)\r
                                {\r
+                                       popup.AppendMenuIcon(IDSVNLC_VIEWREV, IDS_LOG_POPUP_VIEWREV);\r
                                        popup.AppendMenuIcon(IDSVNLC_OPEN, IDS_REPOBROWSE_OPEN, IDI_OPEN);\r
                                        popup.AppendMenuIcon(IDSVNLC_OPENWITH, IDS_LOG_POPUP_OPENWITH, IDI_OPEN);\r
                                }\r
+                               \r
                                if (m_dwContextMenus & SVNSLC_POPEXPLORE)\r
                                {\r
                                        popup.AppendMenuIcon(IDSVNLC_EXPLORE, IDS_STATUSLIST_CONTEXT_EXPLORE, IDI_EXPLORER);\r
                                }\r
-//                     }\r
+       \r
+                       }\r
                        if (GetSelectedCount() > 0)\r
                        {\r
 //                             if (((wcStatus == git_wc_status_unversioned)||(wcStatus == git_wc_status_ignored))&&(m_dwContextMenus & SVNSLC_POPDELETE))\r
@@ -2490,6 +2495,11 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                                        popup.AppendMenuIcon(IDSVNLC_ADD, IDS_STATUSLIST_CONTEXT_ADD, IDI_ADD);\r
                                                }\r
                                        }\r
+\r
+                                       if (m_dwContextMenus & SVNSLC_POPDELETE)\r
+                                       {\r
+                                               popup.AppendMenuIcon(IDSVNLC_DELETE, IDS_MENUREMOVE, IDI_DELETE);\r
+                                       }\r
                                //}\r
                                //if ( (wcStatus == git_wc_status_unversioned) || (wcStatus == git_wc_status_deleted) )\r
                                //{\r
@@ -2543,10 +2553,10 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        }\r
 \r
 \r
-#if 0                  \r
+               \r
                        if (GetSelectedCount() > 0)\r
                        {\r
-\r
+#if 0  \r
                                if ((!entry->IsFolder())&&(wcStatus >= git_wc_status_normal)\r
                                        &&(wcStatus!=git_wc_status_missing)&&(wcStatus!=git_wc_status_deleted)\r
                                        &&(wcStatus!=git_wc_status_added))\r
@@ -2581,9 +2591,11 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        popup.AppendMenu(MF_SEPARATOR);\r
                                        popup.AppendMenuIcon(IDSVNLC_PROPERTIES, IDS_STATUSLIST_CONTEXT_PROPERTIES, IDI_PROPERTIES);\r
                                }\r
+#endif \r
                                popup.AppendMenu(MF_SEPARATOR);\r
                                popup.AppendMenuIcon(IDSVNLC_COPY, IDS_STATUSLIST_CONTEXT_COPY, IDI_COPYCLIP);\r
                                popup.AppendMenuIcon(IDSVNLC_COPYEXT, IDS_STATUSLIST_CONTEXT_COPYEXT, IDI_COPYCLIP);\r
+#if 0\r
                                if ((m_dwContextMenus & SVNSLC_POPCHANGELISTS)&&(XPorLater)\r
                                        &&(wcStatus != git_wc_status_unversioned)&&(wcStatus != git_wc_status_none))\r
                                {\r
@@ -2629,8 +2641,9 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                                popup.AppendMenu(MF_POPUP|MF_STRING, (UINT_PTR)changelistSubMenu.GetSafeHmenu(), temp);\r
                                        }\r
                                }\r
-                       }\r
 #endif\r
+                       }\r
+\r
                        int cmd = popup.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, point.x, point.y, this, 0);\r
 \r
                        m_bBlock = TRUE;\r
@@ -2639,67 +2652,50 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        bool bForce = false;\r
                        switch (cmd)\r
                        {\r
+                       case IDSVNLC_VIEWREV:\r
+                               OpenFile(filepath,NOTEPAD2);\r
+                               break;\r
                        case IDSVNLC_OPEN:\r
+                               OpenFile(filepath,OPEN);\r
+                               break;\r
+                       case IDSVNLC_OPENWITH:\r
+                               OpenFile(filepath,OPEN_WITH);\r
+                               break;\r
+                       case IDSVNLC_EXPLORE:\r
                                {\r
-                                       CString file;\r
-                                       if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion == GIT_REV_ZERO)\r
-                                       {\r
-                                               file= filepath->GetWinPath();\r
-                                       }else\r
-                                       {\r
-                                               CString temppath;\r
-                                               GetTempPath(temppath);\r
-                                               file.Format(_T("%s%s_%s%s"),\r
-                                                       temppath,                                               \r
-                                                       filepath->GetBaseFilename(),\r
-                                                       m_CurrentVersion.Left(6),\r
-                                                       filepath->GetFileExtension());\r
-\r
-                                       }\r
-                                       int ret = (int)ShellExecute(this->m_hWnd, NULL,file, NULL, NULL, SW_SHOW);\r
-                                       if (ret <= HINSTANCE_ERROR)\r
-                                       {\r
-                                               CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
-                                               cmd += file;\r
-                                               CAppUtils::LaunchApplication(cmd, NULL, false);\r
-                                       }\r
+                                       ShellExecute(this->m_hWnd, _T("explore"), filepath->GetDirectory().GetWinPath(), NULL, NULL, SW_SHOW);\r
                                }\r
                                break;\r
-                       case IDSVNLC_OPENWITH:\r
+\r
+                       // Compare current version and work copy. \r
+                       case IDSVNLC_COMPAREWC:\r
                                {\r
-                                       CString file;\r
-                                       if(m_CurrentVersion.IsEmpty() || m_CurrentVersion == GIT_REV_ZERO)\r
-                                       {\r
-                                               file= filepath->GetWinPath();\r
-                                       }else\r
+                                       POSITION pos = GetFirstSelectedItemPosition();\r
+                                       while ( pos )\r
                                        {\r
-                                               CString temppath;\r
-                                               GetTempPath(temppath);\r
-                                               file.Format(_T("%s%s_%s%s"),\r
-                                                       temppath,                                               \r
-                                                       filepath->GetBaseFilename(),\r
-                                                       m_CurrentVersion.Left(6),\r
-                                                       filepath->GetFileExtension());\r
-\r
+                                               int index = GetNextSelectedItem(pos);\r
+                                               StartDiffWC(index);\r
                                        }\r
-\r
-                                       CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
-                                       cmd += file + _T(" ");\r
-                                       CAppUtils::LaunchApplication(cmd, NULL, false);\r
                                }\r
                                break;\r
-                       case IDSVNLC_EXPLORE:\r
+                       // Compare with base version. when current version is zero, compare workcopy and HEAD. \r
+                       case IDSVNLC_COMPARE:\r
                                {\r
-                                       ShellExecute(this->m_hWnd, _T("explore"), filepath->GetDirectory().GetWinPath(), NULL, NULL, SW_SHOW);\r
+                                       POSITION pos = GetFirstSelectedItemPosition();\r
+                                       while ( pos )\r
+                                       {\r
+                                               int index = GetNextSelectedItem(pos);\r
+                                               StartDiff(index);\r
+                                       }\r
                                }\r
                                break;\r
-                       case IDSVNLC_COMPARE:\r
+                       case IDSVNLC_COMPARETWO:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
                                        while ( pos )\r
                                        {\r
                                                int index = GetNextSelectedItem(pos);\r
-                                               StartDiff(index);\r
+                                               StartDiffTwo(index);\r
                                        }\r
                                }\r
                                break;\r
@@ -2719,21 +2715,43 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                                                                                                        *filepath,m_CurrentVersion+_T("~1"));\r
                                }\r
                                break;\r
+                       case IDSVNLC_GNUDIFF2:\r
+                               {\r
+                               //      SVNDiff diff(NULL, this->m_hWnd, true);\r
+                               //\r
+                               //      if (entry->remotestatus <= git_wc_status_normal)\r
+                               //              CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_BASE, entry->path, SVNRev::REV_WC);\r
+                               //      else\r
+                               //              CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_WC, entry->path, SVNRev::REV_HEAD);\r
+                                       \r
+                                       CAppUtils::StartShowUnifiedDiff(m_hWnd,*filepath,m_Rev1,\r
+                                                                                                                       *filepath,m_Rev2);\r
+                               }\r
+                               break;\r
+                       \r
                        case IDSVNLC_ADD:\r
                                {       // The add went ok, but we now need to run through the selected items again\r
                                        // and update their status\r
+                                       std::vector<int> selectIndex;\r
+\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
                                        int index;\r
                                        while ((index = GetNextSelectedItem(pos)) >= 0)\r
                                        {\r
+                                               selectIndex.push_back(index);\r
+                                       }\r
+                                       for(int i=0;i<selectIndex.size();i++)\r
+                                       {\r
+                                               index=selectIndex[i];\r
+\r
                                                CTGitPath * path=(CTGitPath*)GetItemData(index);\r
                                                ASSERT(path);\r
                                                if(path == NULL)\r
                                                        continue;\r
                                                CString cmd;\r
-                                               cmd.Format(_T("git.exe add %s"),path->GetGitPathString());\r
+                                               cmd.Format(_T("git.exe add \"%s\""),path->GetGitPathString());\r
                                                CString output;\r
-                                               if(!g_Git.Run(cmd,&output,CP_OEMCP))\r
+                                               if(!g_Git.Run(cmd,&output,CP_ACP))\r
                                                {\r
                                                        path->m_Action = CTGitPath::LOGACTIONS_ADDED;\r
                                                        SetEntryCheck(path,index,true);\r
@@ -2748,6 +2766,67 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                }\r
                                break;\r
 \r
+                       case IDSVNLC_DELETE:\r
+                               {\r
+                                       //Collect paths\r
+                                       std::vector<int> selectIndex;\r
+\r
+                                       POSITION pos = GetFirstSelectedItemPosition();\r
+                                       int index;\r
+                                       while ((index = GetNextSelectedItem(pos)) >= 0)\r
+                                       {\r
+                                               selectIndex.push_back(index);\r
+                                       }\r
+\r
+                                       //Create file-list ('\0' separated) for SHFileOperation\r
+                                       CString filelist;\r
+                                       for(int i=0;i<selectIndex.size();i++)\r
+                                       {\r
+                                               index=selectIndex[i];\r
+\r
+                                               CTGitPath * path=(CTGitPath*)GetItemData(index);\r
+                                               ASSERT(path);\r
+                                               if(path == NULL)\r
+                                                       continue;\r
+\r
+                                               filelist += path->GetWinPathString();\r
+                                               filelist += _T("|");\r
+                                       }\r
+                                       filelist += _T("|");\r
+                                       int len = filelist.GetLength();\r
+                                       TCHAR * buf = new TCHAR[len+2];\r
+                                       _tcscpy_s(buf, len+2, filelist);\r
+                                       for (int i=0; i<len; ++i)\r
+                                               if (buf[i] == '|')\r
+                                                       buf[i] = 0;\r
+                                       SHFILEOPSTRUCT fileop;\r
+                                       fileop.hwnd = this->m_hWnd;\r
+                                       fileop.wFunc = FO_DELETE;\r
+                                       fileop.pFrom = buf;\r
+                                       fileop.pTo = NULL;\r
+                                       fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | ((GetAsyncKeyState(VK_SHIFT) & 0x8000) ? 0 : FOF_ALLOWUNDO);\r
+                                       fileop.lpszProgressTitle = _T("deleting file");\r
+                                       int result = SHFileOperation(&fileop);\r
+                                       delete [] buf;\r
+\r
+                                       if ( (result==0) && (!fileop.fAnyOperationsAborted) )\r
+                                       {\r
+                                               SetRedraw(FALSE);\r
+                                               POSITION pos = NULL;\r
+                                               while ((pos = GetFirstSelectedItemPosition()) != 0)\r
+                                               {\r
+                                                       int index = GetNextSelectedItem(pos);\r
+                                                       if (GetCheck(index))\r
+                                                               m_nSelected--;\r
+                                                       m_nTotal--;\r
+\r
+                                                       RemoveListEntry(index);\r
+                                               }\r
+                                               SetRedraw(TRUE);\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
                        case IDSVNLC_BLAME:\r
                                {\r
                                        CString sCmd;\r
@@ -2773,6 +2852,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                CAppUtils::ConflictEdit(*filepath);\r
                                break;\r
                        }\r
+                       case IDSVNLC_RESOLVETHEIRS: //follow up \r
+                       case IDSVNLC_RESOLVEMINE:   //follow up\r
                        case IDSVNLC_RESOLVECONFLICT:\r
                        {\r
                                if (CMessageBox::Show(m_hWnd, IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO)==IDYES)\r
@@ -2785,14 +2866,35 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                                CTGitPath * fentry =(CTGitPath*) this->GetItemData(index);\r
                                                if(fentry == NULL)\r
                                                        continue;\r
+                                               CString gitcmd,output;\r
+                                               output.Empty();\r
+                                               if ( cmd == IDSVNLC_RESOLVETHEIRS)\r
+                                               {\r
+                                                       gitcmd.Format(_T("git.exe cat-file blob \":3:%s\""),fentry->GetGitPathString());\r
+                                                       if(g_Git.RunLogFile(gitcmd,(CString&)fentry->GetWinPathString()))\r
+                                                       {\r
+                                                               CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR);\r
+                                                               continue;\r
+                                                       }\r
+                                               }\r
+                                               output.Empty();\r
+                                               if ( cmd == IDSVNLC_RESOLVEMINE)\r
+                                               {\r
+                                                       gitcmd.Format(_T("git.exe cat-file blob \":2:%s\""),fentry->GetGitPathString());\r
+                                                       if(g_Git.RunLogFile(gitcmd,(CString&)fentry->GetWinPathString()))\r
+                                                       {\r
+                                                               CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR);\r
+                                                               continue;\r
+                                                       }\r
 \r
+                                               }\r
+                                               output.Empty();\r
                                                if ( fentry->m_Action & CTGitPath::LOGACTIONS_UNMERGED)\r
                                                {\r
-                                                       CString cmd,output;\r
-                                                       cmd.Format(_T("git.exe add \"%s\""),fentry->GetGitPathString());\r
-                                                       if(g_Git.Run(cmd,&output,CP_OEMCP))\r
+                                                       gitcmd.Format(_T("git.exe add \"%s\""),fentry->GetGitPathString());\r
+                                                       if(g_Git.Run(gitcmd,&output,CP_ACP))\r
                                                        {\r
-                                                               CMessageBox::Show(m_hWnd, output, _T("TortoiseSVN"), MB_ICONERROR);\r
+                                                               CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR);\r
                                                        }else\r
                                                        {\r
                                                                fentry->m_Action |= CTGitPath::LOGACTIONS_MODIFIED;\r
@@ -3174,7 +3276,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        CString str;\r
                                        str.Format(IDS_PROC_WARNREVERT,GetSelectedCount());\r
 \r
-                                       if (!bConfirm || CMessageBox::Show(this->m_hWnd, str, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION)==IDYES)\r
+                                       if (!bConfirm || CMessageBox::Show(this->m_hWnd, str, _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION)==IDYES)\r
                                        {\r
                                                CTGitPathList targetList;\r
                                                FillListOfSelectedItemPaths(targetList);\r
@@ -3211,7 +3313,19 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                                                        CTGitPath *path=(CTGitPath*)GetItemData(nItem);\r
                                                                        if (path->GetGitPathString()==targetList[i].GetGitPathString())\r
                                                                        {\r
-                                                                               RemoveListEntry(nItem);\r
+                                                                               if(path->m_Action & CTGitPath::LOGACTIONS_ADDED)\r
+                                                                               {\r
+                                                                                       path->m_Action = CTGitPath::LOGACTIONS_UNVER;\r
+                                                                                       SetEntryCheck(path,nItem,false);\r
+                                                                                       SetItemGroup(nItem,1);\r
+                                                                                       this->m_StatusFileList.RemoveItem(*path);\r
+                                                                                       this->m_UnRevFileList.AddPath(*path);\r
+                                                                                       //this->m_IgnoreFileList.RemoveItem(*path);\r
+\r
+                                                                               }else\r
+                                                                               {\r
+                                                                                       RemoveListEntry(nItem);\r
+                                                                               }\r
                                                                                break;\r
                                                                        }\r
                                                                }\r
@@ -3224,13 +3338,22 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-#if 0\r
+\r
                        case IDSVNLC_COPY:\r
                                CopySelectedEntriesToClipboard(0);\r
                                break;\r
                        case IDSVNLC_COPYEXT:\r
                                CopySelectedEntriesToClipboard((DWORD)-1);\r
                                break;\r
+\r
+                       case IDSVNLC_SAVEAS:\r
+                               FileSaveAs(filepath);\r
+                               break;\r
+\r
+                       case IDSVNLC_REVERTTOREV:\r
+                               RevertSelectedItemToVersion();\r
+                               break;\r
+#if 0\r
                        case IDSVNLC_PROPERTIES:\r
                                {\r
                                        CTSVNPathList targetList;\r
@@ -3267,17 +3390,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                }\r
                                break;\r
                \r
-                       case IDSVNLC_COMPARE:\r
-                               {\r
-                                       POSITION pos = GetFirstSelectedItemPosition();\r
-                                       while ( pos )\r
-                                       {\r
-                                               int index = GetNextSelectedItem(pos);\r
-                                               StartDiff(index);\r
-                                       }\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_COMPAREWC:\r
+               case IDSVNLC_COMPAREWC:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
                                        while ( pos )\r
@@ -3338,29 +3451,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-                       case IDSVNLC_OPEN:\r
-                               {\r
-                                       int ret = (int)ShellExecute(this->m_hWnd, NULL, filepath.GetWinPath(), NULL, NULL, SW_SHOW);\r
-                                       if (ret <= HINSTANCE_ERROR)\r
-                                       {\r
-                                               CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
-                                               cmd += filepath.GetWinPathString();\r
-                                               CAppUtils::LaunchApplication(cmd, NULL, false);\r
-                                       }\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_OPENWITH:\r
-                               {\r
-                                       CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
-                                       cmd += filepath.GetWinPathString() + _T(" ");\r
-                                       CAppUtils::LaunchApplication(cmd, NULL, false);\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_EXPLORE:\r
-                               {\r
-                                       ShellExecute(this->m_hWnd, _T("explore"), filepath.GetDirectory().GetWinPath(), NULL, NULL, SW_SHOW);\r
-                               }\r
-                               break;\r
+       \r
                        case IDSVNLC_REMOVE:\r
                                {\r
                                        SVN git;\r
@@ -3501,157 +3592,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-                       case IDSVNLC_IGNOREMASK:\r
-                               {\r
-                                       CString name = _T("*")+filepath.GetFileExtension();\r
-                                       CTSVNPathList ignorelist;\r
-                                       FillListOfSelectedItemPaths(ignorelist, true);\r
-                                       std::set<CTSVNPath> parentlist;\r
-                                       for (int i=0; i<ignorelist.GetCount(); ++i)\r
-                                       {\r
-                                               parentlist.insert(ignorelist[i].GetContainingDirectory());\r
-                                       }\r
-                                       std::set<CTSVNPath>::iterator it;\r
-                                       std::vector<CString> toremove;\r
-                                       SetRedraw(FALSE);\r
-                                       for (it = parentlist.begin(); it != parentlist.end(); ++it)\r
-                                       {\r
-                                               CTSVNPath parentFolder = (*it).GetDirectory();\r
-                                               SVNProperties props(parentFolder, SVNRev::REV_WC, false);\r
-                                               CStringA value;\r
-                                               for (int i=0; i<props.GetCount(); i++)\r
-                                               {\r
-                                                       CString propname(props.GetItemName(i).c_str());\r
-                                                       if (propname.CompareNoCase(_T("git:ignore"))==0)\r
-                                                       {\r
-                                                               stdstring stemp;\r
-                                                               // treat values as normal text even if they're not\r
-                                                               value = (char *)props.GetItemValue(i).c_str();\r
-                                                       }\r
-                                               }\r
-                                               if (value.IsEmpty())\r
-                                                       value = name;\r
-                                               else\r
-                                               {\r
-                                                       value = value.Trim("\n\r");\r
-                                                       value += "\n";\r
-                                                       value += name;\r
-                                                       value.Remove('\r');\r
-                                               }\r
-                                               if (!props.Add(_T("git:ignore"), (LPCSTR)value))\r
-                                               {\r
-                                                       CString temp;\r
-                                                       temp.Format(IDS_ERR_FAILEDIGNOREPROPERTY, (LPCTSTR)name);\r
-                                                       CMessageBox::Show(this->m_hWnd, temp, _T("TortoiseSVN"), MB_ICONERROR);\r
-                                               }\r
-                                               else\r
-                                               {\r
-                                                       CTSVNPath basepath;\r
-                                                       int nListboxEntries = GetItemCount();\r
-                                                       for (int i=0; i<nListboxEntries; ++i)\r
-                                                       {\r
-                                                               FileEntry * entry = GetListEntry(i);\r
-                                                               ASSERT(entry != NULL);\r
-                                                               if (entry == NULL)\r
-                                                                       continue;\r
-                                                               if (basepath.IsEmpty())\r
-                                                                       basepath = entry->basepath;\r
-                                                               // since we ignored files with a mask (e.g. *.exe)\r
-                                                               // we have to find find all files in the same\r
-                                                               // folder (IsAncestorOf() returns TRUE for _all_ children,\r
-                                                               // not just the immediate ones) which match the\r
-                                                               // mask and remove them from the list too.\r
-                                                               if ((entry->status == git_wc_status_unversioned)&&(parentFolder.IsAncestorOf(entry->path)))\r
-                                                               {\r
-                                                                       CString f = entry->path.GetSVNPathString();\r
-                                                                       if (f.Mid(parentFolder.GetSVNPathString().GetLength()).Find('/')<=0)\r
-                                                                       {\r
-                                                                               if (CStringUtils::WildCardMatch(name, f))\r
-                                                                               {\r
-                                                                                       if (GetCheck(i))\r
-                                                                                               m_nSelected--;\r
-                                                                                       m_nTotal--;\r
-                                                                                       toremove.push_back(f);\r
-                                                                               }\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                                       if (!m_bIgnoreRemoveOnly)\r
-                                                       {\r
-                                                               SVNStatus status;\r
-                                                               git_wc_status2_t * s;\r
-                                                               CTSVNPath gitPath;\r
-                                                               s = status.GetFirstFileStatus(parentFolder, gitPath, false, git_depth_empty);\r
-                                                               if (s!=0)\r
-                                                               {\r
-                                                                       // first check if the folder isn't already present in the list\r
-                                                                       bool bFound = false;\r
-                                                                       for (int i=0; i<nListboxEntries; ++i)\r
-                                                                       {\r
-                                                                               FileEntry * entry = GetListEntry(i);\r
-                                                                               if (entry->path.IsEquivalentTo(gitPath))\r
-                                                                               {\r
-                                                                                       bFound = true;\r
-                                                                                       break;\r
-                                                                               }\r
-                                                                       }\r
-                                                                       if (!bFound)\r
-                                                                       {\r
-                                                                               FileEntry * entry = new FileEntry();\r
-                                                                               entry->path = gitPath;\r
-                                                                               entry->basepath = basepath;\r
-                                                                               entry->status = SVNStatus::GetMoreImportant(s->text_status, s->prop_status);\r
-                                                                               entry->textstatus = s->text_status;\r
-                                                                               entry->propstatus = s->prop_status;\r
-                                                                               entry->remotestatus = SVNStatus::GetMoreImportant(s->repos_text_status, s->repos_prop_status);\r
-                                                                               entry->remotetextstatus = s->repos_text_status;\r
-                                                                               entry->remotepropstatus = s->repos_prop_status;\r
-                                                                               entry->inunversionedfolder = false;\r
-                                                                               entry->checked = true;\r
-                                                                               entry->inexternal = false;\r
-                                                                               entry->direct = false;\r
-                                                                               entry->isfolder = true;\r
-                                                                               entry->last_commit_date = 0;\r
-                                                                               entry->last_commit_rev = 0;\r
-                                                                               entry->remoterev = 0;\r
-                                                                               if (s->entry)\r
-                                                                               {\r
-                                                                                       if (s->entry->url)\r
-                                                                                       {\r
-                                                                                               entry->url = CUnicodeUtils::GetUnicode(CPathUtils::PathUnescape(s->entry->url));\r
-                                                                                       }\r
-                                                                               }\r
-                                                                               if (s->entry && s->entry->present_props)\r
-                                                                               {\r
-                                                                                       entry->present_props = s->entry->present_props;\r
-                                                                               }\r
-                                                                               m_arStatusArray.push_back(entry);\r
-                                                                               m_arListArray.push_back(m_arStatusArray.size()-1);\r
-                                                                               AddEntry(entry, langID, GetItemCount());\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       for (std::vector<CString>::iterator it = toremove.begin(); it != toremove.end(); ++it)\r
-                                       {\r
-                                               int nListboxEntries = GetItemCount();\r
-                                               for (int i=0; i<nListboxEntries; ++i)\r
-                                               {\r
-                                                       if (GetListEntry(i)->path.GetSVNPathString().Compare(*it)==0)\r
-                                                       {\r
-                                                               RemoveListEntry(i);\r
-                                                               break;\r
-                                                       }\r
-                                               }\r
-                                       }\r
-                                       SetRedraw(TRUE);\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_EDITCONFLICT:\r
-                               SVNDiff::StartConflictEditor(filepath);\r
-                               break;\r
-                       \r
+\r
+\r
                        case IDSVNLC_ADD:\r
                                {\r
                                        SVN git;\r
@@ -3717,55 +3659,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
-                       case IDSVNLC_LOCK:\r
-                               {\r
-                                       CTSVNPathList itemsToLock;\r
-                                       FillListOfSelectedItemPaths(itemsToLock);\r
-                                       CInputDlg inpDlg;\r
-                                       inpDlg.m_sTitle.LoadString(IDS_MENU_LOCK);\r
-                                       CStringUtils::RemoveAccelerators(inpDlg.m_sTitle);\r
-                                       inpDlg.m_sHintText.LoadString(IDS_LOCK_MESSAGEHINT);\r
-                                       inpDlg.m_sCheckText.LoadString(IDS_LOCK_STEALCHECK);\r
-                                       ProjectProperties props;\r
-                                       props.ReadPropsPathList(itemsToLock);\r
-                                       props.nMinLogSize = 0;          // the lock message is optional, so no minimum!\r
-                                       inpDlg.m_pProjectProperties = &props;\r
-                                       if (inpDlg.DoModal()==IDOK)\r
-                                       {\r
-                                               CSVNProgressDlg progDlg;\r
-                                               progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Lock);\r
-                                               progDlg.SetOptions(inpDlg.m_iCheck ? ProgOptLockForce : ProgOptNone);\r
-                                               progDlg.SetPathList(itemsToLock);\r
-                                               progDlg.SetCommitMessage(inpDlg.m_sInputText);\r
-                                               progDlg.DoModal();\r
-                                               // refresh!\r
-                                               CWnd* pParent = GetParent();\r
-                                               if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
-                                               {\r
-                                                       pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
-                                               }\r
-                                       }\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_UNLOCKFORCE:\r
-                               bForce = true;\r
-                       case IDSVNLC_UNLOCK:\r
-                               {\r
-                                       CTSVNPathList itemsToUnlock;\r
-                                       FillListOfSelectedItemPaths(itemsToUnlock);\r
-                                       CSVNProgressDlg progDlg;\r
-                                       progDlg.SetCommand(CSVNProgressDlg::SVNProgress_Unlock);\r
-                                       progDlg.SetOptions(bForce ? ProgOptLockForce : ProgOptNone);\r
-                                       progDlg.SetPathList(itemsToUnlock);\r
-                                       progDlg.DoModal();\r
-                                       // refresh!\r
-                                       CWnd* pParent = GetParent();\r
-                                       if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
-                                       {\r
-                                               pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
-                                       }\r
-                               }\r
-                               break;\r
+\r
                        case IDSVNLC_REPAIRMOVE:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
@@ -4139,7 +4033,7 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
        *pResult = 0;\r
        if (m_bBlock)\r
                return;\r
-#if 0\r
+\r
        if (pNMLV->iItem < 0)\r
        {\r
                if (!IsGroupViewEnabled())\r
@@ -4166,7 +4060,8 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
                        GetItem(&lv);\r
                        if (lv.iGroupId == group)\r
                        {\r
-                               FileEntry * entry = GetListEntry(i);\r
+                               CTGitPath *entry=(CTGitPath*)GetItemData(i);\r
+\r
                                if (!bFirst)\r
                                {\r
                                        bCheck = !GetCheck(i);\r
@@ -4191,21 +4086,50 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult)
                NotifyCheck();\r
                return;\r
        }\r
-#endif\r
-//     FileEntry * entry = GetListEntry(pNMLV->iItem);\r
-//     if (entry)\r
-       {\r
-//             if (entry->isConflicted)\r
-//             {\r
-//                     gitDiff::StartConflictEditor(entry->GetPath());\r
-//             }\r
-//             else\r
-               {\r
+\r
+       CTGitPath *file=(CTGitPath*)GetItemData(pNMLV->iItem);\r
+\r
+       if( file->m_Action&CTGitPath::LOGACTIONS_UNMERGED )\r
+       {\r
+               CAppUtils::ConflictEdit(*file,false);\r
+\r
+       }else\r
+       {\r
+               if( (!m_Rev1.IsEmpty()) || (!m_Rev1.IsEmpty()))\r
+                       StartDiffTwo(pNMLV->iItem);\r
+               else\r
                        StartDiff(pNMLV->iItem);\r
-               }\r
        }\r
 \r
 }\r
+void CGitStatusListCtrl::StartDiffTwo(int fileindex)\r
+{\r
+       if(fileindex<0)\r
+               return;\r
+\r
+       CTGitPath file1=*(CTGitPath*)GetItemData(fileindex);\r
+\r
+       CGitDiff::Diff(&file1,&file1,\r
+                               m_Rev1,\r
+                                       m_Rev2);\r
+\r
+}\r
+void CGitStatusListCtrl::StartDiffWC(int fileindex)\r
+{\r
+       if(fileindex<0)\r
+               return;\r
+\r
+       CString Ver;\r
+       if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO)\r
+               return;\r
+\r
+       CTGitPath file1=*(CTGitPath*)GetItemData(fileindex);\r
+\r
+       CGitDiff::Diff(&file1,&file1,\r
+                               CString(GIT_REV_ZERO),\r
+                                       m_CurrentVersion);\r
+\r
+}\r
 \r
 void CGitStatusListCtrl::StartDiff(int fileindex)\r
 {\r
@@ -4224,13 +4148,16 @@ void CGitStatusListCtrl::StartDiff(int fileindex)
 \r
        if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO)\r
        {\r
-               if(!g_Git.IsInitRepos())\r
+               if( g_Git.IsInitRepos())\r
+                       CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex),\r
+                               CString(GIT_REV_ZERO));                 \r
+               else if( file1.m_Action&CTGitPath::LOGACTIONS_DELETED )\r
+                       CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex),\r
+                                       GitRev::GetHead(),false);                               \r
+               else\r
                        CGitDiff::Diff(&file1,&file2,\r
                                CString(GIT_REV_ZERO),\r
                                        GitRev::GetHead());\r
-               else\r
-                       CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex),\r
-                               CString(GIT_REV_ZERO));\r
        }else\r
        {\r
                CGitDiff::Diff(&file1,&file2,\r
@@ -5036,7 +4963,7 @@ BOOL CGitStatusListCtrl::PreTranslateMessage(MSG* pMsg)
 \r
 bool CGitStatusListCtrl::CopySelectedEntriesToClipboard(DWORD dwCols)\r
 {\r
-#if 0\r
+\r
        static CString ponly(MAKEINTRESOURCE(IDS_STATUSLIST_PROPONLY));\r
        static HINSTANCE hResourceHandle(AfxGetResourceHandle());\r
        WORD langID = (WORD)CRegStdWORD(_T("Software\\TortoiseGit\\LanguageID"), GetUserDefaultLangID());\r
@@ -5067,18 +4994,23 @@ bool CGitStatusListCtrl::CopySelectedEntriesToClipboard(DWORD dwCols)
        int index;\r
        while ((index = GetNextSelectedItem(pos)) >= 0)\r
        {\r
-               FileEntry * entry = GetListEntry(index);\r
-               sClipboard += entry->GetDisplayName();\r
+               CTGitPath * entry = (CTGitPath*)GetItemData(index);\r
+               if(entry == NULL)\r
+                       continue;\r
+\r
+               sClipboard += entry->GetWinPathString();\r
                if (selection & SVNSLC_COLFILENAME)\r
                {\r
-                       sClipboard += _T("\t")+entry->path.GetFileOrDirectoryName();\r
+                       sClipboard += _T("\t")+entry->GetFileOrDirectoryName();\r
                }\r
                if (selection & SVNSLC_COLEXT)\r
                {\r
-                       sClipboard += _T("\t")+entry->path.GetFileExtension();\r
+                       sClipboard += _T("\t")+entry->GetFileExtension();\r
                }\r
+       \r
                if (selection & SVNSLC_COLSTATUS)\r
                {\r
+#if 0\r
                        if (entry->isNested)\r
                        {\r
                                temp.LoadString(IDS_STATUSLIST_NESTED);\r
@@ -5097,10 +5029,13 @@ bool CGitStatusListCtrl::CopySelectedEntriesToClipboard(DWORD dwCols)
                                        _tcscat_s(buf, 100, ponly);\r
                                temp = buf;\r
                        }\r
-                       sClipboard += _T("\t")+temp;\r
+#endif\r
+                       sClipboard += _T("\t")+entry->GetActionName();\r
                }\r
+#if 0\r
                if (selection & SVNSLC_COLTEXTSTATUS)\r
                {\r
+\r
                        if (entry->isNested)\r
                        {\r
                                temp.LoadString(IDS_STATUSLIST_NESTED);\r
@@ -5116,6 +5051,8 @@ bool CGitStatusListCtrl::CopySelectedEntriesToClipboard(DWORD dwCols)
                        }\r
                        sClipboard += _T("\t")+temp;\r
                }\r
+#endif\r
+#if 0\r
                if (selection & SVNSLC_COLREMOTESTATUS)\r
                {\r
                        if (entry->isNested)\r
@@ -5238,6 +5175,7 @@ bool CGitStatusListCtrl::CopySelectedEntriesToClipboard(DWORD dwCols)
                                temp.Empty();\r
                        sClipboard += _T("\t")+temp;\r
                }\r
+\r
                if (selection & SVNSLC_COLDATE)\r
                {\r
                        TCHAR datebuf[SVN_DATE_BUFFER];\r
@@ -5269,12 +5207,21 @@ bool CGitStatusListCtrl::CopySelectedEntriesToClipboard(DWORD dwCols)
                 sClipboard += _T("\t") + value;\r
             }\r
         }\r
+#endif\r
+               if (selection & SVNSLC_COLADD)\r
+               {\r
+                       sClipboard += _T("\t")+entry->m_StatAdd;\r
+               }\r
+               if (selection & SVNSLC_COLDEL)\r
+               {\r
+                       sClipboard += _T("\t")+entry->m_StatDel;\r
+               }\r
 \r
                sClipboard += _T("\r\n");\r
        }\r
 \r
        return CStringUtils::WriteAsciiStringToClipboard(sClipboard);\r
-#endif\r
+\r
        return TRUE;\r
 \r
 }\r
@@ -5326,7 +5273,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
 \r
                //if(m_UnRevFileList.GetCount()>0)\r
                {\r
-                       _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("No Version Control"), 1023);\r
+                       _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Not Versioned"), 1023);\r
                        grp.pszHeader = groupname;\r
                        grp.iGroupId = groupindex;\r
                        grp.uAlign = LVGA_HEADER_LEFT;\r
@@ -5335,7 +5282,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
 \r
                //if(m_IgnoreFileList.GetCount()>0)\r
                {\r
-                       _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Ignored File"), 1023);\r
+                       _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Ignored"), 1023);\r
                        grp.pszHeader = groupname;\r
                        grp.iGroupId = groupindex;\r
                        grp.uAlign = LVGA_HEADER_LEFT;\r
@@ -5742,3 +5689,124 @@ HRESULT STDMETHODCALLTYPE CSVNStatusListCtrlDropTarget::DragOver(DWORD grfKeySta
 }f\r
 \r
 #endif\r
+\r
+void CGitStatusListCtrl::FileSaveAs(CTGitPath *path)\r
+{\r
+       CString filename;\r
+       filename.Format(_T("%s-%s%s"),path->GetBaseFilename(),this->m_CurrentVersion.Left(6),path->GetFileExtension());\r
+       CFileDialog dlg(FALSE,NULL,\r
+                                       filename,               \r
+                                       OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,\r
+                                       NULL);\r
+       CString currentpath;\r
+       currentpath=g_Git.m_CurrentDir+_T("\\");\r
+       currentpath+=path->GetWinPathString();\r
+\r
+       dlg.m_ofn.lpstrInitialDir=currentpath.GetBuffer();\r
+\r
+       CString cmd,out;                \r
+       if(dlg.DoModal()==IDOK)\r
+       {\r
+               filename = dlg.GetFileName();\r
+               if(m_CurrentVersion == GIT_REV_ZERO)\r
+               {\r
+                       cmd.Format(_T("copy /Y \"%s\" \"%s\""),path->GetWinPath(),filename);\r
+                       if(g_Git.Run(cmd,&out,CP_ACP))\r
+                       {\r
+                               CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+                               return;\r
+                       }\r
+\r
+               }else\r
+               {\r
+                       cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),m_CurrentVersion,path->GetGitPathString());\r
+                       if(g_Git.RunLogFile(cmd,filename))\r
+                       {\r
+                               CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+                               return;\r
+                       }\r
+               }\r
+       }\r
+\r
+}\r
+\r
+int CGitStatusListCtrl::RevertSelectedItemToVersion()\r
+{\r
+       if(this->m_CurrentVersion.IsEmpty())\r
+               return 0;\r
+       if(this->m_CurrentVersion == GIT_REV_ZERO)\r
+               return 0;\r
+\r
+       POSITION pos = GetFirstSelectedItemPosition();\r
+       int index;\r
+       CString cmd,out;\r
+       int count =0;\r
+       while ((index = GetNextSelectedItem(pos)) >= 0)\r
+       {\r
+               CTGitPath *fentry=(CTGitPath*)GetItemData(index);\r
+               cmd.Format(_T("git.exe checkout %s -- \"%s\""),m_CurrentVersion,fentry->GetGitPathString());\r
+               out.Empty();\r
+               if(g_Git.Run(cmd,&out,CP_ACP))\r
+               {\r
+                       CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+               }\r
+               count++;\r
+       }\r
+\r
+       out.Format(_T("%d files revert to %s"),count,m_CurrentVersion.Left(6));\r
+       CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+       return 0;\r
+}\r
+\r
+void CGitStatusListCtrl::OpenFile(CTGitPath*filepath,int mode)\r
+{\r
+       CString file;\r
+       if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion == GIT_REV_ZERO)\r
+       {\r
+               file= filepath->GetWinPath();\r
+       }else\r
+       {\r
+               CString temppath;\r
+               GetTempPath(temppath);\r
+               file.Format(_T("%s%s_%s%s"),\r
+                                       temppath,                                               \r
+                                       filepath->GetBaseFilename(),\r
+                                       m_CurrentVersion.Left(6),\r
+                                       filepath->GetFileExtension());\r
+               CString cmd,out;\r
+               cmd.Format(_T("git.exe cat-file -p %s:\"%s\""),m_CurrentVersion,filepath->GetGitPathString());\r
+               if(g_Git.RunLogFile(cmd,file))\r
+               {\r
+                       CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK);\r
+                       return;\r
+               }\r
+\r
+       }\r
+       if(mode == NOTEPAD2)\r
+       {\r
+               CString sCmd;\r
+               sCmd.Format(_T("\"%s\" \"%s\""),\r
+                       (LPCTSTR)(CPathUtils::GetAppDirectory()+_T("notepad2.exe")), file);\r
+\r
+               CAppUtils::LaunchApplication(sCmd, NULL, false);\r
+               return ;\r
+       }\r
+       int ret = HINSTANCE_ERROR;\r
+\r
+       if(mode == OPEN )\r
+       {\r
+               ret = (int)ShellExecute(this->m_hWnd, NULL,file, NULL, NULL, SW_SHOW);\r
+       \r
+               if (ret > HINSTANCE_ERROR)\r
+               {\r
+                       return;\r
+               }\r
+       }\r
+\r
+       {\r
+               CString cmd = _T("RUNDLL32 Shell32,OpenAs_RunDLL ");\r
+               cmd += file;\r
+               CAppUtils::LaunchApplication(cmd, NULL, false);\r
+       }\r
+       \r
+}
\ No newline at end of file