OSDN Git Service

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