OSDN Git Service

Add context menu item "Revert" at Commit File List
[tortoisegit/TortoiseGitJp.git] / src / Git / GitStatusListCtrl.cpp
index a32d859..0884469 100644 (file)
@@ -287,7 +287,7 @@ bool CGitStatusListCtrl::SetBackgroundImage(UINT nID)
        return CAppUtils::SetListCtrlBackgroundImage(GetSafeHwnd(), nID);\r
 }\r
 \r
-BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList\r
+BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList* pathList\r
                                    , bool bUpdate /* = FALSE */\r
                                    , bool bShowIgnores /* = false */\r
                                                                   , bool bShowUnRev\r
@@ -299,7 +299,7 @@ BOOL CGitStatusListCtrl::GetStatus ( const CTGitPathList& pathList
                mask|= CGitStatusListCtrl::FILELIST_IGNORE;\r
        if(bShowUnRev)\r
                mask|= CGitStatusListCtrl::FILELIST_UNVER;\r
-       this->UpdateFileList(mask,bUpdate,(CTGitPathList*)&pathList);\r
+       this->UpdateFileList(mask,bUpdate,(CTGitPathList*)pathList);\r
 \r
 \r
 #if 0\r
@@ -1083,6 +1083,7 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
                        m_arStatusArray.push_back((CTGitPath*)&m_IgnoreFileList[i]);\r
                }\r
        }\r
+       int index =0;\r
        for(int i=0;i<this->m_arStatusArray.size();i++)\r
        {\r
                //set default checkbox status\r
@@ -1090,7 +1091,10 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold
                        ((CTGitPath*)m_arStatusArray[i])->m_Checked=true;\r
 \r
                if(((CTGitPath*)m_arStatusArray[i])->m_Action & dwShow)\r
-                       AddEntry((CTGitPath*)m_arStatusArray[i],langID,i);\r
+               {\r
+                       AddEntry((CTGitPath*)m_arStatusArray[i],langID,index);\r
+                       index++;\r
+               }\r
        }\r
        \r
        int maxcol = ((CHeaderCtrl*)(GetDlgItem(0)))->GetItemCount()-1;\r
