1 // TortoiseSVN - a Windows shell extension for easy version control
\r
3 // Copyright (C) 2003-2008 - TortoiseSVN
\r
5 // This program is free software; you can redistribute it and/or
\r
6 // modify it under the terms of the GNU General Public License
\r
7 // as published by the Free Software Foundation; either version 2
\r
8 // of the License, or (at your option) any later version.
\r
10 // This program is distributed in the hope that it will be useful,
\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
\r
13 // GNU General Public License for more details.
\r
15 // You should have received a copy of the GNU General Public License
\r
16 // along with this program; if not, write to the Free Software Foundation,
\r
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\r
20 #include "TortoiseProc.h"
\r
21 #include "Settings.h"
\r
22 #include "MessageBox.h"
\r
23 #include "..\..\TGitCache\CacheInterface.h"
\r
24 #include "CommonResource.h"
\r
25 #include "GitAdminDir.h"
\r
27 IMPLEMENT_DYNAMIC(CSettings, CTreePropSheet)
\r
28 CSettings::CSettings(UINT nIDCaption,CTGitPath *cmdPath, CWnd* pParentWnd, UINT iSelectPage)
\r
29 :CTreePropSheet(nIDCaption, pParentWnd, iSelectPage)
\r
32 this->m_CmdPath=*cmdPath;
\r
34 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
\r
38 CSettings::~CSettings()
\r
43 void CSettings::AddPropPages()
\r
45 m_pMainPage = new CSetMainPage();
\r
46 m_pOverlayPage = new CSetOverlayPage();
\r
47 m_pOverlaysPage = new CSetOverlayIcons();
\r
48 m_pProxyPage = new CSetProxyPage();
\r
49 m_pProgsDiffPage = new CSettingsProgsDiff();
\r
50 m_pProgsMergePage = new CSettingsProgsMerge();
\r
51 m_pProgsUniDiffPage = new CSettingsProgsUniDiff();
\r
52 m_pLookAndFeelPage = new CSetLookAndFeelPage();
\r
53 m_pDialogsPage = new CSetDialogs();
\r
54 m_pMiscPage = new CSetMisc();
\r
55 m_pRevisionGraphPage = new CSettingsRevisionGraph();
\r
56 // m_pLogCachePage = new CSetLogCache();
\r
57 // m_pLogCacheListPage = new CSettingsLogCaches();
\r
58 m_pColorsPage = new CSettingsColors();
\r
59 m_pColorsPage2 = new CSettingsColors2();
\r
60 m_pColorsPage3 = new CSettingsColors3();
\r
61 m_pSavedPage = new CSetSavedDataPage();
\r
62 // m_pHooksPage = new CSetHooks();
\r
63 m_pBugTraqPage = new CSetBugTraq();
\r
64 m_pTBlamePage = new CSettingsTBlame();
\r
65 m_pGitConfig = new CSettingGitConfig();
\r
66 m_pGitRemote = new CSettingGitRemote();
\r
69 SetPageIcon(m_pMainPage, m_pMainPage->GetIconID());
\r
70 SetPageIcon(m_pOverlayPage, m_pOverlayPage->GetIconID());
\r
71 SetPageIcon(m_pOverlaysPage, m_pOverlaysPage->GetIconID());
\r
72 SetPageIcon(m_pProxyPage, m_pProxyPage->GetIconID());
\r
73 SetPageIcon(m_pProgsDiffPage, m_pProgsDiffPage->GetIconID());
\r
74 SetPageIcon(m_pProgsMergePage, m_pProgsMergePage->GetIconID());
\r
75 SetPageIcon(m_pProgsUniDiffPage, m_pProgsUniDiffPage->GetIconID());
\r
76 SetPageIcon(m_pLookAndFeelPage, m_pLookAndFeelPage->GetIconID());
\r
77 SetPageIcon(m_pDialogsPage, m_pDialogsPage->GetIconID());
\r
78 SetPageIcon(m_pRevisionGraphPage, m_pRevisionGraphPage->GetIconID());
\r
79 SetPageIcon(m_pMiscPage, m_pMiscPage->GetIconID());
\r
80 //// SetPageIcon(m_pLogCachePage, m_pLogCachePage->GetIconID());
\r
81 // SetPageIcon(m_pLogCacheListPage, m_pLogCacheListPage->GetIconID());
\r
82 SetPageIcon(m_pColorsPage, m_pColorsPage->GetIconID());
\r
83 SetPageIcon(m_pColorsPage2, m_pColorsPage2->GetIconID());
\r
84 SetPageIcon(m_pColorsPage3, m_pColorsPage3->GetIconID());
\r
86 SetPageIcon(m_pSavedPage, m_pSavedPage->GetIconID());
\r
87 // SetPageIcon(m_pHooksPage, m_pHooksPage->GetIconID());
\r
89 SetPageIcon(m_pGitConfig, m_pGitConfig->GetIconID());
\r
90 SetPageIcon(m_pGitRemote, m_pGitRemote->GetIconID());
\r
91 SetPageIcon(m_pBugTraqPage, m_pBugTraqPage->GetIconID());
\r
92 SetPageIcon(m_pTBlamePage, m_pTBlamePage->GetIconID());
\r
94 AddPage(m_pMainPage);
\r
95 AddPage(m_pOverlayPage);
\r
96 AddPage(m_pOverlaysPage);
\r
97 AddPage(m_pProxyPage);
\r
98 AddPage(m_pProgsDiffPage);
\r
99 AddPage(m_pProgsMergePage);
\r
100 AddPage(m_pProgsUniDiffPage);
\r
101 AddPage(m_pLookAndFeelPage);
\r
102 AddPage(m_pDialogsPage);
\r
103 AddPage(m_pMiscPage);
\r
104 AddPage(m_pRevisionGraphPage);
\r
105 AddPage(m_pColorsPage);
\r
106 AddPage(m_pColorsPage2);
\r
107 AddPage(m_pColorsPage3);
\r
108 AddPage(m_pSavedPage);
\r
110 AddPage(m_pGitConfig);
\r
112 if( g_GitAdminDir.HasAdminDir(this->m_CmdPath.GetWinPath()) )
\r
114 AddPage(m_pGitRemote);
\r
116 // AddPage(m_pGitRemotem_pLogCachePage);
\r
117 // AddPage(m_pLogCacheListPage);
\r
118 // AddPage(m_pHooksPage);
\r
119 AddPage(m_pBugTraqPage);
\r
120 AddPage(m_pTBlamePage);
\r
123 void CSettings::RemovePropPages()
\r
125 delete m_pMainPage;
\r
126 delete m_pOverlayPage;
\r
127 delete m_pOverlaysPage;
\r
128 delete m_pProxyPage;
\r
129 delete m_pProgsDiffPage;
\r
130 delete m_pProgsMergePage;
\r
131 delete m_pProgsUniDiffPage;
\r
132 delete m_pLookAndFeelPage;
\r
133 delete m_pDialogsPage;
\r
134 delete m_pRevisionGraphPage;
\r
135 delete m_pMiscPage;
\r
136 //// delete m_pLogCachePage;
\r
137 //// delete m_pLogCacheListPage;
\r
138 delete m_pColorsPage;
\r
139 delete m_pColorsPage2;
\r
140 delete m_pColorsPage3;
\r
141 delete m_pSavedPage;
\r
142 // delete m_pHooksPage;
\r
143 delete m_pBugTraqPage;
\r
144 delete m_pTBlamePage;
\r
146 delete m_pGitConfig;
\r
147 delete m_pGitRemote;
\r
151 void CSettings::HandleRestart()
\r
153 int restart = ISettingsPropPage::Restart_None;
\r
154 restart |= m_pMainPage->GetRestart();
\r
155 restart |= m_pOverlayPage->GetRestart();
\r
156 restart |= m_pOverlaysPage->GetRestart();
\r
157 restart |= m_pProxyPage->GetRestart();
\r
158 restart |= m_pProgsDiffPage->GetRestart();
\r
159 restart |= m_pProgsMergePage->GetRestart();
\r
160 restart |= m_pProgsUniDiffPage->GetRestart();
\r
161 restart |= m_pLookAndFeelPage->GetRestart();
\r
162 restart |= m_pDialogsPage->GetRestart();
\r
163 restart |= m_pRevisionGraphPage->GetRestart();
\r
164 restart |= m_pMiscPage->GetRestart();
\r
165 //// restart |= m_pLogCachePage->GetRestart();
\r
166 // restart |= m_pLogCacheListPage->GetRestart();
\r
167 restart |= m_pColorsPage->GetRestart();
\r
168 restart |= m_pColorsPage2->GetRestart();
\r
169 restart |= m_pColorsPage3->GetRestart();
\r
170 restart |= m_pSavedPage->GetRestart();
\r
171 //// restart |= m_pHooksPage->GetRestart();
\r
172 restart |= m_pBugTraqPage->GetRestart();
\r
173 restart |= m_pTBlamePage->GetRestart();
\r
175 restart |= m_pGitConfig->GetRestart();
\r
176 restart |= m_pGitRemote->GetRestart();
\r
178 if (restart & ISettingsPropPage::Restart_System)
\r
181 ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_ABORTIFHUNG, 20, &res);
\r
182 CMessageBox::Show(NULL, IDS_SETTINGS_RESTARTSYSTEM, IDS_APPNAME, MB_ICONINFORMATION);
\r
184 if (restart & ISettingsPropPage::Restart_Cache)
\r
187 ::SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0, SMTO_ABORTIFHUNG, 20, &res);
\r
188 // tell the cache to refresh everything
\r
189 HANDLE hPipe = CreateFile(
\r
190 GetCacheCommandPipeName(), // pipe name
\r
191 GENERIC_READ | // read and write access
\r
194 NULL, // default security attributes
\r
195 OPEN_EXISTING, // opens existing pipe
\r
196 FILE_FLAG_OVERLAPPED, // default attributes
\r
197 NULL); // no template file
\r
200 if (hPipe != INVALID_HANDLE_VALUE)
\r
202 // The pipe connected; change to message-read mode.
\r
205 dwMode = PIPE_READMODE_MESSAGE;
\r
206 if (SetNamedPipeHandleState(
\r
207 hPipe, // pipe handle
\r
208 &dwMode, // new pipe mode
\r
209 NULL, // don't set maximum bytes
\r
210 NULL)) // don't set maximum time
\r
213 TSVNCacheCommand cmd;
\r
214 SecureZeroMemory(&cmd, sizeof(TSVNCacheCommand));
\r
215 cmd.command = TSVNCACHECOMMAND_REFRESHALL;
\r
216 BOOL fSuccess = WriteFile(
\r
217 hPipe, // handle to pipe
\r
218 &cmd, // buffer to write from
\r
219 sizeof(cmd), // number of bytes to write
\r
220 &cbWritten, // number of bytes written
\r
221 NULL); // not overlapped I/O
\r
223 if (! fSuccess || sizeof(cmd) != cbWritten)
\r
225 DisconnectNamedPipe(hPipe);
\r
226 CloseHandle(hPipe);
\r
227 hPipe = INVALID_HANDLE_VALUE;
\r
229 if (hPipe != INVALID_HANDLE_VALUE)
\r
231 // now tell the cache we don't need it's command thread anymore
\r
233 TSVNCacheCommand cmd;
\r
234 SecureZeroMemory(&cmd, sizeof(TSVNCacheCommand));
\r
235 cmd.command = TSVNCACHECOMMAND_END;
\r
237 hPipe, // handle to pipe
\r
238 &cmd, // buffer to write from
\r
239 sizeof(cmd), // number of bytes to write
\r
240 &cbWritten, // number of bytes written
\r
241 NULL); // not overlapped I/O
\r
242 DisconnectNamedPipe(hPipe);
\r
243 CloseHandle(hPipe);
\r
244 hPipe = INVALID_HANDLE_VALUE;
\r
249 ATLTRACE("SetNamedPipeHandleState failed");
\r
250 CloseHandle(hPipe);
\r
256 BEGIN_MESSAGE_MAP(CSettings, CTreePropSheet)
\r
257 ON_WM_QUERYDRAGICON()
\r
261 BOOL CSettings::OnInitDialog()
\r
263 BOOL bResult = CTreePropSheet::OnInitDialog();
\r
265 SetIcon(m_hIcon, TRUE); // Set big icon
\r
266 SetIcon(m_hIcon, FALSE); // Set small icon
\r
268 CenterWindow(CWnd::FromHandle(hWndExplorer));
\r
272 void CSettings::OnPaint()
\r
276 CPaintDC dc(this); // device context for painting
\r
278 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
\r
280 // Center icon in client rectangle
\r
281 int cxIcon = GetSystemMetrics(SM_CXICON);
\r
282 int cyIcon = GetSystemMetrics(SM_CYICON);
\r
284 GetClientRect(&rect);
\r
285 int x = (rect.Width() - cxIcon + 1) / 2;
\r
286 int y = (rect.Height() - cyIcon + 1) / 2;
\r
289 dc.DrawIcon(x, y, m_hIcon);
\r
293 CTreePropSheet::OnPaint();
\r
297 HCURSOR CSettings::OnQueryDragIcon()
\r
299 return static_cast<HCURSOR>(m_hIcon);
\r