1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2013 - 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 // ImportPatchDlg.cpp : implementation file
23 #include "TortoiseProc.h"
24 #include "ImportPatchDlg.h"
26 #include "MessageBox.h"
28 #include "SmartHandle.h"
30 // CImportPatchDlg dialog
32 IMPLEMENT_DYNAMIC(CImportPatchDlg
, CResizableStandAloneDialog
)
34 CImportPatchDlg::CImportPatchDlg(CWnd
* pParent
/*=NULL*/)
35 : CResizableStandAloneDialog(CImportPatchDlg::IDD
, pParent
)
37 m_cList
.m_ContextMenuMask
&=~ m_cList
.GetMenuMask(CPatchListCtrl::MENU_APPLY
);
41 m_bExitThread
= false;
42 m_bThreadRunning
=false;
46 m_bAddSignedOffBy
= FALSE
;
50 CImportPatchDlg::~CImportPatchDlg()
55 void CImportPatchDlg::DoDataExchange(CDataExchange
* pDX
)
57 CDialog::DoDataExchange(pDX
);
58 DDX_Control(pDX
, IDC_LIST_PATCH
,m_cList
);
59 DDX_Control(pDX
, IDC_AM_SPLIT
, m_wndSplitter
);
60 DDX_Check(pDX
, IDC_CHECK_3WAY
, m_b3Way
);
61 DDX_Check(pDX
, IDC_CHECK_IGNORE_SPACE
, m_bIgnoreSpace
);
62 DDX_Check(pDX
, IDC_SIGN_OFF
, m_bAddSignedOffBy
);
63 DDX_Check(pDX
, IDC_KEEP_CR
, m_bKeepCR
);
66 void CImportPatchDlg::AddAmAnchor()
68 AddAnchor(IDC_AM_TAB
,TOP_LEFT
,BOTTOM_RIGHT
);
69 AddAnchor(IDC_LIST_PATCH
, TOP_LEFT
, TOP_RIGHT
);
70 AddAnchor(IDC_AM_SPLIT
, TOP_LEFT
, TOP_RIGHT
);
71 AddAnchor(IDC_BUTTON_ADD
, TOP_RIGHT
);
72 AddAnchor(IDC_BUTTON_UP
, TOP_RIGHT
);
73 AddAnchor(IDC_BUTTON_DOWN
, TOP_RIGHT
);
74 AddAnchor(IDC_BUTTON_REMOVE
, TOP_RIGHT
);
76 AddAnchor(IDOK
,BOTTOM_RIGHT
);
77 AddAnchor(IDCANCEL
,BOTTOM_RIGHT
);
78 AddAnchor(IDHELP
, BOTTOM_RIGHT
);
80 AddAnchor(IDC_AM_DUMY_TAB
, TOP_LEFT
, BOTTOM_RIGHT
);
82 this->AddOthersToAnchor();
85 void CImportPatchDlg::SetSplitterRange()
87 if ((m_cList
)&&(m_ctrlTabCtrl
))
90 m_cList
.GetWindowRect(rcTop
);
91 ScreenToClient(rcTop
);
93 m_ctrlTabCtrl
.GetWindowRect(rcMiddle
);
94 ScreenToClient(rcMiddle
);
95 if (rcMiddle
.Height() && rcMiddle
.Width())
96 m_wndSplitter
.SetRange(rcTop
.top
+160, rcMiddle
.bottom
-160);
100 BOOL
CImportPatchDlg::OnInitDialog()
102 CResizableStandAloneDialog::OnInitDialog();
103 CAppUtils::MarkWindowAsUnpinnable(m_hWnd
);
105 // Let the TaskbarButtonCreated message through the UIPI filter. If we don't
106 // do this, Explorer would be unable to send that message to our window if we
107 // were running elevated. It's OK to make the call all the time, since if we're
108 // not elevated, this is a no-op.
109 CHANGEFILTERSTRUCT cfs
= { sizeof(CHANGEFILTERSTRUCT
) };
110 typedef BOOL STDAPICALLTYPE
ChangeWindowMessageFilterExDFN(HWND hWnd
, UINT message
, DWORD action
, PCHANGEFILTERSTRUCT pChangeFilterStruct
);
111 CAutoLibrary hUser
= AtlLoadSystemLibraryUsingFullPath(_T("user32.dll"));
114 ChangeWindowMessageFilterExDFN
*pfnChangeWindowMessageFilterEx
= (ChangeWindowMessageFilterExDFN
*)GetProcAddress(hUser
, "ChangeWindowMessageFilterEx");
115 if (pfnChangeWindowMessageFilterEx
)
117 pfnChangeWindowMessageFilterEx(m_hWnd
, WM_TASKBARBTNCREATED
, MSGFLT_ALLOW
, &cfs
);
120 m_pTaskbarList
.Release();
121 if (FAILED(m_pTaskbarList
.CoCreateInstance(CLSID_TaskbarList
)))
122 m_pTaskbarList
= nullptr;
126 GetClientRect(m_DlgOrigRect
);
127 m_cList
.GetClientRect(m_PatchListOrigRect
);
129 CWnd
*pwnd
=this->GetDlgItem(IDC_AM_DUMY_TAB
);
130 pwnd
->GetWindowRect(&rectDummy
);
131 this->ScreenToClient(rectDummy
);
133 if (!m_ctrlTabCtrl
.Create(CMFCTabCtrl::STYLE_FLAT
, rectDummy
, this, IDC_AM_TAB
))
135 TRACE0("Failed to create output tab window\n");
136 return FALSE
; // fail to create
138 m_ctrlTabCtrl
.SetResizeMode(CMFCTabCtrl::RESIZE_NO
);
139 // Create output panes:
140 //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
141 DWORD dwStyle
=LVS_REPORT
| LVS_SHOWSELALWAYS
| LVS_ALIGNLEFT
| WS_BORDER
| WS_TABSTOP
|LVS_SINGLESEL
|WS_CHILD
| WS_VISIBLE
;
143 if( ! this->m_PatchCtrl
.Create(_T("Scintilla"),_T("source"),0,rectDummy
,&m_ctrlTabCtrl
,0,0) )
145 TRACE0("Failed to create log message control");
149 m_PatchCtrl
.Call(SCI_SETREADONLY
, TRUE
);
150 m_PatchCtrl
.SetUDiffStyle();
152 dwStyle
= LBS_NOINTEGRALHEIGHT
| WS_CHILD
| WS_VISIBLE
| WS_HSCROLL
| WS_VSCROLL
;
154 if (!m_wndOutput
.Create(_T("Scintilla"),_T("source"),0,rectDummy
, &m_ctrlTabCtrl
, 0,0) )
156 TRACE0("Failed to create output windows\n");
157 return -1; // fail to create
160 m_wndOutput
.Call(SCI_SETREADONLY
, TRUE
);
162 m_tooltips
.Create(this);
164 m_tooltips
.AddTool(IDC_CHECK_3WAY
,IDS_AM_3WAY_TT
);
165 m_tooltips
.AddTool(IDC_CHECK_IGNORE_SPACE
,IDS_AM_IGNORE_SPACE_TT
);
167 m_ctrlTabCtrl
.AddTab(&m_PatchCtrl
, CString(MAKEINTRESOURCE(IDS_PATCH
)), 0);
168 m_ctrlTabCtrl
.AddTab(&m_wndOutput
, CString(MAKEINTRESOURCE(IDS_LOG
)), 1);
171 AdjustControlSize(IDC_CHECK_3WAY
);
172 AdjustControlSize(IDC_CHECK_IGNORE_SPACE
);
173 AdjustControlSize(IDC_SIGN_OFF
);
174 AdjustControlSize(IDC_KEEP_CR
);
176 m_PathList
.SortByPathname(true);
177 m_cList
.SetExtendedStyle( m_cList
.GetExtendedStyle()| LVS_EX_CHECKBOXES
);
179 for (int i
= 0; i
< m_PathList
.GetCount(); ++i
)
181 m_cList
.InsertItem(0,m_PathList
[i
].GetWinPath());
182 m_cList
.SetCheck(0,true);
185 DWORD yPos
= CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\AMDlgSizer"));
186 RECT rcDlg
, rcLogMsg
, rcFileList
;
187 GetClientRect(&rcDlg
);
188 m_cList
.GetWindowRect(&rcLogMsg
);
189 ScreenToClient(&rcLogMsg
);
190 this->m_ctrlTabCtrl
.GetWindowRect(&rcFileList
);
191 ScreenToClient(&rcFileList
);
195 m_wndSplitter
.GetWindowRect(&rectSplitter
);
196 ScreenToClient(&rectSplitter
);
197 int delta
= yPos
- rectSplitter
.top
;
198 if ((rcLogMsg
.bottom
+ delta
> rcLogMsg
.top
)&&(rcLogMsg
.bottom
+ delta
< rcFileList
.bottom
- 30))
200 m_wndSplitter
.SetWindowPos(NULL
, 0, yPos
, 0, 0, SWP_NOSIZE
);
205 CAppUtils::SetListCtrlBackgroundImage(m_cList
.GetSafeHwnd(), IDI_IMPORTPATHCES_BKG
);
207 CString sWindowTitle
;
208 GetWindowText(sWindowTitle
);
209 CAppUtils::SetWindowTitle(m_hWnd
, g_Git
.m_CurrentDir
, sWindowTitle
);
211 EnableSaveRestore(_T("ImportDlg"));
218 BEGIN_MESSAGE_MAP(CImportPatchDlg
, CResizableStandAloneDialog
)
219 ON_LBN_SELCHANGE(IDC_LIST_PATCH
, &CImportPatchDlg::OnLbnSelchangeListPatch
)
220 ON_BN_CLICKED(IDC_BUTTON_ADD
, &CImportPatchDlg::OnBnClickedButtonAdd
)
221 ON_BN_CLICKED(IDC_BUTTON_UP
, &CImportPatchDlg::OnBnClickedButtonUp
)
222 ON_BN_CLICKED(IDC_BUTTON_DOWN
, &CImportPatchDlg::OnBnClickedButtonDown
)
223 ON_BN_CLICKED(IDC_BUTTON_REMOVE
, &CImportPatchDlg::OnBnClickedButtonRemove
)
224 ON_BN_CLICKED(IDOK
, &CImportPatchDlg::OnBnClickedOk
)
226 ON_BN_CLICKED(IDCANCEL
, &CImportPatchDlg::OnBnClickedCancel
)
227 ON_NOTIFY(LVN_ITEMCHANGED
, IDC_LIST_PATCH
, &CImportPatchDlg::OnHdnItemchangedListPatch
)
228 ON_REGISTERED_MESSAGE(WM_TASKBARBTNCREATED
, OnTaskbarBtnCreated
)
232 // CImportPatchDlg message handlers
234 void CImportPatchDlg::OnLbnSelchangeListPatch()
236 if(m_cList
.GetSelectedCount() == 0)
238 this->GetDlgItem(IDC_BUTTON_UP
)->EnableWindow(FALSE
);
239 this->GetDlgItem(IDC_BUTTON_DOWN
)->EnableWindow(FALSE
);
240 this->GetDlgItem(IDC_BUTTON_REMOVE
)->EnableWindow(FALSE
);
244 this->GetDlgItem(IDC_BUTTON_UP
)->EnableWindow(TRUE
);
245 this->GetDlgItem(IDC_BUTTON_DOWN
)->EnableWindow(TRUE
);
246 this->GetDlgItem(IDC_BUTTON_REMOVE
)->EnableWindow(TRUE
);
250 void CImportPatchDlg::OnBnClickedButtonAdd()
252 CFileDialog
dlg(TRUE
,NULL
,
254 OFN_HIDEREADONLY
| OFN_OVERWRITEPROMPT
|OFN_ALLOWMULTISELECT
,
255 CString(MAKEINTRESOURCE(IDS_PATCHFILEFILTER
)));
256 dlg
.m_ofn
.nMaxFile
= 65536;
257 std::unique_ptr
<TCHAR
[]> path(new TCHAR
[dlg
.m_ofn
.nMaxFile
]);
258 SecureZeroMemory(path
.get(), dlg
.m_ofn
.nMaxFile
);
259 dlg
.m_ofn
.lpstrFile
= path
.get();
260 INT_PTR ret
= dlg
.DoModal();
261 SetCurrentDirectory(g_Git
.m_CurrentDir
);
265 pos
= dlg
.GetStartPosition();
268 CString file
= dlg
.GetNextPathName(pos
);
272 int index
= m_cList
.InsertItem(m_cList
.GetItemCount(), file
);
274 m_cList
.SetCheck(index
, true);
280 void CImportPatchDlg::OnBnClickedButtonUp()
283 pos
= m_cList
.GetFirstSelectedItemPosition();
285 // do nothing if the first selected item is the first item in the list
286 if (m_cList
.GetNextSelectedItem(pos
) == 0)
289 pos
= m_cList
.GetFirstSelectedItemPosition();
293 int index
= m_cList
.GetNextSelectedItem(pos
);
296 CString old
= m_cList
.GetItemText(index
, 0);
297 BOOL oldState
= m_cList
.GetCheck(index
);
298 m_cList
.DeleteItem(index
);
299 m_cList
.InsertItem(index
- 1, old
);
300 m_cList
.SetCheck(index
- 1, oldState
);
301 m_cList
.SetItemState(index
- 1, LVIS_SELECTED
, LVIS_SELECTED
);
302 m_cList
.SetItemState(index
, 0, LVIS_SELECTED
);
308 void CImportPatchDlg::OnBnClickedButtonDown()
310 if (m_cList
.GetSelectedCount() == 0)
314 pos
= m_cList
.GetFirstSelectedItemPosition();
315 // use an array to store all selected item indexes; the user won't select too much items
317 indexes
= new int[m_cList
.GetSelectedCount()];
321 indexes
[i
++] = m_cList
.GetNextSelectedItem(pos
);
324 // don't move any item if the last selected item is the last item in the m_CommitList
325 // (that would change the order of the selected items)
326 if(indexes
[m_cList
.GetSelectedCount() - 1] < m_cList
.GetItemCount() - 1)
328 // iterate over the indexes backwards in order to correctly move multiselected items
329 for (i
= m_cList
.GetSelectedCount() - 1; i
>= 0; i
--)
331 int index
= indexes
[i
];
332 CString old
= m_cList
.GetItemText(index
, 0);
333 BOOL oldState
= m_cList
.GetCheck(index
);
334 m_cList
.DeleteItem(index
);
335 m_cList
.InsertItem(index
+ 1, old
);
336 m_cList
.SetCheck(index
+ 1, oldState
);
337 m_cList
.SetItemState(index
+ 1, LVIS_SELECTED
, LVIS_SELECTED
);
338 m_cList
.SetItemState(index
, 0, LVIS_SELECTED
);
345 void CImportPatchDlg::OnBnClickedButtonRemove()
348 pos
= m_cList
.GetFirstSelectedItemPosition();
351 int index
= m_cList
.GetNextSelectedItem(pos
);
352 m_cList
.DeleteItem(index
);
353 pos
= m_cList
.GetFirstSelectedItemPosition();
357 UINT
CImportPatchDlg::PatchThread()
360 path
.SetFromWin(g_Git
.m_CurrentDir
);
363 UpdateOkCancelText();
364 for (i
= m_CurrentItem
; i
< m_cList
.GetItemCount(); ++i
)
368 m_pTaskbarList
->SetProgressState(m_hWnd
, TBPF_NORMAL
);
369 m_pTaskbarList
->SetProgressValue(m_hWnd
, i
, m_cList
.GetItemCount());
372 m_cList
.SetItemData(i
, CPatchListCtrl::STATUS_APPLYING
|m_cList
.GetItemData(i
));
375 this->m_cList
.GetItemRect(i
,&rect
,LVIR_BOUNDS
);
376 this->m_cList
.InvalidateRect(rect
);
381 if(m_cList
.GetCheck(i
))
385 while(path
.HasRebaseApply())
388 m_pTaskbarList
->SetProgressState(m_hWnd
, TBPF_ERROR
);
390 int ret
= CMessageBox::Show(NULL
, IDS_PROC_APPLYPATCH_REBASEDIRFOUND
,
392 1, IDI_ERROR
, IDS_ABORTBUTTON
, IDS_SKIPBUTTON
, IDS_RESOLVEDBUTTON
);
397 cmd
= _T("git.exe am --abort");
400 cmd
= _T("git.exe am --skip");
404 cmd
= _T("git.exe am --resolved");
411 m_bExitThread
= TRUE
;
415 this->AddLogString(cmd
);
417 if (g_Git
.Run(cmd
, &output
, CP_UTF8
))
419 this->AddLogString(output
);
420 this->AddLogString(CString(MAKEINTRESOURCE(IDS_FAIL
)));
424 this->AddLogString(CString(MAKEINTRESOURCE(IDS_DONE
)));
431 cmd
= _T("git.exe am ");
433 if(this->m_bAddSignedOffBy
)
434 cmd
+= _T("--signoff ");
437 cmd
+= _T("--3way ");
439 if(this->m_bIgnoreSpace
)
440 cmd
+= _T("--ignore-space-change ");
443 cmd
+= _T("--keep-cr ");
446 cmd
+= m_cList
.GetItemText(i
,0);
449 this->AddLogString(cmd
);
451 if (g_Git
.Run(cmd
, &output
, CP_UTF8
))
453 //keep STATUS_APPLYING to let user retry failed patch
454 m_cList
.SetItemData(i
, CPatchListCtrl::STATUS_APPLY_FAIL
|CPatchListCtrl::STATUS_APPLYING
);
455 this->AddLogString(output
);
456 this->AddLogString(CString(MAKEINTRESOURCE(IDS_FAIL
)));
458 m_pTaskbarList
->SetProgressState(m_hWnd
, TBPF_ERROR
);
464 m_cList
.SetItemData(i
, CPatchListCtrl::STATUS_APPLY_SUCCESS
);
465 this->AddLogString(CString(MAKEINTRESOURCE(IDS_SUCCESS
)));
472 sMessage
.Format(IDS_PROC_SKIPPATCH
, m_cList
.GetItemText(i
,0));
473 AddLogString(sMessage
);
474 m_cList
.SetItemData(i
, CPatchListCtrl::STATUS_APPLY_SKIP
);
477 m_cList
.SetItemData(m_CurrentItem
, (~CPatchListCtrl::STATUS_APPLYING
)&m_cList
.GetItemData(i
));
480 this->m_cList
.GetItemRect(i
,&rect
,LVIR_BOUNDS
);
481 this->m_cList
.InvalidateRect(rect
);
483 UpdateOkCancelText();
486 //in case am fail, need refresh finial item status
488 this->m_cList
.GetItemRect(i
,&rect
,LVIR_BOUNDS
);
489 this->m_cList
.InvalidateRect(rect
);
491 this->m_cList
.GetItemRect(m_CurrentItem
,&rect
,LVIR_BOUNDS
);
492 this->m_cList
.InvalidateRect(rect
);
496 m_pTaskbarList
->SetProgressValue(m_hWnd
, m_CurrentItem
, m_cList
.GetItemCount());
497 if (m_bExitThread
&& m_CurrentItem
!= m_cList
.GetItemCount())
498 m_pTaskbarList
->SetProgressState(m_hWnd
, TBPF_PAUSED
);
499 else if (!m_bExitThread
&& m_CurrentItem
== m_cList
.GetItemCount())
500 m_pTaskbarList
->SetProgressState(m_hWnd
, TBPF_NORMAL
);
503 EnableInputCtrl(true);
504 InterlockedExchange(&m_bThreadRunning
, FALSE
);
505 UpdateOkCancelText();
509 void CImportPatchDlg::OnBnClickedOk()
522 m_ctrlTabCtrl
.SetActiveTab(1);
524 EnableInputCtrl(false);
525 InterlockedExchange(&m_bThreadRunning
, TRUE
);
526 InterlockedExchange(&this->m_bExitThread
, FALSE
);
527 if ( (m_LoadingThread
=AfxBeginThread(ThreadEntry
, this)) ==NULL
)
529 InterlockedExchange(&m_bThreadRunning
, FALSE
);
530 CMessageBox::Show(NULL
, IDS_ERR_THREADSTARTFAILED
, IDS_APPNAME
, MB_OK
| MB_ICONERROR
);
535 void CImportPatchDlg::DoSize(int delta
)
537 this->RemoveAllAnchors();
539 CSplitterControl::ChangeHeight(GetDlgItem(IDC_LIST_PATCH
), delta
, CW_TOPALIGN
);
540 //CSplitterControl::ChangeHeight(GetDlgItem(), delta, CW_TOPALIGN);
541 CSplitterControl::ChangeHeight(GetDlgItem(IDC_AM_TAB
), -delta
, CW_BOTTOMALIGN
);
542 //CSplitterControl::ChangeHeight(GetDlgItem(), -delta, CW_BOTTOMALIGN);
543 CSplitterControl::ChangePos(GetDlgItem(IDC_CHECK_3WAY
), 0, delta
);
544 CSplitterControl::ChangePos(GetDlgItem(IDC_CHECK_IGNORE_SPACE
), 0, delta
);
545 CSplitterControl::ChangePos(GetDlgItem(IDC_SIGN_OFF
), 0, delta
);
546 CSplitterControl::ChangePos(GetDlgItem(IDC_KEEP_CR
), 0, delta
);
549 // adjust the minimum size of the dialog to prevent the resizing from
550 // moving the list control too far down.
552 m_cList
.GetClientRect(rcLogMsg
);
553 SetMinTrackSize(CSize(m_DlgOrigRect
.Width(), m_DlgOrigRect
.Height()-m_PatchListOrigRect
.Height()+rcLogMsg
.Height()));
556 // m_CommitList.Invalidate();
558 // GetDlgItem(IDC_LOGMESSAGE)->Invalidate();
560 this->m_ctrlTabCtrl
.Invalidate();
563 void CImportPatchDlg::OnSize(UINT nType
, int cx
, int cy
)
565 CResizableStandAloneDialog::OnSize(nType
, cx
, cy
);
570 LRESULT
CImportPatchDlg::DefWindowProc(UINT message
, WPARAM wParam
, LPARAM lParam
)
574 if (wParam
== IDC_AM_SPLIT
)
576 SPC_NMHDR
* pHdr
= (SPC_NMHDR
*) lParam
;
582 return CResizableStandAloneDialog::DefWindowProc(message
, wParam
, lParam
);
585 void CImportPatchDlg::SaveSplitterPos()
589 CRegDWORD regPos
= CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\AMDlgSizer"));
591 m_wndSplitter
.GetWindowRect(&rectSplitter
);
592 ScreenToClient(&rectSplitter
);
593 regPos
= rectSplitter
.top
;
599 void CImportPatchDlg::EnableInputCtrl(BOOL b
)
601 this->GetDlgItem(IDC_BUTTON_UP
)->EnableWindow(b
);
602 this->GetDlgItem(IDC_BUTTON_DOWN
)->EnableWindow(b
);
603 this->GetDlgItem(IDC_BUTTON_REMOVE
)->EnableWindow(b
);
604 this->GetDlgItem(IDC_BUTTON_ADD
)->EnableWindow(b
);
605 this->GetDlgItem(IDOK
)->EnableWindow(b
);
608 void CImportPatchDlg::UpdateOkCancelText()
610 if (this->m_bThreadRunning
&& !IsFinish())
612 this->GetDlgItem(IDOK
)->EnableWindow(FALSE
);
613 this->GetDlgItem(IDCANCEL
)->SetWindowText(CString(MAKEINTRESOURCE(IDS_ABORTBUTTON
)));
615 else if (!IsFinish())
617 this->GetDlgItem(IDOK
)->EnableWindow(TRUE
);
621 this->GetDlgItem(IDCANCEL
)->EnableWindow(FALSE
);
622 this->GetDlgItem(IDOK
)->SetWindowText(CString(MAKEINTRESOURCE(IDS_OKBUTTON
)));
625 void CImportPatchDlg::OnBnClickedCancel()
627 if(this->m_bThreadRunning
)
629 InterlockedExchange(&m_bExitThread
,TRUE
);
634 path
.SetFromWin(g_Git
.m_CurrentDir
);
635 if(path
.HasRebaseApply())
636 if(CMessageBox::Show(NULL
, IDS_PROC_APPLYPATCH_GITAMACTIVE
, IDS_APPNAME
, MB_YESNO
| MB_ICONQUESTION
) == IDYES
)
639 if (g_Git
.Run(_T("git.exe am --abort"), &output
, CP_UTF8
))
640 MessageBox(output
, _T("TortoiseGit"), MB_OK
| MB_ICONERROR
);
646 void CImportPatchDlg::AddLogString(CString str
)
648 this->m_wndOutput
.SendMessage(SCI_SETREADONLY
, FALSE
);
649 CStringA sTextA
= m_wndOutput
.StringForControl(str
);//CUnicodeUtils::GetUTF8(str);
650 this->m_wndOutput
.SendMessage(SCI_REPLACESEL
, 0, (LPARAM
)(LPCSTR
)sTextA
);
651 this->m_wndOutput
.SendMessage(SCI_REPLACESEL
, 0, (LPARAM
)(LPCSTR
)"\n");
652 this->m_wndOutput
.SendMessage(SCI_SETREADONLY
, TRUE
);
653 //this->m_wndOutput.SendMessage(SCI_LINESCROLL,0,0x7FFFFFFF);
655 BOOL
CImportPatchDlg::PreTranslateMessage(MSG
* pMsg
)
657 if (pMsg
->message
== WM_KEYDOWN
)
659 switch (pMsg
->wParam
)
662 /* Avoid TAB control destroy but dialog exist*/
667 ::GetClassName(pMsg
->hwnd
,buff
,128);
669 if(_tcsnicmp(buff
,_T("RichEdit20W"),128)==0 ||
670 _tcsnicmp(buff
,_T("Scintilla"),128)==0 ||
671 _tcsnicmp(buff
,_T("SysListView32"),128)==0||
672 ::GetParent(pMsg
->hwnd
) == this->m_ctrlTabCtrl
.m_hWnd
)
674 this->PostMessage(WM_KEYDOWN
,VK_ESCAPE
,0);
680 m_tooltips
.RelayEvent(pMsg
);
681 return CResizableStandAloneDialog::PreTranslateMessage(pMsg
);
684 void CImportPatchDlg::OnHdnItemchangedListPatch(NMHDR
* /*pNMHDR*/, LRESULT
*pResult
)
688 if(this->m_cList
.GetSelectedCount() != 1)
690 m_PatchCtrl
.SendMessage(SCI_SETREADONLY
, FALSE
);
691 m_PatchCtrl
.SetText(CString());
692 m_PatchCtrl
.SendMessage(SCI_SETREADONLY
, TRUE
);
699 pos
= m_cList
.GetFirstSelectedItemPosition();
700 int selected
= m_cList
.GetNextSelectedItem(pos
);
702 if(selected
>=0&& selected
< m_cList
.GetItemCount())
704 CString str
= m_cList
.GetItemText(selected
,0);
705 m_PatchCtrl
.SendMessage(SCI_SETREADONLY
, FALSE
);
706 m_PatchCtrl
.SetText(text
);
707 m_PatchCtrl
.LoadFromFile(str
);
708 m_PatchCtrl
.SendMessage(SCI_SETREADONLY
, TRUE
);
713 m_PatchCtrl
.SendMessage(SCI_SETREADONLY
, FALSE
);
714 m_PatchCtrl
.SetText(text
);
715 m_PatchCtrl
.SendMessage(SCI_SETREADONLY
, TRUE
);
720 LRESULT
CImportPatchDlg::OnTaskbarBtnCreated(WPARAM
/*wParam*/, LPARAM
/*lParam*/)
722 m_pTaskbarList
.Release();
723 m_pTaskbarList
.CoCreateInstance(CLSID_TaskbarList
);