@@ -1449,7 +1453,7 @@ void CGitStatusListCtrl::AddEntry(CTGitPath * GitPath, WORD langID, int listInde
        // relative path\r
        CString rename;\r
        rename.Format(_T("(from %s)"),GitPath->GetGitOldPathString());\r
-       if(GitPath->m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
+       if(GitPath->m_Action & (CTGitPath::LOGACTIONS_REPLACED|CTGitPath::LOGACTIONS_COPY))\r
                entryname+=rename;\r
        \r
        InsertItem(index, entryname, icon_idx);\r
@@ -2060,7 +2064,7 @@ bool CGitStatusListCtrl::BuildStatistics()
        {\r
                int status=((CTGitPath*)m_arStatusArray[i])->m_Action;\r
 \r
-               if(status&CTGitPath::LOGACTIONS_ADDED)\r
+               if(status&(CTGitPath::LOGACTIONS_ADDED|CTGitPath::LOGACTIONS_COPY))\r
                        m_nAdded++;\r
                \r
                if(status&CTGitPath::LOGACTIONS_DELETED)\r
@@ -2228,14 +2232,14 @@ void CGitStatusListCtrl::OnContextMenuGroup(CWnd * /*pWnd*/, CPoint point)
                                                lv.mask = LVIF_GROUPID;\r
                                                lv.iItem = i;\r
                                                GetItem(&lv);\r
-#if 0\r
+\r
                                                if (lv.iGroupId == group)\r
                                                {\r
-                                                       FileEntry * entry = GetListEntry(i);\r
+                                                       CTGitPath * entry = (CTGitPath*)GetItemData(i);\r
                                                        if (entry)\r
                                                        {\r
-                                                               bool bOldCheck = !!GetCheck(i);\r
-                                                               //SetEntryCheck(entry, i, bCheck);\r
+                                                               bool bOldCheck = entry->m_Checked;\r
+                                                               SetEntryCheck(entry, i, bCheck);\r
                                                                if (bCheck != bOldCheck)\r
                                                                {\r
                                                                        if (bCheck)\r
@@ -2245,7 +2249,7 @@ void CGitStatusListCtrl::OnContextMenuGroup(CWnd * /*pWnd*/, CPoint point)
                                                                }\r
                                                        }\r
                                                }\r
-#endif\r
+\r
                                        }\r
                                        GetStatisticsString();\r
                                        NotifyCheck();\r
@@ -2427,6 +2431,15 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                        //              }\r
                        //      }\r
                        //}\r
+\r
+                       if ( (GetSelectedCount() >0 ) && (!(wcStatus & CTGitPath::LOGACTIONS_UNVER)))\r
+                       {\r
+                               if (m_dwContextMenus & SVNSLC_POPREVERT)\r
+                               {\r
+                                       popup.AppendMenuIcon(IDSVNLC_REVERT, IDS_MENUREVERT, IDI_REVERT);\r
+                               }\r
+                       }\r
+\r
                        if ((GetSelectedCount() == 1)&&(!(wcStatus & CTGitPath::LOGACTIONS_UNVER))\r
                                &&(!(wcStatus & CTGitPath::LOGACTIONS_IGNORE)))\r
                        {\r
@@ -3140,49 +3153,7 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
 #endif\r
                                break;\r
                        \r
-#if 0\r
-                       case IDSVNLC_COPY:\r
-                               CopySelectedEntriesToClipboard(0);\r
-                               break;\r
-                       case IDSVNLC_COPYEXT:\r
-                               CopySelectedEntriesToClipboard((DWORD)-1);\r
-                               break;\r
-                       case IDSVNLC_PROPERTIES:\r
-                               {\r
-                                       CTSVNPathList targetList;\r
-                                       FillListOfSelectedItemPaths(targetList);\r
-                                       CEditPropertiesDlg dlg;\r
-                                       dlg.SetPathList(targetList);\r
-                                       dlg.DoModal();\r
-                                       if (dlg.HasChanged())\r
-                                       {\r
-                                               // since the user might have changed/removed/added\r
-                                               // properties recursively, we don't really know\r
-                                               // which items have changed their status.\r
-                                               // So tell the parent to do a 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_COMMIT:\r
-                               {\r
-                                       CTSVNPathList targetList;\r
-                                       FillListOfSelectedItemPaths(targetList);\r
-                                       CTSVNPath tempFile = CTempFiles::Instance().GetTempFilePath(false);\r
-                                       VERIFY(targetList.WriteToFile(tempFile.GetWinPathString()));\r
-                                       CString commandline = CPathUtils::GetAppDirectory();\r
-                                       commandline += _T("TortoiseProc.exe /command:commit /pathfile:\"");\r
-                                       commandline += tempFile.GetWinPathString();\r
-                                       commandline += _T("\"");\r
-                                       commandline += _T(" /deletepathfile");\r
-                                       CAppUtils::LaunchApplication(commandline, NULL, false);\r
-                               }\r
-                               break;\r
-                       case IDSVNLC_REVERT:\r
+                               case IDSVNLC_REVERT:\r
                                {\r
                                        // If at least one item is not in the status "added"\r
                                        // we ask for a confirmation\r
@@ -3191,8 +3162,9 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        int index;\r
                                        while ((index = GetNextSelectedItem(pos)) >= 0)\r
                                        {\r
-                                               FileEntry * fentry = GetListEntry(index);\r
-                                               if (fentry->textstatus != git_wc_status_added)\r
+                                               //FileEntry * fentry = GetListEntry(index);\r
+                                               CTGitPath *fentry=(CTGitPath*)GetItemData(index);\r
+                                               if(fentry && fentry->m_Action &CTGitPath::LOGACTIONS_MODIFIED )\r
                                                {\r
                                                        bConfirm = TRUE;\r
                                                        break;\r
@@ -3204,93 +3176,44 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
 \r
                                        if (!bConfirm || CMessageBox::Show(this->m_hWnd, str, _T("TortoiseSVN"), MB_YESNO | MB_ICONQUESTION)==IDYES)\r
                                        {\r
-                                               CTSVNPathList targetList;\r
+                                               CTGitPathList targetList;\r
                                                FillListOfSelectedItemPaths(targetList);\r
 \r
                                                // make sure that the list is reverse sorted, so that\r
                                                // children are removed before any parents\r
                                                targetList.SortByPathname(true);\r
 \r
-                                               SVN git;\r
-\r
                                                // put all reverted files in the trashbin, except the ones with 'added'\r
                                                // status because they are not restored by the revert.\r
-                                               CTSVNPathList delList;\r
+                                               CTGitPathList delList;\r
                                                POSITION pos = GetFirstSelectedItemPosition();\r
                                                int index;\r
                                                while ((index = GetNextSelectedItem(pos)) >= 0)\r
                                                {\r
-                                                       FileEntry * entry = GetListEntry(index);\r
-                                                       if (entry->status != git_wc_status_added)\r
-                                                               delList.AddPath(entry->GetPath());\r
+                                                       CTGitPath *entry=(CTGitPath *)GetItemData(index);\r
+                                                       if (entry&&(!(entry->m_Action& CTGitPath::LOGACTIONS_ADDED)))\r
+                                                               delList.AddPath(*entry);\r
                                                }\r
                                                if (DWORD(CRegDWORD(_T("Software\\TortoiseGit\\RevertWithRecycleBin"), TRUE)))\r
                                                        delList.DeleteAllFiles(true);\r
 \r
-                                               if (!git.Revert(targetList, CStringArray(), FALSE))\r
+                                               if (g_Git.Revert(targetList))\r
                                                {\r
-                                                       CMessageBox::Show(this->m_hWnd, git.GetLastErrorMessage(), _T("TortoiseSVN"), MB_ICONERROR);\r
+                                                       CMessageBox::Show(this->m_hWnd, _T("Revert Fail"), _T("TortoiseSVN"), MB_ICONERROR);\r
                                                }\r
                                                else\r
                                                {\r
-                                                       // since the entries got reverted we need to remove\r
-                                                       // them from the list too, if no remote changes are shown,\r
-                                                       // if the unmodified files are not shown\r
-                                                       // and if the item is not part of a changelist\r
-                                                       POSITION pos;\r
-                                                       SetRedraw(FALSE);\r
-                                                       while ((pos = GetFirstSelectedItemPosition())!=0)\r
-                                                       {\r
-                                                               int index;\r
-                                                               index = GetNextSelectedItem(pos);\r
-                                                               FileEntry * fentry = m_arStatusArray[m_arListArray[index]];\r
-                                                               if ( fentry->IsFolder() )\r
-                                                               {\r
-                                                                       // refresh!\r
-                                                                       CWnd* pParent = GetParent();\r
-                                                                       if (NULL != pParent && NULL != pParent->GetSafeHwnd())\r
-                                                                       {\r
-                                                                               pParent->SendMessage(SVNSLNM_NEEDSREFRESH);\r
-                                                                       }\r
-                                                                       break;\r
-                                                               }\r
-\r
-                                                               BOOL bAdded = (fentry->textstatus == git_wc_status_added);\r
-                                                               fentry->status = git_wc_status_normal;\r
-                                                               fentry->propstatus = git_wc_status_normal;\r
-                                                               fentry->textstatus = git_wc_status_normal;\r
-                                                               fentry->copied = false;\r
-                                                               fentry->isConflicted = false;\r
-                                                               if ((fentry->GetChangeList().IsEmpty()&&(fentry->remotestatus <= git_wc_status_normal))||(m_dwShow & SVNSLC_SHOWNORMAL))\r
+                                                       for(int i=0;i<targetList.GetCount();i++)\r
+                                                       {       \r
+                                                               int nListboxEntries = GetItemCount();\r
+                                                               for (int nItem=0; nItem<nListboxEntries; ++nItem)\r
                                                                {\r
-                                                                       if ( bAdded )\r
-                                                                       {\r
-                                                                               // reverting added items makes them unversioned, not 'normal'\r
-                                                                               if (fentry->IsFolder())\r
-                                                                                       fentry->propstatus = git_wc_status_none;\r
-                                                                               else\r
-                                                                                       fentry->propstatus = git_wc_status_unversioned;\r
-                                                                               fentry->status = git_wc_status_unversioned;\r
-                                                                               fentry->textstatus = git_wc_status_unversioned;\r
-                                                                               SetItemState(index, 0, LVIS_SELECTED);\r
-                                                                               SetEntryCheck(fentry, index, false);\r
-                                                                       }\r
-                                                                       else if ((fentry->switched)||(m_dwShow & SVNSLC_SHOWNORMAL))\r
+                                                                       CTGitPath *path=(CTGitPath*)GetItemData(nItem);\r
+                                                                       if (path->GetGitPathString()==targetList[i].GetGitPathString())\r
                                                                        {\r
-                                                                               SetItemState(index, 0, LVIS_SELECTED);\r
+                                                                               RemoveListEntry(nItem);\r
+                                                                               break;\r
                                                                        }\r
-                                                                       else\r
-                                                                       {\r
-                                                                               m_nTotal--;\r
-                                                                               if (GetCheck(index))\r
-                                                                                       m_nSelected--;\r
-                                                                               RemoveListEntry(index);\r
-                                                                               Invalidate();\r
-                                                                       }\r
-                                                               }\r
-                                                               else\r
-                                                               {\r
-                                                                       SetItemState(index, 0, LVIS_SELECTED);\r
                                                                }\r
                                                        }\r
                                                        SetRedraw(TRUE);\r
@@ -3301,6 +3224,49 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point)
                                        }\r
                                }\r
                                break;\r
+#if 0\r
+                       case IDSVNLC_COPY:\r
+                               CopySelectedEntriesToClipboard(0);\r
+                               break;\r
+                       case IDSVNLC_COPYEXT:\r
+                               CopySelectedEntriesToClipboard((DWORD)-1);\r
+                               break;\r
+                       case IDSVNLC_PROPERTIES:\r
+                               {\r
+                                       CTSVNPathList targetList;\r
+                                       FillListOfSelectedItemPaths(targetList);\r
+                                       CEditPropertiesDlg dlg;\r
+                                       dlg.SetPathList(targetList);\r
+                                       dlg.DoModal();\r
+                                       if (dlg.HasChanged())\r
+                                       {\r
+                                               // since the user might have changed/removed/added\r
+                                               // properties recursively, we don't really know\r
+                                               // which items have changed their status.\r
+                                               // So tell the parent to do a 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_COMMIT:\r
+                               {\r
+                                       CTSVNPathList targetList;\r
+                                       FillListOfSelectedItemPaths(targetList);\r
+                                       CTSVNPath tempFile = CTempFiles::Instance().GetTempFilePath(false);\r
+                                       VERIFY(targetList.WriteToFile(tempFile.GetWinPathString()));\r
+                                       CString commandline = CPathUtils::GetAppDirectory();\r
+                                       commandline += _T("TortoiseProc.exe /command:commit /pathfile:\"");\r
+                                       commandline += tempFile.GetWinPathString();\r
+                                       commandline += _T("\"");\r
+                                       commandline += _T(" /deletepathfile");\r
+                                       CAppUtils::LaunchApplication(commandline, NULL, false);\r
+                               }\r
+                               break;\r
+               \r
                        case IDSVNLC_COMPARE:\r
                                {\r
                                        POSITION pos = GetFirstSelectedItemPosition();\r
@@ -4248,7 +4214,7 @@ void CGitStatusListCtrl::StartDiff(int fileindex)
 \r
        CTGitPath file1=*(CTGitPath*)GetItemData(fileindex);\r
        CTGitPath file2;\r
-       if(file1.m_Action & CTGitPath::LOGACTIONS_REPLACED)\r
+       if(file1.m_Action & (CTGitPath::LOGACTIONS_REPLACED|CTGitPath::LOGACTIONS_COPY))\r
        {\r
                file2.SetFromGit(file1.GetGitOldPathString());\r
        }else\r
@@ -4526,11 +4492,11 @@ void CGitStatusListCtrl::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
                                {\r
                                        crText = m_Colors.GetColor(CColors::Conflict);\r
 \r
-                               }else if(entry->m_Action & CTGitPath::LOGACTIONS_MODIFIED)\r
+                               }else if(entry->m_Action & (CTGitPath::LOGACTIONS_MODIFIED))\r
                                {\r
                                        crText = m_Colors.GetColor(CColors::Modified);\r
 \r
-                               }else if(entry->m_Action & CTGitPath::LOGACTIONS_ADDED)\r
+                               }else if(entry->m_Action & (CTGitPath::LOGACTIONS_ADDED|CTGitPath::LOGACTIONS_COPY))\r
                                {\r
                                        crText = m_Colors.GetColor(CColors::Added);\r
                                }\r
@@ -5346,7 +5312,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */)
        TCHAR groupname[1024];\r
        int groupindex = 0;\r
 \r
-       if(bHasGroups);\r
+       if(bHasGroups)\r
        {\r
                LVGROUP grp = {0};\r
                grp.cbSize = sizeof(LVGROUP);\r