optimized taskbar status indicator
[TortoiseGit.git] / src / TortoiseProc / ImportPatchDlg.cpp
blob048e5082f7b0927560ef306f51961d5ecd8d8411
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2011 - 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
22 #include "stdafx.h"
23 #include "TortoiseProc.h"
24 #include "ImportPatchDlg.h"
25 #include "git.h"
26 #include "MessageBox.h"
27 #include "AppUtils.h"
29 // CImportPatchDlg dialog
31 IMPLEMENT_DYNAMIC(CImportPatchDlg, CResizableStandAloneDialog)
33 CImportPatchDlg::CImportPatchDlg(CWnd* pParent /*=NULL*/)
34 : CResizableStandAloneDialog(CImportPatchDlg::IDD, pParent)
36 m_cList.m_ContextMenuMask &=~ m_cList.GetMenuMask(CPatchListCtrl::MENU_APPLY);
38 m_CurrentItem =0;
40 m_bExitThread = false;
41 m_bThreadRunning =false;
43 m_b3Way = 1;
44 m_bIgnoreSpace = 1;
45 m_bAddSignedOffBy = FALSE;
46 m_bKeepCR = TRUE;
49 CImportPatchDlg::~CImportPatchDlg()
54 void CImportPatchDlg::DoDataExchange(CDataExchange* pDX)
56 CDialog::DoDataExchange(pDX);
57 DDX_Control(pDX, IDC_LIST_PATCH,m_cList);
58 DDX_Control(pDX, IDC_AM_SPLIT, m_wndSplitter);
59 DDX_Check(pDX, IDC_CHECK_3WAY, m_b3Way);
60 DDX_Check(pDX, IDC_CHECK_IGNORE_SPACE, m_bIgnoreSpace);
61 DDX_Check(pDX, IDC_SIGN_OFF, m_bAddSignedOffBy);
62 DDX_Check(pDX, IDC_KEEP_CR, m_bKeepCR);
65 void CImportPatchDlg::AddAmAnchor()
67 AddAnchor(IDC_AM_TAB,TOP_LEFT,BOTTOM_RIGHT);
68 AddAnchor(IDC_LIST_PATCH, TOP_LEFT, TOP_RIGHT);
69 AddAnchor(IDC_AM_SPLIT, TOP_LEFT, TOP_RIGHT);
70 AddAnchor(IDC_BUTTON_ADD, TOP_RIGHT);
71 AddAnchor(IDC_BUTTON_UP, TOP_RIGHT);
72 AddAnchor(IDC_BUTTON_DOWN, TOP_RIGHT);
73 AddAnchor(IDC_BUTTON_REMOVE, TOP_RIGHT);
75 AddAnchor(IDOK,BOTTOM_RIGHT);
76 AddAnchor(IDCANCEL,BOTTOM_RIGHT);
77 AddAnchor(IDHELP, BOTTOM_RIGHT);
79 AddAnchor(IDC_AM_DUMY_TAB, TOP_LEFT, BOTTOM_RIGHT);
81 this->AddOthersToAnchor();
84 void CImportPatchDlg::SetSplitterRange()
86 if ((m_cList)&&(m_ctrlTabCtrl))
88 CRect rcTop;
89 m_cList.GetWindowRect(rcTop);
90 ScreenToClient(rcTop);
91 CRect rcMiddle;
92 m_ctrlTabCtrl.GetWindowRect(rcMiddle);
93 ScreenToClient(rcMiddle);
94 if (rcMiddle.Height() && rcMiddle.Width())
95 m_wndSplitter.SetRange(rcTop.top+160, rcMiddle.bottom-160);
99 BOOL CImportPatchDlg::OnInitDialog()
101 CResizableStandAloneDialog::OnInitDialog();
102 CAppUtils::MarkWindowAsUnpinnable(m_hWnd);
104 // Let the TaskbarButtonCreated message through the UIPI filter. If we don't
105 // do this, Explorer would be unable to send that message to our window if we
106 // were running elevated. It's OK to make the call all the time, since if we're
107 // not elevated, this is a no-op.
108 CHANGEFILTERSTRUCT cfs = { sizeof(CHANGEFILTERSTRUCT) };
109 typedef BOOL STDAPICALLTYPE ChangeWindowMessageFilterExDFN(HWND hWnd, UINT message, DWORD action, PCHANGEFILTERSTRUCT pChangeFilterStruct);
110 HMODULE hUser = ::LoadLibrary(_T("user32.dll"));
111 if (hUser)
113 ChangeWindowMessageFilterExDFN *pfnChangeWindowMessageFilterEx = (ChangeWindowMessageFilterExDFN*)GetProcAddress(hUser, "ChangeWindowMessageFilterEx");
114 if (pfnChangeWindowMessageFilterEx)
116 pfnChangeWindowMessageFilterEx(m_hWnd, WM_TASKBARBTNCREATED, MSGFLT_ALLOW, &cfs);
118 FreeLibrary(hUser);
120 m_pTaskbarList.Release();
121 m_pTaskbarList.CoCreateInstance(CLSID_TaskbarList);
123 CRect rectDummy;
125 GetClientRect(m_DlgOrigRect);
126 m_cList.GetClientRect(m_PatchListOrigRect);
128 CWnd *pwnd=this->GetDlgItem(IDC_AM_DUMY_TAB);
129 pwnd->GetWindowRect(&rectDummy);
130 this->ScreenToClient(rectDummy);
132 if (!m_ctrlTabCtrl.Create(CMFCTabCtrl::STYLE_FLAT, rectDummy, this, IDC_AM_TAB))
134 TRACE0("Failed to create output tab window\n");
135 return FALSE; // fail to create
137 m_ctrlTabCtrl.SetResizeMode(CMFCTabCtrl::RESIZE_NO);
138 // Create output panes:
139 //const DWORD dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
140 DWORD dwStyle =LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP |LVS_SINGLESEL |WS_CHILD | WS_VISIBLE;
142 if( ! this->m_PatchCtrl.Create(_T("Scintilla"),_T("source"),0,rectDummy,&m_ctrlTabCtrl,0,0) )
144 TRACE0("Failed to create log message control");
145 return FALSE;
147 m_PatchCtrl.Init(0);
148 m_PatchCtrl.Call(SCI_SETREADONLY, TRUE);
149 m_PatchCtrl.SetUDiffStyle();
151 dwStyle = LBS_NOINTEGRALHEIGHT | WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL;
153 if (!m_wndOutput.Create(_T("Scintilla"),_T("source"),0,rectDummy, &m_ctrlTabCtrl, 0,0) )
155 TRACE0("Failed to create output windows\n");
156 return -1; // fail to create
158 m_wndOutput.Init(0);
159 m_wndOutput.Call(SCI_SETREADONLY, TRUE);
161 m_tooltips.Create(this);
163 m_tooltips.AddTool(IDC_CHECK_3WAY,IDS_AM_3WAY_TT);
164 m_tooltips.AddTool(IDC_CHECK_IGNORE_SPACE,IDS_AM_IGNORE_SPACE_TT);
166 m_ctrlTabCtrl.AddTab(&m_PatchCtrl,_T("Patch"),0);
167 m_ctrlTabCtrl.AddTab(&m_wndOutput,_T("Log"),1);
169 AddAmAnchor();
171 m_PathList.SortByPathname(true);
172 m_cList.SetExtendedStyle( m_cList.GetExtendedStyle()| LVS_EX_CHECKBOXES );
174 for(int i=0;i<m_PathList.GetCount();i++)
176 m_cList.InsertItem(0,m_PathList[i].GetWinPath());
177 m_cList.SetCheck(0,true);
180 DWORD yPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\AMDlgSizer"));
181 RECT rcDlg, rcLogMsg, rcFileList;
182 GetClientRect(&rcDlg);
183 m_cList.GetWindowRect(&rcLogMsg);
184 ScreenToClient(&rcLogMsg);
185 this->m_ctrlTabCtrl.GetWindowRect(&rcFileList);
186 ScreenToClient(&rcFileList);
187 if (yPos)
189 RECT rectSplitter;
190 m_wndSplitter.GetWindowRect(&rectSplitter);
191 ScreenToClient(&rectSplitter);
192 int delta = yPos - rectSplitter.top;
193 if ((rcLogMsg.bottom + delta > rcLogMsg.top)&&(rcLogMsg.bottom + delta < rcFileList.bottom - 30))
195 m_wndSplitter.SetWindowPos(NULL, 0, yPos, 0, 0, SWP_NOSIZE);
196 DoSize(delta);
200 CAppUtils::SetListCtrlBackgroundImage(m_cList.GetSafeHwnd(), IDI_IMPORTPATHCES_BKG);
202 CString sWindowTitle;
203 GetWindowText(sWindowTitle);
204 CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle);
206 EnableSaveRestore(_T("ImportDlg"));
208 SetSplitterRange();
210 return TRUE;
213 BEGIN_MESSAGE_MAP(CImportPatchDlg, CResizableStandAloneDialog)
214 ON_LBN_SELCHANGE(IDC_LIST_PATCH, &CImportPatchDlg::OnLbnSelchangeListPatch)
215 ON_BN_CLICKED(IDC_BUTTON_ADD, &CImportPatchDlg::OnBnClickedButtonAdd)
216 ON_BN_CLICKED(IDC_BUTTON_UP, &CImportPatchDlg::OnBnClickedButtonUp)
217 ON_BN_CLICKED(IDC_BUTTON_DOWN, &CImportPatchDlg::OnBnClickedButtonDown)
218 ON_BN_CLICKED(IDC_BUTTON_REMOVE, &CImportPatchDlg::OnBnClickedButtonRemove)
219 ON_BN_CLICKED(IDOK, &CImportPatchDlg::OnBnClickedOk)
220 ON_WM_SIZE()
221 ON_BN_CLICKED(IDCANCEL, &CImportPatchDlg::OnBnClickedCancel)
222 ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_PATCH, &CImportPatchDlg::OnHdnItemchangedListPatch)
223 ON_REGISTERED_MESSAGE(WM_TASKBARBTNCREATED, OnTaskbarBtnCreated)
224 END_MESSAGE_MAP()
227 // CImportPatchDlg message handlers
229 void CImportPatchDlg::OnLbnSelchangeListPatch()
231 if(m_cList.GetSelectedCount() == 0)
233 this->GetDlgItem(IDC_BUTTON_UP)->EnableWindow(FALSE);
234 this->GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(FALSE);
235 this->GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(FALSE);
237 else
239 this->GetDlgItem(IDC_BUTTON_UP)->EnableWindow(TRUE);
240 this->GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(TRUE);
241 this->GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(TRUE);
245 void CImportPatchDlg::OnBnClickedButtonAdd()
247 CFileDialog dlg(TRUE,NULL,
248 NULL,
249 OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,
250 _T("Patch Files(*.patch)|*.patch|Diff Files(*.diff)|*.diff|All Files(*.*)|*.*||"));
251 if(dlg.DoModal() == IDOK)
253 POSITION pos;
254 pos = dlg.GetStartPosition();
255 while (pos)
257 CString file = dlg.GetNextPathName(pos);
258 file.Trim();
259 if(!file.IsEmpty())
261 int index = m_cList.InsertItem(m_cList.GetItemCount(), file);
262 if (index >= 0)
263 m_cList.SetCheck(index, true);
269 void CImportPatchDlg::OnBnClickedButtonUp()
271 POSITION pos;
272 pos = m_cList.GetFirstSelectedItemPosition();
274 // do nothing if the first selected item is the first item in the list
275 if (m_cList.GetNextSelectedItem(pos) == 0)
276 return;
278 pos = m_cList.GetFirstSelectedItemPosition();
280 while (pos)
282 int index = m_cList.GetNextSelectedItem(pos);
283 if(index >= 1)
285 CString old = m_cList.GetItemText(index, 0);
286 BOOL oldState = m_cList.GetCheck(index);
287 m_cList.DeleteItem(index);
288 m_cList.InsertItem(index - 1, old);
289 m_cList.SetCheck(index - 1, oldState);
290 m_cList.SetItemState(index - 1, LVIS_SELECTED, LVIS_SELECTED);
291 m_cList.SetItemState(index, 0, LVIS_SELECTED);
297 void CImportPatchDlg::OnBnClickedButtonDown()
299 if (m_cList.GetSelectedCount() == 0)
300 return;
302 POSITION pos;
303 pos = m_cList.GetFirstSelectedItemPosition();
304 // use an array to store all selected item indexes; the user won't select too much items
305 int* indexes = NULL;
306 indexes = new int[m_cList.GetSelectedCount()];
307 int i = 0;
308 while(pos)
310 indexes[i++] = m_cList.GetNextSelectedItem(pos);
313 // don't move any item if the last selected item is the last item in the m_CommitList
314 // (that would change the order of the selected items)
315 if(indexes[m_cList.GetSelectedCount() - 1] < m_cList.GetItemCount() - 1)
317 // iterate over the indexes backwards in order to correctly move multiselected items
318 for (i = m_cList.GetSelectedCount() - 1; i >= 0; i--)
320 int index = indexes[i];
321 CString old = m_cList.GetItemText(index, 0);
322 BOOL oldState = m_cList.GetCheck(index);
323 m_cList.DeleteItem(index);
324 m_cList.InsertItem(index + 1, old);
325 m_cList.SetCheck(index + 1, oldState);
326 m_cList.SetItemState(index + 1, LVIS_SELECTED, LVIS_SELECTED);
327 m_cList.SetItemState(index, 0, LVIS_SELECTED);
330 delete [] indexes;
331 indexes = NULL;
334 void CImportPatchDlg::OnBnClickedButtonRemove()
336 POSITION pos;
337 pos = m_cList.GetFirstSelectedItemPosition();
338 while (pos)
340 int index = m_cList.GetNextSelectedItem(pos);
341 m_cList.DeleteItem(index);
342 pos = m_cList.GetFirstSelectedItemPosition();
346 UINT CImportPatchDlg::PatchThread()
348 CTGitPath path;
349 path.SetFromWin(g_Git.m_CurrentDir);
351 int i=0;
353 for(i=m_CurrentItem;i<m_cList.GetItemCount();i++)
355 if (m_pTaskbarList)
357 m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL);
358 m_pTaskbarList->SetProgressValue(m_hWnd, i, m_cList.GetItemCount());
361 m_cList.SetItemData(i, CPatchListCtrl::STATUS_APPLYING|m_cList.GetItemData(i));
363 CRect rect;
364 this->m_cList.GetItemRect(i,&rect,LVIR_BOUNDS);
365 this->m_cList.InvalidateRect(rect);
367 if(m_bExitThread)
368 break;
370 if(m_cList.GetCheck(i))
372 CString cmd;
374 while(path.HasRebaseApply())
376 if (m_pTaskbarList)
377 m_pTaskbarList->SetProgressState(m_hWnd, TBPF_ERROR);
379 int ret = CMessageBox::Show(NULL, _T("<ct=0x0000FF>previous rebase directory rebase-apply still exists but mbox given</ct>\n\n Do you want to"),
380 _T("TortoiseGit"),
381 1,IDI_ERROR ,_T("&Abort"), _T("&Skip"),_T("&Resolved"));
383 switch(ret)
385 case 1:
386 cmd = _T("git.exe am --abort");
387 break;
388 case 2:
389 cmd = _T("git.exe am --skip");
390 i++;
391 break;
392 case 3:
393 cmd = _T("git.exe am --resolved");
394 break;
395 default:
396 cmd.Empty();
398 if(cmd.IsEmpty())
400 m_bExitThread = TRUE;
401 break;
404 this->AddLogString(cmd);
405 CString output;
406 if(g_Git.Run(cmd, &output, CP_ACP))
408 this->AddLogString(output);
409 this->AddLogString(_T("Fail"));
411 else
413 this->AddLogString(_T("Done"));
417 if(m_bExitThread)
418 break;
420 cmd = _T("git.exe am ");
422 if(this->m_bAddSignedOffBy)
423 cmd += _T("--signoff ");
425 if(this->m_b3Way)
426 cmd += _T("--3way ");
428 if(this->m_bIgnoreSpace)
429 cmd += _T("--ignore-space-change ");
431 if(this->m_bKeepCR)
432 cmd += _T("--keep-cr ");
434 cmd += _T("\"");
435 cmd += m_cList.GetItemText(i,0);
436 cmd += _T("\"");
438 this->AddLogString(cmd);
439 CString output;
440 if(g_Git.Run(cmd,&output,CP_ACP))
442 //keep STATUS_APPLYING to let user retry failed patch
443 m_cList.SetItemData(i, CPatchListCtrl::STATUS_APPLY_FAIL|CPatchListCtrl::STATUS_APPLYING);
444 this->AddLogString(output);
445 this->AddLogString(_T("Fail"));
446 if (m_pTaskbarList)
447 m_pTaskbarList->SetProgressState(m_hWnd, TBPF_ERROR);
448 break;
451 else
453 m_cList.SetItemData(i, CPatchListCtrl::STATUS_APPLY_SUCCESS);
454 this->AddLogString(_T("Success"));
458 else
460 AddLogString(CString(_T("Skip Patch: "))+m_cList.GetItemText(i,0));
461 m_cList.SetItemData(i, CPatchListCtrl::STATUS_APPLY_SKIP);
464 m_cList.SetItemData(m_CurrentItem, (~CPatchListCtrl::STATUS_APPLYING)&m_cList.GetItemData(i));
465 m_CurrentItem++;
467 this->m_cList.GetItemRect(i,&rect,LVIR_BOUNDS);
468 this->m_cList.InvalidateRect(rect);
470 UpdateOkCancelText();
473 //in case am fail, need refresh finial item status
474 CRect rect;
475 this->m_cList.GetItemRect(i,&rect,LVIR_BOUNDS);
476 this->m_cList.InvalidateRect(rect);
478 this->m_cList.GetItemRect(m_CurrentItem,&rect,LVIR_BOUNDS);
479 this->m_cList.InvalidateRect(rect);
481 if (m_pTaskbarList)
483 m_pTaskbarList->SetProgressValue(m_hWnd, m_CurrentItem, m_cList.GetItemCount());
484 if (m_bExitThread && m_CurrentItem != m_cList.GetItemCount())
485 m_pTaskbarList->SetProgressState(m_hWnd, TBPF_PAUSED);
486 else if (!m_bExitThread && m_CurrentItem == m_cList.GetItemCount())
487 m_pTaskbarList->SetProgressState(m_hWnd, TBPF_NORMAL);
490 EnableInputCtrl(true);
491 InterlockedExchange(&m_bThreadRunning, FALSE);
492 UpdateOkCancelText();
493 return 0;
496 void CImportPatchDlg::OnBnClickedOk()
498 m_PathList.Clear();
499 this->UpdateData();
501 SaveSplitterPos();
503 if(IsFinish())
505 this->OnOK();
506 return;
509 m_ctrlTabCtrl.SetActiveTab(1);
511 EnableInputCtrl(false);
512 InterlockedExchange(&m_bThreadRunning, TRUE);
513 InterlockedExchange(&this->m_bExitThread, FALSE);
514 if ( (m_LoadingThread=AfxBeginThread(ThreadEntry, this)) ==NULL)
516 InterlockedExchange(&m_bThreadRunning, FALSE);
517 CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR);
522 void CImportPatchDlg::DoSize(int delta)
524 this->RemoveAllAnchors();
526 CSplitterControl::ChangeHeight(GetDlgItem(IDC_LIST_PATCH), delta, CW_TOPALIGN);
527 //CSplitterControl::ChangeHeight(GetDlgItem(), delta, CW_TOPALIGN);
528 CSplitterControl::ChangeHeight(GetDlgItem(IDC_AM_TAB), -delta, CW_BOTTOMALIGN);
529 //CSplitterControl::ChangeHeight(GetDlgItem(), -delta, CW_BOTTOMALIGN);
530 CSplitterControl::ChangePos(GetDlgItem(IDC_CHECK_3WAY), 0, delta);
531 CSplitterControl::ChangePos(GetDlgItem(IDC_CHECK_IGNORE_SPACE), 0, delta);
532 CSplitterControl::ChangePos(GetDlgItem(IDC_SIGN_OFF), 0, delta);
533 CSplitterControl::ChangePos(GetDlgItem(IDC_KEEP_CR), 0, delta);
535 this->AddAmAnchor();
536 // adjust the minimum size of the dialog to prevent the resizing from
537 // moving the list control too far down.
538 CRect rcLogMsg;
539 m_cList.GetClientRect(rcLogMsg);
540 SetMinTrackSize(CSize(m_DlgOrigRect.Width(), m_DlgOrigRect.Height()-m_PatchListOrigRect.Height()+rcLogMsg.Height()));
542 SetSplitterRange();
543 // m_CommitList.Invalidate();
545 // GetDlgItem(IDC_LOGMESSAGE)->Invalidate();
547 this->m_ctrlTabCtrl.Invalidate();
550 void CImportPatchDlg::OnSize(UINT nType, int cx, int cy)
552 CResizableStandAloneDialog::OnSize(nType, cx, cy);
554 SetSplitterRange();
557 LRESULT CImportPatchDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
559 switch (message) {
560 case WM_NOTIFY:
561 if (wParam == IDC_AM_SPLIT)
563 SPC_NMHDR* pHdr = (SPC_NMHDR*) lParam;
564 DoSize(pHdr->delta);
566 break;
569 return CResizableStandAloneDialog::DefWindowProc(message, wParam, lParam);
572 void CImportPatchDlg::SaveSplitterPos()
574 if (!IsIconic())
576 CRegDWORD regPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\AMDlgSizer"));
577 RECT rectSplitter;
578 m_wndSplitter.GetWindowRect(&rectSplitter);
579 ScreenToClient(&rectSplitter);
580 regPos = rectSplitter.top;
586 void CImportPatchDlg::EnableInputCtrl(BOOL b)
588 this->GetDlgItem(IDC_BUTTON_UP)->EnableWindow(b);
589 this->GetDlgItem(IDC_BUTTON_DOWN)->EnableWindow(b);
590 this->GetDlgItem(IDC_BUTTON_REMOVE)->EnableWindow(b);
591 this->GetDlgItem(IDC_BUTTON_ADD)->EnableWindow(b);
592 this->GetDlgItem(IDOK)->EnableWindow(b);
595 void CImportPatchDlg::UpdateOkCancelText()
597 if( !IsFinish() )
599 this->GetDlgItem(IDOK)->SetWindowText(_T("&Apply"));
601 else
603 this->GetDlgItem(IDOK)->SetWindowText(_T("&OK"));
606 if(this->m_bThreadRunning)
607 this->GetDlgItem(IDCANCEL)->SetWindowText(_T("A&bort"));
608 else
609 this->GetDlgItem(IDCANCEL)->SetWindowText(_T("&Cancel"));
612 void CImportPatchDlg::OnBnClickedCancel()
614 if(this->m_bThreadRunning)
616 InterlockedExchange(&m_bExitThread,TRUE);
618 else
620 CTGitPath path;
621 path.SetFromWin(g_Git.m_CurrentDir);
622 if(path.HasRebaseApply())
623 if(MessageBox(_T("\"git am\" is still in apply mode.\nDo you want to abort?"), _T("TortoiseGit"), MB_YESNO | MB_ICONQUESTION) == IDYES)
625 CString output;
626 if(g_Git.Run(_T("git.exe am --abort"), &output, CP_ACP))
627 MessageBox(output, _T("TortoiseGit error"), MB_OK);
629 OnCancel();
633 void CImportPatchDlg::AddLogString(CString str)
635 this->m_wndOutput.SendMessage(SCI_SETREADONLY, FALSE);
636 CStringA sTextA = m_wndOutput.StringForControl(str);//CUnicodeUtils::GetUTF8(str);
637 this->m_wndOutput.SendMessage(SCI_REPLACESEL, 0, (LPARAM)(LPCSTR)sTextA);
638 this->m_wndOutput.SendMessage(SCI_REPLACESEL, 0, (LPARAM)(LPCSTR)"\n");
639 this->m_wndOutput.SendMessage(SCI_SETREADONLY, TRUE);
640 //this->m_wndOutput.SendMessage(SCI_LINESCROLL,0,0x7FFFFFFF);
642 BOOL CImportPatchDlg::PreTranslateMessage(MSG* pMsg)
644 if (pMsg->message == WM_KEYDOWN)
646 switch (pMsg->wParam)
649 /* Avoid TAB control destroy but dialog exist*/
650 case VK_ESCAPE:
651 case VK_CANCEL:
653 TCHAR buff[128];
654 ::GetClassName(pMsg->hwnd,buff,128);
656 if(_tcsnicmp(buff,_T("RichEdit20W"),128)==0 ||
657 _tcsnicmp(buff,_T("Scintilla"),128)==0 ||
658 _tcsnicmp(buff,_T("SysListView32"),128)==0||
659 ::GetParent(pMsg->hwnd) == this->m_ctrlTabCtrl.m_hWnd)
661 this->PostMessage(WM_KEYDOWN,VK_ESCAPE,0);
662 return TRUE;
667 m_tooltips.RelayEvent(pMsg);
668 return CResizableStandAloneDialog::PreTranslateMessage(pMsg);
671 void CImportPatchDlg::OnHdnItemchangedListPatch(NMHDR * /*pNMHDR*/, LRESULT *pResult)
673 *pResult = 0;
675 if(this->m_cList.GetSelectedCount() != 1)
677 m_PatchCtrl.SendMessage(SCI_SETREADONLY, FALSE);
678 m_PatchCtrl.SetText(CString());
679 m_PatchCtrl.SendMessage(SCI_SETREADONLY, TRUE);
681 else
683 CString text;
685 POSITION pos;
686 pos = m_cList.GetFirstSelectedItemPosition();
687 int selected = m_cList.GetNextSelectedItem(pos);
689 if(selected>=0&& selected< m_cList.GetItemCount())
691 CString str = m_cList.GetItemText(selected,0);
692 m_PatchCtrl.SendMessage(SCI_SETREADONLY, FALSE);
693 m_PatchCtrl.SetText(text);
694 m_PatchCtrl.LoadFromFile(str);
695 m_PatchCtrl.SendMessage(SCI_SETREADONLY, TRUE);
698 else
700 m_PatchCtrl.SendMessage(SCI_SETREADONLY, FALSE);
701 m_PatchCtrl.SetText(text);
702 m_PatchCtrl.SendMessage(SCI_SETREADONLY, TRUE);
707 LRESULT CImportPatchDlg::OnTaskbarBtnCreated(WPARAM /*wParam*/, LPARAM /*lParam*/)
709 m_pTaskbarList.Release();
710 m_pTaskbarList.CoCreateInstance(CLSID_TaskbarList);
711 return 0;