void CBrowseRefsDlg::OnBnClickedOk() { if (m_bPickOne || m_ListRefLeafs.GetSelectedCount() != 2) { OnOK(); return; } CIconMenu popupMenu; popupMenu.CreatePopupMenu(); std::vector<CShadowTree*> selectedLeafs; GetSelectedLeaves(selectedLeafs); popupMenu.AppendMenuIcon(1, GetSelectedRef(true, false), IDI_LOG); popupMenu.SetDefaultItem(1); popupMenu.AppendMenuIcon(2, GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T("..")), IDI_LOG); popupMenu.AppendMenuIcon(3, GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T("...")), IDI_LOG); RECT rect; GetDlgItem(IDOK)->GetWindowRect(&rect); int selection = popupMenu.TrackPopupMenuEx(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_NONOTIFY, rect.left, rect.top, this, 0); switch (selection) { case 1: OnOK(); break; case 2: { m_bPickedRefSet = true; m_pickedRef = GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T("..")); OnOK(); } break; case 3: { m_bPickedRefSet = true; m_pickedRef = GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T("...")); OnOK(); } break; default: break; } }
void CRepositoryBrowser::ShowContextMenu(CPoint point, TShadowFilesTreeList &selectedLeafs, eSelectionType selType) { CIconMenu popupMenu; popupMenu.CreatePopupMenu(); bool bAddSeparator = false; if (selectedLeafs.size() == 1) { popupMenu.AppendMenuIcon(eCmd_Open, IDS_REPOBROWSE_OPEN, IDI_OPEN); popupMenu.SetDefaultItem(eCmd_Open, FALSE); if (selType == ONLY_FILES || selType == ONLY_FILESSUBMODULES) { popupMenu.AppendMenuIcon(eCmd_OpenWith, IDS_LOG_POPUP_OPENWITH, IDI_OPEN); popupMenu.AppendMenuIcon(eCmd_OpenWithAlternativeEditor, IDS_LOG_POPUP_VIEWREV); } popupMenu.AppendMenu(MF_SEPARATOR); if (m_bHasWC && (selType == ONLY_FILES || selType == ONLY_FILESSUBMODULES)) { popupMenu.AppendMenuIcon(eCmd_CompareWC, IDS_LOG_POPUP_COMPARE, IDI_DIFF); bAddSeparator = true; } if (bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; CString temp; temp.LoadString(IDS_MENULOG); popupMenu.AppendMenuIcon(eCmd_ViewLog, temp, IDI_LOG); if (selType == ONLY_FILES) { if (m_bHasWC) popupMenu.AppendMenuIcon(eCmd_Blame, IDS_LOG_POPUP_BLAME, IDI_BLAME); popupMenu.AppendMenu(MF_SEPARATOR); temp.LoadString(IDS_LOG_POPUP_SAVE); popupMenu.AppendMenuIcon(eCmd_SaveAs, temp, IDI_SAVEAS); } bAddSeparator = true; } if (!selectedLeafs.empty() && selType == ONLY_FILES && m_bHasWC) { popupMenu.AppendMenuIcon(eCmd_Revert, IDS_LOG_POPUP_REVERTTOREV, IDI_REVERT); bAddSeparator = true; } if (bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; if (!selectedLeafs.empty()) { popupMenu.AppendMenuIcon(eCmd_CopyPath, IDS_STATUSLIST_CONTEXT_COPY, IDI_COPYCLIP); popupMenu.AppendMenuIcon(eCmd_CopyHash, IDS_COPY_COMMIT_HASH, IDI_COPYCLIP); } eCmd cmd = (eCmd)popupMenu.TrackPopupMenuEx(TPM_LEFTALIGN|TPM_RETURNCMD, point.x, point.y, this, 0); switch(cmd) { case eCmd_ViewLog: { CString sCmd; sCmd.Format(_T("/command:log /path:\"%s\\%s\""), g_Git.m_CurrentDir, selectedLeafs.at(0)->GetFullName()); if (selectedLeafs.at(0)->m_bSubmodule) sCmd += _T(" /submodule"); CAppUtils::RunTortoiseGitProc(sCmd); } break; case eCmd_Blame: { CAppUtils::LaunchTortoiseBlame(g_Git.m_CurrentDir + _T("\\") + selectedLeafs.at(0)->GetFullName(), m_sRevision); } break; case eCmd_Open: if (!selectedLeafs.at(0)->m_bSubmodule && selectedLeafs.at(0)->m_bFolder) { FillListCtrlForTreeNode(selectedLeafs.at(0)->m_hTree); m_RepoTree.SelectItem(selectedLeafs.at(0)->m_hTree); return; } OpenFile(selectedLeafs.at(0)->GetFullName(), OPEN, selectedLeafs.at(0)->m_bSubmodule, selectedLeafs.at(0)->m_hash); break; case eCmd_OpenWith: OpenFile(selectedLeafs.at(0)->GetFullName(), OPEN_WITH, selectedLeafs.at(0)->m_bSubmodule, selectedLeafs.at(0)->m_hash); break; case eCmd_OpenWithAlternativeEditor: OpenFile(selectedLeafs.at(0)->GetFullName(), ALTERNATIVEEDITOR, selectedLeafs.at(0)->m_bSubmodule, selectedLeafs.at(0)->m_hash); break; case eCmd_CompareWC: { CTGitPath file(selectedLeafs.at(0)->GetFullName()); CGitDiff::Diff(&file, &file, GIT_REV_ZERO, m_sRevision); } break; case eCmd_Revert: { int count = 0; for (TShadowFilesTreeList::iterator itShadowTree = selectedLeafs.begin(); itShadowTree != selectedLeafs.end(); ++itShadowTree) { if (RevertItemToVersion((*itShadowTree)->GetFullName())) ++count; else break; } CString msg; msg.Format(IDS_STATUSLIST_FILESREVERTED, count, m_sRevision); MessageBox(msg, _T("TortoiseGit"), MB_OK); } break; case eCmd_SaveAs: FileSaveAs(selectedLeafs.at(0)->GetFullName()); break; case eCmd_CopyPath: { CString sClipboard; for (TShadowFilesTreeList::iterator itShadowTree = selectedLeafs.begin(); itShadowTree != selectedLeafs.end(); ++itShadowTree) { sClipboard += (*itShadowTree)->m_sName + _T("\r\n"); } CStringUtils::WriteAsciiStringToClipboard(sClipboard); } break; case eCmd_CopyHash: { CopyHashToClipboard(selectedLeafs); } break; } }
void CBrowseRefsDlg::ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPShadowTree& selectedLeafs) { CIconMenu popupMenu; popupMenu.CreatePopupMenu(); bool bAddSeparator = false; CString remoteName; if(selectedLeafs.size()==1) { bAddSeparator = true; bool bShowReflogOption = false; bool bShowFetchOption = false; bool bShowRenameOption = false; bool bShowCreateBranchOption = false; bool bShowEditBranchDescriptionOption = false; CString fetchFromCmd; if(selectedLeafs[0]->IsFrom(L"refs/heads/")) { bShowReflogOption = true; bShowRenameOption = true; bShowEditBranchDescriptionOption = true; } else if(selectedLeafs[0]->IsFrom(L"refs/remotes/")) { bShowReflogOption = true; bShowFetchOption = true; bShowCreateBranchOption = true; CString remoteBranch; if (SplitRemoteBranchName(selectedLeafs[0]->GetRefName(), remoteName, remoteBranch)) bShowFetchOption = false; else fetchFromCmd.Format(IDS_PROC_BROWSEREFS_FETCHFROM, (LPCTSTR)remoteName); } else if(selectedLeafs[0]->IsFrom(L"refs/tags/")) { } CString temp; temp.LoadString(IDS_MENULOG); popupMenu.AppendMenuIcon(eCmd_ViewLog, temp, IDI_LOG); popupMenu.AppendMenuIcon(eCmd_RepoBrowser, IDS_LOG_BROWSEREPO, IDI_REPOBROWSE); if(bShowReflogOption) { temp.LoadString(IDS_MENUREFLOG); popupMenu.AppendMenuIcon(eCmd_ShowReflog, temp, IDI_LOG); } popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; if(bShowFetchOption) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_Fetch, fetchFromCmd, IDI_PULL); } if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; if (m_bHasWC) { CString str; if (selectedLeafs[0]->GetRefName() != _T("refs/heads/") + g_Git.GetCurrentBranch()) { str.Format(IDS_LOG_POPUP_MERGEREV, (LPCTSTR)g_Git.GetCurrentBranch()); popupMenu.AppendMenuIcon(eCmd_Merge, str, IDI_MERGE); } popupMenu.AppendMenuIcon(eCmd_Switch, CString(MAKEINTRESOURCE(IDS_SWITCH_TO_THIS)), IDI_SWITCH); popupMenu.AppendMenu(MF_SEPARATOR); } if(bShowCreateBranchOption) { bAddSeparator = true; temp.LoadString(IDS_MENUBRANCH); popupMenu.AppendMenuIcon(eCmd_CreateBranch, temp, IDI_COPY); } if (bShowEditBranchDescriptionOption) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_EditBranchDescription, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_EDITDESCRIPTION)), IDI_RENAME); } if(bShowRenameOption) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_Rename, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_RENAME)), IDI_RENAME); } if (m_bHasWC && selectedLeafs[0]->IsFrom(L"refs/heads/")) { if (bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = true; if (!selectedLeafs[0]->m_csUpstream.IsEmpty()) popupMenu.AppendMenuIcon(eCmd_UpstreamDrop, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_DROPTRACKEDBRANCH))); popupMenu.AppendMenuIcon(eCmd_UpstreamSet, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_SETTRACKEDBRANCH))); } } else if(selectedLeafs.size() == 2) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_Diff, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_COMPAREREFS)), IDI_DIFF); popupMenu.AppendMenuIcon(eCmd_UnifiedDiff, CString(MAKEINTRESOURCE(IDS_LOG_POPUP_GNUDIFF)), IDI_DIFF); CString menu; menu.Format(IDS_SHOWLOG_OF, (LPCTSTR)GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T(".."))); popupMenu.AppendMenuIcon(eCmd_ViewLogRange, menu, IDI_LOG); menu.Format(IDS_SHOWLOG_OF, (LPCTSTR)GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T("..."))); popupMenu.AppendMenuIcon(eCmd_ViewLogRangeReachableFromOnlyOne, menu, IDI_LOG); } if(!selectedLeafs.empty()) { if(AreAllFrom(selectedLeafs, L"refs/remotes/")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString menuItemName; if(selectedLeafs.size() == 1) menuItemName.LoadString(IDS_PROC_BROWSEREFS_DELETEREMOTEBRANCH); else menuItemName.Format(IDS_PROC_BROWSEREFS_DELETEREMOTEBRANCHES, selectedLeafs.size()); popupMenu.AppendMenuIcon(eCmd_DeleteRemoteBranch, menuItemName, IDI_DELETE); bAddSeparator = true; } else if(AreAllFrom(selectedLeafs, L"refs/heads/")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString menuItemName; if(selectedLeafs.size() == 1) menuItemName.LoadString(IDS_PROC_BROWSEREFS_DELETEBRANCH); else menuItemName.Format(IDS_PROC_BROWSEREFS_DELETEBRANCHES, selectedLeafs.size()); popupMenu.AppendMenuIcon(eCmd_DeleteBranch, menuItemName, IDI_DELETE); bAddSeparator = true; } else if(AreAllFrom(selectedLeafs, L"refs/tags/")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString menuItemName; if(selectedLeafs.size() == 1) menuItemName.LoadString(IDS_PROC_BROWSEREFS_DELETETAG); else menuItemName.Format(IDS_PROC_BROWSEREFS_DELETETAGS, selectedLeafs.size()); popupMenu.AppendMenuIcon(eCmd_DeleteTag, menuItemName, IDI_DELETE); bAddSeparator = true; } } if(hTreePos!=NULL && selectedLeafs.empty()) { CShadowTree* pTree=(CShadowTree*)m_RefTreeCtrl.GetItemData(hTreePos); if(pTree->IsFrom(L"refs/remotes")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); popupMenu.AppendMenuIcon(eCmd_ManageRemotes, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_MANAGEREMOTES)), IDI_SETTINGS); bAddSeparator = true; if(selectedLeafs.empty()) { CString remoteBranch; if (SplitRemoteBranchName(pTree->GetRefName(), remoteName, remoteBranch)) remoteName = _T(""); int pos = findVectorPosition(remotes, remoteName); if (pos >= 0) { CString temp; temp.Format(IDS_PROC_BROWSEREFS_FETCHFROM, (LPCTSTR)remoteName); popupMenu.AppendMenuIcon(eCmd_Fetch, temp, IDI_PULL); temp.LoadString(IDS_DELETEREMOTETAG); popupMenu.AppendMenuIcon(eCmd_DeleteRemoteTag | (pos << 16), temp, IDI_DELETE); } } } if(pTree->IsFrom(L"refs/heads")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString temp; temp.LoadString(IDS_MENUBRANCH); popupMenu.AppendMenuIcon(eCmd_CreateBranch, temp, IDI_COPY); } if(pTree->IsFrom(L"refs/tags")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString temp; temp.LoadString(IDS_MENUTAG); popupMenu.AppendMenuIcon(eCmd_CreateTag, temp, IDI_TAG); temp.LoadString(IDS_PROC_BROWSEREFS_DELETEALLTAGS); popupMenu.AppendMenuIcon(eCmd_DeleteAllTags, temp, IDI_DELETE); if (!remotes.empty()) { popupMenu.AppendMenu(MF_SEPARATOR); int i = 0; for (auto it = remotes.cbegin(); it != remotes.cend(); ++it, ++i) { temp.Format(IDS_DELETEREMOTETAGON, (LPCTSTR)*it); popupMenu.AppendMenuIcon(eCmd_DeleteRemoteTag | (i << 16), temp, IDI_DELETE); } } } } int selection = popupMenu.TrackPopupMenuEx(TPM_LEFTALIGN | TPM_RETURNCMD, point.x, point.y, this, 0); switch ((eCmd)(selection & 0xFFFF)) { case eCmd_ViewLog: { CLogDlg dlg; dlg.SetRange(g_Git.FixBranchName(selectedLeafs[0]->GetRefName())); dlg.DoModal(); } break; case eCmd_ViewLogRange: { CLogDlg dlg; dlg.SetRange(GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T(".."))); dlg.DoModal(); } break; case eCmd_ViewLogRangeReachableFromOnlyOne: { CLogDlg dlg; dlg.SetRange(GetTwoSelectedRefs(selectedLeafs, m_sLastSelected, _T("..."))); dlg.DoModal(); } break; case eCmd_RepoBrowser: CAppUtils::RunTortoiseGitProc(_T("/command:repobrowser /path:\"") + g_Git.m_CurrentDir + _T("\" /rev:") + selectedLeafs[0]->GetRefName()); break; case eCmd_DeleteBranch: case eCmd_DeleteRemoteBranch: { if(ConfirmDeleteRef(selectedLeafs)) DoDeleteRefs(selectedLeafs); Refresh(); } break; case eCmd_DeleteTag: { if(ConfirmDeleteRef(selectedLeafs)) DoDeleteRefs(selectedLeafs); Refresh(); } break; case eCmd_ShowReflog: { CRefLogDlg refLogDlg(this); refLogDlg.m_CurrentBranch = selectedLeafs[0]->GetRefName(); refLogDlg.DoModal(); } break; case eCmd_Fetch: { CAppUtils::Fetch(remoteName); Refresh(); } break; case eCmd_DeleteRemoteTag: { CDeleteRemoteTagDlg deleteRemoteTagDlg; int remoteInx = selection >> 16; if (remoteInx < 0 || remoteInx >= remotes.size()) return; deleteRemoteTagDlg.m_sRemote = remotes[remoteInx]; deleteRemoteTagDlg.DoModal(); } break; case eCmd_Merge: { CString ref = selectedLeafs[0]->GetRefName(); CAppUtils::Merge(&ref); } break; case eCmd_Switch: { CAppUtils::Switch(selectedLeafs[0]->GetRefName()); } break; case eCmd_Rename: { POSITION pos = m_ListRefLeafs.GetFirstSelectedItemPosition(); if(pos != NULL) m_ListRefLeafs.EditLabel(m_ListRefLeafs.GetNextSelectedItem(pos)); } break; case eCmd_AddRemote: { CAddRemoteDlg(this).DoModal(); Refresh(); } break; case eCmd_ManageRemotes: { CSinglePropSheetDlg(CString(MAKEINTRESOURCE(IDS_PROCS_TITLE_GITREMOTESETTINGS)), new CSettingGitRemote(), this).DoModal(); // CSettingGitRemote W_Remotes(m_cmdPath); // W_Remotes.DoModal(); Refresh(); } break; case eCmd_CreateBranch: { CString *commitHash = NULL; if (selectedLeafs.size() == 1) commitHash = &(selectedLeafs[0]->m_csRefHash); CAppUtils::CreateBranchTag(false, commitHash); Refresh(); } break; case eCmd_CreateTag: { CAppUtils::CreateBranchTag(true); Refresh(); } break; case eCmd_DeleteAllTags: { for (int i = 0; i < m_ListRefLeafs.GetItemCount(); ++i) { m_ListRefLeafs.SetItemState(i, LVIS_SELECTED, LVIS_SELECTED); selectedLeafs.push_back((CShadowTree*)m_ListRefLeafs.GetItemData(i)); } if (ConfirmDeleteRef(selectedLeafs)) DoDeleteRefs(selectedLeafs); Refresh(); } break; case eCmd_Diff: { CFileDiffDlg dlg; dlg.SetDiff( NULL, selectedLeafs[1]->GetRefName() + L"^{}", selectedLeafs[0]->GetRefName() + L"^{}"); dlg.DoModal(); } break; case eCmd_UnifiedDiff: { CAppUtils::StartShowUnifiedDiff(nullptr, CTGitPath(), selectedLeafs[0]->m_csRefHash, CTGitPath(), selectedLeafs[1]->m_csRefHash); } break; case eCmd_EditBranchDescription: { CInputDlg dlg; dlg.m_sHintText.LoadString(IDS_PROC_BROWSEREFS_EDITDESCRIPTION); dlg.m_sInputText = selectedLeafs[0]->m_csDescription; dlg.m_sTitle.LoadString(IDS_PROC_BROWSEREFS_EDITDESCRIPTION); dlg.m_bUseLogWidth = true; if(dlg.DoModal() == IDOK) { CString key; key.Format(_T("branch.%s.description"), (LPCTSTR)selectedLeafs[0]->GetRefsHeadsName()); dlg.m_sInputText.Replace(_T("\r"), _T("")); dlg.m_sInputText.Trim(); if (dlg.m_sInputText.IsEmpty()) g_Git.UnsetConfigValue(key); else g_Git.SetConfigValue(key, dlg.m_sInputText); Refresh(); } } break; case eCmd_UpstreamDrop: { CString key; key.Format(_T("branch.%s.remote"), (LPCTSTR)selectedLeafs[0]->GetRefsHeadsName()); g_Git.UnsetConfigValue(key); key.Format(_T("branch.%s.merge"), (LPCTSTR)selectedLeafs[0]->GetRefsHeadsName()); g_Git.UnsetConfigValue(key); } Refresh(); break; case eCmd_UpstreamSet: { CString newRef = CBrowseRefsDlg::PickRef(false, _T(""), gPickRef_Remote, false); if (newRef.IsEmpty() || newRef.Find(_T("refs/remotes/")) != 0) return; CString remote, branch; if (SplitRemoteBranchName(newRef, remote, branch)) return; CString key; key.Format(_T("branch.%s.remote"), (LPCTSTR)selectedLeafs[0]->GetRefsHeadsName()); g_Git.SetConfigValue(key, remote); key.Format(_T("branch.%s.merge"), (LPCTSTR)selectedLeafs[0]->GetRefsHeadsName()); g_Git.SetConfigValue(key, _T("refs/heads/") + branch); Refresh(); } break; } }
void CRepositoryBrowser::ShowContextMenu(CPoint point, TShadowFilesTreeList &selectedLeafs, eSelectionType selType) { CIconMenu popupMenu; popupMenu.CreatePopupMenu(); bool bAddSeparator = false; if (selectedLeafs.size() == 1) { popupMenu.AppendMenuIcon(eCmd_Open, IDS_REPOBROWSE_OPEN, IDI_OPEN); popupMenu.SetDefaultItem(eCmd_Open, FALSE); if (selType == ONLY_FILES || selType == ONLY_FILESSUBMODULES) { popupMenu.AppendMenuIcon(eCmd_OpenWith, IDS_LOG_POPUP_OPENWITH, IDI_OPEN); popupMenu.AppendMenuIcon(eCmd_OpenWithAlternativeEditor, IDS_LOG_POPUP_VIEWREV); } popupMenu.AppendMenu(MF_SEPARATOR); if (m_bHasWC && (selType == ONLY_FILES || selType == ONLY_FILESSUBMODULES)) { popupMenu.AppendMenuIcon(eCmd_CompareWC, IDS_LOG_POPUP_COMPARE, IDI_DIFF); bAddSeparator = true; } if (bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; CString temp; temp.LoadString(IDS_MENULOG); popupMenu.AppendMenuIcon(eCmd_ViewLog, temp, IDI_LOG); if (selectedLeafs[0]->m_bSubmodule) { temp.LoadString(IDS_MENULOGSUBMODULE); popupMenu.AppendMenuIcon(eCmd_ViewLogSubmodule, temp, IDI_LOG); } if (selType == ONLY_FILES) { if (m_bHasWC) popupMenu.AppendMenuIcon(eCmd_Blame, IDS_LOG_POPUP_BLAME, IDI_BLAME); popupMenu.AppendMenu(MF_SEPARATOR); temp.LoadString(IDS_LOG_POPUP_SAVE); popupMenu.AppendMenuIcon(eCmd_SaveAs, temp, IDI_SAVEAS); } bAddSeparator = true; } if (!selectedLeafs.empty() && selType == ONLY_FILES && m_bHasWC) { popupMenu.AppendMenuIcon(eCmd_Revert, IDS_LOG_POPUP_REVERTTOREV, IDI_REVERT); bAddSeparator = true; } if (bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; if (selectedLeafs.size() == 1 && selType == ONLY_FILES) { popupMenu.AppendMenuIcon(eCmd_PrepareDiff, IDS_PREPAREDIFF, IDI_DIFF); if (!m_sMarkForDiffFilename.IsEmpty()) { CString diffWith; if (selectedLeafs.at(0)->GetFullName() == m_sMarkForDiffFilename) diffWith = m_sMarkForDiffVersion; else { PathCompactPathEx(diffWith.GetBuffer(40), m_sMarkForDiffFilename, 39, 0); diffWith.ReleaseBuffer(); diffWith += _T(":") + m_sMarkForDiffVersion.ToString().Left(g_Git.GetShortHASHLength()); } CString menuEntry; menuEntry.Format(IDS_MENUDIFFNOW, (LPCTSTR)diffWith); popupMenu.AppendMenuIcon(eCmd_PrepareDiff_Compare, menuEntry, IDI_DIFF); } popupMenu.AppendMenu(MF_SEPARATOR); } if (!selectedLeafs.empty()) { popupMenu.AppendMenuIcon(eCmd_CopyPath, IDS_STATUSLIST_CONTEXT_COPY, IDI_COPYCLIP); popupMenu.AppendMenuIcon(eCmd_CopyHash, IDS_COPY_COMMIT_HASH, IDI_COPYCLIP); } eCmd cmd = (eCmd)popupMenu.TrackPopupMenuEx(TPM_LEFTALIGN|TPM_RETURNCMD, point.x, point.y, this, 0); switch(cmd) { case eCmd_ViewLog: case eCmd_ViewLogSubmodule: { CString sCmd; sCmd.Format(_T("/command:log /path:\"%s\\%s\""), (LPCTSTR)g_Git.m_CurrentDir, (LPCTSTR)selectedLeafs.at(0)->GetFullName()); if (cmd == eCmd_ViewLog && selectedLeafs.at(0)->m_bSubmodule) sCmd += _T(" /submodule"); CAppUtils::RunTortoiseGitProc(sCmd); } break; case eCmd_Blame: { CAppUtils::LaunchTortoiseBlame(g_Git.CombinePath(selectedLeafs.at(0)->GetFullName()), m_sRevision); } break; case eCmd_Open: if (!selectedLeafs.at(0)->m_bSubmodule && selectedLeafs.at(0)->m_bFolder) { FillListCtrlForTreeNode(selectedLeafs.at(0)->m_hTree); m_RepoTree.SelectItem(selectedLeafs.at(0)->m_hTree); return; } OpenFile(selectedLeafs.at(0)->GetFullName(), OPEN, selectedLeafs.at(0)->m_bSubmodule, selectedLeafs.at(0)->m_hash); break; case eCmd_OpenWith: OpenFile(selectedLeafs.at(0)->GetFullName(), OPEN_WITH, selectedLeafs.at(0)->m_bSubmodule, selectedLeafs.at(0)->m_hash); break; case eCmd_OpenWithAlternativeEditor: OpenFile(selectedLeafs.at(0)->GetFullName(), ALTERNATIVEEDITOR, selectedLeafs.at(0)->m_bSubmodule, selectedLeafs.at(0)->m_hash); break; case eCmd_CompareWC: { CTGitPath file(selectedLeafs.at(0)->GetFullName()); CGitDiff::Diff(&file, &file, GIT_REV_ZERO, m_sRevision); } break; case eCmd_Revert: { int count = 0; for (TShadowFilesTreeList::iterator itShadowTree = selectedLeafs.begin(); itShadowTree != selectedLeafs.end(); ++itShadowTree) { if (RevertItemToVersion((*itShadowTree)->GetFullName())) ++count; else break; } CString msg; msg.Format(IDS_STATUSLIST_FILESREVERTED, count, (LPCTSTR)m_sRevision); MessageBox(msg, _T("TortoiseGit"), MB_OK); } break; case eCmd_SaveAs: FileSaveAs(selectedLeafs.at(0)->GetFullName()); break; case eCmd_CopyPath: { CString sClipboard; for (TShadowFilesTreeList::iterator itShadowTree = selectedLeafs.begin(); itShadowTree != selectedLeafs.end(); ++itShadowTree) { sClipboard += (*itShadowTree)->m_sName + _T("\r\n"); } CStringUtils::WriteAsciiStringToClipboard(sClipboard); } break; case eCmd_CopyHash: { CopyHashToClipboard(selectedLeafs); } break; case eCmd_PrepareDiff: m_sMarkForDiffFilename = selectedLeafs.at(0)->GetFullName(); if (g_Git.GetHash(m_sMarkForDiffVersion, m_sRevision)) { m_sMarkForDiffFilename.Empty(); MessageBox(g_Git.GetGitLastErr(_T("Could not get SHA-1 for ") + m_sRevision), _T("TortoiseGit"), MB_ICONERROR); } break; case eCmd_PrepareDiff_Compare: { CTGitPath savedFile(m_sMarkForDiffFilename); CTGitPath selectedFile(selectedLeafs.at(0)->GetFullName()); CGitHash currentHash; if (g_Git.GetHash(currentHash, m_sRevision)) { MessageBox(g_Git.GetGitLastErr(_T("Could not get SHA-1 for ") + m_sRevision), _T("TortoiseGit"), MB_ICONERROR); return; } CGitDiff::Diff(&selectedFile, &savedFile, currentHash, m_sMarkForDiffVersion); } break; } }
void CBrowseRefsDlg::ShowContextMenu(CPoint point, HTREEITEM hTreePos, VectorPShadowTree& selectedLeafs) { CIconMenu popupMenu; popupMenu.CreatePopupMenu(); bool bAddSeparator = false; CString remoteName; if(selectedLeafs.size()==1) { bAddSeparator = true; bool bShowReflogOption = false; bool bShowFetchOption = false; bool bShowSwitchOption = false; bool bShowRenameOption = false; bool bShowCreateBranchOption = false; bool bShowEditBranchDescriptionOption = false; CString fetchFromCmd; if(selectedLeafs[0]->IsFrom(L"refs/heads")) { bShowReflogOption = true; bShowSwitchOption = true; bShowRenameOption = true; bShowEditBranchDescriptionOption = true; } else if(selectedLeafs[0]->IsFrom(L"refs/remotes")) { bShowReflogOption = true; bShowFetchOption = true; bShowCreateBranchOption = true; int dummy = 0;//Needed for tokenize remoteName = selectedLeafs[0]->GetRefName(); remoteName = remoteName.Mid(13); remoteName = remoteName.Tokenize(L"/", dummy); fetchFromCmd.Format(IDS_PROC_BROWSEREFS_FETCHFROM, remoteName); } else if(selectedLeafs[0]->IsFrom(L"refs/tags")) { } CString temp; temp.LoadString(IDS_MENULOG); popupMenu.AppendMenuIcon(eCmd_ViewLog, temp, IDI_LOG); popupMenu.AppendMenuIcon(eCmd_RepoBrowser, IDS_LOG_BROWSEREPO, IDI_REPOBROWSE); if(bShowReflogOption) { temp.LoadString(IDS_MENUREFLOG); popupMenu.AppendMenuIcon(eCmd_ShowReflog, temp, IDI_LOG); } popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; if(bShowFetchOption) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_Fetch, fetchFromCmd, IDI_PULL); } if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); bAddSeparator = false; if (m_bHasWC) { popupMenu.AppendMenuIcon(eCmd_Switch, CString(MAKEINTRESOURCE(IDS_SWITCH_TO_THIS)), IDI_SWITCH); popupMenu.AppendMenu(MF_SEPARATOR); } if(bShowCreateBranchOption) { bAddSeparator = true; temp.LoadString(IDS_MENUBRANCH); popupMenu.AppendMenuIcon(eCmd_CreateBranch, temp, IDI_COPY); } if (bShowEditBranchDescriptionOption) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_EditBranchDescription, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_EDITDESCRIPTION)), IDI_RENAME); } if(bShowRenameOption) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_Rename, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_RENAME)), IDI_RENAME); } } else if(selectedLeafs.size() == 2) { bAddSeparator = true; popupMenu.AppendMenuIcon(eCmd_Diff, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_COMPAREREFS)), IDI_DIFF); } if(!selectedLeafs.empty()) { if(AreAllFrom(selectedLeafs, L"refs/remotes/")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString menuItemName; if(selectedLeafs.size() == 1) menuItemName.LoadString(IDS_PROC_BROWSEREFS_DELETEREMOTEBRANCH); else menuItemName.Format(IDS_PROC_BROWSEREFS_DELETEREMOTEBRANCHES, selectedLeafs.size()); popupMenu.AppendMenuIcon(eCmd_DeleteRemoteBranch, menuItemName, IDI_DELETE); bAddSeparator = true; } else if(AreAllFrom(selectedLeafs, L"refs/heads/")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString menuItemName; if(selectedLeafs.size() == 1) menuItemName.LoadString(IDS_PROC_BROWSEREFS_DELETEBRANCH); else menuItemName.Format(IDS_PROC_BROWSEREFS_DELETEBRANCHES, selectedLeafs.size()); popupMenu.AppendMenuIcon(eCmd_DeleteBranch, menuItemName, IDI_DELETE); bAddSeparator = true; } else if(AreAllFrom(selectedLeafs, L"refs/tags/")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString menuItemName; if(selectedLeafs.size() == 1) menuItemName.LoadString(IDS_PROC_BROWSEREFS_DELETETAG); else menuItemName.Format(IDS_PROC_BROWSEREFS_DELETETAGS, selectedLeafs.size()); popupMenu.AppendMenuIcon(eCmd_DeleteTag, menuItemName, IDI_DELETE); bAddSeparator = true; } } if(hTreePos!=NULL && selectedLeafs.empty()) { CShadowTree* pTree=(CShadowTree*)m_RefTreeCtrl.GetItemData(hTreePos); if(pTree->IsFrom(L"refs/remotes")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); popupMenu.AppendMenuIcon(eCmd_ManageRemotes, CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_MANAGEREMOTES)), IDI_SETTINGS); bAddSeparator = true; if(selectedLeafs.empty()) { int dummy = 0;//Needed for tokenize remoteName = pTree->GetRefName(); remoteName = remoteName.Mid(13); remoteName = remoteName.Tokenize(L"/", dummy); if(!remoteName.IsEmpty()) { CString temp; temp.Format(IDS_PROC_BROWSEREFS_FETCHFROM, remoteName); popupMenu.AppendMenuIcon(eCmd_Fetch, temp, IDI_PULL); temp.LoadString(IDS_DELETEREMOTETAG); popupMenu.AppendMenuIcon(eCmd_DeleteRemoteTag, temp, IDI_DELETE); } } } if(pTree->IsFrom(L"refs/heads")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString temp; temp.LoadString(IDS_MENUBRANCH); popupMenu.AppendMenuIcon(eCmd_CreateBranch, temp, IDI_COPY); } if(pTree->IsFrom(L"refs/tags")) { if(bAddSeparator) popupMenu.AppendMenu(MF_SEPARATOR); CString temp; temp.LoadString(IDS_MENUTAG); popupMenu.AppendMenuIcon(eCmd_CreateTag, temp, IDI_TAG); } } eCmd cmd=(eCmd)popupMenu.TrackPopupMenuEx(TPM_LEFTALIGN|TPM_RETURNCMD, point.x, point.y, this, 0); switch(cmd) { case eCmd_ViewLog: { CLogDlg dlg; dlg.SetStartRef(selectedLeafs[0]->GetRefName()); dlg.DoModal(); } break; case eCmd_RepoBrowser: CAppUtils::RunTortoiseProc(_T("/command:repobrowser /path:\"") + g_Git.m_CurrentDir + _T("\" /rev:") + selectedLeafs[0]->GetRefName()); break; case eCmd_DeleteBranch: case eCmd_DeleteRemoteBranch: { if(ConfirmDeleteRef(selectedLeafs)) DoDeleteRefs(selectedLeafs, true); Refresh(); } break; case eCmd_DeleteTag: { if(ConfirmDeleteRef(selectedLeafs)) DoDeleteRefs(selectedLeafs, true); Refresh(); } break; case eCmd_ShowReflog: { CRefLogDlg refLogDlg(this); refLogDlg.m_CurrentBranch = selectedLeafs[0]->GetRefName(); refLogDlg.DoModal(); } break; case eCmd_Fetch: { CAppUtils::Fetch(remoteName); Refresh(); } break; case eCmd_DeleteRemoteTag: { CDeleteRemoteTagDlg deleteRemoteTagDlg; deleteRemoteTagDlg.m_sRemote = remoteName; deleteRemoteTagDlg.DoModal(); } break; case eCmd_Switch: { CAppUtils::Switch(selectedLeafs[0]->GetRefName()); } break; case eCmd_Rename: { POSITION pos = m_ListRefLeafs.GetFirstSelectedItemPosition(); if(pos != NULL) m_ListRefLeafs.EditLabel(m_ListRefLeafs.GetNextSelectedItem(pos)); } break; case eCmd_AddRemote: { CAddRemoteDlg(this).DoModal(); Refresh(); } break; case eCmd_ManageRemotes: { CSinglePropSheetDlg(CString(MAKEINTRESOURCE(IDS_PROCS_TITLE_GITREMOTESETTINGS)), new CSettingGitRemote(g_Git.m_CurrentDir), this).DoModal(); // CSettingGitRemote W_Remotes(m_cmdPath); // W_Remotes.DoModal(); Refresh(); } break; case eCmd_CreateBranch: { CString *commitHash = NULL; if (selectedLeafs.size() == 1) commitHash = &(selectedLeafs[0]->m_csRefHash); CAppUtils::CreateBranchTag(false, commitHash); Refresh(); } break; case eCmd_CreateTag: { CAppUtils::CreateBranchTag(true); Refresh(); } break; case eCmd_Diff: { CFileDiffDlg dlg; dlg.SetDiff( NULL, selectedLeafs[0]->m_csRefHash, selectedLeafs[1]->m_csRefHash); dlg.DoModal(); } break; case eCmd_EditBranchDescription: { CInputDlg dlg; dlg.m_sHintText = CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_EDITDESCRIPTION)); dlg.m_sInputText = selectedLeafs[0]->m_csDescription; dlg.m_sTitle = CString(MAKEINTRESOURCE(IDS_PROC_BROWSEREFS_EDITDESCRIPTION)); dlg.m_bUseLogWidth = true; if(dlg.DoModal() == IDOK) { CString key; key.Format(_T("branch.%s.description"), selectedLeafs[0]->m_csRefName); dlg.m_sInputText.Replace(_T("\r"), _T("")); dlg.m_sInputText.Trim(); if (dlg.m_sInputText.IsEmpty()) g_Git.UnsetConfigValue(key); else g_Git.SetConfigValue(key, dlg.m_sInputText); Refresh(); } } break; } }