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.
20 #include "TortoiseProc.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
)
34 , m_nChangeTypeMine(CGitDiff::Unknown
)
35 , m_nChangeTypeTheirs(CGitDiff::Unknown
)
36 , m_bRevertTheirMy(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
)
61 ON_BN_CLICKED(IDC_BUTTON_UPDATE2
, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2
)
62 ON_BN_CLICKED(IDC_BUTTON_UPDATE3
, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3
)
65 BOOL
CSubmoduleResolveConflictDlg::OnInitDialog()
67 CHorizontalResizableStandAloneDialog::OnInitDialog();
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
);
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
);
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
)
161 m_sBaseHash
= baseHash
;
162 m_sBaseSubject
= baseSubject
;
165 m_bRevertTheirMy
= revertTheirMy
;
167 if (!m_bRevertTheirMy
)
169 m_sMineHash
= mineHash
;
170 m_sMineSubject
= mineSubject
;
172 m_nChangeTypeMine
= mineChangeType
;
174 m_sTheirsHash
= theirsHash
;
175 m_sTheirsSubject
= theirsSubject
;
176 m_bTheirsOK
= theirsOK
;
177 m_nChangeTypeTheirs
= theirsChangeType
;
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
)
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
)
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)
229 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2()
231 Resolve(m_sPath
, !m_bRevertTheirMy
);
234 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3()
236 Resolve(m_sPath
, m_bRevertTheirMy
);