Add user Config and remote config to setting dialog
[TortoiseGit.git] / src / TortoiseProc / Settings / Settings.cpp
blob12d91e4d1aa42bd6cb2627d89822ed3ee57bb98a
1 // TortoiseSVN - a Windows shell extension for easy version control
3 // Copyright (C) 2003-2008 - TortoiseSVN
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 #include "stdafx.h"
20 #include "TortoiseProc.h"
21 #include "Settings.h"
22 #include "MessageBox.h"
23 #include "..\..\TGitCache\CacheInterface.h"
24 #include "CommonResource.h"
27 IMPLEMENT_DYNAMIC(CSettings, CTreePropSheet)
28 CSettings::CSettings(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
29 :CTreePropSheet(nIDCaption, pParentWnd, iSelectPage)
31 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
32 AddPropPages();
35 CSettings::~CSettings()
37 RemovePropPages();
40 void CSettings::AddPropPages()
42 m_pMainPage = new CSetMainPage();
43 m_pOverlayPage = new CSetOverlayPage();
44 m_pOverlaysPage = new CSetOverlayIcons();
45 m_pProxyPage = new CSetProxyPage();
46 m_pProgsDiffPage = new CSettingsProgsDiff();
47 m_pProgsMergePage = new CSettingsProgsMerge();
48 m_pProgsUniDiffPage = new CSettingsProgsUniDiff();
49 m_pLookAndFeelPage = new CSetLookAndFeelPage();
50 m_pDialogsPage = new CSetDialogs();
51 m_pMiscPage = new CSetMisc();
52 m_pRevisionGraphPage = new CSettingsRevisionGraph();
53 // m_pLogCachePage = new CSetLogCache();
54 // m_pLogCacheListPage = new CSettingsLogCaches();
55 m_pColorsPage = new CSettingsColors();
56 m_pColorsPage2 = new CSettingsColors2();
57 m_pColorsPage3 = new CSettingsColors3();
58 m_pSavedPage = new CSetSavedDataPage();
59 // m_pHooksPage = new CSetHooks();
60 m_pBugTraqPage = new CSetBugTraq();
61 m_pTBlamePage = new CSettingsTBlame();
62 m_pGitConfig = new CSettingGitConfig();
63 m_pGitRemote = new CSettingGitRemote();
66 SetPageIcon(m_pMainPage, m_pMainPage->GetIconID());
67 SetPageIcon(m_pOverlayPage, m_pOverlayPage->GetIconID());
68 SetPageIcon(m_pOverlaysPage, m_pOverlaysPage->GetIconID());
69 SetPageIcon(m_pProxyPage, m_pProxyPage->GetIconID());
70 SetPageIcon(m_pProgsDiffPage, m_pProgsDiffPage->GetIconID());
71 SetPageIcon(m_pProgsMergePage, m_pProgsMergePage->GetIconID());
72 SetPageIcon(m_pProgsUniDiffPage, m_pProgsUniDiffPage->GetIconID());
73 SetPageIcon(m_pLookAndFeelPage, m_pLookAndFeelPage->GetIconID());
74 SetPageIcon(m_pDialogsPage, m_pDialogsPage->GetIconID());
75 SetPageIcon(m_pRevisionGraphPage, m_pRevisionGraphPage->GetIconID());
76 SetPageIcon(m_pMiscPage, m_pMiscPage->GetIconID());
77 //// SetPageIcon(m_pLogCachePage, m_pLogCachePage->GetIconID());
78 // SetPageIcon(m_pLogCacheListPage, m_pLogCacheListPage->GetIconID());
79 SetPageIcon(m_pColorsPage, m_pColorsPage->GetIconID());
80 SetPageIcon(m_pColorsPage2, m_pColorsPage2->GetIconID());
81 SetPageIcon(m_pColorsPage3, m_pColorsPage3->GetIconID());
83 SetPageIcon(m_pSavedPage, m_pSavedPage->GetIconID());
84 // SetPageIcon(m_pHooksPage, m_pHooksPage->GetIconID());
85 SetPageIcon(m_pBugTraqPage, m_pBugTraqPage->GetIconID());
86 SetPageIcon(m_pTBlamePage, m_pTBlamePage->GetIconID());
88 AddPage(m_pMainPage);
89 AddPage(m_pOverlayPage);
90 AddPage(m_pOverlaysPage);
91 AddPage(m_pProxyPage);
92 AddPage(m_pProgsDiffPage);
93 AddPage(m_pProgsMergePage);
94 AddPage(m_pProgsUniDiffPage);
95 AddPage(m_pLookAndFeelPage);
96 AddPage(m_pDialogsPage);
97 AddPage(m_pMiscPage);
98 AddPage(m_pRevisionGraphPage);
99 AddPage(m_pColorsPage);
100 AddPage(m_pColorsPage2);
101 AddPage(m_pColorsPage3);
102 AddPage(m_pSavedPage);
104 AddPage(m_pGitConfig);
105 AddPage(m_pGitRemote);
106 // AddPage(m_pGitRemotem_pLogCachePage);
107 // AddPage(m_pLogCacheListPage);
108 // AddPage(m_pHooksPage);
109 AddPage(m_pBugTraqPage);
110 AddPage(m_pTBlamePage);
113 void CSettings::RemovePropPages()
115 delete m_pMainPage;
116 delete m_pOverlayPage;
117 delete m_pOverlaysPage;
118 delete m_pProxyPage;
119 delete m_pProgsDiffPage;
120 delete m_pProgsMergePage;
121 delete m_pProgsUniDiffPage;
122 delete m_pLookAndFeelPage;
123 delete m_pDialogsPage;
124 delete m_pRevisionGraphPage;
125 delete m_pMiscPage;
126 //// delete m_pLogCachePage;
127 //// delete m_pLogCacheListPage;
128 delete m_pColorsPage;
129 delete m_pColorsPage2;
130 delete m_pColorsPage3;
131 delete m_pSavedPage;
132 // delete m_pHooksPage;
133 delete m_pBugTraqPage;
134 delete m_pTBlamePage;
136 delete m_pGitConfig;
137 delete m_pGitRemote;
141 void CSettings::HandleRestart()
143 int restart = ISettingsPropPage::Restart_None;
144 restart |= m_pMainPage->GetRestart();
145 restart |= m_pOverlayPage->GetRestart();
146 restart |= m_pOverlaysPage->GetRestart();
147 restart |= m_pProxyPage->GetRestart();
148 restart |= m_pProgsDiffPage->GetRestart();
149 restart |= m_pProgsMergePage->GetRestart();
150 restart |= m_pProgsUniDiffPage->GetRestart();
151 restart |= m_pLookAndFeelPage->GetRestart();
152 restart |= m_pDialogsPage->GetRestart();
153 restart |= m_pRevisionGraphPage->GetRestart();
154 restart |= m_pMiscPage->GetRestart();
155 //// restart |= m_pLogCachePage->GetRestart();
156 // restart |= m_pLogCacheListPage->GetRestart();
157 restart |= m_pColorsPage->GetRestart();
158 restart |= m_pColorsPage2->GetRestart();
159 restart |= m_pColorsPage3->GetRestart();
160 restart |= m_pSavedPage->GetRestart();
161 //// restart |= m_pHooksPage->GetRestart();
162 restart |= m_pBugTraqPage->GetRestart();
163 restart |= m_pTBlamePage->GetRestart();
165 restart |= m_pGitConfig->GetRestart();
166 restart |= m_pGitRemote->GetRestart();
168 if (restart & ISettingsPropPage::Restart_System)
170 DWORD_PTR res = 0;
171 ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_ABORTIFHUNG, 20, &res);
172 CMessageBox::Show(NULL, IDS_SETTINGS_RESTARTSYSTEM, IDS_APPNAME, MB_ICONINFORMATION);
174 if (restart & ISettingsPropPage::Restart_Cache)
176 DWORD_PTR res = 0;
177 ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_ABORTIFHUNG, 20, &res);
178 // tell the cache to refresh everything
179 HANDLE hPipe = CreateFile(
180 GetCacheCommandPipeName(), // pipe name
181 GENERIC_READ | // read and write access
182 GENERIC_WRITE,
183 0, // no sharing
184 NULL, // default security attributes
185 OPEN_EXISTING, // opens existing pipe
186 FILE_FLAG_OVERLAPPED, // default attributes
187 NULL); // no template file
190 if (hPipe != INVALID_HANDLE_VALUE)
192 // The pipe connected; change to message-read mode.
193 DWORD dwMode;
195 dwMode = PIPE_READMODE_MESSAGE;
196 if (SetNamedPipeHandleState(
197 hPipe, // pipe handle
198 &dwMode, // new pipe mode
199 NULL, // don't set maximum bytes
200 NULL)) // don't set maximum time
202 DWORD cbWritten;
203 TSVNCacheCommand cmd;
204 SecureZeroMemory(&cmd, sizeof(TSVNCacheCommand));
205 cmd.command = TSVNCACHECOMMAND_REFRESHALL;
206 BOOL fSuccess = WriteFile(
207 hPipe, // handle to pipe
208 &cmd, // buffer to write from
209 sizeof(cmd), // number of bytes to write
210 &cbWritten, // number of bytes written
211 NULL); // not overlapped I/O
213 if (! fSuccess || sizeof(cmd) != cbWritten)
215 DisconnectNamedPipe(hPipe);
216 CloseHandle(hPipe);
217 hPipe = INVALID_HANDLE_VALUE;
219 if (hPipe != INVALID_HANDLE_VALUE)
221 // now tell the cache we don't need it's command thread anymore
222 DWORD cbWritten;
223 TSVNCacheCommand cmd;
224 SecureZeroMemory(&cmd, sizeof(TSVNCacheCommand));
225 cmd.command = TSVNCACHECOMMAND_END;
226 WriteFile(
227 hPipe, // handle to pipe
228 &cmd, // buffer to write from
229 sizeof(cmd), // number of bytes to write
230 &cbWritten, // number of bytes written
231 NULL); // not overlapped I/O
232 DisconnectNamedPipe(hPipe);
233 CloseHandle(hPipe);
234 hPipe = INVALID_HANDLE_VALUE;
237 else
239 ATLTRACE("SetNamedPipeHandleState failed");
240 CloseHandle(hPipe);
246 BEGIN_MESSAGE_MAP(CSettings, CTreePropSheet)
247 ON_WM_QUERYDRAGICON()
248 ON_WM_PAINT()
249 END_MESSAGE_MAP()
251 BOOL CSettings::OnInitDialog()
253 BOOL bResult = CTreePropSheet::OnInitDialog();
255 SetIcon(m_hIcon, TRUE); // Set big icon
256 SetIcon(m_hIcon, FALSE); // Set small icon
258 CenterWindow(CWnd::FromHandle(hWndExplorer));
259 return bResult;
262 void CSettings::OnPaint()
264 if (IsIconic())
266 CPaintDC dc(this); // device context for painting
268 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
270 // Center icon in client rectangle
271 int cxIcon = GetSystemMetrics(SM_CXICON);
272 int cyIcon = GetSystemMetrics(SM_CYICON);
273 CRect rect;
274 GetClientRect(&rect);
275 int x = (rect.Width() - cxIcon + 1) / 2;
276 int y = (rect.Height() - cyIcon + 1) / 2;
278 // Draw the icon
279 dc.DrawIcon(x, y, m_hIcon);
281 else
283 CTreePropSheet::OnPaint();
287 HCURSOR CSettings::OnQueryDragIcon()
289 return static_cast<HCURSOR>(m_hIcon);