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.
21 #include "TortoiseProc.h"
23 #include "MessageBox.h"
24 #include "..\..\TGitCache\CacheInterface.h"
25 #include "GitAdminDir.h"
28 IMPLEMENT_DYNAMIC(CSettings
, CTreePropSheet
)
29 CSettings::CSettings(UINT nIDCaption
,CTGitPath
*cmdPath
, CWnd
* pParentWnd
, UINT iSelectPage
)
30 :CTreePropSheet(nIDCaption
, pParentWnd
, iSelectPage
)
33 this->m_CmdPath
=*cmdPath
;
35 m_hIcon
= AfxGetApp()->LoadIcon(IDR_MAINFRAME
);
39 CSettings::~CSettings()
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());
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
);
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()
132 delete m_pOverlayPage
;
133 delete m_pOverlaysPage
;
134 delete m_pOverlayHandlersPage
;
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
;
146 delete m_pBugTraqPage
;
147 delete m_pTBlamePage
;
151 delete m_pBugtraqConfig
;
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
)
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
)
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
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.
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
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
);
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
239 TGITCacheCommand cmd
;
240 SecureZeroMemory(&cmd
, sizeof(TGITCacheCommand
));
241 cmd
.command
= TGITCACHECOMMAND_END
;
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
);
250 hPipe
= INVALID_HANDLE_VALUE
;
255 ATLTRACE("SetNamedPipeHandleState failed");
262 BEGIN_MESSAGE_MAP(CSettings
, CTreePropSheet
)
263 ON_WM_QUERYDRAGICON()
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
);
357 void CSettings::OnPaint()
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
);
369 GetClientRect(&rect
);
370 int x
= (rect
.Width() - cxIcon
+ 1) / 2;
371 int y
= (rect
.Height() - cyIcon
+ 1) / 2;
374 dc
.DrawIcon(x
, y
, m_hIcon
);
378 CTreePropSheet::OnPaint();
382 HCURSOR
CSettings::OnQueryDragIcon()
384 return static_cast<HCURSOR
>(m_hIcon
);