Do not fetch after adding remote when settings dialog launches with remote as default...
[TortoiseGit.git] / src / TortoiseProc / Settings / Settings.cpp
blob51f1ecc7937ad2fd99693d1cae874979c4dc1be0
1 // TortoiseGit - a Windows shell extension for easy version control
3 // Copyright (C) 2008-2012 - TortoiseGit
4 // Copyright (C) 2003-2008 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "TortoiseProc.h"
22 #include "Settings.h"
23 #include "MessageBox.h"
24 #include "..\..\TGitCache\CacheInterface.h"
25 #include "GitAdminDir.h"
26 #include "AppUtils.h"
28 IMPLEMENT_DYNAMIC(CSettings, CTreePropSheet)
29 CSettings::CSettings(UINT nIDCaption,CTGitPath *cmdPath, CWnd* pParentWnd, UINT iSelectPage)
30 :CTreePropSheet(nIDCaption, pParentWnd, iSelectPage)
32 if(cmdPath)
33 this->m_CmdPath=*cmdPath;
35 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
36 AddPropPages();
39 CSettings::~CSettings()
41 RemovePropPages();
44 void CSettings::AddPropPages()
46 m_pMainPage = new CSetMainPage();
47 m_pOverlayPage = new CSetOverlayPage();
48 m_pOverlaysPage = new CSetOverlayIcons();
49 m_pOverlayHandlersPage = new CSetOverlayHandlers();
50 m_pProxyPage = new CSetProxyPage();
51 m_pProgsDiffPage = new CSettingsProgsDiff();
52 m_pProgsMergePage = new CSettingsProgsMerge();
53 m_pProgsAlternativeEditor = new CSettingsProgsAlternativeEditor();
54 m_pLookAndFeelPage = new CSetLookAndFeelPage();
56 m_pExtMenu = new CSetExtMenu();
58 m_pDialogsPage = new CSetDialogs();
59 m_pColorsPage = new CSettingsColors();
60 m_pColorsPage2 = new CSettingsColors2();
61 m_pColorsPage3 = new CSettingsColors3();
62 m_pSavedPage = new CSetSavedDataPage();
63 m_pHooksPage = new CSetHooks();
64 m_pBugTraqPage = new CSetBugTraq();
65 m_pTBlamePage = new CSettingsTBlame();
66 m_pGitConfig = new CSettingGitConfig();
67 m_pGitRemote = new CSettingGitRemote(m_CmdPath.GetWinPath());
68 m_pBugtraqConfig = new CSettingsBugtraqConfig(m_CmdPath.GetWinPath());
69 m_pAdvanced = new CSettingsAdvanced();
71 SetPageIcon(m_pExtMenu,m_pExtMenu->GetIconID());
73 SetPageIcon(m_pMainPage, m_pMainPage->GetIconID());
74 SetPageIcon(m_pOverlayPage, m_pOverlayPage->GetIconID());
75 SetPageIcon(m_pOverlaysPage, m_pOverlaysPage->GetIconID());
76 SetPageIcon(m_pOverlayHandlersPage, m_pOverlayHandlersPage->GetIconID());
77 SetPageIcon(m_pProxyPage, m_pProxyPage->GetIconID());
78 SetPageIcon(m_pProgsDiffPage, m_pProgsDiffPage->GetIconID());
79 SetPageIcon(m_pProgsMergePage, m_pProgsMergePage->GetIconID());
80 SetPageIcon(m_pProgsAlternativeEditor, m_pProgsAlternativeEditor->GetIconID());
81 SetPageIcon(m_pLookAndFeelPage, m_pLookAndFeelPage->GetIconID());
82 SetPageIcon(m_pDialogsPage, m_pDialogsPage->GetIconID());
83 SetPageIcon(m_pColorsPage, m_pColorsPage->GetIconID());
84 SetPageIcon(m_pColorsPage2, m_pColorsPage2->GetIconID());
85 SetPageIcon(m_pColorsPage3, m_pColorsPage3->GetIconID());
87 SetPageIcon(m_pSavedPage, m_pSavedPage->GetIconID());
88 SetPageIcon(m_pHooksPage, m_pHooksPage->GetIconID());
90 SetPageIcon(m_pGitConfig, m_pGitConfig->GetIconID());
91 SetPageIcon(m_pGitRemote, m_pGitRemote->GetIconID());
92 SetPageIcon(m_pBugTraqPage, m_pBugTraqPage->GetIconID());
93 SetPageIcon(m_pBugtraqConfig, m_pBugtraqConfig->GetIconID());
94 SetPageIcon(m_pTBlamePage, m_pTBlamePage->GetIconID());
95 SetPageIcon(m_pAdvanced, m_pAdvanced->GetIconID());
97 AddPage(m_pMainPage);
98 AddPage(m_pOverlayPage);
99 AddPage(m_pOverlaysPage);
100 AddPage(m_pOverlayHandlersPage);
101 AddPage(m_pProxyPage);
102 AddPage(m_pProgsDiffPage);
103 AddPage(m_pProgsMergePage);
104 AddPage(m_pLookAndFeelPage);
105 AddPage(m_pExtMenu);
106 AddPage(m_pDialogsPage);
107 AddPage(m_pColorsPage);
108 AddPage(m_pColorsPage2);
109 AddPage(m_pColorsPage3);
110 AddPage(m_pProgsAlternativeEditor);
111 AddPage(m_pSavedPage);
113 AddPage(m_pGitConfig);
115 if (g_GitAdminDir.HasAdminDir(this->m_CmdPath.GetWinPath()) || g_GitAdminDir.IsBareRepo(this->m_CmdPath.GetWinPath()))
117 AddPage(m_pGitRemote);
119 AddPage(m_pHooksPage);
120 AddPage(m_pBugTraqPage);
121 if (g_GitAdminDir.HasAdminDir(this->m_CmdPath.GetWinPath()))
123 AddPage(m_pBugtraqConfig);
125 AddPage(m_pTBlamePage);
126 AddPage(m_pAdvanced);
129 void CSettings::RemovePropPages()
131 delete m_pMainPage;
132 delete m_pOverlayPage;
133 delete m_pOverlaysPage;
134 delete m_pOverlayHandlersPage;
135 delete m_pProxyPage;
136 delete m_pProgsDiffPage;
137 delete m_pProgsMergePage;
138 delete m_pProgsAlternativeEditor;
139 delete m_pLookAndFeelPage;
140 delete m_pDialogsPage;
141 delete m_pColorsPage;
142 delete m_pColorsPage2;
143 delete m_pColorsPage3;
144 delete m_pSavedPage;
145 delete m_pHooksPage;
146 delete m_pBugTraqPage;
147 delete m_pTBlamePage;
149 delete m_pGitConfig;
150 delete m_pGitRemote;
151 delete m_pBugtraqConfig;
152 delete m_pExtMenu;
153 delete m_pAdvanced;
157 void CSettings::HandleRestart()
159 int restart = ISettingsPropPage::Restart_None;
160 restart |= m_pMainPage->GetRestart();
161 restart |= m_pOverlayPage->GetRestart();
162 restart |= m_pOverlaysPage->GetRestart();
163 restart |= m_pOverlayHandlersPage->GetRestart();
164 restart |= m_pProxyPage->GetRestart();
165 restart |= m_pProgsDiffPage->GetRestart();
166 restart |= m_pProgsMergePage->GetRestart();
167 restart |= m_pProgsAlternativeEditor->GetRestart();
168 restart |= m_pLookAndFeelPage->GetRestart();
169 restart |= m_pDialogsPage->GetRestart();
170 restart |= m_pColorsPage->GetRestart();
171 restart |= m_pColorsPage2->GetRestart();
172 restart |= m_pColorsPage3->GetRestart();
173 restart |= m_pSavedPage->GetRestart();
174 restart |= m_pHooksPage->GetRestart();
175 restart |= m_pBugTraqPage->GetRestart();
176 restart |= m_pTBlamePage->GetRestart();
178 restart |= m_pGitConfig->GetRestart();
179 restart |= m_pGitRemote->GetRestart();
180 restart |= m_pBugTraqPage->GetRestart();
181 restart |= m_pExtMenu->GetRestart();
182 restart |= m_pAdvanced->GetRestart();
184 if (restart & ISettingsPropPage::Restart_System)
186 DWORD_PTR res = 0;
187 ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_ABORTIFHUNG, 20, &res);
188 CMessageBox::Show(NULL, IDS_SETTINGS_RESTARTSYSTEM, IDS_APPNAME, MB_ICONINFORMATION);
190 if (restart & ISettingsPropPage::Restart_Cache)
192 DWORD_PTR res = 0;
193 ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_ABORTIFHUNG, 20, &res);
194 // tell the cache to refresh everything
195 HANDLE hPipe = CreateFile(
196 GetCacheCommandPipeName(), // pipe name
197 GENERIC_READ | // read and write access
198 GENERIC_WRITE,
199 0, // no sharing
200 NULL, // default security attributes
201 OPEN_EXISTING, // opens existing pipe
202 FILE_FLAG_OVERLAPPED, // default attributes
203 NULL); // no template file
206 if (hPipe != INVALID_HANDLE_VALUE)
208 // The pipe connected; change to message-read mode.
209 DWORD dwMode;
211 dwMode = PIPE_READMODE_MESSAGE;
212 if (SetNamedPipeHandleState(
213 hPipe, // pipe handle
214 &dwMode, // new pipe mode
215 NULL, // don't set maximum bytes
216 NULL)) // don't set maximum time
218 DWORD cbWritten;
219 TGITCacheCommand cmd;
220 SecureZeroMemory(&cmd, sizeof(TGITCacheCommand));
221 cmd.command = TGITCACHECOMMAND_REFRESHALL;
222 BOOL fSuccess = WriteFile(
223 hPipe, // handle to pipe
224 &cmd, // buffer to write from
225 sizeof(cmd), // number of bytes to write
226 &cbWritten, // number of bytes written
227 NULL); // not overlapped I/O
229 if (! fSuccess || sizeof(cmd) != cbWritten)
231 DisconnectNamedPipe(hPipe);
232 CloseHandle(hPipe);
233 hPipe = INVALID_HANDLE_VALUE;
235 if (hPipe != INVALID_HANDLE_VALUE)
237 // now tell the cache we don't need it's command thread anymore
238 DWORD cbWritten;
239 TGITCacheCommand cmd;
240 SecureZeroMemory(&cmd, sizeof(TGITCacheCommand));
241 cmd.command = TGITCACHECOMMAND_END;
242 WriteFile(
243 hPipe, // handle to pipe
244 &cmd, // buffer to write from
245 sizeof(cmd), // number of bytes to write
246 &cbWritten, // number of bytes written
247 NULL); // not overlapped I/O
248 DisconnectNamedPipe(hPipe);
249 CloseHandle(hPipe);
250 hPipe = INVALID_HANDLE_VALUE;
253 else
255 ATLTRACE("SetNamedPipeHandleState failed");
256 CloseHandle(hPipe);
262 BEGIN_MESSAGE_MAP(CSettings, CTreePropSheet)
263 ON_WM_QUERYDRAGICON()
264 ON_WM_PAINT()
265 END_MESSAGE_MAP()
267 BOOL CSettings::OnInitDialog()
269 BOOL bResult = CTreePropSheet::OnInitDialog();
270 CAppUtils::MarkWindowAsUnpinnable(m_hWnd);
272 SetIcon(m_hIcon, TRUE); // Set big icon
273 SetIcon(m_hIcon, FALSE); // Set small icon
275 CenterWindow(CWnd::FromHandle(hWndExplorer));
277 if (this->m_DefaultPage == _T("gitremote"))
279 this->SetActivePage(this->m_pGitRemote);
280 this->m_pGitRemote->m_bNoFetch = true;
282 else if (this->m_DefaultPage == _T("gitconfig"))
284 this->SetActivePage(this->m_pGitConfig);
286 else if (this->m_DefaultPage == _T("main"))
288 this->SetActivePage(this->m_pMainPage);
290 else if (this->m_DefaultPage == _T("overlay"))
292 this->SetActivePage(this->m_pOverlayPage);
294 else if (this->m_DefaultPage == _T("overlays"))
296 this->SetActivePage(this->m_pOverlaysPage);
298 else if (this->m_DefaultPage == _T("overlayshandlers"))
300 this->SetActivePage(this->m_pOverlayHandlersPage);
302 else if (this->m_DefaultPage == _T("proxy"))
304 this->SetActivePage(this->m_pProxyPage);
306 else if (this->m_DefaultPage == _T("diff"))
308 this->SetActivePage(this->m_pProgsDiffPage);
310 else if (this->m_DefaultPage == _T("merge"))
312 this->SetActivePage(this->m_pProgsMergePage);
314 else if (this->m_DefaultPage == _T("alternativeeditor"))
316 this->SetActivePage(this->m_pProgsAlternativeEditor);
318 else if (this->m_DefaultPage == _T("look"))
320 this->SetActivePage(this->m_pLookAndFeelPage);
322 else if (this->m_DefaultPage == _T("dialog"))
324 this->SetActivePage(this->m_pDialogsPage);
326 else if (this->m_DefaultPage == _T("color1"))
328 this->SetActivePage(this->m_pColorsPage);
330 else if (this->m_DefaultPage == _T("color2"))
332 this->SetActivePage(this->m_pColorsPage2);
334 else if (this->m_DefaultPage == _T("color3"))
336 this->SetActivePage(this->m_pColorsPage3);
338 else if (this->m_DefaultPage == _T("save"))
340 this->SetActivePage(this->m_pSavedPage);
342 else if (this->m_DefaultPage == _T("advanced"))
344 this->SetActivePage(this->m_pAdvanced);
346 else if (this->m_DefaultPage == _T("blame"))
348 this->SetActivePage(this->m_pTBlamePage);
350 else if (g_GitAdminDir.HasAdminDir(this->m_CmdPath.GetWinPath()) || g_GitAdminDir.IsBareRepo(this->m_CmdPath.GetWinPath()))
352 this->SetActivePage(this->m_pGitConfig);
354 return bResult;
357 void CSettings::OnPaint()
359 if (IsIconic())
361 CPaintDC dc(this); // device context for painting
363 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
365 // Center icon in client rectangle
366 int cxIcon = GetSystemMetrics(SM_CXICON);
367 int cyIcon = GetSystemMetrics(SM_CYICON);
368 CRect rect;
369 GetClientRect(&rect);
370 int x = (rect.Width() - cxIcon + 1) / 2;
371 int y = (rect.Height() - cyIcon + 1) / 2;
373 // Draw the icon
374 dc.DrawIcon(x, y, m_hIcon);
376 else
378 CTreePropSheet::OnPaint();
382 HCURSOR CSettings::OnQueryDragIcon()
384 return static_cast<HCURSOR>(m_hIcon);