SyncDlg: Disallow in/out changes to include local context menu
[TortoiseGit.git] / src / TortoiseProc / SubmoduleResolveConflictDlg.cpp
blob42e0c63ab89d56032a5d75e0aecbba366b5e1b3b
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2012-2017 - TortoiseGit
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include "stdafx.h"
20 #include "TortoiseProc.h"
21 #include "Git.h"
22 #include "AppUtils.h"
23 #include "SubmoduleResolveConflictDlg.h"
24 #include "LoglistCommonResource.h"
25 #include "SubmoduleDiffDlg.h"
26 #include "MessageBox.h"
28 IMPLEMENT_DYNAMIC(CSubmoduleResolveConflictDlg, CHorizontalResizableStandAloneDialog)
29 CSubmoduleResolveConflictDlg::CSubmoduleResolveConflictDlg(CWnd* pParent /*=nullptr*/)
30 : CHorizontalResizableStandAloneDialog(CSubmoduleResolveConflictDlg::IDD, pParent)
31 , m_bBaseOK(false)
32 , m_bMineOK(false)
33 , m_bTheirsOK(false)
34 , m_nChangeTypeMine(CGitDiff::Unknown)
35 , m_nChangeTypeTheirs(CGitDiff::Unknown)
36 , m_bRevertTheirMy(false)
37 , m_bResolved(false)
41 CSubmoduleResolveConflictDlg::~CSubmoduleResolveConflictDlg()
45 void CSubmoduleResolveConflictDlg::DoDataExchange(CDataExchange* pDX)
47 CHorizontalResizableStandAloneDialog::DoDataExchange(pDX);
48 DDX_Text(pDX, IDC_BASEHASH, m_sBaseHash);
49 DDX_Text(pDX, IDC_BASESUBJECT, m_sBaseSubject);
50 DDX_Text(pDX, IDC_MINEHASH, m_sMineHash);
51 DDX_Text(pDX, IDC_MINESUBJECT, m_sMineSubject);
52 DDX_Text(pDX, IDC_THEIRSHASH, m_sTheirsHash);
53 DDX_Text(pDX, IDC_THEIRSSUBJECT, m_sTheirsSubject);
56 BEGIN_MESSAGE_MAP(CSubmoduleResolveConflictDlg, CHorizontalResizableStandAloneDialog)
57 ON_BN_CLICKED(IDC_LOG, &OnBnClickedLog)
58 ON_BN_CLICKED(IDC_LOG2, &OnBnClickedLog2)
59 ON_BN_CLICKED(IDC_LOG3, &OnBnClickedLog3)
60 ON_WM_CTLCOLOR()
61 ON_BN_CLICKED(IDC_BUTTON_UPDATE2, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2)
62 ON_BN_CLICKED(IDC_BUTTON_UPDATE3, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3)
63 END_MESSAGE_MAP()
65 BOOL CSubmoduleResolveConflictDlg::OnInitDialog()
67 CHorizontalResizableStandAloneDialog::OnInitDialog();
69 CString sWindowTitle;
70 GetWindowText(sWindowTitle);
71 CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle);
73 AddAnchor(IDC_SUBMODULEDIFFTITLE, TOP_LEFT, TOP_RIGHT);
74 AddAnchor(IDC_STATIC_REVISION, TOP_LEFT);
75 AddAnchor(IDC_STATIC_REVISION2, TOP_LEFT);
76 AddAnchor(IDC_STATIC_REVISION3, TOP_LEFT);
77 AddAnchor(IDC_STATIC_SUBJECT, TOP_LEFT);
78 AddAnchor(IDC_STATIC_SUBJECT2, TOP_LEFT);
79 AddAnchor(IDC_STATIC_SUBJECT3, TOP_LEFT);
80 AddAnchor(IDC_STATIC_CHANGETYPE, TOP_LEFT);
81 AddAnchor(IDC_STATIC_CHANGETYPE2, TOP_LEFT);
83 AddAnchor(IDC_FROMGROUP, TOP_LEFT, TOP_RIGHT);
84 AddAnchor(IDC_TOGROUP, TOP_LEFT, TOP_RIGHT);
85 AddAnchor(IDC_TOGROUP2, TOP_LEFT, TOP_RIGHT);
87 AddAnchor(IDC_LOG, TOP_RIGHT);
88 AddAnchor(IDC_LOG2, TOP_RIGHT);
89 AddAnchor(IDC_LOG3, TOP_RIGHT);
91 AddAnchor(IDC_BASEHASH, TOP_LEFT, TOP_RIGHT);
92 AddAnchor(IDC_BASESUBJECT, TOP_LEFT, TOP_RIGHT);
93 AddAnchor(IDC_MINECHANGETYPE, TOP_LEFT, TOP_RIGHT);
94 AddAnchor(IDC_MINEHASH, TOP_LEFT, TOP_RIGHT);
95 AddAnchor(IDC_MINESUBJECT, TOP_LEFT, TOP_RIGHT);
96 AddAnchor(IDC_THEIRSCHANGETYPE, TOP_LEFT, TOP_RIGHT);
97 AddAnchor(IDC_THEIRSHASH, TOP_LEFT, TOP_RIGHT);
98 AddAnchor(IDC_THEIRSSUBJECT, TOP_LEFT, TOP_RIGHT);
100 EnableSaveRestore(L"SubmoduleResolveConflictDlg");
102 CString fsPath = m_sPath;
103 fsPath.Replace(L'\\', L'/');
104 CString title = L"Submodule \"" + fsPath + L'"';
105 GetDlgItem(IDC_SUBMODULEDIFFTITLE)->SetWindowText(title);
107 UpdateData(FALSE);
109 CString changeTypeTable[] =
111 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_UNKNOWN)),
112 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_IDENTICAL)),
113 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_NEWSUBMODULE)),
114 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_DELETESUBMODULE)),
115 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_FASTFORWARD)),
116 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_REWIND)),
117 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_NEWERTIME)),
118 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_OLDERTIME)),
119 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_SAMETIME))
121 GetDlgItem(IDC_MINECHANGETYPE)->SetWindowText(changeTypeTable[m_nChangeTypeMine]);
122 GetDlgItem(IDC_THEIRSCHANGETYPE)->SetWindowText(changeTypeTable[m_nChangeTypeTheirs]);
124 DialogEnableWindow(IDC_LOG, m_bBaseOK);
125 DialogEnableWindow(IDC_LOG2, m_bMineOK && m_nChangeTypeMine != CGitDiff::DeleteSubmodule);
126 DialogEnableWindow(IDC_LOG3, m_bTheirsOK && m_nChangeTypeTheirs != CGitDiff::DeleteSubmodule);
128 DialogEnableWindow(IDC_BUTTON_UPDATE2, m_sBaseHash != GIT_REV_ZERO && m_sMineHash != GIT_REV_ZERO &&m_sTheirsHash != GIT_REV_ZERO);
129 DialogEnableWindow(IDC_BUTTON_UPDATE3, m_sBaseHash != GIT_REV_ZERO && m_sMineHash != GIT_REV_ZERO &&m_sTheirsHash != GIT_REV_ZERO);
131 return FALSE;
134 HBRUSH CSubmoduleResolveConflictDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
136 if (nCtlColor == CTLCOLOR_STATIC)
138 if (pWnd->GetDlgCtrlID() == IDC_BASESUBJECT && !m_bBaseOK)
139 return CSubmoduleDiffDlg::GetInvalidBrush(pDC);
141 if (pWnd->GetDlgCtrlID() == IDC_MINESUBJECT && !m_bMineOK)
142 return CSubmoduleDiffDlg::GetInvalidBrush(pDC);
144 if (pWnd->GetDlgCtrlID() == IDC_THEIRSSUBJECT && !m_bTheirsOK)
145 return CSubmoduleDiffDlg::GetInvalidBrush(pDC);
147 if (pWnd->GetDlgCtrlID() == IDC_MINECHANGETYPE && m_nChangeTypeMine != CGitDiff::Identical)
148 return CSubmoduleDiffDlg::GetChangeTypeBrush(pDC, m_nChangeTypeMine);
150 if (pWnd->GetDlgCtrlID() == IDC_THEIRSCHANGETYPE && m_nChangeTypeTheirs != CGitDiff::Identical)
151 return CSubmoduleDiffDlg::GetChangeTypeBrush(pDC, m_nChangeTypeTheirs);
154 return CHorizontalResizableStandAloneDialog::OnCtlColor(pDC, pWnd, nCtlColor);
157 void CSubmoduleResolveConflictDlg::SetDiff(const CString& path, bool revertTheirMy, const CString& baseHash, const CString& baseSubject, bool baseOK, const CString& mineHash, const CString& mineSubject, bool mineOK, CGitDiff::ChangeType mineChangeType, const CString& theirsHash, const CString& theirsSubject, bool theirsOK, CGitDiff::ChangeType theirsChangeType)
159 m_sPath = path;
161 m_sBaseHash = baseHash;
162 m_sBaseSubject = baseSubject;
163 m_bBaseOK = baseOK;
165 m_bRevertTheirMy = revertTheirMy;
167 if (!m_bRevertTheirMy)
169 m_sMineHash = mineHash;
170 m_sMineSubject = mineSubject;
171 m_bMineOK = mineOK;
172 m_nChangeTypeMine = mineChangeType;
174 m_sTheirsHash = theirsHash;
175 m_sTheirsSubject = theirsSubject;
176 m_bTheirsOK = theirsOK;
177 m_nChangeTypeTheirs = theirsChangeType;
179 else
181 m_sMineHash = theirsHash;
182 m_sMineSubject = theirsSubject;
183 m_bMineOK = theirsOK;
184 m_nChangeTypeMine = theirsChangeType;
186 m_sTheirsHash = mineHash;
187 m_sTheirsSubject = mineSubject;
188 m_bTheirsOK = mineOK;
189 m_nChangeTypeTheirs = mineChangeType;
193 void CSubmoduleResolveConflictDlg::ShowLog(CString hash)
195 CString sCmd;
196 sCmd.Format(L"/command:log /path:\"%s\" /endrev:%s", (LPCTSTR)g_Git.CombinePath(m_sPath), (LPCTSTR)hash);
197 CAppUtils::RunTortoiseGitProc(sCmd, false, false);
200 void CSubmoduleResolveConflictDlg::OnBnClickedLog()
202 ShowLog(m_sBaseHash);
205 void CSubmoduleResolveConflictDlg::OnBnClickedLog2()
207 ShowLog(m_sMineHash);
210 void CSubmoduleResolveConflictDlg::OnBnClickedLog3()
212 ShowLog(m_sTheirsHash);
215 void CSubmoduleResolveConflictDlg::Resolve(const CString& path, bool useMine)
217 if (CMessageBox::Show(GetSafeHwnd(), IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO) != IDYES)
218 return;
220 CTGitPath gitpath(path);
221 gitpath.m_Action = CTGitPath::LOGACTIONS_UNMERGED;
222 if (CAppUtils::ResolveConflict(gitpath, useMine ? CAppUtils::RESOLVE_WITH_MINE : CAppUtils::RESOLVE_WITH_THEIRS) == 0)
224 m_bResolved = true;
225 EndDialog(0);
229 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2()
231 Resolve(m_sPath, !m_bRevertTheirMy);
234 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3()
236 Resolve(m_sPath, m_bRevertTheirMy);