X-Git-Url: http://git.sourceforge.jp/view?p=tortoisegit%2FTortoiseGitJp.git;a=blobdiff_plain;f=src%2FGit%2FGitStatusListCtrl.cpp;h=b28692c06c1257172f505901c1bed7fed5ede5dd;hp=330c7754d4f9fbfb0a38c205ebd121f85ecdeda6;hb=898c86f351e5c63a8a238734d3d4171648fdfe8a;hpb=3afaa9045478e0c779e5d918aad037e96c85c693 diff --git a/src/Git/GitStatusListCtrl.cpp b/src/Git/GitStatusListCtrl.cpp index 330c775..b28692c 100644 --- a/src/Git/GitStatusListCtrl.cpp +++ b/src/Git/GitStatusListCtrl.cpp @@ -1252,6 +1252,9 @@ void CGitStatusListCtrl::Show(DWORD dwShow, DWORD dwCheck /*=0*/, bool bShowFold void CGitStatusListCtrl::Show(DWORD dwShow, const CTGitPathList& checkedList, bool bShowFolders /* = true */) { + DeleteAllItems(); + for(int i=0;iAddEntry((CTGitPath *)&checkedList[i],0,i); return ; #if 0 @@ -1408,9 +1411,9 @@ void CGitStatusListCtrl::AddEntry(CTGitPath * GitPath, WORD langID, int listInde int nCol = 1; CString entryname = GitPath->GetGitPathString(); int icon_idx = 0; -// if (entry->isfolder) -// icon_idx = m_nIconFolder; -// else + if (GitPath->IsDirectory()) + icon_idx = m_nIconFolder; + else { icon_idx = SYS_IMAGE_LIST().GetPathIconIndex(*GitPath); } @@ -2288,8 +2291,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) } if ((m_dwContextMenus & SVNSLC_POPRESOLVE)/*&&(entry->textstatus == git_wc_status_conflicted)*/) { - //popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE); - //popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE); + popup.AppendMenuIcon(IDSVNLC_RESOLVETHEIRS, IDS_SVNPROGRESS_MENUUSETHEIRS, IDI_RESOLVE); + popup.AppendMenuIcon(IDSVNLC_RESOLVEMINE, IDS_SVNPROGRESS_MENUUSEMINE, IDI_RESOLVE); } if ((m_dwContextMenus & SVNSLC_POPCONFLICT)||(m_dwContextMenus & SVNSLC_POPRESOLVE)) popup.AppendMenu(MF_SEPARATOR); @@ -2318,10 +2321,12 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) // { // if ((m_dwContextMenus & SVNSLC_POPGNUDIFF)&&(wcStatus != git_wc_status_deleted)&&(wcStatus != git_wc_status_missing)) // { - if(!g_Git.IsInitRepos()) + if(!g_Git.IsInitRepos() && (m_dwContextMenus&SVNSLC_POPGNUDIFF)) + { popup.AppendMenuIcon(IDSVNLC_GNUDIFF1, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF); - bEntryAdded = true; + bEntryAdded = true; + } // } // } // @@ -2353,6 +2358,21 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) //} } + if( (!this->m_Rev1.IsEmpty()) || (!this->m_Rev1.IsEmpty()) ) + { + if(GetSelectedCount() == 1) + { + if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_COMPARETWO)) + { + popup.AppendMenuIcon(IDSVNLC_COMPARETWO, IDS_LOG_POPUP_COMPARETWO, IDI_DIFF); + popup.SetDefaultItem(IDSVNLC_COMPARETWO, FALSE); + } + if (m_dwContextMenus & this->GetContextMenuBit(IDSVNLC_GNUDIFF2)) + { + popup.AppendMenuIcon(IDSVNLC_GNUDIFF2, IDS_LOG_POPUP_GNUDIFF, IDI_DIFF); + } + } + } ///Select Multi item //if (GetSelectedCount() > 0) @@ -2475,6 +2495,11 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) popup.AppendMenuIcon(IDSVNLC_ADD, IDS_STATUSLIST_CONTEXT_ADD, IDI_ADD); } } + + if (m_dwContextMenus & SVNSLC_POPDELETE) + { + popup.AppendMenuIcon(IDSVNLC_DELETE, IDS_MENUREMOVE, IDI_DELETE); + } //} //if ( (wcStatus == git_wc_status_unversioned) || (wcStatus == git_wc_status_deleted) ) //{ @@ -2664,6 +2689,16 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) } } break; + case IDSVNLC_COMPARETWO: + { + POSITION pos = GetFirstSelectedItemPosition(); + while ( pos ) + { + int index = GetNextSelectedItem(pos); + StartDiffTwo(index); + } + } + break; case IDSVNLC_GNUDIFF1: { // SVNDiff diff(NULL, this->m_hWnd, true); @@ -2680,13 +2715,35 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) *filepath,m_CurrentVersion+_T("~1")); } break; + case IDSVNLC_GNUDIFF2: + { + // SVNDiff diff(NULL, this->m_hWnd, true); + // + // if (entry->remotestatus <= git_wc_status_normal) + // CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_BASE, entry->path, SVNRev::REV_WC); + // else + // CAppUtils::StartShowUnifiedDiff(m_hWnd, entry->path, SVNRev::REV_WC, entry->path, SVNRev::REV_HEAD); + + CAppUtils::StartShowUnifiedDiff(m_hWnd,*filepath,m_Rev1, + *filepath,m_Rev2); + } + break; + case IDSVNLC_ADD: { // The add went ok, but we now need to run through the selected items again // and update their status + std::vector selectIndex; + POSITION pos = GetFirstSelectedItemPosition(); int index; while ((index = GetNextSelectedItem(pos)) >= 0) { + selectIndex.push_back(index); + } + for(int i=0;i selectIndex; + + POSITION pos = GetFirstSelectedItemPosition(); + int index; + while ((index = GetNextSelectedItem(pos)) >= 0) + { + selectIndex.push_back(index); + } + + //Create file-list ('\0' separated) for SHFileOperation + CString filelist; + for(int i=0;iGetWinPathString(); + filelist += _T("|"); + } + filelist += _T("|"); + int len = filelist.GetLength(); + TCHAR * buf = new TCHAR[len+2]; + _tcscpy_s(buf, len+2, filelist); + for (int i=0; im_hWnd; + fileop.wFunc = FO_DELETE; + fileop.pFrom = buf; + fileop.pTo = NULL; + fileop.fFlags = FOF_NO_CONNECTED_ELEMENTS | ((GetAsyncKeyState(VK_SHIFT) & 0x8000) ? 0 : FOF_ALLOWUNDO); + fileop.lpszProgressTitle = _T("deleting file"); + int result = SHFileOperation(&fileop); + delete [] buf; + + if ( (result==0) && (!fileop.fAnyOperationsAborted) ) + { + SetRedraw(FALSE); + POSITION pos = NULL; + while ((pos = GetFirstSelectedItemPosition()) != 0) + { + int index = GetNextSelectedItem(pos); + if (GetCheck(index)) + m_nSelected--; + m_nTotal--; + + RemoveListEntry(index); + } + SetRedraw(TRUE); + } + } + break; + case IDSVNLC_BLAME: { CString sCmd; @@ -2734,6 +2852,8 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) CAppUtils::ConflictEdit(*filepath); break; } + case IDSVNLC_RESOLVETHEIRS: //follow up + case IDSVNLC_RESOLVEMINE: //follow up case IDSVNLC_RESOLVECONFLICT: { if (CMessageBox::Show(m_hWnd, IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO)==IDYES) @@ -2746,14 +2866,35 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) CTGitPath * fentry =(CTGitPath*) this->GetItemData(index); if(fentry == NULL) continue; + CString gitcmd,output; + output.Empty(); + if ( cmd == IDSVNLC_RESOLVETHEIRS) + { + gitcmd.Format(_T("git.exe cat-file blob \":3:%s\""),fentry->GetGitPathString()); + if(g_Git.RunLogFile(gitcmd,(CString&)fentry->GetWinPathString())) + { + CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR); + continue; + } + } + output.Empty(); + if ( cmd == IDSVNLC_RESOLVEMINE) + { + gitcmd.Format(_T("git.exe cat-file blob \":2:%s\""),fentry->GetGitPathString()); + if(g_Git.RunLogFile(gitcmd,(CString&)fentry->GetWinPathString())) + { + CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR); + continue; + } + } + output.Empty(); if ( fentry->m_Action & CTGitPath::LOGACTIONS_UNMERGED) { - CString cmd,output; - cmd.Format(_T("git.exe add \"%s\""),fentry->GetGitPathString()); - if(g_Git.Run(cmd,&output,CP_ACP)) + gitcmd.Format(_T("git.exe add \"%s\""),fentry->GetGitPathString()); + if(g_Git.Run(gitcmd,&output,CP_ACP)) { - CMessageBox::Show(m_hWnd, output, _T("TortoiseSVN"), MB_ICONERROR); + CMessageBox::Show(m_hWnd, output, _T("TortoiseGit"), MB_ICONERROR); }else { fentry->m_Action |= CTGitPath::LOGACTIONS_MODIFIED; @@ -3172,7 +3313,19 @@ void CGitStatusListCtrl::OnContextMenuList(CWnd * pWnd, CPoint point) CTGitPath *path=(CTGitPath*)GetItemData(nItem); if (path->GetGitPathString()==targetList[i].GetGitPathString()) { - RemoveListEntry(nItem); + if(path->m_Action & CTGitPath::LOGACTIONS_ADDED) + { + path->m_Action = CTGitPath::LOGACTIONS_UNVER; + SetEntryCheck(path,nItem,false); + SetItemGroup(nItem,1); + this->m_StatusFileList.RemoveItem(*path); + this->m_UnRevFileList.AddPath(*path); + //this->m_IgnoreFileList.RemoveItem(*path); + + }else + { + RemoveListEntry(nItem); + } break; } } @@ -3880,7 +4033,7 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult) *pResult = 0; if (m_bBlock) return; -#if 0 + if (pNMLV->iItem < 0) { if (!IsGroupViewEnabled()) @@ -3907,7 +4060,8 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult) GetItem(&lv); if (lv.iGroupId == group) { - FileEntry * entry = GetListEntry(i); + CTGitPath *entry=(CTGitPath*)GetItemData(i); + if (!bFirst) { bCheck = !GetCheck(i); @@ -3932,21 +4086,34 @@ void CGitStatusListCtrl::OnNMDblclk(NMHDR *pNMHDR, LRESULT *pResult) NotifyCheck(); return; } -#endif -// FileEntry * entry = GetListEntry(pNMLV->iItem); -// if (entry) - { -// if (entry->isConflicted) -// { -// gitDiff::StartConflictEditor(entry->GetPath()); -// } -// else - { + + CTGitPath *file=(CTGitPath*)GetItemData(pNMLV->iItem); + + if( file->m_Action&CTGitPath::LOGACTIONS_UNMERGED ) + { + CAppUtils::ConflictEdit(*file,false); + + }else + { + if( (!m_Rev1.IsEmpty()) || (!m_Rev1.IsEmpty())) + StartDiffTwo(pNMLV->iItem); + else StartDiff(pNMLV->iItem); - } } } +void CGitStatusListCtrl::StartDiffTwo(int fileindex) +{ + if(fileindex<0) + return; + + CTGitPath file1=*(CTGitPath*)GetItemData(fileindex); + + CGitDiff::Diff(&file1,&file1, + m_Rev1, + m_Rev2); + +} void CGitStatusListCtrl::StartDiffWC(int fileindex) { if(fileindex<0) @@ -3981,13 +4148,16 @@ void CGitStatusListCtrl::StartDiff(int fileindex) if(this->m_CurrentVersion.IsEmpty() || m_CurrentVersion== GIT_REV_ZERO) { - if(!g_Git.IsInitRepos()) + if( g_Git.IsInitRepos()) + CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex), + CString(GIT_REV_ZERO)); + else if( file1.m_Action&CTGitPath::LOGACTIONS_DELETED ) + CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex), + GitRev::GetHead(),false); + else CGitDiff::Diff(&file1,&file2, CString(GIT_REV_ZERO), GitRev::GetHead()); - else - CGitDiff::DiffNull((CTGitPath*)GetItemData(fileindex), - CString(GIT_REV_ZERO)); }else { CGitDiff::Diff(&file1,&file2, @@ -5103,7 +5273,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */) //if(m_UnRevFileList.GetCount()>0) { - _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("No Version Control"), 1023); + _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Not Versioned"), 1023); grp.pszHeader = groupname; grp.iGroupId = groupindex; grp.uAlign = LVGA_HEADER_LEFT; @@ -5112,7 +5282,7 @@ bool CGitStatusListCtrl::PrepareGroups(bool bForce /* = false */) //if(m_IgnoreFileList.GetCount()>0) { - _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Ignored File"), 1023); + _tcsncpy_s(groupname, 1024, (LPCTSTR)_T("Ignored"), 1023); grp.pszHeader = groupname; grp.iGroupId = groupindex; grp.uAlign = LVGA_HEADER_LEFT; @@ -5585,6 +5755,7 @@ int CGitStatusListCtrl::RevertSelectedItemToVersion() out.Format(_T("%d files revert to %s"),count,m_CurrentVersion.Left(6)); CMessageBox::Show(NULL,out,_T("TortoiseGit"),MB_OK); + return 0; } void CGitStatusListCtrl::OpenFile(CTGitPath*filepath,int mode)