Show subpath in Clean Dialog title
[TortoiseGit.git] / src / TortoiseProc / SubmoduleResolveConflictDlg.cpp
blob6efbb572eeaecf79af5c517dbde9365f2f19401a
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2012, 2014 - 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 "AppUtils.h"
22 #include "SubmoduleResolveConflictDlg.h"
23 #include "LoglistCommonResource.h"
24 #include "SubmoduleDiffDlg.h"
25 #include "MessageBox.h"
27 IMPLEMENT_DYNAMIC(CSubmoduleResolveConflictDlg, CHorizontalResizableStandAloneDialog)
28 CSubmoduleResolveConflictDlg::CSubmoduleResolveConflictDlg(CWnd* pParent /*=NULL*/)
29 : CHorizontalResizableStandAloneDialog(CSubmoduleResolveConflictDlg::IDD, pParent)
30 , m_bBaseOK(false)
31 , m_bMineOK(false)
32 , m_bTheirsOK(false)
33 , m_nChangeTypeMine(CGitDiff::Unknown)
34 , m_nChangeTypeTheirs(CGitDiff::Unknown)
35 , m_bRevertTheirMy(false)
36 , m_bResolved(false)
40 CSubmoduleResolveConflictDlg::~CSubmoduleResolveConflictDlg()
44 void CSubmoduleResolveConflictDlg::DoDataExchange(CDataExchange* pDX)
46 CHorizontalResizableStandAloneDialog::DoDataExchange(pDX);
47 DDX_Text(pDX, IDC_BASEHASH, m_sBaseHash);
48 DDX_Text(pDX, IDC_BASESUBJECT, m_sBaseSubject);
49 DDX_Text(pDX, IDC_MINEHASH, m_sMineHash);
50 DDX_Text(pDX, IDC_MINESUBJECT, m_sMineSubject);
51 DDX_Text(pDX, IDC_THEIRSHASH, m_sTheirsHash);
52 DDX_Text(pDX, IDC_THEIRSSUBJECT, m_sTheirsSubject);
55 BEGIN_MESSAGE_MAP(CSubmoduleResolveConflictDlg, CHorizontalResizableStandAloneDialog)
56 ON_BN_CLICKED(IDC_LOG, &OnBnClickedLog)
57 ON_BN_CLICKED(IDC_LOG2, &OnBnClickedLog2)
58 ON_BN_CLICKED(IDC_LOG3, &OnBnClickedLog3)
59 ON_WM_CTLCOLOR()
60 ON_BN_CLICKED(IDC_BUTTON_UPDATE2, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2)
61 ON_BN_CLICKED(IDC_BUTTON_UPDATE3, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3)
62 END_MESSAGE_MAP()
64 BOOL CSubmoduleResolveConflictDlg::OnInitDialog()
66 CHorizontalResizableStandAloneDialog::OnInitDialog();
68 CString sWindowTitle;
69 GetWindowText(sWindowTitle);
70 CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle);
72 AddAnchor(IDC_SUBMODULEDIFFTITLE, TOP_LEFT, TOP_RIGHT);
73 AddAnchor(IDC_STATIC_REVISION, TOP_LEFT);
74 AddAnchor(IDC_STATIC_REVISION2, TOP_LEFT);
75 AddAnchor(IDC_STATIC_REVISION3, TOP_LEFT);
76 AddAnchor(IDC_STATIC_SUBJECT, TOP_LEFT);
77 AddAnchor(IDC_STATIC_SUBJECT2, TOP_LEFT);
78 AddAnchor(IDC_STATIC_SUBJECT3, TOP_LEFT);
79 AddAnchor(IDC_STATIC_CHANGETYPE, TOP_LEFT);
80 AddAnchor(IDC_STATIC_CHANGETYPE2, TOP_LEFT);
82 AddAnchor(IDC_FROMGROUP, TOP_LEFT, TOP_RIGHT);
83 AddAnchor(IDC_TOGROUP, TOP_LEFT, TOP_RIGHT);
84 AddAnchor(IDC_TOGROUP2, TOP_LEFT, TOP_RIGHT);
86 AddAnchor(IDC_LOG, TOP_RIGHT);
87 AddAnchor(IDC_LOG2, TOP_RIGHT);
88 AddAnchor(IDC_LOG3, TOP_RIGHT);
90 AddAnchor(IDC_BASEHASH, TOP_LEFT, TOP_RIGHT);
91 AddAnchor(IDC_BASESUBJECT, TOP_LEFT, TOP_RIGHT);
92 AddAnchor(IDC_MINECHANGETYPE, TOP_LEFT, TOP_RIGHT);
93 AddAnchor(IDC_MINEHASH, TOP_LEFT, TOP_RIGHT);
94 AddAnchor(IDC_MINESUBJECT, TOP_LEFT, TOP_RIGHT);
95 AddAnchor(IDC_THEIRSCHANGETYPE, TOP_LEFT, TOP_RIGHT);
96 AddAnchor(IDC_THEIRSHASH, TOP_LEFT, TOP_RIGHT);
97 AddAnchor(IDC_THEIRSSUBJECT, TOP_LEFT, TOP_RIGHT);
99 EnableSaveRestore(_T("SubmoduleResolveConflictDlg"));
101 CString fsPath = m_sPath;
102 fsPath.Replace('\\', '/');
103 CString title = _T("Submodule \"") + fsPath + _T("\"");
104 GetDlgItem(IDC_SUBMODULEDIFFTITLE)->SetWindowText(title);
106 UpdateData(FALSE);
108 CString changeTypeTable[] =
110 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_UNKNOWN)),
111 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_IDENTICAL)),
112 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_NEWSUBMODULE)),
113 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_DELETESUBMODULE)),
114 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_FASTFORWARD)),
115 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_REWIND)),
116 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_NEWERTIME)),
117 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_OLDERTIME)),
118 CString(MAKEINTRESOURCE(IDS_SUBMODULEDIFF_SAMETIME))
120 GetDlgItem(IDC_MINECHANGETYPE)->SetWindowText(changeTypeTable[m_nChangeTypeMine]);
121 GetDlgItem(IDC_THEIRSCHANGETYPE)->SetWindowText(changeTypeTable[m_nChangeTypeTheirs]);
123 DialogEnableWindow(IDC_LOG, m_bBaseOK);
124 DialogEnableWindow(IDC_LOG2, m_bMineOK && m_nChangeTypeMine != CGitDiff::DeleteSubmodule);
125 DialogEnableWindow(IDC_LOG3, m_bTheirsOK && m_nChangeTypeTheirs != CGitDiff::DeleteSubmodule);
127 DialogEnableWindow(IDC_BUTTON_UPDATE2, m_sBaseHash != GIT_REV_ZERO && m_sMineHash != GIT_REV_ZERO &&m_sTheirsHash != GIT_REV_ZERO);
128 DialogEnableWindow(IDC_BUTTON_UPDATE3, m_sBaseHash != GIT_REV_ZERO && m_sMineHash != GIT_REV_ZERO &&m_sTheirsHash != GIT_REV_ZERO);
130 return FALSE;
133 HBRUSH CSubmoduleResolveConflictDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
135 if (nCtlColor == CTLCOLOR_STATIC)
137 if (pWnd->GetDlgCtrlID() == IDC_BASESUBJECT && !m_bBaseOK)
138 return CSubmoduleDiffDlg::GetInvalidBrush(pDC);
140 if (pWnd->GetDlgCtrlID() == IDC_MINESUBJECT && !m_bMineOK)
141 return CSubmoduleDiffDlg::GetInvalidBrush(pDC);
143 if (pWnd->GetDlgCtrlID() == IDC_THEIRSSUBJECT && !m_bTheirsOK)
144 return CSubmoduleDiffDlg::GetInvalidBrush(pDC);
146 if (pWnd->GetDlgCtrlID() == IDC_MINECHANGETYPE && m_nChangeTypeMine != CGitDiff::Identical)
147 return CSubmoduleDiffDlg::GetChangeTypeBrush(pDC, m_nChangeTypeMine);
149 if (pWnd->GetDlgCtrlID() == IDC_THEIRSCHANGETYPE && m_nChangeTypeTheirs != CGitDiff::Identical)
150 return CSubmoduleDiffDlg::GetChangeTypeBrush(pDC, m_nChangeTypeTheirs);
153 return CHorizontalResizableStandAloneDialog::OnCtlColor(pDC, pWnd, nCtlColor);
156 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)
158 m_sPath = path;
160 m_sBaseHash = baseHash;
161 m_sBaseSubject = baseSubject;
162 m_bBaseOK = baseOK;
164 m_bRevertTheirMy = revertTheirMy;
166 if (!m_bRevertTheirMy)
168 m_sMineHash = mineHash;
169 m_sMineSubject = mineSubject;
170 m_bMineOK = mineOK;
171 m_nChangeTypeMine = mineChangeType;
173 m_sTheirsHash = theirsHash;
174 m_sTheirsSubject = theirsSubject;
175 m_bTheirsOK = theirsOK;
176 m_nChangeTypeTheirs = theirsChangeType;
178 else
180 m_sMineHash = theirsHash;
181 m_sMineSubject = theirsSubject;
182 m_bMineOK = theirsOK;
183 m_nChangeTypeMine = theirsChangeType;
185 m_sTheirsHash = mineHash;
186 m_sTheirsSubject = mineSubject;
187 m_bTheirsOK = mineOK;
188 m_nChangeTypeTheirs = mineChangeType;
192 void CSubmoduleResolveConflictDlg::ShowLog(CString hash)
194 CString sCmd;
195 sCmd.Format(_T("/command:log /path:\"%s\" /endrev:%s"), g_Git.CombinePath(m_sPath), hash);
196 CAppUtils::RunTortoiseGitProc(sCmd, false, false);
199 void CSubmoduleResolveConflictDlg::OnBnClickedLog()
201 ShowLog(m_sBaseHash);
204 void CSubmoduleResolveConflictDlg::OnBnClickedLog2()
206 ShowLog(m_sMineHash);
209 void CSubmoduleResolveConflictDlg::OnBnClickedLog3()
211 ShowLog(m_sTheirsHash);
214 void CSubmoduleResolveConflictDlg::Resolve(const CString& path, bool useMine)
216 if (CMessageBox::Show(GetSafeHwnd(), IDS_PROC_RESOLVE, IDS_APPNAME, MB_ICONQUESTION | MB_YESNO) != IDYES)
217 return;
219 CTGitPath gitpath(path);
220 gitpath.m_Action = CTGitPath::LOGACTIONS_UNMERGED;
221 if (CAppUtils::ResolveConflict(gitpath, useMine ? CAppUtils::RESOLVE_WITH_MINE : CAppUtils::RESOLVE_WITH_THEIRS) == 0)
223 m_bResolved = true;
224 EndDialog(0);
228 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2()
230 Resolve(m_sPath, !m_bRevertTheirMy);
233 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3()
235 Resolve(m_sPath, m_bRevertTheirMy);