void CRepositoryBrowser::Refresh() { BeginWaitCursor(); if (m_nExternalOvl >= 0) SYS_IMAGE_LIST().SetOverlayImage(m_nExternalOvl, OVERLAY_EXTERNAL); if (m_nExecutableOvl >= 0) SYS_IMAGE_LIST().SetOverlayImage(m_nExecutableOvl, OVERLAY_EXECUTABLE); if (m_nSymlinkOvl >= 0) SYS_IMAGE_LIST().SetOverlayImage(m_nSymlinkOvl, OVERLAY_SYMLINK); m_RepoTree.DeleteAllItems(); m_RepoList.DeleteAllItems(); m_TreeRoot.m_ShadowTree.clear(); m_TreeRoot.m_sName = ""; m_TreeRoot.m_bFolder = true; TVINSERTSTRUCT tvinsert = {0}; tvinsert.hParent = TVI_ROOT; tvinsert.hInsertAfter = TVI_ROOT; tvinsert.itemex.mask = TVIF_DI_SETITEM | TVIF_PARAM | TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_STATE; tvinsert.itemex.pszText = L"/"; tvinsert.itemex.lParam = (LPARAM)&m_TreeRoot; tvinsert.itemex.iImage = m_nIconFolder; tvinsert.itemex.iSelectedImage = m_nOpenIconFolder; m_TreeRoot.m_hTree= m_RepoTree.InsertItem(&tvinsert); ReadTree(&m_TreeRoot); m_RepoTree.Expand(m_TreeRoot.m_hTree, TVE_EXPAND); FillListCtrlForShadowTree(&m_TreeRoot); m_RepoTree.SelectItem(m_TreeRoot.m_hTree); EndWaitCursor(); }
void CHistoryCombo::SetStylesAndImageList() { SetExtendedStyle(CBES_EX_PATHWORDBREAKPROC|CBES_EX_CASESENSITIVE, CBES_EX_PATHWORDBREAKPROC|CBES_EX_CASESENSITIVE); #ifdef HISTORYCOMBO_WITH_SYSIMAGELIST SetImageList(&SYS_IMAGE_LIST()); #endif }
void CHistoryCombo::SetURLHistory(BOOL bURLHistory) { m_bURLHistory = bURLHistory; if (m_bURLHistory) { HWND hwndEdit; // use for ComboEx hwndEdit = (HWND)::SendMessage(this->m_hWnd, CBEM_GETEDITCONTROL, 0, 0); if (!hwndEdit) { // Try the unofficial way of getting the edit control CWnd* CWnd* pWnd = this->GetDlgItem(1001); if(pWnd) { hwndEdit = pWnd->GetSafeHwnd(); } } if (hwndEdit) SHAutoComplete(hwndEdit, SHACF_URLALL); } #ifdef HISTORYCOMBO_WITH_SYSIMAGELIST SetImageList(&SYS_IMAGE_LIST()); #endif }
void CRepositoryBrowser::FillListCtrlForShadowTree(CShadowFilesTree* pTree) { for (TShadowFilesTreeMap::iterator itShadowTree = pTree->m_ShadowTree.begin(); itShadowTree != pTree->m_ShadowTree.end(); ++itShadowTree) { int icon = m_nIconFolder; if (!(*itShadowTree).second.m_bFolder) icon = SYS_IMAGE_LIST().GetFileIconIndex((*itShadowTree).second.m_sName); int indexItem = m_RepoList.InsertItem(m_RepoList.GetItemCount(), (*itShadowTree).second.m_sName, icon); m_RepoList.SetItemData(indexItem, (DWORD_PTR)&(*itShadowTree).second); if (!(*itShadowTree).second.m_bFolder) { CString temp; temp = CPathUtils::GetFileExtFromPath((*itShadowTree).second.m_sName); m_RepoList.SetItemText(indexItem, eCol_Extension, temp); StrFormatByteSize((*itShadowTree).second.m_iSize, temp.GetBuffer(20), 20); temp.ReleaseBuffer(); m_RepoList.SetItemText(indexItem, eCol_FileSize, temp); } } CRepoListCompareFunc compareFunc(&m_RepoList, m_currSortCol, m_currSortDesc); m_RepoList.SortItemsEx(&CRepoListCompareFunc::StaticCompare, (DWORD_PTR)&compareFunc); SetSortArrowA(&m_RepoList, m_currSortCol, !m_currSortDesc); }
void CHistoryCombo::SetPathHistory(BOOL bPathHistory) { m_bPathHistory = bPathHistory; if (m_bPathHistory) { HWND hwndEdit; // use for ComboEx hwndEdit = (HWND)::SendMessage(this->m_hWnd, CBEM_GETEDITCONTROL, 0, 0); if (NULL == hwndEdit) { //if not, try the old standby if(hwndEdit==NULL) { CWnd* pWnd = this->GetDlgItem(1001); if(pWnd) { hwndEdit = pWnd->GetSafeHwnd(); } } } if (hwndEdit) SHAutoComplete(hwndEdit, SHACF_FILESYSTEM); } #ifdef HISTORYCOMBO_WITH_SYSIMAGELIST SetImageList(&SYS_IMAGE_LIST()); #endif }
int CHistoryCombo::InsertEntry(const CString& combostring, INT_PTR pos) { COMBOBOXEXITEM cbei = { 0 }; cbei.mask = CBEIF_TEXT; cbei.iItem = pos; cbei.pszText = const_cast<LPTSTR>(combostring.GetString()); #ifdef HISTORYCOMBO_WITH_SYSIMAGELIST if (m_bURLHistory) { cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(combostring); if (cbei.iImage == 0 || cbei.iImage == SYS_IMAGE_LIST().GetDefaultIconIndex()) { if (CStringUtils::StartsWith(combostring, L"http:")) cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(L".html"); else if (CStringUtils::StartsWith(combostring, L"https:")) cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(L".html"); else if (CStringUtils::StartsWith(combostring, L"file:")) cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); else if (CStringUtils::StartsWith(combostring, L"git:")) cbei.iImage = m_nGitIconIndex; else if (CStringUtils::StartsWith(combostring, L"ssh:")) cbei.iImage = m_nGitIconIndex; else cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); } cbei.iSelectedImage = cbei.iImage; cbei.mask |= CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; } if (m_bPathHistory) { cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(combostring); if (cbei.iImage == SYS_IMAGE_LIST().GetDefaultIconIndex()) { cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); } cbei.iSelectedImage = cbei.iImage; cbei.mask |= CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; } #endif int nRet = InsertItem(&cbei); if (nRet >= 0) m_arEntries.InsertAt(nRet, combostring); return nRet; }
void CFileDiffDlg::OnLvnGetdispinfoFilelist(NMHDR *pNMHDR, LRESULT *pResult) { NMLVDISPINFO *pDispInfo = reinterpret_cast<NMLVDISPINFO*>(pNMHDR); if (pDispInfo) { if (pDispInfo->item.iItem < (int)m_arFilteredList.size()) { const FileDiff * data = &m_arFilteredList[pDispInfo->item.iItem]; if (pDispInfo->item.mask & LVIF_TEXT) { switch (pDispInfo->item.iSubItem) { case 0: // path { lstrcpyn(m_columnbuf, data->path.GetSVNPathString(), pDispInfo->item.cchTextMax); int cWidth = m_cFileList.GetColumnWidth(0); cWidth = max(28, cWidth-28); CDC * pDC = m_cFileList.GetDC(); if (pDC != NULL) { CFont * pFont = pDC->SelectObject(m_cFileList.GetFont()); PathCompactPath(pDC->GetSafeHdc(), m_columnbuf, cWidth); pDC->SelectObject(pFont); ReleaseDC(pDC); } } break; case 1: // action lstrcpyn(m_columnbuf, GetSummarizeActionText(data->kind), pDispInfo->item.cchTextMax); break; default: m_columnbuf[0] = 0; } pDispInfo->item.pszText = m_columnbuf; } if (pDispInfo->item.mask & LVIF_IMAGE) { int icon_idx = 0; if (data->node == svn_node_dir) icon_idx = m_nIconFolder; else { icon_idx = SYS_IMAGE_LIST().GetPathIconIndex(data->path); } pDispInfo->item.iImage = icon_idx; } } } *pResult = 0; }
CTortoiseProcApp::CTortoiseProcApp() { SetDllDirectory(L""); // prevent from inheriting %GIT_DIR% from parent process by resetting it, // use MSVC function instead of Windows API because MSVC runtime caches environment variables _tputenv(_T("GIT_DIR=")); CCrashReport::Instance().AddUserInfoToReport(L"CommandLine", GetCommandLine()); EnableHtmlHelp(); SYS_IMAGE_LIST(); CHooks::Create(); m_bLoadUserToolbars = FALSE; m_bSaveState = FALSE; retSuccess = false; m_gdiplusToken = NULL; }
CTortoiseProcApp::CTortoiseProcApp() { SetDllDirectory(L""); EnableHtmlHelp(); // int argc = 0; // const char* const * argv = NULL; // apr_app_initialize(&argc, &argv, NULL); // svn_dso_initialize2(); SYS_IMAGE_LIST(); CHooks::Create(); g_GitAdminDir.Init(); m_bLoadUserToolbars = FALSE; m_bSaveState = FALSE; retSuccess = false; }
CTortoiseProcApp::~CTortoiseProcApp() { // global application exit cleanup (after all SSL activity is shutdown) // we have to clean up SSL ourselves, since neon doesn't do that (can't do it) // because those cleanup functions work globally per process. //ERR_free_strings(); //EVP_cleanup(); //CRYPTO_cleanup_all_ex_data(); // since it is undefined *when* the global object SVNAdminDir is // destroyed, we tell it to destroy the memory pools and terminate apr // *now* instead of later when the object itself is destroyed. g_GitAdminDir.Close(); CHooks::Destroy(); SYS_IMAGE_LIST().Cleanup(); //apr_terminate(); }
CTortoiseProcApp::CTortoiseProcApp() { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": Constructor\n")); SetDllDirectory(L""); // prevent from inheriting %GIT_DIR% from parent process by resetting it, // use MSVC function instead of Windows API because MSVC runtime caches environment variables _tputenv(_T("GIT_DIR=")); CCrashReport::Instance().AddUserInfoToReport(L"CommandLine", GetCommandLine()); EnableHtmlHelp(); SYS_IMAGE_LIST(); CHooks::Create(); git_threads_init(); m_bLoadUserToolbars = FALSE; m_bSaveState = FALSE; retSuccess = false; m_gdiplusToken = NULL; #if defined (_WIN64) && _MSC_VER >= 1800 _set_FMA3_enable(0); #endif }
void CRepositoryBrowser::FillListCtrlForShadowTree(CShadowFilesTree* pTree) { for (TShadowFilesTreeMap::iterator itShadowTree = pTree->m_ShadowTree.begin(); itShadowTree != pTree->m_ShadowTree.end(); ++itShadowTree) { int icon = m_nIconFolder; if (!(*itShadowTree).second.m_bFolder && !(*itShadowTree).second.m_bSubmodule) { icon = SYS_IMAGE_LIST().GetFileIconIndex((*itShadowTree).second.m_sName); } int indexItem = m_RepoList.InsertItem(m_RepoList.GetItemCount(), (*itShadowTree).second.m_sName, icon); if ((*itShadowTree).second.m_bSubmodule) { m_RepoList.SetItemState(indexItem, INDEXTOOVERLAYMASK(OVERLAY_EXTERNAL), LVIS_OVERLAYMASK); } if ((*itShadowTree).second.m_bExecutable) m_RepoList.SetItemState(indexItem, INDEXTOOVERLAYMASK(OVERLAY_EXECUTABLE), LVIS_OVERLAYMASK); if ((*itShadowTree).second.m_bSymlink) m_RepoList.SetItemState(indexItem, INDEXTOOVERLAYMASK(OVERLAY_SYMLINK), LVIS_OVERLAYMASK); m_RepoList.SetItemData(indexItem, (DWORD_PTR)&(*itShadowTree).second); if (!(*itShadowTree).second.m_bFolder && !(*itShadowTree).second.m_bSubmodule) { CString temp; temp = CPathUtils::GetFileExtFromPath((*itShadowTree).second.m_sName); m_RepoList.SetItemText(indexItem, eCol_Extension, temp); StrFormatByteSize64((*itShadowTree).second.m_iSize, temp.GetBuffer(20), 20); temp.ReleaseBuffer(); m_RepoList.SetItemText(indexItem, eCol_FileSize, temp); } } CRepoListCompareFunc compareFunc(&m_RepoList, m_currSortCol, m_currSortDesc); m_RepoList.SortItemsEx(&CRepoListCompareFunc::StaticCompare, (DWORD_PTR)&compareFunc); SetSortArrowA(&m_RepoList, m_currSortCol, !m_currSortDesc); UpdateInfoLabel(); }
int CFileDiffDlg::AddEntry(const CTGitPath * fd) { int ret = -1; if (fd) { int index = m_cFileList.GetItemCount(); int icon_idx = 0; if (fd->IsDirectory()) icon_idx = m_nIconFolder; else icon_idx = SYS_IMAGE_LIST().GetPathIconIndex(fd->GetGitPathString()); ret = m_cFileList.InsertItem(index, fd->GetGitPathString(), icon_idx); m_cFileList.SetItemText(index, 1, ((CTGitPath*)fd)->GetFileExtension()); m_cFileList.SetItemText(index, 2, ((CTGitPath*)fd)->GetActionName()); m_cFileList.SetItemText(index, 3, ((CTGitPath*)fd)->m_StatAdd); m_cFileList.SetItemText(index, 4, ((CTGitPath*)fd)->m_StatDel); } return ret; }
int CFileDiffDlg::AddEntry(const CTGitPath * fd) { int ret = -1; if (fd) { int index = m_cFileList.GetItemCount(); int icon_idx = 0; // if (fd->node == svn_node_dir) // icon_idx = m_nIconFolder; // else { icon_idx = SYS_IMAGE_LIST().GetPathIconIndex(fd->GetGitPathString()); } ret = m_cFileList.InsertItem(index, fd->GetGitPathString(), icon_idx); m_cFileList.SetItemText(index, 1, ((CTGitPath*)fd)->GetActionName()); m_cFileList.SetItemText(index, 2, ((CTGitPath*)fd)->m_StatAdd); m_cFileList.SetItemText(index, 3, ((CTGitPath*)fd)->m_StatDel); } return ret; }
BOOL CFileDiffDlg::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CString temp; m_tooltips.Create(this); m_tooltips.AddTool(IDC_SWITCHLEFTRIGHT, IDS_FILEDIFF_SWITCHLEFTRIGHT_TT); m_cFileList.SetRedraw(false); m_cFileList.DeleteAllItems(); DWORD exStyle = LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP; m_cFileList.SetExtendedStyle(exStyle); m_nIconFolder = SYS_IMAGE_LIST().GetDirIconIndex(); m_cFileList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); m_hSwitchIcon = (HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_SWITCHLEFTRIGHT), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); m_SwitchButton.SetIcon(m_hSwitchIcon); m_cFilter.SetCancelBitmaps(IDI_CANCELNORMAL, IDI_CANCELPRESSED); m_cFilter.SetInfoIcon(IDI_FILTEREDIT); temp.LoadString(IDS_FILEDIFF_FILTERCUE); temp = _T(" ")+temp; m_cFilter.SetCueBanner(temp); int c = ((CHeaderCtrl*)(m_cFileList.GetDlgItem(0)))->GetItemCount()-1; while (c>=0) m_cFileList.DeleteColumn(c--); temp.LoadString(IDS_FILEDIFF_FILE); m_cFileList.InsertColumn(0, temp); temp.LoadString(IDS_FILEDIFF_ACTION); m_cFileList.InsertColumn(1, temp); CRect rect; m_cFileList.GetClientRect(&rect); m_cFileList.SetColumnWidth(0, rect.Width()-100); m_cFileList.SetColumnWidth(1, 100); m_cFileList.SetRedraw(true); AddAnchor(IDC_DIFFSTATIC1, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_SWITCHLEFTRIGHT, TOP_RIGHT); AddAnchor(IDC_FIRSTURL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_REV1BTN, TOP_RIGHT); AddAnchor(IDC_DIFFSTATIC2, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_SECONDURL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_REV2BTN, TOP_RIGHT); AddAnchor(IDC_FILTER, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_FILELIST, TOP_LEFT, BOTTOM_RIGHT); SetURLLabels(); EnableSaveRestore(_T("FileDiffDlg")); InterlockedExchange(&m_bThreadRunning, TRUE); if (AfxBeginThread(DiffThreadEntry, this)==NULL) { InterlockedExchange(&m_bThreadRunning, FALSE); CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } // Start with focus on file list GetDlgItem(IDC_FILELIST)->SetFocus(); return FALSE; }
void CHistoryCombo::SetCustomAutoSuggest(BOOL listEntries, BOOL bPathHistory, BOOL bURLHistory) { m_bPathHistory = bPathHistory; m_bURLHistory = bURLHistory; HWND hwndEdit; // use for ComboEx hwndEdit = (HWND)::SendMessage(this->m_hWnd, CBEM_GETEDITCONTROL, 0, 0); if (!hwndEdit) { CWnd* pWnd = this->GetDlgItem(1001); if (pWnd) hwndEdit = pWnd->GetSafeHwnd(); } if (hwndEdit) { CComPtr<IObjMgr> pom; if (!SUCCEEDED(CoCreateInstance(CLSID_ACLMulti, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pom)))) return; if (listEntries) { CComPtr<IUnknown> punkSource; CComPtr<CCustomAutoCompleteSource> pcacs = new CCustomAutoCompleteSource(m_arEntries); if (SUCCEEDED(pcacs->QueryInterface(IID_PPV_ARGS(&punkSource)))) pom->Append(punkSource); } if (m_bPathHistory) { CComPtr<IUnknown> punkSource2; if (SUCCEEDED(CoCreateInstance(CLSID_ACListISF, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&punkSource2)))) { CComPtr<IACList2> pal2; if (SUCCEEDED(punkSource2->QueryInterface(IID_PPV_ARGS(&pal2)))) pal2->SetOptions(ACLO_FILESYSDIRS); pom->Append(punkSource2); } } if (m_bURLHistory) { CComPtr<IUnknown> punkSource3; if (SUCCEEDED(CoCreateInstance(CLSID_ACLHistory, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&punkSource3)))) pom->Append(punkSource3); CComPtr<IUnknown> punkSource4; if (SUCCEEDED(CoCreateInstance(CLSID_ACLMRU, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&punkSource4)))) pom->Append(punkSource4); } CComPtr<IAutoComplete> pac; if (!SUCCEEDED(CoCreateInstance(CLSID_AutoComplete, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pac)))) return; pac->Init(hwndEdit, pom, nullptr, nullptr); CComPtr<IAutoComplete2> pac2; if (SUCCEEDED(pac->QueryInterface(IID_PPV_ARGS(&pac2)))) pac2->SetOptions(ACO_AUTOSUGGEST); } #ifdef HISTORYCOMBO_WITH_SYSIMAGELIST SetImageList(&SYS_IMAGE_LIST()); #endif }
BOOL CRepositoryBrowser::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AddAnchor(IDC_STATIC_REPOURL, TOP_LEFT); AddAnchor(IDC_REPOBROWSER_URL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_STATIC_REF, TOP_RIGHT); AddAnchor(IDC_BUTTON_REVISION, TOP_RIGHT); AddAnchor(IDC_REPOTREE, TOP_LEFT, BOTTOM_LEFT); AddAnchor(IDC_REPOLIST, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); AddAnchor(IDC_INFOLABEL, BOTTOM_LEFT, BOTTOM_RIGHT); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDCANCEL, BOTTOM_RIGHT); CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_CURRENT_USER); if (CRepositoryBrowser::s_bSortLogical) CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_LOCAL_MACHINE); static UINT columnNames[] = { IDS_STATUSLIST_COLFILENAME, IDS_STATUSLIST_COLEXT, IDS_LOG_SIZE }; static int columnWidths[] = { 150, 100, 100 }; DWORD dwDefaultColumns = (1 << eCol_Name) | (1 << eCol_Extension) | (1 << eCol_FileSize); m_ColumnManager.SetNames(columnNames, _countof(columnNames)); m_ColumnManager.ReadSettings(dwDefaultColumns, 0, _T("RepoBrowser"), _countof(columnNames), columnWidths); // set up the list control // set the extended style of the list control // the style LVS_EX_FULLROWSELECT interferes with the background watermark image but it's more important to be able to select in the whole row. CRegDWORD regFullRowSelect(_T("Software\\TortoiseGit\\FullRowSelect"), TRUE); DWORD exStyle = LVS_EX_HEADERDRAGDROP | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_SUBITEMIMAGES; if (DWORD(regFullRowSelect)) exStyle |= LVS_EX_FULLROWSELECT; m_RepoList.SetExtendedStyle(exStyle); m_RepoList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); CAppUtils::SetListCtrlBackgroundImage(m_RepoList.GetSafeHwnd(), IDI_REPOBROWSER_BKG); m_RepoTree.SetImageList(&SYS_IMAGE_LIST(), TVSIL_NORMAL); if (SysInfo::Instance().IsVistaOrLater()) { DWORD exStyle = TVS_EX_FADEINOUTEXPANDOS | TVS_EX_AUTOHSCROLL | TVS_EX_DOUBLEBUFFER; m_RepoTree.SetExtendedStyle(exStyle, exStyle); } m_nExternalOvl = SYS_IMAGE_LIST().AddIcon((HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_EXTERNALOVL), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE)); // set externaloverlay in SYS_IMAGE_LIST() in Refresh method, so that it is updated after every launch of the logdialog SetWindowTheme(m_RepoTree.GetSafeHwnd(), L"Explorer", NULL); SetWindowTheme(m_RepoList.GetSafeHwnd(), L"Explorer", NULL); m_nIconFolder = SYS_IMAGE_LIST().GetDirIconIndex(); m_nOpenIconFolder = SYS_IMAGE_LIST().GetDirOpenIconIndex(); EnableSaveRestore(L"Reposbrowser"); DWORD xPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RepobrowserDivider"), 0); if (xPos == 0) { RECT rc; GetDlgItem(IDC_REPOTREE)->GetClientRect(&rc); xPos = rc.right - rc.left; } HandleDividerMove(CPoint(xPos + 20, 10), false); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); m_bHasWC = !g_GitAdminDir.IsBareRepo(g_Git.m_CurrentDir); Refresh(); m_RepoList.SetFocus(); return FALSE; }
CTortoiseProcApp::~CTortoiseProcApp() { CHooks::Destroy(); SYS_IMAGE_LIST().Cleanup(); }
BOOL CFilePatchesDlg::Init(GitPatch * pPatch, CPatchFilesDlgCallBack * pCallBack, CString sPath, CWnd * pParent) { if (!pCallBack || !pPatch) { m_cFileList.DeleteAllItems(); return FALSE; } m_arFileStates.RemoveAll(); m_pPatch = pPatch; m_pCallBack = pCallBack; m_sPath = sPath; if (m_sPath.IsEmpty()) { CString title(MAKEINTRESOURCE(IDS_DIFF_TITLE)); SetWindowText(title); } else { CRect rect; GetClientRect(&rect); SetTitleWithPath(rect.Width()); m_sPath.TrimRight(L'\\'); m_sPath += L'\\'; } SetWindowTheme(m_cFileList.GetSafeHwnd(), L"Explorer", nullptr); m_cFileList.SetExtendedStyle(LVS_EX_INFOTIP | LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER); m_cFileList.DeleteAllItems(); int c = m_cFileList.GetHeaderCtrl()->GetItemCount() - 1; while (c>=0) m_cFileList.DeleteColumn(c--); m_cFileList.InsertColumn(0, CString(MAKEINTRESOURCE(IDS_PATH))); m_cFileList.InsertColumn(1, CString(MAKEINTRESOURCE(IDS_STATE))); m_cFileList.SetRedraw(false); for(int i=0; i<m_pPatch->GetNumberOfFiles(); i++) { CString sFile = CPathUtils::GetFileNameFromPath(m_pPatch->GetStrippedPath(i)); int state; if (m_sPath.IsEmpty()) state = 0; else { state = m_pPatch->GetFailedHunks(i); } if (m_pPatch->GetHasConflict(i)) state = FPDLG_FILESTATE_CONFLICT; if (state > 0) state = FPDLG_FILESTATE_ERROR; m_arFileStates.Add(state); CString sFileName = GetFullPath(i); sFileName = CPathUtils::GetFileNameFromPath(sFileName); m_cFileList.InsertItem(i, sFile, SYS_IMAGE_LIST().GetPathIconIndex(sFileName)); SetStateText(i, state); } int mincol = 0; int maxcol = m_cFileList.GetHeaderCtrl()->GetItemCount() - 1; int col; for (col = mincol; col <= maxcol; col++) { m_cFileList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER); } m_cFileList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); m_cFileList.SetRedraw(true); RECT parentrect; pParent->GetWindowRect(&parentrect); RECT windowrect; GetWindowRect(&windowrect); int width = windowrect.right - windowrect.left; int height = windowrect.bottom - windowrect.top; windowrect.right = parentrect.left; windowrect.left = windowrect.right - width; windowrect.top = parentrect.top; windowrect.bottom = windowrect.top + height; auto hMonitor = MonitorFromRect(&windowrect, MONITOR_DEFAULTTONULL); if (hMonitor) SetWindowPos(nullptr, windowrect.left, windowrect.top, width, height, SWP_NOACTIVATE | SWP_NOZORDER); m_nWindowHeight = windowrect.bottom - windowrect.top; m_pMainFrame = pParent; return TRUE; }
int CHistoryCombo::AddString(CString str, INT_PTR pos) { if (str.IsEmpty()) return -1; //truncate list to m_nMaxHistoryItems int nNumItems = GetCount(); for (int n = m_nMaxHistoryItems; n < nNumItems; n++) { DeleteItem(m_nMaxHistoryItems); m_arEntries.RemoveAt(m_nMaxHistoryItems); } COMBOBOXEXITEM cbei; SecureZeroMemory(&cbei, sizeof cbei); cbei.mask = CBEIF_TEXT; if (pos < 0) cbei.iItem = GetCount(); else cbei.iItem = pos; if (m_bTrim) str.Trim(L" "); CString combostring = str; combostring.Replace('\r', ' '); combostring.Replace('\n', ' '); cbei.pszText = const_cast<LPTSTR>(combostring.GetString()); #ifdef HISTORYCOMBO_WITH_SYSIMAGELIST if (m_bURLHistory) { cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(str); if ((cbei.iImage == NULL) || (cbei.iImage == SYS_IMAGE_LIST().GetDefaultIconIndex())) { if (str.Left(5) == L"http:") cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(L".html"); else if (str.Left(6) == L"https:") cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(L".html"); else if (str.Left(5) == L"file:") cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); else if (str.Left(4) == L"svn:") cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); else if (str.Left(8) == L"svn+ssh:") cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); } cbei.iSelectedImage = cbei.iImage; cbei.mask |= CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; } if (m_bPathHistory) { cbei.iImage = SYS_IMAGE_LIST().GetPathIconIndex(str); if (cbei.iImage == SYS_IMAGE_LIST().GetDefaultIconIndex()) { cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); } cbei.iSelectedImage = cbei.iImage; cbei.mask |= CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; } #endif int nRet = InsertItem(&cbei); if (nRet >= 0) m_arEntries.InsertAt(nRet, str); //search the Combo for another string like this //and delete it if one is found if (m_bTrim) str.Trim(); int nIndex = FindStringExact(0, combostring); if (nIndex != -1 && nIndex != nRet) { DeleteItem(nIndex); m_arEntries.RemoveAt(nIndex); } SetCurSel(nRet); return nRet; }
BOOL CTortoiseProcApp::InitInstance() { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": InitInstance\n")); CheckUpgrade(); CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows)); CMFCButton::EnableWindowsTheming(); CHistoryCombo::m_nGitIconIndex = SYS_IMAGE_LIST().AddIcon((HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_GITCONFIG), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE)); Gdiplus::GdiplusStartupInput gdiplusStartupInput; Gdiplus::GdiplusStartup(&m_gdiplusToken,&gdiplusStartupInput,NULL); //set the resource dll for the required language CRegDWORD loc = CRegDWORD(_T("Software\\TortoiseGit\\LanguageID"), 1033); long langId = loc; { CString langStr; langStr.Format(_T("%ld"), langId); CCrashReport::Instance().AddUserInfoToReport(L"LanguageID", langStr); } CString langDll; CStringA langpath = CStringA(CPathUtils::GetAppParentDirectory()); langpath += "Languages"; do { langDll.Format(_T("%sLanguages\\TortoiseProc%ld.dll"), (LPCTSTR)CPathUtils::GetAppParentDirectory(), langId); CString sVer = _T(STRPRODUCTVER); CString sFileVer = CPathUtils::GetVersionFromFile(langDll); if (sFileVer == sVer) { HINSTANCE hInst = LoadLibrary(langDll); if (hInst != NULL) { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": Load Language DLL %s\n"), langDll); AfxSetResourceHandle(hInst); break; } } { DWORD lid = SUBLANGID(langId); lid--; if (lid > 0) { langId = MAKELANGID(PRIMARYLANGID(langId), lid); } else langId = 0; } } while (langId != 0); TCHAR buf[6] = { 0 }; _tcscpy_s(buf, _T("en")); langId = loc; // MFC uses a help file with the same name as the application by default, // which means we have to change that default to our language specific help files CString sHelppath = CPathUtils::GetAppDirectory() + _T("TortoiseGit_en.chm"); free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); sHelppath = CPathUtils::GetAppParentDirectory() + _T("Languages\\TortoiseGit_en.chm"); do { CString sLang = _T("_"); if (GetLocaleInfo(MAKELCID(langId, SORT_DEFAULT), LOCALE_SISO639LANGNAME, buf, _countof(buf))) { sLang += buf; sHelppath.Replace(_T("_en"), sLang); if (PathFileExists(sHelppath)) { free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); break; } } sHelppath.Replace(sLang, _T("_en")); if (GetLocaleInfo(MAKELCID(langId, SORT_DEFAULT), LOCALE_SISO3166CTRYNAME, buf, _countof(buf))) { sLang += _T("_"); sLang += buf; sHelppath.Replace(_T("_en"), sLang); if (PathFileExists(sHelppath)) { free((void*)m_pszHelpFilePath); m_pszHelpFilePath=_tcsdup(sHelppath); break; } } sHelppath.Replace(sLang, _T("_en")); DWORD lid = SUBLANGID(langId); lid--; if (lid > 0) { langId = MAKELANGID(PRIMARYLANGID(langId), lid); } else langId = 0; } while (langId); CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": Set Help Filename %s\n"), m_pszHelpFilePath); setlocale(LC_ALL, ""); if (!g_Git.CheckMsysGitDir()) { UINT ret = CMessageBox::Show(NULL, IDS_PROC_NOMSYSGIT, IDS_APPNAME, 3, IDI_HAND, IDS_PROC_SETMSYSGITPATH, IDS_PROC_GOTOMSYSGITWEBSITE, IDS_ABORTBUTTON); if(ret == 2) { ShellExecute(NULL, NULL, _T("http://msysgit.github.io/"), NULL, NULL, SW_SHOW); } else if(ret == 1) { // open settings dialog CSinglePropSheetDlg(CString(MAKEINTRESOURCE(IDS_PROC_SETTINGS_TITLE)), new CSetMainPage(), this->GetMainWnd()).DoModal(); } return FALSE; } if (CAppUtils::GetMsysgitVersion() < 0x01070a00) { int ret = CMessageBox::ShowCheck(NULL, IDS_PROC_OLDMSYSGIT, IDS_APPNAME, 1, IDI_EXCLAMATION, IDS_PROC_GOTOMSYSGITWEBSITE, IDS_ABORTBUTTON, IDS_IGNOREBUTTON, _T("OldMsysgitVersionWarning"), IDS_PROC_NOTSHOWAGAINIGNORE); if (ret == 1) { CMessageBox::RemoveRegistryKey(_T("OldMsysgitVersionWarning")); // only store answer if it is "Ignore" ShellExecute(NULL, NULL, _T("http://msysgit.github.io/"), NULL, NULL, SW_SHOW); return FALSE; } else if (ret == 2) { CMessageBox::RemoveRegistryKey(_T("OldMsysgitVersionWarning")); // only store answer if it is "Ignore" return FALSE; } } { CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": Registering Crash Report ...\n")); CCrashReport::Instance().AddUserInfoToReport(L"msysGitDir", CGit::ms_LastMsysGitDir); CString versionString; versionString.Format(_T("%d"), CGit::ms_LastMsysGitVersion); CCrashReport::Instance().AddUserInfoToReport(L"msysGitVersion", versionString); } CTraceToOutputDebugString::Instance()(_T(__FUNCTION__) _T(": Initializing UI components ...\n")); // InitCommonControls() is required on Windows XP if an application // manifest specifies use of ComCtl32.dll version 6 or later to enable // visual styles. Otherwise, any window creation will fail. INITCOMMONCONTROLSEX used = { sizeof(INITCOMMONCONTROLSEX), ICC_ANIMATE_CLASS | ICC_BAR_CLASSES | ICC_COOL_CLASSES | ICC_DATE_CLASSES | ICC_HOTKEY_CLASS | ICC_INTERNET_CLASSES | ICC_LISTVIEW_CLASSES | ICC_NATIVEFNTCTL_CLASS | ICC_PAGESCROLLER_CLASS | ICC_PROGRESS_CLASS | ICC_TAB_CLASSES | ICC_TREEVIEW_CLASSES | ICC_UPDOWN_CLASS | ICC_USEREX_CLASSES | ICC_WIN95_CLASSES }; InitCommonControlsEx(&used); AfxOleInit(); AfxEnableControlContainer(); AfxInitRichEdit5(); CWinAppEx::InitInstance(); SetRegistryKey(_T("TortoiseGit")); AfxGetApp()->m_pszProfileName = _tcsdup(_T("TortoiseProc")); // w/o this ResizableLib will store data under TortoiseGitProc which is not compatible with older versions CCmdLineParser parser(AfxGetApp()->m_lpCmdLine); hWndExplorer = NULL; CString sVal = parser.GetVal(_T("hwnd")); if (!sVal.IsEmpty()) hWndExplorer = (HWND)_wcstoui64(sVal, nullptr, 16); while (GetParent(hWndExplorer)!=NULL) hWndExplorer = GetParent(hWndExplorer); if (!IsWindow(hWndExplorer)) { hWndExplorer = NULL; } // if HKCU\Software\TortoiseGit\Debug is not 0, show our command line // in a message box if (CRegDWORD(_T("Software\\TortoiseGit\\Debug"), FALSE)==TRUE) AfxMessageBox(AfxGetApp()->m_lpCmdLine, MB_OK | MB_ICONINFORMATION); if (parser.HasKey(_T("urlhandler"))) { CString url = parser.GetVal(_T("urlhandler")); if (url.Find(_T("tgit://clone/")) == 0) { url = url.Mid(13); // 21 = "tgit://clone/".GetLength() } else if (url.Find(_T("github-windows://openRepo/")) == 0) { url = url.Mid(26); // 26 = "github-windows://openRepo/".GetLength() int questioMark = url.Find('?'); if (questioMark > 0) url = url.Left(questioMark); } else if (url.Find(_T("smartgit://cloneRepo/")) == 0) { url = url.Mid(21); // 21 = "smartgit://cloneRepo/".GetLength() } else { CMessageBox::Show(NULL, IDS_ERR_INVALIDPATH, IDS_APPNAME, MB_ICONERROR); return FALSE; } CString newCmd; newCmd.Format(_T("/command:clone /url:\"%s\" /hasurlhandler"), url); parser = CCmdLineParser(newCmd); } if ( parser.HasKey(_T("path")) && parser.HasKey(_T("pathfile"))) { CMessageBox::Show(NULL, IDS_ERR_INVALIDPATH, IDS_APPNAME, MB_ICONERROR); return FALSE; } CTGitPath cmdLinePath; CTGitPathList pathList; if (g_sGroupingUUID.IsEmpty()) g_sGroupingUUID = parser.GetVal(L"groupuuid"); if ( parser.HasKey(_T("pathfile")) ) { CString sPathfileArgument = CPathUtils::GetLongPathname(parser.GetVal(_T("pathfile"))); cmdLinePath.SetFromUnknown(sPathfileArgument); if (pathList.LoadFromFile(cmdLinePath)==false) return FALSE; // no path specified! if ( parser.HasKey(_T("deletepathfile")) ) { // We can delete the temporary path file, now that we've loaded it ::DeleteFile(cmdLinePath.GetWinPath()); } // This was a path to a temporary file - it's got no meaning now, and // anybody who uses it again is in for a problem... cmdLinePath.Reset(); } else { CString sPathArgument = CPathUtils::GetLongPathname(parser.GetVal(_T("path"))); if (parser.HasKey(_T("expaths"))) { // an /expaths param means we're started via the buttons in our Win7 library // and that means the value of /expaths is the current directory, and // the selected paths are then added as additional parameters but without a key, only a value // because of the "strange treatment of quotation marks and backslashes by CommandLineToArgvW" // we have to escape the backslashes first. Since we're only dealing with paths here, that's // a save bet. // Without this, a command line like: // /command:commit /expaths:"D:\" "D:\Utils" // would fail because the "D:\" is treated as the backslash being the escape char for the quotation // mark and we'd end up with: // argv[1] = /command:commit // argv[2] = /expaths:D:" D:\Utils // See here for more details: http://blogs.msdn.com/b/oldnewthing/archive/2010/09/17/10063629.aspx CString cmdLine = GetCommandLineW(); cmdLine.Replace(L"\\", L"\\\\"); int nArgs = 0; LPWSTR *szArglist = CommandLineToArgvW(cmdLine, &nArgs); if (szArglist) { // argument 0 is the process path, so start with 1 for (int i = 1; i < nArgs; ++i) { if (szArglist[i][0] != '/') { if (!sPathArgument.IsEmpty()) sPathArgument += '*'; sPathArgument += szArglist[i]; } } sPathArgument.Replace(L"\\\\", L"\\"); } LocalFree(szArglist); } if (sPathArgument.IsEmpty() && parser.HasKey(L"path")) { CMessageBox::Show(hWndExplorer, IDS_ERR_INVALIDPATH, IDS_APPNAME, MB_ICONERROR); return FALSE; } int asterisk = sPathArgument.Find('*'); cmdLinePath.SetFromUnknown(asterisk >= 0 ? sPathArgument.Left(asterisk) : sPathArgument); pathList.LoadFromAsteriskSeparatedString(sPathArgument); } if (pathList.IsEmpty()) { pathList.AddPath(CTGitPath::CTGitPath(g_Git.m_CurrentDir)); } // Set CWD to temporary dir, and restore it later { DWORD len = GetCurrentDirectory(0, NULL); if (len) { std::unique_ptr<TCHAR[]> originalCurrentDirectory(new TCHAR[len]); if (GetCurrentDirectory(len, originalCurrentDirectory.get())) { sOrigCWD = originalCurrentDirectory.get(); sOrigCWD = CPathUtils::GetLongPathname(sOrigCWD); } } TCHAR pathbuf[MAX_PATH] = {0}; GetTortoiseGitTempPath(MAX_PATH, pathbuf); SetCurrentDirectory(pathbuf); } CheckForNewerVersion(); CAutoGeneralHandle TGitMutex = ::CreateMutex(NULL, FALSE, _T("TortoiseGitProc.exe")); if (!g_Git.SetCurrentDir(cmdLinePath.GetWinPathString(), parser.HasKey(_T("submodule")) == TRUE)) { for (int i = 0; i < pathList.GetCount(); ++i) if(g_Git.SetCurrentDir(pathList[i].GetWinPath())) break; } if(!g_Git.m_CurrentDir.IsEmpty()) { sOrigCWD = g_Git.m_CurrentDir; SetCurrentDirectory(g_Git.m_CurrentDir); } if (g_sGroupingUUID.IsEmpty()) { CRegStdDWORD groupSetting = CRegStdDWORD(_T("Software\\TortoiseGit\\GroupTaskbarIconsPerRepo"), 3); switch (DWORD(groupSetting)) { case 1: case 2: // implemented differently to TortoiseSVN atm break; case 3: case 4: { CString wcroot; if (g_GitAdminDir.HasAdminDir(g_Git.m_CurrentDir, true, &wcroot)) { git_oid oid; CStringA wcRootA(wcroot + CPathUtils::GetAppDirectory()); if (!git_odb_hash(&oid, wcRootA, wcRootA.GetLength(), GIT_OBJ_BLOB)) { CStringA hash; git_oid_tostr(hash.GetBufferSetLength(GIT_OID_HEXSZ + 1), GIT_OID_HEXSZ + 1, &oid); hash.ReleaseBuffer(); g_sGroupingUUID = hash; } ProjectProperties pp; pp.ReadProps(); CString icon = pp.sIcon; icon.Replace('/', '\\'); if (icon.IsEmpty()) g_bGroupingRemoveIcon = true; g_sGroupingIcon = icon; } } } } CString sAppID = GetTaskIDPerUUID(g_sGroupingUUID).c_str(); InitializeJumpList(sAppID); EnsureGitLibrary(false); { CString err; try { // requires CWD to be set CGit::m_LogEncode = CAppUtils::GetLogOutputEncode(); // make sure all config files are read in order to check that none contains an error g_Git.GetConfigValue(_T("doesnot.exist")); } catch (char* msg) { err = CString(msg); } if (!err.IsEmpty()) { UINT choice = CMessageBox::Show(hWndExplorer, err, _T("TortoiseGit"), 1, IDI_ERROR, CString(MAKEINTRESOURCE(IDS_PROC_EDITLOCALGITCONFIG)), CString(MAKEINTRESOURCE(IDS_PROC_EDITGLOBALGITCONFIG)), CString(MAKEINTRESOURCE(IDS_ABORTBUTTON))); if (choice == 1) { // open the config file with alternative editor CAppUtils::LaunchAlternativeEditor(g_Git.GetGitLocalConfig()); } else if (choice == 2) { // open the global config file with alternative editor CAppUtils::LaunchAlternativeEditor(g_Git.GetGitGlobalConfig()); } return FALSE; } } // execute the requested command CommandServer server; Command * cmd = server.GetCommand(parser.GetVal(_T("command"))); if (cmd) { cmd->SetExplorerHwnd(hWndExplorer); cmd->SetParser(parser); cmd->SetPaths(pathList, cmdLinePath); retSuccess = cmd->Execute(); delete cmd; } // Look for temporary files left around by TortoiseSVN and // remove them. But only delete 'old' files because some // apps might still be needing the recent ones. { DWORD len = GetTortoiseGitTempPath(0, NULL); std::unique_ptr<TCHAR[]> path(new TCHAR[len + 100]); len = GetTortoiseGitTempPath (len + 100, path.get()); if (len != 0) { CDirFileEnum finder(path.get()); FILETIME systime_; ::GetSystemTimeAsFileTime(&systime_); __int64 systime = (((_int64)systime_.dwHighDateTime)<<32) | ((__int64)systime_.dwLowDateTime); bool isDir; CString filepath; while (finder.NextFile(filepath, &isDir)) { HANDLE hFile = ::CreateFile(filepath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, isDir ? FILE_FLAG_BACKUP_SEMANTICS : NULL, NULL); if (hFile != INVALID_HANDLE_VALUE) { FILETIME createtime_; if (::GetFileTime(hFile, &createtime_, NULL, NULL)) { ::CloseHandle(hFile); __int64 createtime = (((_int64)createtime_.dwHighDateTime)<<32) | ((__int64)createtime_.dwLowDateTime); if ((createtime + 864000000000) < systime) //only delete files older than a day { ::SetFileAttributes(filepath, FILE_ATTRIBUTE_NORMAL); if (isDir) ::RemoveDirectory(filepath); else ::DeleteFile(filepath); } } else ::CloseHandle(hFile); } } } } // Since the dialog has been closed, return FALSE so that we exit the // application, rather than start the application's message pump. return FALSE; }
CTortoiseProcApp::~CTortoiseProcApp() { CHooks::Destroy(); SYS_IMAGE_LIST().Cleanup(); git_threads_shutdown(); }
int CHistoryCombo::AddString(CString str, INT_PTR pos,BOOL isSel) { if (str.IsEmpty()) return -1; if (pos < 0) pos = GetCount(); if (m_bTrim) str.Trim(_T(" ")); CString combostring = str; combostring.Replace('\r', ' '); combostring.Replace('\n', ' '); if (m_bTrim) combostring.Trim(); //search the Combo for another string like this //and do not insert if found int nIndex = m_bCaseSensitive ? FindStringExactCaseSensitive(-1, combostring) : FindStringExact(-1, combostring); if (nIndex != -1) { if (nIndex > pos) { DeleteItem(nIndex); m_arEntries.RemoveAt(nIndex); } else { if(isSel) SetCurSel(nIndex); return nIndex; } } //truncate list to m_nMaxHistoryItems int nNumItems = GetCount(); for (int n = m_nMaxHistoryItems; n < nNumItems; n++) { DeleteItem(m_nMaxHistoryItems); m_arEntries.RemoveAt(m_nMaxHistoryItems); } COMBOBOXEXITEM cbei; SecureZeroMemory(&cbei, sizeof cbei); cbei.mask = CBEIF_TEXT; cbei.iItem = pos; cbei.pszText = const_cast<LPTSTR>(combostring.GetString()); #ifdef HISTORYCOMBO_WITH_SYSIMAGELIST if (m_bURLHistory) { cbei.iImage = SYS_IMAGE_LIST().GetFileIconIndex(str); if (cbei.iImage == 0 || cbei.iImage == SYS_IMAGE_LIST().GetDefaultIconIndex()) { if (str.Left(5) == _T("http:")) cbei.iImage = SYS_IMAGE_LIST().GetFileIconIndex(_T(".html")); else if (str.Left(6) == _T("https:")) cbei.iImage = SYS_IMAGE_LIST().GetFileIconIndex(_T(".html")); else if (str.Left(5) == _T("file:")) cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); else if (str.Left(4) == _T("git:")) cbei.iImage = m_nGitIconIndex; else if (str.Left(4) == _T("ssh:")) cbei.iImage = m_nGitIconIndex; else cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); } cbei.iSelectedImage = cbei.iImage; cbei.mask |= CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; } if (m_bPathHistory) { cbei.iImage = SYS_IMAGE_LIST().GetFileIconIndex(str); if (cbei.iImage == SYS_IMAGE_LIST().GetDefaultIconIndex()) { cbei.iImage = SYS_IMAGE_LIST().GetDirIconIndex(); } cbei.iSelectedImage = cbei.iImage; cbei.mask |= CBEIF_IMAGE | CBEIF_SELECTEDIMAGE; } #endif int nRet = InsertItem(&cbei); if (nRet >= 0) m_arEntries.InsertAt(nRet, str); if(isSel) SetCurSel(nRet); return nRet; }
BOOL CFileDiffDlg::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CString temp; CString sWindowTitle; GetWindowText(sWindowTitle); CString pathText = g_Git.m_CurrentDir; if (!m_path1.IsEmpty()) pathText = g_Git.CombinePath(m_path1); CAppUtils::SetWindowTitle(m_hWnd, pathText, sWindowTitle); this->m_ctrRev1Edit.Init(); this->m_ctrRev2Edit.Init(); m_tooltips.AddTool(IDC_SWITCHLEFTRIGHT, IDS_FILEDIFF_SWITCHLEFTRIGHT_TT); m_cFileList.SetRedraw(false); m_cFileList.DeleteAllItems(); DWORD exStyle = LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP; m_cFileList.SetExtendedStyle(exStyle); m_nIconFolder = SYS_IMAGE_LIST().GetDirIconIndex(); m_cFileList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); m_SwitchButton.SetImage((HICON)LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_SWITCHLEFTRIGHT), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR)); m_SwitchButton.Invalidate(); m_cFilter.SetCancelBitmaps(IDI_CANCELNORMAL, IDI_CANCELPRESSED); m_cFilter.SetInfoIcon(IDI_FILTEREDIT); temp.LoadString(IDS_FILEDIFF_FILTERCUE); temp = _T(" ")+temp; m_cFilter.SetCueBanner(temp); if (!m_sFilter.IsEmpty()) m_cFilter.SetWindowText(m_sFilter); int c = m_cFileList.GetHeaderCtrl()->GetItemCount() - 1; while (c>=0) m_cFileList.DeleteColumn(c--); temp.LoadString(IDS_FILEDIFF_FILE); m_cFileList.InsertColumn(0, temp); temp.LoadString(IDS_FILEDIFF_EXT); m_cFileList.InsertColumn(1, temp); temp.LoadString(IDS_FILEDIFF_ACTION); m_cFileList.InsertColumn(2, temp); temp.LoadString(IDS_FILEDIFF_STATADD); m_cFileList.InsertColumn(3, temp); temp.LoadString(IDS_FILEDIFF_STATDEL); m_cFileList.InsertColumn(4, temp); int mincol = 0; int maxcol = m_cFileList.GetHeaderCtrl()->GetItemCount() - 1; int col; for (col = mincol; col <= maxcol; col++) { m_cFileList.SetColumnWidth(col,LVSCW_AUTOSIZE_USEHEADER); } m_cFileList.SetRedraw(true); AddAnchor(IDC_DIFFSTATIC1, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_SWITCHLEFTRIGHT, TOP_RIGHT); AddAnchor(IDC_FIRSTURL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_REV1BTN, TOP_RIGHT); //AddAnchor(IDC_DIFFSTATIC2, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_SECONDURL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_REV2BTN, TOP_RIGHT); AddAnchor(IDC_FILTER, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_FILELIST, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDC_REV1GROUP,TOP_LEFT,TOP_RIGHT); AddAnchor(IDC_REV2GROUP,TOP_LEFT,TOP_RIGHT); AddAnchor(IDC_REV1EDIT,TOP_LEFT); AddAnchor(IDC_REV2EDIT,TOP_LEFT); AddAnchor(IDC_DIFFOPTION, TOP_RIGHT); AddAnchor(IDC_LOG, TOP_RIGHT); EnableSaveRestore(_T("FileDiffDlg")); m_bIsBare = GitAdminDir::IsBareRepo(g_Git.m_CurrentDir); if(this->m_strRev1.IsEmpty()) this->m_ctrRev1Edit.SetWindowText(this->m_rev1.m_CommitHash.ToString()); else { if (m_rev1.GetCommit(m_strRev1)) { CString msg; msg.Format(IDS_PROC_REFINVALID, (LPCTSTR)m_strRev1); m_cFileList.ShowText(msg + _T("\n") + m_rev1.GetLastErr()); } this->m_ctrRev1Edit.SetWindowText(m_strRev1); } if(this->m_strRev2.IsEmpty()) this->m_ctrRev2Edit.SetWindowText(this->m_rev2.m_CommitHash.ToString()); else { if (m_rev2.GetCommit(m_strRev2)) { CString msg; msg.Format(IDS_PROC_REFINVALID, (LPCTSTR)m_strRev2); m_cFileList.ShowText(msg + _T("\n") + m_rev1.GetLastErr()); } this->m_ctrRev2Edit.SetWindowText(m_strRev2); } SetURLLabels(); InterlockedExchange(&m_bThreadRunning, TRUE); if (AfxBeginThread(DiffThreadEntry, this)==NULL) { InterlockedExchange(&m_bThreadRunning, FALSE); CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } InterlockedExchange(&m_bLoadingRef, TRUE); if (AfxBeginThread(LoadRefThreadEntry, this)==NULL) { InterlockedExchange(&m_bLoadingRef, FALSE); CMessageBox::Show(NULL, IDS_ERR_THREADSTARTFAILED, IDS_APPNAME, MB_OK | MB_ICONERROR); } this->m_cRev1Btn.AddEntry(CString(MAKEINTRESOURCE(IDS_REFBROWSE))); this->m_cRev1Btn.AddEntry(CString(MAKEINTRESOURCE(IDS_LOG))); this->m_cRev1Btn.AddEntry(CString(MAKEINTRESOURCE(IDS_REFLOG))); this->m_cRev2Btn.AddEntry(CString(MAKEINTRESOURCE(IDS_REFBROWSE))); this->m_cRev2Btn.AddEntry(CString(MAKEINTRESOURCE(IDS_LOG))); this->m_cRev2Btn.AddEntry(CString(MAKEINTRESOURCE(IDS_REFLOG))); // Start with focus on file list GetDlgItem(IDC_FILELIST)->SetFocus(); if(m_rev2.m_CommitHash.IsEmpty()) m_SwitchButton.EnableWindow(FALSE); KillTimer(IDT_INPUT); return FALSE; }
BOOL CRepositoryBrowser::OnInitDialog() { CResizableStandAloneDialog::OnInitDialog(); CAppUtils::MarkWindowAsUnpinnable(m_hWnd); AddAnchor(IDC_STATIC_REPOURL, TOP_LEFT); AddAnchor(IDC_REPOBROWSER_URL, TOP_LEFT, TOP_RIGHT); AddAnchor(IDC_STATIC_REF, TOP_RIGHT); AddAnchor(IDC_BUTTON_REVISION, TOP_RIGHT); AddAnchor(IDC_REPOTREE, TOP_LEFT, BOTTOM_LEFT); AddAnchor(IDC_REPOLIST, TOP_LEFT, BOTTOM_RIGHT); AddAnchor(IDHELP, BOTTOM_RIGHT); AddAnchor(IDOK, BOTTOM_RIGHT); AddAnchor(IDCANCEL, BOTTOM_RIGHT); CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_CURRENT_USER); if (CRepositoryBrowser::s_bSortLogical) CRepositoryBrowser::s_bSortLogical = !CRegDWORD(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer\\NoStrCmpLogical", 0, false, HKEY_LOCAL_MACHINE); CString temp; temp.LoadString(IDS_STATUSLIST_COLFILENAME); m_RepoList.InsertColumn(eCol_Name, temp, 0, 150); temp.LoadString(IDS_STATUSLIST_COLEXT); m_RepoList.InsertColumn(eCol_Extension, temp, 0, 100); temp.LoadString(IDS_LOG_SIZE); m_RepoList.InsertColumn(eCol_FileSize, temp, 0, 100); // set up the list control // set the extended style of the list control // the style LVS_EX_FULLROWSELECT interferes with the background watermark image but it's more important to be able to select in the whole row. CRegDWORD regFullRowSelect(_T("Software\\TortoiseGit\\FullRowSelect"), TRUE); DWORD exStyle = LVS_EX_HEADERDRAGDROP | LVS_EX_DOUBLEBUFFER | LVS_EX_INFOTIP | LVS_EX_SUBITEMIMAGES; if (DWORD(regFullRowSelect)) exStyle |= LVS_EX_FULLROWSELECT; m_RepoList.SetExtendedStyle(exStyle); m_RepoList.SetImageList(&SYS_IMAGE_LIST(), LVSIL_SMALL); CAppUtils::SetListCtrlBackgroundImage(m_RepoList.GetSafeHwnd(), IDI_REPOBROWSER_BKG); m_RepoTree.SetImageList(&SYS_IMAGE_LIST(), TVSIL_NORMAL); if (SysInfo::Instance().IsVistaOrLater()) { DWORD exStyle = TVS_EX_FADEINOUTEXPANDOS | TVS_EX_AUTOHSCROLL | TVS_EX_DOUBLEBUFFER; m_RepoTree.SetExtendedStyle(exStyle, exStyle); } SetWindowTheme(m_RepoTree.GetSafeHwnd(), L"Explorer", NULL); SetWindowTheme(m_RepoList.GetSafeHwnd(), L"Explorer", NULL); m_nIconFolder = SYS_IMAGE_LIST().GetDirIconIndex(); m_nOpenIconFolder = SYS_IMAGE_LIST().GetDirOpenIconIndex(); EnableSaveRestore(L"Reposbrowser"); DWORD xPos = CRegDWORD(_T("Software\\TortoiseGit\\TortoiseProc\\ResizableState\\RepobrowserDivider"), 0); if (xPos == 0) { RECT rc; GetDlgItem(IDC_REPOTREE)->GetClientRect(&rc); xPos = rc.right - rc.left; } bDragMode = false; HandleDividerMove(CPoint(xPos + 20, 10), false); CString sWindowTitle; GetWindowText(sWindowTitle); CAppUtils::SetWindowTitle(m_hWnd, g_Git.m_CurrentDir, sWindowTitle); m_bHasWC = !g_GitAdminDir.IsBareRepo(g_Git.m_CurrentDir); Refresh(); m_RepoList.SetFocus(); return FALSE; }