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.
20 #include "TortoiseProc.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
)
33 , m_nChangeTypeMine(CGitDiff::Unknown
)
34 , m_nChangeTypeTheirs(CGitDiff::Unknown
)
35 , m_bRevertTheirMy(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
)
60 ON_BN_CLICKED(IDC_BUTTON_UPDATE2
, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2
)
61 ON_BN_CLICKED(IDC_BUTTON_UPDATE3
, &CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3
)
64 BOOL
CSubmoduleResolveConflictDlg::OnInitDialog()
66 CHorizontalResizableStandAloneDialog::OnInitDialog();
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
);
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
);
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
)
160 m_sBaseHash
= baseHash
;
161 m_sBaseSubject
= baseSubject
;
164 m_bRevertTheirMy
= revertTheirMy
;
166 if (!m_bRevertTheirMy
)
168 m_sMineHash
= mineHash
;
169 m_sMineSubject
= mineSubject
;
171 m_nChangeTypeMine
= mineChangeType
;
173 m_sTheirsHash
= theirsHash
;
174 m_sTheirsSubject
= theirsSubject
;
175 m_bTheirsOK
= theirsOK
;
176 m_nChangeTypeTheirs
= theirsChangeType
;
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
)
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
)
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)
228 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate2()
230 Resolve(m_sPath
, !m_bRevertTheirMy
);
233 void CSubmoduleResolveConflictDlg::OnBnClickedButtonUpdate3()
235 Resolve(m_sPath
, m_bRevertTheirMy
);